精华区 [关闭][返回]

当前位置:网易精华区>>讨论区精华>>电脑技术>>○ DOS>>实用资料>>[转载] 图形存取<二>-送给留恋DOS的朋友

主题:[转载] 图形存取<二>-送给留恋DOS的朋友
发信人: love1974()
整理人: smallhors(1999-07-25 13:05:05), 站内信件
【 以下文字转载自 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://club.netease.com.[FROM: 202.96.190.124]

--
※ 转载:.网易虚拟社区 http://club.netease.com.[FROM: 202.96.190.124]


[关闭][返回]