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
|
.include "asm/macros.inc"
.include "global.inc"
.bss
.global wcmCpsifw
wcmCpsifw: ; 0x021CA870
.space 0x2C
.text
arm_func_start WcmCpsifUnlockMutexInIRQ
WcmCpsifUnlockMutexInIRQ: ; 0x020A8534
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r2, [r0, #0x8]
ldr r1, _020A858C ; =OS_IrqHandler
cmp r2, r1
addne sp, sp, #0x4
ldmneia sp!, {lr}
bxne lr
ldr r1, [r0, #0xc]
sub r1, r1, #0x1
str r1, [r0, #0xc]
ldr r1, [r0, #0xc]
cmp r1, #0x0
addne sp, sp, #0x4
ldmneia sp!, {lr}
bxne lr
mov r1, #0x0
str r1, [r0, #0x8]
bl OS_WakeupThread
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020A858C: .word OS_IrqHandler
arm_func_start WcmCpsifTryLockMutexInIRQ
WcmCpsifTryLockMutexInIRQ: ; 0x020A8590
ldr r2, [r0, #0x8]
cmp r2, #0x0
bne _020A85B8
ldr r1, _020A85D8 ; =OS_IrqHandler
str r1, [r0, #0x8]
ldr r1, [r0, #0xc]
add r1, r1, #0x1
str r1, [r0, #0xc]
mov r0, #0x1
bx lr
_020A85B8:
ldr r1, _020A85D8 ; =OS_IrqHandler
cmp r2, r1
ldreq r1, [r0, #0xc]
addeq r1, r1, #0x1
streq r1, [r0, #0xc]
moveq r0, #0x1
movne r0, #0x0
bx lr
.balign 4
_020A85D8: .word OS_IrqHandler
arm_func_start WcmCpsifKACallback
WcmCpsifKACallback: ; 0x020A85DC
ldr ip, _020A85E8 ; =WcmCpsifUnlockMutexInIRQ
ldr r0, _020A85EC ; =wcmCpsifw+0xC
bx r12
.balign 4
_020A85E8: .word WcmCpsifUnlockMutexInIRQ
_020A85EC: .word wcmCpsifw+0xC
arm_func_start WcmCpsifWmCallback
WcmCpsifWmCallback: ; 0x020A85F0
stmdb sp!, {lr}
sub sp, sp, #0x4
ldrh r1, [r0, #0x0]
cmp r1, #0x12
addne sp, sp, #0x4
ldmneia sp!, {lr}
bxne lr
ldrh r2, [r0, #0x2]
ldr r1, _020A863C ; =wcmCpsifw
str r2, [r1, #0x24]
ldrh r0, [r0, #0x2]
cmp r0, #0x0
bne _020A8628
bl WCMi_ResetKeepAliveAlarm
_020A8628:
ldr r0, _020A8640 ; =wcmCpsifw+0x4
bl OS_WakeupThread
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020A863C: .word wcmCpsifw
_020A8640: .word wcmCpsifw+0x4
arm_func_start WCM_SendDCFData
WCM_SendDCFData: ; 0x020A8644
stmdb sp!, {r4-r8,lr}
mov r8, r0
mov r7, r1
mov r6, r2
bl OS_DisableInterrupts
mov r5, r0
bl WCMi_GetSystemWork
cmp r0, #0x0
bne _020A867C
mov r0, r5
bl OS_RestoreInterrupts
mvn r0, #0x0
ldmia sp!, {r4-r8,lr}
bx lr
_020A867C:
ldr r0, _020A87AC ; =wcmCpsifw+0xC
bl OS_LockMutex
bl WCMi_GetSystemWork
movs r4, r0
bne _020A86AC
ldr r0, _020A87AC ; =wcmCpsifw+0xC
bl OS_UnlockMutex
mov r0, r5
bl OS_RestoreInterrupts
mvn r0, #0x0
ldmia sp!, {r4-r8,lr}
bx lr
_020A86AC:
add r0, r4, #0x2000
ldr r1, [r0, #0x260]
cmp r1, #0x9
bne _020A86C8
ldrb r0, [r0, #0x26b]
cmp r0, #0x1
bne _020A86E4
_020A86C8:
ldr r0, _020A87AC ; =wcmCpsifw+0xC
bl OS_UnlockMutex
mov r0, r5
bl OS_RestoreInterrupts
mvn r0, #0x3
ldmia sp!, {r4-r8,lr}
bx lr
_020A86E4:
mov r0, r7
mov r2, r6
add r1, r4, #0xf00
bl MI_CpuCopy8
mov r3, r6, lsl #0x10
ldr r0, _020A87B0 ; =WcmCpsifWmCallback
mov r1, r8
add r2, r4, #0xf00
mov r3, r3, lsr #0x10
bl WM_SetDCFData
cmp r0, #0x8
addls pc, pc, r0, lsl #0x2
b _020A873C
_020A8718: ; jump table
b _020A873C ; case 0
b _020A873C ; case 1
b _020A8758 ; case 2
b _020A873C ; case 3
b _020A873C ; case 4
b _020A873C ; case 5
b _020A873C ; case 6
b _020A873C ; case 7
b _020A873C ; case 8
_020A873C:
ldr r0, _020A87AC ; =wcmCpsifw+0xC
bl OS_UnlockMutex
mov r0, r5
bl OS_RestoreInterrupts
mvn r0, #0x4
ldmia sp!, {r4-r8,lr}
bx lr
_020A8758:
ldr r0, _020A87B4 ; =wcmCpsifw+0x4
bl OS_SleepThread
ldr r0, _020A87B8 ; =wcmCpsifw
ldr r0, [r0, #0x24]
cmp r0, #0x0
beq _020A8790
cmp r0, #0x1
ldr r0, _020A87AC ; =wcmCpsifw+0xC
bl OS_UnlockMutex
mov r0, r5
bl OS_RestoreInterrupts
mvn r0, #0x4
ldmia sp!, {r4-r8,lr}
bx lr
_020A8790:
ldr r0, _020A87AC ; =wcmCpsifw+0xC
bl OS_UnlockMutex
mov r0, r5
bl OS_RestoreInterrupts
mov r0, r6
ldmia sp!, {r4-r8,lr}
bx lr
.balign 4
_020A87AC: .word wcmCpsifw+0xC
_020A87B0: .word WcmCpsifWmCallback
_020A87B4: .word wcmCpsifw+0x4
_020A87B8: .word wcmCpsifw
arm_func_start WCM_SetRecvDCFCallback
WCM_SetRecvDCFCallback: ; 0x020A87BC
stmdb sp!, {r4,lr}
mov r4, r0
bl OS_DisableInterrupts
ldr r1, _020A87DC ; =wcmCpsifw
str r4, [r1, #0x28]
bl OS_RestoreInterrupts
ldmia sp!, {r4,lr}
bx lr
.balign 4
_020A87DC: .word wcmCpsifw
arm_func_start WCM_GetApEssid
WCM_GetApEssid: ; 0x020A87E0
stmdb sp!, {r4-r7,lr}
sub sp, sp, #0x4
mov r7, #0x0
mov r4, r0
mov r6, r7
bl WCMi_GetSystemWork
mov r5, r0
bl OS_DisableInterrupts
cmp r5, #0x0
beq _020A8830
add r1, r5, #0x2000
ldr r2, [r1, #0x260]
cmp r2, #0x9
bne _020A8830
ldrb r1, [r1, #0x26b]
cmp r1, #0x0
addeq r2, r5, #0x2100
ldreq r1, _020A884C ; =0x0000214C
ldreqh r6, [r2, #0x4a]
addeq r7, r5, r1
_020A8830:
bl OS_RestoreInterrupts
cmp r4, #0x0
strneh r6, [r4, #0x0]
mov r0, r7
add sp, sp, #0x4
ldmia sp!, {r4-r7,lr}
bx lr
.balign 4
_020A884C: .word 0x0000214C
arm_func_start WCM_GetApMacAddress
WCM_GetApMacAddress:
stmdb sp!, {r4-r5,lr}
sub sp, sp, #0x4
mov r5, #0x0
bl WCMi_GetSystemWork
mov r4, r0
bl OS_DisableInterrupts
cmp r4, #0x0
beq _020A8890
add r1, r4, #0x2000
ldr r2, [r1, #0x260]
cmp r2, #0x9
bne _020A8890
ldrb r1, [r1, #0x26b]
cmp r1, #0x0
ldreq r1, _020A88A4 ; =0x00002144
addeq r5, r4, r1
_020A8890:
bl OS_RestoreInterrupts
mov r0, r5
add sp, sp, #0x4
ldmia sp!, {r4-r5,lr}
bx lr
.balign 4
_020A88A4: .word 0x00002144
arm_func_start WCMi_CpsifSendNullPacket
WCMi_CpsifSendNullPacket: ; 0x020A88A8
stmdb sp!, {r4,lr}
bl WCMi_GetSystemWork
movs r4, r0
ldmeqia sp!, {r4,lr}
bxeq lr
add r0, r4, #0x2000
ldr r1, [r0, #0x260]
cmp r1, #0x9
ldmneia sp!, {r4,lr}
bxne lr
ldrb r0, [r0, #0x26b]
cmp r0, #0x1
ldmeqia sp!, {r4,lr}
bxeq lr
ldr r0, _020A8928 ; =wcmCpsifw+0xC
bl WcmCpsifTryLockMutexInIRQ
cmp r0, #0x0
ldmeqia sp!, {r4,lr}
bxeq lr
ldr r1, _020A892C ; =0x00002144
ldr r0, _020A8930 ; =WcmCpsifKACallback
add r1, r4, r1
add r2, r4, #0xf00
mov r3, #0x0
bl WM_SetDCFData
cmp r0, #0x2
ldmeqia sp!, {r4,lr}
bxeq lr
ldr r0, _020A8928 ; =wcmCpsifw+0xC
bl WcmCpsifUnlockMutexInIRQ
ldmia sp!, {r4,lr}
bx lr
.balign 4
_020A8928: .word wcmCpsifw+0xC
_020A892C: .word 0x00002144
_020A8930: .word WcmCpsifKACallback
arm_func_start WCMi_CpsifRecvCallback
WCMi_CpsifRecvCallback: ; 0x020A8934
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r1, _020A8978 ; =wcmCpsifw
mov r2, r0
ldr r12, [r1, #0x28]
cmp r12, #0x0
addeq sp, sp, #0x4
ldmeqia sp!, {lr}
bxeq lr
ldrh r3, [r2, #0x6]
add r0, r2, #0x1e
add r1, r2, #0x18
add r2, r2, #0x2c
blx r12
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020A8978: .word wcmCpsifw
arm_func_start WCMi_InitCpsif
WCMi_InitCpsif: ; 0x020A897C
stmdb sp!, {lr}
sub sp, sp, #0x4
ldr r1, _020A89C8 ; =wcmCpsifw
ldrb r0, [r1, #0x0]
cmp r0, #0x0
addne sp, sp, #0x4
ldmneia sp!, {lr}
bxne lr
ldr r0, _020A89CC ; =wcmCpsifw+0xC
mov r2, #0x0
mov r3, #0x1
strb r3, [r1, #0x0]
str r2, [r1, #0x24]
str r2, [r1, #0x8]
str r2, [r1, #0x4]
bl OS_InitMutex
add sp, sp, #0x4
ldmia sp!, {lr}
bx lr
.balign 4
_020A89C8: .word wcmCpsifw
_020A89CC: .word wcmCpsifw+0xC
|