mirror of
https://github.com/yourtion/30dayMakeOS.git
synced 2026-02-03 01:53:24 +08:00
110 lines
2.7 KiB
Plaintext
110 lines
2.7 KiB
Plaintext
; haribote-ipl
|
||
; TAB=4
|
||
|
||
CYLS EQU 10 ; 声明CYLS=10
|
||
|
||
ORG 0x7c00 ; 指明程序装载地址
|
||
|
||
; 标准FAT12格式软盘专用的代码 Stand FAT12 format floppy code
|
||
|
||
JMP entry
|
||
DB 0x90
|
||
DB "HARIBOTE" ; 启动扇区名称(8字节)
|
||
DW 512 ; 每个扇区(sector)大小(必须512字节)
|
||
DB 1 ; 簇(cluster)大小(必须为1个扇区)
|
||
DW 1 ; FAT起始位置(一般为第一个扇区)
|
||
DB 2 ; FAT个数(必须为2)
|
||
DW 224 ; 根目录大小(一般为224项)
|
||
DW 2880 ; 该磁盘大小(必须为2880扇区1440*1024/512)
|
||
DB 0xf0 ; 磁盘类型(必须为0xf0)
|
||
DW 9 ; FAT的长度(必??9扇区)
|
||
DW 18 ; 一个磁道(track)有几个扇区(必须为18)
|
||
DW 2 ; 磁头数(必??2)
|
||
DD 0 ; 不使用分区,必须是0
|
||
DD 2880 ; 重写一次磁盘大小
|
||
DB 0,0,0x29 ; 意义不明(固定)
|
||
DD 0xffffffff ; (可能是)卷标号码
|
||
DB "HARIBOTEOS " ; 磁盘的名称(必须为11字?,不足填空格)
|
||
DB "FAT12 " ; 磁盘格式名称(必??8字?,不足填空格)
|
||
RESB 18 ; 先空出18字节
|
||
|
||
; 程序主体
|
||
|
||
entry:
|
||
MOV AX,0 ; 初始化寄存器
|
||
MOV SS,AX
|
||
MOV SP,0x7c00
|
||
MOV DS,AX
|
||
|
||
; 读取磁盘
|
||
|
||
MOV AX,0x0820
|
||
MOV ES,AX
|
||
MOV CH,0 ; 柱面0
|
||
MOV DH,0 ; 磁头0
|
||
MOV CL,2 ; 扇区2
|
||
|
||
readloop:
|
||
MOV SI,0 ; 记录失败次数寄存器
|
||
|
||
retry:
|
||
MOV AH,0x02 ; AH=0x02 : 读入磁盘
|
||
MOV AL,1 ; 1个扇区
|
||
MOV BX,0
|
||
MOV DL,0x00 ; A驱动器
|
||
INT 0x13 ; 调用磁盘BIOS
|
||
JNC next ; 没出错则跳转到fin
|
||
ADD SI,1 ; 往SI加1
|
||
CMP SI,5 ; 比较SI与5
|
||
JAE error ; SI >= 5 跳转到error
|
||
MOV AH,0x00
|
||
MOV DL,0x00 ; A驱动器
|
||
INT 0x13 ; 重置驱动器
|
||
JMP retry
|
||
next:
|
||
MOV AX,ES ; 把内存地址后移0x200(512/16十六进制转换)
|
||
ADD AX,0x0020
|
||
MOV ES,AX ; ADD ES,0x020因为没有ADD ES,只能通过AX进行
|
||
ADD CL,1 ; 往CL里面加1
|
||
CMP CL,18 ; 比较CL与18
|
||
JBE readloop ; CL <= 18 跳转到readloop
|
||
MOV CL,1
|
||
ADD DH,1
|
||
CMP DH,2
|
||
JB readloop ; DH < 2 跳转到readloop
|
||
MOV DH,0
|
||
ADD CH,1
|
||
CMP CH,CYLS
|
||
JB readloop ; CH < CYLS 跳转到readloop
|
||
|
||
; 读取完毕,跳转到haribote.sys执行!
|
||
MOV [0x0ff0],CH ; IPLがどこまで読んだのかをメモ
|
||
JMP 0xc200
|
||
|
||
error:
|
||
MOV SI,msg
|
||
|
||
putloop:
|
||
MOV AL,[SI]
|
||
ADD SI,1 ; 给SI加1
|
||
CMP AL,0
|
||
JE fin
|
||
MOV AH,0x0e ; 显示一个文字
|
||
MOV BX,15 ; 指定字符颜色
|
||
INT 0x10 ; 调用显卡BIOS
|
||
JMP putloop
|
||
|
||
fin:
|
||
HLT ; 让CPU停止,等待指令
|
||
JMP fin ; 无限循环
|
||
|
||
msg:
|
||
DB 0x0a, 0x0a ; 换行两次
|
||
DB "load error"
|
||
DB 0x0a ; 换行
|
||
DB 0
|
||
|
||
RESB 0x7dfe-$ ; 填写0x00直到0x001fe
|
||
|
||
DB 0x55, 0xaa
|