ファミコンをRGB化するボードが31年間登場しなかった理由(PPU載せ換え以外の方法で)

前回の続きです

ファミコンは標準でRF端子しかなく、ぼやけた映像しか出力できなかったことは
覚えている方も多いかと思います。
なぜファミコンではRGB出力対応に改造したりすることが難しいかを考察したいと思います。

なぜ今までファミコンをRGB化するボードが登場しなかったか

ファミコンのPPUの端子であるEXT0〜EXT3から、4bitの映像信号が出ているので、RGB化の余地はありましたが、

  • EXT0〜EXT3の映像信号はRGB信号ではなく、パレットカラーのインデックス値になっていること
  • パレットRAMはPPU内部にあり、その内容は外付け回路からはアクセスできないこと
  • パレットはスプライトとBGの合計で32個あり、4bitのインデックス値だけではRGBに変換できないこと

以上の理由により、ファミコンをRGB化することが難しい状況でした。


NESRGBではこれらの問題点をどうやって回避しているか考えていきます。

NESRGBオペレーションブロック図

私がNESRGBのオペレーションブロック図を最初に見たときに疑問に思った部分は、
NESRGBをCPUバスにぶら下げる形で取り付けているのではなく、
CPUとPPUの間にバスを切断して取り付けている点です。


[CPU]----+------[PPU]
|
|
+------[NESRGB]
ではなく、

[CPU]------[NESRGB]------[PPU]
こういう構造になっています。


CPUからPPUへ流れる信号のうち、パレットRAM書き込みの信号を拾うだけなら、上の図の方が簡単になります。
下の図の取り付けだと、基板からPPUを取り外さなければならないため、手間が増えます。


なぜ、このようにNESRGBをCPUとPPUの間に挿入して、CPU⇔PPUの信号をNESRGBが中継する構造にしているのでしょうか?
それはNESRGBが、CPUからPPUへ流れるデータをそのまま流しているのではなく、一部のデータを変更していることを意味していると思います。

なぜNESRGBはCPUからPPUへ流れるデータに変更を加えているのか?

CPUバスの情報を「盗み見る」形でも、パレットRAMに関する情報を拾うことには十分なはずです。
しかし、パレットRAMの情報がすべて取得できたとしても、EXT0〜EXT3の4bitパレットインデックス信号だけでは、
RGB信号に変換するには情報が不足していることは前に書きました。
具体的には、あるピクセルにおいて、スプライトとBGでそれぞれ16個づつあるパレットのどちらを参照すべきか、という
1ビットの情報が足りません。
簡単にいうと、EXT0〜EXT3の信号だけでは、スプライトのデータなのかBGのデータなのか判別できないということです。

どうやってスプライトとBGを判定するか

BGを描画中は0で、スプライトを描画中に1が出力される信号があればいいのですが、
そのような信号は残念ながらPPUの端子からは出力されていません。
この信号を作り出すために、NESRGBはCPUバスに流れるデータのうち、
パレットRAMへの書き込み・読み込みについて、変更を加えていると私は推測しています。
NESRGBのオペレーションブロック図を見ると、PPUから出力されるコンポジットビデオ信号
コンパレータで何かの判定を行っている部分があります。
ここでスプライトとBGを判別する1bitの信号を作り出しているようです。
コンパレータというのは、2つのアナログ信号の電圧を比較して、どちらが大きいか小さいかを判定する回路です。


NESRGBでは、CPUバスを流れるスプライトのパレットRAM書き込み信号に手を加えて「特定の値」に書き換えておき、
PPUから出力されるコンポジットビデオ信号からコンパレータにて、「特定の値」を検出していることによって、
スプライトとBGを判定しているのです。
(推測ですが・・・)


「特定の値」ってなんのことでしょう?

ファミコンの「使ってはいけない」色とは?

ファミコンでは、パレットRAMに設定してはいけない、禁断の色が存在します。
ファミコンの発色数は52色ですが、この数字って中途半端だと思いませんか?
コンピュータの色数といえば、2の乗数になっているのが普通です。
ファミコンの場合、内部的には64通りのパレット設定を持っていますが、
そのうち通常の色として使えるのが52色なのです。

64-52=12 なので、使えない12色はなんなんでしょう?
中には「黒より暗い色」なんかもあります。
これはPPUの回路設計を簡略化したため、使えない色ムダな色ができてしまったようにも思えますが、
そうではないと思います。
PPUはコンポジットビデオ信号を直接生成していますので、TVに表示される部分の映像信号以外にも、
TVに表示されない部分の、同期信号やカラーバースト信号など、いろいろな信号を作るための
電圧レベルを出力する必要があります。
「使っていけない12色」は、まったく使われていない無駄な色ではなく、同期信号を作るため等に
内部的に使われている「特殊な色」だということだと思われます。

まとまると

NESRGBでは、CPUバスに流れる「スプライトパレットRAM」の書き込み信号に変更を加えて、
書き込まれるパレットの値を、通常では使用不可の「黒より暗い色」に書き換えることによって、
PPUから出力されるコンポジットビデオ信号をコンパレータによって電圧レベルを比較すれば
あるピクセルデータにおいて、スプライトとBGのどちらが出力中か判別できるようにした。
ということだと思われます。推測なので間違っているかもしれません。



ここまでやるには複雑な回路が必要になるので、31年間このようなボードが出てこなかったことも頷けると思います。