VESA编程介绍 (3):扩展的VGA BIOS
---------------------------------------------------------------------------------
相关章节:
(1): 标准VGA BIOS及超级VGA模式号
(2):CPU显存控制
(3):扩展的VGA BIOS
(4): 扩展的VGA BIOS(续)及应用举例
---------------------------------------------------------------------------------
6、扩展的VGA BIOS
一些新的BIOS调用已经支持超级VGA模式。为了最大程度地与标准VGA BIOS兼容,这些BIOS调用同属于一个函数号。这个数字在AH寄存器中通过10h中断被传送。
指定的超级VGA扩展函数号是4Fh。该函数号在如今的VGA BIOS中并未被使用。因而函数调用4Fh时对标准VGA并无影响。超级VGA标准VS900602定义了子函数00h到07h,函数号08h到0FFh保留。
6-1、状态信息
每一个函数向AX寄存器返回一个状态信息。状态字的格式如下:
AL==4Fh 函数被支持
AL!=4Fh 函数不被支持
AH==00h 函数调用成功
AH==01h 函数调用失败
当AH寄存器的值为非零时,软件就应该认为是失败。在今后的VESA BIOS扩展中将会定义新的错误号。
6-2、00h-返回超级VGA信息
该函数的目的是向调用程序提供超级VGA环境的情况。该函数填满一个由调用者所指定地址的信息块。信息块的大小有256字节。
输入:AH = 4Fh 超级VGA支持
AL = 00h 返回超级VGA信息
ES:DI = 缓冲区指针
输出:AX = 状态
(其它寄存器保持不变)
信息块的结构如下:
VgaInfoBlock STRUC
VESASignature db 'VESA' ; 四字节的标志
VESAVersion dw ? ; VESA版本号
OEMStringPtr dd ? ; OEM串的指针
Capabilities db 4 dup(?) ; 视频环境的情况
VideoModePtr dd ? ; 所支持的超级VGA模式的指针
TotalMemory dw ? ; 板载64K内存块数
Reserved db 236 dup(?) ; VgaInfoBlock的剩余
VgaInfoBlock ENDS
只有当VESASignature区域为“VESA”时,该信息块才有效。
VESAVersion域是二进制表示的,指明了超级VGA BIOS所遵从的VESA标准的级别。低字节表明了副版本号。当前的VESA版本号是1.2。使用VESA BIOS扩展的特性的程序在今后的版本中仍将有效。VESA BIOS扩展将是完全向上兼容的。
OEMStringPtr是一个指向以空作为结束的OEM定义串的长指针。该串用来为针对硬件的设备驱动鉴定显示芯片、显示板和内存配置等等。
Capabilities区域描述了视频环境所支持的一般特性。
各位定义如下:
D0 = DAC可变换
0 = DAC为固定宽度,每种主要颜色6位
1 = DAC宽度可变换
D1-31保留
VideoModePtr指向了一个包括了所有所支持的超级VGA(VESA定义的和OEM指定的)显示模式。每种模式占用一个字(16位)。模式号表由-1(0FFFFh)结束。请回到第二章查阅VESA模式号详细资料。指针可被指向RAM或ROM,依具体情况而定。可能该表是在ROM中的静态串,也可能是在运行时生成于RAM中的信息块。程序负责检验由返回模式信息(函数01h)所返回的当前模式是否可用。由于显存和显示器的关系,当前的显示模式可能是不可用的。
TotalMemory指明了板载内存量。其值表示了板上现有的64K内存块的块数。
6-3、01h-返回超级VGA模式信息
该函数返回一个指定的超级VGA显示模式的相关信息。该函数根据调用者给定的地址填充一个模式信息块。模式信息块最大为256K。
此函数返回的一些信息是由VESA模式号暗中定义的。但是一些超级VGA可能支持其它的显示模式而不是由VESA所定义的。为了提供对该模式的访问,函数也返回一些各种各样的相关信息。
输入:AH = 4Fh 超级VGA支持
AL = 01h 返回超级VGA模式信息
CX = 超级VGA模式号(模式号必须为函数00h返回值之一)
ES:DI = 256字节缓冲区指针
输出:AX = 状态
(其它寄存器不变)
模式信息块结构如下:
ModeInfoBlock STRUC
; 强制信息
ModeAttributes dw ? ; 模式属性
WinAAttributes db ? ; 窗口A属性
WinBAttributes db ? ; 窗口B属性
WinGranularity dw ? ; 窗口间隔尺寸
WinSize dw ? ; 窗口大小
WinASegment dw ? ; 窗口A开始段地址
WinBSegment dw ? ; 窗口B开始段地址
WinFuncPtr dd ? ; 窗口函数指针
BytesPerScanLine dw ? ; 每行字节数
; 过去的可选信息(现在是强制信息)
XResolution dw ? ; 水平分辨率
YResolution dw ? ; 垂直分辨率
XCharSize db ? ; 字符单元宽度
YCharSize db ? ; 字符单元高度
NumberOfPlanes db ? ; 内存平面数
BitsPerPixel db ? ; 每点的位数
NumberOfBanks db ? ; 存储区数
MemoryModel db ? ; 内存模式类型
BankSize db ? ; 存储区K字节数
NumberOfImagePages db ?; 图象数
Reserved db 1 ; 保留给页函数
; 新的直接色彩区域
RedMaskSize db ? ; 红色遮盖位数
RedFieldPosition db ? ; 红色遮盖位址
GreenMaskSize db ? ; 绿色遮盖位数
GreenFieldPosition db ? ; 绿色遮盖位址
BlueMaskSize db ? ; 兰色遮盖位数
BlueFieldPosition db ? ; 兰色遮盖位址
RsvdMaskSize db ? ; 直接色彩保留遮盖位数
RsvdFieldPosition db ? ; 直接色彩保留遮盖位址
DirectColorModeInfo db ? ; 直接色彩模式属性
Reserved db 216 dup(?) ; 模式信息块剩余
ModeInfoBlock ENDS
ModeAttributes区域描述了显示模式的几个重要特性。D0位指明了该模式能否在当前配置下被初始化。如果该显示模式需要特殊的显示器类型,而这种显示器现在并没有连接,则该位可用来阻止访问。在VESA
BIOS扩展1.2版本之前,并不需要该位也能返回BytesPerScanLine之后正确的值。D1位指出当前是否有选择信息。VBE1.2版要求除了直接色彩区域(仅当Memory-Model区域设为6(直接色彩)或7(YUV)时有效)外的ModeInfoBlock所有部分都有效。D1位现在保留,但必须设为1。D2位指出在该模式下BIOS是否支持类似TTY输出、卷屏和像素点输出等函数(推荐,并不强制,BIOS支持所有的输出函数)。如果D2位为1,那么BIOS必须支持所有的标准输出函数。
该区域定义如下:
D0 = 模式被硬件支持
0 = 模式不被硬件支持
1 = 模式被硬件支持
D1 = 1(保留)
D2 = BIOS支持输出函数
0 = BIOS不支持输出函数
1 = BIOS支持输出函数
D3 = 单色/彩色模式(请看下面注释)
0 = 单色模式
1 = 彩色模式
D4 = 模式类型
0 = 文本方式
1 = 图形方式
D5-D15 = 保留
注释:单色模式的CRTC地址位于3B4h。彩色模式的CRTC地址位于3D4h。单色模式属性控制输出中只有第三位(视频)和第四位(亮度)是重要的。所以,单色文本模式的属性有关闭、视频、高亮度和闪烁等。单色图形模式为两平面的模式且有关闭、视频、高亮度和闪烁的属性扩展的二色模式的CRTC地址位于3D4h。它有一个平面且每像素有一位。标准VGA模式的06h和11h被分类为彩色模式,而模式07h和0Fh被分为单色模式。
BytesPerScanLine指出每条合理的扫描线由多少字节组成。合理的扫描线可以等于或大于实际显示的扫描线。
WinAAttributes和WinBAttributes描述了CPU窗口配置的属性,如窗口是否存在和窗口是否可读可写,如下所示:
D0 = 窗口支持
0 = 窗口不被支持
1 = 窗口被支持
D1 = 窗口可读
0 = 窗口不可读
1 = 窗口可读
D2 = 窗口可写
0 = 窗口不可写
1 = 窗口可写
D3-D7 = 保留
如果窗口不被支持(窗口A和窗口B的D0位都为0),那么应用程序可以假设显存缓冲位于与该模式MemoryModel相应的标准CPU地址中。
WinGranularity指出了窗口在显存上的最小字节大小。若相应的WinAttributes的D0位未设置,则该值不确定。
WinSize指明了窗口的字节大小。
WinASegment和WinBSegment给出了窗口在CPU地址空间中的段地址。
WinFuncPtr指出了CPU显存窗口函数的地址。窗口函数能通过VESA BIOS函数05h调用,也能直接调用该函数。直接调用比使用10h中断对硬件页寄存器的访问更快,可用于高效程序。若其值为空,应通过函数05h设置内存窗口,如果内存分页被支持。
XResolution和YResolution指明了显示模式的宽度和高度。在图形方式下该值以像素为单位。在文本方式下,该值以字符为单位。注意,在字符模式下以像素为单位的分辨率可以通过将X和Y分辨率分别乘以字符的宽度和高度来获得,如果有这样的扩展信息的话。
XCharSize和YCharSize指出了字符单元的大小。
NumberOfPlanes指出了在该模式下软件可用的内存平面数。对于标准VGA16色图形模式而言,其值为4。对标准压缩像素模式而言,其值为1。BitsPerPixel指出了定义一个像素点的颜色所需位数。比如说,标准VGA4平面16色图形模式的值为4而256色压缩像素图形模式为8。每平面每像素位数可以通过将每像素位数除以平面数得到。
MemoryModel指出了内存的通用组织方式。方式定义如下:
00h = 文本方式
01h = CGA图形
02h = HERCULES图形
03h = 4平面
04h = 压缩像素
05h = 非链 4、256色
06h = 直接色彩
07h = YUV
08h-0Fh = 保留,有VESA定义
10h-FFh = 由OEM定义
在1.1版和更早的VESA超级VGA
BIOS扩展中,OEM以1:5:5:5和8:8:8以及8:8:8:8(相应压缩像素的每像素位数为16位、24位和32位)来定义直接色彩模式。在1.1版和今后的VESA超级VGA
BIOS扩展中,推荐直接色彩模式使用直接色彩内存模式和模式信息块中的遮盖大小和位址来描述像素格式。BitsPerPixel总是代表了每个像素点所占的总的内存位数。
NumberOfBanks指出了成组扫描线的存储区的个数。将扫描线数除以存储区数,所得的余数为含有扫描线的存储区,而其商为每存储区内的扫描线数。比如,CGA图形模式有两个存储区,而HERCULES图形模式有四个存储区。对于没有扫描线存储区的模式(如VGA模式0Dh-13H),其值为1。
BankSize指明了存储区的大小(以KB为单位)。对于CGA和HERCULES图形模式,其值为8,即每存储区长度为8192字节。对于没有扫描线存储区的模式(如VGA模式0Dh-13H),其值为0。
NumberOfImagePages指出了能一次填充VGA内存的附加完整的显示图象数。若该值非空,则程序将装载大于一张图象进VGA内存,并在它们之间交替显示。
Reserved保留给今后的VESA BIOS扩展,而今其值必须为一。
RedMaskSize、GreenMaskSize、BlueMaskSize和RsvdMaskSize定义了直接色彩像素点中红、绿、蓝成分的位数。其值通过简单的移位算法就能产生位遮盖。如:直接色彩5:6:5模式的遮盖大小为5、6、5和0,分别对应红、绿、蓝、和保留值。注意对于YUV内存模式,红色用于V,绿色用于Y而兰色用于U。若其模式的像素没有原色成分,其值应置为0。
RedFieldPosition、GreenFieldPosition、BlueFieldPosition和RsvdFieldPosition定义了在直接色彩模式和YUV模式中各自色彩成分中最重要位的位址。色彩值能通过根据位址左移其值而与像素相连。比如:直接色彩5:6:5模式中,红、绿、蓝和保留的位置分别为11、5、0和0。注意对于YUV内存模式,红色用于V,绿色用于Y而兰色用于U。若其模式的像素没有原色成分,其值应置为0。
DirectColorModeInfo描述了直接色彩模式的重要特性。D0位表明DAC色彩梯度是固定的或是可编程的。如果色彩梯度是固定的,则其不能被改变。如果是可编程的,则意味着能通过标准VGA
DAC色彩寄存器BIOS调用(AX=1012h)来装载红、绿、蓝查找表。D1位指出直接色彩像素保留区能被程序使用,还是保留,即不能使用。
D0 = 色彩梯度为固定/可编程
0 = 色彩梯度固定
1 = 色彩梯度可编程
D1 = 保留位可用/保留
0 = 保留位保留
1 = 保留位能被程序使用
注意:
版本1.1及其以后的VESA
BIOS扩展将信息块中不用的地方清零,但仍保持256字节大小。这使其对于未来的标准具有向上兼容性,因为新增加的区域将零作为默认值或是不可实现的附加选项。打算向后兼容VESA
BIOS扩展1.0版的程序应该在调用返回超级VGA模式信息之前先预初始化一个256字节的缓冲区。
6-4、02h-设置超级VGA模式
该函数初始化一种显示模式。BX寄存器包含了要存放的模式。VESA模式号的格式已在第二章作了描述。如果模式无法设置,BIOS应该保持视频环境不变并返回错误号。
输入:AH = 4Fh 超级VGA支持
AL = 02h 设置超级VGA显示模式
BX = 显示模式
D0-D14 = 显示模式
D15 = 清除内存标志
0 清除显存
1 不清除显存
输出:AX = 状态
(其它寄存器保持不变)
6-5、03h-返回当前显示模式
此函数将当前显示模式返回到BX寄存器。VESA显示模式号在第二章有详细描述。
输入:AH = 4Fh 超级VGA支持
AL = 03h 返回当前显示模式
输出:AX = 状态
BX = 当前显示模式
(其它寄存器保持不变)
注意:
在标准VGA
BIOS中,函数0Fh(读当前显示状态)返回当前显示模式到AL寄存器。在AL的D7位,也返回内存清除位状态。如果内存未被清除,则该位被设置。在超级VGA函数中,因为函数的目的只是返回显示方式,内存清除位不会被返回到BX寄存器。如果程序要获得内存清除位,就应该调用VGA
BIOS函数0Fh。