ゲーム基板互換の映像をFPGAからPC向け液晶モニタに映すときの仕様策定

  • 本物のゲーム基板の映像を映す話ではありません
  • サンプルとしてアップしている映像は静止画像データを表示しているだけでゲームは動きません

基本的な事

古いゲーム基板ではアナログRGBがでていてこれらの信号は低解像度(312x224pixelとか)です。これらの映像は PC 向けモニタに直接つないでも信号が遅すぎて映らないことが基本です。

pixel clock

アナログRGBのコネクタの配線をみると書いてない言葉、それが pixel clock です。1 pixel を更新する基準の clock ですが、アナログ信号+ブラウン管ではなくてもそんなに早くないのでなんとかなります。
この関係で表示領域の幅はアナログに調整することが出来ます。(ここ重要)

一方最近(と言っても定着して10年ぐらい経ってますが)のデジタル信号+液晶モニタでは高解像度化が進み、pixel clock は必ず伝送信号に含まれています。安物のケーブルとアナログで出すとにじむように見えるのは pixel clock が含まれていないことも原因の一つとなります。

少ない表示画素数を2倍にする

FPGAで移植する際、遅い信号は早い信号を出すことにしてしまいます。
例えば 312x224 pixel の場合は、 1 pixel を縦横ともに 2 倍にすることによって 632x448 pixel になります。

この場合は本来の映像の pixel clock を 2倍の早さにして横の画素を2倍、1度表示した横ラインをもう1度描画することによって縦の画素も2倍にすることで PC 向けブラウン管にはあっさり映すことができます。
縦横の比が気になる場合は調整すればきれいになります。

液晶モニタにきれいに映すには規格に準拠すべき

液晶モニタでは話が変わります。前述の映像信号を液晶モニタに繋いだときには勝手が異なるかもしれません。
縦横の比が気になる場合も同様に調整しようと思うと、縦は調整できないでしょう。横は調整できるかもしれませんが、縦に波を打ったような違和感を感じたり、1pixelがにじんだりしてきれいにでなかったりします。

液晶モニタの場合は構造上アナログな調整ができないので、1 pixel をきれいに表示するには、モニタの説明書の仕様の部分に書かれた推奨する映像規格を使う必要があります。そしてその規格に記載された pixel clock に準拠すべきです。
例えば先ほどの、 632x448 pixel は VGA 640x480 (Vsync 59.94Hz) に準拠すると、若干の空白はできますがきれいに映ります。

VGA 規格に準拠することで、本物のゲーム基板とは違う実装になるというのは避けられないというのが実情です。大半のゲームプログラムでは Vblank を基準に動いていますので、これらの周期が若干変わることでゲームプログラムが本物と違う動作をしてしまうという可能性はあります。
ただ可能性があるだけで、元のプログラムはものすごくテキトーに書かれたものか、ハードの性能を100%使い切るために限界までプログラムを組んだ場合(特に家庭用)に問題になることが多いので、再現精度の低下はそこまで高くないと思われます。

横幅321pixel以上,縦幅224pixelではどうするか

ここからが本題です。これらの古い映像規格では決められた表示時間は決まっているものの、横幅の画素数を増やすために横幅を詰めていくものが存在すると言うことです。

例えば Capcom のゲーム(384x224pixel)はエミュレータで見ると横長になっている(4:2.333..)ものの、ゲームセンターで見る同じゲームの縦横比は他のゲームと変わらない 4:3 というのもこれが原因となります。

単純に横と縦を2倍にした場合は 768x448 pixel となり、VGA 規格(640x480 pixel) では横幅がおさまりません。SVGA 規格 (800x600 pixel) では横幅が収まり切るもののエミュレータの画面のように横長の画面で違和感を感じます。

試しに VGA (640x480 Vsync 59.94Hz) の規格から pixel clock 規定を意図的に無視して表示領域を400x448、ほかの時間は規格通りに実装して液晶モニタに映します。

(注意:静止画像データを表示しているだけでゲームは動いていません)


一応 4:3 ぐらいの比率で映ってるんですが、1 pixel がきれいに出てないです。下に並べた 1 pixel おきの白い線をみてみると、何本かに1本はにじんでいたり、太さが違っている物があります。
これが pixel clock を守らないことで発生する横方向のにじみです。

高解像度にして整数倍で調整する

推奨規格の pixel clock を守ることで液晶モニタには 1 pixel はきれいに表示されるのであれば、高解像度にしつつ元の 1 pixel を縦横整数倍に調整することは可能です。
計算したところ 384x224 pixel は横3倍,縦4倍にすると 1152x896 となり、縦横比は 4:3.111.... となります。1152x896 の可視領域は VESA規格 1280x1024 の中に収めることができます。


これに合わせて作った映像が写真のようになります。


下に並べた 1 pixel もにじみもなく均等に表示されていることがわかります。このような調整をすることによって、4:3 ではない可視画素数をほぼ 4:3 の画面できれいに表示できることがわかりました。

しかし... 元のゲームの pixel clock が 8 MHz なのに対し、VESA 1280x1024 の pixel clock が 108MHz というとても速いスピードで計算することになってしまいます。

横の拡大画素数が 3 であることと横の全体領域が 3 の倍数ではない(1688 pixel)ため 108MHz で動かす必要があります。仮に2倍であれば全体領域数が割りきれるために pixel clock を 54MHz として、分周数を1/2にすることで同じ時間にできます。