diff --git a/Source/Project64-core/N64System/N64System.cpp b/Source/Project64-core/N64System/N64System.cpp index 8ff0e2d91..dfbe91e11 100644 --- a/Source/Project64-core/N64System/N64System.cpp +++ b/Source/Project64-core/N64System/N64System.cpp @@ -1671,11 +1671,11 @@ bool CN64System::SaveState() zipWriteInFileInZip(file, g_Rom->GetRomAddress(), 0x40); } zipWriteInFileInZip(file, &NextViTimer, sizeof(uint32_t)); - int32_t WriteProgramCounter = ((int32_t)m_Reg.m_PROGRAM_COUNTER); + int64_t WriteProgramCounter = ((int32_t)m_Reg.m_PROGRAM_COUNTER); zipWriteInFileInZip(file, &WriteProgramCounter, sizeof(int64_t)); zipWriteInFileInZip(file, m_Reg.m_GPR, sizeof(int64_t) * 32); zipWriteInFileInZip(file, m_Reg.m_FPR, sizeof(int64_t) * 32); - zipWriteInFileInZip(file, m_Reg.m_CP0, sizeof(uint32_t) * 32); + zipWriteInFileInZip(file, m_Reg.m_CP0, sizeof(uint64_t) * 32); zipWriteInFileInZip(file, m_Reg.m_FPCR, sizeof(uint32_t) * 32); zipWriteInFileInZip(file, &m_Reg.m_HI, sizeof(int64_t)); zipWriteInFileInZip(file, &m_Reg.m_LO, sizeof(int64_t)); @@ -1742,7 +1742,7 @@ bool CN64System::SaveState() hSaveFile.Write(g_Rom->GetRomAddress(), 0x40); } hSaveFile.Write(&NextViTimer, sizeof(uint32_t)); - int32_t WriteProgramCounter = ((int32_t)m_Reg.m_PROGRAM_COUNTER); + int64_t WriteProgramCounter = ((int32_t)m_Reg.m_PROGRAM_COUNTER); hSaveFile.Write(&WriteProgramCounter, sizeof(int64_t)); hSaveFile.Write(m_Reg.m_GPR, sizeof(int64_t) * 32); hSaveFile.Write(m_Reg.m_FPR, sizeof(int64_t) * 32); diff --git a/Source/Project64-core/Plugins/RSPPlugin.cpp b/Source/Project64-core/Plugins/RSPPlugin.cpp index 350076942..bb2536936 100644 --- a/Source/Project64-core/Plugins/RSPPlugin.cpp +++ b/Source/Project64-core/Plugins/RSPPlugin.cpp @@ -109,8 +109,6 @@ void CRSP_Plugin::RomClose(RenderWindow * Render) } CPlugin::RomClose(Render); m_RunEvent.Reset(); - m_Plugins = nullptr; - m_System = nullptr; } bool CRSP_Plugin::Initiate(CPlugins * Plugins, CN64System * System) @@ -563,7 +561,7 @@ uint32_t CRSP_Plugin::RspThread(void) CRegisters & Reg = m_System->m_Reg; for (;;) { - if ((Reg.SP_STATUS_REG & SP_STATUS_HALT) != 0) + if ((Reg.SP_STATUS_REG & SP_STATUS_HALT) != 0 || !RspMultiThreaded()) { m_RunEvent.Reset(); m_RunEvent.IsTriggered(SyncEvent::INFINITE_TIMEOUT); diff --git a/Source/Project64-core/Plugins/RSPPlugin.h b/Source/Project64-core/Plugins/RSPPlugin.h index bd78f8bd1..108141854 100644 --- a/Source/Project64-core/Plugins/RSPPlugin.h +++ b/Source/Project64-core/Plugins/RSPPlugin.h @@ -59,6 +59,9 @@ public: void * GetDebugMenu(void); void ProcessMenuItem(int32_t id); + void PauseRSPThread(void); + void ResumeRSPThread(void); + private: CRSP_Plugin(const CRSP_Plugin &); CRSP_Plugin & operator=(const CRSP_Plugin &);