Corrected EEPROM save type size.

While the hardware supports 8k all games just use 4k.
This commit is contained in:
profi200 2020-07-15 20:24:38 +02:00
parent 1882ba8f06
commit 0f46383f02
No known key found for this signature in database
GPG Key ID: 17B42AE5911139F3
1 changed files with 17 additions and 10 deletions

View File

@ -56,11 +56,15 @@ static void setupBiosOverlay(bool biosIntro)
if(biosIntro) *((u8*)_arm7_stub_swi) = 0x26;
}
static void setupSaveType(u16 saveType)
static u32 setupSaveType(u16 saveType)
{
REG_LGY_GBA_SAVE_TYPE = saveType;
static const u8 saveSizeLut[16] = {1, 1, 8, 8, 64, 64, 64, 64, 64, 64, 128, 128, 128, 128, 32, 0};
g_saveSize = 1024u * saveSizeLut[saveType & 0xFu];
// The last shift in the table is technically undefined behavior (C standard)
// but on ARM this will always result in 0.
// https://developer.arm.com/documentation/dui0489/h/arm-and-thumb-instructions/shift-operations
static const u8 saveSizeShiftLut[16] = {9, 9, 13, 13, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 15, 32};
const u32 saveSize = 1u<<saveSizeShiftLut[saveType & 0xFu];
g_saveSize = saveSize;
// Flash chip erase, flash sector erase, flash program, EEPROM write.
static const u32 saveTm512k4k[4] = {0x27C886, 0x8CE35, 0x184, 0x31170}; // Timing 512k/4k.
@ -74,6 +78,8 @@ static void setupSaveType(u16 saveType)
}
else saveTm = saveTm1m64k; // Don't care about save type none.
iomemcpy(REGs_LGY_GBA_SAVE_TIMING, saveTm, 16);
return saveSize;
}
Result LGY_prepareGbaMode(bool biosIntro, u16 saveType, const char *const savePath)
@ -81,21 +87,21 @@ Result LGY_prepareGbaMode(bool biosIntro, u16 saveType, const char *const savePa
REG_LGY_MODE = LGY_MODE_AGB;
setupBiosOverlay(biosIntro);
setupSaveType(saveType);
const u32 saveSize = setupSaveType(saveType);
strncpy_s(g_savePath, savePath, 511, 512);
Result res = RES_OK;
if(g_saveSize != 0)
if(saveSize != 0)
{
res = fsQuickRead((void*)SAVE_LOC, savePath, MAX_SAVE_SIZE);
if(res == RES_FR_NO_FILE)
{
res = RES_OK; // Ignore a missing save file.
NDMA_fill((u32*)SAVE_LOC, 0xFFFFFFFFu, g_saveSize);
NDMA_fill((u32*)SAVE_LOC, 0xFFFFFFFFu, saveSize);
}
// Hash the savegame so it's only backed up when changed.
sha((u32*)SAVE_LOC, g_saveSize, g_saveHash, SHA_INPUT_BIG | SHA_MODE_256, SHA_OUTPUT_BIG);
sha((u32*)SAVE_LOC, saveSize, g_saveHash, SHA_INPUT_BIG | SHA_MODE_256, SHA_OUTPUT_BIG);
}
return res;
@ -150,19 +156,20 @@ void LGY_gbaReset(void)
Result LGY_backupGbaSave(void)
{
Result res = RES_OK;
if(g_saveSize != 0)
const u32 saveSize = g_saveSize;
if(saveSize != 0)
{
// Enable savegame mem region.
REG_LGY_GBA_SAVE_MAP = LGY_SAVE_MAP_9;
u32 newHash[8];
sha((u32*)SAVE_LOC, g_saveSize, newHash, SHA_INPUT_BIG | SHA_MODE_256, SHA_OUTPUT_BIG);
sha((u32*)SAVE_LOC, 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);
res = fsQuickWrite((void*)SAVE_LOC, g_savePath, g_saveSize);
res = fsQuickWrite((void*)SAVE_LOC, g_savePath, saveSize);
}
// Disable savegame mem region.