240704 PS/55エミュ製作 [34]VGAのモノクロモニター判別方法を調べる
前回からもう1週間か。つい昨日までDOSすら起動できなかった。まず、日本語DOS用のスキャンコードの実装は若干手間が掛かるくらいで、難しいところはなかった。
次に、PS/2ではメモリアドレスE0000-FFFFFhまでの128KBがBIOSとして使用されているのだが、PS/55のディスプレイ・アダプターはE0000-E0FFFhの1KBをテキスト画面のバッファーとして使用する。このために、PS/55のシステムボードには、このアドレス空間をBIOS ROMから切り離せる仕組みが特別に用意されている。ただ、PCemの既存のコードだとメモリマップの管理上、最小4KB単位でしか切り離せない。E2000hあたりにはディスクBIOSがあるらしく、E0000-E3FFFhを切り離すとブートできなくなる。これに気付いてコードを修正するのに時間が掛かった。
これで、画面は表示できないものの、DOSは正常に起動するようになった。しかし、一番大変なのはやっぱり画面表示部分だ。やっと上のように表示できるようになったのがつい先ほどのこと。前に見覚えがある白いDOS画面が表示された。この時と同様にI/Oポートの返値を変えてみたが解決しない。
そもそも、VGAではカラーモニターとモノクロモニターをどうやって判別しているのだろう。
モニターの判別は、1990年代にディスプレイメーカーの業界団体 (VESA) によってDDC規格が策定された後の製品であれば、モニターからEDIDというデータを取得することによってメーカーや機種を含む様々な情報を得ることができる。それ以前では、空いている信号ピンに割り当てられたIDピンでモニター固有の番号を取得する方法があることは知っていたが、カラーモニターとモノクロモニターの判別はそれとは別の方法があった。
PS/2のHardware Technical Referenceによれば、VGAのレジスターの一つであるInput Status Register 0 (I/O 3C2h) のビット4で「このビットはBIOSによって、接続されたディスプレイの種類の判別に使われる。」と記載されている。
Input Status Register (Hex 03C2 Read)
Bit | Function
----|-----------------
7 | CRT Interrupt
6,5 | Reserved
4 | Switch Sense Bit
3-0 | Reserved
Bit 4: This bit is used by BIOS in determining the type of display attached.
I/Oポートの読み出しビットで実装されているということは、ハードウェア的な信号で検出する手段が用意されているのだろうか。
PS/2の回路図が落ちていたのでそれを見たところ、VGA端子のうちR・G・Bの3つのピンそれぞれに180Ωの抵抗を通してLM339(コンパレーター)のマイナス側へ入力され、LM339の出力はVGAチップに+5V/10kΩのプルアップ抵抗を付けて入力されていることが分かった。つまり、R・G・Bのうち1つでも一定電圧以上、つまり未接続の端子があれば、LM339の出力はローレベルになり、VGAチップのピン入力もローになる。このピン入力の状態がSwitch Sense Bitなのではないか。
ここまでハード寄りの詳しい話はウェブを調べても出てこないが、VOGONSでこれに絡む話が見つかったので、あながち的外れではない。
Investigating old ISA VGA cards \ VOGONS
ただ、PS/55ディスプレイ・アダプターもこれと同じかどうかは怪しいんだよなぁ。