mirror of https://github.com/PCSX2/pcsx2.git
Savestates: Add missing things from Savestates (#4917)
Savestates: Add missing variables from Savestates
This commit is contained in:
parent
c3e5b4225b
commit
24e73b3134
|
@ -131,9 +131,15 @@ static __fi void cpuRcntSet()
|
|||
{
|
||||
int i;
|
||||
|
||||
// Default to next VBlank
|
||||
nextsCounter = cpuRegs.cycle;
|
||||
nextCounter = vsyncCounter.CycleT - (cpuRegs.cycle - vsyncCounter.sCycle);
|
||||
|
||||
// Also check next HSync
|
||||
s32 nextHsync = hsyncCounter.CycleT - (cpuRegs.cycle - hsyncCounter.sCycle);
|
||||
if (nextHsync < nextCounter)
|
||||
nextCounter = nextHsync;
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
_rcntSet( i );
|
||||
|
||||
|
@ -1044,13 +1050,8 @@ void SaveStateBase::rcntFreeze()
|
|||
Freeze( vSyncInfo );
|
||||
Freeze( gsVideoMode );
|
||||
Freeze( gsIsInterlaced );
|
||||
Freeze( gates );
|
||||
|
||||
if( IsLoading() )
|
||||
{
|
||||
// make sure the gate flags are set based on the counter modes...
|
||||
for( int i=0; i<4; i++ )
|
||||
_rcntSetGate( i );
|
||||
|
||||
iopEventAction = 1; // probably not needed but won't hurt anything either.
|
||||
}
|
||||
cpuRcntSet();
|
||||
}
|
||||
|
|
|
@ -852,9 +852,6 @@ void SaveStateBase::gifDmaFreeze()
|
|||
{
|
||||
// Note: mfifocycles is not a persistent var, so no need to save it here.
|
||||
FreezeTag("GIFdma");
|
||||
Freeze(gif.gifstate);
|
||||
Freeze(gif.gifqwc);
|
||||
Freeze(gif.gspath3done);
|
||||
Freeze(gif.gscycles);
|
||||
Freeze(gif);
|
||||
Freeze(gif_fifo);
|
||||
}
|
||||
|
|
|
@ -881,7 +881,9 @@ void SaveStateBase::psxRcntFreeze()
|
|||
Freeze(psxCounters);
|
||||
Freeze(psxNextCounter);
|
||||
Freeze(psxNextsCounter);
|
||||
Freeze(psxvblankgate);
|
||||
Freeze(psxhblankgate);
|
||||
|
||||
if (IsLoading())
|
||||
psxRcntSetGates();
|
||||
psxRcntUpdate();
|
||||
}
|
||||
|
|
|
@ -32,6 +32,8 @@ enum MTVU_EVENT
|
|||
MTVU_VU_EXECUTE, // Execute VU program
|
||||
MTVU_VU_WRITE_MICRO, // Write to VU micro-mem
|
||||
MTVU_VU_WRITE_DATA, // Write to VU data-mem
|
||||
MTVU_VU_WRITE_VIREGS,// Write to VU registers
|
||||
MTVU_VU_WRITE_VFREGS,// Write to VU registers
|
||||
MTVU_VIF_WRITE_COL, // Write to Vif col reg
|
||||
MTVU_VIF_WRITE_ROW, // Write to Vif row reg
|
||||
MTVU_VIF_UNPACK, // Execute Vif Unpack
|
||||
|
@ -62,6 +64,8 @@ void SaveStateBase::mtvuFreeze()
|
|||
vu1Thread.WriteRow(vif1);
|
||||
vu1Thread.WriteMicroMem(0, VU1.Micro, 0x4000);
|
||||
vu1Thread.WriteDataMem(0, VU1.Mem, 0x4000);
|
||||
vu1Thread.WriteVIRegs(&VU1.VI[0]);
|
||||
vu1Thread.WriteVFRegs(&VU1.VF[0]);
|
||||
}
|
||||
for (size_t i = 0; i < 4; ++i)
|
||||
{
|
||||
|
@ -168,6 +172,12 @@ void VU_Thread::ExecuteRingBuffer()
|
|||
Read(&vuRegs.Mem[vu_data_addr], size);
|
||||
break;
|
||||
}
|
||||
case MTVU_VU_WRITE_VIREGS:
|
||||
Read(&vuRegs.VI, size_u32(32));
|
||||
break;
|
||||
case MTVU_VU_WRITE_VFREGS:
|
||||
Read(&vuRegs.VF, size_u32(4*32));
|
||||
break;
|
||||
case MTVU_VIF_WRITE_COL:
|
||||
Read(&vif.MaskCol, sizeof(vif.MaskCol));
|
||||
break;
|
||||
|
@ -491,6 +501,26 @@ void VU_Thread::WriteDataMem(u32 vu_data_addr, void* data, u32 size)
|
|||
KickStart();
|
||||
}
|
||||
|
||||
void VU_Thread::WriteVIRegs(REG_VI* viRegs)
|
||||
{
|
||||
MTVU_LOG("MTVU - WriteRegs!");
|
||||
ReserveSpace(1 + size_u32(32));
|
||||
Write(MTVU_VU_WRITE_VIREGS);
|
||||
Write(viRegs, size_u32(32));
|
||||
CommitWritePos();
|
||||
KickStart();
|
||||
}
|
||||
|
||||
void VU_Thread::WriteVFRegs(VECTOR* vfRegs)
|
||||
{
|
||||
MTVU_LOG("MTVU - WriteRegs!");
|
||||
ReserveSpace(1 + size_u32(32*4));
|
||||
Write(MTVU_VU_WRITE_VFREGS);
|
||||
Write(vfRegs, size_u32(32*4));
|
||||
CommitWritePos();
|
||||
KickStart();
|
||||
}
|
||||
|
||||
void VU_Thread::WriteCol(vifStruct& _vif)
|
||||
{
|
||||
MTVU_LOG("MTVU - WriteCol!");
|
||||
|
|
|
@ -86,6 +86,10 @@ public:
|
|||
// Writes to VU's Data Memory (size in bytes)
|
||||
void WriteDataMem(u32 vu_data_addr, void* data, u32 size);
|
||||
|
||||
void WriteVIRegs(REG_VI* viRegs);
|
||||
|
||||
void WriteVFRegs(VECTOR* vfRegs);
|
||||
|
||||
void WriteCol(vifStruct& _vif);
|
||||
|
||||
void WriteRow(vifStruct& _vif);
|
||||
|
|
|
@ -212,7 +212,6 @@ __ri void iopEventTest()
|
|||
g_iopNextEventCycle = psxNextsCounter+psxNextCounter;
|
||||
}
|
||||
|
||||
|
||||
if (psxRegs.interrupt)
|
||||
{
|
||||
iopEventTestIsActive = true;
|
||||
|
|
|
@ -22,8 +22,6 @@
|
|||
|
||||
static bool spr0finished = false;
|
||||
static bool spr1finished = false;
|
||||
static bool spr0lastqwc = false;
|
||||
static bool spr1lastqwc = false;
|
||||
static u32 mfifotransferred = 0;
|
||||
|
||||
static void TestClearVUs(u32 madr, u32 qwc, bool isWrite)
|
||||
|
@ -342,8 +340,6 @@ void SPRFROMinterrupt()
|
|||
return;
|
||||
}
|
||||
|
||||
|
||||
spr0lastqwc = false;
|
||||
spr0ch.chcr.STR = false;
|
||||
hwDmacIrq(DMAC_FROM_SPR);
|
||||
DMA_LOG("SPR0 DMA End");
|
||||
|
@ -539,7 +535,6 @@ void SPRTOinterrupt()
|
|||
|
||||
DMA_LOG("SPR1 DMA End");
|
||||
spr1ch.chcr.STR = false;
|
||||
spr1lastqwc = false;
|
||||
hwDmacIrq(DMAC_TO_SPR);
|
||||
}
|
||||
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
|
||||
#include "common/pxStreams.h"
|
||||
#include "common/SafeArray.inl"
|
||||
#include "common/StringUtil.h"
|
||||
#include "SPU2/spu2.h"
|
||||
#include "USB/USB.h"
|
||||
#ifdef _WIN32
|
||||
|
@ -214,16 +215,29 @@ SaveStateBase& SaveStateBase::FreezeInternals()
|
|||
Freeze(AllowParams2);
|
||||
Freeze(g_GameStarted);
|
||||
Freeze(g_GameLoading);
|
||||
Freeze(ElfCRC);
|
||||
|
||||
char localDiscSerial[256];
|
||||
StringUtil::Strlcpy(localDiscSerial, DiscSerial.ToUTF8(), sizeof(localDiscSerial));
|
||||
Freeze(localDiscSerial);
|
||||
if (IsLoading())
|
||||
DiscSerial = wxString::FromUTF8(localDiscSerial);
|
||||
|
||||
// Third Block - Cycle Timers and Events
|
||||
// -------------------------------------
|
||||
FreezeTag( "Cycles" );
|
||||
Freeze(EEsCycle);
|
||||
Freeze(EEoCycle);
|
||||
Freeze(iopCycleEE);
|
||||
Freeze(iopBreak);
|
||||
Freeze(g_nextEventCycle);
|
||||
Freeze(g_iopNextEventCycle);
|
||||
Freeze(s_iLastCOP0Cycle);
|
||||
Freeze(s_iLastPERFCycle);
|
||||
Freeze(nextCounter);
|
||||
Freeze(nextsCounter);
|
||||
Freeze(psxNextsCounter);
|
||||
Freeze(psxNextCounter);
|
||||
|
||||
// Fourth Block - EE-related systems
|
||||
// ---------------------------------
|
||||
|
@ -231,6 +245,7 @@ SaveStateBase& SaveStateBase::FreezeInternals()
|
|||
rcntFreeze();
|
||||
gsFreeze();
|
||||
vuMicroFreeze();
|
||||
vuJITFreeze();
|
||||
vif0Freeze();
|
||||
vif1Freeze();
|
||||
sifFreeze();
|
||||
|
@ -252,7 +267,6 @@ SaveStateBase& SaveStateBase::FreezeInternals()
|
|||
cdrFreeze();
|
||||
cdvdFreeze();
|
||||
|
||||
|
||||
// technically this is HLE BIOS territory, but we don't have enough such stuff
|
||||
// to merit an HLE Bios sub-section... yet.
|
||||
deci2Freeze();
|
||||
|
|
|
@ -31,7 +31,7 @@ enum class FreezeAction
|
|||
// the lower 16 bit value. IF the change is breaking of all compatibility with old
|
||||
// states, increment the upper 16 bit value, and clear the lower 16 bits to 0.
|
||||
|
||||
static const u32 g_SaveVersion = (0x9A26 << 16) | 0x0000;
|
||||
static const u32 g_SaveVersion = (0x9A27 << 16) | 0x0000;
|
||||
|
||||
// the freezing data between submodules and core
|
||||
// an interesting thing to note is that this dates back from before plugin
|
||||
|
@ -152,6 +152,7 @@ protected:
|
|||
void mtvuFreeze();
|
||||
void rcntFreeze();
|
||||
void vuMicroFreeze();
|
||||
void vuJITFreeze();
|
||||
void vif0Freeze();
|
||||
void vif1Freeze();
|
||||
void sifFreeze();
|
||||
|
|
|
@ -17,11 +17,10 @@
|
|||
#include "PrecompiledHeader.h"
|
||||
#include "Common.h"
|
||||
#include "VUmicro.h"
|
||||
|
||||
#include "MTVU.h"
|
||||
|
||||
__aligned16 VURegs vuRegs[2];
|
||||
|
||||
|
||||
vuMemoryReserve::vuMemoryReserve()
|
||||
: _parent( L"VU0/1 on-chip memory", VU1_PROGSIZE + VU1_MEMSIZE + VU0_PROGSIZE + VU0_MEMSIZE )
|
||||
{
|
||||
|
@ -78,19 +77,95 @@ void vuMemoryReserve::Reset()
|
|||
|
||||
void SaveStateBase::vuMicroFreeze()
|
||||
{
|
||||
if(IsSaving())
|
||||
vu1Thread.WaitVU();
|
||||
|
||||
FreezeTag( "vuMicroRegs" );
|
||||
|
||||
Freeze(VU0.ACC);
|
||||
Freeze(VU0.code);
|
||||
// VU0 state information
|
||||
|
||||
Freeze(VU0.ACC);
|
||||
Freeze(VU0.VF);
|
||||
Freeze(VU0.VI);
|
||||
Freeze(VU0.q);
|
||||
|
||||
Freeze(VU0.cycle);
|
||||
Freeze(VU0.flags);
|
||||
Freeze(VU0.code);
|
||||
Freeze(VU0.start_pc);
|
||||
Freeze(VU0.branch);
|
||||
Freeze(VU0.branchpc);
|
||||
Freeze(VU0.delaybranchpc);
|
||||
Freeze(VU0.takedelaybranch);
|
||||
Freeze(VU0.ebit);
|
||||
Freeze(VU0.pending_q);
|
||||
Freeze(VU0.pending_p);
|
||||
Freeze(VU0.blockhasmbit);
|
||||
Freeze(VU0.micro_macflags);
|
||||
Freeze(VU0.micro_clipflags);
|
||||
Freeze(VU0.micro_statusflags);
|
||||
Freeze(VU0.macflag);
|
||||
Freeze(VU0.statusflag);
|
||||
Freeze(VU0.clipflag);
|
||||
Freeze(VU0.nextBlockCycles);
|
||||
Freeze(VU0.VIBackupCycles);
|
||||
Freeze(VU0.VIOldValue);
|
||||
Freeze(VU0.VIRegNumber);
|
||||
Freeze(VU0.fmac);
|
||||
Freeze(VU0.fmacreadpos);
|
||||
Freeze(VU0.fmacwritepos);
|
||||
Freeze(VU0.fmaccount);
|
||||
Freeze(VU0.fdiv);
|
||||
Freeze(VU0.efu);
|
||||
Freeze(VU0.ialu);
|
||||
Freeze(VU0.ialureadpos);
|
||||
Freeze(VU0.ialuwritepos);
|
||||
Freeze(VU0.ialucount);
|
||||
|
||||
// VU1 state information
|
||||
Freeze(VU1.ACC);
|
||||
|
||||
u32& temp_vu1_code = VU1.code;
|
||||
Freeze(temp_vu1_code);
|
||||
|
||||
Freeze(VU1.VF);
|
||||
Freeze(VU1.VI);
|
||||
Freeze(VU1.q);
|
||||
Freeze(VU1.p);
|
||||
|
||||
Freeze(VU1.cycle);
|
||||
Freeze(VU1.flags);
|
||||
Freeze(VU1.code);
|
||||
Freeze(VU1.start_pc);
|
||||
Freeze(VU1.branch);
|
||||
Freeze(VU1.branchpc);
|
||||
Freeze(VU1.delaybranchpc);
|
||||
Freeze(VU1.takedelaybranch);
|
||||
Freeze(VU1.ebit);
|
||||
Freeze(VU1.pending_q);
|
||||
Freeze(VU1.pending_p);
|
||||
Freeze(VU1.blockhasmbit);
|
||||
Freeze(VU1.micro_macflags);
|
||||
Freeze(VU1.micro_clipflags);
|
||||
Freeze(VU1.micro_statusflags);
|
||||
Freeze(VU1.macflag);
|
||||
Freeze(VU1.statusflag);
|
||||
Freeze(VU1.clipflag);
|
||||
Freeze(VU1.nextBlockCycles);
|
||||
Freeze(VU1.xgkickaddr);
|
||||
Freeze(VU1.xgkickdiff);
|
||||
Freeze(VU1.xgkicksizeremaining);
|
||||
Freeze(VU1.xgkicklastcycle);
|
||||
Freeze(VU1.xgkickcyclecount);
|
||||
Freeze(VU1.xgkickenable);
|
||||
Freeze(VU1.xgkickendpacket);
|
||||
Freeze(VU1.VIBackupCycles);
|
||||
Freeze(VU1.VIOldValue);
|
||||
Freeze(VU1.VIRegNumber);
|
||||
Freeze(VU1.fmac);
|
||||
Freeze(VU1.fmacreadpos);
|
||||
Freeze(VU1.fmacwritepos);
|
||||
Freeze(VU1.fmaccount);
|
||||
Freeze(VU1.fdiv);
|
||||
Freeze(VU1.efu);
|
||||
Freeze(VU1.ialu);
|
||||
Freeze(VU1.ialureadpos);
|
||||
Freeze(VU1.ialuwritepos);
|
||||
Freeze(VU1.ialucount);
|
||||
}
|
||||
|
|
|
@ -506,3 +506,12 @@ void recMicroVU1::ResumeXGkick()
|
|||
return;
|
||||
((mVUrecCallXG)microVU1.startFunctXG)();
|
||||
}
|
||||
|
||||
void SaveStateBase::vuJITFreeze()
|
||||
{
|
||||
if (IsSaving())
|
||||
vu1Thread.WaitVU();
|
||||
|
||||
Freeze(microVU0.prog.lpState);
|
||||
Freeze(microVU1.prog.lpState);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue