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
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
|
#include "types.h"
#include "ctorStruct.h"
#include "SDK/mem.h"
#include "SDK/os.h"
#include "SDK/dvd.h"
#include "SDK/nand.h"
#include "code_801DAAE0.h"
#include "code_801DCE6C.h"
namespace
{
struct unkClass;
typedef void (*funcPtr)(u32, unkClass*);
struct unkClass2
{
u8 unk0[0x40];
funcPtr unk40;
void* unk44; //data cache start addr to invalidate
u32 unk48; // data cache region size
};
//TODO: header/source
struct unkClass
{
u8 unk0;
u8 unk1;
u8 unk2[0x2];
unkClass2 unk4;
};
}
extern MEMHeapHandle lbl_8063E8EC;
//TODO: internal linkage
extern u8 lbl_8063F31E;
extern u8 lbl_8063F31F;
extern size_t lbl_8063F320;
extern unkClass* lbl_8063F324;
extern u32 lbl_8063F338;
extern "C"
{
// TODO: return type
//static
void* func_801DBE90(u32 size)
{
// void* func_801DAD08(MEMHeapHandle heap, u32 size, int alignment)
return func_801DAD08(lbl_8063E8EC, size, 0x20);
}
//static
void func_801DBEA0(void)
{
for (size_t i = 0; i < lbl_8063F320; i++)
lbl_8063F324[i].unk0 = 0;
}
#ifdef NONMATCHING
//static
unkClass *func_801DBED0(void)
{
OSDisableInterrupts();
unkClass *r31 = 0;
size_t i;
for (i = 0; i < lbl_8063F320; i++)
{
if (lbl_8063F324[i].unk0 != 1)
{
lbl_8063F324[i].unk0 = 1;
lbl_8063F324[i].unk1 = 0;
r31 = &lbl_8063F324[i];
break;
}
}
OSRestoreInterrupts();
return r31;
}
#else
asm unkClass* func_801DBED0(void)
{
nofralloc
/* 801DBED0 001D7B30 94 21 FF F0 */ stwu r1, -0x10(r1)
/* 801DBED4 001D7B34 7C 08 02 A6 */ mflr r0
/* 801DBED8 001D7B38 90 01 00 14 */ stw r0, 0x14(r1)
/* 801DBEDC 001D7B3C 93 E1 00 0C */ stw r31, 0xc(r1)
/* 801DBEE0 001D7B40 48 09 28 7D */ bl OSDisableInterrupts
/* 801DBEE4 001D7B44 80 ED A0 64 */ lwz r7, lbl_8063F324
/* 801DBEE8 001D7B48 3B E0 00 00 */ li r31, 0
/* 801DBEEC 001D7B4C 80 0D A0 60 */ lwz r0, lbl_8063F320
/* 801DBEF0 001D7B50 38 A0 00 00 */ li r5, 0
/* 801DBEF4 001D7B54 7C E4 3B 78 */ mr r4, r7
/* 801DBEF8 001D7B58 7C 09 03 A6 */ mtctr r0
/* 801DBEFC 001D7B5C 28 00 00 00 */ cmplwi r0, 0
/* 801DBF00 001D7B60 40 81 00 44 */ ble lbl_801DBF44
lbl_801DBF04:
/* 801DBF04 001D7B64 88 04 00 00 */ lbz r0, 0(r4)
/* 801DBF08 001D7B68 28 00 00 01 */ cmplwi r0, 1
/* 801DBF0C 001D7B6C 41 82 00 2C */ beq lbl_801DBF38
/* 801DBF10 001D7B70 1C C5 00 50 */ mulli r6, r5, 0x50
/* 801DBF14 001D7B74 38 00 00 01 */ li r0, 1
/* 801DBF18 001D7B78 38 A0 00 00 */ li r5, 0
/* 801DBF1C 001D7B7C 7C 07 31 AE */ stbx r0, r7, r6
/* 801DBF20 001D7B80 80 0D A0 64 */ lwz r0, lbl_8063F324
/* 801DBF24 001D7B84 7C 80 32 14 */ add r4, r0, r6
/* 801DBF28 001D7B88 98 A4 00 01 */ stb r5, 1(r4)
/* 801DBF2C 001D7B8C 80 0D A0 64 */ lwz r0, lbl_8063F324
/* 801DBF30 001D7B90 7F E0 32 14 */ add r31, r0, r6
/* 801DBF34 001D7B94 48 00 00 10 */ b lbl_801DBF44
lbl_801DBF38:
/* 801DBF38 001D7B98 38 84 00 50 */ addi r4, r4, 0x50
/* 801DBF3C 001D7B9C 38 A5 00 01 */ addi r5, r5, 1
/* 801DBF40 001D7BA0 42 00 FF C4 */ bdnz lbl_801DBF04
lbl_801DBF44:
/* 801DBF44 001D7BA4 48 09 28 41 */ bl OSRestoreInterrupts
/* 801DBF48 001D7BA8 7F E3 FB 78 */ mr r3, r31
/* 801DBF4C 001D7BAC 83 E1 00 0C */ lwz r31, 0xc(r1)
/* 801DBF50 001D7BB0 80 01 00 14 */ lwz r0, 0x14(r1)
/* 801DBF54 001D7BB4 7C 08 03 A6 */ mtlr r0
/* 801DBF58 001D7BB8 38 21 00 10 */ addi r1, r1, 0x10
/* 801DBF5C 001D7BBC 4E 80 00 20 */ blr
}
#pragma peephole on
#endif
//static
void func_801DBF60(unkClass* p1)
{
OSDisableInterrupts();
p1->unk0 = 0;
OSRestoreInterrupts();
}
#ifdef NONMATCHING2
//static
unkClass* func_801DBF98(unkClass2* p1)
{
unkClass* r4 = lbl_8063F324;
size_t i = 0;
for (; i < lbl_8063F320; r4++, i++) {
if (r4->unk0 != 0 && &r4->unk4 == p1)
return &lbl_8063F324[i];
}
return 0;
}
#else
asm unkClass* func_801DBF98(unkClass2* p1)
{
/* 801DBF98 001D7BF8 80 AD A0 64 */ lwz r5, lbl_8063F324
/* 801DBF9C 001D7BFC 38 C0 00 00 */ li r6, 0
/* 801DBFA0 001D7C00 80 0D A0 60 */ lwz r0, lbl_8063F320
/* 801DBFA4 001D7C04 7C A4 2B 78 */ mr r4, r5
/* 801DBFA8 001D7C08 7C 09 03 A6 */ mtctr r0
/* 801DBFAC 001D7C0C 28 00 00 00 */ cmplwi r0, 0
/* 801DBFB0 001D7C10 40 81 00 34 */ ble lbl_801DBFE4
lbl_801DBFB4:
/* 801DBFB4 001D7C14 88 04 00 00 */ lbz r0, 0(r4)
/* 801DBFB8 001D7C18 2C 00 00 00 */ cmpwi r0, 0
/* 801DBFBC 001D7C1C 41 82 00 1C */ beq lbl_801DBFD8
/* 801DBFC0 001D7C20 38 04 00 04 */ addi r0, r4, 4
/* 801DBFC4 001D7C24 7C 00 18 40 */ cmplw r0, r3
/* 801DBFC8 001D7C28 40 82 00 10 */ bne lbl_801DBFD8
/* 801DBFCC 001D7C2C 1C 06 00 50 */ mulli r0, r6, 0x50
/* 801DBFD0 001D7C30 7C 65 02 14 */ add r3, r5, r0
/* 801DBFD4 001D7C34 4E 80 00 20 */ blr
lbl_801DBFD8:
/* 801DBFD8 001D7C38 38 84 00 50 */ addi r4, r4, 0x50
/* 801DBFDC 001D7C3C 38 C6 00 01 */ addi r6, r6, 1
/* 801DBFE0 001D7C40 42 00 FF D4 */ bdnz lbl_801DBFB4
lbl_801DBFE4:
/* 801DBFE4 001D7C44 38 60 00 00 */ li r3, 0
/* 801DBFE8 001D7C48 4E 80 00 20 */ blr
}
#pragma peephole on
#endif
//static
void lbl_801DBFEC(u32 p1, unkClass2* p2)
{
if (lbl_8063F31F == 0) {
unkClass* r31 = func_801DBF98(p2);
if (r31 && r31->unk4.unk40) {
DCInvalidateRange(r31->unk4.unk44, r31->unk4.unk48);
r31->unk4.unk40(p1, r31);
}
}
}
//static
void lbl_801DC068(u32 p1, unkClass2* p2)
{
if (lbl_8063F31F == 0) {
unkClass* r3 = func_801DBF98(p2);
if (r3 && r3->unk4.unk40)
r3->unk4.unk40(p1, r3);
}
}
#if 0
BOOL func_801DC0C8(size_t p1)
{
if (lbl_8063F31E != 1) {
lbl_8063F31F = 0;
lbl_8063F338 = 0;
NANDInit();
if (!lbl_8063F338) {
// lbl_8063F338 = new ...;
// new , 801DCE7C constructor
}
} else {
return FALSE;
}
}
#endif
} //extern "C"
|