OSDN Git Service

cartrdige script を管理開始 (なぜかやってなかった)
[unagi/old-svn-converted.git] / client / trunk / anago / mmc1_surom.ag
diff --git a/client/trunk/anago/mmc1_surom.ag b/client/trunk/anago/mmc1_surom.ag
new file mode 100644 (file)
index 0000000..87c5853
--- /dev/null
@@ -0,0 +1,113 @@
+/*\r
+SUROM:\r
+Dragon Quest IV, Dragon Warrior III, Dragon Warrior IV, Ninjara Hoi!\r
+SXROM:\r
+Best Play Pro Yakyuu Special, Final Fantasy I & II\r
+*/\r
+board <- {\r
+       mappernum = 1, vram_mirrorfind = false, ppu_ramfind = false,\r
+       cpu_rom = {\r
+               size_base = 4 * mega, size_max = 4 * mega,\r
+               banksize = 0x4000, \r
+       }, \r
+       cpu_ram = {\r
+               size_base = 0x2000, size_max = 0x8000,\r
+               banksize = 0x2000\r
+       },\r
+       ppu_rom = {\r
+               size_base = 0, size_max = 0,\r
+               banksize = 0x1000, \r
+       }\r
+};\r
+\r
+dofile("mmc1.ai");\r
+\r
+function cpu_dump(d, pagesize, banksize)\r
+{\r
+       cpu_write(d, 0x8000, 0x80); //serial count reset\r
+       mmc1_write(d, 0x8000, 0x0c); //CPU/PPU bank configuration\r
+       for(local i = 0; i < pagesize; i += 0x10){\r
+               mmc1_write(d, 0xa000, (i & 0x10) | 1);\r
+               for(local j = 0; j < 0x10 - 1; j += 1){\r
+                       mmc1_write(d, 0xe000, j | 0x10);\r
+                       cpu_read(d, 0x8000, banksize);\r
+               }\r
+               cpu_read(d, 0xc000, banksize);\r
+       }\r
+}\r
+\r
+/*\r
+http://nesdevwiki.org/wiki/SXROM\r
+ CHR bank 0 (internal, $A000-$BFFF)\r
+4bit0\r
+-----\r
+PSSxC\r
+||| |\r
+||| +- Select 4 KB CHR RAM bank at PPU $0000 (ignored in 8 KB mode)\r
+|++--- Select 8 KB PRG RAM bank\r
++----- Select 256 KB PRG ROM bank\r
+*/\r
+\r
+function cpu_ram_access(d, pagesize, banksize)\r
+{\r
+       local sxrom_page = [0, 2 << 2, 1 << 2, 3 << 2];\r
+       cpu_write(d, 0x8000, 0x80); //serial count reset\r
+       mmc1_write(d, 0x8000, 1 << 3);\r
+       mmc1_write(d, 0xe000, 0);\r
+       for(local i = 0; i < pagesize; i += 1){\r
+//             mmc1_write(d, 0xa000, (i & 0x03) << 2);\r
+               mmc1_write(d, 0xa000, sxrom_page[i]);\r
+               cpu_ramrw(d, 0x6000, banksize);\r
+       }\r
+       mmc1_write(d, 0xe000, 0xff);\r
+}\r
+\r
+/*\r
+SUROM SXROM CPU memory bank\r
+cpu address|rom address    |page|task\r
+--SNROM area -- even ----------------\r
+$8000-$bfff|n * 0x4000|even 0x00|write 0x2aaa + write area\r
+$c000-$ffff|0x3c000-0x3ffff|fix |write 0x5555\r
+--SNROM area -- odd -----------------\r
+$8000-$bfff|0x00000-0x03fff|fix |write 0x2aaa\r
+$c000-$ffff|n * 0x4000|odd  0x01|write 0x5555 + write area\r
+--SUROM area -- even ----------------\r
+$8000-$bfff|n * 0x4000|even 0x20|write 0x2aaa + write area\r
+$c000-$ffff|0x7c000-0x7ffff|fix |write 0x5555\r
+--SUROM area -- odd -----------------\r
+$8000-$bfff|0x40000-0x43fff|fix |write 0x2aaa\r
+$c000-$ffff|n * 0x4000|odd  0x21|write 0x5555 + write area\r
+*/\r
+function program_initalize(d, cpu_banksize, ppu_banksize)\r
+{\r
+       cpu_write(d, 0x8000, 0x80);\r
+       cpu_command(d, 0, 0x8000, cpu_banksize);\r
+       cpu_command(d, 0x2aaa, 0x8000, cpu_banksize);\r
+       cpu_command(d, 0x5555, 0xc000, cpu_banksize);\r
+       mmc1_write(d, 0x8000, 0x0c);\r
+       mmc1_write(d, 0xe000, 0x10); //cpubank #0\r
+       mmc1_write(d, 0xa000, 0); //ROM area 1st 2M\r
+}\r
+\r
+function cpu_transfer(d, start, end, cpu_banksize)\r
+{\r
+       local wram = 1 << 4; //W-RAM disable flag\r
+       for(local k = 0; k < 0x20; k += 0x10){\r
+               mmc1_write(d, 0xa000, k);\r
+               for(local i = 0; i < 0x10; i += 2){\r
+                       //even page\r
+                       mmc1_write(d, 0x8000, 0x0c);\r
+                       mmc1_write(d, 0xe000, i | 0 | wram);\r
+                       cpu_program(d, 0x8000, cpu_banksize);\r
+                       \r
+                       //odd page\r
+                       mmc1_write(d, 0x8000, 0x08);\r
+                       mmc1_write(d, 0xe000, i | 1 | wram);\r
+                       cpu_program(d, 0xc000, cpu_banksize);\r
+               }\r
+       }\r
+}\r
+\r
+function ppu_transfer(d, start, end, bank)\r
+{\r
+}\r