diff --git a/Core/MIPS/MIPS.cpp b/Core/MIPS/MIPS.cpp index e4fa5549fe..d784419212 100644 --- a/Core/MIPS/MIPS.cpp +++ b/Core/MIPS/MIPS.cpp @@ -99,6 +99,33 @@ void MIPSState::Reset() rng.Init(0x1337); } +void MIPSState::DoState(PointerWrap &p) +{ + // Reset the jit if we're loading. + if (p.mode == p.MODE_READ) + Reset(); + + p.DoArray(r, sizeof(r) / sizeof(r[0])); + p.DoArray(f, sizeof(f) / sizeof(f[0])); + p.DoArray(v, sizeof(v) / sizeof(v[0])); + p.DoArray(vfpuCtrl, sizeof(vfpuCtrl) / sizeof(vfpuCtrl[0])); + p.DoArray(vfpuWriteMask, sizeof(vfpuWriteMask) / sizeof(vfpuWriteMask[0])); + p.Do(pc); + p.Do(nextPC); + p.Do(hi); + p.Do(lo); + p.Do(fpcond); + p.Do(fcr0); + p.Do(fcr31); + rng.DoState(p); + p.Do(inDelaySlot); + p.Do(llBit); + p.Do(cpuType); + p.Do(exceptions); + p.Do(debugCount); + p.DoMarker("MIPSState"); +} + void MIPSState::SetWriteMask(const bool wm[4]) { for (int i = 0; i < 4; i++) diff --git a/Core/MIPS/MIPS.h b/Core/MIPS/MIPS.h index cbab48edba..1e8bd29a6f 100644 --- a/Core/MIPS/MIPS.h +++ b/Core/MIPS/MIPS.h @@ -18,6 +18,7 @@ #pragma once #include "../../Globals.h" +#include "../../Common/ChunkFile.h" #include "../CPU.h" enum @@ -92,6 +93,12 @@ public: return (m_z << 16) + m_w; } + void DoState(PointerWrap &p) { + p.Do(m_w); + p.Do(m_z); + p.DoMarker("GMRng"); + } + private: u32 m_w; u32 m_z; @@ -104,6 +111,7 @@ public: ~MIPSState(); void Reset(); + void DoState(PointerWrap &p); u32 r[32]; float f[32]; diff --git a/Core/SaveState.cpp b/Core/SaveState.cpp index bbf8717b9f..69ba1a517c 100644 --- a/Core/SaveState.cpp +++ b/Core/SaveState.cpp @@ -24,6 +24,7 @@ #include "HLE/sceKernel.h" #include "HW/MemoryStick.h" #include "MemMap.h" +#include "MIPS/MIPS.h" namespace SaveState { @@ -70,7 +71,9 @@ namespace SaveState Memory::DoState(p); MemoryStick_DoState(p); + currentMIPS->DoState(p); __KernelDoState(p); + // TODO: filesystem, HLE? } void Enqueue(SaveState::Operation op)