计算机应用 | 古代文学 | 市场营销 | 生命科学 | 交通物流 | 财务管理 | 历史学 | 毕业 | 哲学 | 政治 | 财税 | 经济 | 金融 | 审计 | 法学 | 护理学 | 国际经济与贸易
计算机软件 | 新闻传播 | 电子商务 | 土木工程 | 临床医学 | 旅游管理 | 建筑学 | 文学 | 化学 | 数学 | 物理 | 地理 | 理工 | 生命 | 文化 | 企业管理 | 电子信息工程
计算机网络 | 语言文学 | 信息安全 | 工程力学 | 工商管理 | 经济管理 | 计算机 | 机电 | 材料 | 医学 | 药学 | 会计 | 硕士 | 法律 | MBA
现当代文学 | 英美文学 | 通讯工程 | 网络工程 | 行政管理 | 公共管理 | 自动化 | 艺术 | 音乐 | 舞蹈 | 美术 | 本科 | 教育 | 英语 |

TVGA彩色视频模式网(2)

2013-08-29 01:07
导读:3.调色板的读写 对于TVGA 256色视频模式,BIOS中常用的是置调色板寄存器10H,其中改写和读取DAC彩色寄 存器的功能如下。 ① 设置单个DAC彩色寄存器值 输入
3.调色板的读写
对于TVGA 256色视频模式,BIOS中常用的是置调色板寄存器10H,其中改写和读取DAC彩色寄
存器的功能如下。
① 设置单个DAC彩色寄存器值
输入参数:AH=10H,AL=10H
BX=DAC寄存器号(0~255)
DH=红色分量值(6位)
CH=绿色分量值(6位)
CL=蓝色分量值(6位)
返回值:无
② 设置DAC彩色寄存器组
输入参数:AH=10H,AL=12H
BX=寄存器组起始号(0~255)
CX=寄存器数目(1~256)
ES:DX=彩色表地址(每个彩色寄存器对应3个字节)
返回值:无
③ 读单个DAC彩色寄存器值
输入参数:AH=10H,AL=15H
BX=DAC寄存器号(0~255)
返回值:DH=红色分量值
CH=绿色分量值
CL=蓝色分量值
④ 读DAC彩色寄存器组
输入参数:AH=10H,AL=17H
BX=寄存器组起始号(0~255)
CX=寄存器组数目(1~256)
ES:DX=读取数据的存放地址
返回值:彩色寄存器的彩色值(每个寄存器3个字节)
为了讨论方便,先给出以下公共变量:
union REGS in, out;
struct SREGS sregs;
unigned char color-table[256][3];
于是就可以编写出相应的程序。
① 单个DAC寄存器写函数
void writeDAC(int regnumber, unsigned 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;
out.h.ch=g;
out.h.cl=b;
}
③ 写DAC寄存器组函数
void writeDACS(int regnumber, int regcount, unsigned cha
r
*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 regcount, unsigned char
(转载自科教范文网http://fw.nseac.com)

*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 readcolors(unsigned char color-table[256][3])
{ int i, j;
for (i=0;i<256;i++)
{ outp(0x3c7,i);
for (j=0; j<3; j++)
color-table[i][j]=(unsigned char)inp(0x3c9);
}
}
② 重新设置调色板
void writecolors(unsigned char color-table[256][3])
{ int i, j;
outp(0x3c8,0);
for (i=0; i<256;i++)
for (j=0; j<3; j++)
outp(0x3c9, color-table[i][j]>>2);
}
③ 读取单个DAC数据
readcolor(unsigned char colornum, unsigned r, unsigned c
ha
rg,unsigned char b);
{ outp(0x3c7, colornum);
r=inp(0x3c9);
g=inp(0x3c9);
b=inp(0x3c9);
}
④ 改写单个DAC数据
writecolor(unsigned char colornum, unsigned r, unsigned
ch
arg,unsigned char b);
{ outp(0x3c8, colornum);
outp(0x3c9, r);
outp(0x3c9, g);
outp(0x3c9, 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下编译,运行通过。程序中的TIFF文件的读取涉及到图像格式文件的知识,这里不再赘言。
(转载自中国科教评价网www.nseac.com )

附:源程序 showtif.c
#include <dos.h>
#include <stdio.h>
#include <alloc.h>
unsigned char buff[640],pal-buf[3*512], pal-buff[256][3];
struct HEAD
{
unsigned int bo;
unsigned int ver;
unsigned long next;
} head; /*定义TIFF格式文件头 */
struct DIR
{
unsigned int tga;
unsigned int type;
unsigned long len;
unsigned long val;
} dir[20]; /*定义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(argv[1],atoi(argv[2],atoi(argv[3]));
in.h.ah=0;
in.h.al=cur-mode;
in.h.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 ((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(dir[i].tga)
{
case 0x100: with=dir[i].val;break;
case 0x101: hight=dir[i].val;break;
case 0x102: bitcount=dir[i].val;break;
case 0x111: star=dir[i].val;break;
case 0x140: palptr=dir[i].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++)

(科教作文网http://zw.NSEaC.com编辑发布)


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) { if(x<=254) k=-x-1; else k=640-x-1;}
if(seg-num==1) { if(x<=510) k=254-x; else k=640-x+254;}
if(seg-num==2) { if(x<=126) k=510-x; else k=640-x+510;}
if(seg-num==3) { if(x<=382) k=126-x; else k=640-x+126;}
if(seg-num==4) { if(x<=638) k=638-x; else k=640-x+382;}
pvdieo+=cc;
outp(0x3c4,0x0e);
in.h.al=seg-num++;
in.h.al=(in.h.al & 0x0f)^0x02;
outp(0x3c5,in.h.al);
/* 设置当前的存储模式 */
fseek(pcx, star, SEEK-SET);
for(j=0;j<hight;j++)
{
fread(buff,1,with,pcx);
/* 逐行读出像素数据 */
if ((cc+640) <65536)
{
for(m=0; m<with;m++)
*pvdieo++=buff[m];
pvdieo+=640-with;
cc+=640;
}
else
{
k=(k+256)%640;
if (k<with)
{
for(m=0;m<=k;m++)
*pvdieo++=buff[m];
}
else
{
for(m=0;m<with;m++)
*pvdieo++=buff[m];
pvdieo+=k-with;
}
outp(0x3c4,0x0e);
in.h.al=seg-num++;
in.h.al=(in.h.al & 0x0f)^0x02;
outp(0x3c5,in.h.al);
pvdieo=(char far *)0xa0000000;
if (k<with)
{
for(i=m; i<with; i++)
*pvdieo++=buff[i];
pvdieo+=640-with;
co=640-k;
}
else
{
pvdieo+=639-k;
co=640-k;
}
}
}
fclose(pcx);
getch();
}
上一篇:充分利用物理演示实验 培养学生创新思维能力 下一篇:没有了