mirror of
https://github.com/Ninjdai1/pokeemerald.git
synced 2024-12-26 11:44:17 +01:00
move save rodata to source and use saveblock chunk macros
This commit is contained in:
parent
ef3df1d40c
commit
78bd2b0849
20
data/save.s
20
data/save.s
@ -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
|
|
@ -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[];
|
||||||
|
@ -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);
|
||||||
|
56
src/save.c
56
src/save.c
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user