Add savestate support for bootleg sound hardware, and bootlegs that use separate sprite ram

This commit is contained in:
Barry Harris 2012-04-24 19:31:53 +00:00
parent d96a270d27
commit c3ae39cdd9
5 changed files with 118 additions and 7 deletions

View File

@ -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);

View File

@ -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;

View File

@ -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();

View File

@ -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;
}

View File

@ -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;
}