summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Makefile2
-rw-r--r--asm/code_080B1520.s93
-rw-r--r--src/code_080B1520.c62
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;
+ }
+}