Image: 240728 PS/55エミュ製作 [40]PS/55のモノクロモニター判別

最近、こればかりにずっと掛かりっきり。

OS/2 J1.3はだいたい正しく表示されるようになった。2バイト文字が表示されなかった問題は、OS/2のフォントドライバーにフォントROMの署名チェックがあって、私が使用していたえせROMデータ(DOS/Vのフォントから作成したもの)ではパスできていなかったことが原因だった。

しかし、Windows 3.xでは問題ないのに、OS/2だとなぜかモノクロモニターとして判別されて、カラーパレットがモノクロになる。

Image: PCem55 beta

Image: PCem55 beta

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のデータが消失するので、初回起動時はカラー/モノクロ判別ができない。この挙動は実機でも確認しているが、こういう理由があったというのは初めて知った。

Image: Error 162, 163

ちなみに、sandy氏が書いておられるように、この問題はリファレンスディスケットに含まれているMONCHK.EXEというユーティリティーを使うことでDOS上から修正することができる。

エミュレーターではこれに適合するように処理を実装したが、それでもOS/2ではモノクロになってしまう。何か別の問題があるようだが、原因がなかなか分からない。


※コメント欄が表示されない場合はdisqusについてJavascriptが有効であることを確認して下さい。コメントはスパム防止フィルターによる承認制のため、投稿してもすぐに反映されない場合があります。

管理人 : Akamaki (akm)

は、PCとVTuberに夢中になっている電気技術者です。

私はレトロコンピューティングの愛好家ですが、そのようなリグはもう収集していません。

私の活動はトップページで見ることができます。読んでくれてありがとう!