240629 PS/55エミュ製作 [33]リファレンスディスケットの起動に成功
PCemで2HDフォーマットのフロッピーからブートすると途中でDOSのロードが止まる問題の続き。
PCemはDOSBoxほどのデバッグ機能がないから、自分で割り込み発生時のレジスタをダンプしたり、特定アドレス上のメモリーへの変更を検出するコードを書かなければならなかった。BIOSを逆アセンブルしながらPS/2の色んなモデルのTechnical Referenceやフロッピーディスクコントローラー (FDC) のデータシートを見比べること約1週間弱。PS/2とPS/55で逆アセンブルしたコードを比較していたら、ついに原因が分かった。
原因はBIOS ROM上でかなり最初の方に実行されるFDCの初期化プログラムで、PS/2には存在しない(今まで読んだどのドキュメントにも書かれていない)I/Oポートを操作してFIFOバッファーをテストしていたことが分かった。初期化プログラムはI/Oポート3F3hのビット2に1をセットして、I/Oポート3F5hに7から0まで8バイトを書いた後、同じI/Oポート3F5hから1バイトずつ読んで7から0まで一致することをテストしていた。
I/Oポート3F3hはIBM PC互換機ではあまり使用例がない。PS/2の1990年版Technical Referenceによれば、Type 2 Controller(2EDをサポートするディスケット・ドライブ・コントローラー)で使われているが、今回のPS/55とは違う意味が割り当てられている。
Drive Status Register (Hex 03F3 Read)
Bit | Function
----|-----------------
7,6 | Media Type 1,0
5,4 | Drive Type 1,0
3,2 | Start-UP Map 1,0
1,0 | Reserved
Bit 3 | Bit 2 | Start-Up Drive
------|-------|---------------
0 | 0 | Bay A
0 | 1 | Second Drive
1 | 0 | Third Drive
1 | 1 | Reserved
FDCは実機ではNEC μPD72065Lが使われている。データシートにはこのFDCがFIFOバッファーを持っているという情報はないので、システムボード上の他のチップ(周辺回路)に独自で実装されているのか?モデル5550-S/T/Vの技術解説書にはディスケット・コントローラーの説明はないので分からない。
PCemでは最大16バイトのFIFOバッファーを持つIntel 82077をエミュレートしているので、このコードを流用すれば実装はすぐにできる。
やったー!これをやって、ようやくリファレンスディスケットから起動できるようになった!このプログラムはDOS/Vベースなので、これでDOS/V本体も動作するということが分かる。
まだ日本語キーボードもディスプレイアダプターも実装していない。やっとこれでスタート地点に立った。あとはDOSVAXのコードをPCemに移植するだけだが、先の道のりやゴールは見えているとはいえ、根本から構造が違うコードを移植するとなると長く険しい道だろうな。