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 は離すまで待たなくても文字を返す)

プログラマブルキーの内容

int DCh CL=0Ch/0Dh AX=0〜FFh で取得/変更できるファンクションキーなどの内容が実際にはどこに格納されているのか確認してみるプログラム
pkeyaddr.zip

だいたいわかること:

  • NEC版MS-DOS、エプソン版MS-DOS、Win9xでIO.SYS内の格納位置が違う(NTVDMは未確認)
  • 各社版のバージョン間ではアドレスが変わらない、ように思える(ただし、DOS 2.x, 3.1は未確認だがたぶん違うと思われる)
  • ファンクションキーなどは内部的にはバイト長+15バイト
  • カーソル他は内部的にはバイト長+7バイト。つまり内部データを弄れば7文字まで設定できるがint DCh経由だと最大5バイトまでに切り詰められる
  • エプソン版はcrtl+xferの格納オフセットが違う

つまり内部テーブルを直接参照する方法には互換性がない。

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