From 66e1362dc6fabdda45b5d90f0800bcb3cdaac862 Mon Sep 17 00:00:00 2001 From: Tal Hayon Date: Tue, 26 Jul 2022 17:12:53 +0300 Subject: [PATCH] Add nonmatching sub_0802EB08 --- asm/enemy/gleerok.s | 84 ---------------------- asm/non_matching/gleerok/sub_0802EB08.inc | 85 +++++++++++++++++++++++ src/enemy/gleerok.c | 44 +++++++++++- 3 files changed, 128 insertions(+), 85 deletions(-) create mode 100644 asm/non_matching/gleerok/sub_0802EB08.inc diff --git a/asm/enemy/gleerok.s b/asm/enemy/gleerok.s index 104034f9..62242ca2 100644 --- a/asm/enemy/gleerok.s +++ b/asm/enemy/gleerok.s @@ -7,90 +7,6 @@ .text - thumb_func_start sub_0802EB08 -sub_0802EB08: @ 0x0802EB08 - push {r4, r5, r6, r7, lr} - mov r7, r8 - push {r7} - adds r5, r0, #0 - adds r6, r1, #0 - adds r7, r2, #0 - movs r0, #0 - mov r8, r0 - movs r3, #0 -_0802EB1A: - lsls r0, r3, #2 - adds r4, r5, r0 - adds r2, r3, #1 - lsls r0, r2, #2 - adds r1, r5, r0 - ldrb r0, [r4, #0x19] - ldrb r3, [r1, #0x19] - cmp r0, r3 - beq _0802EB4E - movs r0, #1 - mov r8, r0 - ldrb r0, [r1, #0x19] - ldrb r1, [r4, #0x19] - subs r0, r0, r1 - movs r1, #0x1f - ands r0, r1 - movs r3, #2 - cmp r0, #0x10 - ble _0802EB42 - movs r3, #3 -_0802EB42: - adds r0, r5, #0 - adds r1, r2, #0 - adds r2, r6, #0 - bl sub_0802EA68 - b _0802EB54 -_0802EB4E: - adds r3, r2, #0 - cmp r3, #4 - bls _0802EB1A -_0802EB54: - movs r3, #0 - movs r4, #0x1f - rsbs r6, r7, #0 - ands r6, r4 -_0802EB5C: - adds r2, r3, #1 - lsls r0, r2, #2 - adds r0, r5, r0 - ldrb r1, [r0, #0x19] - lsls r0, r3, #2 - adds r0, r5, r0 - ldrb r0, [r0, #0x19] - subs r0, r1, r0 - ands r0, r4 - adds r3, r1, #0 - adds r1, r2, #0 - cmp r0, #0x10 - ble _0802EB7E - cmp r6, r0 - ble _0802EB86 - adds r3, #1 - b _0802EB84 -_0802EB7E: - cmp r7, r0 - bge _0802EB86 - subs r3, #1 -_0802EB84: - ands r3, r4 -_0802EB86: - lsls r0, r1, #2 - adds r0, r5, r0 - strb r3, [r0, #0x19] - adds r3, r1, #0 - cmp r3, #4 - bls _0802EB5C - mov r0, r8 - pop {r3} - mov r8, r3 - pop {r4, r5, r6, r7, pc} - .align 2, 0 - thumb_func_start sub_0802EB9C sub_0802EB9C: @ 0x0802EB9C push {r4, lr} diff --git a/asm/non_matching/gleerok/sub_0802EB08.inc b/asm/non_matching/gleerok/sub_0802EB08.inc new file mode 100644 index 00000000..f859c19d --- /dev/null +++ b/asm/non_matching/gleerok/sub_0802EB08.inc @@ -0,0 +1,85 @@ + .syntax unified + + .text + push {r4, r5, r6, r7, lr} + mov r7, r8 + push {r7} + adds r5, r0, #0 + adds r6, r1, #0 + adds r7, r2, #0 + movs r0, #0 + mov r8, r0 + movs r3, #0 +_0802EB1A: + lsls r0, r3, #2 + adds r4, r5, r0 + adds r2, r3, #1 + lsls r0, r2, #2 + adds r1, r5, r0 + ldrb r0, [r4, #0x19] + ldrb r3, [r1, #0x19] + cmp r0, r3 + beq _0802EB4E + movs r0, #1 + mov r8, r0 + ldrb r0, [r1, #0x19] + ldrb r1, [r4, #0x19] + subs r0, r0, r1 + movs r1, #0x1f + ands r0, r1 + movs r3, #2 + cmp r0, #0x10 + ble _0802EB42 + movs r3, #3 +_0802EB42: + adds r0, r5, #0 + adds r1, r2, #0 + adds r2, r6, #0 + bl sub_0802EA68 + b _0802EB54 +_0802EB4E: + adds r3, r2, #0 + cmp r3, #4 + bls _0802EB1A +_0802EB54: + movs r3, #0 + movs r4, #0x1f + rsbs r6, r7, #0 + ands r6, r4 +_0802EB5C: + adds r2, r3, #1 + lsls r0, r2, #2 + adds r0, r5, r0 + ldrb r1, [r0, #0x19] + lsls r0, r3, #2 + adds r0, r5, r0 + ldrb r0, [r0, #0x19] + subs r0, r1, r0 + ands r0, r4 + adds r3, r1, #0 + adds r1, r2, #0 + cmp r0, #0x10 + ble _0802EB7E + cmp r6, r0 + ble _0802EB86 + adds r3, #1 + b _0802EB84 +_0802EB7E: + cmp r7, r0 + bge _0802EB86 + subs r3, #1 +_0802EB84: + ands r3, r4 +_0802EB86: + lsls r0, r1, #2 + adds r0, r5, r0 + strb r3, [r0, #0x19] + adds r3, r1, #0 + cmp r3, #4 + bls _0802EB5C + mov r0, r8 + pop {r3} + mov r8, r3 + pop {r4, r5, r6, r7, pc} + .align 2, 0 + .syntax divided diff --git a/src/enemy/gleerok.c b/src/enemy/gleerok.c index 6fa86ea0..d4805db2 100644 --- a/src/enemy/gleerok.c +++ b/src/enemy/gleerok.c @@ -69,7 +69,7 @@ extern void sub_0802E430(GleerokEntity* this); extern void sub_0802EBC4(GleerokEntity* this); extern void sub_0802E9B0(GleerokEntity* this); -extern bool32 sub_0802EB08(Gleerok_HeapStruct* param_1, u32 param_2, u32 param_3); +extern bool32 sub_0802EB08(Gleerok_HeapStruct* param_1, u32 param_2, s32 param_3); extern bool32 sub_0802EA18(u32 param_1, u32 param_2, u32 param_3); extern void sub_0802EA48(Gleerok_HeapStruct* param_1, u32 param_2, u32 param_3, u32 param_4); extern void sub_0802EA68(Gleerok_HeapStruct* param_1, u32 param_2, u32 param_3, u32 param_4); @@ -1446,3 +1446,45 @@ NONMATCH("asm/non_matching/gleerok/sub_0802EA88.inc", bool32 sub_0802EA88(Gleero return uVar6; } END_NONMATCH + +NONMATCH("asm/non_matching/gleerok/sub_0802EB08.inc", + bool32 sub_0802EB08(Gleerok_HeapStruct* param_1, u32 param_2, s32 param_3)) { + s32 uVar2; + u32 bVar4; + u32 uVar5; + u32 uVar6; + u32 uVar7; + + uVar7 = FALSE; + + for (uVar6 = 0; uVar6 < 5; uVar6++) { + if (param_1->filler2[uVar6].unk0.HALF.HI != param_1->filler2[uVar6 + 1].unk0.HALF.HI) { + uVar7 = TRUE; + if (0x10 < + (s32)((param_1->filler2[uVar6 + 1].unk0.HALF.HI - param_1->filler2[uVar6].unk0.HALF.HI) & 0x1fU)) { + uVar5 = 3; + } else { + uVar5 = 2; + } + sub_0802EA68(param_1, uVar6 + 1, param_2, uVar5); + break; + } + } + + for (uVar6 = 0; uVar6 <= 4; uVar6++) { + bVar4 = param_1->filler2[uVar6 + 1].unk0.HALF.HI; + uVar2 = (bVar4 - param_1->filler2[uVar6].unk0.HALF.HI) & 0x1f; + if (uVar2 >= 0x11) { + if ((-param_3 & 0x1f) > uVar2) { + bVar4 = (bVar4 + 1) & 0x1f; + } + } else { + if (param_3 < (int)uVar2) { + bVar4 = (bVar4 - 1) & 0x1f; + } + } + param_1->filler2[uVar6 + 1].unk0.HALF.HI = bVar4; + } + return uVar7; +} +END_NONMATCH