diff --git a/configure.py b/configure.py index 49538a197..b432e1572 100644 --- a/configure.py +++ b/configure.py @@ -829,7 +829,7 @@ config.libs = [ Object(NonMatching, "JSystem/JUtility/JUTProcBar.cpp"), Object(NonMatching, "JSystem/JUtility/JUTConsole.cpp"), Object(Matching, "JSystem/JUtility/JUTDirectFile.cpp"), - Object(NonMatching, "JSystem/JUtility/JUTGba.cpp"), + Object(Matching, "JSystem/JUtility/JUTGba.cpp"), Object(NonMatching, "JSystem/JUtility/JUTFontData_Ascfont_fix12.s"), ], ), diff --git a/include/JSystem/JUtility/JUTGba.h b/include/JSystem/JUtility/JUTGba.h index d8d62b22b..ffc9fb680 100644 --- a/include/JSystem/JUtility/JUTGba.h +++ b/include/JSystem/JUtility/JUTGba.h @@ -9,8 +9,8 @@ struct JUTGbaParam; typedef void (*JUTGba_Func)(JUTGbaParam*, void*); struct JUTGbaParam { - /* 0x00 */ OSMessageQueue field_0x0; - /* 0x20 */ OSMessage field_0x20; + /* 0x00 */ OSMessageQueue msg_q; + /* 0x20 */ OSMessage msg[1]; /* 0x24 */ u32 field_0x24; /* 0x28 */ s32 channel; /* 0x2C */ u8* program; @@ -33,6 +33,7 @@ struct JUTGbaThreadVar { /* 0x10 */ u32 field_0x10; /* 0x14 */ u32 field_0x14; /* 0x18 */ u32 field_0x18; + /* 0x1C */ s32 field_0x1c; }; class JUTGba { diff --git a/src/JSystem/JUtility/JUTGba.cpp b/src/JSystem/JUtility/JUTGba.cpp index 0076b1af2..4bfbc577b 100644 --- a/src/JSystem/JUtility/JUTGba.cpp +++ b/src/JSystem/JUtility/JUTGba.cpp @@ -8,6 +8,7 @@ #include "JSystem/JUtility/JUTAssert.h" #include "dolphin/gba/GBA.h" #include "dolphin/si/SIBios.h" +#include "global.h" typedef struct OSAlarm OSAlarm; typedef struct OSContext OSContext; @@ -37,14 +38,16 @@ JUTGba* JUTGba::create() { param->program = 0; param->length = 0; param->field_0x24 = 0; - OSInitMessageQueue(¶m->field_0x0, ¶m->field_0x20, 1); + OSInitMessageQueue(¶m->msg_q, param->msg, ARRAY_SIZE(param->msg)); } + for (int i = 0; i < 4; i++) { JUTGbaParam* param = &sManager->mParams[i]; OSReport(":::GBA: Create Thread %d\n", i); OSCreateThread(&sManager->mThreads[i], &gbaThreadMain, param, sManager->mStacks + i + 1, 0x1000, 8, 0); OSResumeThread(&sManager->mThreads[i]); } + return sManager; } @@ -89,7 +92,7 @@ void JUTGba::doJoyBoot(int param_1, s32 palette_color, s32 palette_speed, u8* pr param->field_0x4c = param_6; param->field_0x50 = param_7; param->field_0x3c = 0; - OSSendMessage(¶m->field_0x0, (OSMessage)1, OS_MESSAGE_BLOCK); + OSSendMessage(¶m->msg_q, (OSMessage)1, OS_MESSAGE_BLOCK); } /* 802CC1F8-802CC308 .text resultJoyBoot__6JUTGbaFiPUc */ @@ -126,7 +129,7 @@ void JUTGba::doInitProbe(int param_1, JUTGba_Func param_2, void* param_3) { param->field_0x4c = param_2; param->field_0x50 = param_3; param->field_0x3c = 0; - OSSendMessage(¶m->field_0x0, (OSMessage)2, OS_MESSAGE_BLOCK); + OSSendMessage(¶m->msg_q, (OSMessage)2, OS_MESSAGE_BLOCK); } /* 802CC3A8-802CC430 .text resultInitProbe__6JUTGbaFiPUl */ @@ -142,7 +145,7 @@ void JUTGba::doProbe(int param_1, JUTGba_Func param_2, void* param_3) { param->field_0x4c = param_2; param->field_0x50 = param_3; param->field_0x3c = 0; - OSSendMessage(¶m->field_0x0, (OSMessage)3, OS_MESSAGE_BLOCK); + OSSendMessage(¶m->msg_q, (OSMessage)3, OS_MESSAGE_BLOCK); } /* 802CC4D0-802CC558 .text resultProbe__6JUTGbaFiPUl */ @@ -158,7 +161,7 @@ void JUTGba::doReset(int param_1, JUTGba_Func param_2, void* param_3) { param->field_0x4c = param_2; param->field_0x50 = param_3; param->field_0x3c = 0; - OSSendMessage(¶m->field_0x0, (OSMessage)4, OS_MESSAGE_BLOCK); + OSSendMessage(¶m->msg_q, (OSMessage)4, OS_MESSAGE_BLOCK); } /* 802CC5F8-802CC680 .text resultReset__6JUTGbaFiPUc */ @@ -175,7 +178,7 @@ void JUTGba::doRead(int param_1, u8* param_2, JUTGba_Func param_3, void* param_4 param->field_0x50 = param_4; param->field_0x3c = 0; param->field_0x48 = param_2; - OSSendMessage(¶m->field_0x0, (OSMessage)5, OS_MESSAGE_BLOCK); + OSSendMessage(¶m->msg_q, (OSMessage)5, OS_MESSAGE_BLOCK); } /* 802CC728-802CC7B0 .text resultRead__6JUTGbaFiPUc */ @@ -192,7 +195,7 @@ void JUTGba::doWrite(int param_1, u8* param_2, JUTGba_Func param_3, void* param_ param->field_0x50 = param_4; param->field_0x3c = 0; param->field_0x48 = param_2; - OSSendMessage(¶m->field_0x0, (OSMessage)6, OS_MESSAGE_BLOCK); + OSSendMessage(¶m->msg_q, (OSMessage)6, OS_MESSAGE_BLOCK); } /* 802CC858-802CC8E0 .text resultWrite__6JUTGbaFiPUc */ @@ -208,7 +211,7 @@ void JUTGba::doGetStatus(int param_1, JUTGba_Func param_2, void* param_3) { param->field_0x4c = param_2; param->field_0x50 = param_3; param->field_0x3c = 0; - OSSendMessage(¶m->field_0x0, (OSMessage)7, OS_MESSAGE_BLOCK); + OSSendMessage(¶m->msg_q, (OSMessage)7, OS_MESSAGE_BLOCK); } /* 802CC980-802CCA08 .text resultGetStatus__6JUTGbaFiPUc */ @@ -226,9 +229,10 @@ void* JUTGba::gbaThreadMain(void* param_1) { JUTGbaThreadVar threadVar; threadVar.field_0x0 = param; while (true) { - if (!OSReceiveMessage(¶m->field_0x0, (OSMessage*)&threadVar.field_0x10, OS_MESSAGE_NOBLOCK)) { + threadVar.field_0x1c = OSReceiveMessage(¶m->msg_q, (OSMessage*)&threadVar.field_0x10, OS_MESSAGE_NOBLOCK); + if (!threadVar.field_0x1c) { param->field_0x54 = 0; - OSReceiveMessage(¶m->field_0x0, (OSMessage*)&threadVar.field_0x10, OS_MESSAGE_BLOCK); + OSReceiveMessage(¶m->msg_q, (OSMessage*)&threadVar.field_0x10, OS_MESSAGE_BLOCK); } param->field_0x54 = 1; param->field_0x40 = 0;