summaryrefslogtreecommitdiff
path: root/src/main/fox_save.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/fox_save.c')
-rw-r--r--src/main/fox_save.c61
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;
+}