现在的显卡几乎全部支持VESA(电子视频标准协会)制定的标准,该标准的英文全称为VESA BIOS EXTENSION,简写VBE。
VBE的功能大致有两种:a)制定了各种标准显示模式及分辨率的规范。我们知道,一般SVGA BIOS的模式编号用1个字节来表示即可,象0x13、0x03等,在VBE中为了区别开来,采用了2个字节的表达方式,高字节的第8位固定为1,例如0x0100、0x0101等,详见稍后的初始化例程附表,当然,这些模式不一定所有的SVGA卡都具备,只是在能力范围内尽量提供符合以上标准的显示模式;b)提供了一些特殊功能。这是通过调用中断10,ah=0x4f来实现的:
ax 说 明
0x4f00 读SVGA卡信息
0x4f01 读显示模式信息
0x4f02 设置显示模式
0x4f03 读当前显示模式
0x4f04 存储或恢复SVGA的视频状态
0x4f05 控制内存页区域切换
0x4f06 设置或读取逻辑扫描线宽度
0x4f07 设置或读取视频内存与屏幕的初始对应位置
0x4f08 设置或读取DAC各原色有效位数
下面,我们来看看如何通过VBE设置SVGA的显示模式。首先我们再次分析一下VBE的模式编号:位0~8是模式号,如果位8为1表示VBE模式,如0x0100,如果位8为0表示非VBE模式;位9~14是保留位0;位15是清除位,为0表示设置新模式时要清除视频内存的内容,为1则不清除。由此可以看出,VBE的编号系统已将非VBE的模式也包括进去了,所以,我们也可以用VBE的功能来设置非VBE的显示模式。
// 设置SVGA显示模式 int 10, ax=0x4f02
void set_svgamode()
{
union REGS in,out;
in.x.ax=0x4f02;
out.x.bx=mode; // mode为相应模式编号
int86 (0x10,&in,&out);
return;
}
附:标准VBE常见模式
种类 编号 说明
图形 100h 640*400*256
图形 101h 640*480*256
图形 102h 800*600*16
图形 103h 800*600*256
图形 104h 1024*768*16
图形 105h 1024*768*256
图形 106h 1280*1024*16
图形 107h 1280*1024*256
文本 108h 80*60*16
文本 109h 132*25*16
文本 10Ah 132*43*16
文本 10Bh 132*50*16
文本 10Ch 132*60*16
图形 10Dh 320*200*32K
图形 10Eh 320*200*64K
图形 10Fh 320*200*16M
图形 110h 640*480*32K
图形 111h 640*488*64K
图形 112h 640*480*16M
图形 113h 800*600*32K
图形 114h 800*600*64K
图形 115h 800*600*16M
图形 116h 1024*768*32K
图形 117h 1024*768*64K
图形 118h 1024*768*16M
图形 119h 1280*1024*32K
图形 11Ah 1280*1024*64K
图形 10Bh 1280*1024*16M
现在的显卡几乎全部支持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显示模式下工作