Skip to content

Commit df42e08

Browse files
committed
Small save sector documentation
1 parent b7f8ad7 commit df42e08

3 files changed

Lines changed: 48 additions & 43 deletions

File tree

‎asm/code_0_0.s‎

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -266,7 +266,7 @@ _08001E1E:
266266
lsls r4, r0, #0x10
267267
asrs r4, r4, #0x10
268268
adds r0, r4, #0
269-
bl SaveSectorErase
269+
bl EraseSaveSector
270270
adds r4, #1
271271
lsls r4, r4, #0x10
272272
lsrs r0, r4, #0x10
@@ -518,14 +518,14 @@ sub_8001FD4: @ 0x08001FD4
518518
bl CpuSet
519519
adds r0, r6, #0
520520
adds r1, r5, #0
521-
bl SaveSectorPack
521+
bl PackSaveSector
522522
bl sub_8001A90
523523
lsls r0, r0, #0x10
524524
asrs r0, r0, #0x10
525525
cmp r0, #0
526526
blt _08002018
527527
adds r1, r6, #0
528-
bl SaveSectorWrite
528+
bl WriteSaveSector
529529
b _0800201C
530530
.align 2, 0
531531
_08002008: .4byte gSaveGame
@@ -571,7 +571,7 @@ _0800204C:
571571
_08002060:
572572
adds r0, r5, #0
573573
adds r1, r4, #0
574-
bl SaveSectorUnpack
574+
bl UnpackSaveSector
575575
adds r0, r5, #0
576576
bl ValidateSave
577577
ldr r2, _08002080 @ =0x040000DA
@@ -619,7 +619,7 @@ _080020BC: .4byte 0x47544E4C
619619
_080020C0:
620620
lsls r0, r4, #0x10
621621
asrs r0, r0, #0x10
622-
bl SaveSectorErase
622+
bl EraseSaveSector
623623
cmp r4, #0
624624
bne _080020D0
625625
movs r4, #0xf

‎include/game/save.h‎

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ typedef struct TimeRecords {
100100

101101
// 0x03000530
102102
typedef struct {
103-
/* 0x00 */ u32 id;
103+
/* 0x00 */ u32 playerId;
104104
/* 0x04 */ u16 playerName[MAX_PLAYER_NAME_LENGTH];
105105
/* 0x10 */ u8 unlockedCharacters; // 0x10 | Bitfield determining access to playable characters
106106
/* 0x11 */ u8 unlockedZones; // 0x11 | Up to the index of this value all Zones are
@@ -144,17 +144,21 @@ extern SaveGame gSaveGame;
144144
// TODO: From SA2. Find out whether the pointer exists in SA3
145145
extern SaveGame *gLoadedSaveGame;
146146

147+
typedef struct SaveSectorHeader {
148+
/* 0x000 */ u32 magicNumber; // default: 0x47544E4C ("LNTG")
149+
/* 0x004 */ u32 sectorId;
150+
} SaveSectorHeader;
151+
147152
/* 0x03000CF0 | Check out types and sizes for accuracy */
148153
// It seems like this is like STRUCT_3000530, but prepared to be stored in savefile.
149154
// They might've done it for security reasons, but strangely it's not excrypted, even in
150155
// .sav file...
151156
typedef struct {
152-
/* 0x000 */ u32 magicNumber; // default: 0x47544E4C ("LNTG")
153-
/* 0x004 */ u32 unk4;
157+
SaveSectorHeader header;
154158

155159
// @NOTE This contains mostly the same information as struc_3000530, but
156160
// some values are missing or in a different order.
157-
/* 0x008 */ u32 id; // | 0x08
161+
/* 0x008 */ u32 playerId; // | 0x08
158162
/* 0x00C */ u16 playerName[MAX_PLAYER_NAME_LENGTH];
159163
/* 0x018 */ u8 unk18; // Don't know why this byte is here, but it's correct
160164

‎src/code_0_0.c‎

Lines changed: 35 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
#include "flags.h"
44
#include "lib/m4a/m4a.h"
55
#include "lib/agb_flash/agb_flash.h"
6+
#include "lib/agb_flash/flash_internal.h"
67
#include "malloc_ewram.h"
78
#include "malloc_vram.h"
89
#include "game/save.h"
@@ -34,10 +35,10 @@ void Task_8000918(void)
3435
(*pTask)->main = Task_8001FB0;
3536
}
3637

37-
void ClearSave(SaveGame *save, u32 index)
38+
void ClearSave(SaveGame *save, u32 playerId)
3839
{
3940
s16 i, j;
40-
save->id = index;
41+
save->playerId = playerId;
4142
for (i = 0; i < (s32)ARRAY_COUNT(save->playerName); i++) {
4243
save->playerName[i] = -1;
4344
}
@@ -116,7 +117,7 @@ void CompleteSave(SaveGame *save)
116117
{
117118
s16 i, j;
118119

119-
save->id = 0;
120+
save->playerId = 0;
120121

121122
for (i = 0; i < (s32)ARRAY_COUNT(save->playerName); i++) {
122123
save->playerName[i] = 0xFFFF;
@@ -299,14 +300,14 @@ void ValidateSave(SaveGame *save)
299300
save->language = 1;
300301
}
301302

302-
void ValidateSaveSector(SaveSectorData *sector, u32 id)
303+
void ValidateSaveSector(SaveSectorData *sector, u32 playerId)
303304
{
304305
s16 i;
305306

306307
CPU_FILL(0, sector, sizeof(SaveSectorData), 32);
307308

308-
sector->magicNumber = SAVEMAGIC_SA3;
309-
sector->id = id;
309+
sector->header.magicNumber = SAVEMAGIC_SA3;
310+
sector->playerId = playerId;
310311

311312
for (i = 0; i <= 5; i++) {
312313
sector->playerName[i] = 0xFFFF;
@@ -338,7 +339,7 @@ void ValidateSaveSector(SaveSectorData *sector, u32 id)
338339
sector->checksum = GetSaveSectorChecksum(sector);
339340
}
340341

341-
u32 SaveSectorWrite(u16 sectorNum, SaveSectorData *sector)
342+
u32 WriteSaveSector(u16 sectorNum, SaveSectorData *sector)
342343
{
343344
u16 bfrIE;
344345
u16 bfrIME;
@@ -377,7 +378,7 @@ u32 SaveSectorWrite(u16 sectorNum, SaveSectorData *sector)
377378
return result;
378379
}
379380

380-
u16 SaveSectorErase(s16 sectorNum)
381+
u16 EraseSaveSector(s16 sectorNum)
381382
{
382383
u16 bfrIE;
383384
u16 bfrIME;
@@ -416,15 +417,15 @@ u16 SaveSectorErase(s16 sectorNum)
416417
return result;
417418
}
418419

419-
void SaveSectorPack(SaveSectorData *sector, SaveGame *save)
420+
void PackSaveSector(SaveSectorData *sector, SaveGame *save)
420421
{
421422
s16 i;
422423
s16 j;
423424
s16 k;
424425

425-
sector->magicNumber = 0x47544E4C;
426-
sector->unk4 += 1;
427-
sector->id = save->id;
426+
sector->header.magicNumber = 0x47544E4C;
427+
sector->header.sectorId += 1;
428+
sector->playerId = save->playerId;
428429

429430
for (i = 0; i < 6; i++) {
430431
sector->playerName[i] = save->playerName[i];
@@ -534,13 +535,13 @@ void SaveSectorPack(SaveSectorData *sector, SaveGame *save)
534535
sector->checksum = GetSaveSectorChecksum(sector);
535536
}
536537

537-
void SaveSectorUnpack(SaveGame *save, SaveSectorData *sector)
538+
void UnpackSaveSector(SaveGame *save, SaveSectorData *sector)
538539
{
539540
s16 i;
540541
s16 j;
541542
s16 k;
542543

543-
save->id = sector->id;
544+
save->playerId = sector->playerId;
544545

545546
for (i = 0; i < (s32)ARRAY_COUNT(save->playerName); i++) {
546547
save->playerName[i] = sector->playerName[i];
@@ -650,7 +651,7 @@ void SaveSectorUnpack(SaveGame *save, SaveSectorData *sector)
650651

651652
s16 sub_8001A90(void)
652653
{
653-
u32 sp00[16][2];
654+
SaveSectorHeader headers[SECTORS_PER_BANK];
654655
s16 sectorId;
655656
s16 var_sl;
656657
u32 var_r8;
@@ -664,18 +665,18 @@ s16 sub_8001A90(void)
664665
return -1;
665666
}
666667

667-
for (sectorId = 0; sectorId < 16; sectorId++) {
668-
ReadFlash(sectorId, 0U, &sp00[sectorId], 8U);
668+
for (sectorId = 0; sectorId < SECTORS_PER_BANK; sectorId++) {
669+
ReadFlash(sectorId, 0U, &headers[sectorId], sizeof(headers[0]));
669670

670-
if (sp00[sectorId][0] != SAVEMAGIC_SA3) {
671+
if (headers[sectorId].magicNumber != SAVEMAGIC_SA3) {
671672
return sectorId;
672673
}
673674

674-
if (sp00[sectorId][1] > var_sb) {
675-
var_sb = sp00[sectorId][1];
675+
if (headers[sectorId].sectorId > var_sb) {
676+
var_sb = headers[sectorId].sectorId;
676677
}
677-
if (sp00[sectorId][1] < var_r8) {
678-
var_r8 = sp00[sectorId][1];
678+
if (headers[sectorId].sectorId < var_r8) {
679+
var_r8 = headers[sectorId].sectorId;
679680
var_sl = sectorId;
680681
}
681682
}
@@ -686,8 +687,8 @@ s16 sub_8001A90(void)
686687
var_r8 = var_sb;
687688

688689
for (sectorId = 0; sectorId < 16; sectorId++) {
689-
if ((sp00[sectorId][1] > -0x100) && (sp00[sectorId][1] <= var_r8)) {
690-
var_r8 = sp00[sectorId][1];
690+
if ((headers[sectorId].sectorId > -0x100) && (headers[sectorId].sectorId <= var_r8)) {
691+
var_r8 = headers[sectorId].sectorId;
691692
var_sl = sectorId;
692693
}
693694
}
@@ -698,7 +699,7 @@ s16 sub_8001A90(void)
698699

699700
s16 sub_8001B60(void)
700701
{
701-
u32 sp00[16][2];
702+
SaveSectorHeader headers[SECTORS_PER_BANK];
702703
s16 sectorId;
703704
s16 var_sl;
704705
u32 var_r8;
@@ -711,19 +712,19 @@ s16 sub_8001B60(void)
711712
return -2;
712713
}
713714

714-
for (sectorId = 0; sectorId < 16; sectorId++) {
715-
ReadFlash(sectorId, 0U, &sp00[sectorId], 8U);
715+
for (sectorId = 0; sectorId < SECTORS_PER_BANK; sectorId++) {
716+
ReadFlash(sectorId, 0U, &headers[sectorId], sizeof(headers[16]));
716717

717-
if (sp00[sectorId][0] != SAVEMAGIC_SA3) {
718+
if (headers[sectorId].magicNumber != SAVEMAGIC_SA3) {
718719
continue;
719720
}
720721

721-
if (sp00[sectorId][1] > var_r8) {
722-
var_r8 = sp00[sectorId][1];
722+
if (headers[sectorId].sectorId > var_r8) {
723+
var_r8 = headers[sectorId].sectorId;
723724
var_sl = sectorId;
724725
}
725-
if (sp00[sectorId][1] < var_sb) {
726-
var_sb = sp00[sectorId][1];
726+
if (headers[sectorId].sectorId < var_sb) {
727+
var_sb = headers[sectorId].sectorId;
727728
}
728729
}
729730

@@ -733,8 +734,8 @@ s16 sub_8001B60(void)
733734
var_r8 = 0;
734735

735736
for (sectorId = 0; sectorId < 16; sectorId++) {
736-
if ((sp00[sectorId][1] < -0x100) && (sp00[sectorId][1] >= var_r8)) {
737-
var_r8 = sp00[sectorId][1];
737+
if ((headers[sectorId].sectorId < -0x100) && (headers[sectorId].sectorId >= var_r8)) {
738+
var_r8 = headers[sectorId].sectorId;
738739
var_sl = sectorId;
739740
}
740741
}

0 commit comments

Comments
 (0)