void set_palette(unsigned char *rgb)
{
int i, eflags;
eflags = io_load_eflags();
io_cli();
io_out8(0x03c8, 0);
for (i = 0; i <= 15; i++) {
io_out8(0x03c9, rgb[0] / 4);
io_out8(0x03c9, rgb[1] / 4);
io_out8(0x03c9, rgb[2] / 4);
rgb += 3;
}
io_store_eflags(eflags);
return;
}
为什么
io_out8(0x03c9, rgb[0] / 4);
要除以4?
想起windows程序设计有调色板一节,
显示卡上的调色盘对照表运作过程如下图所示:
在8位显示模式中,每个图素占8位。图素值查询包含256RGB值的对照表的地址。这些RGB值可以正好24位宽,或者小一点,通常是18位宽(即主要的红、绿和蓝各6位)。每种颜色的值都输入到数字模拟转换器,以得到发送给监视器的红、绿和蓝三个模拟信号。