デジタルRGBをVGAモニタに出力したい
概要
PC-6001mkII以降には15色表示のデジタルRGB出力があり、専用モニターに接続することで鮮明な像を得ることができる。 エミュレータであれば、既に鮮明な画面表示を得ているので、必要性は低いが、折角ある機能を活用したいと思う。
流石に、専用モニターを入手するのは方法として、イマイチなので、アナログVGAモニタへ出力することを最終目標とする。
ハードウェア
PC-6001シリーズのRGB IFは、物理的にはDIN 8PINなので、最低限、これをD-SUB15に形状変更する必要がある。 実際、そういったケーブルもあるようだが、RGBのON/OFFによる8色表示しかできない。
従って、15色表示可能なように、RGBを0-1の他に中間レベルで出力できるハードウェアが必要になる。
更に、モニターが水平回帰15KHzをサポートしていればいいがVGAは31kHzと倍速なので、15kHz非対応の場合にはアップスキャンコンバータも必要になる。
RGB15色対応
TTLロジック版
部品
部品 | 点数 | メモ |
---|---|---|
74LS02 | 3 | 2入力NORゲートx4 |
74LS08 | 2 | 2入力ANDゲートx4 |
74LS125 | 1 | Tri-State Bufferx4 |
74LS86 | 1 | 2入力XORゲートx4 H-Sync/V-Sync混合用。なければNORとANDの空いている回路で代替可能 |
抵抗100Ω | 6 | |
電解コンデンサ 100uF 16V | 3 | |
半固定抵抗(500Ω) | 6 | |
VGAコネクタ | 1 | D-SUB 15pin メス |
DIN 8pinプラグ | 1 | 基板用ソケットがあればそれでも可 |
8芯ケーブル | 1 | |
電源用USB Micro Bコネクタ | 1 | 5Vの電源入力が可能なら何でもいい |
PIC版
部品
部品 | 点数 | メモ |
---|---|---|
PIC16F1827 | 1 | PIC16アーキテクチャ/16GPIO/DIP18ピンなら何でもいい |
抵抗100Ω | 6 | |
電解コンデンサ 100uF 16V | 3 | |
半固定抵抗(500Ω) | 6 | |
VGAコネクタ | 1 | D-SUB 15pin メス |
DIN 8pinプラグ | 1 | 基板用ソケットがあればそれでも可 |
8芯ケーブル | 1 | |
電源用USB Micro Bコネクタ | 1 | 5Vの電源入力が可能なら何でもいい |
PIC版とか書いたが、どうもPIC版は動かないかもしれない。 というのも、PICが思ったより遅いから。
15KHzの水平回帰だと、320ドットを描くには、ドット当たり4.8MHzくらい(1/15000/320)で描いていかないと間に合わない。
が、PIC16F1827をフルスピードで動かしても32MHz。 となれば、構成する命令が全部1サイクルで終わるものだとしても、わずか6ステップですべてを終わらせる必要がある。 ま、ポートから値を読んで、テーブル引いて出すとかなら間に合うだろうと思っていた、実は。
が、ここでPIC16のアーキテクチャの罠があったのを今更知った。
なんかするたびに、Wレジスタを経由せざるを得ない。
最初、Cでコード吐かせてみて絶望した。
最適化を-O3
とか-Os
とか指定してみたが、芳しくなかった。
とりあえず、ごりごり、アセンブラで書いてみた。
loop: movlb 0 ; BANK 0に切り替える clrf 0x76 ; レジスタ 0x76 をクリアする ; HV混合信号を生成する (C = H ^ V ^ 1) movlw 8 ; Wレジスタに8 (b00001000)をセットする btfsc 12,6 ; RA6が1ならレジスタ0x76にb00001000を設定する movwf 0x76 btfsc 12,7 ; RA7が1ならWをクリアする (W=RA7 ^ 1) clrw xorwf 0x76,f ; レジスタ0x76 = W ^ レジスタ0x76 ; RB - xxxxCBGR で出力する movf 12,w ; W=PORTA & 7 (RGBコードだけ取り出す) andlw 7 iorwf 0x76 ; W=W | レジスタ0x76 movwf 13 ; PORTB = W ; TRISBにハイインピーダンスにするポートを出力する(IN にセットすると出力としてはハイインピーダンスになる) movf 12,w ; W=PORTA & 0x0f andlw 15 addlw 0x20 ; FSR1 に 0x20 + W (0-15に対応する出力値を書いたテーブル)をセット movwf 6 movf 1,w ; W = INDX1 (W = ds[PORTA & 0x0f]) movlb 1 ; BANK 1に切り替える movwf 13 ; TRISB = W goto loop
頑張って、20命令まで減らせたが、これでも予定より3.5倍くらい多い感じになるので、もうクロックを100MHzくらいにおーばくロックするしかないような気がしている。 多分、このまま実装すると、色が3ドットごとにしか変わらない、PC-8001みたいなことになりそうな気がする。
無念。
そう考えると、TTLロジック速いな。
アップスキャンコンバータ
自作する、というか、上の基板に組み込みたかったのだが、ラインバッファが必要だったり、FPGAで自作している人がいたりと、それなりに大規模になりそうなので、断念。
アマゾンで、GBS 8200 Ver 4.0のボードを見つけ、これを利用することにした。
GBS 8200 Ver 4.0
アップスキャンコンバータであるが、癖が強いので注意が必要。 まず、入力にD-SUB 15pin の口があり、シルクパターンを見るに、RGB + H + Vの信号を受け取りそうだが、先人たちによれば、H-Syncの代わりに、H/V 混合信号が、それとは別にV Syncも必要になるようだ。
実際、製品に添付されていたケーブルは、RGBとS(H/V混合信号)とVのみが結線されており、これら信号を入力してやる必要があるようだ。
実験的に R, G, B, S(H/V混合信号), Vを入力したところうまく表示された。 なお、散見される 3.3V動作だから、信号レベルを調整しないと不安定というのは、誤りであるように思う。 TTL(5V)の信号を直接放り込んだが、特に動作が不安定になることはなかった。