summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--asm/save.s137
-rw-r--r--asmdiff.sh2
-rw-r--r--src/save.c67
3 files changed, 67 insertions, 139 deletions
diff --git a/asm/save.s b/asm/save.s
index 2ebaaa4..f1bb800 100644
--- a/asm/save.s
+++ b/asm/save.s
@@ -5,143 +5,6 @@
.text
- thumb_func_start sub_8011CA8
-sub_8011CA8:
- push {lr}
- adds r3, r0, 0
- adds r2, r1, 0
- ldr r0, =gUnknown_203B184
- ldr r0, [r0]
- ldr r0, =0xfff
- adds r1, r2, r0
- cmp r1, 0
- bge _08011CBE
- ldr r0, =0x1ffe
- adds r1, r2, r0
-_08011CBE:
- asrs r1, 12
- ldr r0, [r3]
- adds r0, r1
- str r0, [r3]
- pop {r0}
- bx r0
- .align 2, 0
- .pool
- thumb_func_end sub_8011CA8
-
- thumb_func_start WriteSaveSector
-WriteSaveSector:
- push {r4-r6,lr}
- adds r5, r1, 0
- adds r4, r2, 0
- ldr r6, [r0]
- adds r1, r4, 0
- bl sub_8011CA8
- adds r0, r5, 0
- adds r1, r4, 0
- bl CalculateChecksum
- ldr r0, _08011D04
- ldr r0, [r0]
- cmp r0, 0
- bne _08011D08
- adds r0, r6, 0
- adds r1, r5, 0
- adds r2, r4, 0
- bl WriteFlashData
- adds r1, r0, 0
- b _08011D28
- .align 2, 0
-_08011D04: .4byte gUnknown_203B184
-_08011D08:
- bl sub_800DAB8
- lsls r0, 24
- cmp r0, 0
- beq _08011D38
- lsls r0, r6, 16
- lsrs r0, 16
- adds r1, r5, 0
- adds r2, r4, 0
- bl sub_800DAB4
- lsls r0, 24
- movs r1, 0
- cmp r0, 0
- bne _08011D28
- movs r1, 0x3
-_08011D28:
- cmp r1, 0x4
- bne _08011D30
- movs r0, 0x1
- b _08011D3A
-_08011D30:
- cmp r1, 0
- bne _08011D38
- movs r0, 0
- b _08011D3A
-_08011D38:
- movs r0, 0x2
-_08011D3A:
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end WriteSaveSector
-
- thumb_func_start ReadSaveSector
-ReadSaveSector:
- push {r4-r6,lr}
- adds r5, r1, 0
- adds r4, r2, 0
- ldr r6, [r0]
- adds r1, r4, 0
- bl sub_8011CA8
- ldr r0, _08011D64
- ldr r0, [r0]
- cmp r0, 0
- bne _08011D68
- adds r0, r6, 0
- adds r1, r5, 0
- adds r2, r4, 0
- bl ReadFlashData
- adds r1, r0, 0
- b _08011D86
- .align 2, 0
-_08011D64: .4byte gUnknown_203B184
-_08011D68:
- bl sub_800DAB8
- lsls r0, 24
- cmp r0, 0
- beq _08011D8A
- lsls r0, r6, 16
- lsrs r0, 16
- adds r1, r5, 0
- adds r2, r4, 0
- bl sub_800DAB0
- lsls r0, 24
- movs r1, 0
- cmp r0, 0
- beq _08011D8A
-_08011D86:
- cmp r1, 0
- beq _08011D8E
-_08011D8A:
- movs r0, 0x1
- b _08011DA2
-_08011D8E:
- adds r0, r5, 0
- adds r1, r4, 0
- bl ValidateChecksum
- lsls r0, 24
- cmp r0, 0
- bne _08011DA0
- movs r0, 0
- b _08011DA2
-_08011DA0:
- movs r0, 0x2
-_08011DA2:
- pop {r4-r6}
- pop {r1}
- bx r1
- thumb_func_end ReadSaveSector
-
thumb_func_start sub_8011DA8
sub_8011DA8:
movs r0, 0x1
diff --git a/asmdiff.sh b/asmdiff.sh
index a4afe79..7c20855 100644
--- a/asmdiff.sh
+++ b/asmdiff.sh
@@ -4,4 +4,4 @@ OBJDUMP="$DEVKITARM/bin/arm-none-eabi-objdump -D -bbinary -marmv4t -Mforce-thumb
OPTIONS="--start-address=$(($1)) --stop-address=$(($1 + $2))"
$OBJDUMP $OPTIONS baserom.gba > baserom.dump
$OBJDUMP $OPTIONS pmd_red.gba > pmd_red.dump
-diff -u baserom.dump pmd_red.dump | less \ No newline at end of file
+diff -u baserom.dump pmd_red.dump
diff --git a/src/save.c b/src/save.c
index 5d39bfe..037938a 100644
--- a/src/save.c
+++ b/src/save.c
@@ -2,9 +2,14 @@
extern u32 gUnknown_203B17C;
extern u32 gUnknown_203B180;
-extern u32 *gUnknown_203B184;
+extern vu32 gUnknown_203B184;
extern u32 gUnknown_202DE28;
+extern s32 ReadFlashData(s32 sector, u8 *src, s32 size);
+extern s32 WriteFlashData(s32 sector, u8 *src, s32 size);
+extern bool8 sub_800DAB0(u16, u8*, s32);
+extern bool8 sub_800DAB4(u16, u8*, s32);
+extern bool8 sub_800DAB8(void);
u32 sub_8011C1C(void)
{
@@ -62,3 +67,63 @@ bool8 ValidateChecksum(u8 *in, u32 size)
return TRUE;
return FALSE;
}
+
+void sub_8011CA8(u32 *out, s32 b)
+{
+ gUnknown_203B184; // Needed to match
+ *out += (b + 0xFFF) / 0x1000;
+}
+
+u32 WriteSaveSector(u32 *a, u8 *b, s32 size, u32 d)
+{
+ u32 r6 = *a;
+ u32 num;
+ sub_8011CA8(a, size);
+ CalculateChecksum(b, size);
+ if (!gUnknown_203B184) {
+ num = WriteFlashData(r6, b, size);
+ }
+ else if (sub_800DAB8()) {
+ num = sub_800DAB4(r6, b, size) ? 0 : 3;
+ }
+ else {
+ return 2;
+ }
+ if (num == 4) {
+ return 1;
+ }
+ else if (num) {
+ return 2;
+ }
+ else {
+ return 0;
+ }
+}
+
+u32 ReadSaveSector(u32 *a, u8 *b, s32 size, u32 d)
+{
+ u32 r6 = *a;
+ u32 num;
+ sub_8011CA8(a, size);
+ if (!gUnknown_203B184) {
+ num = ReadFlashData(r6, b, size);
+ }
+ else if (sub_800DAB8()) {
+ if (!sub_800DAB0(r6, b, size)) {
+ num = 1;
+ }
+ else {
+ num = 0;
+ }
+ }
+ else {
+ return 1;
+ }
+ if (num) {
+ return 1;
+ }
+ if (ValidateChecksum(b, size)) {
+ return 2;
+ }
+ return 0;
+}