From 009d3fbcf7e1e3ea94656b5233e0bc96fa7b5a5b Mon Sep 17 00:00:00 2001 From: Made Date: Fri, 1 May 2020 18:59:48 +0200 Subject: decompile FX.s, FX_atan.s and partially decompile FX_ves.s --- arm9/arm9.lcf | 1 + arm9/asm/FX_vec.s | 181 ++++++++++++++++++++++++------------------------ arm9/lib/src/FX.c | 20 ++++++ arm9/lib/src/FX_atan.c | 161 ++++++++++++++++++++++++++++++++++++++++++ arm9/lib/src/FX_vec_c.c | 34 +++++++++ include/fx.h | 41 +++++++++++ 6 files changed, 348 insertions(+), 90 deletions(-) create mode 100644 arm9/lib/src/FX.c create mode 100644 arm9/lib/src/FX_atan.c create mode 100644 arm9/lib/src/FX_vec_c.c create mode 100644 include/fx.h diff --git a/arm9/arm9.lcf b/arm9/arm9.lcf index 42b0a8ee..046ce41d 100644 --- a/arm9/arm9.lcf +++ b/arm9/arm9.lcf @@ -127,6 +127,7 @@ SECTIONS { FX_mtx44.o (.text) FX_cp.o (.text) FX_vec.o (.text) + FX_vec_c.o (.text) FX_atan.o (.text) FX.o (.text) GX.o (.text) diff --git a/arm9/asm/FX_vec.s b/arm9/asm/FX_vec.s index e6270162..08068eaf 100644 --- a/arm9/asm/FX_vec.s +++ b/arm9/asm/FX_vec.s @@ -310,93 +310,94 @@ VEC_CrossProduct: ldmia sp!, {r4-r11,lr} bx lr - arm_func_start VEC_Fx16DotProduct -VEC_Fx16DotProduct: ; 0x020C5538 - stmdb sp!, {r4-r5,lr} - sub sp, sp, #0x4 - ldrsh lr, [r0, #0x2] - ldrsh r12, [r1, #0x2] - ldrsh r3, [r0, #0x4] - ldrsh r2, [r1, #0x4] - ldrsh r5, [r0, #0x0] - ldrsh r4, [r1, #0x0] - smulbb r1, lr, r12 - smulbb r0, r3, r2 - smlabb r1, r5, r4, r1 - add r0, r0, #0x800 - adds r2, r1, r0 - mov r1, r1, asr #0x1f - adc r1, r1, r0, asr #0x1f - mov r0, r2, lsr #0xc - orr r0, r0, r1, lsl #0x14 - add sp, sp, #0x4 - ldmia sp!, {r4-r5,lr} - bx lr - - arm_func_start VEC_DotProduct -VEC_DotProduct: - stmdb sp!, {r4,lr} - ldr r3, [r0, #0x4] - ldr r2, [r1, #0x4] - ldr r12, [r0, #0x0] - smull r4, lr, r3, r2 - ldr r2, [r1, #0x0] - ldr r3, [r0, #0x8] - smlal r4, lr, r12, r2 - ldr r1, [r1, #0x8] - mov r0, #0x800 - smlal r4, lr, r3, r1 - adds r0, r4, r0 - adc r1, lr, #0x0 - mov r0, r0, lsr #0xc - orr r0, r0, r1, lsl #0x14 - ldmia sp!, {r4,lr} - bx lr - - arm_func_start VEC_Fx16Add -VEC_Fx16Add: ; 0x020C55CC - ldrsh r12, [r0, #0x0] - ldrsh r3, [r1, #0x0] - add r3, r12, r3 - strh r3, [r2, #0x0] - ldrsh r12, [r0, #0x2] - ldrsh r3, [r1, #0x2] - add r3, r12, r3 - strh r3, [r2, #0x2] - ldrsh r3, [r0, #0x4] - ldrsh r0, [r1, #0x4] - add r0, r3, r0 - strh r0, [r2, #0x4] - bx lr - - arm_func_start VEC_Subtract -VEC_Subtract: ; 0x020C5600 - ldr r12, [r0, #0x0] - ldr r3, [r1, #0x0] - sub r3, r12, r3 - str r3, [r2, #0x0] - ldr r12, [r0, #0x4] - ldr r3, [r1, #0x4] - sub r3, r12, r3 - str r3, [r2, #0x4] - ldr r3, [r0, #0x8] - ldr r0, [r1, #0x8] - sub r0, r3, r0 - str r0, [r2, #0x8] - bx lr - - arm_func_start VEC_Add -VEC_Add: ; 0x020C5634 - ldr r12, [r0, #0x0] - ldr r3, [r1, #0x0] - add r3, r12, r3 - str r3, [r2, #0x0] - ldr r12, [r0, #0x4] - ldr r3, [r1, #0x4] - add r3, r12, r3 - str r3, [r2, #0x4] - ldr r3, [r0, #0x8] - ldr r0, [r1, #0x8] - add r0, r3, r0 - str r0, [r2, #0x8] - bx lr +; arm_func_start VEC_Fx16DotProduct +;VEC_Fx16DotProduct: ; 0x020C5538 +; stmdb sp!, {r4-r5,lr} +; sub sp, sp, #0x4 +; ldrsh lr, [r0, #0x2] +; ldrsh r12, [r1, #0x2] +; ldrsh r3, [r0, #0x4] +; ldrsh r2, [r1, #0x4] +; ldrsh r5, [r0, #0x0] +; ldrsh r4, [r1, #0x0] +; smulbb r1, lr, r12 +; smulbb r0, r3, r2 +; smlabb r1, r5, r4, r1 +; add r0, r0, #0x800 +; adds r2, r1, r0 +; mov r1, r1, asr #0x1f +; adc r1, r1, r0, asr #0x1f +; mov r0, r2, lsr #0xc +; orr r0, r0, r1, lsl #0x14 +; add sp, sp, #0x4 +; ldmia sp!, {r4-r5,lr} +; bx lr +; +; arm_func_start VEC_DotProduct +;VEC_DotProduct: +; stmdb sp!, {r4,lr} +; ldr r3, [r0, #0x4] +; ldr r2, [r1, #0x4] +; ldr r12, [r0, #0x0] +; smull r4, lr, r3, r2 +; ldr r2, [r1, #0x0] +; ldr r3, [r0, #0x8] +; smlal r4, lr, r12, r2 +; ldr r1, [r1, #0x8] +; mov r0, #0x800 +; smlal r4, lr, r3, r1 +; adds r0, r4, r0 +; adc r1, lr, #0x0 +; mov r0, r0, lsr #0xc +; orr r0, r0, r1, lsl #0x14 +; ldmia sp!, {r4,lr} +; bx lr +; +; arm_func_start VEC_Fx16Add +;VEC_Fx16Add: ; 0x020C55CC +; ldrsh r12, [r0, #0x0] +; ldrsh r3, [r1, #0x0] +; add r3, r12, r3 +; strh r3, [r2, #0x0] +; ldrsh r12, [r0, #0x2] +; ldrsh r3, [r1, #0x2] +; add r3, r12, r3 +; strh r3, [r2, #0x2] +; ldrsh r3, [r0, #0x4] +; ldrsh r0, [r1, #0x4] +; add r0, r3, r0 +; strh r0, [r2, #0x4] +; bx lr +; +; arm_func_start VEC_Subtract +;VEC_Subtract: ; 0x020C5600 +; ldr r12, [r0, #0x0] +; ldr r3, [r1, #0x0] +; sub r3, r12, r3 +; str r3, [r2, #0x0] +; ldr r12, [r0, #0x4] +; ldr r3, [r1, #0x4] +; sub r3, r12, r3 +; str r3, [r2, #0x4] +; ldr r3, [r0, #0x8] +; ldr r0, [r1, #0x8] +; sub r0, r3, r0 +; str r0, [r2, #0x8] +; bx lr +; +; arm_func_start VEC_Add +;VEC_Add: ; 0x020C5634 +; ldr r12, [r0, #0x0] +; ldr r3, [r1, #0x0] +; add r3, r12, r3 +; str r3, [r2, #0x0] +; ldr r12, [r0, #0x4] +; ldr r3, [r1, #0x4] +; add r3, r12, r3 +; str r3, [r2, #0x4] +; ldr r3, [r0, #0x8] +; ldr r0, [r1, #0x8] +; add r0, r3, r0 +; str r0, [r2, #0x8] +; bx lr +; diff --git a/arm9/lib/src/FX.c b/arm9/lib/src/FX.c new file mode 100644 index 00000000..fa6fa6ba --- /dev/null +++ b/arm9/lib/src/FX.c @@ -0,0 +1,20 @@ +#include "global.h" +#include "main.h" +#include "fx.h" + +void FX_Init(){ + return; +} + +s32 FX_Modf(s32 x, s32 *iptr){ + if (x >= 0) + { + *iptr = x & 0x7FFFF000; + return x & 0xFFF; + } + else + { + *iptr = -(-x & 0x7FFFF000); + return -(-x & 0xFFF); + } +} diff --git a/arm9/lib/src/FX_atan.c b/arm9/lib/src/FX_atan.c new file mode 100644 index 00000000..684db81e --- /dev/null +++ b/arm9/lib/src/FX_atan.c @@ -0,0 +1,161 @@ +#include "global.h" +#include "main.h" +#include "fx.h" + +extern s16 FX_AtanTable_[]; + +u16 FX_Atan(s32 x){ + if (x >= 0) + { + if (x > 0x1000) + { + x = FX_Inv(x); + s16 y = FX_AtanTable_[x >> 5]; + return 0x4000 - y; + } + else if (x < 0x1000) + { + return FX_AtanTable_[x >> 5]; + } + else + { + return 0x2000; + } + } + else + { + if (x < -0x1000) + { + x = FX_Inv(-x); + s16 y = FX_AtanTable_[x >> 5]; + return y - 0x4000; + } + else if (x > -0x1000) + { + return -FX_AtanTable_[-x >> 5]; + } + else + { + return -0x2000; + } + } +} + +u16 FX_Atan2(s32 x, s32 y){ + s32 result; + u32 positive, bias, denominator, numerator; + if (x > 0) + { + if (y > 0) + { + if (y > x) + { + numerator = x; + denominator = y; + bias = 0; + positive = TRUE; + } + else if (y < x) + { + numerator = y; + denominator = x; + bias = 0x4000; + positive = FALSE; + } + else + { + return 0x2000; + } + } + else if (y < 0) + { + y = -y; + if (y < x) + { + numerator = y; + denominator = x; + bias = 0x4000; + positive = TRUE; + } + else if (y > x) + { + numerator = x; + denominator = y; + bias = 0x8000; + positive = FALSE; + } + else + { + return 0x6000; + } + } + else + { + return 0x4000; + } + } + else if (x < 0) + { + x = -x; + if (y < 0) + { + y = -y; + if (y > x) + { + numerator = x; + denominator = y; + bias = -0x8000; + positive = TRUE; + } + else if (y < x) + { + numerator = y; + denominator = x; + bias = -0x4000; + positive = FALSE; + } + else + { + return 0xA000; + } + } + else if (y > 0) + { + if (y < x) + { + numerator = y; + denominator = x; + bias = -0x4000; + positive = TRUE; + } + else if (y > x) + { + numerator = x; + denominator = y; + bias = 0x0; + positive = FALSE; + } + else + { + return 0xE000; + } + } + else + { + return 0xC000; + } + } + else + { + if (y >= 0) + return 0x0; + else + return 0x8000; + } + if (denominator == 0x0) + return 0x0; + if (positive) + return bias + FX_AtanTable_[FX_Div(numerator, denominator) >> 5]; + else + return bias - FX_AtanTable_[FX_Div(numerator, denominator) >> 5]; +} diff --git a/arm9/lib/src/FX_vec_c.c b/arm9/lib/src/FX_vec_c.c new file mode 100644 index 00000000..a2e0ffe4 --- /dev/null +++ b/arm9/lib/src/FX_vec_c.c @@ -0,0 +1,34 @@ +#include "global.h" +#include "main.h" +#include "fx.h" + +void VEC_Add(struct Vecx32 *x, struct Vecx32 *y, struct Vecx32 *dst){ + dst->x = x->x + y->x; + dst->y = x->y + y->y; + dst->z = x->z + y->z; +} + +void VEC_Subtract(struct Vecx32 *x, struct Vecx32 *y, struct Vecx32 *dst){ + dst->x = x->x - y->x; + dst->y = x->y - y->y; + dst->z = x->z - y->z; +} + +void VEC_Fx16Add(struct Vecx16 *x, struct Vecx16 *y, struct Vecx16 *dst){ + dst->x = x->x + y->x; + dst->y = x->y + y->y; + dst->z = x->z + y->z; +} + +s32 VEC_DotProduct(struct Vecx32 *x, struct Vecx32 *y){ + return ((s64)x->x * y->x + (s64)x->y * y->y + (s64)x->z * y->z + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT; +} + +s32 VEC_Fx16DotProduct(struct Vecx16 *x, struct Vecx16 *y){ + s32 temp1, temp2; + temp1 = (x->x * y->x) + (x->y * y->y); + temp2 = (x->z * y->z) + (1 << (FX64_INT_SHIFT - 1)); + return (s32)(((s64)temp1 + temp2) >> FX64_INT_SHIFT); +} + +void VEC_CrossProduct(struct Vecx32 *x, struct Vecx32 *y, struct Vecx32 *); diff --git a/include/fx.h b/include/fx.h new file mode 100644 index 00000000..82938219 --- /dev/null +++ b/include/fx.h @@ -0,0 +1,41 @@ +#ifndef GUARD_FX_H +#define GUARD_FX_H + +#define FX32_INT_MASK 0xFFFFF000 +#define FX32_INT_ABS_MASK 0x7FFFF000 +#define FX32_FRAC_MASK 0x00000FFF + +#define FX32_INT_SHIFT 0xC +#define FX64_INT_SHIFT 0xC + +#define FX32_INT(x) (((x) & FX32_INT_MASK) >> FX32_INT_SHIFT) +#define FX32_INT_ABS(x) (((x) & FX32_INT_ABS_MASK) >> FX32_INT_SHIFT) +#define FX32_FRAC(x) ((x) & FX32_FRAC_MASK) + +struct Vecx32 +{ + s32 x; + s32 y; + s32 z; +}; + +struct Vecx16 +{ + s16 x; + s16 y; + s16 z; +}; + +void FX_Init(); +s32 FX_Modf(s32 x, s32 *iptr); +s32 FX_Inv(s32 x); +u16 FX_Atan(s32 x); +u16 FX_Atan2(s32 x, s32 y); + +//Vec +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); + +#endif //GUARD_FX_H -- cgit v1.2.3 From fefbe6b2dbc36e45fd521a75970fa58df5690615 Mon Sep 17 00:00:00 2001 From: Made Date: Fri, 1 May 2020 19:06:20 +0200 Subject: better vector names --- arm9/lib/src/FX_vec_c.c | 36 ++++++++++++++++++------------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/arm9/lib/src/FX_vec_c.c b/arm9/lib/src/FX_vec_c.c index a2e0ffe4..bebf7ca0 100644 --- a/arm9/lib/src/FX_vec_c.c +++ b/arm9/lib/src/FX_vec_c.c @@ -2,33 +2,33 @@ #include "main.h" #include "fx.h" -void VEC_Add(struct Vecx32 *x, struct Vecx32 *y, struct Vecx32 *dst){ - dst->x = x->x + y->x; - dst->y = x->y + y->y; - dst->z = x->z + y->z; +void VEC_Add(struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst){ + dst->x = a->x + b->x; + dst->y = a->y + b->y; + dst->z = a->z + b->z; } -void VEC_Subtract(struct Vecx32 *x, struct Vecx32 *y, struct Vecx32 *dst){ - dst->x = x->x - y->x; - dst->y = x->y - y->y; - dst->z = x->z - y->z; +void VEC_Subtract(struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst){ + dst->x = a->x - b->x; + dst->y = a->y - b->y; + dst->z = a->z - b->z; } -void VEC_Fx16Add(struct Vecx16 *x, struct Vecx16 *y, struct Vecx16 *dst){ - dst->x = x->x + y->x; - dst->y = x->y + y->y; - dst->z = x->z + y->z; +void VEC_Fx16Add(struct Vecx16 *a, struct Vecx16 *b, struct Vecx16 *dst){ + dst->x = a->x + b->x; + dst->y = a->y + b->y; + dst->z = a->z + b->z; } -s32 VEC_DotProduct(struct Vecx32 *x, struct Vecx32 *y){ - return ((s64)x->x * y->x + (s64)x->y * y->y + (s64)x->z * y->z + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT; +s32 VEC_DotProduct(struct Vecx32 *a, struct Vecx32 *b){ + return ((s64)a->x * b->x + (s64)a->y * b->y + (s64)a->z * b->z + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT; } -s32 VEC_Fx16DotProduct(struct Vecx16 *x, struct Vecx16 *y){ +s32 VEC_Fx16DotProduct(struct Vecx16 *a, struct Vecx16 *b){ s32 temp1, temp2; - temp1 = (x->x * y->x) + (x->y * y->y); - temp2 = (x->z * y->z) + (1 << (FX64_INT_SHIFT - 1)); + temp1 = (a->x * b->x) + (a->y * b->y); + temp2 = (a->z * b->z) + (1 << (FX64_INT_SHIFT - 1)); return (s32)(((s64)temp1 + temp2) >> FX64_INT_SHIFT); } -void VEC_CrossProduct(struct Vecx32 *x, struct Vecx32 *y, struct Vecx32 *); +void VEC_CrossProduct(struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst); -- cgit v1.2.3 From 3a51b862659071a4dab8296f1c9cfbe38d287887 Mon Sep 17 00:00:00 2001 From: Made Date: Fri, 1 May 2020 21:57:41 +0200 Subject: finish decompiling FX_vec.s --- arm9/arm9.lcf | 1 - arm9/asm/FX_vec.s | 403 ------------------------------------------------ arm9/lib/src/FX_vec.c | 125 +++++++++++++++ arm9/lib/src/FX_vec_c.c | 34 ---- 4 files changed, 125 insertions(+), 438 deletions(-) delete mode 100644 arm9/asm/FX_vec.s create mode 100644 arm9/lib/src/FX_vec.c delete mode 100644 arm9/lib/src/FX_vec_c.c diff --git a/arm9/arm9.lcf b/arm9/arm9.lcf index 046ce41d..42b0a8ee 100644 --- a/arm9/arm9.lcf +++ b/arm9/arm9.lcf @@ -127,7 +127,6 @@ SECTIONS { FX_mtx44.o (.text) FX_cp.o (.text) FX_vec.o (.text) - FX_vec_c.o (.text) FX_atan.o (.text) FX.o (.text) GX.o (.text) diff --git a/arm9/asm/FX_vec.s b/arm9/asm/FX_vec.s deleted file mode 100644 index 08068eaf..00000000 --- a/arm9/asm/FX_vec.s +++ /dev/null @@ -1,403 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .text - - arm_func_start VEC_MultAdd -VEC_MultAdd: ; 0x020C50D4 - stmdb sp!, {r4,lr} - ldr r4, [r1, #0x0] - ldr lr, [r2, #0x0] - smull r12, r4, r0, r4 - mov r12, r12, lsr #0xc - orr r12, r12, r4, lsl #0x14 - add r4, lr, r12 - str r4, [r3, #0x0] - ldr r12, [r1, #0x4] - ldr r4, [r2, #0x4] - smull lr, r12, r0, r12 - mov lr, lr, lsr #0xc - orr lr, lr, r12, lsl #0x14 - add r4, r4, lr - str r4, [r3, #0x4] - ldr r1, [r1, #0x8] - ldr r12, [r2, #0x8] - smull r2, r1, r0, r1 - mov r0, r2, lsr #0xc - orr r0, r0, r1, lsl #0x14 - add r0, r12, r0 - str r0, [r3, #0x8] - ldmia sp!, {r4,lr} - bx lr - - arm_func_start VEC_Fx16Normalize -VEC_Fx16Normalize: ; 0x020C5134 - stmdb sp!, {r4-r8,lr} - ldrsh r4, [r0, #0x0] - ldrsh r3, [r0, #0x2] - ldrsh r2, [r0, #0x4] - mul r8, r4, r4 - mul r7, r3, r3 - mul r6, r2, r2 - ldr r2, _020C526C ; =0x04000280 - mov r3, #0x2 - ldr r4, _020C5270 ; =0x04000290 - strh r3, [r2, #0x0] - mov r2, #0x0 - str r2, [r4, #0x0] - mov r5, #0x1000000 - mov r2, r8, asr #0x1f - adds r3, r8, r7 - adc r2, r2, r7, asr #0x1f - adds r7, r3, r6 - adc r6, r2, r6, asr #0x1f - mov r3, r6, lsl #0x2 - ldr r2, _020C5274 ; =0x04000298 - str r5, [r4, #0x4] - str r7, [r2, #0x0] - ldr r5, _020C5278 ; =0x040002B0 - str r6, [r2, #0x4] - mov r4, #0x1 - ldr r2, _020C527C ; =0x040002B8 - strh r4, [r5, #0x0] - mov r4, r7, lsl #0x2 - str r4, [r2, #0x0] - orr r3, r3, r7, lsr #0x1e - str r3, [r2, #0x4] -_020C51B4: - ldrh r2, [r5, #0x0] - ands r2, r2, #0x8000 - bne _020C51B4 - ldr r2, _020C5280 ; =0x040002B4 - ldr r12, [r2, #0x0] - ldr r3, _020C526C ; =0x04000280 -_020C51CC: - ldrh r2, [r3, #0x0] - ands r2, r2, #0x8000 - bne _020C51CC - ldr r7, _020C5284 ; =0x040002A0 - ldrsh r5, [r0, #0x0] - ldr r6, [r7, #0x0] - mov r4, r12, asr #0x1f - umull r3, r2, r6, r12 - mla r2, r6, r4, r2 - ldr r8, [r7, #0x4] - mov r4, r5, asr #0x1f - umull r7, r6, r3, r5 - mov lr, #0x0 - mla r2, r8, r12, r2 - mla r6, r3, r4, r6 - mla r6, r2, r5, r6 - adds r4, r7, lr - adc r4, r6, #0x1000 - mov r4, r4, asr #0xd - strh r4, [r1, #0x0] - ldrsh r5, [r0, #0x2] - umull r6, r12, r3, r5 - mov r4, r5, asr #0x1f - mla r12, r3, r4, r12 - mla r12, r2, r5, r12 - adds r4, r6, lr - adc r4, r12, #0x1000 - mov r4, r4, asr #0xd - strh r4, [r1, #0x2] - ldrsh r12, [r0, #0x4] - umull r5, r4, r3, r12 - mov r0, r12, asr #0x1f - adds r5, r5, lr - mla r4, r3, r0, r4 - mla r4, r2, r12, r4 - adc r0, r4, #0x1000 - mov r0, r0, asr #0xd - strh r0, [r1, #0x4] - ldmia sp!, {r4-r8,lr} - bx lr - .balign 4 -_020C526C: .word 0x04000280 -_020C5270: .word 0x04000290 -_020C5274: .word 0x04000298 -_020C5278: .word 0x040002B0 -_020C527C: .word 0x040002B8 -_020C5280: .word 0x040002B4 -_020C5284: .word 0x040002A0 - - arm_func_start VEC_Normalize -VEC_Normalize: - stmdb sp!, {r4-r8,lr} - ldr r3, [r0, #0x4] - ldr r4, [r0, #0x0] - smull r2, r7, r3, r3 - smlal r2, r7, r4, r4 - ldr r4, [r0, #0x8] - ldr r3, _020C53AC ; =0x04000280 - smlal r2, r7, r4, r4 - mov r6, #0x2 - mov r4, r7, lsl #0x2 - ldr r5, _020C53B0 ; =0x04000290 - strh r6, [r3, #0x0] - mov r3, #0x0 - str r3, [r5, #0x0] - mov r6, #0x1000000 - ldr r3, _020C53B4 ; =0x04000298 - str r6, [r5, #0x4] - str r2, [r3, #0x0] - ldr r6, _020C53B8 ; =0x040002B0 - str r7, [r3, #0x4] - mov r5, #0x1 - ldr r3, _020C53BC ; =0x040002B8 - strh r5, [r6, #0x0] - mov r5, r2, lsl #0x2 - str r5, [r3, #0x0] - orr r4, r4, r2, lsr #0x1e - str r4, [r3, #0x4] -_020C52F4: - ldrh r2, [r6, #0x0] - ands r2, r2, #0x8000 - bne _020C52F4 - ldr r2, _020C53C0 ; =0x040002B4 - ldr r12, [r2, #0x0] - ldr r3, _020C53AC ; =0x04000280 -_020C530C: - ldrh r2, [r3, #0x0] - ands r2, r2, #0x8000 - bne _020C530C - ldr r7, _020C53C4 ; =0x040002A0 - ldr r5, [r0, #0x0] - ldr r6, [r7, #0x0] - mov r4, r12, asr #0x1f - umull r3, r2, r6, r12 - mla r2, r6, r4, r2 - ldr r8, [r7, #0x4] - mov r4, r5, asr #0x1f - umull r7, r6, r3, r5 - mov lr, #0x0 - mla r2, r8, r12, r2 - mla r6, r3, r4, r6 - mla r6, r2, r5, r6 - adds r4, r7, lr - adc r4, r6, #0x1000 - mov r4, r4, asr #0xd - str r4, [r1, #0x0] - ldr r5, [r0, #0x4] - umull r6, r12, r3, r5 - mov r4, r5, asr #0x1f - mla r12, r3, r4, r12 - mla r12, r2, r5, r12 - adds r4, r6, lr - adc r4, r12, #0x1000 - mov r4, r4, asr #0xd - str r4, [r1, #0x4] - ldr r12, [r0, #0x8] - umull r5, r4, r3, r12 - mov r0, r12, asr #0x1f - adds r5, r5, lr - mla r4, r3, r0, r4 - mla r4, r2, r12, r4 - adc r0, r4, #0x1000 - mov r0, r0, asr #0xd - str r0, [r1, #0x8] - ldmia sp!, {r4-r8,lr} - bx lr - .balign 4 -_020C53AC: .word 0x04000280 -_020C53B0: .word 0x04000290 -_020C53B4: .word 0x04000298 -_020C53B8: .word 0x040002B0 -_020C53BC: .word 0x040002B8 -_020C53C0: .word 0x040002B4 -_020C53C4: .word 0x040002A0 - - arm_func_start VEC_Mag -VEC_Mag: - ldr r2, [r0, #0x4] - ldr r3, [r0, #0x0] - smull r12, r1, r2, r2 - smlal r12, r1, r3, r3 - ldr r0, [r0, #0x8] - ldr r3, _020C5424 ; =0x040002B0 - smlal r12, r1, r0, r0 - mov r2, #0x1 - mov r1, r1, lsl #0x2 - ldr r0, _020C5428 ; =0x040002B8 - strh r2, [r3, #0x0] - mov r2, r12, lsl #0x2 - str r2, [r0, #0x0] - orr r1, r1, r12, lsr #0x1e - str r1, [r0, #0x4] -_020C5404: - ldrh r0, [r3, #0x0] - ands r0, r0, #0x8000 - bne _020C5404 - ldr r0, _020C542C ; =0x040002B4 - ldr r0, [r0, #0x0] - add r0, r0, #0x1 - mov r0, r0, asr #0x1 - bx lr - .balign 4 -_020C5424: .word 0x040002B0 -_020C5428: .word 0x040002B8 -_020C542C: .word 0x040002B4 - - arm_func_start VEC_Fx16CrossProduct -VEC_Fx16CrossProduct: ; 0x020C5430 - stmdb sp!, {r4-r6,lr} - ldrsh r4, [r1, #0x4] - ldrsh r12, [r0, #0x2] - ldrsh lr, [r0, #0x0] - ldrsh r3, [r1, #0x2] - ldrsh r6, [r0, #0x4] - ldrsh r1, [r1, #0x0] - mul r5, r12, r4 - mul r0, r6, r3 - sub r0, r5, r0 - add r0, r0, #0x800 - mov r0, r0, asr #0xc - mul r5, r6, r1 - mul r4, lr, r4 - sub r4, r5, r4 - add r4, r4, #0x800 - mul r3, lr, r3 - mul r1, r12, r1 - sub r1, r3, r1 - add r1, r1, #0x800 - strh r0, [r2, #0x0] - mov r0, r4, asr #0xc - strh r0, [r2, #0x2] - mov r0, r1, asr #0xc - strh r0, [r2, #0x4] - ldmia sp!, {r4-r6,lr} - bx lr - - arm_func_start VEC_CrossProduct -VEC_CrossProduct: - stmdb sp!, {r4-r11,lr} - sub sp, sp, #0x4 - ldr r12, [r1, #0x8] - ldr r9, [r0, #0x4] - ldr r3, [r0, #0x0] - ldr r11, [r1, #0x4] - ldr r0, [r0, #0x8] - ldr r10, [r1, #0x0] - smull r4, r7, r9, r12 - smull r1, r6, r0, r11 - subs r8, r4, r1 - smull r5, r4, r0, r10 - smull lr, r12, r3, r12 - smull r1, r0, r3, r11 - smull r10, r3, r9, r10 - sbc r6, r7, r6 - mov r9, #0x800 - adds r7, r8, r9 - adc r6, r6, #0x0 - subs r8, r5, lr - sbc r5, r4, r12 - adds r8, r8, r9 - mov r4, r7, lsr #0xc - adc r5, r5, #0x0 - subs r1, r1, r10 - orr r4, r4, r6, lsl #0x14 - mov r6, r8, lsr #0xc - sbc r0, r0, r3 - adds r1, r1, r9 - str r4, [r2, #0x0] - orr r6, r6, r5, lsl #0x14 - adc r0, r0, #0x0 - mov r1, r1, lsr #0xc - str r6, [r2, #0x4] - orr r1, r1, r0, lsl #0x14 - str r1, [r2, #0x8] - add sp, sp, #0x4 - ldmia sp!, {r4-r11,lr} - bx lr - -; arm_func_start VEC_Fx16DotProduct -;VEC_Fx16DotProduct: ; 0x020C5538 -; stmdb sp!, {r4-r5,lr} -; sub sp, sp, #0x4 -; ldrsh lr, [r0, #0x2] -; ldrsh r12, [r1, #0x2] -; ldrsh r3, [r0, #0x4] -; ldrsh r2, [r1, #0x4] -; ldrsh r5, [r0, #0x0] -; ldrsh r4, [r1, #0x0] -; smulbb r1, lr, r12 -; smulbb r0, r3, r2 -; smlabb r1, r5, r4, r1 -; add r0, r0, #0x800 -; adds r2, r1, r0 -; mov r1, r1, asr #0x1f -; adc r1, r1, r0, asr #0x1f -; mov r0, r2, lsr #0xc -; orr r0, r0, r1, lsl #0x14 -; add sp, sp, #0x4 -; ldmia sp!, {r4-r5,lr} -; bx lr -; -; arm_func_start VEC_DotProduct -;VEC_DotProduct: -; stmdb sp!, {r4,lr} -; ldr r3, [r0, #0x4] -; ldr r2, [r1, #0x4] -; ldr r12, [r0, #0x0] -; smull r4, lr, r3, r2 -; ldr r2, [r1, #0x0] -; ldr r3, [r0, #0x8] -; smlal r4, lr, r12, r2 -; ldr r1, [r1, #0x8] -; mov r0, #0x800 -; smlal r4, lr, r3, r1 -; adds r0, r4, r0 -; adc r1, lr, #0x0 -; mov r0, r0, lsr #0xc -; orr r0, r0, r1, lsl #0x14 -; ldmia sp!, {r4,lr} -; bx lr -; -; arm_func_start VEC_Fx16Add -;VEC_Fx16Add: ; 0x020C55CC -; ldrsh r12, [r0, #0x0] -; ldrsh r3, [r1, #0x0] -; add r3, r12, r3 -; strh r3, [r2, #0x0] -; ldrsh r12, [r0, #0x2] -; ldrsh r3, [r1, #0x2] -; add r3, r12, r3 -; strh r3, [r2, #0x2] -; ldrsh r3, [r0, #0x4] -; ldrsh r0, [r1, #0x4] -; add r0, r3, r0 -; strh r0, [r2, #0x4] -; bx lr -; -; arm_func_start VEC_Subtract -;VEC_Subtract: ; 0x020C5600 -; ldr r12, [r0, #0x0] -; ldr r3, [r1, #0x0] -; sub r3, r12, r3 -; str r3, [r2, #0x0] -; ldr r12, [r0, #0x4] -; ldr r3, [r1, #0x4] -; sub r3, r12, r3 -; str r3, [r2, #0x4] -; ldr r3, [r0, #0x8] -; ldr r0, [r1, #0x8] -; sub r0, r3, r0 -; str r0, [r2, #0x8] -; bx lr -; -; arm_func_start VEC_Add -;VEC_Add: ; 0x020C5634 -; ldr r12, [r0, #0x0] -; ldr r3, [r1, #0x0] -; add r3, r12, r3 -; str r3, [r2, #0x0] -; ldr r12, [r0, #0x4] -; ldr r3, [r1, #0x4] -; add r3, r12, r3 -; str r3, [r2, #0x4] -; ldr r3, [r0, #0x8] -; ldr r0, [r1, #0x8] -; add r0, r3, r0 -; str r0, [r2, #0x8] -; bx lr -; diff --git a/arm9/lib/src/FX_vec.c b/arm9/lib/src/FX_vec.c new file mode 100644 index 00000000..dc28bedf --- /dev/null +++ b/arm9/lib/src/FX_vec.c @@ -0,0 +1,125 @@ +#include "global.h" +#include "main.h" +#include "fx.h" + +void VEC_Add(struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst){ + dst->x = a->x + b->x; + dst->y = a->y + b->y; + dst->z = a->z + b->z; +} + +void VEC_Subtract(struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst){ + dst->x = a->x - b->x; + dst->y = a->y - b->y; + dst->z = a->z - b->z; +} + +void VEC_Fx16Add(struct Vecx16 *a, struct Vecx16 *b, struct Vecx16 *dst){ + dst->x = a->x + b->x; + dst->y = a->y + b->y; + dst->z = a->z + b->z; +} + +s32 VEC_DotProduct(struct Vecx32 *a, struct Vecx32 *b){ + return ((s64)a->x * b->x + (s64)a->y * b->y + (s64)a->z * b->z + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT; +} + +s32 VEC_Fx16DotProduct(struct Vecx16 *a, struct Vecx16 *b){ + s32 temp1, temp2; + temp1 = (a->x * b->x) + (a->y * b->y); + temp2 = (a->z * b->z) + (1 << (FX64_INT_SHIFT - 1)); + return (s32)(((s64)temp1 + temp2) >> FX64_INT_SHIFT); +} + +void VEC_CrossProduct(struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst){ + s32 x, y, z; + x = (s32)(((s64)a->y * b->z - (s64)a->z * b->y + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT); + y = (s32)(((s64)a->z * b->x - (s64)a->x * b->z + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT); + z = (s32)(((s64)a->x * b->y - (s64)a->y * b->x + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT); + dst->x = x; + dst->y = y; + dst->z = z; +} + +void VEC_Fx16CrossProduct(struct Vecx16 *a, struct Vecx16 *b, struct Vecx16 *dst){ + s32 x, y, z; + x = ((a->y * b->z - a->z * b->y + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT); + y = ((a->z * b->x - a->x * b->z + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT); + z = ((a->x * b->y - a->y * b->x + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT); + dst->x = x; + dst->y = y; + dst->z = z; +} + +#define HW_REG_DIVCNT 0x04000280 +#define HW_REG_DIV_NUMER 0x04000290 +#define HW_REG_DIV_DENOM 0x04000298 +#define HW_REG_DIV_RESULT 0x040002A0 +#define HW_REG_DIVREM_RESULT 0x040002A8 + +#define HW_REG_SQRTCNT 0x040002B0 +#define HW_REG_SQRT_RESULT 0x040002B4 +#define HW_REG_SQRT_PARAM 0x040002B8 + +#define SETREG16(x, y) ((*(vu16 *)x) = y) +#define SETREG32(x, y) ((*(vu32 *)x) = y) +#define SETREG64(x, y) ((*(vu64 *)x) = y) +#define READREG16(x) (*(vu16 *)x) +#define READREG32(x) (*(vu32 *)x) +#define READREG64(x) (*(vu64 *)x) + +s32 VEC_Mag(struct Vecx32 *a){ + s64 l2 = (s64)a->x * a->x; + l2 += (s64)a->y * a->y; + l2 += (s64)a->z * a->z; + SETREG16(HW_REG_SQRTCNT, 0x1); + SETREG64(HW_REG_SQRT_PARAM, l2 * 4); + while (READREG16(HW_REG_SQRTCNT) & 0x8000); //wait for coprocessor to finish + return ((s32)READREG32(HW_REG_SQRT_RESULT) + 1) >> 1; +} + +void VEC_Normalize(struct Vecx32 *a, struct Vecx32 *dst){ + s64 l2 = (s64)a->x * a->x; + l2 += (s64)a->y * a->y; + l2 += (s64)a->z * a->z; + //1/sqrt(l) is computed by calculating sqrt(l)*(1/l) + SETREG16(HW_REG_DIVCNT, 0x2); + SETREG64(HW_REG_DIV_NUMER, 0x0100000000000000); + SETREG64(HW_REG_DIV_DENOM, l2); + SETREG16(HW_REG_SQRTCNT, 0x1); + SETREG64(HW_REG_SQRT_PARAM, l2 * 4); + while (READREG16(HW_REG_SQRTCNT) & 0x8000); //wait for sqrt to finish + s32 sqrtresult = READREG32(HW_REG_SQRT_RESULT); + while (READREG16(HW_REG_DIVCNT) & 0x8000); //wait for division to finish + l2 = READREG64(HW_REG_DIV_RESULT); + l2 = sqrtresult * l2; + dst->x = (l2 * a->x + (1LL << (0x2D - 1))) >> 0x2D; + dst->y = (l2 * a->y + (1LL << (0x2D - 1))) >> 0x2D; + dst->z = (l2 * a->z + (1LL << (0x2D - 1))) >> 0x2D; +} + +void VEC_Fx16Normalize(struct Vecx16 *a, struct Vecx16 *dst){ + s64 l2 = a->x * a->x; + l2 += a->y * a->y; + l2 += a->z * a->z; + //1/sqrt(l) is computed by calculating sqrt(l)*(1/l) + SETREG16(HW_REG_DIVCNT, 0x2); + SETREG64(HW_REG_DIV_NUMER, 0x0100000000000000); + SETREG64(HW_REG_DIV_DENOM, l2); + SETREG16(HW_REG_SQRTCNT, 0x1); + SETREG64(HW_REG_SQRT_PARAM, l2 * 4); + while (READREG16(HW_REG_SQRTCNT) & 0x8000); //wait for sqrt to finish + s32 sqrtresult = READREG32(HW_REG_SQRT_RESULT); + while (READREG16(HW_REG_DIVCNT) & 0x8000); //wait for division to finish + l2 = READREG64(HW_REG_DIV_RESULT); + l2 = sqrtresult * l2; + dst->x = (l2 * a->x + (1LL << (0x2D - 1))) >> 0x2D; + dst->y = (l2 * a->y + (1LL << (0x2D - 1))) >> 0x2D; + dst->z = (l2 * a->z + (1LL << (0x2D - 1))) >> 0x2D; +} + +void VEC_MultAdd(s32 factor, struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst){ + dst->x = (s32)(((s64)factor * a->x) >> FX32_INT_SHIFT) + b->x; + dst->y = (s32)(((s64)factor * a->y) >> FX32_INT_SHIFT) + b->y; + dst->z = (s32)(((s64)factor * a->z) >> FX32_INT_SHIFT) + b->z; +} diff --git a/arm9/lib/src/FX_vec_c.c b/arm9/lib/src/FX_vec_c.c deleted file mode 100644 index bebf7ca0..00000000 --- a/arm9/lib/src/FX_vec_c.c +++ /dev/null @@ -1,34 +0,0 @@ -#include "global.h" -#include "main.h" -#include "fx.h" - -void VEC_Add(struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst){ - dst->x = a->x + b->x; - dst->y = a->y + b->y; - dst->z = a->z + b->z; -} - -void VEC_Subtract(struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst){ - dst->x = a->x - b->x; - dst->y = a->y - b->y; - dst->z = a->z - b->z; -} - -void VEC_Fx16Add(struct Vecx16 *a, struct Vecx16 *b, struct Vecx16 *dst){ - dst->x = a->x + b->x; - dst->y = a->y + b->y; - dst->z = a->z + b->z; -} - -s32 VEC_DotProduct(struct Vecx32 *a, struct Vecx32 *b){ - return ((s64)a->x * b->x + (s64)a->y * b->y + (s64)a->z * b->z + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT; -} - -s32 VEC_Fx16DotProduct(struct Vecx16 *a, struct Vecx16 *b){ - s32 temp1, temp2; - temp1 = (a->x * b->x) + (a->y * b->y); - temp2 = (a->z * b->z) + (1 << (FX64_INT_SHIFT - 1)); - return (s32)(((s64)temp1 + temp2) >> FX64_INT_SHIFT); -} - -void VEC_CrossProduct(struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst); -- cgit v1.2.3 From dba3fd7f6eb8d0895bec720db75a6b37fc7259a0 Mon Sep 17 00:00:00 2001 From: Made Date: Sat, 2 May 2020 17:39:44 +0200 Subject: Decompile FX_cp.s --- arm9/asm/FX_cp.s | 190 -------------------------------------------------- arm9/lib/src/FX_cp.c | 74 ++++++++++++++++++++ arm9/lib/src/FX_vec.c | 17 ----- include/fx.h | 29 +++++++- 4 files changed, 102 insertions(+), 208 deletions(-) delete mode 100644 arm9/asm/FX_cp.s create mode 100644 arm9/lib/src/FX_cp.c diff --git a/arm9/asm/FX_cp.s b/arm9/asm/FX_cp.s deleted file mode 100644 index 1c5f0350..00000000 --- a/arm9/asm/FX_cp.s +++ /dev/null @@ -1,190 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .text - - arm_func_start FX_ModS32 -FX_ModS32: ; 0x020C4E98 - stmdb sp!, {lr} - sub sp, sp, #0x4 - ldr ip, _020C4EE0 ; =0x04000280 - mov lr, #0x0 - ldr r3, _020C4EE4 ; =0x04000290 - strh lr, [r12, #0x0] - ldr r2, _020C4EE8 ; =0x04000298 - str r0, [r3, #0x0] - str r1, [r2, #0x0] - str lr, [r2, #0x4] -_020C4EC0: - ldrh r0, [r12, #0x0] - ands r0, r0, #0x8000 - bne _020C4EC0 - ldr r0, _020C4EEC ; =0x040002A8 - ldr r0, [r0, #0x0] - add sp, sp, #0x4 - ldmia sp!, {lr} - bx lr - .balign 4 -_020C4EE0: .word 0x04000280 -_020C4EE4: .word 0x04000290 -_020C4EE8: .word 0x04000298 -_020C4EEC: .word 0x040002A8 - - arm_func_start FX_DivS32 -FX_DivS32: ; 0x020C4EF0 - stmdb sp!, {lr} - sub sp, sp, #0x4 - ldr ip, _020C4F38 ; =0x04000280 - mov lr, #0x0 - ldr r3, _020C4F3C ; =0x04000290 - strh lr, [r12, #0x0] - ldr r2, _020C4F40 ; =0x04000298 - str r0, [r3, #0x0] - str r1, [r2, #0x0] - str lr, [r2, #0x4] -_020C4F18: - ldrh r0, [r12, #0x0] - ands r0, r0, #0x8000 - bne _020C4F18 - ldr r0, _020C4F44 ; =0x040002A0 - ldr r0, [r0, #0x0] - add sp, sp, #0x4 - ldmia sp!, {lr} - bx lr - .balign 4 -_020C4F38: .word 0x04000280 -_020C4F3C: .word 0x04000290 -_020C4F40: .word 0x04000298 -_020C4F44: .word 0x040002A0 - - arm_func_start FX_DivAsync -FX_DivAsync: ; 0x020C4F48 - ldr r2, _020C4F74 ; =0x04000280 - mov r12, #0x1 - ldr r3, _020C4F78 ; =0x04000290 - strh r12, [r2, #0x0] - mov r12, #0x0 - str r12, [r3, #0x0] - ldr r2, _020C4F7C ; =0x04000298 - str r0, [r3, #0x4] - str r1, [r2, #0x0] - str r12, [r2, #0x4] - bx lr - .balign 4 -_020C4F74: .word 0x04000280 -_020C4F78: .word 0x04000290 -_020C4F7C: .word 0x04000298 - - arm_func_start FX_GetSqrtResult -FX_GetSqrtResult: ; 0x020C4F80 - ldr r1, _020C4FA4 ; =0x040002B0 -_020C4F84: - ldrh r0, [r1, #0x0] - ands r0, r0, #0x8000 - bne _020C4F84 - ldr r0, _020C4FA8 ; =0x040002B4 - ldr r0, [r0, #0x0] - add r0, r0, #0x200 - mov r0, r0, lsr #0xa - bx lr - .balign 4 -_020C4FA4: .word 0x040002B0 -_020C4FA8: .word 0x040002B4 - - arm_func_start FX_InvAsync -FX_InvAsync: - ldr r1, _020C4FDC ; =0x04000280 - mov r3, #0x1 - ldr r2, _020C4FE0 ; =0x04000290 - strh r3, [r1, #0x0] - mov r12, #0x0 - str r12, [r2, #0x0] - mov r3, #0x1000 - ldr r1, _020C4FE4 ; =0x04000298 - str r3, [r2, #0x4] - str r0, [r1, #0x0] - str r12, [r1, #0x4] - bx lr - .balign 4 -_020C4FDC: .word 0x04000280 -_020C4FE0: .word 0x04000290 -_020C4FE4: .word 0x04000298 - - arm_func_start FX_GetDivResult -FX_GetDivResult: ; 0x020C4FE8 - ldr r1, _020C501C ; =0x04000280 -_020C4FEC: - ldrh r0, [r1, #0x0] - ands r0, r0, #0x8000 - bne _020C4FEC - ldr r1, _020C5020 ; =0x040002A0 - mov r0, #0x80000 - ldr r2, [r1, #0x0] - ldr r1, [r1, #0x4] - adds r0, r2, r0 - adc r1, r1, #0x0 - mov r0, r0, lsr #0x14 - orr r0, r0, r1, lsl #0xc - bx lr - .balign 4 -_020C501C: .word 0x04000280 -_020C5020: .word 0x040002A0 - - arm_func_start FX_GetDivResultFx64c -FX_GetDivResultFx64c: ; 0x020C5024 - ldr r1, _020C5044 ; =0x04000280 -_020C5028: - ldrh r0, [r1, #0x0] - ands r0, r0, #0x8000 - bne _020C5028 - ldr r1, _020C5048 ; =0x040002A0 - ldr r0, [r1, #0x0] - ldr r1, [r1, #0x4] - bx lr - .balign 4 -_020C5044: .word 0x04000280 -_020C5048: .word 0x040002A0 - - arm_func_start FX_Sqrt -FX_Sqrt: ; 0x020C504C - stmdb sp!, {lr} - sub sp, sp, #0x4 - cmp r0, #0x0 - addle sp, sp, #0x4 - movle r0, #0x0 - ldmleia sp!, {lr} - bxle lr - ldr r2, _020C5094 ; =0x040002B0 - mov r3, #0x1 - strh r3, [r2, #0x0] - ldr r1, _020C5098 ; =0x040002B8 - mov r2, #0x0 - str r2, [r1, #0x0] - str r0, [r1, #0x4] - bl FX_GetSqrtResult - add sp, sp, #0x4 - ldmia sp!, {lr} - bx lr - .balign 4 -_020C5094: .word 0x040002B0 -_020C5098: .word 0x040002B8 - - arm_func_start FX_Inv -FX_Inv: ; 0x020C509C - stmdb sp!, {lr} - sub sp, sp, #0x4 - bl FX_InvAsync - bl FX_GetDivResult - add sp, sp, #0x4 - ldmia sp!, {lr} - bx lr - - arm_func_start FX_Div -FX_Div: ; 0x020C50B8 - stmdb sp!, {lr} - sub sp, sp, #0x4 - bl FX_DivAsync - bl FX_GetDivResult - add sp, sp, #0x4 - ldmia sp!, {lr} - bx lr diff --git a/arm9/lib/src/FX_cp.c b/arm9/lib/src/FX_cp.c new file mode 100644 index 00000000..a8da0a8f --- /dev/null +++ b/arm9/lib/src/FX_cp.c @@ -0,0 +1,74 @@ +#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); + return FX_GetDivResult(); +} + +s32 FX_Inv(s32 x){ + FX_InvAsync(x); + return FX_GetDivResult(); +} + +s32 FX_Sqrt(s32 x){ + if (x > 0) + { + SETREG16(HW_REG_SQRTCNT, 0x1); + SETREG64(HW_REG_SQRT_PARAM, (s64)x << 32); + return FX_GetSqrtResult(); + } + else + { + return 0; + } +} + +s64 FX_GetDivResultFx64c(){ + while (READREG16(HW_REG_DIVCNT) & 0x8000); + return READREG64(HW_REG_DIV_RESULT); +} + +s32 FX_GetDivResult(){ + while (READREG16(HW_REG_DIVCNT) & 0x8000); + return (READREG64(HW_REG_DIV_RESULT) + (1 << (0x14 - 1))) >> 0x14; +} + +void FX_InvAsync(s32 x){ + SETREG16(HW_REG_DIVCNT, 0x1); + SETREG64(HW_REG_DIV_NUMER, (s64)0x00001000 << 32); + SETREG64(HW_REG_DIV_DENOM, (u32)x); +} + +s32 FX_GetSqrtResult(){ + while (READREG16(HW_REG_SQRTCNT) & 0x8000); + return (READREG32(HW_REG_SQRT_RESULT) + (1 << (0xA - 1))) >> 0xA; +} + +void FX_DivAsync(s32 numerator, s32 denominator){ + SETREG16(HW_REG_DIVCNT, 0x1); + SETREG64(HW_REG_DIV_NUMER, (s64)numerator << 32); + 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_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_vec.c b/arm9/lib/src/FX_vec.c index dc28bedf..7b838829 100644 --- a/arm9/lib/src/FX_vec.c +++ b/arm9/lib/src/FX_vec.c @@ -51,23 +51,6 @@ void VEC_Fx16CrossProduct(struct Vecx16 *a, struct Vecx16 *b, struct Vecx16 *dst dst->z = z; } -#define HW_REG_DIVCNT 0x04000280 -#define HW_REG_DIV_NUMER 0x04000290 -#define HW_REG_DIV_DENOM 0x04000298 -#define HW_REG_DIV_RESULT 0x040002A0 -#define HW_REG_DIVREM_RESULT 0x040002A8 - -#define HW_REG_SQRTCNT 0x040002B0 -#define HW_REG_SQRT_RESULT 0x040002B4 -#define HW_REG_SQRT_PARAM 0x040002B8 - -#define SETREG16(x, y) ((*(vu16 *)x) = y) -#define SETREG32(x, y) ((*(vu32 *)x) = y) -#define SETREG64(x, y) ((*(vu64 *)x) = y) -#define READREG16(x) (*(vu16 *)x) -#define READREG32(x) (*(vu32 *)x) -#define READREG64(x) (*(vu64 *)x) - s32 VEC_Mag(struct Vecx32 *a){ s64 l2 = (s64)a->x * a->x; l2 += (s64)a->y * a->y; diff --git a/include/fx.h b/include/fx.h index 82938219..e753eead 100644 --- a/include/fx.h +++ b/include/fx.h @@ -4,14 +4,41 @@ #define FX32_INT_MASK 0xFFFFF000 #define FX32_INT_ABS_MASK 0x7FFFF000 #define FX32_FRAC_MASK 0x00000FFF - #define FX32_INT_SHIFT 0xC + +#define FX64_INT_MASK 0xFFFFFFFFFFFFF000 +#define FX64_INT_ABS_MASK 0x7FFFFFFFFFFFF000 +#define FX64_FRAC_MASK 0x0000000000000FFF #define FX64_INT_SHIFT 0xC + #define FX32_INT(x) (((x) & FX32_INT_MASK) >> FX32_INT_SHIFT) #define FX32_INT_ABS(x) (((x) & FX32_INT_ABS_MASK) >> FX32_INT_SHIFT) #define FX32_FRAC(x) ((x) & FX32_FRAC_MASK) +#define FX64_INT(x) (((x) & FX64_INT_MASK) >> FX64_INT_SHIFT) +#define FX64_INT_ABS(x) (((x) & FX64_INT_ABS_MASK) >> FX64_INT_SHIFT) +#define FX64_FRAC(x) ((x) & FX64_FRAC_MASK) + + + +#define HW_REG_DIVCNT 0x04000280 +#define HW_REG_DIV_NUMER 0x04000290 +#define HW_REG_DIV_DENOM 0x04000298 +#define HW_REG_DIV_RESULT 0x040002A0 +#define HW_REG_DIVREM_RESULT 0x040002A8 + +#define HW_REG_SQRTCNT 0x040002B0 +#define HW_REG_SQRT_RESULT 0x040002B4 +#define HW_REG_SQRT_PARAM 0x040002B8 + +#define SETREG16(x, y) ((*(vu16 *)x) = y) +#define SETREG32(x, y) ((*(vu32 *)x) = y) +#define SETREG64(x, y) ((*(vu64 *)x) = y) +#define READREG16(x) (*(vu16 *)x) +#define READREG32(x) (*(vu32 *)x) +#define READREG64(x) (*(vu64 *)x) + struct Vecx32 { s32 x; -- cgit v1.2.3 From dbd9afd038a082bc58c1d93c105db8095a24a35f Mon Sep 17 00:00:00 2001 From: Made Date: Sat, 2 May 2020 18:14:17 +0200 Subject: header cleanup --- include/fx.h | 56 +++++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 41 insertions(+), 15 deletions(-) diff --git a/include/fx.h b/include/fx.h index e753eead..22ef3d3a 100644 --- a/include/fx.h +++ b/include/fx.h @@ -1,24 +1,36 @@ #ifndef GUARD_FX_H #define GUARD_FX_H -#define FX32_INT_MASK 0xFFFFF000 -#define FX32_INT_ABS_MASK 0x7FFFF000 -#define FX32_FRAC_MASK 0x00000FFF -#define FX32_INT_SHIFT 0xC +#define FX32_INT_MASK 0xFFFFF000 +#define FX32_INT_ABS_MASK 0x7FFFF000 +#define FX32_FRAC_MASK 0x00000FFF +#define FX32_INT_SHIFT 0xC -#define FX64_INT_MASK 0xFFFFFFFFFFFFF000 -#define FX64_INT_ABS_MASK 0x7FFFFFFFFFFFF000 -#define FX64_FRAC_MASK 0x0000000000000FFF -#define FX64_INT_SHIFT 0xC +#define FX64_INT_MASK 0xFFFFFFFFFFFFF000 +#define FX64_INT_ABS_MASK 0x7FFFFFFFFFFFF000 +#define FX64_FRAC_MASK 0x0000000000000FFF +#define FX64_INT_SHIFT 0xC +#define FX64C_INT_MASK 0xFFFFFFFF00000000 +#define FX64C_INT_ABS_MASK 0x7FFFFFFF00000000 +#define FX64C_FRAC_MASK 0x00000000FFFFFFFF +#define FX64C_INT_SHIFT 0x20 -#define FX32_INT(x) (((x) & FX32_INT_MASK) >> FX32_INT_SHIFT) -#define FX32_INT_ABS(x) (((x) & FX32_INT_ABS_MASK) >> FX32_INT_SHIFT) -#define FX32_FRAC(x) ((x) & FX32_FRAC_MASK) +#define FX_INT(TYPE, x) (((x) & TYPE ## _INT_MASK) >> TYPE ## _INT_SHIFT) +#define FX_INT_ABS(TYPE, x) (((x) & TYPE ## _INT_ABS_MASK) >> TYPE ## _INT_SHIFT) +#define FX_FRAC(TYPE, x) ((x) & TYPE ## _FRAC_MASK) -#define FX64_INT(x) (((x) & FX64_INT_MASK) >> FX64_INT_SHIFT) -#define FX64_INT_ABS(x) (((x) & FX64_INT_ABS_MASK) >> FX64_INT_SHIFT) -#define FX64_FRAC(x) ((x) & FX64_FRAC_MASK) +#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) + +#define FX64_INT(x) FX_INT(FX64, x) +#define FX64_INT_ABS(x) FX_INT_ABS(FX64, x) +#define FX64_FRAC(x) FX_FRAC(FX64, x) + +#define FX64C_INT(x) FX_INT(FX64C, x) +#define FX64C_INT_ABS(x) FX_INT_ABS(FX64C, x) +#define FX64C_FRAC(x) FX_FRAC(FX64C, x) @@ -53,9 +65,11 @@ struct Vecx16 s16 z; }; +//FX void FX_Init(); s32 FX_Modf(s32 x, s32 *iptr); -s32 FX_Inv(s32 x); + +//Atan u16 FX_Atan(s32 x); u16 FX_Atan2(s32 x, s32 y); @@ -65,4 +79,16 @@ 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); +//CP +s32 FX_Div(s32 numerator, s32 denominator); +s32 FX_Inv(s32 x); +s32 FX_Sqrt(s32 x); +s64 FX_GetDivResultFx64c(); +s32 FX_GetDivResult(); +void FX_InvAsync(s32 x); +s32 FX_GetSqrtResult(); +void FX_DivAsync(s32 numerator, s32 denominator); +s32 FX_DivS32(s32 numerator, s32 denominator); +s32 FX_ModS32(s32 num, s32 mod); + #endif //GUARD_FX_H -- cgit v1.2.3 From a382cad64f6d03d03ae87a9eae33c9cfbf314fde Mon Sep 17 00:00:00 2001 From: Made Date: Sun, 3 May 2020 14:45:11 +0200 Subject: remove unnecessary asm --- arm9/asm/FX.s | 32 --------- arm9/asm/FX_atan.s | 201 ----------------------------------------------------- 2 files changed, 233 deletions(-) delete mode 100644 arm9/asm/FX.s delete mode 100644 arm9/asm/FX_atan.s diff --git a/arm9/asm/FX.s b/arm9/asm/FX.s deleted file mode 100644 index 873a3afd..00000000 --- a/arm9/asm/FX.s +++ /dev/null @@ -1,32 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .text - - arm_func_start FX_Modf -FX_Modf: ; 0x020C5928 - cmp r0, #0x0 - blt _020C5948 - ldr r2, _020C596C ; =0x7FFFF000 - ldr r3, _020C5970 ; =0x00000FFF - and r2, r0, r2 - str r2, [r1, #0x0] - and r0, r0, r3 - bx lr -_020C5948: - ldr r2, _020C596C ; =0x7FFFF000 - rsb r3, r0, #0x0 - ldr r0, _020C5970 ; =0x00000FFF - and r2, r3, r2 - rsb r2, r2, #0x0 - and r0, r3, r0 - str r2, [r1, #0x0] - rsb r0, r0, #0x0 - bx lr - .balign 4 -_020C596C: .word 0x7FFFF000 -_020C5970: .word 0x00000FFF - - arm_func_start FX_Init -FX_Init: ; 0x020C5974 - bx lr diff --git a/arm9/asm/FX_atan.s b/arm9/asm/FX_atan.s deleted file mode 100644 index 232a7211..00000000 --- a/arm9/asm/FX_atan.s +++ /dev/null @@ -1,201 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .text - - arm_func_start FX_Atan2 -FX_Atan2: ; 0x020C5668 - stmdb sp!, {r4,lr} - cmp r0, #0x0 - ble _020C5704 - cmp r1, #0x0 - ble _020C56B4 - cmp r1, r0 - movgt r3, r0 - movgt r4, #0x0 - movgt r0, #0x1 - bgt _020C57C8 - cmp r1, r0 - movlt r3, r1 - movlt r1, r0 - movlt r4, #0x4000 - movlt r0, #0x0 - blt _020C57C8 - mov r0, #0x2000 - ldmia sp!, {r4,lr} - bx lr -_020C56B4: - cmp r1, #0x0 - bge _020C56F8 - rsb r1, r1, #0x0 - cmp r1, r0 - movlt r3, r1 - movlt r1, r0 - movlt r4, #0x4000 - movlt r0, #0x1 - blt _020C57C8 - cmp r1, r0 - movgt r3, r0 - movgt r4, #0x8000 - movgt r0, #0x0 - bgt _020C57C8 - mov r0, #0x6000 - ldmia sp!, {r4,lr} - bx lr -_020C56F8: - mov r0, #0x4000 - ldmia sp!, {r4,lr} - bx lr -_020C5704: - cmp r0, #0x0 - bge _020C57B4 - cmp r1, #0x0 - rsb r2, r0, #0x0 - bge _020C5760 - rsb r1, r1, #0x0 - cmp r1, r2 - movgt r0, #0x8000 - rsbgt r4, r0, #0x0 - movgt r3, r2 - movgt r0, #0x1 - bgt _020C57C8 - cmp r1, r2 - bge _020C5754 - mov r0, #0x4000 - mov r3, r1 - mov r1, r2 - rsb r4, r0, #0x0 - mov r0, #0x0 - b _020C57C8 -_020C5754: - mov r0, #0xa000 - ldmia sp!, {r4,lr} - bx lr -_020C5760: - cmp r1, #0x0 - ble _020C57A8 - cmp r1, r2 - bge _020C5788 - mov r0, #0x4000 - mov r3, r1 - mov r1, r2 - rsb r4, r0, #0x0 - mov r0, #0x1 - b _020C57C8 -_020C5788: - cmp r1, r2 - movgt r4, #0x0 - movgt r3, r2 - movgt r0, r4 - bgt _020C57C8 - mov r0, #0xe000 - ldmia sp!, {r4,lr} - bx lr -_020C57A8: - mov r0, #0xc000 - ldmia sp!, {r4,lr} - bx lr -_020C57B4: - cmp r1, #0x0 - movge r0, #0x0 - movlt r0, #0x8000 - ldmia sp!, {r4,lr} - bx lr -_020C57C8: - cmp r1, #0x0 - moveq r0, #0x0 - ldmeqia sp!, {r4,lr} - bxeq lr - cmp r0, #0x0 - beq _020C580C - mov r0, r3 - bl FX_Div - mov r1, r0, asr #0x5 - ldr r0, _020C5838 ; =FX_AtanTable_ - mov r1, r1, lsl #0x1 - ldrsh r0, [r0, r1] - add r0, r4, r0 - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - ldmia sp!, {r4,lr} - bx lr -_020C580C: - mov r0, r3 - bl FX_Div - mov r1, r0, asr #0x5 - ldr r0, _020C5838 ; =FX_AtanTable_ - mov r1, r1, lsl #0x1 - ldrsh r0, [r0, r1] - sub r0, r4, r0 - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - ldmia sp!, {r4,lr} - bx lr - .balign 4 -_020C5838: .word FX_AtanTable_ - - arm_func_start FX_Atan -FX_Atan: ; 0x020C583C - stmdb sp!, {lr} - sub sp, sp, #0x4 - cmp r0, #0x0 - blt _020C58A4 - cmp r0, #0x1000 - ble _020C5880 - bl FX_Inv - mov r1, r0, asr #0x5 - ldr r0, _020C5924 ; =FX_AtanTable_ - mov r1, r1, lsl #0x1 - ldrsh r0, [r0, r1] - add sp, sp, #0x4 - rsb r0, r0, #0x4000 - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - ldmia sp!, {lr} - bx lr -_020C5880: - cmp r0, #0x1000 - movlt r1, r0, asr #0x5 - ldrlt r0, _020C5924 ; =FX_AtanTable_ - movlt r1, r1, lsl #0x1 - ldrlth r0, [r0, r1] - add sp, sp, #0x4 - movge r0, #0x2000 - ldmia sp!, {lr} - bx lr -_020C58A4: - mov r1, #0x1000 - rsb r1, r1, #0x0 - cmp r0, r1 - bge _020C58E4 - rsb r0, r0, #0x0 - bl FX_Inv - mov r1, r0, asr #0x5 - ldr r0, _020C5924 ; =FX_AtanTable_ - mov r1, r1, lsl #0x1 - ldrsh r0, [r0, r1] - add sp, sp, #0x4 - sub r0, r0, #0x4000 - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - ldmia sp!, {lr} - bx lr -_020C58E4: - cmp r0, r1 - addle sp, sp, #0x4 - movle r0, #0xe000 - ldmleia sp!, {lr} - bxle lr - rsb r0, r0, #0x0 - mov r1, r0, asr #0x5 - ldr r0, _020C5924 ; =FX_AtanTable_ - mov r1, r1, lsl #0x1 - ldrsh r0, [r0, r1] - rsb r0, r0, #0x0 - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - add sp, sp, #0x4 - ldmia sp!, {lr} - bx lr - .balign 4 -_020C5924: .word FX_AtanTable_ -- cgit v1.2.3 From 34dbccce4c71ba80c52cae8f1254c25d950f50c4 Mon Sep 17 00:00:00 2001 From: Made Date: Sun, 3 May 2020 14:49:24 +0200 Subject: decompile FX_mtx44 and update fx header --- arm9/asm/FX_mtx44.s | 362 ------------------------------------------------ arm9/lib/src/FX_cp.c | 34 ++--- arm9/lib/src/FX_mtx44.c | 172 +++++++++++++++++++++++ include/fx.h | 50 ++++++- 4 files changed, 236 insertions(+), 382 deletions(-) delete mode 100644 arm9/asm/FX_mtx44.s create mode 100644 arm9/lib/src/FX_mtx44.c 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 -- cgit v1.2.3 From 8cd2ae6b66d4e2b2d5dbbf4e54f5a21cb21d7ebf Mon Sep 17 00:00:00 2001 From: Made Date: Mon, 4 May 2020 15:57:14 +0200 Subject: Decompile FX_mtx43.s --- arm9/asm/FX_mtx43.s | 523 ------------------------------------------------ arm9/lib/src/FX_mtx43.c | 207 +++++++++++++++++++ include/fx.h | 12 ++ 3 files changed, 219 insertions(+), 523 deletions(-) delete mode 100644 arm9/asm/FX_mtx43.s create mode 100644 arm9/lib/src/FX_mtx43.c diff --git a/arm9/asm/FX_mtx43.s b/arm9/asm/FX_mtx43.s deleted file mode 100644 index 601bf236..00000000 --- a/arm9/asm/FX_mtx43.s +++ /dev/null @@ -1,523 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .text - - arm_func_start MTX_Identity43_ -MTX_Identity43_: ; 0x020C426C - mov r2, #0x1000 - mov r3, #0x0 - stmia r0!, {r2-r3} - mov r1, #0x0 - stmia r0!, {r1,r3} - stmia r0!, {r2-r3} - stmia r0!, {r1,r3} - stmia r0!, {r2-r3} - stmia r0!, {r1,r3} - bx lr - - arm_func_start MTX_Copy43To44_ -MTX_Copy43To44_: ; 0x020C4294 - stmdb sp!, {r4} - mov r12, #0x0 - ldmia r0!, {r2-r4} - stmia r1!, {r2-r4,r12} - ldmia r0!, {r2-r4} - stmia r1!, {r2-r4,r12} - ldmia r0!, {r2-r4} - stmia r1!, {r2-r4,r12} - mov r12, #0x1000 - ldmia r0!, {r2-r4} - stmia r1!, {r2-r4,r12} - ldmia sp!, {r4} - bx lr - - thumb_func_start MTX_Scale43_ -MTX_Scale43_: ; 0x020C42C8 - stmia r0!, {r1} - mov r1, #0x0 - str r3, [r0, #0x1c] - mov r3, #0x0 - stmia r0!, {r1,r3} - stmia r0!, {r1-r3} - mov r2, #0x0 - stmia r0!, {r1,r3} - add r0, #0x4 - stmia r0!, {r1-r3} - bx lr - .balign 4 - - thumb_func_start MTX_RotX43_ -MTX_RotX43_: ; 0x020C42E0 - str r1, [r0, #0x14] - neg r1, r1 - str r1, [r0, #0x1c] - mov r1, #0x1 - lsl r1, r1, #0xc - stmia r0!, {r1} - mov r3, #0x0 - mov r1, #0x0 - stmia r0!, {r1,r3} - stmia r0!, {r1-r2} - str r1, [r0, #0x4] - add r0, #0xc - stmia r0!, {r2-r3} - stmia r0!, {r1,r3} - bx lr - .balign 4 - - thumb_func_start MTX_RotY43_ -MTX_RotY43_: ; 0x020C4300 - str r1, [r0, #0x18] - mov r3, #0x0 - stmia r0!, {r2-r3} - neg r1, r1 - stmia r0!, {r1,r3} - mov r1, #0x1 - lsl r1, r1, #0xc - stmia r0!, {r1,r3} - add r0, #0x4 - mov r1, #0x0 - stmia r0!, {r1-r3} - stmia r0!, {r1,r3} - bx lr - .balign 4 - - arm_func_start MTX_MultVec43 -MTX_MultVec43: ; 0x020C431C - stmdb sp!, {r4-r6,lr} - ldr r12, [r0, #0x4] - ldr r4, [r1, #0xc] - ldr r3, [r0, #0x0] - smull r6, r5, r12, r4 - ldr r4, [r1, #0x0] - ldr r0, [r0, #0x8] - smlal r6, r5, r3, r4 - ldr r4, [r1, #0x18] - smlal r6, r5, r0, r4 - mov r4, r6, lsr #0xc - orr r4, r4, r5, lsl #0x14 - str r4, [r2, #0x0] - ldr r5, [r2, #0x0] - ldr r4, [r1, #0x24] - add r4, r5, r4 - str r4, [r2, #0x0] - ldr r4, [r1, #0x10] - ldr r5, [r1, #0x4] - smull r6, lr, r12, r4 - smlal r6, lr, r3, r5 - ldr r4, [r1, #0x1c] - smlal r6, lr, r0, r4 - mov r4, r6, lsr #0xc - orr r4, r4, lr, lsl #0x14 - str r4, [r2, #0x4] - ldr r5, [r2, #0x4] - ldr r4, [r1, #0x28] - add r4, r5, r4 - str r4, [r2, #0x4] - ldr lr, [r1, #0x14] - ldr r4, [r1, #0x8] - smull r5, lr, r12, lr - smlal r5, lr, r3, r4 - ldr r3, [r1, #0x20] - smlal r5, lr, r0, r3 - mov r0, r5, lsr #0xc - orr r0, r0, lr, lsl #0x14 - str r0, [r2, #0x8] - ldr r3, [r2, #0x8] - ldr r0, [r1, #0x2c] - add r0, r3, r0 - str r0, [r2, #0x8] - ldmia sp!, {r4-r6,lr} - bx lr - - arm_func_start MTX_Concat43 -MTX_Concat43: ; 0x020C43D0 - stmdb sp!, {r4-r10,lr} - sub sp, sp, #0x30 - ldr r5, [r0, #0x4] - ldr r3, [r1, #0xc] - mov r12, r2 - smull r8, r7, r5, r3 - ldr r6, [r0, #0x0] - ldr r3, [r1, #0x0] - cmp r12, r1 - smlal r8, r7, r6, r3 - ldr r4, [r0, #0x8] - ldr r3, [r1, #0x18] - addeq r2, sp, #0x0 - smlal r8, r7, r4, r3 - mov r3, r8, lsr #0xc - orr r3, r3, r7, lsl #0x14 - str r3, [r2, #0x0] - ldr r3, [r1, #0x10] - ldr r7, [r1, #0x4] - smull r9, r8, r5, r3 - smlal r9, r8, r6, r7 - ldr r3, [r1, #0x1c] - add lr, sp, #0x0 - smlal r9, r8, r4, r3 - mov r3, r9, lsr #0xc - orr r3, r3, r8, lsl #0x14 - str r3, [r2, #0x4] - ldr r3, [r1, #0x14] - ldr r7, [r1, #0x8] - smull r9, r8, r5, r3 - smlal r9, r8, r6, r7 - ldr r6, [r1, #0x20] - smlal r9, r8, r4, r6 - mov r4, r9, lsr #0xc - orr r4, r4, r8, lsl #0x14 - str r4, [r2, #0x8] - ldr r4, [r0, #0x10] - ldr r5, [r0, #0xc] - smull r9, r8, r4, r3 - smlal r9, r8, r5, r7 - ldr r3, [r0, #0x14] - smlal r9, r8, r3, r6 - mov r6, r9, lsr #0xc - orr r6, r6, r8, lsl #0x14 - str r6, [r2, #0x14] - ldr r6, [r1, #0x10] - ldr r7, [r1, #0x4] - smull r9, r8, r4, r6 - smlal r9, r8, r5, r7 - ldr r6, [r1, #0x1c] - smlal r9, r8, r3, r6 - mov r6, r9, lsr #0xc - orr r6, r6, r8, lsl #0x14 - str r6, [r2, #0x10] - ldr r7, [r1, #0xc] - ldr r8, [r1, #0x0] - smull r10, r9, r4, r7 - smlal r10, r9, r5, r8 - ldr r6, [r1, #0x18] - smlal r10, r9, r3, r6 - mov r3, r10, lsr #0xc - orr r3, r3, r9, lsl #0x14 - str r3, [r2, #0xc] - ldr r4, [r0, #0x1c] - ldr r5, [r0, #0x18] - smull r9, r7, r4, r7 - smlal r9, r7, r5, r8 - ldr r3, [r0, #0x20] - smlal r9, r7, r3, r6 - mov r6, r9, lsr #0xc - orr r6, r6, r7, lsl #0x14 - str r6, [r2, #0x18] - ldr r6, [r1, #0x10] - ldr r7, [r1, #0x4] - smull r9, r6, r4, r6 - smlal r9, r6, r5, r7 - ldr r8, [r1, #0x1c] - smlal r9, r6, r3, r8 - mov r7, r9, lsr #0xc - orr r7, r7, r6, lsl #0x14 - str r7, [r2, #0x1c] - ldr r7, [r1, #0x14] - ldr r6, [r1, #0x8] - smull r9, r8, r4, r7 - smlal r9, r8, r5, r6 - ldr r5, [r1, #0x20] - smlal r9, r8, r3, r5 - mov r3, r9, lsr #0xc - orr r3, r3, r8, lsl #0x14 - str r3, [r2, #0x20] - ldr r4, [r0, #0x28] - ldr r3, [r0, #0x24] - smull r8, r7, r4, r7 - smlal r8, r7, r3, r6 - ldr r0, [r0, #0x2c] - ldr r6, [r1, #0x2c] - smlal r8, r7, r0, r5 - mov r5, r8, lsr #0xc - orr r5, r5, r7, lsl #0x14 - adds r5, r6, r5 - str r5, [r2, #0x2c] - ldr r5, [r1, #0x10] - ldr r6, [r1, #0x4] - smull r8, r5, r4, r5 - smlal r8, r5, r3, r6 - ldr r7, [r1, #0x1c] - ldr r9, [r1, #0x28] - smlal r8, r5, r0, r7 - mov r6, r8, lsr #0xc - orr r6, r6, r5, lsl #0x14 - adds r5, r9, r6 - str r5, [r2, #0x28] - ldr r8, [r1, #0x24] - ldr r6, [r1, #0x18] - ldr r5, [r1, #0x0] - ldr r1, [r1, #0xc] - smull r7, r1, r4, r1 - smlal r7, r1, r3, r5 - smlal r7, r1, r0, r6 - mov r0, r7, lsr #0xc - orr r0, r0, r1, lsl #0x14 - adds r0, r8, r0 - cmp r2, lr - str r0, [r2, #0x24] - addne sp, sp, #0x30 - ldmneia sp!, {r4-r10,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} - add sp, sp, #0x30 - ldmia sp!, {r4-r10,lr} - bx lr - - arm_func_start MTX_Inverse43 -MTX_Inverse43: ; 0x020C45F0 - stmdb sp!, {r4-r11,lr} - sub sp, sp, #0x5c - mov r10, r0 - ldr r11, [r10, #0x14] - cmp r10, r1 - addeq r9, sp, #0x2c - ldr r3, [r10, #0x18] - ldr r2, [r10, #0xc] - ldr r8, [r10, #0x20] - str r1, [sp, #0x0] - movne r9, r1 - smull r7, r5, r2, r8 - smull r6, r1, r11, r3 - ldr r4, [r10, #0x1c] - subs r12, r7, r6 - ldr r0, [r10, #0x10] - smull r6, lr, r11, r4 - sbc r11, r5, r1 - smull r5, r4, r2, r4 - mov r1, #0x800 - smull r8, r7, r0, r8 - smull r3, r2, r0, r3 - adds r12, r12, r1 - adc r0, r11, #0x0 - subs r8, r8, r6 - sbc r6, r7, lr - adds r7, r8, r1 - adc r11, r6, #0x0 - mov r7, r7, lsr #0xc - mov r8, r12, lsr #0xc - orr r7, r7, r11, lsl #0x14 - orr r8, r8, r0, lsl #0x14 - subs r0, r5, r3 - sbc r12, r4, r2 - ldr r6, [r10, #0x4] - ldr r11, [r10, #0x0] - smull r3, r2, r6, r8 - adds r0, r0, r1 - smull r5, r4, r11, r7 - adc r11, r12, #0x0 - mov r6, r0, lsr #0xc - subs r3, r5, r3 - ldr r0, [r10, #0x8] - orr r6, r6, r11, lsl #0x14 - sbc r2, r4, r2 - smlal r3, r2, r0, r6 - adds r0, r3, r1 - mov r1, r8, asr #0x1f - str r1, [sp, #0x4] - mov r1, r7, asr #0x1f - str r1, [sp, #0x8] - mov r1, r6, asr #0x1f - adc r2, r2, #0x0 - mov r0, r0, lsr #0xc - orrs r0, r0, r2, lsl #0x14 - str r1, [sp, #0xc] - addeq sp, sp, #0x5c - mvneq r0, #0x0 - ldmeqia sp!, {r4-r11,lr} - bxeq lr - bl FX_InvAsync - ldr r1, [r10, #0x8] - ldr r2, [r10, #0x1c] - ldr r11, [r10, #0x10] - smull r0, r4, r2, r1 - smull r3, r2, r11, r1 - ldr r5, [r10, #0x18] - str r2, [sp, #0x18] - str r3, [sp, #0x14] - smull r3, r2, r5, r1 - str r2, [sp, #0x20] - ldr r2, [r10, #0x20] - ldr lr, [r10, #0x4] - str r2, [sp, #0x10] - ldr r5, [sp, #0x10] - str r3, [sp, #0x1c] - smull r12, r5, lr, r5 - subs r0, r12, r0 - ldr r2, [r10, #0xc] - sbc r4, r5, r4 - smull r1, r5, r2, r1 - str r5, [sp, #0x28] - mov r5, r0, lsr #0xc - ldr r11, [r10, #0x14] - orr r5, r5, r4, lsl #0x14 - smull r4, r2, lr, r11 - ldr r0, [sp, #0x14] - ldr r3, [r10, #0x0] - subs r4, r4, r0 - ldr r0, [sp, #0x18] - mov r4, r4, lsr #0xc - sbc r0, r2, r0 - orr r4, r4, r0, lsl #0x14 - ldr r0, [sp, #0x10] - ldr r2, [sp, #0x1c] - smull r12, r0, r3, r0 - subs r2, r12, r2 - ldr r12, [sp, #0x20] - sbc r0, r0, r12 - smull r12, r11, r3, r11 - ldr r3, [sp, #0x28] - subs r1, r12, r1 - sbc r3, r11, r3 - mov r11, r2, lsr #0xc - orr r11, r11, r0, lsl #0x14 - mov r0, r1, lsr #0xc - str r0, [sp, #0x24] - orr r0, r0, r3, lsl #0x14 - str r0, [sp, #0x24] - bl FX_GetDivResult - smull r2, r1, r0, r5 - mov r2, r2, lsr #0xc - orr r2, r2, r1, lsl #0x14 - rsb lr, r2, #0x0 - smull r2, r1, r0, r4 - mov r4, r2, lsr #0xc - orr r4, r4, r1, lsl #0x14 - smull r2, r1, r0, r11 - mov r3, r2, lsr #0xc - orr r3, r3, r1, lsl #0x14 - ldr r1, [sp, #0x24] - umull r11, r5, r0, r7 - smull r2, r1, r0, r1 - mov r2, r2, lsr #0xc - orr r2, r2, r1, lsl #0x14 - ldr r1, [sp, #0x8] - mov r12, r0, asr #0x1f - mla r5, r0, r1, r5 - mla r5, r12, r7, r5 - mov r1, r11, lsr #0xc - orr r1, r1, r5, lsl #0x14 - str r1, [r9, #0x0] - str lr, [r9, #0x4] - str r4, [r9, #0x8] - ldr r1, [sp, #0x4] - umull r5, r4, r0, r8 - mla r4, r0, r1, r4 - mla r4, r12, r8, r4 - mov r1, r5, lsr #0xc - orr r1, r1, r4, lsl #0x14 - rsb r1, r1, #0x0 - str r1, [r9, #0xc] - ldr r1, [sp, #0xc] - rsb r2, r2, #0x0 - str r3, [r9, #0x10] - str r2, [r9, #0x14] - umull r3, r2, r0, r6 - mla r2, r0, r1, r2 - mla r2, r12, r6, r2 - mov r1, r3, lsr #0xc - orr r1, r1, r2, lsl #0x14 - str r1, [r9, #0x18] - ldr r3, [r10, #0x0] - ldr r1, [r10, #0x1c] - ldr r2, [r10, #0x18] - smull r5, r4, r3, r1 - ldr r1, [r10, #0x4] - smull r3, r1, r2, r1 - subs r2, r5, r3 - sbc r1, r4, r1 - mov r2, r2, lsr #0xc - orr r2, r2, r1, lsl #0x14 - smull r2, r1, r0, r2 - mov r2, r2, lsr #0xc - orr r2, r2, r1, lsl #0x14 - rsb r1, r2, #0x0 - str r1, [r9, #0x1c] - ldr r3, [r10, #0x0] - ldr r1, [r10, #0x10] - ldr r2, [r10, #0xc] - smull r5, r4, r3, r1 - ldr r1, [r10, #0x4] - smull r3, r1, r2, r1 - subs r2, r5, r3 - sbc r1, r4, r1 - mov r2, r2, lsr #0xc - orr r2, r2, r1, lsl #0x14 - smull r2, r1, r0, r2 - mov r0, r2, lsr #0xc - orr r0, r0, r1, lsl #0x14 - str r0, [r9, #0x20] - add r0, sp, #0x2c - ldr r2, [r9, #0xc] - ldr r1, [r10, #0x28] - ldr r4, [r9, #0x0] - smull r7, r1, r2, r1 - ldr r3, [r10, #0x24] - ldr r6, [r9, #0x18] - smlal r7, r1, r4, r3 - ldr r5, [r10, #0x2c] - cmp r9, r0 - smlal r7, r1, r6, r5 - mov r2, r7, lsr #0xc - orr r2, r2, r1, lsl #0x14 - rsb r1, r2, #0x0 - str r1, [r9, #0x24] - ldr r2, [r9, #0x10] - ldr r1, [r10, #0x28] - ldr r4, [r9, #0x4] - smull r7, r1, r2, r1 - ldr r3, [r10, #0x24] - ldr r6, [r9, #0x1c] - smlal r7, r1, r4, r3 - ldr r5, [r10, #0x2c] - smlal r7, r1, r6, r5 - mov r2, r7, lsr #0xc - orr r2, r2, r1, lsl #0x14 - rsb r1, r2, #0x0 - str r1, [r9, #0x28] - ldr r1, [r10, #0x28] - ldr r2, [r9, #0x14] - ldr r4, [r9, #0x8] - smull r7, r1, r2, r1 - ldr r3, [r10, #0x24] - ldr r6, [r9, #0x20] - smlal r7, r1, r4, r3 - ldr r5, [r10, #0x2c] - smlal r7, r1, r6, r5 - mov r2, r7, lsr #0xc - orr r2, r2, r1, lsl #0x14 - rsb r1, r2, #0x0 - str r1, [r9, #0x2c] - bne _020C4974 - ldr r1, [sp, #0x0] - bl MI_Copy48B -_020C4974: - mov r0, #0x0 - add sp, sp, #0x5c - ldmia sp!, {r4-r11,lr} - bx lr - - arm_func_start MTX_ScaleApply43 -MTX_ScaleApply43: ; 0x020C4984 - stmdb sp!, {r4-r5,lr} - sub sp, sp, #0x4 - ldr r12, [sp, #0x10] - mov r5, r0 - str r12, [sp, #0x0] - mov r4, r1 - bl MTX_ScaleApply33 - ldr r0, [r5, #0x24] - str r0, [r4, #0x24] - ldr r0, [r5, #0x28] - str r0, [r4, #0x28] - ldr r0, [r5, #0x2c] - str r0, [r4, #0x2c] - add sp, sp, #0x4 - ldmia sp!, {r4-r5,lr} - bx lr diff --git a/arm9/lib/src/FX_mtx43.c b/arm9/lib/src/FX_mtx43.c new file mode 100644 index 00000000..c5d227b8 --- /dev/null +++ b/arm9/lib/src/FX_mtx43.c @@ -0,0 +1,207 @@ +#include "global.h" +#include "main.h" +#include "fx.h" + + + + + +void MTX_ScaleApply43(struct Mtx43 *mtx, struct Mtx43 *dst, s32 x, s32 y, s32 z){ + //this works because matrices are indexed columns first + MTX_ScaleApply33((struct Mtx33 *)mtx, (struct Mtx33 *)dst, x, y, z); + dst->_[9] = mtx->_[9]; + dst->_[10] = mtx->_[10]; + dst->_[11] = mtx->_[11]; +} + +s32 MTX_Inverse43(struct Mtx43 *mtx, struct Mtx43 *inv){ + struct Mtx43 tempmat; + struct Mtx43 *dst; + s32 det0, det1, det2, det; + s32 var0, var1, var2, var3; + if (mtx == inv) + dst = &tempmat; + else + dst = inv; + //subdeterminants + det0 = ((s64)mtx->_[4] * mtx->_[8] - (s64)mtx->_[5] * mtx->_[7] + (s64)(1 << (FX32_INT_SHIFT - 1))) >> FX32_INT_SHIFT; + det1 = ((s64)mtx->_[3] * mtx->_[8] - (s64)mtx->_[5] * mtx->_[6] + (s64)(1 << (FX32_INT_SHIFT - 1))) >> FX32_INT_SHIFT; + det2 = ((s64)mtx->_[3] * mtx->_[7] - (s64)mtx->_[4] * mtx->_[6] + (s64)(1 << (FX32_INT_SHIFT - 1))) >> FX32_INT_SHIFT; + //matrix determinant + det = ((s64)mtx->_[0] * det0 - (s64)mtx->_[1] * det1 + (s64)mtx->_[2] * det2 + (s64)(1 << (FX32_INT_SHIFT - 1))) >> FX32_INT_SHIFT; + + if (det == 0) + return -1; //not invertible + + FX_InvAsync(det); + + var0 = ((s64)mtx->_[1] * mtx->_[8] - (s64)mtx->_[7] * mtx->_[2]) >> FX32_INT_SHIFT; + var1 = ((s64)mtx->_[1] * mtx->_[5] - (s64)mtx->_[4] * mtx->_[2]) >> FX32_INT_SHIFT; + var2 = ((s64)mtx->_[0] * mtx->_[8] - (s64)mtx->_[6] * mtx->_[2]) >> FX32_INT_SHIFT; + var3 = ((s64)mtx->_[0] * mtx->_[5] - (s64)mtx->_[3] * mtx->_[2]) >> FX32_INT_SHIFT; + + s32 ret = FX_GetDivResult(); + dst->_[0] = (s32)(((s64)ret * det0) >> FX32_INT_SHIFT); + dst->_[1] = -(s32)(((s64)ret * var0) >> FX32_INT_SHIFT); + dst->_[2] = (s32)(((s64)ret * var1) >> FX32_INT_SHIFT); + dst->_[3] = -(s32)(((s64)ret * det1) >> FX32_INT_SHIFT); + dst->_[4] = (s32)(((s64)ret * var2) >> FX32_INT_SHIFT); + dst->_[5] = -(s32)(((s64)ret * var3) >> FX32_INT_SHIFT); + + dst->_[6] = (s32)(((s64)ret * det2) >> FX32_INT_SHIFT); + s32 temp = (s32)(((s64)mtx->_[0] * mtx->_[7] - (s64)mtx->_[6] * mtx->_[1]) >> FX32_INT_SHIFT); + dst->_[7] = -(s32)(((s64)ret * temp) >> FX32_INT_SHIFT); + s32 temp1 = (s32)(((s64)mtx->_[0] * mtx->_[4] - (s64)mtx->_[3] * mtx->_[1]) >> FX32_INT_SHIFT); + dst->_[8] = (s32)(((s64)ret * temp1) >> FX32_INT_SHIFT); + dst->_[9] = -(s32)(((s64)dst->_[0] * mtx->_[9] + (s64)dst->_[3] * mtx->_[10] + (s64)dst->_[6] * mtx->_[11]) >> FX32_INT_SHIFT); + dst->_[10] = -(s32)(((s64)dst->_[1] * mtx->_[9] + (s64)dst->_[4] * mtx->_[10] + (s64)dst->_[7] * mtx->_[11]) >> FX32_INT_SHIFT); + dst->_[11] = -(s32)(((s64)dst->_[2] * mtx->_[9] + (s64)dst->_[5] * mtx->_[10] + (s64)dst->_[8] * mtx->_[11]) >> FX32_INT_SHIFT); + + if (dst == &tempmat) + MI_Copy48B(&tempmat, inv); + return 0; +} + +void MTX_Concat43(struct Mtx43 *a, struct Mtx43 *b, struct Mtx43 *c){ + struct Mtx43 temp; + struct Mtx43 *dst; + s32 a0, a1, a2; + s32 b0, b1, b2; + + if (c == b) + dst = &temp; + else + dst = c; + + a0 = a->_[0]; + a1 = a->_[1]; + a2 = a->_[2]; + dst->_[0] = (((s64)a0 * b->_[0] + (s64)a1 * b->_[3] + (s64)a2 * b->_[6] ) >> FX32_INT_SHIFT); + dst->_[1] = (((s64)a0 * b->_[1] + (s64)a1 * b->_[4] + (s64)a2 * b->_[7] ) >> FX32_INT_SHIFT); + b0 = b->_[2]; + b1 = b->_[5]; + b2 = b->_[8]; + dst->_[2] = (((s64)a0 * b0 + (s64)a1 * b1 + (s64)a2 * b2) >> FX32_INT_SHIFT); + a0 = a->_[3]; + a1 = a->_[4]; + a2 = a->_[5]; + dst->_[5] = (((s64)a0 * b0 + (s64)a1 * b1 + (s64)a2 * b2) >> FX32_INT_SHIFT); + dst->_[4] = (((s64)a0 * b->_[1] + (s64)a1 * b->_[4] + (s64)a2 * b->_[7] ) >> FX32_INT_SHIFT); + b0 = b->_[0]; + b1 = b->_[3]; + b2 = b->_[6]; + dst->_[3] = (((s64)a0 * b0 + (s64)a1 * b1 + (s64)a2 * b2) >> FX32_INT_SHIFT); + a0 = a->_[6]; + a1 = a->_[7]; + a2 = a->_[8]; + dst->_[6] = (((s64)a0 * b0 + (s64)a1 * b1 + (s64)a2 * b2) >> FX32_INT_SHIFT); + dst->_[7] = (((s64)a0 * b->_[1] + (s64)a1 * b->_[4] + (s64)a2 * b->_[7] ) >> FX32_INT_SHIFT); + b0 = b->_[2]; + b1 = b->_[5]; + b2 = b->_[8]; + dst->_[8] = (((s64)a0 * b0 + (s64)a1 * b1 + (s64)a2 * b2) >> FX32_INT_SHIFT); + a0 = a->_[9]; + a1 = a->_[10]; + a2 = a->_[11]; + dst->_[11] = ((((s64)a0 * b0 + (s64)a1 * b1 + (s64)a2 * b2) >> FX32_INT_SHIFT) + b->_[11]); + dst->_[10] = ((((s64)a0 * b->_[1] + (s64)a1 * b->_[4] + (s64)a2 * b->_[7]) >> FX32_INT_SHIFT) + b->_[10]); + dst->_[9] = ((((s64)a0 * b->_[0] + (s64)a1 * b->_[3] + (s64)a2 * b->_[6]) >> FX32_INT_SHIFT) + b->_[9]); + if (dst == &temp) + *c = temp; +} + +void MTX_MultVec43(struct Vecx32 *vec, struct Mtx43 *mtx, struct Vecx32 *dst){ + s32 x, y, z; + x = vec->x; + y = vec->y; + z = vec->z; + dst->x = ((s64)x * mtx->_[0] + (s64)y * mtx->_[3] + (s64)z * mtx->_[6]) >> FX32_INT_SHIFT; + dst->x += mtx->_[9]; + dst->y = ((s64)x * mtx->_[1] + (s64)y * mtx->_[4] + (s64)z * mtx->_[7]) >> FX32_INT_SHIFT; + dst->y += mtx->_[10]; + dst->z = ((s64)x * mtx->_[2] + (s64)y * mtx->_[5] + (s64)z * mtx->_[8]) >> FX32_INT_SHIFT; + dst->z += mtx->_[11]; +} + +asm void MTX_Identity43_(struct Mtx43 *mtx){ + mov r2, #0x1000 + mov r3, #0x0 + stmia r0!, {r2-r3} + mov r1, #0x0 + stmia r0!, {r1,r3} + stmia r0!, {r2-r3} + stmia r0!, {r1,r3} + stmia r0!, {r2-r3} + stmia r0!, {r1,r3} + bx lr +} + +asm void MTX_Copy43To44_(struct Mtx43 *src, struct Mtx44 *dst){ + stmdb sp!, {r4} + mov r12, #0x0 + ldmia r0!, {r2-r4} + stmia r1!, {r2-r4,r12} + ldmia r0!, {r2-r4} + stmia r1!, {r2-r4,r12} + ldmia r0!, {r2-r4} + stmia r1!, {r2-r4,r12} + mov r12, #0x1000 + ldmia r0!, {r2-r4} + stmia r1!, {r2-r4,r12} + ldmia sp!, {r4} + bx lr +} + +#pragma thumb on +asm void MTX_Scale43_(struct Mtx43 *dst, s32 x, s32 y, s32 z){ + stmia r0!, {r1} + mov r1, #0x0 + str r3, [r0, #0x1c] + mov r3, #0x0 + stmia r0!, {r1,r3} + stmia r0!, {r1-r3} + mov r2, #0x0 + stmia r0!, {r1,r3} + add r0, #0x4 + stmia r0!, {r1-r3} + bx lr +} +#pragma thumb off + +#pragma thumb on +asm void MTX_RotX43_(struct Mtx43 *mtx, s32 sinphi, s32 cosphi){ + str r1, [r0, #0x14] + neg r1, r1 + str r1, [r0, #0x1c] + mov r1, #0x1 + lsl r1, r1, #0xc + stmia r0!, {r1} + mov r3, #0x0 + mov r1, #0x0 + stmia r0!, {r1,r3} + stmia r0!, {r1-r2} + str r1, [r0, #0x4] + add r0, #0xc + stmia r0!, {r2-r3} + stmia r0!, {r1,r3} + bx lr +} +#pragma thumb off + +#pragma thumb on +asm void MTX_RotY43_(struct Mtx43 *mtx, s32 sinphi, s32 cosphi){ + str r1, [r0, #0x18] + mov r3, #0x0 + stmia r0!, {r2-r3} + neg r1, r1 + stmia r0!, {r1,r3} + mov r1, #0x1 + lsl r1, r1, #0xc + stmia r0!, {r1,r3} + add r0, #0x4 + mov r1, #0x0 + stmia r0!, {r1-r3} + stmia r0!, {r1,r3} + bx lr +} +#pragma thumb off diff --git a/include/fx.h b/include/fx.h index 1e9eb291..ee436883 100644 --- a/include/fx.h +++ b/include/fx.h @@ -73,6 +73,7 @@ struct Vecx16 s16 z; }; +//Matrices are indexed as [column][row] struct Mtx44 { s32 _[16]; @@ -138,5 +139,16 @@ 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); +//Mtx43 +void MTX_ScaleApply33(struct Mtx33 *mtx, struct Mtx33 *dst, s32 x, s32 y, s32 z); +s32 MTX_Inverse43(struct Mtx43 *mtx, struct Mtx43 *inv); +void MTX_Concat43(struct Mtx43 *a, struct Mtx43 *b, struct Mtx43 *c); +void MTX_MultVec43(struct Vecx32 *vec, struct Mtx43 *mtx, struct Vecx32 *dst); +void MTX_Identity43_(struct Mtx43 *mtx); +void MTX_Copy43To44_(struct Mtx43 *src, struct Mtx44 *dst); +void MTX_Scale43_(struct Mtx43 *dst, s32 x, s32 y, s32 z); +void MTX_RotX43_(struct Mtx43 *mtx, s32 sinphi, s32 cosphi); +void MTX_RotY43_(struct Mtx43 *mtx, s32 sinphi, s32 cosphi); + #endif //GUARD_FX_H -- cgit v1.2.3 From 8edaffd4aaddac79b3d15148783a74fa508c3edc Mon Sep 17 00:00:00 2001 From: Made Date: Mon, 4 May 2020 16:36:36 +0200 Subject: Decompile FX_mtx33.s --- arm9/asm/FX_mtx33.s | 259 ------------------------------------------------ arm9/lib/src/FX_mtx33.c | 135 +++++++++++++++++++++++++ arm9/lib/src/FX_mtx43.c | 3 - include/fx.h | 13 ++- 4 files changed, 147 insertions(+), 263 deletions(-) delete mode 100644 arm9/asm/FX_mtx33.s create mode 100644 arm9/lib/src/FX_mtx33.c diff --git a/arm9/asm/FX_mtx33.s b/arm9/asm/FX_mtx33.s deleted file mode 100644 index 2b31fd6c..00000000 --- a/arm9/asm/FX_mtx33.s +++ /dev/null @@ -1,259 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .text - - arm_func_start MTX_Identity33_ -MTX_Identity33_: ; 0x020C3F14 - mov r2, #0x1000 - str r2, [r0, #0x20] - mov r3, #0x0 - stmia r0!, {r2-r3} - mov r1, #0x0 - stmia r0!, {r1,r3} - stmia r0!, {r2-r3} - stmia r0!, {r1,r3} - bx lr - - thumb_func_start MTX_RotX33_ -MTX_RotX33_: ; 0x020C3F38 - mov r3, #0x1 - lsl r3, r3, #0xc - str r3, [r0, #0x0] - mov r3, #0x0 - str r3, [r0, #0x4] - str r3, [r0, #0x8] - str r3, [r0, #0xc] - str r2, [r0, #0x10] - str r1, [r0, #0x14] - str r3, [r0, #0x18] - neg r1, r1 - str r1, [r0, #0x1c] - str r2, [r0, #0x20] - bx lr - - thumb_func_start MTX_RotY33_ -MTX_RotY33_: ; 0x020C3F54 - str r2, [r0, #0x0] - str r2, [r0, #0x20] - mov r3, #0x0 - str r3, [r0, #0x4] - str r3, [r0, #0xc] - str r3, [r0, #0x14] - str r3, [r0, #0x1c] - neg r2, r1 - mov r3, #0x1 - lsl r3, r3, #0xc - str r1, [r0, #0x18] - str r2, [r0, #0x8] - str r3, [r0, #0x10] - bx lr - - thumb_func_start MTX_RotZ33_ -MTX_RotZ33_: ; 0x020C3F70 - stmia r0!, {r2} - mov r3, #0x0 - stmia r0!, {r1,r3} - neg r1, r1 - stmia r0!, {r1-r2} - mov r1, #0x1 - lsl r1, r1, #0xc - str r3, [r0, #0x0] - str r3, [r0, #0x4] - str r3, [r0, #0x8] - str r1, [r0, #0xc] - bx lr - - arm_func_start MTX_MultVec33 -MTX_MultVec33: ; 0x020C3F88 - stmdb sp!, {r4-r6,lr} - ldr r12, [r0, #0x4] - ldr r4, [r1, #0xc] - ldr r3, [r0, #0x0] - smull r6, r5, r12, r4 - ldr r4, [r1, #0x0] - ldr r0, [r0, #0x8] - smlal r6, r5, r3, r4 - ldr r4, [r1, #0x18] - smlal r6, r5, r0, r4 - mov r4, r6, lsr #0xc - orr r4, r4, r5, lsl #0x14 - str r4, [r2, #0x0] - ldr r4, [r1, #0x10] - ldr r5, [r1, #0x4] - smull r6, lr, r12, r4 - smlal r6, lr, r3, r5 - ldr r4, [r1, #0x1c] - smlal r6, lr, r0, r4 - mov r4, r6, lsr #0xc - orr r4, r4, lr, lsl #0x14 - str r4, [r2, #0x4] - ldr lr, [r1, #0x14] - ldr r4, [r1, #0x8] - smull r5, lr, r12, lr - smlal r5, lr, r3, r4 - ldr r1, [r1, #0x20] - smlal r5, lr, r0, r1 - mov r0, r5, lsr #0xc - orr r0, r0, lr, lsl #0x14 - str r0, [r2, #0x8] - ldmia sp!, {r4-r6,lr} - bx lr - - arm_func_start MTX_Concat33 -MTX_Concat33: ; 0x020C400C - stmdb sp!, {r4-r9,lr} - sub sp, sp, #0x24 - ldr r5, [r0, #0x4] - ldr r3, [r1, #0xc] - mov r12, r2 - smull r8, r7, r5, r3 - ldr r6, [r0, #0x0] - ldr r3, [r1, #0x0] - cmp r12, r1 - smlal r8, r7, r6, r3 - ldr r4, [r0, #0x8] - ldr r3, [r1, #0x18] - addeq r2, sp, #0x0 - smlal r8, r7, r4, r3 - mov r3, r8, lsr #0xc - orr r3, r3, r7, lsl #0x14 - str r3, [r2, #0x0] - ldr r3, [r1, #0x10] - ldr r7, [r1, #0x4] - smull r9, r8, r5, r3 - smlal r9, r8, r6, r7 - ldr r3, [r1, #0x1c] - add lr, sp, #0x0 - smlal r9, r8, r4, r3 - mov r3, r9, lsr #0xc - orr r3, r3, r8, lsl #0x14 - str r3, [r2, #0x4] - ldr r3, [r1, #0x14] - ldr r7, [r1, #0x8] - smull r9, r8, r5, r3 - smlal r9, r8, r6, r7 - ldr r6, [r1, #0x20] - cmp r2, lr - smlal r9, r8, r4, r6 - mov r4, r9, lsr #0xc - orr r4, r4, r8, lsl #0x14 - str r4, [r2, #0x8] - ldr r4, [r0, #0x10] - ldr r5, [r0, #0xc] - smull r9, r8, r4, r3 - smlal r9, r8, r5, r7 - ldr r3, [r0, #0x14] - addne sp, sp, #0x24 - smlal r9, r8, r3, r6 - mov r6, r9, lsr #0xc - orr r6, r6, r8, lsl #0x14 - str r6, [r2, #0x14] - ldr r6, [r1, #0x10] - ldr r7, [r1, #0x4] - smull r9, r8, r4, r6 - smlal r9, r8, r5, r7 - ldr r6, [r1, #0x1c] - smlal r9, r8, r3, r6 - mov r6, r9, lsr #0xc - orr r6, r6, r8, lsl #0x14 - str r6, [r2, #0x10] - ldr r7, [r1, #0xc] - ldr r6, [r1, #0x0] - smull r9, r8, r4, r7 - smlal r9, r8, r5, r6 - ldr r5, [r1, #0x18] - smlal r9, r8, r3, r5 - mov r3, r9, lsr #0xc - orr r3, r3, r8, lsl #0x14 - str r3, [r2, #0xc] - ldr r4, [r0, #0x1c] - ldr r3, [r0, #0x18] - smull r8, r7, r4, r7 - smlal r8, r7, r3, r6 - ldr r0, [r0, #0x20] - smlal r8, r7, r0, r5 - mov r5, r8, lsr #0xc - orr r5, r5, r7, lsl #0x14 - str r5, [r2, #0x18] - ldr r5, [r1, #0x10] - ldr r6, [r1, #0x4] - smull r8, r5, r4, r5 - smlal r8, r5, r3, r6 - ldr r7, [r1, #0x1c] - smlal r8, r5, r0, r7 - mov r6, r8, lsr #0xc - orr r6, r6, r5, lsl #0x14 - str r6, [r2, #0x1c] - ldr r6, [r1, #0x20] - ldr r5, [r1, #0x8] - ldr r1, [r1, #0x14] - smull r7, r1, r4, r1 - smlal r7, r1, r3, r5 - smlal r7, r1, r0, r6 - mov r0, r7, lsr #0xc - orr r0, r0, r1, lsl #0x14 - str r0, [r2, #0x20] - ldmneia sp!, {r4-r9,lr} - bxne lr - ldmia lr!, {r0-r3} - stmia r12!, {r0-r3} - ldmia lr!, {r0-r3} - stmia r12!, {r0-r3} - ldr r0, [lr, #0x0] - str r0, [r12, #0x0] - add sp, sp, #0x24 - ldmia sp!, {r4-r9,lr} - bx lr - - arm_func_start MTX_ScaleApply33 -MTX_ScaleApply33: ; 0x020C41A8 - stmdb sp!, {r4,lr} - ldr r4, [r0, #0x0] - ldr r12, [sp, #0x8] - smull lr, r4, r2, r4 - mov lr, lr, lsr #0xc - orr lr, lr, r4, lsl #0x14 - str lr, [r1, #0x0] - ldr r4, [r0, #0x4] - smull lr, r4, r2, r4 - mov lr, lr, lsr #0xc - orr lr, lr, r4, lsl #0x14 - str lr, [r1, #0x4] - ldr lr, [r0, #0x8] - smull r4, lr, r2, lr - mov r2, r4, lsr #0xc - orr r2, r2, lr, lsl #0x14 - str r2, [r1, #0x8] - ldr r2, [r0, #0xc] - smull lr, r2, r3, r2 - mov lr, lr, lsr #0xc - orr lr, lr, r2, lsl #0x14 - str lr, [r1, #0xc] - ldr r2, [r0, #0x10] - smull lr, r2, r3, r2 - mov lr, lr, lsr #0xc - orr lr, lr, r2, lsl #0x14 - str lr, [r1, #0x10] - ldr r2, [r0, #0x14] - smull lr, r2, r3, r2 - mov r3, lr, lsr #0xc - orr r3, r3, r2, lsl #0x14 - str r3, [r1, #0x14] - ldr r2, [r0, #0x18] - smull r3, r2, r12, r2 - mov r3, r3, lsr #0xc - orr r3, r3, r2, lsl #0x14 - str r3, [r1, #0x18] - ldr r2, [r0, #0x1c] - smull r3, r2, r12, r2 - mov r3, r3, lsr #0xc - orr r3, r3, r2, lsl #0x14 - str r3, [r1, #0x1c] - ldr r0, [r0, #0x20] - smull r2, r0, r12, r0 - mov r2, r2, lsr #0xc - orr r2, r2, r0, lsl #0x14 - str r2, [r1, #0x20] - ldmia sp!, {r4,lr} - bx lr diff --git a/arm9/lib/src/FX_mtx33.c b/arm9/lib/src/FX_mtx33.c new file mode 100644 index 00000000..32b1ad2e --- /dev/null +++ b/arm9/lib/src/FX_mtx33.c @@ -0,0 +1,135 @@ +#include "global.h" +#include "main.h" +#include "fx.h" + +void MTX_ScaleApply33(struct Mtx33 *mtx, struct Mtx33 *dst, s32 x, s32 y, s32 z){ + dst->_[0] = ((s64)x * mtx->_[0]) >> FX32_INT_SHIFT; + dst->_[1] = ((s64)x * mtx->_[1]) >> FX32_INT_SHIFT; + dst->_[2] = ((s64)x * mtx->_[2]) >> FX32_INT_SHIFT; + dst->_[3] = ((s64)y * mtx->_[3]) >> FX32_INT_SHIFT; + dst->_[4] = ((s64)y * mtx->_[4]) >> FX32_INT_SHIFT; + dst->_[5] = ((s64)y * mtx->_[5]) >> FX32_INT_SHIFT; + dst->_[6] = ((s64)z * mtx->_[6]) >> FX32_INT_SHIFT; + dst->_[7] = ((s64)z * mtx->_[7]) >> FX32_INT_SHIFT; + dst->_[8] = ((s64)z * mtx->_[8]) >> FX32_INT_SHIFT; +} + +void MTX_Concat33(struct Mtx33 *a, struct Mtx33 *b, struct Mtx33 *c){ + struct Mtx33 temp; + struct Mtx33 *dst; + s32 a0, a1, a2; + s32 b0, b1, b2; + + if (c == b) + dst = &temp; + else + dst = c; + + a0 = a->_[0]; + a1 = a->_[1]; + a2 = a->_[2]; + dst->_[0] = (((s64)a0 * b->_[0] + (s64)a1 * b->_[3] + (s64)a2 * b->_[6] ) >> FX32_INT_SHIFT); + dst->_[1] = (((s64)a0 * b->_[1] + (s64)a1 * b->_[4] + (s64)a2 * b->_[7] ) >> FX32_INT_SHIFT); + b0 = b->_[2]; + b1 = b->_[5]; + b2 = b->_[8]; + dst->_[2] = (((s64)a0 * b0 + (s64)a1 * b1 + (s64)a2 * b2) >> FX32_INT_SHIFT); + a0 = a->_[3]; + a1 = a->_[4]; + a2 = a->_[5]; + dst->_[5] = (((s64)a0 * b0 + (s64)a1 * b1 + (s64)a2 * b2) >> FX32_INT_SHIFT); + dst->_[4] = (((s64)a0 * b->_[1] + (s64)a1 * b->_[4] + (s64)a2 * b->_[7] ) >> FX32_INT_SHIFT); + b0 = b->_[0]; + b1 = b->_[3]; + b2 = b->_[6]; + dst->_[3] = (((s64)a0 * b0 + (s64)a1 * b1 + (s64)a2 * b2) >> FX32_INT_SHIFT); + a0 = a->_[6]; + a1 = a->_[7]; + a2 = a->_[8]; + dst->_[6] = (((s64)a0 * b0 + (s64)a1 * b1 + (s64)a2 * b2) >> FX32_INT_SHIFT); + dst->_[7] = (((s64)a0 * b->_[1] + (s64)a1 * b->_[4] + (s64)a2 * b->_[7] ) >> FX32_INT_SHIFT); + b0 = b->_[2]; + b1 = b->_[5]; + b2 = b->_[8]; + dst->_[8] = (((s64)a0 * b0 + (s64)a1 * b1 + (s64)a2 * b2) >> FX32_INT_SHIFT); + + if (dst == &temp) + *c = temp; +} + +void MTX_MultVec33(struct Vecx32 *vec, struct Mtx33 *mtx, struct Vecx32 *dst){ + s32 x, y, z; + x = vec->x; + y = vec->y; + z = vec->z; + dst->x = ((s64)x * mtx->_[0] + (s64)y * mtx->_[3] + (s64)z * mtx->_[6]) >> FX32_INT_SHIFT; + dst->y = ((s64)x * mtx->_[1] + (s64)y * mtx->_[4] + (s64)z * mtx->_[7]) >> FX32_INT_SHIFT; + dst->z = ((s64)x * mtx->_[2] + (s64)y * mtx->_[5] + (s64)z * mtx->_[8]) >> FX32_INT_SHIFT; +} + +asm void MTX_Identity33_(struct Mtx33 *mtx){ + mov r2, #0x1000 + str r2, [r0, #0x20] + mov r3, #0x0 + stmia r0!, {r2-r3} + mov r1, #0x0 + stmia r0!, {r1,r3} + stmia r0!, {r2-r3} + stmia r0!, {r1,r3} + bx lr +} + +#pragma thumb on +asm void MTX_RotX33_(struct Mtx33 *mtx, s32 sinphi, s32 cosphi){ + mov r3, #0x1 + lsl r3, r3, #0xc + str r3, [r0, #0x0] + mov r3, #0x0 + str r3, [r0, #0x4] + str r3, [r0, #0x8] + str r3, [r0, #0xc] + str r2, [r0, #0x10] + str r1, [r0, #0x14] + str r3, [r0, #0x18] + neg r1, r1 + str r1, [r0, #0x1c] + str r2, [r0, #0x20] + bx lr +} +#pragma thumb off + +#pragma thumb on +asm void MTX_RotY33_(struct Mtx33 *mtx, s32 sinphi, s32 cosphi){ + str r2, [r0, #0x0] + str r2, [r0, #0x20] + mov r3, #0x0 + str r3, [r0, #0x4] + str r3, [r0, #0xc] + str r3, [r0, #0x14] + str r3, [r0, #0x1c] + neg r2, r1 + mov r3, #0x1 + lsl r3, r3, #0xc + str r1, [r0, #0x18] + str r2, [r0, #0x8] + str r3, [r0, #0x10] + bx lr +} +#pragma thumb off + +#pragma thumb on +asm void MTX_RotZ33_(struct Mtx33 *mtx, s32 sinphi, s32 cosphi){ + stmia r0!, {r2} + mov r3, #0x0 + stmia r0!, {r1,r3} + neg r1, r1 + stmia r0!, {r1-r2} + mov r1, #0x1 + lsl r1, r1, #0xc + str r3, [r0, #0x0] + str r3, [r0, #0x4] + str r3, [r0, #0x8] + str r1, [r0, #0xc] + bx lr +} +#pragma thumb off diff --git a/arm9/lib/src/FX_mtx43.c b/arm9/lib/src/FX_mtx43.c index c5d227b8..9cb8aa6e 100644 --- a/arm9/lib/src/FX_mtx43.c +++ b/arm9/lib/src/FX_mtx43.c @@ -3,9 +3,6 @@ #include "fx.h" - - - void MTX_ScaleApply43(struct Mtx43 *mtx, struct Mtx43 *dst, s32 x, s32 y, s32 z){ //this works because matrices are indexed columns first MTX_ScaleApply33((struct Mtx33 *)mtx, (struct Mtx33 *)dst, x, y, z); diff --git a/include/fx.h b/include/fx.h index ee436883..319c823d 100644 --- a/include/fx.h +++ b/include/fx.h @@ -59,6 +59,9 @@ #define READREG32(x) (*(vu32 *)x) #define READREG64(x) (*(vu64 *)x) +//TODO: add muladd aund mulsub macros +//need the extra term on mulsub to round up? + struct Vecx32 { s32 x; @@ -129,7 +132,6 @@ 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); @@ -150,5 +152,14 @@ void MTX_Scale43_(struct Mtx43 *dst, s32 x, s32 y, s32 z); void MTX_RotX43_(struct Mtx43 *mtx, s32 sinphi, s32 cosphi); void MTX_RotY43_(struct Mtx43 *mtx, s32 sinphi, s32 cosphi); +//Mtx33 +void MTX_ScaleApply33(struct Mtx33 *mtx, struct Mtx33 *dst, s32 x, s32 y, s32 z); +void MTX_Concat33(struct Mtx33 *a, struct Mtx33 *b, struct Mtx33 *c); +void MTX_MultVec33(struct Vecx32 *vec, struct Mtx33 *mtx, struct Vecx32 *dst); +void MTX_Identity33_(struct Mtx33 *mtx); +void MTX_RotX33_(struct Mtx33 *mtx, s32 sinphi, s32 cosphi); +void MTX_RotY33_(struct Mtx33 *mtx, s32 sinphi, s32 cosphi); +void MTX_RotZ33_(struct Mtx33 *mtx, s32 sinphi, s32 cosphi); + #endif //GUARD_FX_H -- cgit v1.2.3 From 246d8051ac7b7535c53d5d180eaf1d97451d31f2 Mon Sep 17 00:00:00 2001 From: Made Date: Mon, 4 May 2020 17:01:35 +0200 Subject: Decompile FX_mtx22.s --- arm9/asm/FX_mtx22.s | 50 ------------------------- arm9/lib/src/FX_mtx22.c | 30 +++++++++++++++ include/fx.h | 97 +++++++++++++++++++++++++++---------------------- 3 files changed, 84 insertions(+), 93 deletions(-) delete mode 100644 arm9/asm/FX_mtx22.s create mode 100644 arm9/lib/src/FX_mtx22.c diff --git a/arm9/asm/FX_mtx22.s b/arm9/asm/FX_mtx22.s deleted file mode 100644 index 571180d2..00000000 --- a/arm9/asm/FX_mtx22.s +++ /dev/null @@ -1,50 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .text - - arm_func_start MTX_Identity22_ -MTX_Identity22_: ; 0x020C3E8C - mov r1, #0x0 - mov r2, #0x1000 - mov r3, #0x0 - stmia r0!, {r2-r3} - stmia r0!, {r1-r2} - bx lr - - thumb_func_start MTX_Rot22_ -MTX_Rot22_: ; 0x020C3EA4 - str r2, [r0, #0x0] - str r1, [r0, #0x4] - neg r1, r1 - str r1, [r0, #0x8] - str r2, [r0, #0xc] - bx lr - - arm_func_start MTX_ScaleApply22 -MTX_ScaleApply22: ; 0x020C3EB0 - stmdb sp!, {lr} - sub sp, sp, #0x4 - ldr r12, [r0, #0x0] - smull lr, r12, r2, r12 - mov lr, lr, lsr #0xc - orr lr, lr, r12, lsl #0x14 - str lr, [r1, #0x0] - ldr r12, [r0, #0x4] - smull lr, r12, r2, r12 - mov r2, lr, lsr #0xc - orr r2, r2, r12, lsl #0x14 - str r2, [r1, #0x4] - ldr r2, [r0, #0x8] - smull r12, r2, r3, r2 - mov r12, r12, lsr #0xc - orr r12, r12, r2, lsl #0x14 - str r12, [r1, #0x8] - ldr r0, [r0, #0xc] - smull r2, r0, r3, r0 - mov r2, r2, lsr #0xc - orr r2, r2, r0, lsl #0x14 - str r2, [r1, #0xc] - add sp, sp, #0x4 - ldmia sp!, {lr} - bx lr diff --git a/arm9/lib/src/FX_mtx22.c b/arm9/lib/src/FX_mtx22.c new file mode 100644 index 00000000..fcd634b1 --- /dev/null +++ b/arm9/lib/src/FX_mtx22.c @@ -0,0 +1,30 @@ +#include "global.h" +#include "main.h" +#include "fx.h" + +void MTX_ScaleApply22(struct Mtx22 *mtx, struct Mtx22 *dst, s32 x, s32 y){ + dst->_[0] = ((s64)x * mtx->_[0]) >> FX32_INT_SHIFT; + dst->_[1] = ((s64)x * mtx->_[1]) >> FX32_INT_SHIFT; + dst->_[2] = ((s64)y * mtx->_[2]) >> FX32_INT_SHIFT; + dst->_[3] = ((s64)y * mtx->_[3]) >> FX32_INT_SHIFT; +} + +asm void MTX_Identity22_(struct Mtx22 *mtx){ + mov r1, #0x0 + mov r2, #0x1000 + mov r3, #0x0 + stmia r0!, {r2-r3} + stmia r0!, {r1-r2} + bx lr +} + +#pragma thumb on +asm void MTX_Rot22_(struct Mtx22 *mtx, s32 sinphi, s32 cosphi){ + str r2, [r0, #0x0] + str r1, [r0, #0x4] + neg r1, r1 + str r1, [r0, #0x8] + str r2, [r0, #0xc] + bx lr +} +#pragma thumb off diff --git a/include/fx.h b/include/fx.h index 319c823d..bbbf621a 100644 --- a/include/fx.h +++ b/include/fx.h @@ -1,6 +1,11 @@ #ifndef GUARD_FX_H #define GUARD_FX_H +typedef s16 fx16; +typedef s32 fx32; +typedef s64 fx64; +typedef s64 fx64c; + #define FX16_INT_MASK 0xF000 #define FX16_INT_ABS_MASK 0x7000 #define FX16_FRAC_MASK 0x0FFF @@ -59,107 +64,113 @@ #define READREG32(x) (*(vu32 *)x) #define READREG64(x) (*(vu64 *)x) -//TODO: add muladd aund mulsub macros -//need the extra term on mulsub to round up? +#define FX32_MUL(a, b) ((fx32)(((fx64)a * b) >> FX32_INT_SHIFT)) +#define FX32_MUL_ADD_MUL(a, b, c, d) ((fx32)(((fx64)a * b + (fx64)c * d) >> FX32_INT_SHIFT)) +//the extra term here is for rounding +#define FX32_MUL_SUB_MUL(a, b, c, d) ((fx32)(((fx64)a * b - (fx64)c * d + (1 << (FX32_INT_SHIFT - 1))) >> FX32_INT_SHIFT)) struct Vecx32 { - s32 x; - s32 y; - s32 z; + fx32 x; + fx32 y; + fx32 z; }; struct Vecx16 { - s16 x; - s16 y; - s16 z; + fx16 x; + fx16 y; + fx16 z; }; //Matrices are indexed as [column][row] struct Mtx44 { - s32 _[16]; + fx32 _[16]; }; struct Mtx43 { - s32 _[12]; + fx32 _[12]; }; struct Mtx33 { - s32 _[9]; + fx32 _[9]; }; struct Mtx22 { - s32 _[4]; + fx32 _[4]; }; //FX void FX_Init(); -s32 FX_Modf(s32 x, s32 *iptr); +fx32 FX_Modf(fx32 x, fx32 *iptr); //Atan -u16 FX_Atan(s32 x); -u16 FX_Atan2(s32 x, s32 y); +u16 FX_Atan(fx32 x); +u16 FX_Atan2(fx32 x, fx32 y); //Vec 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); +fx32 VEC_DotProduct(struct Vecx32 *x, struct Vecx32 *y); +fx32 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); +fx32 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); +void VEC_MultAdd(fx32 factor, struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst); //CP -s32 FX_Div(s32 numerator, s32 denominator); -s32 FX_Inv(s32 x); -s32 FX_Sqrt(s32 x); -s64 FX_GetDivResultFx64c(); -s32 FX_GetDivResult(); -void FX_InvAsync(s32 x); -s32 FX_GetSqrtResult(); -void FX_DivAsync(s32 numerator, s32 denominator); -s32 FX_DivS32(s32 numerator, s32 denominator); -s32 FX_ModS32(s32 num, s32 mod); +fx32 FX_Div(fx32 numerator, fx32 denominator); +fx32 FX_Inv(fx32 x); +fx32 FX_Sqrt(fx32 x); +fx64 FX_GetDivResultFx64c(); +fx32 FX_GetDivResult(); +void FX_InvAsync(fx32 x); +fx32 FX_GetSqrtResult(); +void FX_DivAsync(fx32 numerator, fx32 denominator); +fx32 FX_Divfx32(fx32 numerator, fx32 denominator); +fx32 FX_Modfx32(fx32 num, fx32 mod); //Mtx //The functions ending in underscores seem to be in assembly originally //Mtx44 -void MTX_TransApply44(struct Mtx44 *mtx, struct Mtx44 *dst, s32 x, s32 y, s32 z); +void MTX_TransApply44(struct Mtx44 *mtx, struct Mtx44 *dst, fx32 x, fx32 y, fx32 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); +void MTX_RotX44_(struct Mtx44 *mtx, fx32 sinphi, fx32 cosphi); +void MTX_RotY44_(struct Mtx44 *mtx, fx32 sinphi, fx32 cosphi); +void MTX_RotZ44_(struct Mtx44 *mtx, fx32 sinphi, fx32 cosphi); //Mtx43 -void MTX_ScaleApply33(struct Mtx33 *mtx, struct Mtx33 *dst, s32 x, s32 y, s32 z); -s32 MTX_Inverse43(struct Mtx43 *mtx, struct Mtx43 *inv); +void MTX_ScaleApply33(struct Mtx33 *mtx, struct Mtx33 *dst, fx32 x, fx32 y, fx32 z); +fx32 MTX_Inverse43(struct Mtx43 *mtx, struct Mtx43 *inv); void MTX_Concat43(struct Mtx43 *a, struct Mtx43 *b, struct Mtx43 *c); void MTX_MultVec43(struct Vecx32 *vec, struct Mtx43 *mtx, struct Vecx32 *dst); void MTX_Identity43_(struct Mtx43 *mtx); void MTX_Copy43To44_(struct Mtx43 *src, struct Mtx44 *dst); -void MTX_Scale43_(struct Mtx43 *dst, s32 x, s32 y, s32 z); -void MTX_RotX43_(struct Mtx43 *mtx, s32 sinphi, s32 cosphi); -void MTX_RotY43_(struct Mtx43 *mtx, s32 sinphi, s32 cosphi); +void MTX_Scale43_(struct Mtx43 *dst, fx32 x, fx32 y, fx32 z); +void MTX_RotX43_(struct Mtx43 *mtx, fx32 sinphi, fx32 cosphi); +void MTX_RotY43_(struct Mtx43 *mtx, fx32 sinphi, fx32 cosphi); //Mtx33 -void MTX_ScaleApply33(struct Mtx33 *mtx, struct Mtx33 *dst, s32 x, s32 y, s32 z); +void MTX_ScaleApply33(struct Mtx33 *mtx, struct Mtx33 *dst, fx32 x, fx32 y, fx32 z); void MTX_Concat33(struct Mtx33 *a, struct Mtx33 *b, struct Mtx33 *c); void MTX_MultVec33(struct Vecx32 *vec, struct Mtx33 *mtx, struct Vecx32 *dst); void MTX_Identity33_(struct Mtx33 *mtx); -void MTX_RotX33_(struct Mtx33 *mtx, s32 sinphi, s32 cosphi); -void MTX_RotY33_(struct Mtx33 *mtx, s32 sinphi, s32 cosphi); -void MTX_RotZ33_(struct Mtx33 *mtx, s32 sinphi, s32 cosphi); - +void MTX_RotX33_(struct Mtx33 *mtx, fx32 sinphi, fx32 cosphi); +void MTX_RotY33_(struct Mtx33 *mtx, fx32 sinphi, fx32 cosphi); +void MTX_RotZ33_(struct Mtx33 *mtx, fx32 sinphi, fx32 cosphi); + +//Mtx22 +void MTX_ScaleApply22(struct Mtx22 *mtx, struct Mtx22 *dst, fx32 x, fx32 y); +void MTX_Identity22_(struct Mtx22 *mtx); +void MTX_Rot22_(struct Mtx22 *mtx, fx32 sinphi, fx32 cosphi); #endif //GUARD_FX_H -- cgit v1.2.3 From ab28b0b37f2fd9fba6010e48e15bd31170d678d7 Mon Sep 17 00:00:00 2001 From: Made Date: Mon, 4 May 2020 17:07:22 +0200 Subject: Add typedefs for fixed point types --- arm9/lib/src/FX.c | 2 +- arm9/lib/src/FX_atan.c | 12 +++--- arm9/lib/src/FX_cp.c | 28 +++++++------- arm9/lib/src/FX_mtx22.c | 12 +++--- arm9/lib/src/FX_mtx33.c | 56 +++++++++++++-------------- arm9/lib/src/FX_mtx43.c | 100 ++++++++++++++++++++++++------------------------ arm9/lib/src/FX_mtx44.c | 52 ++++++++++++------------- arm9/lib/src/FX_vec.c | 50 ++++++++++++------------ 8 files changed, 156 insertions(+), 156 deletions(-) diff --git a/arm9/lib/src/FX.c b/arm9/lib/src/FX.c index fa6fa6ba..f39b1995 100644 --- a/arm9/lib/src/FX.c +++ b/arm9/lib/src/FX.c @@ -6,7 +6,7 @@ void FX_Init(){ return; } -s32 FX_Modf(s32 x, s32 *iptr){ +fx32 FX_Modf(fx32 x, fx32 *iptr){ if (x >= 0) { *iptr = x & 0x7FFFF000; diff --git a/arm9/lib/src/FX_atan.c b/arm9/lib/src/FX_atan.c index 684db81e..085763f8 100644 --- a/arm9/lib/src/FX_atan.c +++ b/arm9/lib/src/FX_atan.c @@ -2,15 +2,15 @@ #include "main.h" #include "fx.h" -extern s16 FX_AtanTable_[]; +extern fx16 FX_AtanTable_[]; -u16 FX_Atan(s32 x){ +u16 FX_Atan(fx32 x){ if (x >= 0) { if (x > 0x1000) { x = FX_Inv(x); - s16 y = FX_AtanTable_[x >> 5]; + fx16 y = FX_AtanTable_[x >> 5]; return 0x4000 - y; } else if (x < 0x1000) @@ -27,7 +27,7 @@ u16 FX_Atan(s32 x){ if (x < -0x1000) { x = FX_Inv(-x); - s16 y = FX_AtanTable_[x >> 5]; + fx16 y = FX_AtanTable_[x >> 5]; return y - 0x4000; } else if (x > -0x1000) @@ -41,8 +41,8 @@ u16 FX_Atan(s32 x){ } } -u16 FX_Atan2(s32 x, s32 y){ - s32 result; +u16 FX_Atan2(fx32 x, fx32 y){ + fx32 result; u32 positive, bias, denominator, numerator; if (x > 0) { diff --git a/arm9/lib/src/FX_cp.c b/arm9/lib/src/FX_cp.c index a2d8307b..76dea4b4 100644 --- a/arm9/lib/src/FX_cp.c +++ b/arm9/lib/src/FX_cp.c @@ -1,23 +1,23 @@ #include "global.h" #include "main.h" #include "fx.h" - -s32 FX_Div(s32 numerator, s32 denominator){ + +fx32 FX_Div(fx32 numerator, fx32 denominator){ FX_DivAsync(numerator, denominator); return FX_GetDivResult(); } -s32 FX_Inv(s32 x){ +fx32 FX_Inv(fx32 x){ FX_InvAsync(x); return FX_GetDivResult(); } -s32 FX_Sqrt(s32 x){ +fx32 FX_Sqrt(fx32 x){ if (x > 0) { SETREG16(HW_REG_SQRTCNT, 0x1); - SETREG64(HW_REG_SQRT_PARAM, (s64)x << 32); + SETREG64(HW_REG_SQRT_PARAM, (fx64)x << 32); return FX_GetSqrtResult(); } else @@ -26,34 +26,34 @@ s32 FX_Sqrt(s32 x){ } } -s64 FX_GetDivResultFx64c(){ +fx64c FX_GetDivResultFx64c(){ while (READREG16(HW_REG_DIVCNT) & 0x8000); return READREG64(HW_REG_DIV_RESULT); } -s32 FX_GetDivResult(){ +fx32 FX_GetDivResult(){ while (READREG16(HW_REG_DIVCNT) & 0x8000); return (READREG64(HW_REG_DIV_RESULT) + (1 << (0x14 - 1))) >> 0x14; } -void FX_InvAsync(s32 x){ +void FX_InvAsync(fx32 x){ SETREG16(HW_REG_DIVCNT, 0x1); - SETREG64(HW_REG_DIV_NUMER, (s64)0x00001000 << 32); + SETREG64(HW_REG_DIV_NUMER, (fx64)0x00001000 << 32); SETREG64(HW_REG_DIV_DENOM, (u32)x); } -s32 FX_GetSqrtResult(){ +fx32 FX_GetSqrtResult(){ while (READREG16(HW_REG_SQRTCNT) & 0x8000); return (READREG32(HW_REG_SQRT_RESULT) + (1 << (0xA - 1))) >> 0xA; } -void FX_DivAsync(s32 numerator, s32 denominator){ +void FX_DivAsync(fx32 numerator, fx32 denominator){ SETREG16(HW_REG_DIVCNT, 0x1); - SETREG64(HW_REG_DIV_NUMER, (s64)numerator << 32); + SETREG64(HW_REG_DIV_NUMER, (fx64)numerator << 32); SETREG64(HW_REG_DIV_DENOM, (u32)denominator); } -s32 FX_DivS32(s32 numerator, s32 denominator){ +fx32 FX_Divfx32(fx32 numerator, fx32 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); @@ -61,7 +61,7 @@ s32 FX_DivS32(s32 numerator, s32 denominator){ return READREG32(HW_REG_DIV_RESULT); } -s32 FX_ModS32(s32 num, s32 mod){ +fx32 FX_Modfx32(fx32 num, fx32 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); diff --git a/arm9/lib/src/FX_mtx22.c b/arm9/lib/src/FX_mtx22.c index fcd634b1..19504574 100644 --- a/arm9/lib/src/FX_mtx22.c +++ b/arm9/lib/src/FX_mtx22.c @@ -2,11 +2,11 @@ #include "main.h" #include "fx.h" -void MTX_ScaleApply22(struct Mtx22 *mtx, struct Mtx22 *dst, s32 x, s32 y){ - dst->_[0] = ((s64)x * mtx->_[0]) >> FX32_INT_SHIFT; - dst->_[1] = ((s64)x * mtx->_[1]) >> FX32_INT_SHIFT; - dst->_[2] = ((s64)y * mtx->_[2]) >> FX32_INT_SHIFT; - dst->_[3] = ((s64)y * mtx->_[3]) >> FX32_INT_SHIFT; +void MTX_ScaleApply22(struct Mtx22 *mtx, struct Mtx22 *dst, fx32 x, fx32 y){ + dst->_[0] = ((fx64)x * mtx->_[0]) >> FX32_INT_SHIFT; + dst->_[1] = ((fx64)x * mtx->_[1]) >> FX32_INT_SHIFT; + dst->_[2] = ((fx64)y * mtx->_[2]) >> FX32_INT_SHIFT; + dst->_[3] = ((fx64)y * mtx->_[3]) >> FX32_INT_SHIFT; } asm void MTX_Identity22_(struct Mtx22 *mtx){ @@ -19,7 +19,7 @@ asm void MTX_Identity22_(struct Mtx22 *mtx){ } #pragma thumb on -asm void MTX_Rot22_(struct Mtx22 *mtx, s32 sinphi, s32 cosphi){ +asm void MTX_Rot22_(struct Mtx22 *mtx, fx32 sinphi, fx32 cosphi){ str r2, [r0, #0x0] str r1, [r0, #0x4] neg r1, r1 diff --git a/arm9/lib/src/FX_mtx33.c b/arm9/lib/src/FX_mtx33.c index 32b1ad2e..391a6104 100644 --- a/arm9/lib/src/FX_mtx33.c +++ b/arm9/lib/src/FX_mtx33.c @@ -2,23 +2,23 @@ #include "main.h" #include "fx.h" -void MTX_ScaleApply33(struct Mtx33 *mtx, struct Mtx33 *dst, s32 x, s32 y, s32 z){ - dst->_[0] = ((s64)x * mtx->_[0]) >> FX32_INT_SHIFT; - dst->_[1] = ((s64)x * mtx->_[1]) >> FX32_INT_SHIFT; - dst->_[2] = ((s64)x * mtx->_[2]) >> FX32_INT_SHIFT; - dst->_[3] = ((s64)y * mtx->_[3]) >> FX32_INT_SHIFT; - dst->_[4] = ((s64)y * mtx->_[4]) >> FX32_INT_SHIFT; - dst->_[5] = ((s64)y * mtx->_[5]) >> FX32_INT_SHIFT; - dst->_[6] = ((s64)z * mtx->_[6]) >> FX32_INT_SHIFT; - dst->_[7] = ((s64)z * mtx->_[7]) >> FX32_INT_SHIFT; - dst->_[8] = ((s64)z * mtx->_[8]) >> FX32_INT_SHIFT; +void MTX_ScaleApply33(struct Mtx33 *mtx, struct Mtx33 *dst, fx32 x, fx32 y, fx32 z){ + dst->_[0] = ((fx64)x * mtx->_[0]) >> FX32_INT_SHIFT; + dst->_[1] = ((fx64)x * mtx->_[1]) >> FX32_INT_SHIFT; + dst->_[2] = ((fx64)x * mtx->_[2]) >> FX32_INT_SHIFT; + dst->_[3] = ((fx64)y * mtx->_[3]) >> FX32_INT_SHIFT; + dst->_[4] = ((fx64)y * mtx->_[4]) >> FX32_INT_SHIFT; + dst->_[5] = ((fx64)y * mtx->_[5]) >> FX32_INT_SHIFT; + dst->_[6] = ((fx64)z * mtx->_[6]) >> FX32_INT_SHIFT; + dst->_[7] = ((fx64)z * mtx->_[7]) >> FX32_INT_SHIFT; + dst->_[8] = ((fx64)z * mtx->_[8]) >> FX32_INT_SHIFT; } void MTX_Concat33(struct Mtx33 *a, struct Mtx33 *b, struct Mtx33 *c){ struct Mtx33 temp; struct Mtx33 *dst; - s32 a0, a1, a2; - s32 b0, b1, b2; + fx32 a0, a1, a2; + fx32 b0, b1, b2; if (c == b) dst = &temp; @@ -28,43 +28,43 @@ void MTX_Concat33(struct Mtx33 *a, struct Mtx33 *b, struct Mtx33 *c){ a0 = a->_[0]; a1 = a->_[1]; a2 = a->_[2]; - dst->_[0] = (((s64)a0 * b->_[0] + (s64)a1 * b->_[3] + (s64)a2 * b->_[6] ) >> FX32_INT_SHIFT); - dst->_[1] = (((s64)a0 * b->_[1] + (s64)a1 * b->_[4] + (s64)a2 * b->_[7] ) >> FX32_INT_SHIFT); + dst->_[0] = (((fx64)a0 * b->_[0] + (fx64)a1 * b->_[3] + (fx64)a2 * b->_[6] ) >> FX32_INT_SHIFT); + dst->_[1] = (((fx64)a0 * b->_[1] + (fx64)a1 * b->_[4] + (fx64)a2 * b->_[7] ) >> FX32_INT_SHIFT); b0 = b->_[2]; b1 = b->_[5]; b2 = b->_[8]; - dst->_[2] = (((s64)a0 * b0 + (s64)a1 * b1 + (s64)a2 * b2) >> FX32_INT_SHIFT); + dst->_[2] = (((fx64)a0 * b0 + (fx64)a1 * b1 + (fx64)a2 * b2) >> FX32_INT_SHIFT); a0 = a->_[3]; a1 = a->_[4]; a2 = a->_[5]; - dst->_[5] = (((s64)a0 * b0 + (s64)a1 * b1 + (s64)a2 * b2) >> FX32_INT_SHIFT); - dst->_[4] = (((s64)a0 * b->_[1] + (s64)a1 * b->_[4] + (s64)a2 * b->_[7] ) >> FX32_INT_SHIFT); + dst->_[5] = (((fx64)a0 * b0 + (fx64)a1 * b1 + (fx64)a2 * b2) >> FX32_INT_SHIFT); + dst->_[4] = (((fx64)a0 * b->_[1] + (fx64)a1 * b->_[4] + (fx64)a2 * b->_[7] ) >> FX32_INT_SHIFT); b0 = b->_[0]; b1 = b->_[3]; b2 = b->_[6]; - dst->_[3] = (((s64)a0 * b0 + (s64)a1 * b1 + (s64)a2 * b2) >> FX32_INT_SHIFT); + dst->_[3] = (((fx64)a0 * b0 + (fx64)a1 * b1 + (fx64)a2 * b2) >> FX32_INT_SHIFT); a0 = a->_[6]; a1 = a->_[7]; a2 = a->_[8]; - dst->_[6] = (((s64)a0 * b0 + (s64)a1 * b1 + (s64)a2 * b2) >> FX32_INT_SHIFT); - dst->_[7] = (((s64)a0 * b->_[1] + (s64)a1 * b->_[4] + (s64)a2 * b->_[7] ) >> FX32_INT_SHIFT); + dst->_[6] = (((fx64)a0 * b0 + (fx64)a1 * b1 + (fx64)a2 * b2) >> FX32_INT_SHIFT); + dst->_[7] = (((fx64)a0 * b->_[1] + (fx64)a1 * b->_[4] + (fx64)a2 * b->_[7] ) >> FX32_INT_SHIFT); b0 = b->_[2]; b1 = b->_[5]; b2 = b->_[8]; - dst->_[8] = (((s64)a0 * b0 + (s64)a1 * b1 + (s64)a2 * b2) >> FX32_INT_SHIFT); + dst->_[8] = (((fx64)a0 * b0 + (fx64)a1 * b1 + (fx64)a2 * b2) >> FX32_INT_SHIFT); if (dst == &temp) *c = temp; } void MTX_MultVec33(struct Vecx32 *vec, struct Mtx33 *mtx, struct Vecx32 *dst){ - s32 x, y, z; + fx32 x, y, z; x = vec->x; y = vec->y; z = vec->z; - dst->x = ((s64)x * mtx->_[0] + (s64)y * mtx->_[3] + (s64)z * mtx->_[6]) >> FX32_INT_SHIFT; - dst->y = ((s64)x * mtx->_[1] + (s64)y * mtx->_[4] + (s64)z * mtx->_[7]) >> FX32_INT_SHIFT; - dst->z = ((s64)x * mtx->_[2] + (s64)y * mtx->_[5] + (s64)z * mtx->_[8]) >> FX32_INT_SHIFT; + dst->x = ((fx64)x * mtx->_[0] + (fx64)y * mtx->_[3] + (fx64)z * mtx->_[6]) >> FX32_INT_SHIFT; + dst->y = ((fx64)x * mtx->_[1] + (fx64)y * mtx->_[4] + (fx64)z * mtx->_[7]) >> FX32_INT_SHIFT; + dst->z = ((fx64)x * mtx->_[2] + (fx64)y * mtx->_[5] + (fx64)z * mtx->_[8]) >> FX32_INT_SHIFT; } asm void MTX_Identity33_(struct Mtx33 *mtx){ @@ -80,7 +80,7 @@ asm void MTX_Identity33_(struct Mtx33 *mtx){ } #pragma thumb on -asm void MTX_RotX33_(struct Mtx33 *mtx, s32 sinphi, s32 cosphi){ +asm void MTX_RotX33_(struct Mtx33 *mtx, fx32 sinphi, fx32 cosphi){ mov r3, #0x1 lsl r3, r3, #0xc str r3, [r0, #0x0] @@ -99,7 +99,7 @@ asm void MTX_RotX33_(struct Mtx33 *mtx, s32 sinphi, s32 cosphi){ #pragma thumb off #pragma thumb on -asm void MTX_RotY33_(struct Mtx33 *mtx, s32 sinphi, s32 cosphi){ +asm void MTX_RotY33_(struct Mtx33 *mtx, fx32 sinphi, fx32 cosphi){ str r2, [r0, #0x0] str r2, [r0, #0x20] mov r3, #0x0 @@ -118,7 +118,7 @@ asm void MTX_RotY33_(struct Mtx33 *mtx, s32 sinphi, s32 cosphi){ #pragma thumb off #pragma thumb on -asm void MTX_RotZ33_(struct Mtx33 *mtx, s32 sinphi, s32 cosphi){ +asm void MTX_RotZ33_(struct Mtx33 *mtx, fx32 sinphi, fx32 cosphi){ stmia r0!, {r2} mov r3, #0x0 stmia r0!, {r1,r3} diff --git a/arm9/lib/src/FX_mtx43.c b/arm9/lib/src/FX_mtx43.c index 9cb8aa6e..862bd6f2 100644 --- a/arm9/lib/src/FX_mtx43.c +++ b/arm9/lib/src/FX_mtx43.c @@ -3,7 +3,7 @@ #include "fx.h" -void MTX_ScaleApply43(struct Mtx43 *mtx, struct Mtx43 *dst, s32 x, s32 y, s32 z){ +void MTX_ScaleApply43(struct Mtx43 *mtx, struct Mtx43 *dst, fx32 x, fx32 y, fx32 z){ //this works because matrices are indexed columns first MTX_ScaleApply33((struct Mtx33 *)mtx, (struct Mtx33 *)dst, x, y, z); dst->_[9] = mtx->_[9]; @@ -11,48 +11,48 @@ void MTX_ScaleApply43(struct Mtx43 *mtx, struct Mtx43 *dst, s32 x, s32 y, s32 z) dst->_[11] = mtx->_[11]; } -s32 MTX_Inverse43(struct Mtx43 *mtx, struct Mtx43 *inv){ +fx32 MTX_Inverse43(struct Mtx43 *mtx, struct Mtx43 *inv){ struct Mtx43 tempmat; struct Mtx43 *dst; - s32 det0, det1, det2, det; - s32 var0, var1, var2, var3; + fx32 det0, det1, det2, det; + fx32 var0, var1, var2, var3; if (mtx == inv) dst = &tempmat; else dst = inv; //subdeterminants - det0 = ((s64)mtx->_[4] * mtx->_[8] - (s64)mtx->_[5] * mtx->_[7] + (s64)(1 << (FX32_INT_SHIFT - 1))) >> FX32_INT_SHIFT; - det1 = ((s64)mtx->_[3] * mtx->_[8] - (s64)mtx->_[5] * mtx->_[6] + (s64)(1 << (FX32_INT_SHIFT - 1))) >> FX32_INT_SHIFT; - det2 = ((s64)mtx->_[3] * mtx->_[7] - (s64)mtx->_[4] * mtx->_[6] + (s64)(1 << (FX32_INT_SHIFT - 1))) >> FX32_INT_SHIFT; + det0 = ((fx64)mtx->_[4] * mtx->_[8] - (fx64)mtx->_[5] * mtx->_[7] + (fx64)(1 << (FX32_INT_SHIFT - 1))) >> FX32_INT_SHIFT; + det1 = ((fx64)mtx->_[3] * mtx->_[8] - (fx64)mtx->_[5] * mtx->_[6] + (fx64)(1 << (FX32_INT_SHIFT - 1))) >> FX32_INT_SHIFT; + det2 = ((fx64)mtx->_[3] * mtx->_[7] - (fx64)mtx->_[4] * mtx->_[6] + (fx64)(1 << (FX32_INT_SHIFT - 1))) >> FX32_INT_SHIFT; //matrix determinant - det = ((s64)mtx->_[0] * det0 - (s64)mtx->_[1] * det1 + (s64)mtx->_[2] * det2 + (s64)(1 << (FX32_INT_SHIFT - 1))) >> FX32_INT_SHIFT; + det = ((fx64)mtx->_[0] * det0 - (fx64)mtx->_[1] * det1 + (fx64)mtx->_[2] * det2 + (fx64)(1 << (FX32_INT_SHIFT - 1))) >> FX32_INT_SHIFT; if (det == 0) return -1; //not invertible FX_InvAsync(det); - var0 = ((s64)mtx->_[1] * mtx->_[8] - (s64)mtx->_[7] * mtx->_[2]) >> FX32_INT_SHIFT; - var1 = ((s64)mtx->_[1] * mtx->_[5] - (s64)mtx->_[4] * mtx->_[2]) >> FX32_INT_SHIFT; - var2 = ((s64)mtx->_[0] * mtx->_[8] - (s64)mtx->_[6] * mtx->_[2]) >> FX32_INT_SHIFT; - var3 = ((s64)mtx->_[0] * mtx->_[5] - (s64)mtx->_[3] * mtx->_[2]) >> FX32_INT_SHIFT; - - s32 ret = FX_GetDivResult(); - dst->_[0] = (s32)(((s64)ret * det0) >> FX32_INT_SHIFT); - dst->_[1] = -(s32)(((s64)ret * var0) >> FX32_INT_SHIFT); - dst->_[2] = (s32)(((s64)ret * var1) >> FX32_INT_SHIFT); - dst->_[3] = -(s32)(((s64)ret * det1) >> FX32_INT_SHIFT); - dst->_[4] = (s32)(((s64)ret * var2) >> FX32_INT_SHIFT); - dst->_[5] = -(s32)(((s64)ret * var3) >> FX32_INT_SHIFT); - - dst->_[6] = (s32)(((s64)ret * det2) >> FX32_INT_SHIFT); - s32 temp = (s32)(((s64)mtx->_[0] * mtx->_[7] - (s64)mtx->_[6] * mtx->_[1]) >> FX32_INT_SHIFT); - dst->_[7] = -(s32)(((s64)ret * temp) >> FX32_INT_SHIFT); - s32 temp1 = (s32)(((s64)mtx->_[0] * mtx->_[4] - (s64)mtx->_[3] * mtx->_[1]) >> FX32_INT_SHIFT); - dst->_[8] = (s32)(((s64)ret * temp1) >> FX32_INT_SHIFT); - dst->_[9] = -(s32)(((s64)dst->_[0] * mtx->_[9] + (s64)dst->_[3] * mtx->_[10] + (s64)dst->_[6] * mtx->_[11]) >> FX32_INT_SHIFT); - dst->_[10] = -(s32)(((s64)dst->_[1] * mtx->_[9] + (s64)dst->_[4] * mtx->_[10] + (s64)dst->_[7] * mtx->_[11]) >> FX32_INT_SHIFT); - dst->_[11] = -(s32)(((s64)dst->_[2] * mtx->_[9] + (s64)dst->_[5] * mtx->_[10] + (s64)dst->_[8] * mtx->_[11]) >> FX32_INT_SHIFT); + var0 = ((fx64)mtx->_[1] * mtx->_[8] - (fx64)mtx->_[7] * mtx->_[2]) >> FX32_INT_SHIFT; + var1 = ((fx64)mtx->_[1] * mtx->_[5] - (fx64)mtx->_[4] * mtx->_[2]) >> FX32_INT_SHIFT; + var2 = ((fx64)mtx->_[0] * mtx->_[8] - (fx64)mtx->_[6] * mtx->_[2]) >> FX32_INT_SHIFT; + var3 = ((fx64)mtx->_[0] * mtx->_[5] - (fx64)mtx->_[3] * mtx->_[2]) >> FX32_INT_SHIFT; + + fx32 ret = FX_GetDivResult(); + dst->_[0] = (fx32)(((fx64)ret * det0) >> FX32_INT_SHIFT); + dst->_[1] = -(fx32)(((fx64)ret * var0) >> FX32_INT_SHIFT); + dst->_[2] = (fx32)(((fx64)ret * var1) >> FX32_INT_SHIFT); + dst->_[3] = -(fx32)(((fx64)ret * det1) >> FX32_INT_SHIFT); + dst->_[4] = (fx32)(((fx64)ret * var2) >> FX32_INT_SHIFT); + dst->_[5] = -(fx32)(((fx64)ret * var3) >> FX32_INT_SHIFT); + + dst->_[6] = (fx32)(((fx64)ret * det2) >> FX32_INT_SHIFT); + fx32 temp = (fx32)(((fx64)mtx->_[0] * mtx->_[7] - (fx64)mtx->_[6] * mtx->_[1]) >> FX32_INT_SHIFT); + dst->_[7] = -(fx32)(((fx64)ret * temp) >> FX32_INT_SHIFT); + fx32 temp1 = (fx32)(((fx64)mtx->_[0] * mtx->_[4] - (fx64)mtx->_[3] * mtx->_[1]) >> FX32_INT_SHIFT); + dst->_[8] = (fx32)(((fx64)ret * temp1) >> FX32_INT_SHIFT); + dst->_[9] = -(fx32)(((fx64)dst->_[0] * mtx->_[9] + (fx64)dst->_[3] * mtx->_[10] + (fx64)dst->_[6] * mtx->_[11]) >> FX32_INT_SHIFT); + dst->_[10] = -(fx32)(((fx64)dst->_[1] * mtx->_[9] + (fx64)dst->_[4] * mtx->_[10] + (fx64)dst->_[7] * mtx->_[11]) >> FX32_INT_SHIFT); + dst->_[11] = -(fx32)(((fx64)dst->_[2] * mtx->_[9] + (fx64)dst->_[5] * mtx->_[10] + (fx64)dst->_[8] * mtx->_[11]) >> FX32_INT_SHIFT); if (dst == &tempmat) MI_Copy48B(&tempmat, inv); @@ -62,8 +62,8 @@ s32 MTX_Inverse43(struct Mtx43 *mtx, struct Mtx43 *inv){ void MTX_Concat43(struct Mtx43 *a, struct Mtx43 *b, struct Mtx43 *c){ struct Mtx43 temp; struct Mtx43 *dst; - s32 a0, a1, a2; - s32 b0, b1, b2; + fx32 a0, a1, a2; + fx32 b0, b1, b2; if (c == b) dst = &temp; @@ -73,50 +73,50 @@ void MTX_Concat43(struct Mtx43 *a, struct Mtx43 *b, struct Mtx43 *c){ a0 = a->_[0]; a1 = a->_[1]; a2 = a->_[2]; - dst->_[0] = (((s64)a0 * b->_[0] + (s64)a1 * b->_[3] + (s64)a2 * b->_[6] ) >> FX32_INT_SHIFT); - dst->_[1] = (((s64)a0 * b->_[1] + (s64)a1 * b->_[4] + (s64)a2 * b->_[7] ) >> FX32_INT_SHIFT); + dst->_[0] = (((fx64)a0 * b->_[0] + (fx64)a1 * b->_[3] + (fx64)a2 * b->_[6] ) >> FX32_INT_SHIFT); + dst->_[1] = (((fx64)a0 * b->_[1] + (fx64)a1 * b->_[4] + (fx64)a2 * b->_[7] ) >> FX32_INT_SHIFT); b0 = b->_[2]; b1 = b->_[5]; b2 = b->_[8]; - dst->_[2] = (((s64)a0 * b0 + (s64)a1 * b1 + (s64)a2 * b2) >> FX32_INT_SHIFT); + dst->_[2] = (((fx64)a0 * b0 + (fx64)a1 * b1 + (fx64)a2 * b2) >> FX32_INT_SHIFT); a0 = a->_[3]; a1 = a->_[4]; a2 = a->_[5]; - dst->_[5] = (((s64)a0 * b0 + (s64)a1 * b1 + (s64)a2 * b2) >> FX32_INT_SHIFT); - dst->_[4] = (((s64)a0 * b->_[1] + (s64)a1 * b->_[4] + (s64)a2 * b->_[7] ) >> FX32_INT_SHIFT); + dst->_[5] = (((fx64)a0 * b0 + (fx64)a1 * b1 + (fx64)a2 * b2) >> FX32_INT_SHIFT); + dst->_[4] = (((fx64)a0 * b->_[1] + (fx64)a1 * b->_[4] + (fx64)a2 * b->_[7] ) >> FX32_INT_SHIFT); b0 = b->_[0]; b1 = b->_[3]; b2 = b->_[6]; - dst->_[3] = (((s64)a0 * b0 + (s64)a1 * b1 + (s64)a2 * b2) >> FX32_INT_SHIFT); + dst->_[3] = (((fx64)a0 * b0 + (fx64)a1 * b1 + (fx64)a2 * b2) >> FX32_INT_SHIFT); a0 = a->_[6]; a1 = a->_[7]; a2 = a->_[8]; - dst->_[6] = (((s64)a0 * b0 + (s64)a1 * b1 + (s64)a2 * b2) >> FX32_INT_SHIFT); - dst->_[7] = (((s64)a0 * b->_[1] + (s64)a1 * b->_[4] + (s64)a2 * b->_[7] ) >> FX32_INT_SHIFT); + dst->_[6] = (((fx64)a0 * b0 + (fx64)a1 * b1 + (fx64)a2 * b2) >> FX32_INT_SHIFT); + dst->_[7] = (((fx64)a0 * b->_[1] + (fx64)a1 * b->_[4] + (fx64)a2 * b->_[7] ) >> FX32_INT_SHIFT); b0 = b->_[2]; b1 = b->_[5]; b2 = b->_[8]; - dst->_[8] = (((s64)a0 * b0 + (s64)a1 * b1 + (s64)a2 * b2) >> FX32_INT_SHIFT); + dst->_[8] = (((fx64)a0 * b0 + (fx64)a1 * b1 + (fx64)a2 * b2) >> FX32_INT_SHIFT); a0 = a->_[9]; a1 = a->_[10]; a2 = a->_[11]; - dst->_[11] = ((((s64)a0 * b0 + (s64)a1 * b1 + (s64)a2 * b2) >> FX32_INT_SHIFT) + b->_[11]); - dst->_[10] = ((((s64)a0 * b->_[1] + (s64)a1 * b->_[4] + (s64)a2 * b->_[7]) >> FX32_INT_SHIFT) + b->_[10]); - dst->_[9] = ((((s64)a0 * b->_[0] + (s64)a1 * b->_[3] + (s64)a2 * b->_[6]) >> FX32_INT_SHIFT) + b->_[9]); + dst->_[11] = ((((fx64)a0 * b0 + (fx64)a1 * b1 + (fx64)a2 * b2) >> FX32_INT_SHIFT) + b->_[11]); + dst->_[10] = ((((fx64)a0 * b->_[1] + (fx64)a1 * b->_[4] + (fx64)a2 * b->_[7]) >> FX32_INT_SHIFT) + b->_[10]); + dst->_[9] = ((((fx64)a0 * b->_[0] + (fx64)a1 * b->_[3] + (fx64)a2 * b->_[6]) >> FX32_INT_SHIFT) + b->_[9]); if (dst == &temp) *c = temp; } void MTX_MultVec43(struct Vecx32 *vec, struct Mtx43 *mtx, struct Vecx32 *dst){ - s32 x, y, z; + fx32 x, y, z; x = vec->x; y = vec->y; z = vec->z; - dst->x = ((s64)x * mtx->_[0] + (s64)y * mtx->_[3] + (s64)z * mtx->_[6]) >> FX32_INT_SHIFT; + dst->x = ((fx64)x * mtx->_[0] + (fx64)y * mtx->_[3] + (fx64)z * mtx->_[6]) >> FX32_INT_SHIFT; dst->x += mtx->_[9]; - dst->y = ((s64)x * mtx->_[1] + (s64)y * mtx->_[4] + (s64)z * mtx->_[7]) >> FX32_INT_SHIFT; + dst->y = ((fx64)x * mtx->_[1] + (fx64)y * mtx->_[4] + (fx64)z * mtx->_[7]) >> FX32_INT_SHIFT; dst->y += mtx->_[10]; - dst->z = ((s64)x * mtx->_[2] + (s64)y * mtx->_[5] + (s64)z * mtx->_[8]) >> FX32_INT_SHIFT; + dst->z = ((fx64)x * mtx->_[2] + (fx64)y * mtx->_[5] + (fx64)z * mtx->_[8]) >> FX32_INT_SHIFT; dst->z += mtx->_[11]; } @@ -150,7 +150,7 @@ asm void MTX_Copy43To44_(struct Mtx43 *src, struct Mtx44 *dst){ } #pragma thumb on -asm void MTX_Scale43_(struct Mtx43 *dst, s32 x, s32 y, s32 z){ +asm void MTX_Scale43_(struct Mtx43 *dst, fx32 x, fx32 y, fx32 z){ stmia r0!, {r1} mov r1, #0x0 str r3, [r0, #0x1c] @@ -166,7 +166,7 @@ asm void MTX_Scale43_(struct Mtx43 *dst, s32 x, s32 y, s32 z){ #pragma thumb off #pragma thumb on -asm void MTX_RotX43_(struct Mtx43 *mtx, s32 sinphi, s32 cosphi){ +asm void MTX_RotX43_(struct Mtx43 *mtx, fx32 sinphi, fx32 cosphi){ str r1, [r0, #0x14] neg r1, r1 str r1, [r0, #0x1c] @@ -186,7 +186,7 @@ asm void MTX_RotX43_(struct Mtx43 *mtx, s32 sinphi, s32 cosphi){ #pragma thumb off #pragma thumb on -asm void MTX_RotY43_(struct Mtx43 *mtx, s32 sinphi, s32 cosphi){ +asm void MTX_RotY43_(struct Mtx43 *mtx, fx32 sinphi, fx32 cosphi){ str r1, [r0, #0x18] mov r3, #0x0 stmia r0!, {r2-r3} diff --git a/arm9/lib/src/FX_mtx44.c b/arm9/lib/src/FX_mtx44.c index 3c91b4df..8d158602 100644 --- a/arm9/lib/src/FX_mtx44.c +++ b/arm9/lib/src/FX_mtx44.c @@ -5,20 +5,20 @@ void MI_Copy48B(void *src, void *dst); -void MTX_TransApply44(struct Mtx44 *mtx, struct Mtx44 *dst, s32 x, s32 y, s32 z){ +void MTX_TransApply44(struct Mtx44 *mtx, struct Mtx44 *dst, fx32 x, fx32 y, fx32 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); + dst->_[12] = mtx->_[12] + (fx32)(((fx64)x * mtx->_[0] + (fx64)y * mtx->_[4] + (fx64)z * mtx->_[8] ) >> FX32_INT_SHIFT); + dst->_[13] = mtx->_[13] + (fx32)(((fx64)x * mtx->_[1] + (fx64)y * mtx->_[5] + (fx64)z * mtx->_[9] ) >> FX32_INT_SHIFT); + dst->_[14] = mtx->_[14] + (fx32)(((fx64)x * mtx->_[2] + (fx64)y * mtx->_[6] + (fx64)z * mtx->_[10]) >> FX32_INT_SHIFT); + dst->_[15] = mtx->_[15] + (fx32)(((fx64)x * mtx->_[3] + (fx64)y * mtx->_[7] + (fx64)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; + fx32 a0, a1, a2, a3; + fx32 b0, b1, b2, b3; if (c == b) dst = &temp; @@ -29,46 +29,46 @@ void MTX_Concat44(struct Mtx44 *a, struct Mtx44 *b, struct Mtx44 *c){ 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); + dst->_[0] = (((fx64)a0 * b->_[0] + (fx64)a1 * b->_[4] + (fx64)a2 * b->_[8] + (fx64)a3 * b->_[12]) >> FX32_INT_SHIFT); + dst->_[1] = (((fx64)a0 * b->_[1] + (fx64)a1 * b->_[5] + (fx64)a2 * b->_[9] + (fx64)a3 * b->_[13]) >> FX32_INT_SHIFT); + dst->_[3] = (((fx64)a0 * b->_[3] + (fx64)a1 * b->_[7] + (fx64)a2 * b->_[11] + (fx64)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); + dst->_[2] = (((fx64)a0 * b0 + (fx64)a1 * b1 + (fx64)a2 * b2 + (fx64)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); + dst->_[6] = (((fx64)a0 * b0 + (fx64)a1 * b1 + (fx64)a2 * b2 + (fx64)a3 * b3) >> FX32_INT_SHIFT); + dst->_[5] = (((fx64)a0 * b->_[1] + (fx64)a1 * b->_[5] + (fx64)a2 * b->_[9] + (fx64)a3 * b->_[13]) >> FX32_INT_SHIFT); + dst->_[7] = (((fx64)a0 * b->_[3] + (fx64)a1 * b->_[7] + (fx64)a2 * b->_[11] + (fx64)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); + dst->_[4] = (((fx64)a0 * b0 + (fx64)a1 * b1 + (fx64)a2 * b2 + (fx64)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); + dst->_[8] = (((fx64)a0 * b0 + (fx64)a1 * b1 + (fx64)a2 * b2 + (fx64)a3 * b3) >> FX32_INT_SHIFT); + dst->_[9] = (((fx64)a0 * b->_[1] + (fx64)a1 * b->_[5] + (fx64)a2 * b->_[9] + (fx64)a3 * b->_[13]) >> FX32_INT_SHIFT); + dst->_[11] = (((fx64)a0 * b->_[3] + (fx64)a1 * b->_[7] + (fx64)a2 * b->_[11] + (fx64)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); + dst->_[10] = (((fx64)a0 * b0 + (fx64)a1 * b1 + (fx64)a2 * b2 + (fx64)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); + dst->_[14] = (((fx64)a0 * b0 + (fx64)a1 * b1 + (fx64)a2 * b2 + (fx64)a3 * b3) >> FX32_INT_SHIFT); + dst->_[13] = (((fx64)a0 * b->_[1] + (fx64)a1 * b->_[5] + (fx64)a2 * b->_[9] + (fx64)a3 * b->_[13]) >> FX32_INT_SHIFT); + dst->_[12] = (((fx64)a0 * b->_[0] + (fx64)a1 * b->_[4] + (fx64)a2 * b->_[8] + (fx64)a3 * b->_[12]) >> FX32_INT_SHIFT); + dst->_[15] = (((fx64)a0 * b->_[3] + (fx64)a1 * b->_[7] + (fx64)a2 * b->_[11] + (fx64)a3 * b->_[15]) >> FX32_INT_SHIFT); if (dst == &temp) *c = temp; } @@ -104,7 +104,7 @@ asm void MTX_Copy44To43_(struct Mtx44 *src, struct Mtx43 *dst){ } #pragma thumb on -asm void MTX_RotX44_(struct Mtx44 *mtx, s32 sinphi, s32 cosphi){ +asm void MTX_RotX44_(struct Mtx44 *mtx, fx32 sinphi, fx32 cosphi){ str r2, [r0, #0x14] str r2, [r0, #0x28] str r1, [r0, #0x18] @@ -127,7 +127,7 @@ asm void MTX_RotX44_(struct Mtx44 *mtx, s32 sinphi, s32 cosphi){ #pragma thumb off #pragma thumb on -asm void MTX_RotY44_(struct Mtx44 *mtx, s32 sinphi, s32 cosphi){ +asm void MTX_RotY44_(struct Mtx44 *mtx, fx32 sinphi, fx32 cosphi){ str r2, [r0, #0x0] str r2, [r0, #0x28] str r1, [r0, #0x20] @@ -150,7 +150,7 @@ asm void MTX_RotY44_(struct Mtx44 *mtx, s32 sinphi, s32 cosphi){ #pragma thumb off #pragma thumb on -asm void MTX_RotZ44_(struct Mtx44 *mtx, s32 sinphi, s32 cosphi){ +asm void MTX_RotZ44_(struct Mtx44 *mtx, fx32 sinphi, fx32 cosphi){ str r2, [r0, #0x0] str r2, [r0, #0x14] str r1, [r0, #0x4] diff --git a/arm9/lib/src/FX_vec.c b/arm9/lib/src/FX_vec.c index 7b838829..10a792be 100644 --- a/arm9/lib/src/FX_vec.c +++ b/arm9/lib/src/FX_vec.c @@ -20,29 +20,29 @@ void VEC_Fx16Add(struct Vecx16 *a, struct Vecx16 *b, struct Vecx16 *dst){ dst->z = a->z + b->z; } -s32 VEC_DotProduct(struct Vecx32 *a, struct Vecx32 *b){ - return ((s64)a->x * b->x + (s64)a->y * b->y + (s64)a->z * b->z + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT; +fx32 VEC_DotProduct(struct Vecx32 *a, struct Vecx32 *b){ + return ((fx64)a->x * b->x + (fx64)a->y * b->y + (fx64)a->z * b->z + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT; } -s32 VEC_Fx16DotProduct(struct Vecx16 *a, struct Vecx16 *b){ - s32 temp1, temp2; +fx32 VEC_Fx16DotProduct(struct Vecx16 *a, struct Vecx16 *b){ + fx32 temp1, temp2; temp1 = (a->x * b->x) + (a->y * b->y); temp2 = (a->z * b->z) + (1 << (FX64_INT_SHIFT - 1)); - return (s32)(((s64)temp1 + temp2) >> FX64_INT_SHIFT); + return (fx32)(((fx64)temp1 + temp2) >> FX64_INT_SHIFT); } void VEC_CrossProduct(struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst){ - s32 x, y, z; - x = (s32)(((s64)a->y * b->z - (s64)a->z * b->y + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT); - y = (s32)(((s64)a->z * b->x - (s64)a->x * b->z + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT); - z = (s32)(((s64)a->x * b->y - (s64)a->y * b->x + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT); + fx32 x, y, z; + x = (fx32)(((fx64)a->y * b->z - (fx64)a->z * b->y + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT); + y = (fx32)(((fx64)a->z * b->x - (fx64)a->x * b->z + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT); + z = (fx32)(((fx64)a->x * b->y - (fx64)a->y * b->x + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT); dst->x = x; dst->y = y; dst->z = z; } void VEC_Fx16CrossProduct(struct Vecx16 *a, struct Vecx16 *b, struct Vecx16 *dst){ - s32 x, y, z; + fx32 x, y, z; x = ((a->y * b->z - a->z * b->y + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT); y = ((a->z * b->x - a->x * b->z + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT); z = ((a->x * b->y - a->y * b->x + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT); @@ -51,20 +51,20 @@ void VEC_Fx16CrossProduct(struct Vecx16 *a, struct Vecx16 *b, struct Vecx16 *dst dst->z = z; } -s32 VEC_Mag(struct Vecx32 *a){ - s64 l2 = (s64)a->x * a->x; - l2 += (s64)a->y * a->y; - l2 += (s64)a->z * a->z; +fx32 VEC_Mag(struct Vecx32 *a){ + fx64 l2 = (fx64)a->x * a->x; + l2 += (fx64)a->y * a->y; + l2 += (fx64)a->z * a->z; SETREG16(HW_REG_SQRTCNT, 0x1); SETREG64(HW_REG_SQRT_PARAM, l2 * 4); while (READREG16(HW_REG_SQRTCNT) & 0x8000); //wait for coprocessor to finish - return ((s32)READREG32(HW_REG_SQRT_RESULT) + 1) >> 1; + return ((fx32)READREG32(HW_REG_SQRT_RESULT) + 1) >> 1; } void VEC_Normalize(struct Vecx32 *a, struct Vecx32 *dst){ - s64 l2 = (s64)a->x * a->x; - l2 += (s64)a->y * a->y; - l2 += (s64)a->z * a->z; + fx64 l2 = (fx64)a->x * a->x; + l2 += (fx64)a->y * a->y; + l2 += (fx64)a->z * a->z; //1/sqrt(l) is computed by calculating sqrt(l)*(1/l) SETREG16(HW_REG_DIVCNT, 0x2); SETREG64(HW_REG_DIV_NUMER, 0x0100000000000000); @@ -72,7 +72,7 @@ void VEC_Normalize(struct Vecx32 *a, struct Vecx32 *dst){ SETREG16(HW_REG_SQRTCNT, 0x1); SETREG64(HW_REG_SQRT_PARAM, l2 * 4); while (READREG16(HW_REG_SQRTCNT) & 0x8000); //wait for sqrt to finish - s32 sqrtresult = READREG32(HW_REG_SQRT_RESULT); + fx32 sqrtresult = READREG32(HW_REG_SQRT_RESULT); while (READREG16(HW_REG_DIVCNT) & 0x8000); //wait for division to finish l2 = READREG64(HW_REG_DIV_RESULT); l2 = sqrtresult * l2; @@ -82,7 +82,7 @@ void VEC_Normalize(struct Vecx32 *a, struct Vecx32 *dst){ } void VEC_Fx16Normalize(struct Vecx16 *a, struct Vecx16 *dst){ - s64 l2 = a->x * a->x; + fx64 l2 = a->x * a->x; l2 += a->y * a->y; l2 += a->z * a->z; //1/sqrt(l) is computed by calculating sqrt(l)*(1/l) @@ -92,7 +92,7 @@ void VEC_Fx16Normalize(struct Vecx16 *a, struct Vecx16 *dst){ SETREG16(HW_REG_SQRTCNT, 0x1); SETREG64(HW_REG_SQRT_PARAM, l2 * 4); while (READREG16(HW_REG_SQRTCNT) & 0x8000); //wait for sqrt to finish - s32 sqrtresult = READREG32(HW_REG_SQRT_RESULT); + fx32 sqrtresult = READREG32(HW_REG_SQRT_RESULT); while (READREG16(HW_REG_DIVCNT) & 0x8000); //wait for division to finish l2 = READREG64(HW_REG_DIV_RESULT); l2 = sqrtresult * l2; @@ -101,8 +101,8 @@ void VEC_Fx16Normalize(struct Vecx16 *a, struct Vecx16 *dst){ dst->z = (l2 * a->z + (1LL << (0x2D - 1))) >> 0x2D; } -void VEC_MultAdd(s32 factor, struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst){ - dst->x = (s32)(((s64)factor * a->x) >> FX32_INT_SHIFT) + b->x; - dst->y = (s32)(((s64)factor * a->y) >> FX32_INT_SHIFT) + b->y; - dst->z = (s32)(((s64)factor * a->z) >> FX32_INT_SHIFT) + b->z; +void VEC_MultAdd(fx32 factor, struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst){ + dst->x = (fx32)(((fx64)factor * a->x) >> FX32_INT_SHIFT) + b->x; + dst->y = (fx32)(((fx64)factor * a->y) >> FX32_INT_SHIFT) + b->y; + dst->z = (fx32)(((fx64)factor * a->z) >> FX32_INT_SHIFT) + b->z; } -- cgit v1.2.3 From 155f50c9890a93fbc191e078d304c161809e8fc6 Mon Sep 17 00:00:00 2001 From: Made Date: Mon, 4 May 2020 17:26:31 +0200 Subject: Move header and fix accidental name changes --- arm9/lib/include/fx.h | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++ arm9/lib/src/FX_cp.c | 4 +- include/fx.h | 176 -------------------------------------------------- 3 files changed, 178 insertions(+), 178 deletions(-) create mode 100644 arm9/lib/include/fx.h delete mode 100644 include/fx.h diff --git a/arm9/lib/include/fx.h b/arm9/lib/include/fx.h new file mode 100644 index 00000000..7e74d079 --- /dev/null +++ b/arm9/lib/include/fx.h @@ -0,0 +1,176 @@ +#ifndef GUARD_FX_H +#define GUARD_FX_H + +typedef s16 fx16; +typedef s32 fx32; +typedef s64 fx64; +typedef s64 fx64c; + +#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 +#define FX32_INT_SHIFT 0xC + +#define FX64_INT_MASK 0xFFFFFFFFFFFFF000 +#define FX64_INT_ABS_MASK 0x7FFFFFFFFFFFF000 +#define FX64_FRAC_MASK 0x0000000000000FFF +#define FX64_INT_SHIFT 0xC + +#define FX64C_INT_MASK 0xFFFFFFFF00000000 +#define FX64C_INT_ABS_MASK 0x7FFFFFFF00000000 +#define FX64C_FRAC_MASK 0x00000000FFFFFFFF +#define FX64C_INT_SHIFT 0x20 + +#define FX_INT(TYPE, x) (((x) & TYPE ## _INT_MASK) >> TYPE ## _INT_SHIFT) +#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) + +#define FX64_INT(x) FX_INT(FX64, x) +#define FX64_INT_ABS(x) FX_INT_ABS(FX64, x) +#define FX64_FRAC(x) FX_FRAC(FX64, x) + +#define FX64C_INT(x) FX_INT(FX64C, x) +#define FX64C_INT_ABS(x) FX_INT_ABS(FX64C, x) +#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 +#define HW_REG_DIV_RESULT 0x040002A0 +#define HW_REG_DIVREM_RESULT 0x040002A8 + +#define HW_REG_SQRTCNT 0x040002B0 +#define HW_REG_SQRT_RESULT 0x040002B4 +#define HW_REG_SQRT_PARAM 0x040002B8 + +#define SETREG16(x, y) ((*(vu16 *)x) = y) +#define SETREG32(x, y) ((*(vu32 *)x) = y) +#define SETREG64(x, y) ((*(vu64 *)x) = y) +#define READREG16(x) (*(vu16 *)x) +#define READREG32(x) (*(vu32 *)x) +#define READREG64(x) (*(vu64 *)x) + +#define FX32_MUL(a, b) ((fx32)(((fx64)a * b) >> FX32_INT_SHIFT)) +#define FX32_MUL_ADD_MUL(a, b, c, d) ((fx32)(((fx64)a * b + (fx64)c * d) >> FX32_INT_SHIFT)) +//the extra term here is for rounding +#define FX32_MUL_SUB_MUL(a, b, c, d) ((fx32)(((fx64)a * b - (fx64)c * d + (1 << (FX32_INT_SHIFT - 1))) >> FX32_INT_SHIFT)) + +struct Vecx32 +{ + fx32 x; + fx32 y; + fx32 z; +}; + +struct Vecx16 +{ + fx16 x; + fx16 y; + fx16 z; +}; + +//Matrices are indexed as [column][row] +struct Mtx44 +{ + fx32 _[16]; +}; + +struct Mtx43 +{ + fx32 _[12]; +}; + +struct Mtx33 +{ + fx32 _[9]; +}; + +struct Mtx22 +{ + fx32 _[4]; +}; + +//FX +void FX_Init(); +fx32 FX_Modf(fx32 x, fx32 *iptr); + +//Atan +u16 FX_Atan(fx32 x); +u16 FX_Atan2(fx32 x, fx32 y); + +//Vec +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); +fx32 VEC_DotProduct(struct Vecx32 *x, struct Vecx32 *y); +fx32 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); +fx32 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(fx32 factor, struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst); + +//CP +fx32 FX_Div(fx32 numerator, fx32 denominator); +fx32 FX_Inv(fx32 x); +fx32 FX_Sqrt(fx32 x); +fx64 FX_GetDivResultFx64c(); +fx32 FX_GetDivResult(); +void FX_InvAsync(fx32 x); +fx32 FX_GetSqrtResult(); +void FX_DivAsync(fx32 numerator, fx32 denominator); +fx32 FX_DivS32(fx32 numerator, fx32 denominator); +fx32 FX_ModS32(fx32 num, fx32 mod); + +//Mtx +//The functions ending in underscores seem to be in assembly originally +//Mtx44 +void MTX_TransApply44(struct Mtx44 *mtx, struct Mtx44 *dst, fx32 x, fx32 y, fx32 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, fx32 sinphi, fx32 cosphi); +void MTX_RotY44_(struct Mtx44 *mtx, fx32 sinphi, fx32 cosphi); +void MTX_RotZ44_(struct Mtx44 *mtx, fx32 sinphi, fx32 cosphi); + +//Mtx43 +void MTX_ScaleApply33(struct Mtx33 *mtx, struct Mtx33 *dst, fx32 x, fx32 y, fx32 z); +fx32 MTX_Inverse43(struct Mtx43 *mtx, struct Mtx43 *inv); +void MTX_Concat43(struct Mtx43 *a, struct Mtx43 *b, struct Mtx43 *c); +void MTX_MultVec43(struct Vecx32 *vec, struct Mtx43 *mtx, struct Vecx32 *dst); +void MTX_Identity43_(struct Mtx43 *mtx); +void MTX_Copy43To44_(struct Mtx43 *src, struct Mtx44 *dst); +void MTX_Scale43_(struct Mtx43 *dst, fx32 x, fx32 y, fx32 z); +void MTX_RotX43_(struct Mtx43 *mtx, fx32 sinphi, fx32 cosphi); +void MTX_RotY43_(struct Mtx43 *mtx, fx32 sinphi, fx32 cosphi); + +//Mtx33 +void MTX_ScaleApply33(struct Mtx33 *mtx, struct Mtx33 *dst, fx32 x, fx32 y, fx32 z); +void MTX_Concat33(struct Mtx33 *a, struct Mtx33 *b, struct Mtx33 *c); +void MTX_MultVec33(struct Vecx32 *vec, struct Mtx33 *mtx, struct Vecx32 *dst); +void MTX_Identity33_(struct Mtx33 *mtx); +void MTX_RotX33_(struct Mtx33 *mtx, fx32 sinphi, fx32 cosphi); +void MTX_RotY33_(struct Mtx33 *mtx, fx32 sinphi, fx32 cosphi); +void MTX_RotZ33_(struct Mtx33 *mtx, fx32 sinphi, fx32 cosphi); + +//Mtx22 +void MTX_ScaleApply22(struct Mtx22 *mtx, struct Mtx22 *dst, fx32 x, fx32 y); +void MTX_Identity22_(struct Mtx22 *mtx); +void MTX_Rot22_(struct Mtx22 *mtx, fx32 sinphi, fx32 cosphi); + +#endif //GUARD_FX_H diff --git a/arm9/lib/src/FX_cp.c b/arm9/lib/src/FX_cp.c index 76dea4b4..a5a8d9cb 100644 --- a/arm9/lib/src/FX_cp.c +++ b/arm9/lib/src/FX_cp.c @@ -53,7 +53,7 @@ void FX_DivAsync(fx32 numerator, fx32 denominator){ SETREG64(HW_REG_DIV_DENOM, (u32)denominator); } -fx32 FX_Divfx32(fx32 numerator, fx32 denominator){ +fx32 FX_DivS32(fx32 numerator, fx32 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); @@ -61,7 +61,7 @@ fx32 FX_Divfx32(fx32 numerator, fx32 denominator){ return READREG32(HW_REG_DIV_RESULT); } -fx32 FX_Modfx32(fx32 num, fx32 mod){ +fx32 FX_ModS32(fx32 num, fx32 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); diff --git a/include/fx.h b/include/fx.h deleted file mode 100644 index bbbf621a..00000000 --- a/include/fx.h +++ /dev/null @@ -1,176 +0,0 @@ -#ifndef GUARD_FX_H -#define GUARD_FX_H - -typedef s16 fx16; -typedef s32 fx32; -typedef s64 fx64; -typedef s64 fx64c; - -#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 -#define FX32_INT_SHIFT 0xC - -#define FX64_INT_MASK 0xFFFFFFFFFFFFF000 -#define FX64_INT_ABS_MASK 0x7FFFFFFFFFFFF000 -#define FX64_FRAC_MASK 0x0000000000000FFF -#define FX64_INT_SHIFT 0xC - -#define FX64C_INT_MASK 0xFFFFFFFF00000000 -#define FX64C_INT_ABS_MASK 0x7FFFFFFF00000000 -#define FX64C_FRAC_MASK 0x00000000FFFFFFFF -#define FX64C_INT_SHIFT 0x20 - -#define FX_INT(TYPE, x) (((x) & TYPE ## _INT_MASK) >> TYPE ## _INT_SHIFT) -#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) - -#define FX64_INT(x) FX_INT(FX64, x) -#define FX64_INT_ABS(x) FX_INT_ABS(FX64, x) -#define FX64_FRAC(x) FX_FRAC(FX64, x) - -#define FX64C_INT(x) FX_INT(FX64C, x) -#define FX64C_INT_ABS(x) FX_INT_ABS(FX64C, x) -#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 -#define HW_REG_DIV_RESULT 0x040002A0 -#define HW_REG_DIVREM_RESULT 0x040002A8 - -#define HW_REG_SQRTCNT 0x040002B0 -#define HW_REG_SQRT_RESULT 0x040002B4 -#define HW_REG_SQRT_PARAM 0x040002B8 - -#define SETREG16(x, y) ((*(vu16 *)x) = y) -#define SETREG32(x, y) ((*(vu32 *)x) = y) -#define SETREG64(x, y) ((*(vu64 *)x) = y) -#define READREG16(x) (*(vu16 *)x) -#define READREG32(x) (*(vu32 *)x) -#define READREG64(x) (*(vu64 *)x) - -#define FX32_MUL(a, b) ((fx32)(((fx64)a * b) >> FX32_INT_SHIFT)) -#define FX32_MUL_ADD_MUL(a, b, c, d) ((fx32)(((fx64)a * b + (fx64)c * d) >> FX32_INT_SHIFT)) -//the extra term here is for rounding -#define FX32_MUL_SUB_MUL(a, b, c, d) ((fx32)(((fx64)a * b - (fx64)c * d + (1 << (FX32_INT_SHIFT - 1))) >> FX32_INT_SHIFT)) - -struct Vecx32 -{ - fx32 x; - fx32 y; - fx32 z; -}; - -struct Vecx16 -{ - fx16 x; - fx16 y; - fx16 z; -}; - -//Matrices are indexed as [column][row] -struct Mtx44 -{ - fx32 _[16]; -}; - -struct Mtx43 -{ - fx32 _[12]; -}; - -struct Mtx33 -{ - fx32 _[9]; -}; - -struct Mtx22 -{ - fx32 _[4]; -}; - -//FX -void FX_Init(); -fx32 FX_Modf(fx32 x, fx32 *iptr); - -//Atan -u16 FX_Atan(fx32 x); -u16 FX_Atan2(fx32 x, fx32 y); - -//Vec -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); -fx32 VEC_DotProduct(struct Vecx32 *x, struct Vecx32 *y); -fx32 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); -fx32 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(fx32 factor, struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst); - -//CP -fx32 FX_Div(fx32 numerator, fx32 denominator); -fx32 FX_Inv(fx32 x); -fx32 FX_Sqrt(fx32 x); -fx64 FX_GetDivResultFx64c(); -fx32 FX_GetDivResult(); -void FX_InvAsync(fx32 x); -fx32 FX_GetSqrtResult(); -void FX_DivAsync(fx32 numerator, fx32 denominator); -fx32 FX_Divfx32(fx32 numerator, fx32 denominator); -fx32 FX_Modfx32(fx32 num, fx32 mod); - -//Mtx -//The functions ending in underscores seem to be in assembly originally -//Mtx44 -void MTX_TransApply44(struct Mtx44 *mtx, struct Mtx44 *dst, fx32 x, fx32 y, fx32 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, fx32 sinphi, fx32 cosphi); -void MTX_RotY44_(struct Mtx44 *mtx, fx32 sinphi, fx32 cosphi); -void MTX_RotZ44_(struct Mtx44 *mtx, fx32 sinphi, fx32 cosphi); - -//Mtx43 -void MTX_ScaleApply33(struct Mtx33 *mtx, struct Mtx33 *dst, fx32 x, fx32 y, fx32 z); -fx32 MTX_Inverse43(struct Mtx43 *mtx, struct Mtx43 *inv); -void MTX_Concat43(struct Mtx43 *a, struct Mtx43 *b, struct Mtx43 *c); -void MTX_MultVec43(struct Vecx32 *vec, struct Mtx43 *mtx, struct Vecx32 *dst); -void MTX_Identity43_(struct Mtx43 *mtx); -void MTX_Copy43To44_(struct Mtx43 *src, struct Mtx44 *dst); -void MTX_Scale43_(struct Mtx43 *dst, fx32 x, fx32 y, fx32 z); -void MTX_RotX43_(struct Mtx43 *mtx, fx32 sinphi, fx32 cosphi); -void MTX_RotY43_(struct Mtx43 *mtx, fx32 sinphi, fx32 cosphi); - -//Mtx33 -void MTX_ScaleApply33(struct Mtx33 *mtx, struct Mtx33 *dst, fx32 x, fx32 y, fx32 z); -void MTX_Concat33(struct Mtx33 *a, struct Mtx33 *b, struct Mtx33 *c); -void MTX_MultVec33(struct Vecx32 *vec, struct Mtx33 *mtx, struct Vecx32 *dst); -void MTX_Identity33_(struct Mtx33 *mtx); -void MTX_RotX33_(struct Mtx33 *mtx, fx32 sinphi, fx32 cosphi); -void MTX_RotY33_(struct Mtx33 *mtx, fx32 sinphi, fx32 cosphi); -void MTX_RotZ33_(struct Mtx33 *mtx, fx32 sinphi, fx32 cosphi); - -//Mtx22 -void MTX_ScaleApply22(struct Mtx22 *mtx, struct Mtx22 *dst, fx32 x, fx32 y); -void MTX_Identity22_(struct Mtx22 *mtx); -void MTX_Rot22_(struct Mtx22 *mtx, fx32 sinphi, fx32 cosphi); - -#endif //GUARD_FX_H -- cgit v1.2.3 From f4c61411673207da9d6be013674f95eeb07408b5 Mon Sep 17 00:00:00 2001 From: Made Date: Mon, 4 May 2020 17:48:38 +0200 Subject: Add function attributes and remove thumb pragmas --- arm9/lib/src/FX.c | 4 ++-- arm9/lib/src/FX_atan.c | 4 ++-- arm9/lib/src/FX_cp.c | 20 ++++++++++---------- arm9/lib/src/FX_mtx22.c | 8 +++----- arm9/lib/src/FX_mtx33.c | 20 +++++++------------- arm9/lib/src/FX_mtx43.c | 24 +++++++++--------------- arm9/lib/src/FX_mtx44.c | 21 ++++++++------------- arm9/lib/src/FX_vec.c | 22 +++++++++++----------- 8 files changed, 52 insertions(+), 71 deletions(-) diff --git a/arm9/lib/src/FX.c b/arm9/lib/src/FX.c index f39b1995..4b9c213f 100644 --- a/arm9/lib/src/FX.c +++ b/arm9/lib/src/FX.c @@ -2,11 +2,11 @@ #include "main.h" #include "fx.h" -void FX_Init(){ +ARM_FUNC void FX_Init(){ return; } -fx32 FX_Modf(fx32 x, fx32 *iptr){ +ARM_FUNC fx32 FX_Modf(fx32 x, fx32 *iptr){ if (x >= 0) { *iptr = x & 0x7FFFF000; diff --git a/arm9/lib/src/FX_atan.c b/arm9/lib/src/FX_atan.c index 085763f8..979895a8 100644 --- a/arm9/lib/src/FX_atan.c +++ b/arm9/lib/src/FX_atan.c @@ -4,7 +4,7 @@ extern fx16 FX_AtanTable_[]; -u16 FX_Atan(fx32 x){ +ARM_FUNC u16 FX_Atan(fx32 x){ if (x >= 0) { if (x > 0x1000) @@ -41,7 +41,7 @@ u16 FX_Atan(fx32 x){ } } -u16 FX_Atan2(fx32 x, fx32 y){ +ARM_FUNC u16 FX_Atan2(fx32 x, fx32 y){ fx32 result; u32 positive, bias, denominator, numerator; if (x > 0) diff --git a/arm9/lib/src/FX_cp.c b/arm9/lib/src/FX_cp.c index a5a8d9cb..2ca9d720 100644 --- a/arm9/lib/src/FX_cp.c +++ b/arm9/lib/src/FX_cp.c @@ -3,17 +3,17 @@ #include "fx.h" -fx32 FX_Div(fx32 numerator, fx32 denominator){ +ARM_FUNC fx32 FX_Div(fx32 numerator, fx32 denominator){ FX_DivAsync(numerator, denominator); return FX_GetDivResult(); } -fx32 FX_Inv(fx32 x){ +ARM_FUNC fx32 FX_Inv(fx32 x){ FX_InvAsync(x); return FX_GetDivResult(); } -fx32 FX_Sqrt(fx32 x){ +ARM_FUNC fx32 FX_Sqrt(fx32 x){ if (x > 0) { SETREG16(HW_REG_SQRTCNT, 0x1); @@ -26,34 +26,34 @@ fx32 FX_Sqrt(fx32 x){ } } -fx64c FX_GetDivResultFx64c(){ +ARM_FUNC fx64c FX_GetDivResultFx64c(){ while (READREG16(HW_REG_DIVCNT) & 0x8000); return READREG64(HW_REG_DIV_RESULT); } -fx32 FX_GetDivResult(){ +ARM_FUNC fx32 FX_GetDivResult(){ while (READREG16(HW_REG_DIVCNT) & 0x8000); return (READREG64(HW_REG_DIV_RESULT) + (1 << (0x14 - 1))) >> 0x14; } -void FX_InvAsync(fx32 x){ +ARM_FUNC void FX_InvAsync(fx32 x){ SETREG16(HW_REG_DIVCNT, 0x1); SETREG64(HW_REG_DIV_NUMER, (fx64)0x00001000 << 32); SETREG64(HW_REG_DIV_DENOM, (u32)x); } -fx32 FX_GetSqrtResult(){ +ARM_FUNC fx32 FX_GetSqrtResult(){ while (READREG16(HW_REG_SQRTCNT) & 0x8000); return (READREG32(HW_REG_SQRT_RESULT) + (1 << (0xA - 1))) >> 0xA; } -void FX_DivAsync(fx32 numerator, fx32 denominator){ +ARM_FUNC void FX_DivAsync(fx32 numerator, fx32 denominator){ SETREG16(HW_REG_DIVCNT, 0x1); SETREG64(HW_REG_DIV_NUMER, (fx64)numerator << 32); SETREG64(HW_REG_DIV_DENOM, (u32)denominator); } -fx32 FX_DivS32(fx32 numerator, fx32 denominator){ +ARM_FUNC fx32 FX_DivS32(fx32 numerator, fx32 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); @@ -61,7 +61,7 @@ fx32 FX_DivS32(fx32 numerator, fx32 denominator){ return READREG32(HW_REG_DIV_RESULT); } -fx32 FX_ModS32(fx32 num, fx32 mod){ +ARM_FUNC fx32 FX_ModS32(fx32 num, fx32 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); diff --git a/arm9/lib/src/FX_mtx22.c b/arm9/lib/src/FX_mtx22.c index 19504574..38387c64 100644 --- a/arm9/lib/src/FX_mtx22.c +++ b/arm9/lib/src/FX_mtx22.c @@ -2,14 +2,14 @@ #include "main.h" #include "fx.h" -void MTX_ScaleApply22(struct Mtx22 *mtx, struct Mtx22 *dst, fx32 x, fx32 y){ +ARM_FUNC void MTX_ScaleApply22(struct Mtx22 *mtx, struct Mtx22 *dst, fx32 x, fx32 y){ dst->_[0] = ((fx64)x * mtx->_[0]) >> FX32_INT_SHIFT; dst->_[1] = ((fx64)x * mtx->_[1]) >> FX32_INT_SHIFT; dst->_[2] = ((fx64)y * mtx->_[2]) >> FX32_INT_SHIFT; dst->_[3] = ((fx64)y * mtx->_[3]) >> FX32_INT_SHIFT; } -asm void MTX_Identity22_(struct Mtx22 *mtx){ +ARM_FUNC asm void MTX_Identity22_(struct Mtx22 *mtx){ mov r1, #0x0 mov r2, #0x1000 mov r3, #0x0 @@ -18,8 +18,7 @@ asm void MTX_Identity22_(struct Mtx22 *mtx){ bx lr } -#pragma thumb on -asm void MTX_Rot22_(struct Mtx22 *mtx, fx32 sinphi, fx32 cosphi){ +THUMB_FUNC asm void MTX_Rot22_(struct Mtx22 *mtx, fx32 sinphi, fx32 cosphi){ str r2, [r0, #0x0] str r1, [r0, #0x4] neg r1, r1 @@ -27,4 +26,3 @@ asm void MTX_Rot22_(struct Mtx22 *mtx, fx32 sinphi, fx32 cosphi){ str r2, [r0, #0xc] bx lr } -#pragma thumb off diff --git a/arm9/lib/src/FX_mtx33.c b/arm9/lib/src/FX_mtx33.c index 391a6104..90beddba 100644 --- a/arm9/lib/src/FX_mtx33.c +++ b/arm9/lib/src/FX_mtx33.c @@ -2,7 +2,7 @@ #include "main.h" #include "fx.h" -void MTX_ScaleApply33(struct Mtx33 *mtx, struct Mtx33 *dst, fx32 x, fx32 y, fx32 z){ +ARM_FUNC void MTX_ScaleApply33(struct Mtx33 *mtx, struct Mtx33 *dst, fx32 x, fx32 y, fx32 z){ dst->_[0] = ((fx64)x * mtx->_[0]) >> FX32_INT_SHIFT; dst->_[1] = ((fx64)x * mtx->_[1]) >> FX32_INT_SHIFT; dst->_[2] = ((fx64)x * mtx->_[2]) >> FX32_INT_SHIFT; @@ -14,7 +14,7 @@ void MTX_ScaleApply33(struct Mtx33 *mtx, struct Mtx33 *dst, fx32 x, fx32 y, fx32 dst->_[8] = ((fx64)z * mtx->_[8]) >> FX32_INT_SHIFT; } -void MTX_Concat33(struct Mtx33 *a, struct Mtx33 *b, struct Mtx33 *c){ +ARM_FUNC void MTX_Concat33(struct Mtx33 *a, struct Mtx33 *b, struct Mtx33 *c){ struct Mtx33 temp; struct Mtx33 *dst; fx32 a0, a1, a2; @@ -57,7 +57,7 @@ void MTX_Concat33(struct Mtx33 *a, struct Mtx33 *b, struct Mtx33 *c){ *c = temp; } -void MTX_MultVec33(struct Vecx32 *vec, struct Mtx33 *mtx, struct Vecx32 *dst){ +ARM_FUNC void MTX_MultVec33(struct Vecx32 *vec, struct Mtx33 *mtx, struct Vecx32 *dst){ fx32 x, y, z; x = vec->x; y = vec->y; @@ -67,7 +67,7 @@ void MTX_MultVec33(struct Vecx32 *vec, struct Mtx33 *mtx, struct Vecx32 *dst){ dst->z = ((fx64)x * mtx->_[2] + (fx64)y * mtx->_[5] + (fx64)z * mtx->_[8]) >> FX32_INT_SHIFT; } -asm void MTX_Identity33_(struct Mtx33 *mtx){ +ARM_FUNC asm void MTX_Identity33_(struct Mtx33 *mtx){ mov r2, #0x1000 str r2, [r0, #0x20] mov r3, #0x0 @@ -79,8 +79,7 @@ asm void MTX_Identity33_(struct Mtx33 *mtx){ bx lr } -#pragma thumb on -asm void MTX_RotX33_(struct Mtx33 *mtx, fx32 sinphi, fx32 cosphi){ +THUMB_FUNC asm void MTX_RotX33_(struct Mtx33 *mtx, fx32 sinphi, fx32 cosphi){ mov r3, #0x1 lsl r3, r3, #0xc str r3, [r0, #0x0] @@ -96,10 +95,8 @@ asm void MTX_RotX33_(struct Mtx33 *mtx, fx32 sinphi, fx32 cosphi){ str r2, [r0, #0x20] bx lr } -#pragma thumb off -#pragma thumb on -asm void MTX_RotY33_(struct Mtx33 *mtx, fx32 sinphi, fx32 cosphi){ +THUMB_FUNC asm void MTX_RotY33_(struct Mtx33 *mtx, fx32 sinphi, fx32 cosphi){ str r2, [r0, #0x0] str r2, [r0, #0x20] mov r3, #0x0 @@ -115,10 +112,8 @@ asm void MTX_RotY33_(struct Mtx33 *mtx, fx32 sinphi, fx32 cosphi){ str r3, [r0, #0x10] bx lr } -#pragma thumb off -#pragma thumb on -asm void MTX_RotZ33_(struct Mtx33 *mtx, fx32 sinphi, fx32 cosphi){ +THUMB_FUNC asm void MTX_RotZ33_(struct Mtx33 *mtx, fx32 sinphi, fx32 cosphi){ stmia r0!, {r2} mov r3, #0x0 stmia r0!, {r1,r3} @@ -132,4 +127,3 @@ asm void MTX_RotZ33_(struct Mtx33 *mtx, fx32 sinphi, fx32 cosphi){ str r1, [r0, #0xc] bx lr } -#pragma thumb off diff --git a/arm9/lib/src/FX_mtx43.c b/arm9/lib/src/FX_mtx43.c index 862bd6f2..96ab4062 100644 --- a/arm9/lib/src/FX_mtx43.c +++ b/arm9/lib/src/FX_mtx43.c @@ -3,7 +3,7 @@ #include "fx.h" -void MTX_ScaleApply43(struct Mtx43 *mtx, struct Mtx43 *dst, fx32 x, fx32 y, fx32 z){ +ARM_FUNC void MTX_ScaleApply43(struct Mtx43 *mtx, struct Mtx43 *dst, fx32 x, fx32 y, fx32 z){ //this works because matrices are indexed columns first MTX_ScaleApply33((struct Mtx33 *)mtx, (struct Mtx33 *)dst, x, y, z); dst->_[9] = mtx->_[9]; @@ -11,7 +11,7 @@ void MTX_ScaleApply43(struct Mtx43 *mtx, struct Mtx43 *dst, fx32 x, fx32 y, fx32 dst->_[11] = mtx->_[11]; } -fx32 MTX_Inverse43(struct Mtx43 *mtx, struct Mtx43 *inv){ +ARM_FUNC fx32 MTX_Inverse43(struct Mtx43 *mtx, struct Mtx43 *inv){ struct Mtx43 tempmat; struct Mtx43 *dst; fx32 det0, det1, det2, det; @@ -59,7 +59,7 @@ fx32 MTX_Inverse43(struct Mtx43 *mtx, struct Mtx43 *inv){ return 0; } -void MTX_Concat43(struct Mtx43 *a, struct Mtx43 *b, struct Mtx43 *c){ +ARM_FUNC void MTX_Concat43(struct Mtx43 *a, struct Mtx43 *b, struct Mtx43 *c){ struct Mtx43 temp; struct Mtx43 *dst; fx32 a0, a1, a2; @@ -107,7 +107,7 @@ void MTX_Concat43(struct Mtx43 *a, struct Mtx43 *b, struct Mtx43 *c){ *c = temp; } -void MTX_MultVec43(struct Vecx32 *vec, struct Mtx43 *mtx, struct Vecx32 *dst){ +ARM_FUNC void MTX_MultVec43(struct Vecx32 *vec, struct Mtx43 *mtx, struct Vecx32 *dst){ fx32 x, y, z; x = vec->x; y = vec->y; @@ -120,7 +120,7 @@ void MTX_MultVec43(struct Vecx32 *vec, struct Mtx43 *mtx, struct Vecx32 *dst){ dst->z += mtx->_[11]; } -asm void MTX_Identity43_(struct Mtx43 *mtx){ +ARM_FUNC asm void MTX_Identity43_(struct Mtx43 *mtx){ mov r2, #0x1000 mov r3, #0x0 stmia r0!, {r2-r3} @@ -133,7 +133,7 @@ asm void MTX_Identity43_(struct Mtx43 *mtx){ bx lr } -asm void MTX_Copy43To44_(struct Mtx43 *src, struct Mtx44 *dst){ +ARM_FUNC asm void MTX_Copy43To44_(struct Mtx43 *src, struct Mtx44 *dst){ stmdb sp!, {r4} mov r12, #0x0 ldmia r0!, {r2-r4} @@ -149,8 +149,7 @@ asm void MTX_Copy43To44_(struct Mtx43 *src, struct Mtx44 *dst){ bx lr } -#pragma thumb on -asm void MTX_Scale43_(struct Mtx43 *dst, fx32 x, fx32 y, fx32 z){ +THUMB_FUNC asm void MTX_Scale43_(struct Mtx43 *dst, fx32 x, fx32 y, fx32 z){ stmia r0!, {r1} mov r1, #0x0 str r3, [r0, #0x1c] @@ -163,10 +162,8 @@ asm void MTX_Scale43_(struct Mtx43 *dst, fx32 x, fx32 y, fx32 z){ stmia r0!, {r1-r3} bx lr } -#pragma thumb off -#pragma thumb on -asm void MTX_RotX43_(struct Mtx43 *mtx, fx32 sinphi, fx32 cosphi){ +THUMB_FUNC asm void MTX_RotX43_(struct Mtx43 *mtx, fx32 sinphi, fx32 cosphi){ str r1, [r0, #0x14] neg r1, r1 str r1, [r0, #0x1c] @@ -183,10 +180,8 @@ asm void MTX_RotX43_(struct Mtx43 *mtx, fx32 sinphi, fx32 cosphi){ stmia r0!, {r1,r3} bx lr } -#pragma thumb off -#pragma thumb on -asm void MTX_RotY43_(struct Mtx43 *mtx, fx32 sinphi, fx32 cosphi){ +THUMB_FUNC asm void MTX_RotY43_(struct Mtx43 *mtx, fx32 sinphi, fx32 cosphi){ str r1, [r0, #0x18] mov r3, #0x0 stmia r0!, {r2-r3} @@ -201,4 +196,3 @@ asm void MTX_RotY43_(struct Mtx43 *mtx, fx32 sinphi, fx32 cosphi){ stmia r0!, {r1,r3} bx lr } -#pragma thumb off diff --git a/arm9/lib/src/FX_mtx44.c b/arm9/lib/src/FX_mtx44.c index 8d158602..8152907d 100644 --- a/arm9/lib/src/FX_mtx44.c +++ b/arm9/lib/src/FX_mtx44.c @@ -5,7 +5,7 @@ void MI_Copy48B(void *src, void *dst); -void MTX_TransApply44(struct Mtx44 *mtx, struct Mtx44 *dst, fx32 x, fx32 y, fx32 z){ +ARM_FUNC void MTX_TransApply44(struct Mtx44 *mtx, struct Mtx44 *dst, fx32 x, fx32 y, fx32 z){ if(mtx != dst) MI_Copy48B(mtx, dst); dst->_[12] = mtx->_[12] + (fx32)(((fx64)x * mtx->_[0] + (fx64)y * mtx->_[4] + (fx64)z * mtx->_[8] ) >> FX32_INT_SHIFT); @@ -14,7 +14,7 @@ void MTX_TransApply44(struct Mtx44 *mtx, struct Mtx44 *dst, fx32 x, fx32 y, fx32 dst->_[15] = mtx->_[15] + (fx32)(((fx64)x * mtx->_[3] + (fx64)y * mtx->_[7] + (fx64)z * mtx->_[11]) >> FX32_INT_SHIFT); } -void MTX_Concat44(struct Mtx44 *a, struct Mtx44 *b, struct Mtx44 *c){ +ARM_FUNC void MTX_Concat44(struct Mtx44 *a, struct Mtx44 *b, struct Mtx44 *c){ struct Mtx44 temp; struct Mtx44 *dst; fx32 a0, a1, a2, a3; @@ -73,7 +73,7 @@ void MTX_Concat44(struct Mtx44 *a, struct Mtx44 *b, struct Mtx44 *c){ *c = temp; } -asm void MTX_Identity44_(struct Mtx44 *dst){ +ARM_FUNC asm void MTX_Identity44_(struct Mtx44 *dst){ mov r2, #0x1000 mov r3, #0x0 stmia r0!, {r2-r3} @@ -87,7 +87,7 @@ asm void MTX_Identity44_(struct Mtx44 *dst){ bx lr } -asm void MTX_Copy44To43_(struct Mtx44 *src, struct Mtx43 *dst){ +ARM_FUNC asm void MTX_Copy44To43_(struct Mtx44 *src, struct Mtx43 *dst){ ldmia r0!, {r2-r3,r12} add r0, r0, #0x4 stmia r1!, {r2-r3,r12} @@ -103,8 +103,8 @@ asm void MTX_Copy44To43_(struct Mtx44 *src, struct Mtx43 *dst){ bx lr } -#pragma thumb on -asm void MTX_RotX44_(struct Mtx44 *mtx, fx32 sinphi, fx32 cosphi){ + +THUMB_FUNC asm void MTX_RotX44_(struct Mtx44 *mtx, fx32 sinphi, fx32 cosphi){ str r2, [r0, #0x14] str r2, [r0, #0x28] str r1, [r0, #0x18] @@ -124,10 +124,8 @@ asm void MTX_RotX44_(struct Mtx44 *mtx, fx32 sinphi, fx32 cosphi){ str r1, [r0, #0x0] bx lr } -#pragma thumb off -#pragma thumb on -asm void MTX_RotY44_(struct Mtx44 *mtx, fx32 sinphi, fx32 cosphi){ +THUMB_FUNC asm void MTX_RotY44_(struct Mtx44 *mtx, fx32 sinphi, fx32 cosphi){ str r2, [r0, #0x0] str r2, [r0, #0x28] str r1, [r0, #0x20] @@ -147,10 +145,8 @@ asm void MTX_RotY44_(struct Mtx44 *mtx, fx32 sinphi, fx32 cosphi){ stmia r0!, {r1-r3} bx lr } -#pragma thumb off -#pragma thumb on -asm void MTX_RotZ44_(struct Mtx44 *mtx, fx32 sinphi, fx32 cosphi){ +THUMB_FUNC asm void MTX_RotZ44_(struct Mtx44 *mtx, fx32 sinphi, fx32 cosphi){ str r2, [r0, #0x0] str r2, [r0, #0x14] str r1, [r0, #0x4] @@ -169,4 +165,3 @@ asm void MTX_RotZ44_(struct Mtx44 *mtx, fx32 sinphi, fx32 cosphi){ stmia r0!, {r1-r3} bx lr } -#pragma thumb off diff --git a/arm9/lib/src/FX_vec.c b/arm9/lib/src/FX_vec.c index 10a792be..af36fe89 100644 --- a/arm9/lib/src/FX_vec.c +++ b/arm9/lib/src/FX_vec.c @@ -2,36 +2,36 @@ #include "main.h" #include "fx.h" -void VEC_Add(struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst){ +ARM_FUNC void VEC_Add(struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst){ dst->x = a->x + b->x; dst->y = a->y + b->y; dst->z = a->z + b->z; } -void VEC_Subtract(struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst){ +ARM_FUNC void VEC_Subtract(struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst){ dst->x = a->x - b->x; dst->y = a->y - b->y; dst->z = a->z - b->z; } -void VEC_Fx16Add(struct Vecx16 *a, struct Vecx16 *b, struct Vecx16 *dst){ +ARM_FUNC void VEC_Fx16Add(struct Vecx16 *a, struct Vecx16 *b, struct Vecx16 *dst){ dst->x = a->x + b->x; dst->y = a->y + b->y; dst->z = a->z + b->z; } -fx32 VEC_DotProduct(struct Vecx32 *a, struct Vecx32 *b){ +ARM_FUNC fx32 VEC_DotProduct(struct Vecx32 *a, struct Vecx32 *b){ return ((fx64)a->x * b->x + (fx64)a->y * b->y + (fx64)a->z * b->z + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT; } -fx32 VEC_Fx16DotProduct(struct Vecx16 *a, struct Vecx16 *b){ +ARM_FUNC fx32 VEC_Fx16DotProduct(struct Vecx16 *a, struct Vecx16 *b){ fx32 temp1, temp2; temp1 = (a->x * b->x) + (a->y * b->y); temp2 = (a->z * b->z) + (1 << (FX64_INT_SHIFT - 1)); return (fx32)(((fx64)temp1 + temp2) >> FX64_INT_SHIFT); } -void VEC_CrossProduct(struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst){ +ARM_FUNC void VEC_CrossProduct(struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst){ fx32 x, y, z; x = (fx32)(((fx64)a->y * b->z - (fx64)a->z * b->y + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT); y = (fx32)(((fx64)a->z * b->x - (fx64)a->x * b->z + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT); @@ -41,7 +41,7 @@ void VEC_CrossProduct(struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst){ dst->z = z; } -void VEC_Fx16CrossProduct(struct Vecx16 *a, struct Vecx16 *b, struct Vecx16 *dst){ +ARM_FUNC void VEC_Fx16CrossProduct(struct Vecx16 *a, struct Vecx16 *b, struct Vecx16 *dst){ fx32 x, y, z; x = ((a->y * b->z - a->z * b->y + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT); y = ((a->z * b->x - a->x * b->z + (1 << (FX64_INT_SHIFT - 1))) >> FX64_INT_SHIFT); @@ -51,7 +51,7 @@ void VEC_Fx16CrossProduct(struct Vecx16 *a, struct Vecx16 *b, struct Vecx16 *dst dst->z = z; } -fx32 VEC_Mag(struct Vecx32 *a){ +ARM_FUNC fx32 VEC_Mag(struct Vecx32 *a){ fx64 l2 = (fx64)a->x * a->x; l2 += (fx64)a->y * a->y; l2 += (fx64)a->z * a->z; @@ -61,7 +61,7 @@ fx32 VEC_Mag(struct Vecx32 *a){ return ((fx32)READREG32(HW_REG_SQRT_RESULT) + 1) >> 1; } -void VEC_Normalize(struct Vecx32 *a, struct Vecx32 *dst){ +ARM_FUNC void VEC_Normalize(struct Vecx32 *a, struct Vecx32 *dst){ fx64 l2 = (fx64)a->x * a->x; l2 += (fx64)a->y * a->y; l2 += (fx64)a->z * a->z; @@ -81,7 +81,7 @@ void VEC_Normalize(struct Vecx32 *a, struct Vecx32 *dst){ dst->z = (l2 * a->z + (1LL << (0x2D - 1))) >> 0x2D; } -void VEC_Fx16Normalize(struct Vecx16 *a, struct Vecx16 *dst){ +ARM_FUNC void VEC_Fx16Normalize(struct Vecx16 *a, struct Vecx16 *dst){ fx64 l2 = a->x * a->x; l2 += a->y * a->y; l2 += a->z * a->z; @@ -101,7 +101,7 @@ void VEC_Fx16Normalize(struct Vecx16 *a, struct Vecx16 *dst){ dst->z = (l2 * a->z + (1LL << (0x2D - 1))) >> 0x2D; } -void VEC_MultAdd(fx32 factor, struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst){ +ARM_FUNC void VEC_MultAdd(fx32 factor, struct Vecx32 *a, struct Vecx32 *b, struct Vecx32 *dst){ dst->x = (fx32)(((fx64)factor * a->x) >> FX32_INT_SHIFT) + b->x; dst->y = (fx32)(((fx64)factor * a->y) >> FX32_INT_SHIFT) + b->y; dst->z = (fx32)(((fx64)factor * a->z) >> FX32_INT_SHIFT) + b->z; -- cgit v1.2.3