OSDN Git Service

87c5853d8c0d1c1daa446a77bee5e080ff4a4dc2
[unagi/old-svn-converted.git] / client / trunk / anago / nintendo_mmc1_surom.ag
1 /*\r
2 SUROM:\r
3 Dragon Quest IV, Dragon Warrior III, Dragon Warrior IV, Ninjara Hoi!\r
4 SXROM:\r
5 Best Play Pro Yakyuu Special, Final Fantasy I & II\r
6 */\r
7 board <- {\r
8         mappernum = 1, vram_mirrorfind = false, ppu_ramfind = false,\r
9         cpu_rom = {\r
10                 size_base = 4 * mega, size_max = 4 * mega,\r
11                 banksize = 0x4000, \r
12         }, \r
13         cpu_ram = {\r
14                 size_base = 0x2000, size_max = 0x8000,\r
15                 banksize = 0x2000\r
16         },\r
17         ppu_rom = {\r
18                 size_base = 0, size_max = 0,\r
19                 banksize = 0x1000, \r
20         }\r
21 };\r
22 \r
23 dofile("mmc1.ai");\r
24 \r
25 function cpu_dump(d, pagesize, banksize)\r
26 {\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
34                 }\r
35                 cpu_read(d, 0xc000, banksize);\r
36         }\r
37 }\r
38 \r
39 /*\r
40 http://nesdevwiki.org/wiki/SXROM\r
41  CHR bank 0 (internal, $A000-$BFFF)\r
42 4bit0\r
43 -----\r
44 PSSxC\r
45 ||| |\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
49 */\r
50 \r
51 function cpu_ram_access(d, pagesize, banksize)\r
52 {\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
61         }\r
62         mmc1_write(d, 0xe000, 0xff);\r
63 }\r
64 \r
65 /*\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
80 */\r
81 function program_initalize(d, cpu_banksize, ppu_banksize)\r
82 {\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
90 }\r
91 \r
92 function cpu_transfer(d, start, end, cpu_banksize)\r
93 {\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
98                         //even page\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
102                         \r
103                         //odd page\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
107                 }\r
108         }\r
109 }\r
110 \r
111 function ppu_transfer(d, start, end, bank)\r
112 {\r
113 }\r