引导扇区如何设置显示1024*768分辨率模式

xiaoxiao2025-12-03  4

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  

下图是显示结果,不过不知道是否还有冗余的代码:

转载请注明原文地址: https://www.6miu.com/read-5040264.html

最新回复(0)