From 9fc608aa349faa6b4e839f151fbb9cf165e25b25 Mon Sep 17 00:00:00 2001 From: Connor McLaughlin Date: Mon, 30 Sep 2019 01:59:35 +1000 Subject: [PATCH] MemoryCard: Save state support --- src/pse/memory_card.cpp | 18 ++++++++++++++++++ src/pse/memory_card.h | 3 +++ src/pse/pad.cpp | 25 +++++++++++++++++++++++++ src/pse/pad_device.cpp | 8 ++++++++ src/pse/pad_device.h | 5 +++++ 5 files changed, 59 insertions(+) diff --git a/src/pse/memory_card.cpp b/src/pse/memory_card.cpp index 790a890eb..fa3dc8e3e 100644 --- a/src/pse/memory_card.cpp +++ b/src/pse/memory_card.cpp @@ -1,5 +1,6 @@ #include "memory_card.h" #include "YBaseLib/Log.h" +#include "common/state_wrapper.h" Log_SetChannel(MemoryCard); MemoryCard::MemoryCard() @@ -10,6 +11,23 @@ MemoryCard::MemoryCard() MemoryCard::~MemoryCard() = default; +void MemoryCard::Reset() +{ + ResetTransferState(); +} + +bool MemoryCard::DoState(StateWrapper& sw) +{ + sw.Do(&m_state); + sw.Do(&m_address); + sw.Do(&m_sector_offset); + sw.Do(&m_checksum); + sw.Do(&m_last_byte); + sw.Do(&m_data); + + return !sw.HasError(); +} + void MemoryCard::ResetTransferState() { m_state = State::Idle; diff --git a/src/pse/memory_card.h b/src/pse/memory_card.h index 2c32e9dd2..a8306bc80 100644 --- a/src/pse/memory_card.h +++ b/src/pse/memory_card.h @@ -19,6 +19,9 @@ public: static std::shared_ptr Create(); + void Reset() override; + bool DoState(StateWrapper& sw) override; + void ResetTransferState() override; bool Transfer(const u8 data_in, u8* data_out) override; diff --git a/src/pse/pad.cpp b/src/pse/pad.cpp index beea457e0..42e692c68 100644 --- a/src/pse/pad.cpp +++ b/src/pse/pad.cpp @@ -20,10 +20,34 @@ bool Pad::Initialize(System* system, InterruptController* interrupt_controller) void Pad::Reset() { SoftReset(); + + for (u32 i = 0; i < NUM_SLOTS; i++) + { + if (m_controllers[i]) + m_controllers[i]->Reset(); + + if (m_memory_cards[i]) + m_memory_cards[i]->Reset(); + } } bool Pad::DoState(StateWrapper& sw) { + for (u32 i = 0; i < NUM_SLOTS; i++) + { + if (m_controllers[i]) + { + if (!sw.DoMarker("Controller") || !m_controllers[i]->DoState(sw)) + continue; + } + + if (m_memory_cards[i]) + { + if (!sw.DoMarker("MemortCard") || !m_memory_cards[i]->DoState(sw)) + continue; + } + } + sw.Do(&m_state); sw.Do(&m_ticks_remaining); sw.Do(&m_JOY_CTRL.bits); @@ -172,6 +196,7 @@ void Pad::SoftReset() m_JOY_MODE.bits = 0; m_RX_FIFO.Clear(); m_TX_FIFO.Clear(); + ResetDeviceTransferState(); UpdateJoyStat(); } diff --git a/src/pse/pad_device.cpp b/src/pse/pad_device.cpp index 5f114ebad..3e4c9818f 100644 --- a/src/pse/pad_device.cpp +++ b/src/pse/pad_device.cpp @@ -1,9 +1,17 @@ #include "pad_device.h" +#include "common/state_wrapper.h" PadDevice::PadDevice() = default; PadDevice::~PadDevice() = default; +void PadDevice::Reset() {} + +bool PadDevice::DoState(StateWrapper& sw) +{ + return !sw.HasError(); +} + void PadDevice::ResetTransferState() {} bool PadDevice::Transfer(const u8 data_in, u8* data_out) diff --git a/src/pse/pad_device.h b/src/pse/pad_device.h index e3fa55e43..61b41399b 100644 --- a/src/pse/pad_device.h +++ b/src/pse/pad_device.h @@ -1,12 +1,17 @@ #pragma once #include "types.h" +class StateWrapper; + class PadDevice { public: PadDevice(); virtual ~PadDevice(); + virtual void Reset(); + virtual bool DoState(StateWrapper& sw); + // Resets all state for the transferring to/from the device. virtual void ResetTransferState();