上QQ阅读APP看书,第一时间看更新
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(); } }