summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm9/asm/FX_mtx44.s362
-rw-r--r--arm9/lib/src/FX_cp.c34
-rw-r--r--arm9/lib/src/FX_mtx44.c172
-rw-r--r--include/fx.h50
4 files changed, 236 insertions, 382 deletions
diff --git a/arm9/asm/FX_mtx44.s b/arm9/asm/FX_mtx44.s
deleted file mode 100644
index 0b042dee..00000000
--- a/arm9/asm/FX_mtx44.s
+++ /dev/null
@@ -1,362 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .text
-
- arm_func_start MTX_Identity44_
-MTX_Identity44_: ; 0x020C49C4
- mov r2, #0x1000
- mov r3, #0x0
- stmia r0!, {r2-r3}
- mov r1, #0x0
- stmia r0!, {r1,r3}
- stmia r0!, {r1-r3}
- stmia r0!, {r1,r3}
- stmia r0!, {r1-r3}
- stmia r0!, {r1,r3}
- stmia r0!, {r1-r2}
- bx lr
-
- arm_func_start MTX_Copy44To43_
-MTX_Copy44To43_:
- ldmia r0!, {r2-r3,r12}
- add r0, r0, #0x4
- stmia r1!, {r2-r3,r12}
- ldmia r0!, {r2-r3,r12}
- add r0, r0, #0x4
- stmia r1!, {r2-r3,r12}
- ldmia r0!, {r2-r3,r12}
- add r0, r0, #0x4
- stmia r1!, {r2-r3,r12}
- ldmia r0!, {r2-r3,r12}
- add r0, r0, #0x4
- stmia r1!, {r2-r3,r12}
- bx lr
-
- thumb_func_start MTX_RotX44_
-MTX_RotX44_: ; 0x020C4A24
- str r2, [r0, #0x14]
- str r2, [r0, #0x28]
- str r1, [r0, #0x18]
- neg r1, r1
- str r1, [r0, #0x24]
- mov r1, #0x1
- mov r2, #0x0
- lsl r1, r1, #0xc
- mov r3, #0x0
- stmia r0!, {r1-r3}
- stmia r0!, {r2-r3}
- add r0, #0x8
- stmia r0!, {r2-r3}
- add r0, #0x8
- stmia r0!, {r2-r3}
- stmia r0!, {r2-r3}
- str r1, [r0, #0x0]
- bx lr
-
- thumb_func_start MTX_RotY44_
-MTX_RotY44_: ; 0x020C4A48
- str r2, [r0, #0x0]
- str r2, [r0, #0x28]
- str r1, [r0, #0x20]
- neg r1, r1
- str r1, [r0, #0x8]
- mov r3, #0x1
- mov r1, #0x0
- lsl r3, r3, #0xc
- mov r2, #0x0
- str r2, [r0, #0x4]
- add r0, #0xc
- stmia r0!, {r1-r3}
- stmia r0!, {r1-r2}
- str r2, [r0, #0x4]
- add r0, #0xc
- stmia r0!, {r1-r2}
- stmia r0!, {r1-r3}
- bx lr
-
- thumb_func_start MTX_RotZ44_
-MTX_RotZ44_: ; 0x020C4A6C
- str r2, [r0, #0x0]
- str r2, [r0, #0x14]
- str r1, [r0, #0x4]
- neg r1, r1
- str r1, [r0, #0x10]
- mov r3, #0x1
- mov r1, #0x0
- lsl r3, r3, #0xc
- mov r2, #0x0
- add r0, #0x8
- stmia r0!, {r1-r2}
- add r0, #0x8
- stmia r0!, {r1-r2}
- stmia r0!, {r1-r3}
- stmia r0!, {r1-r2}
- stmia r0!, {r1-r3}
- bx lr
- .balign 4
-
- arm_func_start MTX_Concat44
-MTX_Concat44: ; 0x020C4A90
- stmdb sp!, {r4-r11,lr}
- sub sp, sp, #0x44
- ldr r5, [r0, #0x4]
- ldr r3, [r1, #0x10]
- mov r12, r2
- smull r6, r4, r5, r3
- ldr r9, [r0, #0x0]
- ldr r3, [r1, #0x0]
- cmp r12, r1
- smlal r6, r4, r9, r3
- ldr r10, [r0, #0x8]
- ldr r3, [r1, #0x20]
- ldr r8, [r0, #0xc]
- smlal r6, r4, r10, r3
- ldr r3, [r1, #0x30]
- addeq r2, sp, #0x0
- smlal r6, r4, r8, r3
- mov r3, r6, lsr #0xc
- orr r3, r3, r4, lsl #0x14
- str r3, [r2, #0x0]
- ldr r3, [r1, #0x14]
- ldr r4, [r1, #0x4]
- smull r7, r6, r5, r3
- smlal r7, r6, r9, r4
- ldr r3, [r1, #0x24]
- ldr r4, [r1, #0x34]
- smlal r7, r6, r10, r3
- smlal r7, r6, r8, r4
- mov r3, r7, lsr #0xc
- orr r3, r3, r6, lsl #0x14
- str r3, [r2, #0x4]
- ldr r3, [r1, #0x1c]
- ldr r4, [r1, #0xc]
- smull r7, r6, r5, r3
- smlal r7, r6, r9, r4
- ldr r3, [r1, #0x2c]
- ldr r4, [r1, #0x3c]
- smlal r7, r6, r10, r3
- smlal r7, r6, r8, r4
- mov r3, r7, lsr #0xc
- orr r3, r3, r6, lsl #0x14
- str r3, [r2, #0xc]
- ldr r6, [r1, #0x18]
- ldr r7, [r1, #0x8]
- smull r4, r3, r5, r6
- smlal r4, r3, r9, r7
- ldr r9, [r1, #0x28]
- ldr r5, [r1, #0x38]
- smlal r4, r3, r10, r9
- smlal r4, r3, r8, r5
- mov r4, r4, lsr #0xc
- orr r4, r4, r3, lsl #0x14
- str r4, [r2, #0x8]
- ldr r8, [r0, #0x14]
- ldr r10, [r0, #0x10]
- smull r4, r3, r8, r6
- smlal r4, r3, r10, r7
- ldr r7, [r0, #0x18]
- ldr r6, [r0, #0x1c]
- smlal r4, r3, r7, r9
- smlal r4, r3, r6, r5
- mov r4, r4, lsr #0xc
- orr r4, r4, r3, lsl #0x14
- str r4, [r2, #0x18]
- ldr r3, [r1, #0x14]
- ldr r4, [r1, #0x4]
- smull r11, r3, r8, r3
- smlal r11, r3, r10, r4
- ldr r5, [r1, #0x24]
- ldr r9, [r1, #0x34]
- smlal r11, r3, r7, r5
- smlal r11, r3, r6, r9
- mov r4, r11, lsr #0xc
- orr r4, r4, r3, lsl #0x14
- str r4, [r2, #0x14]
- ldr r3, [r1, #0x1c]
- ldr r4, [r1, #0xc]
- smull r11, r3, r8, r3
- smlal r11, r3, r10, r4
- ldr r5, [r1, #0x2c]
- ldr r9, [r1, #0x3c]
- smlal r11, r3, r7, r5
- smlal r11, r3, r6, r9
- mov r4, r11, lsr #0xc
- orr r4, r4, r3, lsl #0x14
- str r4, [r2, #0x1c]
- ldr r9, [r1, #0x10]
- ldr r11, [r1, #0x0]
- smull r4, r3, r8, r9
- smlal r4, r3, r10, r11
- ldr r5, [r1, #0x20]
- ldr r8, [r1, #0x30]
- smlal r4, r3, r7, r5
- smlal r4, r3, r6, r8
- mov r4, r4, lsr #0xc
- orr r4, r4, r3, lsl #0x14
- str r4, [r2, #0x10]
- ldr r6, [r0, #0x24]
- ldr r7, [r0, #0x20]
- smull r4, r3, r6, r9
- smlal r4, r3, r7, r11
- ldr r10, [r0, #0x28]
- add lr, sp, #0x0
- smlal r4, r3, r10, r5
- ldr r5, [r0, #0x2c]
- cmp r2, lr
- smlal r4, r3, r5, r8
- mov r4, r4, lsr #0xc
- orr r4, r4, r3, lsl #0x14
- str r4, [r2, #0x20]
- ldr r3, [r1, #0x14]
- ldr r4, [r1, #0x4]
- smull r11, r3, r6, r3
- smlal r11, r3, r7, r4
- ldr r8, [r1, #0x24]
- ldr r9, [r1, #0x34]
- smlal r11, r3, r10, r8
- smlal r11, r3, r5, r9
- mov r4, r11, lsr #0xc
- orr r4, r4, r3, lsl #0x14
- str r4, [r2, #0x24]
- ldr r3, [r1, #0x1c]
- ldr r4, [r1, #0xc]
- smull r11, r3, r6, r3
- smlal r11, r3, r7, r4
- ldr r8, [r1, #0x2c]
- ldr r9, [r1, #0x3c]
- smlal r11, r3, r10, r8
- smlal r11, r3, r5, r9
- mov r4, r11, lsr #0xc
- orr r4, r4, r3, lsl #0x14
- str r4, [r2, #0x2c]
- ldr r9, [r1, #0x18]
- ldr r8, [r1, #0x8]
- smull r4, r3, r6, r9
- smlal r4, r3, r7, r8
- ldr r7, [r1, #0x28]
- ldr r6, [r1, #0x38]
- smlal r4, r3, r10, r7
- smlal r4, r3, r5, r6
- mov r4, r4, lsr #0xc
- orr r4, r4, r3, lsl #0x14
- str r4, [r2, #0x28]
- ldr r5, [r0, #0x34]
- ldr r4, [r0, #0x30]
- smull r10, r9, r5, r9
- ldr r3, [r0, #0x38]
- smlal r10, r9, r4, r8
- smlal r10, r9, r3, r7
- ldr r0, [r0, #0x3c]
- addne sp, sp, #0x44
- smlal r10, r9, r0, r6
- mov r6, r10, lsr #0xc
- orr r6, r6, r9, lsl #0x14
- str r6, [r2, #0x38]
- ldr r6, [r1, #0x14]
- ldr r7, [r1, #0x4]
- smull r10, r6, r5, r6
- smlal r10, r6, r4, r7
- ldr r8, [r1, #0x24]
- ldr r9, [r1, #0x34]
- smlal r10, r6, r3, r8
- smlal r10, r6, r0, r9
- mov r7, r10, lsr #0xc
- orr r7, r7, r6, lsl #0x14
- str r7, [r2, #0x34]
- ldr r6, [r1, #0x10]
- ldr r7, [r1, #0x0]
- smull r10, r6, r5, r6
- smlal r10, r6, r4, r7
- ldr r8, [r1, #0x20]
- ldr r9, [r1, #0x30]
- smlal r10, r6, r3, r8
- smlal r10, r6, r0, r9
- mov r7, r10, lsr #0xc
- orr r7, r7, r6, lsl #0x14
- str r7, [r2, #0x30]
- ldr r8, [r1, #0x3c]
- ldr r7, [r1, #0x2c]
- ldr r6, [r1, #0xc]
- ldr r1, [r1, #0x1c]
- smull r9, r1, r5, r1
- smlal r9, r1, r4, r6
- smlal r9, r1, r3, r7
- smlal r9, r1, r0, r8
- mov r0, r9, lsr #0xc
- orr r0, r0, r1, lsl #0x14
- str r0, [r2, #0x3c]
- ldmneia sp!, {r4-r11,lr}
- bxne lr
- ldmia lr!, {r0-r3}
- stmia r12!, {r0-r3}
- ldmia lr!, {r0-r3}
- stmia r12!, {r0-r3}
- ldmia lr!, {r0-r3}
- stmia r12!, {r0-r3}
- ldmia lr, {r0-r3}
- stmia r12, {r0-r3}
- add sp, sp, #0x44
- ldmia sp!, {r4-r11,lr}
- bx lr
-
- arm_func_start MTX_TransApply44
-MTX_TransApply44: ; 0x020C4DB4
- stmdb sp!, {r4-r7,lr}
- sub sp, sp, #0x4
- mov r7, r0
- mov r6, r1
- mov r5, r2
- mov r4, r3
- cmp r7, r6
- beq _020C4DD8
- bl MI_Copy48B
-_020C4DD8:
- ldr r0, [r7, #0x10]
- ldr r1, [r7, #0x0]
- smull r3, r2, r4, r0
- smlal r3, r2, r5, r1
- ldr r0, [sp, #0x18]
- ldr r1, [r7, #0x20]
- ldr r12, [r7, #0x30]
- smlal r3, r2, r0, r1
- mov r1, r3, lsr #0xc
- orr r1, r1, r2, lsl #0x14
- add r1, r12, r1
- str r1, [r6, #0x30]
- ldr r1, [r7, #0x14]
- ldr r2, [r7, #0x4]
- smull r12, r3, r4, r1
- smlal r12, r3, r5, r2
- ldr r1, [r7, #0x24]
- ldr r2, [r7, #0x34]
- smlal r12, r3, r0, r1
- mov r1, r12, lsr #0xc
- orr r1, r1, r3, lsl #0x14
- add r1, r2, r1
- str r1, [r6, #0x34]
- ldr r1, [r7, #0x18]
- ldr r2, [r7, #0x8]
- smull r12, r3, r4, r1
- smlal r12, r3, r5, r2
- ldr r1, [r7, #0x28]
- ldr r2, [r7, #0x38]
- smlal r12, r3, r0, r1
- mov r1, r12, lsr #0xc
- orr r1, r1, r3, lsl #0x14
- add r1, r2, r1
- str r1, [r6, #0x38]
- ldr r1, [r7, #0x1c]
- ldr r2, [r7, #0xc]
- smull r12, r3, r4, r1
- smlal r12, r3, r5, r2
- ldr r1, [r7, #0x2c]
- ldr r2, [r7, #0x3c]
- smlal r12, r3, r0, r1
- mov r0, r12, lsr #0xc
- orr r0, r0, r3, lsl #0x14
- add r0, r2, r0
- str r0, [r6, #0x3c]
- add sp, sp, #0x4
- ldmia sp!, {r4-r7,lr}
- bx lr
diff --git a/arm9/lib/src/FX_cp.c b/arm9/lib/src/FX_cp.c
index a8da0a8f..a2d8307b 100644
--- a/arm9/lib/src/FX_cp.c
+++ b/arm9/lib/src/FX_cp.c
@@ -1,11 +1,7 @@
#include "global.h"
#include "main.h"
#include "fx.h"
-
-s32 FX_GetDivResult();
-s32 FX_GetSqrtResult();
-void FX_DivAsync(s32 numerator, s32 denominator);
-void FX_InvAsync(s32 x);
+
s32 FX_Div(s32 numerator, s32 denominator){
FX_DivAsync(numerator, denominator);
@@ -57,18 +53,18 @@ void FX_DivAsync(s32 numerator, s32 denominator){
SETREG64(HW_REG_DIV_DENOM, (u32)denominator);
}
- s32 FX_DivS32(s32 numerator, s32 denominator){
- SETREG16(HW_REG_DIVCNT, 0x0);
- SETREG32(HW_REG_DIV_NUMER, (u32)numerator); //32bit write for some reason
- SETREG64(HW_REG_DIV_DENOM, (u32)denominator);
- while (READREG16(HW_REG_DIVCNT) & 0x8000);
- return READREG32(HW_REG_DIV_RESULT);
- }
+s32 FX_DivS32(s32 numerator, s32 denominator){
+ SETREG16(HW_REG_DIVCNT, 0x0);
+ SETREG32(HW_REG_DIV_NUMER, (u32)numerator); //32bit write for some reason
+ SETREG64(HW_REG_DIV_DENOM, (u32)denominator);
+ while (READREG16(HW_REG_DIVCNT) & 0x8000);
+ return READREG32(HW_REG_DIV_RESULT);
+}
- s32 FX_ModS32(s32 num, s32 mod){
- SETREG16(HW_REG_DIVCNT, 0x0);
- SETREG32(HW_REG_DIV_NUMER, (u32)num); //32bit write for some reason
- SETREG64(HW_REG_DIV_DENOM, (u32)mod);
- while (READREG16(HW_REG_DIVCNT) & 0x8000);
- return READREG32(HW_REG_DIVREM_RESULT);
- }
+s32 FX_ModS32(s32 num, s32 mod){
+ SETREG16(HW_REG_DIVCNT, 0x0);
+ SETREG32(HW_REG_DIV_NUMER, (u32)num); //32bit write for some reason
+ SETREG64(HW_REG_DIV_DENOM, (u32)mod);
+ while (READREG16(HW_REG_DIVCNT) & 0x8000);
+ return READREG32(HW_REG_DIVREM_RESULT);
+}
diff --git a/arm9/lib/src/FX_mtx44.c b/arm9/lib/src/FX_mtx44.c
new file mode 100644
index 00000000..3c91b4df
--- /dev/null
+++ b/arm9/lib/src/FX_mtx44.c
@@ -0,0 +1,172 @@
+#include "global.h"
+#include "main.h"
+#include "fx.h"
+
+void MI_Copy48B(void *src, void *dst);
+
+
+void MTX_TransApply44(struct Mtx44 *mtx, struct Mtx44 *dst, s32 x, s32 y, s32 z){
+ if(mtx != dst)
+ MI_Copy48B(mtx, dst);
+ dst->_[12] = mtx->_[12] + (s32)(((s64)x * mtx->_[0] + (s64)y * mtx->_[4] + (s64)z * mtx->_[8] ) >> FX32_INT_SHIFT);
+ dst->_[13] = mtx->_[13] + (s32)(((s64)x * mtx->_[1] + (s64)y * mtx->_[5] + (s64)z * mtx->_[9] ) >> FX32_INT_SHIFT);
+ dst->_[14] = mtx->_[14] + (s32)(((s64)x * mtx->_[2] + (s64)y * mtx->_[6] + (s64)z * mtx->_[10]) >> FX32_INT_SHIFT);
+ dst->_[15] = mtx->_[15] + (s32)(((s64)x * mtx->_[3] + (s64)y * mtx->_[7] + (s64)z * mtx->_[11]) >> FX32_INT_SHIFT);
+}
+
+void MTX_Concat44(struct Mtx44 *a, struct Mtx44 *b, struct Mtx44 *c){
+ struct Mtx44 temp;
+ struct Mtx44 *dst;
+ s32 a0, a1, a2, a3;
+ s32 b0, b1, b2, b3;
+
+ if (c == b)
+ dst = &temp;
+ else
+ dst = c;
+
+ a0 = a->_[0];
+ a1 = a->_[1];
+ a2 = a->_[2];
+ a3 = a->_[3];
+ dst->_[0] = (((s64)a0 * b->_[0] + (s64)a1 * b->_[4] + (s64)a2 * b->_[8] + (s64)a3 * b->_[12]) >> FX32_INT_SHIFT);
+ dst->_[1] = (((s64)a0 * b->_[1] + (s64)a1 * b->_[5] + (s64)a2 * b->_[9] + (s64)a3 * b->_[13]) >> FX32_INT_SHIFT);
+ dst->_[3] = (((s64)a0 * b->_[3] + (s64)a1 * b->_[7] + (s64)a2 * b->_[11] + (s64)a3 * b->_[15]) >> FX32_INT_SHIFT);
+ b0 = b->_[2];
+ b1 = b->_[6];
+ b2 = b->_[10];
+ b3 = b->_[14];
+ dst->_[2] = (((s64)a0 * b0 + (s64)a1 * b1 + (s64)a2 * b2 + (s64)a3 * b3) >> FX32_INT_SHIFT);
+ a0 = a->_[4];
+ a1 = a->_[5];
+ a2 = a->_[6];
+ a3 = a->_[7];
+ dst->_[6] = (((s64)a0 * b0 + (s64)a1 * b1 + (s64)a2 * b2 + (s64)a3 * b3) >> FX32_INT_SHIFT);
+ dst->_[5] = (((s64)a0 * b->_[1] + (s64)a1 * b->_[5] + (s64)a2 * b->_[9] + (s64)a3 * b->_[13]) >> FX32_INT_SHIFT);
+ dst->_[7] = (((s64)a0 * b->_[3] + (s64)a1 * b->_[7] + (s64)a2 * b->_[11] + (s64)a3 * b->_[15]) >> FX32_INT_SHIFT);
+ b0 = b->_[0];
+ b1 = b->_[4];
+ b2 = b->_[8];
+ b3 = b->_[12];
+ dst->_[4] = (((s64)a0 * b0 + (s64)a1 * b1 + (s64)a2 * b2 + (s64)a3 * b3) >> FX32_INT_SHIFT);
+ a0 = a->_[8];
+ a1 = a->_[9];
+ a2 = a->_[10];
+ a3 = a->_[11];
+ dst->_[8] = (((s64)a0 * b0 + (s64)a1 * b1 + (s64)a2 * b2 + (s64)a3 * b3) >> FX32_INT_SHIFT);
+ dst->_[9] = (((s64)a0 * b->_[1] + (s64)a1 * b->_[5] + (s64)a2 * b->_[9] + (s64)a3 * b->_[13]) >> FX32_INT_SHIFT);
+ dst->_[11] = (((s64)a0 * b->_[3] + (s64)a1 * b->_[7] + (s64)a2 * b->_[11] + (s64)a3 * b->_[15]) >> FX32_INT_SHIFT);
+ b0 = b->_[2];
+ b1 = b->_[6];
+ b2 = b->_[10];
+ b3 = b->_[14];
+ dst->_[10] = (((s64)a0 * b0 + (s64)a1 * b1 + (s64)a2 * b2 + (s64)a3 * b3) >> FX32_INT_SHIFT);
+ a0 = a->_[12];
+ a1 = a->_[13];
+ a2 = a->_[14];
+ a3 = a->_[15];
+ dst->_[14] = (((s64)a0 * b0 + (s64)a1 * b1 + (s64)a2 * b2 + (s64)a3 * b3) >> FX32_INT_SHIFT);
+ dst->_[13] = (((s64)a0 * b->_[1] + (s64)a1 * b->_[5] + (s64)a2 * b->_[9] + (s64)a3 * b->_[13]) >> FX32_INT_SHIFT);
+ dst->_[12] = (((s64)a0 * b->_[0] + (s64)a1 * b->_[4] + (s64)a2 * b->_[8] + (s64)a3 * b->_[12]) >> FX32_INT_SHIFT);
+ dst->_[15] = (((s64)a0 * b->_[3] + (s64)a1 * b->_[7] + (s64)a2 * b->_[11] + (s64)a3 * b->_[15]) >> FX32_INT_SHIFT);
+ if (dst == &temp)
+ *c = temp;
+}
+
+asm void MTX_Identity44_(struct Mtx44 *dst){
+ mov r2, #0x1000
+ mov r3, #0x0
+ stmia r0!, {r2-r3}
+ mov r1, #0x0
+ stmia r0!, {r1,r3}
+ stmia r0!, {r1-r3}
+ stmia r0!, {r1,r3}
+ stmia r0!, {r1-r3}
+ stmia r0!, {r1,r3}
+ stmia r0!, {r1-r2}
+ bx lr
+}
+
+asm void MTX_Copy44To43_(struct Mtx44 *src, struct Mtx43 *dst){
+ ldmia r0!, {r2-r3,r12}
+ add r0, r0, #0x4
+ stmia r1!, {r2-r3,r12}
+ ldmia r0!, {r2-r3,r12}
+ add r0, r0, #0x4
+ stmia r1!, {r2-r3,r12}
+ ldmia r0!, {r2-r3,r12}
+ add r0, r0, #0x4
+ stmia r1!, {r2-r3,r12}
+ ldmia r0!, {r2-r3,r12}
+ add r0, r0, #0x4
+ stmia r1!, {r2-r3,r12}
+ bx lr
+}
+
+#pragma thumb on
+asm void MTX_RotX44_(struct Mtx44 *mtx, s32 sinphi, s32 cosphi){
+ str r2, [r0, #0x14]
+ str r2, [r0, #0x28]
+ str r1, [r0, #0x18]
+ neg r1, r1
+ str r1, [r0, #0x24]
+ mov r1, #0x1
+ mov r2, #0x0
+ lsl r1, r1, #0xc
+ mov r3, #0x0
+ stmia r0!, {r1-r3}
+ stmia r0!, {r2-r3}
+ add r0, #0x8
+ stmia r0!, {r2-r3}
+ add r0, #0x8
+ stmia r0!, {r2-r3}
+ stmia r0!, {r2-r3}
+ str r1, [r0, #0x0]
+ bx lr
+}
+#pragma thumb off
+
+#pragma thumb on
+asm void MTX_RotY44_(struct Mtx44 *mtx, s32 sinphi, s32 cosphi){
+ str r2, [r0, #0x0]
+ str r2, [r0, #0x28]
+ str r1, [r0, #0x20]
+ neg r1, r1
+ str r1, [r0, #0x8]
+ mov r3, #0x1
+ mov r1, #0x0
+ lsl r3, r3, #0xc
+ mov r2, #0x0
+ str r2, [r0, #0x4]
+ add r0, #0xc
+ stmia r0!, {r1-r3}
+ stmia r0!, {r1-r2}
+ str r2, [r0, #0x4]
+ add r0, #0xc
+ stmia r0!, {r1-r2}
+ stmia r0!, {r1-r3}
+ bx lr
+}
+#pragma thumb off
+
+#pragma thumb on
+asm void MTX_RotZ44_(struct Mtx44 *mtx, s32 sinphi, s32 cosphi){
+ str r2, [r0, #0x0]
+ str r2, [r0, #0x14]
+ str r1, [r0, #0x4]
+ neg r1, r1
+ str r1, [r0, #0x10]
+ mov r3, #0x1
+ mov r1, #0x0
+ lsl r3, r3, #0xc
+ mov r2, #0x0
+ add r0, #0x8
+ stmia r0!, {r1-r2}
+ add r0, #0x8
+ stmia r0!, {r1-r2}
+ stmia r0!, {r1-r3}
+ stmia r0!, {r1-r2}
+ stmia r0!, {r1-r3}
+ bx lr
+}
+#pragma thumb off
diff --git a/include/fx.h b/include/fx.h
index 22ef3d3a..1e9eb291 100644
--- a/include/fx.h
+++ b/include/fx.h
@@ -1,6 +1,11 @@
#ifndef GUARD_FX_H
#define GUARD_FX_H
+#define FX16_INT_MASK 0xF000
+#define FX16_INT_ABS_MASK 0x7000
+#define FX16_FRAC_MASK 0x0FFF
+#define FX16_INT_SHIFT 0xC
+
#define FX32_INT_MASK 0xFFFFF000
#define FX32_INT_ABS_MASK 0x7FFFF000
#define FX32_FRAC_MASK 0x00000FFF
@@ -20,6 +25,10 @@
#define FX_INT_ABS(TYPE, x) (((x) & TYPE ## _INT_ABS_MASK) >> TYPE ## _INT_SHIFT)
#define FX_FRAC(TYPE, x) ((x) & TYPE ## _FRAC_MASK)
+#define FX16_INT(x) FX_INT(FX16, x)
+#define FX16_INT_ABS(x) FX_INT_ABS(FX16, x)
+#define FX16_FRAC(x) FX_FRAC(FX16, x)
+
#define FX32_INT(x) FX_INT(FX32, x)
#define FX32_INT_ABS(x) FX_INT_ABS(FX32, x)
#define FX32_FRAC(x) FX_FRAC(FX32, x)
@@ -33,7 +42,6 @@
#define FX64C_FRAC(x) FX_FRAC(FX64C, x)
-
#define HW_REG_DIVCNT 0x04000280
#define HW_REG_DIV_NUMER 0x04000290
#define HW_REG_DIV_DENOM 0x04000298
@@ -65,6 +73,26 @@ struct Vecx16
s16 z;
};
+struct Mtx44
+{
+ s32 _[16];
+};
+
+struct Mtx43
+{
+ s32 _[12];
+};
+
+struct Mtx33
+{
+ s32 _[9];
+};
+
+struct Mtx22
+{
+ s32 _[4];
+};
+
//FX
void FX_Init();
s32 FX_Modf(s32 x, s32 *iptr);
@@ -78,6 +106,13 @@ void VEC_Add(struct Vecx32 *x, struct Vecx32 *y, struct Vecx32 *dst);
void VEC_Subtract(struct Vecx32 *x, struct Vecx32 *y, struct Vecx32 *dst);
void VEC_Fx16Add(struct Vecx16 *x, struct Vecx16 *y, struct Vecx16 *dst);
s32 VEC_DotProduct(struct Vecx32 *x, struct Vecx32 *y);
+s32 VEC_Fx16DotProduct(struct Vecx16 *a, struct Vecx16 *b);
+void VEC_CrossProduct(struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst);
+void VEC_Fx16CrossProduct(struct Vecx16 *a, struct Vecx16 *b, struct Vecx16 *dst);
+s32 VEC_Mag(struct Vecx32 *a);
+void VEC_Normalize(struct Vecx32 *a, struct Vecx32 *dst);
+void VEC_Fx16Normalize(struct Vecx16 *a, struct Vecx16 *dst);
+void VEC_MultAdd(s32 factor, struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst);
//CP
s32 FX_Div(s32 numerator, s32 denominator);
@@ -91,4 +126,17 @@ void FX_DivAsync(s32 numerator, s32 denominator);
s32 FX_DivS32(s32 numerator, s32 denominator);
s32 FX_ModS32(s32 num, s32 mod);
+//Mtx
+//The functions ending in underscores seem to be in assembly originally
+//at least I see no way to recreate the stmia copies and some of them are actually in thumb
+//Mtx44
+void MTX_TransApply44(struct Mtx44 *mtx, struct Mtx44 *dst, s32 x, s32 y, s32 z);
+void MTX_Concat44(struct Mtx44 *a, struct Mtx44 *b, struct Mtx44 *c);
+void MTX_Identity44_(struct Mtx44 *dst);
+void MTX_Copy44To43_(struct Mtx44 *src, struct Mtx43 *dst);
+void MTX_RotX44_(struct Mtx44 *mtx, s32 sinphi, s32 cosphi);
+void MTX_RotY44_(struct Mtx44 *mtx, s32 sinphi, s32 cosphi);
+void MTX_RotZ44_(struct Mtx44 *mtx, s32 sinphi, s32 cosphi);
+
+
#endif //GUARD_FX_H