boot.nas:
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
[INSTRSET "i486p"] LEDS EQU 0x0ff1
MOV BX,0x105+0x4000 MOV AX,0x4f02 INT 0x10 MOV AH,0x02 INT 0x16 ; keyboard BIOS MOV [LEDS],AL
MOV AL,0xff OUT 0x21,AL NOP ; 如果连续执行OUT指令,有些机种会无法正常运行 OUT 0xa1,AL
CLI ; 禁止CPU级别的中断
;为了让CPU能够访问1MB以上的内存空间,设定A20GATE CALL waitkbdout MOV AL,0xd1 OUT 0x64,AL CALL waitkbdout MOV AL,0xdf ; enable A20 OUT 0x60,AL CALL waitkbdout
;切换到保护模式 [INSTRSET "i486p"] ; 说明使用486指令
LGDT [GDTR0] ; 设置临时GDT MOV EAX,CR0 AND EAX,0x7fffffff ; 设bit31为0(禁用分页) OR EAX,0x00000001 ; bit0到1转换(保护模式过渡) MOV CR0,EAX MOV AX,1*8 ; 可读写的段 32bit MOV DS,AX MOV ES,AX MOV FS,AX MOV GS,AX MOV SS,AX
XOR ECX,ECX XOR EDX,EDX L35: XOR EAX,EAX L34: MOV BYTE [0xe0000000+EAX+EDX*1],12 INC EAX CMP EAX,1024 JLE L34 INC ECX ADD EDX,1024 CMP ECX,768 JLE L35 L36: JMP L36
waitkbdout: IN AL,0x64 AND AL,0x02 JNZ waitkbdout ; AND的结果如果不是0,就跳到waitkbdout RET
ALIGNB 16 GDT0: RESB 8 ; 初始值 DW 0xffff,0x0000,0x9200,0x00cf ; 可以读写的段(segment)32bit DW 0xffff,0x0000,0x9a28,0x0047 ; 可执行的文件的32bit寄存器(bootpack用)
DW 0 GDTR0: DW 8*3-1 DD GDT0
ALIGNB 16
RESB 0x7dfe-$ ; 填写0x00直到0x001fe
DB 0x55, 0xaa
Makefile:
OBJS_BOOTPACK = hankaku.obj
TOOLPATH = ../z_tools/ INCPATH = ../z_tools/haribote/
MAKE = $(TOOLPATH)make.exe -r NASK = $(TOOLPATH)nask.exe CC1 = $(TOOLPATH)cc1.exe -I$(INCPATH) -Os -Wall -quiet GAS2NASK = $(TOOLPATH)gas2nask.exe -a OBJ2BIM = $(TOOLPATH)obj2bim.exe MAKEFONT = $(TOOLPATH)makefont.exe BIN2OBJ = $(TOOLPATH)bin2obj.exe BIM2HRB = $(TOOLPATH)bim2hrb.exe RULEFILE = $(TOOLPATH)haribote/haribote.rul EDIMG = $(TOOLPATH)edimg.exe IMGTOL = $(TOOLPATH)imgtol.com COPY = copy DEL = del
# 默认动作
default : $(MAKE) img
# 镜像文件生成
boot.bin : boot.nas Makefile $(NASK) boot.nas boot.bin boot.lst
init.bin : init.nas Makefile $(NASK) init.nas init.bin init.lst
hankaku.bin : hankaku.txt Makefile $(MAKEFONT) hankaku.txt hankaku.bin
hankaku.obj : hankaku.bin Makefile $(BIN2OBJ) hankaku.bin hankaku.obj _hankaku
haribote.img : boot.bin Makefile $(EDIMG) imgin:../z_tools/fdimg0at.tek \ wbinimg src:boot.bin len:512 from:0 to:0 \ imgout:haribote.img
# 其他指令
%.gas : %.c Makefile $(CC1) -o $*.gas $*.c
%.nas : %.gas Makefile $(GAS2NASK) $*.gas $*.nas
%.obj : %.nas Makefile $(NASK) $*.nas $*.obj $*.lst
# 运行程序
img : $(MAKE) haribote.img
run : $(MAKE) img $(COPY) haribote.img ..\z_tools\qemu\fdimage0.bin $(MAKE) -C ../z_tools/qemu
install : $(MAKE) img $(IMGTOL) w a: haribote.img
clean : -$(DEL) *.bin -$(DEL) *.lst -$(DEL) *.obj -$(DEL) bootpack.map -$(DEL) bootpack.bim -$(DEL) bootpack.hrb -$(DEL) haribote.sys
src_only : $(MAKE) clean -$(DEL) haribote.img
下图是显示结果,不过不知道是否还有冗余的代码:
