Initial work improving savestates in Sega System16 drivers
This commit is contained in:
parent
05f431c860
commit
dff18156aa
|
@ -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
|
||||
};
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
|
||||
====================================================*/
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue