summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/save.s246
-rw-r--r--src/save.c196
2 files changed, 169 insertions, 273 deletions
diff --git a/asm/save.s b/asm/save.s
index f1bb800..6eaeedc 100644
--- a/asm/save.s
+++ b/asm/save.s
@@ -5,252 +5,6 @@
.text
- thumb_func_start sub_8011DA8
-sub_8011DA8:
- movs r0, 0x1
- bx lr
- thumb_func_end sub_8011DA8
-
- thumb_func_start sub_8011DAC
-sub_8011DAC:
- push {r4-r7,lr}
- mov r7, r8
- push {r7}
- adds r6, r0, 0
- ldr r0, _08011DE4
- mov r8, r0
- movs r1, 0x5
- bl MemoryAlloc
- adds r5, r0, 0
- movs r1, 0x89
- lsls r1, 3
- adds r4, r5, r1
- adds r0, r6, 0
- adds r1, r5, 0
- mov r2, r8
- bl ReadSaveSector
- adds r7, r0, 0
- cmp r7, 0
- beq _08011DE8
- adds r0, r6, 0
- adds r1, r5, 0
- mov r2, r8
- bl ReadSaveSector
- adds r7, r0, 0
- b _08011DF0
- .align 2, 0
-_08011DE4: .4byte 0x000057d4
-_08011DE8:
- adds r0, r6, 0
- mov r1, r8
- bl sub_8011CA8
-_08011DF0:
- cmp r7, 0
- beq _08011DF6
- b _08011F6E
-_08011DF6:
- ldr r2, _08011E38
- adds r0, r5, r2
- ldr r1, [r0]
- ldr r0, _08011E3C
- cmp r1, r0
- beq _08011E04
- movs r7, 0x4
-_08011E04:
- cmp r7, 0
- beq _08011E0A
- b _08011F6E
-_08011E0A:
- ldr r0, _08011E40
- ldr r1, [r0]
- cmp r1, 0
- bne _08011E48
- ldr r1, _08011E44
- adds r0, r5, r1
- ldr r0, [r0]
- bl sub_8011C28
- movs r2, 0x83
- lsls r2, 3
- adds r0, r5, r2
- ldr r0, [r0]
- bl sub_8011C40
- movs r1, 0x84
- lsls r1, 3
- adds r0, r5, r1
- ldr r0, [r0]
- bl SetRngState
- b _08011E60
- .align 2, 0
-_08011E38: .4byte 0x00000414
-_08011E3C: .4byte 0x05071412
-_08011E40: .4byte gUnknown_203B184
-_08011E44: .4byte 0x0000041c
-_08011E48:
- ldr r2, _08011E80
- adds r0, r5, r2
- ldr r0, [r0]
- str r0, [r1, 0x54]
- subs r2, 0x4
- adds r0, r5, r2
- ldr r0, [r0]
- str r0, [r1, 0x50]
- adds r2, 0x8
- adds r0, r5, r2
- ldr r0, [r0]
- str r0, [r1, 0x58]
-_08011E60:
- cmp r7, 0
- beq _08011E66
- b _08011F6E
-_08011E66:
- ldr r0, _08011E84
- ldr r0, [r0]
- cmp r0, 0
- bne _08011E88
- adds r0, r5, 0x4
- bl sub_8002718
- lsls r0, 24
- cmp r0, 0
- bne _08011E94
- movs r7, 0x4
- b _08011F6E
- .align 2, 0
-_08011E80: .4byte 0x0000041c
-_08011E84: .4byte gUnknown_203B184
-_08011E88:
- ldr r0, [r0, 0x4C]
- adds r1, r5, 0x4
- movs r2, 0x80
- lsls r2, 3
- bl MemoryCopy8
-_08011E94:
- cmp r7, 0
- bne _08011F6E
- ldr r6, _08011F80
- adds r0, r4, 0
- adds r1, r6, 0
- bl sub_808EE9C
- adds r1, r0, 0
- ldr r2, _08011F84
- adds r0, r5, r2
- ldr r0, [r0]
- cmp r1, r0
- beq _08011EB0
- movs r7, 0x3
-_08011EB0:
- adds r4, r6
- movs r6, 0x96
- lsls r6, 2
- adds r0, r4, 0
- adds r1, r6, 0
- bl sub_808F2B0
- adds r1, r0, 0
- movs r2, 0x85
- lsls r2, 3
- adds r0, r5, r2
- ldr r0, [r0]
- cmp r1, r0
- beq _08011ECE
- movs r7, 0x3
-_08011ECE:
- adds r4, r6
- movs r6, 0xEC
- lsls r6, 1
- adds r0, r4, 0
- adds r1, r6, 0
- bl sub_8091D14
- adds r1, r0, 0
- movs r2, 0x86
- lsls r2, 3
- adds r0, r5, r2
- ldr r0, [r0]
- cmp r1, r0
- beq _08011EEC
- movs r7, 0x3
-_08011EEC:
- adds r4, r6
- adds r0, r4, 0
- movs r1, 0x10
- bl sub_809222C
- adds r1, r0, 0
- ldr r2, _08011F88
- adds r0, r5, r2
- ldr r0, [r0]
- cmp r1, r0
- beq _08011F04
- movs r7, 0x3
-_08011F04:
- adds r4, 0x10
- adds r0, r4, 0
- movs r1, 0x8
- bl sub_80927F4
- adds r1, r0, 0
- movs r2, 0x87
- lsls r2, 3
- adds r0, r5, r2
- ldr r0, [r0]
- cmp r1, r0
- beq _08011F1E
- movs r7, 0x3
-_08011F1E:
- adds r4, 0x8
- movs r6, 0x80
- lsls r6, 1
- adds r0, r4, 0
- adds r1, r6, 0
- bl sub_8097D98
- adds r1, r0, 0
- ldr r2, _08011F8C
- adds r0, r5, r2
- ldr r0, [r0]
- cmp r1, r0
- beq _08011F3A
- movs r7, 0x3
-_08011F3A:
- adds r4, r6
- ldr r6, _08011F90
- adds r0, r4, 0
- adds r1, r6, 0
- bl sub_80954CC
- adds r1, r0, 0
- movs r2, 0x88
- lsls r2, 3
- adds r0, r5, r2
- ldr r0, [r0]
- cmp r1, r0
- beq _08011F56
- movs r7, 0x3
-_08011F56:
- adds r4, r6
- ldr r1, _08011F94
- adds r0, r4, 0
- bl sub_8096FA0
- adds r1, r0, 0
- ldr r2, _08011F98
- adds r0, r5, r2
- ldr r0, [r0]
- cmp r1, r0
- beq _08011F6E
- movs r7, 0x3
-_08011F6E:
- adds r0, r5, 0
- bl MemoryFree
- adds r0, r7, 0
- pop {r3}
- mov r8, r3
- pop {r4-r7}
- pop {r1}
- bx r1
- .align 2, 0
-_08011F80: .4byte 0x00004650
-_08011F84: .4byte 0x00000424
-_08011F88: .4byte 0x00000434
-_08011F8C: .4byte 0x0000043c
-_08011F90: .4byte 0x00000594
-_08011F94: .4byte 0x00000221
-_08011F98: .4byte 0x00000444
- thumb_func_end sub_8011DAC
-
thumb_func_start sub_8011F9C
sub_8011F9C:
push {lr}
diff --git a/src/save.c b/src/save.c
index 037938a..f8da6ce 100644
--- a/src/save.c
+++ b/src/save.c
@@ -1,15 +1,55 @@
#include "global.h"
+#include "flash.h"
+#include "memory.h"
+struct UnkStruct_203B184 {
+ u8 fill000[0x4C];
+ u8 *unk04C;
+ u32 unk050;
+ u32 unk054;
+ u32 unk058;
+};
+
+struct UnkStruct_sub_8011DAC {
+ u8 fill000[0x4];
+ u8 unk004[0x400];
+ u8 fill404[0x10];
+ u32 unk414;
+ u32 unk418;
+ u32 unk41C;
+ u32 unk420;
+ u32 unk424;
+ u32 unk428;
+ u8 fill42C[0x4];
+ u32 unk430;
+ u32 unk434;
+ u32 unk438;
+ u32 unk43C;
+ u32 unk440;
+ u32 unk444;
+ u8 fill448[0x538C];
+};
+
+extern u32 gUnknown_202DE28;
extern u32 gUnknown_203B17C;
extern u32 gUnknown_203B180;
-extern vu32 gUnknown_203B184;
-extern u32 gUnknown_202DE28;
+extern volatile struct UnkStruct_203B184 *gUnknown_203B184;
-extern s32 ReadFlashData(s32 sector, u8 *src, s32 size);
-extern s32 WriteFlashData(s32 sector, u8 *src, s32 size);
+extern void* MemoryAlloc(u32 a, u32 b);
+extern void MemoryFree(void* a);
+extern void SetRngState(s32 state);
+extern bool8 sub_8002718(u8 *a);
extern bool8 sub_800DAB0(u16, u8*, s32);
extern bool8 sub_800DAB4(u16, u8*, s32);
extern bool8 sub_800DAB8(void);
+extern u32 sub_808EE9C(void* a, s32 b);
+extern u32 sub_808F2B0(void* a, s32 b);
+extern u32 sub_8091D14(void* a, s32 b);
+extern u32 sub_809222C(void* a, s32 b);
+extern u32 sub_80927F4(void* a, s32 b);
+extern u32 sub_80954CC(void* a, s32 b);
+extern u32 sub_8096FA0(void* a, s32 b);
+extern u32 sub_8097D98(void* a, s32 b);
u32 sub_8011C1C(void)
{
@@ -68,62 +108,164 @@ bool8 ValidateChecksum(u8 *in, u32 size)
return FALSE;
}
-void sub_8011CA8(u32 *out, s32 b)
+void sub_8011CA8(u32 *out, s32 size)
{
- gUnknown_203B184; // Needed to match
- *out += (b + 0xFFF) / 0x1000;
+ // Needed to match
+ if (gUnknown_203B184) {
+ size++;
+ size--;
+ }
+ *out += (size + 0xFFF) / 0x1000;
}
-u32 WriteSaveSector(u32 *a, u8 *b, s32 size, u32 d)
+u32 WriteSaveSector(s32 *a, u8 *src, s32 size)
{
- u32 r6 = *a;
- u32 num;
+ u32 r1;
+ s32 r6 = *a;
sub_8011CA8(a, size);
- CalculateChecksum(b, size);
+ CalculateChecksum(src, size);
if (!gUnknown_203B184) {
- num = WriteFlashData(r6, b, size);
+ r1 = WriteFlashData(r6, src, size);
}
else if (sub_800DAB8()) {
- num = sub_800DAB4(r6, b, size) ? 0 : 3;
+ if (!sub_800DAB4(r6, src, size)) {
+ r1 = 3;
+ }
+ else {
+ r1 = 0;
+ }
}
else {
return 2;
}
- if (num == 4) {
+ if (r1 == 4) {
return 1;
}
- else if (num) {
+ if (r1) {
return 2;
}
- else {
- return 0;
- }
+ return 0;
}
-u32 ReadSaveSector(u32 *a, u8 *b, s32 size, u32 d)
+u32 ReadSaveSector(s32 *a, u8 *dest, s32 size)
{
- u32 r6 = *a;
- u32 num;
+ u32 r1;
+ s32 r6 = *a;
sub_8011CA8(a, size);
if (!gUnknown_203B184) {
- num = ReadFlashData(r6, b, size);
+ r1 = ReadFlashData(r6, dest, size);
}
else if (sub_800DAB8()) {
- if (!sub_800DAB0(r6, b, size)) {
- num = 1;
+ if (!sub_800DAB0(r6, dest, size)) {
+ r1 = 1;
}
else {
- num = 0;
+ r1 = 0;
}
}
else {
return 1;
}
- if (num) {
+ if (r1) {
return 1;
}
- if (ValidateChecksum(b, size)) {
+ if (ValidateChecksum(dest, size)) {
return 2;
}
return 0;
}
+
+bool8 sub_8011DA8(void)
+{
+ return TRUE;
+}
+
+u32 sub_8011DAC(u32 *a)
+{
+ struct UnkStruct_sub_8011DAC *r5 = MemoryAlloc(sizeof(struct UnkStruct_sub_8011DAC), 5);
+ u8 *r4 = (u8*)r5->fill448;
+ u32 r7 = ReadSaveSector(a, (u8*)r5, sizeof(struct UnkStruct_sub_8011DAC));
+ u32 r1;
+ if (r7)
+ {
+ r7 = ReadSaveSector(a, (u8*)r5, sizeof(struct UnkStruct_sub_8011DAC));
+ }
+ else
+ {
+ sub_8011CA8(a, sizeof(struct UnkStruct_sub_8011DAC));
+ }
+ if (!r7)
+ {
+ if (r5->unk414 != 0x5071412) {
+ r7 = 4;
+ }
+ }
+ if (!r7)
+ {
+ if (!gUnknown_203B184) {
+ sub_8011C28(r5->unk41C);
+ sub_8011C40(r5->unk418);
+ SetRngState(r5->unk420);
+ }
+ else {
+ gUnknown_203B184->unk054 = r5->unk41C;
+ gUnknown_203B184->unk050 = r5->unk418;
+ gUnknown_203B184->unk058 = r5->unk420;
+ }
+ }
+ if (!r7)
+ {
+ if (!gUnknown_203B184) {
+ if (!sub_8002718(r5->unk004)) {
+ r7 = 4;
+ }
+ }
+ else {
+ MemoryCopy8(gUnknown_203B184->unk04C, r5->unk004, ARRAY_COUNT(r5->unk004));
+ }
+ }
+ if (!r7)
+ {
+ r1 = sub_808EE9C(r4, 0x4650);
+ if (r1 != r5->unk424) {
+ r7 = 3;
+ }
+ r4 += 0x4650;
+ r1 = sub_808F2B0(r4, 0x258);
+ if (r1 != r5->unk428) {
+ r7 = 3;
+ }
+ r4 += 0x258;
+ r1 = sub_8091D14(r4, 0x1D8);
+ if (r1 != r5->unk430) {
+ r7 = 3;
+ }
+ r4 += 0x1d8;
+ r1 = sub_809222C(r4, 0x10);
+ if (r1 != r5->unk434) {
+ r7 = 3;
+ }
+ r4 += 0x10;
+ r1 = sub_80927F4(r4, 0x8);
+ if (r1 != r5->unk438) {
+ r7 = 3;
+ }
+ r4 += 0x8;
+ r1 = sub_8097D98(r4, 0x100);
+ if (r1 != r5->unk43C) {
+ r7 = 3;
+ }
+ r4 += 0x100;
+ r1 = sub_80954CC(r4, 0x594);
+ if (r1 != r5->unk440) {
+ r7 = 3;
+ }
+ r4 += 0x594;
+ r1 = sub_8096FA0(r4, 0x221);
+ if (r1 != r5->unk444) {
+ r7 = 3;
+ }
+ }
+ MemoryFree(r5);
+ return r7;
+}