From d1819a0abaebaba7acfa22c28148c1fc7f186f9b Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Mon, 25 Jul 2022 17:43:17 +0300 Subject: [PATCH] Match sub_0802E9B0 --- asm/enemy/gleerok.s | 378 ---------------------- asm/non_matching/gleerok/sub_0802E768.inc | 61 ++++ asm/non_matching/gleerok/sub_0802E7CC.inc | 16 + asm/non_matching/gleerok/sub_0802E7E4.inc | 246 ++++++++++++++ src/enemy/gleerok.c | 40 ++- 5 files changed, 362 insertions(+), 379 deletions(-) create mode 100644 asm/non_matching/gleerok/sub_0802E768.inc create mode 100644 asm/non_matching/gleerok/sub_0802E7CC.inc create mode 100644 asm/non_matching/gleerok/sub_0802E7E4.inc diff --git a/asm/enemy/gleerok.s b/asm/enemy/gleerok.s index 3d81c214..dd341326 100644 --- a/asm/enemy/gleerok.s +++ b/asm/enemy/gleerok.s @@ -7,384 +7,6 @@ .text - thumb_func_start sub_0802E768 -sub_0802E768: @ 0x0802E768 - push {r4, r5, r6, lr} - adds r4, r0, #0 - movs r2, #0 - movs r6, #0x1f -_0802E770: - lsls r3, r2, #2 - adds r0, r4, r3 - ldrb r1, [r0, #1] - adds r2, #1 - lsls r0, r2, #2 - adds r0, r4, r0 - ldrb r0, [r0, #1] - subs r0, r1, r0 - ands r0, r6 - adds r5, r2, #0 - cmp r0, #0x10 - ble _0802E790 - cmp r0, #0x1e - bgt _0802E798 - adds r1, #1 - b _0802E796 -_0802E790: - cmp r0, #1 - ble _0802E798 - subs r1, #1 -_0802E796: - ands r1, r6 -_0802E798: - adds r0, r4, r3 - strb r1, [r0, #1] - ldrb r1, [r0, #0x19] - lsls r0, r5, #2 - adds r0, r4, r0 - ldrb r0, [r0, #0x19] - subs r0, r1, r0 - movs r2, #0x1f - ands r0, r2 - cmp r0, #0x10 - ble _0802E7B6 - cmp r0, #0x1d - bgt _0802E7BE - adds r1, #1 - b _0802E7BC -_0802E7B6: - cmp r0, #2 - ble _0802E7BE - subs r1, #1 -_0802E7BC: - ands r1, r2 -_0802E7BE: - adds r0, r4, r3 - strb r1, [r0, #0x19] - adds r2, r5, #0 - cmp r2, #4 - bls _0802E770 - pop {r4, r5, r6, pc} - .align 2, 0 - - thumb_func_start sub_0802E7CC -sub_0802E7CC: @ 0x0802E7CC - lsls r1, r1, #0x18 - lsrs r1, r1, #0x16 - adds r2, r0, #0 - adds r2, #0x3c - adds r2, r2, r1 - ldr r3, [r2] - adds r0, r0, r1 - ldrb r0, [r0, #1] - strb r0, [r3, #0x14] - ldr r0, [r2] - ldrb r0, [r0, #0x14] - bx lr - - thumb_func_start sub_0802E7E4 -sub_0802E7E4: @ 0x0802E7E4 - push {r4, r5, r6, r7, lr} - mov r7, sl - mov r6, sb - mov r5, r8 - push {r5, r6, r7} - mov ip, r0 - ldr r0, [r0, #0x50] - adds r0, #0x5a - ldrb r1, [r0] - movs r0, #0x40 - ands r0, r1 - cmp r0, #0 - beq _0802E8D0 - movs r6, #0 - movs r5, #0 - mov r7, ip - adds r7, #0x3c - movs r0, #0x30 - add r0, ip - mov r8, r0 - movs r1, #8 - rsbs r1, r1, #0 - mov sl, r1 - movs r2, #4 - rsbs r2, r2, #0 - mov sb, r2 -_0802E818: - lsls r0, r5, #2 - adds r4, r7, r0 - ldr r3, [r4] - adds r3, #0x29 - movs r1, #7 - ands r1, r6 - ldrb r2, [r3] - mov r0, sl - ands r0, r2 - orrs r0, r1 - strb r0, [r3] - adds r6, #1 - mov r1, r8 - adds r0, r1, r5 - ldrb r0, [r0] - cmp r0, #0 - bne _0802E852 - ldr r3, [r4] - ldrb r2, [r3, #0x18] - lsls r1, r2, #0x1e - lsrs r1, r1, #0x1e - movs r0, #2 - rsbs r0, r0, #0 - ands r1, r0 - mov r0, sb - ands r0, r2 - orrs r0, r1 - strb r0, [r3, #0x18] - b _0802E860 -_0802E852: - ldr r2, [r4] - ldrb r1, [r2, #0x18] - mov r0, sb - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r2, #0x18] -_0802E860: - adds r5, #1 - cmp r5, #5 - bls _0802E818 - movs r5, #0 - movs r2, #7 - mov sb, r2 - movs r0, #8 - rsbs r0, r0, #0 - mov r8, r0 -_0802E872: - lsls r1, r5, #2 - mov r2, ip - adds r0, r2, r1 - ldrb r0, [r0, #1] - subs r0, #8 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - adds r5, #1 - cmp r0, #0x10 - bhi _0802E8BA - adds r0, r7, r1 - ldr r3, [r0] - adds r3, #0x29 - ldrb r4, [r3] - lsls r0, r4, #0x1d - lsrs r6, r0, #0x1d - lsls r2, r5, #2 - adds r2, r7, r2 - ldr r0, [r2] - adds r0, #0x29 - ldrb r1, [r0] - lsls r1, r1, #0x1d - lsrs r1, r1, #0x1d - mov r0, r8 - ands r0, r4 - orrs r0, r1 - strb r0, [r3] - ldr r1, [r2] - adds r1, #0x29 - mov r0, sb - ands r6, r0 - ldrb r2, [r1] - mov r0, r8 - ands r0, r2 - orrs r0, r6 - strb r0, [r1] -_0802E8BA: - cmp r5, #4 - bls _0802E872 - mov r1, ip - ldr r0, [r1, #0x38] - adds r0, #0x29 - ldrb r2, [r0] - movs r1, #8 - rsbs r1, r1, #0 - ands r1, r2 - strb r1, [r0] - b _0802E9A4 -_0802E8D0: - movs r6, #5 - movs r5, #0 - mov r7, ip - adds r7, #0x3c - movs r2, #0x30 - add r2, ip - mov r8, r2 - movs r0, #8 - rsbs r0, r0, #0 - mov sl, r0 - movs r1, #4 - rsbs r1, r1, #0 - mov sb, r1 -_0802E8EA: - lsls r0, r5, #2 - adds r4, r7, r0 - ldr r3, [r4] - adds r3, #0x29 - movs r1, #7 - ands r1, r6 - ldrb r2, [r3] - mov r0, sl - ands r0, r2 - orrs r0, r1 - strb r0, [r3] - subs r6, #1 - mov r2, r8 - adds r0, r2, r5 - ldrb r0, [r0] - cmp r0, #0 - bne _0802E924 - ldr r3, [r4] - ldrb r2, [r3, #0x18] - lsls r1, r2, #0x1e - lsrs r1, r1, #0x1e - movs r0, #2 - rsbs r0, r0, #0 - ands r1, r0 - mov r0, sb - ands r0, r2 - orrs r0, r1 - strb r0, [r3, #0x18] - b _0802E932 -_0802E924: - ldr r2, [r4] - ldrb r1, [r2, #0x18] - mov r0, sb - ands r0, r1 - movs r1, #1 - orrs r0, r1 - strb r0, [r2, #0x18] -_0802E932: - adds r5, #1 - cmp r5, #5 - bls _0802E8EA - movs r5, #0 - movs r0, #7 - mov sb, r0 - movs r1, #8 - rsbs r1, r1, #0 - mov r8, r1 -_0802E944: - lsls r1, r5, #2 - mov r2, ip - adds r0, r2, r1 - ldrb r0, [r0, #1] - subs r0, #8 - lsls r0, r0, #0x18 - lsrs r0, r0, #0x18 - adds r5, #1 - cmp r0, #0x10 - bls _0802E98C - adds r0, r7, r1 - ldr r3, [r0] - adds r3, #0x29 - ldrb r4, [r3] - lsls r0, r4, #0x1d - lsrs r6, r0, #0x1d - lsls r2, r5, #2 - adds r2, r7, r2 - ldr r0, [r2] - adds r0, #0x29 - ldrb r1, [r0] - lsls r1, r1, #0x1d - lsrs r1, r1, #0x1d - mov r0, r8 - ands r0, r4 - orrs r0, r1 - strb r0, [r3] - ldr r1, [r2] - adds r1, #0x29 - mov r0, sb - ands r6, r0 - ldrb r2, [r1] - mov r0, r8 - ands r0, r2 - orrs r0, r6 - strb r0, [r1] -_0802E98C: - cmp r5, #4 - bls _0802E944 - mov r1, ip - ldr r2, [r1, #0x38] - adds r2, #0x29 - ldrb r1, [r2] - movs r0, #8 - rsbs r0, r0, #0 - ands r0, r1 - movs r1, #6 - orrs r0, r1 - strb r0, [r2] -_0802E9A4: - pop {r3, r4, r5} - mov r8, r3 - mov sb, r4 - mov sl, r5 - pop {r4, r5, r6, r7, pc} - .align 2, 0 - - thumb_func_start sub_0802E9B0 -sub_0802E9B0: @ 0x0802E9B0 - push {r4, lr} - adds r4, r0, #0 - ldr r0, _0802E9D0 @ =gPlayerEntity - movs r2, #0x2e - ldrsh r1, [r0, r2] - movs r3, #0x32 - ldrsh r2, [r0, r3] - adds r0, r4, #0 - bl sub_080041DC - lsrs r2, r0, #4 - cmp r2, #0x5f - bgt _0802E9D4 - movs r2, #0xa - b _0802E9EA - .align 2, 0 -_0802E9D0: .4byte gPlayerEntity -_0802E9D4: - adds r1, r2, #0 - subs r1, #0x60 - cmp r1, #0 - bge _0802E9DE - adds r1, #3 -_0802E9DE: - asrs r1, r1, #2 - movs r0, #0xa - subs r2, r0, r1 - cmp r2, #3 - bgt _0802E9EA - movs r2, #4 -_0802E9EA: - adds r0, r4, #0 - adds r0, #0x84 - ldr r3, [r0] - adds r0, r3, #0 - adds r0, #0x2d - ldrb r0, [r0] - cmp r2, r0 - beq _0802EA10 - cmp r2, r0 - ble _0802EA04 - ldrh r0, [r3, #0x2c] - adds r0, #0x20 - b _0802EA08 -_0802EA04: - ldrh r0, [r3, #0x2c] - subs r0, #0x20 -_0802EA08: - ldr r2, _0802EA14 @ =0x00001FFF - adds r1, r2, #0 - ands r0, r1 - strh r0, [r3, #0x2c] -_0802EA10: - pop {r4, pc} - .align 2, 0 -_0802EA14: .4byte 0x00001FFF - thumb_func_start sub_0802EA18 sub_0802EA18: @ 0x0802EA18 push {lr} diff --git a/asm/non_matching/gleerok/sub_0802E768.inc b/asm/non_matching/gleerok/sub_0802E768.inc new file mode 100644 index 00000000..0a99cd88 --- /dev/null +++ b/asm/non_matching/gleerok/sub_0802E768.inc @@ -0,0 +1,61 @@ + .syntax unified + + .text + push {r4, r5, r6, lr} + adds r4, r0, #0 + movs r2, #0 + movs r6, #0x1f +_0802E770: + lsls r3, r2, #2 + adds r0, r4, r3 + ldrb r1, [r0, #1] + adds r2, #1 + lsls r0, r2, #2 + adds r0, r4, r0 + ldrb r0, [r0, #1] + subs r0, r1, r0 + ands r0, r6 + adds r5, r2, #0 + cmp r0, #0x10 + ble _0802E790 + cmp r0, #0x1e + bgt _0802E798 + adds r1, #1 + b _0802E796 +_0802E790: + cmp r0, #1 + ble _0802E798 + subs r1, #1 +_0802E796: + ands r1, r6 +_0802E798: + adds r0, r4, r3 + strb r1, [r0, #1] + ldrb r1, [r0, #0x19] + lsls r0, r5, #2 + adds r0, r4, r0 + ldrb r0, [r0, #0x19] + subs r0, r1, r0 + movs r2, #0x1f + ands r0, r2 + cmp r0, #0x10 + ble _0802E7B6 + cmp r0, #0x1d + bgt _0802E7BE + adds r1, #1 + b _0802E7BC +_0802E7B6: + cmp r0, #2 + ble _0802E7BE + subs r1, #1 +_0802E7BC: + ands r1, r2 +_0802E7BE: + adds r0, r4, r3 + strb r1, [r0, #0x19] + adds r2, r5, #0 + cmp r2, #4 + bls _0802E770 + pop {r4, r5, r6, pc} + .align 2, 0 + .syntax divided diff --git a/asm/non_matching/gleerok/sub_0802E7CC.inc b/asm/non_matching/gleerok/sub_0802E7CC.inc new file mode 100644 index 00000000..b4899ff7 --- /dev/null +++ b/asm/non_matching/gleerok/sub_0802E7CC.inc @@ -0,0 +1,16 @@ + .syntax unified + + .text + lsls r1, r1, #0x18 + lsrs r1, r1, #0x16 + adds r2, r0, #0 + adds r2, #0x3c + adds r2, r2, r1 + ldr r3, [r2] + adds r0, r0, r1 + ldrb r0, [r0, #1] + strb r0, [r3, #0x14] + ldr r0, [r2] + ldrb r0, [r0, #0x14] + bx lr + .syntax divided diff --git a/asm/non_matching/gleerok/sub_0802E7E4.inc b/asm/non_matching/gleerok/sub_0802E7E4.inc new file mode 100644 index 00000000..93394c16 --- /dev/null +++ b/asm/non_matching/gleerok/sub_0802E7E4.inc @@ -0,0 +1,246 @@ + .syntax unified + + .text + push {r4, r5, r6, r7, lr} + mov r7, sl + mov r6, sb + mov r5, r8 + push {r5, r6, r7} + mov ip, r0 + ldr r0, [r0, #0x50] + adds r0, #0x5a + ldrb r1, [r0] + movs r0, #0x40 + ands r0, r1 + cmp r0, #0 + beq _0802E8D0 + movs r6, #0 + movs r5, #0 + mov r7, ip + adds r7, #0x3c + movs r0, #0x30 + add r0, ip + mov r8, r0 + movs r1, #8 + rsbs r1, r1, #0 + mov sl, r1 + movs r2, #4 + rsbs r2, r2, #0 + mov sb, r2 +_0802E818: + lsls r0, r5, #2 + adds r4, r7, r0 + ldr r3, [r4] + adds r3, #0x29 + movs r1, #7 + ands r1, r6 + ldrb r2, [r3] + mov r0, sl + ands r0, r2 + orrs r0, r1 + strb r0, [r3] + adds r6, #1 + mov r1, r8 + adds r0, r1, r5 + ldrb r0, [r0] + cmp r0, #0 + bne _0802E852 + ldr r3, [r4] + ldrb r2, [r3, #0x18] + lsls r1, r2, #0x1e + lsrs r1, r1, #0x1e + movs r0, #2 + rsbs r0, r0, #0 + ands r1, r0 + mov r0, sb + ands r0, r2 + orrs r0, r1 + strb r0, [r3, #0x18] + b _0802E860 +_0802E852: + ldr r2, [r4] + ldrb r1, [r2, #0x18] + mov r0, sb + ands r0, r1 + movs r1, #1 + orrs r0, r1 + strb r0, [r2, #0x18] +_0802E860: + adds r5, #1 + cmp r5, #5 + bls _0802E818 + movs r5, #0 + movs r2, #7 + mov sb, r2 + movs r0, #8 + rsbs r0, r0, #0 + mov r8, r0 +_0802E872: + lsls r1, r5, #2 + mov r2, ip + adds r0, r2, r1 + ldrb r0, [r0, #1] + subs r0, #8 + lsls r0, r0, #0x18 + lsrs r0, r0, #0x18 + adds r5, #1 + cmp r0, #0x10 + bhi _0802E8BA + adds r0, r7, r1 + ldr r3, [r0] + adds r3, #0x29 + ldrb r4, [r3] + lsls r0, r4, #0x1d + lsrs r6, r0, #0x1d + lsls r2, r5, #2 + adds r2, r7, r2 + ldr r0, [r2] + adds r0, #0x29 + ldrb r1, [r0] + lsls r1, r1, #0x1d + lsrs r1, r1, #0x1d + mov r0, r8 + ands r0, r4 + orrs r0, r1 + strb r0, [r3] + ldr r1, [r2] + adds r1, #0x29 + mov r0, sb + ands r6, r0 + ldrb r2, [r1] + mov r0, r8 + ands r0, r2 + orrs r0, r6 + strb r0, [r1] +_0802E8BA: + cmp r5, #4 + bls _0802E872 + mov r1, ip + ldr r0, [r1, #0x38] + adds r0, #0x29 + ldrb r2, [r0] + movs r1, #8 + rsbs r1, r1, #0 + ands r1, r2 + strb r1, [r0] + b _0802E9A4 +_0802E8D0: + movs r6, #5 + movs r5, #0 + mov r7, ip + adds r7, #0x3c + movs r2, #0x30 + add r2, ip + mov r8, r2 + movs r0, #8 + rsbs r0, r0, #0 + mov sl, r0 + movs r1, #4 + rsbs r1, r1, #0 + mov sb, r1 +_0802E8EA: + lsls r0, r5, #2 + adds r4, r7, r0 + ldr r3, [r4] + adds r3, #0x29 + movs r1, #7 + ands r1, r6 + ldrb r2, [r3] + mov r0, sl + ands r0, r2 + orrs r0, r1 + strb r0, [r3] + subs r6, #1 + mov r2, r8 + adds r0, r2, r5 + ldrb r0, [r0] + cmp r0, #0 + bne _0802E924 + ldr r3, [r4] + ldrb r2, [r3, #0x18] + lsls r1, r2, #0x1e + lsrs r1, r1, #0x1e + movs r0, #2 + rsbs r0, r0, #0 + ands r1, r0 + mov r0, sb + ands r0, r2 + orrs r0, r1 + strb r0, [r3, #0x18] + b _0802E932 +_0802E924: + ldr r2, [r4] + ldrb r1, [r2, #0x18] + mov r0, sb + ands r0, r1 + movs r1, #1 + orrs r0, r1 + strb r0, [r2, #0x18] +_0802E932: + adds r5, #1 + cmp r5, #5 + bls _0802E8EA + movs r5, #0 + movs r0, #7 + mov sb, r0 + movs r1, #8 + rsbs r1, r1, #0 + mov r8, r1 +_0802E944: + lsls r1, r5, #2 + mov r2, ip + adds r0, r2, r1 + ldrb r0, [r0, #1] + subs r0, #8 + lsls r0, r0, #0x18 + lsrs r0, r0, #0x18 + adds r5, #1 + cmp r0, #0x10 + bls _0802E98C + adds r0, r7, r1 + ldr r3, [r0] + adds r3, #0x29 + ldrb r4, [r3] + lsls r0, r4, #0x1d + lsrs r6, r0, #0x1d + lsls r2, r5, #2 + adds r2, r7, r2 + ldr r0, [r2] + adds r0, #0x29 + ldrb r1, [r0] + lsls r1, r1, #0x1d + lsrs r1, r1, #0x1d + mov r0, r8 + ands r0, r4 + orrs r0, r1 + strb r0, [r3] + ldr r1, [r2] + adds r1, #0x29 + mov r0, sb + ands r6, r0 + ldrb r2, [r1] + mov r0, r8 + ands r0, r2 + orrs r0, r6 + strb r0, [r1] +_0802E98C: + cmp r5, #4 + bls _0802E944 + mov r1, ip + ldr r2, [r1, #0x38] + adds r2, #0x29 + ldrb r1, [r2] + movs r0, #8 + rsbs r0, r0, #0 + ands r0, r1 + movs r1, #6 + orrs r0, r1 + strb r0, [r2] +_0802E9A4: + pop {r3, r4, r5} + mov r8, r3 + mov sb, r4 + mov sl, r5 + pop {r4, r5, r6, r7, pc} + .align 2, 0 + .syntax divided diff --git a/src/enemy/gleerok.c b/src/enemy/gleerok.c index a95d0607..b6893819 100644 --- a/src/enemy/gleerok.c +++ b/src/enemy/gleerok.c @@ -7,7 +7,9 @@ #include "object.h" typedef struct { - /*0x00*/ u8 filler[0x30]; + /*0x00*/ u8 filler[0x2c]; + /*0x2c*/ union SplitHWord unk_2c; + /*0x2e*/ u16 filler_2e; /*0x30*/ u8 unk_30[6]; /*0x36*/ u8 filler_36[0x2]; /*0x38*/ Entity* ent; @@ -1251,3 +1253,39 @@ NONMATCH("asm/non_matching/gleerok/sub_0802E518.inc", void sub_0802E518(GleerokE } } END_NONMATCH + +ASM_FUNC("asm/non_matching/gleerok/sub_0802E768.inc", bool32 sub_0802E768(Gleerok_HeapStruct* param_1)); + +ASM_FUNC("asm/non_matching/gleerok/sub_0802E7CC.inc", + bool32 sub_0802E7CC(Gleerok_HeapStruct* param_1, u32 param_2, u32 param_3, u32 param_4)); + +ASM_FUNC("asm/non_matching/gleerok/sub_0802E7E4.inc", void sub_0802E7E4(Gleerok_HeapStruct* this)); + +void sub_0802E9B0(GleerokEntity* this) { + u32 uVar1; + s32 iVar2; + s32 uVar4; + Gleerok_HeapStruct* heap; + + iVar2 = sub_080041DC(super, gPlayerEntity.x.HALF.HI, gPlayerEntity.y.HALF.HI) >> 4; + if (iVar2 < 0x60) { + iVar2 = 10; + } else { + uVar4 = iVar2 - 0x60; + if (uVar4 < 0) { + uVar4 = iVar2 - 0x5d; + } + iVar2 = 10 - (uVar4 >> 2); + if (iVar2 < 4) { + iVar2 = 4; + } + } + heap = this->unk_84; + if (iVar2 != heap->unk_2c.HALF.HI) { + if (iVar2 > heap->unk_2c.HALF.HI) { + heap->unk_2c.HWORD = (heap->unk_2c.HWORD + 0x20) & 0x1fff; + } else { + heap->unk_2c.HWORD = (heap->unk_2c.HWORD - 0x20) & 0x1fff; + } + } +}