Famicom cartridge technical information

用語集

2進数接頭辞 %0110, 0b0110, 4'b0110

ソースコードで 0 と 1 で2進数を表記するための約束事。それに転じて、仕様の表記にも用いられる。
現在では用途が限られてしまうが、ファミコンでは 8bit のデータバスを持ち、レジスタには各 bit にそれぞれ別の機能を持たせている。このため、区別しやすくするために2進数表記が好まれる場面が存在する。
  • % は 6800 を祖先とする Motorola 系のアセンブラで使用する。
  • 0b は C 言語やそれに派生する言語で 0x のように定義されたもの。b は binary の略だと思われる。
  • 4'b はハードウェア記述言語で桁数まで明記できるようにしたもの。
2進数は桁が多くなると人にとってはわかりにくくなるので金額表記のカンマ (,) のように区切りとしてアンダーバー (_)をいれることがある。

16進数接頭辞 $89ab, 0x89ab, 16'h89ab

ソースコードで16進数を表記するためのもので、2進数と目的は同じ。
  • $ は 6800 系
  • 0x は C 系
  • 16'h は HDL 系, (16 が桁数, h が hex → 16進数の意味)
なお 6502 はアセンブラの表記が 6800 であるが、バイトオーダーは 6800 と異なる little endian である。

active low, negative logic, 負論理

address bus, data bus を制御する CS, CE, WE, OE などは low レベルを有効, high レベルを無効とした反転信号を用い、負論理としている。
このため反転の意味合いは文字の上にバーを挿入するのが正しい表記とするが、コンピュータではバーの挿入が出来ない場合は端子名の前後に記号を付けることで代用している。

記号には ~, #, -, *, n など様々あり統一されていない。

SRAM の CS2 のように制御信号が正論理の場合は何も付けない。強調したい場合は + を付ける。

address bus

CPU, PPU の各プロセッサがどのアドレスを参照しているかを出力する信号で多ビットをまとめて bus と呼ぶ。

この wiki では CPU のアドレス表記の接頭辞は 6800 系の $ を使用し、 PPU のアドレス表記は CPU に無関係ということで 0x を使用する。

bank 切り換え

CPU / PPU が扱えるアドレスバスは 16bit / 13bit なのだが、それ以上のアドレスバスを扱えるようにする仕組み。専用のレジスタを設けて、 CPU から write することで上位アドレスを latch するやりかたが一般的。
仕組みが比較的単純で 8 bit CPU では需要もあるので利用されやすい。

bg, background

nametable を参照して 8x8 pixel の charcter を敷き詰めた4画面分の仮想画面。正方形の画像を敷き詰めるので tile とも呼ばれる(風呂場の床のタイルと同じ)。object と異なり、横並び制限がないので大きいボスを表示するときにも使われる。これを使うとユーザーにとっての背景が真っ黒になるのはちょっと寂しい。

属性としては background ではなく foreground にもできるが bg という言葉になっているのはちょっともどかしい。

CE, chip enable / CS, chip select

ROM と RAM の制御端子で、CPU がアドレスを有効な場合を示す信号として入力する。CE は ROM で、 CS が RAM に多いが役割は同じで名称が別になっている理由は筆者は知らない。
OE とペアで利用して、OE だけで動かす場合などは CE は GND に接続されていることも多い。使わないからと言って何も接続しないとちゃんと動かない。

CIC

NES カートリッジについているセキュリティチップ。契約をしていない会社などから勝手にゲームソフトを作られないようにした仕組みだが、その割には結構な数が作られている。IC を作られないようにするというかは、勝手に作った事実をもとに訴えやすくする目的のようだ。

ファミコンにはついていないが、スーパーファミコンにはついている。

CIRAM

本体 VRAM
NES 本体に配置された VRAM の名称。NES の基板にシルクでそう書いてあるらしい。

charcter RAM

Charcter ROM の代わりに入っている RAM で PPU address 0x0000-0x1fff に配置する。RAM の場合は CPU の Program から RAM へ charcter data を転送する。charcter data は冗長性が高いので圧縮率が高く、ROM を2つ作らなくて良いので容易な変更が可能、キャラを徐々に消すエフェクトをかけることができるなどの特徴を持つ。
その反面、データの転送に時間がかかることや容量の少なさもあって描画途中のバンク切り替えに不向き。UNROM, SNROM, SGROM などでは charcter RAM のバンク切り替えができない。

ファミコンとNEOGEO以外の家庭用ゲーム機では Charcter RAM を本体に持つので外付けすることはない。

charcter ROM

名の通り、 charcter data が入っている ROM で、 PPU address 0x0000-0x1fff に配置されることが普通である。手の込んだメモリコントローラではこの ROM を nametable に使用することもある。ただし利用例が少なく Charcter data 兼用ということでそういうものも便宜上 Charcter ROM とされている。

CHR


Charcter ROM
大半は Charcter ROM のことを指す。

CHR A13# [誤用]

この言葉は使ってはいけない。

Charcter ROM を enable する目的の端子で使われる誤記。
PPU の A13 は L のときに charcter data, H のときにそれ以外のデバイスを使用する。 Charcter ROM の CE# には PPU A13 (正論理) を接続するのが普通だが、論理否定の記号と制御端子によくつく信号を混合しているのが原因。
紛らわしいことに PPU の A13# という本当に反転した信号もカートリッジ端子には存在する。

CHR-RAM


Charcter RAM
UNROM などには CHR-RAM と記載されている。

CPU CLK [誤用]

CPU φ2
この言葉は使ってはいけない。

古めの解析文書に記載された名称で単純に CLK ともされる。 CPU へのマスタークロックは別途存在するので誤った用語。

CPU M2 [俗語?]

CPU φ2
英語圏の解析文書でよく用いられる言葉で、φ2 と同意とされている。ただし、6502 のφ2 と比較して、 2A03 のこの端子は出力が若干遅いので 2A03 の φ2 相当という意味で M2 と再定義している場合もある。

Z80 には M1 と呼ばれる opcode fetch などを外部に知らせる信号があるが、関連性はない。

CPU PHI2, φ2

6502 のメモリサイクルで M2 とも呼ばれる。 read, write 時のバスの有効タイミングを決定したり、 CPU の動作時間を計測するためにメモリコントローラ内部のタイマーのクロックとしても使われる。


65CE02 の datasheet の timing diagram.
φ0が CPU への master clock で、φ1がφ0から位相を反転し遅延を加えたもの。φ2はφ1から位相を反転し遅延を加えたもの。

φ2の期間について説明する。
  • L の期間は R/W, Address bus, data bus に不安定な期間があるので、外部のバスに対して無効になる。
  • L→H には R/W と A15:0 の出力が安定しているのでここからバスが有効になる。
  • H の期間は有効になったデバイスが L になるまでにデータ出力を準備する期間となる。
  • H→L
    • read:CPU がデータを取り込む
    • write:対応するデバイスがデータを取り込む
  • 再び Lの期間に戻るが、データ出力の遅延が残っていたり、途中で出力を停めるので不安定期間となる。

CPU R/W

high が read, low が write をさす。PPU の RD# と WR# を一緒にしたものだが、φ2 と組み合わせて CE#, OE#, WE# を作る必要がありメモリへの接続がやりづらい。

文書によっては R/W の W の上に線がつくので R/~W などとする場合がある。

CRC

データの誤り検出。ROM データのチェックサムとして CRC32 を用いることが多い。誤検出も多いと言うことで SHA1SUM なども使われるが、8文字で記述できるのは便利なので根強い人気を持つ。

data bus

CPU, PPU の各プロセッサがデータを扱う端子で、多 bit をまとめて bus と呼ぶまでは address bus と同じ。
data には read と write があり、 read 時は参照アドレスが担当するデバイスがデータを出力し、CPU が取り込む。write 時は CPU がデータを出力し、担当デバイスが取り込む。このようにプロセッサにとって出力と入力を兼ねており、そのバスがつながっているデバイスは CPU も含めて 1 つが出力することが基本である。
複数のデバイスが同時にデータを出力するとバス衝突となりデータの内容が不安定になる。

DIP, dual inline package


ピンとピンの距離が 2.54mm で一般的な IC のイメージと言えばこれが出てくるかもしれない。1990年頃までは一般的に使われていたが、電子回路の高密度化にともなって、プリント基板では 2.54mm は相対的に大きくなり、穴を開ける必要もあり需要は低下。特にピン数が多いものでは避けられる傾向にあって、現在は 74LS の IC や EEPROM のみ現行品ということもある。

その反面、ブレッドボードなど試作の分野などアマチュアには根強い人気を持つ。ファミコンに関するプリント基板はやはり1990年頃までは DIP 部品ばかりだが、それ以降は表面実装の部品が使われ始めている。

DIP パッケージと表記すると AV ビデオ(アダルトビデオビデオ)みたいに単語が重複するので略語の意味をしっているとかっこわるく聞こえるから困る。

EPROM

高電圧(12V) で書き込みを行う ROM で、窓に紫外線を照射することでデータの消去が行える。データの消去には1時間程度の時間がかかるので、頻繁な書き換えには不向き。
ファミコン時代には flash memory が存在しなかったので開発者達は EPROM の書き込みに関しては ROM を何セットも用意して、長篠の合戦における火縄銃のように消去ができた ROM から随時書き込みをおこなったと見られる。

EEPROM

serial EEPROM
flash memory (厳密には flash とは異なるが似ている)

flash ROM [俗語]

flash memory
mask ROM, EPROM と交換できる flash memory のことを言うが正式名称ではない。

flash memory

特殊なコマンドを介すものの RAM のように書き換えができ、電源を切ってもデータが保持される ROM の特性を持ったメモリ。EEPROM とも呼ばれる。

flash memory [俗語]

ファミコンのカートリッジの ROM から置き換えることの出来る flash memory. 16 bit から 19 bit のアドレスバスと 8bit のデータバスを持ち、5V で動作する。
シリアル EEPROM と比較してパラレル EEPROM と称されることもある。

DIP 形状のものは 1990 年代中頃から普及し、パソコンの BIOS に用いられている。現在でもパソコンの BIOS に使われているが、形状が表面実装になっていたり、3.3V 動作なのでファミコンカートリッジの転用は理論上可能。でも手間がかかる。

high Z, hiZ, high-impedance

入力もしてない、出力もしてない状態。メモリデバイスでは CS# が high または OE# が high のときにデータバスの出力が hiZ となる。
CPU が read 時にそのアドレスが未定義(=なにも使わない)場合はデータバスが open 状態と呼ばれる。この場合は、read 時は不定値となるかプルアップがしてあればすべて high (8'hff) となる。

hiZ 状態になれる出力端子は high, low, hiZ の3つがでるということで tri-state とも呼ばれる。

mask ROM

工場でパッケージとデータを作ってしまう ROM. データ提出後に大量生産するのでやり直しがきかない。生産過程が工場で完結するのか、ピン配置のカスタマイズが行われることがよくある。

memory map

CPU, PPU のアドレスにどのデバイス(ROM, RAM, その他レジスタ)を配置するかを定義するもの。ファミコンでは本体内部の RAM と各レジスタ以外は、カートリッジ側で設定できるのでカートリッジの配線によって異なる。
自由度の高さは豊富な拡張性をもたらした反面、仕様の乱立は混乱の原因となっている。

memory map では CPU, PPU の各プロセッサがマスターとなり、カートリッジ内部の program ROM, charcter ROM はその中の1デバイスであることを覚えると理解が進みやすい。

mirror

memory map 内部で定義されたデータが一定の address を越えると同内容のデータで繰り返される現象。例えば CPU address $0000-$1fff は本体 RAM として定義されているが、RAM の容量は 0x800 byte のため、0x800 byte ごとに 4 度同じ内容が繰り返されている。先頭の $0000-$07ff をRAM本体とし、残りの $0800-$1fff ミラー領域と呼ばれることがある。

大きめに定義したメモリ領域はあるものの、実際につながれたデバイスがそれより少ないと上位アドレスビットが存在しない。 上位アドレスbitを完全にデコードせずに CE に接続すると、この状態が発生する。
上記の例では CPU からは A15:0 が来ているが、 RAM につながるのは A15:13 が CS 信号としてデコードされ、 A10:0 がアドレスバスとして直接 RAM につながり、 A12:11 が未接続となる。

将来的な拡張で足りない物理メモリ容量が拡張されることもあるので、 mirror 領域にはアクセスしないようにルールを決めている場合も多い。

mirror H/V, VRAM mirror, CIRAM mirror

nametable の領域は 0x1000 byte として定義されているものの、本体の VRAM の容量が 0x800 byte なので mirror が発生する。nametable ではその mirror を利用して nametable を縦長 (vertical) にするか横長 (horizonal) にするか選択できる。

配線としてはカートリッジの VRAM A10 に PPU A10 か A11 を接続することで H/V を選択できる。ソフトによっては 0x400 byte だけ使うという需要もあるので low か high を接続することもある。それに転じて VRAM A10 への配線方法を mirroring とか VRAM mirror とか呼ばれることがある。

nametable

bg を構成する色情報、キャラ情報などを並べたテーブル。
PPU の address 0x2000-0x2fff に使用され基本的に本体の VRAM を使う。
1画面分の nametable は 0x400 byte なので、論理的には4画面分を持つ。なお本体の VRAM の容量は 0x800 byte なので mirror が発生する。

NES, Nintendo Entertainment System

日本国外でのファミコン相当の家庭用ゲーム機。72pin のカートリッジコネクタを持ち、コントローラを取り外しできるところが特徴。コントローラにマイクがないことは外見から広く認知されているが、カートリッジへのサウンド入出力端子もないので拡張音源という概念は無改造では存在できない。
米国では普及したものの、それ以外の国では普及しなかったらしい。

NES, ネス [俗語]

日本人がファミコンのエミュレータを指す場合に使う略語または ROM イメージ。言いやすく、書きやすいが、ファミコンと NES の違いを知れば知るほどむずがゆいスラング。

OAM, object attribute memory

0x100 byte の memory で PPU 内部に持つ。nametable とは異なり PPU の外部バスとは別のバスなのでアクセス方法が異なる。
この領域に 4 byte で 1 つの object を定義できる。

object

sprite ともよばれ、8x8 pixel または 16x8 pixel のキャラを任意の位置に表示させる仕組み。object の attribute は OAM だが、 charcter は PPU の外部バスで scroll と共用している。
1 scanline 中で 64 pixel 以上は描画できないので横並び制限が厳しいと言われている。

OE, output enable

CPU が data を read する場合に有効となる端子。CS/CE が address を担当して、 OE が data を担当しているとすれば理解しやすい。
SRAM は OE が L でも WE が L だと write として受け付ける、一種の矛盾した実装となっているが、 flash memory ではこの矛盾はおきないようになっている。

pinout


IC やコネクタの pin 配置を役割を一覧表記したもの。データシートがある場合は一覧だけではなくて、詳細な説明も読もう。

PPU A13# [誤用]

CHR A13#
本来は PPU A13# は PPU の address bit 13 を反転したもので、この言葉自体は間違いではないが、 PPU A13 (非反転)を制御信号の記号として混同していることがある。

PPU RD#, PPU WR#

RD# は read するとき, WR# は write するときに使用する出力信号。
OE# は RD#, WE# は WR# に配線するのが一般的。
RD#, WR# は同時に L になりうるが、メモリへの接続はやりやすい。

PRG


Program ROM
大半は Program ROM のことを指す。基板のシルクなどにも PRG と書かれていることがよくある。紛らわしいのでこの wiki では使用しない。

PRG/CHR A17 .. A0 [俗語]

Program/Charcter ROM のアドレスバスの端子を表記するためによく使われる。
ROM 単体としては A17 (最上位ビット, MSB) から A0 (最下位ビット, LSB) を表記するのは間違っていないが、配線ではバンク切り替えをするbitを Program/Charcter ROM Ax で表記し、バンク切り替えをしない bit を CPU/PPU An で表記した方が混乱が減る。

上記の理由から ROM 単体の pinout を記載する場合は PRG/CHR Ax という接頭辞は付けずに単に Ax と記載する方が情報の精度があがるので俗語とした。

PRG RAM

Work RAM
紛らわしいのでこの wiki では使用しない。

program [動詞]

EPROM や flash memory への不揮発データ書き込みは英語では program と呼ばれて、 RAM への書き込みは write と区別される。日本語では両方とも書き込み - ライトと一緒にされてしまっている。

program ROM

カートリッジ内部の CPU に接続される ROM で必ず存在する。
名称は program ROM だが CPU が使うプログラムの他にデータも入っている。charcter 用途の memory が RAM の場合はキャラクタデータも入っている。その場合は圧縮されていることがよくある。

scroll

bg
foreground にもなりえるし、scroll レジスタを参照するので scroll、固定画面は fix と呼ばれることもある。

serial EEPROM


1bit のデータと clock でアクセスするメモリで、電源を切ってもデータが保持される。1990年序盤から普及している。8pin の IC が大半。表面実装部品が多い中、現在でも DIP 形状が生産されているデバイス。
ファミコンソフトではバンダイ生産のカートリッジの一部に採用されている。

sprite

object
メーカーによって名称がまちまちのようだが、 sprite と object は基本的に同義。

sprite RAM, sprite attribute

OAM

system VRAM, 本体VRAM

本体内部で大半は PPU のバスが接続された 0x800 byte の RAM.
A10 と CS# はカートリッジからの出力を受け付けるようになっていて、大半のカートリッジは PPU address 0x2000-0x2fff に設定して、 nametable とするのが普通。

それ以外としては本体 VRAM を使用せずに 0x2000-0x2fff を Charcter ROM に割り当てたり、0x2000-0x2fff をカートリッジ内部の RAM に割り当てることもできる。この場合は nametable 領域 0x1000 byte をフル活用できるので 4 screen mode と呼ばれる状態になる。
それとは別にキャラクタ領域の 0x0000-0x1fff を本体 VRAM に割り当てることも理論上はできるが、キャラクタとしての 0x800 byte では制限が多くて使いにくいようだ。

static RAM, SRAM

高速なアクセスと比較的小容量が特徴の RAM で、バッテリーバックアップが可能。
ファミコンでは RAM アダプタの DRAM 以外は基本的にほとんどが SRAM。
SRAM 単体ではなくメモリコントローラの中に内蔵している場合もあり、その場合はメモリコントローラに電池をつなぐ。

tilemap

nametable
tile を敷き詰めた map ということで tilemap と呼ばれることもある。

TTL

汎用ロジックIC 74LS シリーズの IC とその信号規格を指す。当時としては高速動作をして壊れにくいことで大量に使用された。その後、 CMOS を利用した 74HC シリーズが台頭するが、74LS と 74HC は混在して使ってはいけないことになっている。(混在するなら 74HCT シリーズを使う)

TTL [誤用]

狭義では 74LS シリーズだけをさすが、DIP 形状の汎用ロジックIC を使う場合は 4000 シリーズでも 74HC シリーズでも TTL と言う人が一定の世代で設計をしていた方々に多い。
言いやすいのは認めるが、紛らわしいのでその意味では使ってはいけない。

秋月電子のロジックIC(TTL)カテゴリには厳密な TTL は現在1つも売ってないが、誤用での TTL はいくつか売っている。
http://akizukidenshi.com/catalog/c/clogic/

W-RAM

Work RAM
任天堂基板の識別名として書かれている。 W-RAM を2つ持つ HVC-SOROM や HVC-ETROM では W-RAM-0, W-RAM-1 と番号が付加されている。

WE, write enable

memory への write を伝える入力端子。この信号は L から H になった立ち上がりのタイミングで data bus を取り込む。
ROM には存在しない端子。

work RAM

カートリッジ内部に入っていて、 CPU から使える方の RAM を指す。バッテリーバックアップとしてセーブデータに用いることがよく知られているが、 TSROM では電池を使用せずに RAM の容量の増加の目的だけに使われている。