第 5 章に突入。
指定した位置のピクセルを黒くするという内容。まさにビットマップフォント・・・。いわゆる “半角” になっていて、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 つ見えておりますという状態。
あとは写経して処理を繋げると、
となって、文字の絵が出るようになる。
day05c(〜p.126)は終わり。