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 IsgsmReadXor;
static UINT32 nCartSize;
static INT32 GameRomMapped = 0;
typedef UINT32 (*isgsm_security_callback)(UINT32 input);
isgsm_security_callback IsgsmSecurityCallback;
@ -8833,6 +8834,7 @@ void __fastcall IsgsmWriteByte(UINT32 a, UINT8 d)
case 0xfe000b: {
SekMapMemory(System16Rom + 0x300000, 0x000000, 0x0fffff, SM_ROM);
GameRomMapped = 1;
return;
}
}
@ -8911,7 +8913,7 @@ void __fastcall IsgsmWriteWord(UINT32 a, UINT16 d)
#endif
}
void IsgsmMap68K()
static void IsgsmMap68K()
{
SekInit(0, 0x68000);
SekOpen(0);
@ -9043,17 +9045,81 @@ static INT32 IsgsmExit()
IsgsmReadXor = 0;
nCartSize = 0;
IsgsmSecurityCallback = NULL;
GameRomMapped = 0;
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 = {
"isgsm", NULL, NULL, NULL, "2006",
"ISG Selection Master Type 2006 System BIOS\0", "BIOS only", "ISG", "ISG Selection Master Type 2006",
NULL, NULL, NULL, NULL,
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,
IsgsmInit, IsgsmExit, System16BFrame, NULL, System16Scan,
IsgsmInit, IsgsmExit, System16BFrame, NULL, IsgsmScan,
NULL, 0x1800, 320, 224, 4, 3
};
@ -9063,7 +9129,7 @@ struct BurnDriver BurnDrvShinfz = {
NULL, NULL, NULL, NULL,
BDF_GAME_WORKING, 2, HARDWARE_SEGA_SYSTEM16B | HARDWARE_SEGA_ISGSM | HARDWARE_SEGA_5521, GBF_SCRFIGHT, 0,
NULL, ShinfzRomInfo, ShinfzRomName, NULL, NULL, System16bDip3InputInfo, ShinfzDIPInfo,
ShinfzInit, IsgsmExit, System16BFrame, NULL, System16Scan,
ShinfzInit, IsgsmExit, System16BFrame, NULL, IsgsmScan,
NULL, 0x1800, 320, 224, 4, 3
};
@ -9073,6 +9139,6 @@ struct BurnDriver BurnDrvTetrbx = {
NULL, NULL, NULL, NULL,
BDF_GAME_WORKING, 2, HARDWARE_SEGA_SYSTEM16B | HARDWARE_SEGA_ISGSM | HARDWARE_SEGA_5521, GBF_SCRFIGHT, 0,
NULL, TetrbxRomInfo, TetrbxRomName, NULL, NULL, System16bDip3InputInfo, TetrbxDIPInfo,
TetrbxInit, IsgsmExit, System16BFrame, NULL, System16Scan,
TetrbxInit, IsgsmExit, System16BFrame, NULL, IsgsmScan,
NULL, 0x1800, 320, 224, 4, 3
};

View File

@ -385,11 +385,22 @@ void GenesisVDPExit()
void GenesisVDPScan()
{
SCAN_VAR(VdpVRAM);
SCAN_VAR(VdpVSRAM);
SCAN_VAR(GenesisVdpRegs);
SCAN_VAR(GenesisBgPalLookup);
SCAN_VAR(GenesisSpPalLookup);
struct BurnArea ba;
memset(&ba, 0, sizeof(ba));
ba.Data = VdpVRAM;
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(VdpScrollABase);
SCAN_VAR(VdpScrollBBase);

View File

@ -254,6 +254,7 @@ extern bool bSystem16BootlegRender;
extern UINT16 *pTempDraw;
void System16GfxScan(INT32 nAction);
void System16Decode8x8Tiles(UINT8 *pTile, INT32 Num, INT32 offs1, INT32 offs2, INT32 offs3);
void OutrunDecodeRoad();
void HangonDecodeRoad();
@ -283,5 +284,6 @@ void FD1089Decrypt();
void fd1094_driver_init(INT32 nCPU);
void fd1094_machine_init();
void fd1094_exit();
void fd1094_scan(INT32 nAction);
// 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_current_cacheposition; // current position in cache array
static INT32 fd1094_state;
static INT32 fd1094_selected_state;
static INT32 nFD1094CPU = 0;
bool System18Banking;
@ -31,6 +34,15 @@ static void fd1094_setstate_and_decrypt(INT32 state)
{
INT32 i;
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
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;
fd1094_current_cacheposition = 0;
fd1094_state = -1;
if (System16RomSize > 0x0fffff) System18Banking = true;
}
@ -216,3 +229,23 @@ void fd1094_exit()
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 *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
====================================================*/

View File

@ -140,6 +140,7 @@ static bool bUseAsm68KCoreOldValue = false;
static UINT8 N7751Command;
static UINT32 N7751RomAddress;
static UINT32 UPD7759BankAddress;
static UINT32 RF5C68PCMBankAddress;
Sim8751 Simulate8751;
System16Map68K System16Map68KDo;
@ -684,9 +685,9 @@ void __fastcall System18Z80PortWrite(UINT16 a, UINT8 d)
}
case 0xa0: {
UINT32 BankAddress = d * 0x2000;
ZetMapArea(0xa000, 0xbfff, 0, System16Z80Rom + 0x10000 + BankAddress);
ZetMapArea(0xa000, 0xbfff, 2, System16Z80Rom + 0x10000 + BankAddress);
UINT32 RF5C68PCMBankAddress = d * 0x2000;
ZetMapArea(0xa000, 0xbfff, 0, System16Z80Rom + 0x10000 + RF5C68PCMBankAddress);
ZetMapArea(0xa000, 0xbfff, 2, System16Z80Rom + 0x10000 + RF5C68PCMBankAddress);
return;
}
}
@ -3209,8 +3210,8 @@ INT32 System16Scan(INT32 nAction,INT32 *pnMin)
{
struct BurnArea ba;
if (pnMin != NULL) { // Return minimum compatible version
*pnMin = 0x029660;
if (pnMin != NULL) {
*pnMin = 0x029719;
}
if (nAction & ACB_NVRAM) {
@ -3240,46 +3241,31 @@ INT32 System16Scan(INT32 nAction,INT32 *pnMin)
BurnAcb(&ba);
}
}
if (nAction & ACB_MEMORY_RAM) { // Scan all memory, devices & variables
if (nAction & ACB_MEMORY_RAM) {
memset(&ba, 0, sizeof(ba));
ba.Data = RamStart;
ba.Data = RamStart;
ba.nLen = RamEnd-RamStart;
ba.szName = "All Ram";
BurnAcb(&ba);
}
if (nAction & ACB_DRIVER_DATA) {
SekScan(nAction); // Scan 68000
ZetScan(nAction); // Scan Z80
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);
}
SekScan(nAction);
if (System16Z80RomNum || (BurnDrvGetHardwareCode() & HARDWARE_SEGA_ISGSM)) {
ZetScan(nAction);
}
if (System16UPD7759DataSize) {
UPD7759Scan(0,nAction, pnMin);
}
if (System167751ProgSize) {
N7751Scan(nAction, pnMin);
DACScan(nAction, pnMin);
}
if (System16PCMData) {
SegaPCMScan(nAction, pnMin);
if ((BurnDrvGetHardwareCode() & HARDWARE_SEGA_FD1094_ENC) || (BurnDrvGetHardwareCode() & HARDWARE_SEGA_FD1094_ENC_CPU2)) {
fd1094_scan(nAction);
}
// Scan critical driver variables
if (((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SEGA_SYSTEM16A) || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SEGA_HANGON) || ((BurnDrvGetHardwareCode() & HARDWARE_PUBLIC_MASK) == HARDWARE_SEGA_OUTRUN)) {
ppi8255_scan();
}
if (nBurnGunNumPlayers) BurnGunScan();
SCAN_VAR(System16SoundLatch);
SCAN_VAR(System16Input);
SCAN_VAR(System16Dip);
@ -3305,6 +3291,54 @@ INT32 System16Scan(INT32 nAction,INT32 *pnMin)
SCAN_VAR(N7751Command);
SCAN_VAR(N7751RomAddress);
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;