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 |
| になります。 |