mirror of https://github.com/zeldaret/tp.git
127 lines
3.5 KiB
C++
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;
|
|
} |