From 9dc121ffbbaf572763a338741a69c789ce0359bf Mon Sep 17 00:00:00 2001 From: LuigiBlood Date: Tue, 9 Jun 2020 22:22:25 +0200 Subject: [PATCH 1/8] [Save State] Add Disk Registers to Save State file --- Source/Project64-core/N64System/N64Class.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Source/Project64-core/N64System/N64Class.cpp b/Source/Project64-core/N64System/N64Class.cpp index ca7e03741..6e72fcb78 100644 --- a/Source/Project64-core/N64System/N64Class.cpp +++ b/Source/Project64-core/N64System/N64Class.cpp @@ -1767,6 +1767,7 @@ bool CN64System::SaveState() zipWriteInFileInZip(file, m_Reg.m_Peripheral_Interface, sizeof(uint32_t) * 13); zipWriteInFileInZip(file, m_Reg.m_RDRAM_Interface, sizeof(uint32_t) * 8); zipWriteInFileInZip(file, m_Reg.m_SerialInterface, sizeof(uint32_t) * 4); + zipWriteInFileInZip(file, m_Reg.m_DiskInterface, sizeof(uint32_t) * 22); zipWriteInFileInZip(file, (void *const)&m_TLB.TlbEntry(0), sizeof(CTLB::TLB_ENTRY) * 32); zipWriteInFileInZip(file, m_MMU_VM.PifRam(), 0x40); zipWriteInFileInZip(file, m_MMU_VM.Rdram(), RdramSize); @@ -1820,6 +1821,7 @@ bool CN64System::SaveState() hSaveFile.Write(m_Reg.m_Peripheral_Interface, sizeof(uint32_t) * 13); hSaveFile.Write(m_Reg.m_RDRAM_Interface, sizeof(uint32_t) * 8); hSaveFile.Write(m_Reg.m_SerialInterface, sizeof(uint32_t) * 4); + hSaveFile.Write(m_Reg.m_DiskInterface, sizeof(uint32_t) * 22); hSaveFile.Write(&m_TLB.TlbEntry(0), sizeof(CTLB::TLB_ENTRY) * 32); hSaveFile.Write(g_MMU->PifRam(), 0x40); hSaveFile.Write(g_MMU->Rdram(), RdramSize); @@ -2000,6 +2002,7 @@ bool CN64System::LoadState(const char * FileName) unzReadCurrentFile(file, m_Reg.m_Peripheral_Interface, sizeof(uint32_t) * 13); unzReadCurrentFile(file, m_Reg.m_RDRAM_Interface, sizeof(uint32_t) * 8); unzReadCurrentFile(file, m_Reg.m_SerialInterface, sizeof(uint32_t) * 4); + unzReadCurrentFile(file, m_Reg.m_DiskInterface, sizeof(uint32_t) * 22); unzReadCurrentFile(file, (void *const)&m_TLB.TlbEntry(0), sizeof(CTLB::TLB_ENTRY) * 32); unzReadCurrentFile(file, m_MMU_VM.PifRam(), 0x40); unzReadCurrentFile(file, m_MMU_VM.Rdram(), SaveRDRAMSize); @@ -2067,6 +2070,7 @@ bool CN64System::LoadState(const char * FileName) hSaveFile.Read(m_Reg.m_Peripheral_Interface, sizeof(uint32_t) * 13); hSaveFile.Read(m_Reg.m_RDRAM_Interface, sizeof(uint32_t) * 8); hSaveFile.Read(m_Reg.m_SerialInterface, sizeof(uint32_t) * 4); + hSaveFile.Read(m_Reg.m_DiskInterface, sizeof(uint32_t) * 22); hSaveFile.Read((void *const)&m_TLB.TlbEntry(0), sizeof(CTLB::TLB_ENTRY) * 32); hSaveFile.Read(m_MMU_VM.PifRam(), 0x40); hSaveFile.Read(m_MMU_VM.Rdram(), SaveRDRAMSize); From 34ec690acc5acb2c4badc9791c86c237f23f4f71 Mon Sep 17 00:00:00 2001 From: LuigiBlood Date: Tue, 9 Jun 2020 22:45:34 +0200 Subject: [PATCH 2/8] [Save State] Use Disk ID to recognize the currently loaded Disk game --- Source/Project64-core/N64System/N64Class.cpp | 44 ++++++++++++++++---- 1 file changed, 36 insertions(+), 8 deletions(-) diff --git a/Source/Project64-core/N64System/N64Class.cpp b/Source/Project64-core/N64System/N64Class.cpp index 6e72fcb78..cddb24639 100644 --- a/Source/Project64-core/N64System/N64Class.cpp +++ b/Source/Project64-core/N64System/N64Class.cpp @@ -1749,7 +1749,10 @@ bool CN64System::SaveState() zipOpenNewFileInZip(file, SaveFile.GetNameExtension().c_str(), NULL, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION); zipWriteInFileInZip(file, &SaveID_0, sizeof(SaveID_0)); zipWriteInFileInZip(file, &RdramSize, sizeof(uint32_t)); - zipWriteInFileInZip(file, g_Rom->GetRomAddress(), 0x40); + if (!g_Settings->LoadBool(Setting_EnableDisk)) + zipWriteInFileInZip(file, g_Rom->GetRomAddress(), 0x40); + else + zipWriteInFileInZip(file, g_Disk->GetDiskAddressID(), 0x40); zipWriteInFileInZip(file, &NextViTimer, sizeof(uint32_t)); zipWriteInFileInZip(file, &m_Reg.m_PROGRAM_COUNTER, sizeof(m_Reg.m_PROGRAM_COUNTER)); zipWriteInFileInZip(file, m_Reg.m_GPR, sizeof(int64_t) * 32); @@ -1803,7 +1806,10 @@ bool CN64System::SaveState() hSaveFile.SeekToBegin(); hSaveFile.Write(&SaveID_0, sizeof(uint32_t)); hSaveFile.Write(&RdramSize, sizeof(uint32_t)); - hSaveFile.Write(g_Rom->GetRomAddress(), 0x40); + if (!g_Settings->LoadBool(Setting_EnableDisk)) + hSaveFile.Write(g_Rom->GetRomAddress(), 0x40); + else + hSaveFile.Write(g_Disk->GetDiskAddressID(), 0x40); hSaveFile.Write(&NextViTimer, sizeof(uint32_t)); hSaveFile.Write(&m_Reg.m_PROGRAM_COUNTER, sizeof(m_Reg.m_PROGRAM_COUNTER)); hSaveFile.Write(m_Reg.m_GPR, sizeof(int64_t) * 32); @@ -1975,10 +1981,21 @@ bool CN64System::LoadState(const char * FileName) uint8_t LoadHeader[64]; unzReadCurrentFile(file, LoadHeader, 0x40); - if (memcmp(LoadHeader, g_Rom->GetRomAddress(), 0x40) != 0 && - !g_Notify->AskYesNoQuestion(g_Lang->GetString(MSG_SAVE_STATE_HEADER).c_str())) + if (!g_Settings->LoadBool(Setting_EnableDisk)) { - return false; + if (memcmp(LoadHeader, g_Rom->GetRomAddress(), 0x40) != 0 && + !g_Notify->AskYesNoQuestion(g_Lang->GetString(MSG_SAVE_STATE_HEADER).c_str())) + { + return false; + } + } + else + { + if (memcmp(LoadHeader, g_Disk->GetDiskAddressID(), 0x40) != 0 && + !g_Notify->AskYesNoQuestion(g_Lang->GetString(MSG_SAVE_STATE_HEADER).c_str())) + { + return false; + } } Reset(false, true); @@ -2043,10 +2060,21 @@ bool CN64System::LoadState(const char * FileName) //Check header uint8_t LoadHeader[64]; hSaveFile.Read(LoadHeader, 0x40); - if (memcmp(LoadHeader, g_Rom->GetRomAddress(), 0x40) != 0 && - !g_Notify->AskYesNoQuestion(g_Lang->GetString(MSG_SAVE_STATE_HEADER).c_str())) + if (!g_Settings->LoadBool(Setting_EnableDisk)) { - return false; + if (memcmp(LoadHeader, g_Rom->GetRomAddress(), 0x40) != 0 && + !g_Notify->AskYesNoQuestion(g_Lang->GetString(MSG_SAVE_STATE_HEADER).c_str())) + { + return false; + } + } + else + { + if (memcmp(LoadHeader, g_Disk->GetDiskAddressID(), 0x40) != 0 && + !g_Notify->AskYesNoQuestion(g_Lang->GetString(MSG_SAVE_STATE_HEADER).c_str())) + { + return false; + } } Reset(false, true); m_MMU_VM.UnProtectMemory(0x80000000, 0x80000000 + g_Settings->LoadDword(Game_RDRamSize) - 4); From b2ed47c44fb0f5d4a2b5315d2fdd59e7c0173f93 Mon Sep 17 00:00:00 2001 From: LuigiBlood Date: Tue, 9 Jun 2020 22:52:42 +0200 Subject: [PATCH 3/8] [Save State] Make sure g_Disk exists --- Source/Project64-core/N64System/N64Class.cpp | 24 ++++++++++---------- 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/Source/Project64-core/N64System/N64Class.cpp b/Source/Project64-core/N64System/N64Class.cpp index cddb24639..48375220f 100644 --- a/Source/Project64-core/N64System/N64Class.cpp +++ b/Source/Project64-core/N64System/N64Class.cpp @@ -1749,10 +1749,10 @@ bool CN64System::SaveState() zipOpenNewFileInZip(file, SaveFile.GetNameExtension().c_str(), NULL, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION); zipWriteInFileInZip(file, &SaveID_0, sizeof(SaveID_0)); zipWriteInFileInZip(file, &RdramSize, sizeof(uint32_t)); - if (!g_Settings->LoadBool(Setting_EnableDisk)) - zipWriteInFileInZip(file, g_Rom->GetRomAddress(), 0x40); - else + if (g_Settings->LoadBool(Setting_EnableDisk) && g_Disk) zipWriteInFileInZip(file, g_Disk->GetDiskAddressID(), 0x40); + else + zipWriteInFileInZip(file, g_Rom->GetRomAddress(), 0x40); zipWriteInFileInZip(file, &NextViTimer, sizeof(uint32_t)); zipWriteInFileInZip(file, &m_Reg.m_PROGRAM_COUNTER, sizeof(m_Reg.m_PROGRAM_COUNTER)); zipWriteInFileInZip(file, m_Reg.m_GPR, sizeof(int64_t) * 32); @@ -1806,10 +1806,10 @@ bool CN64System::SaveState() hSaveFile.SeekToBegin(); hSaveFile.Write(&SaveID_0, sizeof(uint32_t)); hSaveFile.Write(&RdramSize, sizeof(uint32_t)); - if (!g_Settings->LoadBool(Setting_EnableDisk)) - hSaveFile.Write(g_Rom->GetRomAddress(), 0x40); - else + if (g_Settings->LoadBool(Setting_EnableDisk) && g_Disk) hSaveFile.Write(g_Disk->GetDiskAddressID(), 0x40); + else + hSaveFile.Write(g_Rom->GetRomAddress(), 0x40); hSaveFile.Write(&NextViTimer, sizeof(uint32_t)); hSaveFile.Write(&m_Reg.m_PROGRAM_COUNTER, sizeof(m_Reg.m_PROGRAM_COUNTER)); hSaveFile.Write(m_Reg.m_GPR, sizeof(int64_t) * 32); @@ -1981,9 +1981,9 @@ bool CN64System::LoadState(const char * FileName) uint8_t LoadHeader[64]; unzReadCurrentFile(file, LoadHeader, 0x40); - if (!g_Settings->LoadBool(Setting_EnableDisk)) + if (g_Settings->LoadBool(Setting_EnableDisk) && g_Disk) { - if (memcmp(LoadHeader, g_Rom->GetRomAddress(), 0x40) != 0 && + if (memcmp(LoadHeader, g_Disk->GetDiskAddressID(), 0x40) != 0 && !g_Notify->AskYesNoQuestion(g_Lang->GetString(MSG_SAVE_STATE_HEADER).c_str())) { return false; @@ -1991,7 +1991,7 @@ bool CN64System::LoadState(const char * FileName) } else { - if (memcmp(LoadHeader, g_Disk->GetDiskAddressID(), 0x40) != 0 && + if (memcmp(LoadHeader, g_Rom->GetRomAddress(), 0x40) != 0 && !g_Notify->AskYesNoQuestion(g_Lang->GetString(MSG_SAVE_STATE_HEADER).c_str())) { return false; @@ -2060,9 +2060,9 @@ bool CN64System::LoadState(const char * FileName) //Check header uint8_t LoadHeader[64]; hSaveFile.Read(LoadHeader, 0x40); - if (!g_Settings->LoadBool(Setting_EnableDisk)) + if (g_Settings->LoadBool(Setting_EnableDisk) && g_Disk) { - if (memcmp(LoadHeader, g_Rom->GetRomAddress(), 0x40) != 0 && + if (memcmp(LoadHeader, g_Disk->GetDiskAddressID(), 0x40) != 0 && !g_Notify->AskYesNoQuestion(g_Lang->GetString(MSG_SAVE_STATE_HEADER).c_str())) { return false; @@ -2070,7 +2070,7 @@ bool CN64System::LoadState(const char * FileName) } else { - if (memcmp(LoadHeader, g_Disk->GetDiskAddressID(), 0x40) != 0 && + if (memcmp(LoadHeader, g_Rom->GetRomAddress(), 0x40) != 0 && !g_Notify->AskYesNoQuestion(g_Lang->GetString(MSG_SAVE_STATE_HEADER).c_str())) { return false; From e805c709b38693b6a1f3a39ac2f37c9e2fa4d186 Mon Sep 17 00:00:00 2001 From: LuigiBlood Date: Wed, 10 Jun 2020 13:34:55 +0200 Subject: [PATCH 4/8] [Save State] Put Disk Interface info in Extra Info + cleanups It should also be backward compatible. --- Source/Project64-core/N64System/N64Class.cpp | 55 ++++++++++++++------ Source/Project64-core/N64System/N64Class.h | 5 ++ 2 files changed, 45 insertions(+), 15 deletions(-) diff --git a/Source/Project64-core/N64System/N64Class.cpp b/Source/Project64-core/N64System/N64Class.cpp index 48375220f..f8585a624 100644 --- a/Source/Project64-core/N64System/N64Class.cpp +++ b/Source/Project64-core/N64System/N64Class.cpp @@ -1738,7 +1738,6 @@ bool CN64System::SaveState() } } - uint32_t SaveID_0 = 0x23D8A6C8, SaveID_1 = 0x56D2CD23; uint32_t RdramSize = g_Settings->LoadDword(Game_RDRamSize); uint32_t MiInterReg = g_Reg->MI_INTR_REG; uint32_t NextViTimer = m_SystemTimer.GetTimer(CSystemTimer::ViTimer); @@ -1770,7 +1769,6 @@ bool CN64System::SaveState() zipWriteInFileInZip(file, m_Reg.m_Peripheral_Interface, sizeof(uint32_t) * 13); zipWriteInFileInZip(file, m_Reg.m_RDRAM_Interface, sizeof(uint32_t) * 8); zipWriteInFileInZip(file, m_Reg.m_SerialInterface, sizeof(uint32_t) * 4); - zipWriteInFileInZip(file, m_Reg.m_DiskInterface, sizeof(uint32_t) * 22); zipWriteInFileInZip(file, (void *const)&m_TLB.TlbEntry(0), sizeof(CTLB::TLB_ENTRY) * 32); zipWriteInFileInZip(file, m_MMU_VM.PifRam(), 0x40); zipWriteInFileInZip(file, m_MMU_VM.Rdram(), RdramSize); @@ -1779,8 +1777,16 @@ bool CN64System::SaveState() zipCloseFileInZip(file); zipOpenNewFileInZip(file, ExtraInfo.GetNameExtension().c_str(), NULL, NULL, 0, NULL, 0, NULL, Z_DEFLATED, Z_DEFAULT_COMPRESSION); - zipWriteInFileInZip(file, &SaveID_1, sizeof(SaveID_1)); + + //Extra Info v2 + zipWriteInFileInZip(file, &SaveID_2, sizeof(SaveID_2)); + + //Disk Interface Info + zipWriteInFileInZip(file, m_Reg.m_DiskInterface, sizeof(uint32_t) * 22); + + //System Timers Info m_SystemTimer.SaveData(file); + zipCloseFileInZip(file); zipClose(file, ""); @@ -1827,7 +1833,6 @@ bool CN64System::SaveState() hSaveFile.Write(m_Reg.m_Peripheral_Interface, sizeof(uint32_t) * 13); hSaveFile.Write(m_Reg.m_RDRAM_Interface, sizeof(uint32_t) * 8); hSaveFile.Write(m_Reg.m_SerialInterface, sizeof(uint32_t) * 4); - hSaveFile.Write(m_Reg.m_DiskInterface, sizeof(uint32_t) * 22); hSaveFile.Write(&m_TLB.TlbEntry(0), sizeof(CTLB::TLB_ENTRY) * 32); hSaveFile.Write(g_MMU->PifRam(), 0x40); hSaveFile.Write(g_MMU->Rdram(), RdramSize); @@ -1838,6 +1843,13 @@ bool CN64System::SaveState() CFile hExtraInfo(ExtraInfo, CFileBase::modeWrite | CFileBase::modeCreate); if (hExtraInfo.IsOpen()) { + //Extra Info v2 + hExtraInfo.Write(&SaveID_2, sizeof(uint32_t)); + + //Disk Interface Info + hExtraInfo.Write(m_Reg.m_DiskInterface, sizeof(uint32_t) * 22); + + //System Timers Info m_SystemTimer.SaveData(hExtraInfo); hExtraInfo.Close(); } @@ -1968,13 +1980,7 @@ bool CN64System::LoadState(const char * FileName) continue; } unzReadCurrentFile(file, &Value, 4); - if (Value != 0x23D8A6C8 && Value != 0x56D2CD23) - { - unzCloseCurrentFile(file); - port = unzGoToNextFile(file); - continue; - } - if (!LoadedZipFile && Value == 0x23D8A6C8 && port == UNZ_OK) + if (!LoadedZipFile && Value == SaveID_0 && port == UNZ_OK) { unzReadCurrentFile(file, &SaveRDRAMSize, sizeof(SaveRDRAMSize)); //Check header @@ -2019,7 +2025,6 @@ bool CN64System::LoadState(const char * FileName) unzReadCurrentFile(file, m_Reg.m_Peripheral_Interface, sizeof(uint32_t) * 13); unzReadCurrentFile(file, m_Reg.m_RDRAM_Interface, sizeof(uint32_t) * 8); unzReadCurrentFile(file, m_Reg.m_SerialInterface, sizeof(uint32_t) * 4); - unzReadCurrentFile(file, m_Reg.m_DiskInterface, sizeof(uint32_t) * 22); unzReadCurrentFile(file, (void *const)&m_TLB.TlbEntry(0), sizeof(CTLB::TLB_ENTRY) * 32); unzReadCurrentFile(file, m_MMU_VM.PifRam(), 0x40); unzReadCurrentFile(file, m_MMU_VM.Rdram(), SaveRDRAMSize); @@ -2030,8 +2035,18 @@ bool CN64System::LoadState(const char * FileName) LoadedZipFile = true; continue; } - if (LoadedZipFile && Value == 0x56D2CD23 && port == UNZ_OK) + if (LoadedZipFile && Value == SaveID_1 && port == UNZ_OK) { + //Extra Info v1 + //System Timers Info + m_SystemTimer.LoadData(file); + } + if (LoadedZipFile && Value == SaveID_2 && port == UNZ_OK) + { + //Extra Info v2 (Project64 2.4) + //Disk Interface Info + unzReadCurrentFile(file, m_Reg.m_DiskInterface, sizeof(uint32_t) * 22); + //System Timers Info m_SystemTimer.LoadData(file); } unzCloseCurrentFile(file); @@ -2050,7 +2065,7 @@ bool CN64System::LoadState(const char * FileName) hSaveFile.SeekToBegin(); hSaveFile.Read(&Value, sizeof(Value)); - if (Value != 0x23D8A6C8) + if (Value != SaveID_0) { return false; } @@ -2098,7 +2113,6 @@ bool CN64System::LoadState(const char * FileName) hSaveFile.Read(m_Reg.m_Peripheral_Interface, sizeof(uint32_t) * 13); hSaveFile.Read(m_Reg.m_RDRAM_Interface, sizeof(uint32_t) * 8); hSaveFile.Read(m_Reg.m_SerialInterface, sizeof(uint32_t) * 4); - hSaveFile.Read(m_Reg.m_DiskInterface, sizeof(uint32_t) * 22); hSaveFile.Read((void *const)&m_TLB.TlbEntry(0), sizeof(CTLB::TLB_ENTRY) * 32); hSaveFile.Read(m_MMU_VM.PifRam(), 0x40); hSaveFile.Read(m_MMU_VM.Rdram(), SaveRDRAMSize); @@ -2111,7 +2125,18 @@ bool CN64System::LoadState(const char * FileName) CFile hExtraInfo(ExtraInfo, CFileBase::modeRead); if (hExtraInfo.IsOpen()) { + //Extra Info version check + hExtraInfo.Read(&Value, sizeof(Value)); + if (Value != SaveID_1 && Value != SaveID_2) + hExtraInfo.SeekToBegin(); + + //Disk Interface Info + if (Value == SaveID_2) + hExtraInfo.Read(m_Reg.m_DiskInterface, sizeof(uint32_t) * 22); + + //System Timers Info m_SystemTimer.LoadData(hExtraInfo); + hExtraInfo.Close(); } } diff --git a/Source/Project64-core/N64System/N64Class.h b/Source/Project64-core/N64System/N64Class.h index 895337f04..eabe2e5d2 100644 --- a/Source/Project64-core/N64System/N64Class.h +++ b/Source/Project64-core/N64System/N64Class.h @@ -184,4 +184,9 @@ private: //list of function that have been called .. used in profiling FUNC_CALLS m_FunctionCalls; + + //list of Save State File IDs + const uint32_t SaveID_0 = 0x23D8A6C8; //Main Save State Info (*.pj) + const uint32_t SaveID_1 = 0x56D2CD23; //Extra Data v1 (System Timing) Info (*.dat) + const uint32_t SaveID_2 = 0x750A6BEB; //Extra Data v2 (Timing + Disk Registers) (*.dat) }; From c5c6167f05d7c6d795e6afb46742b5dace26effa Mon Sep 17 00:00:00 2001 From: LuigiBlood Date: Wed, 10 Jun 2020 13:58:03 +0200 Subject: [PATCH 5/8] [Save State] Recover Disk Seek Address for more stability --- Source/Project64-core/N64System/N64Class.cpp | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Source/Project64-core/N64System/N64Class.cpp b/Source/Project64-core/N64System/N64Class.cpp index f8585a624..9b395144d 100644 --- a/Source/Project64-core/N64System/N64Class.cpp +++ b/Source/Project64-core/N64System/N64Class.cpp @@ -17,6 +17,7 @@ #include #include #include +#include #include #include #include @@ -2132,8 +2133,14 @@ bool CN64System::LoadState(const char * FileName) //Disk Interface Info if (Value == SaveID_2) + { hExtraInfo.Read(m_Reg.m_DiskInterface, sizeof(uint32_t) * 22); + //Recover Disk Seek Address (if the save state is done while loading/saving data) + if (g_Disk) + DiskBMReadWrite(false); + } + //System Timers Info m_SystemTimer.LoadData(hExtraInfo); From 8bb117e4de94b744b76453c9c4eed1b795def2fd Mon Sep 17 00:00:00 2001 From: LuigiBlood Date: Wed, 10 Jun 2020 15:30:06 +0200 Subject: [PATCH 6/8] [Save State] Recover Disk Seek Address when loading from Zip --- Source/Project64-core/N64System/N64Class.cpp | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Source/Project64-core/N64System/N64Class.cpp b/Source/Project64-core/N64System/N64Class.cpp index 9b395144d..cc9bf43ed 100644 --- a/Source/Project64-core/N64System/N64Class.cpp +++ b/Source/Project64-core/N64System/N64Class.cpp @@ -2047,6 +2047,11 @@ bool CN64System::LoadState(const char * FileName) //Extra Info v2 (Project64 2.4) //Disk Interface Info unzReadCurrentFile(file, m_Reg.m_DiskInterface, sizeof(uint32_t) * 22); + + //Recover Disk Seek Address (if the save state is done while loading/saving data) + if (g_Disk) + DiskBMReadWrite(false); + //System Timers Info m_SystemTimer.LoadData(file); } From 9f3bab30b96079ef021d3b610146078d102074cb Mon Sep 17 00:00:00 2001 From: LuigiBlood Date: Fri, 12 Jun 2020 16:31:11 +0200 Subject: [PATCH 7/8] [Save State] Include both g_Rom and g_Disk Header/ID information in the save state to differenciate different combos --- Source/Project64-core/N64System/N64Class.cpp | 24 ++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) diff --git a/Source/Project64-core/N64System/N64Class.cpp b/Source/Project64-core/N64System/N64Class.cpp index cc9bf43ed..1c403561a 100644 --- a/Source/Project64-core/N64System/N64Class.cpp +++ b/Source/Project64-core/N64System/N64Class.cpp @@ -1750,9 +1750,15 @@ bool CN64System::SaveState() zipWriteInFileInZip(file, &SaveID_0, sizeof(SaveID_0)); zipWriteInFileInZip(file, &RdramSize, sizeof(uint32_t)); if (g_Settings->LoadBool(Setting_EnableDisk) && g_Disk) - zipWriteInFileInZip(file, g_Disk->GetDiskAddressID(), 0x40); + { + //Keep Base ROM Information (64DD IPL / Compatible Game ROM) + zipWriteInFileInZip(file, &g_Rom->GetRomAddress()[0x10], 0x20); + zipWriteInFileInZip(file, g_Disk->GetDiskAddressID(), 0x20); + } else + { zipWriteInFileInZip(file, g_Rom->GetRomAddress(), 0x40); + } zipWriteInFileInZip(file, &NextViTimer, sizeof(uint32_t)); zipWriteInFileInZip(file, &m_Reg.m_PROGRAM_COUNTER, sizeof(m_Reg.m_PROGRAM_COUNTER)); zipWriteInFileInZip(file, m_Reg.m_GPR, sizeof(int64_t) * 32); @@ -1814,9 +1820,15 @@ bool CN64System::SaveState() hSaveFile.Write(&SaveID_0, sizeof(uint32_t)); hSaveFile.Write(&RdramSize, sizeof(uint32_t)); if (g_Settings->LoadBool(Setting_EnableDisk) && g_Disk) - hSaveFile.Write(g_Disk->GetDiskAddressID(), 0x40); + { + //Keep Base ROM Information (64DD IPL / Compatible Game ROM) + hSaveFile.Write(&g_Rom->GetRomAddress()[0x10], 0x20); + hSaveFile.Write(g_Disk->GetDiskAddressID(), 0x20); + } else + { hSaveFile.Write(g_Rom->GetRomAddress(), 0x40); + } hSaveFile.Write(&NextViTimer, sizeof(uint32_t)); hSaveFile.Write(&m_Reg.m_PROGRAM_COUNTER, sizeof(m_Reg.m_PROGRAM_COUNTER)); hSaveFile.Write(m_Reg.m_GPR, sizeof(int64_t) * 32); @@ -1990,7 +2002,9 @@ bool CN64System::LoadState(const char * FileName) unzReadCurrentFile(file, LoadHeader, 0x40); if (g_Settings->LoadBool(Setting_EnableDisk) && g_Disk) { - if (memcmp(LoadHeader, g_Disk->GetDiskAddressID(), 0x40) != 0 && + //Base ROM Information (64DD IPL / Compatible Game ROM) & Disk Info Check + if (memcmp(LoadHeader, &g_Rom->GetRomAddress()[0x10], 0x20) != 0 && + memcmp(&LoadHeader[0x20], g_Disk->GetDiskAddressID(), 0x20) != 0 && !g_Notify->AskYesNoQuestion(g_Lang->GetString(MSG_SAVE_STATE_HEADER).c_str())) { return false; @@ -2083,7 +2097,9 @@ bool CN64System::LoadState(const char * FileName) hSaveFile.Read(LoadHeader, 0x40); if (g_Settings->LoadBool(Setting_EnableDisk) && g_Disk) { - if (memcmp(LoadHeader, g_Disk->GetDiskAddressID(), 0x40) != 0 && + //Base ROM Information (64DD IPL / Compatible Game ROM) & Disk Info Check + if (memcmp(LoadHeader, &g_Rom->GetRomAddress()[0x10], 0x20) != 0 && + memcmp(&LoadHeader[0x20], g_Disk->GetDiskAddressID(), 0x20) != 0 && !g_Notify->AskYesNoQuestion(g_Lang->GetString(MSG_SAVE_STATE_HEADER).c_str())) { return false; From 4205f989a42f2886fa72de59b34c89d39216b4d6 Mon Sep 17 00:00:00 2001 From: LuigiBlood Date: Fri, 19 Jun 2020 21:37:08 +0200 Subject: [PATCH 8/8] [Save State] Compare 64DD save state header more proper --- Source/Project64-core/N64System/N64Class.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Source/Project64-core/N64System/N64Class.cpp b/Source/Project64-core/N64System/N64Class.cpp index 1c403561a..2d5897637 100644 --- a/Source/Project64-core/N64System/N64Class.cpp +++ b/Source/Project64-core/N64System/N64Class.cpp @@ -2003,8 +2003,8 @@ bool CN64System::LoadState(const char * FileName) if (g_Settings->LoadBool(Setting_EnableDisk) && g_Disk) { //Base ROM Information (64DD IPL / Compatible Game ROM) & Disk Info Check - if (memcmp(LoadHeader, &g_Rom->GetRomAddress()[0x10], 0x20) != 0 && - memcmp(&LoadHeader[0x20], g_Disk->GetDiskAddressID(), 0x20) != 0 && + if ((memcmp(LoadHeader, &g_Rom->GetRomAddress()[0x10], 0x20) != 0 || + memcmp(&LoadHeader[0x20], g_Disk->GetDiskAddressID(), 0x20) != 0) && !g_Notify->AskYesNoQuestion(g_Lang->GetString(MSG_SAVE_STATE_HEADER).c_str())) { return false; @@ -2098,8 +2098,8 @@ bool CN64System::LoadState(const char * FileName) if (g_Settings->LoadBool(Setting_EnableDisk) && g_Disk) { //Base ROM Information (64DD IPL / Compatible Game ROM) & Disk Info Check - if (memcmp(LoadHeader, &g_Rom->GetRomAddress()[0x10], 0x20) != 0 && - memcmp(&LoadHeader[0x20], g_Disk->GetDiskAddressID(), 0x20) != 0 && + if ((memcmp(LoadHeader, &g_Rom->GetRomAddress()[0x10], 0x20) != 0 || + memcmp(&LoadHeader[0x20], g_Disk->GetDiskAddressID(), 0x20) != 0) && !g_Notify->AskYesNoQuestion(g_Lang->GetString(MSG_SAVE_STATE_HEADER).c_str())) { return false;