From bc03a06335afcbba21bdb4a62140443367cf45f2 Mon Sep 17 00:00:00 2001 From: profi200 Date: Sun, 14 Jun 2020 03:04:41 +0200 Subject: [PATCH] Save handling bug fixes. --- source/arm11/hardware/lgy.c | 137 +++++++++++++++--------------------- source/arm9/hardware/lgy.c | 5 +- 2 files changed, 60 insertions(+), 82 deletions(-) diff --git a/source/arm11/hardware/lgy.c b/source/arm11/hardware/lgy.c index 3bbde07..2e3e6a3 100644 --- a/source/arm11/hardware/lgy.c +++ b/source/arm11/hardware/lgy.c @@ -70,105 +70,80 @@ static Result loadRom(const char *const path, u32 *const rsOut) return res; } -// Code based on: https://github.com/Gericom/GBARunner2/blob/master/arm9/source/save/Save.vram.cpp static u16 tryDetectSaveType(u32 romSize) { #ifndef NDEBUG ee_puts("Trying to detect save type..."); #endif - u8 saveChipKind = 0; // 0 = none, 1 = EEPROM, 2 = Flash, 3 = SRAM. + u16 saveType = SAVE_TYPE_NONE; const u32 *romPtr = (u32*)(ROM_LOC + 0xE4u); // Skip headers. for(; romPtr < (u32*)(ROM_LOC + romSize); romPtr++) { u32 tmp = *romPtr; - // "EEPR" - if(tmp == 0x52504545u) + // "EEPR" "FLAS" "SRAM" + if(tmp == 0x52504545u || tmp == 0x53414C46u || tmp == 0x4D415253u) { - saveChipKind = 1; - break; - } - - // "FLAS" - if(tmp == 0x53414C46u) - { - saveChipKind = 2; - break; - } - - // "SRAM" - if(tmp == 0x4D415253u) - { - saveChipKind = 3; - break; - } - } - - if(saveChipKind != 0) - { - static const struct - { - char *str; - u16 saveType; - } saveTypeLut[25] = - { - // EEPROM - // TODO: Which ones are SAVE_TYPE_EEPROM_64k_2? - {"EEPROM_V111", SAVE_TYPE_EEPROM_8k}, // 512 bytes. - {"EEPROM_V120", SAVE_TYPE_EEPROM_64k}, - {"EEPROM_V121", SAVE_TYPE_EEPROM_64k}, - {"EEPROM_V122", SAVE_TYPE_EEPROM_64k}, - {"EEPROM_V124", SAVE_TYPE_EEPROM_64k}, - {"EEPROM_V125", SAVE_TYPE_EEPROM_64k}, - {"EEPROM_V126", SAVE_TYPE_EEPROM_64k}, - - // FLASH - // Assume they all have RTC. - {"FLASH_V120", SAVE_TYPE_FLASH_512k_PSC_RTC}, - {"FLASH_V121", SAVE_TYPE_FLASH_512k_PSC_RTC}, - {"FLASH_V123", SAVE_TYPE_FLASH_512k_PSC_RTC}, - {"FLASH_V124", SAVE_TYPE_FLASH_512k_PSC_RTC}, - {"FLASH_V125", SAVE_TYPE_FLASH_512k_PSC_RTC}, - {"FLASH_V126", SAVE_TYPE_FLASH_512k_PSC_RTC}, - {"FLASH512_V130", SAVE_TYPE_FLASH_512k_PSC_RTC}, - {"FLASH512_V131", SAVE_TYPE_FLASH_512k_PSC_RTC}, - {"FLASH512_V133", SAVE_TYPE_FLASH_512k_PSC_RTC}, - {"FLASH1M_V102", SAVE_TYPE_FLASH_1m_MRX_RTC}, - {"FLASH1M_V103", SAVE_TYPE_FLASH_1m_MRX_RTC}, - - // FRAM & SRAM - {"SRAM_F_V100", SAVE_TYPE_SRAM_256k}, - {"SRAM_F_V102", SAVE_TYPE_SRAM_256k}, - {"SRAM_F_V103", SAVE_TYPE_SRAM_256k}, - - {"SRAM_V110", SAVE_TYPE_SRAM_256k}, - {"SRAM_V111", SAVE_TYPE_SRAM_256k}, - {"SRAM_V112", SAVE_TYPE_SRAM_256k}, - {"SRAM_V113", SAVE_TYPE_SRAM_256k} - }; - - for(u32 i = 0; i < 25; i++) - { - const char *const str = saveTypeLut[i].str; - const u16 saveType = saveTypeLut[i].saveType; - - if(memcmp(romPtr, str, strlen(str)) == 0) + static const struct { + char *str; + u16 saveType; + } saveTypeLut[25] = + { + // EEPROM + // TODO: Which ones are SAVE_TYPE_EEPROM_64k_2? + {"EEPROM_V111", SAVE_TYPE_EEPROM_8k}, // 512 bytes. + {"EEPROM_V120", SAVE_TYPE_EEPROM_64k}, + {"EEPROM_V121", SAVE_TYPE_EEPROM_64k}, + {"EEPROM_V122", SAVE_TYPE_EEPROM_64k}, // Confirmed. + {"EEPROM_V124", SAVE_TYPE_EEPROM_64k}, // Confirmed. + {"EEPROM_V125", SAVE_TYPE_EEPROM_64k}, + {"EEPROM_V126", SAVE_TYPE_EEPROM_64k}, + + // FLASH + // Assume they all have RTC. + {"FLASH_V120", SAVE_TYPE_FLASH_512k_PSC_RTC}, + {"FLASH_V121", SAVE_TYPE_FLASH_512k_PSC_RTC}, + {"FLASH_V123", SAVE_TYPE_FLASH_512k_PSC_RTC}, + {"FLASH_V124", SAVE_TYPE_FLASH_512k_PSC_RTC}, + {"FLASH_V125", SAVE_TYPE_FLASH_512k_PSC_RTC}, + {"FLASH_V126", SAVE_TYPE_FLASH_512k_PSC_RTC}, + {"FLASH512_V130", SAVE_TYPE_FLASH_512k_PSC_RTC}, + {"FLASH512_V131", SAVE_TYPE_FLASH_512k_PSC_RTC}, + {"FLASH512_V133", SAVE_TYPE_FLASH_512k_PSC_RTC}, + {"FLASH1M_V102", SAVE_TYPE_FLASH_1m_MRX_RTC}, + {"FLASH1M_V103", SAVE_TYPE_FLASH_1m_MRX_RTC}, + + // FRAM & SRAM + {"SRAM_F_V100", SAVE_TYPE_SRAM_256k}, + {"SRAM_F_V102", SAVE_TYPE_SRAM_256k}, + {"SRAM_F_V103", SAVE_TYPE_SRAM_256k}, + + {"SRAM_V110", SAVE_TYPE_SRAM_256k}, + {"SRAM_V111", SAVE_TYPE_SRAM_256k}, + {"SRAM_V112", SAVE_TYPE_SRAM_256k}, + {"SRAM_V113", SAVE_TYPE_SRAM_256k} + }; + + for(u32 i = 0; i < 25; i++) + { + const char *const str = saveTypeLut[i].str; + const u16 tmpSaveType = saveTypeLut[i].saveType; + + if(memcmp(romPtr, str, strlen(str)) == 0) + { #ifndef NDEBUG - ee_printf("Found save type %s.", str); + ee_printf("Found save type %s.", str); #endif - return saveType; + saveType = tmpSaveType; + break; + } } } } - else - { -#ifndef NDEBUG - ee_puts("Could not identify save type. Using none."); -#endif - return SAVE_TYPE_NONE; - } + + return saveType; } static void setupFcramForGbaMode(void) diff --git a/source/arm9/hardware/lgy.c b/source/arm9/hardware/lgy.c index 2a5c657..1625280 100644 --- a/source/arm9/hardware/lgy.c +++ b/source/arm9/hardware/lgy.c @@ -79,6 +79,7 @@ Result LGY_prepareGbaMode(bool gbaBios, u16 saveType, const char *const savePath setupBiosOverlay(gbaBios); setupSaveType(saveType); + strncpy_s(g_savePath, savePath, 255, 256); Result res = RES_OK; if(g_saveSize != 0) @@ -93,7 +94,6 @@ Result LGY_prepareGbaMode(bool gbaBios, u16 saveType, const char *const savePath if(res == RES_OK) { sha((u32*)SAVE_LOC, g_saveSize, g_saveHash, SHA_INPUT_BIG | SHA_MODE_256, SHA_OUTPUT_BIG); - strncpy_s(g_savePath, savePath, 255, 256); } } else NDMA_fill((u32*)SAVE_LOC, 0xFFFFFFFFu, g_saveSize); @@ -149,6 +149,9 @@ Result LGY_backupGbaSave(void) sha((u32*)SAVE_LOC, g_saveSize, newHash, SHA_INPUT_BIG | SHA_MODE_256, SHA_OUTPUT_BIG); if(memcmp(g_saveHash, newHash, 32) != 0) // Backup save if changed. { + // Update hash. + memcpy(g_saveHash, newHash, 32); + FHandle f; if((res = fOpen(&f, g_savePath, FA_OPEN_ALWAYS | FA_WRITE)) == RES_OK) {