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
|
.include "asm/macros.inc"
.include "global.inc"
.section .bss
.global CTRDGi_Work
CTRDGi_Work: ;0x03809FB8
.space 0x03809FBC - 0x03809FB8
.section .text
arm_func_start CTRDGi_SendtoPxi
CTRDGi_SendtoPxi: ;@ 0x038038C0
stmdb sp!, {r4, r5, r6, r7, lr}
sub sp, sp, #4
mov r7, r0
mov r6, #1
mov r5, #13
mov r4, #0
b _038038E4
_038038DC:
mov r0, r6
bl FUN_037F8CB4
_038038E4:
mov r0, r5
mov r1, r7
mov r2, r4
bl PXI_SendWordByFifo
cmp r0, #0
bne _038038DC
add sp, sp, #4
ldmia sp!, {r4, r5, r6, r7, lr}
bx lr
arm_func_start CTRDGi_UnlockByProcessor
CTRDGi_UnlockByProcessor: ;@ 0x03803908
stmdb sp!, {r4, lr}
mov r4, r1
ldr r1, [r4]
cmp r1, #0
bne _03803920
bl OS_UnLockCartridge
_03803920:
ldr r0, [r4, #4]
bl OS_RestoreInterrupts
ldmia sp!, {r4, lr}
bx lr
arm_func_start CTRDGi_LockByProcessor
CTRDGi_LockByProcessor: ;@ 0x03803930
stmdb sp!, {r4, r5, lr}
sub sp, sp, #4
mov r5, r0
mov r4, r1
bl OS_DisableInterrupts
str r0, [r4, #4]
ldr r0, _0380398C ;@ =0x027FFFE8
bl OS_ReadOwnerOfLockWord
and r0, r0, #128 ;@ 0x80
str r0, [r4]
ldr r0, [r4]
cmp r0, #0
bne _03803974
mov r0, r5
bl OS_TryLockCartridge
cmp r0, #0
bne _0380397C
_03803974:
mov r0, #1
b _03803980
_0380397C:
mov r0, #0
_03803980:
add sp, sp, #4
ldmia sp!, {r4, r5, lr}
bx lr
_0380398C: .word 0x027FFFE8
arm_func_start CTRDGi_RestoreAccessCycle
CTRDGi_RestoreAccessCycle: ;@ 0x03803990
ldr r3, [r0]
ldr r2, _038039C0 ;@ =0x04000204
ldrh r1, [r2]
bic r1, r1, #12
orr r1, r1, r3, lsl #2
strh r1, [r2]
ldr r1, [r0, #4]
ldrh r0, [r2]
bic r0, r0, #16
orr r0, r0, r1, lsl #4
strh r0, [r2]
bx lr
_038039C0: .word 0x04000204
arm_func_start CTRDGi_ChangeLatestAccessCycle
CTRDGi_ChangeLatestAccessCycle: ;@ 0x038039C4
ldr r2, _03803A08 ;@ =0x04000204
ldrh r1, [r2]
and r1, r1, #12
mov r1, r1, asr #2
str r1, [r0]
ldrh r1, [r2]
and r1, r1, #16
mov r1, r1, asr #4
str r1, [r0, #4]
ldrh r0, [r2]
bic r0, r0, #12
orr r0, r0, #12
strh r0, [r2]
ldrh r0, [r2]
bic r0, r0, #16
strh r0, [r2]
bx lr
_03803A08: .word 0x04000204
arm_func_start CTRDG_IsExisting
CTRDG_IsExisting: ;@ 0x03803A0C
stmdb sp!, {r4, lr}
sub sp, sp, #16
mov r4, #1
ldr r2, _03803B20 ;@ =0x027FFC30
ldrh r1, [r2]
ldr r0, _03803B24 ;@ =0x0000FFFF
cmp r1, r0
moveq r0, #0
beq _03803B14
ldrb r0, [r2, #5]
mov r0, r0, lsl #30
mov r0, r0, lsr #31
cmp r0, #1
moveq r0, #0
beq _03803B14
ldr r0, _03803B28 ;@ =CTRDGi_Work
ldrh r0, [r0, #2]
add r1, sp, #0
bl CTRDGi_LockByProcessor
cmp r0, #0
bne _03803A70
ldr r0, [sp, #4]
bl OS_RestoreInterrupts
mov r0, r4
b _03803B14
_03803A70:
add r0, sp, #8
bl CTRDGi_ChangeLatestAccessCycle
mov r2, #134217728 ;@ 0x8000000
ldrb r3, [r2, #178] ;@ 0xb2
cmp r3, #150 ;@ 0x96
bne _03803A9C
ldr r0, _03803B20 ;@ =0x027FFC30
ldrh r1, [r0]
ldrh r0, [r2, #190] ;@ 0xbe
cmp r1, r0
bne _03803AE4
_03803A9C:
cmp r3, #150 ;@ 0x96
beq _03803ABC
ldr r0, _03803B20 ;@ =0x027FFC30
ldrh r1, [r0]
ldr r0, _03803B2C ;@ =0x0801FFFE
ldrh r0, [r0]
cmp r1, r0
bne _03803AE4
_03803ABC:
ldr r2, _03803B20 ;@ =0x027FFC30
ldr r1, [r2, #8]
mov r0, #134217728 ;@ 0x8000000
ldr r0, [r0, #172] ;@ 0xac
cmp r1, r0
beq _03803AF8
ldrb r0, [r2, #5]
mov r0, r0, lsl #31
movs r0, r0, lsr #31
beq _03803AF8
_03803AE4:
ldr r1, _03803B20 ;@ =0x027FFC30
ldrb r0, [r1, #5]
orr r0, r0, #2
strb r0, [r1, #5]
mov r4, #0
_03803AF8:
add r0, sp, #8
bl CTRDGi_RestoreAccessCycle
ldr r0, _03803B28 ;@ =CTRDGi_Work
ldrh r0, [r0, #2]
add r1, sp, #0
bl CTRDGi_UnlockByProcessor
mov r0, r4
_03803B14:
add sp, sp, #16
ldmia sp!, {r4, lr}
bx lr
_03803B20: .word 0x027FFC30
_03803B24: .word 0x0000FFFF
_03803B28: .word CTRDGi_Work
_03803B2C: .word 0x0801FFFE
arm_func_start CTRDG_IsPulledOut
CTRDG_IsPulledOut: ;@ 0x03803B30
stmfd sp!, {lr}
sub sp, sp, #4
ldr r2, _03803B80 ;@ =0x027FFC30
ldrh r1, [r2]
ldr r0, _03803B84 ;@ =0x0000FFFF
cmp r1, r0
moveq r0, #0
beq _03803B74
ldrb r0, [r2, #5]
mov r0, r0, lsl #30
movs r0, r0, lsr #31
bne _03803B64
bl CTRDG_IsExisting
_03803B64:
ldr r0, _03803B80 ;@ =0x027FFC30
ldrb r0, [r0, #5]
mov r0, r0, lsl #30
mov r0, r0, lsr #31
_03803B74:
add sp, sp, #4
ldmia sp!, {lr}
bx lr
_03803B80: .word 0x027FFC30
_03803B84: .word 0x0000FFFF
arm_func_start CTRDGi_InitCommon
CTRDGi_InitCommon: ;@ 0x03803B88
stmfd sp!, {lr}
sub sp, sp, #4
mov r0, #0
str r0, [sp]
add r0, sp, #0
ldr r1, _03803BC0 ;@ =CTRDGi_Work
ldr r2, _03803BC4 ;@ =0x05000001
bl FUN_03803BC8
bl OS_GetLockID
ldr r1, _03803BC0 ;@ =CTRDGi_Work
strh r0, [r1, #2]
add sp, sp, #4
ldmia sp!, {lr}
bx lr
_03803BC0: .word CTRDGi_Work
_03803BC4: .word 0x05000001
arm_func_start FUN_03803BC8
FUN_03803BC8: ;@ 0x03803BC8
ldr ip, _03803BD0 ;@ =SVC_CpuSet
bx ip
_03803BD0: .word SVC_CpuSet
|