From 79a78f4c5fc9ab171daae77583119ecf3cebd42e Mon Sep 17 00:00:00 2001 From: gamemasterplc Date: Wed, 6 Dec 2023 15:13:41 -0600 Subject: [PATCH] Introduce math.h Makes fix for introducing 0.5 and 3.0 double constants into rels less hacky --- include/functions.h | 1 - include/math.h | 43 +++++++++++++++++++++++++++++ src/REL/subchrselDll/subchrselDll.c | 4 +-- src/REL/w10Dll/w10Dll.c | 7 ++--- 4 files changed, 46 insertions(+), 9 deletions(-) create mode 100644 include/math.h diff --git a/include/functions.h b/include/functions.h index 8a43084f..a906f8c5 100644 --- a/include/functions.h +++ b/include/functions.h @@ -78,7 +78,6 @@ void fn_800B4264(s32, s32, s32); void fn_8007500C(s32); void fn_8006F0D4(s32, f32); f32 fn_8006F128(s32); -f64 fmod(f32, f64); void fn_8006F61C(s16, s32); void fn_800B42BC(s16); s32 fn_8006DBD4(s16); diff --git a/include/math.h b/include/math.h new file mode 100644 index 00000000..95c77704 --- /dev/null +++ b/include/math.h @@ -0,0 +1,43 @@ +#ifndef _MATH_H +#define _MATH_H + +extern inline float sqrtf(float x) +{ + static const double _half=.5; + static const double _three=3.0; + volatile float y; + if(x > 0.0f) + { + double guess = __frsqrte((double)x); // returns an approximation to + guess = _half*guess*(_three - guess*guess*x); // now have 12 sig bits + guess = _half*guess*(_three - guess*guess*x); // now have 24 sig bits + guess = _half*guess*(_three - guess*guess*x); // now have 32 sig bits + y=(float)(x*guess); + return y; + } + return x; +} + +double atan(double x); +double copysign(double x, double y); +double cos(double x); +double floor(double x); +double frexp(double x, int *exp); +double ldexp(double x, int exp); +double modf(double x, double *intpart); +double sin(double x); +double tan(double x); +double acos(double x); +double asin(double x); +double atan2(double y, double x); +double fmod(double x, double y); +double log(double x); +float tanf(float x); +float sinf(float x); +float cosf(float x); +float atan2f(float y, float x); +float acosf(float x); + +#define abs(x) __abs(x) + +#endif \ No newline at end of file diff --git a/src/REL/subchrselDll/subchrselDll.c b/src/REL/subchrselDll/subchrselDll.c index 92b5264c..aa5c4c37 100644 --- a/src/REL/subchrselDll/subchrselDll.c +++ b/src/REL/subchrselDll/subchrselDll.c @@ -3,9 +3,7 @@ #include "game/printfunc.h" #include "dolphin/pad.h" -//HACK: Force 0.5 and 3.0 double constants to appear in REL -const double _half = 0.5; -const double _three = 3.0; +#include "math.h" static void SubchrMain(void); diff --git a/src/REL/w10Dll/w10Dll.c b/src/REL/w10Dll/w10Dll.c index 2ffda651..b3ea6a1f 100644 --- a/src/REL/w10Dll/w10Dll.c +++ b/src/REL/w10Dll/w10Dll.c @@ -1,6 +1,8 @@ #include "include/REL/w10Dll.h" #include "game/data.h" +#include "math.h" + //BSS s16 lbl_1_bss_22[11]; s16 lbl_1_bss_20; @@ -58,11 +60,6 @@ s32 lbl_1_data_6C[2] = { DATA_NUM_LISTEND }; -//RODATA -//HACK: Force 0.5 and 3.0 double constants to appear in REL -const double _half = 0.5; -const double _three = 3.0; - // function is probably global. only inlined in rels? inline s32 get_current_board(void) { return GWSystem.unk08 & 0x1F;