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
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
|
.include "asm/macros.inc"
.include "global.inc"
.section .bss
.global _03809764
_03809764: ;0x03809764
.space 0x03809774 - 0x03809764
.section .text
arm_func_start CARDi_SetWriteProtectCore
CARDi_SetWriteProtectCore: ; 0x03800034
stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
sub sp, sp, #8
mov r4, r0
bl CARDi_WaitPrevCommand
cmp r0, #0
beq _038000BC
ldr r0, _038000C8 ; =cardi_common
ldr sl, [r0]
mov r9, #10
mov r0, #1
strb r0, [sp]
strb r4, [sp, #1]
mov r8, #2
add r7, sp, #0
mov r6, #0
ldr r5, _038000CC ; =CARDi_CommWriteCore
mov r4, #5
_03800078:
bl CARDi_WriteEnable
mov r0, r8
bl CARDi_CommandBegin
mov r0, r7
mov r1, r6
mov r2, r8
mov r3, r5
bl CARDi_CommArray
mov r0, r4
mov r1, r6
bl CARDi_CommandEnd
ldr r0, [sl]
cmp r0, #4
bne _038000BC
sub r9, r9, #1
cmp r9, #0
bgt _03800078
_038000BC:
add sp, sp, #8
ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
bx lr
_038000C8: .word cardi_common
_038000CC: .word CARDi_CommWriteCore
arm_func_start CARDi_EraseChipCore
CARDi_EraseChipCore: ; 0x038000D0
stmdb sp!, {r4, lr}
bl CARDi_WaitPrevCommand
cmp r0, #0
beq _03800114
ldr r0, _0380011C ; =cardi_common
ldr r4, [r0]
bl CARDi_WriteEnable
mov r0, #1
bl CARDi_CommandBegin
ldr r0, _03800120 ; =_038072BC
mov r1, #0
mov r2, #1
ldr r3, _03800124 ; =CARDi_CommWriteCore
bl CARDi_CommArray
ldr r0, [r4, #52] ; 0x34
ldr r1, [r4, #56] ; 0x38
bl CARDi_CommandEnd
_03800114:
ldmia sp!, {r4, lr}
bx lr
_0380011C: .word cardi_common
_03800120: .word _038072BC
_03800124: .word CARDi_CommWriteCore
arm_func_start CARDi_EraseBackupSectorCore
CARDi_EraseBackupSectorCore: ; 0x03800128
stmdb sp!, {r4, r5, r6, r7, r8, lr}
mov r7, r0
mov r6, r1
ldr r0, _038001B8 ; =cardi_common
ldr r5, [r0]
ldr r4, [r5, #28]
sub r1, r4, #1
orr r0, r7, r6
ands r0, r1, r0
movne r0, #2
strne r0, [r5]
bne _038001B0
bl CARDi_WaitPrevCommand
cmp r0, #0
beq _038001B0
mov r8, #216 ; 0xd8
b _038001A8
_0380016C:
bl CARDi_WriteEnable
ldr r0, [r5, #36] ; 0x24
add r0, r0, #1
bl CARDi_CommandBegin
mov r0, r7
mov r1, r8
bl CARDi_SendSpiAddressingCommand
ldr r0, [r5, #60] ; 0x3c
ldr r1, [r5, #64] ; 0x40
bl CARDi_CommandEnd
ldr r0, [r5]
cmp r0, #0
bne _038001B0
add r7, r7, r4
sub r6, r6, r4
_038001A8:
cmp r6, #0
bne _0380016C
_038001B0:
ldmia sp!, {r4, r5, r6, r7, r8, lr}
bx lr
_038001B8: .word cardi_common
arm_func_start CARDi_VerifyBackupCore
CARDi_VerifyBackupCore: ; 0x038001BC
stmdb sp!, {r4, r5, r6, r7, lr}
sub sp, sp, #4
mov r7, r0
mov r6, r1
mov r5, r2
bl CARDi_WaitPrevCommand
cmp r0, #0
beq _0380024C
ldr r0, _03800258 ; =cardi_common
ldr r4, [r0]
mov r1, #1
ldr r0, _0380025C ; =_03809764
str r1, [r0, #12]
ldr r0, [r4, #36] ; 0x24
add r0, r0, #1
add r0, r0, r5
bl CARDi_CommandBegin
mov r0, r7
mov r1, #3
bl CARDi_SendSpiAddressingCommand
mov r0, r6
mov r1, #0
mov r2, r5
ldr r3, _03800260 ; =CARDi_CommVerifyCore
bl CARDi_CommArray
mov r0, #0
mov r1, r0
bl CARDi_CommandEnd
ldr r0, [r4]
cmp r0, #0
bne _0380024C
ldr r0, _0380025C ; =_03809764
ldr r0, [r0, #12]
cmp r0, #0
moveq r0, #1
streq r0, [r4]
_0380024C:
add sp, sp, #4
ldmia sp!, {r4, r5, r6, r7, lr}
bx lr
_03800258: .word cardi_common
_0380025C: .word _03809764
_03800260: .word CARDi_CommVerifyCore
arm_func_start CARDi_WriteBackupCore
CARDi_WriteBackupCore: ; 0x03800264
stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
sub sp, sp, #4
mov sl, r0
mov r9, r1
mov r8, r2
bl CARDi_WaitPrevCommand
cmp r0, #0
beq _03800314
ldr r0, _03800320 ; =cardi_common
ldr r7, [r0]
ldr r6, [r7, #32]
sub r4, r6, #1
mov fp, #10
mov r0, #0
str r0, [sp]
b _0380030C
_038002A4:
and r0, sl, r4
sub r5, r6, r0
cmp r5, r8
movhi r5, r8
bl CARDi_WriteEnable
ldr r0, [r7, #36] ; 0x24
add r0, r0, #1
add r0, r0, r5
bl CARDi_CommandBegin
mov r0, sl
mov r1, fp
bl CARDi_SendSpiAddressingCommand
mov r0, r9
ldr r1, [sp]
mov r2, r5
ldr r3, _03800324 ; =CARDi_CommWriteCore
bl CARDi_CommArray
ldr r0, [r7, #44] ; 0x2c
ldr r1, [r7, #48] ; 0x30
bl CARDi_CommandEnd
ldr r0, [r7]
cmp r0, #0
bne _03800314
add r9, r9, r5
add sl, sl, r5
sub r8, r8, r5
_0380030C:
cmp r8, #0
bne _038002A4
_03800314:
add sp, sp, #4
ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
bx lr
_03800320: .word cardi_common
_03800324: .word CARDi_CommWriteCore
arm_func_start CARDi_ProgramBackupCore
CARDi_ProgramBackupCore: ; 0x03800328
stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
sub sp, sp, #4
mov sl, r0
mov r9, r1
mov r8, r2
bl CARDi_WaitPrevCommand
cmp r0, #0
beq _038003D8
ldr r0, _038003E4 ; =cardi_common
ldr r7, [r0]
ldr r6, [r7, #32]
sub r4, r6, #1
mov r0, #2
str r0, [sp]
mov fp, #0
b _038003D0
_03800368:
and r0, sl, r4
sub r5, r6, r0
cmp r5, r8
movhi r5, r8
bl CARDi_WriteEnable
ldr r0, [r7, #36] ; 0x24
add r0, r0, #1
add r0, r0, r5
bl CARDi_CommandBegin
mov r0, sl
ldr r1, [sp]
bl CARDi_SendSpiAddressingCommand
mov r0, r9
mov r1, fp
mov r2, r5
ldr r3, _038003E8 ; =CARDi_CommWriteCore
bl CARDi_CommArray
ldr r0, [r7, #40] ; 0x28
mov r1, fp
bl CARDi_CommandEnd
ldr r0, [r7]
cmp r0, #0
bne _038003D8
add r9, r9, r5
add sl, sl, r5
sub r8, r8, r5
_038003D0:
cmp r8, #0
bne _03800368
_038003D8:
add sp, sp, #4
ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
bx lr
_038003E4: .word cardi_common
_038003E8: .word CARDi_CommWriteCore
arm_func_start CARDi_ReadBackupCore
CARDi_ReadBackupCore: ; 0x038003EC
stmdb sp!, {r4, r5, r6, lr}
mov r6, r0
mov r5, r1
mov r4, r2
bl CARDi_WaitPrevCommand
cmp r0, #0
beq _0380044C
ldr r0, _03800454 ; =cardi_common
ldr r0, [r0]
ldr r0, [r0, #36] ; 0x24
add r0, r0, #1
add r0, r0, r4
bl CARDi_CommandBegin
mov r0, r6
mov r1, #3
bl CARDi_SendSpiAddressingCommand
mov r0, #0
mov r1, r5
mov r2, r4
ldr r3, _03800458 ; =CARDi_CommReadCore
bl CARDi_CommArray
mov r0, #0
mov r1, r0
bl CARDi_CommandEnd
_0380044C:
ldmia sp!, {r4, r5, r6, lr}
bx lr
_03800454: .word cardi_common
_03800458: .word CARDi_CommReadCore
arm_func_start CARDi_InitStatusRegister
CARDi_InitStatusRegister: ; 0x0380045C
stmdb sp!, {r4, lr}
sub sp, sp, #8
ldr r0, _038004F8 ; =cardi_common
ldr r0, [r0]
ldrb r4, [r0, #72] ; 0x48
cmp r4, #255 ; 0xff
beq _038004EC
ldr r0, _038004FC ; =_03809760
ldr r0, [r0]
cmp r0, #0
bne _038004EC
mov r0, #5
strb r0, [sp]
mov r0, #2
bl CARDi_CommandBegin
add r0, sp, #0
mov r1, #0
mov r2, #1
ldr r3, _03800500 ; =CARDi_CommWriteCore
bl CARDi_CommArray
mov r0, #0
add r1, sp, #1
mov r2, #1
ldr r3, _03800504 ; =CARDi_CommReadCore
bl CARDi_CommArray
mov r0, #0
mov r1, r0
bl CARDi_CommandEnd
ldrb r0, [sp, #1]
cmp r0, r4
beq _038004E0
mov r0, r4
bl CARDi_SetWriteProtectCore
_038004E0:
mov r1, #1
ldr r0, _038004FC ; =_03809760
str r1, [r0]
_038004EC:
add sp, sp, #8
ldmia sp!, {r4, lr}
bx lr
_038004F8: .word cardi_common
_038004FC: .word _03809760
_03800500: .word CARDi_CommWriteCore
_03800504: .word CARDi_CommReadCore
arm_func_start CARDi_SendSpiAddressingCommand
CARDi_SendSpiAddressingCommand: ; 0x03800508
stmfd sp!, {lr}
sub sp, sp, #4
ldr r2, _038005AC ; =cardi_common
ldr r2, [r2]
ldr r2, [r2, #36] ; 0x24
cmp r2, #1
beq _03800538
cmp r2, #2
beq _03800554
cmp r2, #3
beq _0380056C
b _0380058C
_03800538:
and r3, r0, #255 ; 0xff
mov r0, r0, lsr #5
and r0, r0, #8
orr r0, r1, r0
orr r0, r0, r3, lsl #8
str r0, [sp]
b _0380058C
_03800554:
and r3, r0, #255 ; 0xff
and r0, r0, #65280 ; 0xff00
orr r0, r1, r0
orr r0, r0, r3, lsl #16
str r0, [sp]
b _0380058C
_0380056C:
and ip, r0, #255 ; 0xff
and r3, r0, #65280 ; 0xff00
mov r0, r0, lsr #8
and r0, r0, #65280 ; 0xff00
orr r0, r1, r0
orr r0, r0, r3, lsl #8
orr r0, r0, ip, lsl #24
str r0, [sp]
_0380058C:
add r0, sp, #0
mov r1, #0
add r2, r2, #1
ldr r3, _038005B0 ; =CARDi_CommWriteCore
bl CARDi_CommArray
add sp, sp, #4
ldmia sp!, {lr}
bx lr
_038005AC: .word cardi_common
_038005B0: .word CARDi_CommWriteCore
arm_func_start CARDi_WriteEnable
CARDi_WriteEnable: ; 0x038005B4
stmfd sp!, {lr}
sub sp, sp, #4
mov r0, #1
bl CARDi_CommandBegin
ldr r0, _038005F0 ; =_038072C0
mov r1, #0
mov r2, #1
ldr r3, _038005F4 ; =CARDi_CommWriteCore
bl CARDi_CommArray
mov r0, #0
mov r1, r0
bl CARDi_CommandEnd
add sp, sp, #4
ldmia sp!, {lr}
bx lr
_038005F0: .word _038072C0
_038005F4: .word CARDi_CommWriteCore
arm_func_start CARDi_CommVerifyCore
CARDi_CommVerifyCore: ; 0x038005F8
mov r2, #0
ldr r1, _03800658 ; =0x040001A2
strh r2, [r1]
ldr r2, _0380065C ; =0x040001A0
_03800608:
ldrh r1, [r2]
ands r1, r1, #128 ; 0x80
bne _03800608
ldr r1, _03800658 ; =0x040001A2
ldrh r1, [r1]
and r2, r1, #255 ; 0xff
ldr r1, [r0, #4]
ldrb r1, [r1]
cmp r2, r1
beq _03800648
mov r1, #0
str r1, [r0, #12]
ldr r1, [r0]
cmp r1, #1
movhi r1, #1
strhi r1, [r0]
_03800648:
ldr r1, [r0, #4]
add r1, r1, #1
str r1, [r0, #4]
bx lr
_03800658: .word 0x040001A2
_0380065C: .word 0x040001A0
arm_func_start CARDi_CommWriteCore
CARDi_CommWriteCore: ; 0x03800660
sub sp, sp, #8
ldr r1, [r0, #4]
ldrb r2, [r1]
ldr r1, _038006A4 ; =0x040001A2
strh r2, [r1]
ldr r1, [r0, #4]
add r1, r1, #1
str r1, [r0, #4]
ldr r1, _038006A8 ; =0x040001A0
_03800684:
ldrh r0, [r1]
ands r0, r0, #128 ; 0x80
bne _03800684
ldr r0, _038006A4 ; =0x040001A2
ldrh r0, [r0]
strh r0, [sp]
add sp, sp, #8
bx lr
_038006A4: .word 0x040001A2
_038006A8: .word 0x040001A0
arm_func_start CARDi_CommReadCore
CARDi_CommReadCore: ; 0x038006AC
mov r2, #0
ldr r1, _038006E8 ; =0x040001A2
strh r2, [r1]
ldr r2, _038006EC ; =0x040001A0
_038006BC:
ldrh r1, [r2]
ands r1, r1, #128 ; 0x80
bne _038006BC
ldr r1, _038006E8 ; =0x040001A2
ldrh r2, [r1]
ldr r1, [r0, #8]
strb r2, [r1]
ldr r1, [r0, #8]
add r1, r1, #1
str r1, [r0, #8]
bx lr
_038006E8: .word 0x040001A2
_038006EC: .word 0x040001A0
arm_func_start CARDi_CommArray
CARDi_CommArray: ; 0x038006F0
stmdb sp!, {r4, r5, r6, r7, r8, lr}
mov r7, r2
mov r6, r3
ldr r5, _03800774 ; =_03809764
str r0, [r5, #4]
str r1, [r5, #8]
ldr r0, _03800778 ; =0x0000A040
ldr r4, _0380077C ; =0x040001A0
strh r0, [r4]
mov r8, #40960 ; 0xa000
b _03800750
_0380071C:
ldr r0, [r5]
sub r0, r0, #1
str r0, [r5]
ldr r0, [r5]
cmp r0, #0
streqh r8, [r4]
_03800734:
ldrh r0, [r4]
ands r0, r0, #128 ; 0x80
bne _03800734
mov r0, r5
mov lr, pc
bx r6
sub r7, r7, #1
_03800750:
cmp r7, #0
bne _0380071C
ldr r0, [r5]
cmp r0, #0
moveq r1, #0
ldreq r0, _0380077C ; =0x040001A0
streqh r1, [r0]
ldmia sp!, {r4, r5, r6, r7, r8, lr}
bx lr
_03800774: .word _03809764
_03800778: .word 0x0000A040
_0380077C: .word 0x040001A0
arm_func_start CARDi_WaitPrevCommand
CARDi_WaitPrevCommand: ; 0x03800780
stmfd sp!, {lr}
sub sp, sp, #4
mov r0, #0
mov r1, #50 ; 0x32
bl CARDi_CommandEnd
ldr r0, _038007C0 ; =cardi_common
ldr r1, [r0]
ldr r0, [r1]
cmp r0, #4
moveq r0, #6
streq r0, [r1]
moveq r0, #0
movne r0, #1
add sp, sp, #4
ldmia sp!, {lr}
bx lr
_038007C0: .word cardi_common
arm_func_start CARDi_CommandCheckBusy
CARDi_CommandCheckBusy: ; 0x038007C4
stmfd sp!, {lr}
sub sp, sp, #4
mov r0, #2
bl CARDi_CommandBegin
ldr r0, _03800824 ; =_038072C4
mov r1, #0
mov r2, #1
ldr r3, _03800828 ; =CARDi_CommWriteCore
bl CARDi_CommArray
mov r0, #0
add r1, sp, #0
mov r2, #1
ldr r3, _0380082C ; =CARDi_CommReadCore
bl CARDi_CommArray
mov r0, #0
mov r1, r0
bl CARDi_CommandEnd
ldrb r0, [sp]
ands r0, r0, #1
moveq r0, #1
movne r0, #0
add sp, sp, #4
ldmia sp!, {lr}
bx lr
_03800824: .word _038072C4
_03800828: .word CARDi_CommWriteCore
_0380082C: .word CARDi_CommReadCore
arm_func_start CARDi_CommandEnd
CARDi_CommandEnd: ; 0x03800830
stmdb sp!, {r4, r5, r6, lr}
mov r5, r0
mov r4, r1
adds r1, r5, r4
beq _038008A8
cmp r5, #0
beq _03800850
bl OS_Sleep
_03800850:
cmp r4, #0
beq _03800890
sub r6, r4, r5
mov r4, #5
b _0380087C
_03800864:
cmp r6, #5
movlt r5, r6
movge r5, r4
mov r0, r5
bl OS_Sleep
sub r6, r6, r5
_0380087C:
bl CARDi_CommandCheckBusy
cmp r0, #0
bne _03800890
cmp r6, #0
bgt _03800864
_03800890:
bl CARDi_CommandCheckBusy
cmp r0, #0
moveq r1, #4
ldreq r0, _038008B0 ; =cardi_common
ldreq r0, [r0]
streq r1, [r0]
_038008A8:
ldmia sp!, {r4, r5, r6, lr}
bx lr
_038008B0: .word cardi_common
arm_func_start CARDi_CommandBegin
CARDi_CommandBegin: ; 0x038008B4
ldr r1, _038008C0 ; =_03809764
str r0, [r1]
bx lr
_038008C0: .word _03809764
|