summaryrefslogtreecommitdiff
path: root/src/m_Do/m_Do_Reset.cpp
diff options
context:
space:
mode:
authorErin Moon <erin@hecke.rs>2020-12-25 19:59:52 -0600
committerGitHub <noreply@github.com>2020-12-25 20:59:52 -0500
commit58fc83c4f804e72019dc9ccbcc389affe7a9f3ed (patch)
treed287ca8be8511f1a826b1d62aa6461ab1a76fcf4 /src/m_Do/m_Do_Reset.cpp
parent22bda03652efbecd77e1fa3597dfdecee768ec06 (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.cpp111
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