您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 经营企划 > DOS下的SVGA编程
DOS下的SVGA编程发布时间:2008-07-1722:42:14技术类别:工业控制DOS下的SVGA编程第一章SVGA显示卡和VBE标准视频图形阵列适配器(vidiographicsarray,VGA)是IBM公司在1987年制定的显示卡标准,它提供的字符和图形两种模式,图形分辨率最大是640*480*16色或者320*200*256色,这个标准是显示卡发展的一个丰碑,改变了各厂商混战相互不兼容的局面,而且统一了软件接口标准,为程序开发提供了特别大的方便。VGA显示的调用方法放在了BIOS中,统一使用int10h功能,主要功能有设置显示模式,文本窗口上卷下卷、光标和字符串,使用调色板、位面结构、读像素和写像素等。当然,VGA逐渐不能满足需要了。在80年代末至90年代初,市场上出现了以TVGA系列、S3系列、CirrusLogic系列、ET系列等为首的一批显示卡,它们都提供了比VGA分辨率更高、颜色更丰富的显示模式,又完全兼容VGA显示卡,它们被统称为SuperVGA(超级VGA,简写为SVGA)。他们在高分辨率高颜色数的控制方面又需要制定一个新的标准。为此视频电子学标准协会VESA(VidioElectronicsStandardsAssociation)提出了一组扩展的BIOS功能调用接口——VBE(VESABIOSExtension)标准,在软件接口层次上实现了各种SVGA显示卡之间的兼容性。时至今日,或许有些显示卡已不兼容VGA标准,但是所有的显示卡厂商都无一例外地支持VBE标准。几乎所有的SuperVGA卡都提供了符合VESASVGA标准的扩展BIOS。通过一组int10h,AH=4Fh中断调用,使用VESASVGA的扩展功能而不必了解各种显示卡的硬件细节,基于该标准编写的程序就具有非常广泛的硬件兼容性。VBE标准到已经发布过3个版本。1991年10月VESA发布了VBE1.2,这个标准规定了应用程序访问高性能显示卡的简易性接口,允许应用程序查询显示卡的特性并设置成合适的模式,包括分辨率,色彩丰富的模式。VBE1.2是现代显示卡广泛采用的标准。1994年11月发布VBE2.0,它最重要的改进是增加了保护模式支持(VBE功能0Ah),提高了VBE的性能。另外,VESA组织还从VBEV2.0版标准开始增加了扩展VBE功能,包括显示器能源管理PM,显示器数据通道DDC等一些非常有用的功能。1998年9月发布VBEV3.0,主要增加了对显示卡,显示器扫描频率的控制和对平面显示器的控制。每个标准都完全向前兼容,在VESA的中文网站上可以免费下载到VBE3.0,网址。下面章节我们就开始讲SVGA640*480*256色分辨率怎样调用VBE1.2BIOS功能编程。第二章DOS内存和SVGA的位面结构虽然不同的SVGA显示卡的体系结构不同,但它们最初都是从标准VGA的结构上扩充而来的,包括五大功能模块,即显示控制器、定序器,属性控制器、图形控制器和显示存储器(VRAM)。SVGA卡640*480*256色的显示模式也和VGA卡的256色模式类似,每个像素点8位,整个VRAM地址空间按扫描行连续存放,超过64K的地址空间采用位面映射机制分块影射到主机提供的地址上。主机提供的地址空间叫做窗口,SVGA把VRAM分成小块(称为位面),每块64K,分别映射到窗口上。下面的表格就是是DOS系统中的内存安排,注意从地址A0000h(即640KB)开始是用于显示的视频缓冲区和BIOS的地址空间,这正是我们图形编程中要用到的地址。在上图中“图形模式视频缓冲区”就是主机提供的窗口,大小是64KB。下面的图表示640*480*256色显示模式的位面映射机制。有的显示模式窗口大小和位面大小不一定是64KB,有可能内存窗口小,显示存储器(VRAM)中的每一个64K位面没有放满,也就是说VRAM中有效的显示信息不是连续的。如果要确定某个显示模式具体的窗口大小、位面尺寸和个数,颜色信息等等,就要调用VBEBIOS功能4F01h。第三章调色板在SVGA640*480*256显示模式下,一个像素对应显示存储器(VRAM)中用一个字节,每个字节表示一种颜色。但它不是一个真正的颜色,而是颜色的索引号,对应于SVGA调色板上的256个颜色寄存器。实际的颜色码来自于颜色寄存器中,每种颜色18位,红绿蓝各6位,共可以表示256K种不同的颜色,不过同时在显示器上显示的只有256种。通过I/O端口地址3C8h和3C9h设置调色板,这样写代码:structCOLOR{BYTER;BYTEG;BYTEB;};structCOLORcolors[256];//假设颜色变量已经保存在上面的数组中for(inti=0;i256;i++){outportb(0x3C8,i);//调色板寄存器索引号outportb(0x3C9,(colors[i].R)2);//传入红色分量,6位outportb(0x3C9,(colors[i].G)2);//传入蓝色分量,6位outportb(0x3C9,(colors[i].B)2);//传入绿色分量,6位}颜色从哪里来,在本目录中有个颜色表文件ColPal.col,每个颜色4个字节,依次是蓝、绿、红、空,把它读出来放到颜色数组中。它的颜色表就是下面的样子:第三章VBEBIOS功能调用这一章写怎样使用VBEBIOS功能编写DOS下的图形界面程序,更详细的编程参考资料也放在了本目录中,一个是VBE3.0标准VBECoreFunctionsStandard3.0(1998).pdf,还有一个详细说明BIOSint10h功能调用的文件int10h.txt。VBE功能调用有一个约定,或者说是规定:1.AH必须等于4Fh,说明示调用VBE功能。2.AL等于VBE的功能号,其中0≤AL≤0Bh;3.BL等于子功能号,也可以没有子功能;4.调用int10h;5.返回值均在AX中,回想起调用WindowsAPI也是把返回值放到AX中。对VBE功能的调用一般需检查AX中的返回值,常见的返回值有:(1)功能调用成功,返回AX=004Fh;(2)不支持该功能,一般返回AX=4F00h;(3)支持该功能但该功能调用失败,返回AX=014Fh。6.返回值的含义如下:(1)AL=4Fh:支持该功能;(2)AL!=4Fh:不支持该功能;(3)AH=00h:功能调用成功;(4)AH=01h:功能调用失败;(5)AH=02h:当前的硬件配置不支持该功能;(6)AH=03h:当前的显示模式不支持该功能。1进入SVGA彩色模式__asm{movAX,4F02hmovBX,101h//显示模式640*480*256色int10h}常用的显示模式如下表所示,VBE标准涉及到的最大分辨率就是1280*1024,更高级的显示模式可以由厂家自己定义。BX像素分辨率*颜色数101h640*480*256103h800*600*256105h1024*768*256111h640*480*64K112h640*480*16M114h800*600*64K115h800*600*16M118h1024*768*16M2返回某个显示模式的信息有时候不能确定显示模式的窗口和位面大小是不是64KB,就用这个函数确定一下。intNumberOfPlanes;//这三个变量保存模式的参数intWinGran;intWinSize;structModeInfomode_info;//模式信息块WORDsegx=FP_SEG(mode_info);WORDoffx=FP_OFF(mode_info);BYTEresult;__asm{movAX,4F01h//功能号movCX,118h//显示模式movES,segxmovDI,offx//ES:DI指向模式信息块的指针int10hmovresult,AH}if(result==0x4F)//调用成功,显示卡支持该功能{NumberOfPlanes=mode_info.NumberOfPlanes;//位平面的个数WinGran=mode_info.WinGran;//位面大小(窗口粒度),以KB为单位WinSize=mode_info.Winsize;//窗口大小,以KB为单位}VBE把特定模式的信息保存在structModeInfo结构中,我们有时间可以了解一下,反正没有坏处。structModeInfo//共256字节{WORDModeAttr;//模式的属性BYTEWinAAttr,WinBAttr;//窗口A,B的属性/*还有其他的位面-窗口映射方法中包含两个窗口,不过现在这种情况极少*/WORDWinGran;//位面大小(窗口粒度),以KB为单位WORDWinSize;//窗口大小,以KB为单位WORDWinASeg,WinBSeg;//窗口A,B的起始段址BYTEfar*BankFunc;//换页调用入口指针/*换页时可以调用该功能,也可以用VBE功能05h完成,但是直接调用该功能可以加快调用速度,因为int指令需要耗费大量的CPU周期。高性能的程序设计都是以直接调用该功能代替05h功能进行换页。(PS:我们暂时不编高性能的程序,所以使用int10,AX=5F05h换页)*/WORDBytesPerScanLine;//每条水平扫描线所占的字节数WORDXRes,YRes;//水平,垂直方向的分辨率BYTEXCharSize,YCharSize;//字符的宽度和高度BYTENumberOfplanes;//位平面的个数BYTEBitsPerPixel;//每像素的位数BYTENumberOfBanks//CGA逻辑扫描线分组数BYTEMemoryModel;//显示内存模式BYTEBankSize;//CGA每组扫描线的大小BYTENumberOfImagePages;//可同时载入的最大满屏图像数BYTEreserve1;//为页面功能保留//对直接写颜色模式的定义区域BYTERedMaskSize;//红色所占的位数BYTERedFieldPosition;//红色的最低有效位位置BYTEGreenMaskSize;//绿色所占位数BYTEGreenFieldPosition;//绿色的最低有效位位置BYTEBlueMaskSize;//蓝色所占位数BYTEBlueFieldPosition;//蓝色最低有效位位置BYTERsvMaskSize;//保留色所占位数BYTERsvFieldPosition;//保留色的最低有效位位置BYTEDirectColorModeInfo;//直接颜色模式属性//以下为VBE2.0版本以上定义BYTEfar*PhyBasePtr;//可使用的大的帧缓存时为指向其首址的32位物理地址DWORDOffScreenMenOffset;//帧缓存首址的32位偏移量WORDOffScreenMemSize;//可用的,连续的显示缓冲区,以KB为单位//以下为VBE3.0版以上定义WORDLinBytesPerScanLine;//线形缓冲区中每条扫描线的长度,以字节为单位BYTEBnkNumberOfImagePages;//使用窗口功能时的显示页面数BYTELinNumberOfImagePages;//使用大的线性缓冲区时的显示页面数BYTELinRedMaskSize;//使用大的线性缓冲区时红色所占位数BYTELinRedFieldPosition;//使用大的线性缓冲区时红色最低有效位位置BYTELinGreenMaskSize;//使用大的线性缓冲区时绿色所占的位数BYTELinGreenFieldPosition;//使用大的线性缓冲区时绿色最低有效位位置BYTELinBlueMaskSize;//使用大的线性缓冲区时蓝色所占的位数BYTELinBlueFieldPosition;//使用大的线性缓冲区时蓝色最低有效位位置B
本文标题:DOS下的SVGA编程
链接地址:https://www.777doc.com/doc-2910217 .html