浅谈tvga彩色视频模式_第1页
浅谈tvga彩色视频模式_第2页
浅谈tvga彩色视频模式_第3页
浅谈tvga彩色视频模式_第4页
浅谈tvga彩色视频模式_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、浅谈tvga彩色视频模式    摘 要 本文首先分析了tvga的结构和其显示原理,然后进一步阐述了其256彩色模式下的存储模式,并给出了的实用编程技术,还附了一个在tvga显示器上显示256色图像的源程序。 关键词 dac彩色表 增强型视频图形阵列tvga自从trident公司开发出来,现在以成为ibm和其他兼容机上普遍适用的图形显示器。tvga提供与vga寄存器级兼容能力,并增强了几种显示模式,特别是它能很方便的显示256种颜色,为我们提供了丰富多彩的照片式图像显示。为了让读者能对tvga的256色模式有一个清楚而全面的认识,文章将从结构显示原理以及存

2、储模式等方面来介绍,最后并给出tvga256色模式下的编程技术。 一、tvga视频模式 tvga提供了与vga寄存器级兼容能力,而且大大增强了图形、文本模式,支持256k×4 dram、等离子体显示控制,它可以模拟vga、ega、cga、mda和256色图形方式,有640×400、640×480、800×600和1024×768四种模式。tvga除拥有vga标准图形模式外,还有扩展vga模式。在配置512k视频缓冲区(dram)的系统中,256色的分辨率可达到800×600;若配置1mb dram,还可以达到1024×768

3、更高的分辨率。表1给出tvga扩展图形模式的说明。t5s10600.gif;表1由表1可知tvga提供4种256色扩充模式:5ch(640×400)、5dh(640×480)、5eh(800×600)和62h(1024×768)。在此后的文中,所谈及的tvga256色的视频模式就是上述四种模式。 二、tvga结构 tvga主要由:定序器、crt控制器、图形控制器、属性控制器、dac支持逻辑、主总线接口及显示寄存器接口等7部分组成,它们之间的逻辑关系如图1所示。t5s10601.gif;图11.定序器定序器为dram接口提供基本的存储器时序,为crt提供字

4、符时钟,并执行某些存储器地址解码。它通过5个可以读写的寄存器进行控制。它们有两个i/o地址(3c4和3c5)。3c4是序号寄存器,用于选择工作寄存。数据输出到i/o地址为3c5的寄存器。2.crt控制器crt控制器通过产生显示器光栅的同步信号等来控制显示器,它也可以定义屏幕上显示数据的格式。3.图形控制器图形控制器位于存储器与系统处理器之间的数据通道中。在缺省状态下,图形控制器是透明的:数据在处理器之间直接进行逻辑操作,为图形算法提供硬件支持。同样,图形控制器有两个i/o地址:3ce和3cf,前者是序号寄存器,用于选择图形控制器各工作寄存器来驱动tvga模拟显示器4.属性控制寄存器属性控制寄存

5、器把图形控制器接收的数据格式化后进行视频显示。它操作调色板、屏幕边界(或过扫描区)和背景色彩。光标闪烁、下划线和显示逻辑地址也由它控制。在图形模式下,属性控制器把内存中的数据转化成彩色查找表的地址,并由视频dac转换成模拟电平来驱动tvga模拟显示器。5.数模转换器(dac)数模转换器,是tvga系统中的可编程控制设备。它把tvga产生的二进制彩色信息转换成可由监视器显示的信号,dac含有256个颜色数据寄存器,每个含有可显示的每种颜色。每个数据寄存器保存18位彩色信息,红绿蓝各占6位。这些基色位控制三色模拟显示的驱动。tvga256模式时,显示缓冲区的每一项由18位组成,分成三部分,各6位,

6、分别代表红绿蓝的值。查找表中每一项是可以设置的,因此可有256k种颜色可以设置,由于查找表最多只有256色,所以同时显示的颜色只有256种。显示缓冲区、视频dac和彩色查找表、显示屏的关系可用图2来表示。t5s10602.gif;图2用于访问视频dac的寄存器有5个,见表2。t5s10603.gif;表2选择查找表2中256个内部色彩寄存器,另有两个独立的寄存器,读序号寄存器仅用于读dac颜色查找表,写序号寄存器仅用于写dac颜色表。彩色寄存器宽18位,把8位序号写入3c8写序号寄存器,然后写6位数到数据寄存器(3c9),那么8位序号彩色寄存器的3个分量就得到修改。每写3个字节,3c8写寄存器

7、自动加一,因此不必重复设置序号便可给一组寄存器赋值。同样,向读寄存器(3c7)写入8位序号,然后从3c9中读3个6位值,便可得到该序号彩色寄存器值。每读3个字节,序号寄存器就自动加一,因此不必设置序号就可读出一组彩色寄存器值。读dac状态寄存器(3c7)可以知道彩色查找表当前是读还是写。d0,d1位上的00值表示处于读模式,01值表示处于写模式。 三、tvga 256视频模式的存储模式 tvga256图形模式,包括模式5c、5d、5e和62等。在这几种模式中,彩色查找表(调色板)的设置都是通过对端口3c7、3c8、3c9的读写达到重置彩色查找表的目的。这几种显示模式缓冲区的起始地址都是a000

8、0,而所需缓存容量都大于tvga基本的64kb,因此tvga在控制卡上增加了一部缓存,它是通过3c4,3c5来存取。1.tvga存储映射方式显示存储器dram在系统主存储空间的映射方式有两种,也就是两种页模式(pagemode),第一种允许cpu访问dram的地址范围为a0000bffff,即128k模式;另一种地址范围为a0000affff,即64k模式。前一种模式,在使用位平面存储方式下,一次可以访问128k的位平面;而后一种模式则需要另外一个i/o端口位来选择读出的是哪一个64k。tvga的视频bios缺省置为64k模式。可根据需要选择页模式,页模式由图形控制器中的辅助寄存器控制。图形控

9、制器有i/o地址3ce和3cf,3ce为索引端口地址,3cf为数据端口地址。而辅助寄存器则为3ce的第6号索引寄存器。该寄存器中存放着可修改的单字节数据,各位意义如下:4,5,6,7位:保留:2,3位:dram在主存储区内的地址范围00a0000bffff (128k)01a0000affff (64k)10b0000b7fff (32k)11b8fffbffff (32k)1位:置为0;0位:若为0,表文本方式;若为1,表图形方式。在64k页模式下,由于一幅640×480的256色图象至少需要240k缓存,这大大的超过了64k页模式下的缓存,因此tvga在vga 64k基础上,利用

10、定序器控制器的地址寄存器(索引号为0eh)来分别控制数据传送到不同的几个64kb缓存中。定序器控制器的索引端口地址为3c4,数据端口地址为3c5。而地址寄存器则为0e号索引,存放着单字节数据,各位意义如下:4,5,6,7位:保留;2,3位:0到3号存储块选择;1位:页选择:读dram时,若为1,表读第一页;若为0,表读第零页;特别注意,写dram时,若为1,表写第零页;若为0,表写第一页;0位:段选择。2.tvga像素寻址图形显示模式下tvga使用自然坐标系对其存储器进行寻址,各像素根据坐标在屏幕上定位,原点位于屏幕左上角,坐标最大点(xmax, ymax)位于右下角。屏幕像素地址为20位(不

11、包括0xa0000基地址),格式为:16,17,18,19位:意义同定序器控制器的地址寄存器的4,5,6,7位;0.15 位:表段内偏移地址。四、tvga编程技术在tvga 256色视频模式下,主要用于显示高质量照片式点阵式图像。原图像可以从彩色图像扫描仪中或电视摄像机中获得,只要把原图像格式转换成tvga的256彩色显示格式,就可以直接把图像送tvga显示存储器。本节所有例程都是用turbo c语言写成,并都在微机上调试通过。1.模式设置用bios中的int10h可完成模式设置,下面只讨论256色图形模式的设定。在每次模式设置前,还要设置缓冲区的存储模式。(1) 缓冲区存储模式设置 128k

12、模式void mode128k() unsigned char i;outp(0x3ce,0x06);i=0x01;i=(i & 0x0f);outp(0x3cf,i); 64k模式void mode64k() unsigned char i;outp(0x3ce,0x06);i=0x05;i=(i & 0x0f);outp(0x3cf, i);(2) 图形显示模式设置set-mode( int mode) union regs in, out;in.h.al=(unsigned char) mode;in.h.ah=0;int86(0x10, &in, &ou

13、t);2.画点程序和读点程序不妨设当前模式下的横向和纵向的最大分辨率maxx, maxy已知。putpixel(int x,int y,unsigned char color) long address,offset;unsigned char segnumber;char far *p;address=y* maxx+x;offset=(address & 0x0000ffff);segnumber=(address &0x000f0000;)outp(0x3c4, 0x0e);in.h.al=segnumber;in.h.al=(in.h.al & 0x0f)0x0

14、2;outp(0x3c5,in.h.al);p=(char far *) 0xa0000000;*(offset+p)=color;getpixel(int x,int y,unsigned char color) long address,offset;unsigned char segnumber;char far *p;address=y*maxx+x;offset=(address & 0x0000ffff);segnumber=(address & 0x000f0000);outp(0x3c4,0x0e);outp(0x3c5,segnumber);p=(char f

15、ar *)0xa0000000;color=*(offset+p);3.调色板的读写对于tvga 256色视频模式,bios中常用的是置调色板寄存器10h,其中改写和读取dac彩色寄存器的功能如下。 设置单个dac彩色寄存器值输入参数:ah=10h,al=10hbx=dac寄存器号(0255)dh=红色分量值(6位)ch=绿色分量值(6位)cl=蓝色分量值(6位)返回值:无 设置dac彩色寄存器组输入参数:ah=10h,al=12hbx=寄存器组起始号(0255)cx=寄存器数目(1256)es:dx=彩色表地址(每个彩色寄存器对应3个字节)返回值:无 读单个dac彩色寄存器值输入参数:ah=

16、10h,al=15hbx=dac寄存器号(0255)返回值:dh=红色分量值ch=绿色分量值cl=蓝色分量值 读dac彩色寄存器组输入参数:ah=10h,al=17hbx=寄存器组起始号(0255)cx=寄存器组数目(1256)es:dx=读取数据的存放地址返回值:彩色寄存器的彩色值(每个寄存器3个字节)为了讨论方便,先给出以下公共变量:union regs in, out;struct sregs sregs;unigned char color-table2563;于是就可以编写出相应的程序。 单个dac寄存器写函数void writedac(int regnumber, unsigned

17、 char r, unsigned char g,unsigned char b) in.x.ax=0x1010;in.x.bx=regnumber;in.h.dh=r;in.h.ch=g;in.h.cl=b;int86(0x10, &in, &out); 单个dac寄存器读函数void readdac(int regnumber, unsigned char r, unsigned charg,unsigned char b) in.x.ax=0x1015;in.x.bx=regnumber;int86(0x10, &in, &out);out.h.dh=r;

18、out.h.ch=g;out.h.cl=b; 写dac寄存器组函数void writedacs(int regnumber, int regcount, unsigned char*color-tableb) in.x.ax=0x1012;in.x.bx=regnumber;in.x.cx=regcount;sregs.es=fp-seg(color-table);sregs.dx=fp-off(color-table);int86x(0x10, &in, &out, &sregs); 读dac寄存器组函数void readdacs(int regnumber, int

19、 regcount, unsigned char*color-table) in.x.ax=0x1017;in.x.bx=regnumber;in.x.cx=regcount;sregs.es=fp-seg(color-table);sregs.dx=fp-off(color-table);int86x(0x10, &in, &out, &sregs);除了bios方式之外,访问调色板还可用寄存器访问方式。这里用到3个寄存器i/o地址 寄存器3c7彩色查找表读操作索引号3c8彩色查找表写操作索引号3c9彩色查找表数据寄存器 获取当前调色板数据void readcolor

20、s(unsigned char color-table2563) int i, j;for (i=0;i<256;i+) outp(0x3c7,i);for (j=0; j<3; j+)color-tableij=(unsigned char)inp(0x3c9); 重新设置调色板void writecolors(unsigned char color-table2563) int i, j;outp(0x3c8,0);for (i=0; i<256;i+)for (j=0; j<3; j+)outp(0x3c9, color-tableij>>2); 读取

21、单个dac数据readcolor(unsigned char colornum, unsigned r, unsigned charg,unsigned char b); outp(0x3c7, colornum);r=inp(0x3c9);g=inp(0x3c9);b=inp(0x3c9); 改写单个dac数据writecolor(unsigned char colornum, unsigned r, unsignedcharg,unsigned char b); outp(0x3c8, colornum);outp(0x3c9, r);outp(0x3c9, g);outp(0x3c9,

22、b);最后需指出,tvga 256色视频模式是tvga中最引人注目的模式,根据vga的标准,可选择多达256k种颜色,但一个显示页同时可显示的颜色最多只有256色,对于模式62h,系统需配置1mb dram,而一般个人计算机上的tvga显示卡只有512kb dram,因而一般不能实现62h模式所提供的1024*768这种高分辨率。所以,用户在使用tvga 256色视频模式时,最好使用5dh模式,即分辨率为640*480的256色模式。为了让读者能尽快熟悉tvga256色的编程技术,笔者特给出一个在5dh模式下显示256彩色tiff图像格式文件的程序,程序用c语言写成,并在turbo c2.0下

23、编译,运行通过。程序中的tiff文件的读取涉及到图像格式文件的知识,这里不再赘言。附:源程序 showtif.c#include <dos.h>#include <stdio.h>#include <alloc.h>unsigned char buff640,pal-buf3*512, pal-buff2563;struct headunsigned int bo;unsigned int ver;unsigned long next; head; /*定义tiff格式文件头 */struct dirunsigned int tga;unsigned int

24、 type;unsigned long len;unsigned long val; dir20; /*定义tiff格式文件目录项 */main(int argc,char *argv)union regs in, out;unsigned char cur-mode,cur-page;in.h.ah=15;int86(0x10,&in, &out);cur-mode=out.h.al;cur-page=out.h.bh; /*存储当前显示模式 */show(argv1,atoi(argv2,atoi(argv3);in.h.ah=0;in.h.al=cur-mode;in.h

25、.bl=cur-page;int86(0x10,&in,&out); /*恢复成原显示模式 */show(char *filename,int x,int y)union regs in,out;file *pcx;unsigned int long cc=0,dd,star,palptr;register int m, j;unsigned int nd,bitcount, with, hight, d;int i,k=-1;unsigned char ch, mode,seg-num=0;char far *pvdieo=(char far *)0xa0000000;if

26、(pcx=fopen(filename, "rb+")=null)printf("open file error !");exit(0);fread(&head,8,1,pcx);fseek(pcx,head,next,seek-set);fread(&nd,2,1,pcx);fread(dir,12*nd,1,pcx);for(i=0; i<nd;i+)switch(diri.tga)case 0x100: with=diri.val;break;case 0x101: hight=diri.val;break;case 0x10

27、2: bitcount=diri.val;break;case 0x111: star=diri.val;break;case 0x140: palptr=diri.val;break;default:continue;/*star=图像数据首地址 with=图像宽度hight=图像高度 bitcount=图像像素位数palptr=调色板首地址*/in.h.ah=0;in.h.al=0x5d;int86(0x10,&in,&out);/* 设置当前显示模式为5dh */fseek(pck, palptr, seek-set);fread(pal-buf,512*3,1,pcx);/* 读取调色板数据 */outp(0x3c8,0);for (j=0;j<256; j+)for (i=0; i<3; i+)outp(0x3c9,pal-buf i*512+2*j+1>>2);/* 设置当前调色板 */x=x%640;y=y%480;cc=(long)y*(long)640+(long)x;while(cc>=65535) cc=cc-65535; seg-num+;if(seg-num=0)

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论