diff --git a/src/boards/resettxrom.c b/src/boards/resettxrom.c index 910c8a2..96b3cb4 100644 --- a/src/boards/resettxrom.c +++ b/src/boards/resettxrom.c @@ -2,6 +2,7 @@ * * Copyright notice for this file: * Copyright (C) 2019 Libretro Team + * Copyright (C) 2020 negativeExponent * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -27,12 +28,35 @@ #include "mapinc.h" #include "mmc3.h" +static uint8 submapper; + static void M313CW(uint32 A, uint8 V) { - setchr1(A, (EXPREGS[0] << 7) | (V & 0x7F)); + /*FCEU_printf("CHR: A:%04x V:%02x 0:%02x\n", A, V, EXPREGS[0]);*/ + switch (submapper) { + case 0: V = (EXPREGS[0] << 7) | (V & 0x7F); break; + case 1: V = (EXPREGS[0] << 7) | (V & 0x7F); break; + case 2: V = (EXPREGS[0] << 8) | (V & 0xFF); break; + case 3: V = (EXPREGS[0] << 8) | (V & 0xFF); break; + case 4: V = (EXPREGS[0] << 7) | (V & 0x7F); break; + } + setchr1(A, V); } static void M313PW(uint32 A, uint8 V) { - setprg8(A, (EXPREGS[0] << 4) | (V & 0x0F)); + /*FCEU_printf("PRG: A:%04x V:%02x 0:%02x\n", A, V, EXPREGS[0]);*/ + switch (submapper) { + case 0: V = (EXPREGS[0] << 4) | (V & 0x0F); break; + case 1: V = (EXPREGS[0] << 5) | (V & 0x1F); break; + case 2: V = (EXPREGS[0] << 4) | (V & 0x0F); break; + case 3: V = (EXPREGS[0] << 5) | (V & 0x1F); break; + case 4: + if (EXPREGS[0] == 0) + V = (EXPREGS[0] << 5) | (V & 0x1F); + else + V = (EXPREGS[0] << 4) | (V & 0x0F); + break; + } + setprg8(A, V); } static void M313Reset(void) { @@ -48,10 +72,12 @@ static void M313Power(void) { /* NES 2.0 313, UNIF BMC-RESET-TXROM */ void BMCRESETTXROM_Init(CartInfo *info) { - GenMMC3_Init(info, 128, 128, 0, 0); + GenMMC3_Init(info, 256, 256, 8, 0); cwrap = M313CW; pwrap = M313PW; + submapper = info->submapper; info->Power = M313Power; info->Reset = M313Reset; - AddExState(EXPREGS, 1, 0, "EXPR"); + AddExState(&EXPREGS[0], 1, 0, "EXPR"); + AddExState(&submapper, 1, 0, "SUBM"); }