summaryrefslogtreecommitdiff
path: root/src/m_Do/m_Do_Reset.cpp
blob: a19ca6ff9954f5eecb4292520f2f5b7e5b16834f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
/**
 * m_Do_Reset.cpp
 * Game Reset Management
 */

#include "m_Do/m_Do_Reset.h"
#include "JSystem/JAudio2/JASDvdThread.h"
#include "JSystem/JUtility/JUTGamePad.h"
#include "JSystem/JUtility/JUTXfb.h"
#include "SSystem/SComponent/c_API_controller_pad.h"
#include "dolphin/gx.h"
#include "m_Do/m_Do_audio.h"
#include "m_Do/m_Do_DVDError.h"
#include "m_Do/m_Do_MemCard.h"

static void my_OSCancelAlarmAll() {}

static void destroyVideo() {
    JUTDestroyVideoManager();
    GXSetDrawDoneCallback(NULL);
    VISetBlack(1);
    VIFlush();
    VIWaitForRetrace();
    return;
}

mDoRstData* mDoRst::mResetData;

void mDoRst_reset(int param_0, u32 param_1, int param_2) {
    JUTXfb::getManager()->clearIndex();
    mDoDvdErr_ThdCleanup();
    cAPICPad_recalibrate();

    if (mDoAud_zelAudio_c::isInitFlag()) {
        bool audioReset;
        do {
            audioReset = Z2AudioMgr::getInterface()->hasReset();
        } while (!audioReset);
    }

    if (DVDGetDriveStatus() == DVD_STATE_BUSY) {
        OSAttention("DVD_STATE_BUSY\n");
    }

    JASTaskThread* task_thread = JASDvd::getThreadPointer();
    if (task_thread != NULL) {
        task_thread->pause(true);
        OSThread* thread = task_thread->getThreadRecord();
        if (thread != NULL) {
            OSSuspendThread(thread);
            OSDetachThread(thread);
            OSCancelThread(thread);
        }
    }

    VIWaitForRetrace();
    VIWaitForRetrace();

    OSThread* gxThread = GXGetCurrentGXThread();
    s32 enable = OSDisableInterrupts();

    if (gxThread != OSGetCurrentThread()) {
        OSCancelThread(gxThread);
        GXSetCurrentGXThread();
    }

    GXFlush();
    GXAbortFrame();
    GXDrawDone();
    OSRestoreInterrupts(enable);
    destroyVideo();

    while (!mDoMemCd_isCardCommNone()) {
        VIWaitForRetrace();
    }

    my_OSCancelAlarmAll();
    LCDisable();
    OSSetSaveRegion(mDoRst::mResetData, (u8*)&mDoRst::getResetData + 0x18);
    OSResetSystem(param_0, param_1, param_2);

    do {
        VIWaitForRetrace();
    } while (true);
}

void mDoRst_resetCallBack(int port, void*) {
    if (!mDoRst::isReset()) {
        if (port == -1) {
            cAPICPad_recalibrate();
        } else {
            if (mDoRst::is3ButtonReset()) {
                JUTGamePad::C3ButtonReset::sResetOccurred = false;
                JUTGamePad::C3ButtonReset::sCallback = mDoRst_resetCallBack;
                JUTGamePad::C3ButtonReset::sCallbackArg = NULL;
                return;
            }
            mDoRst::on3ButtonReset();
            mDoRst::set3ButtonResetPort(port);
            cAPICPad_recalibrate();
        }

        if (DVDCheckDisk() == 0 && DVDGetDriveStatus() != DVD_STATE_FATAL_ERROR) {
            mDoRst::onReturnToMenu();
        }
        mDoRst::onReset();
    }
}