From 98244a1c1708ffde0abe6962326a887b583673a3 Mon Sep 17 00:00:00 2001 From: NewRisingSun <8vytz1+dhp372pv94ebg@sharklasers.com> Date: Tue, 1 Mar 2022 15:28:58 +0100 Subject: [PATCH 1/7] Mapper 432: Add NROM-256 mode and second DIP switchb it. --- src/boards/432.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/boards/432.c b/src/boards/432.c index af91e0e..f774783 100644 --- a/src/boards/432.c +++ b/src/boards/432.c @@ -32,12 +32,12 @@ static void M432CW(uint32 A, uint8 V) { static void M432PW(uint32 A, uint8 V) { int prgAND = (EXPREGS[1] & 0x02) ? 0x0F : 0x1F; int prgOR = ((EXPREGS[1] << 4) & 0x10) | (EXPREGS[1] << 1) & 0x20; - if ((A < 0xC000) || (~EXPREGS[1] & 0x40)) setprg8(A, (V & prgAND) | (prgOR & ~prgAND)); - if ((A < 0xC000) && (EXPREGS[1] & 0x40)) setprg8(A | 0x4000, (V & prgAND) | (prgOR & ~prgAND)); + if ((A < 0xC000) || (~EXPREGS[1] & 0x40)) setprg8(A, (V & prgAND) | (prgOR & ~prgAND) & (EXPREGS[1] & 0x80?~2:~0)); + if ((A < 0xC000) && (EXPREGS[1] & 0x40)) setprg8(A | 0x4000, (V & prgAND) | (prgOR & ~prgAND) | (EXPREGS[1] & 0x80? 2: 0)); } static DECLFR(M432Read) { - if (EXPREGS[0] & 1) + if (EXPREGS[0] & 1 || EXPREGS[1] & 0x20) return EXPREGS[2]; return CartBR(A); } From 48d548d23b9722637377f07fa923f70a82f13ff4 Mon Sep 17 00:00:00 2001 From: NewRisingSun <8vytz1+dhp372pv94ebg@sharklasers.com> Date: Tue, 1 Mar 2022 15:54:01 +0100 Subject: [PATCH 2/7] Mapper 432: register 0 write also clears register 1. Mapper 45: Only apply outer bank bits that are unaffected by the inner bank. Mapper 45: Add PRG /CE-based menu selection. --- src/boards/432.c | 3 ++- src/boards/mmc3.c | 40 +++++++++++++++++++++++----------------- 2 files changed, 25 insertions(+), 18 deletions(-) diff --git a/src/boards/432.c b/src/boards/432.c index f774783..5c6db48 100644 --- a/src/boards/432.c +++ b/src/boards/432.c @@ -44,6 +44,7 @@ static DECLFR(M432Read) { static DECLFW(M432Write) { EXPREGS[A & 1] = V; + if (~A &1 && ~V &1) EXPREGS[1] =0; /* Writing 0 to register 0 clears register 1 */ FixMMC3PRG(MMC3_cmd); FixMMC3CHR(MMC3_cmd); } @@ -51,7 +52,7 @@ static DECLFW(M432Write) { static void M432Reset(void) { EXPREGS[0] = 0; EXPREGS[1] = 0; - EXPREGS[2] = (EXPREGS[2] +1) & 3; + EXPREGS[2]++; MMC3RegReset(); } diff --git a/src/boards/mmc3.c b/src/boards/mmc3.c index 35e7762..00f770c 100644 --- a/src/boards/mmc3.c +++ b/src/boards/mmc3.c @@ -474,27 +474,33 @@ void Mapper44_Init(CartInfo *info) { /* ---------------------------- Mapper 45 ------------------------------- */ static void M45CW(uint32 A, uint8 V) { - if (!UNIFchrrama) { - uint32 NV = V; - if (EXPREGS[2] & 8) - NV &= (1 << ((EXPREGS[2] & 7) + 1)) - 1; - else - if (EXPREGS[2]) - NV &= 0; /* hack ;( don't know exactly how it should be */ - NV |= EXPREGS[0] | ((EXPREGS[2] & 0xF0) << 4); - setchr1(A, NV); - } else - /* setchr8(0); */ /* i don't know what cart need this, but a new one need other lol */ + if (CHRsize[0] ==8192) setchr1(A, V); + else { + int chrAND =0xFF >>(~EXPREGS[2] &0xF); + int chrOR =EXPREGS[0] | EXPREGS[2] <<4 &0xF00; + setchr1(A, V &chrAND | chrOR &~chrAND); + } +} + +static DECLFR(M45ReadOB) { + return X.DB; } static void M45PW(uint32 A, uint8 V) { - uint32 MV = V & ((EXPREGS[3] & 0x3F) ^ 0x3F); - MV |= EXPREGS[1]; - if(UNIFchrrama) - MV |= ((EXPREGS[2] & 0x40) << 2); - setprg8(A, MV); -/* FCEU_printf("1:%02x 2:%02x 3:%02x A=%04x V=%03x\n",EXPREGS[1],EXPREGS[2],EXPREGS[3],A,MV); */ + int prgAND =~EXPREGS[3] &0x3F; + int prgOR =EXPREGS[1] | EXPREGS[2] <<2 &0x300; + setprg8(A, V &prgAND | prgOR &~prgAND); + + /* Some multicarts select between five different menus by connecting one of the higher address lines to PRG /CE. + The menu code selects between menus by checking which of the higher address lines disables PRG-ROM when set. */ + if (PRGsize[0] <0x200000 && EXPREGS[5] ==1 && EXPREGS[1] &0x80 || + PRGsize[0] <0x200000 && EXPREGS[5] ==2 && EXPREGS[2] &0x40 || + PRGsize[0] <0x100000 && EXPREGS[5] ==3 && EXPREGS[1] &0x40 || + PRGsize[0] <0x100000 && EXPREGS[5] ==4 && EXPREGS[2] &0x20) + SetReadHandler(0x8000, 0xFFFF, M45ReadOB); + else + SetReadHandler(0x8000, 0xFFFF, CartBR); } static DECLFW(M45Write) { From 7a9a044d22b32f837904cb23091df2271c6a2a24 Mon Sep 17 00:00:00 2001 From: NewRisingSun <8vytz1+dhp372pv94ebg@sharklasers.com> Date: Tue, 1 Mar 2022 17:15:06 +0100 Subject: [PATCH 3/7] Mapper 344: Remove hack to accomodate a bad dump that made it incompatible with other multicarts using the same PCB. --- src/boards/gn26.c | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/src/boards/gn26.c b/src/boards/gn26.c index 0af480b..ecaf5f9 100644 --- a/src/boards/gn26.c +++ b/src/boards/gn26.c @@ -27,26 +27,25 @@ #include "mmc3.h" static void BMCGN26CW(uint32 A, uint8 V) { - uint32 base = (EXPREGS[0] & 0x03) << 7; - setchr1(A, base | (V & 0xFF)); + int chrAND = EXPREGS[0]&0x04? 0xFF: 0x7F; + int chrOR = EXPREGS[0] <<7; + setchr1(A, V &chrAND | chrOR &~chrAND); } static void BMCGN26PW(uint32 A, uint8 V) { - /* Re-ordered -> 0:SF4 1:Contra Force 2:Revolution Hero */ - uint32 table[] = { 0, 0, 1, 2 }; - uint32 base = table[(EXPREGS[0] & 0x03)]; - if (EXPREGS[0] & 4) { if (A == 0x8000) - setprg32(0x8000, (base << 2) | (V >> 2)); + setprg32(0x8000, (EXPREGS[0] << 2) | (V >> 2)); } else - setprg8(A, (base << 4) | (V & 0x0F)); + setprg8(A, (EXPREGS[0] << 4) | (V & 0x0F)); } static DECLFW(BMCGN26Write) { - EXPREGS[0] = A & 0x0F; - FixMMC3PRG(MMC3_cmd); - FixMMC3CHR(MMC3_cmd); + if (A001B &0x80 && ~A001B &0x40) { + EXPREGS[0] = A; + FixMMC3PRG(MMC3_cmd); + FixMMC3CHR(MMC3_cmd); + } } static void BMCGN26Reset(void) { @@ -56,7 +55,7 @@ static void BMCGN26Reset(void) { static void BMCGN26Power(void) { GenMMC3Power(); - SetWriteHandler(0x6800, 0x68FF, BMCGN26Write); + SetWriteHandler(0x6000, 0x7FFF, BMCGN26Write); } void BMCGN26_Init(CartInfo *info) { From 95b79c474504ba2c59da1c625e9f99ede5dc2e70 Mon Sep 17 00:00:00 2001 From: NewRisingSun <8vytz1+dhp372pv94ebg@sharklasers.com> Date: Tue, 1 Mar 2022 17:33:39 +0100 Subject: [PATCH 4/7] Mapper 289: Support Super 76-in-1 Contra --- src/boards/bmc60311c.c | 72 +++++++++++++----------------------------- 1 file changed, 22 insertions(+), 50 deletions(-) diff --git a/src/boards/bmc60311c.c b/src/boards/bmc60311c.c index 9ea71fa..02c3b23 100644 --- a/src/boards/bmc60311c.c +++ b/src/boards/bmc60311c.c @@ -24,79 +24,51 @@ #include "mapinc.h" -static uint8 inner_bank, outer_bank, mode; +static uint8 latch, reg[2]; static SFORMAT StateRegs[] = { - { &inner_bank, 1, "INB0" }, - { &outer_bank, 1, "OUTB" }, - { &mode, 1, "MODE" }, + { &latch, 1, "LATC" }, + { reg, 2, "REGS" }, { 0 } }; static void Sync(void) { - uint8 bbank = (mode & 4) ? 0 : (inner_bank & 7); - uint8 bank = outer_bank | bbank; - uint8 preg[2]; - - /* 0: NROM-128: Same inner/outer 16 KiB bank at CPU $8000-$BFFF - * and $C000-$FFFF - * 1: NROM-256: 32 kiB bank at CPU $8000-$FFFF (Selected inner/outer bank SHR 1) - * 2: UNROM: Inner/outer bank at CPU $8000-BFFF, - * fixed inner bank 7 within outer bank at $C000-$FFFF - * 3: Unknown - * - * The combined inner/outer bank is simply the inner bank, selected by the - * latch at $8000-$FFFF (or 0 if the latch is disabled) ORed with the - * outer bank selected by $6001, without any bit shifting. - */ - - preg[0] = bank; - preg[1] = 0; - - switch (mode & 3) { - case 0x00: - case 0x01: - preg[1] = bank | ((mode & 1) ? 1 : 0); - break; - case 0x02: - preg[1] = outer_bank | 7; - case 0x03: - break; + if (reg[0] &2) { /* UNROM */ + setprg16(0x8000, latch &7 | reg[1] &~7); + setprg16(0xC000, 7 | reg[1] &~7); + } else + if (reg[0] &1) /* NROM-256 */ + setprg32(0x8000, reg[1] >>1); + else { /* NROM-128 */ + setprg16(0x8000, reg[1]); + setprg16(0xC000, reg[1]); } - + SetupCartCHRMapping(0, CHRptr[0], 0x2000, !(reg[0] &4)); /* CHR-RAM write-protect */ setchr8(0); - setprg16(0x8000, preg[0]); - setprg16(0xC000, preg[1]); - setmirror(((mode & 8) >> 3) ^ 1); + setmirror(!(reg[0] &8)); } -static DECLFW(Write0) { - mode = V; +static DECLFW(WriteReg) { + reg[A &1] =V; Sync(); } -static DECLFW(Write1) { - outer_bank = V; - Sync(); -} - -static DECLFW(Write8) { - inner_bank = V; +static DECLFW(WriteLatch) { + latch = V; Sync(); } static void BMC60311CPower(void) { - inner_bank = outer_bank = mode = 0; + latch =reg[0] =reg[1] =0; Sync(); SetReadHandler(0x8000, 0xFFFF, CartBR); - SetWriteHandler(0x6000, 0x6000, Write0); - SetWriteHandler(0x6001, 0x6001, Write1); - SetWriteHandler(0x8000, 0xFFFF, Write8); + SetWriteHandler(0x6000, 0x6001, WriteReg); + SetWriteHandler(0x8000, 0xFFFF, WriteLatch); } static void BMC60311CReset(void) { - inner_bank = outer_bank = mode = 0; + latch =reg[0] =reg[1] =0; Sync(); } From de9e258f314369de8462417d6d2ba7d0775ab147 Mon Sep 17 00:00:00 2001 From: NewRisingSun <8vytz1+dhp372pv94ebg@sharklasers.com> Date: Tue, 1 Mar 2022 18:04:34 +0100 Subject: [PATCH 5/7] Mapper 256: Add WRAM support. --- src/boards/onebus.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/boards/onebus.c b/src/boards/onebus.c index d970456..bf52b64 100644 --- a/src/boards/onebus.c +++ b/src/boards/onebus.c @@ -65,6 +65,8 @@ static SFORMAT StateRegs[] = { 0 } }; +static uint8 *WRAM; + static void PSync(void) { uint8 bankmode = cpu410x[0xb] & 7; uint8 mask = (bankmode == 0x7) ? (0xff) : (0x3f >> bankmode); @@ -263,11 +265,14 @@ static void UNLOneBusPower(void) { SetReadHandler(0x4000, 0x403f, UNLOneBusReadAPU40XX); SetWriteHandler(0x4000, 0x403f, UNLOneBusWriteAPU40XX); - SetReadHandler(0x8000, 0xFFFF, CartBR); + SetReadHandler(0x6000, 0xFFFF, CartBR); + SetWriteHandler(0x6000, 0x7FFF, CartBW); SetWriteHandler(0x2010, 0x201f, UNLOneBusWritePPU201X); SetWriteHandler(0x4100, 0x410f, UNLOneBusWriteCPU410X); SetWriteHandler(0x8000, 0xffff, UNLOneBusWriteMMC3); + FCEU_CheatAddRAM(8, 0x6000, WRAM); + setprg8r(0x10, 0x6000, 0); Sync(); } @@ -285,9 +290,16 @@ static void StateRestore(int version) { Sync(); } +void UNLOneBus_Close(void) { + if (WRAM) + FCEU_gfree(WRAM); + WRAM = NULL; +} + void UNLOneBus_Init(CartInfo *info) { info->Power = UNLOneBusPower; info->Reset = UNLOneBusReset; + info->Close = UNLOneBus_Close; if (((*(uint32*)&(info->MD5)) == 0x305fcdc3) || /* PowerJoy Supermax Carts */ ((*(uint32*)&(info->MD5)) == 0x6abfce8e)) @@ -297,4 +309,8 @@ void UNLOneBus_Init(CartInfo *info) { MapIRQHook = UNLOneBusCpuHook; GameStateRestore = StateRestore; AddExState(&StateRegs, ~0, 0, 0); + + WRAM = (uint8*)FCEU_gmalloc(8192); + SetupCartPRGMapping(0x10, WRAM, 8192, 1); } + From 1aaccd7429d1d49a3756f396b3e0f4638f4024a1 Mon Sep 17 00:00:00 2001 From: NewRisingSun <8vytz1+dhp372pv94ebg@sharklasers.com> Date: Tue, 1 Mar 2022 18:18:49 +0100 Subject: [PATCH 6/7] Mapper 256: Add register scrambling based on NES 2.0 submapper. --- src/boards/onebus.c | 86 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 74 insertions(+), 12 deletions(-) diff --git a/src/boards/onebus.c b/src/boards/onebus.c index bf52b64..d4eb2f8 100644 --- a/src/boards/onebus.c +++ b/src/boards/onebus.c @@ -27,6 +27,8 @@ #include "mapinc.h" +static uint8 submapper; + /* General Purpose Registers */ static uint8 cpu410x[16], ppu201x[16], apu40xx[64]; @@ -35,9 +37,6 @@ static uint8 IRQCount, IRQa, IRQReload; #define IRQLatch cpu410x[0x1] /* accc cccc, a = 0, AD12 switching, a = 1, HSYNC switching */ /* MMC3 Registers */ -static uint8 inv_hack = 0; /* some OneBus Systems have swapped PRG reg commans in MMC3 inplementation, - * trying to autodetect unusual behavior, due not to add a new mapper. - */ #define mmc3cmd cpu410x[0x5] /* pcv- ----, p - program swap, c - video swap, v - internal VRAM enable */ #define mirror cpu410x[0x6] /* ---- ---m, m = 0 - H, m = 1 - V */ @@ -79,8 +78,8 @@ static void PSync(void) { uint8 bank2 = (cpu410x[0xb] & 0x40)?(cpu410x[0x9]):(~1); uint8 bank3 = ~0; #endif - uint8 bank0 = cpu410x[0x7 ^ inv_hack]; - uint8 bank1 = cpu410x[0x8 ^ inv_hack]; + uint8 bank0 = cpu410x[0x7]; + uint8 bank1 = cpu410x[0x8]; uint8 bank2 = (cpu410x[0xb] & 0x40) ? (cpu410x[0x9]) : (~1); uint8 bank3 = ~0; @@ -126,29 +125,91 @@ static void Sync(void) { CSync(); } +static const uint8 cpuMangle[16][4] = { + { 0, 1, 2, 3 }, // Submapper 0: Normal + { 0, 1, 2, 3 }, // Submapper 1: Waixing VT03 + { 1, 0, 2, 3 }, // Submapper 2: Trump Grand + { 0, 1, 2, 3 }, // Submapper 3: Zechess + { 0, 1, 2, 3 }, // Submapper 4: Qishenglong + { 0, 1, 2, 3 }, // Submapper 5: Waixing VT02 + { 0, 1, 2, 3 }, // Submapper 6: unused so far + { 0, 1, 2, 3 }, // Submapper 7: unused so far + { 0, 1, 2, 3 }, // Submapper 8: unused so far + { 0, 1, 2, 3 }, // Submapper 9: unused so far + { 0, 1, 2, 3 }, // Submapper A: unused so far + { 0, 1, 2, 3 }, // Submapper B: unused so far + { 0, 1, 2, 3 }, // Submapper C: unused so far + { 0, 1, 2, 3 }, // Submapper D: Cube Tech (CPU opcode encryption only) + { 0, 1, 2, 3 }, // Submapper E: Karaoto (CPU opcode encryption only) + { 0, 1, 2, 3 } // Submapper F: Jungletac (CPU opcode encryption only) +}; static DECLFW(UNLOneBusWriteCPU410X) { /* FCEU_printf("CPU %04x:%04x\n",A,V); */ - switch (A & 0xf) { + A &=0xF; + switch (A) { case 0x1: IRQLatch = V & 0xfe; break; /* не по даташиту */ case 0x2: IRQReload = 1; break; case 0x3: X6502_IRQEnd(FCEU_IQEXT); IRQa = 0; break; case 0x4: IRQa = 1; break; default: - cpu410x[A & 0xf] = V; + if (A >=0x7 && A <=0xA) A =0x7 +cpuMangle[submapper][A -0x7]; + cpu410x[A] = V; Sync(); } } +static const uint8 ppuMangle[16][6] = { + { 0, 1, 2, 3, 4, 5 }, // Submapper 0: Normal + { 1, 0, 5, 4, 3, 2 }, // Submapper 1: Waixing VT03 + { 0, 1, 2, 3, 4, 5 }, // Submapper 2: Trump Grand + { 5, 4, 3, 2, 0, 1 }, // Submapper 3: Zechess + { 2, 5, 0, 4, 3, 1 }, // Submapper 4: Qishenglong + { 1, 0, 5, 4, 3, 2 }, // Submapper 5: Waixing VT02 + { 0, 1, 2, 3, 4, 5 }, // Submapper 6: unused so far + { 0, 1, 2, 3, 4, 5 }, // Submapper 7: unused so far + { 0, 1, 2, 3, 4, 5 }, // Submapper 8: unused so far + { 0, 1, 2, 3, 4, 5 }, // Submapper 9: unused so far + { 0, 1, 2, 3, 4, 5 }, // Submapper A: unused so far + { 0, 1, 2, 3, 4, 5 }, // Submapper B: unused so far + { 0, 1, 2, 3, 4, 5 }, // Submapper C: unused so far + { 0, 1, 2, 3, 4, 5 }, // Submapper D: Cube Tech (CPU opcode encryption only) + { 0, 1, 2, 3, 4, 5 }, // Submapper E: Karaoto (CPU opcode encryption only) + { 0, 1, 2, 3, 4, 5 } // Submapper F: Jungletac (CPU opcode encryption only) +}; static DECLFW(UNLOneBusWritePPU201X) { /* FCEU_printf("PPU %04x:%04x\n",A,V); */ - ppu201x[A & 0x0f] = V; + A &=0x0F; + if (A >=2 && A <=7) A =2 +ppuMangle[submapper][A -2]; + ppu201x[A] = V; Sync(); } +static const uint8 mmc3Mangle[16][8] = { + { 0, 1, 2, 3, 4, 5, 6, 7 }, // Submapper 0: Normal + { 5, 4, 3, 2, 1, 0, 6, 7 }, // Submapper 1: Waixing VT03 + { 0, 1, 2, 3, 4, 5, 7, 6 }, // Submapper 2: Trump Grand + { 0, 1, 2, 3, 4, 5, 6, 7 }, // Submapper 3: Zechess + { 0, 1, 2, 3, 4, 5, 6, 7 }, // Submapper 4: Qishenglong + { 0, 1, 2, 3, 4, 5, 6, 7 }, // Submapper 5: Waixing VT02 + { 0, 1, 2, 3, 4, 5, 6, 7 }, // Submapper 6: unused so far + { 0, 1, 2, 3, 4, 5, 6, 7 }, // Submapper 7: unused so far + { 0, 1, 2, 3, 4, 5, 6, 7 }, // Submapper 8: unused so far + { 0, 1, 2, 3, 4, 5, 6, 7 }, // Submapper 9: unused so far + { 0, 1, 2, 3, 4, 5, 6, 7 }, // Submapper A: unused so far + { 0, 1, 2, 3, 4, 5, 6, 7 }, // Submapper B: unused so far + { 0, 1, 2, 3, 4, 5, 6, 7 }, // Submapper C: unused so far + { 0, 1, 2, 3, 4, 5, 6, 7 }, // Submapper D: Cube Tech (CPU opcode encryption only) + { 0, 1, 2, 3, 4, 5, 6, 7 }, // Submapper E: Karaoto (CPU opcode encryption only) + { 0, 1, 2, 3, 4, 5, 6, 7 } // Submapper F: Jungletac (CPU opcode encryption only) +}; static DECLFW(UNLOneBusWriteMMC3) { /* FCEU_printf("MMC %04x:%04x\n",A,V); */ switch (A & 0xe001) { - case 0x8000: mmc3cmd = (mmc3cmd & 0x38) | (V & 0xc7); Sync(); break; + case 0x8000: + V =V &0xF8 | mmc3Mangle[submapper][V &0x07]; + mmc3cmd = (mmc3cmd & 0x38) | (V & 0xc7); + Sync(); + break; case 0x8001: { switch (mmc3cmd & 7) { @@ -301,9 +362,10 @@ void UNLOneBus_Init(CartInfo *info) { info->Reset = UNLOneBusReset; info->Close = UNLOneBus_Close; - if (((*(uint32*)&(info->MD5)) == 0x305fcdc3) || /* PowerJoy Supermax Carts */ - ((*(uint32*)&(info->MD5)) == 0x6abfce8e)) - inv_hack = 0xf; + if (info->iNES2) + submapper =info->submapper; + else + submapper =(((*(uint32*)&(info->MD5)) == 0x305fcdc3) || ((*(uint32*)&(info->MD5)) == 0x6abfce8e))? 2: 0; /* PowerJoy Supermax Carts */ GameHBIRQHook = UNLOneBusIRQHook; MapIRQHook = UNLOneBusCpuHook; From e88404cd3d7bd881b9b195dd005c91822725ef95 Mon Sep 17 00:00:00 2001 From: NewRisingSun <8vytz1+dhp372pv94ebg@sharklasers.com> Date: Tue, 1 Mar 2022 18:36:34 +0100 Subject: [PATCH 7/7] C-style comments. :P --- src/boards/onebus.c | 96 ++++++++++++++++++++++----------------------- 1 file changed, 48 insertions(+), 48 deletions(-) diff --git a/src/boards/onebus.c b/src/boards/onebus.c index d4eb2f8..4175ca1 100644 --- a/src/boards/onebus.c +++ b/src/boards/onebus.c @@ -126,22 +126,22 @@ static void Sync(void) { } static const uint8 cpuMangle[16][4] = { - { 0, 1, 2, 3 }, // Submapper 0: Normal - { 0, 1, 2, 3 }, // Submapper 1: Waixing VT03 - { 1, 0, 2, 3 }, // Submapper 2: Trump Grand - { 0, 1, 2, 3 }, // Submapper 3: Zechess - { 0, 1, 2, 3 }, // Submapper 4: Qishenglong - { 0, 1, 2, 3 }, // Submapper 5: Waixing VT02 - { 0, 1, 2, 3 }, // Submapper 6: unused so far - { 0, 1, 2, 3 }, // Submapper 7: unused so far - { 0, 1, 2, 3 }, // Submapper 8: unused so far - { 0, 1, 2, 3 }, // Submapper 9: unused so far - { 0, 1, 2, 3 }, // Submapper A: unused so far - { 0, 1, 2, 3 }, // Submapper B: unused so far - { 0, 1, 2, 3 }, // Submapper C: unused so far - { 0, 1, 2, 3 }, // Submapper D: Cube Tech (CPU opcode encryption only) - { 0, 1, 2, 3 }, // Submapper E: Karaoto (CPU opcode encryption only) - { 0, 1, 2, 3 } // Submapper F: Jungletac (CPU opcode encryption only) + { 0, 1, 2, 3 }, /* Submapper 0: Normal */ + { 0, 1, 2, 3 }, /* Submapper 1: Waixing VT03 */ + { 1, 0, 2, 3 }, /* Submapper 2: Trump Grand */ + { 0, 1, 2, 3 }, /* Submapper 3: Zechess */ + { 0, 1, 2, 3 }, /* Submapper 4: Qishenglong */ + { 0, 1, 2, 3 }, /* Submapper 5: Waixing VT02 */ + { 0, 1, 2, 3 }, /* Submapper 6: unused so far */ + { 0, 1, 2, 3 }, /* Submapper 7: unused so far */ + { 0, 1, 2, 3 }, /* Submapper 8: unused so far */ + { 0, 1, 2, 3 }, /* Submapper 9: unused so far */ + { 0, 1, 2, 3 }, /* Submapper A: unused so far */ + { 0, 1, 2, 3 }, /* Submapper B: unused so far */ + { 0, 1, 2, 3 }, /* Submapper C: unused so far */ + { 0, 1, 2, 3 }, /* Submapper D: Cube Tech (CPU opcode encryption only) */ + { 0, 1, 2, 3 }, /* Submapper E: Karaoto (CPU opcode encryption only) */ + { 0, 1, 2, 3 } /* Submapper F: Jungletac (CPU opcode encryption only) */ }; static DECLFW(UNLOneBusWriteCPU410X) { /* FCEU_printf("CPU %04x:%04x\n",A,V); */ @@ -159,22 +159,22 @@ static DECLFW(UNLOneBusWriteCPU410X) { } static const uint8 ppuMangle[16][6] = { - { 0, 1, 2, 3, 4, 5 }, // Submapper 0: Normal - { 1, 0, 5, 4, 3, 2 }, // Submapper 1: Waixing VT03 - { 0, 1, 2, 3, 4, 5 }, // Submapper 2: Trump Grand - { 5, 4, 3, 2, 0, 1 }, // Submapper 3: Zechess - { 2, 5, 0, 4, 3, 1 }, // Submapper 4: Qishenglong - { 1, 0, 5, 4, 3, 2 }, // Submapper 5: Waixing VT02 - { 0, 1, 2, 3, 4, 5 }, // Submapper 6: unused so far - { 0, 1, 2, 3, 4, 5 }, // Submapper 7: unused so far - { 0, 1, 2, 3, 4, 5 }, // Submapper 8: unused so far - { 0, 1, 2, 3, 4, 5 }, // Submapper 9: unused so far - { 0, 1, 2, 3, 4, 5 }, // Submapper A: unused so far - { 0, 1, 2, 3, 4, 5 }, // Submapper B: unused so far - { 0, 1, 2, 3, 4, 5 }, // Submapper C: unused so far - { 0, 1, 2, 3, 4, 5 }, // Submapper D: Cube Tech (CPU opcode encryption only) - { 0, 1, 2, 3, 4, 5 }, // Submapper E: Karaoto (CPU opcode encryption only) - { 0, 1, 2, 3, 4, 5 } // Submapper F: Jungletac (CPU opcode encryption only) + { 0, 1, 2, 3, 4, 5 }, /* Submapper 0: Normal */ + { 1, 0, 5, 4, 3, 2 }, /* Submapper 1: Waixing VT03 */ + { 0, 1, 2, 3, 4, 5 }, /* Submapper 2: Trump Grand */ + { 5, 4, 3, 2, 0, 1 }, /* Submapper 3: Zechess */ + { 2, 5, 0, 4, 3, 1 }, /* Submapper 4: Qishenglong */ + { 1, 0, 5, 4, 3, 2 }, /* Submapper 5: Waixing VT02 */ + { 0, 1, 2, 3, 4, 5 }, /* Submapper 6: unused so far */ + { 0, 1, 2, 3, 4, 5 }, /* Submapper 7: unused so far */ + { 0, 1, 2, 3, 4, 5 }, /* Submapper 8: unused so far */ + { 0, 1, 2, 3, 4, 5 }, /* Submapper 9: unused so far */ + { 0, 1, 2, 3, 4, 5 }, /* Submapper A: unused so far */ + { 0, 1, 2, 3, 4, 5 }, /* Submapper B: unused so far */ + { 0, 1, 2, 3, 4, 5 }, /* Submapper C: unused so far */ + { 0, 1, 2, 3, 4, 5 }, /* Submapper D: Cube Tech (CPU opcode encryption only) */ + { 0, 1, 2, 3, 4, 5 }, /* Submapper E: Karaoto (CPU opcode encryption only) */ + { 0, 1, 2, 3, 4, 5 } /* Submapper F: Jungletac (CPU opcode encryption only) */ }; static DECLFW(UNLOneBusWritePPU201X) { /* FCEU_printf("PPU %04x:%04x\n",A,V); */ @@ -185,22 +185,22 @@ static DECLFW(UNLOneBusWritePPU201X) { } static const uint8 mmc3Mangle[16][8] = { - { 0, 1, 2, 3, 4, 5, 6, 7 }, // Submapper 0: Normal - { 5, 4, 3, 2, 1, 0, 6, 7 }, // Submapper 1: Waixing VT03 - { 0, 1, 2, 3, 4, 5, 7, 6 }, // Submapper 2: Trump Grand - { 0, 1, 2, 3, 4, 5, 6, 7 }, // Submapper 3: Zechess - { 0, 1, 2, 3, 4, 5, 6, 7 }, // Submapper 4: Qishenglong - { 0, 1, 2, 3, 4, 5, 6, 7 }, // Submapper 5: Waixing VT02 - { 0, 1, 2, 3, 4, 5, 6, 7 }, // Submapper 6: unused so far - { 0, 1, 2, 3, 4, 5, 6, 7 }, // Submapper 7: unused so far - { 0, 1, 2, 3, 4, 5, 6, 7 }, // Submapper 8: unused so far - { 0, 1, 2, 3, 4, 5, 6, 7 }, // Submapper 9: unused so far - { 0, 1, 2, 3, 4, 5, 6, 7 }, // Submapper A: unused so far - { 0, 1, 2, 3, 4, 5, 6, 7 }, // Submapper B: unused so far - { 0, 1, 2, 3, 4, 5, 6, 7 }, // Submapper C: unused so far - { 0, 1, 2, 3, 4, 5, 6, 7 }, // Submapper D: Cube Tech (CPU opcode encryption only) - { 0, 1, 2, 3, 4, 5, 6, 7 }, // Submapper E: Karaoto (CPU opcode encryption only) - { 0, 1, 2, 3, 4, 5, 6, 7 } // Submapper F: Jungletac (CPU opcode encryption only) + { 0, 1, 2, 3, 4, 5, 6, 7 }, /* Submapper 0: Normal */ + { 5, 4, 3, 2, 1, 0, 6, 7 }, /* Submapper 1: Waixing VT03 */ + { 0, 1, 2, 3, 4, 5, 7, 6 }, /* Submapper 2: Trump Grand */ + { 0, 1, 2, 3, 4, 5, 6, 7 }, /* Submapper 3: Zechess */ + { 0, 1, 2, 3, 4, 5, 6, 7 }, /* Submapper 4: Qishenglong */ + { 0, 1, 2, 3, 4, 5, 6, 7 }, /* Submapper 5: Waixing VT02 */ + { 0, 1, 2, 3, 4, 5, 6, 7 }, /* Submapper 6: unused so far */ + { 0, 1, 2, 3, 4, 5, 6, 7 }, /* Submapper 7: unused so far */ + { 0, 1, 2, 3, 4, 5, 6, 7 }, /* Submapper 8: unused so far */ + { 0, 1, 2, 3, 4, 5, 6, 7 }, /* Submapper 9: unused so far */ + { 0, 1, 2, 3, 4, 5, 6, 7 }, /* Submapper A: unused so far */ + { 0, 1, 2, 3, 4, 5, 6, 7 }, /* Submapper B: unused so far */ + { 0, 1, 2, 3, 4, 5, 6, 7 }, /* Submapper C: unused so far */ + { 0, 1, 2, 3, 4, 5, 6, 7 }, /* Submapper D: Cube Tech (CPU opcode encryption only) */ + { 0, 1, 2, 3, 4, 5, 6, 7 }, /* Submapper E: Karaoto (CPU opcode encryption only) */ + { 0, 1, 2, 3, 4, 5, 6, 7 } /* Submapper F: Jungletac (CPU opcode encryption only) */ }; static DECLFW(UNLOneBusWriteMMC3) { /* FCEU_printf("MMC %04x:%04x\n",A,V); */