211121 PS/55エミュ製作 [2]仕様ブラックボックスとの戦い
2年前の挫折に懲りずにPS/55のエミュレーターを作ろうと試行錯誤しているんだけど、仕様がブラックボックスに近いのでマジで苦労している。ストレスが貯まりまくってマックス。あ゛ー投げたい。
DOSBoxの画面描画処理の把握と切り替え方法にふた苦労。グラフィックのレジスタの仕様がブラックボックスで、これもふた苦労。VGAのレジスタの解説書は何度も見直しているけども、全然頭に入ってこない。
ぐちゃぐちゃな画面だが、ここまで持ってくるのに数十時間。これが映っただけで滅茶苦茶嬉しかった。24ドットフォントのテキスト画面が映せただけで歓喜!
内蔵DOSでBIOSレベルではテキストが表示できるようになった(アトリビュート未対応)。ただ、ビデオメモリの内部コードはシフトJISのまま。レジスタは何も実装しとらん。実際の背景色は黒だが、ここでは描画状況を分かりやすくするため青に固定している。
PS/55用のPersonal Editor (バージョン K1.1) が起動するようになった。ただし、表示できるのは起動画面のみ。
肝心のメイン画面はこの通り。
実はディスプレイアダプターのレジスタの構成はVGAと似ているようで、DOSを逆アセしたりステップ実行で追ったりして調べた結果、I/Oハンドラーで割り当てるI/Oのミラーを作って、ネイティブの日本語DOSが起動できるようになった。だが、字がめっちゃ黒い。
実際に日本語DOSを動かすには、Micro Channel関連のI/Oポートを実装してディスプレイアダプターのIDを返すようにする必要があるのと、キーボードIDとスキャンコードセット8Ahの要求に対してACKを返す実装を加える必要がある。
DOS J4.0, J5.0では “BIOS-107 Power off and remove SCSI devices - Too many SCSI devices.” というエラーが出る。EBDA (Extended BIOS Data Area) の実装が必要?これはまだ調査が済んでいない。
画面の縦横比もテキストもぐちゃぐちゃだが、BIOSレベルでなくディスク起動でここまで表示できるようになっただけ希望はある。最低限のレベルまでもうちょっとで到達するんだけどな。
今はビデオメモリ中の全角文字の内部表現を解析中。AX (JEGA) のようなシフトJISコードでもPC-98のようなJISコードでもなく、シフトJISコードを先頭に寄せて詰めたような構造になっているっぽいのだが、よくわからない。IBM公式の解説書には半角文字はJISコードと同じとあるが、全角文字に関しては「フォントバッファー中の表示すべき文字の先頭アドレス」と書いてあるだけで、計算式など具体的なことは書いていない。
と、ここまで書いていて、VZ Editorのソースコードにコード変換のニーモニックを見つけたので、明日はこれを参考に逆変換のコードを書くか。