tp/src/m_Do/m_Do_Reset.cpp

127 lines
3.5 KiB
C++

#include "m_Do/m_Do_reset/m_Do_reset.h"
#include "JSystem/JUtility/JUTXfb/JUTXfb.h"
#include "SComponent/c_API_controller_pad.h"
#include "Z2AudioLib/Z2AudioMgr/Z2AudioMgr.h"
#include "dvd/dvd.h"
#include "global.h"
extern "C" {
class JSURandomInputStream;
class mDoCPd_c;
struct JASTaskThread {
u8 unk0[0x2c];
OSThread* thread;
};
JASTaskThread* JASDvd_NS_getThreadPointer(void);
s32 JASTaskThread_NS_pause(JASTaskThread*, bool);
void cAPICPad_recalibrate__Fv(void);
void getResetData__6mDoRstFv(void);
void JUTVideo_NS_destroyManager(void);
void mDoDvdErr_ThdCleanup(void);
void VIFlush(void);
void VISetBlack(s32);
void VIWaitForRetrace(void);
}
void my_OSCancelAlarmAll(void) {
return;
}
void destroyVideo() {
JUTVideo_NS_destroyManager();
GXSetDrawDoneCallback(NULL);
VISetBlack(1);
VIFlush();
VIWaitForRetrace();
return;
}
// TODO: cleanup
void mDoRst_reset(int p1, u32 p2, int p3) {
mDoCPd_c* pmVar1;
u32 uVar2;
DVDState DVar3;
OSThread* thread;
s32 enable;
/* sManager */ lbl_80451550->clearIndex();
mDoDvdErr_ThdCleanup();
cAPICPad_recalibrate__Fv();
if (lbl_80450BB8 != false) {
do {
uVar2 = lbl_80451368->hasReset();
} 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__Fv();
} 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__Fv();
}
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;
}