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; + } +}