mirror of
https://github.com/ACreTeam/ac-decomp
synced 2026-05-23 06:34:18 -04:00
Match JUTException
This commit is contained in:
+1
-1
@@ -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"),
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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<JUTExMapFile> 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
|
||||
@@ -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();
|
||||
|
||||
@@ -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 */
|
||||
@@ -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 <values.h>
|
||||
* (one may replace the following line by "#include <values.h>")
|
||||
*/
|
||||
|
||||
#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
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
#include "MSL_C/MSL_Common/float.h"
|
||||
|
||||
#include <dolphin/base/PPCArch.h>
|
||||
#include <dolphin/gx.h>
|
||||
#include <dolphin/os.h>
|
||||
#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::JUTExMapFile> 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)
|
||||
|
||||
Reference in New Issue
Block a user