30日でできるOS自作入門【24日目】
概要
これはMozyの1人アドベントカレンダー 2018 の24日目の記事です。
書こうとした経緯は、こちら
今日の内容
- 矢印記法を使う
- 文字を出力できるようにする
今日やったこと
- 矢印記法を使って書き直す
bootpack.c
void HariMain(void) { struct BOOTINFO *binfo = (struct BOOTINFO *) 0x0ff0; init_palette(); init_screen(binfo->vram, binfo->scrnx, binfo->scrny); for (;;) { io_hlt(); } }
動作は変わらないが、コードはスッキリしたな。
文字を出力できるようにする
ただし、ドット絵的に文字をつくって出力することになる。
書籍によると、文字は 8 x 16 の長方形の画素の集まりでかけるとのことなので、そのようにしてドット絵的に文字を作っていく。
こんな感じ。
◽️◽️◽️◽️◽️◽️◽️◽️
◽️◽️◽️◾️◾️◽️◽️◽️
◽️◽️◽️◾️◾️◽️◽️◽️
◽️◽️◽️◾️◾️◽️◽️◽️
◽️◽️◽️◾️◾️◽️◽️◽️
◽️◽️◾️◽️◽️◾️◽️◽️
◽️◽️◾️◽️◽️◾️◽️◽️
◽️◽️◾️◽️◽️◾️◽️◽️
◽️◽️◾️◽️◽️◾️◽️◽️
◽️◾️◾️◾️◾️◾️◾️◽️
◽️◾️◽️◽️◽️◽️◾️◽️
◽️◾️◽️◽️◽️◽️◾️◽️
◽️◾️◽️◽️◽️◽️◾️◽️
◾️◾️◾️◽️◽️◾️◾️◾️
◽️◽️◽️◽️◽️◽️◽️◽️
◽️◽️◽️◽️◽️◽️◽️◽️
これをそれぞれの行で◽️: 0, ◾️: 1 として 0000000, ... のようにして16進数にすると以下のようになる。
static char font_A[16] = { 0x00, 0x18, 0x18, 0x18, 0x18, 0x24, 0x24, 0x24, 0x24, 0x7e, 0x42, 0x42, 0x42, 0xe7, 0x00, 0x00 };
そして、こうやって作ったデータを8画素書くプログラムを16回回せば1文字かけるのでこんな関数を作る。
bootpack.c
void putfont8(char *vram, int xsize, int x, int y, char c, char *font) { int i; char *p, d /* data */; for (i = 0; i < 16; i++) { p = vram + (y + i) * xsize + x; d = font[i]; if ((d & 0x80) != 0) { p[0] = c; } if ((d & 0x40) != 0) { p[1] = c; } if ((d & 0x20) != 0) { p[2] = c; } if ((d & 0x10) != 0) { p[3] = c; } if ((d & 0x08) != 0) { p[4] = c; } if ((d & 0x04) != 0) { p[5] = c; } if ((d & 0x02) != 0) { p[6] = c; } if ((d & 0x01) != 0) { p[7] = c; } } return; }
ハマりポイント
ドット絵の部分w 手間がかかったw
知ったこと
超久しぶりにドット絵書いた笑
原始的だけど 8 x 16 のドットで英字があらわせると思ったらなかなか面白いな。