2014年10月16日木曜日

[OS作成]30日でできる!OS自作入門 5日目 (3)

extern char hankaku_font[16 * 256];
で各文字のイメージを取得できるようになったので、
  • 一文字を描画する関数 draw_char 
  • 文字列を描画する関数 draw_string 
を作成し、画面に文字列を描画できるようにした。
void Main(void) {
..snip..
  draw_string(bootInfo->vram, bootInfo->scrnx, 8, 8, "ABC 123", COLOR_WHITE);
  draw_string(bootInfo->vram, bootInfo->scrnx, 31, 31, "Tiny OS.", COLOR_BLACK);
  draw_string(bootInfo->vram, bootInfo->scrnx, 32, 32, "Tiny OS.", COLOR_WHITE);
..snip..
}

void draw_char(char *vram, int width,  int x, int y, char c, char color) {
  int i, j;
  char img;
  char *vram_aux;
  char *font;
  font = hankaku_font + c * 16;
  vram += y * width + x;
  for (i = 0; i < 16; i++) {
    img = font[i];
    for (j = 0; j < 8; j++) {
      if ((img & 0x80) != 0)
    vram[j] = color;
      img <<= 1;
    }
    vram += width;
  }
}

void draw_string(char *vram, int width, int x, int y, char *string, char color) {
  char c;
  while ((c = *(string++)) != 0) {
    draw_char(vram, width, x, y, c, color);
    x += 8;
  }
}


次は変数の値をsprintfで表示できるようにするのだけど、sprintfを作るのは面倒なので、Haribote OSのものをそのまま使うことにしよう。