一、颜色配置
void init_palette(void)
{
static unsigned char table_rgb[16 * 3] = {
0x00, 0x00, 0x00, /* 0:黒 */
0xff, 0x00, 0x00, /* 1:明るい赤 */
0x00, 0xff, 0x00, /* 2:明るい緑 */
0xff, 0xff, 0x00, /* 3:明るい黄色 */
0x00, 0x00, 0xff, /* 4:明るい青 */
0xff, 0x00, 0xff, /* 5:明るい紫 */
0x00, 0xff, 0xff, /* 6:明るい水色 */
0xff, 0xff, 0xff, /* 7:白 */
0xc6, 0xc6, 0xc6, /* 8:明るい灰色 */
0x84, 0x00, 0x00, /* 9:暗い赤 */
0x00, 0x84, 0x00, /* 10:暗い緑 */
0x84, 0x84, 0x00, /* 11:暗い黄色 */
0x00, 0x00, 0x84, /* 12:暗い青 */
0x84, 0x00, 0x84, /* 13:暗い紫 */
0x00, 0x84, 0x84, /* 14:暗い水色 */
0x84, 0x84, 0x84 /* 15:暗い灰色 */
};
set_palette(0, 15, table_rgb);
return;
/* static char 命令は、データにしか使えないけどDB命令相当 */
}
上述代码是定义了16种颜色(16种颜色足够了)。二维数组table_rgb[16 * 3]中,16代表的是16种颜色,3是每种颜色的三个元素值(三个元素值分别对应RGB数值)
void set_palette(int start, int end, unsigned char *rgb)
{
int i, eflags;
eflags = io_load_eflags(); /* 割り込み許可フラグの値を記録する */
io_cli(); /* 許可フラグを0にして割り込み禁止にする */
io_out8(0x03c8, start);
for (i = start; i <= end; 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;
}
上述代码是c调用汇编语言实现了对调色板的访问。把定义的16种颜色写入调色板。
_io_in8: ; int io_in8(int port);
MOV EDX,[ESP+4] ; 把port的数值赋值给EDX(数据寄存器)
MOV EAX,0 ; EAX寄存器:EAX称为累加器
IN AL,DX ; 将端口为 DX 的寄存器的内容送给AL寄存器
RET ; 当⼦程序执⾏完时,需要返回到调⽤它的程序之中。
_io_out8: ; void io_out8(int port, int data);
MOV EDX,[ESP+4] ; 把port的数值赋值给EDX(数据寄存器)
MOV AL,[ESP+8] ; 将data数值赋值给AL寄存器
OUT DX,AL ; 将 AL 的数据传给地址端口为 DX 的寄存器
RET ; 当⼦程序执⾏完时,需要返回到调⽤它的程序之中。
二、画面颜色设置
我们这里使用的是0x13。
VRAM值从0~15分别对应第一章节里设置的16种颜色。
VRAM地址和画面的对应关系如下图