3 Dragon Quest IV, Dragon Warrior III, Dragon Warrior IV, Ninjara Hoi!
\r
5 Best Play Pro Yakyuu Special, Final Fantasy I & II
\r
8 mappernum = 1, vram_mirrorfind = false, ppu_ramfind = false,
\r
10 size_base = 4 * mega, size_max = 4 * mega,
\r
14 size_base = 0x2000, size_max = 0x8000,
\r
18 size_base = 0, size_max = 0,
\r
25 function cpu_dump(d, pagesize, banksize)
\r
27 cpu_write(d, 0x8000, 0x80); //serial count reset
\r
28 mmc1_write(d, 0x8000, 0x0c); //CPU/PPU bank configuration
\r
29 for(local i = 0; i < pagesize; i += 0x10){
\r
30 mmc1_write(d, 0xa000, (i & 0x10) | 1);
\r
31 for(local j = 0; j < 0x10 - 1; j += 1){
\r
32 mmc1_write(d, 0xe000, j | 0x10);
\r
33 cpu_read(d, 0x8000, banksize);
\r
35 cpu_read(d, 0xc000, banksize);
\r
40 http://nesdevwiki.org/wiki/SXROM
\r
41 CHR bank 0 (internal, $A000-$BFFF)
\r
46 ||| +- Select 4 KB CHR RAM bank at PPU $0000 (ignored in 8 KB mode)
\r
47 |++--- Select 8 KB PRG RAM bank
\r
48 +----- Select 256 KB PRG ROM bank
\r
51 function cpu_ram_access(d, pagesize, banksize)
\r
53 local sxrom_page = [0, 2 << 2, 1 << 2, 3 << 2];
\r
54 cpu_write(d, 0x8000, 0x80); //serial count reset
\r
55 mmc1_write(d, 0x8000, 1 << 3);
\r
56 mmc1_write(d, 0xe000, 0);
\r
57 for(local i = 0; i < pagesize; i += 1){
\r
58 // mmc1_write(d, 0xa000, (i & 0x03) << 2);
\r
59 mmc1_write(d, 0xa000, sxrom_page[i]);
\r
60 cpu_ramrw(d, 0x6000, banksize);
\r
62 mmc1_write(d, 0xe000, 0xff);
\r
66 SUROM SXROM CPU memory bank
\r
67 cpu address|rom address |page|task
\r
68 --SNROM area -- even ----------------
\r
69 $8000-$bfff|n * 0x4000|even 0x00|write 0x2aaa + write area
\r
70 $c000-$ffff|0x3c000-0x3ffff|fix |write 0x5555
\r
71 --SNROM area -- odd -----------------
\r
72 $8000-$bfff|0x00000-0x03fff|fix |write 0x2aaa
\r
73 $c000-$ffff|n * 0x4000|odd 0x01|write 0x5555 + write area
\r
74 --SUROM area -- even ----------------
\r
75 $8000-$bfff|n * 0x4000|even 0x20|write 0x2aaa + write area
\r
76 $c000-$ffff|0x7c000-0x7ffff|fix |write 0x5555
\r
77 --SUROM area -- odd -----------------
\r
78 $8000-$bfff|0x40000-0x43fff|fix |write 0x2aaa
\r
79 $c000-$ffff|n * 0x4000|odd 0x21|write 0x5555 + write area
\r
81 function program_initalize(d, cpu_banksize, ppu_banksize)
\r
83 cpu_write(d, 0x8000, 0x80);
\r
84 cpu_command(d, 0, 0x8000, cpu_banksize);
\r
85 cpu_command(d, 0x2aaa, 0x8000, cpu_banksize);
\r
86 cpu_command(d, 0x5555, 0xc000, cpu_banksize);
\r
87 mmc1_write(d, 0x8000, 0x0c);
\r
88 mmc1_write(d, 0xe000, 0x10); //cpubank #0
\r
89 mmc1_write(d, 0xa000, 0); //ROM area 1st 2M
\r
92 function cpu_transfer(d, start, end, cpu_banksize)
\r
94 local wram = 1 << 4; //W-RAM disable flag
\r
95 for(local k = 0; k < 0x20; k += 0x10){
\r
96 mmc1_write(d, 0xa000, k);
\r
97 for(local i = 0; i < 0x10; i += 2){
\r
99 mmc1_write(d, 0x8000, 0x0c);
\r
100 mmc1_write(d, 0xe000, i | 0 | wram);
\r
101 cpu_program(d, 0x8000, cpu_banksize);
\r
104 mmc1_write(d, 0x8000, 0x08);
\r
105 mmc1_write(d, 0xe000, i | 1 | wram);
\r
106 cpu_program(d, 0xc000, cpu_banksize);
\r
111 function ppu_transfer(d, start, end, bank)
\r