6 显示字符串(harib02f)

仅仅显示6个字符,就要写这么多代码,实在不太好看。

putfont8(binfo->vram, binfo->scrnx,  8, 8, COL8_FFFFFF, hankaku + 'A' * 16);
putfont8(binfo->vram, binfo->scrnx, 16, 8, COL8_FFFFFF, hankaku + 'B' * 16);
putfont8(binfo->vram, binfo->scrnx, 24, 8, COL8_FFFFFF, hankaku + 'C' * 16);
putfont8(binfo->vram, binfo->scrnx, 40, 8, COL8_FFFFFF, hankaku + '1' * 16);
putfont8(binfo->vram, binfo->scrnx, 48, 8, COL8_FFFFFF, hankaku + '2' * 16);
putfont8(binfo->vram, binfo->scrnx, 56, 8, COL8_FFFFFF, hankaku + '3' * 16);

所以笔者打算制作一个函数,用来显示字符串。既然已经学到了目前这一步,做这样一个函数也没什么难的。嗯,开始动手吧……好,做完了。

void putfonts8_asc(char *vram, int xsize, int x, int y, char c, unsigned char *s)
{
    extern char hankaku[4096];
    for (; *s ! = 0x00; s++) {
        putfont8(vram, xsize, x, y, c, hankaku + *s * 16);
        x += 8;
    }
    return;
}

C语言中,字符串都是以0x00结尾的,所以可以这么写。函数名带着asc,是为了提醒笔者字符编码使用了ASCII。

这里还要再说明一点,所谓字符串是指按顺序排列在内存里,末尾加上0x00而组成的字符编码。所以s是指字符串前头的地址,而使用*s就可以读取字符编码。这样,仅利用下面这短短的一行代码就能够达到目的了。

putfonts8_asc(binfo->vram, binfo->scrnx, 8, 8, COL8_FFFFFF, "ABC 123");

试试看吧。……顺利运行了。

我们再稍微加工一下,……好,完成了。

整理后的HariMain

void HariMain(void)
{
    struct BOOTINFO *binfo = (struct BOOTINFO *) 0x0ff0;
    init_palette();
    init_screen(binfo->vram, binfo->scrnx, binfo->scrny);
    putfonts8_asc(binfo->vram, binfo->scrnx,  8,  8, COL8_FFFFFF, "ABC 123");
    putfonts8_asc(binfo->vram, binfo->scrnx, 31, 31, COL8_000000, "Haribote OS.");
    putfonts8_asc(binfo->vram, binfo->scrnx, 30, 30, COL8_FFFFFF, "Haribote OS.");
    for (; ; ) {
        io_hlt();
    }
}