diff --git a/Source/Core/Core/HW/EXI_DeviceIPL.cpp b/Source/Core/Core/HW/EXI_DeviceIPL.cpp index 1a15b7de2a..fe6e00ccba 100644 --- a/Source/Core/Core/HW/EXI_DeviceIPL.cpp +++ b/Source/Core/Core/HW/EXI_DeviceIPL.cpp @@ -116,6 +116,7 @@ CEXIIPL::CEXIIPL() : // We Overwrite language selection here since it's possible on the GC to change the language as you please g_SRAM.lang = SConfig::GetInstance().m_LocalCoreStartupParameter.SelectedLanguage; + FixSRAMChecksums(); WriteProtectMemory(m_pIPL, ROM_SIZE); m_uAddress = 0; diff --git a/Source/Core/Core/HW/Sram.cpp b/Source/Core/Core/HW/Sram.cpp index 7290819f5c..4cfb1d0282 100644 --- a/Source/Core/Core/HW/Sram.cpp +++ b/Source/Core/Core/HW/Sram.cpp @@ -89,3 +89,16 @@ void SetCardFlashID(u8* buffer, u8 card_index) g_SRAM.flashID_chksum[card_index] = csum^0xFF; } +void FixSRAMChecksums() +{ + u16 checksum = 0; + u16 checksum_inv = 0; + for (int i = 0x0C; i < 0x14; i += 2) + { + int value = (g_SRAM.p_SRAM[i] << 8) + g_SRAM.p_SRAM[i+1]; + checksum += value; + checksum_inv += value ^ 0xFFFF; + } + g_SRAM.checksum = Common::swap16(checksum); + g_SRAM.checksum_inv = Common::swap16(checksum_inv); +} diff --git a/Source/Core/Core/HW/Sram.h b/Source/Core/Core/HW/Sram.h index b2bb6e96ff..e0f8d68f94 100644 --- a/Source/Core/Core/HW/Sram.h +++ b/Source/Core/Core/HW/Sram.h @@ -66,6 +66,7 @@ union SRAM #pragma pack(pop) void InitSRAM(); void SetCardFlashID(u8* buffer, u8 card_index); +void FixSRAMChecksums(); extern SRAM sram_dump; extern SRAM g_SRAM;