Initial work improving savestates in Sega System16 drivers

This commit is contained in:
Barry Harris 2012-01-05 17:15:01 +00:00
parent 05f431c860
commit dff18156aa
6 changed files with 214 additions and 43 deletions

View File

@ -8472,6 +8472,7 @@ static INT32 IsgsmRleLatched;
static UINT8 IsgsmRleByte; static UINT8 IsgsmRleByte;
static UINT8 IsgsmReadXor; static UINT8 IsgsmReadXor;
static UINT32 nCartSize; static UINT32 nCartSize;
static INT32 GameRomMapped = 0;
typedef UINT32 (*isgsm_security_callback)(UINT32 input); typedef UINT32 (*isgsm_security_callback)(UINT32 input);
isgsm_security_callback IsgsmSecurityCallback; isgsm_security_callback IsgsmSecurityCallback;
@ -8833,6 +8834,7 @@ void __fastcall IsgsmWriteByte(UINT32 a, UINT8 d)
case 0xfe000b: { case 0xfe000b: {
SekMapMemory(System16Rom + 0x300000, 0x000000, 0x0fffff, SM_ROM); SekMapMemory(System16Rom + 0x300000, 0x000000, 0x0fffff, SM_ROM);
GameRomMapped = 1;
return; return;
} }
} }
@ -8911,7 +8913,7 @@ void __fastcall IsgsmWriteWord(UINT32 a, UINT16 d)
#endif #endif
} }
void IsgsmMap68K() static void IsgsmMap68K()
{ {
SekInit(0, 0x68000); SekInit(0, 0x68000);
SekOpen(0); SekOpen(0);
@ -9043,17 +9045,81 @@ static INT32 IsgsmExit()
IsgsmReadXor = 0; IsgsmReadXor = 0;
nCartSize = 0; nCartSize = 0;
IsgsmSecurityCallback = NULL; IsgsmSecurityCallback = NULL;
GameRomMapped = 0;
return nRet; return nRet;
} }
static INT32 IsgsmScan(INT32 nAction,INT32 *pnMin)
{
if (pnMin != NULL) {
*pnMin = 0x029719;
}
struct BurnArea ba;
if (nAction & ACB_DRIVER_DATA) {
memset(&ba, 0, sizeof(ba));
ba.Data = System16Sprites;
ba.nLen = 0x1fffff;
ba.nAddress = 0;
ba.szName = "SpriteROM";
BurnAcb(&ba);
memset(&ba, 0, sizeof(ba));
ba.Data = System16TempGfx;
ba.nLen = 0x5ffff;
ba.nAddress = 0;
ba.szName = "TileROM";
BurnAcb(&ba);
memset(&ba, 0, sizeof(ba));
ba.Data = System16Z80Rom;
ba.nLen = 0x3ffff;
ba.nAddress = 0;
ba.szName = "Z80ROM";
BurnAcb(&ba);
memset(&ba, 0, sizeof(ba));
ba.Data = System16Rom + 0x300000;
ba.nLen = 0xfffff;
ba.nAddress = 0;
ba.szName = "GameROM";
BurnAcb(&ba);
SCAN_VAR(IsgsmCartAddrLatch);
SCAN_VAR(IsgsmCartAddr);
SCAN_VAR(IsgsmType);
SCAN_VAR(IsgsmAddr);
SCAN_VAR(IsgsmMode);
SCAN_VAR(IsgsmAddrLatch);
SCAN_VAR(IsgsmSecurity);
SCAN_VAR(IsgsmSecurityLatch);
SCAN_VAR(IsgsmRleControlPosition);
SCAN_VAR(IsgsmRleControlByte);
SCAN_VAR(IsgsmRleLatched);
SCAN_VAR(IsgsmRleByte);
SCAN_VAR(GameRomMapped);
if (nAction & ACB_WRITE) {
if (GameRomMapped) {
SekOpen(0);
SekMapMemory(System16Rom + 0x300000, 0x000000, 0x0fffff, SM_ROM);
SekClose();
}
}
}
return System16Scan(nAction, pnMin);
}
struct BurnDriver BurnDrvIsgsm = { struct BurnDriver BurnDrvIsgsm = {
"isgsm", NULL, NULL, NULL, "2006", "isgsm", NULL, NULL, NULL, "2006",
"ISG Selection Master Type 2006 System BIOS\0", "BIOS only", "ISG", "ISG Selection Master Type 2006", "ISG Selection Master Type 2006 System BIOS\0", "BIOS only", "ISG", "ISG Selection Master Type 2006",
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
BDF_GAME_WORKING | BDF_BOARDROM, 0, HARDWARE_SEGA_SYSTEM16B | HARDWARE_SEGA_ISGSM | HARDWARE_SEGA_5521, GBF_BIOS, 0, BDF_GAME_WORKING | BDF_BOARDROM, 0, HARDWARE_SEGA_SYSTEM16B | HARDWARE_SEGA_ISGSM | HARDWARE_SEGA_5521, GBF_BIOS, 0,
NULL, IsgsmRomInfo, IsgsmRomName, NULL, NULL, System16bDip3InputInfo, NULL, NULL, IsgsmRomInfo, IsgsmRomName, NULL, NULL, System16bDip3InputInfo, NULL,
IsgsmInit, IsgsmExit, System16BFrame, NULL, System16Scan, IsgsmInit, IsgsmExit, System16BFrame, NULL, IsgsmScan,
NULL, 0x1800, 320, 224, 4, 3 NULL, 0x1800, 320, 224, 4, 3
}; };
@ -9063,7 +9129,7 @@ struct BurnDriver BurnDrvShinfz = {
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
BDF_GAME_WORKING, 2, HARDWARE_SEGA_SYSTEM16B | HARDWARE_SEGA_ISGSM | HARDWARE_SEGA_5521, GBF_SCRFIGHT, 0, BDF_GAME_WORKING, 2, HARDWARE_SEGA_SYSTEM16B | HARDWARE_SEGA_ISGSM | HARDWARE_SEGA_5521, GBF_SCRFIGHT, 0,
NULL, ShinfzRomInfo, ShinfzRomName, NULL, NULL, System16bDip3InputInfo, ShinfzDIPInfo, NULL, ShinfzRomInfo, ShinfzRomName, NULL, NULL, System16bDip3InputInfo, ShinfzDIPInfo,
ShinfzInit, IsgsmExit, System16BFrame, NULL, System16Scan, ShinfzInit, IsgsmExit, System16BFrame, NULL, IsgsmScan,
NULL, 0x1800, 320, 224, 4, 3 NULL, 0x1800, 320, 224, 4, 3
}; };
@ -9073,6 +9139,6 @@ struct BurnDriver BurnDrvTetrbx = {
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
BDF_GAME_WORKING, 2, HARDWARE_SEGA_SYSTEM16B | HARDWARE_SEGA_ISGSM | HARDWARE_SEGA_5521, GBF_SCRFIGHT, 0, BDF_GAME_WORKING, 2, HARDWARE_SEGA_SYSTEM16B | HARDWARE_SEGA_ISGSM | HARDWARE_SEGA_5521, GBF_SCRFIGHT, 0,
NULL, TetrbxRomInfo, TetrbxRomName, NULL, NULL, System16bDip3InputInfo, TetrbxDIPInfo, NULL, TetrbxRomInfo, TetrbxRomName, NULL, NULL, System16bDip3InputInfo, TetrbxDIPInfo,
TetrbxInit, IsgsmExit, System16BFrame, NULL, System16Scan, TetrbxInit, IsgsmExit, System16BFrame, NULL, IsgsmScan,
NULL, 0x1800, 320, 224, 4, 3 NULL, 0x1800, 320, 224, 4, 3
}; };

View File

@ -385,11 +385,22 @@ void GenesisVDPExit()
void GenesisVDPScan() void GenesisVDPScan()
{ {
SCAN_VAR(VdpVRAM); struct BurnArea ba;
SCAN_VAR(VdpVSRAM);
SCAN_VAR(GenesisVdpRegs); memset(&ba, 0, sizeof(ba));
SCAN_VAR(GenesisBgPalLookup); ba.Data = VdpVRAM;
SCAN_VAR(GenesisSpPalLookup); ba.nLen = VRAM_SIZE;
ba.szName = "GenVDP VRAM";
BurnAcb(&ba);
memset(&ba, 0, sizeof(ba));
ba.Data = VdpVSRAM;
ba.nLen = VSRAM_SIZE;
ba.szName = "GenVDP VSRAM";
BurnAcb(&ba);
ScanVar(GenesisVdpRegs, 32, "GenVDP Regs");
SCAN_VAR(VdpBgColour); SCAN_VAR(VdpBgColour);
SCAN_VAR(VdpScrollABase); SCAN_VAR(VdpScrollABase);
SCAN_VAR(VdpScrollBBase); SCAN_VAR(VdpScrollBBase);

View File

@ -254,6 +254,7 @@ extern bool bSystem16BootlegRender;
extern UINT16 *pTempDraw; extern UINT16 *pTempDraw;
void System16GfxScan(INT32 nAction);
void System16Decode8x8Tiles(UINT8 *pTile, INT32 Num, INT32 offs1, INT32 offs2, INT32 offs3); void System16Decode8x8Tiles(UINT8 *pTile, INT32 Num, INT32 offs1, INT32 offs2, INT32 offs3);
void OutrunDecodeRoad(); void OutrunDecodeRoad();
void HangonDecodeRoad(); void HangonDecodeRoad();
@ -283,5 +284,6 @@ void FD1089Decrypt();
void fd1094_driver_init(INT32 nCPU); void fd1094_driver_init(INT32 nCPU);
void fd1094_machine_init(); void fd1094_machine_init();
void fd1094_exit(); void fd1094_exit();
void fd1094_scan(INT32 nAction);
// genesis_vid.cpp // genesis_vid.cpp

View File

@ -12,6 +12,9 @@ static UINT16* fd1094_cacheregion[S16_NUMCACHE]; // a cache region where S16_NUM
static INT32 fd1094_cached_states[S16_NUMCACHE]; // array of cached state numbers static INT32 fd1094_cached_states[S16_NUMCACHE]; // array of cached state numbers
static INT32 fd1094_current_cacheposition; // current position in cache array static INT32 fd1094_current_cacheposition; // current position in cache array
static INT32 fd1094_state;
static INT32 fd1094_selected_state;
static INT32 nFD1094CPU = 0; static INT32 nFD1094CPU = 0;
bool System18Banking; bool System18Banking;
@ -32,6 +35,15 @@ static void fd1094_setstate_and_decrypt(INT32 state)
INT32 i; INT32 i;
UINT32 addr; UINT32 addr;
switch (state & 0x300) {
case 0x000:
case FD1094_STATE_RESET:
fd1094_selected_state = state & 0xff;
break;
}
fd1094_state = state;
// force a flush of the prefetch cache // force a flush of the prefetch cache
m68k_set_reg(M68K_REG_PREF_ADDR, 0x1000); m68k_set_reg(M68K_REG_PREF_ADDR, 0x1000);
@ -201,6 +213,7 @@ void fd1094_driver_init(INT32 nCPU)
for (i=0;i<S16_NUMCACHE;i++) fd1094_cached_states[i] = -1; for (i=0;i<S16_NUMCACHE;i++) fd1094_cached_states[i] = -1;
fd1094_current_cacheposition = 0; fd1094_current_cacheposition = 0;
fd1094_state = -1;
if (System16RomSize > 0x0fffff) System18Banking = true; if (System16RomSize > 0x0fffff) System18Banking = true;
} }
@ -216,3 +229,23 @@ void fd1094_exit()
fd1094_current_cacheposition = 0; fd1094_current_cacheposition = 0;
} }
void fd1094_scan(INT32 nAction)
{
if (nAction & ACB_DRIVER_DATA) {
SCAN_VAR(fd1094_selected_state);
SCAN_VAR(fd1094_state);
if (nAction & ACB_WRITE) {
if (fd1094_state != -1) {
INT32 selected_state = fd1094_selected_state;
INT32 state = fd1094_state;
fd1094_machine_init();
fd1094_setstate_and_decrypt(selected_state);
fd1094_setstate_and_decrypt(state);
}
}
}
}

View File

@ -47,6 +47,31 @@ static UINT16 *pSys16BgAltTileMapPri1 = NULL;
static UINT16 *pSys16FgAltTileMapPri0 = NULL; static UINT16 *pSys16FgAltTileMapPri0 = NULL;
static UINT16 *pSys16FgAltTileMapPri1 = NULL; static UINT16 *pSys16FgAltTileMapPri1 = NULL;
/*====================================================
Scan Function
====================================================*/
void System16GfxScan(INT32 nAction)
{
if (nAction & ACB_DRIVER_DATA) {
if (nAction & ACB_WRITE) {
if (((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SEGA_SYSTEM16A) || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SEGA_HANGON)) {
System16RecalcBgTileMap = 1;
System16RecalcFgTileMap = 1;
}
if (((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SEGA_SYSTEM16B) || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SEGA_SYSTEM18) || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SEGA_OUTRUN) || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SEGA_SYSTEMX)) {
System16RecalcFgAltTileMap = 1;
System16RecalcBgAltTileMap = 1;
System16RecalcBgTileMap = 1;
System16RecalcBgAltTileMap = 1;
System16RecalcFgTileMap = 1;
System16RecalcFgAltTileMap = 1;
}
}
}
}
/*==================================================== /*====================================================
Decode Functions Decode Functions
====================================================*/ ====================================================*/

View File

@ -140,6 +140,7 @@ static bool bUseAsm68KCoreOldValue = false;
static UINT8 N7751Command; static UINT8 N7751Command;
static UINT32 N7751RomAddress; static UINT32 N7751RomAddress;
static UINT32 UPD7759BankAddress; static UINT32 UPD7759BankAddress;
static UINT32 RF5C68PCMBankAddress;
Sim8751 Simulate8751; Sim8751 Simulate8751;
System16Map68K System16Map68KDo; System16Map68K System16Map68KDo;
@ -684,9 +685,9 @@ void __fastcall System18Z80PortWrite(UINT16 a, UINT8 d)
} }
case 0xa0: { case 0xa0: {
UINT32 BankAddress = d * 0x2000; UINT32 RF5C68PCMBankAddress = d * 0x2000;
ZetMapArea(0xa000, 0xbfff, 0, System16Z80Rom + 0x10000 + BankAddress); ZetMapArea(0xa000, 0xbfff, 0, System16Z80Rom + 0x10000 + RF5C68PCMBankAddress);
ZetMapArea(0xa000, 0xbfff, 2, System16Z80Rom + 0x10000 + BankAddress); ZetMapArea(0xa000, 0xbfff, 2, System16Z80Rom + 0x10000 + RF5C68PCMBankAddress);
return; return;
} }
} }
@ -3209,8 +3210,8 @@ INT32 System16Scan(INT32 nAction,INT32 *pnMin)
{ {
struct BurnArea ba; struct BurnArea ba;
if (pnMin != NULL) { // Return minimum compatible version if (pnMin != NULL) {
*pnMin = 0x029660; *pnMin = 0x029719;
} }
if (nAction & ACB_NVRAM) { if (nAction & ACB_NVRAM) {
@ -3241,7 +3242,7 @@ INT32 System16Scan(INT32 nAction,INT32 *pnMin)
} }
} }
if (nAction & ACB_MEMORY_RAM) { // Scan all memory, devices & variables if (nAction & ACB_MEMORY_RAM) {
memset(&ba, 0, sizeof(ba)); memset(&ba, 0, sizeof(ba));
ba.Data = RamStart; ba.Data = RamStart;
ba.nLen = RamEnd-RamStart; ba.nLen = RamEnd-RamStart;
@ -3250,36 +3251,21 @@ INT32 System16Scan(INT32 nAction,INT32 *pnMin)
} }
if (nAction & ACB_DRIVER_DATA) { if (nAction & ACB_DRIVER_DATA) {
SekScan(nAction); // Scan 68000 SekScan(nAction);
ZetScan(nAction); // Scan Z80 if (System16Z80RomNum || (BurnDrvGetHardwareCode() & HARDWARE_SEGA_ISGSM)) {
ZetScan(nAction);
}
if ((BurnDrvGetHardwareCode() & HARDWARE_SEGA_FD1094_ENC) || (BurnDrvGetHardwareCode() & HARDWARE_SEGA_FD1094_ENC_CPU2)) {
fd1094_scan(nAction);
}
if (((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SEGA_SYSTEM16A) || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SEGA_HANGON) || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SEGA_OUTRUN)) {
ppi8255_scan(); ppi8255_scan();
BurnGunScan();
if ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SEGA_SYSTEM18) {
BurnYM3438Scan(nAction, pnMin);
} else {
if (BurnDrvGetHardwareCode() & HARDWARE_SEGA_YM2203) {
BurnYM2203Scan(nAction, pnMin);
} else {
BurnYM2151Scan(nAction);
}
} }
if (System16UPD7759DataSize) { if (nBurnGunNumPlayers) BurnGunScan();
UPD7759Scan(0,nAction, pnMin);
}
if (System167751ProgSize) {
N7751Scan(nAction, pnMin);
DACScan(nAction, pnMin);
}
if (System16PCMData) {
SegaPCMScan(nAction, pnMin);
}
// Scan critical driver variables
SCAN_VAR(System16SoundLatch); SCAN_VAR(System16SoundLatch);
SCAN_VAR(System16Input); SCAN_VAR(System16Input);
SCAN_VAR(System16Dip); SCAN_VAR(System16Dip);
@ -3305,6 +3291,54 @@ INT32 System16Scan(INT32 nAction,INT32 *pnMin)
SCAN_VAR(N7751Command); SCAN_VAR(N7751Command);
SCAN_VAR(N7751RomAddress); SCAN_VAR(N7751RomAddress);
SCAN_VAR(UPD7759BankAddress); SCAN_VAR(UPD7759BankAddress);
SCAN_VAR(System18VdpMixing);
SCAN_VAR(System18VdpEnable);
SCAN_VAR(RF5C68PCMBankAddress);
SCAN_VAR(System16Z80Enable);
if ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SEGA_SYSTEM18) {
BurnYM3438Scan(nAction, pnMin);
RF5C68PCMScan(nAction);
if (nAction & ACB_WRITE) {
ZetOpen(0);
ZetMapArea(0xa000, 0xbfff, 0, System16Z80Rom + 0x10000 + RF5C68PCMBankAddress);
ZetMapArea(0xa000, 0xbfff, 2, System16Z80Rom + 0x10000 + RF5C68PCMBankAddress);
ZetClose();
}
} else {
if (BurnDrvGetHardwareCode() & HARDWARE_SEGA_YM2203) {
BurnYM2203Scan(nAction, pnMin);
} else {
if (BurnDrvGetHardwareCode() & HARDWARE_SEGA_YM2413) {
BurnYM2413Scan(nAction);
} else {
BurnYM2151Scan(nAction);
}
}
}
if (System16UPD7759DataSize) {
UPD7759Scan(0,nAction, pnMin);
if (nAction & ACB_WRITE) {
ZetOpen(0);
ZetMapArea(0x8000, 0xdfff, 0, System16UPD7759Data + UPD7759BankAddress);
ZetMapArea(0x8000, 0xdfff, 2, System16UPD7759Data + UPD7759BankAddress);
ZetClose();
}
}
if (System167751ProgSize) {
N7751Scan(nAction, pnMin);
DACScan(nAction, pnMin);
}
if (System16PCMDataSize) {
SegaPCMScan(nAction, pnMin);
}
System16GfxScan(nAction);
} }
return 0; return 0;