diff options
Diffstat (limited to 'src/main/fox_save.c')
| -rw-r--r-- | src/main/fox_save.c | 61 |
1 files changed, 61 insertions, 0 deletions
diff --git a/src/main/fox_save.c b/src/main/fox_save.c new file mode 100644 index 00000000..f9bb750e --- /dev/null +++ b/src/main/fox_save.c @@ -0,0 +1,61 @@ +#include "global.h" + +SaveFile gSaveFile; + +u16 Save_Checksum(Save* arg0) { + u16 var_v1; + s32 i; + + for (i = 0, var_v1 = 0; i < sizeof(SaveData); i++) { + var_v1 ^= arg0->raw[i]; + var_v1 <<= 1; + var_v1 = (var_v1 & 0xFE) | ((var_v1 >> 8) & 1); + } + + var_v1 = (var_v1 & 0xFF) | 0x9500; + + return var_v1; +} + +s32 Save_Write(void) { + void* sp1C; + + gSaveFile.save.checksum = Save_Checksum(&gSaveFile.save); + gSaveFile.backup = gSaveFile.save; + gSaveIOBuffer = gSaveFile; + osSendMesg(&gSerialThreadMsgQueue, (OSMesg) SI_WRITE_SAVE, OS_MESG_PRI_NORMAL); + osRecvMesg(&gSaveMsgQueue, &sp1C, OS_MESG_BLOCK); + if (sp1C != (OSMesg) SI_SAVE_SUCCESS) { + return -1; + } + return 0; +} + +s32 Save_Read(void) { + void* sp24; + s32 i; + + osSendMesg(&gSerialThreadMsgQueue, (OSMesg) SI_READ_SAVE, OS_MESG_PRI_NORMAL); + osRecvMesg(&gSaveMsgQueue, &sp24, OS_MESG_BLOCK); + if ((s32) sp24 != SI_SAVE_SUCCESS) { + return -1; + } + + gSaveFile = gSaveIOBuffer; + + if (gSaveFile.save.checksum == Save_Checksum(&gSaveFile.save)) { + (void) "EEPROM ROM[0] 正常\n"; + return 0; + } + for (i = 0; i <= sizeof(SaveData); i++) { // should be <, but gets overwritten immediately. + gSaveFile.save.raw[i] = gSaveFile.backup.raw[i]; + } + gSaveFile.save.checksum = gSaveFile.backup.checksum; + + if (gSaveFile.save.checksum == Save_Checksum(&gSaveFile.save)) { + (void) "EEPROM ROM[1] 正常\n"; + return 0; + } + (void) "EEPROM ROM[0] & ROM[1] 異常\n"; + return -1; +} |
