TC下SVGA编程如何实现800x600或1024x786高分辨率显示256色或24位真彩图像

susandy 2006-12-06 04:30:40
我查看了SVGA标准发现我们常用的显示器都应该支持800x600,1024x768的真彩图像但是为什么我写的程序最高支持到640x480再高显示器就提示超出范围,哪位老兄知道原因请指点一二!!最好有相应程序!谢谢!!
...全文
1242 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhangzhenyu220 2007-01-23
  • 打赏
  • 举报
回复
现在都 64位的时代啦, 好好学学32位时代 Windows GDI 或者 DirectX 吧,这些API和设备无关, 又能发挥硬件的优势, 为什么还要在 16位的Dos里转悠呢?
Jim_King_2000 2007-01-08
  • 打赏
  • 举报
回复
我的天,当然没有。我从来没有见过DOS下面有透明效果的。虽然我想应该可以实现,但是,真的,太麻烦了……
susandy 2007-01-08
  • 打赏
  • 举报
回复
呵呵 没办法只能结帖了。JIM_KING_2000兄有没有DOS下动画实现程序,类似DX的那种透明效果!
Jim_King_2000 2007-01-08
  • 打赏
  • 举报
回复
BIOS就支持很有限的几种模式。其余的模式就得联系显卡厂商了。不同厂商的实现是不同的。
susandy 2007-01-08
  • 打赏
  • 举报
回复
只能在DOS下,基于BIOS的!
Jim_King_2000 2007-01-07
  • 打赏
  • 举报
回复
你们公司什么产品啊?一定要在DOS下么?
susandy 2007-01-06
  • 打赏
  • 举报
回复
主要是公司产品要求实现这个。
amamnn 2007-01-04
  • 打赏
  • 举报
回复
我现在也是出现和楼主一样的问题,原来borland EGAVGA.bgi只支持到640*480,但以vesa标准来看的话,应该是可以支持到800*600, 1024*768等高分辨率及真彩色.但是一旦设置在这个范围就出现超出,如(模式号0x103 800*600*256 就出现out of range 23.6K,38hz.)
第一次来这个论坛.希望有经验的人多多指导.谢谢!
susandy 2007-01-03
  • 打赏
  • 举报
回复
没有高手能回答吗?
Jim_King_2000 2007-01-03
  • 打赏
  • 举报
回复
现代的显卡的寄存器几乎都是不公开的。但是都兼容以前的显示模式。因此想在tc下玩高分辨率和真彩色,就得自己去看显卡芯片的资料。并且,每一款显卡你都得自己写驱动代码。lz为什么要在dos下搞这个?
ReverseEngineering 2007-01-03
  • 打赏
  • 举报
回复
参考DDK吧,用驱动总可以的。
susandy 2006-12-12
  • 打赏
  • 举报
回复
我是在WINXP下测试的!dos下还没测试!
jjjungle 2006-12-09
  • 打赏
  • 举报
回复
3)SVGA及VBE
  计算机芯片的运算速度及显示速度的提升,使得高分辨在游戏中成为可能。现在这许多三维贴图与真三维游戏甚至支持到1024×768、256色或更高,但即使是奔腾166也难承其荷,对一个电脑发烧友来说,也许游戏才是其真正的升级动力和升级压力。
  一般来说,SVGA卡都至少拥有512K以上的视频内存,以用来存储更高分辨率或更多颜色的数据,它的256色或真彩显示模式都是采用线性对应的方法,所需要的内存数量也各有差别:
 分辨率 颜色数 像素大小 最小内存值
320*200 256 1 64K
640*480 256 1 307K
640*480 16M 3 922K
800*600 256 1 480K
1024*768 256 1 768K
1024*768 32K/64K 2 >1M
  这就是为什么1M的真彩卡最大支持到1024×768、256色的原因。但不管如何,其所占用的视频内存地址仍只有64K,所以当发生以上内存地址不够使用的情况时,SVGA卡采用区域切换(Bank Switching)的方法来解决,即将整个内存划分成许多内存页,然后利用切换功能来把不同的内存页对应到视频内存地址A0000h上(或其它),这样就可以用有限的视频内存地址来存取所有的视频内存了。
  现在,SVGA卡的生产厂商很多,大家周围的SVGA卡可谓琳琅满目,无论出品厂家还是型号都不尽相同,这对于程式开发人员来说,不能不说是一个头痛的问题:各类SVGA切换内存页的方法都不一样,而且有的显示卡上甚至有两个读、写切换开关。象大家熟悉的Trident卡在不同型号间就有新、旧两种存储页大小模式(128K与64K),它的存储页选择寄存器(Segment Select Refgister)地址在0x3c4;而另一类ET卡,它的存储页选择寄存器地址则为0x3cd,在ET3000上只用前6位来表示读写存储页的位置,对于ET4000W32X,则另外增加了一个扩展存储页寄存器,地址在0x3cb,用来表示读写存储页的4、5位(读写存储页的0~3位仍在0x3cd上不变)。对于这些混乱的状态,美国信息电子标准协会(VESA)提出了一套标准的SVGA卡技术规范,其中制定了许多SVGA卡的功能及可显示的扩展模式(Extended Mode),只要各厂家都遵循这个标准,那就会尽最大可能避免不兼容的情况发生。同时,VEGA也提出了一套软件的标准接口:VESA BIOS EXTENSION,即VBE,它扩展了VGA/SVGA BIOS原有的功能,而我们就可以利用这个统一的接口来进行显示控制(调用10号中断)。
  目前,新型的SVGA卡都内建有VBE的功能,它固化在卡上的BIOS内,对于较旧的SVGA卡可以用外挂式VBE程序来补充,我们在现在的许多SVGA游戏目录下经常会看到UNIVBE.EXE就是用以解决某些卡的不兼容问题的。利用VBE来控制SVGA卡的显示功能,不仅省去了许多复杂的工作,也基本保证了程序对各类SVGA卡的兼容性。
  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

// 读取当前的显示模式 int 10, ax=0x4f03
unsigned get_svgamode()
{
union REGS in,out;
in.x.ax=0x4f03;
int86 (0x10,&in,&out);
return out.x.bx; //返回当前模式编号
}

dengsf 2006-12-09
  • 打赏
  • 举报
回复
LZ是在纯DOS下测试吗?

NT内核的如win2k、winxp对DOS程序限制太多,
不能完全使用硬件原有的能力。

最坏情况下是显卡不支持。。虽然现在的显卡可能不大。
susandy 2006-12-09
  • 打赏
  • 举报
回复
jjjungle兄能不能提供一个能在TC下正常显示1024X768分辨率的程序!我找到的程序都不行。
susandy 2006-12-08
  • 打赏
  • 举报
回复
没有熟悉此方面的高手吗?
cjq87 2006-12-08
  • 打赏
  • 举报
回复
友情帮顶
susandy 2006-12-08
  • 打赏
  • 举报
回复
up
xuzheng318 2006-12-07
  • 打赏
  • 举报
回复
1280×1024的256色模式
susandy 2006-12-07
  • 打赏
  • 举报
回复
自己顶
加载更多回复(6)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧