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

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
 

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

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