最近在研究写一个函数替代Turbo C 中的 graphics.h 中的putpixel(int x, int y, int color)函数,对单个的像素进行颜色设置。
首先,声明一个指向显存首地址的指针
static unsigned char far * videobuf = (unsigned char far *) 0xA0000000L;
其中L,表示长整型,当向显存写入数据时,屏幕相应位置的像素颜色就会改变。
显存中每个地址对应一个像素,因为指针videobuf 每偏移一次,显存地址就偏移8位,所以我们可以一次操作8 个像素。
你可以通过videobuf[0] = 0xff,来让屏幕上的第1到8个像素都显示,也可以通过videobuf[1] = 0x80,让屏幕上的第9个像素显示。
但你会发现,你只能控制像素是否显示,却不能设置像素的颜色,这样是不行滴,完全不符合我们的期望呀,没办法,只能接着找呗。
呼~呼~呼~,在网上划拉了一大圈,还是让我给找到了。
通过outportb()函数,我们可以设置4个颜色面:高亮面(1000),红色面(0100),绿色面(0010), 蓝色面(0001)
outportb(0x3c4,2);//俺也不知道啥作用,好像是告诉硬件要向显存中写入数据
outportb(0x3c5,4);//设置为红色面
videobuf[0] = 0x01;// 屏幕上第1个像素就会显示为红色
以下是各位面的组合和其对应的屏幕显示颜色
outportb(0x3c5, X) 位面组合 对应颜色
X = 0 无 无或黑色
X = 1 蓝面 蓝色
X = 2 绿面 绿色
X = 3 蓝、绿面
X = 4 红面 红色
X = 5 红、蓝 紫色
X = 6 红、绿 黄色
X = 7 红、绿、蓝 灰色
X = 9 亮、蓝 亮蓝色
X = 0xf 或 15 亮、红、绿、蓝 白色