mirror of
https://github.com/ApacheThunder/SCKILL.git
synced 2025-06-18 11:05:50 -04:00
139 lines
4.0 KiB
C
139 lines
4.0 KiB
C
#include <gba.h>
|
|
#include "EepromSave.h"
|
|
#include "FlashSave.h"
|
|
#include "Save.h"
|
|
#include "string.h"
|
|
|
|
u32 romSize;
|
|
|
|
#define SAVE_TYPE_COUNT 25
|
|
|
|
static const struct save_type sSaveTypes[SAVE_TYPE_COUNT] =
|
|
{
|
|
{"EEPROM_V111", 12, SAVE_TYPE_EEPROM_V111, 512, eeprom_patchV111},
|
|
{"EEPROM_V120", 12, SAVE_TYPE_EEPROM_V120, 8 * 1024, eeprom_patchV120},
|
|
{"EEPROM_V121", 12, SAVE_TYPE_EEPROM_V121, 8 * 1024, eeprom_patchV120},
|
|
{"EEPROM_V122", 12, SAVE_TYPE_EEPROM_V122, 8 * 1024, eeprom_patchV120},
|
|
{"EEPROM_V124", 12, SAVE_TYPE_EEPROM_V124, 8 * 1024, eeprom_patchV124},
|
|
{"EEPROM_V125", 12, SAVE_TYPE_EEPROM_V125, 8 * 1024, eeprom_patchV124},
|
|
{"EEPROM_V126", 12, SAVE_TYPE_EEPROM_V126, 8 * 1024, eeprom_patchV126},
|
|
|
|
{"FLASH_V120", 11, SAVE_TYPE_FLASH_V120, 64 * 1024, flash_patchV120},
|
|
{"FLASH_V121", 11, SAVE_TYPE_FLASH_V121, 64 * 1024, flash_patchV120},
|
|
{"FLASH_V123", 11, SAVE_TYPE_FLASH_V123, 64 * 1024, flash_patchV123},
|
|
{"FLASH_V124", 11, SAVE_TYPE_FLASH_V124, 64 * 1024, flash_patchV123},
|
|
{"FLASH_V125", 11, SAVE_TYPE_FLASH_V125, 64 * 1024, flash_patchV123},
|
|
{"FLASH_V126", 11, SAVE_TYPE_FLASH_V126, 64 * 1024, /*flash_patchV126*/ flash_patchV123},
|
|
{"FLASH512_V130", 14, SAVE_TYPE_FLASH512_V130, 64 * 1024, flash_patch512V130},
|
|
{"FLASH512_V131", 14, SAVE_TYPE_FLASH512_V131, 64 * 1024, flash_patch512V130},
|
|
{"FLASH512_V133", 14, SAVE_TYPE_FLASH512_V133, 64 * 1024, flash_patch512V130},
|
|
{"FLASH1M_V102", 13, SAVE_TYPE_FLASH1M_V102, 128 * 1024, flash_patch1MV102},
|
|
{"FLASH1M_V103", 13, SAVE_TYPE_FLASH1M_V103, 128 * 1024, flash_patch1MV103},
|
|
|
|
//sram does not require patching
|
|
{"SRAM_F_V100", 12, SAVE_TYPE_SRAM_F_V100, 32 * 1024, NULL},
|
|
{"SRAM_F_V102", 12, SAVE_TYPE_SRAM_F_V102, 32 * 1024, NULL},
|
|
{"SRAM_F_V103", 12, SAVE_TYPE_SRAM_F_V103, 32 * 1024, NULL},
|
|
|
|
{"SRAM_V110", 10, SAVE_TYPE_SRAM_V110, 32 * 1024, NULL},
|
|
{"SRAM_V111", 10, SAVE_TYPE_SRAM_V111, 32 * 1024, NULL},
|
|
{"SRAM_V112", 10, SAVE_TYPE_SRAM_V112, 32 * 1024, NULL},
|
|
{"SRAM_V113", 10, SAVE_TYPE_SRAM_V113, 32 * 1024, NULL},
|
|
};
|
|
|
|
const struct save_type* save_findTag()
|
|
{
|
|
u32 curAddr = 0x080000C0;
|
|
char saveTag[16];
|
|
while (curAddr < 0x08000000+romSize) {
|
|
u32 fst = *(u32*)curAddr;
|
|
// tonccpy(&saveTag, (u8*)curAddr, 16);
|
|
((u32*)saveTag)[0] = ((u32*)curAddr)[0];
|
|
((u32*)saveTag)[1] = ((u32*)curAddr)[1];
|
|
((u32*)saveTag)[2] = ((u32*)curAddr)[2];
|
|
((u32*)saveTag)[3] = ((u32*)curAddr)[3];
|
|
enum SaveType type = SAVE_TYPE_NONE;
|
|
if (fst == 0x53414C46 && (saveTag[5] == '_' || saveTag[5] == '5' || saveTag[5] == '1')) {
|
|
//FLAS
|
|
type = SAVE_TYPE_FLASH;
|
|
} else if (fst == 0x4D415253) {
|
|
//SRAM
|
|
type = SAVE_TYPE_SRAM;
|
|
} else if (fst == 0x52504545 && saveTag[6] == '_') {
|
|
//EEPR
|
|
type = SAVE_TYPE_EEPROM;
|
|
}
|
|
|
|
if (type != SAVE_TYPE_NONE) {
|
|
for (int i = 0; i < SAVE_TYPE_COUNT; i++) {
|
|
if (strncmp(saveTag, sSaveTypes[i].tag, sSaveTypes[i].tagLength) != 0)
|
|
continue;
|
|
return &sSaveTypes[i];
|
|
}
|
|
}
|
|
curAddr += 4;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
//tonccpy
|
|
//
|
|
void twoByteCpy(u16 *dst, const u16 *src, u32 size){
|
|
if (size == 0 || dst == NULL || src == NULL)
|
|
return;
|
|
|
|
u32 count;
|
|
u16 *dst16; // hword destination
|
|
u8 *src8; // byte source
|
|
|
|
// Ideal case: copy by 4x words. Leaves tail for later.
|
|
if (((u32)src|(u32)dst) %4 == 0 && size >= 4) {
|
|
u32 *src32= (u32*)src, *dst32= (u32*)dst;
|
|
|
|
count = size/4;
|
|
u32 tmp = count&3;
|
|
count /= 4;
|
|
|
|
// Duff's Device, good friend!
|
|
switch(tmp) {
|
|
do { *dst32++ = *src32++;
|
|
case 3: *dst32++ = *src32++;
|
|
case 2: *dst32++ = *src32++;
|
|
case 1: *dst32++ = *src32++;
|
|
case 0: ; } while (count--);
|
|
}
|
|
|
|
// Check for tail
|
|
size &= 3;
|
|
if (size == 0)
|
|
return;
|
|
|
|
src8 = (u8*)src32;
|
|
dst16 = (u16*)dst32;
|
|
} else {
|
|
// Unaligned
|
|
|
|
u32 dstOfs = (u32)dst&1;
|
|
src8 = (u8*)src;
|
|
dst16 = (u16*)(dst-dstOfs);
|
|
|
|
// Head: 1 byte.
|
|
if (dstOfs != 0) {
|
|
*dst16 = (*dst16 & 0xFF) | *src8++<<8;
|
|
dst16++;
|
|
if (--size == 0)
|
|
return;
|
|
}
|
|
}
|
|
|
|
// Unaligned main: copy by 2x byte.
|
|
count = size/2;
|
|
while (count--) {
|
|
*dst16++ = src8[0] | src8[1]<<8;
|
|
src8 += 2;
|
|
}
|
|
|
|
// Tail: 1 byte.
|
|
if (size & 1)
|
|
*dst16 = (*dst16 &~ 0xFF) | *src8;
|
|
} |