精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>编程开发>>C/C++>>DOS编程>>[转载] 图形存取<二>-送给留恋DOS的朋友

主题:[转载] 图形存取<二>-送给留恋DOS的朋友
发信人: love1974()
整理人: wenbobo(2002-08-13 10:45:44), 站内信件
【 以下文字转载自 VBVC 讨论区 】
【 原文由 <marquee>令狐冲</ 所发表 】
<2>屏幕图形的读入

  从保存的图形文件读如,再在屏幕上显示,关键在于对定序输出寄存器的正确

控制,其断口地址为34CH和3C5H

                     定序寄存器
------------------|----------------------------------
序号(3C4H)        |          定序寄存器(3C5H)
   00             |            重置寄存器
   01             |             时钟模式
   02             |           彩色页面写允许
   03             |           字符发生器选择
   04             |             存储模式
-----------------------------------------------------

  EGA/VGA的定序寄存器包括六个寄存器.定序器地址寄存器的端口为3C4H.
定序器数据寄存器,端口为3C5H.给3C4端口赋予不同的值可以选择不同的定序
数据寄存器作为当前活动寄存器,如赋予端口3C4H的值为02时,就选择了位面
寄存器,位面寄存器的D3,D2,D1,DO分别置位时,就可以选择不同的显示页面来写

   实现步骤:
      1>.打开文件读
      2>.启动页面允许寄存器
             outportb(0x34C,2); 
      3>.从0页面开始写,每次从地址A0000:0000写入,直到4个页面写完.
Read_to_screen()函数

   功能:将存放在文件中的屏幕图形放到屏幕上.
   入口:x1,y1:   保存屏幕时左上脚坐标
        x2,y2:   保存屏幕时右下脚坐标
        fp:      保存的文件
   出口:void
void Read_to_screen(int x1,int y1,int x2,int y2,FILE *fp)
{
  int x,y,k,lx;
  char far *buf0,*buf1;
  buf0=(char far *)(0xA0000000L);
  lx=(x2-x1)/2;
  buf1=(char far *)malloc(lx);
  outportb(0x34C,2); //启动页面写允许寄存器
  for(y=y1;y<y2;y++)
{
fread(buf1,lx,1.fp);
for(k=0;k<4;k++)
{
outportb(0x3C5,(1<<k));//写4个页面
for(x=x1/8;x<x2/8,x++)
*(buf0+80*y+x)=*(buf1+lx*k/4+x);
}
}
free(buf1);
}

--
太太平平,不是我活着的目标;不温不火,不是我的性格。是云就该下雨,是火就该发光。
那罐星砂送給你
╭╯ ╰╮╭╯╰╮ 願你心想事成
║▃▃▃║║☆★║ 這罐海水留給我
║███║║☆★║ 裝滿我的思念

※ 来源:.月光软件站 http://www.moon-soft.com.[FROM: 202.96.190.124]
--
※ 转载:.月光软件站 http://www.moon-soft.com.[FROM: 202.96.190.124]

[关闭][返回]