显示硬件基础 进行TC256色图形编程时,是直接与显卡硬件在打交道。那么,就让我们从显卡谈起吧。 显示卡(adapter)是一块插在PC主机的电路版。一般显示卡由寄存器、存储器(显示RAM和ROM BIOS)、控制电路三大部分组成。随着PC机的发展,PC机的显示系统经历了由CGA、EGA、VGA、SVGA到现在的VESA系列的发展过程。 在早期的显示系统中,CGA、EGA等显示卡配置的显示器是严格配套的,一种显卡只与一种显示器匹配使用。随着技术的发展,出现了可变频的显示器,它使用自动跟踪技术,同一显示器可以适应CGA、EGA、VGA等各种显示卡。这使得我们用TC操作显示卡模拟VESA工作模式成为可能。 颜色和灰度是衡量显示系统的又一重要参数。最初的彩色显示系统CGA只能显示固定的16种颜色,到EGA时可以使用64种颜色种的16种颜色,而发展到VGA时可以使用256K种颜色中的16种颜色,现在的显示卡甚至可以支持到32位真彩色并使用所有颜色。颜色与灰度的发展受显示内存的限制。在16色模式中,一个像素点只需要log2 16=4位内存即半个字节;而在256色模式中,一个像素点则要占log2 256=8位即一个字节;在16位真彩色模式下,一个像素要占用整整两个字节。所以,在CGA高分辨率方式下,只能同时使用两种颜色,因为640*200*1/8 = 16000(byte)接近16k。而到了VGA,实现640*480分辨率16种颜色时,由于一个像素有16种颜色,最少需要占4位,因此,需要内存640*480*4/8 = 153600(byte)≈ 150k。 此外,RAM的扩大还受到PC机中留作显示用的地址空间的限制,一般不超过64K。因为,当使用大于64K的地址空间时,通过PC机访问显示缓冲区的控制就变得较为复杂了(使用换页机制)。 现在的显卡可以兼容多种显示模式,因此,显卡在固化的ROM BIOS中为每一种模式分配了一个代号。用户在使用PC机编程时,直接输入该代号,再通过显示卡的BIOS调用即可使用此种模式。 通常,显示模式号<0x14的是标准模式,其它的为非标准模式,非标准模式因显示卡的不同而不同。 1.下表列举了所有的标准字符模式:<点击此处> 2.下表列举了所有的标准图形模式:<点击此处> 3.非标准字符模式: 这类字符模式一般与某种显卡有关,其模式号由某类生产厂家自行确定。这类显示模式的行列变化范围都比较大,但均超出25行*80列的范围。 4.非标准图形模式: 非标准的图形模式也是变化多样的,但每个卡的特点主要体现在这些图形模式中。下表介绍了常见的非标准图形模式:<点击此处> 显示缓冲区与颜色定义 PC机的显示卡上的RAM存储器中的数据按照显示器显示格式进行存储。我们知道,计算机只能以二进制方式存储数据,每位有两种状态(0与1)。对于单色显示器,内存中只需存放一张表,表中每一位对应屏幕上一个像素点,该位为1则表示该点是亮点。而对于彩色显卡来,要表示屏幕上像素点的信息,仅用一为就不够了。对于显示16色的显示模式,就需4位定义一种颜色。到了EGA显示卡时,已经开始有了显示卡兼容性。在VGA模式时由于颜色较多,分辨率提高带来点数的增加,所需要的显存增大,从而出现了一种以“彩色位平面”的存储结构来表示颜色信息。CGA400、CEGA、CH、VGA均采用彩色位平面的存储结构。一般VGA的基本配置有256K的显示缓冲区(BANK A)。当支持16种以下的颜色时,使用存储位平面结构,此时256K的显示缓冲区被分位4个64K的存储位平面,屏幕上的一个点,由存储位平面的各一位组合后表示,最多表示16种颜色。当支持256种颜色时,要使用线性内存结构,4个存储位平面线性链接,形成256K的线性内存(Linear system)。 在使用16色和256色模式显示时,需要一张颜色表,以将显存的数据“翻译”为屏幕上的点信息。所谓颜色表,就是我们通常所指的“调色板”。当显示器要显示屏幕上的一个点时,先由显示卡将显存中的数据读出,然后对照颜色表,得到一组RGB颜色信息,然后调整显示器的射线管,在屏幕相应位置显示一个点。当显存中所有的点都显示后,就得到我们所看到的图像。用户还可以根据自己显示的需要,更改颜色表的RGB对应值,得到我们自定义的颜色。 在显示模式到了真彩色级别时,由于显示内存中存储的已经是像素点的RGB信息,因此调色板就变得没有意义。因此,在真彩色模式中,不再需要调色板。 视频BIOS ROM 显示卡都有自己的专用视频BIOS支持。此BIOS是视频控制程序,固化在ROM中,成为显卡的一部分,显示卡上的视频BIOS功能要比PC的视频BIOS强大的多,它除了支持CGA、EGA、VGA等各标准显示模式外,还支持各种专用模式和针对显存的专用操作,可以独立于CPU单独处理显存图像,比如2D变换、3D环境计算等等非常复杂的运算。一般VGA视频BIOS的入口地址在C000H——CFFFFH之间。 |