求助:关于屏幕显示的问题
最近在读一个程序,里面有一个像屏幕上输出的函数,有几点不太懂,希望高手指点
1 c函数void outportb(int port, char byte)是往指定的硬件端口输出字节,0x3c0-0x3cf都是屏幕寄存器,那么0x3c4,0x3c5有什么区别?
2 程序里面的0xa0000D21l,0xa0008D21l表示什么意思?
同时那个达人明白这个函数的意思,还请指点一二,不胜感激!!!
void frame(int flagpa)
{register long i,j;
char far * ptr;
outportb(0x3c4,2);//?
outportb(0x3c5,7);//?
if(flagpa==0)
ptr=(char far *)0xa0000D21l;//??
else
ptr=(char far *)0xa0008D21l;//??
for(i=0;i<280;i++)
{ for(j=0;j<75;j++)
{*ptr=0xFF;
ptr++;
}
ptr+=5;
}
if(flagpa==0)
ptr=(char far *)0xa0000D21l;
else
ptr=(char far *)0xa0008D21l;
outportb(0x3c4,2);
outportb(0x3c5,8);
for(i=0;i<280;i++)
{for(j=0;j<75;j++)
{*ptr=0;
ptr++;
}
ptr+=5;
}
outportb(0x3c5,0xf);
}
问题点数:0、回复次数:4Top
1 楼kix(kix)回复于 2004-12-02 09:35:28 得分 0
那个达人帮忙解答一下阿?Top
2 楼superman421(38度的雪)回复于 2004-12-02 10:02:27 得分 0
0xA0000000L显存的起址是这么多。
寄存器是什么就不记得了,以前很少用到这两个。给你一段程序自己看看。
#include<dos.h>
#define VGA256 0x13
#define TEXT_MODE 0x03
#define PALETTE_MASK 0x3c6
#define PALETTE_RD 0x3c7
#define PALETTE_WR 0x3c8
#define PALETTE_DATA 0x3c9
void setVideoMode(int);
void setPalette(int ,int ,int ,int);
void vLine(int ,int ,int ,int );
void getPalette(int*,int*,int*,int);
void H_Line(int ,int ,int ,int );
void Rectangle(int ,int ,int ,int ,int );
unsigned char far *videoBuffer=(char far*)0xA0000000L;
void setVideoMode(int mode)
{
union REGS inregs,outregs;
inregs.h.ah=0;
inregs.h.al=(unsigned char)mode;
int86(0x10,&inregs,&outregs);
}
void setPalette(int r,int g,int b,int index)
{
outp(PALETTE_MASK,0xff);
outp(PALETTE_WR,index);
outp(PALETTE_DATA,r);
outp(PALETTE_DATA,g);
outp(PALETTE_DATA,b);
}
void VLine(int y1,int y2,int x,int color)
{
unsigned int lineOffset,index;
lineOffset=((y1<<8)+(y1<<6))+x;
for(index=0;index<=y2-y1;index++)
{
videoBuffer[lineOffset]=color;
lineOffset+=320;
}
}
void HLine(int x1,int x2,int y,int color)
{
unsigned int lineOffset,index;
lineOffset=((y<<8)+(y<<6))+x1;
for(index=0;index<=x2-x1;index++)
{
videoBuffer[lineOffset]=color;
lineOffset++;
}
}
void Rectangle(int x1,int x2,int y1,int y2,int color)
{
HLine(x1,x2,y1,color);
HLine(x1,x2,y2,color);
VLine(y1,y2,x1,color);
VLine(y1,y2,x2,color);
}
void clearBk(int x1,int x2,int y1,int y2)
{
for(;y1<=y2;y1++)
HLine(x1,x2,y1,0);
}
void bar(int x1,int x2,int y1,int y2,int color)
{
for(;y1<y2;y1++)
HLine(x1,x2,y1,color);
}
void getPalette(int*r,int*g,int*b,int index)
{ outp(PALETTE_RD,index);
*r=inp(PALETTE_DATA);
*g=inp(PALETTE_DATA);
*b=inp(PALETTE_DATA);
}
//。。。。。。。。。
#include"SCREAN.H"
void frame(int flagpa)
{register long i,j;
char far * ptr;
outportb(0x3c4,2);
outportb(0x3c5,7);
if(flagpa==0)
ptr=(char far *)0xa0000D21l;
else
ptr=(char far *)0xa0008D21l;
for(i=0;i<280;i++)
{ for(j=0;j<75;j++)
{*ptr=100;
ptr++;
}
ptr+=5;
}
getch();
if(flagpa==0)
ptr=(char far *)0xa0000D21l;
else
ptr=(char far *)0xa0008D21l;
outportb(0x3c4,2);
outportb(0x3c5,8);
for(i=0;i<280;i++)
{for(j=0;j<75;j++)
{*ptr=100;
ptr++;
}
ptr+=5;
}
outportb(0x3c5,0xf);
getch();
}
main(){
setVideoMode(VGA256);
VLine(0,100,10,100);
frame(0);
VLine(0,100,100,100);
getch();
setVideoMode(TEXT_MODE);
}Top
3 楼kix(kix)回复于 2004-12-02 10:52:45 得分 0
有没有详细点的答复阿???Top
4 楼sunlu_eric(天使预备役)回复于 2004-12-02 13:40:47 得分 0
那个不应该叫寄存器吧,应该叫端口号,用来做不同的判断和造作!
例如:我有的端口用来判断是不是可以传送数据,有的用来传数据,还有的表示这个
通讯口是不是及接收又传送数据!!!
这只是“相形”的说!Top




