【发布时间】:2023-02-16 20:38:38
【问题描述】:
我通过 INT10/4f00h 获得了基本的 vesa 信息块。
PUSH cs ;
POP es ;
;- perform VESA check ;
PUSH es ; some BIOSes destroy ES with this call
MOV di, OFFSET DRV_VESA_infoBlock ; ES:DI buffer for at least 256 bytes (512 for VBE v2.0+)
MOV ax, 04F00H ;
INT 10H ;
POP es ;
;
;- check for errors ;
CALL DRV_VESA_bioscallErrorCheck ;
;
;-- check buffer signature ;
PUSH CS ;
POP ES ;
MOV di, OFFSET DRV_VESA_infoBlock ; ES:DI = buffer
MOV cx, 4 ;
MAC_IMMSTRING "VESA" ; DS:SI = "VESA" signature needs to match!
REPZ CMPSB ;
JZ @@noErrors ;
MAC_DPT_PRINTIMM "VESA buffer: signature does not match!"
DRV_VESA_panic ;
;
;-- check vesa version ;
MOV ax, CS:[DRV_VESA_infoBlock].version
CMP ax, 00102H ;
JGE @@noErrors ;
MAC_DPT_PRINTIMM "VESA: version too low"
DRV_VESA_panic ;
@@noErrors: ;
...
...
...
;
ALIGN DWORD ; some bioses might require the structs to be aligned
DRV_VESA_infoBlock DRV_VESA_VBE_INFO_STRUCT {}
ALIGN DWORD ;
DRV_VESA_modeInfo DRV_VESA_VBE_MODE_INFO_STRUCT {}
然后我得到指向视频模式缓冲区的指针
;-- get vesa modes buffer address ;
MOV ax, WORD PTR [bx].DRV_VESA_VBE_INFO_STRUCT.modesOff
MOV si, ax
MOV ax, WORD PTR [bx].DRV_VESA_VBE_INFO_STRUCT.modesSeg
PUSH ax ;
POP fs ;
;
然后我(作为初步步骤)打印出我拥有的所有视频模式
@@displayModeLoop: ;
MOV cx, WORD PTR fs:[si] ;
CMP cx, 0FFFFH ;
JE @@displayModeEndLoop ;
MOV ax, cx ;
CALL DPT_printNum ;
;--- get mode information ;
MOV ax, 04F01H ;
INT 10H ;
CALL DRV_VESA_bioscallErrorCheck ;
ADD si, 2 ;
JMP @@displayModeLoop ;
@@displayModeEndLoop: ;
-
DPT_printNum 在这里肯定没有错(它在许多其他地方都有效)
-
我已经尝试删除 bios-function-call,这不是导致问题的原因
-
我还在RMODE
-
我正在使用自己的引导加载程序
相关文件在这里:https://github.com/Wittmaxi/maxos/tree/master/kernel/drivers/graphics
当我运行此代码时(在 QEMU 和 dosbox 中),会打印出许多空数组索引。一旦打印出第一个非零值,内核就会崩溃。 我希望数组(如指定的http://www.ctyme.com/intr/rb-0273.htm)充满显示模式代码并以单词“FFFF”结尾
【问题讨论】:
-
你在哪里为“获取模式信息”中断设置
ES:DI?DRV_VESA_bioscallErrorCheck发生了什么事?