SVGA编程VESAVBE规范副本讲解Word格式.docx
《SVGA编程VESAVBE规范副本讲解Word格式.docx》由会员分享,可在线阅读,更多相关《SVGA编程VESAVBE规范副本讲解Word格式.docx(68页珍藏版)》请在冰点文库上搜索。
![SVGA编程VESAVBE规范副本讲解Word格式.docx](https://file1.bingdoc.com/fileroot1/2023-4/29/2b41aac3-20b3-413f-9ac8-888aa40347f3/2b41aac3-20b3-413f-9ac8-888aa40347f31.gif)
中华人民共和国五十七年五月
公立安徽交通技术学校专业组
(文档中经由译者原创的图片、代码可以在未经任何授权的情况下使用)
VESA
VideoElectronicsStandardsAssociation
视频电子标准化协会
VESABIOSEXTENSION(VBE)
CoreFunctions
Standard
Version:
3.0
Date:
September16,1998
宗旨
目的在于为显示、音频设备建立一个通用的软件接口。
VBE接口致力于简化和鼓励应用程序在硬件无关性的情况下对高性能的图形、视频、音频设备进行内核操作。
概述
VBE标准定义了一套VGAROMBIOS扩展服务。
这些功能,在DOS下,可通过10h中断调用得以实现,其它的高性能32位OS及应用程序亦可直接调用。
知识产权
Copyright(C)1993-1998-VideoElectronicsStandardsAssociation.
Allrightsreserved
在准备发布此标准时,VESA对本文档中可能存在的错误进行了严密的审查。
视频电子标准化协会及其撰稿人假定:
不对标准中的错误和遗漏负有责任,不对此标准的功能性和适用性做任何明显或暗指的保证。
商标
(文档中商标的所有权归其各自的所有者所有。
)
介绍
本文描述了应用程序设置图形显示控制器以控制诸如非VGA标准规定的分辨率、色深、显存组织形式的技术细节,并为用户开发应用程序及系统软件提供参考。
同时,它还介绍了一个用于设置显示器高刷新率的扩展接口。
系统软件开发人员可以参考本文档以便向应用程序提供VBE服务,应用程序编制者亦可基于此文对VBE兼容设备编程,并获得良好的兼容性。
对于程序编制者而言,汇编语言及VGA编程经验是完全理解VBE规范的前提。
尽管汇编语言是VGA编程的首选,然,某些具有软件中断调用机制的高级语言仍然可以使用规范中所描述的VBE服务对特定的VGA寄存器进行置位/复位。
文档里出现的VBE、VBE3.0、VBECoreFunctionsversion3.0在无特殊说明的情况下,三者同义。
VBE标准的应用范围
VESAVBE的主要用意在于为众多的拥有各自执行标准的SuperVGA(SVGA)产品提供一个通用的行业标准(在最初的VGA标准基础之上),从而应用程序开发者可切实可行地对各种兼容设备进行编程。
显示设备的升级,对软件而言就会出现硬件兼容性问题。
如此,在不丢失软件兼容性的情况下,VBE规范提供了一个扩展的软件基础。
随着时间的流逝,SVGA执行标准即可得到规范,从而,新软件可在老的显示设备上正常运行,反之亦然。
针对诸如显示器分辨率、色深的调节,VBE服务提供了标准的显示控制器访问规则,在需要的时候,应用程序还可通过VBE服务获得硬件的各种配置的有效性和详细资料。
虽然之前的VBE标准将显卡默认为VGA卡,但VBE3.0可在不做任何假定的情况下工作于任何显存组织模型。
大多数VBE服务通过允许应用程序在运行时可直接配置硬件,使得硬件的安装和配置得以简化。
为了更进一步地改进处于高分辨率状态下的显示设备的性能,VBE3.0提供了一种新的有别于传统显存框架(使用"
banking"
机制)的内存模型。
VBE期望运行于所有80x86平台,无论是实地址模式还是保护虚地址模式。
从VBE3.0开始,所有VBE/CoreBIOS函数/功能均支持"
双重模式"
,并且允许它不受限制地以16位保护模式代码的形式被调用到一个新的保护模式接口入口。
“双重模式”代码意味着,当它经由保护模式入口点调用并用以确保完全兼容于保护模式操作系统(诸如,WindowsNT,OS/2,UNIX)时,BIOS代码拥护确实的限制。
尽管“双重模式”代码必须以16位保护模式代码的形式被调用,但这不能防止它直接被纯32位的操作系统调用。
系统中可能存在两个或两以上的显示控制器(译注:
显卡和声卡类似,包括两个模块:
数据"
加工"
-控制器、数模转换-DAC),一个用于兼容VGA(动宾结构),另一个用作扩展自基本VGA模式、分辨率、显存组织模式的显卡。
INT10h软件接口不可能支持多个控制器,所以只有主控制器才能将其BIOS映射到C000h(译注:
显卡BIOS基址,什么意思呢?
一般来说,板子上的集成显卡和独立显卡只有一个起作用,另一个必须禁掉)。
若系统中存在多个控制器,则另一个可以经由VBE/AFAcceleratorFunctions(加速功能)得以控制。
VBE/Core规范不包括对硬件加速功能(原始2D/3D图形、视频加速)的描述,如果你有意使用这些特征,请查阅VBE/AFAcceleratorFunctionsspecification。
请联系VESA以获得更多信息。
背景
IBMVGA已经成为PC图形世界的事实标准。
为数众多存在于交易市场中的各种显卡,其寄存器、BIOS均兼容于IBMVGA。
值得一提的是(译注:
这是很久以前的事情啦),具备更高性能的兼容显卡象雨后春笋一样涌现出来,并充斥着市场。
这些改进的性能包括:
高分辨率、更多的颜色,有的甚至加入了图形处理功能(文中广泛提到的controller实际指的就是显示控制器)。
激烈的市场竞争戏剧性地改善了显卡产品的性价比,结果最终用户获得了最大的利益。
然而,试图利用这些“SuperVGA”新功能的软件开发人员必须直面一些新出现的令人感到棘手的问题:
因为没有一个统一的硬件执行标准,开发人员面对的就是一些截然不同的SuperVGA硬件体系结构。
由于缺少一个通用的软件接口,在这些SVGA环境下开发应用程序是昂贵的,技术上也遇到了困难。
除了那些受到OEM特定驱动程序支持的应用程序以外,很少有软件包能够利用SuperVGA产品的新功能。
VBE标准最初的设想就是帮助应用程序,使之能够利用那些高于VGA标准的显示分辨率和色深。
和软件对行业标准存在着渴望一样,那些怂恿用户使用和接受他们快速推进的产品系列的图形硬件开发商们也存在着与之类似的共识。
变的由为突出的是,由于存在着上百种板子,以至于大多数软件开发人员无法拥有足够的手段去开发和支持客户设备级软件。
因此,除了相对狭小的CAD市场之外,这些丰富的新特性(SVGA)没有得到利用。
确实如此,此时对SVGA显示标准的需求,就象中国武林中的葵花宝典,如此VESA出面了,并成功地平息这场武林浩劫,最初的VBE标准便由此而横空出世。
这个标准得到了几个带头大哥(活跃的显示控制器制造商)的支持,后来还被DOS应用程序员收养了用以支持非扩展的VGA显示模式。
(翻译什么什规范真是一个苦差事,行文太正式了。
所以我在这段加了一点水,呵呵)
时间在流淌,VBE1.1加入了更多的视频模式,增加了逻辑线长度/双缓冲区;
VBE1.2加入了highcolorRAMDAC。
在VBE1.2发布后的三年里,我们看到我们的这个标准得到了广泛的认可,并且许多做得很成功的程序也在信奉VBE。
诚然,对已经存在的标准的健壮性和可扩展性的需求变得由为突出。
早期的对VGA的扩展仍然使用原始的VGAI/O端口以及与控制器硬件通讯的帧缓冲区。
正如我们看到的,支持的分辨率和色深正在增加,具备BITBLT功能的智能控制器及直线绘制函数已经很普通,并且新的flatframebuffermemorymodels已经出现。
VBE2.0和后继的扩展规范将支持非VGA架构(具备新的读写调色板功能有能力使用flatframebuffermemorymodels)的控制器。
译注:
BITBLT
[朗文英汉综合电脑词典]
=bitblocktransfer,位块传送,位图数据块的传送
VBE3.0的用意用在于提供先前规范中所或缺的健壮性、可扩展性,同时不丧失对长辈的兼容性。
VBE概述
SVGA设备图形控制器应用程序接口
保护模式接口
刷新率设置
液晶虑镜
识别产品及制造商标识
子功能14hOEM扩展
补充规范
支持VBE的设备
现行PC平台的显卡,Hercules(大力神)、MDA、CGA、EGA,除外均适用于VBE标准。
获得供应商信息
VGA规范并没有提供一个用于检测显示设备类型的机制,对于软件而言,将无法利用那些新功能。
VESA扩展BIOS摧毁了这个缺陷,它提供了若干个子功能用于检测硬件并可返回当前显示环境的系统级信息以及图形模式的细节资料。
譬如:
00h返回包括OEM标识串等的一般系统级信息,还可返回一个指向显卡支持的VBE、OEMmodes的远指针。
01h可帮助应用程序获得一些关于被支持的视频模式的附加信息
03h返回当前VBE模式
VBE/Core编程
本节介绍VBE3.0提供的应用于应用程序和系统编程的高级功能。
访问线性帧缓冲区内存
(有时,翻译时用词不一致,这无关紧要;
在可能出现误译时,译者将适时以原文拿出。
一旦,成功初始化显示设备为(声调:
阳平)某种支持线性帧缓冲区的模式后,那么你就有必要创建一个指针,该指针用于协助应用程序读写线性帧缓冲区内存。
现在你必须有一个明确的认识:
这个所谓的线性帧缓冲区,它是个什么东西,它的位置在哪?
不过,“ModeInfoBlock”知道,你去问他好了。
有人又问,他又是个什么东西。
我的回答照旧,我也不知道,那你只好先把他记住吧,等用到他的时候,再去找他吧。
再罗嗦一句:
就目前实现方式而言,VBE主要用于传统DOS下的游戏和工控。
对于Win32平台你完全可以依靠DirectX或OpenGL,它们是GDI与USER的中间体,就是一个函数库吧。
(它们是如何实现的,我也无从得知,先把这个弄懂再说吧。
好了,我们回到正文。
第一个要弄懂的就是,ModeInfoBlock报告了当前模式所使用的物理内存,然,保护模式下的应用程序无法直接使用之。
在你获得足够的操作权限之前,你必须通过调用操作系统服务将这段物理地址空间映射到你的应用程序的线性地址空间内。
用户可以使用DPMI(DOS保护模式接口)0x800子功能来完成映射工作。
其它操作系统下,可由其它的类似功能完成。
译注(我又多嘴了):
VGA彩色模式下
CRT控制器:
名称端口
索引寄存器3D4h
数据寄存器3D5h
CRT控制器有26个寄存器,必须经索引后,才能通过3D5端口读写。
你可以自行查找相关资料
使用VBE/DDC获取监视器的工作极限
VBE/DDC接口可被用于测试并获得监视器支持的最小/最大场频、行频等信息。
如果监视器和图形卡均支持DDC功能,则这些信息即可获得并可用于限制刷新率计算例程以确保CRTCvalues不会超过监视器的工作极限。
请查阅VBE/DDCandEDID规范以获得更多关于监视器工作极限的信息。
使用VM/GTF计算CRTCvalues
VESAVM(监视器委员会)的GTF(GeneralizedTimingFormula)定义了一套计算公式,只需提供分辨率和场频、行频、pixelclock(只要求提供三者其中一个),GTF即可生成CRTCtimings。
欲知详情,请查阅GTF规范以获得该公式和样本代码(用于计算GTFcompliantCRTCvalues)。
计算normalizedpixelclock
一旦你成功生成了一组CRTCtimings,注意,pixelclock是不能随意改动的任意值。
在获得了normalizedpixelclock之后,你有必要调用function4F0Bh,目的在于得到硬件可编程的theclosestpixelclock的准确值。
调用功能0F0Bh时,你必须提交视频模式的值(与pixelclock匹配)。
注:
GTF之技术细节,须经由付费才能获得,而且十分昂贵,三百多美金呢,太可惜,没意思!
请知情者将其发至:
ys82338@或OICQ:
88413048,谢谢!
Settingdoublescanmodes
如果硬件支持双重扫描(垂直方向每行扫描两次),则可被支持的视频模式诸如:
320x200,320x240及400x300等。
若硬件不支持双扫描,则不能执行此项工作。
当应用程序试图设置刷新率时(在这些模式下),则必须事先设置doublescanbit。
当设置成双重扫描模式,则实际CRTCparameters应该是实际水平扫描线数的两倍,因此,当实际处于200线模式时,其垂直CRTC参数和pixelclock应为400线模式的值(在双重扫描模式下,200线实际要刷400次,所以刷屏所用的时间与400线模式相等),同时设置doublescanbit以切换到200line可寻址方式模式。
另外,若你使用的是双重扫描模式,则不能执行隔行操作。
重要译注:
为了在高分辨率VGA监视器(400扫描线)上显示CGA低分辨率模式下的图形(200线),VGA显示适配器使用了一种叫双重扫描的技术。
200个水平扫描线中的每一条被刷两次,以把垂直分辨率从200条扫描线在逻辑上增加到400条,这改善了显示的质量,并起到了补偿VGA显示器的宽高比差异的作用。
显示器包括:
监视器和显示适配器(俗称显卡)
SettingInterlacedModes(隔行扫描)
首先置位ModeInfoblock的ModeAttributesfield(模式属性字段)的bitD9,完了再置位CRTCInfoBlock的Flagsfield的bitD1,至此,即可进行隔行操作。
隔行模式的CRTCtimings应于non-interlacedmode(逐行模式)保持一致。
由于一些新硬件不一定支持隔行扫描,所以在试图初始化隔行扫描模式之前,必须检测ModeInfoBlockattributesfield以确定隔行扫描是否被支持。
一般来说,隔行扫描只适应于高分辨率(640×
480或更高),大多数硬件在低分辨率下启动隔行扫描会遇到麻烦。
与隔行扫描(先刷奇数行扫描线,再刷偶数行扫描线,即在垂直方向分两次刷屏)相对应的是逐行扫描(垂直方向从上而下依次产生水平扫描线。
理论上,逐行扫描的显示效果较隔行扫描要好)。
DevelopingforMaximumCompatibility
本节描述在不丢失性能、特性的情况下,促使应用程序获得最大的兼容性的技术细节。
虽然VBE标准规定了规范如何工作,但仍有许多不同品味的硬件不在范围之内。
所以对于你的软件来说,能够工作在不同的硬件之上显得非常之重要。
许多开发人员在尝试开发图形代码时往往会制造一个错误:
总是不加思索地认为他的图形卡就是规范的标本。
虽然VBE接口对不同的图形卡一视同仁,但是每个硬件所报告的性能和属性并不完全相同,所以本节有必要强调这个最为普遍的错误。
BepreparedfordifferentWindowGranularity’s
关键字:
bank(参考翻译:
页面)banking(参考翻译:
分页)
bank[朗文英汉综合电脑词典]
(数据)库,集;
簇;
排、列、组、堆、区;
存储体;
银行
Granularity(参考翻译:
间隔尺寸/粒度)
[简明英汉词典]
n.间隔尺寸,粒度
granularity[朗文英汉综合电脑词典]
(颗)粒性;
【微软】间隔尺寸
许多控制器简单地提供了一个64KB的间隔尺寸,即bank0从0起始,bank1从64KB起始,bank2从128KB起始,等等。
有些控制器也提供4KB或16KB间隔尺寸。
window(参考翻译:
窗口)windowing(窗口切换)
Bepreparedforbothsingleanddualread/writeWindows
必须得到足够关注的是:
不同的控制器的,窗口的样式有所不同:
singleread/writewindow(单一读/写窗口)
separatereadandwritewindow (分立的读、写窗口)
scenario
游戏的关,或是某一特定情节
scenario[朗文英汉综合电脑词典]
校本;
方案;
情况;
概要;
脚本
scenario[英汉广播大词典]
n.电影剧本,电影文学剧本
scenario[英汉计算机大词典]
n.剧情(情况)
对于singleread/writewindow(单一读/写窗口)控制器(最普遍的方案),设置了第一个窗口即意味着同时改变了读写操作的位置。
而对于dualread/writewindow’s则可分别改变这两个分立的读/写窗口在framebuffer(帧缓冲区)中的读写操作位置。
为了获得高大的性能,你应该核对你当前所编程的图形模式的modeInfoBlock属性。
如果提供了separateread/writewindows,你必须确保通过两次调用bankswitchfunction以使两个windows被定位于同一位置。
Bepreparedtosupportboth15and16bitsperpixelhighcolormodes
(增强15、16位色模式)
许多游戏和应用程序都支持15位和16位每像素的高彩模式。
如果你打算支持这些模式,请不要制造这个错误:
误以为所有设备都支持16位色高彩模式,或者是15位色。
有的仅支持15位色模式,而有的则仅支持16位色模式(之前,我也没有听说过15位色,在接手这块爷爷辈的sis-6326显卡时,才看到这个15位色模式)。
因此,应用程序必须同时支持这两种色深才能获得最大的兼容性。
Bepreparedtosupportboth24and32bitsperpixeltruecolormodes
如果你想你的代码获得24位真彩表现能力的话,那你就必须在控制器中查找真彩模式(每个像素占三个字节或32位每像素)。
通常32位彩色模式要比24位彩色模式要快,因为在该模式下,一个像素值可以双字的形式存取。
但,32位彩色模式要求至少2MB的内存。
Somecontrollerscan’tdodoublescannedmodes
如果你正在开发一个游戏或应用程序,并打算让它支持320×
200或320×
240模式(inanycolordepth),那你就要考虑到这些模式不被硬件支持的情形了。
要想在现今的硬件上初始化这些模式,则必须获得双重扫描的支持,但有些控制器并不会就此给予你以方便。
因为这些控制器从骨子里就不支持上述模式,因此你的应用程序和游戏就有必要学会处理这个遭遇。
为了代替上述不可用的模式,控制器也许会提供支持320×
400或320×
480的模式(不要求双重扫描的支持)。
解决办法:
先将你的画面(320×
240)写到一个系统内存缓冲区,然后将你的画面在垂直方向上扩展至原来的2倍(就是用软件方法将每一条扫描线转录成两个)。
结果,看起来就和320×
240模式一样了,同时你的软件仅丢失了一点点的性能(反而比直接绘制一个320×
400或320×
480的屏幕还要快)。
CheckifVGACompatibleBeforeTouchingAnyVGARegisters
许多开发人员发现:
向性能的极限进攻是一个不可抗拒的想法,同时他们会不择手段达到目的。
经由魔术般地使用某些标准的VGA寄存器可以完成一些不可思议、另人惊奇的壮举。
这是可以办到的,而且可以完美地工作在VGA兼容图形卡之上,但并不是所有的显示卡都认同你的做法。
如果图形控制器不是基于标准图形硬件技术(特殊用途、一些最新的),加上在SuperVGA图形模式下,这些VGA寄存器也许就不复存在了,此时,如果试图“同步”这些寄存器,则必将颠覆你的代码进入一个死循环。
所以有必要在此预先警告,任何乱动标准VGA寄存器的操作(名词)就是自寻麻烦(譬如在某些使用非VGA控制器的图形卡编程SuperVGA图形模式)。
然而,VBE2.0有一个解决办法:
它在VBEModeInfoBlock安置不一个存取位,该位用来指示某个图形模式是否是NonVGAmodeorVGAcompatiblemode。
如果该位指明当前被编程成目标图形模式的是一个NonVGAcontroller,那你就不要随意设定某个特定的标准VGA寄存器。
在这些情况下,你最好撤退到genericcode的怀抱,让它们经由VBE2.0及其所属的服务来完成那些