モノクロCRTCを作る

戻る



 モノクロCRTCを作ってみました。ビデオ信号入力端子のあるテレビにグラフィックを表示できます。

 H8などのマイコンに表示器を付ける場合、よくキャラクタ液晶モジュールが使われますが、「もうちょっと桁数、行数が欲しい」とか「もうちょっとグラフィカルで見栄えのする表示がしたい」と思うことはよくあります。しかしグラフィック液晶を使おうにも個人では入手が難しかったりします。そこで、ビデオ入力端子付きのテレビにグラフィックを出して見ようと思いました。

 実は、ゼロから回路を作ったのではなく、以前作った液晶モジュールG2436のコントローラに簡易D/Aコンバータを付け、CPLDを書き直すことによりCRTCにしています。
(このG2436コントローラ、わずかな回路を追加するだけでCRTCにもなるわ、漏る貧液晶コントローラになるわで、ほんとうに便利です)

 スペックは128×96ドット、16階調です。ちょっと解像度が低いようですが、私は3インチくらいの携帯テレビにつなぐことを目的に作ったためあえて低めの解像度にしました。あまり細かくしてもドットがつぶれるので意味がありません。
 階調は、以前P/ECE(アクアプラスの携帯ゲーム機)を使ったとき4階調ではちょっと足りないと思ったので増やしました。8階調くらいでもいいかな、と思ったのですが、8階調だとドットあたり3ビットというのがハンパに思えたので、16階調にしました。

 そもそもの目的が「キャラクタ液晶よりちょっと上の表現力」ですから、いちおう今後これ以上解像度や階調を欲張るつもりはないです。またカラー化なども視野には入れていません。カラーにするとなるとD/Aコンバータが3組も必要になり、さらにRGB−NTSC変換回路も必要で、ちょっと気軽に作ってみよう、と思えるようなものにはなりません。

・画像表示例

 左側の小さい画像が元画像、右側の画像が実際にテレビに映っている画像です。テレビの画面はテレビとデジカメの相性のせいか、へんなモアレが出ていますが実際に肉眼で見るともうすこし綺麗です。

・アニメ調の絵


 背景の微妙なグラデーションが消えているのが残念ですが、はじめから16階調を意識して元絵を描けばもうすこし綺麗になると思います。

・風景写真


 当初、16階調じゃ写真なんか綺麗に出ないだろうな、と思っていたのですが意外といい感じです。

・文字


 12×12ドットの文字を出してみました。日本語表示はちょっと苦しいかもしれません。半角文字で良ければもっとたくさん文字を出せます。(たとえば6×8ドットのフォントなら22桁×12行出せます)

・簡易D/Aコンバータ

 回路図です。基本的な構成は、電流加算型D/Aコンバータでアナログにして、エミッタフォロワでインピーダンスを下げるという回路です。D3〜D0の入力全てが”H”のとき出力は約1Vになり、全て”L”のとき出力は約0.3Vになります。
 下側のトランジスタは同期パルス用で、SYNCに”H”のパルスが入ると出力は0Vになります。


 全体像です。左のコネクタでG2436コントローラとつながります。右側に出ているのがビデオ出力で、私の手持ちのテレビに合わせてミニプラグにしました。


 部品面のアップです。


 ハンダ面のアップです。


・作り方

 まず、G2436コントローラを作ってください(液晶モジュールG2436自体は今回は必要ありません)。なお、メモリは628512 55ns専用になっています。628128は使えませんので注意してください。
 また、G2436コントローラ上のH8/3052には「超ミニBASIC for H8/3048」に同梱されている cmb3052.mot を書き込み、CPUモードを6にしておきます
 次に、回路図どおり簡易D/Aコンバータを作ってつなぎます。毎度のことですが、配線チェックはしっかり行ってください。
 配線に問題が無ければ、G2436コントローラ上のCPLD(Xilinx XC95108 PC84)をモノクロCRTC用に書き換えます。(VHDLソースはこちら)
 うまく動いていればこの時点で、ビデオ出力にはたまたまそのときRAM上にあったランダムなパターンが出ていると思います。

 次に、以下のBASICプログラムを実行してください。
(80番までがバスの設定で、実際に描画しているのは100番〜120番です。110番のPOKE文を見ると、VRAM構造が非常に素直で理解しやすい構造になっていることがわかると思います)
 10 POKE &P1DDR,$FF:POKE &P2DDR,$FF 'ADDRESS BUS
 20 POKE &P4PCR,$FF ' PULL-UP ON
 30 POKE &P5DDR,$FF ' ADDRESS BUS
 40 POKE &P6DDR,$FF ' OUTPUT
 50 POKE &P8DDR,$FF ' OUTPUT (USE CS)
 60 POKE &PADDR,$FF ' OUTPUT
 70 POKE &PBDDR,$FF ' OUTPUT
 80 POKE &WCER,$0   ' DON'T USE WSC
100 FOR Y=0 TO 95:FOR X=0 TO 127
110 POKE X+Y*128+$200000,X/8
120 NEXT:NEXT

 画面に以下の写真のようなグレースケールが表示されれば成功です。

(この写真も、テレビとデジカメの相性のせいか画面の左上が妙に暗く、右下が妙に明るいのですが、実際には明るさの変化は左右方向のみで、上下方向には明るさは一定です)

・データコンバータ

 例によって、画像データをPOKE文スクリプトに変換するコンバータを作りました。今回のは、カラー画像もちゃんとモノクロ16階調に変換してくれます。(ディザリングなどは行わず、単純に輝度を16レベルに変換します)
 このツールが欲しい人はメールください。

 変換開始前


 変換後


 出力されるPOKE文スクリプト
POKE $200000,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D
POKE $200010,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D
POKE $200020,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D
POKE $200030,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D
POKE $200040,$D,$D,$D,$D,$D,$2,$5,$5,$5,$5,$4,$D,$F,$F,$F,$F
POKE $200050,$F,$F,$F,$F,$F,$F,$F,$A,$5,$5,$5,$5,$5,$5,$5,$5
POKE $200060,$A,$F,$F,$F,$F,$F,$F,$F,$F,$F,$F,$F,$3,$5,$5,$5
POKE $200070,$5,$5,$4,$5,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D,$D
 :
(中略)
 :
POKE $202FE0,$B,$A,$7,$8,$6,$B,$B,$D,$C,$B,$B,$B,$B,$B,$B,$B
POKE $202FF0,$B,$B,$B,$B,$A,$8,$8,$D,$D,$D,$D,$D,$D,$D,$D,$D