From c7960e9e0cf8df8378e5d654bb7fc15010e37eba Mon Sep 17 00:00:00 2001 From: NewRisingSun <8vytz1+dhp372pv94ebg@sharklasers.com> Date: Fri, 12 Sep 2025 11:22:37 +0200 Subject: [PATCH] Refactoring: move extra CHR-RAM and WRAM into one CartRAM module. --- src/boards/21_22_23_25.c | 2 +- src/boards/252_253.c | 28 +++------------------------ src/boards/384.c | 2 +- src/boards/446.c | 2 +- src/boards/447.c | 2 +- src/boards/448.c | 2 +- src/boards/468.c | 2 +- src/boards/509.c | 2 +- src/boards/510.c | 2 +- src/boards/512.c | 17 ++-------------- src/boards/514.c | 2 +- src/boards/544.c | 31 +++++++++--------------------- src/boards/545.c | 2 +- src/boards/546.c | 2 +- src/boards/548.c | 2 +- src/boards/556.c | 2 +- src/boards/557.c | 2 +- src/boards/asic_fme7.c | 1 - src/boards/asic_vrc2and4.c | 2 +- src/boards/asic_vrc6.c | 1 - src/boards/asic_vrc7.c | 3 +-- src/boards/{wram.c => cartram.c} | 33 ++++++++++++++++++++++++++++---- src/boards/{wram.h => cartram.h} | 9 ++++++--- 23 files changed, 65 insertions(+), 88 deletions(-) rename src/boards/{wram.c => cartram.c} (53%) rename src/boards/{wram.h => cartram.h} (84%) diff --git a/src/boards/21_22_23_25.c b/src/boards/21_22_23_25.c index 1f9f988..ea66dc9 100644 --- a/src/boards/21_22_23_25.c +++ b/src/boards/21_22_23_25.c @@ -20,7 +20,7 @@ #include "mapinc.h" #include "asic_vrc2and4.h" -#include "wram.h" +#include "cartram.h" static void sync () { VRC24_syncWRAM(0); diff --git a/src/boards/252_253.c b/src/boards/252_253.c index 8e70fb7..f087149 100644 --- a/src/boards/252_253.c +++ b/src/boards/252_253.c @@ -20,10 +20,8 @@ #include "mapinc.h" #include "asic_vrc2and4.h" -#include "wram.h" +#include "cartram.h" -static uint8 *CHRRAM; -static uint32 CHRRAMSize; static uint8 mask; static uint8 compare; @@ -72,36 +70,16 @@ void Mapper253_power (void) { SetWriteHandler(0x2007, 0x2007, Mapper252_253_interceptPPUWrite); } -void Mapper252_253_close(void) { - if (CHRRAM) { - FCEU_gfree(CHRRAM); - CHRRAM =NULL; - } - WRAM_close(); -} - void Mapper252_Init (CartInfo *info) { VRC4_init(info, sync, 0x4, 0x8, 1, NULL, NULL, NULL, NULL, NULL); - WRAM_init(info, 8); + CartRAM_init(info, 8, 2); info->Power =Mapper252_power; - info->Close =Mapper252_253_close; AddExState(stateRegs, ~0, 0, 0); - - CHRRAMSize =info->iNES2? (info->CHRRamSize +info->CHRRamSaveSize): 2048; - CHRRAM =(uint8*)FCEU_gmalloc(CHRRAMSize); - AddExState(CHRRAM, CHRRAMSize, 0, "CRAM"); - SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1); } void Mapper253_Init (CartInfo *info) { VRC4_init(info, sync, 0x4, 0x8, 1, NULL, NULL, NULL, NULL, NULL); - WRAM_init(info, 8); + CartRAM_init(info, 8, 2); info->Power =Mapper253_power; - info->Close =Mapper252_253_close; AddExState(stateRegs, ~0, 0, 0); - - CHRRAMSize =info->iNES2? (info->CHRRamSize +info->CHRRamSaveSize): 2048; - CHRRAM =(uint8*)FCEU_gmalloc(CHRRAMSize); - AddExState(CHRRAM, CHRRAMSize, 0, "CRAM"); - SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1); } diff --git a/src/boards/384.c b/src/boards/384.c index 410e396..07f5dd1 100644 --- a/src/boards/384.c +++ b/src/boards/384.c @@ -20,7 +20,7 @@ #include "mapinc.h" #include "asic_vrc2and4.h" -#include "wram.h" +#include "cartram.h" static uint8 reg; diff --git a/src/boards/446.c b/src/boards/446.c index 0683c35..b2ef936 100644 --- a/src/boards/446.c +++ b/src/boards/446.c @@ -33,7 +33,7 @@ #include "asic_vrc6.h" #include "asic_vrc7.h" #include "flashrom.h" -#include "wram.h" +#include "cartram.h" static uint8 submapper; static uint8 reg[8]; diff --git a/src/boards/447.c b/src/boards/447.c index 3fd1d8b..352d8d6 100644 --- a/src/boards/447.c +++ b/src/boards/447.c @@ -20,7 +20,7 @@ #include "mapinc.h" #include "asic_vrc2and4.h" -#include "wram.h" +#include "cartram.h" static uint8 reg; static uint8 dip; diff --git a/src/boards/448.c b/src/boards/448.c index ac2d799..e31396e 100644 --- a/src/boards/448.c +++ b/src/boards/448.c @@ -20,7 +20,7 @@ #include "mapinc.h" #include "asic_vrc2and4.h" -#include "wram.h" +#include "cartram.h" static uint8 reg; diff --git a/src/boards/468.c b/src/boards/468.c index eb9eb42..48958ac 100644 --- a/src/boards/468.c +++ b/src/boards/468.c @@ -29,7 +29,7 @@ #include "asic_vrc3.h" #include "asic_vrc6.h" #include "asic_vrc7.h" -#include "wram.h" +#include "cartram.h" static uint8 submapper; static uint8 reg[4]; /* Supervisor registers */ diff --git a/src/boards/509.c b/src/boards/509.c index f13e678..4e61254 100644 --- a/src/boards/509.c +++ b/src/boards/509.c @@ -22,7 +22,7 @@ #include "mapinc.h" #include "asic_mmc3.h" -#include "wram.h" +#include "cartram.h" static uint8 reg; diff --git a/src/boards/510.c b/src/boards/510.c index c0d0d70..b57eabe 100644 --- a/src/boards/510.c +++ b/src/boards/510.c @@ -22,7 +22,7 @@ #include "mapinc.h" #include "asic_mmc3.h" -#include "wram.h" +#include "cartram.h" static uint8 reg; diff --git a/src/boards/512.c b/src/boards/512.c index 0645355..9563843 100644 --- a/src/boards/512.c +++ b/src/boards/512.c @@ -22,10 +22,9 @@ #include "mapinc.h" #include "asic_mmc3.h" -#include "wram.h" +#include "cartram.h" static uint8 reg; -static uint8 *CHRRAM = NULL; static void sync () { MMC3_syncPRG(0x3F, 0x00); @@ -64,22 +63,10 @@ static void power () { SetWriteHandler(0x4020, 0x5FFF, writeReg); } -static void close () { - if (CHRRAM) { - FCEU_gfree(CHRRAM); - CHRRAM = NULL; - } -} - void Mapper512_Init (CartInfo *info) { MMC3_init(info, sync, MMC3_TYPE_AX5202P, NULL, NULL, NULL, NULL); - WRAM_init(info, 8); + CartRAM_init(info, 8, 8); info->Power = power; info->Reset = reset; - info->Close = close; AddExState(®, 1, 0, "EXPR"); - - CHRRAM = (uint8 *)FCEU_gmalloc(8192); - SetupCartCHRMapping(0x10, CHRRAM, 8192, 1); - AddExState(CHRRAM, 8192, 0, "CRAM"); } diff --git a/src/boards/514.c b/src/boards/514.c index a8b674d..292a5cd 100644 --- a/src/boards/514.c +++ b/src/boards/514.c @@ -20,7 +20,7 @@ #include "mapinc.h" #include "asic_latch.h" -#include "wram.h" +#include "cartram.h" static uint8 chr; diff --git a/src/boards/544.c b/src/boards/544.c index eb5cf0a..0918bc5 100644 --- a/src/boards/544.c +++ b/src/boards/544.c @@ -20,9 +20,8 @@ #include "mapinc.h" #include "asic_vrc2and4.h" +#include "cartram.h" -static uint8 *CHRRAM; -static uint32 CHRRAMSize; static uint8 nt[4]; static uint8 prg; static uint8 mask; @@ -48,7 +47,7 @@ static void sync () { } static const uint8 compares[8] = { 0x28, 0x00, 0x4C, 0x64, 0x46, 0x7C, 0x04, 0xFF }; -static DECLFW(Mapper544_interceptPPUWrite) { +static DECLFW (interceptPPUWrite) { if (~RefreshAddr &0x2000) { int bank =VRC24_getCHRBank(RefreshAddr >>10 &7); if (bank &0x80) { @@ -66,11 +65,11 @@ static DECLFW(Mapper544_interceptPPUWrite) { writePPU(A, V); } -int Mapper544_getPRGBank(uint8 bank) { +static int getPRGBank (uint8 bank) { return bank ==2? prg: VRC24_getPRGBank(bank); } -DECLFW(Mapper544_externalSelect) { +static DECLFW (externalSelect) { if (A &4) nt[A &3] =V; else @@ -79,7 +78,7 @@ DECLFW(Mapper544_externalSelect) { } -void Mapper544_power (void) { +void power (void) { mask =0xFC; compare =0x28; nt[0] =nt[1] =0xE0; @@ -87,24 +86,12 @@ void Mapper544_power (void) { prg =0xFE; VRC24_power(); writePPU =GetWriteHandler(0x2007); - SetWriteHandler(0x2007, 0x2007, Mapper544_interceptPPUWrite); -} - -void Mapper544_close(void) { - if (CHRRAM) { - FCEU_gfree(CHRRAM); - CHRRAM =NULL; - } + SetWriteHandler(0x2007, 0x2007, interceptPPUWrite); } void Mapper544_Init (CartInfo *info) { - VRC4_init(info, sync, 0x400, 0x800, 1, Mapper544_getPRGBank, NULL, NULL, NULL, Mapper544_externalSelect); - info->Power =Mapper544_power; - info->Close =Mapper544_close; + VRC4_init(info, sync, 0x400, 0x800, 1, getPRGBank, NULL, NULL, NULL, externalSelect); + CartRAM_init(info, 8, 2); + info->Power =power; AddExState(stateRegs, ~0, 0, 0); - - CHRRAMSize =info->CHRRamSize +info->CHRRamSaveSize; - CHRRAM =(uint8*)FCEU_gmalloc(CHRRAMSize); - AddExState(CHRRAM, CHRRAMSize, 0, "CRAM"); - SetupCartCHRMapping(0x10, CHRRAM, CHRRAMSize, 1); } diff --git a/src/boards/545.c b/src/boards/545.c index 5a339e5..bd28342 100644 --- a/src/boards/545.c +++ b/src/boards/545.c @@ -22,7 +22,7 @@ #include "mapinc.h" #include "asic_mmc3.h" -#include "wram.h" +#include "cartram.h" static uint8 reg; diff --git a/src/boards/546.c b/src/boards/546.c index df9e8ef..e388215 100644 --- a/src/boards/546.c +++ b/src/boards/546.c @@ -22,7 +22,7 @@ #include "mapinc.h" #include "asic_mmc1.h" -#include "wram.h" +#include "cartram.h" static uint8 reg; diff --git a/src/boards/548.c b/src/boards/548.c index 013dc7c..01d8e1a 100644 --- a/src/boards/548.c +++ b/src/boards/548.c @@ -21,7 +21,7 @@ */ #include "mapinc.h" -#include "wram.h" +#include "cartram.h" #include "../fds_apu.h" static uint8 reg; diff --git a/src/boards/556.c b/src/boards/556.c index c1806f5..669e804 100644 --- a/src/boards/556.c +++ b/src/boards/556.c @@ -25,7 +25,7 @@ #include "mapinc.h" #include "asic_mmc3.h" #include "asic_vrc2and4.h" -#include "wram.h" +#include "cartram.h" static uint8 reg[4]; static uint8 index; diff --git a/src/boards/557.c b/src/boards/557.c index 4f8dff5..f579467 100644 --- a/src/boards/557.c +++ b/src/boards/557.c @@ -22,7 +22,7 @@ #include "mapinc.h" #include "asic_n118.h" -#include "wram.h" +#include "cartram.h" static void sync() { setprg8r(0x10, 0x6000, 0); diff --git a/src/boards/asic_fme7.c b/src/boards/asic_fme7.c index 124ec5e..3b66263 100644 --- a/src/boards/asic_fme7.c +++ b/src/boards/asic_fme7.c @@ -20,7 +20,6 @@ #include "mapinc.h" #include "asic_FME7.h" -#include "wram.h" static void (*FME7_cbSync)(); static uint8 FME7_index; diff --git a/src/boards/asic_vrc2and4.c b/src/boards/asic_vrc2and4.c index 6dfe81d..be5b4cb 100644 --- a/src/boards/asic_vrc2and4.c +++ b/src/boards/asic_vrc2and4.c @@ -20,7 +20,7 @@ #include "mapinc.h" #include "asic_vrc2and4.h" -#include "wram.h" +#include "cartram.h" static void (*VRC24_cbSync)(); static int VRC24_A0, VRC24_A1; diff --git a/src/boards/asic_vrc6.c b/src/boards/asic_vrc6.c index 95df036..c8cc694 100644 --- a/src/boards/asic_vrc6.c +++ b/src/boards/asic_vrc6.c @@ -20,7 +20,6 @@ #include "mapinc.h" #include "asic_vrc6.h" -#include "wram.h" static void (*VRC6_cbSync)(); static int VRC6_A0, VRC6_A1; diff --git a/src/boards/asic_vrc7.c b/src/boards/asic_vrc7.c index 7c31f02..2461a21 100644 --- a/src/boards/asic_vrc7.c +++ b/src/boards/asic_vrc7.c @@ -19,8 +19,7 @@ */ #include "mapinc.h" -#include "asic_VRC7.h" -#include "wram.h" +#include "asic_vrc7.h" static void (*VRC7_cbSync)(); static int VRC7_A0; diff --git a/src/boards/wram.c b/src/boards/cartram.c similarity index 53% rename from src/boards/wram.c rename to src/boards/cartram.c index 8e3de6b..17e5a6f 100644 --- a/src/boards/wram.c +++ b/src/boards/cartram.c @@ -19,22 +19,27 @@ */ #include "mapinc.h" -#include "wram.h" +#include "cartram.h" +static uint8 *CHRRAMData = NULL; static uint8 *WRAMData = NULL; +uint32 CHRRAMSize = 0; uint32 WRAMSize = 0; -void WRAM_close (void) { +void CartRAM_close (void) { /* Need to combine this in one function to avoid the problem of having to properly cascade two separate Close() functions for WRAM and CHR-RAM each */ if (WRAMData) { FCEU_gfree(WRAMData); WRAMData =NULL; } + if (CHRRAMData) { + FCEU_gfree(CHRRAMData); + CHRRAMData =NULL; + } } -void WRAM_init (CartInfo *info, uint8 defaultWRAMSizeKiB) { +void CartRAM_init (CartInfo *info, uint8 defaultWRAMSizeKiB, uint8 defaultCHRRAMSizeKiB) { WRAMSize =info->iNES2? (info->PRGRamSize +info->PRGRamSaveSize): (defaultWRAMSizeKiB *1024); if (WRAMSize) { - info->Close =WRAM_close; WRAMData =(uint8*)FCEU_gmalloc(WRAMSize); SetupCartPRGMapping(0x10, WRAMData, WRAMSize, 1); AddExState(WRAMData, WRAMSize, 0, "WRAM"); @@ -43,4 +48,24 @@ void WRAM_init (CartInfo *info, uint8 defaultWRAMSizeKiB) { info->SaveGameLen[0] =WRAMSize; } } + CHRRAMSize =info->iNES2? (info->CHRRamSize +info->CHRRamSaveSize): (defaultCHRRAMSizeKiB *1024); + if (ROM_size == 0) CHRRAMSize = 0; /* If there is no CHR-ROM, then any CHR-RAM will not be "extra" and therefore will be handled by ines.c, not here. */ + if (CHRRAMSize) { + CHRRAMData =(uint8*)FCEU_gmalloc(CHRRAMSize); + SetupCartCHRMapping(0x10, CHRRAMData, CHRRAMSize, 1); + AddExState(CHRRAMData, CHRRAMSize, 0, "CRAM"); + if (info->battery) { + info->SaveGame[info->SaveGameLen[0]? 1: 0] =CHRRAMData; + info->SaveGameLen[info->SaveGameLen[0]? 1: 0] =CHRRAMSize; + } + } + if (WRAMSize || CHRRAMSize) info->Close =CartRAM_close; +} + +void CHRRAM_init (CartInfo *info, uint8 defaultCHRRAMSizeKiB) { + CartRAM_init(info, 0, defaultCHRRAMSizeKiB); +} + +void WRAM_init (CartInfo *info, uint8 defaultWRAMSizeKiB) { + CartRAM_init(info, defaultWRAMSizeKiB, 0); } diff --git a/src/boards/wram.h b/src/boards/cartram.h similarity index 84% rename from src/boards/wram.h rename to src/boards/cartram.h index 2544f2d..de46253 100644 --- a/src/boards/wram.h +++ b/src/boards/cartram.h @@ -18,11 +18,14 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#ifndef _WRAM_H -#define _WRAM_H +#ifndef _CARTRAM_H +#define _CARTRAM_H +extern uint32 CHRRAMSize; extern uint32 WRAMSize; +void CartRAM_init (CartInfo *, uint8, uint8); +void CHRRAM_init (CartInfo *, uint8); void WRAM_init (CartInfo *, uint8); -void WRAM_close (); +void CartRAM_close (); #endif