CNROM / NROM の flash 化について

ある程度ヒントをだしたつもりだったんですが回答にたどりつけるかたがいなくてちょっと残念でした。

CNROM の仕様

CPU 側はバンクがないのでメモリマップ $8000-$ffff が ROM 0x00000-0x07fff に張られます。

PPU 側はバンクが1つ。メモリマップ 0x0000-0x1fff に ROM (0x2000 * n) - が張られます。n は 0 から 3(初期値は不定だが 0 から 3をとる(後で重要)). n の値はプログラム上で $8000-$ffff を write する値を取ります。

ハードの対応

CPU 側はバンクがないため、バス衝突を無視して書き込んでも CPU 側の ROM の上位アドレスが変わることがないでしょう。unagi みたく CPU area が終わった後に PPU area を書き込むのであれば問題ありません。 anago は CPU area, PPU area を並行して書き込むのでバス衝突は回避する必要があります。

unagi でだけで書き込めれば良い場合は下記です。反転を1ついれるだけでよいので楽に配線できます。余ったゲートの入力はなにかしらをいれておくこと。未接続はダメ!

flash_A[19:15] = (+5V or GND ですべて入力を固定する);
flash_A[14:0] = CPU_A[14:0];
flash_DQ[7:0] = CPU_DQ[7:0];
flash_oe = ~CPU_RW; //74xx00, 74xx04 とか余ってるパーツで反転する
flash_we = CPU_RW;
flash_ce = CPU_ROMCS;

anago でも書き込みたい場合は UOROM/UNROM の真似をすればよいでしょう。スクリプトは簡単だし、正解がいるので省略します。

NROM の仕様

CPU 側は CNROM と同じ、 PPU 側は 0x0000-0x1fff に ROM 0x0000-0x1fff が張られます。CNROM に NROM と同じ振る舞いをさせるには ROM 0x0000-0x7fff に 0x0000-0x1fff のデータを4回いれればよいのです。

  • ハードは CNROM と同じでよし。
  • スクリプトは cnrom とほぼおなじでマッパ番号を 3 から 0 にする。
  • anago のオプションを fff で書き込む。(ユーザーの方々はどの場合でも f を使ってるようなので問題なし, たぶん PPU area で f を使う必要がある場面はこれだけだと思う)
  • unagi では ROM イメージからキャラクタROM部分を水増しして、ヘッダを修正してからじゃないと書き込めない

んなところです。