[FC]DIY FC Cartridge Mapper2
・ファミコン用のMapper2のカートリッジ基板です。
・Mapper2ではバンク切り替えにより、容量を16KB x8bank=128KB(またはx16bank=256KB)に増やします。
・8bitworkshop.com「solarian game」、Morphcat Games「Spacegulls」で動作を確認しました。
・容量は最大で2Mbitです。
・カードエッジのA0~A13はフラッシュメモリに接続しています。このため、一度にアクセスできる容量は16KBまでです。A14~A17の信号はアドレスデコーダ(74HC161+74HC32)から供給されます。
・JP1 はミラーリング設定のジャンパです。PPU A10=VRAM A10を接続するとVミラーリングになります。PPU A11=VRAM A10を接続するとHミラーリングになります。
・JP2はアドレスデコーダの電源供給スイッチです。
・JP3=ONの場合は全16バンク(2Mbit)となります。OFFの場合は全8バンク(1Mbit)です。
・74HC161はバンク番号を記憶するために使用します。記憶したバンク番号はPRG-ROMのA14~A17に出力されます。
・74HC32はA14=Highの時にバンクを強制的に最大値にするために使用します。
フラッシュメモリに書き込むさいにはJP2をOFFにします。A14~A17の信号はCN2を通じてライターから送ります。書き込みが終わったら、JP2をONに戻します。
8バンクの場合
・0x8000~0xBFFF番地はバンクの選択可能な領域です。1bankあたり16KB。
・0xC000~0xFFFF番地は最終バンクに割り当てます。ベクタテーブル(0xFFFA~0xFFFF番地)もここに含まれます。
・0xC000~0xFFF9番地のどこかに番号テーブルを用意します。番号テーブルには0x00~0x07を連番で格納します。(番号テーブルの先頭アドレス+バンク番号)番地にバンク番号を書き込むと、0x8000~0xBFFF番地の内容が切り替わります。この時、CPUからのデータバスとフラッシュメモリからの出力データが適合しないと信号が衝突して、バンクが正常に切り替わりません(暴走します)。信号を衝突させないため、以下の方法でソフトウェア的に対策する必要があります。
先頭アドレスを0xC000番地とした場合の番号テーブル
0xC000番地:0x00
0xC001番地:0x01
0xC002番地:0x02
0xC003番地:0x03
(中略)
0xC007番地:0x07
バンク切り替えの例。
0xC000番地に0を書き込む→バンク0を選択
0xC004番地に4を書き込む→バンク4を選択
0xC007番地に7を書き込む→バンク7を選択
(おまけ)「romview」:NESファイルが8bank未満だった場合、8bankに変換するツールです。
参考資料
・Enri's Home PAGE ( http://www43.tok2.com/home/cmpslv/index.htm )
・ファミコン版「うっでぃぽこ」(1987年 / デービーソフト)