PC-98x1/misc/memo
適当に
IO.SYS 内部情報
若干の解析。 大人の事情により間接的(コード直接依存はしない。つまり逆アセンブル的行為禁止縛り)方法で。
STOP キー押したときの内部状態。
確認用コード stopchk.c
(LSI-C 専用)
内容:
- IO.SYS 部分のメモリ保存
- STOP キー(もしくは SHIFT + STOP)押す
- CTRL キー押す
- 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 |