From 0c25e25955f42e5349d3a458edd8bcbfc0040a01 Mon Sep 17 00:00:00 2001 From: Zur3l <90565581+Zur3l@users.noreply.github.com> Date: Sat, 11 Jul 2026 15:59:13 -0400 Subject: [PATCH] Decomp MultiplyByFixedPoint --- asm/include/main_02001A30.inc | 2 - asm/include/main_02001AB0.inc | 4 + asm/main_02001A30.s | 617 ---------------------------------- asm/main_02001AB0.s | 594 ++++++++++++++++++++++++++++++++ include/main_02001A54.h | 8 + main.lsf | 2 + src/main_02001A54.c | 42 +++ 7 files changed, 650 insertions(+), 619 deletions(-) create mode 100644 asm/include/main_02001AB0.inc create mode 100644 asm/main_02001AB0.s create mode 100644 include/main_02001A54.h create mode 100644 src/main_02001A54.c diff --git a/asm/include/main_02001A30.inc b/asm/include/main_02001A30.inc index f8dc2970..6f70f09b 100644 --- a/asm/include/main_02001A30.inc +++ b/asm/include/main_02001A30.inc @@ -1,3 +1 @@ #pragma once -.public NATURAL_LOG_VALUE_TABLE -.public PRNG_SEQUENCE_NUM diff --git a/asm/include/main_02001AB0.inc b/asm/include/main_02001AB0.inc new file mode 100644 index 00000000..1541e0d5 --- /dev/null +++ b/asm/include/main_02001AB0.inc @@ -0,0 +1,4 @@ +#pragma once +.public NATURAL_LOG_VALUE_TABLE +.public PRNG_SEQUENCE_NUM +.public UFixedPoint64CmpLt diff --git a/asm/main_02001A30.s b/asm/main_02001A30.s index b47b63d6..c98d23b0 100644 --- a/asm/main_02001A30.s +++ b/asm/main_02001A30.s @@ -15,620 +15,3 @@ UFixedPoint64CmpLt: ; 0x02001A30 movhs r0, #0 bx lr arm_func_end UFixedPoint64CmpLt - - arm_func_start MultiplyByFixedPoint -MultiplyByFixedPoint: ; 0x02001A54 - stmdb sp!, {r3, r4, r5, lr} - tst r0, #0x80000000 - movne r2, #1 - moveq r2, #0 - tst r1, #0x80000000 - and r4, r2, #0xff - movne r2, #1 - moveq r2, #0 - cmp r0, #0 - and r5, r2, #0xff - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - cmp r1, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - cmp r4, #0 - rsbne r0, r0, #0 - cmp r5, #0 - rsbne r1, r1, #0 - bl UMultiplyByFixedPoint - cmp r4, r5 - rsbne r0, r0, #0 - ldmia sp!, {r3, r4, r5, pc} - arm_func_end MultiplyByFixedPoint - - arm_func_start sub_02001AB0 -sub_02001AB0: ; 0x02001AB0 - stmdb sp!, {r3, r4, r5, lr} - tst r0, #0x80000000 - movne r2, #1 - moveq r2, #0 - tst r1, #0x80000000 - and r4, r2, #0xff - movne r2, #1 - moveq r2, #0 - cmp r1, #0 - and r5, r2, #0xff - mvneq r0, #0x80000000 - ldmeqia sp!, {r3, r4, r5, pc} - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - cmp r4, #0 - rsbne r0, r0, #0 - cmp r5, #0 - rsbne r1, r1, #0 - bl sub_02001BB4 - cmp r4, r5 - rsbne r0, r0, #0 - ldmia sp!, {r3, r4, r5, pc} - arm_func_end sub_02001AB0 - - arm_func_start UMultiplyByFixedPoint -UMultiplyByFixedPoint: ; 0x02001B0C - stmdb sp!, {r3, r4, r5, lr} - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - cmp r1, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, pc} - mov r3, #0 - mov r2, r3 - mov ip, r3 - mov lr, r3 - mov r4, r3 -_02001B3C: - mov r5, lr - tst r1, #1 - beq _02001B58 - add lr, lr, r0 - add ip, ip, r3 - cmp r5, lr - addhi ip, ip, #1 -_02001B58: - mov r1, r1, lsr #1 - tst r2, #1 - orrne r1, r1, #0x80000000 - mov r2, r2, lsr #1 - tst r0, #0x80000000 - mov r3, r3, lsl #1 - mov r0, r0, lsl #1 - add r4, r4, #1 - orrne r3, r3, #1 - bic r2, r2, #0x80000000 - cmp r4, #0x40 - bic r0, r0, #1 - blt _02001B3C - mov r0, lr, lsr #8 - tst lr, #0x80 - movne r1, #1 - bic r0, r0, #0xff000000 - moveq r1, #0 - orr lr, r0, ip, lsl #24 - tst r1, #0xff - addne lr, lr, #1 - mov r0, lr - ldmia sp!, {r3, r4, r5, pc} - arm_func_end UMultiplyByFixedPoint - - arm_func_start sub_02001BB4 -sub_02001BB4: ; 0x02001BB4 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - movs sl, r1 - mvneq r0, #0x80000000 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - cmp r0, #0 - moveq r0, #0 - ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - mov r8, #0 - mov r1, r0, asr #0x18 - mov r0, r0, lsl #8 - mov r4, r8 - mov r5, r8 - mov sb, r8 - and r6, r1, #0xff - bic r7, r0, #0xff - mov fp, r8 -_02001BF4: - mov r0, r5, lsl #1 - tst r5, #0x80000000 - mov r4, r4, lsl #1 - orrne r4, r4, #1 - bic r5, r0, #1 - tst r6, #0x80000000 - orrne r5, r5, #1 - mov r3, r7, lsl #1 - tst r7, #0x80000000 - mov r6, r6, lsl #1 - bic r7, r3, #1 - mov r0, r4 - mov r1, r5 - mov r2, fp - mov r3, sl - orrne r6, r6, #1 - bl UFixedPoint64CmpLt - cmp r0, #0 - bne _02001C58 - mov r0, r5 - sub r5, r5, sl - cmp r0, r5 - mov r1, #1 - sublo r4, r4, #1 - b _02001C5C -_02001C58: - mov r1, #0 -_02001C5C: - mov r0, r8, lsl #1 - bic r8, r0, #1 - cmp r1, #0 - add sb, sb, #1 - orrne r8, r8, #1 - cmp sb, #0x40 - blt _02001BF4 - mov r0, r8 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - arm_func_end sub_02001BB4 - - arm_func_start IntToFixedPoint64 -IntToFixedPoint64: ; 0x02001C80 - mov r2, #0x10000 - rsb r2, r2, #0 - and r3, r1, r2 - mov r3, r3, lsr #0x10 - str r3, [r0] - mov r3, r1, lsl #0x10 - str r3, [r0, #4] - tst r1, #0x8000 - ldrne r1, [r0] - orrne r1, r1, r2 - strne r1, [r0] - bx lr - arm_func_end IntToFixedPoint64 - - arm_func_start FixedPoint64ToInt -FixedPoint64ToInt: ; 0x02001CB0 - ldmia r0, {r1, r2} - mov r0, #0x10000 - rsb r0, r0, #0 - mov r1, r1, lsl #0x10 - and r0, r2, r0 - orr r0, r1, r0, lsr #16 - tst r2, #0x8000 - addne r0, r0, #1 - bx lr - arm_func_end FixedPoint64ToInt - - arm_func_start FixedPoint32To64 -FixedPoint32To64: ; 0x02001CD4 - mov r2, r1, asr #0x18 - mov r3, r1, lsl #8 - tst r2, #0x80 - mvnne r1, #0x7f - orrne r1, r2, r1 - stmia r0, {r2, r3} - andeq r1, r2, #0x7f - str r1, [r0] - bx lr - arm_func_end FixedPoint32To64 - - arm_func_start NegateFixedPoint64 -NegateFixedPoint64: ; 0x02001CF8 - ldr r2, [r0] - mvn r1, #0 - eor r2, r2, r1 - str r2, [r0] - ldr r2, [r0, #4] - eor r2, r2, r1 - adds r1, r2, #1 - str r1, [r0, #4] - ldreq r1, [r0] - addeq r1, r1, #1 - streq r1, [r0] - bx lr - arm_func_end NegateFixedPoint64 - - arm_func_start FixedPoint64IsZero -FixedPoint64IsZero: ; 0x02001D28 - ldr r1, [r0] - cmp r1, #0 - movne r0, #0 - bxne lr - ldr r0, [r0, #4] - cmp r0, #0 - moveq r0, #1 - movne r0, #0 - and r0, r0, #0xff - bx lr - arm_func_end FixedPoint64IsZero - - arm_func_start FixedPoint64IsNegative -FixedPoint64IsNegative: ; 0x02001D50 - ldr r0, [r0] - tst r0, #0x80000000 - movne r0, #1 - moveq r0, #0 - and r0, r0, #0xff - bx lr - arm_func_end FixedPoint64IsNegative - - arm_func_start FixedPoint64CmpLt -FixedPoint64CmpLt: ; 0x02001D68 - stmdb sp!, {r3, lr} - mov ip, r1 - ldr r2, [ip] - mov lr, r0 - tst r2, #0x80000000 - movne r1, #2 - ldr r0, [lr] - moveq r1, #0 - tst r0, #0x80000000 - movne r3, #1 - moveq r3, #0 - orr r1, r3, r1 - cmp r1, #3 - addls pc, pc, r1, lsl #2 - b _02001DB4 -_02001DA4: ; jump table - b _02001DB4 ; case 0 - b _02001DC4 ; case 1 - b _02001DCC ; case 2 - b _02001DD4 ; case 3 -_02001DB4: - ldr r1, [lr, #4] - ldr r3, [ip, #4] - bl UFixedPoint64CmpLt - ldmia sp!, {r3, pc} -_02001DC4: - mov r0, #1 - ldmia sp!, {r3, pc} -_02001DCC: - mov r0, #0 - ldmia sp!, {r3, pc} -_02001DD4: - ldr r1, [lr, #4] - ldr r3, [ip, #4] - bl UFixedPoint64CmpLt - cmp r0, #0 - moveq r0, #1 - movne r0, #0 - and r0, r0, #0xff - ldmia sp!, {r3, pc} - arm_func_end FixedPoint64CmpLt - - arm_func_start MultiplyFixedPoint64 -MultiplyFixedPoint64: ; 0x02001DF4 - stmdb sp!, {r4, r5, r6, lr} - sub sp, sp, #0x18 - ldr r3, [r1] - mov r4, r0 - str r3, [sp, #0x10] - ldr r1, [r1, #4] - add r0, sp, #0x10 - str r1, [sp, #0x14] - ldr r1, [r2] - str r1, [sp, #8] - ldr r1, [r2, #4] - str r1, [sp, #0xc] - bl FixedPoint64IsNegative - mov r5, r0 - add r0, sp, #8 - bl FixedPoint64IsNegative - mov r6, r0 - add r0, sp, #0x10 - bl FixedPoint64IsZero - cmp r0, #0 - movne r0, #0 - strne r0, [r4] - strne r0, [r4, #4] - bne _02001EC0 - add r0, sp, #8 - bl FixedPoint64IsZero - cmp r0, #0 - movne r0, #0 - strne r0, [r4] - strne r0, [r4, #4] - bne _02001EC0 - cmp r5, #0 - beq _02001E80 - add r0, sp, #0x10 - bl NegateFixedPoint64 -_02001E80: - cmp r6, #0 - beq _02001E90 - add r0, sp, #8 - bl NegateFixedPoint64 -_02001E90: - add r0, sp, #0 - add r1, sp, #0x10 - add r2, sp, #8 - bl UMultiplyFixedPoint64 - cmp r5, r6 - beq _02001EB0 - add r0, sp, #0 - bl NegateFixedPoint64 -_02001EB0: - ldr r0, [sp] - str r0, [r4] - ldr r0, [sp, #4] - str r0, [r4, #4] -_02001EC0: - add sp, sp, #0x18 - ldmia sp!, {r4, r5, r6, pc} - arm_func_end MultiplyFixedPoint64 - - arm_func_start DivideFixedPoint64 -DivideFixedPoint64: ; 0x02001EC8 - stmdb sp!, {r4, r5, r6, lr} - sub sp, sp, #0x18 - ldr r3, [r1] - mov r4, r0 - str r3, [sp, #0x10] - ldr r1, [r1, #4] - add r0, sp, #0x10 - str r1, [sp, #0x14] - ldr r1, [r2] - str r1, [sp, #8] - ldr r1, [r2, #4] - str r1, [sp, #0xc] - bl FixedPoint64IsNegative - mov r5, r0 - add r0, sp, #8 - bl FixedPoint64IsNegative - mov r6, r0 - add r0, sp, #8 - bl FixedPoint64IsZero - cmp r0, #0 - mvnne r0, #0x80000000 - strne r0, [r4] - subne r0, r0, #0x80000000 - strne r0, [r4, #4] - bne _02001F98 - add r0, sp, #0x10 - bl FixedPoint64IsZero - cmp r0, #0 - movne r0, #0 - strne r0, [r4] - strne r0, [r4, #4] - bne _02001F98 - cmp r5, #0 - beq _02001F58 - add r0, sp, #0x10 - bl NegateFixedPoint64 -_02001F58: - cmp r6, #0 - beq _02001F68 - add r0, sp, #8 - bl NegateFixedPoint64 -_02001F68: - add r0, sp, #0 - add r1, sp, #0x10 - add r2, sp, #8 - bl UDivideFixedPoint64 - cmp r5, r6 - beq _02001F88 - add r0, sp, #0 - bl NegateFixedPoint64 -_02001F88: - ldr r0, [sp] - str r0, [r4] - ldr r0, [sp, #4] - str r0, [r4, #4] -_02001F98: - add sp, sp, #0x18 - ldmia sp!, {r4, r5, r6, pc} - arm_func_end DivideFixedPoint64 - - arm_func_start UMultiplyFixedPoint64 -UMultiplyFixedPoint64: ; 0x02001FA0 - stmdb sp!, {r4, r5, r6, lr} - mov r6, r1 - mov r4, r0 - mov r0, r6 - mov r5, r2 - bl FixedPoint64IsZero - cmp r0, #0 - movne r0, #0 - strne r0, [r4] - strne r0, [r4, #4] - ldmneia sp!, {r4, r5, r6, pc} - mov r0, r5 - bl FixedPoint64IsZero - cmp r0, #0 - movne r0, #0 - strne r0, [r4] - strne r0, [r4, #4] - ldmneia sp!, {r4, r5, r6, pc} - mov lr, #0 - ldmia r6, {r1, r2} - ldmia r5, {r3, ip} - mov r5, lr - mov r6, lr -_02001FFC: - mov r0, r5 - tst ip, #1 - beq _02002018 - add r5, r5, r2 - add lr, lr, r1 - cmp r0, r5 - addhi lr, lr, #1 -_02002018: - mov r0, r3, lsr #1 - tst r3, #1 - mov ip, ip, lsr #1 - bic r3, r0, #0x80000000 - orrne ip, ip, #0x80000000 - mov r1, r1, lsl #1 - tst r2, #0x80000000 - mov r0, r2, lsl #1 - add r6, r6, #1 - orrne r1, r1, #1 - cmp r6, #0x40 - bic r2, r0, #1 - blt _02001FFC - mov r0, r5, lsr #0x10 - mov r0, r0, lsl #0x10 - tst r5, #0x8000 - mov r1, lr, lsl #0x10 - movne r2, #1 - orr r5, r1, r0, lsr #16 - mov r0, lr, lsr #0x10 - moveq r2, #0 - mov r0, r0, lsl #0x10 - tst r2, #0xff - addne r5, r5, #1 - mov r0, r0, lsr #0x10 - stmia r4, {r0, r5} - ldmia sp!, {r4, r5, r6, pc} - arm_func_end UMultiplyFixedPoint64 - - arm_func_start UDivideFixedPoint64 -UDivideFixedPoint64: ; 0x02002084 - stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} - sub sp, sp, #8 - mov r4, r2 - mov sl, r0 - mov r0, r4 - mov r5, r1 - bl FixedPoint64IsZero - cmp r0, #0 - mvnne r0, #0x80000000 - strne r0, [sl] - subne r0, r0, #0x80000000 - strne r0, [sl, #4] - bne _020021C0 - mov r0, r5 - bl FixedPoint64IsZero - cmp r0, #0 - movne r0, #0 - strne r0, [sl] - strne r0, [sl, #4] - bne _020021C0 - ldr r2, [r5, #4] - mov r0, #0x10000 - mov r1, r2, lsr #0x10 - mov r8, #0 - ldr r3, [r5] - rsb r0, r0, #0 - and r2, r0, r2, lsl #16 - and r3, r0, r3, lsl #16 - ldr r0, [r4] - mov r1, r1, lsl #0x10 - ldr fp, [r4, #4] - str r0, [sp, #4] - mov sb, r8 - mov r4, r8 - mov r5, r8 - str r8, [sp] - orr r6, r3, r1, lsr #16 - orr r7, r2, #0x8000 -_0200211C: - mov r0, r5, lsl #1 - tst r5, #0x80000000 - mov r4, r4, lsl #1 - orrne r4, r4, #1 - bic r5, r0, #1 - tst r6, #0x80000000 - orrne r5, r5, #1 - mov r1, r7, lsl #1 - tst r7, #0x80000000 - mov r6, r6, lsl #1 - bic r7, r1, #1 - ldr r2, [sp, #4] - mov r0, r4 - mov r1, r5 - mov r3, fp - orrne r6, r6, #1 - bl UFixedPoint64CmpLt - cmp r0, #0 - bne _02002188 - mov r0, r5 - sub r5, r5, fp - cmp r0, r5 - ldr r0, [sp, #4] - mov r1, #1 - sub r4, r4, r0 - sublo r4, r4, #1 - b _0200218C -_02002188: - mov r1, #0 -_0200218C: - mov r0, sb, lsl #1 - tst sb, #0x80000000 - bic sb, r0, #1 - ldr r0, [sp] - mov r8, r8, lsl #1 - add r0, r0, #1 - orrne r8, r8, #1 - cmp r1, #0 - orrne sb, sb, #1 - str r0, [sp] - cmp r0, #0x40 - blt _0200211C - stmia sl, {r8, sb} -_020021C0: - add sp, sp, #8 - ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} - arm_func_end UDivideFixedPoint64 - - arm_func_start AddFixedPoint64 -AddFixedPoint64: ; 0x020021C8 - stmdb sp!, {r3, lr} - ldr ip, [r1, #4] - ldr lr, [r1] - ldr r1, [r2] - ldr r3, [r2, #4] - add r1, lr, r1 - add r2, ip, r3 - cmp r2, ip - addlo r1, r1, #1 - stmia r0, {r1, r2} - ldmia sp!, {r3, pc} - arm_func_end AddFixedPoint64 - - arm_func_start ClampedLn -ClampedLn: ; 0x020021F4 - cmp r1, #1 - movlt r1, #1 - cmp r1, #0x800 - ldrge r1, _02002220 ; =0x000007FF - ldr r2, _02002224 ; =NATURAL_LOG_VALUE_TABLE - mov r1, r1, lsl #1 - ldrsh r2, [r2, r1] - mov r1, #0 - mov r2, r2, lsl #4 - stmia r0, {r1, r2} - bx lr - .align 2, 0 -_02002220: .word 0x000007FF -_02002224: .word NATURAL_LOG_VALUE_TABLE - arm_func_end ClampedLn - - arm_func_start sub_02002228 -sub_02002228: ; 0x02002228 - bx lr - arm_func_end sub_02002228 - - arm_func_start GetRngSeed -GetRngSeed: ; 0x0200222C - ldr r0, _02002238 ; =PRNG_SEQUENCE_NUM - ldrh r0, [r0] - bx lr - .align 2, 0 -_02002238: .word PRNG_SEQUENCE_NUM - arm_func_end GetRngSeed - - arm_func_start SetRngSeed -SetRngSeed: ; 0x0200223C - ldr r1, _02002248 ; =PRNG_SEQUENCE_NUM - strh r0, [r1] - bx lr - .align 2, 0 -_02002248: .word PRNG_SEQUENCE_NUM - arm_func_end SetRngSeed diff --git a/asm/main_02001AB0.s b/asm/main_02001AB0.s new file mode 100644 index 00000000..17e3eeb4 --- /dev/null +++ b/asm/main_02001AB0.s @@ -0,0 +1,594 @@ + .include "asm/macros.inc" + .include "main_02001AB0.inc" + + .text + + arm_func_start sub_02001AB0 +sub_02001AB0: ; 0x02001AB0 + stmdb sp!, {r3, r4, r5, lr} + tst r0, #0x80000000 + movne r2, #1 + moveq r2, #0 + tst r1, #0x80000000 + and r4, r2, #0xff + movne r2, #1 + moveq r2, #0 + cmp r1, #0 + and r5, r2, #0xff + mvneq r0, #0x80000000 + ldmeqia sp!, {r3, r4, r5, pc} + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + cmp r4, #0 + rsbne r0, r0, #0 + cmp r5, #0 + rsbne r1, r1, #0 + bl sub_02001BB4 + cmp r4, r5 + rsbne r0, r0, #0 + ldmia sp!, {r3, r4, r5, pc} + arm_func_end sub_02001AB0 + + arm_func_start UMultiplyByFixedPoint +UMultiplyByFixedPoint: ; 0x02001B0C + stmdb sp!, {r3, r4, r5, lr} + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + cmp r1, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, pc} + mov r3, #0 + mov r2, r3 + mov ip, r3 + mov lr, r3 + mov r4, r3 +_02001B3C: + mov r5, lr + tst r1, #1 + beq _02001B58 + add lr, lr, r0 + add ip, ip, r3 + cmp r5, lr + addhi ip, ip, #1 +_02001B58: + mov r1, r1, lsr #1 + tst r2, #1 + orrne r1, r1, #0x80000000 + mov r2, r2, lsr #1 + tst r0, #0x80000000 + mov r3, r3, lsl #1 + mov r0, r0, lsl #1 + add r4, r4, #1 + orrne r3, r3, #1 + bic r2, r2, #0x80000000 + cmp r4, #0x40 + bic r0, r0, #1 + blt _02001B3C + mov r0, lr, lsr #8 + tst lr, #0x80 + movne r1, #1 + bic r0, r0, #0xff000000 + moveq r1, #0 + orr lr, r0, ip, lsl #24 + tst r1, #0xff + addne lr, lr, #1 + mov r0, lr + ldmia sp!, {r3, r4, r5, pc} + arm_func_end UMultiplyByFixedPoint + + arm_func_start sub_02001BB4 +sub_02001BB4: ; 0x02001BB4 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + movs sl, r1 + mvneq r0, #0x80000000 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + cmp r0, #0 + moveq r0, #0 + ldmeqia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + mov r8, #0 + mov r1, r0, asr #0x18 + mov r0, r0, lsl #8 + mov r4, r8 + mov r5, r8 + mov sb, r8 + and r6, r1, #0xff + bic r7, r0, #0xff + mov fp, r8 +_02001BF4: + mov r0, r5, lsl #1 + tst r5, #0x80000000 + mov r4, r4, lsl #1 + orrne r4, r4, #1 + bic r5, r0, #1 + tst r6, #0x80000000 + orrne r5, r5, #1 + mov r3, r7, lsl #1 + tst r7, #0x80000000 + mov r6, r6, lsl #1 + bic r7, r3, #1 + mov r0, r4 + mov r1, r5 + mov r2, fp + mov r3, sl + orrne r6, r6, #1 + bl UFixedPoint64CmpLt + cmp r0, #0 + bne _02001C58 + mov r0, r5 + sub r5, r5, sl + cmp r0, r5 + mov r1, #1 + sublo r4, r4, #1 + b _02001C5C +_02001C58: + mov r1, #0 +_02001C5C: + mov r0, r8, lsl #1 + bic r8, r0, #1 + cmp r1, #0 + add sb, sb, #1 + orrne r8, r8, #1 + cmp sb, #0x40 + blt _02001BF4 + mov r0, r8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end sub_02001BB4 + + arm_func_start IntToFixedPoint64 +IntToFixedPoint64: ; 0x02001C80 + mov r2, #0x10000 + rsb r2, r2, #0 + and r3, r1, r2 + mov r3, r3, lsr #0x10 + str r3, [r0] + mov r3, r1, lsl #0x10 + str r3, [r0, #4] + tst r1, #0x8000 + ldrne r1, [r0] + orrne r1, r1, r2 + strne r1, [r0] + bx lr + arm_func_end IntToFixedPoint64 + + arm_func_start FixedPoint64ToInt +FixedPoint64ToInt: ; 0x02001CB0 + ldmia r0, {r1, r2} + mov r0, #0x10000 + rsb r0, r0, #0 + mov r1, r1, lsl #0x10 + and r0, r2, r0 + orr r0, r1, r0, lsr #16 + tst r2, #0x8000 + addne r0, r0, #1 + bx lr + arm_func_end FixedPoint64ToInt + + arm_func_start FixedPoint32To64 +FixedPoint32To64: ; 0x02001CD4 + mov r2, r1, asr #0x18 + mov r3, r1, lsl #8 + tst r2, #0x80 + mvnne r1, #0x7f + orrne r1, r2, r1 + stmia r0, {r2, r3} + andeq r1, r2, #0x7f + str r1, [r0] + bx lr + arm_func_end FixedPoint32To64 + + arm_func_start NegateFixedPoint64 +NegateFixedPoint64: ; 0x02001CF8 + ldr r2, [r0] + mvn r1, #0 + eor r2, r2, r1 + str r2, [r0] + ldr r2, [r0, #4] + eor r2, r2, r1 + adds r1, r2, #1 + str r1, [r0, #4] + ldreq r1, [r0] + addeq r1, r1, #1 + streq r1, [r0] + bx lr + arm_func_end NegateFixedPoint64 + + arm_func_start FixedPoint64IsZero +FixedPoint64IsZero: ; 0x02001D28 + ldr r1, [r0] + cmp r1, #0 + movne r0, #0 + bxne lr + ldr r0, [r0, #4] + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + and r0, r0, #0xff + bx lr + arm_func_end FixedPoint64IsZero + + arm_func_start FixedPoint64IsNegative +FixedPoint64IsNegative: ; 0x02001D50 + ldr r0, [r0] + tst r0, #0x80000000 + movne r0, #1 + moveq r0, #0 + and r0, r0, #0xff + bx lr + arm_func_end FixedPoint64IsNegative + + arm_func_start FixedPoint64CmpLt +FixedPoint64CmpLt: ; 0x02001D68 + stmdb sp!, {r3, lr} + mov ip, r1 + ldr r2, [ip] + mov lr, r0 + tst r2, #0x80000000 + movne r1, #2 + ldr r0, [lr] + moveq r1, #0 + tst r0, #0x80000000 + movne r3, #1 + moveq r3, #0 + orr r1, r3, r1 + cmp r1, #3 + addls pc, pc, r1, lsl #2 + b _02001DB4 +_02001DA4: ; jump table + b _02001DB4 ; case 0 + b _02001DC4 ; case 1 + b _02001DCC ; case 2 + b _02001DD4 ; case 3 +_02001DB4: + ldr r1, [lr, #4] + ldr r3, [ip, #4] + bl UFixedPoint64CmpLt + ldmia sp!, {r3, pc} +_02001DC4: + mov r0, #1 + ldmia sp!, {r3, pc} +_02001DCC: + mov r0, #0 + ldmia sp!, {r3, pc} +_02001DD4: + ldr r1, [lr, #4] + ldr r3, [ip, #4] + bl UFixedPoint64CmpLt + cmp r0, #0 + moveq r0, #1 + movne r0, #0 + and r0, r0, #0xff + ldmia sp!, {r3, pc} + arm_func_end FixedPoint64CmpLt + + arm_func_start MultiplyFixedPoint64 +MultiplyFixedPoint64: ; 0x02001DF4 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x18 + ldr r3, [r1] + mov r4, r0 + str r3, [sp, #0x10] + ldr r1, [r1, #4] + add r0, sp, #0x10 + str r1, [sp, #0x14] + ldr r1, [r2] + str r1, [sp, #8] + ldr r1, [r2, #4] + str r1, [sp, #0xc] + bl FixedPoint64IsNegative + mov r5, r0 + add r0, sp, #8 + bl FixedPoint64IsNegative + mov r6, r0 + add r0, sp, #0x10 + bl FixedPoint64IsZero + cmp r0, #0 + movne r0, #0 + strne r0, [r4] + strne r0, [r4, #4] + bne _02001EC0 + add r0, sp, #8 + bl FixedPoint64IsZero + cmp r0, #0 + movne r0, #0 + strne r0, [r4] + strne r0, [r4, #4] + bne _02001EC0 + cmp r5, #0 + beq _02001E80 + add r0, sp, #0x10 + bl NegateFixedPoint64 +_02001E80: + cmp r6, #0 + beq _02001E90 + add r0, sp, #8 + bl NegateFixedPoint64 +_02001E90: + add r0, sp, #0 + add r1, sp, #0x10 + add r2, sp, #8 + bl UMultiplyFixedPoint64 + cmp r5, r6 + beq _02001EB0 + add r0, sp, #0 + bl NegateFixedPoint64 +_02001EB0: + ldr r0, [sp] + str r0, [r4] + ldr r0, [sp, #4] + str r0, [r4, #4] +_02001EC0: + add sp, sp, #0x18 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end MultiplyFixedPoint64 + + arm_func_start DivideFixedPoint64 +DivideFixedPoint64: ; 0x02001EC8 + stmdb sp!, {r4, r5, r6, lr} + sub sp, sp, #0x18 + ldr r3, [r1] + mov r4, r0 + str r3, [sp, #0x10] + ldr r1, [r1, #4] + add r0, sp, #0x10 + str r1, [sp, #0x14] + ldr r1, [r2] + str r1, [sp, #8] + ldr r1, [r2, #4] + str r1, [sp, #0xc] + bl FixedPoint64IsNegative + mov r5, r0 + add r0, sp, #8 + bl FixedPoint64IsNegative + mov r6, r0 + add r0, sp, #8 + bl FixedPoint64IsZero + cmp r0, #0 + mvnne r0, #0x80000000 + strne r0, [r4] + subne r0, r0, #0x80000000 + strne r0, [r4, #4] + bne _02001F98 + add r0, sp, #0x10 + bl FixedPoint64IsZero + cmp r0, #0 + movne r0, #0 + strne r0, [r4] + strne r0, [r4, #4] + bne _02001F98 + cmp r5, #0 + beq _02001F58 + add r0, sp, #0x10 + bl NegateFixedPoint64 +_02001F58: + cmp r6, #0 + beq _02001F68 + add r0, sp, #8 + bl NegateFixedPoint64 +_02001F68: + add r0, sp, #0 + add r1, sp, #0x10 + add r2, sp, #8 + bl UDivideFixedPoint64 + cmp r5, r6 + beq _02001F88 + add r0, sp, #0 + bl NegateFixedPoint64 +_02001F88: + ldr r0, [sp] + str r0, [r4] + ldr r0, [sp, #4] + str r0, [r4, #4] +_02001F98: + add sp, sp, #0x18 + ldmia sp!, {r4, r5, r6, pc} + arm_func_end DivideFixedPoint64 + + arm_func_start UMultiplyFixedPoint64 +UMultiplyFixedPoint64: ; 0x02001FA0 + stmdb sp!, {r4, r5, r6, lr} + mov r6, r1 + mov r4, r0 + mov r0, r6 + mov r5, r2 + bl FixedPoint64IsZero + cmp r0, #0 + movne r0, #0 + strne r0, [r4] + strne r0, [r4, #4] + ldmneia sp!, {r4, r5, r6, pc} + mov r0, r5 + bl FixedPoint64IsZero + cmp r0, #0 + movne r0, #0 + strne r0, [r4] + strne r0, [r4, #4] + ldmneia sp!, {r4, r5, r6, pc} + mov lr, #0 + ldmia r6, {r1, r2} + ldmia r5, {r3, ip} + mov r5, lr + mov r6, lr +_02001FFC: + mov r0, r5 + tst ip, #1 + beq _02002018 + add r5, r5, r2 + add lr, lr, r1 + cmp r0, r5 + addhi lr, lr, #1 +_02002018: + mov r0, r3, lsr #1 + tst r3, #1 + mov ip, ip, lsr #1 + bic r3, r0, #0x80000000 + orrne ip, ip, #0x80000000 + mov r1, r1, lsl #1 + tst r2, #0x80000000 + mov r0, r2, lsl #1 + add r6, r6, #1 + orrne r1, r1, #1 + cmp r6, #0x40 + bic r2, r0, #1 + blt _02001FFC + mov r0, r5, lsr #0x10 + mov r0, r0, lsl #0x10 + tst r5, #0x8000 + mov r1, lr, lsl #0x10 + movne r2, #1 + orr r5, r1, r0, lsr #16 + mov r0, lr, lsr #0x10 + moveq r2, #0 + mov r0, r0, lsl #0x10 + tst r2, #0xff + addne r5, r5, #1 + mov r0, r0, lsr #0x10 + stmia r4, {r0, r5} + ldmia sp!, {r4, r5, r6, pc} + arm_func_end UMultiplyFixedPoint64 + + arm_func_start UDivideFixedPoint64 +UDivideFixedPoint64: ; 0x02002084 + stmdb sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, lr} + sub sp, sp, #8 + mov r4, r2 + mov sl, r0 + mov r0, r4 + mov r5, r1 + bl FixedPoint64IsZero + cmp r0, #0 + mvnne r0, #0x80000000 + strne r0, [sl] + subne r0, r0, #0x80000000 + strne r0, [sl, #4] + bne _020021C0 + mov r0, r5 + bl FixedPoint64IsZero + cmp r0, #0 + movne r0, #0 + strne r0, [sl] + strne r0, [sl, #4] + bne _020021C0 + ldr r2, [r5, #4] + mov r0, #0x10000 + mov r1, r2, lsr #0x10 + mov r8, #0 + ldr r3, [r5] + rsb r0, r0, #0 + and r2, r0, r2, lsl #16 + and r3, r0, r3, lsl #16 + ldr r0, [r4] + mov r1, r1, lsl #0x10 + ldr fp, [r4, #4] + str r0, [sp, #4] + mov sb, r8 + mov r4, r8 + mov r5, r8 + str r8, [sp] + orr r6, r3, r1, lsr #16 + orr r7, r2, #0x8000 +_0200211C: + mov r0, r5, lsl #1 + tst r5, #0x80000000 + mov r4, r4, lsl #1 + orrne r4, r4, #1 + bic r5, r0, #1 + tst r6, #0x80000000 + orrne r5, r5, #1 + mov r1, r7, lsl #1 + tst r7, #0x80000000 + mov r6, r6, lsl #1 + bic r7, r1, #1 + ldr r2, [sp, #4] + mov r0, r4 + mov r1, r5 + mov r3, fp + orrne r6, r6, #1 + bl UFixedPoint64CmpLt + cmp r0, #0 + bne _02002188 + mov r0, r5 + sub r5, r5, fp + cmp r0, r5 + ldr r0, [sp, #4] + mov r1, #1 + sub r4, r4, r0 + sublo r4, r4, #1 + b _0200218C +_02002188: + mov r1, #0 +_0200218C: + mov r0, sb, lsl #1 + tst sb, #0x80000000 + bic sb, r0, #1 + ldr r0, [sp] + mov r8, r8, lsl #1 + add r0, r0, #1 + orrne r8, r8, #1 + cmp r1, #0 + orrne sb, sb, #1 + str r0, [sp] + cmp r0, #0x40 + blt _0200211C + stmia sl, {r8, sb} +_020021C0: + add sp, sp, #8 + ldmia sp!, {r3, r4, r5, r6, r7, r8, sb, sl, fp, pc} + arm_func_end UDivideFixedPoint64 + + arm_func_start AddFixedPoint64 +AddFixedPoint64: ; 0x020021C8 + stmdb sp!, {r3, lr} + ldr ip, [r1, #4] + ldr lr, [r1] + ldr r1, [r2] + ldr r3, [r2, #4] + add r1, lr, r1 + add r2, ip, r3 + cmp r2, ip + addlo r1, r1, #1 + stmia r0, {r1, r2} + ldmia sp!, {r3, pc} + arm_func_end AddFixedPoint64 + + arm_func_start ClampedLn +ClampedLn: ; 0x020021F4 + cmp r1, #1 + movlt r1, #1 + cmp r1, #0x800 + ldrge r1, _02002220 ; =0x000007FF + ldr r2, _02002224 ; =NATURAL_LOG_VALUE_TABLE + mov r1, r1, lsl #1 + ldrsh r2, [r2, r1] + mov r1, #0 + mov r2, r2, lsl #4 + stmia r0, {r1, r2} + bx lr + .align 2, 0 +_02002220: .word 0x000007FF +_02002224: .word NATURAL_LOG_VALUE_TABLE + arm_func_end ClampedLn + + arm_func_start sub_02002228 +sub_02002228: ; 0x02002228 + bx lr + arm_func_end sub_02002228 + + arm_func_start GetRngSeed +GetRngSeed: ; 0x0200222C + ldr r0, _02002238 ; =PRNG_SEQUENCE_NUM + ldrh r0, [r0] + bx lr + .align 2, 0 +_02002238: .word PRNG_SEQUENCE_NUM + arm_func_end GetRngSeed + + arm_func_start SetRngSeed +SetRngSeed: ; 0x0200223C + ldr r1, _02002248 ; =PRNG_SEQUENCE_NUM + strh r0, [r1] + bx lr + .align 2, 0 +_02002248: .word PRNG_SEQUENCE_NUM + arm_func_end SetRngSeed diff --git a/include/main_02001A54.h b/include/main_02001A54.h new file mode 100644 index 00000000..af2881b4 --- /dev/null +++ b/include/main_02001A54.h @@ -0,0 +1,8 @@ +#ifndef PMDSKY_MAIN_02001A54_H +#define PMDSKY_MAIN_02001A54_H + +#include "util.h" + +s32 MultiplyByFixedPoint(s32 x, s32 y); + +#endif //PMDSKY_MAIN_02001A54_H diff --git a/main.lsf b/main.lsf index a60c43ac..3c17a76e 100644 --- a/main.lsf +++ b/main.lsf @@ -18,6 +18,8 @@ Static main Object asm/main_020018A4.o Object src/main_020018D0.o Object asm/main_02001A30.o + Object src/main_02001A54.o + Object asm/main_02001AB0.o Object src/main_0200224C.o Object asm/main_020022C4.o Object src/main_0200330C.o diff --git a/src/main_02001A54.c b/src/main_02001A54.c new file mode 100644 index 00000000..5a103714 --- /dev/null +++ b/src/main_02001A54.c @@ -0,0 +1,42 @@ +#include "main_02001A54.h" + +extern s32 UMultiplyByFixedPoint(s32, s32); + +s32 MultiplyByFixedPoint(s32 x, s32 y) +{ + s32 result; + bool8 xNeg; + bool8 yNeg; + + // Same as checking if x < 0 and y < 0 + if (x & 0x80000000) { + xNeg = TRUE; + } else { + xNeg = FALSE; + } + if (y & 0x80000000) { + yNeg = TRUE; + } else { + yNeg = FALSE; + } + + if (x == 0) { + return 0; + } + if (y == 0) { + return 0; + } + + if (xNeg) { + x = -x; + } + if (yNeg) { + y = -y; + } + + result = UMultiplyByFixedPoint(x, y); + if (xNeg != yNeg) { + result = -result; + } + return result; +}