summaryrefslogtreecommitdiff
path: root/arm9/asm/SOC_socl_close.s
blob: b15b611d66657995388ade198f65afc30e05bd17 (plain)
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
	.include "asm/macros.inc"
	.include "global.inc"

	.text

	arm_func_start SOCLi_TrashSocket
SOCLi_TrashSocket: ; 0x020996C0
	stmdb sp!, {r4-r5,lr}
	sub sp, sp, #0x4
	bl OS_DisableInterrupts
	ldr r4, _02099704 ; =SOCLiSocketListTrash
	mov r5, r0
	ldr r0, [r4, #0x0]
	cmp r0, #0x0
	beq _020996F0
_020996E0:
	bl SOCLi_CleanupSocket
	ldr r0, [r4, #0x0]
	cmp r0, #0x0
	bne _020996E0
_020996F0:
	mov r0, r5
	bl OS_RestoreInterrupts
	add sp, sp, #0x4
	ldmia sp!, {r4-r5,lr}
	bx lr
	.balign 4
_02099704: .word SOCLiSocketListTrash

	arm_func_start SOCLi_FreeCommandPipe
SOCLi_FreeCommandPipe: ; 0x02099708
	stmdb sp!, {r4-r8,lr}
	sub sp, sp, #0x8
	movs r8, r0
	addeq sp, sp, #0x8
	ldmeqia sp!, {r4-r8,lr}
	bxeq lr
	add r0, r8, #0x20
	bl OS_JoinThread
	bl OS_DisableInterrupts
	mov r7, r0
	bl OS_DisableScheduler
	add r1, sp, #0x0
	mov r0, r8
	mov r2, #0x0
	bl OS_ReceiveMessage
	cmp r0, #0x0
	beq _0209979C
	add r4, sp, #0x0
	mvn r6, #0xa
	mov r5, #0x0
_02099758:
	ldr r0, [sp, #0x0]
	cmp r0, #0x0
	beq _02099784
	ldr r0, [r0, #0x8]
	cmp r0, #0x0
	beq _0209977C
	mov r1, r6
	mov r2, r5
	bl OS_SendMessage
_0209977C:
	ldr r0, [sp, #0x0]
	bl SOCLi_FreeCommandPacket
_02099784:
	mov r0, r8
	mov r1, r4
	mov r2, r5
	bl OS_ReceiveMessage
	cmp r0, #0x0
	bne _02099758
_0209979C:
	bl OS_EnableScheduler
	bl OS_RescheduleThread
	mov r0, r7
	bl OS_RestoreInterrupts
	add sp, sp, #0x8
	ldmia sp!, {r4-r8,lr}
	bx lr

	arm_func_start SOCLi_CleanupSocket
SOCLi_CleanupSocket:
	stmdb sp!, {r4-r6,lr}
	movs r4, r0
	ldmeqia sp!, {r4-r6,lr}
	bxeq lr
	mov r0, #0x0
	strh r0, [r4, #0x70]
	ldrsb r1, [r4, #0x73]
	mov r2, #0x1
	cmp r1, #0x0
	beq _020997E8
	cmp r1, #0x4
	movne r2, r0
_020997E8:
	cmp r2, #0x0
	beq _02099804
	ldr r0, [r4, #0x68]
	bl SOCLi_FreeCommandPipe
	ldr r0, [r4, #0x64]
	bl SOCLi_FreeCommandPipe
	b _02099884
_02099804:
	cmp r1, #0x1
	bne _02099874
	ldr r0, [r4, #0x64]
	ldr r0, [r0, #0x104]
	cmp r0, #0x0
	beq _0209983C
	ldr r5, _020998C0 ; =SOCLiConfigPtr
_02099820:
	ldr r1, [r5, #0x0]
	ldr r6, [r0, #0x0]
	ldr r1, [r1, #0x1c]
	blx r1
	mov r0, r6
	cmp r6, #0x0
	bne _02099820
_0209983C:
	ldr r0, [r4, #0x64]
	mov r1, #0x0
	add r0, r0, #0x100
	strh r1, [r0, #0x8]
	ldr r0, [r4, #0x64]
	str r1, [r0, #0x100]
	ldr r0, [r4, #0x64]
	str r1, [r0, #0x104]
	ldr r0, [r4, #0x64]
	add r0, r0, #0x10c
	bl OS_WakeupThread
	ldr r0, [r4, #0x64]
	bl SOCLi_FreeCommandPipe
	b _02099884
_02099874:
	cmp r1, #0x2
	bne _02099884
	ldr r0, [r4, #0x68]
	bl SOCLi_FreeCommandPipe
_02099884:
	bl OS_DisableInterrupts
	mov r5, r0
	mov r0, r4
	bl SOCLi_SocketUnregister
	mov r0, r4
	bl SOCLi_SocketUnregisterTrash
	ldr r1, _020998C0 ; =SOCLiConfigPtr
	mov r0, r4
	ldr r1, [r1, #0x0]
	ldr r1, [r1, #0x1c]
	blx r1
	mov r0, r5
	bl OS_RestoreInterrupts
	ldmia sp!, {r4-r6,lr}
	bx lr
	.balign 4
_020998C0: .word SOCLiConfigPtr

	arm_func_start SOCLi_CloseCallBack
SOCLi_CloseCallBack: ; 0x020998C4
	stmdb sp!, {r4-r5,lr}
	sub sp, sp, #0x4
	ldr r4, [r0, #0x4]
	mov r1, #0x1
	ldrsb r0, [r4, #0x73]
	cmp r0, #0x0
	beq _020998E8
	cmp r0, #0x4
	movne r1, #0x0
_020998E8:
	cmp r1, #0x0
	beq _02099908
	ldr r0, [r4, #0x68]
	add r0, r0, #0x20
	bl OS_JoinThread
	bl CPS_TcpShutdown
	bl CPS_TcpClose
	bl CPS_SocRelease
_02099908:
	bl CPS_SocUnRegister
	ldrsh r0, [r4, #0x70]
	mov r1, #0x0
	bic r0, r0, #0x6
	strh r0, [r4, #0x70]
	ldrsb r0, [r4, #0x73]
	cmp r0, #0x2
	ldreq r0, [r4, #0x68]
	ldrne r0, [r4, #0x64]
	bl SOCLi_SendCommandPacket
	bl OS_DisableInterrupts
	mov r5, r0
	mov r0, r4
	bl SOCLi_SocketUnregister
	mov r0, r4
	bl SOCLi_SocketRegisterTrash
	mov r0, r5
	bl OS_RestoreInterrupts
	ldrsh r1, [r4, #0x70]
	mov r0, #0x0
	orr r1, r1, #0x20
	strh r1, [r4, #0x70]
	add sp, sp, #0x4
	ldmia sp!, {r4-r5,lr}
	bx lr

	arm_func_start SOCL_Close
SOCL_Close: ; 0x0209996C
	stmdb sp!, {r4,lr}
	mov r4, r0
	cmp r4, #0x0
	mvnle r0, #0x1b
	ldmleia sp!, {r4,lr}
	bxle lr
	bl SOCL_SocketIsInTrash
	cmp r0, #0x0
	mvnne r0, #0x19
	ldmneia sp!, {r4,lr}
	bxne lr
	mov r0, r4
	bl SOCL_SocketIsInvalid
	cmp r0, #0x0
	movne r0, #0x0
	ldmneia sp!, {r4,lr}
	bxne lr
	cmp r4, #0x0
	mov r1, #0x0
	beq _020999C8
	ldrsh r0, [r4, #0x70]
	ands r0, r0, #0x1
	movne r1, #0x1
_020999C8:
	cmp r1, #0x0
	mvneq r0, #0x26
	ldmeqia sp!, {r4,lr}
	bxeq lr
	ldrsh r0, [r4, #0x70]
	ands r0, r0, #0x10
	mvnne r0, #0x19
	ldmneia sp!, {r4,lr}
	bxne lr
	ldrsh r0, [r4, #0x70]
	mov r1, #0x1
	orr r0, r0, #0x18
	strh r0, [r4, #0x70]
	ldrsb r0, [r4, #0x73]
	cmp r0, #0x0
	beq _02099A10
	cmp r0, #0x4
	movne r1, #0x0
_02099A10:
	cmp r1, #0x0
	beq _02099A24
	ldr r0, [r4, #0x68]
	mov r1, #0x0
	bl SOCLi_SendCommandPacket
_02099A24:
	ldr r0, _02099A54 ; =SOCLi_CloseCallBack
	mov r1, r4
	mov r2, #0x1
	bl SOCLi_CreateCommandPacket
	mov r1, r0
	mov r2, #0x0
	mov r0, r4
	str r2, [r1, #0x8]
	bl SOCLi_SendCommandPacketToCtrlPipe
	mov r0, #0x0
	ldmia sp!, {r4,lr}
	bx lr
	.balign 4
_02099A54: .word SOCLi_CloseCallBack

	arm_func_start SOCL_IsClosed
SOCL_IsClosed:
	stmdb sp!, {r4,lr}
	movs r4, r0
	bmi _02099A88
	bl SOCL_SocketIsInvalid
	cmp r0, #0x0
	beq _02099A88
	mov r0, r4
	bl SOCL_SocketIsInTrash
	cmp r0, #0x0
	moveq r0, #0x1
	ldmeqia sp!, {r4,lr}
	bxeq lr
_02099A88:
	mov r0, #0x0
	ldmia sp!, {r4,lr}
	bx lr