/*************************************** VRC4B Mapper25 20230109 Update: VRC4d 352400 A3 A2 $x000, $x008, $x004, $x00C 25 2 Teenage Mutant Ninja Turtles 2 - The Manhattan Project (Japan) ***************************************/ function vrc4_cpu_dump(d, pagesize, banksize, r0, r1) { local a2 = 1 << r1; cpu_write(d, 0x9000 | a2, 0); for(local i = 0; i < pagesize - 2; i += 2){ cpu_write(d, 0x8000, i); cpu_write(d, 0xa000, i | 1); cpu_read(d, 0x8000, banksize * 2); } cpu_write(d, 0x9000 | a2, 0x02); cpu_write(d, 0x8000, 0x1e); cpu_read(d, 0xc000, banksize * 2); } function cpu_dump(d,prg_size,crc) { if( (crc==0xc2c3292c)||//Teenage Mutant Ninja Turtles (crc==0x41926B9D)//Teenage Mutant Ninja Turtles II ) { /* 9004 00 8FFF 18 bank 8000-9FFF AFFF 19 bank A000-BFFF */ show_log(d, "Teenage Mutant Ninja Turtles"); vrc4_cpu_dump(d,prg_size/0x2000,0x2000, 3, 2); } else vrc4_cpu_dump(d,prg_size/0x2000,0x2000, 1, 0); } function ppu_bank_set(d, addr, i, j, r0, r1) { local a1 = (1 << r0); local a2 = (1 << r1); local a3 = a1 | a2; //cpu_write(d, addr | a1, i >> 4); //cpu_write(d, addr, i & 0xf); //cpu_write(d, addr | a3, j >> 4); //cpu_write(d, addr | a2, j & 0xf); cpu_write(d, addr | a1, i >> 4,addr, i & 0xf,addr | a3, j >> 4,addr | a2, j & 0xf); } function vrc4_ppu_dump(d, pagesize, banksize, r0, r1) { for(local i = 0; i < pagesize; i += 8){ ppu_bank_set(d, 0xb000, i | 0, i | 1, r0, r1); ppu_bank_set(d, 0xc000, i | 2, i | 3, r0, r1); ppu_bank_set(d, 0xd000, i | 4, i | 5, r0, r1); ppu_bank_set(d, 0xe000, i | 6, i | 7, r0, r1); ppu_read(d, 0x0000, banksize * 8); } } function ppu_dump(d,chr_size,reset_crc) { if( (reset_crc==0xc2c3292c)||//Teenage Mutant Ninja Turtles (reset_crc==0x41926B9D)//Teenage Mutant Ninja Turtles II ) vrc4_ppu_dump(d, chr_size/0x400, 0x400, 3, 2); else vrc4_ppu_dump(d, chr_size/0x400, 0x400, 1, 0); } function cpu_erase(d, prg_size, prg_size_dummy) { cpu_write(d,0x9008,0); cpu_write(d,0x8000,0); cpu_write_flash(d,0x8555,0xF0); cpu_write_flash(d,0x8555,0xAA); cpu_write_flash(d,0x82AA,0x55); cpu_write_flash(d,0x8555,0x80); cpu_write_flash(d,0x8555,0xAA); cpu_write_flash(d,0x82AA,0x55); cpu_write_flash(d,0x8555,0x10); } function cpu_flash(d, prg_size, prg_size_dummy) { flash_configure(d,0xA000,0xA555,0xA2AA,0xA555); for(local i = 0; i < (prg_size/0x2000)-1; i += 1){ cpu_write(d, 0xA000, i); prg_flash(d, 0xA000, 0x2000); } prg_flash(d, 0xE000, 0x2000); } function ppu_erase(d, chr_size, chr_size_dummy) { cpu_write(d, 0xB000, 0); cpu_write(d, 0xB001, 0); cpu_write(d, 0xB002, 1); cpu_write(d, 0xB003, 0); ppu_write(d,0x555,0xF0); ppu_write(d,0x555,0xAA); ppu_write(d,0x2AA,0x55); ppu_write(d,0x555,0x80); ppu_write(d,0x555,0xAA); ppu_write(d,0x2AA,0x55); ppu_write(d,0x555,0x10); } function ppu_flash(d, chr_size, chr_size_dummy) { flash_configure(d,0x555,0x555,0x2AA,0x555); for(local i = 0; i < (chr_size/0x400); i += 4){ cpu_write(d, 0xB000, (i>>0)&0xF); cpu_write(d, 0xB002, (i>>4)&0xF); cpu_write(d, 0xB001, ((i|1)>>0)&0xF); cpu_write(d, 0xB003, ((i|1)>>4)&0xF); cpu_write(d, 0xC000, ((i|2)>>0)&0xF); cpu_write(d, 0xC002, ((i|2)>>4)&0xF); cpu_write(d, 0xC001, ((i|3)>>0)&0xF); cpu_write(d, 0xC003, ((i|3)>>4)&0xF); chr_flash(d, 0x0000, 0x1000); } }