From 45205c3a5655922b1fa23fe58bdf767e7cba2a71 Mon Sep 17 00:00:00 2001 From: Pokechu22 Date: Fri, 21 Aug 2020 19:20:02 -0700 Subject: [PATCH] Reply -- make it to the next part at least --- Source/Core/Core/HW/EXI/EXI_DeviceSD.cpp | 15 ++++++++++++- Source/Core/Core/HW/EXI/EXI_DeviceSD.h | 27 +++++++++++++++++++++++- 2 files changed, 40 insertions(+), 2 deletions(-) diff --git a/Source/Core/Core/HW/EXI/EXI_DeviceSD.cpp b/Source/Core/Core/HW/EXI/EXI_DeviceSD.cpp index 40a9accdaf..0e2a50e2e1 100644 --- a/Source/Core/Core/HW/EXI/EXI_DeviceSD.cpp +++ b/Source/Core/Core/HW/EXI/EXI_DeviceSD.cpp @@ -44,10 +44,18 @@ u32 CEXISD::ImmRead(u32 size) } else { - return IEXIDevice::ImmRead(size); + u32 res = IEXIDevice::ImmRead(size); + INFO_LOG_FMT(EXPANSIONINTERFACE, "Responding with {:08x}", res); + return res; } } +void CEXISD::ImmReadWrite(u32& data, u32 size) +{ + ImmWrite(data, size); + data = ImmRead(size); +} + void CEXISD::SetCS(int cs) { INFO_LOG_FMT(EXPANSIONINTERFACE, "EXI SD SetCS: {}", cs); @@ -64,6 +72,7 @@ void CEXISD::DoState(PointerWrap& p) p.Do(get_id); p.Do(m_uPosition); p.DoArray(cmd); + p.Do(result); } void CEXISD::TransferByte(u8& byte) @@ -95,7 +104,11 @@ void CEXISD::TransferByte(u8& byte) // TODO: Check CRC INFO_LOG_FMT(EXPANSIONINTERFACE, "EXI SD command received: {:02x}", fmt::join(cmd.begin(), cmd.end(), " ")); + + result = R1::InIdleState; } } + + byte = static_cast(result); } } // namespace ExpansionInterface diff --git a/Source/Core/Core/HW/EXI/EXI_DeviceSD.h b/Source/Core/Core/HW/EXI/EXI_DeviceSD.h index 4fe3a8a544..78ead73cb2 100644 --- a/Source/Core/Core/HW/EXI/EXI_DeviceSD.h +++ b/Source/Core/Core/HW/EXI/EXI_DeviceSD.h @@ -22,6 +22,7 @@ public: void ImmWrite(u32 data, u32 size) override; u32 ImmRead(u32 size) override; + void ImmReadWrite(u32& data, u32 size) override; void SetCS(int cs) override; bool IsPresent() const override; @@ -30,10 +31,34 @@ public: private: void TransferByte(u8& byte) override; + enum class R1 + { + InIdleState = 1 << 0, + EraseRequest = 1 << 1, + IllegalCommand = 1 << 2, + CommunicationCRCError = 1 << 3, + EraseSequenceError = 1 << 4, + AddressError = 1 << 5, + ParameterError = 1 << 6, + // Top bit 0 + }; + enum class R2 + { + CardIsLocked = 1 << 0, + WriteProtectEraseSkip = 1 << 1, // or lock/unlock command failed + Error = 1 << 2, + CardControllerError = 1 << 3, + CardEccFailed = 1 << 4, + WriteProtectViolation = 1 << 5, + EraseParam = 1 << 6, + // OUT_OF_RANGE_OR_CSD_OVERWRITE, not documented in text? + }; + // STATE_TO_SAVE bool inited = false; bool get_id = false; u32 m_uPosition = 0; - std::array cmd; + std::array cmd = {}; + R1 result = static_cast(0); }; } // namespace ExpansionInterface