From c3ae39cdd935e6590b5022626f302f226ad71835 Mon Sep 17 00:00:00 2001 From: Barry Harris <44396066+barry65536@users.noreply.github.com> Date: Tue, 24 Apr 2012 19:31:53 +0000 Subject: [PATCH] Add savestate support for bootleg sound hardware, and bootlegs that use separate sprite ram --- src/burn/drv/capcom/cps.h | 5 ++++ src/burn/drv/capcom/cps_mem.cpp | 20 +++++++++++---- src/burn/drv/capcom/d_cps1.cpp | 40 ++++++++++++++++++++++++++++-- src/burn/drv/capcom/fcrash_snd.cpp | 30 ++++++++++++++++++++++ src/burn/drv/capcom/sf2mdt_snd.cpp | 30 ++++++++++++++++++++++ 5 files changed, 118 insertions(+), 7 deletions(-) diff --git a/src/burn/drv/capcom/cps.h b/src/burn/drv/capcom/cps.h index 4d0f9c06b..ceaf2265b 100644 --- a/src/burn/drv/capcom/cps.h +++ b/src/burn/drv/capcom/cps.h @@ -161,6 +161,9 @@ INT32 CpsMemInit(); INT32 CpsMemExit(); INT32 CpsAreaScan(INT32 nAction,INT32 *pnMin); +typedef INT32 (*CpsMemScanCallback)(INT32, INT32*); +extern CpsMemScanCallback CpsMemScanCallbackFunction; + // cps_run.cpp extern UINT8 CpsReset; extern UINT8 Cpi01A, Cpi01C, Cpi01E; @@ -437,6 +440,7 @@ INT32 FcrashSoundReset(); INT32 FcrashSoundExit(); void FcrashSoundFrameStart(); void FcrashSoundFrameEnd(); +INT32 FcrashScanSound(INT32 nAction, INT32 *pnMin); // sf2mdt_snd.cpp void Sf2mdtSoundCommand(UINT16 d); @@ -445,3 +449,4 @@ INT32 Sf2mdtSoundReset(); INT32 Sf2mdtSoundExit(); void Sf2mdtSoundFrameStart(); void Sf2mdtSoundFrameEnd(); +INT32 Sf2mdtScanSound(INT32 nAction, INT32 *pnMin); diff --git a/src/burn/drv/capcom/cps_mem.cpp b/src/burn/drv/capcom/cps_mem.cpp index 093a2cf5d..588e59f07 100644 --- a/src/burn/drv/capcom/cps_mem.cpp +++ b/src/burn/drv/capcom/cps_mem.cpp @@ -15,6 +15,8 @@ static UINT8 *CpsSaveFrgData = NULL; UINT8 *CpsRam660=NULL,*CpsRam708=NULL,*CpsReg=NULL,*CpsFrg=NULL; UINT8 *CpsRamFF=NULL; +CpsMemScanCallback CpsMemScanCallbackFunction = NULL; + // This routine is called first to determine how much memory is needed // and then to set up all the pointers. static INT32 CpsMemIndex() @@ -334,6 +336,8 @@ INT32 CpsMemExit() // Deallocate all used memory BurnFree(CpsMem); + + CpsMemScanCallbackFunction = NULL; return 0; } @@ -381,10 +385,12 @@ INT32 CpsAreaScan(INT32 nAction, INT32 *pnMin) ba.szName = "CpsRom"; BurnAcb(&ba); - ba.Data = CpsZRom; - ba.nLen = nCpsZRomLen; - ba.szName = "CpsZRom"; - BurnAcb(&ba); + if (nCpsZRomLen) { + ba.Data = CpsZRom; + ba.nLen = nCpsZRomLen; + ba.szName = "CpsZRom"; + BurnAcb(&ba); + } } if (Cps == 2 || Cps1Qs == 1 || PangEEP == 1) { // Scan EEPROM @@ -417,7 +423,11 @@ INT32 CpsAreaScan(INT32 nAction, INT32 *pnMin) if (Cps == 2 || Cps1Qs == 1) { // Scan QSound chips QsndScan(nAction); } else { // Scan PSound chips - PsndScan(nAction); + if (!Cps1DisablePSnd) PsndScan(nAction); + } + + if (CpsMemScanCallbackFunction) { + CpsMemScanCallbackFunction(nAction, pnMin); } return 0; diff --git a/src/burn/drv/capcom/d_cps1.cpp b/src/burn/drv/capcom/d_cps1.cpp index a77abcca1..7960b402c 100644 --- a/src/burn/drv/capcom/d_cps1.cpp +++ b/src/burn/drv/capcom/d_cps1.cpp @@ -10810,6 +10810,21 @@ static INT32 TwelveMhzInit() return DrvInit(); } +static INT32 CpsBootlegSpriteRamScanCallback(INT32 nAction, INT32*) +{ + if (nAction & ACB_MEMORY_RAM) { + struct BurnArea ba; + memset(&ba, 0, sizeof(ba)); + + ba.Data = CpsBootlegSpriteRam; + ba.nLen = 0x4000; + ba.szName = "CpsBootlegSpriteRam"; + BurnAcb(&ba); + } + + return 0; +} + static INT32 CaptcommbInit() { CpsLayer1XOffs = -8; @@ -10831,6 +10846,7 @@ static INT32 Captcommb2Init() CpsRunFrameStartCallbackFunction = Sf2mdtSoundFrameStart; CpsRunFrameEndCallbackFunction = Sf2mdtSoundFrameEnd; CpsRWSoundCommandCallbackFunction = Sf2mdtSoundCommand; + CpsMemScanCallbackFunction = Sf2mdtScanSound; return DrvInit(); } @@ -10935,6 +10951,7 @@ static INT32 CawingblInit() CpsRunFrameStartCallbackFunction = FcrashSoundFrameStart; CpsRunFrameMiddleCallbackFunction = CawingblFrameMiddle; CpsRunFrameEndCallbackFunction = FcrashSoundFrameEnd; + CpsMemScanCallbackFunction = FcrashScanSound; nRet = DrvInit(); @@ -11008,10 +11025,11 @@ static INT32 DinopicInit() Cps1GfxLoadCallbackFunction = CpsLoadTilesDinopic; Cps1ObjGetCallbackFunction = DinopicObjGet; Cps1ObjDrawCallbackFunction = FcrashObjDraw; + CpsMemScanCallbackFunction = CpsBootlegSpriteRamScanCallback; nRet = TwelveMhzInit(); - CpsBootlegSpriteRam = (UINT8*)BurnMalloc(0x2000); + CpsBootlegSpriteRam = (UINT8*)BurnMalloc(0x4000); SekOpen(0); SekMapMemory(CpsBootlegSpriteRam, 0x990000, 0x991FFF, SM_RAM); @@ -11072,10 +11090,11 @@ static INT32 DinotpicInit() Cps1GfxLoadCallbackFunction = CpsLoadTilesHack160; Cps1ObjGetCallbackFunction = DinopicObjGet; Cps1ObjDrawCallbackFunction = FcrashObjDraw; + CpsMemScanCallbackFunction = CpsBootlegSpriteRamScanCallback; nRet = TwelveMhzInit(); - CpsBootlegSpriteRam = (UINT8*)BurnMalloc(0x2000); + CpsBootlegSpriteRam = (UINT8*)BurnMalloc(0x4000); SekOpen(0); SekMapMemory(CpsBootlegSpriteRam, 0x990000, 0x991FFF, SM_RAM); @@ -11199,6 +11218,7 @@ static INT32 FcrashInit() CpsRunExitCallbackFunction = FcrashSoundExit; CpsRunFrameStartCallbackFunction = FcrashSoundFrameStart; CpsRunFrameEndCallbackFunction = FcrashSoundFrameEnd; + CpsMemScanCallbackFunction = FcrashScanSound; INT32 nRet = DrvInit(); @@ -11512,6 +11532,14 @@ void __fastcall Knightsb98WriteWord(UINT32 a, UINT16 d) } } +static INT32 KnightsbScanCallback(INT32 nAction, INT32*pnMin) +{ + CpsBootlegSpriteRamScanCallback(nAction, pnMin); + Sf2mdtScanSound(nAction, pnMin); + + return 0; +} + static INT32 KnightsbInit() { Cps1DisablePSnd = 1; @@ -11527,6 +11555,8 @@ static INT32 KnightsbInit() CpsRunFrameStartCallbackFunction = Sf2mdtSoundFrameStart; CpsRunFrameEndCallbackFunction = Sf2mdtSoundFrameEnd; CpsRWSoundCommandCallbackFunction = Sf2mdtSoundCommand; + CpsMemScanCallbackFunction = Sf2mdtScanSound; + CpsMemScanCallbackFunction = KnightsbScanCallback; INT32 nRet = DrvInit(); @@ -11742,6 +11772,7 @@ static INT32 PunipicInit() Cps1GfxLoadCallbackFunction = CpsLoadTilesDinopic; Cps1ObjGetCallbackFunction = DinopicObjGet; Cps1ObjDrawCallbackFunction = FcrashObjDraw; + CpsMemScanCallbackFunction = CpsBootlegSpriteRamScanCallback; INT32 nRet = TwelveMhzInit(); @@ -11766,6 +11797,7 @@ static INT32 Punipic2Init() Cps1GfxLoadCallbackFunction = CpsLoadTilesHack160Alt; Cps1ObjGetCallbackFunction = DinopicObjGet; Cps1ObjDrawCallbackFunction = FcrashObjDraw; + CpsMemScanCallbackFunction = CpsBootlegSpriteRamScanCallback; INT32 nRet = TwelveMhzInit(); @@ -11790,6 +11822,7 @@ static INT32 Punipic3Init() Cps1GfxLoadCallbackFunction = CpsLoadTilesHack160; Cps1ObjGetCallbackFunction = DinopicObjGet; Cps1ObjDrawCallbackFunction = FcrashObjDraw; + CpsMemScanCallbackFunction = CpsBootlegSpriteRamScanCallback; INT32 nRet = TwelveMhzInit(); @@ -12051,6 +12084,7 @@ static INT32 Sf2mdtInit() CpsRunFrameStartCallbackFunction = Sf2mdtSoundFrameStart; CpsRunFrameEndCallbackFunction = Sf2mdtSoundFrameEnd; CpsRWSoundCommandCallbackFunction = Sf2mdtSoundCommand; + CpsMemScanCallbackFunction = Sf2mdtScanSound; INT32 nRet = Sf2ceInit(); @@ -12074,6 +12108,7 @@ static INT32 Sf2mdtaInit() CpsRunFrameStartCallbackFunction = Sf2mdtSoundFrameStart; CpsRunFrameEndCallbackFunction = Sf2mdtSoundFrameEnd; CpsRWSoundCommandCallbackFunction = Sf2mdtSoundCommand; + CpsMemScanCallbackFunction = Sf2mdtScanSound; INT32 nRet = Sf2ceInit(); @@ -13151,6 +13186,7 @@ static INT32 WofbInit() Cps1GfxLoadCallbackFunction = CpsLoadTilesDinopic; Cps1ObjGetCallbackFunction = DinopicObjGet; Cps1ObjDrawCallbackFunction = FcrashObjDraw; + CpsMemScanCallbackFunction = CpsBootlegSpriteRamScanCallback; INT32 nRet = TwelveMhzInit(); diff --git a/src/burn/drv/capcom/fcrash_snd.cpp b/src/burn/drv/capcom/fcrash_snd.cpp index 76f44cf1e..d5c99b7af 100644 --- a/src/burn/drv/capcom/fcrash_snd.cpp +++ b/src/burn/drv/capcom/fcrash_snd.cpp @@ -239,3 +239,33 @@ void FcrashSoundFrameEnd() } ZetClose(); } + +INT32 FcrashScanSound(INT32 nAction, INT32 *pnMin) +{ + if (nAction & ACB_MEMORY_RAM) { + struct BurnArea ba; + memset(&ba, 0, sizeof(ba)); + + ba.Data = FcrashZ80Ram; + ba.nLen = 0x00800; + ba.szName = "FcrashZ80Ram"; + BurnAcb(&ba); + } + + if (nAction & ACB_DRIVER_DATA) { + ZetScan(nAction); + + BurnYM2203Scan(nAction, pnMin); + MSM5205Scan(nAction, pnMin); + + SCAN_VAR(FcrashZ80BankAddress); + SCAN_VAR(FcrashSoundLatch); + SCAN_VAR(FcrashSampleBuffer1); + SCAN_VAR(FcrashSampleBuffer2); + SCAN_VAR(FcrashSampleSelect1); + SCAN_VAR(FcrashSampleSelect2); + SCAN_VAR(FcrashSoundPos); + } + + return 0; +} diff --git a/src/burn/drv/capcom/sf2mdt_snd.cpp b/src/burn/drv/capcom/sf2mdt_snd.cpp index f3f82b85b..f7d22506b 100644 --- a/src/burn/drv/capcom/sf2mdt_snd.cpp +++ b/src/burn/drv/capcom/sf2mdt_snd.cpp @@ -215,3 +215,33 @@ void Sf2mdtSoundFrameEnd() } ZetClose(); } + +INT32 Sf2mdtScanSound(INT32 nAction, INT32 *pnMin) +{ + if (nAction & ACB_MEMORY_RAM) { + struct BurnArea ba; + memset(&ba, 0, sizeof(ba)); + + ba.Data = Sf2mdtZ80Ram; + ba.nLen = 0x00800; + ba.szName = "Sf2mdtZ80Ram"; + BurnAcb(&ba); + } + + if (nAction & ACB_DRIVER_DATA) { + ZetScan(nAction); + + BurnYM2151Scan(nAction); + MSM5205Scan(nAction, pnMin); + + SCAN_VAR(Sf2mdtZ80BankAddress); + SCAN_VAR(Sf2mdtSoundLatch); + SCAN_VAR(Sf2mdtSampleBuffer1); + SCAN_VAR(Sf2mdtSampleBuffer2); + SCAN_VAR(Sf2mdtSampleSelect1); + SCAN_VAR(Sf2mdtSampleSelect2); + SCAN_VAR(Sf2mdtSoundPos); + } + + return 0; +}