社区
C语言
帖子详情
TC下SVGA编程如何实现800x600或1024x786高分辨率显示256色或24位真彩图像
susandy
2006-12-06 04:30:40
我查看了SVGA标准发现我们常用的显示器都应该支持800x600,1024x768的真彩图像但是为什么我写的程序最高支持到640x480再高显示器就提示超出范围,哪位老兄知道原因请指点一二!!最好有相应程序!谢谢!!
...全文
1242
26
打赏
收藏
TC下SVGA编程如何实现800x600或1024x786高分辨率显示256色或24位真彩图像
我查看了SVGA标准发现我们常用的显示器都应该支持800x600,1024x768的真彩图像但是为什么我写的程序最高支持到640x480再高显示器就提示超出范围,哪位老兄知道原因请指点一二!!最好有相应程序!谢谢!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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)
最新vesa
svg
a图形
图像
编程
秘技.rar
讲的是关于
svg
a图形
编程
,用的c语言和汇编语言
嵌入式
高分辨率
VGA
显示
系统的研究
“嵌入式
高分辨率
VGA
显示
系统”是一种嵌入式便携式的VGA
显示
设备。它 可以在不使用计算机和VGA
显示
卡的情况下,
实现
VGA
图像
的
显示
和控制。主要 可应用于大型超市、车站、飞机场等公共场所的广告宣传和提示信息发布;也可 以安装在工厂车间,用于生产过程中的操作信息
显示
;还可以开发成多媒体电子 挂历系统应用于日常生活。本文设计并
实现
了10
24
*768
图像
(XGA)、800*600
图像
(
SVG
A)和640*480
图像
(VGA)三种分辨率
图像
的
显示
。
tc
第三方bgi合集,支持
SVG
A
tc
第三方bgi合集,支持
SVG
A
24
-bit
显示
C语言DOS下
svg
a.bgi
其为
svg
a.bgi 放在
TC
下即可 可以
显示
高清像素的模式
svg
a
256
.bgi
sbga
256
.bgi
tc
用的图形驱动
256
色
想下的自己拿 带说明文档哦
C语言
69,382
社区成员
243,073
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章