PC-98x1/misc/memo

PC-98x1/misc/memo

適当に

IO.SYS 内部情報

若干の解析。 大人の事情により間接的(コード直接依存はしない。つまり逆アセンブル的行為禁止縛り)方法で。

STOP キー押したときの内部状態。

確認用コード stopchk.c
(LSI-C 専用) 内容:

  1. IO.SYS 部分のメモリ保存
  2. STOP キー(もしくは SHIFT + STOP)押す
  3. CTRL キー押す
  4. IO.SYS メモリ部分の差分がファイルに出力される

DOS 3.3D, DOS 6.2, Win98SE でそれぞれ試したところ、3つの DOS で共通部分の変更があることが確認できた。

0060:00C0 n BYTES キーバッファ実体(STOP処理用)
0060:0103 BYTE    文字数
0060:0104 WORD    文字列へのポインタ

STOP (SHIFT+STOP) が押されると、0060:00C0 からの位置に 03 (Ctrl-C) もしくは 13 (Ctrl-S) が置かれ、0060:0103 に文字数 1、0060:0104 に 00C0 が設定されるようだ。 ユーザーが独自に内容を設定することもできそう。

コンソールのカーソル位置取得(ESC[6n)は結果格納にこのバッファを使わないようである。まあタイミングが悪いと途中に文字が割り込まれちゃうので、その対策かもしれない…

(ちなみに、ESC[6n 出力後、キー入力を行わない状態で STOP, SHIFT-STOP を押すと ESC[6n の出力結果もフラッシュされて結果の取得が不可能となる)

ESC[6n(コンソールのカーソル位置取得)。

確認用コード esc6nchk.c
(LSI-C 専用) 処理の流れは stopchk.c とほぼ同じ。ESC[23;45H でカーソル位置設定→ESC[6n で位置取得で IO.SYS 内部のメモリ差分を調べる。

DOS 3.3D, DOS 6.2, Win98SE でそれぞれ試したところ、3つの DOS で共通部分の変更があることが確認できた。

0060:0103 BYTE    文字数
0060:0104 WORD    文字列へのポインタ
0060:012C n BYTES 出力エスケープシーケンス実体(ESC[yy;xxR)

STOP キー処理時とは別のバッファを使うらしい…。

バッファ保持中の処理

確認用コード esc6nck2.c
(LSI-C 専用) ESC[6n 出力→DOS ファンクションで1文字キー入力のメモリ差分を調べる。

…1文字読み取るごとに 0060:0103 の文字数が -1、0060:0104 のポインタが +1 されるようだ。

ファンクションキー

確認用コード conchk.c
(たぶん OpenWatcom 専用) CON デバイスドライバを直接叩いてキー入力ステータス確認(ついでに PC-98 用 MS-DOS 内部ポインタも調べる)

STOP キーの時と同じバッファ(0060:00C0〜)にキー内容が展開されるようだ。

ちなみに途中で ESC[6n が発行された場合はバッファがそちらに切り替わる。つまりファンクションキーの内容は途中までしか読み取れない。

コンソールドライバ(CON)

↑の続き、的な…。

98 用 MS-DOS の CON は、バッファに文字がたまっていようが、INPUT STATUSコマンドでつねに BUSY=0 のようだ… Non Destructive Input No Wait は、ファンクションキーを押している間は「入力なし」とみなす。押して、離した瞬間に入力ありを返す。(通常の READ は離すまで待たなくても文字を返す)

IDE BIOS

例によって逆アセンブル的行為禁止縛り

システム共通域

0000:05BA BYTE  IDE HDD 接続状況
                bit0〜bit3 が、それぞれ IDE #0〜#3 のハードディスク接続業況を表しているように思われる。
                (CD-ROM接続の場合、当該ビットはセットされないようだ) 

確認法ですが、手持ちの実機のIDE BIOS(PC-9821Xc13/S5B の bank3)をnp21に読み込ませて、IDEのハードディスクイメージを #0〜#3 に適当にマウント/アンマウントし、フロッピーからMS-DOSを起動してすぐシステム共通域(0000:0400〜0000:05FF)を保存、その後適当にそのデータをバイナリ比較、という安直な方法をとりました。 バイナリ比較は DOS 標準の FC /B コマンドで十分です。

IDE BIOS パラメータテーブル

D800:2100 からドライブごとに 32 バイト(32x4)

後期(4.3G超対応)BIOS以外はセクタ数やヘッド数などは設定されない。(1トラック17セクタ決め打ち)

オフセット サイズ 内容 補足
+0 word シリンダ数
+2 word システム共通域モータ停止時間カウンタのオフセット
+4 word システム共通域高速IDEフラグのオフセット オフセット +19 のビット値も参照
+7 byte トラックあたりのセクタ数 4.3G超対応BIOS のみ
+8 word シリンダ単位のセクタ数
(トラックあたりのセクタ数×ヘッド数)
4.3G超対応BIOS のみ
+10 byte ヘッド数 4.3G超対応BIOS のみ
+16 byte? フラグ? CD-ROM (ATAPIデバイス?) が接続されている場合、ここに 02h が入るようだ…(詳細不明)
+19 byte システム共通域高速IDEフラグ設定用のビット値? オフセット +4 も参照

オフセット +0, +2, +4, +19 に関しては単にメモリ内容のダンプで確認。4.3G超部分については AP3EXIDE のソース(AP3IDE.S)を参照しました…。

ためしに IDE #0〜#3 まで全部に HD イメージマウントした場合、オフセット +2, +4, +19 の値はこんな感じだった…
(内容については undoc2 の memsys.txt あたりでワード値のメモリを確認)

IDE PORT +2 +4 +19
#0 0598h 045Dh 08h
#1 05B1h 045Dh 10h
#2 058Ch 045Eh 20h
#3 058Eh 045Eh 40h