MBC3の実装

ゲームボーイにおいて、CPUがカートリッジへのアクセスに使用できるアドレスは0x0000~0x7FFF(ROM)と0xA000~0xBFFF(RAM)だけです。
32KiB以上のROMや8KiB以上のSRAMを持つようなカートリッジでは、同じアドレス空間に対してどこに割り当てるかを切り替えることで、アドレス空間よりも大きなメモリを活用できるようにするMBC(Memory Bank Controller)が積まれています。

ROMのみを持つNoMBCやSRAM,バッテリーを持つMBC1があったりします。(Pan Docs MBCs)
後発のMBCチップの動作は基本的にMBC1と変わらないのですが、アドレッシングの計算が少し違っているのでそのメモ for 自分。

MBCの概要。RTCレジスタの話については省略しています。

メモリ

0000-3FFF - ROMバンク00(読み取り専用)

ROMの最初の16KiB

4000-7FFF - ROMバンク01-7F(読み取り専用)

MBC1と同様ですが、バンク$20,$40,$60はサポートされていません。

A000-BFFF - RAMバンク00-07またはRTCレジスタ(読み書き可能)

現在のバンク番号/RTCレジスタの選択状況に応じて、8KiBのRAMバンクかRTCレジスタとして扱われます。

レジスタ

A000-BFFF - RTCレジスタ 08-0C (読み書き可能)

現在のバンク番号/RTCレジスタの選択状況(下記参照)に応じて、このメモリ空間は、8KiBの外部RAMバンクとして使われるか、1つのRTCレジスタとして使われます。

0000-1FFF - RAM/タイマー有効化フラグ (書き込み専用)

ほとんどMBC1のそれと同じで、0Ahの値は外部RAMとRTCレジスタへの読み書きを有効にします。値が00hの場合は、どちらも無効になります。

2000-3FFF - ROMバンク番号 (書き込み専用)

MBC1と同じですが、ROMバンク番号の7bit全体がこのアドレスに直接書き込まれます。
MBC1では、ROMバンク番号の下位5bitが入ります。
MBC1と同様に、値を00hにすると、代わりにバンク01hが選択されます。その他の値01~7Fhは、対応するROMバンクを選択します。

4000-5FFF - RAMバンク/RTCレジスタの選択レジスタ (書き込み専用)

MBC1のRAMバンクモードと同様に、ここに00h..03hの範囲の値を書き込むと、対応する外部RAMバンクがある場合は、$A000..BFFFのメモリにマッピングされます。
08h..0Chの値を書き込むと、対応するRTCレジスタが$A000-BFFFにマッピングされます。
MBC1では、
・ROMバンク番号の上位2bit(bit5-6)を指定するため
・00~03の範囲でRAMバンクを選択するため
に使用することができます。

6000-7FFF - ラッチクロックデータ (書き込み専用)

RTCレジスタの話なので省略します。
MBC1では、バンクモード選択のためのレジスタとして使用されます。

MBC1のアドレッシング図

0000–3FFF

モード 20 ~ 19 18 ~ 14 13 ~ 0
0 0 0 addr
1 4000-5FFFの値 0 addr

4000~7FFF

モード 20 ~ 19 18 ~ 14 13 ~ 0
0/1 4000-5FFFの値 2000-3FFFの値 addr

A000~BFFF

モード 14 13 12 ~ 0
0 0 addr
1 4000-5FFFの値 addr

MBC3のアドレッシング図

MBC1のアドレッシング図を参考に、MBC3のアドレッシング図を考えると

0000–3FFF

モード 20 ~ 19 18 ~ 14 13 ~ 0
0 0 0 addr
1 4000-5FFFの値 0 addr

4000~7FFF

モード 20 ~ 14 13 ~ 0
0 0 addr
1 2000-3FFFの値 addr

A000~BFFF

モード 14 13 12 ~ 0
0 0 addr
1 4000-5FFFの値 addr
になります。
Author

kiku

Posted on

2026-09-03

Updated on

2026-09-03

Licensed under