キーボードコントローラーとディスケットコントローラー (FDC) を実装して、とりあえずDOSが起動するようになった。漢字が豆腐になるなど表示が変だけど、これは意図したとおり。これが表示された瞬間は大喜びだった。
一番の山場はやはりブートローダーだった。IBM 5550のFDCのI/Oアドレス (3F4h, 3F5h) はIBM PCと同じだが、コントロールポート (3E0h) のアドレスとビットの意味が違う。DMAコントローラーのバンクアドレスを指定するI/Oポートの並びもIBM PCと違った。ディスクリードのデータが正しい位置に読み込まれないから、これに気付くまでIPLの解析に時間が掛かった。
IBM 5550用日本語DOSのディスケットのブートセクター(正確には、IBM PCと違ってブートローダーが含まれていないので「予約セクター」と呼ぶべき)がIBM PCと違うことに気付いた。しかも、全く構造の異なる2種類が存在する。3.5インチ2DD機用の新タイプと、5.25インチ2DD機用の旧タイプが存在する。私が持っているIPL ROMは初期モデルのようで、旧タイプにしか対応していないようだった。しかし、持っているDOSは後ろの方のバージョンで、新タイプのフォーマットしかない。これを旧タイプのフォーマットに手動で書き換える必要があった。このためにDOSのSYSコマンドを解析した。
旧タイプのフォーマットはBPB以外のデータがIBM PC用DOSのブートセクターと異なる(後にFORMATコマンドで確認したところ、BPBも記録されないことが判明)。しかし、FATの位置は同じだから、生のDOSではFATの先頭に書かれているメディアディスクリプタさえ読めればディスクフォーマットを判別できることから、他機種とのデータ交換では問題にならない。(Windowsでは無効なフォーマットとして扱われ、エラーになる。)
IPLからブートするために予約セクターに必要な情報は次の通り。
Addr:
0Ah: Sig (D7h)
18h-24h: Sig 12 bytes (C9 C2 D4 F5 F5 F5 F0 40 40 40 40 40) 'IBM5550 ' in EBCDIC
49h: ? (48h = 9 sectors / track, 40h = 8 sectors / track) (0100 1000 or 0100 0000)
108: (000Eh) -> bp+14 = bx+2: Absolute sector index for boot loading table
10A: SP - (0080h) Data size -> bp+18 = bx+6: DMA offset for data read
ここにはブートロードに必要な情報を含むテーブルの位置が記録されている。このテーブルはIBMBIO.COMファイルの先頭にあり、ロードするデータの先頭クラスター番号、サイズ、ロード先のセグメントアドレス、オフセットアドレスなどがある。IPLはこの情報を読んで、中間ローダーやDOSのBIOSをディスクからメモリーにロードする。
? ClusR SizeR SegE Fl? OffsE OffR
40 00 00 00 00 00 00 00 00 00 00 1C 05 00 00 00
0E 02 10 00 00 02 00 20 A0 00 00 00 00 00 00 00
0E 02 6F 00 00 34 00 11 00 00 00 00 00 00 00 00
0E 02 11 00 00 BC 40 05 13 00 00 00 00 00 00 00
0F E0 0E 00 F2 01 00 30 B2 00 F0 00 00 00 00 00
0F E2 0E 00 F2 01 00 10 52 00 08 01 00 00 00 00
あとはDOSを使いながら表示の修正を行っていくことになるだろう。エミュ製作は今スタートをきったばかりだ。