diff options
author | Cameron Hall <cameronghall@cox.net> | 2019-08-04 23:24:09 -0500 |
---|---|---|
committer | Cameron Hall <cameronghall@cox.net> | 2019-08-04 23:24:09 -0500 |
commit | 890edd5103b7dcb08dcaed90dcc181abd395f03b (patch) | |
tree | 3b0d55dccfb434f1de09a83069468d3abfbe6538 | |
parent | a6e0483749782133d78058c25300f2036cc3a1cc (diff) |
import agb_sram library
-rwxr-xr-x | Makefile | 3 | ||||
-rwxr-xr-x | asm/rom_3219C.s | 8 | ||||
-rwxr-xr-x | asm/rom_528AC.s | 18 | ||||
-rwxr-xr-x | asm/unknown_lib.s | 230 | ||||
-rw-r--r-- | include/agb_sram.h | 10 | ||||
-rw-r--r-- | include/functions.h | 8 | ||||
-rwxr-xr-x | ld_script.txt | 2 | ||||
-rw-r--r-- | libagbbackup.a | bin | 0 -> 167598 bytes | |||
-rw-r--r-- | src/agb_sram.c | 89 | ||||
-rwxr-xr-x | src/titlescreen.c | 5 | ||||
-rwxr-xr-x | sym_common.txt | 4 | ||||
-rw-r--r-- | sym_ewram.txt | 12 |
12 files changed, 125 insertions, 264 deletions
@@ -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 Binary files differnew file mode 100644 index 0000000..33163d7 --- /dev/null +++ b/libagbbackup.a 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 |