中国IT动力,最新最全的IT技术教程
最新100篇 | 推荐100篇 | 专题100篇 | 排行榜 | 搜索 | 在线API文档
首 页 | 程序开发 | 操作系统 | 软件应用 | 图形图象 | 网络应用 | 精文荟萃 | 教育认证 | 硬件维护 | 未整理篇 | 站长教程
ASP JS PHP工程 ASP.NET 网站建设 UML J2EESUN .NET VC VB VFP 网络维护 数据库 DB2 SQL2000 Oracle Mysql
服务器 Win2000 Office C DreamWeaver FireWorks Flash PhotoShop 上网宝典 CorelDraw 协议大全 网络安全 微软认证
硬件维护  CPU  主板  硬盘  内存  显卡  显示器  键盘鼠标  声卡音箱  打印机  机箱电源  BIOS  网卡  C#  Java  Delphi  vs.net2005
  当前位置:> 程序开发 > 编程语言 > 综合其它
置256色图形模式
作者:未知 时间:2005-09-13 23:33 出处:Blog.ChinaUnix.net 责编:chinaitpower
              摘要:置256色图形模式

置256色图形模式

  要使用256色图形模式,使用TC的界面模式是不行的,因为它为VGA16色的文本模式,要使用256图形模式,则要调用显卡BIOS进行图形界面初始化。具体是调用10H的显示中断,将功能号AH置为0,子功能号AL置为要使用的模式号,以调用IBM兼容显卡的320×200的256色模式为列,程序如下。
#include "dos.h"
void init256(int Vmode)
{ union REGS r;
 r.h.ah=0;
 r.h.al=Vmode;
 int86(0x10,&r,&r);
}
main()
{ init256(0x13);
 getch();
 init256(0x3);
}
运行后,屏幕进行了一次闪烁,实际上,这是屏幕显示模式切换引起的。切换模式后,屏幕一片黑暗,因为切换模式后,未对屏幕进行任何操作。接下来,我将演示在256色模式下对显卡的操作。

访问显存

  初始化得到了256色图形模式的屏幕,接下来要做的就是向屏幕显示图像了。在显示图像之前,我要介绍一个很重要的far指针。也许你在16色VGAHI模式里用过,那就是内存中的图形模式显存映像指针0xa0000000,说它是映像指针,是因为显示器只与显示卡直接打交道,所以要更改屏幕内容还需更改显存内容。因此,内存中提供一块64k的区域,通过显示中断可以使它映射为显存的不同区域,更改该内存中的值即更改了相应映射区域的显存。让我们先试一下下面的程序:(注意:运行时,最好将内存模式设置为large,否则可能出错,以后我不再提示)
#include "dos.h"
main()
{ long i;
 char far *p=MK_FP(0xa000,0000);
 union REGS r;
 r.x.ax=0x13;
 int86(0x10,&r,&r);
 for(i=0;i<320*200L;i++)*(p+i)=i/320;
 getch();
 r.x.ax=0x3;
 int86(0x10,&r,&r);
}

看见了什么,你会惊诧地发现:多么丰富的色彩!DOS模式下的256色显示实现了!

显示卡换页

  前面将过由于内存只提供64k的内存进行显存操作,在320×200的256模式下尚可访问所有的屏幕像素点。但是在320×200以上的256模式下就不行了,因为在此模式下,比如在640×480的256模式下,存储一屏所有的像素点需要640×480byte=300k的存储单元。比如使用以下程序:
#include "dos.h"
main()
{ long i;
 char far *p=0xa0000000;
 union REGS r;
 r.x.ax=0x5f;/*TNT2、GeForce2的640×480的256色模式均使用该模式号*/
 int86(0x10,&r,&r);
 for(i=0;i<640*400L;i++)*(p+i)=(i/640)%256;
 getch();
 r.x.ax=0x3;/*恢复为16色文本模式*/
 int86(0x10,&r,&r);
}

程序用意是将屏幕400行依次填上不同的颜色。然而结果却只更改了屏幕1/4还不到的区域。剩下的3/4区域如何去操作呢?这就要用到VESA显卡换页的功能。让0xa0000000开始的这64k显存映射到屏幕显存的其他3/4以下的区域。换页中断使用如下:
void selectpage(char page) /*换页函数*/
{ union REGS r;
 r.x.ax=0x4f05;
 r.x.bx=0;
 r.x.dx=page; /*选择页面*/
 int86(0x10,&r,&r);
}
使用该换页函数后,即可操作显存其他图像区域(默认的页面为0)。将该函数插入到前一程序的main函数之前,并在for循环前使用:selectpage(1),看看屏幕有什么结果。
  640×480的屏幕按64k为划分为5块,因此,换页函数如果使用4以上的参数,屏幕上将无法显示。但是对显存的修改依然是存在的,只是不是在显示页上了而已。

前面的640×480的256色模式如果无法初始化,因为前面说过不同的显示卡制造商生产的显卡模式号不同。可以参考此表修改r.x.ax的参数:


640×480的256色模式模式号参照表

注:中断模式:640×480 256colors GraphicsMode
回显模式:640×480 16colors TextMode 

芯片型号 中断模式号 回显模式号
SIS集成芯片 0x2e ?
3D Image系列芯片 0x5d ?
Intel 81x集成芯片 0x79 0x7
TNT2系列显示芯片 0x5f 0x3
GeForce2显示芯片 0x5f 0x3

带?是因为我还没有测试出来,如果你测试出来了可以在论坛上公布

关闭本页
 
首页 | 投资与合作 | 服务条款 | 隐私政策 | 收藏本站 | 设为首页 | 新用户注册 | 免责声明 | 使用帮助
Copyright ©2005-2008 chinaitpower.com All rights reserved. www.chinaitpower.com 版权所有