summaryrefslogtreecommitdiff
path: root/src/save.c
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2018-02-03 09:42:19 -0500
committerPikalaxALT <pikalaxalt@gmail.com>2018-02-03 09:42:19 -0500
commitd52f52fa734b856361b04ea5d70877a6f265df0c (patch)
tree60444b7ba53b8e4c9030a694acb03c54e4144778 /src/save.c
parentd4e8c20f840996049f269ffcd22d7e3feb489696 (diff)
parenteb6aed50e56f36ce416f7ecc8edfacea1da61bf1 (diff)
Merge branch 'master' into link
Diffstat (limited to 'src/save.c')
-rw-r--r--src/save.c57
1 files changed, 56 insertions, 1 deletions
diff --git a/src/save.c b/src/save.c
index 023ca6870..8d77e801a 100644
--- a/src/save.c
+++ b/src/save.c
@@ -4,13 +4,68 @@
#include "constants/game_stat.h"
#include "task.h"
+// for the chunk declarations
+extern struct SaveBlock2 gSaveblock2;
+extern struct SaveBlock1 gSaveblock1;
+extern struct PokemonStorage gPokemonStorage;
+
extern struct SaveSectionLocation gRamSaveSectionLocations[0xE];
extern u8 gDecompressionBuffer[];
extern u32 gFlashMemoryPresent;
extern u16 gUnknown_03006294;
extern bool8 gSoftResetDisabled;
-extern const struct SaveSectionOffsets gSaveSectionOffsets[0xE];
+// Divide save blocks into individual chunks to be written to flash sectors
+
+// Each 4 KiB flash sector contains 3968 bytes of actual data followed by a 128 byte footer
+#define SECTOR_DATA_SIZE 3968
+#define SECTOR_FOOTER_SIZE 128
+
+/*
+ * Sector Layout:
+ *
+ * Sectors 0 - 13: Save Slot 1
+ * Sectors 14 - 27: Save Slot 2
+ * Sectors 28 - 29: Hall of Fame
+ * Sector 30: e-Reader/Mystery Gift Stuff (note: e-Reader is deprecated in Emerald US)
+ * Sector 31: Recorded Battle
+ *
+ * There are two save slots for saving the player's game data. We alternate between
+ * them each time the game is saved, so that if the current save slot is corrupt,
+ * we can load the previous one. We also rotate the sectors in each save slot
+ * so that the same data is not always being written to the same sector. This
+ * might be done to reduce wear on the flash memory, but I'm not sure, since all
+ * 14 sectors get written anyway.
+ */
+
+// (u8 *)structure was removed from the first statement of the macro in Emerald.
+// This is because malloc is used to allocate addresses so storing the raw
+// addresses should not be done in the offsets information.
+#define SAVEBLOCK_CHUNK(structure, chunkNum) \
+{ \
+ chunkNum * SECTOR_DATA_SIZE, \
+ min(sizeof(structure) - chunkNum * SECTOR_DATA_SIZE, SECTOR_DATA_SIZE) \
+} \
+
+const struct SaveSectionOffsets gSaveSectionOffsets[] =
+{
+ SAVEBLOCK_CHUNK(gSaveblock2, 0),
+
+ SAVEBLOCK_CHUNK(gSaveblock1, 0),
+ SAVEBLOCK_CHUNK(gSaveblock1, 1),
+ SAVEBLOCK_CHUNK(gSaveblock1, 2),
+ SAVEBLOCK_CHUNK(gSaveblock1, 3),
+
+ SAVEBLOCK_CHUNK(gPokemonStorage, 0),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 1),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 2),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 3),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 4),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 5),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 6),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 7),
+ SAVEBLOCK_CHUNK(gPokemonStorage, 8),
+};
extern void DoSaveFailedScreen(u8); // save_failed_screen
extern void LoadSerializedGame(void); // load_save