diff options
Diffstat (limited to 'arm9/asm/GX_g3_util.s')
-rw-r--r-- | arm9/asm/GX_g3_util.s | 503 |
1 files changed, 503 insertions, 0 deletions
diff --git a/arm9/asm/GX_g3_util.s b/arm9/asm/GX_g3_util.s new file mode 100644 index 00000000..ba78fdfc --- /dev/null +++ b/arm9/asm/GX_g3_util.s @@ -0,0 +1,503 @@ + .include "asm/macros.inc" + .include "global.inc" + + .text + + arm_func_start G3_RotZ +G3_RotZ: ; 0x020C7FF0 + ldr r3, _020C8028 ; =0x04000468 + mov r2, #0x0 + str r1, [r3, #0x0] + str r0, [r3, #0x0] + str r2, [r3, #0x0] + rsb r0, r0, #0x0 + str r0, [r3, #0x0] + str r1, [r3, #0x0] + str r2, [r3, #0x0] + str r2, [r3, #0x0] + str r2, [r3, #0x0] + mov r0, #0x1000 + str r0, [r3, #0x0] + bx lr + .balign 4 +_020C8028: .word 0x04000468 + + arm_func_start G3_RotY +G3_RotY: ; 0x020C802C + ldr ip, _020C8064 ; =0x04000468 + mov r3, #0x0 + str r1, [r12, #0x0] + str r3, [r12, #0x0] + rsb r2, r0, #0x0 + str r2, [r12, #0x0] + str r3, [r12, #0x0] + mov r2, #0x1000 + str r2, [r12, #0x0] + str r3, [r12, #0x0] + str r0, [r12, #0x0] + str r3, [r12, #0x0] + str r1, [r12, #0x0] + bx lr + .balign 4 +_020C8064: .word 0x04000468 + + arm_func_start G3_RotX +G3_RotX: ; 0x020C8068 + ldr r3, _020C80A0 ; =0x04000468 + mov r2, #0x1000 + str r2, [r3, #0x0] + mov r2, #0x0 + str r2, [r3, #0x0] + str r2, [r3, #0x0] + str r2, [r3, #0x0] + str r1, [r3, #0x0] + str r0, [r3, #0x0] + str r2, [r3, #0x0] + rsb r0, r0, #0x0 + str r0, [r3, #0x0] + str r1, [r3, #0x0] + bx lr + .balign 4 +_020C80A0: .word 0x04000468 + + arm_func_start G3i_LookAt_ +G3i_LookAt_: ; 0x020C80A4 + stmdb sp!, {r4-r9,lr} + sub sp, sp, #0x24 + mov r9, r0 + ldr r6, [r9, #0x0] + ldr r5, [r2, #0x0] + add r0, sp, #0x0 + sub r5, r6, r5 + str r5, [sp, #0x0] + ldr r7, [r9, #0x4] + ldr r6, [r2, #0x4] + mov r5, r1 + sub r1, r7, r6 + str r1, [sp, #0x4] + ldr r6, [r9, #0x8] + ldr r2, [r2, #0x8] + mov r1, r0 + sub r2, r6, r2 + mov r8, r3 + str r2, [sp, #0x8] + ldr r7, [sp, #0x40] + bl VEC_Normalize + add r1, sp, #0x0 + add r2, sp, #0xc + mov r0, r5 + bl VEC_CrossProduct + add r0, sp, #0xc + mov r1, r0 + bl VEC_Normalize +_020C8114: ; 0x020C8114 + add r0, sp, #0x0 + add r1, sp, #0xc + add r2, sp, #0x18 + bl VEC_CrossProduct +_020C8124: ; 0x020C8124 + cmp r8, #0x0 + beq _020C8184 + ldr r0, _020C8234 ; =0x04000440 + mov r1, #0x2 + str r1, [r0, #0x0] + ldr r0, [sp, #0xc] + ldr r4, _020C8238 ; =0x0400045C + str r0, [r4, #0x0] + ldr r0, [sp, #0x18] + str r0, [r4, #0x0] + ldr r0, [sp, #0x0] + str r0, [r4, #0x0] + ldr r0, [sp, #0x10] + str r0, [r4, #0x0] + ldr r0, [sp, #0x1c] + str r0, [r4, #0x0] + ldr r0, [sp, #0x4] + str r0, [r4, #0x0] + ldr r0, [sp, #0x14] + str r0, [r4, #0x0] + ldr r0, [sp, #0x20] + str r0, [r4, #0x0] + ldr r0, [sp, #0x8] + str r0, [r4, #0x0] +_020C8184: + add r1, sp, #0xc + mov r0, r9 + bl VEC_DotProduct + rsb r6, r0, #0x0 + add r1, sp, #0x18 + mov r0, r9 + bl VEC_DotProduct + rsb r5, r0, #0x0 + add r1, sp, #0x0 + mov r0, r9 + bl VEC_DotProduct +_020C81B0: ; 0x020C81B0 + cmp r8, #0x0 + strne r6, [r4, #0x0] + rsb r0, r0, #0x0 + strne r5, [r4, #0x0] + strne r0, [r4, #0x0] + cmp r7, #0x0 + addeq sp, sp, #0x24 + ldmeqia sp!, {r4-r9,lr} + bxeq lr + ldr r1, [sp, #0xc] + str r1, [r7, #0x0] + ldr r1, [sp, #0x18] + str r1, [r7, #0x4] + ldr r1, [sp, #0x0] + str r1, [r7, #0x8] + ldr r1, [sp, #0x10] + str r1, [r7, #0xc] + ldr r1, [sp, #0x1c] + str r1, [r7, #0x10] + ldr r1, [sp, #0x4] + str r1, [r7, #0x14] + ldr r1, [sp, #0x14] + str r1, [r7, #0x18] + ldr r1, [sp, #0x20] + str r1, [r7, #0x1c] + ldr r1, [sp, #0x8] + str r1, [r7, #0x20] + str r6, [r7, #0x24] + str r5, [r7, #0x28] + str r0, [r7, #0x2c] + add sp, sp, #0x24 + ldmia sp!, {r4-r9,lr} + bx lr + .balign 4 +_020C8234: .word 0x04000440 +_020C8238: .word 0x0400045C + + arm_func_start G3i_OrthoW_ +G3i_OrthoW_: ; 0x020C823C + stmdb sp!, {r4-r11,lr} + sub sp, sp, #0x34 + str r2, [sp, #0x8] + str r0, [sp, #0x0] + ldr r0, [sp, #0x8] + mov r2, r3 + ldr r7, [sp, #0x64] + sub r0, r2, r0 + str r3, [sp, #0xc] + str r1, [sp, #0x4] + ldr r8, [sp, #0x60] + ldr r6, [sp, #0x68] + bl FX_InvAsync +_020C8270: ; 0x020C8270 + cmp r7, #0x0 + ldrne r0, _020C8528 ; =0x04000440 + movne r1, #0x0 + ldrne r4, _020C852C ; =0x04000458 + strne r1, [r0, #0x0] + cmp r6, #0x0 + beq _020C82B8 + mov r0, #0x0 + str r0, [r6, #0x4] + str r0, [r6, #0x8] + str r0, [r6, #0xc] + str r0, [r6, #0x10] + str r0, [r6, #0x18] + str r0, [r6, #0x1c] + str r0, [r6, #0x20] + str r0, [r6, #0x24] + str r0, [r6, #0x2c] + str r8, [r6, #0x3c] +_020C82B8: + bl FX_GetDivResultFx64c + mov r5, r0 + str r1, [sp, #0x14] + ldr sb, _020C8530 ; =0x04000290 + mov r3, #0x0 + ldr r1, [sp, #0x0] + ldr r0, [sp, #0x4] + str r3, [r9, #0x0] + mov r2, #0x1000 + sub r1, r1, r0 + ldr r0, _020C8534 ; =0x04000298 + str r2, [r9, #0x4] + str r1, [r0, #0x0] + cmp r8, #0x1000 + str r3, [r0, #0x4] + beq _020C8318 + mov r9, r8, asr #0x1f + umull r0, r1, r5, r8 + mla r1, r5, r9, r1 + ldr r5, [sp, #0x14] + mla r1, r5, r8, r1 + bl _ll_sdiv + mov r5, r0 + str r1, [sp, #0x14] +_020C8318: + ldr r0, [sp, #0x14] + mov r2, r5, lsl #0xd + mov r1, r0, lsl #0xd + mov r0, #0x80000000 + adds r0, r2, r0 + orr r1, r1, r5, lsr #0x13 + adc r1, r1, #0x0 + cmp r7, #0x0 + mov r0, #0x0 + strne r1, [r4, #0x0] + strne r0, [r4, #0x0] + strne r0, [r4, #0x0] + strne r0, [r4, #0x0] + strne r0, [r4, #0x0] + cmp r6, #0x0 + strne r1, [r6, #0x0] + bl FX_GetDivResultFx64c + mov r11, r0 + str r1, [sp, #0x2c] + ldr r0, _020C8530 ; =0x04000290 + mov r3, #0x0 + mov r2, #0x1000 + str r3, [r0, #0x0] + str r2, [r0, #0x4] + ldr r9, [sp, #0x58] + ldr r1, [sp, #0x5c] + ldr r0, _020C8534 ; =0x04000298 + sub r1, r9, r1 + str r1, [r0, #0x0] + cmp r8, #0x1000 + str r3, [r0, #0x4] + beq _020C83B8 + mov r9, r8, asr #0x1f + umull r0, r1, r11, r8 + mla r1, r11, r9, r1 + ldr r9, [sp, #0x2c] + mla r1, r9, r8, r1 + bl _ll_sdiv + mov r11, r0 + str r1, [sp, #0x2c] +_020C83B8: + ldr r0, [sp, #0x2c] + mov r3, r11, lsl #0xd + mov r2, r0, lsl #0xd + mov r0, #0x80000000 + orr r2, r2, r11, lsr #0x13 + adds r0, r3, r0 + adc r0, r2, #0x0 + cmp r7, #0x0 + mov r1, #0x0 + strne r0, [r4, #0x0] + strne r1, [r4, #0x0] + strne r1, [r4, #0x0] + strne r1, [r4, #0x0] + strne r1, [r4, #0x0] + cmp r6, #0x0 + strne r0, [r6, #0x14] + bl FX_GetDivResultFx64c + cmp r8, #0x1000 + beq _020C8428 + mov r9, r8, asr #0x1f + mov r2, #0x1000 + mov r3, #0x0 + umull r12, r10, r0, r8 + mla r10, r0, r9, r10 + mov r0, r12 + mla r10, r1, r8, r10 + mov r1, r10 + bl _ll_sdiv +_020C8428: + mov r9, r1, lsl #0xd + mov r10, r0, lsl #0xd + mov r2, #0x80000000 + orr r9, r9, r0, lsr #0x13 + adds r2, r10, r2 + adc r2, r9, #0x0 + cmp r7, #0x0 + mov r3, #0x0 + strne r2, [r4, #0x0] + strne r3, [r4, #0x0] + cmp r6, #0x0 + strne r2, [r6, #0x28] + ldr r3, [sp, #0xc] + ldr r2, [sp, #0x8] + add r9, r3, r2 + rsb lr, r9, #0x0 + ldr r3, [sp, #0x0] + ldr r2, [sp, #0x4] + ldr r9, [sp, #0x5c] + add r2, r3, r2 + ldr r3, [sp, #0x58] + rsb r12, r2, #0x0 + add r3, r9, r3 + mov r9, r12, asr #0x1f + str r9, [sp, #0x20] + mov r9, r3, asr #0x1f + str r9, [sp, #0x24] + umull r10, r9, r5, lr + mov r2, lr, asr #0x1f + str r2, [sp, #0x1c] + str r10, [sp, #0x18] + ldr r10, [sp, #0x1c] + mov r2, #0x80000000 + mla r9, r5, r10, r9 + ldr r5, [sp, #0x14] + mla r9, r5, lr, r9 + ldr r5, [sp, #0x18] + adds r5, r5, r2 + adc r10, r9, #0x0 + ldr r5, [sp, #0x20] + umull lr, r9, r11, r12 + mla r9, r11, r5, r9 + ldr r5, [sp, #0x2c] + mla r9, r5, r12, r9 + adds r5, lr, r2 + adc r5, r9, #0x0 + umull r11, r9, r0, r3 + adds r2, r11, r2 + ldr r2, [sp, #0x24] + mla r9, r0, r2, r9 + mla r9, r1, r3, r9 + adc r0, r9, #0x0 + cmp r7, #0x0 + strne r10, [r4, #0x0] + strne r5, [r4, #0x0] + strne r0, [r4, #0x0] + strne r8, [r4, #0x0] + cmp r6, #0x0 + strne r10, [r6, #0x30] + strne r5, [r6, #0x34] + strne r0, [r6, #0x38] + add sp, sp, #0x34 + ldmia sp!, {r4-r11,lr} + bx lr + .balign 4 +_020C8528: .word 0x04000440 +_020C852C: .word 0x04000458 +_020C8530: .word 0x04000290 +_020C8534: .word 0x04000298 + + arm_func_start G3i_PerspectiveW_ +G3i_PerspectiveW_: ; 0x020C8538 + stmdb sp!, {r4-r10,lr} + mov r5, r0 + mov r0, r1 + mov r1, r5 + ldr r6, [sp, #0x24] + mov r9, r2 + mov r8, r3 + ldr r5, [sp, #0x2c] + bl FX_Div + mov r7, r0 + cmp r6, #0x1000 + mulne r1, r7, r6 + movne r0, r1, asr #0xb + addne r0, r1, r0, lsr #0x14 + movne r7, r0, asr #0xc + ldr r0, [sp, #0x28] + ldr r2, _020C8718 ; =0x04000290 + cmp r0, #0x0 + mov r3, #0x0 + str r3, [r2, #0x0] + ldr r1, _020C871C ; =0x04000298 + str r7, [r2, #0x4] + str r9, [r1, #0x0] + ldrne r0, _020C8720 ; =0x04000440 + str r3, [r1, #0x4] + ldrne r4, _020C8724 ; =0x04000458 + strne r3, [r0, #0x0] + cmp r5, #0x0 + beq _020C85E4 + mov r1, #0x0 + str r1, [r5, #0x4] + str r1, [r5, #0x8] + str r1, [r5, #0xc] + str r1, [r5, #0x10] + str r1, [r5, #0x18] + str r1, [r5, #0x1c] + str r1, [r5, #0x20] + str r1, [r5, #0x24] + rsb r0, r6, #0x0 + str r0, [r5, #0x2c] + str r1, [r5, #0x30] + str r1, [r5, #0x34] + str r1, [r5, #0x3c] +_020C85E4: + bl FX_GetDivResult + ldr r3, [sp, #0x20] + ldr r1, [sp, #0x28] + ldr sb, _020C8718 ; =0x04000290 + mov r12, #0x0 + str r12, [r9, #0x0] + mov r10, #0x1000 + ldr r2, _020C871C ; =0x04000298 + str r10, [r9, #0x4] + sub r3, r8, r3 + str r3, [r2, #0x0] + str r12, [r2, #0x4] + cmp r1, #0x0 + beq _020C8644 + str r0, [r4, #0x0] + str r12, [r4, #0x0] + str r12, [r4, #0x0] + str r12, [r4, #0x0] + str r12, [r4, #0x0] + str r7, [r4, #0x0] + str r12, [r4, #0x0] + str r12, [r4, #0x0] + str r12, [r4, #0x0] + str r12, [r4, #0x0] +_020C8644: + cmp r5, #0x0 + strne r0, [r5, #0x0] + strne r7, [r5, #0x14] + bl FX_GetDivResultFx64c + cmp r6, #0x1000 + beq _020C8680 + mov r2, r6, asr #0x1f + umull r7, r3, r0, r6 + mla r3, r0, r2, r3 + mla r3, r1, r6, r3 + mov r0, r7 + mov r1, r3 + mov r2, #0x1000 + mov r3, #0x0 + bl _ll_sdiv +_020C8680: + ldr r3, [sp, #0x20] + mov r10, r8, lsl #0x1 + add r12, r3, r8 + mov r2, r12, asr #0x1f + umull r7, lr, r0, r12 + mla lr, r0, r2, lr + mov r9, #0x80000000 + smull r3, r2, r10, r3 + mla lr, r1, r12, lr + adds r7, r7, r9 + mov r8, #0x800 + adc r7, lr, #0x0 + adds r3, r3, r8 + adc r2, r2, #0x0 + mov r3, r3, lsr #0xc + orr r3, r3, r2, lsl #0x14 + umull r10, r8, r0, r3 + mov r2, r3, asr #0x1f + adds r9, r10, r9 + mla r8, r0, r2, r8 + mla r8, r1, r3, r8 + ldr r0, [sp, #0x28] + adc r2, r8, #0x0 + cmp r0, #0x0 + mov r0, #0x0 + beq _020C8704 + str r7, [r4, #0x0] + rsb r1, r6, #0x0 + str r1, [r4, #0x0] + str r0, [r4, #0x0] + str r0, [r4, #0x0] + str r2, [r4, #0x0] + str r0, [r4, #0x0] +_020C8704: + cmp r5, #0x0 + strne r7, [r5, #0x28] + strne r2, [r5, #0x38] + ldmia sp!, {r4-r10,lr} + bx lr + .balign 4 +_020C8718: .word 0x04000290 +_020C871C: .word 0x04000298 +_020C8720: .word 0x04000440 +_020C8724: .word 0x04000458 |