らんだむな記憶

blogというものを体験してみようか!的なー

みかん日記 (10)

第 5 章に突入。

f:id:derwind:20210523025458p:plain:w300

指定した位置のピクセルを黒くするという内容。まさにビットマップフォント・・・。いわゆる “半角” になっていて、MS 明朝的な感じだなぁ。
この後の章でも色んなものがアスキーアートで描かれていて、まぁそうか・・・と思うと共に、意外と地味な感じだな・・・という気持ちが。一般の OS の場合だとマウスカーソルを変更できたりするので、ハードコーディングってわけでもないのだろうけど、デフォルトのはハードコードされていたりするのかな?

day05a(〜p.121)は終わり。

*****

基本的に写経するだけ。だが・・・

ld.lld: error: undefined symbol: __cxa_pure_virtual

が出た。Mac で始める「ゼロからのOS自作入門」 - Qiita によると

extern "C" void __cxa_pure_virtual() {
  while (1) __asm__("hlt");
}

を定義したら良いとのことだが、なんかそれも変な気がするし、オフィシャル実装はそうなっていない。何種類か試したところ、

[graphics.hpp]

class PixelWriter {
 public:
  PixelWriter(const FrameBufferConfig& config)
    : config_(config)
  {}
  virtual ~PixelWriter() = default;
  virtual void Write(int x, int y, const PixelColor& c) = 0;

 protected:
  uint8_t* PixelAt(int x, int y);

 private:
  const FrameBufferConfig& config_;
};

にように、コンストラクタの実装もヘッダに移動させたら解決した。なんかシックリこないな・・・。

day05b(〜p.123)は終わり。

*****

グリフデータを増やすために東雲フォントを使う。

curl http://openlab.ring.gr.jp/efont/dist/shinonome/shinonome-0.9.11p1.tar.bz2 -o shinonome-0.9.11p1.tar.bz2
tar xvfj shinonome-0.9.11p1.tar.bz2

でダウンロード & 展開すると沢山の bdf ファイルが出てくる。D.6 BDF形式 がフォーマットの参考になる。
8x16 の bdf を使うという前提で決め打ちで以下のようなスクリプトを作る:

[bdf2ascii.py]

import sys

def main():
    bdf_file = sys.argv[1]

    with open(bdf_file) as fin:
        bitmap_data = False
        for line in fin.readlines():
            line = line.rstrip()
            if line.startswith("ENCODING"):
                code = int(line.split(" ")[-1])
                print(f"0x{code:02x} '{chr(code)}'")
            elif line == "BITMAP":
                bitmap_data = True
                continue
            if bitmap_data:
                if line == "ENDCHAR":
                    print()
                    bitmap_data = False
                    continue
                data = int(line, 16)
                print(f"{data:08b}".replace("0", ".").replace("1", "@"))

if __name__ == "__main__":
    main()

これを使って

python bdf2ascii.py shnm8x16a.bdf > hankaku.txt

をすれば細かいことを除いてほとんど同じ結果を得られる。
手順通りに作成した hankaku.o はまったくよく理解できていないが

objdump  -CxS -M intel --prefix-addresses hankaku.o

hankaku.o:     ファイル形式 elf64-x86-64
hankaku.o
アーキテクチャ: i386:x86-64, フラグ 0x00000010:
HAS_SYMS
開始アドレス 0x0000000000000000

セクション:
Idx Name          Size      VMA               LMA               File off  Algn
  0 .data         00001000  0000000000000000  0000000000000000  00000040  2**0
                  CONTENTS, ALLOC, LOAD, DATA
SYMBOL TABLE:
0000000000000000 l    d  .data  0000000000000000 .data
0000000000000000 g       .data  0000000000000000 _binary_hankaku_bin_start
0000000000001000 g       .data  0000000000000000 _binary_hankaku_bin_end
0000000000001000 g       *ABS*  0000000000000000 _binary_hankaku_bin_size

という内容になっている。.data セクションにグローバル変数としてデータが 2 つ・・・と、*ABS* ?とやらに 1 つ見えておりますという状態。

あとは写経して処理を繋げると、

f:id:derwind:20210523224927p:plain:w300

となって、文字の絵が出るようになる。

day05c(〜p.126)は終わり。