HW/A20/A20TEST

a20test_20060321.zip

つかいかた

  • まっさらな(何もドライバをインストールしていない)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)を返す。