7 绘制矩形(harib01g)
颜色备齐了,下面我们来画“画”吧。首先从VRAM与画面上的“点”的关系开始说起。在当前画面模式中,画面上有320×200(=64 000)个像素。假设左上点的坐标是(0,0),右下点的坐标是(319,319),那么像素坐标(x,y)对应的VRAM地址应按下式计算。
0xa0000 + x + y * 320
其他画面模式也基本相同,只是0xa0000这个起始地址和y的系数320有些不同。
根据上式计算像素的地址,往该地址的内存里存放某种颜色的号码,那么画面上该像素的位置就出现相应的颜色。这样就画出了一个点。继续增加x的值,循环以上操作,就能画一条长长的水平直线。再向下循环这条直线,就能够画很多的直线,组成一个有填充色的长方形。
根据这种思路,我们制作了函数boxfill8。源程序就是bootpack.c。并且在程序HariMain中,我们不再画条纹图案,而是使用这个函数3次,画3个矩形。也不知能不能正常运行,我们来“make run”看看。哦,好像成功了。
本次的bootpack.c节选
#define COL8_000000 0
#define COL8_FF0000 1
#define COL8_00FF00 2
#define COL8_FFFF00 3
#define COL8_0000FF 4
#define COL8_FF00FF 5
#define COL8_00FFFF 6
#define COL8_FFFFFF 7
#define COL8_C6C6C6 8
#define COL8_840000 9
#define COL8_008400 10
#define COL8_848400 11
#define COL8_000084 12
#define COL8_840084 13
#define COL8_008484 14
#define COL8_848484 15
void HariMain(void)
{
char *p; /* p变量的地址 */
init_palette(); /* 设置调色板 */
p = (char *) 0xa0000; /* 将地址赋值进去 */
boxfill8(p, 320, COL8_FF0000, 20, 20, 120, 120);
boxfill8(p, 320, COL8_00FF00, 70, 50, 170, 150);
boxfill8(p, 320, COL8_0000FF, 120, 80, 220, 180);
for (;;) {
io_hlt();
}
}
void boxfill8(unsigned char *vram, int xsize, unsigned char c, int x0, int y0, int x1, int y1)
{
int x, y;
for (y = y0; y <= y1; y++) {
for (x = x0; x <= x1; x++)
vram[y * xsize + x] = c;
}
return;
}
画了3个矩形哦
这次新出现了#define声明方式,它用来表示常数声明。要记住哪种色号对应哪种颜色实在太麻烦了,所以为了便于理解,做了以上声明。