tunaでグラディウスを吸い出す

 バンク切り替えについて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);
}

これで吸い出せました。