diff --git a/src/boards/273.c b/src/boards/273.c new file mode 100644 index 0000000..5310d1f --- /dev/null +++ b/src/boards/273.c @@ -0,0 +1,83 @@ +/* FCE Ultra - NES/Famicom Emulator + * + * Copyright notice for this file: + * Copyright (C) 2025 NewRisingSun + * + * 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 + */ + +#include "mapinc.h" +#include "asic_vrc2and4.h" + +static uint8 irqEnabled; +static uint8 irqCounter; +static uint8 irqPrescaler; +static uint8 irqMask; + +static SFORMAT stateRegs[] ={ + { &irqEnabled, 1, "IRQE" }, + { &irqCounter, 1, "CNTR" }, + { &irqPrescaler, 1, "IRQP" }, + { &irqMask, 1, "IRQM" }, + { 0 } +}; + +static void sync () { + VRC24_syncPRG(0x01F, 0x000); + VRC24_syncCHR(0x1FF, 0x000); + VRC24_syncMirror(); +} + +static DECLFW(writeIRQ) { + switch(A &8) { + case 0: + irqCounter = V; + X6502_IRQEnd(FCEU_IQEXT); + break; + case 8: + irqEnabled = V; + if (~irqEnabled &1) { + irqPrescaler = 0; + irqMask = 0x7F; + X6502_IRQEnd(FCEU_IQEXT); + } + break; + } +} + +static void FP_FASTAPASS(1) cpuCycle (int a) { + while (a--) { + if (irqEnabled &1 && !(++irqPrescaler &irqMask)) { + irqMask = 0xFF; + if (!++irqCounter) + X6502_IRQBegin(FCEU_IQEXT); + else + X6502_IRQEnd(FCEU_IQEXT); + } + } +} + +static void power(void) { + irqEnabled = irqCounter = irqPrescaler = irqMask = 0; + VRC24_power(); + SetWriteHandler(0xF000, 0xFFFF, writeIRQ); +} + +void Mapper273_Init (CartInfo *info) { + VRC2_init(info, sync, 0x04, 0x08, NULL, NULL, NULL, NULL); + AddExState(stateRegs, ~0, 0, 0); + info->Power = power; + MapIRQHook = cpuCycle; +} diff --git a/src/boards/565.c b/src/boards/565.c index 76ccfde..722cf17 100644 --- a/src/boards/565.c +++ b/src/boards/565.c @@ -24,13 +24,11 @@ static uint8 irqEnabled; static uint8 irqCounter; static uint8 irqPrescaler; -static uint8 irqMask; static SFORMAT stateRegs[] ={ { &irqEnabled, 1, "IRQE" }, - { &irqCounter, 1, "CNTL" }, + { &irqCounter, 1, "CNTR" }, { &irqPrescaler, 1, "IRQP" }, - { &irqMask, 1, "IRQC" }, { 0 } }; @@ -53,7 +51,7 @@ static DECLFW(writeIRQ) { } } -void FP_FASTAPASS(1) cpuCycle (int a) { +static void FP_FASTAPASS(1) cpuCycle (int a) { while (a--) { if (irqEnabled &1) { irqPrescaler++; @@ -67,7 +65,7 @@ void FP_FASTAPASS(1) cpuCycle (int a) { } static void power(void) { - irqEnabled = irqCounter = irqPrescaler = irqMask = 0; + irqEnabled = irqCounter = irqPrescaler = 0; VRC24_power(); SetWriteHandler(0xF000, 0xFFFF, writeIRQ); } diff --git a/src/ines.c b/src/ines.c index fe5448a..3acaa15 100644 --- a/src/ines.c +++ b/src/ines.c @@ -728,6 +728,7 @@ INES_BOARD_BEGIN() INES_BOARD( "OneBus+412C Bankswitch", 270, Mapper270_Init ) INES_BOARD( "MGC-026", 271, Mapper271_Init ) INES_BOARD( "Akumajō Special: Boku Dracula-kun", 272, Mapper272_Init ) + INES_BOARD( "J-3?-C", 273, Mapper273_Init ) INES_BOARD( "80013-B", 274, BMC80013B_Init ) INES_BOARD( "", 277, Mapper277_Init ) INES_BOARD( "K-3017", 280, Mapper280_Init ) diff --git a/src/ines.h b/src/ines.h index bcaff87..5024027 100644 --- a/src/ines.h +++ b/src/ines.h @@ -254,6 +254,7 @@ void Mapper255_Init(CartInfo *); void GN45_Init(CartInfo *info); /* m361, m366 */ void Mapper270_Init(CartInfo *); void Mapper272_Init(CartInfo *); +void Mapper273_Init(CartInfo *); void Mapper277_Init(CartInfo *); void Mapper280_Init(CartInfo *); void Mapper281_Init(CartInfo *);