30天自制操作系统
上QQ阅读APP看书,第一时间看更新

8 显示鼠标指针(harib02h)

估计后面的开发速度会更快,那就赶紧趁着这势头再描画一下鼠标指针吧。思路跟显示字符差不多,程序并不是很难。

首先,将鼠标指针的大小定为16×16。这个定下来之后,下面就简单了。先准备16×16=256字节的内存,然后往里面写入鼠标指针的数据。我们把这个程序写在init_mouse_cursor8里。

void init_mouse_cursor8(char *mouse, char bc)
/* 准备鼠标指针(16×16)*/
{
    static char cursor[16][16] = {
        "**************..",
        "*OOOOOOOOOOO*...",
        "*OOOOOOOOOO*....",
        "*OOOOOOOOO*.....",
        "*OOOOOOOO*......",
        "*OOOOOOO*.......",
        "*OOOOOOO*.......",
        "*OOOOOOOO*......",
        "*OOOO**OOO*.....",
        "*OOO*..*OOO*....",
        "*OO*....*OOO*...",
        "*O*......*OOO*..",
        "**........*OOO*.",
        "*..........*OOO*",
        "............*OO*",
        ".............***"
    };
    int x, y;

    for (y = 0; y < 16; y++) {
        for (x = 0; x < 16; x++) {
            if (cursor[y][x] == '*') {
                mouse[y * 16 + x] = COL8_000000;
            }
            if (cursor[y][x] == 'O') {
                mouse[y * 16 + x] = COL8_FFFFFF;
            }
            if (cursor[y][x] == '.') {
                mouse[y * 16 + x] = bc;
            }
        }
    }
    return;
}

变量bc是指back-color,也就是背景色。

要将背景色显示出来,还需要作成下面这个函数。其实很简单,只要将buf中的数据复制到vram中去就可以了。

void putblock8_8(char *vram, int vxsize, int pxsize,
    int pysize, int px0, int py0, char *buf, int bxsize)
{
    int x, y;
    for (y = 0; y < pysize; y++) {
        for (x = 0; x < pxsize; x++) {
            vram[(py0 + y) * vxsize + (px0 + x)] = buf[y * bxsize + x];
        }
    }
    return;
}

里面的变量有很多,其中vram和vxsize是关于VRAM的信息。他们的值分别是0xa0000和320。pxsize和pysize是想要显示的图形(picture)的大小,鼠标指针的大小是16×16,所以这两个值都是16。px0和py0指定图形在画面上的显示位置。最后的buf和bxsize分别指定图形的存放地址和每一行含有的像素数。bxsize和pxsize大体相同,但也有时候想放入不同的值,所以还是要分别指定这两个值。

接下来,只要使用以下两个函数就行了。

init_mouse_cursor8(mcursor, COL8_008484);
putblock8_8(binfo->vram, binfo->scrnx, 16, 16, mx, my, mcursor, 16);

也不知能不能正常运行,试试看。……好,能运行!