move save rodata to source and use saveblock chunk macros

This commit is contained in:
ProjectRevoTPP 2018-01-31 15:26:57 -05:00
parent ef3df1d40c
commit 78bd2b0849
4 changed files with 59 additions and 22 deletions

View File

@ -1,20 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.section .rodata
gSaveSectionOffsets:: @ 85CDC00
.2byte 0, 0xF2C
.2byte 0, 0xF80
.2byte 0xF80, 0xF80
.2byte 0x1F00, 0xF80
.2byte 0x2E80, 0xF08
.2byte 0, 0xF80
.2byte 0xF80, 0xF80
.2byte 0x1F00, 0xF80
.2byte 0x2E80, 0xF80
.2byte 0x3E00, 0xF80
.2byte 0x4D80, 0xF80
.2byte 0x5D00, 0xF80
.2byte 0x6C80, 0xF80
.2byte 0x7C00, 0x7D0

View File

@ -37,6 +37,9 @@
#define POKEMON_NAME_LENGTH 10 #define POKEMON_NAME_LENGTH 10
#define OT_NAME_LENGTH 7 #define OT_NAME_LENGTH 7
#define min(a, b) ((a) < (b) ? (a) : (b))
#define max(a, b) ((a) >= (b) ? (a) : (b))
#define HEAP_SIZE 0x1C000 #define HEAP_SIZE 0x1C000
extern u8 gStringVar1[]; extern u8 gStringVar1[];

View File

@ -484,7 +484,7 @@ SECTIONS {
src/battle_controller_link_partner.o(.rodata); src/battle_controller_link_partner.o(.rodata);
src/battle_message.o(.rodata); src/battle_message.o(.rodata);
data/cable_car.o(.rodata); data/cable_car.o(.rodata);
data/save.o(.rodata); src/save.o(.rodata);
data/field_effect_helpers.o(.rodata); data/field_effect_helpers.o(.rodata);
data/contest_ai.o(.rodata); data/contest_ai.o(.rodata);
src/battle_controller_safari.o(.rodata); src/battle_controller_safari.o(.rodata);

View File

@ -4,13 +4,67 @@
#include "constants/game_stat.h" #include "constants/game_stat.h"
#include "task.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 struct SaveSectionLocation gRamSaveSectionLocations[0xE];
extern u8 gDecompressionBuffer[]; extern u8 gDecompressionBuffer[];
extern u32 gFlashMemoryPresent; extern u32 gFlashMemoryPresent;
extern u16 gUnknown_03006294; extern u16 gUnknown_03006294;
extern bool8 gSoftResetDisabled; 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
* Sectors 30 - 31: e-Reader battle tower data, maybe? (note: depreciated in Emerald US)
*
* 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 DoSaveFailedScreen(u8); // save_failed_screen
extern void LoadSerializedGame(void); // load_save extern void LoadSerializedGame(void); // load_save