たまりば

パソコン・インターネット パソコン・インターネット三鷹市 三鷹市

ファミコンの縦解像度224px説の考察
2015年02月22日 04:49

ファミコンの解像度は横256px×縦240pxだが、縦を224pxとする説が根強い。
中には「内部的には240px」の但し書きをつけたり、「約」224pxとするものもあるが、224という値を書いている時点で五十歩百歩だ。

「内部的」の解釈も曖昧だが、たぶん次のような認識なのだろう。
「メモリ上には240px分の領域が用意されているが、出力されるのはそのうちの224px分のみ」
そのようなことがないのは、Google画像検索で適当なファミコンソフト名を「640×480」や「720×480」の解像度指定で検索すれば分かるだろう。

ただ似たような現象はあって、240px分が出力されても、普通のアナログTVでは実際に画面に表示されるのはその内の85%や90%程度である。
(詳しくは「タイトルセーフ・アクションセーフ」「オーバースキャン」あたりで検索するとよい)
ではそのことを言っているのかというと、2つの点からおかしい。
第1に、どの程度の範囲が表示されるかはTVによって異なるので、224pxという値は出てこない。「約」であっても(10進法では)切りの悪い値にするのは不自然だ。
第2に、TVに映らないという理由で解像度を224pxなどの値にするなら、同様にアナログTVに出力するスーパーファミコンやプレイステーションも240pxや480pxを出力できないことになろうが、これらの解像度には239pxや480pxという値が平気で書かれている。

ではこの224という数字の出処はどこかだが、スーパーファミコンにはどうやら224pxモードがある。
これこれを見ると、$2133のbit2で縦224pxと239px(448pxと478px)の切り換えができるようだ。
またプレイステーションについても、興味が無いのであまり調べていないが、224pxや448pxのモードがあるような記述が見られる。

もう1つの可能性として、エミュレータのオプションから来ているのかもしれない。
エミュレータには縦240pxのうち224pxのみを表示するモードが付いている物がある。
エミュレータ240pxモード1エミュレータ240pxモード2
(というよりどちらもデフォルトが224pxで、240pxモードがある)

まとめると、
・そもそもアナログTVの仕様として映像信号のうち画面には表示されない部分がある
・スーパーファミコンには縦224px出力のモードがある
・ファミコンのエミュレータには出力のうち縦224pxのみしか表示しないモードがあるものがある
このあたりを混同した結果、ファミコンの縦224px説が生まれたのではないだろうか。


さて本題の考察は以上だが、なぜエミュレータには224px設定が付いているのかの説明をしよう。
まずこちらの画像をご覧頂きたい。
ファミコン縦スクロール回り込み
ドラゴンクエスト3で縦スクロール中に撮った画像だ。これは互換機だが、ファミコン実機でも同様の表示になるはずである。
一番下の数ドットが、本来下に続くマップではなく、最上段からはみ出した分が下に回りこんでいるのが見て取れるだろう。

これはファミコンの仕様で、内部的に2画面分を縦または横につなげた仮想画面をスクロールしているため、縦か横どちらか、この場合縦は1画面分の幅しかなく、スクロール時に上下にまたがるキャラクタは表示が乱れるのである。
この乱れは、上記の通り通常のアナログTVでは画面外で表示されない部分であり、ユーザーの目にはいることはまずない。
しかしPCのキャプチャカードで全ての出力を取り込んだり、エミュレータで全てを表示すると見えてしまうわけだ。
そこでエミュレータでは、この本来表示されない領域を隠す設定が付けられた。
どれだけ隠せばいいかといえば、背景面を構成するキャラクタは16×16単位で設定できる(正確には色が16×16、キャラが8×8)ので、うまく作られたプログラムなら半分の8pxづつだけ隠せばよいはずである。
(うまく作られたプログラムばかりでもないと思うが)

また、横についても同様の乱れが起こる。さらに縦と違う点として、ファミコンは横方向はもともと映像表示期間の90%強しか使っていないため、少し広めのTVではこの乱れが画面内に見えてしまう場合がありうる。
おそらくそのために、ファミコンには左のみ8pxを表示しない設定がある(両側でないのはなぜだろう)。上のドラクエ3の画像もそうなっている。左右の黒帯の幅が違うことから分かるだろう。
これを考えると、ファミコンの解像度は248×240と256×240の2モードあるとすべきだろう。

追記:
左8pxを表示しないモードについて、スクロール時の乱れを見せないためだろうと推測したが、おそらく違った。
ファミコンのスプライトは横8px幅であり、そのX座標は0-255の値をとり、0で左端、248で右端、249-255では右端からはみ出す位置になる。つまり画面の右端からスプライトの一部分が見える表現はできるが、左端で同じことはできない非対称性がある。
ここで左端8pxを背景・スプライトともに隠すことで、左端からスプライトの一部分が見える表現が可能となる。
両側でない理由もつくのでこれがこの機能を付けた理由で間違いないだろう。乱れを見せないためにも使えたかもしれないが、少なくともメインの目的ではないだろう。
なおこちらによればMSXやSG-1000ではスプライトの表示位置を32pxずらす機能があったらしい。