diff --git a/asm/non_matching/common/sub_0801E64C.inc b/asm/non_matching/common/sub_0801E64C.inc deleted file mode 100644 index 03076c44..00000000 --- a/asm/non_matching/common/sub_0801E64C.inc +++ /dev/null @@ -1,72 +0,0 @@ - .syntax unified - push {r4, r5, r6, r7, lr} - adds r5, r0, #0 - adds r4, r1, #0 - adds r6, r3, #0 - ldr r7, _0801E6C4 @ =gUnk_02018EE0 - cmp r4, #0 - bge _0801E65E - cmp r6, #0 - blt _0801E6C2 -_0801E65E: - cmp r4, #0x9f - ble _0801E666 - cmp r6, #0x9f - bgt _0801E6C2 -_0801E666: - cmp r4, r6 - ble _0801E676 - adds r1, r4, #0 - adds r4, r6, #0 - adds r6, r1, #0 - adds r1, r5, #0 - adds r5, r2, #0 - adds r2, r1, #0 -_0801E676: - cmp r4, r6 - beq _0801E6C2 - subs r0, r2, r5 - lsls r0, r0, #0x10 - subs r1, r6, r4 - bl Div - adds r3, r0, #0 - cmp r4, #0 - bge _0801E694 - rsbs r0, r4, #0 - muls r0, r3, r0 - asrs r0, r0, #0x10 - adds r5, r5, r0 - movs r4, #0 -_0801E694: - cmp r6, #0x9f - ble _0801E69A - movs r6, #0x9f -_0801E69A: - lsls r2, r5, #0x10 - lsls r0, r4, #1 - adds r0, r0, r4 - ldr r1, [sp, #0x14] - adds r0, r0, r1 - lsls r0, r0, #2 - adds r7, r0, r7 -_0801E6A8: - cmp r5, #0 - bge _0801E6AE - movs r5, #0 -_0801E6AE: - cmp r5, #0xf0 - ble _0801E6B4 - movs r5, #0xf0 -_0801E6B4: - str r5, [r7] - adds r2, r2, r3 - asrs r5, r2, #0x10 - adds r4, #1 - adds r7, #0xc - cmp r4, r6 - ble _0801E6A8 -_0801E6C2: - pop {r4, r5, r6, r7, pc} - .align 2, 0 -_0801E6C4: .4byte gUnk_02018EE0 - .syntax divided diff --git a/src/common.c b/src/common.c index 51b331c1..a9ef58d1 100644 --- a/src/common.c +++ b/src/common.c @@ -701,7 +701,43 @@ ASM_FUNC("asm/non_matching/common/sub_0801E31C.inc", void sub_0801E31C(u32 a1, u ASM_FUNC("asm/non_matching/common/sub_0801E49C.inc", void sub_0801E49C(u32 a1, u32 a2, u32 a3, u32 a4)); -ASM_FUNC("asm/non_matching/common/sub_0801E64C.inc", void sub_0801E64C(u32 a1, u32 a2, u32 a3, u32 a4, u32 a5)); +void sub_0801E64C(s32 param_1, s32 param_2, s32 param_3, s32 param_4, s32 param_5) { + s32 sVar1; + s32* ptr = (s32*)gUnk_02018EE0; + register s32 tmp asm("r1"); + + if ((0 <= param_2 || 0 <= param_4) && (param_2 < 0xa0 || (param_4 < 0xa0))) { + if (param_2 > param_4) { + SWAP(param_2, param_4, tmp); + SWAP(param_1, param_3, tmp); + } + if (param_2 != param_4) { + sVar1 = Div((param_3 - param_1) * 0x10000, param_4 - param_2); + if (param_2 < 0) { + param_1 += (sVar1 * -param_2) >> 0x10; + param_2 = 0; + } + if (0x9f < param_4) { + param_4 = 0x9f; + } + param_3 = param_1 << 0x10; + ptr += param_2 * 3 + param_5; + do { + if (param_1 < 0) { + param_1 = 0; + } + if (0xf0 < param_1) { + param_1 = 0xf0; + } + *ptr = param_1; + param_3 += sVar1; + param_1 = param_3 >> 0x10; + param_2++; + ptr += 3; + } while (param_2 <= param_4); + } + } +} void sub_0801E6C8(u32 param_1) { u32 tmp;