diff options
| author | Erin Moon <erin@hecke.rs> | 2020-12-25 19:59:52 -0600 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-12-25 20:59:52 -0500 |
| commit | 58fc83c4f804e72019dc9ccbcc389affe7a9f3ed (patch) | |
| tree | d287ca8be8511f1a826b1d62aa6461ab1a76fcf4 /src/m_Do/m_Do_Reset.cpp | |
| parent | 22bda03652efbecd77e1fa3597dfdecee768ec06 (diff) | |
m_Do_Reset: OK (#35)
* m_Do_Reset: split and (some) decomp
decompiles:
- my_OSCancelAlarmAll()
- destroyVideo()
* mDoRst::reset(): decompile, plus some supporting code
* split DVD* functions to dvd.h
* mDoRst::resetCallBack(): decompile
Diffstat (limited to 'src/m_Do/m_Do_Reset.cpp')
| -rw-r--r-- | src/m_Do/m_Do_Reset.cpp | 111 |
1 files changed, 110 insertions, 1 deletions
diff --git a/src/m_Do/m_Do_Reset.cpp b/src/m_Do/m_Do_Reset.cpp index 4bf93c8658..2f3e0718ff 100644 --- a/src/m_Do/m_Do_Reset.cpp +++ b/src/m_Do/m_Do_Reset.cpp @@ -1 +1,110 @@ -// ok +#include "m_Do/m_Do_reset/m_Do_reset.h" +#include "dvd/dvd.h" +#include "JSystem/JUtility/JUTXfb/JUTXfb.h" +#include "global.h" + +extern "C" { +void my_OSCancelAlarmAll(void) { + return; +} + +void destroyVideo() { + JUTVideo_NS_destroyManager(); + GXSetDrawDoneCallback(NULL); + VISetBlack(1); + VIFlush(); + VIWaitForRetrace(); + return; +} +} + +// TODO: cleanup +void mDoRst::reset(s32 p1, u32 p2, s32 p3) { + mDoCPd_c *pmVar1; + u32 uVar2; + DVDState DVar3; + OSThread *thread; + s32 enable; + /* sManager */ lbl_80451550->clearIndex(); + mDoDvdErr_ThdCleanup(); + cAPICPad_recalibrate(); + if (lbl_80450BB8 != 0) { + do { + // uVar2 = lbl_80451368->hasReset(); + uVar2 = Z2AudioMgr_NS_hasReset(lbl_80451368); + } while ((uVar2 & 0xff) == 0); + } + + if ((s32)DVDGetDriveStatus() == (s32)DVD_STATE_BUSY) { + OSAttention(lbl_80374198); + } + JASTaskThread *task_thread = JASDvd_NS_getThreadPointer(); + if (task_thread != NULL) { + JASTaskThread_NS_pause(task_thread, true); + thread = task_thread->thread; + if (thread != NULL) { + OSSuspendThread(thread); + OSDetachThread(thread); + OSCancelThread(thread); + } + } + + VIWaitForRetrace(); + VIWaitForRetrace(); + + thread = GXGetCurrentGXThread(); + enable = OSDisableInterrupts(); + OSThread* ourThread = OSGetCurrentThread(); + if (thread != ourThread) { + OSCancelThread(thread); + GXSetCurrentGXThread(); + } + GXFlush(); + GXAbortFrame(); + GXDrawDone(); + + OSRestoreInterrupts(enable); + + destroyVideo(); + + // nb: probably fake match (i am not sure that it's actually attached to this label lol) + while (((s32*)lbl_803EAF40)[0x7f0] != 0) { + VIWaitForRetrace(); + } + + my_OSCancelAlarmAll(); + LCDisable(); + // probably false match; check out 80015728 or thereabouts in Ghidra + OSSetSaveRegion(/* mResetData */ m_Do_Reset_NS_mDoRst_NS_mResetData, (u8*)(&getResetData__6mDoRstFv) + 0x18); + OSResetSystem(p1, p2, p3); + do { + VIWaitForRetrace(); + } while (true); +} + +void mDoRst::resetCallBack(int p1, void* p2) { + if (/* mResetData */ m_Do_Reset_NS_mDoRst_NS_mResetData->field_0x0 == 0) { + if (p1 == -1) { + cAPICPad_recalibrate(); + } else { + if (m_Do_Reset_NS_mDoRst_NS_mResetData->field_0x8 != 0) { + lbl_80451501 = false; + /* sCallback */ lbl_804514EC = &mDoRst::resetCallBack; + /* sCallbackArg */ lbl_804514F0 = 0; + return; + } + m_Do_Reset_NS_mDoRst_NS_mResetData->field_0x8 = 1; + m_Do_Reset_NS_mDoRst_NS_mResetData->pad_index = p1; + cAPICPad_recalibrate(); + } + + if ((DVDCheckDisk() == 0) && (DVDGetDriveStatus() != DVD_STATE_FATAL_ERROR)) { + m_Do_Reset_NS_mDoRst_NS_mResetData->field_0x11 = 1; + } + m_Do_Reset_NS_mDoRst_NS_mResetData->field_0x0 = 1; + } +} + +ResetData* mDoRst::getResetData() { + return /* mResetData */ m_Do_Reset_NS_mDoRst_NS_mResetData; +}
\ No newline at end of file |
