summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDizzyEggg <jajkodizzy@wp.pl>2017-09-29 10:06:36 +0200
committerDizzyEggg <jajkodizzy@wp.pl>2017-09-29 10:06:36 +0200
commit7b72c8376250f1f417f21fda34348fd1268e23f7 (patch)
tree8477bae988c0d48f23c2c99cb4c95b33f4822adb
parent3c8091393ca12b8eeb26f236a997b70eea5688c6 (diff)
finish save.c
-rw-r--r--asm/save.s164
-rw-r--r--ld_script.txt1
-rw-r--r--src/save.c162
3 files changed, 95 insertions, 232 deletions
diff --git a/asm/save.s b/asm/save.s
deleted file mode 100644
index 825da0756..000000000
--- a/asm/save.s
+++ /dev/null
@@ -1,164 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/constants.inc"
-
- .syntax unified
-
- .text
-
-
- thumb_func_start sub_8153688
-sub_8153688: @ 8153688
- push {r4,lr}
- lsls r0, 24
- lsrs r2, r0, 24
- lsls r0, r2, 2
- adds r0, r2
- lsls r0, 3
- ldr r1, =gTasks + 0x8
- adds r4, r0, r1
- movs r1, 0
- ldrsh r0, [r4, r1]
- cmp r0, 0xB
- bls _081536A2
- b _081537C2
-_081536A2:
- lsls r0, 2
- ldr r1, =_081536B4
- adds r0, r1
- ldr r0, [r0]
- mov pc, r0
- .pool
- .align 2, 0
-_081536B4:
- .4byte _081536E4
- .4byte _081536F4
- .4byte _081536FE
- .4byte _0815371A
- .4byte _0815372C
- .4byte _08153742
- .4byte _08153758
- .4byte _08153762
- .4byte _08153778
- .4byte _0815378C
- .4byte _08153796
- .4byte _081537A8
-_081536E4:
- ldr r0, =gSoftResetDisabled
- movs r1, 0x1
- strb r1, [r0]
- movs r0, 0x1
- strh r0, [r4]
- b _081537C2
- .pool
-_081536F4:
- bl sub_800ADF8
- movs r0, 0x2
- strh r0, [r4]
- b _081537C2
-_081536FE:
- bl sub_800A520
- lsls r0, 24
- cmp r0, 0
- beq _081537C2
- movs r1, 0x4
- ldrsh r0, [r4, r1]
- cmp r0, 0
- bne _08153714
- bl save_serialize_map
-_08153714:
- movs r0, 0x3
- strh r0, [r4]
- b _081537C2
-_0815371A:
- movs r1, 0x4
- ldrsh r0, [r4, r1]
- cmp r0, 0
- bne _08153726
- bl sub_8076D5C
-_08153726:
- bl sub_8153380
- b _08153752
-_0815372C:
- ldrh r0, [r4, 0x2]
- adds r0, 0x1
- strh r0, [r4, 0x2]
- lsls r0, 16
- asrs r1, r0, 16
- cmp r1, 0x5
- bne _081537C2
- movs r0, 0
- strh r0, [r4, 0x2]
- strh r1, [r4]
- b _081537C2
-_08153742:
- bl sub_81533AC
- lsls r0, 24
- cmp r0, 0
- beq _08153752
- movs r0, 0x6
- strh r0, [r4]
- b _081537C2
-_08153752:
- movs r0, 0x4
- strh r0, [r4]
- b _081537C2
-_08153758:
- bl sub_81533E0
- movs r0, 0x7
- strh r0, [r4]
- b _081537C2
-_08153762:
- movs r1, 0x4
- ldrsh r0, [r4, r1]
- cmp r0, 0
- bne _0815376E
- bl sav2_gender2_inplace_and_xFE
-_0815376E:
- bl sub_800ADF8
- movs r0, 0x8
- strh r0, [r4]
- b _081537C2
-_08153778:
- bl sub_800A520
- lsls r0, 24
- cmp r0, 0
- beq _081537C2
- bl sub_8153408
- movs r0, 0x9
- strh r0, [r4]
- b _081537C2
-_0815378C:
- bl sub_800ADF8
- movs r0, 0xA
- strh r0, [r4]
- b _081537C2
-_08153796:
- bl sub_800A520
- lsls r0, 24
- cmp r0, 0
- beq _081537C2
- ldrh r0, [r4]
- adds r0, 0x1
- strh r0, [r4]
- b _081537C2
-_081537A8:
- ldrh r0, [r4, 0x2]
- adds r0, 0x1
- strh r0, [r4, 0x2]
- lsls r0, 16
- asrs r0, 16
- cmp r0, 0x5
- ble _081537C2
- ldr r1, =gSoftResetDisabled
- movs r0, 0
- strb r0, [r1]
- adds r0, r2, 0
- bl DestroyTask
-_081537C2:
- pop {r4}
- pop {r0}
- bx r0
- .pool
- thumb_func_end sub_8153688
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/ld_script.txt b/ld_script.txt
index 64a43d573..964a73667 100644
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -200,7 +200,6 @@ SECTIONS {
asm/roulette_util.o(.text);
asm/cable_car_util.o(.text);
src/save.o(.text);
- asm/save.o(.text);
asm/mystery_event_script.o(.text);
asm/field_effect_helpers.o(.text);
asm/contest_ai.o(.text);
diff --git a/src/save.c b/src/save.c
index 5ca855247..aee20d451 100644
--- a/src/save.c
+++ b/src/save.c
@@ -2,12 +2,15 @@
#include "gba/flash_internal.h"
#include "save.h"
#include "game_stat.h"
+#include "task.h"
-extern struct SaveSectionOffsets gSaveSectionOffsets[0xE];
extern struct SaveSectionLocation gRamSaveSectionLocations[0xE];
extern u8 gDecompressionBuffer[];
extern u32 gFlashMemoryPresent;
extern u16 gUnknown_03006294;
+extern bool8 gSoftResetDisabled;
+
+extern const struct SaveSectionOffsets gSaveSectionOffsets[0xE];
extern void DoSaveFailedScreen(u8); // save_failed_screen
extern void LoadSerializedGame(void); // load_save
@@ -576,84 +579,27 @@ u16 CalculateChecksum(void *data, u16 size)
return ((checksum >> 16) + checksum);
}
-#ifdef NONMATCHING
-// the initial allocation of the pointer and toAdd variable doesnt match up with the original function. however, forcing it is impossible since gRamSaveSectionLocations is loaded first.
void UpdateSaveAddresses(void)
{
int i = 0;
- gRamSaveSectionLocations[i].data = gSaveBlock2Ptr + gSaveSectionOffsets[0].toAdd;
- gRamSaveSectionLocations[i].size = gSaveSectionOffsets[0].size;
- for(i = 1; i < 5; i++)
+ gRamSaveSectionLocations[i].data = (void*)(gSaveBlock2Ptr) + gSaveSectionOffsets[i].toAdd;
+ gRamSaveSectionLocations[i].size = gSaveSectionOffsets[i].size;
+
+ for (i = 1; i < 5; i++)
{
- gRamSaveSectionLocations[i].data = gSaveBlock1Ptr + gSaveSectionOffsets[i].toAdd;
+ gRamSaveSectionLocations[i].data = (void*)(gSaveBlock1Ptr) + gSaveSectionOffsets[i].toAdd;
gRamSaveSectionLocations[i].size = gSaveSectionOffsets[i].size;
}
- for(i = 5; i < 14; i++)
+ for (i = 5; i < 14; i++)
{
- gRamSaveSectionLocations[i].data = gPokemonStoragePtr + gSaveSectionOffsets[i].toAdd;
+ gRamSaveSectionLocations[i].data = (void*)(gPokemonStoragePtr) + gSaveSectionOffsets[i].toAdd;
gRamSaveSectionLocations[i].size = gSaveSectionOffsets[i].size;
+
+ i++;i--; // needed to match
}
}
-#else
-__attribute__((naked))
-void UpdateSaveAddresses(void)
-{
- asm(".syntax unified\n\
- push {r4,r5,lr}\n\
- ldr r3, =gRamSaveSectionLocations\n\
- ldr r0, =gSaveBlock2Ptr\n\
- ldr r2, =gSaveSectionOffsets\n\
- ldrh r1, [r2]\n\
- ldr r0, [r0]\n\
- adds r0, r1\n\
- str r0, [r3]\n\
- ldrh r0, [r2, 0x2]\n\
- strh r0, [r3, 0x4]\n\
- ldr r5, =gSaveBlock1Ptr\n\
- adds r3, 0x8\n\
- adds r2, 0x4\n\
- movs r4, 0x3\n\
-_081531AC:\n\
- ldrh r0, [r2]\n\
- ldr r1, [r5]\n\
- adds r1, r0\n\
- str r1, [r3]\n\
- ldrh r0, [r2, 0x2]\n\
- strh r0, [r3, 0x4]\n\
- adds r3, 0x8\n\
- adds r2, 0x4\n\
- subs r4, 0x1\n\
- cmp r4, 0\n\
- bge _081531AC\n\
- movs r4, 0x5\n\
- ldr r1, =gRamSaveSectionLocations\n\
- ldr r5, =gPokemonStoragePtr\n\
- ldr r0, =gSaveSectionOffsets\n\
- adds r3, r1, 0\n\
- adds r3, 0x28\n\
- adds r2, r0, 0\n\
- adds r2, 0x14\n\
-_081531D2:\n\
- ldrh r0, [r2]\n\
- ldr r1, [r5]\n\
- adds r1, r0\n\
- str r1, [r3]\n\
- ldrh r0, [r2, 0x2]\n\
- strh r0, [r3, 0x4]\n\
- adds r3, 0x8\n\
- adds r2, 0x4\n\
- adds r4, 0x1\n\
- cmp r4, 0xD\n\
- ble _081531D2\n\
- pop {r4,r5}\n\
- pop {r0}\n\
- bx r0\n\
- .pool\n\
- .syntax divided");
-}
-#endif
extern u32 GetGameStat(u8 index); // rom4
extern void IncrementGameStat(u8 index); // rom4
@@ -894,3 +840,85 @@ u32 sub_8153634(u8 sector, u8* src)
return 0xFF;
return 1;
}
+
+extern void save_serialize_map(void);
+extern void sub_8076D5C(void);
+extern void sav2_gender2_inplace_and_xFE(void);
+extern void sub_800ADF8(void);
+extern bool8 sub_800A520(void);
+
+void sub_8153688(u8 taskId)
+{
+ s16* taskData = gTasks[taskId].data;
+
+ switch (taskData[0])
+ {
+ case 0:
+ gSoftResetDisabled = TRUE;
+ taskData[0] = 1;
+ break;
+ case 1:
+ sub_800ADF8();
+ taskData[0] = 2;
+ break;
+ case 2:
+ if (sub_800A520())
+ {
+ if (taskData[2] == 0)
+ save_serialize_map();
+ taskData[0] = 3;
+ }
+ break;
+ case 3:
+ if (taskData[2] == 0)
+ sub_8076D5C();
+ sub_8153380();
+ taskData[0] = 4;
+ break;
+ case 4:
+ if (++taskData[1] == 5)
+ {
+ taskData[1] = 0;
+ taskData[0] = 5;
+ }
+ break;
+ case 5:
+ if (sub_81533AC())
+ taskData[0] = 6;
+ else
+ taskData[0] = 4;
+ break;
+ case 6:
+ sub_81533E0();
+ taskData[0] = 7;
+ break;
+ case 7:
+ if (taskData[2] == 0)
+ sav2_gender2_inplace_and_xFE();
+ sub_800ADF8();
+ taskData[0] = 8;
+ break;
+ case 8:
+ if (sub_800A520())
+ {
+ sub_8153408();
+ taskData[0] = 9;
+ }
+ break;
+ case 9:
+ sub_800ADF8();
+ taskData[0] = 10;
+ break;
+ case 10:
+ if (sub_800A520())
+ taskData[0]++;
+ break;
+ case 11:
+ if (++taskData[1] > 5)
+ {
+ gSoftResetDisabled = FALSE;
+ DestroyTask(taskId);
+ }
+ break;
+ }
+}