先说一下,这个技术已经淘汰了,没人用了,除非你必须用 TC,否则不学也罢。TC / BC 泛指 Turbo C 2.0、Turbo C 3.0 和 Borland C 3.1,他们都是 dos 时代的编程工具,用的都是 Borland 公司的 BGI 绘图库。
另外就是,我只是简单介绍一下,想要完全看明白得参考很多上个世纪的书,我就不过多的详细描述了,能看懂多少算多少吧。
我只拿 VGA / VGAHI 这个模式来举例子。
在 dos 下,常规内存只有 640k,显存映射于 640k 以外的 0A0000H~0AFFFFH (只有 64k),在这个地址内写数据,可以直接在屏幕上显示出来。
VGAHI 是 640 x 480 @ 16 色,占 4 个位面,共需内存 256k,需要指定 0A0000H~0AFFFFH 映射哪个(些)位面。通过端口 0x3c4 / 0x3c5 设置位面。代码如下:
outportb(0x3c4, 2);
outportb(0x3c5, 位面);
其中,“位面”的低 4 位,由低到高分别表示蓝、绿、红、加亮。例如,想画加亮的蓝色,可以设置位面为 9:
outportb(0x3c4, 2);
outportb(0x3c5, 9);
选择好位面后,直接向 0xA0000 写入数据,即可将数据写入到显存的指定位面上。每个字节有 8 位,因此写入一个字节可以控制 8 个点。
以下是个完整的例子,实现在 (0, 0) 的位置画一个红点,在 (0, 1)-(7, 1) 的位置画 8 个黄点:
// 程序名称:直接操作显存的范例程序
// 编译环境:Borland C++ 3.1
//
#include <graphics.h>
#include <conio.h>
void main()
{
// 初始化图形模式为 640 x 480 @ 16
int gd=VGA, gm=VGAHI;
initgraph(&gd, &gm, "c:\\borlandc\\bgi");
// 设置显存指针
unsigned char far *v = (char far *)0xA0000000L;
outportb(0x3c4, 2);
outportb(0x3c5, 4); // 启用红色位面
v[0] = 0x80; // 画 1 个点
outportb(0x3c5, 0xe); // 启用绿色、红色、加亮三个位面
v[80] = 0xff; // 画 8 个点
// 按任意键退出
getch();
closegraph();
}
最后,我还是得说一句:时代不同了,真的,学这些真的一点用都没有。与其用这些繁琐的东西实现 TC 下的特殊效果,不如看看 EasyX 吧。
评论