ITEEDU

9.3 端口编程

说一句很令大家失望的话,试图通过端口编程控制CGA卡的图形显示并没有什么实际意义,相反,这样做反而会带来麻烦。原因很简单,现在常用的显示卡一般都是VGA、Super VGA或者是一些带有视频加速器的显示卡,绝大多数显示卡只做到了在显示缓冲区一级兼容CGA,在寄存器一级与标准的CGA卡并不兼容。这种现象早在EGA的时代就已经出现,其后设计的显示卡为了全面兼容EGA,也就不得不把这个毛病继承了下来。因此在这样的情况下讨论CGA卡的端口编程也就没什么必要性了。

  当然,问题远不是如此的简单。IBM所推出的显示卡历来是工业界遵循的标准,然而就在IBM搞出的8514卡之后情况就发生了变化。一些曾经按照IBM的标准生产兼容显示卡的厂家相继脱离了IBM,设计出了自己的Super VGA卡,其中比较有名的象Trident VGA,ET3000(EVGA)等。这些显示卡都没有遵循IBM8514的标准,而是各有各的特色。在这些显示卡中,有些设计时考虑了与CGA卡的兼容性,做到了寄存器级兼容IBM CGA,比如EVGA卡。至于现在常用的各种加速卡是否做到了与CGA的完全兼容恐怕就更难说了。

出于这样一些原因,本书将仅对CGA卡上几个关键的寄存器做些简单说明,不再给出程序例,大家可以自己进行实验。如果读者发现自己所用的显示卡确实与CGA卡完全兼容,那么可以利用本书给出的这一点点资料自行编制程序例,以求彻底掌握CGA卡的程序设计。不过最关键的一点还是要提醒大家:通过端口控制CGA卡将使程序丧失可移植性。

有关CGA卡上CRTC寄存器组已经在本书的第六章做了讨论,这一节将讨论CGA卡上另外三个寄存器--方式选择寄存器、颜色选择寄存器与状态寄存器。

(1)方式选择寄存器

这个寄存器可以通过端口3D8H进行存取,它主要用于设定CGA卡的工作模式,各个位的作用都列在表9-2中。

表9-2 方式选择寄存器的位定义
功能描述
0 分辨率转换位。此位为0时设置40x25分辨率,为1时设置80x25分辨率。
1 字符/图形模式转换位。此位为0时设置字符模式,为1时设置320x200图形模式。
2 彩色/黑白模式转换位。此位为0时为彩色模式,为1时为黑白模式。
3 显示允许/禁止位。此位为0时禁止显示,为1时允许显示。
4 此位为1时选择640x200高分辨率模式。
5 闪烁允许/禁止位。此位为0时禁止闪烁,此时背景颜色可以有16种。为1时允许闪烁。
6 未使用。
7 未使用。
(2)颜色选择寄存器

  端口地址是3D9H,这个寄存器可以用于改变屏幕色彩,图形模式下该寄存器的3-0位代表屏幕底色。在字符模式下它的位定义与图形模式下有些差别,3-0位表示屏幕边框颜色,第4位表示字符底色的I值。各个位的定义可以参考表9-3。

表9-3 表9-3 颜色选择寄存器位定义
功    能    描    述
0 边框颜色的B值(字符模式),屏幕底色的B值(图形模式)。
1 边框颜色的G值(字符模式),屏幕底色的G值(图形模式)。
2 边框颜色的R值(字符模式),屏幕底色的R值(图形模式)。
3 边框颜色的加亮位(字符模式),屏幕底色的加亮位(图形模式)。
4 字符模式下为背景颜色的加亮位,置1时为加亮
5 320x200图形模式下用于选择彩色组,为0时选择0号彩色组。
6 未使用。
7 未使用。
 (3)状态寄存器

  这是一个只读寄存器,端口地址是3DAH,各个位的定义列于表9-4中。

表9-4 状态寄存器位定义
功 能 描 述
1 光笔触发置位与否
2 光笔按钮开关状态
3 视频信息输出与否
4 清除光笔锁存器
5 预置光笔锁存器

本章结束语

有关图形程序设计的讨论就到此为止,关键的内容并不是CGA卡的详细的技术细节,而是在于诸如字模、BIOS功能调用、直线算法以及直接写屏等等这些基本的概念。要知道这些基本概念是可以通用于任意一种显示卡上的。