现在的显卡几乎全部支持VESA(电子视频标准协会)制定的标准,该标准的英文全称为VESA BIOS EXTENSION,简写VBE。这个标准经过1.0、1.1、1.2、2.0、2.0 Pro、3.0的升级,目前的最高版本是3.0。
制订这个标准的成员来自Intel、Matrox、Microsoft、Nvidia、Phillips、SciTech、Trident、ULSI等诸多公司或组织,也就是说它是被全面支持的,比如市面上几乎所有的PC机显卡都遵从这一标准;还有在当你安装LINUX或WINDOWS时或别的什么具备图形界面的操作系统时,如果系统无法识别你的显卡或找不到相应的驱动时,它们都会使用基于VBE标准的驱动以实现最基本的显示能力及硬件特性。所以不论你是底层编程的爱好者还是自动控制程序界面的实现者,甚至想在自己写的操作系统中加入对图形的支持,你都应该对VBE有所认识,并尽量地去掌握它,而关于VBE的文档都是英文的,虽然有人想汉化,但我目前还未找到一份完整的汉化版,因此在这个系列的文章中,我会用相当的篇幅来介绍VBE,并会结合NEO SDK的源代码以让你有更深的认识。
先让我们来预览一下VBE的特性:
l SVGA图形控制设备的标准应用程序接口
l 可选的操作系统保护模式图形接口(譬如可被用Windows,OS/2和UNIX等)
l 用以设置所支持显示模式刷新率的标准方案
l 支持液晶眼镜显示设备
l 识别视频产品和厂商的标准方法
l OEM厂商可通过第14H号子功能追加扩展功能
l 通过补充说明可扩展现有接口
好了,上面的特性能让你对VBE有一个大概的了解,现在切入正题,我们从设置显卡的显示模式开始。
在VBE标准中,设置显示模式是通过第02H号子功能实现的,为实现设置过程,我们要做如下步骤:
1. 将寄存器AH设置为0x4F(VBE的功能入口),AL设置为0x02(子功能号),当然你也可以直接将0x4F02赋值给AX
2. 然后将你要设置的显示模式的信息赋给寄存器BX。其中BX的第0位到第8位(以后简称为D0~D8)是模式号(关于模式号见附表);D9~D10保留置0;D11是刷新率标志位,为0时表示使用当前的默认刷新率,为1表示使用用户自定义的刷新率;D12~13也保留,置0即可;D14是显存寻址模式标志,为0表示使用窗口模式(也有译作换页模式但会与NEO中的概念冲突),否则使用线性模式,线性模式需要保护模式的支持(譬如通过DMPI支持);D15是清空显存标志,为0表示显示模式切换时清空显存原有内容,为1则保留;以上介绍的各个字节位初级应用只需要使用到D0~D8即模式号,其它的可以暂放一边
3. 如果需要自定义显示的刷新率,就将指向CRTC结构的指针赋给ES:DI,否则跳过这一步(有关于CRTC结构的介绍由于篇幅问题请直接参阅VBE标准文档)
4. 调用第10H号中断,你可以用库函数譬如int86(),也可以用内嵌汇编
如果不出意外,你会发现显示模式已经被你设置了为你想要的了,当然也许会出错,错误的返回值你可以从寄存器AX中获得,AX中的值在VBE中被称为返回状态,除了32位保护模式接口的专有子功能,每个子功能在调用后都会往AX中返回一个状态值,它有以下的可能:
AL == 4Fh:子功能被支持
AL != 4Fh:子功能不被支持
AH ==00h:功能调用成功
AH ==01h:功能调用失败
AH ==02h:子功能在当前的硬件设置中不被支持
下面给出一段NEO SDK中的代码用作示例:
/*切换到指定图形模式*/
r.x.ax = 0x4f02;
r.x.bx = mode;
int86(0x10, &r, &r);
if (r.x.ax != 0x4F) return FALSE; /*切换失败*/
你可能会问,说了这么多,那VBE到底支持哪些显示模式哪?不急,我来给出两张表:
附表A
图形模式
| |||
15位模式号
|
7位模式号
|
分辨率
|
颜色数目
|
100h
|
――
|
640x400
|
256
|
101h
|
――
|
640x480
|
256
|
102h
|
6Ah
|
800x600
|
16
|
103h
|
――
|
800x600
|
256
|
104h
|
――
|
1024x768
|
16
|
105h
|
――
|
1024x768
|
256
|
106h
|
――
|
1280x1024
|
16
|
107h
|
――
|
1280x1024
|
256
|
10Dh
|
――
|
320x200
|
32K (1:5:5:5)
|
10Eh
|
――
|
320x200
|
64K (5:6:5)
|
10Fh
|
――
|
320x200
|
16.8M (8:8:8)
|
110h
|
――
|
640x480
|
32K (1:5:5:5)
|
111h
|
――
|
640x480
|
64K (5:6:5)
|
112h
|
――
|
640x480
|
16.8M (8:8:8)
|
113h
|
――
|
800x600
|
32K (1:5:5:5)
|
114h
|
――
|
800x600
|
64K (5:6:5)
|
115h
|
――
|
800x600
|
16.8M (8:8:8)
|
116h
|
――
|
1024x768
|
32K (1:5:5:5)
|
117h
|
――
|
1024x768
|
64K (5:6:5)
|
118h
|
――
|
1024x768
|
16.8M (8:8:8)
|
119h
|
――
|
1280x1024
|
32K (1:5:5:5)
|
11Ah
|
――
|
1280x1024
|
64K (5:6:5)
|
11Bh
|
――
|
1280x1024
|
16.8M (8:8:8)
|
81FFh
|
特殊模式(具体参阅VBE标准文档细节)
|
附表B
文本模式
| |||
15位模式号
|
7位模式号
|
列
|
行
|
108h
|
――
|
80
|
60
|
109h
|
――
|
132
|
25
|
10Ah
|
――
|
132
|
43
|
10Bh
|
――
|
132
|
50
|
10Ch
|
――
|
132
|
60
|
注:
A. 颜色数目一栏中的32K指32768;64K指65536;16.8M指16777216
B. 约定:在本系列之后的文档中,32K和64K被称为高彩色,16.8M被称为真彩色
C. 15位模式号为VBE标准模式号;7位模式号是OEM自定义的模式号,VBE只定义了一个模式的7位模式号,即102h模式,其对应的7位模式号为6Ah
如果显卡支持vbe,我们就应该切换到vga13显示模式下工作