您的位置:首页 > 其它

《30天自制操作系统》笔记(04)——显示器256色

2014-05-25 14:54 351 查看
《30天自制操作系统》笔记(04)——显示器256色

进度回顾

从最开始的(01)篇上一篇为止,已经解决了开发环境问题和OS项目的顶层设计问题。

本篇做一个小练习:设置显卡显示256色。

原理

设置显卡模式

调用BIOS中断命令INT 0x10,设置显卡模式为VGA图形模式,320*200*8位彩色模式,调色板模式。代码如下。

MOV        AL,0x13            ; VGA图形模式,320*200*8位彩色模式
MOV        AH,0x00
INT        0x10


设置调色板

256色的调色板是这样一个东西:有256个编号,每个编号对应一个颜色。设置的时候,我说“1号颜色为#FFFFFF,2号颜色为#FFFFCC,……”,显卡会保存这些设置。需要用的时候,我说“把位置A设置为x号颜色(1≤x≤256),把位置B设置为y号颜色(1≤y≤256),……”。

void init_palette(void)
{
static unsigned char table_rgb[256 * 3] = {
0xFF, 0xFF, 0xFF,
0xFF, 0xFF, 0xCC,
0xFF, 0xFF, 0x99,
0xFF, 0xFF, 0x66,
0xFF, 0xFF, 0x33,
0xFF, 0xFF, 0x00,
0xFF, 0xCC, 0xFF,
0xFF, 0xCC, 0xCC,
0xFF, 0xCC, 0x99,
0xFF, 0xCC, 0x66,
0xFF, 0xCC, 0x33,
0xFF, 0xCC, 0x00,
0xFF, 0x99, 0xFF,
0xFF, 0x99, 0xCC,
0xFF, 0x99, 0x99,
0xFF, 0x99, 0x66,
0xFF, 0x99, 0x33,
0xFF, 0x99, 0x00,
0xFF, 0x66, 0xFF,
0xFF, 0x66, 0xCC,
0xFF, 0x66, 0x99,
0xFF, 0x66, 0x66,
0xFF, 0x66, 0x33,
0xFF, 0x66, 0x00,
0xFF, 0x33, 0xFF,
0xFF, 0x33, 0xCC,
0xFF, 0x33, 0x99,
0xFF, 0x33, 0x66,
0xFF, 0x33, 0x33,
0xFF, 0x33, 0x00,
0xFF, 0x00, 0xFF,
0xFF, 0x00, 0xCC,
0xFF, 0x00, 0x99,
0xFF, 0x00, 0x66,
0xFF, 0x00, 0x33,
0xFF, 0x00, 0x00,
0x66, 0xFF, 0xFF,
0x66, 0xFF, 0xCC,
0x66, 0xFF, 0x99,
0x66, 0xFF, 0x66,
0x66, 0xFF, 0x33,
0x66, 0xFF, 0x00,
0x66, 0xCC, 0xFF,
0x66, 0xCC, 0xCC,
0x66, 0xCC, 0x99,
0x66, 0xCC, 0x66,
0x66, 0xCC, 0x33,
0x66, 0xCC, 0x00,
0x66, 0x99, 0xFF,
0x66, 0x99, 0xCC,
0x66, 0x99, 0x99,
0x66, 0x99, 0x66,
0x66, 0x99, 0x33,
0x66, 0x99, 0x00,
0x66, 0x66, 0xFF,
0x66, 0x66, 0xCC,
0x66, 0x66, 0x99,
0x66, 0x66, 0x66,
0x66, 0x66, 0x33,
0x66, 0x66, 0x00,
0x66, 0x33, 0xFF,
0x66, 0x33, 0xCC,
0x66, 0x33, 0x99,
0x66, 0x33, 0x66,
0x66, 0x33, 0x33,
0x66, 0x33, 0x00,
0x66, 0x00, 0xFF,
0x66, 0x00, 0xCC,
0x66, 0x00, 0x99,
0x66, 0x00, 0x66,
0x66, 0x00, 0x33,
0x66, 0x00, 0x00,
0xCC, 0xFF, 0xFF,
0xCC, 0xFF, 0xCC,
0xCC, 0xFF, 0x99,
0xCC, 0xFF, 0x66,
0xCC, 0xFF, 0x33,
0xCC, 0xFF, 0x00,
0xCC, 0xCC, 0xFF,
0xCC, 0xCC, 0xCC,
0xCC, 0xCC, 0x99,
0xCC, 0xCC, 0x66,
0xCC, 0xCC, 0x33,
0xCC, 0xCC, 0x00,
0xCC, 0x99, 0xFF,
0xCC, 0x99, 0xCC,
0xCC, 0x99, 0x99,
0xCC, 0x99, 0x66,
0xCC, 0x99, 0x33,
0xCC, 0x99, 0x00,
0xCC, 0x66, 0xFF,
0xCC, 0x66, 0xCC,
0xCC, 0x66, 0x99,
0xCC, 0x66, 0x66,
0xCC, 0x66, 0x33,
0xCC, 0x66, 0x00,
0xCC, 0x33, 0xFF,
0xCC, 0x33, 0xCC,
0xCC, 0x33, 0x99,
0xCC, 0x33, 0x66,
0xCC, 0x33, 0x33,
0xCC, 0x33, 0x00,
0xCC, 0x00, 0xFF,
0xCC, 0x00, 0xCC,
0xCC, 0x00, 0x99,
0xCC, 0x00, 0x66,
0xCC, 0x00, 0x33,
0xCC, 0x00, 0x00,
0x33, 0xFF, 0xFF,
0x33, 0xFF, 0xCC,
0x33, 0xFF, 0x99,
0x33, 0xFF, 0x66,
0x33, 0xFF, 0x33,
0x33, 0xFF, 0x00,
0x33, 0xCC, 0xFF,
0x33, 0xCC, 0xCC,
0x33, 0xCC, 0x99,
0x33, 0xCC, 0x66,
0x33, 0xCC, 0x33,
0x33, 0xCC, 0x00,
0x33, 0x99, 0xFF,
0x33, 0x99, 0xCC,
0x33, 0x99, 0x99,
0x33, 0x99, 0x66,
0x33, 0x99, 0x33,
0x33, 0x99, 0x00,
0x33, 0x66, 0xFF,
0x33, 0x66, 0xCC,
0x33, 0x66, 0x99,
0x33, 0x66, 0x66,
0x33, 0x66, 0x33,
0x33, 0x66, 0x00,
0x33, 0x33, 0xFF,
0x33, 0x33, 0xCC,
0x33, 0x33, 0x99,
0x33, 0x33, 0x66,
0x33, 0x33, 0x33,
0x33, 0x33, 0x00,
0x33, 0x00, 0xFF,
0x33, 0x00, 0xCC,
0x33, 0x00, 0x99,
0x33, 0x00, 0x66,
0x33, 0x00, 0x33,
0x33, 0x00, 0x00,
0x99, 0xFF, 0xFF,
0x99, 0xFF, 0xCC,
0x99, 0xFF, 0x99,
0x99, 0xFF, 0x66,
0x99, 0xFF, 0x33,
0x99, 0xFF, 0x00,
0x99, 0xCC, 0xFF,
0x99, 0xCC, 0xCC,
0x99, 0xCC, 0x99,
0x99, 0xCC, 0x66,
0x99, 0xCC, 0x33,
0x99, 0xCC, 0x00,
0x99, 0x99, 0xFF,
0x99, 0x99, 0xCC,
0x99, 0x99, 0x99,
0x99, 0x99, 0x66,
0x99, 0x99, 0x33,
0x99, 0x99, 0x00,
0x99, 0x66, 0xFF,
0x99, 0x66, 0xCC,
0x99, 0x66, 0x99,
0x99, 0x66, 0x66,
0x99, 0x66, 0x33,
0x99, 0x66, 0x00,
0x99, 0x33, 0xFF,
0x99, 0x33, 0xCC,
0x99, 0x33, 0x99,
0x99, 0x33, 0x66,
0x99, 0x33, 0x33,
0x99, 0x33, 0x00,
0x99, 0x00, 0xFF,
0x99, 0x00, 0xCC,
0x99, 0x00, 0x99,
0x99, 0x00, 0x66,
0x99, 0x00, 0x33,
0x99, 0x00, 0x00,
0x00, 0xFF, 0xFF,
0x00, 0xFF, 0xCC,
0x00, 0xFF, 0x99,
0x00, 0xFF, 0x66,
0x00, 0xFF, 0x33,
0x00, 0xFF, 0x00,
0x00, 0xCC, 0xFF,
0x00, 0xCC, 0xCC,
0x00, 0xCC, 0x99,
0x00, 0xCC, 0x66,
0x00, 0xCC, 0x33,
0x00, 0xCC, 0x00,
0x00, 0x99, 0xFF,
0x00, 0x99, 0xCC,
0x00, 0x99, 0x99,
0x00, 0x99, 0x66,
0x00, 0x99, 0x33,
0x00, 0x99, 0x00,
0x00, 0x66, 0xFF,
0x00, 0x66, 0xCC,
0x00, 0x66, 0x99,
0x00, 0x66, 0x66,
0x00, 0x66, 0x33,
0x00, 0x66, 0x00,
0x00, 0x33, 0xFF,
0x00, 0x33, 0xCC,
0x00, 0x33, 0x99,
0x00, 0x33, 0x66,
0x00, 0x33, 0x33,
0x00, 0x33, 0x00,
0x00, 0x00, 0xFF,
0x00, 0x00, 0xCC,
0x00, 0x00, 0x99,
0x00, 0x00, 0x66,
0x00, 0x00, 0x33,
0x00, 0x00, 0x00
};
set_palette(0, 255, table_rgb);
return;

/* static char 命令は、データにしか使えないけどDB命令相当 */
}

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;
}


设置调色板

设置要显示的内容

在bootpack.c的主函数里设置内存0x000a0000~0x000affff的内容,显卡就会对应更新要显示的内容。

void HariMain(void)
{
int i;
char *p;
int unit = (0xaffff - 0xa0000 + 1) / 256;
int color;
init_palette();

p = (char *) 0xa0000;

for (i = 0; i <= 0xffff; i++) {
color = (i + 1) / unit;
p[i] = (char)color;
}

for (;;) {
io_hlt();
}
}


总结

效果如下图所示。



这只是一个小练笔,以后会用真正的操作系统功能(内存管理、多任务、窗口)代替这个调色板demo。

点此查看下一篇30天自制操作系统》笔记(05)——启用鼠标键盘》
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: