summaryrefslogtreecommitdiff
path: root/libs/SSystem/SComponent/c_phase.cpp
blob: c4c30ecf4e7cb6fed9df300c37d9ac0e572cd124 (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
109
110
111
//
// Generated By: dol2asm
// Translation Unit: c_phase
//

#include "SSystem/SComponent/c_phase.h"
#include "dol2asm.h"
#include "dolphin/types.h"

extern "C" static void cPhs_UnCompleate__FP30request_of_phase_process_class();
extern "C" static void cPhs_Compleate__FP30request_of_phase_process_class();
extern "C" static void cPhs_Next__FP30request_of_phase_process_class();

//
// Declarations:
//

/* 80266624-80266630 000C+00 s=1 e=2 z=0  None .text
 * cPhs_Reset__FP30request_of_phase_process_class               */
void cPhs_Reset(request_of_phase_process_class* pPhase) {
    pPhase->id = cPhs_ZERO_e;
}

/* 80266630-80266640 0010+00 s=0 e=3 z=0  None .text
 * cPhs_Set__FP30request_of_phase_process_classPPFPv_i          */
void cPhs_Set(request_of_phase_process_class* pPhase, cPhs__Handler* pHandlerTable) {
    pPhase->mpHandlerTable = pHandlerTable;
    pPhase->id = cPhs_ZERO_e;
}

/* 80266640-80266668 0028+00 s=1 e=0 z=0  None .text
 * cPhs_UnCompleate__FP30request_of_phase_process_class         */
void cPhs_UnCompleate(request_of_phase_process_class* pPhase) {
    pPhase->mpHandlerTable = NULL;
    cPhs_Reset(pPhase);
}

/* 80266668-80266678 0010+00 s=2 e=0 z=0  None .text
 * cPhs_Compleate__FP30request_of_phase_process_class           */
int cPhs_Compleate(request_of_phase_process_class* pPhase) {
    pPhase->mpHandlerTable = NULL;
    return cPhs_COMPLEATE_e;
}

/* 80266678-802666D8 0060+00 s=1 e=0 z=0  None .text cPhs_Next__FP30request_of_phase_process_class
 */
int cPhs_Next(request_of_phase_process_class* pPhase) {
    if (const cPhs__Handler* handlerTable = pPhase->mpHandlerTable) {
        pPhase->id++;
        cPhs__Handler handler = handlerTable[pPhase->id];

        // Double null check here actually matters for emitted assembly.
        // Wee old compilers.
        if (handler == NULL || handler == NULL) {
            return cPhs_Compleate(pPhase);
        } else {
            return cPhs_ONE_e;
        }
    }

    return cPhs_COMPLEATE_e;
}

/* 802666D8-802667AC 00D4+00 s=1 e=3 z=0  None .text cPhs_Do__FP30request_of_phase_process_classPv
 */
#ifdef NONMATCHING
int cPhs_Do(request_of_phase_process_class* pPhase, void* pUserData) {
    if (const cPhs__Handler* pHandlerTable = pPhase->mpHandlerTable) {
        // the load of pUserData seems to be slightly scrambled..
        const cPhs__Handler pHandler = pHandlerTable[pPhase->id];
        const int newStep = pHandler(pUserData);

        switch (newStep) {
        case cPhs_ONE_e:
            return cPhs_Next(pPhase);
        case cPhs_TWO_e:
            const int step2 = cPhs_Next(pPhase);
            return step2 == cPhs_ONE_e ? cPhs_TWO_e : cPhs_COMPLEATE_e;
        case cPhs_COMPLEATE_e:
            return cPhs_Compleate(pPhase);
        case cPhs_UNK3_e:
            cPhs_UnCompleate(pPhase);
            return cPhs_UNK3_e;
        case cPhs_ERROR_e:
            cPhs_UnCompleate(pPhase);
            return cPhs_ERROR_e;
        }

        return newStep;
    }
    
    return cPhs_Compleate(pPhase);
}
#else
#pragma push
#pragma optimization_level 0
#pragma optimizewithasm off
asm int cPhs_Do(request_of_phase_process_class* param_0, void* param_1) {
    nofralloc
#include "asm/SSystem/SComponent/c_phase/cPhs_Do__FP30request_of_phase_process_classPv.s"
}
#pragma pop
#endif

/* 802667AC-802667D4 0028+00 s=0 e=2 z=0  None .text
 * cPhs_Handler__FP30request_of_phase_process_classPPFPv_iPv    */
int cPhs_Handler(request_of_phase_process_class* pPhase, cPhs__Handler* pHandlerTable,
                 void* pUserData) {
    pPhase->mpHandlerTable = pHandlerTable;
    return cPhs_Do(pPhase, pUserData);
}