161005 AXエミュ製作 [3]19ドットROMフォントを実装
MS-DOS付属の外字エディタで半角文字だけ文字化けする現象に非常に悩まされていたのだが、原因は19ドットROMフォントとそれを指すINT 43h割り込みベクタが正しくないことだった。
この外字エディタは全角フォントをCRT BIOSの文字フォント読み込み(Int 10h / AX=5101h)を使って読み込んでグラフィック画面に描画していることは分かったものの、半角フォントは割り込みを経由せず描画しているらしく、それがどんなルーチンなのか追うのに苦労した。画面モード定義で文字の縦のドット数を8ドットや16ドットに変えると、半角文字が正常に表示される代わりに全角文字が崩れることから、ROMから直接フォントを取っている可能性は高いと思っていたが。
解析していくうちに Int 43h (EGA/VGA Graphics Character Font Pointer) というファンクションを見つけた。これに現在の画面モード用の文字フォント(EGA ROM内)へのポインタがあり、グラフィック画面の文字描画に使われることがわかった。DOSBoxの該当のルーチンに、特定の画面モードで19ドットフォントへの割り込みベクタをセットする記述を追加。EGA ROMの生成ルーチンには19ドットフォントを読み込む記述を追加。外字エディタの文字化けを解消できた。
Windows起動時にAXキーボードに送られるコマンド(Out 60h, 05h)の意味は依然分からない。図書館からAXに関する参考書を借りてきたが、そこにはKBD BIOSの記述はあってもキーボード間の通信に関するハードウェアの説明はない。(先のInt 43hについても記述はなかった。使えねぇ)
ひとまずキーボードバッファに0x00を追加したところ、Windowsが正常に起動するようになったので、まあこれでいいんじゃないかと。本当はキーボードの英語・日本語モード切替かカナロック・LEDに関するステータスだと思う。
106キーボード対応とかどうにかしたいことが他にもあったけど、AXキーボードのI/O仕様が分からないこととSDL(1.2系)の制約もあって断念。まあやりたいことは達成したので、これでソースコードをクリーンアップしたらポイしようかと思う。
DOSBoxのデバッグコンソールはとても便利だけど、WindowsのせいかVisual Studioのせいか、SDLやDOSBoxの不具合なのか、コンソールのキー操作がうまくできないのが残念。あと、Visual Studioでステップ実行の停止中にマウスカーソルが激重になるのは何とかならないのか。変数ウォッチがまともにできん。