7 绘制矩形(harib01g)

颜色备齐了,下面我们来画“画”吧。首先从VRAM与画面上的“点”的关系开始说起。在当前画面模式中,画面上有320×200(=64000)个像素。假设左上点的坐标是(0,0),右下点的坐标是(319,199),那么像素坐标(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;
}

这次新出现了#define声明方式,它用来表示常数声明。要记住哪种色号对应哪种颜色实在太麻烦了,所以为了便于理解,做了以上声明。