HW/A20/A20TEST
つかいかた
- まっさらな(何もドライバをインストールしていない)DOS 上で A20.EXE を実行。 拡張メモリにアクセスするドライバ(HIMEM.SYS、日本語フォントドライバなど)が入っている環境では正しい結果が得られません(ハングアップする可能性があります)。
- まっさらな DOS 環境が手元にない場合は、同梱のディスクイメージ a20tstfd.img を適当なツールで 1.44M ディスケットに書き込んで、そのディスケットを使って FreeDOS をブートしてください。
- というか、FreeDOS と MS(PC)DOS とでは結果が異なる場合がある(FMV-4100NL/T の説明を参照)ので、FreeDOS のほうをお使いいただくことをおすすめいたします。
実行結果
VMWare Player
いちおう guestOS = "dos" で。
int 15h,ax=2402h is supported. int 15h,ax=2403h is supported. (bx=0003) initial value int15-2402:0000(0) KBDout:00(0), port92:00(0) A20:disabled A20(Keyboard) on int15-2402:0001(1) KBDout:02(1), port92:00(0) A20:enabled A20(Keyboard) off int15-2402:0000(0) KBDout:00(0), port92:00(0) A20:disabled A20(port92h) on int15-2402:0001(1) KBDout:00(0), port92:02(1) A20:enabled A20(port92h) off int15-2402:0000(0) KBDout:00(0), port92:00(0) A20:disabled A20(Keyboard) off -> A20(port92h) on int15-2402:0001(1) KBDout:00(0), port92:02(1) A20:enabled A20(Keyboard) on -> A20(port92h) off int15-2402:0001(1) KBDout:02(1), port92:00(0) A20:enabled A20(Keyboard) on -> A20(port92h) on int15-2402:0001(1) KBDout:02(1), port92:02(1) A20:enabled A20(Keyboard) off -> A20(port92h) off int15-2402:0000(0) KBDout:00(0), port92:00(0) A20:disabled int 15h,ax=2401h (A20 on)...success int15-2402:0001(1) KBDout:02(1), port92:00(0) A20:enabled int 15h,ax=2400h (A20 off)...success int15-2402:0000(0) KBDout:00(0), port92:00(0) A20:disabled
- GATE_A20 はキーボードコントローラ出力ポートの bit1 とポート 92h の bit1 の OR。どちらかが 1 なら A20 はイネーブル。
- int 15h, ax=2400h〜2403h がすべてサポートされている。
- int 15h, ax=2400h〜2401h はキーボードコントローラ側を制御する。
- int 15h, ax=2402h はキーボードコントローラとポート 92h 双方の状態をチェックし、妥当な値を返している。
int 15h, ax=2403h を呼び出す前に bx = 0 を設定しておいたほうがいいかもしれない。VMware は bl しか変更しないようだ。(あらかじめ bx に ffffh を突っ込んでから呼び出したら bx = ff03h になっていた)
Fujitsu FMV-4100NL/T model5Z (FMV41NLTZ5)
かなり古めの富士通のノートPC。CPU は AMD486DX-100。
int 15h,ax=2402h is not supported. int 15h,ax=2403h is not supported. initial value int15-2402:8602(?) KBDout:cd(0), port92:d2(1) A20:enabled A20(Keyboard) on int15-2402:8602(?) KBDout:cf(1), port92:d2(1) A20:enabled A20(Keyboard) off int15-2402:8602(?) KBDout:cd(0), port92:d2(1) A20:enabled A20(port92h) on int15-2402:8602(?) KBDout:cd(0), port92:d2(1) A20:enabled A20(port92h) off int15-2402:8602(?) KBDout:cd(0), port92:d0(0) A20:disabled A20(Keyboard) off -> A20(port92h) on int15-2402:8602(?) KBDout:cd(0), port92:d2(1) A20:enabled A20(Keyboard) on -> A20(port92h) off int15-2402:8602(?) KBDout:cf(1), port92:d0(0) A20:enabled A20(Keyboard) on -> A20(port92h) on int15-2402:8602(?) KBDout:cf(1), port92:d2(1) A20:enabled A20(Keyboard) off -> A20(port92h) off int15-2402:8602(?) KBDout:cd(0), port92:d0(0) A20:disabled int 15h,ax=2401h (A20 on)...failure (86h...not supported) int15-2402:8602(?) KBDout:cd(0), port92:d0(0) A20:disabled int 15h,ax=2400h (A20 off)...failure (86h...not supported) int15-2402:8602(?) KBDout:cd(0), port92:d0(0) A20:disabled
- GATE_A20 はキーボードコントローラ出力ポートの bit1 とポート 92h の bit1 の OR。どちらかが 1 なら A20 はイネーブル。
- ポート 92h の bit1 が初期状態でセットされており、A20 がマスクされていない。これは PS/2 と非互換の挙動。
ちなみに、FreeDOS ではなく MS-DOS 6.2 上で実行した場合、ポート 92h の bit1 は最初からクリアされていた。どうやら MS-DOS は起動時にポート 92h の bit1 を明示的にクリアするようだ。 - int 15h, ax=2400h〜2403h はサポートされていない。
GIGABYTE GA-7ZX
SocketA マザボ。
VIA KT133 (VT8363,VT82C686A), AMIBIOS。
int 15h,ax=2402h is not supported. int 15h,ax=2403h is supported. (bx=0001) initial value int15-2402:8602(?) KBDout:0b(1), port92:02(1) A20:enabled A20(Keyboard) on int15-2402:8602(?) KBDout:0b(1), port92:02(1) A20:enabled A20(Keyboard) off int15-2402:8602(?) KBDout:09(0), port92:00(0) A20:disabled A20(port92h) on int15-2402:8602(?) KBDout:09(0), port92:02(1) A20:enabled A20(port92h) off int15-2402:8602(?) KBDout:09(0), port92:00(0) A20:disabled A20(Keyboard) off -> A20(port92h) on int15-2402:8602(?) KBDout:09(0), port92:02(1) A20:enabled A20(Keyboard) on -> A20(port92h) off int15-2402:8602(?) KBDout:0b(1), port92:02(1) A20:enabled A20(Keyboard) on -> A20(port92h) on int15-2402:8602(?) KBDout:0b(1), port92:02(1) A20:enabled A20(Keyboard) off -> A20(port92h) off int15-2402:8602(?) KBDout:09(0), port92:00(0) A20:disabled int 15h,ax=2401h (A20 on)...failure (86h...not supported) int15-2402:8602(?) KBDout:09(0), port92:00(0) A20:disabled int 15h,ax=2400h (A20 off)...failure (86h...not supported) int15-2402:8602(?) KBDout:09(0), port92:00(0) A20:disabled
- キーボードコントローラ出力ポートの bit1 が初期状態でセットされており、A20 がマスクされていない。(キーボードコントローラの仕様としては PC/AT や PS/2 と同じだが、ふつう BIOS が起動時にリセットすると思う…)
- ポート 92h を読み出したとき、bit 1 の値は、キーボードコントローラ出力ポートの bit1 と、ポート 92h に以前書き込んだときの bit1 の OR になる。
- ポート 92h の bit1 の初期値はどうやら 0 らしい(しかし、キーボードコントローラ側がセットされているため、ポート 92h を読み出したときの bit1 は 1 になる)。
- int 15h,ax=2400h〜2402h はサポートされていない。
int 15h,ax=2403h は BX=1(キーボードコントローラのみ)を返す。 - GATE_A20 はキーボードコントローラ出力ポートの bit1 とポート 92h の bit1 の OR。どちらかが 1 なら A20 はイネーブル。
えーと、つまり、キーボードコントローラ出力ポートの bit1 とポート 92h の bit1 は内部的にはちゃんと個別に保持されていますが、ポート 92h の bit1 の内容だけを CPU 側が個別に取得することはできない…ということみたいです。
その場合はキーボードコントローラ出力ポートの bit1 を 0 にしておく必要がある。
(逆に言うと、GATE_A20 の状態を知りたいときはポート 92h だけリードすればわかる。他の環境のようにキーボードコントローラ側と手動で OR する必要がない)
Albatron PX845PEV-800
Socket478 マザボ。
Intel 82845PE (845PE), 82801DB (ICH4), Phoenix-Award BIOS。
int 15h,ax=2402h is not supported. int 15h,ax=2403h is supported. (bx=0003) initial value int15-2402:8602(?) KBDout:49(0), port92:02(1) A20:enabled A20(Keyboard) on int15-2402:8602(?) KBDout:4b(1), port92:02(1) A20:enabled A20(Keyboard) off int15-2402:8602(?) KBDout:49(0), port92:02(1) A20:enabled A20(port92h) on int15-2402:8602(?) KBDout:49(0), port92:02(1) A20:enabled A20(port92h) off int15-2402:8602(?) KBDout:49(0), port92:00(0) A20:disabled A20(Keyboard) off -> A20(port92h) on int15-2402:8602(?) KBDout:49(0), port92:02(1) A20:enabled A20(Keyboard) on -> A20(port92h) off int15-2402:8602(?) KBDout:4b(1), port92:00(0) A20:enabled A20(Keyboard) on -> A20(port92h) on int15-2402:8602(?) KBDout:4b(1), port92:02(1) A20:enabled A20(Keyboard) off -> A20(port92h) off int15-2402:8602(?) KBDout:49(0), port92:00(0) A20:disabled int 15h,ax=2401h (A20 on)...failure (86h...not supported) int15-2402:8602(?) KBDout:49(0), port92:00(0) A20:disabled int 15h,ax=2400h (A20 off)...failure (86h...not supported) int15-2402:8602(?) KBDout:49(0), port92:00(0) A20:disabled
-
GATE_A20 はキーボードコントローラ出力ポートの bit1 とポート 92h の bit1 の OR。どちらかが 1 なら A20 はイネーブル。
→参考:ICH4 のデータシート - ポート 92h の bit1 が初期状態でセットされており、A20 がマスクされていない。これは PS/2 と非互換の挙動(FMV-4100NL/T の項も参照)。
- int 15h,ax=2400h〜2402h はサポートされていない。
int 15h,ax=2403h は BX=3(キーボードコントローラとポート 92h)を返す。