0Ah 图形 4 640* 200 X
0Bh — 保留 —
0Ch — 保留 —
0Dh 图形 16 320*200 X X
0Eh 图形 16 640*200 X X
0Fh 图形 单色 640* 350 X X
10h 图形 16 640*350 X X
11h 图形 2 640*480 X X
12h 图形 16 640*480 X
13h 图形 256 320*200 X X
分辨率一栏中的数目代表文本方式的行和列,代表图形方式的象素。
MDA只支持一个屏幕显示方式(方式7),CGA支持7个,EGA支持12个。最复杂的
适配卡是VGA系统,它支持15个显示方式。 VGA还支持单色显示、每屏幕43行的显示
以及有256种颜色的彩色调色板等的图形。
BIOS跟踪当前显示方式并将方式号保存在内存地址0400:0049中。每行的列数保
存在0040:004A处。尽管用户可以直接改变这些数值,但这样做并不聪明,因为BIOS不
仅在这些内存位置上改变了数目,而且执行了正确设置视频方式所必须的其它操作。
现在让我们看看两类显示方式:文本和图形。
一、文本方式显示
文本方式也叫做字母数字方式,大多数IBM文件都是这样提到的。文本方式中,内存
的两个字节安排在屏幕显示的每个字符位置上:一个字节拥有该字符,另一个则拥有其属
性。字符就在与它同一地址的那个字节里,属性就在另一字节里。字符属性向显示适配卡
指示出字符应该怎样显示。表5.3显示单色文本方式的字符属性位的含义;表5.4则显示
彩色文本方式位的含义。
85页
表5.3单色字符属性
位
含义
76543210
0······· 正常字符
1······· 闪烁字符
·000···· 黑背景(正常)
·111···· 白背景(逆向)
····0··· 正常强度
····1··· 高强度
·····000 白色前景(正常)
·····001 下划线白色前景
·····111 黑色前景(逆向)
表5.4单色字符属性
位
含义
76543210
0······· 正常字符
1······· 闪烁字符
·XXX···· 背景(见表5.5)
···· XXXX 前景(见表5.5)
注意表5.4中背景颜色只允许三位,前景颜色则为四位。原因是标准的视频显示线路
设置背景域的高位为1,从而提供使每个字符闪烁开和关的功能。但是,通过修饰输送给
视频适配卡的方式显示寄存器的值,就可以得到背景亮度值的完整范围(以失去闪烁能力
为代价)。
对于CGA,要解除前景的闪烁特性并加上强度控制给前景,就必须读取BIOS储存在
0040h:0065h位置上的值,0DFh的字节使闪烁位变清晰,并将结果输出到端口03D8h
(即CGA的MDR地址)。对于HGA或MDA,执行同样的操作,但将结果输送到端口
03B8h。
下面的实例汇编语言程序允许明亮的CGA背景:
push es ;save the register
mov ax , 40h :address BIOS work area
mov es,ax
mov al,es:65h ; get last value sent to mode control
and al,0DFh ;clear blink control bit
mov eses : 65h,al ;save value for future reference
mov dx , 03D8h get CGA mode control port address
out dx,al ; send to CGA mode control port
pop es ; restore saved segment register
这种修改只有当视频方式被BIOS再次改变时才能保持有效;要使之对于所有的视
频方式都有效就需要改变Int 1Dh向量所指示的视频表。因为视频表通常驻留在ROM
中,要将它们拷贝给RAM并保证它们一直没有改变,这不是一个普通的任务;而只改变
所需寄存器是比较容易的。
对于EGA和最近的适配卡,触发闪烁位要简单得多。可以使用BIOS Int 10h处的接
口,并设置AX为1303h:
86页
mov ax,1303h
int 10h
表5.5列举了每种颜色可能的位置。但是,注意,因为通常的前景是由32位决定的,
只有超过7的值才能存储在前景之中,除非象刚才描述的那样触发了闪烁位。
表5.5彩色文本方式下可能的位设置
位 值
二进制 十进制 颜色
0000 0 黑色
0001 1 蓝色
0010 2 绿色
0011 3 青色
0100 4 红色
0101 5 品红色
0110 6 棕色
0111 7 白色
二进制 十进制 颜色
1000 8 灰色
1001 9 淡蓝色
1010 10 淡绿色
1011 11 淡青色
1100 12 淡红色
1101 13 淡品色
1110 14 黄色
1111 15 高强度白色
将字符的ASCII码值保存在字符内存位置,并在属性字节中设置其属性后,适配卡
的显示电路图就会产生字符的物量显示。在屏幕上每个字符就转化成一个点模式,该点模
式与显示适配卡所产生的字符相对应。字符是从保存在适配卡中的ROM字符发生器内
的数据转化而来的。 EGA和VGA卡也使程序员能够指定另外的用户—限定字符设置
用于字符显示。
除了单色和彩色文本显示,还有两种其它类型的文本显示。它们之间的区别在于每行
所显示的字符数。
有些显示适配卡每行能显示40或80个字符。基本的视频显示格式是80*25每屏
幕。因为40列格式通常只有当视频显示器是合成电视设备(在这种设备中每行40个字符
是大致可以阅读的)时才是有用的,所以本书的着重点放在80列格式上,它能与标准的
80*244计算机终端显示器紧密匹配。
二、图形式方式显示模式
IBM也提到了图形式方式显示模式,称它是APA,或称为所有点可以定位的方式,在
图形模式中,每个屏幕象素都由一系列的内存位所规定。每个位指示象素打开或关闭以及
是什么颜色。用于每个象素的位数决定于显示适配卡类型以及正在使用的图形方式。例
如,EGA系统能从64种颜色的调色板上显示16种颜色。要指示出某个特定象素应该是
其中的哪种颜色,那么需要4个位。每个象素所需的位数可由下列等式表示:
位数=log(颜色数)/log(2)
颜色数即是代表的颜色数,位数是所需的位数。对于每个EGA,屏幕象素任何时候有
16种颜色,那么它的等式就是:
87页
位数=log(16)/log(2)=1.20412/0.301003=4位
图形显示屏幕的分辨率(参见5.21)用象素来表示,有水平和垂直两个分辨率。例如,
表5.2列举的模式0Eh的分辨率为640*200,即宽640个象素,深200个扫描行(象素)。
这个数目表示显示屏幕总共有128000个象素。当进行图形方面的工作时,请记住分辨率、
有效颜色和内存需要量之间的关系。
5.2.3.识别视频显示适配卡
尽管已达到共识认为:运行优良的DOS应用程序应该使用BIOS,或者最好使用DOS
功能去操纵视频,但有时候是必须将规则手册和程序置之于脑后。例如,使用BIOS视频
功能阅读并书写象素到屏幕上,从而编写一个油漆刷程序。但是,如果知道正在使用的是
哪一个视频适配卡,那么就可以直接编写视频控制器程序,这会导致速度的戏剧性提高。
虽然有关单个视频适配卡的详细编程超出了本书的范围,但是确定出现的是哪一个视频
适配卡并未超出此范围。
本节列举了识别下述显示适配卡类型的一系列过程: