diff --git a/zsnes/src/initc.c b/zsnes/src/initc.c index ba9d7e62..882c1401 100755 --- a/zsnes/src/initc.c +++ b/zsnes/src/initc.c @@ -598,49 +598,64 @@ void loadZipFile() } } +bool SplittedROM; +int addOnStart; +int addOnSize; + +void SplitSetup(const char *basefile, unsigned int MirrorSystem) +{ + unsigned char *ROM = (unsigned char *)romdata; + + curromspace = 0; + if (maxromspace < addOnStart+addOnSize) { return; } + memcpy(ROM+addOnStart, ROM, addOnSize); + strcpy(ZOpenFileName, basefile); + loadZipFile(); + if ((curromspace & 0x7FFF) == 512) + { + memmove(ROM, ROM+512, addOnStart); + curromspace -= 512; + } + if (!curromspace) { return; } + + switch (MirrorSystem) + { + case 1: + memcpy(ROM+0x100000, ROM, 0x100000); //Mirror 8 to 16 + break; + + case 2: + memcpy(ROM+0x180000, ROM+0x100000, 0x80000); //Mirror 12 to 16 + memcpy(ROM+0x200000, ROM, 0x200000); //Mirror 16 to 32 + break; + } + + curromspace = addOnStart+addOnSize; + SplittedROM = true; +} + void SplitSupport() { unsigned char *ROM = (unsigned char *)romdata; + SplittedROM = false; //Same Game add on if (ROM[Hi+26] == 0x33 && curromspace == 0x80000 && !ROM[Hi+21] && !ROM[Hi+22] && !ROM[Hi+23]) { - curromspace = 0; - if (maxromspace < 0x280000) { return; } - memcpy(ROM+0x200000, ROM, 0x80000); - strcpy(ZOpenFileName, "SAMEGAME.ZIP"); - loadZipFile(); - if ((curromspace & 0x7FFF) == 512) - { - memmove(ROM, ROM+512, 0x200000); - curromspace -= 512; - } - if (!curromspace) { return; } - memcpy(ROM+0x100000, ROM, 0x100000); //Mirror 8 to 16 - curromspace = 0x280000; + addOnStart = 0x200000; + addOnSize = 0x80000; + SplitSetup("SAMEGAME.ZIP", 1); } //SD Gundam G-Next add on if (ROM[Lo+26] == 0x33 && curromspace == 0x80000 && !ROM[Lo+21] && !ROM[Lo+22] && !ROM[Lo+23] && !strncmp(ROM+Lo, "GNEXT", 5)) { - curromspace = 0; - if (maxromspace < 0x480000) { return; } - memcpy(ROM+0x400000, ROM, 0x80000); - strcpy(ZOpenFileName, "G-NEXT.ZIP"); - loadZipFile(); - if ((curromspace & 0x7FFF) == 512) - { - memmove(ROM, ROM+512, 0x400000); - curromspace -= 512; - } - if (!curromspace) { return; } - memcpy(ROM+0x180000, ROM+0x100000, 0x80000); //Mirror 12 to 16 - memcpy(ROM+0x200000, ROM, 0x200000); //Mirror 16 to 32 - curromspace = 0x480000; + addOnStart = 0x400000; + addOnSize = 0x80000; + SplitSetup("G-NEXT.ZIP", 2); } - } extern bool Sup48mbit;