[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に変換するツールです。

https://github.com/nicotakuya/hsp_romview

参考資料

・Enri's Home PAGE ( http://www43.tok2.com/home/cmpslv/index.htm )

・ファミコン版「うっでぃぽこ」(1987年 / デービーソフト)