From 2943240c7d4a1022d62a067c2da17824f0465ebd Mon Sep 17 00:00:00 2001 From: TakaRikka <38417346+TakaRikka@users.noreply.github.com> Date: Fri, 15 Sep 2023 13:51:23 -0700 Subject: [PATCH] work on m_Do_controller_pad / m_Do_gba_com (#36) --- include/JSystem/JUtility/JUTGamePad.h | 5 +- include/JSystem/JUtility/JUTGba.h | 48 +++ include/m_Do/m_Do_controller_pad.h | 4 +- include/m_Do/m_Do_gba_com.h | 103 +++++ src/m_Do/m_Do_controller_pad.cpp | 68 ++- src/m_Do/m_Do_gba_com.cpp | 572 +++++++++++++++++++++++--- 6 files changed, 715 insertions(+), 85 deletions(-) create mode 100644 include/JSystem/JUtility/JUTGba.h create mode 100644 include/m_Do/m_Do_gba_com.h diff --git a/include/JSystem/JUtility/JUTGamePad.h b/include/JSystem/JUtility/JUTGamePad.h index 5f3304aed..aca0c1fd1 100644 --- a/include/JSystem/JUtility/JUTGamePad.h +++ b/include/JSystem/JUtility/JUTGamePad.h @@ -242,10 +242,9 @@ public: /* 0x7C */ JSULink mLink; /* 0x8C */ JUTGamePadRecordBase* mPadRecord; /* 0x90 */ JUTGamePadRecordBase* mPadReplay; - /* 0x94 */ C3ButtonReset mButtonReset; - /* 0x98 */ u8 field_0x98[4]; + /* 0x94 */ u8 field_0x94[4]; + /* 0x98 */ C3ButtonReset mButtonReset; /* 0x9C */ OSTime mResetTime; - /* 0xA4 */ u8 field_0xa4; static JSUList mPadList; static bool mListInitialized; diff --git a/include/JSystem/JUtility/JUTGba.h b/include/JSystem/JUtility/JUTGba.h new file mode 100644 index 000000000..b9d520e5a --- /dev/null +++ b/include/JSystem/JUtility/JUTGba.h @@ -0,0 +1,48 @@ +#ifndef JUTGBA_H +#define JUTGBA_H + +#include "dolphin/types.h" + +struct JUTGbaParam; +struct JUTGbaThreadVar; + +typedef void (*JUTGba_Func)(JUTGbaParam*, void*); + +class JUTGba { +public: + JUTGba(); + + static void create(); + void result_common(int, u32, u32*); + void resultStatus_common(int, u32, u8*); + void doJoyBoot(int, s32, s32, u8*, u32, JUTGba_Func, void*); + void resultJoyBoot(int, u8*); + void doInitProbe(int, JUTGba_Func, void*); + void resultInitProbe(int, u32*); + void doProbe(int, JUTGba_Func, void*); + BOOL resultProbe(int, u32*); + void doReset(int, JUTGba_Func, void*); + BOOL resultReset(int, u8*); + void doRead(int, u8*, JUTGba_Func, void*); + BOOL resultRead(int, u8*); + void doWrite(int, u8*, JUTGba_Func, void*); + BOOL resultWrite(int, u8*); + void doGetStatus(int, JUTGba_Func, void*); + BOOL resultGetStatus(int, u8*); + void gbaThreadMain(void*); + void gbaThread_sleep(s64); + void gbaThread_Destroy(JUTGbaThreadVar*); + void gbaThread_JoyBoot(JUTGbaThreadVar*); + void gbaThread_InitProbe(JUTGbaThreadVar*); + void gbaThread_Probe(JUTGbaThreadVar*); + void gbaThread_Reset(JUTGbaThreadVar*); + void gbaThread_Read(JUTGbaThreadVar*); + void gbaThread_Write(JUTGbaThreadVar*); + void gbaThread_GetStatus(JUTGbaThreadVar*); + + static JUTGba* getManager() { return sManager; } + + static JUTGba* sManager; +}; + +#endif /* JUTGBA_H */ diff --git a/include/m_Do/m_Do_controller_pad.h b/include/m_Do/m_Do_controller_pad.h index 7957acc24..4495ada4a 100644 --- a/include/m_Do/m_Do_controller_pad.h +++ b/include/m_Do/m_Do_controller_pad.h @@ -33,7 +33,7 @@ extern interface_of_controller_pad g_mDoCPd_cpadInfo[4]; #define CPad_CHECK_TRIG_RIGHT(padNo) ((g_mDoCPd_cpadInfo[padNo].mButtonTrig0 >> 6) & 1) #define CPad_CHECK_TRIG_LEFT(padNo) ((g_mDoCPd_cpadInfo[padNo].mButtonTrig0 >> 7) & 1) -void mDoCPd_Create(); -void mDoCPd_Read(); +int mDoCPd_Create(); +int mDoCPd_Read(); #endif diff --git a/include/m_Do/m_Do_gba_com.h b/include/m_Do/m_Do_gba_com.h new file mode 100644 index 000000000..fa925c341 --- /dev/null +++ b/include/m_Do/m_Do_gba_com.h @@ -0,0 +1,103 @@ +#ifndef M_DO_GBA_COM_H +#define M_DO_GBA_COM_H + +#include "dolphin/types.h" + +class mDoGaC_DataManag_c { +public: + /* 0x0 */ u32 field_0x0; + /* 0x4 */ u8 field_0x4; + /* 0x5 */ u8 field_0x5; +}; + +struct mDoGaC_unk_data { + /* 0x00 */ u32* field_0x0; + /* 0x04 */ int field_0x4; + /* 0x08 */ u8 field_0x8; + /* 0x0C */ u32 field_0xc; +}; + +class mDoGaC_agbCom_c { +public: + void mDoGaC_Initial(mDoGaC_DataManag_c*, u8); + void mDoGaC_ComOpen(); + void mDoGaC_ComClose(); + void mDoGaC_ComStart(); + void mDoGaC_ComStop(); + void mDoGaC_GbaReboot(); + void mDoGaC_GbaReset(); + void mDoGaC_ComRestart(); + void mDoGaC_Connect(); + void mDoGaC_ConnectSleep(); + void mDoGaC_ConnectWake(); + int mDoGaC_GbaLink(); + int mDoGaC_SendDataSet(u32*, int, u8, u32); + void mDoGaC_SendDataWrite(); + int mDoGaC_SendEntry(u8, u32); + int mDoGaC_SendStatusCheck(u8); + int mDoGaC_SendEndCheck(u8); + bool mDoGaC_RecvStatusCheck(u8); + void mDoGaC_DataStatusReset(u8); + int mDoGaC_StatusSendSet(u8); + void mDoGaC_ProbeCheck0(); + void mDoGaC_ProbeCheck1(); + void mDoGaC_CodeExchange0(); + void mDoGaC_CodeExchange1(); + void mDoGaC_CodeExchange2(); + void mDoGaC_CodeExchange3(); + void mDoGaC_CodeExchange4(); + void mDoGaC_ContextCheck(); + void mDoGaC_ContextSend(); + void mDoGaC_ContextRead(); + void mDoGaC_GbaWrite(); + void mDoGaC_WriteResult(); + void mDoGaC_GbaRead(); + void mDoGaC_ReadResult(); + + ~mDoGaC_agbCom_c(); + + u8 getPortNo() { return mPortNo; } + + /* 0x000 */ u8 field_0x0; + /* 0x001 */ u8 field_0x1; + /* 0x002 */ u8 field_0x2; + /* 0x003 */ u8 field_0x3; + /* 0x004 */ u8 field_0x4; + /* 0x005 */ u8 field_0x5; + /* 0x006 */ u8 field_0x6; + /* 0x007 */ u8 field_0x7; + /* 0x008 */ u8 field_0x8; + /* 0x009 */ u8 field_0x9; + /* 0x00A */ u8 field_0xa; + /* 0x00B */ u8 field_0xb; + /* 0x00C */ mDoGaC_unk_data field_0xc[16]; + /* 0x10C */ u8 field_0x10c; + /* 0x10D */ u8 mPortNo; + /* 0x10E */ u8 field_0x10e; + /* 0x10F */ u8 field_0x10F[0x110 - 0x10F]; + /* 0x110 */ mDoGaC_DataManag_c* field_0x110; + /* 0x114 */ u32 field_0x114; + /* 0x118 */ u32 field_0x118; + /* 0x11C */ u32 field_0x11C; + /* 0x120 */ u32 field_0x120; + /* 0x124 */ u8 field_0x124[0x128 - 0x124]; + /* 0x128 */ u8 field_0x128; + /* 0x129 */ u8 field_0x129[0x12C - 0x129]; + union { + /* 0x12C */ u32 U32; + /* 0x12C */ u8 U8; + struct { + /* 0x12C */ u16 _12c; + /* 0x12C */ u16 _12e; + } U16; + } field_0x12c; +}; + +extern mDoGaC_agbCom_c g_mDoGaC_gbaCom; +extern mDoGaC_DataManag_c TestDataManager[16]; + +inline u8 mDoGaC_getPortNo() { + return g_mDoGaC_gbaCom.getPortNo(); +} + +#endif /* M_DO_GBA_COM_H */ \ No newline at end of file diff --git a/src/m_Do/m_Do_controller_pad.cpp b/src/m_Do/m_Do_controller_pad.cpp index 282ef0eec..1caeb3352 100644 --- a/src/m_Do/m_Do_controller_pad.cpp +++ b/src/m_Do/m_Do_controller_pad.cpp @@ -4,9 +4,12 @@ // #include "m_Do/m_Do_controller_pad.h" +#include "JSystem/JUtility/JUTGba.h" #include "SSystem/SComponent/c_lib.h" -#include "m_Do/m_Do_main.h" +#include "f_ap/f_ap_game.h" #include "m_Do/m_Do_Reset.h" +#include "m_Do/m_Do_gba_com.h" +#include "m_Do/m_Do_main.h" JUTGamePad* g_mDoCPd_gamePad[4]; interface_of_controller_pad g_mDoCPd_cpadInfo[4]; @@ -26,6 +29,7 @@ inline void mDoCPd_TRIGGER_CONV(u8 analog, f32& param_1) { } /* 80007598-800078C0 .text mDoCPd_Convert__FP27interface_of_controller_padP10JUTGamePad */ +// NONMATCHING static s32 mDoCPd_Convert(interface_of_controller_pad* pInterface, JUTGamePad* pPad) { // pInterface->mButtonFlags = pPad->getButton(); pInterface->mMainStickPosX = pPad->getMainStickX(); @@ -47,7 +51,7 @@ static s32 mDoCPd_Convert(interface_of_controller_pad* pInterface, JUTGamePad* p } /* 800078C0-80007A70 .text mDoCPd_Read__Fv */ -void mDoCPd_Read(void) { +int mDoCPd_Read() { JUTGamePad::read(); if (!mDoRst::isReset() && mDoRst::is3ButtonReset()) { @@ -61,32 +65,60 @@ void mDoCPd_Read(void) { JUTGamePad** pad = g_mDoCPd_gamePad; interface_of_controller_pad* interface = g_mDoCPd_cpadInfo; - for (u32 i = 0; i < 4; i++) { + for (int i = 0; i < 4; i++) { if (*pad == NULL) { - cLib_memSet(interface, 0, sizeof(interface_of_controller_pad)); + cLib_memSet(interface++, 0, sizeof(interface_of_controller_pad)); } else { - mDoCPd_Convert(interface, *pad); + mDoCPd_Convert(interface++, *pad); } pad++; - interface++; } - - for (u32 i = 0; i < 4; i++) { + + for (int i = 0; i < 4; i++) { + f32 threshold_lo = g_HIO.mTriggerThreshLo; + f32 threshold_hi = g_HIO.mTriggerThreshHi; + + f32 trigL = g_mDoCPd_cpadInfo[i].mTriggerLeft; g_mDoCPd_cpadInfo[i].mTrigLockL = false; g_mDoCPd_cpadInfo[i].mTrigLockR = false; + + if (trigL > threshold_lo) { + if (g_mDoCPd_cpadInfo[i].mHoldLockL != true) { + g_mDoCPd_cpadInfo[i].mTrigLockL = true; + } + + g_mDoCPd_cpadInfo[i].mHoldLockL = true; + } else if (trigL < threshold_hi) { + g_mDoCPd_cpadInfo[i].mHoldLockL = false; + } + + f32 trigR = g_mDoCPd_cpadInfo[i].mTriggerRight; + if (trigR > threshold_lo) { + if (g_mDoCPd_cpadInfo[i].mHoldLockR != true) { + g_mDoCPd_cpadInfo[i].mTrigLockR = true; + } + + g_mDoCPd_cpadInfo[i].mHoldLockR = true; + } else if (trigR < threshold_hi) { + g_mDoCPd_cpadInfo[i].mHoldLockR = false; + } } + + g_mDoGaC_gbaCom.mDoGaC_Connect(); + return 1; } /* 80007A70-80007BBC .text mDoCPd_Create__Fv */ -void mDoCPd_Create(void) { +// NONMATCHING - weird ending +int mDoCPd_Create() { JUTGamePad::sSuppressPadReset = 1; JUTGamePad* pad = new JUTGamePad(JUTGamePad::Port_1); g_mDoCPd_gamePad[0] = pad; g_mDoCPd_gamePad[1] = NULL; - if (mDoMain::developmentMode != 0) { + if (mDoMain::developmentMode) { g_mDoCPd_gamePad[2] = new JUTGamePad(JUTGamePad::Port_3); g_mDoCPd_gamePad[3] = new JUTGamePad(JUTGamePad::Port_4); } else { @@ -100,15 +132,15 @@ void mDoCPd_Create(void) { JUTGamePad::setResetCallback(mDoRst_resetCallBack, NULL); } - // JUTGba::create(); - // mDoGaC_Initial(); + JUTGba::create(); + g_mDoGaC_gbaCom.mDoGaC_Initial(TestDataManager, 16); - interface_of_controller_pad* cpad = &g_mDoCPd_cpadInfo[0]; for (int i = 0; i < 4; i++) { - cpad->mTrigLockL = false; - cpad->mHoldLockL = false; - cpad->mTrigLockR = false; - cpad->mHoldLockR = false; - cpad++; + g_mDoCPd_cpadInfo[i].mTrigLockL = false; + g_mDoCPd_cpadInfo[i].mHoldLockL = false; + g_mDoCPd_cpadInfo[i].mTrigLockR = false; + g_mDoCPd_cpadInfo[i].mHoldLockR = false; } + + return 1; } diff --git a/src/m_Do/m_Do_gba_com.cpp b/src/m_Do/m_Do_gba_com.cpp index f81cac6b4..e2cc16248 100644 --- a/src/m_Do/m_Do_gba_com.cpp +++ b/src/m_Do/m_Do_gba_com.cpp @@ -4,249 +4,697 @@ // #include "m_Do/m_Do_gba_com.h" -#include "dolphin/types.h" +#include "JSystem/JUtility/JUTGba.h" +#include "SSystem/SComponent/c_math.h" +#include "m_Do/m_Do_Reset.h" + +mDoGaC_agbCom_c g_mDoGaC_gbaCom; +mDoGaC_DataManag_c TestDataManager[16]; + +static u32 BigLittleChange(u32); /* 8001A498-8001A4C0 .text ProbeCheck_0__FP11JUTGbaParamPv */ void ProbeCheck_0(JUTGbaParam*, void*) { - /* Nonmatching */ + g_mDoGaC_gbaCom.mDoGaC_ProbeCheck0(); } /* 8001A4C0-8001A4E8 .text ProbeCheck_1__FP11JUTGbaParamPv */ void ProbeCheck_1(JUTGbaParam*, void*) { - /* Nonmatching */ + g_mDoGaC_gbaCom.mDoGaC_ProbeCheck1(); } /* 8001A4E8-8001A510 .text CodeExchange_0__FP11JUTGbaParamPv */ void CodeExchange_0(JUTGbaParam*, void*) { - /* Nonmatching */ + g_mDoGaC_gbaCom.mDoGaC_CodeExchange0(); } /* 8001A510-8001A538 .text CodeExchange_1__FP11JUTGbaParamPv */ void CodeExchange_1(JUTGbaParam*, void*) { - /* Nonmatching */ + g_mDoGaC_gbaCom.mDoGaC_CodeExchange1(); } /* 8001A538-8001A560 .text CodeExchange_2__FP11JUTGbaParamPv */ void CodeExchange_2(JUTGbaParam*, void*) { - /* Nonmatching */ + g_mDoGaC_gbaCom.mDoGaC_CodeExchange2(); } /* 8001A560-8001A588 .text CodeExchange_3__FP11JUTGbaParamPv */ void CodeExchange_3(JUTGbaParam*, void*) { - /* Nonmatching */ + g_mDoGaC_gbaCom.mDoGaC_CodeExchange3(); } /* 8001A588-8001A5B0 .text CodeExchange_4__FP11JUTGbaParamPv */ void CodeExchange_4(JUTGbaParam*, void*) { - /* Nonmatching */ + g_mDoGaC_gbaCom.mDoGaC_CodeExchange4(); } /* 8001A5B0-8001A5D8 .text ContextCheck__FP11JUTGbaParamPv */ void ContextCheck(JUTGbaParam*, void*) { - /* Nonmatching */ + g_mDoGaC_gbaCom.mDoGaC_ContextCheck(); } /* 8001A5D8-8001A600 .text ContextSend__FP11JUTGbaParamPv */ void ContextSend(JUTGbaParam*, void*) { - /* Nonmatching */ + g_mDoGaC_gbaCom.mDoGaC_ContextSend(); } /* 8001A600-8001A628 .text ContextRead__FP11JUTGbaParamPv */ void ContextRead(JUTGbaParam*, void*) { - /* Nonmatching */ + g_mDoGaC_gbaCom.mDoGaC_ContextRead(); } /* 8001A628-8001A650 .text GbaWriteResult__FP11JUTGbaParamPv */ void GbaWriteResult(JUTGbaParam*, void*) { - /* Nonmatching */ + g_mDoGaC_gbaCom.mDoGaC_WriteResult(); } /* 8001A650-8001A678 .text GbaReadResult__FP11JUTGbaParamPv */ void GbaReadResult(JUTGbaParam*, void*) { - /* Nonmatching */ + g_mDoGaC_gbaCom.mDoGaC_ReadResult(); } /* 8001A678-8001A6A0 .text GbaReset__FP11JUTGbaParamPv */ void GbaReset(JUTGbaParam*, void*) { - /* Nonmatching */ + g_mDoGaC_gbaCom.mDoGaC_GbaReset(); } /* 8001A6A0-8001A7B8 .text mDoGaC_Initial__15mDoGaC_agbCom_cFP18mDoGaC_DataManag_cUc */ -void mDoGaC_agbCom_c::mDoGaC_Initial(mDoGaC_DataManag_c*, unsigned char) { - /* Nonmatching */ +// NONMATCHING - loop / end issues +void mDoGaC_agbCom_c::mDoGaC_Initial(mDoGaC_DataManag_c* param_0, u8 param_1) { + field_0x0 = 0; + field_0x1 = 0; + field_0x2 = 0; + field_0x3 = 0; + field_0x4 = 1; + field_0x5 = 0; + mPortNo = 1; + field_0x10e = 0; + field_0x7 = 0; + field_0x8 = 0; + field_0x10c = param_1; + field_0x9 = 0; + field_0xa = 0; + field_0xb = 0; + + for (int i = 0; i < 16; i++) { + field_0xc[i].field_0x0 = 0; + field_0xc[i].field_0x4 = 0; + field_0xc[i].field_0x8 = 0; + field_0xc[i].field_0xc = 0; + } + + field_0x110 = param_0; + if (param_1 != 0) { + for (int i = 0; i < param_1; i++) { + param_0[i].field_0x0 = 0; + param_0[i].field_0x4 = 0; + param_0[i].field_0x5 = 0; + } + } + + field_0x114 = -1; + field_0x118 = 0; + + field_0x12c.U16._12e |= (u32)cM_rndF(32767.0f); + field_0x12c.U32 |= (u32)cM_rndF(32767.0f); + field_0x12c.U8 = (field_0x12c.U8 & 0x3F) | 0x40; + field_0x128 = 0; } /* 8001A7B8-8001A7C4 .text mDoGaC_ComOpen__15mDoGaC_agbCom_cFv */ void mDoGaC_agbCom_c::mDoGaC_ComOpen() { - /* Nonmatching */ + field_0x2 = 2; } /* 8001A7C4-8001A814 .text mDoGaC_ComClose__15mDoGaC_agbCom_cFv */ void mDoGaC_agbCom_c::mDoGaC_ComClose() { - /* Nonmatching */ + field_0x4 = 1; + field_0x2 = 0; + field_0x10e = 0; + + for (int i = 0; i < field_0x10c; i++) { + field_0x110[i].field_0x4 = 9; + field_0x110[i].field_0x5 = 1; + } } /* 8001A814-8001A820 .text mDoGaC_ComStart__15mDoGaC_agbCom_cFv */ void mDoGaC_agbCom_c::mDoGaC_ComStart() { - /* Nonmatching */ + field_0x1 = 1; } /* 8001A820-8001A858 .text mDoGaC_ComStop__15mDoGaC_agbCom_cFv */ void mDoGaC_agbCom_c::mDoGaC_ComStop() { - /* Nonmatching */ + mDoGaC_ComClose(); + field_0x1 = 0; + field_0x5 = 0; } /* 8001A858-8001A8B4 .text mDoGaC_GbaReboot__15mDoGaC_agbCom_cFv */ void mDoGaC_agbCom_c::mDoGaC_GbaReboot() { - /* Nonmatching */ + mDoGaC_ComStop(); + field_0x0 = 0; + field_0x3 = 0; + field_0x12c.U32 |= (u32)cM_rndF(32767.0f); + field_0x128 = 0; } /* 8001A8B4-8001A94C .text mDoGaC_GbaReset__15mDoGaC_agbCom_cFv */ void mDoGaC_agbCom_c::mDoGaC_GbaReset() { - /* Nonmatching */ + u8 sp8[16]; + + if (JUTGba::getManager()->resultReset(mDoGaC_getPortNo(), sp8)) { + mDoGaC_GbaReboot(); + } else { + field_0x6++; + if (field_0x6 > 60) { + mDoGaC_GbaReboot(); + } else { + JUTGba::getManager()->doReset(mDoGaC_getPortNo(), GbaReset, NULL); + } + } } /* 8001A94C-8001A9A4 .text mDoGaC_ComRestart__15mDoGaC_agbCom_cFv */ void mDoGaC_agbCom_c::mDoGaC_ComRestart() { - /* Nonmatching */ + field_0x4 = 0; + field_0x7 = 0; + field_0x8 = 0; + field_0x9 = 0; + field_0xa = 0; + field_0xb = 0; + + for (int i = 0; i < field_0x10c; i++) { + field_0x110[i].field_0x4 = 0; + field_0x110[i].field_0x5 = 0; + } } /* 8001A9A4-8001AAD4 .text mDoGaC_Connect__15mDoGaC_agbCom_cFv */ void mDoGaC_agbCom_c::mDoGaC_Connect() { - /* Nonmatching */ + if (field_0x0 != 0) { + if (mDoRst::isReset()) { + mDoGaC_ComStop(); + field_0x6 = 0; + JUTGba::getManager()->doReset(mDoGaC_getPortNo(), GbaReset, NULL); + } else if (field_0x1 != 0) { + switch (field_0x2) { + case 0: + field_0x2 = 1; + JUTGba::getManager()->doProbe(mDoGaC_getPortNo(), ProbeCheck_0, NULL); + if (field_0x10e < 3) { + field_0x10e++; + } + break; + case 2: + mDoGaC_ComRestart(); + mDoGaC_GbaWrite(); + field_0x2 = 3; + break; + case 3: + if (field_0x5 == 0) { + mDoGaC_SendDataWrite(); + } + + if (field_0x4 == 1) { + mDoGaC_ComClose(); + } + + field_0x10e = 0; + break; + case 4: + break; + } + } + } } /* 8001AAD4-8001AAEC .text mDoGaC_ConnectSleep__15mDoGaC_agbCom_cFv */ void mDoGaC_agbCom_c::mDoGaC_ConnectSleep() { - /* Nonmatching */ + if (field_0x2 == 0) { + field_0x2 = 4; + } } /* 8001AAEC-8001AAF8 .text mDoGaC_ConnectWake__15mDoGaC_agbCom_cFv */ void mDoGaC_agbCom_c::mDoGaC_ConnectWake() { - /* Nonmatching */ + field_0x2 = 0; } /* 8001AAF8-8001AB4C .text mDoGaC_GbaLink__15mDoGaC_agbCom_cFv */ -void mDoGaC_agbCom_c::mDoGaC_GbaLink() { - /* Nonmatching */ +int mDoGaC_agbCom_c::mDoGaC_GbaLink() { + if (field_0x0 == 1 && field_0x2 == 3 && field_0x4 == 0) { + return 1; + } + + if (field_0x128 == 1 && field_0x10e < 3) { + return 1; + } + + return 0; } /* 8001AB4C-8001AC14 .text mDoGaC_SendDataSet__15mDoGaC_agbCom_cFPUliUcUl */ -void mDoGaC_agbCom_c::mDoGaC_SendDataSet(unsigned long*, int, unsigned char, unsigned long) { - /* Nonmatching */ +int mDoGaC_agbCom_c::mDoGaC_SendDataSet(u32* param_0, int param_1, u8 param_2, u32 param_3) { + u8 uvar1 = field_0x9 + 1; + if (uvar1 >= 16) { + uvar1 = 0; + } + + if (uvar1 == field_0xa || param_1 <= 0) { + return 0; + } + + if (param_1 < 4) { + param_1 = 4; + } + + field_0xc[field_0x9].field_0x0 = param_0; + field_0xc[field_0x9].field_0x4 = param_1; + field_0xc[field_0x9].field_0x8 = param_2; + field_0xc[field_0x9].field_0xc = param_3; + field_0x110[param_2].field_0x4 = 2; + + field_0x9++; + if (field_0x9 >= 16) { + field_0x9 = 0; + } + + field_0xb++; + + return 1; } /* 8001AC14-8001AD48 .text mDoGaC_SendDataWrite__15mDoGaC_agbCom_cFv */ +// NONMATCHING - regswap void mDoGaC_agbCom_c::mDoGaC_SendDataWrite() { - /* Nonmatching */ + u8 var_r5 = 0; + while (field_0x10c > var_r5) { + u8 var_r0 = field_0x110[var_r5].field_0x5; + if (var_r0 != 0) { + u8 temp_r0 = field_0x9 + 1; + if (temp_r0 >= 16) { + temp_r0 = 0; + } + + if (temp_r0 == field_0xa) { + return; + } + + if (field_0x110[var_r5].field_0x4 == 0 || field_0x110[var_r5].field_0x4 == 1) { + if (var_r0 == 1) { + field_0xc[field_0x9].field_0x0 = &field_0x11C; + field_0xc[field_0x9].field_0x4 = 4; + } else { + field_0xc[field_0x9].field_0x0 = &field_0x120; + field_0xc[field_0x9].field_0x4 = 8; + } + + field_0xc[field_0x9].field_0x8 = var_r5; + field_0xc[field_0x9].field_0xc = 0; + field_0x110[var_r5].field_0x4 = 2; + + field_0x9++; + if (field_0x9 >= 16) { + field_0x9 = 0; + } + + field_0xb++; + field_0x110[var_r5].field_0x5 = 0; + } + } + + var_r5++; + } } /* 8001AD48-8001AD84 .text mDoGaC_SendEntry__15mDoGaC_agbCom_cFUcUl */ -void mDoGaC_agbCom_c::mDoGaC_SendEntry(unsigned char, unsigned long) { - /* Nonmatching */ +int mDoGaC_agbCom_c::mDoGaC_SendEntry(u8 param_0, u32 param_1) { + if (field_0x110[param_0].field_0x5 == 0) { + field_0x11C = param_1; + field_0x110[param_0].field_0x5 = 1; + return 1; + } + + return 0; } /* 8001AD84-8001ADB4 .text mDoGaC_SendStatusCheck__15mDoGaC_agbCom_cFUc */ -void mDoGaC_agbCom_c::mDoGaC_SendStatusCheck(unsigned char) { - /* Nonmatching */ +int mDoGaC_agbCom_c::mDoGaC_SendStatusCheck(u8 param_0) { + if (field_0x110[param_0].field_0x4 == 0 || field_0x110[param_0].field_0x4 == 1) { + return 1; + } + + return 0; } /* 8001ADB4-8001ADE4 .text mDoGaC_SendEndCheck__15mDoGaC_agbCom_cFUc */ -void mDoGaC_agbCom_c::mDoGaC_SendEndCheck(unsigned char) { - /* Nonmatching */ +int mDoGaC_agbCom_c::mDoGaC_SendEndCheck(u8 param_0) { + if (field_0x110[param_0].field_0x4 == 4 || field_0x110[param_0].field_0x4 == 0) { + return 1; + } + + return 0; } /* 8001ADE4-8001AE04 .text mDoGaC_RecvStatusCheck__15mDoGaC_agbCom_cFUc */ -void mDoGaC_agbCom_c::mDoGaC_RecvStatusCheck(unsigned char) { - /* Nonmatching */ +bool mDoGaC_agbCom_c::mDoGaC_RecvStatusCheck(u8 param_0) { + return field_0x110[param_0].field_0x4 == 8; } /* 8001AE04-8001AE44 .text mDoGaC_DataStatusReset__15mDoGaC_agbCom_cFUc */ -void mDoGaC_agbCom_c::mDoGaC_DataStatusReset(unsigned char) { - /* Nonmatching */ +void mDoGaC_agbCom_c::mDoGaC_DataStatusReset(u8 param_0) { + if (field_0x110[param_0].field_0x4 == 8) { + field_0x110[param_0].field_0x4 = 0; + mDoGaC_StatusSendSet(param_0); + } } /* 8001AE44-8001AEE4 .text mDoGaC_StatusSendSet__15mDoGaC_agbCom_cFUc */ -void mDoGaC_agbCom_c::mDoGaC_StatusSendSet(unsigned char) { - /* Nonmatching */ +int mDoGaC_agbCom_c::mDoGaC_StatusSendSet(u8 param_0) { + u8 temp_r0 = field_0x9 + 1; + if (temp_r0 >= 16) { + temp_r0 = 0; + } + + if (temp_r0 == field_0xa) { + return 0; + } + + field_0xc[field_0x9].field_0x0 = 0; + field_0xc[field_0x9].field_0x4 = 0; + field_0xc[field_0x9].field_0x8 = param_0; + field_0xc[field_0x9].field_0xc = 0; + + field_0x9++; + if (field_0x9 >= 16) { + field_0x9 = 0; + } + + field_0xb++; + return 1; } /* 8001AEE4-8001AF68 .text mDoGaC_ProbeCheck0__15mDoGaC_agbCom_cFv */ void mDoGaC_agbCom_c::mDoGaC_ProbeCheck0() { - /* Nonmatching */ + u32 sp8; + if (!JUTGba::getManager()->resultProbe(mDoGaC_getPortNo(), &sp8) && sp8 == 0x40000) { + JUTGba::getManager()->doReset(mDoGaC_getPortNo(), ProbeCheck_1, NULL); + } else { + field_0x2 = 0; + } } /* 8001AF68-8001AFDC .text mDoGaC_ProbeCheck1__15mDoGaC_agbCom_cFv */ void mDoGaC_agbCom_c::mDoGaC_ProbeCheck1() { - /* Nonmatching */ + u8 sp8[16]; + if (!JUTGba::getManager()->resultReset(mDoGaC_getPortNo(), sp8)) { + JUTGba::getManager()->doGetStatus(mDoGaC_getPortNo(), CodeExchange_0, NULL); + } else { + field_0x2 = 0; + } } /* 8001AFDC-8001B060 .text mDoGaC_CodeExchange0__15mDoGaC_agbCom_cFv */ void mDoGaC_agbCom_c::mDoGaC_CodeExchange0() { - /* Nonmatching */ + u8 sp8[16]; + if (!JUTGba::getManager()->resultGetStatus(mDoGaC_getPortNo(), sp8) && sp8[0] == 0x28) { + JUTGba::getManager()->doRead(mDoGaC_getPortNo(), (u8*)&field_0x118, CodeExchange_1, NULL); + } else { + field_0x2 = 0; + } } /* 8001B060-8001B0F4 .text mDoGaC_CodeExchange1__15mDoGaC_agbCom_cFv */ +// NONMATCHING - weird string load void mDoGaC_agbCom_c::mDoGaC_CodeExchange1() { - /* Nonmatching */ + u8 sp8[16]; + if (!JUTGba::getManager()->resultRead(mDoGaC_getPortNo(), sp8)) { + if (field_0x118 == (u32) "GZLE") { + JUTGba::getManager()->doGetStatus(mDoGaC_getPortNo(), CodeExchange_2, NULL); + } else { + mDoGaC_GbaReboot(); + } + } else { + field_0x2 = 0; + } } /* 8001B0F4-8001B184 .text mDoGaC_CodeExchange2__15mDoGaC_agbCom_cFv */ +// NONMATCHING - weird string load void mDoGaC_agbCom_c::mDoGaC_CodeExchange2() { - /* Nonmatching */ + u8 sp8[16]; + if (!JUTGba::getManager()->resultGetStatus(mDoGaC_getPortNo(), sp8) && sp8[0] == 0x20) { + field_0x114 = (u32) "GZLE"; + JUTGba::getManager()->doWrite(mDoGaC_getPortNo(), (u8*)&field_0x114, CodeExchange_3, NULL); + } else { + field_0x2 = 0; + } } /* 8001B184-8001B1F8 .text mDoGaC_CodeExchange3__15mDoGaC_agbCom_cFv */ void mDoGaC_agbCom_c::mDoGaC_CodeExchange3() { - /* Nonmatching */ + u8 sp8[16]; + if (!JUTGba::getManager()->resultWrite(mDoGaC_getPortNo(), sp8)) { + JUTGba::getManager()->doGetStatus(mDoGaC_getPortNo(), CodeExchange_4, NULL); + } else { + field_0x2 = 0; + } } /* 8001B1F8-8001B298 .text mDoGaC_CodeExchange4__15mDoGaC_agbCom_cFv */ +// NONMATCHING - weird bit shifting void mDoGaC_agbCom_c::mDoGaC_CodeExchange4() { - /* Nonmatching */ + u8 sp8[16]; + if (!JUTGba::getManager()->resultGetStatus(mDoGaC_getPortNo(), sp8) && sp8[0] == 0x30) { + field_0x12c.U8 = (field_0x12c.U8 & ~0xC0) | (mDoGaC_getPortNo() & 0xC0); + field_0x114 = BigLittleChange(field_0x12c.U32); + JUTGba::getManager()->doWrite(mDoGaC_getPortNo(), (u8*)&field_0x114, ContextSend, NULL); + } else { + field_0x2 = 0; + } } /* 8001B298-8001B334 .text mDoGaC_ContextCheck__15mDoGaC_agbCom_cFv */ void mDoGaC_agbCom_c::mDoGaC_ContextCheck() { - /* Nonmatching */ + u8 sp8[16]; + if (!JUTGba::getManager()->resultRead(mDoGaC_getPortNo(), sp8)) { + u32 var_r0 = BigLittleChange(field_0x118); + if (var_r0 == field_0x12c.U32) { + if (field_0x128 == 1) { + field_0x3 = 1; + } else { + field_0x128 = 1; + } + + mDoGaC_ComOpen(); + } else { + field_0x2 = 0; + } + } else { + field_0x2 = 0; + } } /* 8001B334-8001B3A8 .text mDoGaC_ContextSend__15mDoGaC_agbCom_cFv */ void mDoGaC_agbCom_c::mDoGaC_ContextSend() { - /* Nonmatching */ + u8 sp8[16]; + if (!JUTGba::getManager()->resultWrite(mDoGaC_getPortNo(), sp8)) { + JUTGba::getManager()->doGetStatus(mDoGaC_getPortNo(), ContextRead, NULL); + } else { + field_0x2 = 0; + } } /* 8001B3A8-8001B42C .text mDoGaC_ContextRead__15mDoGaC_agbCom_cFv */ void mDoGaC_agbCom_c::mDoGaC_ContextRead() { - /* Nonmatching */ + u8 sp8[16]; + if (!JUTGba::getManager()->resultGetStatus(mDoGaC_getPortNo(), sp8) && sp8[0] == 0x38) { + JUTGba::getManager()->doRead(mDoGaC_getPortNo(), (u8*)&field_0x118, ContextRead, NULL); + } else { + field_0x2 = 0; + } } /* 8001B42C-8001B6CC .text mDoGaC_GbaWrite__15mDoGaC_agbCom_cFv */ void mDoGaC_agbCom_c::mDoGaC_GbaWrite() { - /* Nonmatching */ + static int flag = 0; + + if (field_0xa == field_0x9) { + if (field_0x5 == 1) { + mDoGaC_ComStop(); + field_0x114 = -0x10101011; + } else { + field_0x114 = -1; + } + } else { + mDoGaC_unk_data* temp_r31 = &field_0xc[field_0xa]; + switch (field_0x8) { + case 0: + field_0x114 = BigLittleChange(-0x01010102); + field_0x8 = 1; + break; + case 1: + field_0x114 = BigLittleChange(temp_r31->field_0x8); + field_0x8 = 2; + break; + case 2: + u8 temp_r3_2 = field_0x110[temp_r31->field_0x8].field_0x4; + if (temp_r3_2 == 2) { + field_0x110[temp_r31->field_0x8].field_0x4 = 3; + field_0x114 = BigLittleChange(3); + field_0x8 = 3; + } else { + field_0x114 = BigLittleChange(temp_r3_2); + if (field_0x110[temp_r31->field_0x8].field_0x4 == 5) { + field_0x110[temp_r31->field_0x8].field_0x4 = 6; + } + + field_0xb--; + field_0xa++; + if (field_0xa >= 16) { + field_0xa = 0; + } + + field_0x8 = 0; + } + break; + case 3: + field_0x114 = BigLittleChange(temp_r31->field_0x4); + temp_r31->field_0xc = 0; + field_0x8 = 5; + break; + case 4: + field_0x114 = BigLittleChange(temp_r31->field_0xc); + field_0x110[temp_r31->field_0x8].field_0x4 = 4; + + field_0xb--; + field_0xa++; + if (field_0xa >= 16) { + field_0xa = 0; + } + field_0x8 = 0; + break; + case 5: + field_0x114 = *temp_r31->field_0x0; + temp_r31->field_0xc += BigLittleChange(field_0x114); + temp_r31->field_0x4 -= 4; + if (temp_r31->field_0x4 <= 0) { + field_0x8 = 4; + } else { + temp_r31->field_0x0++; + } + break; + default: + field_0x114 = -1; + break; + } + } + + JUTGba::getManager()->doWrite(mDoGaC_getPortNo(), (u8*)&field_0x114, GbaWriteResult, NULL); } /* 8001B6CC-8001B734 .text mDoGaC_WriteResult__15mDoGaC_agbCom_cFv */ void mDoGaC_agbCom_c::mDoGaC_WriteResult() { - /* Nonmatching */ + u8 sp8[16]; + if (!JUTGba::getManager()->resultWrite(mDoGaC_getPortNo(), sp8) && field_0x4 == 0) { + mDoGaC_GbaRead(); + } else { + field_0x4 = 1; + } } /* 8001B734-8001B778 .text mDoGaC_GbaRead__15mDoGaC_agbCom_cFv */ void mDoGaC_agbCom_c::mDoGaC_GbaRead() { - /* Nonmatching */ + JUTGba::getManager()->doRead(mDoGaC_getPortNo(), (u8*)&field_0x118, GbaReadResult, NULL); } /* 8001B778-8001BA34 .text mDoGaC_ReadResult__15mDoGaC_agbCom_cFv */ +// NONMATCHING - almost void mDoGaC_agbCom_c::mDoGaC_ReadResult() { - /* Nonmatching */ + static u8 data_type = 0; + static u32 check_sum = 0; + static u32 data_sum = 0; + static u32* recv_p = NULL; + static u32* end_p = NULL; + + u8 sp8[16]; + if (!JUTGba::getManager()->resultRead(mDoGaC_getPortNo(), sp8) && field_0x4 == 0) { + switch (field_0x7) { + case 0: + u32 temp_r0 = BigLittleChange(field_0x118); + if (temp_r0 == -0x1010102) { + field_0x7 = 1; + } + break; + case 1: + u32 temp_r0_2 = BigLittleChange(field_0x118); + data_type = temp_r0_2; + if ((temp_r0_2 & 0xFF) < 0x10) { + recv_p = &field_0x110[temp_r0_2 & 0xFF].field_0x0; + } else { + recv_p = NULL; + } + field_0x7 = 2; + break; + case 2: + u32 temp_r0_3 = BigLittleChange(field_0x118); + field_0x110[data_type].field_0x4 = temp_r0_3; + if (temp_r0_3 == 7) { + field_0x7 = 3; + } else { + field_0x7 = 0; + if (temp_r0_3 == 9) { + field_0x4 = 1; + } + } + break; + case 3: + u32 temp_r0_4 = BigLittleChange(field_0x118); + end_p = &field_0x110[data_type].field_0x0 + temp_r0_4; + data_sum = 0; + if (recv_p == NULL) { + field_0x7 = 6; + } else { + field_0x7 = 5; + } + break; + case 4: + check_sum = BigLittleChange(field_0x118); + if (data_sum == check_sum) { + field_0x110[data_type].field_0x4 = 8; + } else { + field_0x110[data_type].field_0x4 = 9; + mDoGaC_StatusSendSet(data_type); + field_0x4 = 1; + } + field_0x7 = 0; + break; + case 5: + *recv_p = field_0x118; + data_sum += BigLittleChange(field_0x118); + case 6: + recv_p++; + if (recv_p >= end_p) { + field_0x7 = 4; + } + break; + } + + mDoGaC_GbaWrite(); + } else { + field_0x4 = 1; + } } /* 8001BA34-8001BA68 .text BigLittleChange__FUl */ -void BigLittleChange(unsigned long) { - /* Nonmatching */ +// NONMATCHING - not even close +u32 BigLittleChange(u32 param_0) { + u8 b1 = param_0 >> 8; + u8 b2 = param_0 >> 0x10; + u8 b3 = param_0 >> 0x18; + return (param_0 << 0x18) | (b1 << 0x10) | (b2 << 8) | b3; } /* 8001BAA0-8001BADC .text __dt__15mDoGaC_agbCom_cFv */ -mDoGaC_agbCom_c::~mDoGaC_agbCom_c() { - /* Nonmatching */ -} +mDoGaC_agbCom_c::~mDoGaC_agbCom_c() {}