diff --git a/asm/code_0807CC3C.s b/asm/code_0807CC3C.s index 79a61fd0..11b495f8 100644 --- a/asm/code_0807CC3C.s +++ b/asm/code_0807CC3C.s @@ -355,40 +355,3 @@ _0807D208: pop {r4, r5, r6, pc} .align 2, 0 - thumb_func_start sub_0807D20C -sub_0807D20C: @ 0x0807D20C - push {r4, r5, r6, r7, lr} - adds r6, r0, #0 - adds r7, r1, #0 - lsrs r5, r2, #3 - adds r0, r5, #0 - lsrs r6, r6, #3 - b _0807D242 -_0807D21A: - lsls r0, r6, #0x10 - lsrs r4, r0, #0x10 - adds r0, r4, #0 - adds r1, r7, #0 - bl sub_080B18DC - lsls r0, r0, #0x10 - cmp r0, #0 - beq _0807D23C - adds r0, r4, #0 - ldr r1, _0807D238 @ =gUnk_0811E4B4 - bl sub_080B18DC - movs r0, #0 - b _0807D24A - .align 2, 0 -_0807D238: .4byte gUnk_0811E4B4 -_0807D23C: - adds r6, #1 - adds r7, #8 - adds r0, r5, #0 -_0807D242: - subs r5, #1 - cmp r0, #0 - bne _0807D21A - movs r0, #1 -_0807D24A: - pop {r4, r5, r6, r7, pc} - diff --git a/asm/non_matching/code_0807CC3C/sub_0807D20C.inc b/asm/non_matching/code_0807CC3C/sub_0807D20C.inc new file mode 100644 index 00000000..31a81d5b --- /dev/null +++ b/asm/non_matching/code_0807CC3C/sub_0807D20C.inc @@ -0,0 +1,42 @@ + .include "asm/macros.inc" + + .include "constants/constants.inc" + + .syntax unified + + .text + + push {r4, r5, r6, r7, lr} + adds r6, r0, #0 + adds r7, r1, #0 + lsrs r5, r2, #3 + adds r0, r5, #0 + lsrs r6, r6, #3 + b _0807D242 +_0807D21A: + lsls r0, r6, #0x10 + lsrs r4, r0, #0x10 + adds r0, r4, #0 + adds r1, r7, #0 + bl sub_080B18DC + lsls r0, r0, #0x10 + cmp r0, #0 + beq _0807D23C + adds r0, r4, #0 + ldr r1, _0807D238 @ =gUnk_0811E4B4 + bl sub_080B18DC + movs r0, #0 + b _0807D24A + .align 2, 0 +_0807D238: .4byte gUnk_0811E4B4 +_0807D23C: + adds r6, #1 + adds r7, #8 + adds r0, r5, #0 +_0807D242: + subs r5, #1 + cmp r0, #0 + bne _0807D21A + movs r0, #1 +_0807D24A: + pop {r4, r5, r6, r7, pc} diff --git a/asm/non_matching/code_0807CC3C/sub_0807D24C.inc b/asm/non_matching/code_0807CC3C/sub_0807D24C.inc index cc91ceb6..2de1c0ff 100644 --- a/asm/non_matching/code_0807CC3C/sub_0807D24C.inc +++ b/asm/non_matching/code_0807CC3C/sub_0807D24C.inc @@ -1,6 +1,3 @@ - .include "asm/macros.inc" - - .include "constants/constants.inc" .syntax unified diff --git a/include/functions.h b/include/functions.h index 407641c0..4866a847 100644 --- a/include/functions.h +++ b/include/functions.h @@ -222,7 +222,7 @@ extern void sub_080B1520(u32); extern struct_0807D1C4* sub_0807D1C4(u32); extern u32 sub_0807D24C(u32, const char*, u32); extern void sub_0807CF68(u32); -extern void sub_0807D20C(u32, const char*, u32); +extern u32 sub_0807D20C(u32, const char*, u32); extern u32 sub_0807CF88(u32, u8*); extern void sub_0807D184(u32, const char*); extern u32 sub_0806F520(); diff --git a/src/code_0807CC3C.c b/src/code_0807CC3C.c index 74b38de7..69c81441 100644 --- a/src/code_0807CC3C.c +++ b/src/code_0807CC3C.c @@ -6,6 +6,7 @@ extern u8 gUnk_0811E514[]; extern u8 gUnk_0811E510[]; +extern const char gUnk_0811E4B4[8]; // the type is just a guess based on size and the fact that these are around a lot in this file extern ScriptExecutionContext gUnk_02022750; // might be ScriptExecutionContext[0x20] @@ -19,11 +20,28 @@ extern void sub_0801C4A0(u32); extern void sub_0807DB98(Entity*, ScriptExecutionContext*); extern s32 __divsi3(s32, s32); extern void _call_via_r6(Entity*, ScriptExecutionContext*); +extern u16 sub_080B18DC(u16, const char*); void sub_0807DB88(ScriptExecutionContext* context, u32 unk1); void sub_0807DAF0(Entity* entity, ScriptExecutionContext* context, u32 unk1); + // this is wrong by basically one instruction in the wrong place +NONMATCH("asm/non_matching/code_0807CC3C/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 (sub_080B18DC(unk_1, unk_2)) { + sub_080B18DC(unk_1, gUnk_0811E4B4); + return 0; + } + unk_1++; + unk_2 += 8; + } + return 1; +} +END_NONMATCH + NONMATCH("asm/non_matching/code_0807CC3C/sub_0807D24C.inc", u32 sub_0807D24C(u32 unk_1, const char* unk_2, u32 unk_3)) { unk_3 >>= 3; unk_1 >>= 3; @@ -31,7 +49,7 @@ NONMATCH("asm/non_matching/code_0807CC3C/sub_0807D24C.inc", u32 sub_0807D24C(u32 if (sub_080B180C(unk_1, unk_2)) return 0; unk_1++; - unk_2 += 4; + unk_2 += 8; } return 1; }