240728 PS/55エミュ製作 [40]PS/55のモノクロモニター判別
最近、こればかりにずっと掛かりっきり。
OS/2 J1.3はだいたい正しく表示されるようになった。2バイト文字が表示されなかった問題は、OS/2のフォントドライバーにフォントROMの署名チェックがあって、私が使用していたえせROMデータ(DOS/Vのフォントから作成したもの)ではパスできていなかったことが原因だった。
しかし、Windows 3.xでは問題ないのに、OS/2だとなぜかモノクロモニターとして判別されて、カラーパレットがモノクロになる。
PS/55でのモノクロモニターの判別モジュールについては、逆アセンブルでだいたい分かってきた。VGAでの判別手法は、ハードウェアについては前回書いた通りで、プログラム上はPOST時に以下の処理を行っている。
;Determining monochrome monitor in IBM PS/55 5551-S/T POST BIOS
write DAC PAL 18, 18, 18
cmp I/O 3C2 (Switch Sense bit), 0x10; JZ color monitor (RGB is connected)
write DAC PAL 4, 18, 4
cmp I/O 3C2 (Switch Sense bit), 0x10; JZ mono monitor (Green is connected)
write DAC PAL 4, 4, 4
cmp I/O 3C2 (Switch Sense bit), 0x10; JNZ error
write DAC PAL 16, 4, 4
cmp I/O 3C2 (Switch Sense bit), 0x00; JNZ error
write DAC PAL 4, 16, 4
cmp I/O 3C2 (Switch Sense bit), 0x00; JNZ error
write DAC PAL 4, 4, 16
cmp I/O 3C2 (Switch Sense bit), 0x00; JNZ error
write DAC PAL 16, 16, 16
cmp I/O 3C2 (Switch Sense bit), 0x00; JNZ error JZ mono OK (non-EGA/VGA compatible or the cable is not wired)
mono monitor(gray scale?):
write DAC PAL 4, 18, 4
cmp I/O 3C2 (Switch Sense bit), 0x00; JNZ error
write DAC PAL 30, 18, 4
cmp I/O 3C2 (Switch Sense bit), 0x10; JNZ error
write DAC PAL 4, 45, 4
cmp I/O 3C2 (Switch Sense bit), 0x00; JNZ error
write DAC PAL 4, 38, 37
cmp I/O 3C2 (Switch Sense bit), 0x00; JNZ error
write DAC PAL 0, 0, 16
cmp I/O 3C2 (Switch Sense bit), 0x00; JNZ error
color monitor:
write DAC PAL 20, 20, 20
cmp I/O 3C2 (Switch Sense bit), 0x10; JNZ error
write DAC PAL 45, 20, 20
cmp I/O 3C2 (Switch Sense bit), 0x00; JNZ error
write DAC PAL 20, 45, 20
cmp I/O 3C2 (Switch Sense bit), 0x00; JNZ error
write DAC PAL 20, 20, 45
cmp I/O 3C2 (Switch Sense bit), 0x00; JNZ error
write DAC PAL 45, 45, 45
cmp I/O 3C2 (Switch Sense bit), 0x00; JNZ error
write DAC PALは私のただのメモ用語だが、RAMDACのRGBパレットへの書き込みを表している。cmp命令は比較 (compare) 命令で、実際には第1オペランド (op1) から第2オペランド (op2) を減算してフラグだけを結果に反応する命令である。op1 = op2 の時、op1 - op2 = 0 であり、ZF(ゼロフラグ)= 1 になる。JZはZF = 1(比較が一致)の時にジャンプする。JNZは ZF = 0(比較が不一致)の時にジャンプする。
言葉で簡単に説明すれば、VGAのRGB出力それぞれに信号を流して、その電圧を測ってケーブルの接続状況を判別しているのである。カラーモニターならRGB全てが結線されているが、モノクロモニターはG(緑)だけが結線されている。よって、G以外が断線時と同じ状況であれば、おそらくモノクロモニターが接続されていると推定できるわけである。
PS/55の場合、POSTの段階ではシステムボード上のモニター端子に対してのみ、このチェックを行う。モニターケーブルをディスプレイ・アダプターのモニター端子に接続している場合、このチェックでは未接続として扱われる。その代わり、NVRAM(RT/CMOSとは別にある、バッテリー駆動の不揮発性メモリー)からディスプレイ・アダプターのPOS (Programmable Option Select)のデータを読んで、メモリー上のBIOS Data Areaにモノクロ/カラーの情報をセットする。POSのデータは、おそらく、リファレンス・ディスケットでの設定時にセットされるはずである。
ディスプレイ・アダプターはMiroChannelスロットの1つのアダプターとして認識されるので、POSTプログラムはPOSのデータがそのディスプレイ・アダプターのものかどうかを確認するため、NVRAMにPOSデータとともに記録されるPOS ID(アダプターの製品ごとに割り当てられる固有ID)をチェックしている。モデル5551-S,TのBIOSでは、EFFEhとEEFEhのどちらかに適合するかチェックしているようである。
このことから、ディスプレイ・アダプターにモニターケーブルを接続した場合、次のようになることが推測できる。
- モデル5551-S,Tに上記のPOS ID以外を持つディスプレイ・アダプター(Display Adapter IVやDisplay Adapter /Jなど)を搭載した場合、POSデータを取得できないことから、カラー/モノクロ判別ができない。
- PS/2にPS/55のディスプレイ・アダプターを搭載した場合、PS/2のBIOSはVGAのカラー/モノクロ判別しか行わないため、ディスプレイ・アダプターにモニターケーブルが接続されていると、モニター未接続の扱いになる。
- PS/55で内蔵バッテリーを消耗した場合、NVRAMのデータが消失するので、初回起動時はカラー/モノクロ判別ができない。この挙動は実機でも確認しているが、こういう理由があったというのは初めて知った。
ちなみに、sandy氏が書いておられるように、この問題はリファレンスディスケットに含まれているMONCHK.EXEというユーティリティーを使うことでDOS上から修正することができる。
エミュレーターではこれに適合するように処理を実装したが、それでもOS/2ではモノクロになってしまう。何か別の問題があるようだが、原因がなかなか分からない。