From bf7002672891adb3712a028472e28511028c569b Mon Sep 17 00:00:00 2001 From: Pokechu22 Date: Mon, 20 Jun 2022 12:37:58 -0700 Subject: [PATCH] DSPHLE: Require implementing DoState CARDUCode, GBAUCode, and INITUCode previously didn't have an implementation of it. In practice it's unlikely that this caused an issue, since these uCodes are only active for a few frames at most, but now that GBAUCode doesn't have global state, we can implement it there. I also implemented it for CARDUCode, although our CARDUCode implementation does not have all states handled yet - this is simply future-proofing so that when the card uCode is properly implemented, the save state version does not need to be bumped. INITUCode does not have any state to save, though. --- Source/Core/Core/HW/DSPHLE/UCodes/CARD.cpp | 7 +++++++ Source/Core/Core/HW/DSPHLE/UCodes/CARD.h | 12 ++++++++++++ Source/Core/Core/HW/DSPHLE/UCodes/GBA.cpp | 7 +++++++ Source/Core/Core/HW/DSPHLE/UCodes/GBA.h | 1 + Source/Core/Core/HW/DSPHLE/UCodes/INIT.cpp | 5 +++++ Source/Core/Core/HW/DSPHLE/UCodes/INIT.h | 1 + Source/Core/Core/HW/DSPHLE/UCodes/UCodes.h | 2 +- Source/Core/Core/State.cpp | 2 +- 8 files changed, 35 insertions(+), 2 deletions(-) diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/CARD.cpp b/Source/Core/Core/HW/DSPHLE/UCodes/CARD.cpp index 4ad47757f8..43d145f75e 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/CARD.cpp +++ b/Source/Core/Core/HW/DSPHLE/UCodes/CARD.cpp @@ -3,6 +3,7 @@ #include "Core/HW/DSPHLE/UCodes/CARD.h" +#include "Common/ChunkFile.h" #include "Common/CommonTypes.h" #include "Common/Logging/Log.h" #include "Core/HW/DSP.h" @@ -44,4 +45,10 @@ void CARDUCode::HandleMail(u32 mail) m_mail_handler.PushMail(DSP_DONE); m_dsphle->SetUCode(UCODE_ROM); } + +void CARDUCode::DoState(PointerWrap& p) +{ + DoStateShared(p); + p.Do(m_state); +} } // namespace DSP::HLE diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/CARD.h b/Source/Core/Core/HW/DSPHLE/UCodes/CARD.h index 4a071c4e29..f1790b98d4 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/CARD.h +++ b/Source/Core/Core/HW/DSPHLE/UCodes/CARD.h @@ -18,5 +18,17 @@ public: void Initialize() override; void HandleMail(u32 mail) override; void Update() override; + void DoState(PointerWrap& p) override; + +private: + enum class State + { + WaitingForRequest, + WaitingForAddress, + WaitingForNextTask, + }; + + // Currently unused, will be used in a later version + State m_state = State::WaitingForRequest; }; } // namespace DSP::HLE diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/GBA.cpp b/Source/Core/Core/HW/DSPHLE/UCodes/GBA.cpp index 767aeda2ba..6c1a46cadc 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/GBA.cpp +++ b/Source/Core/Core/HW/DSPHLE/UCodes/GBA.cpp @@ -4,6 +4,7 @@ #include "Core/HW/DSPHLE/UCodes/GBA.h" #include "Common/Align.h" +#include "Common/ChunkFile.h" #include "Common/CommonTypes.h" #include "Common/Logging/Log.h" #include "Core/HW/DSP.h" @@ -142,4 +143,10 @@ void GBAUCode::HandleMail(u32 mail) } } } + +void GBAUCode::DoState(PointerWrap& p) +{ + DoStateShared(p); + p.Do(m_mail_state); +} } // namespace DSP::HLE diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/GBA.h b/Source/Core/Core/HW/DSPHLE/UCodes/GBA.h index 842797ad72..a2cf96869a 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/GBA.h +++ b/Source/Core/Core/HW/DSPHLE/UCodes/GBA.h @@ -23,6 +23,7 @@ public: void Initialize() override; void HandleMail(u32 mail) override; void Update() override; + void DoState(PointerWrap& p) override; private: static constexpr u32 REQUEST_MAIL = 0xabba0000; diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/INIT.cpp b/Source/Core/Core/HW/DSPHLE/UCodes/INIT.cpp index 7869460bc1..cf5204df1c 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/INIT.cpp +++ b/Source/Core/Core/HW/DSPHLE/UCodes/INIT.cpp @@ -28,4 +28,9 @@ void INITUCode::Update() void INITUCode::HandleMail(u32 mail) { } + +void INITUCode::DoState(PointerWrap& p) +{ + // We don't need to call DoStateShared() as the init uCode doesn't support launching new uCode +} } // namespace DSP::HLE diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/INIT.h b/Source/Core/Core/HW/DSPHLE/UCodes/INIT.h index 9ea8a4174e..fb1bd7860d 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/INIT.h +++ b/Source/Core/Core/HW/DSPHLE/UCodes/INIT.h @@ -18,5 +18,6 @@ public: void Initialize() override; void HandleMail(u32 mail) override; void Update() override; + void DoState(PointerWrap& p) override; }; } // namespace DSP::HLE diff --git a/Source/Core/Core/HW/DSPHLE/UCodes/UCodes.h b/Source/Core/Core/HW/DSPHLE/UCodes/UCodes.h index 408c1e1239..029713ca60 100644 --- a/Source/Core/Core/HW/DSPHLE/UCodes/UCodes.h +++ b/Source/Core/Core/HW/DSPHLE/UCodes/UCodes.h @@ -46,7 +46,7 @@ public: virtual void HandleMail(u32 mail) = 0; virtual void Update() = 0; - virtual void DoState(PointerWrap& p) { DoStateShared(p); } + virtual void DoState(PointerWrap& p) = 0; static u32 GetCRC(UCodeInterface* ucode) { return ucode ? ucode->m_crc : UCODE_NULL; } protected: diff --git a/Source/Core/Core/State.cpp b/Source/Core/Core/State.cpp index c7c2aee8dd..d4abf52bcd 100644 --- a/Source/Core/Core/State.cpp +++ b/Source/Core/Core/State.cpp @@ -74,7 +74,7 @@ static std::recursive_mutex g_save_thread_mutex; static std::thread g_save_thread; // Don't forget to increase this after doing changes on the savestate system -constexpr u32 STATE_VERSION = 147; // Last changed in PR 10935 +constexpr u32 STATE_VERSION = 148; // Last changed in PR 10768 // Maps savestate versions to Dolphin versions. // Versions after 42 don't need to be added to this list,