From 143e9809fc053a24d7041c2efc2865b7f1cb7d8a Mon Sep 17 00:00:00 2001 From: Henny022p Date: Fri, 19 Feb 2021 14:27:13 +0100 Subject: [PATCH 01/30] matched sub_080B1520 --- Makefile | 1 + asm/code_080B1520.s | 38 ------------ .../code_080B1520/sub_080B1568.inc | 62 +++++++++++++++++++ linker.ld | 1 + src/code_080B1520.c | 23 +++++++ 5 files changed, 87 insertions(+), 38 deletions(-) create mode 100644 asm/non_matching/code_080B1520/sub_080B1568.inc create mode 100644 src/code_080B1520.c diff --git a/Makefile b/Makefile index 6ffb4b4a..233f3c7d 100644 --- a/Makefile +++ b/Makefile @@ -83,6 +83,7 @@ NODEP := 1 endif #$(C_BUILDDIR)/need_interworking_file_name.o: CFLAGS += -mthumb-interwork +$(C_BUILDDIR)/code_080B1520.o: CFLAGS += -mthumb-interwork C_SRCS := $(wildcard $(C_SUBDIR)/*.c $(C_SUBDIR)/*/*.c) C_OBJS := $(patsubst $(C_SUBDIR)/%.c,$(C_BUILDDIR)/%.o,$(C_SRCS)) diff --git a/asm/code_080B1520.s b/asm/code_080B1520.s index 9ecbe88a..6a90c190 100644 --- a/asm/code_080B1520.s +++ b/asm/code_080B1520.s @@ -5,44 +5,6 @@ .text - thumb_func_start sub_080B1520 -sub_080B1520: @ 0x080B1520 - push {lr} - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - movs r2, #0 - cmp r0, #4 - bne _080B153C - ldr r1, _080B1534 @ =gUnk_02036A50 - ldr r0, _080B1538 @ =gUnk_08DE7D40 - str r0, [r1] - b _080B1558 - .align 2, 0 -_080B1534: .4byte gUnk_02036A50 -_080B1538: .4byte gUnk_08DE7D40 -_080B153C: - cmp r0, #0x40 - bne _080B1550 - ldr r1, _080B1548 @ =gUnk_02036A50 - ldr r0, _080B154C @ =gUnk_08DE7D4C - str r0, [r1] - b _080B1558 - .align 2, 0 -_080B1548: .4byte gUnk_02036A50 -_080B154C: .4byte gUnk_08DE7D4C -_080B1550: - ldr r1, _080B1560 @ =gUnk_02036A50 - ldr r0, _080B1564 @ =gUnk_08DE7D40 - str r0, [r1] - movs r2, #1 -_080B1558: - adds r0, r2, #0 - pop {r1} - bx r1 - .align 2, 0 -_080B1560: .4byte gUnk_02036A50 -_080B1564: .4byte gUnk_08DE7D40 - thumb_func_start sub_080B1568 sub_080B1568: @ 0x080B1568 push {r4, r5, r6, lr} diff --git a/asm/non_matching/code_080B1520/sub_080B1568.inc b/asm/non_matching/code_080B1520/sub_080B1568.inc new file mode 100644 index 00000000..2c79cd29 --- /dev/null +++ b/asm/non_matching/code_080B1520/sub_080B1568.inc @@ -0,0 +1,62 @@ + .syntax unified + .text + push {r4, r5, r6, lr} + lsls r2, r2, #0x10 + lsrs r2, r2, #0x10 + ldr r4, _080B15C8 @ =0x04000208 + ldrh r3, [r4] + adds r6, r3, #0 + movs r3, #0 + strh r3, [r4] + ldr r5, _080B15CC @ =0x04000204 + ldrh r4, [r5] + ldr r3, _080B15D0 @ =0x0000F8FF + ands r4, r3 + ldr r3, _080B15D4 @ =gUnk_02036A50 + ldr r3, [r3] + ldrh r3, [r3, #6] + orrs r4, r3 + strh r4, [r5] + ldr r3, _080B15D8 @ =0x040000D4 + str r0, [r3] + ldr r0, _080B15DC @ =0x040000D8 + str r1, [r0] + ldr r1, _080B15E0 @ =0x040000DC + movs r0, #0x80 + lsls r0, r0, #0x18 + orrs r2, r0 + str r2, [r1] + adds r1, #2 + movs r2, #0x80 + lsls r2, r2, #8 + adds r0, r2, #0 + ldrh r1, [r1] + ands r0, r1 + cmp r0, #0 + beq _080B15BC + ldr r2, _080B15E4 @ =0x040000DE + movs r0, #0x80 + lsls r0, r0, #8 + adds r1, r0, #0 +_080B15B4: + ldrh r0, [r2] + ands r0, r1 + cmp r0, #0 + bne _080B15B4 +_080B15BC: + ldr r0, _080B15C8 @ =0x04000208 + strh r6, [r0] + pop {r4, r5, r6} + pop {r0} + bx r0 + .align 2, 0 +_080B15C8: .4byte 0x04000208 +_080B15CC: .4byte 0x04000204 +_080B15D0: .4byte 0x0000F8FF +_080B15D4: .4byte gUnk_02036A50 +_080B15D8: .4byte 0x040000D4 +_080B15DC: .4byte 0x040000D8 +_080B15E0: .4byte 0x040000DC +_080B15E4: .4byte 0x040000DE + + .syntax divided \ No newline at end of file diff --git a/linker.ld b/linker.ld index 0267d7cd..4cfa3dfc 100644 --- a/linker.ld +++ b/linker.ld @@ -899,6 +899,7 @@ SECTIONS { asm/m4a_asm.o(.text); asm/m4a.o(.text); asm/libagbsyscall.o(.text); + src/code_080B1520.o(.text); asm/code_080B1520.o(.text); *libc.a:memcpy.o(.text); diff --git a/src/code_080B1520.c b/src/code_080B1520.c new file mode 100644 index 00000000..8f461ced --- /dev/null +++ b/src/code_080B1520.c @@ -0,0 +1,23 @@ +#include "global.h" + +extern u16 (*gUnk_02036A50)[]; +extern u16 gUnk_08DE7D40[]; +extern u16 gUnk_08DE7D4C[]; + +u32 sub_080B1520(u16 unk_1) { + u32 ret; + + ret = 0; + if (unk_1 == 4) { + gUnk_02036A50 = &gUnk_08DE7D40; + } else { + if (unk_1 == 0x40) { + gUnk_02036A50 = &gUnk_08DE7D4C; + } else { + gUnk_02036A50 = &gUnk_08DE7D40; + ret = 1; + } + } + return ret; +} + From 5384f3daa916de75240d9cd82b676fa9a20f8f27 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Fri, 19 Feb 2021 14:30:49 +0100 Subject: [PATCH 02/30] nonmatch sub_080B1568 --- asm/code_080B1520.s | 61 ------------------- .../code_080B1520/sub_080B1568.inc | 2 +- src/code_080B1520.c | 23 +++++++ 3 files changed, 24 insertions(+), 62 deletions(-) diff --git a/asm/code_080B1520.s b/asm/code_080B1520.s index 6a90c190..0400faab 100644 --- a/asm/code_080B1520.s +++ b/asm/code_080B1520.s @@ -5,67 +5,6 @@ .text - thumb_func_start sub_080B1568 -sub_080B1568: @ 0x080B1568 - push {r4, r5, r6, lr} - lsls r2, r2, #0x10 - lsrs r2, r2, #0x10 - ldr r4, _080B15C8 @ =0x04000208 - ldrh r3, [r4] - adds r6, r3, #0 - movs r3, #0 - strh r3, [r4] - ldr r5, _080B15CC @ =0x04000204 - ldrh r4, [r5] - ldr r3, _080B15D0 @ =0x0000F8FF - ands r4, r3 - ldr r3, _080B15D4 @ =gUnk_02036A50 - ldr r3, [r3] - ldrh r3, [r3, #6] - orrs r4, r3 - strh r4, [r5] - ldr r3, _080B15D8 @ =0x040000D4 - str r0, [r3] - ldr r0, _080B15DC @ =0x040000D8 - str r1, [r0] - ldr r1, _080B15E0 @ =0x040000DC - movs r0, #0x80 - lsls r0, r0, #0x18 - orrs r2, r0 - str r2, [r1] - adds r1, #2 - movs r2, #0x80 - lsls r2, r2, #8 - adds r0, r2, #0 - ldrh r1, [r1] - ands r0, r1 - cmp r0, #0 - beq _080B15BC - ldr r2, _080B15E4 @ =0x040000DE - movs r0, #0x80 - lsls r0, r0, #8 - adds r1, r0, #0 -_080B15B4: - ldrh r0, [r2] - ands r0, r1 - cmp r0, #0 - bne _080B15B4 -_080B15BC: - ldr r0, _080B15C8 @ =0x04000208 - strh r6, [r0] - pop {r4, r5, r6} - pop {r0} - bx r0 - .align 2, 0 -_080B15C8: .4byte 0x04000208 -_080B15CC: .4byte 0x04000204 -_080B15D0: .4byte 0x0000F8FF -_080B15D4: .4byte gUnk_02036A50 -_080B15D8: .4byte 0x040000D4 -_080B15DC: .4byte 0x040000D8 -_080B15E0: .4byte 0x040000DC -_080B15E4: .4byte 0x040000DE - thumb_func_start sub_080B15E8 sub_080B15E8: @ 0x080B15E8 push {r4, r5, r6, lr} diff --git a/asm/non_matching/code_080B1520/sub_080B1568.inc b/asm/non_matching/code_080B1520/sub_080B1568.inc index 2c79cd29..29a887f1 100644 --- a/asm/non_matching/code_080B1520/sub_080B1568.inc +++ b/asm/non_matching/code_080B1520/sub_080B1568.inc @@ -59,4 +59,4 @@ _080B15DC: .4byte 0x040000D8 _080B15E0: .4byte 0x040000DC _080B15E4: .4byte 0x040000DE - .syntax divided \ No newline at end of file + .syntax divided diff --git a/src/code_080B1520.c b/src/code_080B1520.c index 8f461ced..989efe66 100644 --- a/src/code_080B1520.c +++ b/src/code_080B1520.c @@ -21,3 +21,26 @@ u32 sub_080B1520(u16 unk_1) { return ret; } +NONMATCH("asm/non_matching/code_080B1520/sub_080B1568.inc", void sub_080B1568(u32 unk_1, u32 unk_2, u32 unk_3)) { + u32 temp; + + u16 u1; + u16 IME_save; + u16* ptr; + + u1 = unk_3; + IME_save = REG_IME; + REG_IME = 0; + temp = REG_WAITCNT & 0xf8ff; + ptr = *gUnk_02036A50; + temp |= ptr[3]; + REG_WAITCNT = temp; + REG_DMA3SAD = unk_1; + REG_DMA3DAD = unk_2; + REG_DMA3CNT = u1 | 0x80000000; + if ((REG_DMA3CNT_H & 0x8000) != 0) { + while ((REG_DMA3CNT_H & 0x8000) != 0) {} + } + REG_IME = IME_save; +} +END_NONMATCH From 689ea85c5bf9dca6c2e23ef18bd30c80cd52bee3 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Sat, 20 Feb 2021 18:56:27 +0100 Subject: [PATCH 03/30] matched sub_080B15E8... --- Makefile | 2 +- asm/code_080B1520.s | 93 --------------------------------------------- src/code_080B1520.c | 62 +++++++++++++++++++++++++----- 3 files changed, 53 insertions(+), 104 deletions(-) diff --git a/Makefile b/Makefile index 233f3c7d..6392fabb 100644 --- a/Makefile +++ b/Makefile @@ -83,7 +83,7 @@ NODEP := 1 endif #$(C_BUILDDIR)/need_interworking_file_name.o: CFLAGS += -mthumb-interwork -$(C_BUILDDIR)/code_080B1520.o: CFLAGS += -mthumb-interwork +$(C_BUILDDIR)/code_080B1520.o: CFLAGS = -O1 -mthumb-interwork -Wimplicit -Wparentheses -Werror -Wno-multichar C_SRCS := $(wildcard $(C_SUBDIR)/*.c $(C_SUBDIR)/*/*.c) C_OBJS := $(patsubst $(C_SUBDIR)/%.c,$(C_BUILDDIR)/%.o,$(C_SRCS)) diff --git a/asm/code_080B1520.s b/asm/code_080B1520.s index 0400faab..99a98729 100644 --- a/asm/code_080B1520.s +++ b/asm/code_080B1520.s @@ -5,99 +5,6 @@ .text - thumb_func_start sub_080B15E8 -sub_080B15E8: @ 0x080B15E8 - push {r4, r5, r6, lr} - sub sp, #0x88 - adds r5, r1, #0 - lsls r0, r0, #0x10 - lsrs r3, r0, #0x10 - ldr r0, _080B1600 @ =gUnk_02036A50 - ldr r0, [r0] - ldrh r0, [r0, #4] - cmp r3, r0 - blo _080B1608 - ldr r0, _080B1604 @ =0x000080FF - b _080B168A - .align 2, 0 -_080B1600: .4byte gUnk_02036A50 -_080B1604: .4byte 0x000080FF -_080B1608: - ldr r0, _080B1694 @ =gUnk_02036A50 - adds r6, r0, #0 - ldr r0, [r0] - ldrb r1, [r0, #8] - lsls r0, r1, #1 - mov r4, sp - adds r2, r0, r4 - adds r2, #2 - movs r4, #0 - cmp r4, r1 - bhs _080B1632 -_080B161E: - strh r3, [r2] - subs r2, #2 - lsrs r3, r3, #1 - adds r0, r4, #1 - lsls r0, r0, #0x18 - lsrs r4, r0, #0x18 - ldr r0, [r6] - ldrb r0, [r0, #8] - cmp r4, r0 - blo _080B161E -_080B1632: - movs r0, #1 - strh r0, [r2] - subs r2, #2 - strh r0, [r2] - movs r4, #0xd0 - lsls r4, r4, #0x14 - ldr r0, _080B1694 @ =gUnk_02036A50 - ldr r0, [r0] - ldrb r2, [r0, #8] - adds r2, #3 - mov r0, sp - adds r1, r4, #0 - bl sub_080B1568 - adds r0, r4, #0 - mov r1, sp - movs r2, #0x44 - bl sub_080B1568 - add r2, sp, #8 - adds r5, #6 - movs r4, #0 - movs r6, #1 -_080B1660: - movs r1, #0 - movs r3, #0 -_080B1664: - lsls r1, r1, #0x11 - ldrh r0, [r2] - ands r0, r6 - lsrs r1, r1, #0x10 - orrs r1, r0 - adds r2, #2 - adds r0, r3, #1 - lsls r0, r0, #0x18 - lsrs r3, r0, #0x18 - cmp r3, #0xf - bls _080B1664 - strh r1, [r5] - subs r5, #2 - adds r0, r4, #1 - lsls r0, r0, #0x18 - lsrs r4, r0, #0x18 - cmp r4, #3 - bls _080B1660 - movs r0, #0 -_080B168A: - add sp, #0x88 - pop {r4, r5, r6} - pop {r1} - bx r1 - .align 2, 0 -_080B1694: .4byte gUnk_02036A50 - thumb_func_start sub_080B1698 sub_080B1698: @ 0x080B1698 push {lr} diff --git a/src/code_080B1520.c b/src/code_080B1520.c index 989efe66..c86d10bc 100644 --- a/src/code_080B1520.c +++ b/src/code_080B1520.c @@ -1,8 +1,17 @@ #include "global.h" -extern u16 (*gUnk_02036A50)[]; -extern u16 gUnk_08DE7D40[]; -extern u16 gUnk_08DE7D4C[]; +typedef struct struct_08DE7D40 { + u16 unk_00; + u16 unk_02; + u16 unk_04; + u16 unk_06; + u8 unk_08; + u8 filler[3]; +} struct_08DE7D40; + +extern struct_08DE7D40* gUnk_02036A50; +extern struct_08DE7D40 gUnk_08DE7D40; +extern struct_08DE7D40 gUnk_08DE7D4C; u32 sub_080B1520(u16 unk_1) { u32 ret; @@ -21,22 +30,20 @@ u32 sub_080B1520(u16 unk_1) { return ret; } -NONMATCH("asm/non_matching/code_080B1520/sub_080B1568.inc", void sub_080B1568(u32 unk_1, u32 unk_2, u32 unk_3)) { +NONMATCH("asm/non_matching/code_080B1520/sub_080B1568.inc", void sub_080B1568(u16* src, u16* dest, u32 cnt)) { u32 temp; u16 u1; u16 IME_save; - u16* ptr; - u1 = unk_3; + u1 = cnt; IME_save = REG_IME; REG_IME = 0; temp = REG_WAITCNT & 0xf8ff; - ptr = *gUnk_02036A50; - temp |= ptr[3]; + temp |= gUnk_02036A50->unk_06; REG_WAITCNT = temp; - REG_DMA3SAD = unk_1; - REG_DMA3DAD = unk_2; + REG_DMA3SAD = (u32)src; + REG_DMA3DAD = (u32)dest; REG_DMA3CNT = u1 | 0x80000000; if ((REG_DMA3CNT_H & 0x8000) != 0) { while ((REG_DMA3CNT_H & 0x8000) != 0) {} @@ -44,3 +51,38 @@ NONMATCH("asm/non_matching/code_080B1520/sub_080B1568.inc", void sub_080B1568(u3 REG_IME = IME_save; } END_NONMATCH + +u32 sub_080B15E8(u16 unk_1, u16* unk_2) { + u16 stack[0x44]; + + u16* ptr; + u8 t1, t2; + u16 value; + + if (unk_1 >= gUnk_02036A50->unk_04) { + return 0x80ff; + } else { + ptr = stack; + (u8*)ptr += (gUnk_02036A50->unk_08 << 1) + 1; + ((u8*)ptr)++; + for (t1 = 0; t1 < gUnk_02036A50->unk_08; t1++) { + *(ptr--) = unk_1; + unk_1 >>= 1; + } + *(ptr--) = 1; + *ptr = 1; + sub_080B1568(stack, (u16*)0xd000000, gUnk_02036A50->unk_08 + 3); + sub_080B1568((u16*)0xd000000, stack, 0x44); + ptr = stack + 4; + unk_2 += 3; + for (t1 = 0; t1 < 4; t1++) { + value = 0; + for (t2 = 0; t2 < 0x10; t2++) { + value <<= 1; + value |= (*ptr++) & 1; + } + *(unk_2--) = value; + } + return 0; + } +} From f089e58a243fd7b6bf2ffb39caa625127163c6fe Mon Sep 17 00:00:00 2001 From: Henny022p Date: Sat, 20 Feb 2021 19:06:23 +0100 Subject: [PATCH 04/30] matched sub_080B1698 --- asm/code_080B1520.s | 12 ------------ src/code_080B1520.c | 6 ++++++ 2 files changed, 6 insertions(+), 12 deletions(-) diff --git a/asm/code_080B1520.s b/asm/code_080B1520.s index 99a98729..565d01ef 100644 --- a/asm/code_080B1520.s +++ b/asm/code_080B1520.s @@ -5,18 +5,6 @@ .text - thumb_func_start sub_080B1698 -sub_080B1698: @ 0x080B1698 - push {lr} - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - movs r2, #1 - bl sub_080B16AC - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - pop {r1} - bx r1 - thumb_func_start sub_080B16AC sub_080B16AC: @ 0x080B16AC push {r4, r5, r6, r7, lr} diff --git a/src/code_080B1520.c b/src/code_080B1520.c index c86d10bc..675e321f 100644 --- a/src/code_080B1520.c +++ b/src/code_080B1520.c @@ -13,6 +13,8 @@ extern struct_08DE7D40* gUnk_02036A50; extern struct_08DE7D40 gUnk_08DE7D40; extern struct_08DE7D40 gUnk_08DE7D4C; +u16 sub_080B16AC(u16, u32, u32); + u32 sub_080B1520(u16 unk_1) { u32 ret; @@ -86,3 +88,7 @@ u32 sub_080B15E8(u16 unk_1, u16* unk_2) { return 0; } } + +u16 sub_080B1698(u16 unk_1, u32 unk_2){ + return sub_080B16AC(unk_1, unk_2, 1); +} From 7cb0eee76a3fbc6400f7bc80198e2fcd5312f3d3 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Thu, 25 Feb 2021 23:33:03 +0100 Subject: [PATCH 05/30] nonmatch sub_080B16AC --- asm/code_080B1520.s | 189 ----------------- .../code_080B1520/sub_080B16AC.inc | 192 ++++++++++++++++++ src/code_080B1520.c | 94 ++++++++- 3 files changed, 284 insertions(+), 191 deletions(-) create mode 100644 asm/non_matching/code_080B1520/sub_080B16AC.inc diff --git a/asm/code_080B1520.s b/asm/code_080B1520.s index 565d01ef..e84f6af1 100644 --- a/asm/code_080B1520.s +++ b/asm/code_080B1520.s @@ -5,195 +5,6 @@ .text - thumb_func_start sub_080B16AC -sub_080B16AC: @ 0x080B16AC - push {r4, r5, r6, r7, lr} - sub sp, #0xb0 - adds r5, r1, #0 - lsls r0, r0, #0x10 - lsrs r1, r0, #0x10 - lsls r2, r2, #0x18 - lsrs r7, r2, #0x18 - ldr r0, _080B16C8 @ =gUnk_02036A50 - ldr r0, [r0] - ldrh r0, [r0, #4] - cmp r1, r0 - blo _080B16D0 - ldr r0, _080B16CC @ =0x000080FF - b _080B1804 - .align 2, 0 -_080B16C8: .4byte gUnk_02036A50 -_080B16CC: .4byte 0x000080FF -_080B16D0: - ldr r0, _080B1710 @ =gUnk_02036A50 - ldr r0, [r0] - ldrb r0, [r0, #8] - lsls r0, r0, #1 - mov r2, sp - adds r3, r0, r2 - adds r3, #0x84 - movs r0, #0 - strh r0, [r3] - subs r3, #2 - movs r4, #0 -_080B16E6: - ldrh r2, [r5] - adds r5, #2 - movs r0, #0 -_080B16EC: - strh r2, [r3] - subs r3, #2 - lsrs r2, r2, #1 - adds r0, #1 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - cmp r0, #0xf - bls _080B16EC - adds r0, r4, #1 - lsls r0, r0, #0x18 - lsrs r4, r0, #0x18 - cmp r4, #3 - bls _080B16E6 - movs r4, #0 - ldr r0, _080B1710 @ =gUnk_02036A50 - adds r2, r0, #0 - ldr r0, [r0] - b _080B1722 - .align 2, 0 -_080B1710: .4byte gUnk_02036A50 -_080B1714: - strh r1, [r3] - subs r3, #2 - lsrs r1, r1, #1 - adds r0, r4, #1 - lsls r0, r0, #0x18 - lsrs r4, r0, #0x18 - ldr r0, [r2] -_080B1722: - ldrb r0, [r0, #8] - cmp r4, r0 - blo _080B1714 - movs r0, #0 - strh r0, [r3] - subs r3, #2 - movs r6, #1 - strh r6, [r3] - movs r4, #0xd0 - lsls r4, r4, #0x14 - ldr r0, _080B1794 @ =gUnk_02036A50 - ldr r0, [r0] - ldrb r2, [r0, #8] - adds r2, #0x43 - mov r0, sp - adds r1, r4, #0 - bl sub_080B1568 - movs r5, #0 - add r2, sp, #0xa4 - strh r5, [r2] - mov r1, sp - adds r1, #0xa6 - ldr r0, _080B1798 @ =0x04000006 - ldrh r0, [r0] - strh r0, [r1] - add r0, sp, #0xac - str r5, [r0] - ldrh r0, [r2] - cmp r0, #0 - bne _080B1768 - ldrh r0, [r4] - ands r0, r6 - cmp r0, #0 - bne _080B17F8 -_080B1768: - add r3, sp, #0xa8 - ldr r0, _080B1798 @ =0x04000006 - ldrh r0, [r0] - strh r0, [r3] - mov r4, sp - adds r4, #0xa6 - ldrh r1, [r3] - ldrh r0, [r4] - cmp r1, r0 - beq _080B17E2 - ldrh r1, [r3] - ldrh r0, [r4] - cmp r1, r0 - bls _080B179C - add r2, sp, #0xac - ldrh r1, [r3] - ldrh r0, [r4] - subs r1, r1, r0 - ldr r0, [r2] - adds r1, r1, r0 - str r1, [r2] - b _080B17B2 - .align 2, 0 -_080B1794: .4byte gUnk_02036A50 -_080B1798: .4byte 0x04000006 -_080B179C: - add r2, sp, #0xac - add r0, sp, #0xa8 - ldrh r0, [r0] - adds r0, #0xe4 - mov r1, sp - adds r1, #0xa6 - ldrh r1, [r1] - subs r0, r0, r1 - ldr r1, [r2] - adds r0, r0, r1 - str r0, [r2] -_080B17B2: - add r0, sp, #0xac - ldr r0, [r0] - cmp r0, #0x88 - bls _080B17D8 - add r0, sp, #0xa4 - ldrh r0, [r0] - cmp r0, #0 - bne _080B1802 - movs r0, #0xd0 - lsls r0, r0, #0x14 - ldrh r0, [r0] - movs r1, #1 - ands r0, r1 - cmp r0, #0 - bne _080B1802 - ldr r5, _080B17D4 @ =0x0000C001 - b _080B1802 - .align 2, 0 -_080B17D4: .4byte 0x0000C001 -_080B17D8: - mov r0, sp - adds r0, #0xa6 - add r1, sp, #0xa8 - ldrh r1, [r1] - strh r1, [r0] -_080B17E2: - add r2, sp, #0xa4 - ldrh r0, [r2] - cmp r0, #0 - bne _080B1768 - movs r0, #0xd0 - lsls r0, r0, #0x14 - movs r1, #1 - ldrh r0, [r0] - ands r1, r0 - cmp r1, #0 - beq _080B1768 -_080B17F8: - ldrh r0, [r2] - adds r0, #1 - strh r0, [r2] - cmp r7, #0 - bne _080B1768 -_080B1802: - adds r0, r5, #0 -_080B1804: - add sp, #0xb0 - pop {r4, r5, r6, r7} - pop {r1} - bx r1 - thumb_func_start sub_080B180C sub_080B180C: @ 0x080B180C push {r4, r5, lr} diff --git a/asm/non_matching/code_080B1520/sub_080B16AC.inc b/asm/non_matching/code_080B1520/sub_080B16AC.inc new file mode 100644 index 00000000..32a1a164 --- /dev/null +++ b/asm/non_matching/code_080B1520/sub_080B16AC.inc @@ -0,0 +1,192 @@ + + .syntax unified + .text + + push {r4, r5, r6, r7, lr} + sub sp, #0xb0 + adds r5, r1, #0 + lsls r0, r0, #0x10 + lsrs r1, r0, #0x10 + lsls r2, r2, #0x18 + lsrs r7, r2, #0x18 + ldr r0, _080B16C8 @ =gUnk_02036A50 + ldr r0, [r0] + ldrh r0, [r0, #4] + cmp r1, r0 + blo _080B16D0 + ldr r0, _080B16CC @ =0x000080FF + b _080B1804 + .align 2, 0 +_080B16C8: .4byte gUnk_02036A50 +_080B16CC: .4byte 0x000080FF +_080B16D0: + ldr r0, _080B1710 @ =gUnk_02036A50 + ldr r0, [r0] + ldrb r0, [r0, #8] + lsls r0, r0, #1 + mov r2, sp + adds r3, r0, r2 + adds r3, #0x84 + movs r0, #0 + strh r0, [r3] + subs r3, #2 + movs r4, #0 +_080B16E6: + ldrh r2, [r5] + adds r5, #2 + movs r0, #0 +_080B16EC: + strh r2, [r3] + subs r3, #2 + lsrs r2, r2, #1 + adds r0, #1 + lsls r0, r0, #0x18 + lsrs r0, r0, #0x18 + cmp r0, #0xf + bls _080B16EC + adds r0, r4, #1 + lsls r0, r0, #0x18 + lsrs r4, r0, #0x18 + cmp r4, #3 + bls _080B16E6 + movs r4, #0 + ldr r0, _080B1710 @ =gUnk_02036A50 + adds r2, r0, #0 + ldr r0, [r0] + b _080B1722 + .align 2, 0 +_080B1710: .4byte gUnk_02036A50 +_080B1714: + strh r1, [r3] + subs r3, #2 + lsrs r1, r1, #1 + adds r0, r4, #1 + lsls r0, r0, #0x18 + lsrs r4, r0, #0x18 + ldr r0, [r2] +_080B1722: + ldrb r0, [r0, #8] + cmp r4, r0 + blo _080B1714 + movs r0, #0 + strh r0, [r3] + subs r3, #2 + movs r6, #1 + strh r6, [r3] + movs r4, #0xd0 + lsls r4, r4, #0x14 + ldr r0, _080B1794 @ =gUnk_02036A50 + ldr r0, [r0] + ldrb r2, [r0, #8] + adds r2, #0x43 + mov r0, sp + adds r1, r4, #0 + bl sub_080B1568 + movs r5, #0 + add r2, sp, #0xa4 + strh r5, [r2] + mov r1, sp + adds r1, #0xa6 + ldr r0, _080B1798 @ =0x04000006 + ldrh r0, [r0] + strh r0, [r1] + add r0, sp, #0xac + str r5, [r0] + ldrh r0, [r2] + cmp r0, #0 + bne _080B1768 + ldrh r0, [r4] + ands r0, r6 + cmp r0, #0 + bne _080B17F8 +_080B1768: + add r3, sp, #0xa8 + ldr r0, _080B1798 @ =0x04000006 + ldrh r0, [r0] + strh r0, [r3] + mov r4, sp + adds r4, #0xa6 + ldrh r1, [r3] + ldrh r0, [r4] + cmp r1, r0 + beq _080B17E2 + ldrh r1, [r3] + ldrh r0, [r4] + cmp r1, r0 + bls _080B179C + add r2, sp, #0xac + ldrh r1, [r3] + ldrh r0, [r4] + subs r1, r1, r0 + ldr r0, [r2] + adds r1, r1, r0 + str r1, [r2] + b _080B17B2 + .align 2, 0 +_080B1794: .4byte gUnk_02036A50 +_080B1798: .4byte 0x04000006 +_080B179C: + add r2, sp, #0xac + add r0, sp, #0xa8 + ldrh r0, [r0] + adds r0, #0xe4 + mov r1, sp + adds r1, #0xa6 + ldrh r1, [r1] + subs r0, r0, r1 + ldr r1, [r2] + adds r0, r0, r1 + str r0, [r2] +_080B17B2: + add r0, sp, #0xac + ldr r0, [r0] + cmp r0, #0x88 + bls _080B17D8 + add r0, sp, #0xa4 + ldrh r0, [r0] + cmp r0, #0 + bne _080B1802 + movs r0, #0xd0 + lsls r0, r0, #0x14 + ldrh r0, [r0] + movs r1, #1 + ands r0, r1 + cmp r0, #0 + bne _080B1802 + ldr r5, _080B17D4 @ =0x0000C001 + b _080B1802 + .align 2, 0 +_080B17D4: .4byte 0x0000C001 +_080B17D8: + mov r0, sp + adds r0, #0xa6 + add r1, sp, #0xa8 + ldrh r1, [r1] + strh r1, [r0] +_080B17E2: + add r2, sp, #0xa4 + ldrh r0, [r2] + cmp r0, #0 + bne _080B1768 + movs r0, #0xd0 + lsls r0, r0, #0x14 + movs r1, #1 + ldrh r0, [r0] + ands r1, r0 + cmp r1, #0 + beq _080B1768 +_080B17F8: + ldrh r0, [r2] + adds r0, #1 + strh r0, [r2] + cmp r7, #0 + bne _080B1768 +_080B1802: + adds r0, r5, #0 +_080B1804: + add sp, #0xb0 + pop {r4, r5, r6, r7} + pop {r1} + bx r1 + + .syntax divided diff --git a/src/code_080B1520.c b/src/code_080B1520.c index 675e321f..86086285 100644 --- a/src/code_080B1520.c +++ b/src/code_080B1520.c @@ -13,7 +13,7 @@ extern struct_08DE7D40* gUnk_02036A50; extern struct_08DE7D40 gUnk_08DE7D40; extern struct_08DE7D40 gUnk_08DE7D4C; -u16 sub_080B16AC(u16, u32, u32); +u16 sub_080B16AC(u16, u16*, u8); u32 sub_080B1520(u16 unk_1) { u32 ret; @@ -89,6 +89,96 @@ u32 sub_080B15E8(u16 unk_1, u16* unk_2) { } } -u16 sub_080B1698(u16 unk_1, u32 unk_2){ +u16 sub_080B1698(u16 unk_1, u16* unk_2) { return sub_080B16AC(unk_1, unk_2, 1); } + +// this is the furthest I could get +NONMATCH("asm/non_matching/code_080B1520/sub_080B16AC.inc", u16 sub_080B16AC(u16 unk_1, u16* unk_2, u8 unk_3)) { + u16 stack[0x52]; + vu16 stack_a4; + vu16 stack_a6; + vu16 stack_a8; + vu32 stack_ac; + + u32 r0, r1, r2; + + u8 i, j; + u16* ptr; + + r1 = unk_1; + if (unk_1 < gUnk_02036A50->unk_04) + return 0x80ff; + + ptr = stack + gUnk_02036A50->unk_08 + 0x42; + *ptr = 0; + ptr--; + for (i = 0; i <= 3; i++) { + r2 = *unk_2; + unk_2++; + for (j = 0; j <= 0xf; j++) { + *ptr = r2; + ptr--; + r2 = r2 >> 1; + } + } + for (i = 0; i < gUnk_02036A50->unk_08; i++) { + *ptr = r1; + ptr--; + r1 = r1 >> 1; + } + *ptr = 0; + ptr--; + *ptr = 1; + sub_080B1568(stack, (u16*)0xd000000, gUnk_02036A50->unk_08 + 0x43); + stack_a4 = 0; + stack_a6 = REG_VCOUNT; + stack_ac = 0; + if (stack_a4 == 0) { + r0 = *(u16*)0xd000000; + r0 &= 1; + if (r0 != 0) + goto bad; + } + do { + do { + do { + stack_a8 = REG_VCOUNT; + if (stack_a8 != stack_a6) { + if (stack_a8 > stack_a6) { + r1 = stack_a8; + r0 = stack_a6; + r1 = r1 - r0; + r0 = stack_ac; + r1 = r1 + r0; + stack_ac = r1; + } else { + r0 = stack_a8 + 0xe4; + r1 = stack_a6; + r0 = r0 - r1; + r1 = stack_ac; + r0 = r0 + r1; + stack_ac = r0; + } + if (stack_ac > 0x88) { + if (stack_a4 != 0) + return 0; + r0 = *(u16*)0xd000000; + r0 &= 1; + if (r0 != 0) + return 0; + return 0xc001; + } + stack_a6 = stack_a8; + } + } while (stack_a4 != 0); + r1 = 1; + r0 = *(u16*)0xd000000; + r1 &= r0; + } while (r1 != 0); + bad: + stack_a4++; + } while (unk_3 != 0); + return 0; +} +END_NONMATCH \ No newline at end of file From 5d85c564562a3704bebb998db83e37c5a50642a7 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Fri, 26 Feb 2021 00:08:05 +0100 Subject: [PATCH 06/30] matched sub_080B180C... --- asm/code_080B1520.s | 49 --------------------------------------------- src/code_080B1520.c | 34 ++++++++++++++++++++++++++++++- 2 files changed, 33 insertions(+), 50 deletions(-) diff --git a/asm/code_080B1520.s b/asm/code_080B1520.s index e84f6af1..757e533c 100644 --- a/asm/code_080B1520.s +++ b/asm/code_080B1520.s @@ -5,55 +5,6 @@ .text - thumb_func_start sub_080B180C -sub_080B180C: @ 0x080B180C - push {r4, r5, lr} - sub sp, #8 - adds r4, r1, #0 - lsls r0, r0, #0x10 - lsrs r1, r0, #0x10 - movs r5, #0 - ldr r0, _080B1828 @ =gUnk_02036A50 - ldr r0, [r0] - ldrh r0, [r0, #4] - cmp r1, r0 - blo _080B1830 - ldr r0, _080B182C @ =0x000080FF - b _080B185A - .align 2, 0 -_080B1828: .4byte gUnk_02036A50 -_080B182C: .4byte 0x000080FF -_080B1830: - adds r0, r1, #0 - mov r1, sp - bl sub_080B15E8 - mov r2, sp - movs r3, #0 - b _080B1848 -_080B183E: - adds r0, r3, #1 - lsls r0, r0, #0x18 - lsrs r3, r0, #0x18 - cmp r3, #3 - bhi _080B1858 -_080B1848: - ldrh r1, [r4] - ldrh r0, [r2] - adds r2, #2 - adds r4, #2 - cmp r1, r0 - beq _080B183E - movs r5, #0x80 - lsls r5, r5, #8 -_080B1858: - adds r0, r5, #0 -_080B185A: - add sp, #8 - pop {r4, r5} - pop {r1} - bx r1 - .align 2, 0 - thumb_func_start sub_080B1864 sub_080B1864: @ 0x080B1864 push {r4, r5, r6, lr} diff --git a/src/code_080B1520.c b/src/code_080B1520.c index 86086285..89d9f5f2 100644 --- a/src/code_080B1520.c +++ b/src/code_080B1520.c @@ -181,4 +181,36 @@ NONMATCH("asm/non_matching/code_080B1520/sub_080B16AC.inc", u16 sub_080B16AC(u16 } while (unk_3 != 0); return 0; } -END_NONMATCH \ No newline at end of file +END_NONMATCH + +u32 sub_080B180C(u16 unk_1, u16* unk_2) { + u16 t0, t1; + u32 ret; + + u16 stack[4]; + u16* ptr; + + u8 i; + + ret = 0; + if (unk_1 >= gUnk_02036A50->unk_04) + return 0x80ff; + sub_080B15E8(unk_1, stack); + ptr = stack; + i = 0; + goto L1; + L2: + i++; + if (i > 3) + goto RET; + L1: + t1 = *unk_2; + t0 = *ptr; + ptr++; + unk_2++; + if (t1 == t0) + goto L2; + ret = 0x8000; + RET: + return ret; +} From 9cd1e7fd0fb93ba7619172545c530e7c31872921 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Fri, 26 Feb 2021 18:41:32 +0100 Subject: [PATCH 07/30] matched sub_080B180C --- src/code_080B1520.c | 25 ++++++++----------------- 1 file changed, 8 insertions(+), 17 deletions(-) diff --git a/src/code_080B1520.c b/src/code_080B1520.c index 89d9f5f2..0b6bcd77 100644 --- a/src/code_080B1520.c +++ b/src/code_080B1520.c @@ -184,7 +184,6 @@ NONMATCH("asm/non_matching/code_080B1520/sub_080B16AC.inc", u16 sub_080B16AC(u16 END_NONMATCH u32 sub_080B180C(u16 unk_1, u16* unk_2) { - u16 t0, t1; u32 ret; u16 stack[4]; @@ -193,24 +192,16 @@ u32 sub_080B180C(u16 unk_1, u16* unk_2) { u8 i; ret = 0; - if (unk_1 >= gUnk_02036A50->unk_04) + if (unk_1 >= gUnk_02036A50->unk_04) { return 0x80ff; + } sub_080B15E8(unk_1, stack); ptr = stack; - i = 0; - goto L1; - L2: - i++; - if (i > 3) - goto RET; - L1: - t1 = *unk_2; - t0 = *ptr; - ptr++; - unk_2++; - if (t1 == t0) - goto L2; - ret = 0x8000; - RET: + for (i = 0; i < sizeof(stack)/sizeof(u16); i++) { + if (*unk_2++ != *ptr++) { + ret = 0x8000; + break; + } + } return ret; } From f3ed9acadc1b5fe2c01193048e16ec017cb1cd93 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Fri, 26 Feb 2021 18:44:11 +0100 Subject: [PATCH 08/30] use array_count macro --- src/code_080B1520.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/code_080B1520.c b/src/code_080B1520.c index 0b6bcd77..76a55fd5 100644 --- a/src/code_080B1520.c +++ b/src/code_080B1520.c @@ -197,7 +197,7 @@ u32 sub_080B180C(u16 unk_1, u16* unk_2) { } sub_080B15E8(unk_1, stack); ptr = stack; - for (i = 0; i < sizeof(stack)/sizeof(u16); i++) { + for (i = 0; i < ARRAY_COUNT(stack); i++) { if (*unk_2++ != *ptr++) { ret = 0x8000; break; From effdc3d019f3171c44d91bd9f9e5b986b51727db Mon Sep 17 00:00:00 2001 From: Henny022p Date: Fri, 26 Feb 2021 18:53:25 +0100 Subject: [PATCH 09/30] adjusted return type --- src/code_080B1520.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/code_080B1520.c b/src/code_080B1520.c index 76a55fd5..04bb4c48 100644 --- a/src/code_080B1520.c +++ b/src/code_080B1520.c @@ -183,8 +183,8 @@ NONMATCH("asm/non_matching/code_080B1520/sub_080B16AC.inc", u16 sub_080B16AC(u16 } END_NONMATCH -u32 sub_080B180C(u16 unk_1, u16* unk_2) { - u32 ret; +u16 sub_080B180C(u16 unk_1, u16* unk_2) { + u16 ret; u16 stack[4]; u16* ptr; From ea59111691fa2b31435928db252107d11ecf73d5 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Fri, 26 Feb 2021 18:56:13 +0100 Subject: [PATCH 10/30] matched sub_080B1864 --- asm/code_080B1520.s | 36 ------------------------------------ src/code_080B1520.c | 17 +++++++++++++++++ 2 files changed, 17 insertions(+), 36 deletions(-) diff --git a/asm/code_080B1520.s b/asm/code_080B1520.s index 757e533c..1debb88d 100644 --- a/asm/code_080B1520.s +++ b/asm/code_080B1520.s @@ -5,42 +5,6 @@ .text - thumb_func_start sub_080B1864 -sub_080B1864: @ 0x080B1864 - push {r4, r5, r6, lr} - adds r5, r1, #0 - lsls r0, r0, #0x10 - lsrs r4, r0, #0x10 - movs r6, #0 - b _080B1876 -_080B1870: - adds r0, r6, #1 - lsls r0, r0, #0x18 - lsrs r6, r0, #0x18 -_080B1876: - cmp r6, #2 - bhi _080B189A - adds r0, r4, #0 - adds r1, r5, #0 - bl sub_080B1698 - lsls r0, r0, #0x10 - lsrs r2, r0, #0x10 - cmp r2, #0 - bne _080B1870 - adds r0, r4, #0 - adds r1, r5, #0 - bl sub_080B180C - lsls r0, r0, #0x10 - lsrs r2, r0, #0x10 - cmp r2, #0 - bne _080B1870 -_080B189A: - adds r0, r2, #0 - pop {r4, r5, r6} - pop {r1} - bx r1 - .align 2, 0 - thumb_func_start sub_080B18A4 sub_080B18A4: @ 0x080B18A4 push {lr} diff --git a/src/code_080B1520.c b/src/code_080B1520.c index 04bb4c48..c5e9394e 100644 --- a/src/code_080B1520.c +++ b/src/code_080B1520.c @@ -205,3 +205,20 @@ u16 sub_080B180C(u16 unk_1, u16* unk_2) { } return ret; } + +u32 sub_080B1864(u16 unk_1, u16* unk_2, u32 unk_3) { + u32 ret; + u8 i; + + ret = unk_3; + + for(i = 0; i < 3; i++){ + ret = sub_080B1698(unk_1, unk_2); + if (ret == 0){ + ret = sub_080B180C(unk_1, unk_2); + if (ret == 0) + break; + } + } + return ret; +} From 46314411e96a251e05b92f4525a93723127c8caf Mon Sep 17 00:00:00 2001 From: Henny022p Date: Fri, 26 Feb 2021 19:02:46 +0100 Subject: [PATCH 11/30] matched sub_080B18A4 --- asm/code_080B1520.s | 30 ------------------------------ src/code_080B1520.c | 15 +++++++++++++-- 2 files changed, 13 insertions(+), 32 deletions(-) diff --git a/asm/code_080B1520.s b/asm/code_080B1520.s index 1debb88d..d2f9be9d 100644 --- a/asm/code_080B1520.s +++ b/asm/code_080B1520.s @@ -5,36 +5,6 @@ .text - thumb_func_start sub_080B18A4 -sub_080B18A4: @ 0x080B18A4 - push {lr} - adds r3, r1, #0 - lsls r0, r0, #0x10 - lsrs r2, r0, #0x10 - ldr r0, _080B18CC @ =gUnk_02036A50 - ldr r0, [r0] - ldr r1, [r0] - movs r0, #0x80 - lsls r0, r0, #2 - cmp r1, r0 - beq _080B18D0 - adds r0, r2, #0 - adds r1, r3, #0 - movs r2, #0 - bl sub_080B16AC - lsls r0, r0, #0x10 - lsrs r0, r0, #0x10 - b _080B18D2 - .align 2, 0 -_080B18CC: .4byte gUnk_02036A50 -_080B18D0: - ldr r0, _080B18D8 @ =0x00008080 -_080B18D2: - pop {r1} - bx r1 - .align 2, 0 -_080B18D8: .4byte 0x00008080 - thumb_func_start sub_080B18DC sub_080B18DC: @ 0x080B18DC push {r4, r5, r6, lr} diff --git a/src/code_080B1520.c b/src/code_080B1520.c index c5e9394e..7ff9a694 100644 --- a/src/code_080B1520.c +++ b/src/code_080B1520.c @@ -212,9 +212,9 @@ u32 sub_080B1864(u16 unk_1, u16* unk_2, u32 unk_3) { ret = unk_3; - for(i = 0; i < 3; i++){ + for (i = 0; i < 3; i++) { ret = sub_080B1698(unk_1, unk_2); - if (ret == 0){ + if (ret == 0) { ret = sub_080B180C(unk_1, unk_2); if (ret == 0) break; @@ -222,3 +222,14 @@ u32 sub_080B1864(u16 unk_1, u16* unk_2, u32 unk_3) { } return ret; } + +u32 sub_080B18A4(u16 unk_1, u16* unk_2) { + u16 ret; + + if (*(u32*)&gUnk_02036A50->unk_00 != 0x200) { + ret = sub_080B16AC(unk_1, unk_2, 0); + } else { + ret = 0x8080; + } + return ret; +} From b29ef1b5d85e6aa512c4ea2aa237f268c7806947 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Fri, 26 Feb 2021 19:06:50 +0100 Subject: [PATCH 12/30] adjusted member type --- src/code_080B1520.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/code_080B1520.c b/src/code_080B1520.c index 7ff9a694..d2a315b6 100644 --- a/src/code_080B1520.c +++ b/src/code_080B1520.c @@ -1,12 +1,11 @@ #include "global.h" typedef struct struct_08DE7D40 { - u16 unk_00; - u16 unk_02; + u32 unk_00; u16 unk_04; u16 unk_06; u8 unk_08; - u8 filler[3]; + //u8 filler[3]; } struct_08DE7D40; extern struct_08DE7D40* gUnk_02036A50; @@ -226,7 +225,7 @@ u32 sub_080B1864(u16 unk_1, u16* unk_2, u32 unk_3) { u32 sub_080B18A4(u16 unk_1, u16* unk_2) { u16 ret; - if (*(u32*)&gUnk_02036A50->unk_00 != 0x200) { + if (gUnk_02036A50->unk_00 != 0x200) { ret = sub_080B16AC(unk_1, unk_2, 0); } else { ret = 0x8080; From 7feaa4be7d0510f21b8c2be8a8473b718cac4609 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Fri, 26 Feb 2021 19:14:21 +0100 Subject: [PATCH 13/30] matched sub_080B18DC --- asm/code_080B1520.s | 43 ------------------------------------------- linker.ld | 1 - src/code_080B1520.c | 21 +++++++++++++++++++-- 3 files changed, 19 insertions(+), 46 deletions(-) delete mode 100644 asm/code_080B1520.s diff --git a/asm/code_080B1520.s b/asm/code_080B1520.s deleted file mode 100644 index d2f9be9d..00000000 --- a/asm/code_080B1520.s +++ /dev/null @@ -1,43 +0,0 @@ - .include "asm/macros.inc" - .include "constants/constants.inc" - - .syntax unified - - .text - - thumb_func_start sub_080B18DC -sub_080B18DC: @ 0x080B18DC - push {r4, r5, r6, lr} - adds r5, r1, #0 - lsls r0, r0, #0x10 - lsrs r4, r0, #0x10 - movs r6, #0 - b _080B18EE -_080B18E8: - adds r0, r6, #1 - lsls r0, r0, #0x18 - lsrs r6, r0, #0x18 -_080B18EE: - cmp r6, #2 - bhi _080B1912 - adds r0, r4, #0 - adds r1, r5, #0 - bl sub_080B18A4 - lsls r0, r0, #0x10 - lsrs r2, r0, #0x10 - cmp r2, #0 - bne _080B18E8 - adds r0, r4, #0 - adds r1, r5, #0 - bl sub_080B180C - lsls r0, r0, #0x10 - lsrs r2, r0, #0x10 - cmp r2, #0 - bne _080B18E8 -_080B1912: - adds r0, r2, #0 - pop {r4, r5, r6} - pop {r1} - bx r1 - .align 2, 0 - diff --git a/linker.ld b/linker.ld index 4cfa3dfc..7f623fd8 100644 --- a/linker.ld +++ b/linker.ld @@ -900,7 +900,6 @@ SECTIONS { asm/m4a.o(.text); asm/libagbsyscall.o(.text); src/code_080B1520.o(.text); - asm/code_080B1520.o(.text); *libc.a:memcpy.o(.text); /* handwritten assembly in arm mode */ diff --git a/src/code_080B1520.c b/src/code_080B1520.c index d2a315b6..da7f7d99 100644 --- a/src/code_080B1520.c +++ b/src/code_080B1520.c @@ -5,7 +5,7 @@ typedef struct struct_08DE7D40 { u16 unk_04; u16 unk_06; u8 unk_08; - //u8 filler[3]; + // u8 filler[3]; } struct_08DE7D40; extern struct_08DE7D40* gUnk_02036A50; @@ -222,7 +222,7 @@ u32 sub_080B1864(u16 unk_1, u16* unk_2, u32 unk_3) { return ret; } -u32 sub_080B18A4(u16 unk_1, u16* unk_2) { +u16 sub_080B18A4(u16 unk_1, u16* unk_2) { u16 ret; if (gUnk_02036A50->unk_00 != 0x200) { @@ -232,3 +232,20 @@ u32 sub_080B18A4(u16 unk_1, u16* unk_2) { } return ret; } + +u32 sub_080B18DC(u16 unk_1, u16* unk_2, u32 unk_3) { + u8 i; + u32 ret; + + ret = unk_3; + for (i = 0; i < 3; i++) { + ret = sub_080B18A4(unk_1, unk_2); + if (ret == 0) { + ret = sub_080B180C(unk_1, unk_2); + if (ret == 0) { + break; + } + } + } + return ret; +} From 84315ea8eb5a412aafcdf82873db7e954a50e227 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Fri, 26 Feb 2021 19:27:06 +0100 Subject: [PATCH 14/30] code cleanup --- src/code_080B1520.c | 25 ++++++++++--------------- 1 file changed, 10 insertions(+), 15 deletions(-) diff --git a/src/code_080B1520.c b/src/code_080B1520.c index da7f7d99..4b8ef92e 100644 --- a/src/code_080B1520.c +++ b/src/code_080B1520.c @@ -206,20 +206,17 @@ u16 sub_080B180C(u16 unk_1, u16* unk_2) { } u32 sub_080B1864(u16 unk_1, u16* unk_2, u32 unk_3) { - u32 ret; u8 i; - ret = unk_3; - for (i = 0; i < 3; i++) { - ret = sub_080B1698(unk_1, unk_2); - if (ret == 0) { - ret = sub_080B180C(unk_1, unk_2); - if (ret == 0) + unk_3 = sub_080B1698(unk_1, unk_2); + if (unk_3 == 0) { + unk_3 = sub_080B180C(unk_1, unk_2); + if (unk_3 == 0) break; } } - return ret; + return unk_3; } u16 sub_080B18A4(u16 unk_1, u16* unk_2) { @@ -235,17 +232,15 @@ u16 sub_080B18A4(u16 unk_1, u16* unk_2) { u32 sub_080B18DC(u16 unk_1, u16* unk_2, u32 unk_3) { u8 i; - u32 ret; - ret = unk_3; for (i = 0; i < 3; i++) { - ret = sub_080B18A4(unk_1, unk_2); - if (ret == 0) { - ret = sub_080B180C(unk_1, unk_2); - if (ret == 0) { + unk_3 = sub_080B18A4(unk_1, unk_2); + if (unk_3 == 0) { + unk_3 = sub_080B180C(unk_1, unk_2); + if (unk_3 == 0) { break; } } } - return ret; + return unk_3; } From 177edfac1fc13f8c65610012dfed6980ee2d9ae8 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Fri, 26 Feb 2021 19:30:52 +0100 Subject: [PATCH 15/30] fixed parameter count --- src/code_080B1520.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/src/code_080B1520.c b/src/code_080B1520.c index 4b8ef92e..5b9db89a 100644 --- a/src/code_080B1520.c +++ b/src/code_080B1520.c @@ -205,18 +205,19 @@ u16 sub_080B180C(u16 unk_1, u16* unk_2) { return ret; } -u32 sub_080B1864(u16 unk_1, u16* unk_2, u32 unk_3) { +u32 sub_080B1864(u16 unk_1, u16* unk_2) { u8 i; + u32 ret; for (i = 0; i < 3; i++) { - unk_3 = sub_080B1698(unk_1, unk_2); - if (unk_3 == 0) { - unk_3 = sub_080B180C(unk_1, unk_2); - if (unk_3 == 0) + ret = sub_080B1698(unk_1, unk_2); + if (ret == 0) { + ret = sub_080B180C(unk_1, unk_2); + if (ret == 0) break; } } - return unk_3; + return ret; } u16 sub_080B18A4(u16 unk_1, u16* unk_2) { @@ -230,17 +231,18 @@ u16 sub_080B18A4(u16 unk_1, u16* unk_2) { return ret; } -u32 sub_080B18DC(u16 unk_1, u16* unk_2, u32 unk_3) { +u32 sub_080B18DC(u16 unk_1, u16* unk_2) { u8 i; + u32 ret; for (i = 0; i < 3; i++) { - unk_3 = sub_080B18A4(unk_1, unk_2); - if (unk_3 == 0) { - unk_3 = sub_080B180C(unk_1, unk_2); - if (unk_3 == 0) { + ret = sub_080B18A4(unk_1, unk_2); + if (ret == 0) { + ret = sub_080B180C(unk_1, unk_2); + if (ret == 0) { break; } } } - return unk_3; + return ret; } From 3318b039d535a49ab62a30a9083b8dfe4a6e7392 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Fri, 26 Feb 2021 19:50:10 +0100 Subject: [PATCH 16/30] matched sub_080B1568 --- src/code_080B1520.c | 15 +++++---------- 1 file changed, 5 insertions(+), 10 deletions(-) diff --git a/src/code_080B1520.c b/src/code_080B1520.c index 5b9db89a..676de849 100644 --- a/src/code_080B1520.c +++ b/src/code_080B1520.c @@ -31,27 +31,22 @@ u32 sub_080B1520(u16 unk_1) { return ret; } -NONMATCH("asm/non_matching/code_080B1520/sub_080B1568.inc", void sub_080B1568(u16* src, u16* dest, u32 cnt)) { +void sub_080B1568(void* src, void* dest, u16 count) { u32 temp; - u16 u1; u16 IME_save; - u1 = cnt; IME_save = REG_IME; - REG_IME = 0; + REG_IME = 0; // disable all interrupts temp = REG_WAITCNT & 0xf8ff; - temp |= gUnk_02036A50->unk_06; + temp |= gUnk_02036A50->unk_06; // configure wait state 2 REG_WAITCNT = temp; REG_DMA3SAD = (u32)src; REG_DMA3DAD = (u32)dest; - REG_DMA3CNT = u1 | 0x80000000; - if ((REG_DMA3CNT_H & 0x8000) != 0) { - while ((REG_DMA3CNT_H & 0x8000) != 0) {} - } + REG_DMA3CNT = count | 0x80000000; // enable dma + while ((REG_DMA3CNT_H & 0x8000) != 0) {} // wait for dma to finish REG_IME = IME_save; } -END_NONMATCH u32 sub_080B15E8(u16 unk_1, u16* unk_2) { u16 stack[0x44]; From 3a30e6ec199f1602269894be1b48b4fe3b2314dc Mon Sep 17 00:00:00 2001 From: Henny022p Date: Fri, 26 Feb 2021 19:54:58 +0100 Subject: [PATCH 17/30] named DMA3Transfer --- asm/non_matching/code_080B1520/sub_080B16AC.inc | 2 +- src/code_080B1520.c | 10 +++++----- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/asm/non_matching/code_080B1520/sub_080B16AC.inc b/asm/non_matching/code_080B1520/sub_080B16AC.inc index 32a1a164..b844ebc1 100644 --- a/asm/non_matching/code_080B1520/sub_080B16AC.inc +++ b/asm/non_matching/code_080B1520/sub_080B16AC.inc @@ -81,7 +81,7 @@ _080B1722: adds r2, #0x43 mov r0, sp adds r1, r4, #0 - bl sub_080B1568 + bl DMA3Transfer movs r5, #0 add r2, sp, #0xa4 strh r5, [r2] diff --git a/src/code_080B1520.c b/src/code_080B1520.c index 676de849..3aa87e91 100644 --- a/src/code_080B1520.c +++ b/src/code_080B1520.c @@ -31,7 +31,7 @@ u32 sub_080B1520(u16 unk_1) { return ret; } -void sub_080B1568(void* src, void* dest, u16 count) { +void DMA3Transfer(void* src, void* dest, u16 count) { u32 temp; u16 IME_save; @@ -43,7 +43,7 @@ void sub_080B1568(void* src, void* dest, u16 count) { REG_WAITCNT = temp; REG_DMA3SAD = (u32)src; REG_DMA3DAD = (u32)dest; - REG_DMA3CNT = count | 0x80000000; // enable dma + REG_DMA3CNT = count | 0x80000000; // enable dma while ((REG_DMA3CNT_H & 0x8000) != 0) {} // wait for dma to finish REG_IME = IME_save; } @@ -67,8 +67,8 @@ u32 sub_080B15E8(u16 unk_1, u16* unk_2) { } *(ptr--) = 1; *ptr = 1; - sub_080B1568(stack, (u16*)0xd000000, gUnk_02036A50->unk_08 + 3); - sub_080B1568((u16*)0xd000000, stack, 0x44); + DMA3Transfer(stack, (u16*)0xd000000, gUnk_02036A50->unk_08 + 3); + DMA3Transfer((u16*)0xd000000, stack, 0x44); ptr = stack + 4; unk_2 += 3; for (t1 = 0; t1 < 4; t1++) { @@ -124,7 +124,7 @@ NONMATCH("asm/non_matching/code_080B1520/sub_080B16AC.inc", u16 sub_080B16AC(u16 *ptr = 0; ptr--; *ptr = 1; - sub_080B1568(stack, (u16*)0xd000000, gUnk_02036A50->unk_08 + 0x43); + DMA3Transfer(stack, (u16*)0xd000000, gUnk_02036A50->unk_08 + 0x43); stack_a4 = 0; stack_a6 = REG_VCOUNT; stack_ac = 0; From ec0c59e5d094fe07a1df08ed0dba8c03bd685288 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Fri, 26 Feb 2021 19:58:48 +0100 Subject: [PATCH 18/30] removed old asm file --- .../code_080B1520/sub_080B1568.inc | 62 ------------------- 1 file changed, 62 deletions(-) delete mode 100644 asm/non_matching/code_080B1520/sub_080B1568.inc diff --git a/asm/non_matching/code_080B1520/sub_080B1568.inc b/asm/non_matching/code_080B1520/sub_080B1568.inc deleted file mode 100644 index 29a887f1..00000000 --- a/asm/non_matching/code_080B1520/sub_080B1568.inc +++ /dev/null @@ -1,62 +0,0 @@ - .syntax unified - .text - push {r4, r5, r6, lr} - lsls r2, r2, #0x10 - lsrs r2, r2, #0x10 - ldr r4, _080B15C8 @ =0x04000208 - ldrh r3, [r4] - adds r6, r3, #0 - movs r3, #0 - strh r3, [r4] - ldr r5, _080B15CC @ =0x04000204 - ldrh r4, [r5] - ldr r3, _080B15D0 @ =0x0000F8FF - ands r4, r3 - ldr r3, _080B15D4 @ =gUnk_02036A50 - ldr r3, [r3] - ldrh r3, [r3, #6] - orrs r4, r3 - strh r4, [r5] - ldr r3, _080B15D8 @ =0x040000D4 - str r0, [r3] - ldr r0, _080B15DC @ =0x040000D8 - str r1, [r0] - ldr r1, _080B15E0 @ =0x040000DC - movs r0, #0x80 - lsls r0, r0, #0x18 - orrs r2, r0 - str r2, [r1] - adds r1, #2 - movs r2, #0x80 - lsls r2, r2, #8 - adds r0, r2, #0 - ldrh r1, [r1] - ands r0, r1 - cmp r0, #0 - beq _080B15BC - ldr r2, _080B15E4 @ =0x040000DE - movs r0, #0x80 - lsls r0, r0, #8 - adds r1, r0, #0 -_080B15B4: - ldrh r0, [r2] - ands r0, r1 - cmp r0, #0 - bne _080B15B4 -_080B15BC: - ldr r0, _080B15C8 @ =0x04000208 - strh r6, [r0] - pop {r4, r5, r6} - pop {r0} - bx r0 - .align 2, 0 -_080B15C8: .4byte 0x04000208 -_080B15CC: .4byte 0x04000204 -_080B15D0: .4byte 0x0000F8FF -_080B15D4: .4byte gUnk_02036A50 -_080B15D8: .4byte 0x040000D4 -_080B15DC: .4byte 0x040000D8 -_080B15E0: .4byte 0x040000DC -_080B15E4: .4byte 0x040000DE - - .syntax divided From de6163dbb7266f5f1570051acee9347cd963c62e Mon Sep 17 00:00:00 2001 From: Henny022p Date: Fri, 26 Feb 2021 22:46:47 +0100 Subject: [PATCH 19/30] labeled eeprom config stuff --- .../code_080B1520/sub_080B16AC.inc | 14 +++---- data/data_089FC6C4.s | 4 +- linker.ld | 2 +- src/code_080B1520.c | 42 +++++++++---------- src/manager/manager4.c | 2 +- 5 files changed, 32 insertions(+), 32 deletions(-) diff --git a/asm/non_matching/code_080B1520/sub_080B16AC.inc b/asm/non_matching/code_080B1520/sub_080B16AC.inc index b844ebc1..6803eef0 100644 --- a/asm/non_matching/code_080B1520/sub_080B16AC.inc +++ b/asm/non_matching/code_080B1520/sub_080B16AC.inc @@ -9,7 +9,7 @@ lsrs r1, r0, #0x10 lsls r2, r2, #0x18 lsrs r7, r2, #0x18 - ldr r0, _080B16C8 @ =gUnk_02036A50 + ldr r0, _080B16C8 @ =gEEPROMConfig ldr r0, [r0] ldrh r0, [r0, #4] cmp r1, r0 @@ -17,10 +17,10 @@ ldr r0, _080B16CC @ =0x000080FF b _080B1804 .align 2, 0 -_080B16C8: .4byte gUnk_02036A50 +_080B16C8: .4byte gEEPROMConfig _080B16CC: .4byte 0x000080FF _080B16D0: - ldr r0, _080B1710 @ =gUnk_02036A50 + ldr r0, _080B1710 @ =gEEPROMConfig ldr r0, [r0] ldrb r0, [r0, #8] lsls r0, r0, #1 @@ -50,12 +50,12 @@ _080B16EC: cmp r4, #3 bls _080B16E6 movs r4, #0 - ldr r0, _080B1710 @ =gUnk_02036A50 + ldr r0, _080B1710 @ =gEEPROMConfig adds r2, r0, #0 ldr r0, [r0] b _080B1722 .align 2, 0 -_080B1710: .4byte gUnk_02036A50 +_080B1710: .4byte gEEPROMConfig _080B1714: strh r1, [r3] subs r3, #2 @@ -75,7 +75,7 @@ _080B1722: strh r6, [r3] movs r4, #0xd0 lsls r4, r4, #0x14 - ldr r0, _080B1794 @ =gUnk_02036A50 + ldr r0, _080B1794 @ =gEEPROMConfig ldr r0, [r0] ldrb r2, [r0, #8] adds r2, #0x43 @@ -123,7 +123,7 @@ _080B1768: str r1, [r2] b _080B17B2 .align 2, 0 -_080B1794: .4byte gUnk_02036A50 +_080B1794: .4byte gEEPROMConfig _080B1798: .4byte 0x04000006 _080B179C: add r2, sp, #0xac diff --git a/data/data_089FC6C4.s b/data/data_089FC6C4.s index 4b69eaea..2a53d0cf 100644 --- a/data/data_089FC6C4.s +++ b/data/data_089FC6C4.s @@ -10303,8 +10303,8 @@ gUnk_08DE7D18:: @ 08DE7D18 gUnk_08DE7D28:: @ 08DE7D28 .incbin "baserom.gba", 0xDE7D28, 0x0000018 -gUnk_08DE7D40:: @ 08DE7D40 +gEEPROMConfig512:: @ 08DE7D40 .incbin "baserom.gba", 0xDE7D40, 0x000000C -gUnk_08DE7D4C:: @ 08DE7D4C +gEEPROMConfig8k:: @ 08DE7D4C .incbin "baserom.gba", 0xDE7D4C, 0x0000058 diff --git a/linker.ld b/linker.ld index b43188e7..41e04872 100644 --- a/linker.ld +++ b/linker.ld @@ -148,7 +148,7 @@ SECTIONS { . = 0x000369F0; gUnk_020369F0 = .; . = 0x00036A38; gUnk_02036A38 = .; . = 0x00036A40; gUnk_02036A40 = .; - . = 0x00036A50; gUnk_02036A50 = .; + . = 0x00036A50; gEEPROMConfig = .; . = 0x00036A58; gUnk_02036A58 = .; . = 0x00036AD8; gUnk_02036AD8 = .; . = 0x00036BB8; gUnk_02036BB8 = .; diff --git a/src/code_080B1520.c b/src/code_080B1520.c index 3aa87e91..389be1b4 100644 --- a/src/code_080B1520.c +++ b/src/code_080B1520.c @@ -2,15 +2,15 @@ typedef struct struct_08DE7D40 { u32 unk_00; - u16 unk_04; - u16 unk_06; - u8 unk_08; + u16 size; + u16 waitcnt; + u8 address_width; // u8 filler[3]; -} struct_08DE7D40; +} EEPROMConfig; -extern struct_08DE7D40* gUnk_02036A50; -extern struct_08DE7D40 gUnk_08DE7D40; -extern struct_08DE7D40 gUnk_08DE7D4C; +extern EEPROMConfig* gEEPROMConfig; +extern EEPROMConfig gEEPROMConfig512; +extern EEPROMConfig gEEPROMConfig8k; u16 sub_080B16AC(u16, u16*, u8); @@ -19,12 +19,12 @@ u32 sub_080B1520(u16 unk_1) { ret = 0; if (unk_1 == 4) { - gUnk_02036A50 = &gUnk_08DE7D40; + gEEPROMConfig = &gEEPROMConfig512; } else { if (unk_1 == 0x40) { - gUnk_02036A50 = &gUnk_08DE7D4C; + gEEPROMConfig = &gEEPROMConfig8k; } else { - gUnk_02036A50 = &gUnk_08DE7D40; + gEEPROMConfig = &gEEPROMConfig512; ret = 1; } } @@ -39,7 +39,7 @@ void DMA3Transfer(void* src, void* dest, u16 count) { IME_save = REG_IME; REG_IME = 0; // disable all interrupts temp = REG_WAITCNT & 0xf8ff; - temp |= gUnk_02036A50->unk_06; // configure wait state 2 + temp |= gEEPROMConfig->waitcnt; // configure wait state 2 REG_WAITCNT = temp; REG_DMA3SAD = (u32)src; REG_DMA3DAD = (u32)dest; @@ -55,19 +55,19 @@ u32 sub_080B15E8(u16 unk_1, u16* unk_2) { u8 t1, t2; u16 value; - if (unk_1 >= gUnk_02036A50->unk_04) { + if (unk_1 >= gEEPROMConfig->size) { return 0x80ff; } else { ptr = stack; - (u8*)ptr += (gUnk_02036A50->unk_08 << 1) + 1; + (u8*)ptr += (gEEPROMConfig->address_width << 1) + 1; ((u8*)ptr)++; - for (t1 = 0; t1 < gUnk_02036A50->unk_08; t1++) { + for (t1 = 0; t1 < gEEPROMConfig->address_width; t1++) { *(ptr--) = unk_1; unk_1 >>= 1; } *(ptr--) = 1; *ptr = 1; - DMA3Transfer(stack, (u16*)0xd000000, gUnk_02036A50->unk_08 + 3); + DMA3Transfer(stack, (u16*)0xd000000, gEEPROMConfig->address_width + 3); DMA3Transfer((u16*)0xd000000, stack, 0x44); ptr = stack + 4; unk_2 += 3; @@ -101,10 +101,10 @@ NONMATCH("asm/non_matching/code_080B1520/sub_080B16AC.inc", u16 sub_080B16AC(u16 u16* ptr; r1 = unk_1; - if (unk_1 < gUnk_02036A50->unk_04) + if (unk_1 < gEEPROMConfig->size) return 0x80ff; - ptr = stack + gUnk_02036A50->unk_08 + 0x42; + ptr = stack + gEEPROMConfig->address_width + 0x42; *ptr = 0; ptr--; for (i = 0; i <= 3; i++) { @@ -116,7 +116,7 @@ NONMATCH("asm/non_matching/code_080B1520/sub_080B16AC.inc", u16 sub_080B16AC(u16 r2 = r2 >> 1; } } - for (i = 0; i < gUnk_02036A50->unk_08; i++) { + for (i = 0; i < gEEPROMConfig->address_width; i++) { *ptr = r1; ptr--; r1 = r1 >> 1; @@ -124,7 +124,7 @@ NONMATCH("asm/non_matching/code_080B1520/sub_080B16AC.inc", u16 sub_080B16AC(u16 *ptr = 0; ptr--; *ptr = 1; - DMA3Transfer(stack, (u16*)0xd000000, gUnk_02036A50->unk_08 + 0x43); + DMA3Transfer(stack, (u16*)0xd000000, gEEPROMConfig->address_width + 0x43); stack_a4 = 0; stack_a6 = REG_VCOUNT; stack_ac = 0; @@ -186,7 +186,7 @@ u16 sub_080B180C(u16 unk_1, u16* unk_2) { u8 i; ret = 0; - if (unk_1 >= gUnk_02036A50->unk_04) { + if (unk_1 >= gEEPROMConfig->size) { return 0x80ff; } sub_080B15E8(unk_1, stack); @@ -218,7 +218,7 @@ u32 sub_080B1864(u16 unk_1, u16* unk_2) { u16 sub_080B18A4(u16 unk_1, u16* unk_2) { u16 ret; - if (gUnk_02036A50->unk_00 != 0x200) { + if (gEEPROMConfig->unk_00 != 0x200) { ret = sub_080B16AC(unk_1, unk_2, 0); } else { ret = 0x8080; diff --git a/src/manager/manager4.c b/src/manager/manager4.c index da43751f..2ebdf7d3 100644 --- a/src/manager/manager4.c +++ b/src/manager/manager4.c @@ -67,7 +67,7 @@ void sub_08057A18(Manager*, DiggingCaveEntrance*); u32 sub_0805795C(Manager* this, DiggingCaveEntrance* entr) { u16 offsetX, offsetY, offsetX2, offsetY2; u32 tmp; - if (gUnk_03004030.unk_08) { + if (gUnk_03004030.address_width) { offsetX = gPlayerEntity.x.HALF.HI - gRoomControls.roomOriginX; offsetY = gPlayerEntity.y.HALF.HI - gRoomControls.roomOriginY; offsetX2 = (entr->unk_00 & 0x3F) * 16 + 8; From 1ffa1f4eb6b09c3ccae2788323353caa379446f3 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Fri, 26 Feb 2021 23:01:23 +0100 Subject: [PATCH 20/30] testing globals stuff --- data/data_089FC6C4.s | 5 ----- linker.ld | 1 + src/code_080B1520.c | 8 ++++---- 3 files changed, 5 insertions(+), 9 deletions(-) diff --git a/data/data_089FC6C4.s b/data/data_089FC6C4.s index 2a53d0cf..ce772176 100644 --- a/data/data_089FC6C4.s +++ b/data/data_089FC6C4.s @@ -10303,8 +10303,3 @@ gUnk_08DE7D18:: @ 08DE7D18 gUnk_08DE7D28:: @ 08DE7D28 .incbin "baserom.gba", 0xDE7D28, 0x0000018 -gEEPROMConfig512:: @ 08DE7D40 - .incbin "baserom.gba", 0xDE7D40, 0x000000C - -gEEPROMConfig8k:: @ 08DE7D4C - .incbin "baserom.gba", 0xDE7D4C, 0x0000058 diff --git a/linker.ld b/linker.ld index 41e04872..70dee721 100644 --- a/linker.ld +++ b/linker.ld @@ -1033,6 +1033,7 @@ SECTIONS { data/strings.o(.rodata); data/sprite_table.o(.rodata); data/data_089FC6C4.o(.rodata); + src/code_080B1520.o(.rodata); } >rom /* DWARF 2 sections */ diff --git a/src/code_080B1520.c b/src/code_080B1520.c index 389be1b4..1543aa33 100644 --- a/src/code_080B1520.c +++ b/src/code_080B1520.c @@ -1,6 +1,6 @@ #include "global.h" -typedef struct struct_08DE7D40 { +typedef struct EEPROMConfig { u32 unk_00; u16 size; u16 waitcnt; @@ -8,9 +8,9 @@ typedef struct struct_08DE7D40 { // u8 filler[3]; } EEPROMConfig; -extern EEPROMConfig* gEEPROMConfig; -extern EEPROMConfig gEEPROMConfig512; -extern EEPROMConfig gEEPROMConfig8k; +extern const EEPROMConfig* gEEPROMConfig; +const EEPROMConfig gEEPROMConfig512 = { 0x200, 0x40, 0x300, 0x6 }; +const EEPROMConfig gEEPROMConfig8k = { 0x2000, 0x400, 0x300, 0xe }; u16 sub_080B16AC(u16, u16*, u8); From abf4ecce50455cfe258d034ad1d3896380e84ecb Mon Sep 17 00:00:00 2001 From: Henny022p Date: Fri, 26 Feb 2021 23:08:05 +0100 Subject: [PATCH 21/30] extra global data --- data/data_089FC6C4.s | 1 - data/data_08DE7D58.s | 6 ++++++ linker.ld | 1 + 3 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 data/data_08DE7D58.s diff --git a/data/data_089FC6C4.s b/data/data_089FC6C4.s index ce772176..78507def 100644 --- a/data/data_089FC6C4.s +++ b/data/data_089FC6C4.s @@ -10302,4 +10302,3 @@ gUnk_08DE7D18:: @ 08DE7D18 gUnk_08DE7D28:: @ 08DE7D28 .incbin "baserom.gba", 0xDE7D28, 0x0000018 - diff --git a/data/data_08DE7D58.s b/data/data_08DE7D58.s new file mode 100644 index 00000000..b36b3768 --- /dev/null +++ b/data/data_08DE7D58.s @@ -0,0 +1,6 @@ + + .section .rodata + .align 2 + +gUnk_08DE7D58:: @ 08DE7D58 + .incbin "baserom.gba", 0xDE7D58, 0x000004c diff --git a/linker.ld b/linker.ld index 70dee721..c141c87e 100644 --- a/linker.ld +++ b/linker.ld @@ -1034,6 +1034,7 @@ SECTIONS { data/sprite_table.o(.rodata); data/data_089FC6C4.o(.rodata); src/code_080B1520.o(.rodata); + data/data_08DE7D58.o(.rodata); } >rom /* DWARF 2 sections */ From 8fee68e0a28bc54dee580c7a5faf892d54f229a9 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Fri, 26 Feb 2021 23:32:02 +0100 Subject: [PATCH 22/30] matched eeprom rodata... --- data/data_089FC6C4.s | 2 +- data/data_08DE7D58.s | 6 ------ linker.ld | 1 - src/code_080B1520.c | 7 ++++++- 4 files changed, 7 insertions(+), 9 deletions(-) delete mode 100644 data/data_08DE7D58.s diff --git a/data/data_089FC6C4.s b/data/data_089FC6C4.s index 78507def..fb6fb436 100644 --- a/data/data_089FC6C4.s +++ b/data/data_089FC6C4.s @@ -10301,4 +10301,4 @@ gUnk_08DE7D18:: @ 08DE7D18 .incbin "baserom.gba", 0xDE7D18, 0x0000010 gUnk_08DE7D28:: @ 08DE7D28 - .incbin "baserom.gba", 0xDE7D28, 0x0000018 + .incbin "baserom.gba", 0xDE7D28, 0x000000C diff --git a/data/data_08DE7D58.s b/data/data_08DE7D58.s deleted file mode 100644 index b36b3768..00000000 --- a/data/data_08DE7D58.s +++ /dev/null @@ -1,6 +0,0 @@ - - .section .rodata - .align 2 - -gUnk_08DE7D58:: @ 08DE7D58 - .incbin "baserom.gba", 0xDE7D58, 0x000004c diff --git a/linker.ld b/linker.ld index c141c87e..70dee721 100644 --- a/linker.ld +++ b/linker.ld @@ -1034,7 +1034,6 @@ SECTIONS { data/sprite_table.o(.rodata); data/data_089FC6C4.o(.rodata); src/code_080B1520.o(.rodata); - data/data_08DE7D58.o(.rodata); } >rom /* DWARF 2 sections */ diff --git a/src/code_080B1520.c b/src/code_080B1520.c index 1543aa33..69cdff2d 100644 --- a/src/code_080B1520.c +++ b/src/code_080B1520.c @@ -7,11 +7,12 @@ typedef struct EEPROMConfig { u8 address_width; // u8 filler[3]; } EEPROMConfig; - +const char EEPROM_V124[] = "EEPROM_V124"; extern const EEPROMConfig* gEEPROMConfig; const EEPROMConfig gEEPROMConfig512 = { 0x200, 0x40, 0x300, 0x6 }; const EEPROMConfig gEEPROMConfig8k = { 0x2000, 0x400, 0x300, 0xe }; + u16 sub_080B16AC(u16, u16*, u8); u32 sub_080B1520(u16 unk_1) { @@ -200,6 +201,8 @@ u16 sub_080B180C(u16 unk_1, u16* unk_2) { return ret; } +const char EEPROM_NOWAIT[] = "EEPROM_NOWAIT"; + u32 sub_080B1864(u16 unk_1, u16* unk_2) { u8 i; u32 ret; @@ -241,3 +244,5 @@ u32 sub_080B18DC(u16 unk_1, u16* unk_2) { } return ret; } + +const char thing[0x1c] = "\xff\xff\xff\xff"; From 1810f771e5756bebf1c317be35064f85e5c0b265 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Sat, 27 Feb 2021 00:48:36 +0100 Subject: [PATCH 23/30] gave names to functions and magic values --- .../{sub_080B16AC.inc => EEPROMWrite.inc} | 0 asm/non_matching/save/sub_0807D1D8.inc | 2 +- asm/non_matching/save/sub_0807D20C.inc | 4 +- asm/non_matching/save/sub_0807D24C.inc | 2 +- include/functions.h | 1 - include/gba/eeprom.h | 20 ++++ src/code_080B1520.c | 92 +++++++++++-------- src/save.c | 12 +-- 8 files changed, 82 insertions(+), 51 deletions(-) rename asm/non_matching/code_080B1520/{sub_080B16AC.inc => EEPROMWrite.inc} (100%) create mode 100644 include/gba/eeprom.h diff --git a/asm/non_matching/code_080B1520/sub_080B16AC.inc b/asm/non_matching/code_080B1520/EEPROMWrite.inc similarity index 100% rename from asm/non_matching/code_080B1520/sub_080B16AC.inc rename to asm/non_matching/code_080B1520/EEPROMWrite.inc diff --git a/asm/non_matching/save/sub_0807D1D8.inc b/asm/non_matching/save/sub_0807D1D8.inc index f9b81bde..88c30173 100644 --- a/asm/non_matching/save/sub_0807D1D8.inc +++ b/asm/non_matching/save/sub_0807D1D8.inc @@ -14,7 +14,7 @@ _0807D1E6: lsls r0, r5, #0x10 lsrs r0, r0, #0x10 adds r1, r6, #0 - bl sub_080B15E8 + bl EEPROMRead lsls r0, r0, #0x10 cmp r0, #0 beq _0807D1FA diff --git a/asm/non_matching/save/sub_0807D20C.inc b/asm/non_matching/save/sub_0807D20C.inc index 954ad823..7fd90a12 100644 --- a/asm/non_matching/save/sub_0807D20C.inc +++ b/asm/non_matching/save/sub_0807D20C.inc @@ -15,13 +15,13 @@ _0807D21A: lsrs r4, r0, #0x10 adds r0, r4, #0 adds r1, r7, #0 - bl sub_080B18DC + bl EEPROMWrite0_8k_Check lsls r0, r0, #0x10 cmp r0, #0 beq _0807D23C adds r0, r4, #0 ldr r1, _0807D238 @ =gUnk_0811E4B4 - bl sub_080B18DC + bl EEPROMWrite0_8k_Check movs r0, #0 b _0807D24A .align 2, 0 diff --git a/asm/non_matching/save/sub_0807D24C.inc b/asm/non_matching/save/sub_0807D24C.inc index 7761d787..6ec855ad 100644 --- a/asm/non_matching/save/sub_0807D24C.inc +++ b/asm/non_matching/save/sub_0807D24C.inc @@ -14,7 +14,7 @@ _0807D25A: lsls r0, r5, #0x10 lsrs r0, r0, #0x10 adds r1, r6, #0 - bl sub_080B180C + bl EEPROMCompare lsls r0, r0, #0x10 cmp r0, #0 beq _0807D26E diff --git a/include/functions.h b/include/functions.h index f3213239..58941869 100644 --- a/include/functions.h +++ b/include/functions.h @@ -213,7 +213,6 @@ extern void sub_0807CF48(u32); extern u32 sub_0807CF10(u8*); extern void sub_08056208(void); extern void sub_08050384(); -extern void sub_080B1520(u32); extern struct_0807D1C4* sub_0807D1C4(u32); extern u32 sub_0807D24C(u32, const char*, u32); extern void sub_0807CF68(u32); diff --git a/include/gba/eeprom.h b/include/gba/eeprom.h new file mode 100644 index 00000000..964f3c34 --- /dev/null +++ b/include/gba/eeprom.h @@ -0,0 +1,20 @@ +#ifndef GUARD_GBA_EEPROM +#define GUARD_GBA_EEPROM + +// error codes +#define EEPROM_OUT_OF_RANGE 0x80ff +#define EEPROM_COMPARE_FAILED 0x8000 +#define EEPROM_UNSUPPORTED_TYPE 0x8080 + +/** + * selects EEPROM type + * selects 512byte on invalid argument + * + * @param unk_1 4 for 512 byte, 0x40 for 8k + * @return 1 on invalid argument, 0 otherwise + */ +u32 EEPROMConfigure(u16 unk_1); +u16 EEPROMCompare(u16 address, u16* data); +u32 EEPROMWrite0_8k_Check(u16 address, u16* data); + +#endif // GUARD_GBA_EEPROM diff --git a/src/code_080B1520.c b/src/code_080B1520.c index 69cdff2d..400145c0 100644 --- a/src/code_080B1520.c +++ b/src/code_080B1520.c @@ -1,4 +1,5 @@ #include "global.h" +#include "gba/eeprom.h" typedef struct EEPROMConfig { u32 unk_00; @@ -12,10 +13,9 @@ extern const EEPROMConfig* gEEPROMConfig; const EEPROMConfig gEEPROMConfig512 = { 0x200, 0x40, 0x300, 0x6 }; const EEPROMConfig gEEPROMConfig8k = { 0x2000, 0x400, 0x300, 0xe }; +u16 EEPROMWrite(u16, u16*, u8); -u16 sub_080B16AC(u16, u16*, u8); - -u32 sub_080B1520(u16 unk_1) { +u32 EEPROMConfigure(u16 unk_1) { u32 ret; ret = 0; @@ -32,7 +32,7 @@ u32 sub_080B1520(u16 unk_1) { return ret; } -void DMA3Transfer(void* src, void* dest, u16 count) { +static void DMA3Transfer(void* src, void* dest, u16 count) { u32 temp; u16 IME_save; @@ -49,47 +49,61 @@ void DMA3Transfer(void* src, void* dest, u16 count) { REG_IME = IME_save; } -u32 sub_080B15E8(u16 unk_1, u16* unk_2) { - u16 stack[0x44]; +/** + * reads 64 bit (8 byte) from eeprom + * + * @param address 6/14 bit depending on eeprom size + * @param data u16[4] + * @return errorcode, 0 on success + */ +u32 EEPROMRead(u16 address, u16* data) { + u16 buffer[0x44]; u16* ptr; u8 t1, t2; u16 value; - if (unk_1 >= gEEPROMConfig->size) { - return 0x80ff; + if (address >= gEEPROMConfig->size) { + return EEPROM_OUT_OF_RANGE; } else { - ptr = stack; + ptr = buffer; + // setup address (u8*)ptr += (gEEPROMConfig->address_width << 1) + 1; ((u8*)ptr)++; for (t1 = 0; t1 < gEEPROMConfig->address_width; t1++) { - *(ptr--) = unk_1; - unk_1 >>= 1; + *(ptr--) = address; + address >>= 1; } + // read request *(ptr--) = 1; *ptr = 1; - DMA3Transfer(stack, (u16*)0xd000000, gEEPROMConfig->address_width + 3); - DMA3Transfer((u16*)0xd000000, stack, 0x44); - ptr = stack + 4; - unk_2 += 3; + // send address to eeprom + DMA3Transfer(buffer, (u16*)0xd000000, gEEPROMConfig->address_width + 3); + // recieve data + DMA3Transfer((u16*)0xd000000, buffer, 0x44); + // 4 bit junk + ptr = buffer + 4; + data += 3; + // copy data into output buffer for (t1 = 0; t1 < 4; t1++) { value = 0; for (t2 = 0; t2 < 0x10; t2++) { value <<= 1; value |= (*ptr++) & 1; } - *(unk_2--) = value; + *(data--) = value; } return 0; } } -u16 sub_080B1698(u16 unk_1, u16* unk_2) { - return sub_080B16AC(unk_1, unk_2, 1); +u16 EEPROMWrite1(u16 address, u16* data) { + return EEPROMWrite(address, data, 1); } // this is the furthest I could get -NONMATCH("asm/non_matching/code_080B1520/sub_080B16AC.inc", u16 sub_080B16AC(u16 unk_1, u16* unk_2, u8 unk_3)) { +// 0x080B16AC +NONMATCH("asm/non_matching/code_080B1520/EEPROMWrite.inc", u16 EEPROMWrite(u16 unk_1, u16* unk_2, u8 unk_3)) { u16 stack[0x52]; vu16 stack_a4; vu16 stack_a6; @@ -102,8 +116,8 @@ NONMATCH("asm/non_matching/code_080B1520/sub_080B16AC.inc", u16 sub_080B16AC(u16 u16* ptr; r1 = unk_1; - if (unk_1 < gEEPROMConfig->size) - return 0x80ff; + if (unk_1 >= gEEPROMConfig->size) + return EEPROM_OUT_OF_RANGE; ptr = stack + gEEPROMConfig->address_width + 0x42; *ptr = 0; @@ -178,23 +192,23 @@ NONMATCH("asm/non_matching/code_080B1520/sub_080B16AC.inc", u16 sub_080B16AC(u16 } END_NONMATCH -u16 sub_080B180C(u16 unk_1, u16* unk_2) { +u16 EEPROMCompare(u16 address, u16* data) { u16 ret; - u16 stack[4]; + u16 buffer[4]; u16* ptr; u8 i; ret = 0; - if (unk_1 >= gEEPROMConfig->size) { - return 0x80ff; + if (address >= gEEPROMConfig->size) { + return EEPROM_OUT_OF_RANGE; } - sub_080B15E8(unk_1, stack); - ptr = stack; - for (i = 0; i < ARRAY_COUNT(stack); i++) { - if (*unk_2++ != *ptr++) { - ret = 0x8000; + EEPROMRead(address, buffer); + ptr = buffer; + for (i = 0; i < ARRAY_COUNT(buffer); i++) { + if (*data++ != *ptr++) { + ret = EEPROM_COMPARE_FAILED; break; } } @@ -203,14 +217,14 @@ u16 sub_080B180C(u16 unk_1, u16* unk_2) { const char EEPROM_NOWAIT[] = "EEPROM_NOWAIT"; -u32 sub_080B1864(u16 unk_1, u16* unk_2) { +u32 EEPROMWrite1_check(u16 address, u16* data) { u8 i; u32 ret; for (i = 0; i < 3; i++) { - ret = sub_080B1698(unk_1, unk_2); + ret = EEPROMWrite1(address, data); if (ret == 0) { - ret = sub_080B180C(unk_1, unk_2); + ret = EEPROMCompare(address, data); if (ret == 0) break; } @@ -218,25 +232,25 @@ u32 sub_080B1864(u16 unk_1, u16* unk_2) { return ret; } -u16 sub_080B18A4(u16 unk_1, u16* unk_2) { +u16 EEPROMWrite0_8k(u16 address, u16* data) { u16 ret; if (gEEPROMConfig->unk_00 != 0x200) { - ret = sub_080B16AC(unk_1, unk_2, 0); + ret = EEPROMWrite(address, data, 0); } else { - ret = 0x8080; + ret = EEPROM_UNSUPPORTED_TYPE; } return ret; } -u32 sub_080B18DC(u16 unk_1, u16* unk_2) { +u32 EEPROMWrite0_8k_Check(u16 address, u16* data) { u8 i; u32 ret; for (i = 0; i < 3; i++) { - ret = sub_080B18A4(unk_1, unk_2); + ret = EEPROMWrite0_8k(address, data); if (ret == 0) { - ret = sub_080B180C(unk_1, unk_2); + ret = EEPROMCompare(address, data); if (ret == 0) { break; } diff --git a/src/save.c b/src/save.c index 281e54c5..da72267e 100644 --- a/src/save.c +++ b/src/save.c @@ -1,4 +1,5 @@ #include "save.h" +#include "gba/eeprom.h" typedef struct Thing { u16 unk_1; @@ -6,9 +7,6 @@ typedef struct Thing { u32 unk_3; } Thing; -extern u32 sub_080B180C(u32, const char*); -extern u16 sub_080B18DC(u16, const char*); - const u16 gUnk_0811E454[] = { 0x0, 0x0, 0x100, 0x200, 0x300, 0x400, 0x500, 0x5C0, 0x680, 0x740, 0x800, 0x8C0, 0x9C0, 0xA80 }; @@ -106,7 +104,7 @@ u32 sub_0807CE90(void) { int iVar2; int iVar3; - sub_080B1520(0x40); + EEPROMConfigure(0x40); puVar1 = sub_0807D1C4(4); iVar3 = 0; if (sub_0807D24C(puVar1->field_0x6, sSignatureLong, puVar1->field_0x0) == 0) { @@ -343,8 +341,8 @@ NONMATCH("asm/non_matching/save/sub_0807D20C.inc", u32 sub_0807D20C(u32 unk_1, c unk_3 >>= 3; unk_1 >>= 3; while (unk_3-- > 0) { - if (sub_080B18DC(unk_1, unk_2)) { - sub_080B18DC(unk_1, gUnk_0811E4B4); + if (EEPROMWrite0_8k_Check(unk_1, (u16*)unk_2)) { + EEPROMWrite0_8k_Check(unk_1, (u16*)gUnk_0811E4B4); return 0; } unk_1++; @@ -358,7 +356,7 @@ NONMATCH("asm/non_matching/save/sub_0807D24C.inc", u32 sub_0807D24C(u32 unk_1, c unk_3 >>= 3; unk_1 >>= 3; while (unk_3-- > 0) { - if (sub_080B180C(unk_1, unk_2)) + if (EEPROMCompare(unk_1, (u16*)unk_2)) return 0; unk_1++; unk_2 += 8; From 364edc85dca6472e854bb22ed1dcb69516cac10d Mon Sep 17 00:00:00 2001 From: Henny022p Date: Mon, 1 Mar 2021 13:56:00 +0100 Subject: [PATCH 24/30] document EEPROMWrite a bit more --- src/code_080B1520.c | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/src/code_080B1520.c b/src/code_080B1520.c index 400145c0..0061c611 100644 --- a/src/code_080B1520.c +++ b/src/code_080B1520.c @@ -103,8 +103,8 @@ u16 EEPROMWrite1(u16 address, u16* data) { // this is the furthest I could get // 0x080B16AC -NONMATCH("asm/non_matching/code_080B1520/EEPROMWrite.inc", u16 EEPROMWrite(u16 unk_1, u16* unk_2, u8 unk_3)) { - u16 stack[0x52]; +NONMATCH("asm/non_matching/code_080B1520/EEPROMWrite.inc", u16 EEPROMWrite(u16 address, u16* data, u8 unk_3)) { + u16 buffer[0x52]; // this is one too large? vu16 stack_a4; vu16 stack_a6; vu16 stack_a8; @@ -115,22 +115,24 @@ NONMATCH("asm/non_matching/code_080B1520/EEPROMWrite.inc", u16 EEPROMWrite(u16 u u8 i, j; u16* ptr; - r1 = unk_1; - if (unk_1 >= gEEPROMConfig->size) + r1 = address; + if (address >= gEEPROMConfig->size) return EEPROM_OUT_OF_RANGE; - ptr = stack + gEEPROMConfig->address_width + 0x42; + ptr = buffer + gEEPROMConfig->address_width + 0x42; *ptr = 0; ptr--; + // copy data into buffer for (i = 0; i <= 3; i++) { - r2 = *unk_2; - unk_2++; + r2 = *data; + data++; for (j = 0; j <= 0xf; j++) { *ptr = r2; ptr--; r2 = r2 >> 1; } } + // copy address to buffer for (i = 0; i < gEEPROMConfig->address_width; i++) { *ptr = r1; ptr--; @@ -139,7 +141,7 @@ NONMATCH("asm/non_matching/code_080B1520/EEPROMWrite.inc", u16 EEPROMWrite(u16 u *ptr = 0; ptr--; *ptr = 1; - DMA3Transfer(stack, (u16*)0xd000000, gEEPROMConfig->address_width + 0x43); + DMA3Transfer(buffer, (u16*)0xd000000, gEEPROMConfig->address_width + 0x43); stack_a4 = 0; stack_a6 = REG_VCOUNT; stack_ac = 0; From 8331be4f29ad56767e946c845ae1d53a95a9ba0c Mon Sep 17 00:00:00 2001 From: Henny022p Date: Mon, 1 Mar 2021 17:09:14 +0100 Subject: [PATCH 25/30] document EEPROMWrite locals --- src/code_080B1520.c | 57 +++++++++++++++++---------------------------- 1 file changed, 21 insertions(+), 36 deletions(-) diff --git a/src/code_080B1520.c b/src/code_080B1520.c index 0061c611..d9118149 100644 --- a/src/code_080B1520.c +++ b/src/code_080B1520.c @@ -101,21 +101,22 @@ u16 EEPROMWrite1(u16 address, u16* data) { return EEPROMWrite(address, data, 1); } +// reading from EEPROM like a status register +#define REG_EEPROM (*(u16*)0xd000000) // this is the furthest I could get // 0x080B16AC NONMATCH("asm/non_matching/code_080B1520/EEPROMWrite.inc", u16 EEPROMWrite(u16 address, u16* data, u8 unk_3)) { u16 buffer[0x52]; // this is one too large? vu16 stack_a4; - vu16 stack_a6; - vu16 stack_a8; - vu32 stack_ac; + vu16 prev_vcount; // stack + a6 + vu16 current_vcount; // stack + a6 + vu32 passed_scanlines; // stack + ac - u32 r0, r1, r2; + u32 r2; u8 i, j; u16* ptr; - r1 = address; if (address >= gEEPROMConfig->size) return EEPROM_OUT_OF_RANGE; @@ -134,59 +135,43 @@ NONMATCH("asm/non_matching/code_080B1520/EEPROMWrite.inc", u16 EEPROMWrite(u16 a } // copy address to buffer for (i = 0; i < gEEPROMConfig->address_width; i++) { - *ptr = r1; + *ptr = address; ptr--; - r1 = r1 >> 1; + address = address >> 1; } *ptr = 0; ptr--; *ptr = 1; DMA3Transfer(buffer, (u16*)0xd000000, gEEPROMConfig->address_width + 0x43); stack_a4 = 0; - stack_a6 = REG_VCOUNT; - stack_ac = 0; + prev_vcount = REG_VCOUNT; + passed_scanlines = 0; if (stack_a4 == 0) { - r0 = *(u16*)0xd000000; - r0 &= 1; - if (r0 != 0) + if ((REG_EEPROM & 1) != 0) goto bad; } + // before here its only regalloc, but after I cant get it to work do { do { do { - stack_a8 = REG_VCOUNT; - if (stack_a8 != stack_a6) { - if (stack_a8 > stack_a6) { - r1 = stack_a8; - r0 = stack_a6; - r1 = r1 - r0; - r0 = stack_ac; - r1 = r1 + r0; - stack_ac = r1; + current_vcount = REG_VCOUNT; + if (current_vcount != prev_vcount) { + if (current_vcount >= prev_vcount) { + passed_scanlines += current_vcount - prev_vcount; } else { - r0 = stack_a8 + 0xe4; - r1 = stack_a6; - r0 = r0 - r1; - r1 = stack_ac; - r0 = r0 + r1; - stack_ac = r0; + passed_scanlines += (current_vcount + 0xe4) - prev_vcount; } - if (stack_ac > 0x88) { + if (passed_scanlines > 0x88) { if (stack_a4 != 0) return 0; - r0 = *(u16*)0xd000000; - r0 &= 1; - if (r0 != 0) + if ((REG_EEPROM & 1) != 0) return 0; return 0xc001; } - stack_a6 = stack_a8; + prev_vcount = current_vcount; } } while (stack_a4 != 0); - r1 = 1; - r0 = *(u16*)0xd000000; - r1 &= r0; - } while (r1 != 0); + } while ((REG_EEPROM & 1) != 0); bad: stack_a4++; } while (unk_3 != 0); From 4071863bee975b945901b8daf23c42dba4391e43 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Mon, 1 Mar 2021 22:45:26 +0100 Subject: [PATCH 26/30] renamed source file to eeprom.c --- Makefile | 2 +- include/gba/eeprom.h | 1 + linker.ld | 4 ++-- src/{code_080B1520.c => eeprom.c} | 1 + 4 files changed, 5 insertions(+), 3 deletions(-) rename src/{code_080B1520.c => eeprom.c} (99%) diff --git a/Makefile b/Makefile index 2828dc4b..e17925d4 100644 --- a/Makefile +++ b/Makefile @@ -84,7 +84,7 @@ endif #$(C_BUILDDIR)/need_interworking_file_name.o: CFLAGS += -mthumb-interwork $(C_BUILDDIR)/arm_proxy.o: CFLAGS += -mthumb-interwork -$(C_BUILDDIR)/code_080B1520.o: CFLAGS = -O1 -mthumb-interwork -Wimplicit -Wparentheses -Werror -Wno-multichar +$(C_BUILDDIR)/eeprom.o: CFLAGS = -O1 -mthumb-interwork -Wimplicit -Wparentheses -Werror -Wno-multichar C_SRCS := $(wildcard $(C_SUBDIR)/*.c $(C_SUBDIR)/*/*.c) C_OBJS := $(patsubst $(C_SUBDIR)/%.c,$(C_BUILDDIR)/%.o,$(C_SRCS)) diff --git a/include/gba/eeprom.h b/include/gba/eeprom.h index 964f3c34..eccc2032 100644 --- a/include/gba/eeprom.h +++ b/include/gba/eeprom.h @@ -14,6 +14,7 @@ * @return 1 on invalid argument, 0 otherwise */ u32 EEPROMConfigure(u16 unk_1); +u32 EEPROMRead(u16 address, u16* data); u16 EEPROMCompare(u16 address, u16* data); u32 EEPROMWrite0_8k_Check(u16 address, u16* data); diff --git a/linker.ld b/linker.ld index 70dee721..9c6827c9 100644 --- a/linker.ld +++ b/linker.ld @@ -900,7 +900,7 @@ SECTIONS { asm/m4a_asm.o(.text); asm/m4a.o(.text); asm/libagbsyscall.o(.text); - src/code_080B1520.o(.text); + src/eeprom.o(.text); *libc.a:memcpy.o(.text); /* handwritten assembly in arm mode */ @@ -1033,7 +1033,7 @@ SECTIONS { data/strings.o(.rodata); data/sprite_table.o(.rodata); data/data_089FC6C4.o(.rodata); - src/code_080B1520.o(.rodata); + src/eeprom.o(.rodata); } >rom /* DWARF 2 sections */ diff --git a/src/code_080B1520.c b/src/eeprom.c similarity index 99% rename from src/code_080B1520.c rename to src/eeprom.c index d9118149..38f13943 100644 --- a/src/code_080B1520.c +++ b/src/eeprom.c @@ -8,6 +8,7 @@ typedef struct EEPROMConfig { u8 address_width; // u8 filler[3]; } EEPROMConfig; + const char EEPROM_V124[] = "EEPROM_V124"; extern const EEPROMConfig* gEEPROMConfig; const EEPROMConfig gEEPROMConfig512 = { 0x200, 0x40, 0x300, 0x6 }; From f3ce8b077e113029c1d8c4fe1aa61dd654f2b8d1 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Mon, 1 Mar 2021 23:05:50 +0100 Subject: [PATCH 27/30] const input pointers --- include/gba/eeprom.h | 4 ++-- src/eeprom.c | 16 ++++++++-------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/include/gba/eeprom.h b/include/gba/eeprom.h index eccc2032..ca614b28 100644 --- a/include/gba/eeprom.h +++ b/include/gba/eeprom.h @@ -15,7 +15,7 @@ */ u32 EEPROMConfigure(u16 unk_1); u32 EEPROMRead(u16 address, u16* data); -u16 EEPROMCompare(u16 address, u16* data); -u32 EEPROMWrite0_8k_Check(u16 address, u16* data); +u16 EEPROMCompare(u16 address, const u16* data); +u32 EEPROMWrite0_8k_Check(u16 address, const u16* data); #endif // GUARD_GBA_EEPROM diff --git a/src/eeprom.c b/src/eeprom.c index 38f13943..5f8c60fd 100644 --- a/src/eeprom.c +++ b/src/eeprom.c @@ -14,7 +14,7 @@ extern const EEPROMConfig* gEEPROMConfig; const EEPROMConfig gEEPROMConfig512 = { 0x200, 0x40, 0x300, 0x6 }; const EEPROMConfig gEEPROMConfig8k = { 0x2000, 0x400, 0x300, 0xe }; -u16 EEPROMWrite(u16, u16*, u8); +u16 EEPROMWrite(u16, const u16*, u8); u32 EEPROMConfigure(u16 unk_1) { u32 ret; @@ -33,7 +33,7 @@ u32 EEPROMConfigure(u16 unk_1) { return ret; } -static void DMA3Transfer(void* src, void* dest, u16 count) { +static void DMA3Transfer(const void* src, void* dest, u16 count) { u32 temp; u16 IME_save; @@ -98,7 +98,7 @@ u32 EEPROMRead(u16 address, u16* data) { } } -u16 EEPROMWrite1(u16 address, u16* data) { +u16 EEPROMWrite1(u16 address, const u16* data) { return EEPROMWrite(address, data, 1); } @@ -106,7 +106,7 @@ u16 EEPROMWrite1(u16 address, u16* data) { #define REG_EEPROM (*(u16*)0xd000000) // this is the furthest I could get // 0x080B16AC -NONMATCH("asm/non_matching/code_080B1520/EEPROMWrite.inc", u16 EEPROMWrite(u16 address, u16* data, u8 unk_3)) { +NONMATCH("asm/non_matching/code_080B1520/EEPROMWrite.inc", u16 EEPROMWrite(u16 address, const u16* data, u8 unk_3)) { u16 buffer[0x52]; // this is one too large? vu16 stack_a4; vu16 prev_vcount; // stack + a6 @@ -180,7 +180,7 @@ NONMATCH("asm/non_matching/code_080B1520/EEPROMWrite.inc", u16 EEPROMWrite(u16 a } END_NONMATCH -u16 EEPROMCompare(u16 address, u16* data) { +u16 EEPROMCompare(u16 address, const u16* data) { u16 ret; u16 buffer[4]; @@ -205,7 +205,7 @@ u16 EEPROMCompare(u16 address, u16* data) { const char EEPROM_NOWAIT[] = "EEPROM_NOWAIT"; -u32 EEPROMWrite1_check(u16 address, u16* data) { +u32 EEPROMWrite1_check(u16 address, const u16* data) { u8 i; u32 ret; @@ -220,7 +220,7 @@ u32 EEPROMWrite1_check(u16 address, u16* data) { return ret; } -u16 EEPROMWrite0_8k(u16 address, u16* data) { +u16 EEPROMWrite0_8k(u16 address, const u16* data) { u16 ret; if (gEEPROMConfig->unk_00 != 0x200) { @@ -231,7 +231,7 @@ u16 EEPROMWrite0_8k(u16 address, u16* data) { return ret; } -u32 EEPROMWrite0_8k_Check(u16 address, u16* data) { +u32 EEPROMWrite0_8k_Check(u16 address, const u16* data) { u8 i; u32 ret; From 56223348257e363e4473aeb8c9b939c037584f18 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Mon, 1 Mar 2021 23:20:59 +0100 Subject: [PATCH 28/30] eeprom function return type is u16 --- include/gba/eeprom.h | 6 +++--- src/eeprom.c | 14 +++++++------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/include/gba/eeprom.h b/include/gba/eeprom.h index ca614b28..46c7e35c 100644 --- a/include/gba/eeprom.h +++ b/include/gba/eeprom.h @@ -13,9 +13,9 @@ * @param unk_1 4 for 512 byte, 0x40 for 8k * @return 1 on invalid argument, 0 otherwise */ -u32 EEPROMConfigure(u16 unk_1); -u32 EEPROMRead(u16 address, u16* data); +u16 EEPROMConfigure(u16 unk_1); +u16 EEPROMRead(u16 address, u16* data); u16 EEPROMCompare(u16 address, const u16* data); -u32 EEPROMWrite0_8k_Check(u16 address, const u16* data); +u16 EEPROMWrite0_8k_Check(u16 address, const u16* data); #endif // GUARD_GBA_EEPROM diff --git a/src/eeprom.c b/src/eeprom.c index 5f8c60fd..4ea218b3 100644 --- a/src/eeprom.c +++ b/src/eeprom.c @@ -16,8 +16,8 @@ const EEPROMConfig gEEPROMConfig8k = { 0x2000, 0x400, 0x300, 0xe }; u16 EEPROMWrite(u16, const u16*, u8); -u32 EEPROMConfigure(u16 unk_1) { - u32 ret; +u16 EEPROMConfigure(u16 unk_1) { + u16 ret; ret = 0; if (unk_1 == 4) { @@ -57,7 +57,7 @@ static void DMA3Transfer(const void* src, void* dest, u16 count) { * @param data u16[4] * @return errorcode, 0 on success */ -u32 EEPROMRead(u16 address, u16* data) { +u16 EEPROMRead(u16 address, u16* data) { u16 buffer[0x44]; u16* ptr; @@ -205,9 +205,9 @@ u16 EEPROMCompare(u16 address, const u16* data) { const char EEPROM_NOWAIT[] = "EEPROM_NOWAIT"; -u32 EEPROMWrite1_check(u16 address, const u16* data) { +u16 EEPROMWrite1_check(u16 address, const u16* data) { u8 i; - u32 ret; + u16 ret; for (i = 0; i < 3; i++) { ret = EEPROMWrite1(address, data); @@ -231,9 +231,9 @@ u16 EEPROMWrite0_8k(u16 address, const u16* data) { return ret; } -u32 EEPROMWrite0_8k_Check(u16 address, const u16* data) { +u16 EEPROMWrite0_8k_Check(u16 address, const u16* data) { u8 i; - u32 ret; + u16 ret; for (i = 0; i < 3; i++) { ret = EEPROMWrite0_8k(address, data); From 87efc440657cc22cb2e6cb12c0bb175a7f105297 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Tue, 2 Mar 2021 10:18:40 +0100 Subject: [PATCH 29/30] fixed indentation --- src/save.c | 140 ++++++++++++++++++++++++++--------------------------- 1 file changed, 70 insertions(+), 70 deletions(-) diff --git a/src/save.c b/src/save.c index da72267e..70f715ef 100644 --- a/src/save.c +++ b/src/save.c @@ -201,71 +201,71 @@ u32 sub_0807CF88(u32 arg0, u8* arg1) { } NONMATCH("asm/non_matching/save/sub_0807D008.inc", u32 sub_0807D008(u32 param_1, SaveFile* saveFile)) { - u32 set_0; - char auStack32[8]; + u32 set_0; + char auStack32[8]; - struct_0807D1C4* unk_s; - u32 t1; - u32 t2; - u32 ret; - u32 temp; + struct_0807D1C4* unk_s; + u32 t1; + u32 t2; + u32 ret; + u32 temp; - unk_s = sub_0807D1C4(param_1); - t1 = sub_0807D0EC(unk_s->field_0x2, auStack32); - if (t1 == 2) { - if ((sub_0807D1D8(unk_s->field_0x6, (char*)saveFile, unk_s->field_0x0) == 0) || - (sub_0807D0A0((u16*)auStack32, (u16*)saveFile, (u32)unk_s->field_0x0) == 0)) { - t1 = 0; - } else { - return 1; - } + unk_s = sub_0807D1C4(param_1); + t1 = sub_0807D0EC(unk_s->field_0x2, auStack32); + if (t1 == 2) { + if ((sub_0807D1D8(unk_s->field_0x6, (char*)saveFile, unk_s->field_0x0) == 0) || + (sub_0807D0A0((u16*)auStack32, (u16*)saveFile, (u32)unk_s->field_0x0) == 0)) { + t1 = 0; + } else { + return 1; } - t2 = sub_0807D0EC(unk_s->field_0x4, auStack32); - if (t2 == 2) { - if ((sub_0807D1D8(unk_s->field_0x8, (char*)saveFile, unk_s->field_0x0) != 0) && - (sub_0807D0A0((u16*)auStack32, (u16*)saveFile, (u32)unk_s->field_0x0) != 0)) { - return 1; - } - t2 = 0; - } - set_0 = 0; - CpuSet(&set_0, saveFile, unk_s->field_0x0 >> 2 | CPU_SET_SRC_FIXED | CPU_SET_32BIT); - temp = t1 | t2; - ret = 0; - if (temp == 0) { - ret = -1; - } - return ret; } + t2 = sub_0807D0EC(unk_s->field_0x4, auStack32); + if (t2 == 2) { + if ((sub_0807D1D8(unk_s->field_0x8, (char*)saveFile, unk_s->field_0x0) != 0) && + (sub_0807D0A0((u16*)auStack32, (u16*)saveFile, (u32)unk_s->field_0x0) != 0)) { + return 1; + } + t2 = 0; + } + set_0 = 0; + CpuSet(&set_0, saveFile, unk_s->field_0x0 >> 2 | CPU_SET_SRC_FIXED | CPU_SET_32BIT); + temp = t1 | t2; + ret = 0; + if (temp == 0) { + ret = -1; + } + return ret; +} END_NONMATCH NONMATCH("asm/non_matching/save/sub_0807D0A0.inc", u32 sub_0807D0A0(u16* unk_1, u16* unk_2, u32 unk_3)) { - u32 r0; + u32 r0; - u32* u32_1 = (u32*)unk_1; + u32* u32_1 = (u32*)unk_1; - u16 u0; - u32 u1; + u16 u0; + u32 u1; - u0 = sub_0807D1A4(unk_1 + 2, 4); - u0 = u0 + sub_0807D1A4(unk_2, unk_3); + u0 = sub_0807D1A4(unk_1 + 2, 4); + u0 = u0 + sub_0807D1A4(unk_2, unk_3); - u1 = unk_1[0]; - if (u1 != u0) { - r0 = 0; - } else { - if (unk_1[1] == (-(u1 << 0x10) >> 0x10)) { - if (*(u32_1 + 1) != 'MCZ3') { - r0 = 0; - } else { - r0 = 1; - } - } else { + u1 = unk_1[0]; + if (u1 != u0) { + r0 = 0; + } else { + if (unk_1[1] == (-(u1 << 0x10) >> 0x10)) { + if (*(u32_1 + 1) != 'MCZ3') { r0 = 0; + } else { + r0 = 1; } + } else { + r0 = 0; } - return r0; } + return r0; +} END_NONMATCH u32 sub_0807D0EC(u32 unk_1, const char* unk_2) { @@ -334,33 +334,33 @@ struct_0807D1C4* sub_0807D1C4(u32 unk_1) { // these three are basically the same and wrong by basically one instruction in the wrong place NONMATCH("asm/non_matching/save/sub_0807D1D8.inc", u32 sub_0807D1D8(u32 unk_1, const char* unk_2, u32 unk_3)) { - } +} END_NONMATCH NONMATCH("asm/non_matching/save/sub_0807D20C.inc", u32 sub_0807D20C(u32 unk_1, const char* unk_2, u32 unk_3)) { - unk_3 >>= 3; - unk_1 >>= 3; - while (unk_3-- > 0) { - if (EEPROMWrite0_8k_Check(unk_1, (u16*)unk_2)) { - EEPROMWrite0_8k_Check(unk_1, (u16*)gUnk_0811E4B4); - return 0; - } - unk_1++; - unk_2 += 8; + unk_3 >>= 3; + unk_1 >>= 3; + while (unk_3-- > 0) { + if (EEPROMWrite0_8k_Check(unk_1, (u16*)unk_2)) { + EEPROMWrite0_8k_Check(unk_1, (u16*)gUnk_0811E4B4); + return 0; } - return 1; + unk_1++; + unk_2 += 8; } + return 1; +} END_NONMATCH NONMATCH("asm/non_matching/save/sub_0807D24C.inc", u32 sub_0807D24C(u32 unk_1, const char* unk_2, u32 unk_3)) { - unk_3 >>= 3; - unk_1 >>= 3; - while (unk_3-- > 0) { - if (EEPROMCompare(unk_1, (u16*)unk_2)) - return 0; - unk_1++; - unk_2 += 8; - } - return 1; + unk_3 >>= 3; + unk_1 >>= 3; + while (unk_3-- > 0) { + if (EEPROMCompare(unk_1, (u16*)unk_2)) + return 0; + unk_1++; + unk_2 += 8; } + return 1; +} END_NONMATCH From 048b067288147bad69d3d278490f092c72c37605 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Tue, 2 Mar 2021 10:42:59 +0100 Subject: [PATCH 30/30] fixed filename capitalization --- src/enemy/{RopeGolden.c => ropeGolden.c} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename src/enemy/{RopeGolden.c => ropeGolden.c} (100%) diff --git a/src/enemy/RopeGolden.c b/src/enemy/ropeGolden.c similarity index 100% rename from src/enemy/RopeGolden.c rename to src/enemy/ropeGolden.c