mozyのかきおき

mozyの読書感想文や思考置き場

30日でできるOS自作入門【24日目】

f:id:mozy_ok:20181130220523p:plain

概要

これはMozyの1人アドベントカレンダー 2018 の24日目の記事です。

adventar.org

書こうとした経緯は、こちら

mozy-ok.hatenablog.com

今日の内容

  • 矢印記法を使う
  • 文字を出力できるようにする

今日やったこと

  • 矢印記法を使って書き直す

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;
}

f:id:mozy_ok:20181224223205p:plain
やっと文字がかけたw

ハマりポイント

ドット絵の部分w 手間がかかったw

知ったこと

超久しぶりにドット絵書いた笑
原始的だけど 8 x 16 のドットで英字があらわせると思ったらなかなか面白いな。