有关SVGA的问题!

beaux 2001-08-09 09:29:48
如何在DOS设置1024*768*256,并且可以对每个象素实现256种灰度的控制!
...全文
143 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
SCUM 2001-08-10
  • 打赏
  • 举报
回复
VESA 调用:设置显示模式

AX=0x4F02
BX=模式号

1024x768x256 的模式号是 0x105

在 256 色下要实现 256 级灰度不可能,因为VGA寄存器实际只能支持6位颜色数据,最大值为63。当然也可用抖动算法,但效果不好。

可以用 16位或24位真彩色,效果很不错。

不过其实在 256 色下的 64 级灰度效果也已不错了,我的意思是作为灰度而言的话。

yiwei 2001-08-10
  • 打赏
  • 举报
回复
呵呵,以前没有写完的稿子,没想到现在还有人要这个啊,呵呵。

多彩的世界
随着CAD,CG和多媒体技术的发展和要求,各个硬件厂家推出了性能价格比较高的高彩色(High Color)和真彩色(True Color)SVGA图形显示卡,能在同屏显示32K,64K高彩色和16.7M真彩色的图形,使得世界变得丰富多采起来。但是很少有资料介绍真(高)彩色显示的编程方法,您是否已经对您的图形只能使用可怜的256种颜色感到不满呢?那么,就让我们从今天开始走进多彩的世界吧!
一.VESA显示标准接口
由于各个厂家出产的真(高)彩色显示卡虽然在基本体系结构上是相同的,但是在一些具体的方面如端口地址等参数却彼此互不兼容,因此直接对硬件编程有困难,并且通用性差。但是,目前大多数显示卡都兼容VESA标准,所以一般对于真(高)彩色方式编程都采用VESA图形接口。VESA标准对于真彩卡扩充了相应的显示模式,使用VESA可以使程序具有最广泛的适应性。VESA扩充的各种真彩色显示模式列于下表1:
表1:VESA标准支持的模式列表
模式号(BX) 分辨率 色彩数
10D 320x200 32k
10E 320x200 64k
10F 320x200 16m
11D 640x350 32k
11F 640x350 64k
121 640x350 16m
11E 640x400 32k
120 640x400 64k
122 640x400 16m
110 640x480 32k
111 640x480 64k
112 640x480 16m
113 800x600 32k
114 800x600 64k
115 800x600 16m
116 1024x768 32k
117 1024x768 64k
118 1024x768 16m
119 1280x1024 32k
11A 1280x1024 64k
11B 1280x1024 16m
注意,不是所有的显示卡都能够完全地支持上表中的各种显示模式。这其中有硬件性能上的原因,但通常是由于显示缓存不够造成的。如果显卡硬件上没有固化VESA接口的话,可以使用各种VESA扩充程序,如UniVESA,UniVBE等;对于显存的原因,就只有扩显存了。另外,即使你的显示卡能使用某种模式,但是如果你的显示器不够Cool的话,也是没有办法的事。
下表2列出了VESA标准调用接口的主要功能:
表2:VESA标准调用接口功能列表
功能号 0:返回VESA信息
调用参数 AX=4F00H
ES:DI=256字节缓冲区首地址
返回参数 AX=004FH 调用成功
ES:DI缓冲区中有如下数据:
VESA_SIG 'VESA' VESA标记
VESA_VER *.* VESA版本
OEM_PTR 指向OEM厂商标志串指针
RESERVED 2字节 未用
VIDEO_MODE 指向VESA支持的模式列表
功能号 1:返回VESA特定模式信息
调用参数: AX=4F01H
CX=要求的显示模式
ES:DI=具有如下格式的缓冲区首地址
返回参数: AX=004FH 调用成功
ES:DIH缓冲区格式:
MODE_ATTR 2字节 模式属性
WIN_A_ATTR 1字节 窗口A属性
WIN_B_ATTR 1字节 窗口B属性
WIN_GRAN 1字节 窗口粒度
WIN_SIZE 2字节 窗口大小
WIN_A_SEG 2字节 窗口A的段地址
WIN_B_SEG 2字节 窗口B的段地址
WIN_FUNC_PTR 4字节 映射机制功能入口地址
LINE_BYTE 2字节 每条扫描线字节数
功能号 2:设置VESA显示模式
调用参数 AX=4F02H
BX=要求的显示模式
返回参数 AX=004FH 调用成功
功能号 3:返回当前VESA显示模式
调用参数 AX=4F03H
返回参数 AX=004FH 调用成功
BX=显示模式
功能号 4:保存/恢复Super VGA的视频状态
子功能 0: 返回所需缓冲区大小
调用参数 AX=4F04H
DL=0
CX=要保存的状态标志
返回参数 AX=0X4FH 调用成功
BX=所需缓冲区大小(64B为单位)
子功能 1: 保存Super VGA视频状态
调用参数 AX=4F04H
DL=1
ES:BX=缓冲区指针
CX=要保存的状态标志
返回参数 AX=004F 调用成功
子功能 2: 恢复Super VGA视频状态
调用参数 AX=4F04H
DL=2
ES:BX=缓冲区指针
CX=要恢复的状态标志
返回参数 AX=004FH 调用成功
功能号 5:VRAM映射窗口控制
子功能 0: 设置显示页
调用参数 AX=4F05H
BH=0
BL=窗口号(0=A窗口,1=B窗口)
DX=页号
返回参数 AX=004FH 调用成功
子功能 1: 读页设置情况
调用参数 AX=4F05H
BH=1
BL=窗口号(0=A窗口,1=B窗口)
返回参数 AX=004FH
DX=指定窗口页号
二.调色板及RGB
在256色显示方式中,调色板决定颜色的色彩和饱和度,但在真(高)彩色显示模式中不再使用调色板,而是使用象素点的RGB分量来直接描述色彩,只需在视频缓冲区中直接写入象素点的颜色值,就可以显示出一个确定颜色的点,不必考虑调色板匹配的问题,而BIOS中有关调色板的中断调用全部无效。象素的分量结构如下表3:
表3:
一般说来,由扫描仪,图象采集,数码相机等设备输入到计算机的图象都是24位16M色的真彩色图象,如果需要在16位或15位高彩色模式显示,必须进行相应的转换,否则将出现色彩失真或者发生错误。这就是表3存在的意义。转换的规则是:24位象素点的RGB三基色分量的低位对应16位或15位象素点的三基色分量的各位,如2图1所示:
图1:
另外,由表3我们可以看出,在真彩色时一个象素点需占用3个字节,高彩色时占用2个字节。因此,在真(高)彩色显示方式时,图形处理速度将变慢,处理效率的高低取决于显示卡上的图形加速引擎的效率。
三.编程要点
1.调用VESA BIOS 的4F02H功能设置真高彩色显示模式;
2.调用4F01H功能确定每条扫描线的字节数LINE_BYTES以及视频页粒度WIN_GRAN等重要参数;(当然您也可以省去这一步,因为通常显示卡的参数都为标准值,如S3,Trident系列的显示卡,但是仍然有少数显示卡并非如此,如CIRRUS系列,采用标准值将无法正常显示。)
3.将象素点数据(24位3字节,16和15位2字节)写入首址为A000:0000H的视频缓冲区中,VRAM指针加2或加3;
4.调用4F05H功能访问硬件分页寄存器,实现视频页切换;
5.操作完成后,调用INT 10H的0号功能,设置显示方式为03H,回到彩色文本显示方式。
下面结合要点中各点给出相应的子程序来说明真高彩色图形方式的应用方法。

z_sky 2001-08-09
  • 打赏
  • 举报
回复
1、int 10h 的vesa功能调用;
2、bc31(tc30)的bgi扩展,svga256.bgi;

69,382

社区成员

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

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