mx sram: fix checksum calc; use Common::BigEndianValue for rtc field.

This commit is contained in:
Shawn Hoffman 2018-09-30 17:58:37 -07:00
parent cd29cdb584
commit 2cd96aa5bb
3 changed files with 12 additions and 10 deletions

View File

@ -127,7 +127,7 @@ CEXIIPL::CEXIIPL()
} }
// Clear RTC // Clear RTC
memset(g_SRAM.rtc, 0, sizeof(g_SRAM.rtc)); g_SRAM.rtc = 0;
// We Overwrite language selection here since it's possible on the GC to change the language as // We Overwrite language selection here since it's possible on the GC to change the language as
// you please // you please
@ -250,8 +250,7 @@ void CEXIIPL::SetCS(int cs)
void CEXIIPL::UpdateRTC() void CEXIIPL::UpdateRTC()
{ {
const u32 rtc = Common::swap32(GetEmulatedTime(GC_EPOCH)); g_SRAM.rtc = GetEmulatedTime(GC_EPOCH);
std::memcpy(g_SRAM.rtc, &rtc, sizeof(u32));
} }
bool CEXIIPL::IsPresent() const bool CEXIIPL::IsPresent() const

View File

@ -78,14 +78,16 @@ void SetCardFlashID(const u8* buffer, u8 card_index)
void FixSRAMChecksums() void FixSRAMChecksums()
{ {
// 16bit big-endian additive checksum
u16 checksum = 0; u16 checksum = 0;
u16 checksum_inv = 0; u16 checksum_inv = 0;
for (auto p = reinterpret_cast<u16*>(&g_SRAM.settings.rtc_bias); for (auto p = reinterpret_cast<u16*>(&g_SRAM.settings.rtc_bias);
p != reinterpret_cast<u16*>(&g_SRAM.settings_ex); p++) p != reinterpret_cast<u16*>(&g_SRAM.settings_ex); p++)
{ {
checksum += *p; u16 value = Common::FromBigEndian(*p);
checksum_inv += ~*p; checksum += value;
checksum_inv += ~value;
} }
g_SRAM.settings.checksum = Common::swap16(checksum); g_SRAM.settings.checksum = checksum;
g_SRAM.settings.checksum_inv = Common::swap16(checksum_inv); g_SRAM.settings.checksum_inv = checksum_inv;
} }

View File

@ -36,6 +36,7 @@ distribution.
#include <array> #include <array>
#include "Common/CommonTypes.h" #include "Common/CommonTypes.h"
#include "Common/Swap.h"
using CardFlashId = std::array<u8, 12>; using CardFlashId = std::array<u8, 12>;
@ -79,8 +80,8 @@ struct SramFlags
struct SramSettings struct SramSettings
{ {
// checksum covers [rtc_bias, flags] // checksum covers [rtc_bias, flags]
u16 checksum; Common::BigEndianValue<u16> checksum;
u16 checksum_inv; Common::BigEndianValue<u16> checksum_inv;
// Unknown attributes // Unknown attributes
u32 ead0; u32 ead0;
@ -119,7 +120,7 @@ union Sram
u8 raw[0x44]; u8 raw[0x44];
struct struct
{ {
u8 rtc[4]; Common::BigEndianValue<u32> rtc;
SramSettings settings; SramSettings settings;
SramSettingsEx settings_ex; SramSettingsEx settings_ex;
}; };