diff --git a/include/arm11/gba_save_type_table.h b/include/arm11/gba_save_type_table.h new file mode 100644 index 0000000..090871c --- /dev/null +++ b/include/arm11/gba_save_type_table.h @@ -0,0 +1,37 @@ +#pragma once + +#include "types.h" + + +typedef struct +{ + char gameCode[3]; // Without the region letter. + u8 type; +} SaveTypeLut; +static_assert(offsetof(SaveTypeLut, type) == 3, "Error: Member type of SaveTypeLut is not at offset 3!"); + + +/* + * 0x0 = EEPROM 4k/8k (512/1024 bytes) + * 0x2 = EEPROM 64k (8 KiB) + * 0x4 = Flash 512k (64 KiB) with RTC, ID=0x3D1F, Atmel + * 0x5 = Flash 512k (64 KiB) without RTC, ID=0x3D1F, Atmel + * 0x6 = Flash 512k (64 KiB) with RTC, ID=0xD4BF, SST + * 0x7 = Flash 512k (64 KiB) without RTC, ID=0xD4BF, SST + * 0x8 = Flash 512k (64 KiB) with RTC, ID=0x1B32, Panasonic + * 0x9 = Flash 512k (64 KiB) without RTC, ID=0x1B32, Panasonic + * 0xA = Flash 1M (128 KiB) with RTC, ID=0x09C2, Macronix + * 0xB = Flash 1M (128 KiB) without RTC, ID=0x09C2, Macronix + * 0xC = Flash 1M (128 KiB) with RTC, ID=0x1362, Sanyo + * 0xD = Flash 1M (128 KiB) without RTC, ID=0x1362, Sanyo + * 0xE = SRAM/FRAM/FeRAM 256k (32 KiB) + * 0xF = No save chip + */ + +// TODO: Decide how each entry should look like. +alignas(4) static const SaveTypeLut saveTypeLut[] = +{ + {"AMA", 0x0}, // EEPROM_V120 Super Mario Advance + {"AA2", 0x2}, // EEPROM_V122 Super Mario Advance 2 - Super Mario World + {"A3A", 0x2}, // EEPROM_V122 Super Mario Advance 3 - Yoshi's Island +}; diff --git a/source/arm11/hardware/lgy.c b/source/arm11/hardware/lgy.c index 282fc69..d1de57c 100644 --- a/source/arm11/hardware/lgy.c +++ b/source/arm11/hardware/lgy.c @@ -11,6 +11,7 @@ #include "arm11/hardware/mcu.h" #include "arm11/hardware/lgyfb.h" #include "arm11/fmt.h" +//#include "arm11/gba_save_type_table.h" #define LGY_REGS_BASE (IO_MEM_ARM9_ARM11 + 0x41100) @@ -187,6 +188,33 @@ saveTypeFound: return saveType; } +/*static u16 getSaveTypeFromTable(u32 romSize) +{ + const u32 gameCode = *(u32*)(ROM_LOC + 0xAC); + + u16 saveType = SAVE_TYPE_NONE; + for(u32 i = 0; i < sizeof(saveTypeLut) / sizeof(*saveTypeLut); i++) + { + // Save type in last byte. + const u32 entry = *((u32*)saveTypeLut[i].gameCode); + if((entry & 0xFFFFFFu) == (gameCode & 0xFFFFFFu)) + { + saveType = entry>>24; + break; + } + } + + if(saveType == SAVE_TYPE_EEPROM_8k || saveType == SAVE_TYPE_EEPROM_64k) + { + // If ROM bigger than 16 MiB --> SAVE_TYPE_EEPROM_8k_2 or SAVE_TYPE_EEPROM_64k_2. + if(romSize > 0x1000000) saveType++; + } + + debug_printf("Using save type %" PRIX16 ".\n", saveType); + + return saveType; +}*/ + static void setupFcramForGbaMode(void) { // FCRAM reset and clock disable. @@ -208,6 +236,7 @@ Result LGY_prepareGbaMode(bool biosIntro, char *const romPath) // Try to detect the save type. const u16 saveType = tryDetectSaveType(romSize); + //const u16 saveType = getSaveTypeFromTable(romSize); // Prepare ARM9 for GBA mode + settings and save loading. const u32 romPathLen = strlen(romPath);