Add savestate support for bootleg sound hardware, and bootlegs that use separate sprite ram
This commit is contained in:
parent
d96a270d27
commit
c3ae39cdd9
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue