Famicom cartridge technical information

表記ルール

数値表現

address

  • CPU の address の接頭辞は $ をつけ $8000 のように表記します。
  • PPU の address では 0x をつけ 0x1234 のように表記します。
  • ROM や RAM の物理アドレスは 0x をつけ、場合によっては {4'h7, 14'h2222} と bank レジスタとプロセッサアドレスを分離するかもしれません。

data

  • ソースコードでの記載はアセンブラ、C コンパイラがエラーが出ないことを優先して記載します。
  • data や数量などを16進数で表記する場合は CPU/PPU 共に 0x をつけ 0x56 のように表記します。
  • data 自体が 8bit でないことを意図して書く場合は 7'h7f と書く場合もありますが基本は 0x で記載します。
  • 2進数は % を使う場合が多いです。矛盾してますね...

bit field

  • 複数 bit は MSB から LSB を記載し、 bit7 から bit4 は bit7:4 とか dq[7:4] と記載します。
  • レジスタ一覧の bit field は基本的に横に並べて書きません。ぱっと見がいい以外の利点がないからです。以下に欠点を記載します。
    • 8bit は1行に収まるが、16bit だと収まらないし、レイアウトに気を取られすぎる
    • 横に詰めようとして略語が発生して、混乱の原因となる
    • 複数の意味を持つ場合に書きづらい
    • コーディングの時に縦に並べ直して考える場合がよくある
  • シフトレジスタは横に並べた方が理解しやすいので例外です。

bank 切り換え

UNROM での例で説明します。
[memory map - read]
$8000-$bfff ROM bank #0 (switchable)
$c000-$ffff ROM bank #1 (fixed)

[memory map - write]
$8000-$ffff page register for ROM bank #0
bit2:0 ROM address A16:14 (UNROM)
bit3:0 ROM address A17:14 (UOROM)

[bank switching program]
;page = y
bank0_set
	sta pagelist,y
	rts
pagelist:
	byt 0,1,2,3,4,5,6,7

CPU/PPU address を区割りする領域を bank, レジスタに設定する ROM の上位 address bit を page とします。$c000-$ffff の固定領域は fixed bank とか固定 bank などと呼びます。

アーキテクチャや文書によって同じ言葉でも意味合いが異なることがよくあり、文脈から判断(もしくは空気を読む)するしかないかもしれませんが、当 wiki 内ではこのルールに準拠して記載していきます。