From e94649c4f6bd8c92e0b6eca8b5c28cf621b0a512 Mon Sep 17 00:00:00 2001 From: Cuyler36 Date: Sun, 26 Nov 2023 12:47:27 -0500 Subject: [PATCH] Implement & link jsyswrap.cpp --- common.py | 1 + config/dol_slices.yml | 5 + config/symbols.yml | 1 + configure.py | 3 + include/JSystem/JKernel/JKRAram.h | 2 +- include/JSystem/JKernel/JKRDisposer.h | 9 +- include/JSystem/JSupport/JSUList.h | 8 + include/JSystem/JUtility/JUTGamePad.h | 210 +++++++++ include/JSystem/JUtility/TColor.h | 76 ++++ include/THA_GA.h | 32 +- include/TwoHeadArena.h | 30 +- include/dolphin/dvd.h | 2 + include/dolphin/pad.h | 27 ++ include/game.h | 24 +- include/graph.h | 4 +- include/jsyswrap.h | 116 ++++- include/jsyswrap_cpp.h | 18 + include/libforest/emu64.h | 2 + include/libjsys/jsyswrapper.h | 175 ++++---- rel/game.c | 2 +- rel/graph.c | 2 +- rel/m_debug_hayakawa.c | 2 +- rel/m_debug_mode.c | 44 +- rel/m_eappli.c | 2 +- rel/m_field_make.c | 2 +- rel/m_handbill.c | 2 +- rel/m_island.c | 2 +- rel/m_needlework.c | 2 +- rel/m_npc.c | 2 +- rel/m_room_type.c | 2 +- rel/m_scene.c | 2 +- rel/m_string.c | 2 +- rel/m_trademark.c | 2 +- rel/main.c | 2 +- src/boot.c | 2 +- src/dvderr.c | 2 +- src/initial_menu.c | 2 +- src/jsyswrap.cpp | 588 ++++++++++++++++++++++++++ src/libforest/fault.c | 2 +- 39 files changed, 1213 insertions(+), 200 deletions(-) create mode 100644 include/JSystem/JUtility/JUTGamePad.h create mode 100644 include/JSystem/JUtility/TColor.h create mode 100644 include/jsyswrap_cpp.h create mode 100644 src/jsyswrap.cpp diff --git a/common.py b/common.py index 178d8457..f9f9e2d5 100644 --- a/common.py +++ b/common.py @@ -342,6 +342,7 @@ BOOT_CFLAGS = CFLAGS + [ ] + DOL_DEFINES DOL_CFLAGS_NO_SDATA = CFLAGS + [ "-inline on", + "-enum int", "-sdata 0", "-sdata2 0" ] + DOL_DEFINES diff --git a/config/dol_slices.yml b/config/dol_slices.yml index a5b059da..cd06096b 100644 --- a/config/dol_slices.yml +++ b/config/dol_slices.yml @@ -16,6 +16,11 @@ boot.c: .rodata: [0x800a97e0, 0x800a97e8] .data: [0x800af860, 0x800afe50] .bss: [0x800e2280, 0x800e2318] +jsyswrap.cpp: + .text: [0x8000663c, 0x80007188] + .ctors: [0x800a9784, 0x800a9788] + .data: [0x800afe50, 0x800b05e8] + .bss: [0x800e2318, 0x800e2640] version.c: .data: [0x800b05e8, 0x800b0608] initial_menu.c: diff --git a/config/symbols.yml b/config/symbols.yml index 4f9d7fbe..a135f92f 100644 --- a/config/symbols.yml +++ b/config/symbols.yml @@ -3709,6 +3709,7 @@ global: 0x802185b0: __GBAReset 0x802185b8: texture_cache_num 0x802185bc: texture_cache_data_entry_num + 0x8021860a: FrameCansel 0x8021861c: __OSReport_MonopolyThread 0x80218620: __OSReport_disable 0x80218628: this diff --git a/configure.py b/configure.py index 96be5022..94f2df41 100644 --- a/configure.py +++ b/configure.py @@ -636,6 +636,9 @@ class CSource(Source): elif path.startswith("src/TRK") and not path.startswith("src/TRK/init"): self.cc = c.CC self.cflags = c.DOL_TRK_CFLAGS + elif os.path.dirname(path).endswith("src"): + self.cflags = c.DOL_CFLAGS_SDATA0_CFLAGS + self.cc = c.CC else: self.cflags = ctx.cflags self.cc = c.CC_R diff --git a/include/JSystem/JKernel/JKRAram.h b/include/JSystem/JKernel/JKRAram.h index 9fbda659..84ebbd62 100644 --- a/include/JSystem/JKernel/JKRAram.h +++ b/include/JSystem/JKernel/JKRAram.h @@ -288,7 +288,7 @@ inline void JKRFreeToAram(JKRAramBlock* block) inline u8* JKRAramToMainRam(u32 address, u8* buf, u32 bufSize, JKRExpandSwitch expandSwitch, u32 p5, JKRHeap* heap, int id, u32* pSize) { - JKRAram::aramToMainRam(address, buf, bufSize, expandSwitch, p5, heap, id, pSize); + return JKRAram::aramToMainRam(address, buf, bufSize, expandSwitch, p5, heap, id, pSize); } inline JKRAramBlock* JKRMainRamToAram(u8* buf, u32 bufSize, u32 alignedSize, JKRExpandSwitch expandSwitch, u32 fileSize, JKRHeap* heap, int id, u32) diff --git a/include/JSystem/JKernel/JKRDisposer.h b/include/JSystem/JKernel/JKRDisposer.h index 7d53aac6..daea8dcc 100644 --- a/include/JSystem/JKernel/JKRDisposer.h +++ b/include/JSystem/JKernel/JKRDisposer.h @@ -2,9 +2,12 @@ #define JKRDISPOSER_H #include "types.h" - #include "JSystem/JSupport/JSUList.h" +#ifdef __cplusplus +extern "C" { +#endif + class JKRHeap; class JKRDisposer @@ -18,4 +21,8 @@ public: JSULink mPointerLinks; // _8 }; +#ifdef __cplusplus +} +#endif + #endif diff --git a/include/JSystem/JSupport/JSUList.h b/include/JSystem/JSupport/JSUList.h index 0dcf2ab1..ff3ef113 100644 --- a/include/JSystem/JSupport/JSUList.h +++ b/include/JSystem/JSupport/JSUList.h @@ -3,6 +3,10 @@ #include "types.h" +#ifdef __cplusplus +extern "C" { +#endif + class JSUPtrLink; class JSUPtrList @@ -220,4 +224,8 @@ private: JSUTree *mTree; }; +#ifdef __cplusplus +} +#endif + #endif /* JSULIST_H */ \ No newline at end of file diff --git a/include/JSystem/JUtility/JUTGamePad.h b/include/JSystem/JUtility/JUTGamePad.h new file mode 100644 index 00000000..cef2d8f7 --- /dev/null +++ b/include/JSystem/JUtility/JUTGamePad.h @@ -0,0 +1,210 @@ +#ifndef JUTGAMEPAD_H +#define JUTGAMEPAD_H + +#include "types.h" +#include "dolphin/os.h" +#include "dolphin/os/OSTime.h" +#include "dolphin/pad.h" +#include "JSystem/JKernel/JKRDisposer.h" + +#ifdef __cplusplus +extern "C" { +#endif + +typedef void (*JUTResetBtnCb)(int, void*); +class JUTGamePad : public JKRDisposer +{ +public: + enum EPadPort + { + Port_unknown = -999, + Port_Invalid = -1, + Port1 = 0, + Port2, + Port3, + Port4, + PortRecorder + }; + + enum EButtons + { + MAINSTICK_UP = 0x8000000, + MAINSTICK_DOWN = 0x4000000, + MAINSTICK_RIGHT = 0x2000000, + MAINSTICK_LEFT = 0x1000000, + CSTICK_UP = 0x80000, + CSTICK_DOWN = 0x40000, + CSTICK_RIGHT = 0x20000, + CSTICK_LEFT = 0x10000, + START = 0x1000, + Y = 0x800, + X = 0x400, + B = 0x200, + A = 0x100, + L = 0x40, + R = 0x20, + Z = 0x10, + DPAD_UP = 0x8, + DPAD_DOWN = 0x4, + DPAD_RIGHT = 0x2, + DPAD_LEFT = 0x1 + }; + + enum EStickMode + { + NonClamped, + Clamped + }; + + enum EWhichStick + { + WhichStick_MainStick, + WhichStick_SubStick + }; + + JUTGamePad(); + JUTGamePad(EPadPort port); + virtual ~JUTGamePad(); + + void assign(); + void checkResetSwitch(); + void clearForReset(); + static void init(); + void initList(); + void read(); + static bool recalibrate(u32); + void setButtonRepeat(u32, u32, u32); + void update(); + + static void setResetCallback(JUTResetBtnCb callback, void *param_0) + { + C3ButtonReset::sCallback = callback; + C3ButtonReset::sCallbackArg = param_0; + } + + + bool testButton(u32 mask) const { + return mButtons.mButton & mask; + } + + bool testTrigger(u32 mask) const { + return mButtons.mTrigger & mask; + } + + class CButton + { + public: + CButton(); + + void clear(); + void update(const PADStatus*, u32); + void setRepeat(u32, u32, u32); + + u32 mButton; // _0 + u32 mTrigger; + u32 mRelease; + u8 mAnalogA; // _C + u8 mAnalogB; // _D + u8 mAnalogL; // _E + u8 mAnalogR; // _F + f32 mAnalogLf; // _10 + f32 mAnalogRf; // _14 + u32 mRepeat; + u32 _1C; + u32 _20; + u32 _24; + u32 _28; + u32 _2C; + }; + + class CStick + { + public: + CStick(); + + void clear(); + u32 update(s8 x, s8 y, JUTGamePad::EStickMode, JUTGamePad::EWhichStick); + u32 update(s8 x, s8 y, JUTGamePad::EStickMode, JUTGamePad::EWhichStick, u32); + u32 getButton(); + + f32 mStickX; + f32 mStickY; + f32 mValue; + s16 mAngle; + }; + + class CRumble + { + public: + void clear(JUTGamePad*); + static void stopMotor(s32); + static void stopMotorHard(s32); + void update(u16); + void setEnable(u32); + + u32 _0; + u32 _4; + u32 _8; + u32 _C; + }; + + class C3ButtonReset { + public: + C3ButtonReset() { mReset = false; } + + static u32 sResetPattern; + static u32 sResetMaskPattern; + static JUTResetBtnCb sCallback; + static void *sCallbackArg; + static OSTime sThreshold; + static s32 sResetOccurredPort; + static bool sResetOccurred; + static bool sResetSwitchPushing; + + private: + bool mReset; + }; + + static bool isPadOk() { // fabricated + bool ret = false; + switch(mPadStatus[0].err) { + case -1: + case 0: + ret = true; + break; + } + return ret; + } + + static PADStatus *getPadStatus(int idx) { return &mPadStatus[idx]; } + + static EStickMode sStickMode; + + static PADStatus mPadStatus[4]; + + CButton mButtons; // _18 + CStick mMainStick; // _48 + CStick mSubStick; // _58 + CRumble mRumble; // _68 + u16 mPort; // _78 + s8 mErrorStatus; // _7A + JSULink mPtrLink; // _7C + u32 _8C; + u32 _90; + u32 _94; + C3ButtonReset mButtonReset; // _98 + u8 _99; + u8 _9A; + u8 _9B; + u8 _9C; + u8 _9D; // padding? + u8 _9E; // ^^ + u8 _9F; // ^^ + OSTime mResetTime; // _A0 +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/JSystem/JUtility/TColor.h b/include/JSystem/JUtility/TColor.h new file mode 100644 index 00000000..8c917a01 --- /dev/null +++ b/include/JSystem/JUtility/TColor.h @@ -0,0 +1,76 @@ +#ifndef TCOLOR_H +#define TCOLOR_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "types.h" +#include + +#define TCOLOR_WHITE JUtility::TColor(0xFF, 0xFF, 0xFF, 0xFF) +#define TCOLOR_BLACK JUtility::TColor(0, 0, 0, 0) + +namespace JUtility { + struct TColor : public GXColor { + TColor() { set(0xFFFFFFFF); } + + TColor(u8 _r, u8 _g, u8 _b, u8 _a) { set(_r, _g, _b, _a); } + + TColor(u32 u32Color) { set(u32Color); } + + TColor(GXColor color) { set(color); } + + TColor &operator=(const TColor &other) { + ((GXColor *)this)->operator=(other); + return *this; + } + + /** @fabricated */ + TColor &operator=(const GXColorS10 &other) { + r = other.r; + g = other.g; + b = other.b; + a = other.a; + return *this; + } + + operator u32() const { return toUInt32(); } + u32 toUInt32() const { return *(u32 *)&r; } + + void set(u8 cR, u8 cG, u8 cB, u8 cA) { + r = cR; + g = cG; + b = cB; + a = cA; + } + + void set(u32 u32Color) { *(u32 *)&r = u32Color; } + + void set(GXColor gxColor) { *(GXColor *)&r = gxColor; } + void set(TColor color) { *this = color; } + + void setRGB(u8 cR, u8 cG, u8 cB) { + r = cR; + g = cG; + b = cB; + } + + void setRGB(const TColor &other) { setRGB(other.r, other.g, other.b); } + + void setRGBA(const TColor &other) { + r = other.r; + g = other.g; + b = other.b; + a = other.a; + } + + // _00 = GXColor (_00 = r, _01 = g, _02 = b, _03 = a) + }; +} // namespace JUtility + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/THA_GA.h b/include/THA_GA.h index 23d2a678..e7b031da 100644 --- a/include/THA_GA.h +++ b/include/THA_GA.h @@ -25,22 +25,22 @@ typedef union { typedef THA_GA_t THA_GA; -extern void THA_GA_ct(THA_GA* this, Gfx* p, size_t n); -extern void THA_GA_dt(THA_GA* this); /* @unused */ -extern int THA_GA_isCrash(THA_GA* this); -extern void THA_GA_init(THA_GA* this); /* @unused*/ -extern int THA_GA_getFreeBytes(THA_GA* this); -extern void* THA_GA_getTailPtr(THA_GA* this); /* @unused */ -extern void* THA_GA_nextPtrN(THA_GA* this, size_t n); /* @unused */ -extern void* THA_GA_nextPtr1(THA_GA* this); /* @unused */ -extern Gfx* THA_GA_NEXT_DISP(THA_GA* this); /* @unused */ -extern void* THA_GA_getHeadPtr(THA_GA* this); /* @unused */ -extern void THA_GA_setHeadPtr(THA_GA* this, void *p); /* @unused */ -extern Mtx* THA_GA_alloc(THA_GA* this, size_t n); /* @unused */ -extern Mtx* THA_GA_allocMtxN(THA_GA* this, size_t n); /* @unused */ -extern Mtx* THA_GA_allocMtx1(THA_GA* this); /* @unused */ -extern Vtx* THA_GA_allocVtxN(THA_GA* this, size_t n); /* @unused */ -extern Vtx* THA_GA_allocVtx1(THA_GA* this); /* @unused */ +extern void THA_GA_ct(THA_GA* tha_ga, Gfx* p, size_t n); +extern void THA_GA_dt(THA_GA* tha_ga); /* @unused */ +extern int THA_GA_isCrash(THA_GA* tha_ga); +extern void THA_GA_init(THA_GA* tha_ga); /* @unused*/ +extern int THA_GA_getFreeBytes(THA_GA* tha_ga); +extern void* THA_GA_getTailPtr(THA_GA* tha_ga); /* @unused */ +extern void* THA_GA_nextPtrN(THA_GA* tha_ga, size_t n); /* @unused */ +extern void* THA_GA_nextPtr1(THA_GA* tha_ga); /* @unused */ +extern Gfx* THA_GA_NEXT_DISP(THA_GA* tha_ga); /* @unused */ +extern void* THA_GA_getHeadPtr(THA_GA* tha_ga); /* @unused */ +extern void THA_GA_setHeadPtr(THA_GA* tha_ga, void *p); /* @unused */ +extern Mtx* THA_GA_alloc(THA_GA* tha_ga, size_t n); /* @unused */ +extern Mtx* THA_GA_allocMtxN(THA_GA* tha_ga, size_t n); /* @unused */ +extern Mtx* THA_GA_allocMtx1(THA_GA* tha_ga); /* @unused */ +extern Vtx* THA_GA_allocVtxN(THA_GA* tha_ga, size_t n); /* @unused */ +extern Vtx* THA_GA_allocVtx1(THA_GA* tha_ga); /* @unused */ #ifdef __cplusplus }; diff --git a/include/TwoHeadArena.h b/include/TwoHeadArena.h index 2c740e5e..ca1ab905 100644 --- a/include/TwoHeadArena.h +++ b/include/TwoHeadArena.h @@ -16,21 +16,21 @@ typedef struct { typedef TwoHeadArena_t TwoHeadArena; typedef TwoHeadArena_t THA; -extern void THA_ct(TwoHeadArena* this, char* p, size_t n); -extern void THA_dt(TwoHeadArena* this); -extern void* THA_getHeadPtr(TwoHeadArena* this); /* @unused */ -extern void THA_setHeadPtr(TwoHeadArena* this, void* p); /* @unused */ -extern void* THA_getTailPtr(TwoHeadArena* this); /* @unused */ -extern void* THA_nextPtrN(TwoHeadArena* this, size_t n); /* @unused */ -extern void* THA_nextPtr1(TwoHeadArena* this); /* @unused */ -extern void* THA_alloc(TwoHeadArena* this, size_t siz); -extern void* THA_alloc16(TwoHeadArena* this, size_t siz); -extern void* THA_allocAlign(TwoHeadArena* this, size_t siz, int mask); -extern int THA_isCrash(TwoHeadArena* this); -extern void THA_init(TwoHeadArena* this); -extern int THA_getFreeBytes16(TwoHeadArena* this); -extern int THA_getFreeBytes(TwoHeadArena* this); -extern int THA_getFreeBytesAlign(TwoHeadArena* this, int mask); +extern void THA_ct(TwoHeadArena* tha, char* p, size_t n); +extern void THA_dt(TwoHeadArena* tha); +extern void* THA_getHeadPtr(TwoHeadArena* tha); /* @unused */ +extern void THA_setHeadPtr(TwoHeadArena* tha, void* p); /* @unused */ +extern void* THA_getTailPtr(TwoHeadArena* tha); /* @unused */ +extern void* THA_nextPtrN(TwoHeadArena* tha, size_t n); /* @unused */ +extern void* THA_nextPtr1(TwoHeadArena* tha); /* @unused */ +extern void* THA_alloc(TwoHeadArena* tha, size_t siz); +extern void* THA_alloc16(TwoHeadArena* tha, size_t siz); +extern void* THA_allocAlign(TwoHeadArena* tha, size_t siz, int mask); +extern int THA_isCrash(TwoHeadArena* tha); +extern void THA_init(TwoHeadArena* tha); +extern int THA_getFreeBytes16(TwoHeadArena* tha); +extern int THA_getFreeBytes(TwoHeadArena* tha); +extern int THA_getFreeBytesAlign(TwoHeadArena* tha, int mask); #ifdef __cplusplus }; diff --git a/include/dolphin/dvd.h b/include/dolphin/dvd.h index c434f4b5..aa43e5e4 100644 --- a/include/dolphin/dvd.h +++ b/include/dolphin/dvd.h @@ -193,6 +193,8 @@ void DVDDumpWaitingQueue(); #define DVD_AIS_SUCCESS 0 +DVDDiskID DiskID AT_ADDRESS(0x80000000); + ////////////////////////////////// #ifdef __cplusplus diff --git a/include/dolphin/pad.h b/include/dolphin/pad.h index bc6f5501..25fabe4a 100644 --- a/include/dolphin/pad.h +++ b/include/dolphin/pad.h @@ -25,6 +25,33 @@ extern "C" { #define PAD_BUTTON_MENU 0x1000 #define PAD_BUTTON_START 0x1000 +typedef void (*PADSamplingCallback)(void); + +typedef struct PADStatus { + u16 button; + s8 stickX; + s8 stickY; + s8 substickX; + s8 substickY; + u8 triggerLeft; + u8 triggerRight; + u8 analogA; + u8 analogB; + s8 err; +} PADStatus; + +BOOL PADInit(); +u32 PADRead(PADStatus *status); +BOOL PADReset(u32 mask); +BOOL PADRecalibrate(u32 mask); +void PADClamp(PADStatus *status); +void PADClampCircle(PADStatus *status); +void PADControlMotor(s32 chan, u32 cmd); +void PADSetSpec(u32 spec); +void PADControlAllMotors(const u32 *cmdArr); +void PADSetAnalogMode(u32 mode); +PADSamplingCallback PADSetSamplingCallback(PADSamplingCallback); + #ifdef __cplusplus } #endif diff --git a/include/game.h b/include/game.h index cdffd3a3..f11d60b9 100644 --- a/include/game.h +++ b/include/game.h @@ -57,23 +57,23 @@ do { \ GAME_NEXT_GAME(t_game, init_name, class_name); \ } while (0) -extern void game_debug_draw_last(GAME* this, GRAPH* graph); +extern void game_debug_draw_last(GAME* game, GRAPH* graph); extern void game_draw_last(GRAPH* graph); -extern void game_get_controller(GAME* this); +extern void game_get_controller(GAME* game); extern void SetGameFrame(int frame); -extern void game_main(GAME* this); -extern void game_resize_hyral(GAME* this, int size); -extern void game_ct(GAME* this, void (*init)(GAME*), GRAPH* graph); -extern void game_dt(GAME* this); -extern void (*game_get_next_game_init(GAME* this))(GAME*); +extern void game_main(GAME* game); +extern void game_resize_hyral(GAME* game, int size); +extern void game_ct(GAME* game, void (*init)(GAME*), GRAPH* graph); +extern void game_dt(GAME* game); +extern void (*game_get_next_game_init(GAME* game))(GAME*); #ifndef MUST_MATCH -extern size_t game_get_next_game_class_size(GAME* this); +extern size_t game_get_next_game_class_size(GAME* game); #endif -extern int game_is_doing(GAME* this); -extern int game_getFreeBytes(GAME* this); -extern void game_goto_next_game_play(GAME* this); +extern int game_is_doing(GAME* game); +extern int game_getFreeBytes(GAME* game); +extern void game_goto_next_game_play(GAME* game); #ifndef MUST_MATCH -extern void game_goto_next_game_famicom_emu(GAME* this); +extern void game_goto_next_game_famicom_emu(GAME* game); #endif extern GAME* gamePT; diff --git a/include/graph.h b/include/graph.h index 43f62052..56a5ab50 100644 --- a/include/graph.h +++ b/include/graph.h @@ -88,8 +88,8 @@ typedef struct graph_s { } GRAPH ATTRIBUTE_ALIGN(8); // one of the missing structs is likely aligned to 8 bytes. extern void graph_proc(void* arg); -extern void graph_ct(GRAPH* this); -extern void graph_dt(GRAPH* this); +extern void graph_ct(GRAPH* graph); +extern void graph_dt(GRAPH* graph); #define GRAPH_SET_DOING_POINT(g, point) ((g)->doing_point = GRAPH_DOING_##point) diff --git a/include/jsyswrap.h b/include/jsyswrap.h index 801e9c9c..636776e4 100644 --- a/include/jsyswrap.h +++ b/include/jsyswrap.h @@ -2,25 +2,119 @@ #define JSYSWRAP_H #include "types.h" +#include "libjsys/jsyswrapper.h" #include "dolphin/gx.h" +#include "dolphin/dvd.h" +#include "dolphin/pad.h" #ifdef __cplusplus extern "C" { #endif -extern void JW_JUTReport(int pos_x, int pos_y, int show_count, const char* fmt, ...); -extern void JC_JFWDisplay_startFadeOut(void*, int); -extern void* JC_JFWDisplay_getManager(); -extern void JC_JFWDisplay_clearEfb(void*, GXColor*); -extern GXRenderModeObj* JC_JFWDisplay_getRenderMode(void*); -extern void* JC_JFWDisplay_changeToSingleXfb(void*, int); +enum resource_index { + RESOURCE_FGDATA, + RESOURCE_MAIL, + RESOURCE_MAIL_TABLE, + RESOURCE_MAILA, + RESOURCE_MAILA_TABLE, + RESOURCE_MAILB, + RESOURCE_MAILB_TABLE, + RESOURCE_MAILC, + RESOURCE_MAILC_TABLE, + RESOURCE_PALLET_BOY, + RESOURCE_PS, + RESOURCE_PS_TABLE, + RESOURCE_PSZ, + RESOURCE_PSZ_TABLE, + RESOURCE_SELECT, + RESOURCE_SELECT_TABLE, + RESOURCE_STRING, + RESOURCE_STRING_TABLE, + RESOURCE_SUPERZ, + RESOURCE_SUPERZ_TABLE, + RESOURCE_SUPER, + RESOURCE_SUPER_TABLE, + RESOURCE_TEX_BOY, + RESOURCE_FACE_BOY, + RESOURCE_FGNPCDATA, + RESOURCE_MESSAGE, + RESOURCE_MESSAGE_TABLE, + RESOURCE_MY_ORIGINAL, + RESOURCE_NEEDLEWORK_JOYBOOT, + RESOURCE_PLAYER_ROOM_FLOOR, + RESOURCE_PLAYER_ROOM_WALL, + RESOURCE_NPC_NAME_STR_TABLE, + RESOURCE_D_OBJ_NPC_STOCK_SCH, + RESOURCE_D_OBJ_NPC_STOCK_SCL, + RESOURCE_TITLE, + RESOURCE_MURA_SPRING, + RESOURCE_MURA_SUMMER, + RESOURCE_MURA_FALL, + RESOURCE_MURA_WINTER, + RESOURCE_ODEKAKE, + RESOURCE_OMAKE, + RESOURCE_EKI1, + RESOURCE_EKI1_2, + RESOURCE_EKI1_3, + RESOURCE_EKI1_4, + RESOURCE_EKI1_5, + RESOURCE_EKI2, + RESOURCE_EKI2_2, + RESOURCE_EKI2_3, + RESOURCE_EKI2_4, + RESOURCE_EKI2_5, + RESOURCE_EKI3, + RESOURCE_EKI3_2, + RESOURCE_EKI3_3, + RESOURCE_EKI3_4, + RESOURCE_EKI3_5, + RESOURCE_TEGAMI, + RESOURCE_TEGAMI2, + RESOURCE_FAMIKON, + RESOURCE_BOY1, + RESOURCE_BOY2, + RESOURCE_BOY3, + RESOURCE_BOY4, + RESOURCE_BOY5, + RESOURCE_BOY6, + RESOURCE_BOY7, + RESOURCE_BOY8, + RESOURCE_GIRL11, + RESOURCE_GIRL12, + RESOURCE_GIRL13, + RESOURCE_GIRL14, + RESOURCE_GIRL15, + RESOURCE_GIRL16, + RESOURCE_GIRL17, + RESOURCE_GIRL18, + RESOURCE_D_BG_ISLAND_SCH, -extern void JC_JFWDisplay_startFadeIn(void*, int); -extern void JC_JFWDisplay_changeToDoubleXfb(void*); -extern u32 JC__JKRGetResource(char*); -extern int JC__JKRGetMemBlockSize(int, u32); + RESOURCE_NUM +}; -extern void JC__JKRRemoveResource(void*); +extern void JW_UpdateVideoMode(); +extern void JW_SetProgressiveMode(int enabled); +extern void JW_SetLowResoMode(int enabled); +extern void JW_SetFamicomMode(int enabled); +extern void JW_SetVideoPan(u16 origin_x, u16 origin_y, u16 width, u16 height); +extern void JW_SetLogoMode(int enabled); +extern void JW_JUTGamePad_read(); +extern void JW_getPadStatus(PADStatus* padStatus); +extern int JW_JUTGamepad_getErrorStatus(); +extern u32 JW_JUTGamepad_getButton(); +extern u32 JW_JUTGamepad_getTrigger(); +extern f32 JW_JUTGamepad_getSubStickValue(); +extern int JW_JUTGamepad_getSubStickAngle(); +extern void JW_BeginFrame(); +extern void JW_EndFrame(); +extern int JW_setClearColor(u8 r, u8 g, u8 b); +extern u32 JW_GetAramAddress(int res_no); +extern u8* _JW_GetResourceAram(u32 aram_addr, u8* dst, u32 size); +extern u32 JW_GetResSizeFileNo(int res_no); +extern void JW_Init(); +extern void JW_Init2(); +extern void JW_Init3(); +extern void JW_Cleanup(); #ifdef __cplusplus } diff --git a/include/jsyswrap_cpp.h b/include/jsyswrap_cpp.h new file mode 100644 index 00000000..10f87afb --- /dev/null +++ b/include/jsyswrap_cpp.h @@ -0,0 +1,18 @@ +#ifndef JSYSWRAP_CPP_H +#define JSYSWRAP_CPP_H + +#include "types.h" +#include "jsyswrap.h" +#include "JSystem/JUtility/JUTGamePad.h" + +#ifdef __cplusplus +extern "C" { +#endif + +extern JUTGamePad gamePad[]; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/include/libforest/emu64.h b/include/libforest/emu64.h index 6bed0447..26a7c5d9 100644 --- a/include/libforest/emu64.h +++ b/include/libforest/emu64.h @@ -7,6 +7,8 @@ extern "C" { #endif +extern u8 FrameCansel; + /* These might be signed */ extern void emu64_set_aflags(u32 idx, u32 value); extern int emu64_get_aflags(u32 idx); diff --git a/include/libjsys/jsyswrapper.h b/include/libjsys/jsyswrapper.h index 820e1143..f7682e71 100644 --- a/include/libjsys/jsyswrapper.h +++ b/include/libjsys/jsyswrapper.h @@ -5,123 +5,45 @@ #include "JSystem/JKernel/JKREnum.h" #include "JSystem/JUtility/JUTEnum.h" #include "va_args.h" +#include "dolphin/gx.h" #ifdef __cplusplus extern "C" { #endif -enum resource_index { - RESOURCE_FGDATA, - RESOURCE_MAIL, - RESOURCE_MAIL_TABLE, - RESOURCE_MAILA, - RESOURCE_MAILA_TABLE, - RESOURCE_MAILB, - RESOURCE_MAILB_TABLE, - RESOURCE_MAILC, - RESOURCE_MAILC_TABLE, - RESOURCE_PALLET_BOY, - RESOURCE_PS, - RESOURCE_PS_TABLE, - RESOURCE_PSZ, - RESOURCE_PSZ_TABLE, - RESOURCE_SELECT, - RESOURCE_SELECT_TABLE, - RESOURCE_STRING, - RESOURCE_STRING_TABLE, - RESOURCE_SUPERZ, - RESOURCE_SUPERZ_TABLE, - RESOURCE_SUPER, - RESOURCE_SUPER_TABLE, - RESOURCE_TEX_BOY, - RESOURCE_FACE_BOY, - RESOURCE_FGNPCDATA, - RESOURCE_MESSAGE, - RESOURCE_MESSAGE_TABLE, - RESOURCE_MY_ORIGINAL, - RESOURCE_NEEDLEWORK_JOYBOOT, - RESOURCE_PLAYER_ROOM_FLOOR, - RESOURCE_PLAYER_ROOM_WALL, - RESOURCE_NPC_NAME_STR_TABLE, - RESOURCE_D_OBJ_NPC_STOCK_SCH, - RESOURCE_D_OBJ_NPC_STOCK_SCL, - RESOURCE_TITLE, - RESOURCE_MURA_SPRING, - RESOURCE_MURA_SUMMER, - RESOURCE_MURA_FALL, - RESOURCE_MURA_WINTER, - RESOURCE_ODEKAKE, - RESOURCE_OMAKE, - RESOURCE_EKI1, - RESOURCE_EKI1_2, - RESOURCE_EKI1_3, - RESOURCE_EKI1_4, - RESOURCE_EKI1_5, - RESOURCE_EKI2, - RESOURCE_EKI2_2, - RESOURCE_EKI2_3, - RESOURCE_EKI2_4, - RESOURCE_EKI2_5, - RESOURCE_EKI3, - RESOURCE_EKI3_2, - RESOURCE_EKI3_3, - RESOURCE_EKI3_4, - RESOURCE_EKI3_5, - RESOURCE_TEGAMI, - RESOURCE_TEGAMI2, - RESOURCE_FAMIKON, - RESOURCE_BOY1, - RESOURCE_BOY2, - RESOURCE_BOY3, - RESOURCE_BOY4, - RESOURCE_BOY5, - RESOURCE_BOY6, - RESOURCE_BOY7, - RESOURCE_BOY8, - RESOURCE_GIRL11, - RESOURCE_GIRL12, - RESOURCE_GIRL13, - RESOURCE_GIRL14, - RESOURCE_GIRL15, - RESOURCE_GIRL16, - RESOURCE_GIRL17, - RESOURCE_GIRL18, - RESOURCE_D_BG_ISLAND_SCH, - - RESOURCE_NUM -}; - -extern void JW_Init(); -extern void JW_Init2(); -extern void JW_Init3(); -extern void* JW_Alloc(size_t size, int align); -extern void JW_Free(void* ptr); -extern s32 JW_Resize(void* ptr, size_t new_size); -extern size_t JW_GetMemBlockSize(void* ptr); -extern size_t JW_GetResSizeFileNo(int file_no); -extern void JW_BeginFrame(); -extern void JW_EndFrame(); -extern void JW_JUTReport(int x, int y, int show_count, const char* fmt, ...); -extern void JW_SetLowResoMode(BOOL enable); -extern void JW_SetProgressiveMode(BOOL enable); -extern u32 JW_GetAramAddress(int resource_no); -extern u8* _JW_GetResourceAram(u32 aram_addr, u8* dst, size_t size); -extern void JW_SetFamicomMode(int enabled); -extern void JW_SetLogoMode(int mode); -extern void JW_Cleanup(); +typedef struct { + u16 mFileID; // _00 + u16 mHash; // _02 + u32 mFlag; // _04 + u32 mDataOffset; // _08 + u32 mSize; // _0C + void* mData; // _10 +} CSDIFileEntry; extern void* JC_JFWSystem_getSystemConsole(); extern void* JC_JFWSystem_getRootHeap(); extern void* JC_JFWSystem_getSystemHeap(); +extern void* JC_JUTVideo_getManager(); +extern u16 JC_JUTVideo_getFbWidth(void* manager); +extern u16 JC_JUTVideo_getEfbHeight(void* manager); +extern void JC_JUTVideo_setRenderMode(void* manager, GXRenderModeObj* renderMode); + extern void* JC_JFWDisplay_getManager(); extern void JC_JFWDisplay_startFadeOut(void* manager, int len); extern void JC_JFWDisplay_startFadeIn(void* manager, int len); extern void JC_JFWDisplay_setFrameRate(void* manager, u16 framerate); +extern void JC_JFWDisplay_endFrame(void* manager); +extern void JC_JFWDisplay_beginRender(void* manager); +extern void JC_JFWDisplay_endRender(void* manager); +extern void JC_JFWDisplay_setClearColor(void* manager, GXColor color); extern void JC_JKRAramHeap_dump(void* heap); extern void* JC_JKRAram_getAramHeap(); +extern u32 JC_JKRAramArchive_getAramAddress_byName(void* archive, u32 root_name, const char* res_name); +extern CSDIFileEntry* JC__JKRGetResourceEntry_byName(u32 root_name, const char* res_name, void* archive); + extern int JC_JKRHeap_dump(void* heap); extern s32 JC_JKRHeap_getTotalFreeSize(void* heap); @@ -146,6 +68,7 @@ extern void JC_JUTConsole_scroll(void* console, int amount); extern u32 JC_JUTConsole_getHeight(void* console); extern u32 JC_JUTConsole_getUsedLine(void* console); extern void JC_JUTConsole_print_f_va(void* console, const char* fmt, va_list arg); +extern void JC_JUTConsole_print_f(void* console, const char* fmt, ...); extern void* JC_JUTConsoleManager_getManager(); extern void JC_JUTConsoleManager_drawDirect(void* manager, int direct); @@ -169,10 +92,58 @@ extern void JC_JUTAssertion_changeDevice(int device); extern void JC_JUTAssertion_changeDisplayTime(int displayTime); extern void JC_JUTGamePad_read(); +extern void JC_JFWDisplay_startFadeOut(void* manager, int fadeout); +extern void JC_JFWDisplay_clearEfb(void* manager, GXColor* color); +extern GXRenderModeObj* JC_JFWDisplay_getRenderMode(void* manager); +extern void* JC_JFWDisplay_changeToSingleXfb(void* manager, int param); +extern u16 JC_JFWDisplay_getEfbWidth(void* manager); +extern u16 JC_JFWDisplay_getEfbHeight(void* manager); +extern void JC_JFWSystem_setMaxStdHeap(int max); +extern void JC_JFWSystem_setSysHeapSize(u32 size); +extern void JC_JFWSystem_setFifoBufSize(u32 size); +extern void JC_JFWSystem_setAramAudioBufSize(u32 size); +extern void JC_JFWSystem_setAramGraphBufSize(u32 size); +extern void JC_JFWSystem_init(); +extern void* JC_JFWDisplay_createManager_0(GXRenderModeObj* renderMode, void* heap, int param0, int param1); +extern void JC_JFWDisplay_setFader(void* manager, void* fader); +extern void JC_JFWDisplay_setGamma(void* manager, int gamma); +extern void JC_JFWDisplay_destroyManager(); -extern u32 JW_JUTGamepad_getButton(); -extern u32 JW_JUTGamepad_getTrigger(); -extern u32 JW_JUTGamepad_getErrorStatus(); +extern void* JC_J2DOrthoGraph_new(); +extern void JC_J2DOrthoGraph_delete(void* orthograph); + +extern void* JC_JUTFader_new(int ul_x, int ul_y, int br_x, int br_y, u32* color); +extern void JC_JUTFader_delete(void* fader); + +extern void JC_JFWDisplay_changeToDoubleXfb(void* manager); +extern u32 JC__JKRGetResource(char* resourceName); +extern int JC__JKRGetMemBlockSize(int, u32); + +extern void JC__JKRRemoveResource(void* res); + +extern void JC_J2DOrthoGraph_setOrtho(void* gport, u16 ul_x, u16 ul_y, u16 br_x, u16 br_y); +extern void JC_J2DOrthoGraph_setPort(void* gport); + +extern void* JC_JKRAramArchive_new(); +extern BOOL JC__JKRMountFixedAramArchive(void* aram_archive, const char* file); +extern BOOL JC__JKRUnmountFixedAramArchive(void* aram_archive); +extern void JC_JKRAramArchive_delete(void* aram_archive); + +extern u32 JC_JKRHeap_getFreeSize(void* heap); +extern void* JC_JKRHeap_alloc(void* heap, u32 size, int align); +extern void JC_JKRHeap_free(void* heap, void* mem); + +extern void* JW_Alloc(size_t size, int align); +extern void JW_Free(void* ptr); +extern s32 JW_Resize(void* ptr, size_t new_size); +extern size_t JW_GetMemBlockSize(void* ptr); +extern void JW_JUTReport(int x, int y, int show_count, const char* fmt, ...); + +#ifdef JSYSWRAPPER_DEBUG +#define JSYSWRAPPER_PRINTF(console, fmt, ...) JC_JUTConsole_print_f(console, fmt, ...) +#else +#define JSYSWRAPPER_PRINTF(console, fmt, ...) +#endif #ifdef __cplusplus } diff --git a/rel/game.c b/rel/game.c index f6b50fe0..ca83f0fd 100644 --- a/rel/game.c +++ b/rel/game.c @@ -8,7 +8,7 @@ #include "gfxalloc.h" #include "gamealloc.h" #include "THA_GA.h" -#include "libjsys/jsyswrapper.h" +#include "jsyswrap.h" GAME* gamePT = NULL; diff --git a/rel/graph.c b/rel/graph.c index ffcf1081..a84a2279 100644 --- a/rel/graph.c +++ b/rel/graph.c @@ -8,7 +8,7 @@ #include "irqmgr.h" #include "libc64/malloc.h" #include "libforest/emu64/emu64_wrapper.h" -#include "libjsys/jsyswrapper.h" +#include "jsyswrap.h" #include "libu64/debug.h" #include "libultra/libultra.h" #include "m_bgm.h" diff --git a/rel/m_debug_hayakawa.c b/rel/m_debug_hayakawa.c index d3616198..fa39c6aa 100644 --- a/rel/m_debug_hayakawa.c +++ b/rel/m_debug_hayakawa.c @@ -19,7 +19,7 @@ #include "m_debug.h" #include "libu64/u64types.h" #include "dolphin/os.h" -#include "libjsys/jsyswrapper.h" +#include "jsyswrap.h" #include "libc64/__osMalloc.h" #include "m_rcp.h" #include "main.h" diff --git a/rel/m_debug_mode.c b/rel/m_debug_mode.c index 76af13ed..0dce9818 100644 --- a/rel/m_debug_mode.c +++ b/rel/m_debug_mode.c @@ -24,7 +24,7 @@ #include "m_card.h" #include "m_flashrom.h" #include "dolphin/dvd.h" -#include "libjsys/jsyswrapper.h" +#include "jsyswrap.h" #include "boot.h" #include "m_common_data.h" @@ -145,7 +145,7 @@ static void Debug_Print2_output(gfxprint_t* gfxprint) { } } -#define PAD_BUTTON_DOWN(buttons, button) (((int)(buttons) | (~(int)(button))) == -1) +#define PAD_BUTTON_IS_DOWN(buttons, button) (((int)(buttons) | (~(int)(button))) == -1) static int Debug_console(pad_t* pad) { static f32 console_scroll; @@ -161,7 +161,7 @@ static int Debug_console(pad_t* pad) { if (sys_console != NULL) { /* Toggle console visiblity when Z button is released */ - if (PAD_BUTTON_DOWN(pad->on.button, BUTTON_Z) && (pad->now.button & (~BUTTON_Z)) == 0) { + if (PAD_BUTTON_IS_DOWN(pad->on.button, BUTTON_Z) && (pad->now.button & (~BUTTON_Z)) == 0) { JC_JUTConsole_setVisible(sys_console, !JC_JUTConsole_isVisible(sys_console)); } @@ -171,12 +171,12 @@ static int Debug_console(pad_t* pad) { f32 log_stick_y = (f32)pad->off.stick_y / 60.0f; /* B button clears console */ - if (PAD_BUTTON_DOWN(pad->on.button, BUTTON_B)) { + if (PAD_BUTTON_IS_DOWN(pad->on.button, BUTTON_B)) { JC_JUTConsole_clear(sys_console); } /* L button to scroll */ - if (PAD_BUTTON_DOWN(pad->now.button, BUTTON_L)) { + if (PAD_BUTTON_IS_DOWN(pad->now.button, BUTTON_L)) { console_scroll -= log_stick_y; if (console_scroll > 1.0f) { @@ -221,7 +221,7 @@ static int Debug_console(pad_t* pad) { } /* R button re-prints console */ - if (PAD_BUTTON_DOWN(pad->on.button, BUTTON_R)) { + if (PAD_BUTTON_IS_DOWN(pad->on.button, BUTTON_R)) { JC_JUTConsole_dumpToTerminal(sys_console, -1); /* -1 is probably a define */ JC_JUTConsole_setOutput(sys_console, 3); /* Again, 3 is probably a define */ } @@ -257,7 +257,7 @@ extern void Debug_mode_input(pad_t* pad) { int dpad = now_button & (BUTTON_DRIGHT | BUTTON_DLEFT | BUTTON_DDOWN | BUTTON_DUP); /* L + R held shows the disk info, copy date, and zurumode/appNMI buffer state */ - if (PAD_BUTTON_DOWN(now_button, BUTTON_L) && PAD_BUTTON_DOWN(now_button, BUTTON_R)) { + if (PAD_BUTTON_IS_DOWN(now_button, BUTTON_L) && PAD_BUTTON_IS_DOWN(now_button, BUTTON_R)) { DVDDiskID* diskid = DVDGetCurrentDiskID(); if (diskid != NULL) { JW_JUTReport(50, 50, 1, "%.4s %.2s 0x%02x(%d)", diskid->gameName, diskid->company, diskid->gameVersion, diskid->gameVersion); @@ -270,7 +270,7 @@ extern void Debug_mode_input(pad_t* pad) { JW_JUTReport(50, 60, 1, "Z=%d Z2=%d ANB=%08x", zurumode_flag != 0, zurumode_flag >= 2, APPNMI_GETVAL()); /* Additionally, pressing Z after L + R will print out each bit in debug appNMI buffer */ - if (PAD_BUTTON_DOWN(pad->now.button, BUTTON_Z)) { + if (PAD_BUTTON_IS_DOWN(pad->now.button, BUTTON_Z)) { int i; for (i = 0; i < 32; i++) { JW_JUTReport(50 + i * 12, 70, 1, "%1x", (APPNMI_GETVAL() >> (31 - i)) & 1); @@ -278,7 +278,7 @@ extern void Debug_mode_input(pad_t* pad) { } } - if (zurumode_flag >= 2 && (PAD_BUTTON_DOWN(pad->now.button, BUTTON_L) || PAD_BUTTON_DOWN(pad->now.button, BUTTON_R) || PAD_BUTTON_DOWN(pad->now.button, BUTTON_START))) { + if (zurumode_flag >= 2 && (PAD_BUTTON_IS_DOWN(pad->now.button, BUTTON_L) || PAD_BUTTON_IS_DOWN(pad->now.button, BUTTON_R) || PAD_BUTTON_IS_DOWN(pad->now.button, BUTTON_START))) { /* Button combos to get to each register */ static debug_reg_keycombo_t key_data[DEBUG_REG_MAX] = { {BUTTON_L, BUTTON_CUP}, /* REG */ @@ -324,8 +324,8 @@ extern void Debug_mode_input(pad_t* pad) { int i; for (i = 0; i < DEBUG_REG_MAX; i++) { - if (PAD_BUTTON_DOWN(pad->now.button, key_data[i].held) && - PAD_BUTTON_DOWN(pad->on.button, key_data[i].pressed)) { + if (PAD_BUTTON_IS_DOWN(pad->now.button, key_data[i].held) && + PAD_BUTTON_IS_DOWN(pad->on.button, key_data[i].pressed)) { break; } } @@ -379,37 +379,37 @@ extern void Debug_mode_input(pad_t* pad) { **/ if (dpad & BUTTON_DRIGHT) { u16 btn = pad->now.button; - if (PAD_BUTTON_DOWN(btn, BUTTON_CUP)) { + if (PAD_BUTTON_IS_DOWN(btn, BUTTON_CUP)) { increment = 0x1000; - } else if (PAD_BUTTON_DOWN(btn, BUTTON_CDOWN)) { + } else if (PAD_BUTTON_IS_DOWN(btn, BUTTON_CDOWN)) { increment = 0x100; - } else if (PAD_BUTTON_DOWN(btn, BUTTON_A | BUTTON_B)) { + } else if (PAD_BUTTON_IS_DOWN(btn, BUTTON_A | BUTTON_B)) { increment = 1000; - } else if (PAD_BUTTON_DOWN(btn, BUTTON_A)) { + } else if (PAD_BUTTON_IS_DOWN(btn, BUTTON_A)) { increment = 100; } else { increment = 1; - if (PAD_BUTTON_DOWN(btn, BUTTON_B)) { + if (PAD_BUTTON_IS_DOWN(btn, BUTTON_B)) { increment = 10; } } } else if (dpad & BUTTON_DLEFT) { u16 btn = pad->now.button; - if (PAD_BUTTON_DOWN(btn, BUTTON_CUP)) { + if (PAD_BUTTON_IS_DOWN(btn, BUTTON_CUP)) { increment = -0x1000; - } else if (PAD_BUTTON_DOWN(btn, BUTTON_CDOWN)) { + } else if (PAD_BUTTON_IS_DOWN(btn, BUTTON_CDOWN)) { increment = -0x100; - } else if (PAD_BUTTON_DOWN(btn, BUTTON_A | BUTTON_B)) { + } else if (PAD_BUTTON_IS_DOWN(btn, BUTTON_A | BUTTON_B)) { increment = -1000; } /* lol the missed duplicated case */ - else if (PAD_BUTTON_DOWN(btn, BUTTON_A | BUTTON_B)) { + else if (PAD_BUTTON_IS_DOWN(btn, BUTTON_A | BUTTON_B)) { increment = -1000; - } else if (PAD_BUTTON_DOWN(btn, BUTTON_A)) { + } else if (PAD_BUTTON_IS_DOWN(btn, BUTTON_A)) { increment = -100; } else { increment = -1; - if (PAD_BUTTON_DOWN(btn, BUTTON_B)) { + if (PAD_BUTTON_IS_DOWN(btn, BUTTON_B)) { increment = -10; } } diff --git a/rel/m_eappli.c b/rel/m_eappli.c index b38ead6b..63530579 100644 --- a/rel/m_eappli.c +++ b/rel/m_eappli.c @@ -5,7 +5,7 @@ #include "lb_rtc.h" #include "m_scene_table.h" #include "m_malloc.h" -#include "libjsys/jsyswrapper.h" +#include "jsyswrap.h" #define CRC32_POLYNOMIAL 0xEDB88320 #define CRC32_START_VALUE 0xAA478422 diff --git a/rel/m_field_make.c b/rel/m_field_make.c index 9a7e5378..5dbd895b 100644 --- a/rel/m_field_make.c +++ b/rel/m_field_make.c @@ -7,7 +7,7 @@ #include "m_scene_table.h" #include "m_random_field.h" #include "m_soncho.h" -#include "libjsys/jsyswrapper.h" +#include "jsyswrap.h" #include "m_malloc.h" #include "libultra/libultra.h" #include "m_bg_tex.h" diff --git a/rel/m_handbill.c b/rel/m_handbill.c index 2d7a3950..b88b6371 100644 --- a/rel/m_handbill.c +++ b/rel/m_handbill.c @@ -1,6 +1,6 @@ #include "m_handbill.h" -#include "libjsys/jsyswrapper.h" +#include "jsyswrap.h" #include "m_msg.h" #include "m_string.h" #include "m_font.h" diff --git a/rel/m_island.c b/rel/m_island.c index 69b05844..98838bb8 100644 --- a/rel/m_island.c +++ b/rel/m_island.c @@ -5,7 +5,7 @@ #include "m_random_field.h" #include "m_malloc.h" #include "libultra/libultra.h" -#include "libjsys/jsyswrapper.h" +#include "jsyswrap.h" static Island_c l_keepIsland; static u16 l_keepIslandComb[mISL_FG_BLOCK_X_NUM * mISL_FG_BLOCK_Z_NUM]; diff --git a/rel/m_needlework.c b/rel/m_needlework.c index 3b8c6bec..dbbb37d8 100644 --- a/rel/m_needlework.c +++ b/rel/m_needlework.c @@ -3,7 +3,7 @@ #include "m_string.h" #include "m_private.h" #include "m_common_data.h" -#include "libjsys/jsyswrapper.h" +#include "jsyswrap.h" #include "libultra/libultra.h" #include "m_lib.h" diff --git a/rel/m_npc.c b/rel/m_npc.c index f30f20c9..a9c949f8 100644 --- a/rel/m_npc.c +++ b/rel/m_npc.c @@ -13,7 +13,7 @@ #include "ac_my_room.h" #include "m_mail_password_check.h" #include "libultra/libultra.h" -#include "libjsys/jsyswrapper.h" +#include "jsyswrap.h" extern mNpc_Default_Data_c npc_def_list[]; extern s8 npc_grow_list[]; diff --git a/rel/m_room_type.c b/rel/m_room_type.c index 4ed45f92..e3eb9d56 100644 --- a/rel/m_room_type.c +++ b/rel/m_room_type.c @@ -8,7 +8,7 @@ #include "game.h" #include "m_house.h" #include "dolphin/os/OSCache.h" -#include "libjsys/jsyswrapper.h" +#include "jsyswrap.h" #include "m_player_lib.h" typedef struct ftr_place_data_s { diff --git a/rel/m_scene.c b/rel/m_scene.c index 0433a5b8..43b256c0 100644 --- a/rel/m_scene.c +++ b/rel/m_scene.c @@ -2,7 +2,7 @@ #include "m_player_lib.h" #include "libultra/libultra.h" -#include "libjsys/jsyswrapper.h" +#include "jsyswrap.h" #include "m_play.h" #include "m_common_data.h" #include "m_npc.h" diff --git a/rel/m_string.c b/rel/m_string.c index 1cc512fa..474b923a 100644 --- a/rel/m_string.c +++ b/rel/m_string.c @@ -1,7 +1,7 @@ #include "m_string.h" #include "m_msg.h" -#include "libjsys/jsyswrapper.h" +#include "jsyswrap.h" #include "m_lib.h" #include "m_font.h" #include "m_mail.h" diff --git a/rel/m_trademark.c b/rel/m_trademark.c index 3b527c05..5aa469ae 100644 --- a/rel/m_trademark.c +++ b/rel/m_trademark.c @@ -27,7 +27,7 @@ #include "m_vibctl.h" #include "sys_matrix.h" #include "sys_vimgr.h" -#include "libjsys/jsyswrapper.h" +#include "jsyswrap.h" #include "libc64/qrand.h" #include "m_common_data.h" #include "m_play.h" diff --git a/rel/main.c b/rel/main.c index 31be42c9..3ab608c7 100644 --- a/rel/main.c +++ b/rel/main.c @@ -6,7 +6,7 @@ #include "graph.h" #include "libultra/osMesg.h" #include "libultra/os_thread.h" -#include "libjsys/jsyswrapper.h" +#include "jsyswrap.h" #include "m_card.h" #include "_mem.h" #include "padmgr.h" diff --git a/src/boot.c b/src/boot.c index d0414e93..763e24bb 100644 --- a/src/boot.c +++ b/src/boot.c @@ -13,7 +13,7 @@ #include "libc64/sleep.h" #include "libforest/osreport.h" #include "libforest/emu64/emu64_wrapper.h" -#include "libjsys/jsyswrapper.h" +#include "jsyswrap.h" #include "libultra/initialize.h" #include "libultra/contreaddata.h" #include "libultra/libultra.h" diff --git a/src/dvderr.c b/src/dvderr.c index 2fe8547e..96e41102 100644 --- a/src/dvderr.c +++ b/src/dvderr.c @@ -4,7 +4,7 @@ #include "dolphin/dvd.h" #include "libforest/gbi_extensions.h" #include "libforest/emu64/emu64_wrapper.h" -#include "libjsys/jsyswrapper.h" +#include "jsyswrap.h" #include "dolphin/vi.h" #include "dolphin/gx.h" diff --git a/src/initial_menu.c b/src/initial_menu.c index 31b177b0..6c38b0fa 100644 --- a/src/initial_menu.c +++ b/src/initial_menu.c @@ -3,7 +3,7 @@ #include "libforest/gbi_extensions.h" #include "m_nmibuf.h" #include "dolphin/dvd.h" -#include "libjsys/jsyswrapper.h" +#include "jsyswrap.h" #include "boot.h" #include "dolphin/os/OSFont.h" #include "bootdata.h" diff --git a/src/jsyswrap.cpp b/src/jsyswrap.cpp new file mode 100644 index 00000000..c1983056 --- /dev/null +++ b/src/jsyswrap.cpp @@ -0,0 +1,588 @@ +#include "jsyswrap_cpp.h" + +#include "JSystem/JSystem.h" +#include "JSystem/JUtility/JUTGamePad.h" +#include "JSystem/JUtility/TColor.h" +#include "libforest/emu64.h" +#include "_mem.h" +#include "m_lib.h" +#include "dolphin/os/OSArena.h" +#include "libc64/malloc.h" + +/* These bytes are probably generated by an unused function that got stripped... thanks mwcc */ +#ifdef MUST_MATCH +#pragma force_active on +u8 _jsyswrap_autogen_match[0x40]; +#pragma force_active reset +#endif + +JUTGamePad gamePad[4]; +static void* jc_fader = nullptr; +static void* forest_arc_aram_p = nullptr; +static void* forest_arc_aram2_p = nullptr; +static void* gameheap_base; +static void* jc_gport = nullptr; +static void* jc_sysConsole = nullptr; +static u8 video_progressive = 0; +static u8 video_lowreso = 0; +static u8 video_famicom = 0; +static u8 video_logo = 0; +static u8 video_pan_enable = 0; +static u16 video_pan_xorg = 0; +static u16 video_pan_yorg = 0; +static u16 video_pan_width = 0; +static u16 video_pan_height = 0; + +static u32 SystemHeapSize = 0x16C7000; +static u32 gameheap_len = 0x380000; +static GXRenderModeObj customized_GXNtsc240Ds = { + VI_TVMODE_NTSC_DS, + 640, + 240, + 240, + 30, + 0, + 660, + 480, + VI_XFBMODE_SF, + FALSE, + FALSE, + { + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 } + }, + { 0, 0, 21, 22, 21, 0, 0 } +}; +static GXRenderModeObj customized_GXNtsc240Prog = { + VI_TVMODE_NTSC_PROG, + 640, + 240, + 480, + 30, + 0, + 660, + 480, + VI_XFBMODE_SF, + FALSE, + FALSE, + { + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 } + }, + { 0, 0, 21, 22, 21, 0, 0 } +}; +static GXRenderModeObj customized_GXNtsc240IntDf = { + VI_TVMODE_NTSC_INT, + 640, + 240, + 480, + 30, + 0, + 660, + 480, + VI_XFBMODE_DF, + FALSE, + FALSE, + { + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 } + }, + { 8, 8, 10, 12, 10, 8, 8 } +}; +static GXRenderModeObj customized_GXNtsc480Ds = { + VI_TVMODE_NTSC_DS, + 640, + 480, + 240, + 30, + 0, + 660, + 480, + VI_XFBMODE_SF, + FALSE, + FALSE, + { + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 } + }, + { 0, 0, 21, 22, 21, 0, 0 } +}; +static GXRenderModeObj customized_GXNtsc480IntDf = { + VI_TVMODE_NTSC_INT, + 640, + 480, + 480, + 30, + 0, + 660, + 480, + VI_XFBMODE_DF, + FALSE, + FALSE, + { + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 } + }, + { 8, 8, 10, 12, 10, 8, 8 } +}; +static GXRenderModeObj customized_GXNtsc480Prog = { + VI_TVMODE_NTSC_PROG, + 640, + 480, + 480, + 30, + 0, + 660, + 480, + VI_XFBMODE_SF, + FALSE, + FALSE, + { + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 }, + { 6, 6 } + }, + { 0, 0, 21, 22, 21, 0, 0 } +}; + +static void ReportDiskID() { + DVDDiskID* disk_id = DVDGetCurrentDiskID(); + + /* @NOTE: taken from e+ */ + JSYSWRAPPER_PRINTF(jc_sysConsole, "DiskID %.4s %.2s %d 0x%02x(%d)\n", disk_id->gameName, disk_id->company, disk_id->diskNumber, disk_id->gameVersion); +} + +extern void JW_UpdateVideoMode() { + GXRenderModeObj* renderMode; + + if (video_famicom) { + video_pan_xorg = 32; + video_pan_yorg = 8; + video_pan_width = 256; + video_pan_height = 232; + + if (video_lowreso != FALSE && video_progressive == FALSE) { + renderMode = &customized_GXNtsc240Ds; + } + else { + video_pan_yorg *= 2; + video_pan_height *= 2; + + if (video_progressive != FALSE) { + renderMode = &customized_GXNtsc240Prog; + } + else { + renderMode = &customized_GXNtsc240IntDf; + } + } + } + else { + if (video_logo) { + video_pan_xorg = 0; + video_pan_yorg = 0; + video_pan_width = 640; + video_pan_height = 480; + } + else { + video_pan_xorg = 20; + video_pan_yorg = 6; + video_pan_width = 598; + video_pan_height = 464; + } + + if (video_progressive) { + renderMode = &customized_GXNtsc480Prog; + } + else { + renderMode = &customized_GXNtsc480IntDf; + } + } + + if (renderMode != NULL) { + VIWaitForRetrace(); + JC_JUTVideo_setRenderMode(JC_JUTVideo_getManager(), renderMode); + } + + if (video_pan_enable) { + VIConfigurePan(video_pan_xorg, video_pan_yorg, video_pan_width, video_pan_height); + } +} + +extern void JW_SetProgressiveMode(int enabled) { + if (video_progressive != enabled) { + video_progressive = enabled; + JW_UpdateVideoMode(); + } +} + +extern void JW_SetLowResoMode(int enabled) { + if (video_lowreso != enabled) { + video_lowreso = enabled; + JW_UpdateVideoMode(); + } +} + +extern void JW_SetFamicomMode(int enabled) { + if (video_famicom != enabled) { + video_famicom = enabled; + JW_UpdateVideoMode(); + } +} + +extern void JW_SetVideoPan(u16 origin_x, u16 origin_y, u16 width, u16 height) { + if (video_pan_xorg != origin_x || video_pan_yorg != origin_y || video_pan_width != width || video_pan_height != height) { + video_pan_enable = TRUE; + video_pan_xorg = origin_x; + video_pan_yorg = origin_y; + video_pan_width = width; + video_pan_height = height; + } +} + +extern void JW_SetLogoMode(int enabled) { + if (video_logo != enabled) { + video_logo = enabled; + JW_UpdateVideoMode(); + } +} + +extern void JW_JUTGamePad_read() { + static OSTime last_pad_read; + OSTime now = OSGetTime(); + + if (now > last_pad_read + OSMillisecondsToTicks(16) || now < last_pad_read) { + last_pad_read = now; + JC_JUTGamePad_read(); + } +} + +extern void JW_getPadStatus(PADStatus* padStatus) { + memcpy(&padStatus[0], &JUTGamePad::mPadStatus[0], sizeof(PADStatus)); + memcpy(&padStatus[1], &JUTGamePad::mPadStatus[1], sizeof(PADStatus)); + memcpy(&padStatus[2], &JUTGamePad::mPadStatus[2], sizeof(PADStatus)); + memcpy(&padStatus[3], &JUTGamePad::mPadStatus[3], sizeof(PADStatus)); +} + +extern int JW_JUTGamepad_getErrorStatus() { + return (s8)gamePad[0].mErrorStatus; +} + +extern u32 JW_JUTGamepad_getButton() { + return gamePad[0].mButtons.mButton; +} + +extern u32 JW_JUTGamepad_getTrigger() { + return gamePad[0].mButtons.mTrigger; +} + +extern f32 JW_JUTGamepad_getSubStickValue() { + return gamePad[0].mSubStick.mValue; +} + +extern int JW_JUTGamepad_getSubStickAngle() { + return gamePad[0].mSubStick.mAngle; +} + +static bool FrameDrawing = false; + +extern void JW_BeginFrame() { + while (FrameCansel) { + VIWaitForRetrace(); + } + + FrameDrawing = true; + void* displayManager = JC_JFWDisplay_getManager(); + JC_JFWDisplay_endFrame(displayManager); + JC_JFWDisplay_beginRender(displayManager); + JC_J2DOrthoGraph_setOrtho(jc_gport, 0, 0, JC_JFWDisplay_getEfbWidth(displayManager), JC_JFWDisplay_getEfbHeight(displayManager)); + JC_J2DOrthoGraph_setPort(jc_gport); +} + +extern void JW_EndFrame() { + JC_JFWDisplay_endRender(JC_JFWDisplay_getManager()); + FrameDrawing = false; +} + +extern int JW_setClearColor(u8 r, u8 g, u8 b) { + static GXColor clear_color; + + if (clear_color.r != r || clear_color.g != g || clear_color.b != b) { + void* manager = JC_JFWDisplay_getManager(); + + clear_color.r = r; + clear_color.g = g; + clear_color.b = b; + + JC_JFWDisplay_setClearColor(manager, clear_color); + return TRUE; + } + + return FALSE; +} + +static const char* aram_resName[] = { + "fgdata.bin", + "mail_data.bin", + "mail_data_table.bin", + "maila_data.bin", + "maila_data_table.bin", + "mailb_data.bin", + "mailb_data_table.bin", + "mailc_data.bin", + "mailc_data_table.bin", + "pallet_boy.bin", + "ps_data.bin", + "ps_data_table.bin", + "psz_data.bin", + "psz_data_table.bin", + "select_data.bin", + "select_data_table.bin", + "string_data.bin", + "string_data_table.bin", + "superz_data.bin", + "superz_data_table.bin", + "super_data.bin", + "super_data_table.bin", + "tex_boy.bin", + "face_boy.bin", + "fgnpcdata.bin", + "message_data.bin", + "message_data_table.bin", + "my_original.bin", + "needlework.bin", + "player_room_floor.bin", + "player_room_wall.bin", + "npc_name_str_table.bin", + "d_obj_npc_stock_sch.bin", + "d_obj_npc_stock_scl.bin", + "title.bti", + "mura_spring.bti", + "mura_summer.bti", + "mura_fall.bti", + "mura_winter.bti", + "odekake.bti", + "omake.bti", + "eki1.bti", + "eki1_2.bti", + "eki1_3.bti", + "eki1_4.bti", + "eki1_5.bti", + "eki2.bti", + "eki2_2.bti", + "eki2_3.bti", + "eki2_4.bti", + "eki2_5.bti", + "eki3.bti", + "eki3_2.bti", + "eki3_3.bti", + "eki3_4.bti", + "eki3_5.bti", + "tegami.bti", + "tegami2.bti", + "famikon.bti", + "boy1.bti", + "boy2.bti", + "boy3.bti", + "boy4.bti", + "boy5.bti", + "boy6.bti", + "boy7.bti", + "boy8.bti", + "girl1.bti", + "girl2.bti", + "girl3.bti", + "girl4.bti", + "girl5.bti", + "girl6.bti", + "girl7.bti", + "girl8.bti", + "d_bg_island_sch.bin" +}; + +extern u32 JW_GetAramAddress(int res_no) { + int address = 0; + + if (res_no >= RESOURCE_FGDATA && res_no < RESOURCE_FGNPCDATA) { + address = JC_JKRAramArchive_getAramAddress_byName(forest_arc_aram_p, (u32)'DATA', aram_resName[res_no]); + } + else if (res_no >= RESOURCE_FGNPCDATA && res_no < RESOURCE_NUM) { + address = JC_JKRAramArchive_getAramAddress_byName(forest_arc_aram2_p, (u32)'DATA', aram_resName[res_no]); + } + + return address; +} + +extern u8* _JW_GetResourceAram(u32 aram_addr, u8* dst, u32 size) { + return JKRAramToMainRam(aram_addr, dst, size, EXPAND_SWITCH_DEFAULT, 0, nullptr, -1, nullptr); +} + +extern u32 JW_GetResSizeFileNo(int res_no) { + int res_size = 0; + + if (res_no >= RESOURCE_FGDATA && res_no < RESOURCE_FGNPCDATA) { + CSDIFileEntry* entry = JC__JKRGetResourceEntry_byName((u32)'DATA', aram_resName[res_no], forest_arc_aram_p); + + if (entry != nullptr) { + res_size = entry->mSize; + } + } + else if (res_no >= RESOURCE_FGNPCDATA && res_no < RESOURCE_NUM) { + CSDIFileEntry* entry = JC__JKRGetResourceEntry_byName((u32)'DATA', aram_resName[res_no], forest_arc_aram2_p); + + if (entry != nullptr) { + res_size = entry->mSize; + } + } + + return res_size; +} + +extern void JW_Init() { + const u32 soundAramSize = 0x810000; + const u32 graphAramSize = 0x6A3780; + + void* arena_hi = OSGetArenaHi(); + void* arena_lo = OSGetArenaLo(); + + SystemHeapSize = (u32)arena_hi - (u32)arena_lo - 0xD0; + JC_JFWSystem_setMaxStdHeap(1); + JC_JFWSystem_setSysHeapSize(SystemHeapSize); + JC_JFWSystem_setFifoBufSize(0x10001); + OSReport("soundAramSize=%08x graphAramSize=%08x totalAramSize=%08x\n", soundAramSize, graphAramSize, soundAramSize + graphAramSize); + JC_JFWSystem_setAramAudioBufSize(soundAramSize); + JC_JFWSystem_setAramGraphBufSize(graphAramSize); + JC_JFWSystem_init(); + JC_JKRExpHeap_changeGroupID(JC_JFWSystem_getSystemHeap(), 1); + jc_sysConsole = JC_JFWSystem_getSystemConsole(); + JC_JUTConsole_setOutput(jc_sysConsole, 3); + JC_JUTConsole_setPosition(jc_sysConsole, 32, 42); + void* display_manager = JC_JFWDisplay_createManager_0(&GXNtsc480IntDf, JC_JFWSystem_getSystemHeap(), 2, 1); + JC_JUTProcBar_setVisible(JC_JUTProcBar_getManager(), FALSE); + JC_JUTProcBar_setVisibleHeapBar(JC_JUTProcBar_getManager(), FALSE); + jc_gport = JC_J2DOrthoGraph_new(); + u32 color = TCOLOR_BLACK; + jc_fader = JC_JUTFader_new(0, 0, JC_JUTVideo_getFbWidth(JC_JUTVideo_getManager()), JC_JUTVideo_getEfbHeight(JC_JUTVideo_getManager()), &color); + JC_JFWDisplay_setFader(display_manager, jc_fader); + JC_JFWDisplay_setClearColor(display_manager, TCOLOR_BLACK); + JC_JFWDisplay_setGamma(display_manager, 0); + JW_SetVideoPan(20, 6, 598, 464); + JW_SetLogoMode(1); + JC_JKRExpHeap_changeGroupID(JC_JFWSystem_getSystemHeap(), 2); +} + +extern void JW_Init2() { + JC_JKRExpHeap_changeGroupID(JC_JFWSystem_getSystemHeap(), 3); + ReportDiskID(); + + if (forest_arc_aram_p == nullptr) { + forest_arc_aram_p = JC_JKRAramArchive_new(); + + if (forest_arc_aram_p == nullptr || JC__JKRMountFixedAramArchive(forest_arc_aram_p, "forest_1st.arc") == FALSE) { + OSDVDFatalError(); + } + } + + gameheap_len = JC_JKRHeap_getFreeSize(JC_JFWSystem_getSystemHeap()) - 0x10000; + gameheap_base = JC_JKRHeap_alloc(JC_JFWSystem_getSystemHeap(), gameheap_len, 32); + MallocInit(gameheap_base, gameheap_len); + JC_JKRExpHeap_changeGroupID(JC_JFWSystem_getSystemHeap(), 4); +} + +extern void JW_Init3() { + if (forest_arc_aram2_p == nullptr) { + forest_arc_aram2_p = JC_JKRAramArchive_new(); + + if (forest_arc_aram2_p == nullptr || JC__JKRMountFixedAramArchive(forest_arc_aram2_p, "forest_2nd.arc") == FALSE) { + OSDVDFatalError(); + } + } +} + +extern void JW_Cleanup() { + MallocCleanup(); + JC_JKRHeap_free(JC_JFWSystem_getSystemHeap(), gameheap_base); + gameheap_base = nullptr; + + if (forest_arc_aram_p != nullptr) { + JC__JKRUnmountFixedAramArchive(forest_arc_aram_p); + JC_JKRAramArchive_delete(forest_arc_aram_p); + forest_arc_aram_p = nullptr; + } + + if (forest_arc_aram2_p != nullptr) { + JC__JKRUnmountFixedAramArchive(forest_arc_aram2_p); + JC_JKRAramArchive_delete(forest_arc_aram2_p); + forest_arc_aram2_p = nullptr; + } + + JC_JFWDisplay_destroyManager(); + + if (jc_fader != nullptr) { + JC_JUTFader_delete(jc_fader); + jc_fader = nullptr; + } + + if (jc_gport != nullptr) { + JC_J2DOrthoGraph_delete(jc_gport); + jc_gport = nullptr; + } +} diff --git a/src/libforest/fault.c b/src/libforest/fault.c index 610b3074..43213cab 100644 --- a/src/libforest/fault.c +++ b/src/libforest/fault.c @@ -1,7 +1,7 @@ #include "libforest/fault.h" #include "terminal.h" #include "va_args.h" -#include "libjsys/jsyswrapper.h" +#include "jsyswrap.h" #include "dolphin/os.h" static fault* this = NULL;