[Rx86OS-XIV] 提高分辨率

平台

处理器:Intel Celeron® Dual-Core CPU  2.10GHz

操作系统:Windows7 专业版 x86

阅读书籍:《30天自制操作系统》—川合秀实[2015.04.15]

工具:../toolset/


1 高分辨率与显卡

高分辨率的利用方法因显卡不同而不同。由于多家公司显卡的竞争,使得在各家公司之间,画面模式的设定方法和使用方法各有不同。后来许多显卡公司协商,成立VESA协会,并制作了专用的BIOS,这个追加的BIOS被简称作VBE。利用它就可以使用显卡的高分辨率功能了。由于不能断定每台计算机使用的是什么样的显卡,有的公司尚未与VESA进行合作。如果是这样公司的产品,由于不能使用VBE(尤其专门高分辨率的模式),就只能使用原BIOS提供的320 x 200的画面了。----抄于“书”。


2 提高分辨率

设置屏幕分辨率是用汇编语言来完成的(代码在asmhead.nas文件中)。


2.1 检查VBE

 

1.        ;判断VBE是否存在

2.        ;取得的画面模式会保存在ES:DI开始的512字节内存里

3.        MOV         AX,0x9000    ;INT 0x10程序参数

4.        MOV         ES,AX

5.        MOV         DI,0

6.        MOV         AX,0x4f00

7.        INT            0x10

8.        CMP                   AX,0x004f   ;如果AX不等于0x004f则不存在VBE

9.        JNE            scrn320

10.     

11.    ;检查VBE的版本

12.    MOV    AX, [ES:DI + 4]

13.    CMP    AX, 0x200

14.    JB      scrn320   ;如果VBE不是2.0以上则使用320 * 200分辨率
 

2.2 检查画面模式

即使VBE版本是VBE2.0,也不能保证所有的画面模式都可以使用。需要检查0x105画面模式(1024x 768 x 8bit 彩色)是否可以使用。

 

1.        VBEMODE        EQU          0x105

2.         

3.        ;取得画面模式信息

4.        ;取得的画面模式会保存在ES:DI开始的256字节内存里

5.        MOV         CX,VBEMODE

6.        MOV         AX,0x4f01

7.        INT            0x10

8.        CMP                   AX,0x004f   ;如果AX不等于0x004f则不支持0x105画面模式

9.       JNE            scrn320
 

在画面模式信息中,重要的信息有6个。(Page278)


2.3 确认画面模式信息

 

1.        ;画面模式信息的确认

2.        CMP                   BYTE [ES:DI+0x19],8

3.        JNE            scrn320

4.        CMP                   BYTE [ES:DI+0x1b],4

5.        JNE            scrn320

6.        MOV         AX,[ES:DI+0x00]

7.        AND          AX,0x0080

8.        JZ               scrn320    
 

画面模式6个重要信息在ES:DI中的保存如下(根据下图可得每个语句确认的何种画面信息):

[Rx86OS-XIV] 提高分辨率_第1张图片

Figure1. VBE的画面信息

2.4 画面模式切换

如果以上检查皆通过,就可以调用INT 0x10程序来切换画面,并将画面模式信息保存到指定内存中。

 

1.        ;画面模式切换并将画面模式信息保存到内存中

2.        MOV         BX,VBEMODE+0x4000   ;0x10程序VBE参数

3.        MOV         AX,0x4f02

4.        INT            0x10

5.        MOV         BYTE [VMODE],8     ;保存VBE画面模式信息

6.        MOV         AX,[ES:DI+0x12]

7.        MOV         [SCRNX],AX

8.        MOV         AX,[ES:DI+0x14]

9.        MOV         [SCRNY],AX

10.    MOV         EAX,[ES:DI+0x28]

11.    MOV         [VRAM],EAX

12.    JMP           keystatus

13.     

14.    ;原320 * 200 * 8画面模式

15.    scrn320:

16.                       MOV         AL,0x13                      ; VGA画面模式320x200x8bit彩色

17.                       MOV         AH,0x00

18.                       INT            0x10

19.                       MOV         BYTE[VMODE],8     ; 保存VGA画面模式信息

20.                       MOV         WORD[SCRNX],320

21.                       MOV         WORD[SCRNY],200

22.                       MOV         DWORD[VRAM],0x000a0000

23.     

24.    ;获取键盘指示灯状态的程序

25.    keystatus:

26.                       MOV         AH,0x02

27.                       INT            0x16       ; keyboard BIOS

28.                       MOV         [LEDS],AL

29.    ……

30.     ;后面的代码跟之前一样
 

改写asmhead.nas文件,打开”!cons_nt.bat”,整个程序通过编译后,使用”makeinstall”命令将.img文件下载到软盘中,然后用它来重启电脑:

Figure2. 1024 * 768 * 8

直接使用”make run”命令在QEMU中运行:

Figure2. 1024 x 768 x 8bit 彩色

[x86OS] Note Over.

[2015.04.17]

你可能感兴趣的:([Rx86OS-XIV] 提高分辨率)