diff options
| author | Jonathan Wase <jonathan@familjenwase.se> | 2021-01-03 22:19:54 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2021-01-03 16:19:54 -0500 |
| commit | 423fdadc32f8a70729bb86d07c0a30d9c1e324c5 (patch) | |
| tree | 594f11e12478809b4de7b970f99da841c4497f14 /include | |
| parent | 4e085c9c8489bfbb970c811572bfe68619834c74 (diff) | |
JKRDecomp OK (#58)
* JKRDecomp OK
* clang-format tool
* JKRThread cleanup and fixed suggestions
Co-authored-by: Julgodis <>
Co-authored-by: Pheenoh <pheenoh@gmail.com>
Diffstat (limited to 'include')
| -rw-r--r-- | include/JSystem/JKernel/JKRDecomp/JKRDecomp.h | 44 | ||||
| -rw-r--r-- | include/JSystem/JKernel/JKRHeap/JKRHeap.h | 4 | ||||
| -rw-r--r-- | include/JSystem/JKernel/JKRThread/JKRThread.h | 61 | ||||
| -rw-r--r-- | include/os/OS.h | 6 | ||||
| -rw-r--r-- | include/variables.h | 7 |
5 files changed, 94 insertions, 28 deletions
diff --git a/include/JSystem/JKernel/JKRDecomp/JKRDecomp.h b/include/JSystem/JKernel/JKRDecomp/JKRDecomp.h index 96e9996d15..5baf3800d2 100644 --- a/include/JSystem/JKernel/JKRDecomp/JKRDecomp.h +++ b/include/JSystem/JKernel/JKRDecomp/JKRDecomp.h @@ -4,30 +4,60 @@ #include "JSystem/JKernel/JKRThread/JKRThread.h" #include "dolphin/types.h" +class JKRAMCommand; class JKRDecompCommand { public: + typedef void (*AsyncCallback)(u32); + JKRDecompCommand(); ~JKRDecompCommand(); + +public: + /* 0x00 */ u32 field_0x0; + /* 0x04 */ u8* mSrcBuffer; + /* 0x08 */ u8* mDstBuffer; + /* 0x0C */ u32 mSrcLength; + /* 0x10 */ u32 mDstLength; + /* 0x14 */ AsyncCallback mCallback; + /* 0x18 */ JKRDecompCommand* mThis; + /* 0x1C */ OSMessageQueue* field_0x1c; + /* 0x20 */ s32 field_0x20; + /* 0x24 */ JKRAMCommand* mAMCommand; + /* 0x28 */ OSMessageQueue mMessageQueue; + /* 0x48 */ OSMessage mMessage; }; +#define JKRDECOMP_SYNC_BLOCKING 0 +#define JKRDECOMP_SYNC_NON_BLOCKING 1 + class JKRDecomp : public JKRThread { private: JKRDecomp(long); - virtual ~JKRDecomp(void); + virtual ~JKRDecomp(); /* vt[03] */ virtual void* run(); /* override */ public: - static void create(long); - static void prepareCommand(u8*, u8*, u32, u32, void (*)(u32)); + enum Compression { + NONE = 0, + YAY0 = 1, + YAZ0 = 2, + ASR = 3, + + __COMPRESSION_ENUM_FORCE_S32 = INT32_MAX, + __COMPRESSION_ENUM_FORCE_SIGNED = -1, + }; + + static JKRDecomp* create(long); + static JKRDecompCommand* prepareCommand(u8*, u8*, u32, u32, JKRDecompCommand::AsyncCallback); static void sendCommand(JKRDecompCommand*); - static void sync(JKRDecompCommand*, int); - static void orderAsync(u8*, u8*, u32, u32, void (*)(u32)); - static void orderSync(u8*, u8*, u32, u32); + static bool sync(JKRDecompCommand*, int); + static JKRDecompCommand* orderAsync(u8*, u8*, u32, u32, JKRDecompCommand::AsyncCallback); + static bool orderSync(u8*, u8*, u32, u32); static void decode(u8*, u8*, u32, u32); static void decodeSZP(u8*, u8*, u32, u32); static void decodeSZS(u8*, u8*, u32, u32); - static void checkCompressed(u8*); + static Compression checkCompressed(u8*); }; #endif diff --git a/include/JSystem/JKernel/JKRHeap/JKRHeap.h b/include/JSystem/JKernel/JKRHeap/JKRHeap.h index 8f52d54fb5..5af14cedce 100644 --- a/include/JSystem/JKernel/JKRHeap/JKRHeap.h +++ b/include/JSystem/JKernel/JKRHeap/JKRHeap.h @@ -150,4 +150,8 @@ inline void* operator new(u32 size, void* ptr) { return ptr; } +inline void* JKRAllocFromHeap(JKRHeap* heap, u32 size, int alignment) { + return JKRHeap::alloc(size, alignment, heap); +} + #endif
\ No newline at end of file diff --git a/include/JSystem/JKernel/JKRThread/JKRThread.h b/include/JSystem/JKernel/JKRThread/JKRThread.h index 1d55d23554..d259de7d11 100644 --- a/include/JSystem/JKernel/JKRThread/JKRThread.h +++ b/include/JSystem/JKernel/JKRThread/JKRThread.h @@ -20,25 +20,52 @@ public: void setCommon_mesgQueue(JKRHeap* heap, int message_count); void setCommon_heapSpecified(JKRHeap* heap, u32 stack_size, int param_3); - OSThread* getThreadRecord() { return this->mOSThread; } + OSThread* getThreadRecord() const { return mThreadRecord; } + void* getStack() const { return mStackMemory; } + u8 getLoadInfo() const { return field_0x60; } + JKRHeap* getCurrentHeap() const { return mCurrentHeap; } + JKRHeap* getCurrentHeapError() const { return mCurrentHeapError; } + + void resume() { OSResumeThread(mThreadRecord); } + void sendMessage(OSMessage message) { + OSSendMessage(&mMessageQueue, message, OS_MESSAGE_NON_BLOCKING); + } + void sendMessageBlock(OSMessage message) { + OSSendMessage(&mMessageQueue, message, OS_MESSAGE_BLOCKING); + } + OSMessage waitMessage() { + OSMessage message; + OSReceiveMessage(&mMessageQueue, &message, OS_MESSAGE_NON_BLOCKING); + return message; + } + OSMessage waitMessageBlock() { + OSMessage message; + OSReceiveMessage(&mMessageQueue, &message, OS_MESSAGE_BLOCKING); + return message; + } + void jamMessageBlock(OSMessage message) { + OSJamMessage(&mMessageQueue, message, OS_MESSAGE_BLOCKING); + } private: - JSULink<JKRThread> mThreadListLink; - JKRHeap* mHeap; - OSThread* mOSThread; - OSMessageQueue mQueue; - OSMessage* mMessages; - int mMessageCount; - void* mStackPtr; - u32 mStackSize; - u8 field_0x60; - u8 padding_0x61[3]; - u32 mCost; - u32 mSwitchCount; - u32 field_0x6c; - u32 field_0x70; - JKRHeap* field_0x74; - JKRHeap* field_0x78; + /* 0x00 */ // vtable + /* 0x04 */ // JKRDisposer + /* 0x18 */ JSULink<JKRThread> mThreadListLink; + /* 0x28 */ JKRHeap* mHeap; + /* 0x2C */ OSThread* mThreadRecord; + /* 0x30 */ OSMessageQueue mMessageQueue; + /* 0x50 */ OSMessage* mMessages; + /* 0x54 */ s32 mMessageCount; + /* 0x58 */ void* mStackMemory; + /* 0x5C */ u32 mStackSize; + /* 0x60 */ u8 field_0x60; + /* 0x61 */ u8 padding_0x61[3]; + /* 0x64 */ u32 mCost; + /* 0x68 */ u32 mSwitchCount; + /* 0x6C */ u32 field_0x6c; + /* 0x70 */ u32 field_0x70; + /* 0x74 */ JKRHeap* mCurrentHeap; + /* 0x78 */ JKRHeap* mCurrentHeapError; public: static void* start(void* param_1); diff --git a/include/os/OS.h b/include/os/OS.h index baacf7a496..98f54e3ab3 100644 --- a/include/os/OS.h +++ b/include/os/OS.h @@ -6,6 +6,9 @@ #include "dolphin/types.h" +#define OS_MESSAGE_NON_BLOCKING 0 +#define OS_MESSAGE_BLOCKING 1 + /* TODO: more structs, and get rid of the ones that are faked! */ #define OS_MESSAGE_NON_BLOCKING 0 @@ -103,7 +106,8 @@ OSSwitchThreadCallback OSSetSwitchThreadCallback(OSSwitchThreadCallback* callbac void OSInitMessageQueue(OSMessageQueue* queue, OSMessage* messages, int message_count); BOOL OSReceiveMessage(OSMessageQueue* queue, OSMessage message, int flags); -void OSSendMessage(OSMessageQueue* queue, OSMessage message, int flags); +BOOL OSSendMessage(OSMessageQueue* queue, OSMessage message, int flags); +BOOL OSJamMessage(OSMessageQueue* queue, OSMessage message, int flags); s32 OSGetConsoleType(void); s32 OSGetResetCode(void); diff --git a/include/variables.h b/include/variables.h index aca609c7b3..c76d3e67c3 100644 --- a/include/variables.h +++ b/include/variables.h @@ -273,10 +273,11 @@ extern u8 lbl_8039D188; // "JKRAramArchive.cpp" extern u8 lbl_803CC3E8; // JKRCompArchive::__vt extern u8 lbl_8039D220; // "JKRCompArchive.cpp" -extern u8 lbl_803CC460[32]; // JKRDecomp::sMessageBuffer +extern OSMessage lbl_803CC460[8]; // JKRDecomp::sMessageBuffer extern OSMessageQueue lbl_803CC480; // JKRDecomp::sMessageQueue -extern u8 lbl_804514B0; // JKRDecomp::sDecompObject -extern u8 lbl_803CC4A0; // JKRDecomp::__vt +class JKRDecomp; +extern JKRDecomp* lbl_804514B0; // JKRDecomp::sDecompObject +extern u8 lbl_803CC4A0; // JKRDecomp::__vt extern u8 lbl_80434378; // JKernel::@491 (global destructor chain) extern u8 lbl_80451428; // JKernel::szpBuf |
