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
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
|
.include "asm/macros.inc"
.include "global.inc"
.extern isInitialized
.text
arm_func_start OS_UnlockCartridge
OS_UnlockCartridge: ; 0x020CA094
ldr r1, _020CA09C ; =OS_UnlockCartridge2
bx r1
.balign 4
_020CA09C: .word OS_UnlockCartridge2
arm_func_start OS_GetLockID
OS_GetLockID: ; 0x020CA0A0
ldr r3, _020CA0F0 ; =0x027FFFB0
ldr r1, [r3, #0x0]
clz r2, r1
cmp r2, #0x20
movne r0, #0x40
bne _020CA0D4
add r3, r3, #0x4
ldr r1, [r3, #0x0]
clz r2, r1
cmp r2, #0x20
ldr r0, _020CA0F4 ; =0xFFFFFFFD
bxeq lr
mov r0, #0x60
_020CA0D4:
add r0, r0, r2
mov r1, #0x80000000
mov r1, r1, lsr r2
ldr r2, [r3, #0x0]
bic r2, r2, r1
str r2, [r3, #0x0]
bx lr
.balign 4
_020CA0F0: .word 0x027FFFB0
_020CA0F4: .word 0xFFFFFFFD
arm_func_start OS_ReleaseLockID
OS_ReleaseLockID: ; 0x020CA0F8
ldr r3, _020CA124 ; =0x027FFFB0
cmp r0, #0x60
addpl r3, r3, #0x4
subpl r0, r0, #0x60
submi r0, r0, #0x40
mov r1, #0x80000000
mov r1, r1, lsr r0
ldr r2, [r3, #0x0]
orr r2, r2, r1
str r2, [r3, #0x0]
bx lr
.balign 4
_020CA124: .word 0x027FFFB0
arm_func_start OS_ReadOwnerOfLockWord
OS_ReadOwnerOfLockWord: ; 0x020CA128
ldrh r0, [r0, #0x4]
bx lr
arm_func_start OSi_FreeCardBus
OSi_FreeCardBus: ; 0x020CA130
ldr r1, _020CA144 ; =0x04000204
ldrh r0, [r1, #0x0]
orr r0, r0, #0x800
strh r0, [r1, #0x0]
bx lr
.balign 4
_020CA144: .word 0x04000204
arm_func_start OSi_AllocateCardBus
OSi_AllocateCardBus: ; 0x020CA148
ldr r1, _020CA15C ; =0x04000204
ldrh r0, [r1, #0x0]
bic r0, r0, #0x800
strh r0, [r1, #0x0]
bx lr
.balign 4
_020CA15C: .word 0x04000204
arm_func_start OS_UnlockCard
OS_UnlockCard: ; 0x020CA160
ldr ip, _020CA170 ; =OS_UnlockByWord
ldr r1, _020CA174 ; =0x027FFFE0
ldr r2, _020CA178 ; =OSi_FreeCardBus
bx r12
.balign 4
_020CA170: .word OS_UnlockByWord
_020CA174: .word 0x027FFFE0
_020CA178: .word OSi_FreeCardBus
arm_func_start OS_TryLockCard
OS_TryLockCard: ; 0x020CA17C
ldr ip, _020CA18C ; =OS_TryLockByWord
ldr r1, _020CA190 ; =0x027FFFE0
ldr r2, _020CA194 ; =OSi_AllocateCardBus
bx r12
.balign 4
_020CA18C: .word OS_TryLockByWord
_020CA190: .word 0x027FFFE0
_020CA194: .word OSi_AllocateCardBus
arm_func_start OSi_FreeCartridgeBus
OSi_FreeCartridgeBus: ; 0x020CA198
ldr r1, _020CA1AC ; =0x04000204
ldrh r0, [r1, #0x0]
orr r0, r0, #0x80
strh r0, [r1, #0x0]
bx lr
.balign 4
_020CA1AC: .word 0x04000204
arm_func_start OSi_AllocateCartridgeBus
OSi_AllocateCartridgeBus: ; 0x020CA1B0
ldr r1, _020CA1C4 ; =0x04000204
ldrh r0, [r1, #0x0]
bic r0, r0, #0x80
strh r0, [r1, #0x0]
bx lr
.balign 4
_020CA1C4: .word 0x04000204
arm_func_start OS_TryLockCartridge
OS_TryLockCartridge: ; 0x020CA1C8
ldr ip, _020CA1DC ; =OSi_DoTryLockByWord
ldr r1, _020CA1E0 ; =0x027FFFE8
ldr r2, _020CA1E4 ; =OSi_AllocateCartridgeBus
mov r3, #0x1
bx r12
.balign 4
_020CA1DC: .word OSi_DoTryLockByWord
_020CA1E0: .word 0x027FFFE8
_020CA1E4: .word OSi_AllocateCartridgeBus
arm_func_start OS_UnlockCartridge2
OS_UnlockCartridge2: ; 0x020CA1E8
ldr ip, _020CA1FC ; =FUN_020CA2B8
ldr r1, _020CA200 ; =0x027FFFE8
ldr r2, _020CA204 ; =OSi_FreeCartridgeBus
mov r3, #0x1
bx r12
.balign 4
_020CA1FC: .word FUN_020CA2B8
_020CA200: .word 0x027FFFE8
_020CA204: .word OSi_FreeCartridgeBus
arm_func_start OS_LockCartridge
OS_LockCartridge: ; 0x020CA208
ldr ip, _020CA21C ; =FUN_020CA358
ldr r1, _020CA220 ; =0x027FFFE8
ldr r2, _020CA224 ; =OSi_AllocateCartridgeBus
mov r3, #0x1
bx r12
.balign 4
_020CA21C: .word FUN_020CA358
_020CA220: .word 0x027FFFE8
_020CA224: .word OSi_AllocateCartridgeBus
arm_func_start OSi_DoTryLockByWord
OSi_DoTryLockByWord:
stmdb sp!, {r4-r9,lr}
sub sp, sp, #0x4
movs r6, r3
mov r9, r0
mov r8, r1
mov r7, r2
beq _020CA250
bl OS_DisableInterrupts_IrqAndFiq
mov r5, r0
b _020CA258
_020CA250:
bl OS_DisableInterrupts
mov r5, r0
_020CA258:
mov r0, r9
mov r1, r8
bl MI_SwapWord
movs r4, r0
bne _020CA27C
cmp r7, #0x0
beq _020CA278
blx r7
_020CA278:
strh r9, [r8, #0x4]
_020CA27C:
cmp r6, #0x0
beq _020CA290
mov r0, r5
bl OS_RestoreInterrupts_IrqAndFiq
b _020CA298
_020CA290:
mov r0, r5
bl OS_RestoreInterrupts
_020CA298:
mov r0, r4
add sp, sp, #0x4
ldmia sp!, {r4-r9,lr}
bx lr
arm_func_start OS_UnlockByWord
OS_UnlockByWord: ; 0x020CA2A8
ldr ip, _020CA2B4 ; =FUN_020CA2B8
mov r3, #0x0
bx r12
.balign 4
_020CA2B4: .word FUN_020CA2B8
arm_func_start FUN_020CA2B8
FUN_020CA2B8: ; 0x020CA2B8
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
mov r7, r1
ldrh r1, [r7, #0x4]
mov r6, r2
mov r5, r3
cmp r0, r1
addne sp, sp, #0x4
mvnne r0, #0x1
ldmneia sp!, {r4-r7,lr}
bxne lr
cmp r5, #0x0
beq _020CA2F8
bl OS_DisableInterrupts_IrqAndFiq
mov r4, r0
b _020CA300
_020CA2F8:
bl OS_DisableInterrupts
mov r4, r0
_020CA300:
mov r0, #0x0
strh r0, [r7, #0x4]
cmp r6, #0x0
beq _020CA314
blx r6
_020CA314:
mov r0, #0x0
str r0, [r7, #0x0]
cmp r5, #0x0
beq _020CA330
mov r0, r4
bl OS_RestoreInterrupts_IrqAndFiq
b _020CA338
_020CA330:
mov r0, r4
bl OS_RestoreInterrupts
_020CA338:
mov r0, #0x0
add sp, sp, #0x4
ldmia sp!, {r4-r7,lr}
bx lr
arm_func_start OS_TryLockByWord
OS_TryLockByWord: ; 0x020CA348
ldr ip, _020CA354 ; =FUN_020CA358
mov r3, #0x0
bx r12
.balign 4
_020CA354: .word FUN_020CA358
arm_func_start FUN_020CA358
FUN_020CA358: ; 0x020CA358
stmdb sp!, {r4-r8,lr}
mov r8, r0
mov r7, r1
mov r6, r2
mov r5, r3
bl OSi_DoTryLockByWord
cmp r0, #0x0
ldmleia sp!, {r4-r8,lr}
bxle lr
mov r4, #0x400
_020CA380:
mov r0, r4
blx SVC_WaitByLoop
mov r0, r8
mov r1, r7
mov r2, r6
mov r3, r5
bl OSi_DoTryLockByWord
cmp r0, #0x0
bgt _020CA380
ldmia sp!, {r4-r8,lr}
bx lr
arm_func_start OS_InitLock
OS_InitLock: ; 0x020CA3AC
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
ldr r0, _020CA484 ; =isInitialized
ldr r1, [r0, #0x0]
cmp r1, #0x0
addne sp, sp, #0x4
ldmneia sp!, {r4-r5,lr}
bxne lr
mov r2, #0x1
ldr r1, _020CA488 ; =0x027FFFF0
str r2, [r0, #0x0]
mov r2, #0x0
mov r0, #0x7e
str r2, [r1, #0x0]
bl OS_TryLockByWord
ldr r5, _020CA488 ; =0x027FFFF0
ldrh r0, [r5, #0x6]
cmp r0, #0x0
beq _020CA410
mov r4, #0x400
_020CA3FC:
mov r0, r4
blx SVC_WaitByLoop
ldrh r0, [r5, #0x6]
cmp r0, #0x0
bne _020CA3FC
_020CA410:
ldr r2, _020CA48C ; =0x027FFFB0
mvn r12, #0x0
mov r0, #0x10000
ldr r3, _020CA490 ; =0x027FFFB4
ldr r1, _020CA494 ; =0x027FFFC0
str r12, [r2, #0x0]
rsb r12, r0, #0x0
mov r0, #0x0
mov r2, #0x28
str r12, [r3, #0x0]
bl MIi_CpuClear32
ldr ip, _020CA498 ; =0x04000204
ldr r1, _020CA488 ; =0x027FFFF0
ldrh r3, [r12, #0x0]
mov r0, #0x7e
mov r2, #0x0
orr r3, r3, #0x800
strh r3, [r12, #0x0]
ldrh r3, [r12, #0x0]
orr r3, r3, #0x80
strh r3, [r12, #0x0]
bl OS_UnlockByWord
ldr r1, _020CA488 ; =0x027FFFF0
mov r0, #0x7f
mov r2, #0x0
bl OS_TryLockByWord
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
.balign 4
_020CA484: .word isInitialized
_020CA488: .word 0x027FFFF0
_020CA48C: .word 0x027FFFB0
_020CA490: .word 0x027FFFB4
_020CA494: .word 0x027FFFC0
_020CA498: .word 0x04000204
|