diff --git a/configure.py b/configure.py index 12caee21..030f185b 100644 --- a/configure.py +++ b/configure.py @@ -670,7 +670,7 @@ config.libs = [ Object(Matching, "JSystem/JUtility/JUTDbPrint.cpp"), Object(Matching, "JSystem/JUtility/JUTDirectFile.cpp"), Object(Matching, "JSystem/JUtility/JUTDirectPrint.cpp"), - Object(NonMatching, "JSystem/JUtility/JUTException.cpp"), + Object(Matching, "JSystem/JUtility/JUTException.cpp"), Object(Matching, "JSystem/JUtility/JUTFader.cpp"), Object(Matching, "JSystem/JUtility/JUTFont.cpp"), Object(Matching, "JSystem/JUtility/JUTFontData_Ascfont_fix12.s"), diff --git a/include/JSystem/JKernel/JKRArchive.h b/include/JSystem/JKernel/JKRArchive.h index ad5b8138..6b8e685e 100644 --- a/include/JSystem/JKernel/JKRArchive.h +++ b/include/JSystem/JKernel/JKRArchive.h @@ -128,8 +128,9 @@ public: }; JKRArchive(s32, EMountMode); - - virtual ~JKRArchive(); // _08 +private: + ~JKRArchive(); +public: // _08 virtual bool becomeCurrent(const char*); // _10 virtual void* getResource(const char* path); // _14 virtual void* getResource(u32 type, const char* name); // _18 @@ -161,12 +162,11 @@ public: static JKRArchive* mount(void*, JKRHeap*, EMountDirection); static JKRArchive* mount(s32, EMountMode, JKRHeap*, EMountDirection); static void* getGlbResource(u32 type, const char* name, JKRArchive* archive); - - // Unused/inlined: - JKRArchive(); - JKRArchive(const char* p1, EMountMode mountMode); static JKRArchive* check_mount_already(s32); static JKRArchive* check_mount_already(s32, JKRHeap*); + + JKRArchive(); + JKRArchive(const char* p1, EMountMode mountMode); SDIDirEntry* findResType(u32) const; SDIFileEntry* findTypeResource(u32, u32) const; diff --git a/include/JSystem/JUtility/JUTException.h b/include/JSystem/JUtility/JUTException.h index 46bc7932..93229ee2 100644 --- a/include/JSystem/JUtility/JUTException.h +++ b/include/JSystem/JUtility/JUTException.h @@ -17,11 +17,9 @@ enum ExPrintFlags { EXPRINTFLAG_GPR = 0x1, EXPRINTFLAG_GPRMap = 0x2, - EXPRINTFLAG_SRR0Map = 0x4, - EXPRINTFLAG_Float = 0x8, - EXPRINTFLAG_Stack = 0x10, - - EXPRINTFLAG_All = 0x1F, + EXPRINTFLAG_Float = 0x4, + EXPRINTFLAG_Stack = 0x8, + EXPRINTFLAG_All = 0xF, }; /** @@ -35,7 +33,7 @@ struct JUTException : public JKRThread INFOPAGE_Float = 2, INFOPAGE_Stack = 3, INFOPAGE_GPRMap = 4, - INFOPAGE_SRR0Map = 5, + }; // size: 0x14 @@ -102,7 +100,7 @@ struct JUTException : public JKRThread void showGPR(OSContext *); void showSRR0Map(OSContext *); bool isEnablePad() const; - u32 getFpscr(); + static u32 getFpscr(); void setFpscr(u32); void enableFpuException(); void disableFpuException(); @@ -129,7 +127,7 @@ struct JUTException : public JKRThread static JUTErrorHandler sPostUserCallback; static u32 msr; static u32 fpscr; - static const char *sCpuExpName[32]; + static const char *sCpuExpName[16]; static JSUList sMapFileList; // _00 = VTBL @@ -143,7 +141,6 @@ struct JUTException : public JKRThread u32 mTraceSuppress; // _94 u32 _98; // _98 u32 mPrintFlags; // _9C, see ExPrintFlags enum - u32 mStackPointer; // _A0 }; #endif \ No newline at end of file diff --git a/include/JSystem/JUtility/JUTGamePad.h b/include/JSystem/JUtility/JUTGamePad.h index 25310195..8540bd92 100644 --- a/include/JSystem/JUtility/JUTGamePad.h +++ b/include/JSystem/JUtility/JUTGamePad.h @@ -93,7 +93,7 @@ public: void clearForReset(); static void init(); void initList(); - void read(); + static void read(); static bool recalibrate(u32); void setButtonRepeat(u32, u32, u32); void update(); diff --git a/include/MSL_C/MSL_Common/float.h b/include/MSL_C/MSL_Common/float.h new file mode 100644 index 00000000..018d307a --- /dev/null +++ b/include/MSL_C/MSL_Common/float.h @@ -0,0 +1,92 @@ +#ifndef _MSL_COMMON_FLOAT_H +#define _MSL_COMMON_FLOAT_H + +#include "MSL_C/MSL_Common_Embedded/Math/fdlibm.h" + +#define FP_SNAN 0 +#define FP_QNAN 1 +#define FP_INFINITE 2 +#define FP_ZERO 3 +#define FP_NORMAL 4 +#define FP_SUBNORMAL 5 + +#define FP_NAN FP_QNAN + +#define fpclassify(x) \ + ((sizeof(x) == sizeof(float)) ? __fpclassifyf(x) : __fpclassifyd(x)) +#define signbit(x) \ + ((sizeof(x) == sizeof(float)) ? __signbitf(x) : __signbitd(x)) +#define isfinite(x) ((fpclassify(x) > 2)) +#define isnan(x) ((fpclassify(x) == FP_NAN)) +#define isinf(x) ((fpclassify(x) == FP_INFINITE)) + +#define __signbitf(x) ((int)(__HI(x) & 0x80000000)) + +// TODO: OK? +#define __signbitd(x) ((int)(__HI(x) & 0x80000000)) + +extern unsigned long __float_nan[]; +extern unsigned long __float_huge[]; +extern unsigned long __float_max[]; +extern unsigned long __float_epsilon[]; + +inline int __fpclassifyf(float __value) +{ + unsigned long integer = *(unsigned long*)&__value; + + switch (integer & 0x7f800000) { + case 0x7f800000: + if ((integer & 0x7fffff) != 0) { + return FP_QNAN; + } + return FP_INFINITE; + + case 0: + if ((integer & 0x7fffff) != 0) { + return FP_SUBNORMAL; + } + return FP_ZERO; + } + + return FP_NORMAL; +} + +inline int __fpclassifyd(double __value) +{ + switch (__HI(__value) & 0x7ff00000) { + case 0x7ff00000: { + if ((__HI(__value) & 0x000fffff) || (__LO(__value) & 0xffffffff)) + return FP_QNAN; + else + return FP_INFINITE; + break; + } + case 0: { + if ((__HI(__value) & 0x000fffff) || (__LO(__value) & 0xffffffff)) + return FP_SUBNORMAL; + else + return FP_ZERO; + break; + } + } + return FP_NORMAL; +} + +#define FLT_MANT_DIG 24 +#define FLT_DIG 6 +#define FLT_MIN_EXP (-125) +#define FLT_MIN_10_EXP (-37) +#define FLT_MAX_EXP 128 +#define FLT_MAX_10_EXP 38 + +//#define FLT_MAX 3.40282346638528860e+38f +#define FLT_EPSILON 1.1920928955078125e-07f + +#define DBL_MANT_DIG 53 +#define DBL_DIG 15 +#define DBL_MIN_EXP (-1021) +#define DBL_MIN_10_EXP (-308) +#define DBL_MAX_EXP 1024 +#define DBL_MAX_10_EXP 308 + +#endif /* _MSL_COMMON_FLOAT_H */ \ No newline at end of file diff --git a/include/MSL_C/MSL_Common_Embedded/Math/fdlibm.h b/include/MSL_C/MSL_Common_Embedded/Math/fdlibm.h new file mode 100644 index 00000000..857a606b --- /dev/null +++ b/include/MSL_C/MSL_Common_Embedded/Math/fdlibm.h @@ -0,0 +1,234 @@ +#ifndef _FDLIBM_H +#define _FDLIBM_H + +/* @(#)fdlibm.h 1.5 04/04/22 */ +/** + * ==================================================== + * Copyright (C) 2004 by Sun Microsystems, Inc. All rights reserved. + * + * Permission to use, copy, modify, and distribute this + * software is freely granted, provided that this notice + * is preserved. + * ==================================================== + */ + +#ifdef __cplusplus +extern "C" { +#endif // ifdef __cplusplus + +/* Sometimes it's necessary to define __LITTLE_ENDIAN explicitly + but these catch some common cases. */ + +#if defined(i386) || defined(i486) || defined(intel) || defined(x86) \ + || defined(i86pc) || defined(__alpha) || defined(__osf__) +#define __LITTLE_ENDIAN +#endif + +#ifdef __LITTLE_ENDIAN +#define __HI(x) *(1 + (int*)&x) +#define __LO(x) *(int*)&x +#define __HIp(x) *(1 + (int*)x) +#define __LOp(x) *(int*)x +#else +#define __HI(x) *(int*)&x +#define __LO(x) *(1 + (int*)&x) +#define __HIp(x) *(int*)x +#define __LOp(x) *(1 + (int*)x) +#endif + +// NOTE: should be enabled according to w_atan2.c +#define _IEEE_LIBM + +// TODO: should __STDC__ actually be defined? +// #ifdef __STDC__ +#define __P(p) p +// #else +// #define __P(p) () +// #endif + +/** + * ANSI/POSIX + */ + +extern int signgam; + +#define MAXFLOAT ((f32)3.40282346638528860e+38) + +enum fdversion { fdlibm_ieee = -1, fdlibm_svid, fdlibm_xopen, fdlibm_posix }; + +#define _LIB_VERSION_TYPE enum fdversion +#define _LIB_VERSION _fdlib_version + +/* if global variable _LIB_VERSION is not desirable, one may + * change the following to be a constant by: + * #define _LIB_VERSION_TYPE const enum version + * In that case, after one initializes the value _LIB_VERSION (see + * s_lib_version.c) during compile time, it cannot be modified + * in the middle of a program + */ +extern _LIB_VERSION_TYPE _LIB_VERSION; + +#define _IEEE_ fdlibm_ieee +#define _SVID_ fdlibm_svid +#define _XOPEN_ fdlibm_xopen +#define _POSIX_ fdlibm_posix + +struct exception { + int type; + char* name; + double arg1; + double arg2; + double retval; +}; + +#define HUGE MAXFLOAT + +/** + * set X_TLOSS = pi*2**52, which is possibly defined in + * (one may replace the following line by "#include ") + */ + +#define X_TLOSS 1.41484755040568800000e+16 + +#define DOMAIN 1 +#define SING 2 +#define OVERFLOW 3 +#define UNDERFLOW 4 +#define TLOSS 5 +#define PLOSS 6 + +/** + * ANSI/POSIX + */ +extern double acos __P((double)); +extern double asin __P((double)); +extern double atan __P((double)); +extern double atan2 __P((double, double)); +extern double cos __P((double)); +extern double sin __P((double)); +extern double tan __P((double)); + +extern double cosh __P((double)); +extern double sinh __P((double)); +extern double tanh __P((double)); + +extern double exp __P((double)); +extern double frexp __P((double, int*)); +extern double ldexp __P((double, int)); +extern double scalbn __P((double, int)); +extern double log __P((double)); +extern double log10 __P((double)); +extern double modf __P((double, double*)); + +extern double pow __P((double, double)); +extern double sqrt __P((double)); + +extern double ceil __P((double)); +extern double fabs __P((double)); +// NOTE: I have no idea how they got it to mangle like this +extern double fabs__Fd(double); +extern double floor __P((double)); +extern double fmod __P((double, double)); + +extern double erf __P((double)); +extern double erfc __P((double)); +extern double gamma __P((double)); +extern double hypot __P((double, double)); +extern int isnan __P((double)); +extern int finite __P((double)); +extern double j0 __P((double)); +extern double j1 __P((double)); +extern double jn __P((int, double)); +extern double lgamma __P((double)); +extern double y0 __P((double)); +extern double y1 __P((double)); +extern double yn __P((int, double)); + +extern double acosh __P((double)); +extern double asinh __P((double)); +extern double atanh __P((double)); +extern double cbrt __P((double)); +extern double logb __P((double)); +extern double nextafter __P((double, double)); +extern double remainder __P((double, double)); +#ifdef _SCALB_INT +extern double scalb __P((double, int)); +#else +extern double scalb __P((double, double)); +#endif + +extern int matherr __P((struct exception*)); + +/** + * IEEE Test Vector + */ +extern double significand __P((double)); + +/** + * Functions callable from C, intended to support IEEE arithmetic. + */ +extern double copysign __P((double, double)); +extern int ilogb __P((double)); +extern double rint __P((double)); +extern double scalbn __P((double, int)); + +/** + * BSD math library entry points + */ +extern double expm1 __P((double)); +extern double log1p __P((double)); + +/** + * Reentrant version of gamma & lgamma; passes signgam back by reference + * as the second argument; user must allocate space for signgam. + */ +#ifdef _REENTRANT +extern double gamma_r __P((double, int*)); +extern double lgamma_r __P((double, int*)); +#endif /* _REENTRANT */ + +/* ieee style elementary functions */ +extern double __ieee754_sqrt __P((double)); +extern double __ieee754_acos __P((double)); +extern double __ieee754_acosh __P((double)); +extern double __ieee754_log __P((double)); +extern double __ieee754_atanh __P((double)); +extern double __ieee754_asin __P((double)); +extern double __ieee754_atan2 __P((double, double)); +extern double __ieee754_exp __P((double)); +extern double __ieee754_cosh __P((double)); +extern double __ieee754_fmod __P((double, double)); +extern double __ieee754_pow __P((double, double)); +extern double __ieee754_lgamma_r __P((double, int*)); +extern double __ieee754_gamma_r __P((double, int*)); +extern double __ieee754_lgamma __P((double)); +extern double __ieee754_gamma __P((double)); +extern double __ieee754_log10 __P((double)); +extern double __ieee754_sinh __P((double)); +extern double __ieee754_hypot __P((double, double)); +extern double __ieee754_j0 __P((double)); +extern double __ieee754_j1 __P((double)); +extern double __ieee754_y0 __P((double)); +extern double __ieee754_y1 __P((double)); +extern double __ieee754_jn __P((int, double)); +extern double __ieee754_yn __P((int, double)); +extern double __ieee754_remainder __P((double, double)); +extern int __ieee754_rem_pio2 __P((double, double*)); +#ifdef _SCALB_INT +extern double __ieee754_scalb __P((double, int)); +#else +extern double __ieee754_scalb __P((double, double)); +#endif + +/* fdlibm kernel function */ +extern double __kernel_standard __P((double, double, int)); +extern double __kernel_sin __P((double, double, int)); +extern double __kernel_cos __P((double, double)); +extern double __kernel_tan __P((double, double, int)); +extern int __kernel_rem_pio2 __P((double*, double*, int, int, int, const int*)); + +#ifdef __cplusplus +}; +#endif // ifdef __cplusplus + +#endif \ No newline at end of file diff --git a/include/MSL_C/w_math.h b/include/MSL_C/w_math.h index 270273ee..17fc0f20 100644 --- a/include/MSL_C/w_math.h +++ b/include/MSL_C/w_math.h @@ -1,6 +1,8 @@ #ifndef W_MATH_H #define W_MATH_H +#include "MSL_C/MSL_Common/float.h" + #ifndef BUGFIXES #define SQRTF_LINKAGE extern #else @@ -47,11 +49,6 @@ inline float fabsf(float x) { return (float)fabs((double)x); } -int __float_huge[]; -int __float_nan[]; -int __double_huge[]; -int __extended_huge[]; - #define INFINITY (*(float*)__float_huge) #define NAN (*(float*)__float_nan) #define HUGE_VALF (*(float*)__float_huge) @@ -76,8 +73,8 @@ extern inline double sqrt(double x) { extern "C" { #endif -double atan2(double, double); -double acos(float); +//double atan2(double, double); +//double acos(float); #ifdef __cplusplus } diff --git a/src/static/JSystem/JKernel/JKRArchivePri.cpp b/src/static/JSystem/JKernel/JKRArchivePri.cpp index f9265507..e695b4eb 100644 --- a/src/static/JSystem/JKernel/JKRArchivePri.cpp +++ b/src/static/JSystem/JKernel/JKRArchivePri.cpp @@ -33,11 +33,6 @@ JKRArchive::JKRArchive(s32 entryNum, JKRArchive::EMountMode mountMode) } } -JKRArchive::JKRArchive(const char* p1, JKRArchive::EMountMode mountMode) -{ - // UNUSED FUNCTION -} - JKRArchive::~JKRArchive() {} bool JKRArchive::isSameName(JKRArchive::CArcName& archiveName, diff --git a/src/static/JSystem/JUtility/JUTException.cpp b/src/static/JSystem/JUtility/JUTException.cpp index 48bce331..a03ea119 100644 --- a/src/static/JSystem/JUtility/JUTException.cpp +++ b/src/static/JSystem/JUtility/JUTException.cpp @@ -1,7 +1,9 @@ +#include "MSL_C/MSL_Common/float.h" + #include #include #include -#include "MSL_C/w_math.h" + #include "MSL_C/printf.h" #include "libc/string.h" @@ -9,25 +11,19 @@ #include "JSystem/JUtility/JUTDirectPrint.h" #include "JSystem/JUtility/JUTDirectFile.h" -extern long __fpclassifyf(float x); -long __fpclassifyd(double x); -#define fpclassify(x) (sizeof(x) == sizeof(float) ? __fpclassifyf((float)(x)) : __fpclassifyd((double)(x))) - -#define isinf(x) ((fpclassify(x) == 2)) -#define isnan(x) ((fpclassify(x) == 1)) -#define isfinite(x) ((fpclassify(x) > 2)) struct CallbackObject { JUTErrorHandler callback; u16 error; - OSContext *context; + OSContext* context; u32 dsisr; u32 dar; }; void search_name_part(u8 *, u8 *, int); +void *JUTException::sMessageBuffer[1] = { nullptr}; OSMessageQueue JUTException::sMessageQueue = {}; static OSTime c3bcnt[4] = {0, 0, 0, 0}; const char *JUTException::sCpuExpName[] = { @@ -46,8 +42,7 @@ const char *JUTException::sCpuExpName[] = { "BREAK POINT", "SYSTEM INTERRUPT", "THERMAL INTERRUPT", - "PROTECTION", - "FLOATING POINT" + "PROTECTION" }; JUTException *JUTException::sErrorManager; @@ -59,31 +54,10 @@ u32 JUTException::sConsoleBufferSize; JUTConsole *JUTException::sConsole; u32 JUTException::msr; u32 JUTException::fpscr; -void *JUTException::sMessageBuffer[1] = { nullptr}; + JSUList JUTException::sMapFileList(false); -JUTException::JUTException(JUTDirectPrint *directPrint) :JKRThread(0x4000, 0x10, 0) { - mDirectPrint = directPrint; - - OSSetErrorHandler(OS_ERROR_DSI, (OSErrorHandler)errorHandler); - OSSetErrorHandler(OS_ERROR_ISI, (OSErrorHandler)errorHandler); - OSSetErrorHandler(OS_ERROR_PROGRAM, (OSErrorHandler)errorHandler); - OSSetErrorHandler(OS_ERROR_ALIGNMENT, (OSErrorHandler)errorHandler); - OSSetErrorHandler(OS_ERROR_PROTECTION, (OSErrorHandler)errorHandler); - setFPException(0); - - sPreUserCallback = nullptr; - sPostUserCallback = nullptr; - mGamePad = nullptr; - mPadPort = JUTGamePad::Port_Invalid; - mPrintWaitTime0 = 10; - mPrintWaitTime1 = 10; - mTraceSuppress = 0xffffffff; - _98 = 0; - mPrintFlags = EXPRINTFLAG_All; -} - JUTException *JUTException::create(JUTDirectPrint *directPrint) { if(sErrorManager == nullptr) { sErrorManager = new (JKRGetSystemHeap(), 0) JUTException(directPrint); @@ -107,11 +81,8 @@ void *JUTException::run() u32 dsisr = cb->dsisr; u32 dar = cb->dar; - if (error < OS_ERROR_MAX) - mStackPointer = context->gpr[1]; - - - if (mFrameMemory == nullptr) + mFrameMemory = (JUTExternalFB*)sErrorManager->mDirectPrint->getFrameBuffer(); + if (!sErrorManager->mDirectPrint->getFrameBuffer()) sErrorManager->createFB(); if (callback) @@ -123,10 +94,30 @@ void *JUTException::run() } } +JUTException::JUTException(JUTDirectPrint *directPrint) : JKRThread(0x4000, 0x10, 0) { + mDirectPrint = directPrint; + + OSSetErrorHandler(OS_ERROR_DSI, (OSErrorHandler)errorHandler); + OSSetErrorHandler(OS_ERROR_ISI, (OSErrorHandler)errorHandler); + OSSetErrorHandler(OS_ERROR_PROGRAM, (OSErrorHandler)errorHandler); + OSSetErrorHandler(OS_ERROR_ALIGNMENT, (OSErrorHandler)errorHandler); + OSSetErrorHandler(OS_ERROR_PROTECTION, (OSErrorHandler)errorHandler); + + sPreUserCallback = nullptr; + sPostUserCallback = nullptr; + mGamePad = nullptr; + mPadPort = JUTGamePad::Port_Invalid; + mPrintWaitTime0 = 10; + mPrintWaitTime1 = 10; + mTraceSuppress = 0xffffffff; + _98 = 0; + mPrintFlags = 0xff; +} + void JUTException::errorHandler(OSError error, OSContext *context, u32 dsisr, u32 dar) { msr = PPCMfmsr(); - fpscr = context->fpscr; + fpscr = getFpscr(); OSFillFPUContext(context); OSSetErrorHandler(error, nullptr); if (error == OS_ERROR_PROTECTION) @@ -148,19 +139,6 @@ void JUTException::errorHandler(OSError error, OSContext *context, u32 dsisr, u3 OSYieldThread(); } -void JUTException::setFPException(u32 fpscr_enable_bits) -{ - __OSFpscrEnableBits = fpscr_enable_bits; - if (fpscr_enable_bits) - { - OSSetErrorHandler(OS_ERROR_FPE, (OSErrorHandler)errorHandler); - } - else - { - OSSetErrorHandler(OS_ERROR_FPE, nullptr); - } -} - void JUTException::showFloatSub(int index, f32 value) { if (isnan(value)) @@ -280,25 +258,26 @@ void JUTException::showStack(OSContext *context) } u32 i; - + u32* stackPointer; sConsole->print("-------------------------------- TRACE\n"); - u32 *stackPointer = (u32 *)mStackPointer; sConsole->print_f("Address: BackChain LR save\n"); - for (i = 0; (stackPointer != nullptr) && (stackPointer != (u32 *)0xFFFFFFFF) && (i++ < 0x10);) - { - if (i > mTraceSuppress) - { - sConsole->print("Suppress trace.\n"); - return; - } + for (i = 0, stackPointer = (u32*)context->gpr[1]; + (stackPointer != nullptr) && (stackPointer != (u32*)0xFFFFFFFF) + && (i++ < 0x10);) { + if (i > mTraceSuppress) { + sConsole->print("Suppress trace.\n"); + return; + } - sConsole->print_f("%08X: %08X %08X\n", stackPointer, stackPointer[0], stackPointer[1]); - showMapInfo_subroutine(stackPointer[1], false); - JUTConsoleManager::getManager()->drawDirect(true); - waitTime(mPrintWaitTime1); - stackPointer = (u32 *)stackPointer[0]; - } + sConsole->print_f("%08X: %08X %08X\n", stackPointer, + stackPointer[0], stackPointer[1]); + showMapInfo_subroutine(stackPointer[1], false); + JUTConsoleManager* manager = JUTConsoleManager::sManager; + manager->drawDirect(true); + waitTime(mPrintWaitTime1); + stackPointer = (u32*)stackPointer[0]; + } } void JUTException::showMainInfo(u16 error, OSContext *context, u32 dsisr, u32 dar) @@ -420,26 +399,6 @@ void JUTException::showGPRMap(OSContext *context) } } -void JUTException::showSRR0Map(OSContext *context) -{ - if (!sConsole) - { - return; - } - - sConsole->print("-------------------------------- SRR0MAP\n"); - u32 address = context->srr0; - if (address >= 0x80000000 && 0x83000000 - 1 >= address) - { - sConsole->print_f("SRR0: %08XH", address); - if (showMapInfo_subroutine(address, true) == false) - { - sConsole->print(" no information\n"); - } - JUTConsoleManager::getManager()->drawDirect(true); - } -} - void JUTException::printDebugInfo(JUTException::EInfoPage page, OSError error, OSContext *context, u32 param_3, u32 param_4) { switch (page) @@ -457,8 +416,6 @@ void JUTException::printDebugInfo(JUTException::EInfoPage page, OSError error, O return showStack(context); case INFOPAGE_GPRMap: return showGPRMap(context); - case INFOPAGE_SRR0Map: - return showSRR0Map(context); } } @@ -494,7 +451,7 @@ bool JUTException::readPad(u32 *out_trigger, u32 *out_button) JUTGamePad gamePad1(JUTGamePad::Port2); JUTGamePad gamePad2(JUTGamePad::Port3); JUTGamePad gamePad3(JUTGamePad::Port4); - //JUTGamePad::read(); + JUTGamePad::read(); c3bcnt[0] = (gamePad0.isPushing3ButtonReset() ? (c3bcnt[0] != 0 ? c3bcnt[0] : OSGetTime()) : 0); @@ -538,7 +495,7 @@ bool JUTException::readPad(u32 *out_trigger, u32 *out_button) OSTime resetTime = (gamePadTime != 0) ? (OSGetTime() - gamePadTime) : 0; gamePad.checkResetCallback(resetTime); - //JUTGamePad::read(); + JUTGamePad::read(); if (out_trigger) { *out_trigger = gamePad.getTrigger(); @@ -552,7 +509,7 @@ bool JUTException::readPad(u32 *out_trigger, u32 *out_button) } else if (mGamePad) { - //JUTGamePad::read(); + JUTGamePad::read(); if (out_trigger) { *out_trigger = mGamePad->getTrigger(); @@ -575,20 +532,14 @@ void JUTException::printContext(OSError error, OSContext *context, u32 dsisr, u3 { return; } - VISetPreRetraceCallback(nullptr); - VISetPostRetraceCallback(nullptr); - VISetBlack(FALSE); - VIFlush(); if (!sConsole) { return; } - if(error < OS_ERROR_MAX) - sConsole->print_f("******** EXCEPTION OCCURRED! ********\nFrameMemory:%XH\n", getFrameMemory()); - else - sConsole->print_f("******** USER HALT ********\nFrameMemory:%XH\n", getFrameMemory()); + sConsole->print_f("******** EXCEPTION OCCURRED! ********\nFrameMemory:%XH\n", + getFrameMemory()); int post_callback_executed = false; while (true) @@ -604,12 +555,6 @@ void JUTException::printContext(OSError error, OSContext *context, u32 dsisr, u3 JUTConsoleManager::sManager->drawDirect(true); waitTime(mPrintWaitTime0); } - if ((mPrintFlags & EXPRINTFLAG_SRR0Map) != 0) - { - printDebugInfo(INFOPAGE_SRR0Map, error, context, dsisr, dar); - JUTConsoleManager::sManager->drawDirect(true); - waitTime(mPrintWaitTime0); - } if ((mPrintFlags & EXPRINTFLAG_GPRMap) != 0) { printDebugInfo(INFOPAGE_GPRMap, error, context, dsisr, dar); @@ -786,19 +731,20 @@ void JUTException::createFB() mFrameMemory = (JUTExternalFB *)object; } -u32 JUTException::getFpscr() { - // TODO: misses stack frame - register u32 ret; - asm { - mfmsr r5 - ori r5, r5, 0x2000 - mtmsr r5 - isync - mffs f1 - stfd f1, 8(r1) - lwz ret, 12(r1) - } - return ret; +asm u32 JUTException::getFpscr() { // TODO: figure out if this is possible with asm + + // clang-format off + fralloc + mfmsr r5 + ori r5, r5, 0x2000 + mtmsr r5 + isync + mffs f1 + stfd f1, 8(r1) + lwz r3, 12(r1) + frfree + blr + // clang-format on } JUTErrorHandler JUTException::setPreUserCallback(JUTErrorHandler callback)