summaryrefslogtreecommitdiff
path: root/libs/JSystem/JAudio2/JASSeqCtrl.cpp
blob: 3bfbf12d2cd70bbbb350df6c62174812cb9961b0 (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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
//
// Generated By: dol2asm
// Translation Unit: JASSeqCtrl
//

#include "JSystem/JAudio2/JASSeqCtrl.h"
#include "JSystem/JAudio2/JASSeqParser.h"
#include "JSystem/JAudio2/JASTrack.h"

/* ############################################################################################## */
/* 80451238-80451240 000738 0004+04 3/3 0/0 0/0 .sbss            sDefaultParser__10JASSeqCtrl */
JASSeqParser JASSeqCtrl::sDefaultParser;

/* 802938BC-80293924 28E1FC 0068+00 0/0 1/1 0/0 .text            __ct__10JASSeqCtrlFv */
JASSeqCtrl::JASSeqCtrl() {
    mReader.init();
    field_0x3c = &sDefaultParser;
    field_0x40 = 0;
    field_0x44 = NULL;
    field_0x48 = 0;
    field_0x4c = 0;
    field_0x4e = 0;
    field_0x50 = 0;
    field_0x51 = 0;
    field_0x54 = 0;
    field_0x58 = 0;
    mReader.init();
}

/* 80293924-80293980 28E264 005C+00 0/0 1/1 0/0 .text            init__10JASSeqCtrlFv */
void JASSeqCtrl::init() {
    mReader.init();
    field_0x3c = &sDefaultParser;
    field_0x40 = 0;
    field_0x44 = NULL;
    field_0x48 = 0;
    field_0x4c = 0;
    field_0x4e = 0;
    field_0x50 = 0;
    field_0x54 = 0;
    field_0x58 = 0;
    field_0x51 = 0;
}

/* 80293980-802939C4 28E2C0 0044+00 0/0 1/1 0/0 .text            start__10JASSeqCtrlFPvUl */
void JASSeqCtrl::start(void* param_0, u32 param_1) {
    mReader.init(param_0);
    mReader.jump(param_1);
}

/* 802939C4-80293ABC 28E304 00F8+00 0/0 1/1 0/0 .text            tickProc__10JASSeqCtrlFP8JASTrack
 */
int JASSeqCtrl::tickProc(JASTrack* param_0) {
    if (!mReader.getBase()) {
        return 0;
    }

    interrupt(INTRTYPE_VALUE_6);
    timerProcess();

    if (field_0x51) {
        if (!param_0->checkNoteStop(0)) {
            return 0;
        }

        field_0x51 = 0;
    }

    if (field_0x40 > 0) {
        field_0x40--;
    }

    checkIntr();

    while ((field_0x40 == 0 || field_0x44 != NULL) && field_0x51 == 0) {
        if (field_0x3c->parse(param_0) < 0) {
            return -1;
        }
    }
    
    return 0;
}

/* 80293ABC-80293AE0 28E3FC 0024+00 2/2 2/2 0/0 .text
 * interrupt__10JASSeqCtrlFQ210JASSeqCtrl8IntrType              */
void JASSeqCtrl::interrupt(JASSeqCtrl::IntrType param_0) {
    if (field_0x4e & (1 << param_0)) {
        field_0x4c |= (1 << param_0);
    }
}

/* 80293AE0-80293AF0 28E420 0010+00 0/0 1/1 0/0 .text            setIntrMask__10JASSeqCtrlFUl */
void JASSeqCtrl::setIntrMask(u32 param_0) {
    field_0x4e |= param_0;
}

/* 80293AF0-80293B00 28E430 0010+00 0/0 1/1 0/0 .text            clrIntrMask__10JASSeqCtrlFUl */
void JASSeqCtrl::clrIntrMask(u32 param_0) {
    field_0x4e &= ~param_0;
}

/* 80293B00-80293B28 28E440 0028+00 0/0 1/1 0/0 .text            retIntr__10JASSeqCtrlFv */
int JASSeqCtrl::retIntr() {
    if (field_0x44 == NULL) {
        return 0;
    }

    mReader.jump(field_0x44);
    field_0x44 = NULL;
    return 1;
}

/* 80293B28-80293B78 28E468 0050+00 1/1 0/0 0/0 .text            findIntr__10JASSeqCtrlFv */
int JASSeqCtrl::findIntr() {
    u32 uVar1 = field_0x4e & field_0x4c;
    for (int i = 0; uVar1 != 0; uVar1 >>= 1, i++) {
        if (uVar1 & 1) {
            field_0x4c &= ~(1 << i);
            return i;
        }
    }
    return -1;
}

/* 80293B78-80293BE8 28E4B8 0070+00 1/1 2/2 0/0 .text            checkIntr__10JASSeqCtrlFv */
void JASSeqCtrl::checkIntr() {
    if (field_0x44) return;
    int intr = findIntr();

    if (intr < 0) return;

    u32 uVar2 = field_0x48;
    uVar2 += intr * 3;
    u32 uVar1 = get24(uVar2);
    field_0x44 = mReader.getCur();
    mReader.jump(uVar1);
}

/* 80293BE8-80293C6C 28E528 0084+00 1/1 0/0 0/0 .text            timerProcess__10JASSeqCtrlFv */
void JASSeqCtrl::timerProcess() {
    if (field_0x54 == 0) return;
    
    field_0x54--;
    if (field_0x54) return;
    
    interrupt(INTRTYPE_VALUE_5);

    if (field_0x50) {
        field_0x50--;
        if (field_0x50) {
            field_0x54 = field_0x58;
        }
    } else {
        field_0x54 = field_0x58;
    }
}

/* ############################################################################################## */