diff --git a/src/boards/267.c b/src/boards/267.c index 1b53e89..2780fd0 100644 --- a/src/boards/267.c +++ b/src/boards/267.c @@ -34,9 +34,11 @@ static void M267PW(uint32 A, uint8 V) { } static DECLFW(M267Write) { - EXPREGS[0] = V; - FixMMC3PRG(MMC3_cmd); - FixMMC3CHR(MMC3_cmd); + if (!(EXPREGS[0] & 0x80)) { + EXPREGS[0] = V; + FixMMC3PRG(MMC3_cmd); + FixMMC3CHR(MMC3_cmd); + } } static void M267Reset(void) { @@ -47,14 +49,14 @@ static void M267Reset(void) { static void M267Power(void) { EXPREGS[0] = 0; GenMMC3Power(); - SetWriteHandler(0x6000, 0x6FFF, M267Write); + SetWriteHandler(0x6000, 0x7FFF, M267Write); } void Mapper267_Init(CartInfo *info) { - GenMMC3_Init(info, 128, 128, 0, 0); + GenMMC3_Init(info, 256, 128, 0, 0); cwrap = M267CW; pwrap = M267PW; info->Reset = M267Reset; info->Power = M267Power; - AddExState(EXPREGS, 4, 0, "EXPR"); + AddExState(EXPREGS, 1, 0, "EXPR"); } diff --git a/src/boards/377.c b/src/boards/377.c new file mode 100644 index 0000000..bece1b2 --- /dev/null +++ b/src/boards/377.c @@ -0,0 +1,64 @@ +/* FCEUmm - NES/Famicom Emulator + * + * Copyright notice for this file: + * Copyright (C) 2022 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 the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + */ + +/* NES 2.0 Mapper 377 - NES 2.0 Mapper 377 is used for the + * 1998 Super Game 8-in-1 (JY-111) pirate multicart. It works similarly to Mapper 267 except it has an outer 256KiB PRG-ROM bank. + */ + +#include "mapinc.h" +#include "mmc3.h" + +#define OUTER_BANK (((EXPREGS[0] & 0x20) >> 2) | (EXPREGS[0] & 0x06)) + +static void M377CW(uint32 A, uint8 V) { + setchr1(A, (V & 0x7F) | (OUTER_BANK << 6)); +} + +static void M377PW(uint32 A, uint8 V) { + setprg8(A, (V & 0x0F) | (OUTER_BANK << 3)); +} + +static DECLFW(M377Write) { + if (!(EXPREGS[0] & 0x80)) { + EXPREGS[0] = V; + FixMMC3PRG(MMC3_cmd); + FixMMC3CHR(MMC3_cmd); + } +} + +static void M377Reset(void) { + EXPREGS[0] = 0; + MMC3RegReset(); +} + +static void M377Power(void) { + EXPREGS[0] = 0; + GenMMC3Power(); + SetWriteHandler(0x6000, 0x7FFF, M377Write); +} + +void Mapper377_Init(CartInfo *info) { + GenMMC3_Init(info, 128, 128, 0, 0); + cwrap = M377CW; + pwrap = M377PW; + info->Reset = M377Reset; + info->Power = M377Power; + AddExState(EXPREGS, 1, 0, "EXPR"); +} diff --git a/src/ines.c b/src/ines.c index 4d89bab..76d090f 100644 --- a/src/ines.c +++ b/src/ines.c @@ -788,6 +788,7 @@ INES_BOARD_BEGIN() INES_BOARD( "3D-BLOCK", 355, UNL3DBlock_Init ) INES_BOARD( "YY860606C", 358, Mapper358_Init ) INES_BOARD( "N49C-300", 369, Mapper369_Init ) + INES_BOARD( "JY-111/JY-112", 377, Mapper377_Init ) INES_BOARD( "YY860729C", 386, Mapper386_Init ) INES_BOARD( "YY850735C", 387, Mapper387_Init ) INES_BOARD( "YY850835C", 388, Mapper388_Init ) diff --git a/src/ines.h b/src/ines.h index 5874029..57c87e9 100644 --- a/src/ines.h +++ b/src/ines.h @@ -273,6 +273,7 @@ void Mapper370_Init(CartInfo *); void Mapper372_Init(CartInfo *); void Mapper374_Init(CartInfo *); void Mapper376_Init(CartInfo *); +void Mapper377_Init(CartInfo *); void Mapper380_Init(CartInfo *); void Mapper381_Init(CartInfo *); void Mapper382_Init(CartInfo *);