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
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
|
.include "asm/macros.inc"
.include "global.inc"
.extern OSi_ThreadInfo
.extern UNK_021D5BE0
.extern cardi_common
.section .data
.global UNK_02106A50
UNK_02106A50: ; 0x02106A50
.word 0x027FFE00
.section .bss
.global UNK_021D5C00
UNK_021D5C00: ; 0x021D5C00
.space 0x220
.text
arm_func_start CARDi_GetRomAccessor
CARDi_GetRomAccessor: ; 0x020D7210
ldr r0, _020D7218 ; =CARDi_ReadCard
bx lr
.balign 4
_020D7218: .word CARDi_ReadCard
arm_func_start CARD_WaitRomAsync
CARD_WaitRomAsync: ; 0x020D721C
ldr ip, _020D7224 ; =CARDi_WaitAsync
bx r12
.balign 4
_020D7224: .word CARDi_WaitAsync
arm_func_start CARD_Init
CARD_Init: ; 0x020D7228
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr ip, _020D72A0 ; =cardi_common
ldr r0, [r12, #0x114]
cmp r0, #0x0
addne sp, sp, #0x4
ldmneia sp!, {lr}
bxne lr
mov r0, #0x1
str r0, [r12, #0x114]
mov r3, #0x0
str r3, [r12, #0x24]
ldr r0, [r12, #0x24]
mvn r1, #0x0
str r0, [r12, #0x20]
ldr r2, [r12, #0x20]
ldr r0, _020D72A4 ; =UNK_021D5BE0
str r2, [r12, #0x1c]
str r1, [r12, #0x28]
str r3, [r12, #0x38]
str r3, [r12, #0x3c]
str r3, [r0, #0x0]
bl CARDi_InitCommon
bl CARDi_GetRomAccessor
ldr r1, _020D72A8 ; =UNK_021D5C00
str r0, [r1, #0x0]
bl CARD_InitPulledOutCallback
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020D72A0: .word cardi_common
_020D72A4: .word UNK_021D5BE0
_020D72A8: .word UNK_021D5C00
arm_func_start CARDi_ReadRom
CARDi_ReadRom: ; 0x020D72AC
stmdb sp!, {r4-r11,lr}
sub sp, sp, #0x4
ldr r6, _020D73C0 ; =cardi_common
mov r10, r0
mov r9, r1
mov r8, r2
mov r7, r3
ldr fp, _020D73C4 ; =UNK_021D5C00
bl CARD_CheckEnabled
bl OS_DisableInterrupts
ldr r1, [r6, #0x114]
mov r5, r0
ands r0, r1, #0x4
beq _020D72FC
add r4, r6, #0x10c
_020D72E8:
mov r0, r4
bl OS_SleepThread
ldr r0, [r6, #0x114]
ands r0, r0, #0x4
bne _020D72E8
_020D72FC:
ldr r1, [r6, #0x114]
ldr r0, [sp, #0x28]
orr r1, r1, #0x4
str r1, [r6, #0x114]
ldr r1, [sp, #0x2c]
str r0, [r6, #0x38]
mov r0, r5
str r1, [r6, #0x3c]
bl OS_RestoreInterrupts
ldr r0, _020D73C8 ; =UNK_021D5BE0
str r10, [r6, #0x28]
ldr r0, [r0, #0x0]
cmp r10, #0x3
add r0, r9, r0
str r0, [r6, #0x1c]
str r8, [r6, #0x20]
str r7, [r6, #0x24]
bhi _020D734C
mov r0, r10
bl MI_StopDma
_020D734C:
mov r0, r11
bl CARDi_TryReadCardDma
_020D7354: ; 0x020D7354
cmp r0, #0x0
beq _020D7380
ldr r0, [sp, #0x30]
cmp r0, #0x0
addne sp, sp, #0x4
ldmneia sp!, {r4-r11,lr}
bxne lr
bl CARD_WaitRomAsync
add sp, sp, #0x4
ldmia sp!, {r4-r11,lr}
bx lr
_020D7380:
ldr r0, [sp, #0x30]
cmp r0, #0x0
beq _020D73A0
ldr r0, _020D73CC ; =CARDi_ReadRomSyncCore
bl CARDi_SetTask
add sp, sp, #0x4
ldmia sp!, {r4-r11,lr}
bx lr
_020D73A0:
ldr r1, _020D73D0 ; =OSi_ThreadInfo
mov r0, r6
ldr r1, [r1, #0x4]
str r1, [r6, #0x104]
bl CARDi_ReadRomSyncCore
add sp, sp, #0x4
ldmia sp!, {r4-r11,lr}
bx lr
.balign 4
_020D73C0: .word cardi_common
_020D73C4: .word UNK_021D5C00
_020D73C8: .word UNK_021D5BE0
_020D73CC: .word CARDi_ReadRomSyncCore
_020D73D0: .word OSi_ThreadInfo
arm_func_start CARDi_ReadRomSyncCore
CARDi_ReadRomSyncCore: ; 0x020D73D4
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
ldr r4, _020D7478 ; =UNK_021D5C00
mov r0, r4
bl CARDi_ReadFromCache
_020D73E8: ; 0x020D73E8
cmp r0, #0x0
beq _020D73FC
ldr r1, [r4, #0x0]
mov r0, r4
blx r1
_020D73FC:
ldr r7, _020D747C ; =cardi_common
bl CARDi_ReadRomIDCore
bl CARDi_CheckPulledOutCore
_020D7408: ; 0x020D7408
ldr r0, [r7, #0x0]
mov r1, #0x0
str r1, [r0, #0x0]
ldr r6, [r7, #0x38]
ldr r5, [r7, #0x3c]
bl OS_DisableInterrupts
ldr r1, [r7, #0x114]
mov r4, r0
bic r0, r1, #0x4c
str r0, [r7, #0x114]
add r0, r7, #0x10c
bl OS_WakeupThread
ldr r0, [r7, #0x114]
ands r0, r0, #0x10
beq _020D744C
add r0, r7, #0x44
bl OS_WakeupThreadDirect
_020D744C:
mov r0, r4
bl OS_RestoreInterrupts
_020D7454: ; 0x020D7454
cmp r6, #0x0
addeq sp, sp, #0x4
ldmeqia sp!, {r4-r7,lr}
bxeq lr
mov r0, r5
blx r6
add sp, sp, #0x4
ldmia sp!, {r4-r7,lr}
bx lr
.balign 4
_020D7478: .word UNK_021D5C00
_020D747C: .word cardi_common
arm_func_start CARDi_ReadRomIDCore
CARDi_ReadRomIDCore: ; 0x020D7480
stmdb sp!, {lr}
sub sp, sp, #0x4
mov r0, #0xb8000000
mov r1, #0x0
bl CARDi_SetRomOp
ldr r1, _020D74DC ; =UNK_02106A50
mov r0, #0x2000
ldr r1, [r1, #0x0]
rsb r0, r0, #0x0
ldr r2, [r1, #0x60]
ldr r1, _020D74E0 ; =0x040001A4
bic r2, r2, #0x7000000
orr r2, r2, #0xa7000000
and r0, r2, r0
str r0, [r1, #0x0]
_020D74BC:
ldr r0, [r1, #0x0]
ands r0, r0, #0x800000
beq _020D74BC
ldr r0, _020D74E4 ; =0x04100010
ldr r0, [r0, #0x0]
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020D74DC: .word UNK_02106A50
_020D74E0: .word 0x040001A4
_020D74E4: .word 0x04100010
arm_func_start CARDi_ReadCard
CARDi_ReadCard: ; 0x020D74E8
stmdb sp!, {r4-r11,lr}
sub sp, sp, #0x4
mov r10, r0
ldr sb, _020D75DC ; =cardi_common
add r7, r10, #0x20
ldr r5, _020D75E0 ; =0x04100010
ldr r6, _020D75E4 ; =0x040001A4
mov r11, #0x0
mov r0, #0x200
rsb r4, r0, #0x0
_020D7510:
ldr r0, [r9, #0x1c]
and r1, r0, r4
cmp r1, r0
bne _020D7538
ldr r8, [r9, #0x20]
ands r0, r8, #0x3
bne _020D7538
ldr r0, [r9, #0x24]
cmp r0, #0x200
bhs _020D7540
_020D7538:
mov r8, r7
str r1, [r10, #0x8]
_020D7540:
mov r0, r1, lsr #0x8
orr r0, r0, #0xb7000000
mov r1, r1, lsl #0x18
bl CARDi_SetRomOp
ldr r1, [r10, #0x4]
mov r0, r11
str r1, [r6, #0x0]
_020D755C:
ldr r2, [r6, #0x0]
ands r1, r2, #0x800000
beq _020D7578
ldr r1, [r5, #0x0]
cmp r0, #0x200
strcc r1, [r8, r0, lsl #0x2]
addcc r0, r0, #0x1
_020D7578:
ands r1, r2, #0x80000000
bne _020D755C
ldr r0, [r9, #0x20]
cmp r8, r0
bne _020D75C0
ldr r2, [r9, #0x1c]
ldr r1, [r9, #0x20]
ldr r0, [r9, #0x24]
add r2, r2, #0x200
add r1, r1, #0x200
subs r0, r0, #0x200
str r2, [r9, #0x1c]
str r1, [r9, #0x20]
str r0, [r9, #0x24]
bne _020D7510
add sp, sp, #0x4
ldmia sp!, {r4-r11,lr}
bx lr
_020D75C0:
mov r0, r10
bl CARDi_ReadFromCache
_020D75C8: ; 0x020D75C8
cmp r0, #0x0
bne _020D7510
add sp, sp, #0x4
ldmia sp!, {r4-r11,lr}
bx lr
.balign 4
_020D75DC: .word cardi_common
_020D75E0: .word 0x04100010
_020D75E4: .word 0x040001A4
arm_func_start CARDi_TryReadCardDma
CARDi_TryReadCardDma:
stmdb sp!, {r4-r11,lr}
sub sp, sp, #0x4
ldr fp, _020D7748 ; =cardi_common
mov r7, #0x0
ldr r9, [r11, #0x20]
mov r10, r0
mov r6, r7
mov r5, r7
mov r1, r7
ands r4, r9, #0x1f
ldr r8, [r11, #0x24]
bne _020D7624
ldr r0, [r11, #0x28]
cmp r0, #0x3
movls r1, #0x1
_020D7624:
cmp r1, #0x0
beq _020D7678
bl OS_GetDTCMAddress
ldr r1, _020D774C ; =0x01FF8000
add r2, r9, r8
cmp r2, r1
mov r3, #0x1
mov r1, #0x0
bls _020D7650
cmp r9, #0x2000000
movcc r1, r3
_020D7650:
cmp r1, #0x0
bne _020D7670
cmp r0, r2
bhs _020D766C
add r0, r0, #0x4000
cmp r0, r9
bhi _020D7670
_020D766C:
mov r3, #0x0
_020D7670:
cmp r3, #0x0
moveq r5, #0x1
_020D7678:
cmp r5, #0x0
beq _020D7694
ldr r1, [r11, #0x1c]
ldr r0, _020D7750 ; =0x000001FF
orr r1, r1, r8
ands r0, r1, r0
moveq r6, #0x1
_020D7694:
cmp r6, #0x0
beq _020D76A4
cmp r8, #0x0
movne r7, #0x1
_020D76A4:
ldr r0, _020D7754 ; =UNK_02106A50
cmp r7, #0x0
ldr r0, [r0, #0x0]
ldr r0, [r0, #0x60]
bic r0, r0, #0x7000000
orr r0, r0, #0xa1000000
str r0, [r10, #0x4]
beq _020D7738
bl OS_DisableInterrupts
mov r5, r0
mov r0, r9
mov r1, r8
bl IC_InvalidateRange
_020D76D8: ; 0x020D76D8
cmp r4, #0x0
beq _020D7700
sub r9, r9, r4
mov r0, r9
mov r1, #0x20
bl DC_StoreRange
add r0, r9, r8
mov r1, #0x20
bl DC_StoreRange
add r8, r8, #0x20
_020D7700:
mov r0, r9
mov r1, r8
bl DC_InvalidateRange
bl DC_WaitWriteBufferEmpty
ldr r1, _020D7758 ; =CARDi_OnReadCard
mov r0, #0x80000
bl OS_SetIrqFunction
mov r0, #0x80000
bl OS_ResetRequestIrqMask
mov r0, #0x80000
bl OS_EnableIrqMask
mov r0, r5
bl OS_RestoreInterrupts
bl CARDi_SetCardDma
_020D7738:
mov r0, r7
add sp, sp, #0x4
ldmia sp!, {r4-r11,lr}
bx lr
.balign 4
_020D7748: .word cardi_common
_020D774C: .word 0x01FF8000
_020D7750: .word 0x000001FF
_020D7754: .word UNK_02106A50
_020D7758: .word CARDi_OnReadCard
arm_func_start CARDi_OnReadCard
CARDi_OnReadCard: ; 0x020D775C
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
ldr r0, _020D7838 ; =cardi_common
ldr r0, [r0, #0x28]
bl MI_StopDma
ldr r0, _020D7838 ; =cardi_common
ldr r3, [r0, #0x1c]
ldr r2, [r0, #0x20]
ldr r1, [r0, #0x24]
add r3, r3, #0x200
add r2, r2, #0x200
subs r1, r1, #0x200
str r3, [r0, #0x1c]
str r2, [r0, #0x20]
str r1, [r0, #0x24]
bne _020D7828
mov r0, #0x80000
bl OS_DisableIrqMask
mov r0, #0x80000
bl OS_ResetRequestIrqMask
ldr r7, _020D7838 ; =cardi_common
bl CARDi_ReadRomIDCore
bl CARDi_CheckPulledOutCore
_020D77B8: ; 0x020D77B8
ldr r0, [r7, #0x0]
mov r1, #0x0
str r1, [r0, #0x0]
ldr r6, [r7, #0x38]
ldr r5, [r7, #0x3c]
bl OS_DisableInterrupts
ldr r1, [r7, #0x114]
mov r4, r0
bic r0, r1, #0x4c
str r0, [r7, #0x114]
add r0, r7, #0x10c
bl OS_WakeupThread
ldr r0, [r7, #0x114]
ands r0, r0, #0x10
beq _020D77FC
add r0, r7, #0x44
bl OS_WakeupThreadDirect
_020D77FC:
mov r0, r4
bl OS_RestoreInterrupts
_020D7804: ; 0x020D7804
cmp r6, #0x0
addeq sp, sp, #0x4
ldmeqia sp!, {r4-r7,lr}
bxeq lr
mov r0, r5
blx r6
add sp, sp, #0x4
ldmia sp!, {r4-r7,lr}
bx lr
_020D7828:
bl CARDi_SetCardDma
add sp, sp, #0x4
ldmia sp!, {r4-r7,lr}
bx lr
.balign 4
_020D7838: .word cardi_common
arm_func_start CARDi_SetCardDma
CARDi_SetCardDma: ; 0x020D783C
stmdb sp!, {r4,lr}
ldr r4, _020D7884 ; =cardi_common
ldr r1, _020D7888 ; =0x04100010
ldr r0, [r4, #0x28]
ldr r2, [r4, #0x20]
mov r3, #0x200
bl MIi_CardDmaCopy32
ldr r1, [r4, #0x1c]
mov r0, r1, lsr #0x8
orr r0, r0, #0xb7000000
mov r1, r1, lsl #0x18
bl CARDi_SetRomOp
ldr r0, _020D788C ; =UNK_021D5C00
ldr r1, _020D7890 ; =0x040001A4
ldr r0, [r0, #0x4]
str r0, [r1, #0x0]
ldmia sp!, {r4,lr}
bx lr
.balign 4
_020D7884: .word cardi_common
_020D7888: .word 0x04100010
_020D788C: .word UNK_021D5C00
_020D7890: .word 0x040001A4
arm_func_start CARDi_SetRomOp
CARDi_SetRomOp: ; 0x020D7894
ldr r3, _020D790C ; =0x040001A4
_020D7898:
ldr r2, [r3, #0x0]
ands r2, r2, #0x80000000
bne _020D7898
ldr r3, _020D7910 ; =0x040001A1
mov r12, #0xc0
ldr r2, _020D7914 ; =0x040001A8
strb r12, [r3, #0x0]
mov r12, r0, lsr #0x18
ldr r3, _020D7918 ; =0x040001A9
strb r12, [r2, #0x0]
mov r12, r0, lsr #0x10
ldr r2, _020D791C ; =0x040001AA
strb r12, [r3, #0x0]
mov r12, r0, lsr #0x8
ldr r3, _020D7920 ; =0x040001AB
strb r12, [r2, #0x0]
ldr r2, _020D7924 ; =0x040001AC
strb r0, [r3, #0x0]
mov r3, r1, lsr #0x18
ldr r0, _020D7928 ; =0x040001AD
strb r3, [r2, #0x0]
mov r3, r1, lsr #0x10
ldr r2, _020D792C ; =0x040001AE
strb r3, [r0, #0x0]
mov r3, r1, lsr #0x8
ldr r0, _020D7930 ; =0x040001AF
strb r3, [r2, #0x0]
strb r1, [r0, #0x0]
bx lr
.balign 4
_020D790C: .word 0x040001A4
_020D7910: .word 0x040001A1
_020D7914: .word 0x040001A8
_020D7918: .word 0x040001A9
_020D791C: .word 0x040001AA
_020D7920: .word 0x040001AB
_020D7924: .word 0x040001AC
_020D7928: .word 0x040001AD
_020D792C: .word 0x040001AE
_020D7930: .word 0x040001AF
arm_func_start CARDi_ReadFromCache
CARDi_ReadFromCache:
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
ldr r5, _020D79C8 ; =cardi_common
mov r1, #0x200
ldr r3, [r5, #0x1c]
rsb r1, r1, #0x0
ldr r2, [r0, #0x8]
and r3, r3, r1
cmp r3, r2
bne _020D79AC
ldr r2, [r5, #0x1c]
ldr r1, [r5, #0x24]
sub r3, r2, r3
rsb r4, r3, #0x200
cmp r4, r1
movhi r4, r1
add r0, r0, #0x20
ldr r1, [r5, #0x20]
mov r2, r4
add r0, r0, r3
bl MI_CpuCopy8
ldr r0, [r5, #0x1c]
add r0, r0, r4
str r0, [r5, #0x1c]
ldr r0, [r5, #0x20]
add r0, r0, r4
str r0, [r5, #0x20]
ldr r0, [r5, #0x24]
sub r0, r0, r4
str r0, [r5, #0x24]
_020D79AC:
ldr r0, [r5, #0x24]
cmp r0, #0x0
movne r0, #0x1
moveq r0, #0x0
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
.balign 4
_020D79C8: .word cardi_common
|