发信人: 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]  
  | 
 
 
 |