中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
« [1] [2] »
作者:
标题: [转帖]VESA(VBE)编程介绍  取消高亮 | 上一主题 | 下一主题
Dark-Destroy
元老会员





积分 8312
发帖 3551
注册 2003-3-22
状态 离线
『楼 主』:  [转帖]VESA(VBE)编程介绍 

目的:

为提供简单的软件应用可以操纵高级的VGA适配器的能力,而提出的超级视频适配器的标准化公用软件接口。

概述:

该标准提供一系列应用程序能够使用的函数集。

1、获取某一指定超级VGA设备的兼容性和其独有的特点。

2、用以控制诸如显示方式、初始化和显存访问等等硬件操作。

这些功能作为VGA BIOS视频设备的扩展而提供,由10h中断访问。

目录:

1、介绍

2、目标和目的

2-1、视频环境信息

2-2、编程支持

2-3、兼容性

2-4、标准的情况

3、标准VGA BIOS

4、超级VGA模式号

5、CPU显存控制

5-1、硬件设计的考虑

5-1-1、受限于CPU 64K/128K的地址空间

5-1-2、跨越CPU显存窗口界限

5-1-3、处理来自不同区域的数据

5-1-4、将来自不同窗口的数据结合

5-2、硬件窗口的不同类型

5-2-1、单窗口系统

5-2-2、双重窗口系统

6、扩展的VGA BIOS

6-1、状态信息

6-2、00h-返回超级VGA信息

6-3、01h-返回超级VGA模式信息

6-4、02h-设置超级VGA模式

6-5、03h-返回超级VGA模式

6-6、04h-保存/恢复超级VGA状态

6-7、05h-超级VGA视频存储器窗口控制

6-8、06h-设置/获取逻辑扫描线长度

6-9、07h-设置/获取显示起点

6-10、08h-设置/获取DAC调色板控制

7、应用举例

------------------------------------------------------------------------------------------

1、介绍

本文档包含扩展VGA视频模式和功能的标准化接口的说明书。该说明书由以下结构组成:为主要VESA委员会所认可的标准扩展视频模式和功能以及非标准的视频模式。从而使得一些独立的VGA提供者能通过忽略对独特的VGA硬件的复杂细节的认识,以一种统一的方式向应用程序中添加扩展VGA的使用。

该说明书的主题是对扩展VGA视频模式和功能对于应用软件了解视频模式的特性和操纵与视频模式相关的扩展存储器的必要性作一个定义。

本文档的阅读者应该已经对于在硬件层进行VGA编程和INTEL iAPX 实模式汇编语言有一定的了解。对于VGA编程不熟悉的读者请在尝试了解对于标准VGA扩展之前先选择阅读大量现有的VGA编程教程。

2、目标和目的

在PC图象世界中,IBM VGA已经成了事实上的标准。市场上现存的各种不同的VGA提供商都保证了与IBM VGA在BIOS和寄存器上的兼容。越来越多的VGA兼容产品形成了VGA的各种扩展。这些扩展有更高的分辨率、更多的色彩和一些图象处理能力。强烈的竞争提高了性价比,而受益的是最终用户。

然而,对于那些意图利用超级VGA环境的新优点的软件开发人员却面临着一些严重的问题。由于没有标准的硬件,他们不得不面对各不相同的超级VGA硬件结构。缺乏通用的软件接口,导致设计相关的软件高昂的成本,而且在技术上也十分困难。除了OEM提供的VGA之外,几乎没有什么VGA产品的强大功能能被软件所使用。

VESA VGA BIOS扩展的出台正是为了弥补这一缺陷。做为超级VGA图形产品的通用软件接口,其主要目的是使应用软件和系统软件适应和挖掘广大的VGA扩展中的丰富特性。

明确而言,VESA BIOS扩展要解决以下问题:

1、向应用程序返回视频环境信息。

2、帮助应用程序对硬件进行初始化和编程。

2-1、视频环境信息

如今,仍没有标准的软件机制能确定它在何种超级VGA硬件上运行。只有通过OEM的产品特性才能知道该显卡的存在。这通常通过读取和测试每个OEM厂商特有的I/O端口来完成。如果不知道所处的硬件,很少的(如果有的话)底层硬件特性能够被使用到。

VESA BIOS扩展提供了一些函数来返回视频环境的信息。这些函数返回诸如显示方式的详细资料等等的系统信息。函数00h返回普通系统级信息,包括一个OEM识别串。函数同时返回所支持的显示方式的指针。函数01h能用来获取每一种支持的显示方式的详细信息。函数03h返回当前的显示方式。

2-2、编程支持

由于不同的超级VGA产品有不同的硬件结构,软件很难去适应每一种环境。但是,既然它们都是基于VGA硬件结构的,区别则主要在于显示方式的初始化和内存映射。结构的其余部分通常是不被接触的,包括I/O映射寄存器、CPU地址空间的视频缓冲定位和DAC的位置及功能等。

VESA BIOS扩展提供了一些针对不同超级VGA硬件设备的接口函数。其中最重要的是函数02h,设置超级VGA显示方式。该函数将应用程序从单调复杂的显示方式设置中解脱出来。函数05h提供了针对下层内存映射硬件的接口。函数04h能使应用程序保存和恢复超级VGA状态而不必了解任何实现细节。

2-3、兼容性

VESA BIOS扩展的一个主要设计目的是确保对于标准VGA环境的最大程度的兼容。而不可 能是BIOS妥协性能来完成兼容。另一点是对现有的VGA BIOS做最小程度的修改。如同基于ROM的设备一样,基于RAM的扩展将是可能的。

2-4、标准的情况

VESA BIOS扩展的目的是提供对扩展VGA环境的支持。因而下层的硬件设备被假定为VGA。图形软件应该向其驱动标准VGA一样来驱动超级VGA:如,直接写VGA帧缓存、操作图形控制寄存器和直接设计调色板等等。硬件无须做重要的图形处理。由于这个原因,VESA BIOS扩展不提供任何图形输出函数,如位块传送、画线和画圈等。

对VESA BIOS扩展的函数约束是由于现存BIOS设备的ROM空间十分有限。

在VESA BIOS扩展之外,还有对不同显示器的操作和定时。这些东西在其它VESA论坛中涉及。VESA BIOS扩展的目的是提供对超级VGA图形模式的标准软件接口,并不依赖显示器和显示器的定时问题。

3、标准VGA BIOS

VESA BIOS扩展的设计目标是使之对标准VGA BIOS的影响最小。标准VGA BIOS的函数应尽可能少的被修改。这是因为可能存在ROM扩展。

但是,有两个标准VGA BIOS函数受到VESA扩展的影响。它们是函数00h(设置显示方式)和函数0Fh(读取当前视频状态)。使用VESA的程序不会通过VGA BIOS函数00h来设置显示方式,同样也不会使用函数0Fh。而是使用VESA函数02h(设置超级VGA模式)和03h(获得超级VGA模式)。

为了使程序工作,VESA推荐将VESA BIOS扩展的函数0Fh的返回值(由OEM决定)用VGA BIOS函数00h来重新初始化显示方式。这样,BIOS将有效地记录下最近的超级VGA模式。

推荐(但并非命令)在超级VGA模式中支持输出函数(如TTY-输出、卷屏、画点等等)。如果BIOS扩展不支持这些函数,模式属性域(由VESA BIOS函数01h返回)的D2位(输出函数支持)将被清除。

4、超级VGA模式号

标准VGA模式号有7位,目前范围从00h到13h。OEM可以在14h-7Fh范围内定义扩展显示模式。80h-FFh范围不能使用,因为VGA BIOS函数00h(设置显示方式)将第七位作为判断是否清除显存的标志。

由于模式号7位的限制,VESA显示模式号有15位宽。其数值通过BX寄存器传送到VESA BIOS函数02h(设置超级VGA模式)来初始化超级VGA模式。

VESA模式号的格式如下:

D0-D8 模式号

如果D8为0 不是VESA定义的模式

如果D8为1 这是VESA定义的模式

D9-D14 VESA为今后的扩展而保留(为0)

D15 保留(为0)

因此,VESA模式号从100h开始。这种编号方式实现地将标准VGA模式号和OEM模式号做为VESA模式号的一部分。这意味着普通的VGA显示模式也能被VESA BIOS函数02h定义,即将模式号置入BL,而将高位的BH清除。OEM定义模式也可同样地初始化。

例外,VESA定义了7位的模式号,6Ah,来表示800x600,16色,4平面的显示模式。相应的15位模式号为102h。

以下是已经定义了的VESA模式号:

图象 文本

15位模式号 7位模式号 分辨率 色彩 15位模式号 7位模式号 列数 行数

------------------------------------------------------------------------------------------

100h --- 640x400 256 108h --- 80 60

101h --- 640x480 256

109h --- 132 25

102h 6Ah 800x600 16 10Ah --- 132 43

103h --- 800x600 256 10Bh --- 132 50

10Ch --- 132 60

104h --- 1024x768 16

105h --- 1024x768 256

106h --- 1280x1024 16

107h --- 1280x1024 256

10Dh --- 320x200 32K 1:5:5:5

10Eh --- 320x200 64k 6:5:5

10Fh --- 320x200 16.8M 8:8:8

110h --- 640x480 32K 1:5:5:5

111h --- 640x480 64K 6:5:5

112h --- 640x480 16.5M 8:8:8

113h --- 800x600 32K 1:5:5:5

114h --- 800x600 64K 6:5:5

115h --- 800x600 16.5M 8:8:8

116h --- 1024x768 32K 1:5:5:5

117h --- 1024x768 64K 6:5:5

118h --- 1024x768 16.5M 8:8:8

119h --- 1280x1024 32K 1:5:5:5

11Ah --- 1280x1024 64K 6:5:5

11Bh --- 1280x1024 16.5M 8:8:8

11Ch --- 1600x1200 256

11Dh --- 1600x1200 32K 未检验

11Eh --- 1600x1200 64K 未检验


[此贴子已经被作者于2003-8-20 12:27:56编辑过]






MSN:tiqit2@hotmail.com
2003-8-20 00:00
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
Dark-Destroy
元老会员





积分 8312
发帖 3551
注册 2003-3-22
状态 离线
『第 2 楼』:  

5、CPU显存窗口

标准的VGA系统提供256K字节内存和相应的寻址方式。超级VGA及其显示模式需要多于标准的256K的内存,但由于兼容性问题,该内存地址空间必须被限制为标准地址空间。CPU显存窗口提供了通过标准CPU地址空间来访问扩展VGA内存的方法。

本章讲述了几种硬件实现CPU显存窗口的过程,它们对软件设计的影响,并联系VESA VGA BIOS扩展举例。

VESA CPU显存窗口将不追求形式的、非标准的硬件函数放入BIOS,而将要求形式的、标准的硬件函数放入程序。这就提供了VGA系统直接访问硬件所带来的轻便和高效性。比如,VESA BIOS负责将显存映射为CPU地址空间,而程序则负责实际内存的读写操作。

这一软硬件组合的接口是通过将参数通知程序来控制硬件机构将显存映射为CPU地址空间并通过这些参数来让程序控制映射的过程来完成的。

5-1、硬件设计的考虑

5-1-1、受限于CPU 64K/128K的地址空间

为了实现显存的扩展,首先想到的是将访问权交给应用程序。

典型的标准16色VGA图形模式的CPU地址空间是从段A000h开始的64K。如果每平面是64K的话,就能访问256K的标准VGA空间了。对扩展显存的访问通过将显存的一部分映射为标准VGA CPU地址空间来完成。

每一个超级VGA硬件设备都能让程序指定从显存的哪里开始将显存映射为CPU地址空间。并提供对映射内存的读写能力,从而也使程序获得了在硬件级操纵显存的能力。

5-1-2、跨越CPU显存窗口界限

大多数的对视频进行操作的程序的算法中都有一对嵌套循环:外循环沿着行或扫描线而内循环垂直于行或扫描线。这个内循环正是公认的程序性能的瓶颈。

如果有一个很大的矩形,其位置又很糟糕,所需内存的一部分可能被显存映射到CPU地址空间,而另一部分则可能必须改变映射方式才能由CPU访问到。最好是将显存的重映射放在内循环的外面。

典型的做法是选择显存的某一偏移地址进行映射作为CPU地址空间的开始,这样就能确定至少有一个完整的行或扫描线能在不重新映射的情况下被CPU访问。现在没有哪个超级VGA能够允许由8位边界来指定偏移量,而且各种超级VGA之间将所要的显存作为CPU地址空间的开始的能力也相去甚远。

显存中能被定位在任何CPU地址空间的最近的两个字节之间的字节数被定义为窗口函数的间隔尺寸。一些超级VGA系统能允许任意的4K显存区域映射到CPU地址空间的开始,而另一些超级VGA系统能允许任意的64K显存区域映射到CPU地址空间的开始。这是两个间隔尺寸为4K和6K的例子。这个概念很类似与INTEL 16位CPU访问字节时首先要将段寄存器改变(这里段寄存器或称映射的间隔尺度是16位的)。

注释:

如果间隔尺度同CPU地址空间相同,比如说显存映射函数的最小位数大于CPU地址空间的最大位数,那么内循环将不得不包含一个是否越出CPU地址空间的测试。这是因为如果CPU地址空间(这里即是间隔尺寸)的大小不能被扫描线长度所整除,那么地址空间中最后的扫描线将处于不同的显存而不能同时被映射到CPU地址空间。

5-1-3、处理来自不同区域的数据

有时候,将来自显存两个区域的内容移动或合并是很有必要也是很方便的。举例来说,可以在显存中跨过以显示的内存来存储菜单,因为所有的VGA都有硬件支持通过8位的CPU读写来传送32位的视频数据。如果原始资料位置和目标位置之间的距离大于CPU显存窗口的大小,则必须开设两个独立的可映射的CPU显存窗口。

5-1-4、将来自不同窗口的数据结合

上面的将一个CPU显存窗口的数据移到另一个CPU显存窗口的例子只需要对一个CPU显存窗口进行读操作,而对另一个进行写操作。有时候需要对两个窗口读操作,而对一个窗口进行写操作。比如说,光栅操作将数据和原始资料逻辑合并作为结果输出。

5-2、硬件窗口的不同类型

不同的CPU显存窗口的硬件实现都能被VESA BIOS扩展所支持。程序了解硬件类型所需的信息由BIOS提供。有三种基本的硬件窗口的实现,下面详细讨论。

下面涉及的窗口方案并不包括间隔尺寸的不同。

同时请记住VGA能使用的CPU地址空间是从A000h开始的128K字节。

5-2-1、单窗口系统

一些硬件设备只提供一个窗口。该窗口能被读出也能被写入。但是如果要在显存中大于CPU地址空间的距离间移动数据将造成性能的严重降低。

5-2-2、双重窗口系统

许多超级VGA提供双窗口以便在显存内移动数据。有两钟不同的方法提供双窗口。

5-2-2-1、重叠窗口

一些硬件设备通过判别CPU对内存进行读或写操作来区分窗口A和窗口B。当两个窗口由CPU打算进行的读或写操作区分时,它们通常共享CPU地址空间。但一个窗口为只读,而另一个窗口为只写。

5-2-2-2、非重叠窗口

双窗口系统区分窗口A和窗口B的另一个方法是通过查看CPU地址在总的VGA CPU地址空间中的位置。两者不能共享CPU地址空间,但却都可以进行读写操作。



MSN:tiqit2@hotmail.com
2003-8-20 00:00
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
Dark-Destroy
元老会员





积分 8312
发帖 3551
注册 2003-3-22
状态 离线
『第 3 楼』:  

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信息

ESI = 缓冲区指针

输出: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返回值之一)

ESI = 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。



MSN:tiqit2@hotmail.com
2003-8-20 00:00
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
Dark-Destroy
元老会员





积分 8312
发帖 3551
注册 2003-3-22
状态 离线
『第 4 楼』:  

6-6、04h-保存/恢复超级VGA状态

该函数提供了保存和恢复超级VGA显示状态的机制。该函数是标准VGA BIOS函数1Ch(保存/恢复显示状态)的三个子函数的超集。完整的超级VGA状态(除了显存)可通过设置请求状态遮盖(于CX寄存器)为000Fh来保存和恢复。

输入:AH = 4Fh 超级VGA支持

AL = 04h 保存/恢复超级VGA显示状态

DL = 00h 返回保存/恢复状态缓冲区大小

CX = 请求状态

D0 = 保存/恢复显示硬件状态

D1 = 保存/恢复显示BIOS数据状态

D2 = 保存/恢复显示DAC状态

D3 = 保存/恢复超级VGA状态

输出:AX = 状态

BX = 状态缓冲区内64字节块的块数

(其它寄存器保持不变)

输入:AH = 4Fh 超级VGA支持

AL = 04h 保存/恢复超级VGA显示状态

DL = 01h 保存超级VGA状态

CX = 请求状态(同上)

ES:BX = 缓冲区指针

输出:AX = 状态

(其它寄存器保持不变)

输入:AH = 4Fh 超级VGA支持

AL = 04h 保存/恢复超级VGA显示状态

DL = 02h 恢复超级VGA状态

CX = 请求状态(同上)

ES:BX = 缓冲区指针

输出:AX = 状态

(其它寄存器保持不变)

注意:

基于对VGA环境完全兼容的目标,标准VGA BIOS函数1Ch(保存/恢复VGA状态)没有被扩展为保存超级VGA显示状态。VGA BIOS兼容性需要函数1Ch返回一个有特定目录的特定缓冲区大小,其目录中以没有空间放下超级VGA状态了。

6-7、05h-超级VGA视频存储器窗口控制(设置BANK)

该函数设置或获得指定窗口在显存中的位置。函数允许对硬件页寄存器的直接访问。为了更好地使用此函数,程序应使用VESA BIOS函数01h(返回超级VGA模式信息)来决定窗口的大小、位置和间隔尺寸。

输入:AH = 4Fh 超级VGA支持

AL = 05h 超级VGA显存窗口控制

BH = 00h 选择超级VGA显存窗口

BL = 窗口号

0 = 窗口A

1 = 窗口B

DX = 窗口在显存中的位置(以窗口间隔尺寸为单位)

输出:AX = 状态

(见下面注释)

输入:AH = 4Fh 超级VGA支持

AL = 05h 超级VGA显存窗口控制

BH = 01h 返回超级VGA显存窗口

BL = 窗口号

0 = 窗口A

1 = 窗口B

输出:AX = 状态

DX = 窗口在显存中的位置(以窗口间隔尺寸为单位)

(见如下注释)

注释:

该函数也能通过远程调用由程序直接访问。BIOS函数地址能通过VESA BIOS函数01h(返回超级VGA信息)获得。模式信息块中包含有此函数地址。注意在每一次BIOS执行时函数地址都会不同,所以应在每次设置模式后获取函数指针。

如果是远程调用的话,没有状态信息会被返回给程序。同时,AX和DX寄存器将遭破坏。因此,若AX、DX寄存器值需保留,应在远程调用前事先作准备。

若要作远程调用,程序必须在BH、BL和DX(对于设置窗口)中装入参数,但不必装入AH和AL。

6-8、06h-设置/获取逻辑扫描线长度

该函数设置或获得逻辑扫描线长度。函数允许程序建立大于显示区域的逻辑显存缓冲区。然后函数07h就能允许程序设置开始显示的位置。

输入:AH = 4Fh 超级VGA支持

AL = 06h 逻辑扫描线长度

BL = 00h 选择扫描线长度

CX = 想要的宽度(用像素表示)

输出:AX = 状态

BX = 每扫描线字节数

CX = 每扫描线实际像素

DX = 最大扫描线数

输入:AH = 4Fh 超级VGA支持

AL = 06h 逻辑扫描线长度

BL = 01h 返回扫描线长度

输出:AX = 状态

BX = 每扫描线字节数

CX = 每扫描线实际像素

DX = 最大扫描线数

注意:

所需要的按像素表示的宽度可能因为VGA硬件情况的原因而不能实现。下一个提供所需像素数的更大的值将被选中,而实际的像素数被返回到CX。当加到显存中的指针时,BX返回指向下一条扫描线的指针值。比如:在模式13,此值为320,但在模式12为80。DX返回基于新扫描线长度和装载的并在该模式下可用的总内存之上的逻辑扫描线数。此函数在文本方式下仍有效。在文本模式下,程序应通过BIOS函数找到当前字符单元宽度,并乘以每行想要的字符数,将结果送至CX寄存器。

6-9、07h-设置/获取显示起点

该函数从逻辑页中选出将在左上角显示的像素点。该函数能用来平移或卷动比显示屏幕更大的逻辑屏幕。它也能在两个不同的显示屏幕间快速切换从而获得双缓冲的动画效果。

输入:AH = 4Fh 超级VGA支持

AL = 07h 显示起点控制

BH = 00h 保留,必须为0

BL = 00h 选择显示起点

CX = 扫描线中第一像素点

DX = 第一根扫描线

输出:AX = 状态

输入:AH = 4Fh 超级VGA支持

AL = 07h 显示起点控制

BL = 01h 返回显示起点

输出:AX = 状态

BH = 00h 保留为0

CX = 扫描线中第一像素点

DX = 第一根扫描线

注意:

此函数在文本模式下仍有效。在文本模式中,程序可以通过BIOS函数获得当前字符单元宽度,再乘以希望开始的字符列数,并将此值送至CX寄存器。同样地,将字符高度乘以所需行数并送至DX寄存器。

6-10、08h-设置/获取DAC调色板控制

该函数查询并选择DAC调色板的操作模式。一些DAC提供可选择的6-位、8-位或是更多的RGB色彩成分定义。在标准或是VESA设置超级VGA模式(AX = 4F02h)调用时被默认地重设为每色6-位。

输入:AH = 4Fh 超级VGA支持

AL = 08h 设置/获取DAC调色板控制

BL = 00h 设置调色板宽度

BH = 所需的色彩位数(标准的VGA为6)

输出:AX = 状态

BH = 当前的色彩位数(标准的VGA为6)

输入:AH = 4Fh 超级VGA支持

AL = 08h 设置/获取DAC调色板控制

BL = 01h 获得DAC调色板宽度

输出:AX = 状态

BH = 当前的色彩位数(标准的VGA为6)

注意:

程序能通过查询由VESA返回超级VGA信息函数(AX = 4F00h)所返回的VGA信息块中兼容性字段的D0位来获知DAC是否可变换。然后程序才能尝试将DAC调色板设置为所需的宽度。如果VGA不能使用请求的调色板宽度,则会选中低一点的超级VGA能使用的值。将最终的调色板宽度返回。

7、应用举例

以下依次说明程序如何与VESA BIOS扩展接口。假设程序已了解了VESA并调用了VESA BIOS函数。但程序并不是仅仅能支持VESA定义的显示模式。所以在设置显示模式之前先要查询有那些显示模式可用。

1、程序首先分配一个256字节的缓冲区。该区域用来存放由VESA BIOS返回的视频环境信息。一些程序需要静态分配空间,而另一些则可通过系统调用动态地获得临时缓冲。

2、程序然后调用VESA BIOS函数00h(返回超级VGA信息)。如果函数调用返回后AX寄存器的值不是004Fh,则程序可确定VESA BIOS不存在。若AX中没有任何错误码,则函数调用成功。缓冲区以被VESA BIOS扩展填满了各种各样的信息。程序能通过判断信息块首部的字符是否为‘VESA’来确定这是否为有效的VESA信息块。程序还可侦测VESA版本字段来了解VESA BIOS扩展是否有足够的函数。程序也可通过OEM串来定位OEM特定信息。

最后,程序能用显示模式指针来获得超级VGA所支持的显示模式列表。

3、然后程序创建一个新的缓冲区并调用VESA BIOS函数01h(返回超级VGA模式信息)来获得所支持的显示模式的详细信息。利用第二步获得的显示模式指针,程序以新的模式号为参数调用此函数,直到找到一个合适的显示模式。如果没有合适的,则程序有权放弃。返回超级VGA模式信息的函数将一个程序指定的缓冲区填充为描述显示模式细节的信息。数据块包含了程序所能利用的显示模式的所有优点。程序应检查模式属性字段,来确定模式是否被支持。即检查D0位,如果D0位被清除,那么模式并不被硬件所支持。这种情况在需要一种特殊的显示器或是显示器不在的情况下可能发生。

4、程序选中一个显示模式后,下一步就是初始化。但是程序首先要保存现有的显示模式。只要程序还在,该模式就能被恢复。为获得现有的显示模式,可以使用VESA BIOS函数03h(获得超级VGA模式)。如果当前模式并非VESA(标准VGA或OEM指定),则填充模式号的低字节而保留高字节。

5、要初始化显示模式,程序要使用VESA BIOS函数02h(设置超级VGA显示模式)。从此程序就能完全访问VGA硬件和显存了。

6、当程序要结束的时候,应恢复先前的显示状态。即利用第四步获得的先前的模式号,按第五步的方法设置显示模式。然后退出程序。



MSN:tiqit2@hotmail.com
2003-8-20 00:00
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
070
高级用户

苏醒的沉睡者


积分 659
发帖 217
注册 2003-2-15
来自 福建
状态 离线
『第 5 楼』:  

谢谢啦



好久没碰Dos,手都生了,赶紧回来练练.嘿嘿
2003-8-23 00:00
查看资料  发送邮件  发短消息 网志  OICQ (181315400)  编辑帖子  回复  引用回复
笑傲江湖
初级用户

鹰击长空


积分 271
发帖 61
注册 2003-8-20
状态 离线
『第 6 楼』:  

先谢过!



适合的,就是最好的!
DOS,永远的初恋情人。
2003-9-11 00:00
查看资料  发送邮件  访问主页  发短消息 网志   编辑帖子  回复  引用回复
凌晨一点
初级用户




积分 255
发帖 54
注册 2003-10-24
状态 离线
『第 7 楼』:  

辛苦了
谢谢啊^_^

2003-10-24 00:00
查看资料  发送邮件  发短消息 网志  OICQ (285749694)  编辑帖子  回复  引用回复
haoboss
初级用户




积分 108
发帖 2
注册 2003-8-12
状态 离线
『第 8 楼』:  

狂顶·!!~~~~~

2003-10-27 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
冷石_jasv
初级用户




积分 182
发帖 27
注册 2003-11-12
状态 离线
『第 9 楼』:  



[此贴子已经被作者于2003-12-9 9:31:29编辑过]




2003-11-12 00:00
查看资料  发送邮件  发短消息 网志  OICQ (21873670)  编辑帖子  回复  引用回复
wangzai
初级用户




积分 125
发帖 9
注册 2003-12-10
状态 离线
『第 10 楼』:  

一个字:



QQ:13688252
DOS 是我的初恋,ASM 是我的母语
2003-12-11 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxdddxl
初级用户




积分 122
发帖 6
注册 2003-2-3
状态 离线
『第 11 楼』:  

VESA的模式代码不是固定的,比如说114h在这种显卡的VESABIOS里是800*600*64K,在另一种显卡可能就是1024*768*256,所以设置模式不是这么简单.

2003-12-11 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
folly
初级用户




积分 110
发帖 4
注册 2003-12-9
状态 离线
『第 12 楼』:  

不懂那!!!!!!!!!!!!!!!!!你白痴!!!!!!!!!!!!!!

2003-12-12 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lxfeng
初级用户




积分 106
发帖 3
注册 2003-12-22
状态 离线
『第 13 楼』:  

very very good!!!
问一下,那找到的?


2003-12-22 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
恒月美剑
初级用户




积分 123
发帖 5
注册 2003-12-30
状态 离线
『第 14 楼』:  

强!!!



2003-12-31 00:00
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (248277014)  编辑帖子  回复  引用回复
x_nh
初级用户




积分 113
发帖 5
注册 2004-1-6
状态 离线
『第 15 楼』:  

好,够爽快

2004-1-7 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: