summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCameron Hall <cameronghall@cox.net>2019-08-04 23:24:09 -0500
committerCameron Hall <cameronghall@cox.net>2019-08-04 23:24:09 -0500
commit890edd5103b7dcb08dcaed90dcc181abd395f03b (patch)
tree3b0d55dccfb434f1de09a83069468d3abfbe6538
parenta6e0483749782133d78058c25300f2036cc3a1cc (diff)
import agb_sram library
-rwxr-xr-xMakefile3
-rwxr-xr-xasm/rom_3219C.s8
-rwxr-xr-xasm/rom_528AC.s18
-rwxr-xr-xasm/unknown_lib.s230
-rw-r--r--include/agb_sram.h10
-rw-r--r--include/functions.h8
-rwxr-xr-xld_script.txt2
-rw-r--r--libagbbackup.abin0 -> 167598 bytes
-rw-r--r--src/agb_sram.c89
-rwxr-xr-xsrc/titlescreen.c5
-rwxr-xr-xsym_common.txt4
-rw-r--r--sym_ewram.txt12
12 files changed, 125 insertions, 264 deletions
diff --git a/Makefile b/Makefile
index 94bfc73..f6b6a80 100755
--- a/Makefile
+++ b/Makefile
@@ -112,6 +112,9 @@ $(C_BUILDDIR)/m4a_2.o: CC1 := tools/agbcc/bin/old_agbcc
$(C_BUILDDIR)/m4a_4.o: CC1 := tools/agbcc/bin/old_agbcc
$(C_BUILDDIR)/m4a.o: CC1 := tools/agbcc/bin/old_agbcc
+$(C_BUILDDIR)/agb_sram.o: CFLAGS := -mthumb-interwork -Wimplicit -Wparentheses -Werror -O1
+$(C_BUILDDIR)/agb_sram.o: CC1 := tools/agbcc/bin/old_agbcc
+
ifeq ($(NODEP),)
$(C_BUILDDIR)/%.o: c_dep = $(shell $(SCANINC) -I include $(C_SUBDIR)/$*.c)
else
diff --git a/asm/rom_3219C.s b/asm/rom_3219C.s
index 270885e..af67f74 100755
--- a/asm/rom_3219C.s
+++ b/asm/rom_3219C.s
@@ -49099,7 +49099,7 @@ sub_4B654: @ 0x0804B654
str r1, [r0]
ldr r1, _0804B670 @ =0x0E000544
ldr r2, _0804B674 @ =0x00001410
- bl sub_55654
+ bl WriteAndVerifySramFast
pop {r0}
bx r0
.align 2, 0
@@ -49119,7 +49119,7 @@ sub_4B678: @ 0x0804B678
mov r8, r0
cmp r0, #1
bne _0804B6B0
- ldr r3, _0804B6A0 @ =gUnknown_02032FF0
+ ldr r3, _0804B6A0 @ =ReadSramFast
ldr r0, _0804B6A4 @ =0x0E000544
ldr r1, _0804B6A8 @ =gUnknown_020314E0
ldr r1, [r1]
@@ -49128,7 +49128,7 @@ sub_4B678: @ 0x0804B678
bl _call_via_r3
b _0804B746
.align 2, 0
-_0804B6A0: .4byte gUnknown_02032FF0
+_0804B6A0: .4byte ReadSramFast
_0804B6A4: .4byte 0x0E000544
_0804B6A8: .4byte gUnknown_020314E0
_0804B6AC: .4byte 0x00001410
@@ -49779,7 +49779,7 @@ _0804BBCC:
ldr r1, _0804BC30 @ =0x0E000544
adds r0, r6, #0
movs r2, #4
- bl sub_55654
+ bl WriteAndVerifySramFast
_0804BC14:
pop {r3, r4, r5}
mov r8, r3
diff --git a/asm/rom_528AC.s b/asm/rom_528AC.s
index f5f2b88..171370b 100755
--- a/asm/rom_528AC.s
+++ b/asm/rom_528AC.s
@@ -189,7 +189,7 @@ _08052A14: .4byte gUnknown_08533F60
thumb_func_start sub_52A18
sub_52A18: @ 0x08052A18
push {r4, lr}
- bl sub_555BC
+ bl SetSramFastFunc
ldr r4, _08052A4C @ =gMain
movs r0, #0
strb r0, [r4, #0xc]
@@ -232,7 +232,7 @@ sub_52A68: @ 0x08052A68
movs r0, #0
mov r8, r0
movs r7, #0
- ldr r1, _08052B04 @ =gUnknown_02032FF0
+ ldr r1, _08052B04 @ =ReadSramFast
mov sb, r1
_08052A7A:
ldr r5, _08052B08 @ =gUnknown_0200B134
@@ -309,7 +309,7 @@ _08052AF0:
mov r8, r6
b _08052B22
.align 2, 0
-_08052B04: .4byte gUnknown_02032FF0
+_08052B04: .4byte ReadSramFast
_08052B08: .4byte gUnknown_0200B134
_08052B0C: .4byte 0x0E000004
_08052B10: .4byte gUnknown_086BBA6C
@@ -377,11 +377,11 @@ _08052B6A:
lsls r4, r4, #2
adds r0, r5, #0
adds r2, r4, #0
- bl sub_55654
+ bl WriteAndVerifySramFast
ldr r1, _08052BAC @ =0x0E0002A4
adds r0, r5, #0
adds r2, r4, #0
- bl sub_55654
+ bl WriteAndVerifySramFast
pop {r4, r5}
pop {r0}
bx r0
@@ -449,11 +449,11 @@ _08052BFC:
lsls r4, r4, #2
adds r0, r6, #0
adds r2, r4, #0
- bl sub_55654
+ bl WriteAndVerifySramFast
ldr r1, _08052C40 @ =0x0E0002A4
adds r0, r6, #0
adds r2, r4, #0
- bl sub_55654
+ bl WriteAndVerifySramFast
_08052C28:
pop {r4, r5, r6}
pop {r0}
@@ -468,7 +468,7 @@ _08052C40: .4byte 0x0E0002A4
thumb_func_start sub_52C44
sub_52C44: @ 0x08052C44
push {lr}
- ldr r2, _08052C58 @ =gUnknown_02032FF0
+ ldr r2, _08052C58 @ =ReadSramFast
ldr r0, _08052C5C @ =0x0E000544
ldr r1, _08052C60 @ =gUnknown_0200B100
ldr r3, [r2]
@@ -477,7 +477,7 @@ sub_52C44: @ 0x08052C44
pop {r0}
bx r0
.align 2, 0
-_08052C58: .4byte gUnknown_02032FF0
+_08052C58: .4byte ReadSramFast
_08052C5C: .4byte 0x0E000544
_08052C60: .4byte gUnknown_0200B100
diff --git a/asm/unknown_lib.s b/asm/unknown_lib.s
deleted file mode 100755
index a96898d..0000000
--- a/asm/unknown_lib.s
+++ /dev/null
@@ -1,230 +0,0 @@
- .include "asm/macros.inc"
- .include "constants/gba_constants.inc"
-
- @ extern
-
- .syntax unified
-
- .text
-
- thumb_func_start sub_554F0
-sub_554F0: @ 0x080554F0
- push {r4, r5, lr}
- adds r5, r0, #0
- adds r4, r1, #0
- adds r3, r2, #0
- ldr r2, _08055528 @ =0x04000204
- ldrh r0, [r2]
- ldr r1, _0805552C @ =0x0000FFFC
- ands r0, r1
- movs r1, #3
- orrs r0, r1
- strh r0, [r2]
- subs r3, #1
- movs r0, #1
- rsbs r0, r0, #0
- cmp r3, r0
- beq _08055520
- adds r1, r0, #0
-_08055512:
- ldrb r0, [r5]
- strb r0, [r4]
- adds r5, #1
- adds r4, #1
- subs r3, #1
- cmp r3, r1
- bne _08055512
-_08055520:
- pop {r4, r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08055528: .4byte 0x04000204
-_0805552C: .4byte 0x0000FFFC
-
- thumb_func_start sub_55530
-sub_55530: @ 0x08055530
- push {r4, r5, lr}
- adds r5, r0, #0
- adds r4, r1, #0
- adds r3, r2, #0
- ldr r2, _08055568 @ =0x04000204
- ldrh r0, [r2]
- ldr r1, _0805556C @ =0x0000FFFC
- ands r0, r1
- movs r1, #3
- orrs r0, r1
- strh r0, [r2]
- subs r3, #1
- movs r0, #1
- rsbs r0, r0, #0
- cmp r3, r0
- beq _08055560
- adds r1, r0, #0
-_08055552:
- ldrb r0, [r5]
- strb r0, [r4]
- adds r5, #1
- adds r4, #1
- subs r3, #1
- cmp r3, r1
- bne _08055552
-_08055560:
- pop {r4, r5}
- pop {r0}
- bx r0
- .align 2, 0
-_08055568: .4byte 0x04000204
-_0805556C: .4byte 0x0000FFFC
-
- thumb_func_start sub_55570
-sub_55570: @ 0x08055570
- push {r4, r5, lr}
- adds r5, r0, #0
- adds r4, r1, #0
- adds r3, r2, #0
- ldr r2, _080555A4 @ =0x04000204
- ldrh r0, [r2]
- ldr r1, _080555A8 @ =0x0000FFFC
- ands r0, r1
- movs r1, #3
- orrs r0, r1
- strh r0, [r2]
- subs r3, #1
- movs r0, #1
- rsbs r0, r0, #0
- cmp r3, r0
- beq _080555B2
- adds r2, r0, #0
-_08055592:
- ldrb r1, [r4]
- ldrb r0, [r5]
- adds r5, #1
- adds r4, #1
- cmp r1, r0
- beq _080555AC
- subs r0, r4, #1
- b _080555B4
- .align 2, 0
-_080555A4: .4byte 0x04000204
-_080555A8: .4byte 0x0000FFFC
-_080555AC:
- subs r3, #1
- cmp r3, r2
- bne _08055592
-_080555B2:
- movs r0, #0
-_080555B4:
- pop {r4, r5}
- pop {r1}
- bx r1
-
- thumb_func_start sub_555BC
-sub_555BC: @ 0x080555BC
- ldr r2, _080555D0 @ =sub_554F0
- movs r0, #1
- eors r2, r0
- ldr r3, _080555D4 @ =gUnknown_02002FD8
- ldr r0, _080555D8 @ =sub_55530
- ldr r1, _080555D0 @ =sub_554F0
- subs r0, r0, r1
- lsls r0, r0, #0xf
- b _080555E8
- .align 2, 0
-_080555D0: .4byte sub_554F0
-_080555D4: .4byte gUnknown_02002FD8
-_080555D8: .4byte sub_55530
-_080555DC:
- ldrh r0, [r2]
- strh r0, [r3]
- adds r2, #2
- adds r3, #2
- subs r0, r1, #1
- lsls r0, r0, #0x10
-_080555E8:
- lsrs r1, r0, #0x10
- cmp r1, #0
- bne _080555DC
- ldr r1, _08055608 @ =gUnknown_02032FF0
- ldr r0, _0805560C @ =gUnknown_02002FD9
- str r0, [r1]
- ldr r2, _08055610 @ =sub_55570
- movs r0, #1
- eors r2, r0
- ldr r3, _08055614 @ =gUnknown_02002F38
- ldr r0, _08055618 @ =sub_555BC
- ldr r1, _08055610 @ =sub_55570
- subs r0, r0, r1
- lsls r0, r0, #0xf
- b _08055628
- .align 2, 0
-_08055608: .4byte gUnknown_02032FF0
-_0805560C: .4byte gUnknown_02002FD9
-_08055610: .4byte sub_55570
-_08055614: .4byte gUnknown_02002F38
-_08055618: .4byte sub_555BC
-_0805561C:
- ldrh r0, [r2]
- strh r0, [r3]
- adds r2, #2
- adds r3, #2
- subs r0, r1, #1
- lsls r0, r0, #0x10
-_08055628:
- lsrs r1, r0, #0x10
- cmp r1, #0
- bne _0805561C
- ldr r1, _08055644 @ =gUnknown_02032FF4
- ldr r0, _08055648 @ =gUnknown_02002F39
- str r0, [r1]
- ldr r2, _0805564C @ =0x04000204
- ldrh r0, [r2]
- ldr r1, _08055650 @ =0x0000FFFC
- ands r0, r1
- movs r1, #3
- orrs r0, r1
- strh r0, [r2]
- bx lr
- .align 2, 0
-_08055644: .4byte gUnknown_02032FF4
-_08055648: .4byte gUnknown_02002F39
-_0805564C: .4byte 0x04000204
-_08055650: .4byte 0x0000FFFC
-
- thumb_func_start sub_55654
-sub_55654: @ 0x08055654
- push {r4, r5, r6, r7, lr}
- adds r6, r0, #0
- adds r5, r1, #0
- adds r4, r2, #0
- movs r7, #0
- b _08055666
-_08055660:
- adds r0, r7, #1
- lsls r0, r0, #0x18
- lsrs r7, r0, #0x18
-_08055666:
- cmp r7, #2
- bhi _08055688
- adds r0, r6, #0
- adds r1, r5, #0
- adds r2, r4, #0
- bl sub_55530
- ldr r0, _08055690 @ =gUnknown_02032FF4
- ldr r3, [r0]
- adds r0, r6, #0
- adds r1, r5, #0
- adds r2, r4, #0
- bl _call_via_r3
- adds r3, r0, #0
- cmp r3, #0
- bne _08055660
-_08055688:
- adds r0, r3, #0
- pop {r4, r5, r6, r7}
- pop {r1}
- bx r1
- .align 2, 0
-_08055690: .4byte gUnknown_02032FF4
-
- .align 2, 0 @ Don't pad with nop.
diff --git a/include/agb_sram.h b/include/agb_sram.h
new file mode 100644
index 0000000..c609417
--- /dev/null
+++ b/include/agb_sram.h
@@ -0,0 +1,10 @@
+#ifndef GUARD_AGB_SRAM_H
+#define GUARD_AGB_SRAM_H
+
+void SetSramFastFunc(void);
+void WriteSramFast(const u8 *src, u8 *dest, u32 size);
+extern void (*ReadSramFast)(const u8 *src, u8 *dest, u32 size);
+extern u32 (*VerifySramFast)(const u8 *src, u8 *dest, u32 size);
+u32 WriteAndVerifySramFast(const u8 *src, u8 *dest, u32 size);
+
+#endif // GUARD_AGB_SRAM_H \ No newline at end of file
diff --git a/include/functions.h b/include/functions.h
index d6e53d8..c1d64cf 100644
--- a/include/functions.h
+++ b/include/functions.h
@@ -834,12 +834,4 @@ extern void sub_11B74(void);
extern int sub_55A24(u8*); // Rumble Pak?
-// asm/unknown_lib.s
-
-//extern ? sub_554F0();
-//extern ? sub_55530();
-//extern ? sub_55570();
-//extern ? sub_555BC();
-extern void sub_55654(void *, u32, int);
-
#endif // GUARD_FUNCTIONS_H \ No newline at end of file
diff --git a/ld_script.txt b/ld_script.txt
index 5e3b51a..6254b5a 100755
--- a/ld_script.txt
+++ b/ld_script.txt
@@ -50,7 +50,7 @@ SECTIONS
asm/m4a_1.o(.text);
src/m4a.o(.text);
asm/libagbsyscall.o(.text);
- asm/unknown_lib.o(.text);
+ src/agb_sram.o(.text);
*libgcc.a:_call_via_rX.o(.text);
*libgcc.a:_divsi3.o(.text);
*libgcc.a:_dvmd_tls.o(.text);
diff --git a/libagbbackup.a b/libagbbackup.a
new file mode 100644
index 0000000..33163d7
--- /dev/null
+++ b/libagbbackup.a
Binary files differ
diff --git a/src/agb_sram.c b/src/agb_sram.c
new file mode 100644
index 0000000..e58d5fa
--- /dev/null
+++ b/src/agb_sram.c
@@ -0,0 +1,89 @@
+#include "global.h"
+#include "agb_sram.h"
+
+static u16 verifySramFast_Work[80]; // buffer to hold code of VerifySramFast_Core
+static u16 readSramFast_Work[64]; // buffer to hold code of ReadSramFast_Core
+
+u32 (*VerifySramFast)(const u8 *src, u8 *dest, u32 size); // pointer to verifySramFast_Work
+void (*ReadSramFast)(const u8 *src, u8 *dest, u32 size); // pointer to readSramFast_Work
+
+void ReadSramFast_Core(const u8 *src, u8 *dest, u32 size)
+{
+ REG_WAITCNT = (REG_WAITCNT & ~3) | 3;
+ while (--size != -1)
+ *dest++ = *src++;
+}
+
+void WriteSramFast(const u8 *src, u8 *dest, u32 size)
+{
+ REG_WAITCNT = (REG_WAITCNT & ~3) | 3;
+ while (--size != -1)
+ *dest++ = *src++;
+}
+
+u32 VerifySramFast_Core(const u8 *src, u8 *dest, u32 size)
+{
+ REG_WAITCNT = (REG_WAITCNT & ~3) | 3;
+ while (--size != -1)
+ {
+ if (*dest++ != *src++)
+ return (u32)(dest - 1);
+ }
+ return 0;
+}
+
+void SetSramFastFunc(void)
+{
+ u16 *src;
+ u16 *dest;
+ u16 size;
+
+ src = (u16 *)ReadSramFast_Core;
+ // clear the least significant bit so that we get the actual start address of the function
+ src = (u16 *)((uintptr_t)src ^ 1); // NOTE: In Fire Emblem 8, this is '& ~1' instead of '^ 1'.
+ dest = readSramFast_Work;
+ // get the size of the function by subtracting the address of the next function
+ size = ((uintptr_t)WriteSramFast - (uintptr_t)ReadSramFast_Core) / 2;
+ // copy the function into the WRAM buffer
+ while (size != 0)
+ {
+ *dest++ = *src++;
+ size--;
+ }
+ // add 1 to the address of the buffer so that we stay in THUMB mode when bx-ing to the address
+ ReadSramFast = (void *)((uintptr_t)readSramFast_Work + 1);
+
+ src = (u16 *)VerifySramFast_Core;
+ // clear the least significant bit so that we get the actual start address of the function
+ src = (u16 *)((uintptr_t)src ^ 1); // NOTE: In Fire Emblem 8, this is '& ~1' instead of '^ 1'.
+ dest = verifySramFast_Work;
+ // get the size of the function by subtracting the address of the next function
+ size = ((uintptr_t)SetSramFastFunc - (uintptr_t)VerifySramFast_Core) / 2;
+ // copy the function into the WRAM buffer
+ while (size != 0)
+ {
+ *dest++ = *src++;
+ size--;
+ }
+ // add 1 to the address of the buffer so that we stay in THUMB mode when bx-ing to the address
+ VerifySramFast = (void *)((uintptr_t)verifySramFast_Work + 1);
+
+ REG_WAITCNT = (REG_WAITCNT & ~3) | 3;
+}
+
+u32 WriteAndVerifySramFast(const u8 *src, u8 *dest, u32 size)
+{
+ u8 i;
+ u32 errorAddr;
+
+ // try writing and verifying the data 3 times
+ for (i = 0; i < 3; i++)
+ {
+ WriteSramFast(src, dest, size);
+ errorAddr = VerifySramFast(src, dest, size);
+ if (errorAddr == 0)
+ break;
+ }
+
+ return errorAddr;
+}
diff --git a/src/titlescreen.c b/src/titlescreen.c
index a4e75e7..6a2bcac 100755
--- a/src/titlescreen.c
+++ b/src/titlescreen.c
@@ -1,6 +1,7 @@
#include "global.h"
-#include "titlescreen.h"
+#include "agb_sram.h"
#include "m4a.h"
+#include "titlescreen.h"
#include "main.h"
static void sub_114FC(void);
@@ -852,5 +853,5 @@ void sub_11B74(void)
sub_52C64();
sub_52B30();
gMain.unk40 = 0;
- sub_55654(&gMain.unk40, 0x0E000544 /* Possibly SRAM address */, 4);
+ WriteAndVerifySramFast((const u8 *)&gMain.unk40, (void *)0x0E000544, 4);
}
diff --git a/sym_common.txt b/sym_common.txt
index 93b48cf..433c13b 100755
--- a/sym_common.txt
+++ b/sym_common.txt
@@ -2,8 +2,8 @@
gUnknown_02032FB0: @ 0x02032FB0
.space 0x40
-gUnknown_02032FF0: @ 0x02032FF0
+ReadSramFast: @ 0x02032FF0
.space 0x4
-gUnknown_02032FF4: @ 0x02032FF4
+VerifySramFast: @ 0x02032FF4
.space 0xF7C08C
gUnknown_02FAF080: @ 0x02FAF080
diff --git a/sym_ewram.txt b/sym_ewram.txt
index 88ea13f..22057c0 100644
--- a/sym_ewram.txt
+++ b/sym_ewram.txt
@@ -84,14 +84,10 @@ gUnknown_0200293A: @ 0x0200293A
.space 0x1E
gUnknown_02002958: @ 0x2002958
.space 0x5E0
-gUnknown_02002F38: @ 0x02002F38
- .space 0x1
-gUnknown_02002F39: @ 0x02002F39
- .space 0x9F
-gUnknown_02002FD8: @ 0x02002FD8
- .space 0x1
-gUnknown_02002FD9: @ 0x02002FD9
- .space 0x87
+verifySramFast_Work: @ 0x02002F38
+ .space 0xA0
+readSramFast_Work: @ 0x02002FD8
+ .space 0x88
gIntrTable: @ 0x2003060
.space 0x40
gUnknown_020030A0: @ 0x020030A0