ファミコンの詳しい話
2013年7月追記
ファミコンの特徴は当時としては美しい画像にありました。
ここに書いてあることは画像に関しては不足が多すぎたので、別ページに改めて解説を書きました。
80年代の画面表示技術(下の記事を読むための基本情報)
以下の内容、書いたのが非常に古く、その当時は十分な情報を集めるのが難しかったこともあり、誤りが多々あります。
PCで見ると一番下に読んでくださった方からのツッコミがいろいろ表示されます。併せてお読みください。
(暇になったら本文修正せねば、と思ったまま長らく放置しています…申し訳ありません。)
詳しい、といったところで、自分で使ってわかったこと/うわさで知ったことが中心で、さらに時間がたって忘れていることも多くあります。間違いがあるかもしれません。
ここから先は、ちょっとディープな人にしか読めないかも。
CPU6502
ファミコンはCPUに6502のカスタム版を使用しています。6502はAppleIIに使用されたことで有名になったCPUです。
6502には、レジスタが6本しかありません。このうち1本はプログラムカウンタで16bit、のこりは全て8bitです。
8bitのレジスタのうち1本はスタックポインタ、1本はフラグレジスタで、いずれもシステムが使用します。残り3本のうち2本はインデックスレジスタです。残りは1本で、これがアキュムレータ(汎用レジスタ)となります。
A(アキュムレータ) | |
X(インデックス) | |
Y(インデックス) | |
PC(プログラムカウンタ) | |
S(スタック) | |
P(フラグ) |
汎用レジスタが1本ではなにも出来ない・・・という考え方は、一見正しそうで実は間違っています。
6502のメモリは256Byte毎に「ページ」という単位で括られており、このうち0ページ目はAレジスタとともにさまざまな計算が出来るように設計されています。
つまり、この観点で見ると、
6502は256本のレジスタをもっている
ともいえます。
インデックスレジスタであるXYが8bitしかないのも、6502では事実上ページ内のアドレッシングが出来れば十分だからです。また、スタックポインタも同じ理由で8bitとなっており、スタック領域には必ず1ページ目が使用されます。
汎用レジスタが一本しかないため、全ての計算命令はこのレジスタを対象にすることになります。このため、6502のニーモニックにはオペランドが1つしかありません。また、直接の関係はありませんが、ニーモニックは必ず3文字のアルファベットで表わされるため、6502のアセンブリコードは非常に美しいものとなっています。
ファミコンの画面まわり
ファミコンのハードウェアも、そのCPUである6502のように、一見「なにも出来ない」ように見えて奥の深いハードウェアとなっています。
最大の特徴であるスプライトは、8×8dot、4色(うち一色は透明)のものが64枚使えます。これらのスプライトはラインバッファ展開のために横にならぶ個数に制限がありますが、この制限数は当時の常識であった4個ではなく、倍の8個となっています。(もっとも、当時の常識であったスプライトの大きさは16×16dotだったので、画面上に表示できる大きさは同じだということになります)
スプライトキャラクターはROMに焼かれ(ディスクではRAMだった)、256個もつことが出来ます。
キャラクター表示時には上下・左右に反転が可能で、表示パレットは4つのなかから選択でき、表示位置をBGの前にするか後ろにするか選べました。(上下反転・左右反転・表示位置が各1ビット、パレット選択2ビットの合計5ビットを、1バイトに収めてありました)
結局、1つのスプライトは表示座標(X,Y)、表示キャラクター、表示属性の4バイトで表わされることになり、これが64個で256バイトと、丁度6502の1ページの大きさとなっています。
表示画面の大きさは256×240dotで、スプライトとは別の8×8dotのキャラクターを並べることで構成されます。こちらもキャラクターの色は4色、パレットは4つのなかから選ぶことが出来ます。ただし、パレットはキャラクター4つを組みにした16×16dot領域ごとに指定可能でした。
実画面の大きさは256×256dotあり、これが2画面ありました。2画面は繋がっており、繋がる方向はROMカートリッジ内の結線で横か縦を選ぶことが出来ました。
この実画面と表示画面の関係はスクロールレジスタによって変更可能ですが、重ね合せなどは出来ません。
スクロールにはラスタースクロール機能はありません。しかし、ファミコンには「0番スプライトがラインバッファに展開されるときに割り込みを掛ける」という、非常に面白い機能がありました(地雷を置くようだ、ということで通称「0爆弾」)。そこで、ラスタースクロールを行いたい点に透明にした0番スプライトを置いておき、割り込み内でスクロールレジスタをいじることで、事実上のラスタースクロールを行うことが出来ます。
ファミコンの音源
ファミコンの音源は、カスタムCPU内に内蔵されています。これはある意味では「音を重要視しなかった」ということだと思いますが、それなりに興味深い音源となっています。
ファミコンの音源は5チャンネルあり、3つはPSGです。ただし、このPSGは矩型波しか発声することができず、ファミコンの音の硬さはそこから来るものです。
PSGのうち2チャンネルは、矩型波のデューティー比(上下比率)を4段階に変更可能で、これによって多少音色を変更することが出来ます。残りの1チャンネルはデューティー比こそ変えられないものの、ベースパターン用に正弦波っぽい音を出すようになっていました。このPSGの2チャンネルと1チャンネルは、出力系統も別となっており(基盤上でミキシングされていますが)、これを利用してステレオ出力するような改造もよく行われていました。
音源残りの2チャンネルのうち、1チャンネルはノイズです。これは爆発音などによく使われていました。また、最後の1チャンネルはΔPCMなのですが、6502を使用しているファミコンではメモリ喰いのPCM音源が使用されることはまれでした。
ディスクシステムでは、これに加えて2オペレータのFM音源1声が使えるようになりますが、詳しいことは知りません。
追記 2005.4.9
このページにリンクしてくれていたページで、「ファミコンの表示色が良くわからない」という話が書かれていました。
そういえば、その系統の話は書いていなかったかな… なにぶん、このページは僕がHTML覚えて最初に書いた、自己満足だけで書きなぐったページなので情報が十分ではないです (^^;
せっかくなので、解説を追記しておこうと思います。
まず、ファミコンのパレットは1キャラクター4色です。ただし、必ず透明がありますので実際には3色となります。
この3色セットが、4パレットあります。さらに、このパレットがスプライトとBGで別々に設定できます。
また「すべてが透明」の部分に表示する背景色も指定できます。
つまり、3色*4パレット*2(スプライト・BG別)+1(背景色) = 25 色が1画面中に同時発色できます。
もっと表示したいのであれば、走査線割り込みを使用してパレットを書き換えるという方法があります。
これにより、25色以上出すことも不可能ではありませんが、これはちょっとした裏技ですね。
そして肝心の色指定方法ですが、RGBではありません。
そもそも、テレビ信号というのはRGBを前提にしていません。歴史的な経緯ですが、白黒テレビで使われていた「輝度信号」に、色信号を乗せる形で表現します。(これにより、白黒テレビでもカラー放送を表示できるという下位互換性を確保しています)
所詮「おもちゃ」であるファミコンは、回路を簡単にするためにテレビ信号に変換しやすい方法で色を指定します。
色信号が4bit、輝度信号が2bit の合計 6bitです。
色信号4bitは色相になっているのですが、赤系統4相、青系統4相、緑系統4相の12相しかありません。残りの4相は「無彩色」、つまりグレースケールです。
グレースケールですから、輝度以外に色の違いはありません。4相割り振られている、といっても、実際には4相で4色しか出ません。
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 0A | 0B | 0C | 0D | 0E | 0F |
10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 1A | 1B | 1C | 1D | 1E | 1F |
20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 2A | 2B | 2C | 2D | 2E | 2F |
30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 3A | 3B | 3C | 3D | 3E | 3F |
つまり、4bit=16相の色相の中で、実際に使用できるのは13相。
これに輝度信号 2bit = 4段階の色がありますから、13*4=52色がファミコンの生成できる色になります。
以上の理由で、ファミコンが使えるのは52色中25色、ということになります。
黒の微妙な色合いなどになってくると目視では確認しづらく、正確なことはわかりません。
ここでは、BASICのマニュアル(任天堂が公式に作った資料です)に書かれていた、52色という前提で説明を書いています。
また、技術的にはこれが一番シンプルなので信憑性も高いと考えています。