バンク切り替えについてEnriさんのところに詳しく書かれています。74161は同期4ビットカウンターですが、プリロードを使って4ビット分D0、D1、D4、D5をラッチしているような感じです。Wでロード設定、ROMSELの立ち上がりでD0->A13、D1->A14としてラッチしますから、バンク切り替えするためにはD0とD1とで切り替えたいバンクを指定してwriteすればいいことになります。Enriさんのところにはグラディウスについて、こう書かれています。
バンク#00を選択するには$8ACEに$30を書き込めばCHR$0000~$1FFFがバンク#00になります バンク#01を選択するには$8AD0に$31を書き込めばCHR$0000~$1FFFがバンク#01になります バンク#02を選択するには$8ACFに$32を書き込めばCHR$0000~$1FFFがバンク#02になります バンク#03を選択するには$8AD1に$33を書き込めばCHR$0000~$1FFFがバンク#03になります
そのとおりにanagoのスクリプトを書きます。D4とD5はダイオードがついているので昨日の図で右向きならLowに、左向きならHighにしておけばアドレスバスで競合しないです。グラディウスは2本のダイオードが左向きについているのでしょう、たぶん。バンク切り替えのデータ書き込みはどのアドレスでも良いというわけではなく、グラディウスの場合、ROMがD4、D5ともHighのデータを格納しているところでwriteしないとデータバスで競合します。
/* グラディウス */
board <- {
mappernum = 3,
cpu_rom = {
size_base = 0x8000, size_max = 0x8000
banksize = 0x8000
},
ppu_rom= {
size_base = 0x8000, size_max = 0x8000,
banksize = 0x2000
},
ppu_ramfind = false, vram_mirrorfind = true
};
function cpu_dump(d, pagesize, banksize)
{
cpu_read(d, 0x8000, 0x4000);
cpu_read(d, 0xc000, 0x4000);
}
function ppu_dump(d, pagesize, banksize)
{
cpu_write(d, 0x8ace, 0x30);
ppu_read(d, 0, 0x2000);
cpu_write(d, 0x8ad0, 0x31);
ppu_read(d, 0, 0x2000);
cpu_write(d, 0x8acf, 0x32);
ppu_read(d, 0, 0x2000);
cpu_write(d, 0x8ad1, 0x33);
ppu_read(d, 0, 0x2000);
}
これで吸い出せました。
