RGBI対応アップスキャンコンバータ

2010.1.9 初版
2014.1.30 第二版 改造に伴い内容修正、リンクを修正
2014.2.18 第三版 水平ブランキング対応
2018.11.13 第四版 MZ-2200モノクロCRT出力対応

 レトロPCやゲーム基板の映像を映し出すアップスキャンコンバータはいくつかあっても、ちょっと特殊なデジタル映像仕様であるRGBIに対応したものは皆無。そうでなくても水平同期周波数15.6kHz・縦200ライン表示に(正式に)対応するモニタの確保に苦労する時代、イベント展示のためにこれを解決するオリジナルのアップスキャンコンバータを作ってみました。

レトロPC用モニタがない!

 昨今のPCディスプレイは液晶化・高解像度化と機能向上にめざましいものがありますが、水平走査周波数15.6kHzという画面出力を持つレトロPCユーザーとしてはそのまま使えるディスプレイが皆無に近く、現役当時のCRTモニタなんかもそろそろ寿命が気になってくるところです。いや、実は老朽化で画質がぼやけていたりするのを、気づかないふりをしているだけなのかもしれません。レトロPCを使い続けるためには、本体の維持も重要ですがモニタの確保もまた重要なのです。

 そこで登場するのがスキャンコンバータ。特に1980年代前半に登場したような低解像度のパソコンの画面を今時のモニタに表示するためには、「アップスキャンコンバータ」と呼ばれるものが必要です。ショップで容易に手に入るアップスキャンコンバータはゲーム機用のものがほとんどですが、マイコンソフトの「XRGB-3」「FRAMEMEISTER」やaitendo液晶自作キットのように汎用のものもあります。
 しかし、ここでいう「汎用」というのが、実は我々にとって汎用ではないという残念な話があるのです。これらのアップスキャンコンバータがサポートする、いわゆる15kHz(つまり15.6kHzのことね)のRGB出力は、アーケードゲームの基板の出力のことを指しているのです。ほぼレトロPCのRGB信号と同様とはいえ、同期信号を若干加工する必要があって、ちょっと面倒なんですよね(スキャンコンバータ自作より簡単だろうとツッコんではいけない)。

 2009年5月のオリフェス展示に向けて、あまり大きくなく持ち運べるモニタとしてPanasonicのCF-L10を落札。当初は市販のアップスキャンコンバータユニットか基板を組み合わせて使う予定でした。

 これがCF-L10。型番の通り10.4インチ液晶モニタです。ちょっと古いのでベゼルが太いとか、厚みがあるとかありますけどたいして重くなくちょうどいい感じです。今まではビデオ出力をポータブルDVDプレイヤーにつないでモニタ代わりにしていたのですが、解像度は低いし小さいしでなんとかしたかったのですよ。  このモニタの特徴が、640×400ドット対応表示。PC-9801との接続を考慮して設計されていたようですが、MZ-2500X1turboなんかを考えてもありがたい仕様。さすがにMZ-3500とか、当然ですが15kHzのRGBには対応していませんでしたが。

 しかしですね、それでなくてもMZ-700本体と拡張I/Oユニットがあるのに、このモニタと、さらにスキャンコンバータにも電源が必要なわけで、この不格好さをなんとかしたいと考えるようになってきました。もちろん世の中には紅茶羊羹さんスキャンコンバータのように、MZに内蔵させることで究極のスマートさを実現しているものもあるのですが、私としては汎用にこだわりたい。

 その最大の理由がMZ-800です。せっかくMZ-800を手に入れたものの、ビデオ出力はPALだし、RGBI入力できるモニタは捨てちゃったし(実は最近、信号配列が違っているので手持ちのケーブルではRGBI表示できなかったことが判明)で、手元であまり実力を発揮できていませんでした。あるソフトはカラーを捨ててモノクロモニタにつなぐことで16階調のグラフィックを表示したりもしているのですが、当然それもできません。ですので、スキャンコンバータを入手するならそれが可能なようにしたいのです。

 悶々と考えるうち、まず15kHz対応としてFPGAを使って作っておけば、後々改造とかで機能アップも可能じゃないかと思うようになってきました。幸いにしてFPGAの中身もあまり複雑にならなさそうだし、手持ちの部品とケースを組み合わせてみるといい感じに収まりそうだしで、思い切って作ってみたところ、なかなかいいのができましたので、まぁ市販品とは性能面で比べられませんけど、ここで紹介します。


外観

 このアップスキャンコンバータの、一番の自慢が外観。製品と見紛うばかりの完成度をご覧あれ!

出力側 入力側
上面

 完成度が高いのは外観だけだけどな!

 ケースはタカチMX型モバイルケース(PDF)です。別の工作の検討用として、買ったもののそのままになっていたのを活用しました。このケースが感動的なのは、ネジ以外の製品としての部品がABS樹脂製のパネルとアルマイトの本体上半分しかないということです。パネルは前後同じですし、本体は上下を組み合わせることでがっちり噛み合うようになっています。若干遊びはありますがネジがそれを押し広げて固定してくれますので大丈夫。本体は押し出し加工で作られているので長いのを作って必要な長さに切り出せば良く、中は基板を差し込む溝が入っている(サンハヤトの基板がそのまま入れられる)ので特に基板固定の必要もなし、と量産も使い勝手も両方とも高いレベルで満足した製品なのです。買ったのはMX2-8-10という仕様のものです。こちらのシリコンハウス共立のブログも参考にしてください。
 使い勝手の良さを実感しているのはアマチュアやカスタム製作の現場だけではなく、メーカーも同様のようです。例えばラトックシステムはPC制御のSPI/I2CコントローラとしてREX-USB61という製品を出荷していますが、この筐体がまんまMX型ケースなのです。MX型ケースのカタログにも採用事例が掲載されたりしています。

 続いて入力・出力のコネクタについて。

 左の四角いコネクタは、昔懐かしモニタ側のRGBコネクタ。というか見せても忘れてる人が多くて悲しかったよ〜。昔はいろんなコネクタメーカーが製造していたはずですが、現在ではヒロセサミコン1600シリーズという名前で製造しているものが唯一でしょうか1300シリーズとして製造していたものでした。つまりこれは新品、2009年2月に秋葉原高架下の福永電業で買いました。
 端子数も多彩で根強い需要があるのだろうなぁと思っていたら材料が入手できなくなったとかで2013年6月で製造が終了してしまいました…。

 真ん中の丸いのはACアダプタを接続するDCジャック。スキャンコンバータの電源と液晶モニタの電源を兼ねています。

 右の丸いのはスイッチで、12接点のロータリースイッチのツマミになっています。それぞれRGB、RGBI、8/16階調グレー、グリーン、スルー(スキャンコンバートしない)が選べるようになっています。電源スイッチはなしということで。
 左のコネクタは説明するまでもなく、VGA仕様のコネクタ。ある意味、何の変哲もありません。

 右のコネクタは説明するまでもなくUSB…ということではなくて、USB-Aコネクタを流用した電源コネクタ。モニタの電源コードとして使用できるケーブルの反対側がたまたまUSB仕様だというものを千石電商で手に入れたので、それに対応させたというお話。電源の極性は逆だしヒューズとかポリスイッチもないし入力側につなぐACアダプタは15V出力だったりしますのでここに別なものをつながないこと>未来の自分。 電源の極性が逆というのは勘違い。液晶モニタ更新に伴い5V仕様に変更しました。

 まぁ15Vなのはモニタの電源電圧の話なので、それが必要なければ5V入力でも使用できます。

 まぁこんな感じで、片方を入力・もう片方を出力としてまとめられたのも気に入っているところです。何かのアダプタケーブルよろしく、途中にこのスキャンコンバータが挟まっているのはVGA変換ケーブルっぽい使い勝手になるじゃないかと。無理ありすぎ?


中身

 ではいよいよ中身について。

 両端のパネルのネジを外すと、分解できます。出力側のコネクタが基板に固定されているためパネルが外れますが、入力側はパネルにコネクタを固定しているためこの程度しか外れません。

 基板の大部分を占める緑色のボードが、CQ出版社デザインウェーブマガジン2007年7月号付録FPGA基板です。使われているFPGAはXC3S250E(Spartan-3E)。はじめはオプティマイズEZ-FPGAも考えたのですが、搭載されているFPGAであるXC2S100(Spartan-II)の内蔵メモリブロックが少ないこともあって、別のを探していたら思い出しました。ええ、基板付き雑誌を買うだけ買って使わなかったものが山のように…。

 付録FPGA基板にはコンフィグROM、クロックモジュール(32MHz)、レギュレータ、レギュレータ用コンデンサを追加で実装しています。

 こちらはFPGA基板の裏側。ケースの高さが足りないので、コンデンサは裏面につけてあります。雑誌記事では25V品が指定されていますが、15V電源をつなぐことを考えて50V品に変更。

 レギュレータは回路のこともありますのでLM317T互換品ですが、取り付けたのは秋月で買ったJRCのもの。全体が樹脂モールドで覆われているので安心です(普通のレギュレータと違い、放熱部がGNDではなく電源出力端子に接続されている)。LM317Tは出力に抵抗を2つ接続することで電圧が可変できるタイプで、その電圧は抵抗の比で決まるのでとっても簡単。出力電圧と入力電圧の差が40V以内であれば高い電圧を与えても壊れないというなかなか便利な製品です。
 このレギュレータも、高さが足りないのでちょっと工夫して取り付けています。
 こんな感じ。本当は放熱のためケースにネジ締めで固定した方がいいのでしょうが、直接触っていてもほんのり暖かいな(一晩触れていたら低温やけどにはなりそうだな)というくらいなので、まぁ大丈夫でしょう。

 付録FPGA基板はマルツ電波にてリピート品が発売されていますので、欲しい人はそちらへどうぞ。

 さらにFPGAボードを取り払ったところ。

 ベース基板は秋月で買ったBタイプと呼ばれる基板です。実はこの基板、大きさとしてはサンハヤトのICB-93SGHと同じ大きさで、穴がよりたくさんあいているというお得仕様だったりします。
 そして、使用しているケースの想定している基板がICB-93SGHなので、こちらも同じように使用できるというわけ。まぁ短辺を微妙に削らないとぴったり閉じられませんが、最初から隙間があるよりいいじゃないですか。

 FPGA基板を取り付けている黒い角コネクタは、オムロン形XG4H。他のメーカー品に比べて1mmほど背が低く、今回のような用途には最適です。

 上の方の青い部品はフジソク(現・日本電産コパル電子)のロータリースイッチで、この写真を撮影した時は4接点が3回路入ったものを実装しています(改造にて12接点1回路のものに交換)。この部品は十何年か前に買ったもので、当時はRGB切り替え器とかオーディオ用デジタルの切り替え器とかを作りたいと思っては部品を若干集め、頓挫するといったことを何度もやってましたなぁ…。何年か越しについに作ってしまいましたが。
 しかし今フジソクや継承した日本電産コパル電子のサイトに行ってもこの製品は見あたりません。真似るなら別の製品にしないといけないわけです。

 USBコネクタはベース基板に直づけですが、VGAコネクタはサンハヤトの変換基板を利用しています。最近のマザーボードにあるような、薄型のものとかないかと探したんですが見つかりませんでした。
 裏面は…配線しやすいように適当に並べた、というだけのものです。RGBI入力とか電源とか、色分けすれば分かりやすいのですが生憎手持ちがなかったもので。

 あと穴があいてるのに使われてないように見えるのは、気にしないように。現物合わせで穴あけしているから、合わせ方間違えて変なところにあけちゃったなんて恥ずかしくて言えません。

 というわけで、部品を詰め込むとこんな感じ。

とりあえず詰め込んだ、出力側 とりあえず詰め込んだ、入力側
テスト動作中

回路

 特にどうという回路があるわけでもないんですが、まずは回路図から。

 CN2からVGA(CN7)方向に生えている抵抗の列は、各色4bitのラダー式D/A。よくある回路と違いますが、引用はSpartan-3A/ANスタータキットマニュアルから。どうも75Ωインピーダンスのケーブルが接続されることを前提として、ちゃんと動作するようになっていると解釈するのが良さそうです。

 元がON/OFFしかないRGBIなのに4bit D/Aにしているのは、16階調グレーを実現するためです。SW1はロータリースイッチで、記号的に正しくないですが動作上は問題ないということで。どれかがONでGNDが接続されて、その他はOFFでオープンということになるとプルアップが必要ですが、FPGAの端子にプルアップ設定をすることで部品を省略しています。

 また下記「MZ-2200 モノクロCRT出力対応」改造を行うまで、U1・HC245の入力端子が解放されないためのケアをサボっていました。モノクロモードではRGBとVSが全部入力されず、何も接続されない=解放されてしまうことから、プルアップ抵抗RA1を追加しています。

 この基板にスタックされるFPGAボードの回路はこちら(PDF)からどうぞ。コネクタの内CN2〜4はベース基板とFPGA基板で合わせてあります。またFPGAのデータはこちらからどうぞ。回路図もFPGAデータも無保証でよろしくお願いします。


スキャンコンバートする

 いわゆる15kHzとか200ラインとかのレトロPCに見られる画面と、一番解像度の低いVGAの仕様を、簡単に比べるとこうなります。

  レトロPC VGA
水平解像度 640ドット 640ドット
垂直解像度 200ライン 480ライン
水平同期信号 15.6kHz 31kHz
垂直同期信号 60Hz 60Hz

 VGAは他にもいろいろ仕様がありますが、比較用として。ここで注目は垂直同期信号がどちらも60Hzなのに垂直解像度が違うこと。1画面を表示するのにかかる時間は同じなのですが、それを縦方向に分割する数が異なるので、水平同期信号の周期を早めて対応しているということになりますね。水平同期信号が倍の速さになったのなら垂直解像度は倍の400ラインということになっているはずですが、さらに80ライン多いのは、古い仕様では表示領域に使われていなかった部分まで、VGAでは使っているという意味です。

 ではどうやって200ラインの画像データを400(480ラインの上下40ラインずつを使用しない状態)ラインに乗せるか、という話です。31kHzの2ラインが15kHzの1ラインなのですから、31kHzの2ラインのうち1ラインで表示してもう1ラインは黒いまま、という考え方もありましょうが、ここはやっぱり2ラインとも同じデータを表示して、ライン間を補完した方が見た目が綺麗ですよ。こういうのをラインダブラーと言ったりするみたいですね。

 ということで、速度変換しながらラインダブラーというものの考え方を次に示します。図で、矢印は画面上または信号上の走査線と考えてもらって差し支えありません。走査線に従ってデータが入出力されますのでね。黄色いのはバッファメモリで、その四角のひとつひとつが画素だとしてください。

 まずは(1)です。(1)の矢印の始点の時点で、バッファメモリにはこれから表示する画像データが前半に格納されています。後半はすでに表示に使った前のラインのデータです。
 出力側は、メモリの左端から表示を開始します。入力側はこの時点でメモリの真ん中に書込みポインタがあって、出力側に追いかけられるように右端に向かって入力していきます。ここで入力している画像データは今出力側が表示しているデータの残りになります。出力の(1)は入力の(1)の倍のスピードがあるわけですから、だいたい同じタイミングで両者とも右端に到達します。

 次に(2)です。バッファメモリにはさっき表示した画像データが端から端まで格納されている状態です。ここで出力側の(2)が左端から表示を開始します。と同時に、入力側の(2)が次のラインのデータを左端から入力し始め、前回表示した内容を上書きしていきます。出力側は入力側の倍のスピードで逃げていき、右端に到達した時には入力側の(2)は真ん中に来ているはずです。これで(1)に戻ります。

 メモリの両端のところで入出力が錯綜してデータがおかしくなりそうですが、これを表示データの前後のブランキング時間にまで広げてしまえば、おかしくなったところで表示されません。そのおかげで端について厳密な設計を省いています。

 次に、ドットクロックの話です。
 MZ-700、というか画面出力回路では、何らかの基準信号に基づいて各ドットが出力されているはずです。それをドットクロックなどといっています。ドットクロックの周波数は、結果として画面上にドットの横幅の大きさとして現れてきます。といってもそれはあくまでアナログ的に処理している場合の話で、各ドットが画面上の画素として独立して存在している液晶画面のような表示装置では、どこかでデジタル的に処理されることになっているはずです。
 とは言え、液晶モニタの内部の話となるとそれはモニタにお任せするしかないわけで、こちらとしてはそれぞれのドットを正しく送り込むことに専念するしかありません。それよりも、スキャンコンバータゆえに一旦表示データを取り込むという構造上、コンバータ内のドットクロックをどうするのか、というのが本題です。

 普通に考えれば、1ドットにつき1クロックが対応するような周波数で取り込めば、送り出しもそれぞれのドットを区別してやることができるはずです。しかし困ったことに、CRTモニタのカタログで確認しても、ドットクロックは約14〜16MHzと機種により幅があるため、決め打ちしてしまうと画面全体の幅が狂ってしまいます。

 さらに、仮にドットクロックが一致しているとしても、位相がどうなっているかの保証がありません。下の図のようにドットの変わり目にクロックエッジがあって回路のタイミング規定に合致しない場合、どうなってしまうんでしょうか?

 こういう場合設計上は「不定」ということになりますが、論理値に不定という値があるわけではなく、いずれ0か1のどちらかに落ち着きます。もっとも落ち着く前に「メタステーブル」と呼ばれる状態に(短時間ですが)陥り、中間的な電圧状態になることはあります。
 なんにしても非同期信号として受け取らざるを得ないために、データを取り込めるのかどうかが保証されないのが問題です。もし取り込まれてなければ、上図の結果の左側のように1ドット消えてなくなってしまうわけですから。

 そこで今回は、もしかしたら取り込めないこともあるかもしれないというのを前提に、4倍速いクロックで取り込んでみることにしました。つまりはオーバークロックサンプリングですね。

 理屈では、1クロック取り込めなくても残り3クロックで取り込めるので、消えてなくなるということはないはずです。ドットの幅は若干変動しますが、なくなるよりはマシではないかと。もっとも理想はもっと高速のクロックで取り込むことで、速ければ速いほどアナログの動きに近づいていくはずです。

 その効果の程は…けっこうチラつきが発生しているので、つまり取り込めたり取り込めなかったりがあるようで、期待した程ではなかったかも。本格的にはPLLとか使って同期信号なんかからドットクロックを作り出すところなんでしょうけど、そっち方面の知識はまだまだ浅いもんでねぇ…。あとやるとすれば簡易なDDS(ダイレクト・デジタル・シンセサイザ)を組んでドットクロックをある程度可変できるようにしたり位相をずらしたりするぐらいでしょうか。課題は回路でなくそれを調整するボタンなんかをどのように実装するかなんですが…。


RGBIについて

 その昔、RAMのビット単価がまだ下がっていなかった頃、パソコンの画面出力における色の数は無表示の黒も合わせて8色でした。まぁ下には下があって、4色だったりモノクロ(2色)だったりしたものもあるのですが、それは横に置いておきまして。
 もちろん予算が許せば各色何bitも並べて4096色とか32768色とかしたいところなんですが、立ちはだかる問題はRAMのビット単価だけではなく、パソコンとモニタのI/F仕様にもありました。R・G・B各色をON/OFFで表現できる8色の場合は全部デジタルで伝送すればいいんですが、では中間色を表現したい時どうすればいいんでしょう?

 これをアナログRGBとしてコネクタ仕様も含めて一般化するのは私の記憶では1986年以降だったと思います。その直前にアナログRGB化したMZ-2500は、信号そのものには互換性がありましたが、コネクタがデジタルRGB時代のままだったところに過渡期の混乱が伺えます。
 そうではなくて、デジタルRGBの時代に中間色を表示させるためのI/Fとして考え出されたのがRGBIです。つまりRGBの光の三原色に加えてインテンシティ(輝度)を表す信号を伝送することにしたのです。IのON/OFFで明るい赤・暗い緑とかいうような表現が可能になりました。RGBIで4bitだから、16色ですね。

 これでデジタルRGBのまま中間色の表示が可能になったわけですが、各メーカーとも採用に積極的ではなく、シャープではMZ-2500/2800とMZ-800に採用されたぐらいで後はアナログRGBに移行しています。

 以前からRGBI→アナログRGBの変換についていろいろ考えてきたのですが、抵抗を噛ませてワイアードORなんかの方法でうまくいくわけがなく、結局回路を作ることになりました。今回はFPGAなのでテーブル引きというお手軽な方法で実現しています。

入力 8色モード 16色モード 8階調グレーモード 16階調グレーモード Iなしグリーンモード Iありグリーンモード
R G B I 表示 R G B 表示 R G B 表示 R G B 表示 R G B 表示 R G B 表示 R G B
0 0 0 0 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
0 0 1 0 0000 0000 1111 0000 0000 1000 0101 0101 0101 0001 0001 0001 0000 1111 0000 0000 1111 0000
0 1 0 0 0000 1111 0000 0000 1000 0000 1100 1100 1100 0110 0110 0110 0000 1111 0000 0000 1111 0000
0 1 1 0 0000 1111 1111 0000 1000 1000 1101 1101 1101 0111 0111 0111 0000 1111 0000 0000 1111 0000
1 0 0 0 1111 0000 0000 1000 0000 0000 1000 1000 1000 0010 0010 0010 0000 1111 0000 0000 1111 0000
1 0 1 0 1111 0000 1111 1000 0000 1000 1001 1001 1001 0011 0011 0011 0000 1111 0000 0000 1111 0000
1 1 0 0 1111 1111 0000 1000 1000 0000 1110 1110 1110 1010 1010 1010 0000 1111 0000 0000 1111 0000
1 1 1 0 1111 1111 1111 1000 1000 1000 1111 1111 1111 1011 1011 1011 0000 1111 0000 0000 1111 0000
0 0 0 1 0000 0000 0000 0111 0111 0111 0000 0000 0000 0100 0100 0100 0000 0000 0000 0000 1111 0000
0 0 1 1 0000 0000 1111 0000 0000 1111 0101 0101 0101 0101 0101 0101 0000 1111 0000 0000 1111 0000
0 1 0 1 0000 1111 0000 0000 1111 0000 1100 1100 1100 1100 1100 1100 0000 1111 0000 0000 1111 0000
0 1 1 1 0000 1111 1111 0000 1111 1111 1101 1101 1101 1101 1101 1101 0000 1111 0000 0000 1111 0000
1 0 0 1 1111 0000 0000 1111 0000 0000 1000 1000 1000 1000 1000 1000 0000 1111 0000 0000 1111 0000
1 0 1 1 1111 0000 1111 1111 0000 1111 1001 1001 1001 1001 1001 1001 0000 1111 0000 0000 1111 0000
1 1 0 1 1111 1111 0000 1111 1111 0000 1110 1110 1110 1110 1110 1110 0000 1111 0000 0000 1111 0000
1 1 1 1 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 0000 1111 0000 0000 1111 0000

 グレーモードは前述の通りMZ-800用ソフトのためのものですが、よく考えたらMZ-3500やMZ-2500/2800にはモノクロモニタ接続端子もありますし、MZ-2000/2200にはMZ-1X08というRFモジュレータがB/Wモードを備えていたりするので、それらを再現するのにも使えます。
 またグリーンモードはMZ-2000などの内蔵CRTの雰囲気を再現するためのもので、例えばキャリーラボのゲーム「JELDA」シリーズなどはアニメーションのため内蔵CRTで遊ぶことを前提に複数プレーンを交互に書き換えたり、「F2グランプリ」は絵の重ね合わせ処理を省くためプレーンを使い分けたりしているわけですが、当然ながらこれをカラー画面で見ると赤青が交互に点滅したり無意味に赤青緑が分離したものすごく見づらい画面になってしまうわけで、このモードによりこれを救済することが可能になるわけです(本当はロータリースイッチのポジションを全部使うために無理矢理ひねり出したモードなんですけど)。

 グレーモードが階調順に並んでいないのは、言葉通りの順に並べている入力と明度の順序が異なるため。こちとらモノクロモニタなんてありませんので、MZ-800エミュレータのグレースケール表示モードで確認しましたとも。

 MZ-2500のデジタル(RGBI)出力でそれぞれのモードの画面をご覧頂きましょう。

RGB RGBI
カラー
グレー
グリーン

5Vトレラント入力

 当初FPGAをEZ-FPGA搭載のSpartan-IIにしようと思ったのは、5Vトレラント入力があるからでした。RGBI信号は5VレベルのTTL信号なので、3.3V I/OのFPGAには直接入力できないからです。
 しかしいろいろ調べてみると、ザイリンクスのアンサーのページにて抵抗を噛ませば5V入力は可能であるとの記述がありました。そういえば、スタータキットにはPS/2仕様キーボード・マウスコネクタがあって、5Vのキーボードやマウスの接続も可能になっているじゃないですか。実際、Spartan-3A/ANスタータキットマニュアルにも270Ωの抵抗が噛ませてある記述がありますね。この方法を使えば、事実上5Vトレラント入力になるわけです。

 というわけでそのように回路を作ってみたのですが…何かおかしい。

 接続確認をするためにFPGAにはスキャンコンバータとしての論理は入れず(というかこの時点ではまだ全然作ってなかった)、入力をただスルーするだけの回路にしていたのですが、出てきたのがこの画面。なんか、電波障害でゴーストが見えているみたいですよね。
 何が起こっているのやら?ということでオシロで観測してみると、この通り。上が入力、下が出力で、まぁこれくらいはあるかなという入力のリンギングが、出力では見事にまともなHレベルに変換されてしまってます。
 3.3Vなのでせめて1.65V、LVTTL設定なのでもっと高いところに閾値があると期待していたのですが、現実には1V近辺にあると考えて良さそうです。

 つまりは、5Vトレラント入力というのは、5Vロジックの入力をしてくれるのではなくて、5Vを印加しても壊れないというだけのものだったということです。入力の特性はベースの3.3V I/Oとしてのそれに準じ、5Vロジックの世界で問題なかったとしても、3.3Vロジックの世界では異なる動きをする可能性があると考えないといけないことがわかりました。

 それならばなんとかして3.3Vロジックレベルに変換しないといけないわけですが、あまり本式じゃないものの特性上大丈夫と言われているものがHCMOSデバイスを使用することです。回路図のHC245がそれに当たります。HC245自体の電源は3.3Vで、閾値は1.65V(実際にはもう少し高いみたい)なので入力のリンギングはきっちりフィルタしてくれると期待できます。

 結果はこのとおり。見事にゴーストが消えていますね。もちろん実験用FPGAの回路は変更していません。変えたのは抵抗の代わりにHC245を噛ませたことだけ。

 5V⇔3.3Vの変換の方法はいくつかありますが、本式には2電源方式のレベルコンバータを使用すること。他の製作でも同じような現象に悩まされておりまして、今後はしっかりレベルコンバートしようと誓っているところです。


というわけで、(とりあえずの)完成

 なんかやっつけくさいところもありますけれども、趣味の工作としては上々。こんな感じで動いております。

 MZ-700に接続して起動時の画面を表示した状態。普通に使えますね。  ぴったん♪
 超絶技巧を凝らした動画再生プログラムでも、あくまでMZから出力された信号を加工しているので画面が崩れたりなんかすることはありません。

 オリフェスの会場では、表示させているのがあまりに普通すぎてVGAモニタに映し出していることに気づかない人もいたぐらい。

 MZ-3500でも使いたいと思って検討してみたんですが、メモリが足らなくてうまくいきそうにありません。結局15kHz専用になりそうですが、スルー設定もありますし、ウチではいろいろ活躍の場面がありそうです。

 ところでMZ-800の画面を表示できるかやってみたんですけど、全くダメでした。画面関係の基本周波数が違うが故に、タイミングもいろいろ違って思わぬ波形になっているのかも…道のりは遠いなぁ。

 …と思ったら、続くことに。


液晶モニタの変更と改造

 ある時、突然それまで便利に使っていたCF-L10が故障しました。電源が入らなくなったので中を確認してみると、表面実装型のヒューズが切れたらしく、そこから先に電気が通じておりません。単にヒューズの劣化なら交換すればいいのですが、真の原因が分からないことには…という議論の前に肝心の実装可能なヒューズが手に入りません。原因が何であれ修理不可能という事態のため、やむなくセンチュリーLCD-10000V2という小型液晶モニターを導入しました。

 実は姉妹機のLCD-8000Vが24kHzだけでなく15kHzの画面も表示できるという情報があったため、画面サイズが大きいだけで機能的には同等のLCD-10000V2もけっこういけるんじゃないかという期待を抱き、入手後早速MZに接続してみたところ見事にその画面を映し出したのです。

MZ-2800の2500モードにて、BASIC-M25の起動画面。LCD-10000V2は4:3固定表示モードもあるので、今時の横長画面でも問題なし。 MZ-1500にて、デモエースの画面。

 さらにそれだけでなく、なんとMZ-3500の特殊な画面(20.9kHz)も映し出して見せました。FRAMEMEISTERも追従しうる画面モードとはいえ、最近のマルチシンクな制御LSIならなんとかなってしまうものなんでしょうか?

MZ-3500のシステム起動画面(奥に本体)。さすがに変態仕様だけあって、ドットクロックや位相などを合わせることができず、縦線の太さがまちまちになっているのですが、とりあえず使用できるレベルと言えます。

 市販モニタでこれだけ表示しちゃうなら、スキャンコンバータなんていらないじゃん。製作に至った理由が根本的に否定されたわけで、若干の空しさを感じつつ、じゃあせっかくなのでそれまでコンバートしないスルーモードがRGBのみだったのをRGBIやモノクロでも使えるようにしよう、そうすればMZ-800でも使い勝手が良くなるよね…ということでロータリースイッチを交換し上記のように改造したのです。

 ところが…なんとLCD-10000V2はMZ-800の画面が表示できないことが発覚。最初はスキャンコンバータユニットの問題かとも思いましたが、直結でも表示できません(Not Supportと表示)。他にもMZ-2500の低解像度モード(カンガルーポケットのCRTスイッチをLにする)、X68000の15kHz・横384ドットモード(注:256ドットモードは表示可能)、ノーマルX1およびX1turboの標準解像度、さらにはPC-8801の15kHzモードも表示できないという情報も流れてきて、意外に守備範囲が広くなさそうです。

 しかし、何の気なしにスイッチをスキャンコンバートモードに回してみたところ、LCD-10000V2の画面にMZ-800のIPLの表示が…以前MZ-800に接続してダメだったのがウソのようですが、OSD表示にて画面モードを確認してみると800×600…つまりSVGAとして同期しているということは、そりゃあCF-L10のようなVGAオンリーのモニタでは表示できなかったということですね。そう言えばSVGA受け入れ可能なモニタで試したことありませんでした。

MZ-800のデモ画面を表示中。前述の通りI信号の端子配置がMZ-2500などと違うので、配置を入れ替える中継ケーブルも製作しました。

 MZ-2500の低解像度モードも若干横が足りませんがスキャンコンバートモードで表示できました。上の各色モードの違いを示した写真がそれになります。デジタルRGB専用なのでどうしようもないですが、アナログRGBが入力できたらX68000の15kHz横384ドットモードでも表示できるかもしれません。


水平ブランキングについて

 X1シリーズの純正デモソフトのうち、最も凝っていて派手なのがX1F付属のデモンストレーションだと思います。いろいろな表示技法を駆使した画面なので以前はエミュレータでは表示できない部分があるなど表示機構側に厳しいプログラムなのですが、エミュレータだけでなく実機でも表示に問題が発生することがわかりました。

デモ冒頭、七色の帯が上へスクロールする場面。帯がアナログっぽくグラデーションしているのですが、X1FはデジタルRGB機、こんな画面を想定していたとは考えにくく…。 龍のグラフィックの直前、絵のデータをロードする最中表示される「龍」の文字…が妙に暗い…。

 この現象は当ページのスキャンコンバータだけでなく、FRAMEMEISTERでも、さらに当時のアナログRGB仕様CRTモニタに直結しても発生します。逆に、X1turboZIIIで表示させるとこんな問題は発生しません。現象が出ているのはX1・X1F・X1turboなどのデジタルRGB出力マシン、出ないのはアナログRGB出力マシン。この違いは何なのでしょうか?

 …てなことをその筋の人に聞いてみたところ、「水平ブランキング期間に問題がある」ということがわかりました。
 このデモで現象が発生するのは、ボーダーカラーを使っている場面。X1のデジタルRGBは、表示データ以外の区間…つまりブランキング期間でもブランクにせずボーダーカラーを出力するようにできているというのです。アナログRGBモニタはブランキング期間に入力されている色信号の電圧レベルを0Vとする仕様なのだそうで、まぁ実際には1ライン表示するごとに徐々に変わっていくみたいですが、これをそのままアナログ変換して対応モニタに接続すると基準電圧が徐々に上がる→相対的に入力電圧が下がって見える…という理屈でグラデーションになるのだそうです。

 X1turboZIIIのアナログRGB出力ではこの区間をきっちりマスク(0V)しているので問題は発生しないというわけです。デジタルRGBではそもそもグラデーションを出力することはできませんし、入力側の回路としてこのような現象は発生することはありません。いやもしかしたらApple][用ソフトなどでブラウン管の「にじみ」を利用した着色のように、アナログRGBモニタを気まぐれで接続した人へこっそりと贈られたプレゼントだったりして…とも思ったりしたんですが、まぁ「龍」の字がハッキリ表示されないんじゃやっぱり違うよな…。それに当時まだアナログRGBモニタってほとんど出回ってないんじゃ?

 対策ですが、一瞬でも0Vに落ちれば効果があるかもってことで水平同期信号とANDをとってみたものの、微妙にマシになったぐらいのようで、根本的解決に至らず。結局はX1turboZIIIのようにブランキング期間は強制的に0Vにすることにしました。どうせVGA用の水平同期信号を作っているのですからブランキング信号も正確に定義することができます。ただ入力された色情報をそのまま出力している関係で、入力側のブランキング期間の影響を出力側が受けることになり、また入力側ブランキング期間の始まりと終わりがキッチリ規定されてはいないので、変なタイミングでマスクすると映像が一部消えてしまう可能性があります。とは言えブランキング期間の手がかりはないわけですから、今回はとりあえずX1を使って現物合わせすることにしました。他のマシンには追々検証するということで…。

 で、対策後はこの通り。

グラデーションすることなく、きれいに帯が表示されています。 こちらも「龍」の字がくっきり。垂直のブランキングには対応していないので、X1では普通表示されないサイズ(上下めいっぱい)で表示されています。

 もちろん水平ブランキング対応はスキャンコンバートモードでのみ有効にしています。スルーモードでは内部カウンタの動作に意味がなくなりますので…。

 MZ-800の画面も映し出せましたし、これで完成かな? まぁ多少ブランキングの調整の必要があるかもしれないけど…。


MZ-2200 モノクロCRT出力対応

 少々思う所がありまして、MZ-2200を入手しました。単純に言えばMZ-2200はMZ-2000から内蔵グリーンCRTと内蔵CMTを取っ払って外付けにしたパソコンです。ただMZ-2000はモノクロとカラーの両出力に別々の内容を表示できるとかいう機能がありましたから、互換性のためにモノクロCRT出力端子が備わっていました。

 しかしそのモノクロCRT出力端子、ちょっと変わっていまして…。

当時のパソコンのモノクロCRT出力端子は、通常丸DIN5ピンになっていて、反対側がRCAピン端子になっているケーブルを接続します。しかしMZ-2200のモノクロ端子は丸DIN8ピンです。他機種のモノクロ出力というのはコンポジットビデオ信号なのでGNDと合わせて2本しか使用しませんが、こちらのモノクロ出力は映像(Video)と同期(Sync)が別々になっていて、明らかにコンポジットビデオではありません。

 それもそのはず、MZ-2200のモノクロCRT出力はMZ-2000で内蔵CRTに対して出力していた信号をそのまま外に出しただけのものなのです。どちらの信号もデジタルのままで出せるので手軽だからなのか、PC-3200Sの出力もこれのようですし、他のメーカーでも採用事例があるらしいです。が、やっぱり業界標準に合ってないといろいろ不便…。

 しかしまぁ、せっかくデジタルで出力されてるわけですし、同期信号は水平・垂直が混合されてるだろうけどMZ-80A用にカラーボードを作った経験を応用すれば元の信号に戻せそうなのですから、RGBIアプコンに機能追加するのも面白そうです。てなわけでちょっと挑戦してみました。

信号の端子

 内部でどう処理しようとも、各信号が接続されなければどうすることもできないのでその検討から。モノクロCRT出力端子と言いながらカラー出力とおなじ丸DIN8ピンなのですから、カラー用のケーブルがそのまま接続できれば言うことなしなんですが…。

 カラーとモノクロの端子配列を比べてみますと、幸いにしてGNDが同じ、そしてモノクロのSyncとカラーのHsync(水平同期信号)が同じ位置にありますから、そのまま入力できますね。一方モノクロのVideoはカラーのNC(何も接続しない)とある端子の位置にあって、問題ありそうです。なんとかならんのか…。

 よくよく考えれば私のアプコンはRGBI対応なのですから、RGBの他にI入力があります。これがモノクロのVideoと同じなら良かったんですが、実際にはGREENとVsyncの間のNCが使われていて、残念ながらハズレなのです…いや…ちょっと待てよ、MZ-800のRGBI端子のI出力がREDとHsyncの間にあったじゃないか! MZ-800に接続するためI出力の場所を変えるアダプタを作ったのですから、こちらでも使えばRGBIのIのところにVideo信号が来るじゃないですか!

 なんとか、これで新たに特別なケーブルを作らなくても良くなりました。既にあるものを使えるのが一番です…。

同期信号の分離

 モノクロ出力のSyncは水平同期信号と垂直同期信号をXNORしたものになっています。MZ-80A用カラーボードでは、いい感じのところに水平ブランキング信号のタイミングがありましたので、それをちょこっといじってラッチ(オフ時は入力をスルー、オン時はオンになった瞬間の入力値を出力)パルスとして使っています。回路としては

とすることで同期信号を分離しているわけです。今回も同様の手順で分離するのですが、水平ブランキング信号に相当するようなものはモノクロ出力から出てたりしませんから、自前でなんとかする必要があります。

 というわけで、こんな感じになりました。

 複合同期信号、つまりSyncは垂直同期以外の時間は水平同期のLパルスが出ていますが、垂直同期の時間は反転してHレベルの水平同期パルスが出ています。この水平同期パルスの周期で一周するカウンタを設けて、そこでチェックポイントのタイミングを作ります。

 チェックポイントは1と4のようなパルスより少し広めのものと、2と3のような少し狭めの計四ヶ所に設定しています。それぞれのタイミングで、

のいずれかの組み合わせなら、同期が取れていると判断します。右にあるパルスのように少しずれているものだと【L, H, L, L】となりますので、タイミングが少し遅れていることがわかります。検出されるパターンをもとに遅れているのか早まってるのかを判別し、カウンタを進めたりちょっと戻したりすることで、大きくタイミングが外れることがないようにしています。

 チェックポイントの1と4より少し広めの幅で、ラッチパルスを作ります。そうすることでタイミングが多少前後しても、確実に水平同期パルスを除いた信号がラッチできるようにしています。このラッチパルスが、MZ-80A用カラーボードでの水平ブランキング信号を加工したものと同じように使えるわけですね。

モード切り替え

 表示モード切り替えスイッチをまたいじってモノクロ入力モードを設けようかと少々考えたのですが、いくらグリーンモードがこじつけだったと言ってもさらに加わるモードをどう意味づけしていったらいいものか…というかモノクロ出力を表示させるということではグリーンモードってすごく存在意義があるんでは?! ということで切り替えスイッチはそのままということに…。

 その代わり、モノクロ端子が複合同期方式であるがゆえにカラー端子における垂直同期信号出力に相当する端子がNCなのですから、この端子に信号があるかないかを検出できればモード判別が可能になるはずです。

 実際にやってることは簡単で、ある一定時間の間に垂直同期信号と思われる信号の変化があればその一定時間を測るタイマーをリセットし(カラーモード)、一定時間がオーバーしたらいつかまた信号の変化が訪れるまでタイマー関係無しに待ち続けます(モノクロモード)。そのどちらで落ち着いているかを信号のH/Lで表せられれば、それがモード信号ということになります。

 モードによって、次の信号が切り替わるようにしました。

水平同期出力の安定化

 原理的にはこれで大丈夫なはずなのですが、どういうわけかセンチュリーのLCD-10000V2では表示されません。X1シリーズ用コンソールエミュレータにて開発中に表示されなかった時は信号がないというメッセージが出たのですが、今回はちょっと違ったようで、何か惜しいと思う信号を受けてるのかバックライトが消えたりはしないんですね。もうちょっと粘ってれば同期できそうとか、思ってるんでしょうか。

 惜しいというなら、どう惜しいんだろうとちょっと悩んだんですが、同期分離したという意味では元は同じ信号だと思われるカラー化したMZ-80Aの信号だとちゃんと映せるんですね。一方で液晶モニタを替えてみると、例えばEIZOのM1950-Rだったら映るのですよ。それなりに申し分なく。

 信号を一部加工してみたりとか同期分離部を疑ったりとかいろいろ考えた挙げ句、到達した結論は水平同期出力に問題があるということでした。そして実際に、オシロでよくよく観測してみれば100nsくらいの幅のジッタが発生しているのです。出力する水平同期信号のタイミングの元は入力する水平同期信号です。ジッタがあるということは、入力する信号に既にジッタがあるということを意味します。モノクロモードの同期信号は水平・垂直を分離したものですが、上記の通り水平同期信号はラッチパルスより狭い幅ですからジッタはMZ-2200内部で発生していると考えて良いでしょう。

 入力する水平同期信号のタイミングから直接的に出力する水平同期信号のタイミングを決めるため、つまり入力の信号変化に敏感な出力になっていました。ここは既に100MHzでサンプルしているところですから、サンプル時に発生するジッタは10nsしかないはずですし、ジッタ自体を消すことはできません。
 そこで、入力の変化に鈍感にすることで出力の変化をジッタに見えなくするようにします。具体的には、入力の一周期分のカウンタを使ってタイミングを作り、同期するタイミングからずれていればカウンタを早めたり戻したりする…というのは同期分離の話と似てますが、一定回数連続でずれないとカウンタの調整を行わないことにしたわけです。そうすれば、1回だけピョコンとずれても次に元の位置に戻ってくるのであれば対応しなくて良くなりますし、平均的に前後にずれてるのであれば、だいたいその中央ぐらいのところで落ち着くことになるでしょう。

 という想定の下に水平同期信号生成部を組み替えてみると、狙い通りLCD-10000V2でもちゃんと画面が映るようになりました。

  モノクロ出力 カラー出力
ノーマル画面
反転画面

 ちなみに、MZ-2200は画面の反転(CONSOLE R命令を実行)するとボーダーエリアがその時設定されているキャラクタ画面の色(注:MZ-2000/2200はキャラクタ画面は全体で一色しか設定できない)で埋められ、X1の時と同じ問題が発生してしまいます。もちろん対応済みのわがアプコンなら問題なく表示できます。RGBIと強制水平ブランキングは自作ならではのオリジナル機能。ここに今回、複合同期信号対応も加わったわけです。

 これで本当に、もう機能追加は最後だよね…? またそのうち、何かネタが浮かび上がるんだろうか…。

戻る