エミュ開発中のメモより。この先、一生使うことはない知識。
DOS J5.0/VのSWITCHコマンドはPS/55(日本語)モードとPS/2(英語)モードを切り替えるという機能を持つが、DOS J5.0のSWITCHコマンドは少し違い、J-DOSモードとDOS/Vモードを切り替える機能を持つ。
SWITCHコマンドは次の外部コマンドを使用する。
- IPLDRIVE - カレントドライブを起動ドライブ(INT 21h, AH=52hでシステムテーブルから情報を取得)に変更する。
- ASKYESNO - 引数1で指定されたメッセージを表示し、YかNキーを受け付ける。Yが押されたら0、Nが押されたら1のエラーレベルを返す。
- 32705250 - 3270PCまたは5250PCが動作中でないことを確認(INT 7Dh, AX=8BFFhを使用)する。
- HARDBOOT - 切替処理のメイン。詳細は後述。
SWITCHコマンドそのものはただのバッチファイルで、上記の外部コマンドを組み合わせて動作する。まず、起動ドライブをカレントドライブにセットする。ここはCドライブ決め打ちで良い気がするが、J-DOSでCドライブ以外が起動ドライブになる場合があるんだろうか(DOS J5.0ではまずないだろうが、DOS J4.0をディスケット起動するとAドライブになるか)。次にキー入力でプロンプトを表示する。Yキーが押されれば続行し、Nキーが押されれば中止する。次に、3270PCや5250PCがバックグランドで動作していないかチェックする。これらが動作していると、SWITCHの処理中にタスク切り替えによって割り込まれる可能性があるからと考えられる。問題なければ、HARDBOOTによって環境の切り替えと再起動が行われる。
HARDBOOTの処理の流れは次の通り。
- 引数をチェックして正常なら切り替え先を選択する。
- CONFIG.SYS, AUTOEXEC.BATをリネームし、COMMAND .COMを上書きコピーして差し替える(COMMANDの置き換え以外はDOS/V版SWITCHコマンドと同じ)
- VERIFYをONにする。
- ディレクトリーエントリーにあるIBMBIO .COMの更新時刻の最下位ビットを書き換える。(J-DOSモードなら0、DOS/Vモードなら1)
- キーボードコントローラーでマシンリセット、または、リセットエントリー(F000:FFB0hまたはF000:FFF0h)へジャンプする。
引数はSWITCH.BATでは、J-DOSモードへはvga2 ps55
、DOS/Vモードへはps55 vga2
となっている(ただし、J4.04ではPS/55モードへはps55
、PS/2モードへはuspc
。J4.05ではps22 ps55
、ps55 ps22
)。HARDBOOT側の引数チェックはトリッキーなことをやっている。引数が2つある場合、第2引数の4文字目が5か0ならJ-DOS、2かCならDOS/Vになる。各引数の1~3字目はリネームのファイル名にも使われる。引数が1つしかない場合はUSPC
またはPS55
と照合して、一致した方でIBMBIOの更新時刻情報のみ書き換える。こちらはDOS J4.0用の動作だろう。
以上から、切り替え処理のうちDOS標準コマンドでは不可能な手順は、HARDBOOTの4(ファイルの更新日時設定)だけだ。ディスプレイ・アダプターやキーボードの故障などでJ-DOSモードで起動しなくなったときはDOS(英語版でもDOS/Vでも)の起動ディスクに日時を書き換えるユーティリティー(FreeDOSのtouchコマンドなど)を入れてそこから起動し、IBMBIOの時刻秒を2に書き換え、RENコマンドやCOPYコマンドでファイルを切り替えれば、DOS/VモードまたはPS/2モードへ切り替えられる。