原文
- 文件名会写在 0x002600 以后的地方
- 文件的内容会写在 0x004200 以后的地方
ipl.nas
; haribote-ipl
; TAB=4CYLS EQU 10 ; 声明CYLS=10ORG 0x7c00 ; 指明程序装载地址; 标准FAT12格式软盘专用的代码 Stand FAT12 format floppy codeJMP entryDB 0x90DB "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 ; 不使用分区,必须是0DD 2880 ; 重写一次磁盘大小DB 0,0,0x29 ; 意义不明(固定)DD 0xffffffff ; (可能是)卷标号码DB "HARIBOTEOS " ; 磁盘的名称(必须为11字?,不足填空格)DB "FAT12 " ; 磁盘格式名称(必??8字?,不足填空格)RESB 18 ; 先空出18字节; 程序主体entry:MOV AX,0 ; 初始化寄存器MOV SS,AXMOV SP,0x7c00MOV DS,AX; 读取磁盘MOV AX,0x0820MOV ES,AXMOV CH,0 ; 柱面0MOV DH,0 ; 磁头0MOV CL,2 ; 扇区2readloop:MOV SI,0 ; 记录失败次数寄存器retry:MOV AH,0x02 ; AH=0x02 : 读入磁盘MOV AL,1 ; 1个扇区MOV BX,0MOV DL,0x00 ; A驱动器INT 0x13 ; 调用磁盘BIOSJNC next ; 没出错则跳转到nextADD SI,1 ; 往SI加1CMP SI,5 ; 比较SI与5JAE error ; SI >= 5 跳转到errorMOV AH,0x00MOV DL,0x00 ; A驱动器INT 0x13 ; 重置驱动器JMP retry
next:MOV AX,ES ; 把内存地址后移0x200(512/16十六进制转换)ADD AX,0x0020MOV ES,AX ; ADD ES,0x020因为没有ADD ES,只能通过AX进行ADD CL,1 ; 往CL里面加1CMP CL,18 ; 比较CL与18JBE readloop ; CL <= 18 跳转到readloopMOV CL,1ADD DH,1CMP DH,2JB readloop ; DH < 2 跳转到readloopMOV DH,0ADD CH,1CMP CH,CYLSJB readloop ; CH < CYLS 跳转到readloop; 读取完毕,跳转到haribote.sys执行!MOV [0x0ff0],CH ; IPLがどこまで読んだのかをメモJMP 0xc200error:MOV SI,msgputloop:MOV AL,[SI]ADD SI,1 ; 给SI加1CMP AL,0JE finMOV AH,0x0e ; 显示一个文字MOV BX,15 ; 指定字符颜色INT 0x10 ; 调用显卡BIOSJMP putloopfin:HLT ; 让CPU停止,等待指令JMP fin ; 无限循环msg:DB 0x0a, 0x0a ; 换行两次DB "load error"DB 0x0a ; 换行DB 0RESB 0x7dfe-$ ; 填写0x00直到0x001feDB 0x55, 0xaa
haribote.nas
; haribote.nas - 纯实模式,全屏白色(或任何颜色)
; 编译:nask haribote.nas haribote.sys haribote.lst
; 配合原书 ipl.bin 使用ORG 0xc200; 设置 VGA 320x200 256色模式MOV AL,0x13MOV AH,0x00INT 0x10; 直接写显存(0xA0000)填充白色MOV AX,0xA000MOV ES,AXXOR DI,DI ; ES:DI = 0xA000:0MOV AL,0x0C ; 红色(0x0F 是亮白)MOV CX,320*200 ; 64000 个像素REP STOSB ; 一次性填充整个屏幕fin:HLTJMP fin