summaryrefslogtreecommitdiff
path: root/arm9/asm/SOC_soc.s
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/asm/SOC_soc.s')
-rw-r--r--arm9/asm/SOC_soc.s758
1 files changed, 758 insertions, 0 deletions
diff --git a/arm9/asm/SOC_soc.s b/arm9/asm/SOC_soc.s
new file mode 100644
index 00000000..506a16eb
--- /dev/null
+++ b/arm9/asm/SOC_soc.s
@@ -0,0 +1,758 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .section .data
+
+ .global SOCLSocketParamUDP
+SOCLSocketParamUDP: ; 0x021061C4
+ .byte 0x01, 0x01, 0xC0, 0x05, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08
+ .byte 0x00, 0x08, 0x0C, 0x20, 0x00, 0x00, 0x00, 0x00
+
+ .global SOCLSocketParamTCP
+SOCLSocketParamTCP: ; 0x021061DC
+ .byte 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x66, 0x04, 0x00, 0x00, 0x00, 0x00, 0x61, 0x08, 0x00, 0x00
+ .byte 0x00, 0x08, 0x0C, 0x20, 0x00, 0x08, 0x0D, 0x20
+
+ .global SOCLSocketParamUDPSend
+SOCLSocketParamUDPSend: ; 0x021061F4
+ .byte 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0xEA, 0x05, 0x00, 0x00, 0x00, 0x00, 0xEB, 0x06, 0x00, 0x00
+ .byte 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x0D, 0x20
+
+ .global UNK_0210620C
+UNK_0210620C: ; 0x0210620C
+ .byte 0x25, 0x64, 0x2E, 0x25, 0x64, 0x2E, 0x25, 0x64, 0x2E, 0x25, 0x64, 0x00
+
+ .section .bss
+
+ .global UNK_021C8D38
+UNK_021C8D38: ; 0x021C8D38
+ .space 0x4
+
+ .global FreeFunc_SOC
+FreeFunc_SOC: ; 0x021C8D3C
+ .space 0x4
+
+ .global AllocFunc_SOC
+AllocFunc_SOC: ; 0x021C8D40
+ .space 0x4
+
+ .global UNK_021C8D44
+UNK_021C8D44: ; 0x021C8D44
+ .space 0x8
+
+ .global UNK_021C8D4C
+UNK_021C8D4C: ; 0x021C8D4C
+ .space 0x10
+
+ .global UNK_021C8D5C
+UNK_021C8D5C: ; 0x021C8D5C
+ .space 0x10
+
+ .global UNK_021C8D6C
+UNK_021C8D6C: ; 0x021C8D6C
+ .space 0x38
+
+ .global UNK_021C8DA4
+UNK_021C8DA4: ; 0x021C8DA4
+ .space 0x104
+
+ .text
+
+ arm_func_start SOC_Poll
+SOC_Poll: ; 0x0209A0AC
+ stmdb sp!, {r4-r11,lr}
+ sub sp, sp, #0xc
+ mov r9, r2
+ str r0, [sp, #0x0]
+ mov r0, #0x1
+ str r0, [sp, #0x8]
+ mov r0, #0x0
+ mov r8, r3
+ mvn r2, #0x0
+ cmp r8, r2
+ cmpeq r9, r2
+ movne r11, #0x1
+ mov r10, r1
+ moveq r11, #0x0
+ str r0, [sp, #0x4]
+_0209A0E8:
+ ldr r5, [sp, #0x4]
+ ldr r7, [sp, #0x0]
+ mov r6, r5
+ cmp r10, #0x0
+ bls _0209A128
+_0209A0FC:
+ ldrsh r1, [r7, #0x4]
+ ldr r0, [r7, #0x0]
+ orr r4, r1, #0xe0
+ bl SOCL_GetStatus
+ ands r0, r4, r0
+ strh r0, [r7, #0x6]
+ add r6, r6, #0x1
+ addne r5, r5, #0x1
+ cmp r6, r10
+ add r7, r7, #0x8
+ blo _0209A0FC
+_0209A128:
+ cmp r5, #0x0
+ bgt _0209A160
+ cmp r11, #0x0
+ beq _0209A148
+ mov r1, #0x0
+ subs r0, r1, r9
+ sbcs r0, r1, r8
+ bge _0209A160
+_0209A148:
+ ldr r0, [sp, #0x8]
+ bl OS_Sleep
+ ldr r0, _0209A170 ; =0x0000020B
+ subs r9, r9, r0
+ sbc r8, r8, #0x0
+ b _0209A0E8
+_0209A160:
+ mov r0, r5
+ add sp, sp, #0xc
+ ldmia sp!, {r4-r11,lr}
+ bx lr
+ .balign 4
+_0209A170: .word 0x0000020B
+
+ arm_func_start SOC_U32to4U8
+SOC_U32to4U8: ; 0x0209A174
+ mov r2, r0, lsr #0x18
+ strb r2, [r1, #0x0]
+ mov r2, r0, lsr #0x10
+ strb r2, [r1, #0x1]
+ mov r2, r0, lsr #0x8
+ strb r2, [r1, #0x2]
+ strb r0, [r1, #0x3]
+ bx lr
+
+ arm_func_start SOC_InetNtoP
+SOC_InetNtoP: ; 0x0209A194
+ stmdb sp!, {r4,lr}
+ sub sp, sp, #0x18
+ cmp r0, #0x2
+ mov r4, r2
+ addne sp, sp, #0x18
+ movne r0, #0x0
+ ldmneia sp!, {r4,lr}
+ bxne lr
+ cmp r3, #0x10
+ addcc sp, sp, #0x18
+ movcc r0, #0x0
+ ldmccia sp!, {r4,lr}
+ bxcc lr
+ mov r0, r1
+ add r1, sp, #0xc
+ mov r2, #0x4
+ bl MI_CpuCopy8
+ ldr r0, [sp, #0xc]
+ add r1, sp, #0x10
+ bl SOC_U32to4U8
+ ldrb r1, [sp, #0x12]
+ ldr r2, _0209A220 ; =UNK_0210620C
+ mov r0, r4
+ str r1, [sp, #0x0]
+ ldrb r3, [sp, #0x11]
+ mov r1, #0x10
+ str r3, [sp, #0x4]
+ ldrb r3, [sp, #0x10]
+ str r3, [sp, #0x8]
+ ldrb r3, [sp, #0x13]
+ bl OS_SNPrintf
+ mov r0, r4
+ add sp, sp, #0x18
+ ldmia sp!, {r4,lr}
+ bx lr
+ .balign 4
+_0209A220: .word UNK_0210620C
+
+ arm_func_start SOC_InetAtoN
+SOC_InetAtoN: ; 0x0209A224
+ stmdb sp!, {r4,lr}
+ mov r4, r1
+ bl SOCL_InetAtoH
+ cmp r0, #0x0
+ moveq r0, #0x0
+ ldmeqia sp!, {r4,lr}
+ bxeq lr
+ mov r2, r0, lsr #0x18
+ mov r1, r0, lsr #0x8
+ mov r3, r0, lsl #0x8
+ mov r12, r0, lsl #0x18
+ and r2, r2, #0xff
+ and r0, r1, #0xff00
+ and r1, r3, #0xff0000
+ orr r0, r2, r0
+ and r2, r12, #0xff000000
+ orr r0, r1, r0
+ orr r0, r2, r0
+ str r0, [r4, #0x0]
+ mov r0, #0x1
+ ldmia sp!, {r4,lr}
+ bx lr
+
+ arm_func_start SOC_InetNtoA
+SOC_InetNtoA: ; 0x0209A27C
+ stmdb sp!, {r0-r3}
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ ldr r2, _0209A2B0 ; =UNK_021C8D5C
+ add r1, sp, #0x8
+ mov r0, #0x2
+ mov r3, #0x10
+ bl SOC_InetNtoP
+ ldr r0, _0209A2B0 ; =UNK_021C8D5C
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ add sp, sp, #0x10
+ bx lr
+ .balign 4
+_0209A2B0: .word UNK_021C8D5C
+
+ arm_func_start SOC_Cleanup
+SOC_Cleanup: ; 0x0209A2B4
+ ldr ip, _0209A2BC ; =SOCL_Cleanup
+ bx r12
+ .balign 4
+_0209A2BC: .word SOCL_Cleanup
+
+ arm_func_start SOC_Startup
+SOC_Startup: ; 0x0209A2C0
+ stmdb sp!, {r4-r8,lr}
+ ldr r1, [r0, #0xc]
+ ldr ip, _0209A430 ; =UNK_021C8D6C
+ cmp r1, #0x1
+ moveq r1, #0x1
+ movne r1, #0x0
+ str r1, [r12, #0x0]
+ ldr r6, [r0, #0x10]
+ ldr r5, _0209A434 ; =AllocFunc_SOCL
+ mov r2, r6, lsr #0x18
+ mov r1, r6, lsr #0x8
+ mov r3, r6, lsl #0x8
+ and r2, r2, #0xff
+ and r1, r1, #0xff00
+ mov r6, r6, lsl #0x18
+ orr r1, r2, r1
+ and r3, r3, #0xff0000
+ orr r1, r3, r1
+ and r2, r6, #0xff000000
+ orr r1, r2, r1
+ str r1, [r12, #0x4]
+ ldr r7, [r0, #0x14]
+ ldr r4, _0209A438 ; =FreeFunc_SOCL
+ mov r2, r7, lsr #0x18
+ mov r1, r7, lsr #0x8
+ mov r6, r7, lsl #0x8
+ and r2, r2, #0xff
+ and r1, r1, #0xff00
+ mov r7, r7, lsl #0x18
+ orr r1, r2, r1
+ and r6, r6, #0xff0000
+ and r2, r7, #0xff000000
+ orr r1, r6, r1
+ orr r1, r2, r1
+ str r1, [r12, #0x8]
+ ldr r1, [r0, #0x18]
+ ldr r3, _0209A43C ; =AllocFunc_SOC
+ mov r7, r1, lsr #0x18
+ mov r6, r1, lsr #0x8
+ mov r8, r1, lsl #0x8
+ and r7, r7, #0xff
+ and r6, r6, #0xff00
+ mov r1, r1, lsl #0x18
+ orr r6, r7, r6
+ and r8, r8, #0xff0000
+ and r7, r1, #0xff000000
+ orr r1, r8, r6
+ orr r1, r7, r1
+ str r1, [r12, #0xc]
+ ldr r1, [r0, #0x1c]
+ ldr r2, _0209A440 ; =FreeFunc_SOC
+ mov r7, r1, lsr #0x18
+ mov r6, r1, lsr #0x8
+ mov r8, r1, lsl #0x8
+ and r7, r7, #0xff
+ and r6, r6, #0xff00
+ mov r1, r1, lsl #0x18
+ orr r6, r7, r6
+ and r8, r8, #0xff0000
+ and r7, r1, #0xff000000
+ orr r1, r8, r6
+ orr r1, r7, r1
+ str r1, [r12, #0x10]
+ ldr r1, [r0, #0x20]
+ mov lr, #0x40
+ mov r7, r1, lsr #0x18
+ mov r6, r1, lsr #0x8
+ mov r8, r1, lsl #0x8
+ and r7, r7, #0xff
+ and r6, r6, #0xff00
+ mov r1, r1, lsl #0x18
+ orr r6, r7, r6
+ and r8, r8, #0xff0000
+ and r7, r1, #0xff000000
+ orr r1, r8, r6
+ orr r1, r7, r1
+ str r5, [r12, #0x18]
+ str r4, [r12, #0x1c]
+ str r1, [r12, #0x14]
+ ldr r1, [r0, #0x4]
+ str r1, [r3, #0x0]
+ ldr r1, [r0, #0x8]
+ str lr, [r12, #0x20]
+ str r1, [r2, #0x0]
+ ldr r1, [r0, #0x2c]
+ str r1, [r12, #0x30]
+ ldr r1, [r0, #0x30]
+ mov r0, r12
+ str r1, [r12, #0x34]
+ bl SOCL_Startup
+ ldmia sp!, {r4-r8,lr}
+ bx lr
+ .balign 4
+_0209A430: .word UNK_021C8D6C
+_0209A434: .word AllocFunc_SOCL
+_0209A438: .word FreeFunc_SOCL
+_0209A43C: .word AllocFunc_SOC
+_0209A440: .word FreeFunc_SOC
+
+ arm_func_start FreeFunc_SOCL
+FreeFunc_SOCL: ; 0x0209A444
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ cmp r0, #0x0
+ addeq sp, sp, #0x4
+ ldmeqia sp!, {lr}
+ bxeq lr
+ ldr r1, _0209A480 ; =FreeFunc_SOC
+ ldr r2, [r0, #-0x4]
+ ldr r3, [r1, #0x0]
+ sub r1, r0, #0x4
+ mov r0, #0x0
+ blx r3
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+ .balign 4
+_0209A480: .word FreeFunc_SOC
+
+ arm_func_start AllocFunc_SOCL
+AllocFunc_SOCL: ; 0x0209A484
+ stmdb sp!, {r4,lr}
+ ldr r1, _0209A4B0 ; =AllocFunc_SOC
+ add r4, r0, #0x4
+ ldr r2, [r1, #0x0]
+ mov r1, r4
+ mov r0, #0x0
+ blx r2
+ cmp r0, #0x0
+ strne r4, [r0], #0x4
+ ldmia sp!, {r4,lr}
+ bx lr
+ .balign 4
+_0209A4B0: .word AllocFunc_SOC
+
+ arm_func_start SOC_Fcntl
+SOC_Fcntl: ; 0x0209A4B4
+ cmp r0, #0x0
+ mvneq r0, #0x0
+ bxeq lr
+ cmp r1, #0x3
+ beq _0209A4D4
+ cmp r1, #0x4
+ beq _0209A4E8
+ b _0209A4FC
+_0209A4D4:
+ ldrsb r0, [r0, #0x72]
+ cmp r0, #0x1
+ moveq r0, #0x0
+ movne r0, #0x4
+ bx lr
+_0209A4E8:
+ ands r1, r2, #0x4
+ movne r1, #0x0
+ strneb r1, [r0, #0x72]
+ moveq r1, #0x1
+ streqb r1, [r0, #0x72]
+_0209A4FC:
+ mov r0, #0x0
+ bx lr
+
+ arm_func_start SOC_Accept
+SOC_Accept: ; 0x0209A504
+ stmdb sp!, {r4,lr}
+ sub sp, sp, #0x8
+ mov r4, r1
+ add r1, sp, #0x0
+ add r2, sp, #0x4
+ bl SOCL_Accept
+ cmp r0, #0x0
+ addlt sp, sp, #0x8
+ ldmltia sp!, {r4,lr}
+ bxlt lr
+ ldrh r1, [sp, #0x0]
+ mov r2, r1, asr #0x8
+ mov r1, r1, lsl #0x8
+ and r2, r2, #0xff
+ and r1, r1, #0xff00
+ orr r1, r2, r1
+ strh r1, [r4, #0x2]
+ ldr r12, [sp, #0x4]
+ mov r2, r12, lsr #0x18
+ mov r1, r12, lsr #0x8
+ mov r3, r12, lsl #0x8
+ mov r12, r12, lsl #0x18
+ and r2, r2, #0xff
+ and r1, r1, #0xff00
+ and r3, r3, #0xff0000
+ orr r1, r2, r1
+ and r2, r12, #0xff000000
+ orr r1, r3, r1
+ orr r1, r2, r1
+ str r1, [r4, #0x4]
+ add sp, sp, #0x8
+ ldmia sp!, {r4,lr}
+ bx lr
+
+ arm_func_start SOC_Listen
+SOC_Listen: ; 0x0209A588
+ ldr ip, _0209A590 ; =SOCL_Listen
+ bx r12
+ .balign 4
+_0209A590: .word SOCL_Listen
+
+ arm_func_start SOC_GetResolver
+SOC_GetResolver: ; 0x0209A594
+ stmdb sp!, {r4-r5,lr}
+ sub sp, sp, #0x4
+ ldr r12, [r1, #0x0]
+ ldr r0, [r0, #0x0]
+ mov r2, r12, lsr #0x18
+ mov r4, r0, lsr #0x18
+ mov lr, r0, lsr #0x8
+ mov r1, r12, lsr #0x8
+ mov r5, r0, lsl #0x8
+ mov r3, r12, lsl #0x8
+ mov r0, r0, lsl #0x18
+ mov r12, r12, lsl #0x18
+ and r4, r4, #0xff
+ and lr, lr, #0xff00
+ and r2, r2, #0xff
+ and r1, r1, #0xff00
+ and r5, r5, #0xff0000
+ orr r4, r4, lr
+ and r3, r3, #0xff0000
+ orr r1, r2, r1
+ and lr, r0, #0xff000000
+ orr r0, r5, r4
+ and r2, r12, #0xff000000
+ orr r1, r3, r1
+ orr r0, lr, r0
+ orr r1, r2, r1
+ bl SOCL_SetResolver
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+
+ arm_func_start SOC_GetHostID
+SOC_GetHostID: ; 0x0209A60C
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ bl SOCL_GetHostID
+ mov r2, r0, lsr #0x18
+ mov r1, r0, lsr #0x8
+ mov r3, r0, lsl #0x8
+ mov r12, r0, lsl #0x18
+ and r2, r2, #0xff
+ and r0, r1, #0xff00
+ and r1, r3, #0xff0000
+ orr r0, r2, r0
+ and r2, r12, #0xff000000
+ orr r0, r1, r0
+ orr r0, r2, r0
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start SOC_GetSockName
+SOC_GetSockName: ; 0x0209A650
+ stmdb sp!, {r4-r6,lr}
+ movs r5, r0
+ mov r4, r1
+ mvneq r0, #0x26
+ ldmeqia sp!, {r4-r6,lr}
+ bxeq lr
+ bl SOCL_GetHostID
+ cmp r5, #0x0
+ ldrneh r1, [r5, #0x74]
+ mov r2, r0, lsr #0x18
+ mov r6, #0x8
+ moveq r1, #0x0
+ cmp r0, #0x0
+ moveq r1, #0x0
+ mov r1, r1, lsl #0x10
+ mov r3, r1, lsr #0x10
+ mov r5, r3, asr #0x8
+ mov lr, r3, lsl #0x8
+ strb r6, [r4, #0x0]
+ mov r6, #0x2
+ mov r1, r0, lsr #0x8
+ mov r3, r0, lsl #0x8
+ mov r12, r0, lsl #0x18
+ and r0, r1, #0xff00
+ and r2, r2, #0xff
+ orr r0, r2, r0
+ and r1, r3, #0xff0000
+ and r5, r5, #0xff
+ and lr, lr, #0xff00
+ strb r6, [r4, #0x1]
+ orr r3, r5, lr
+ and r2, r12, #0xff000000
+ orr r0, r1, r0
+ strh r3, [r4, #0x2]
+ orr r0, r2, r0
+ str r0, [r4, #0x4]
+ mov r0, #0x0
+ ldmia sp!, {r4-r6,lr}
+ bx lr
+
+ arm_func_start SOC_GetHostByAddr
+SOC_GetHostByAddr: ; 0x0209A6EC
+ stmdb sp!, {r4-r5,lr}
+ sub sp, sp, #0x4
+ mov r5, r0
+ bl SOCL_Resolve
+ movs r4, r0
+ addeq sp, sp, #0x4
+ moveq r0, #0x0
+ ldmeqia sp!, {r4-r5,lr}
+ bxeq lr
+ ldr r0, _0209A7A4 ; =UNK_021C8DA4
+ ldr r2, _0209A7A8 ; =0x00000101
+ mov r1, #0x0
+ bl MI_CpuFill8
+ ldr r0, _0209A7A4 ; =UNK_021C8DA4
+ ldr r2, _0209A7A8 ; =0x00000101
+ mov r1, r5
+ bl STD_CopyLString
+ mov r1, r4, lsr #0x18
+ mov r0, r4, lsr #0x8
+ mov r2, r4, lsl #0x8
+ mov r3, r4, lsl #0x18
+ and r1, r1, #0xff
+ and r0, r0, #0xff00
+ and r2, r2, #0xff0000
+ orr r0, r1, r0
+ and r3, r3, #0xff000000
+ orr r1, r2, r0
+ ldr r5, _0209A7A4 ; =UNK_021C8DA4
+ ldr r0, _0209A7AC ; =UNK_021C8D4C
+ ldr ip, _0209A7B0 ; =UNK_021C8D44
+ mov r4, #0x0
+ ldr r2, _0209A7B4 ; =UNK_021C8D38
+ orr r1, r3, r1
+ mov lr, #0x2
+ mov r3, #0x4
+ str r5, [r0, #0x0]
+ str r4, [r0, #0x4]
+ strh lr, [r0, #0x8]
+ strh r3, [r0, #0xa]
+ str r12, [r0, #0xc]
+ str r2, [r12, #0x0]
+ str r4, [r12, #0x4]
+ str r1, [r2, #0x0]
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+ .balign 4
+_0209A7A4: .word UNK_021C8DA4 ; entName
+_0209A7A8: .word 0x00000101
+_0209A7AC: .word UNK_021C8D4C ; hostent
+_0209A7B0: .word UNK_021C8D44 ; hostAddrList
+_0209A7B4: .word UNK_021C8D38 ; hostip
+
+ arm_func_start SOC_Close
+SOC_Close: ; 0x0209A7B8
+ ldr ip, _0209A7C0 ; =SOCL_Close
+ bx r12
+ .balign 4
+_0209A7C0: .word SOCL_Close
+
+ arm_func_start SOC_Shutdown
+SOC_Shutdown: ; 0x0209A7C4
+ ldr ip, _0209A7CC ; =SOCL_Shutdown
+ bx r12
+ .balign 4
+_0209A7CC: .word SOCL_Shutdown
+
+ arm_func_start SOC_SendTo
+SOC_SendTo: ; 0x0209A7D0
+ stmdb sp!, {r4-r7,lr}
+ sub sp, sp, #0xc
+ ldr r5, [sp, #0x20]
+ cmp r5, #0x0
+ moveq r5, #0x0
+ moveq r4, r5
+ beq _0209A83C
+ ldrh r4, [r5, #0x2]
+ ldr r6, [r5, #0x4]
+ mov r7, r4, asr #0x8
+ mov r12, r4, lsl #0x8
+ mov r4, r6, lsr #0x18
+ mov lr, r6, lsr #0x8
+ mov r5, r6, lsl #0x8
+ mov r6, r6, lsl #0x18
+ and r7, r7, #0xff
+ and r12, r12, #0xff00
+ orr r7, r7, r12
+ and r4, r4, #0xff
+ and lr, lr, #0xff00
+ and r5, r5, #0xff0000
+ orr r4, r4, lr
+ mov r12, r7, lsl #0x10
+ orr r4, r5, r4
+ and r6, r6, #0xff000000
+ mov r5, r12, lsr #0x10
+ orr r4, r6, r4
+_0209A83C:
+ str r4, [sp, #0x0]
+ str r3, [sp, #0x4]
+ mov r3, r5
+ bl SOCL_WriteTo
+ add sp, sp, #0xc
+ ldmia sp!, {r4-r7,lr}
+ bx lr
+
+ arm_func_start SOC_Send
+SOC_Send: ; 0x0209A858
+ stmdb sp!, {lr}
+ sub sp, sp, #0xc
+ mov r12, #0x0
+ str r12, [sp, #0x0]
+ str r3, [sp, #0x4]
+ mov r3, r12
+ bl SOCL_WriteTo
+ add sp, sp, #0xc
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start SOC_RecvFrom
+SOC_RecvFrom: ; 0x0209A880
+ stmdb sp!, {lr}
+ sub sp, sp, #0x14
+ add r12, sp, #0xc
+ str r12, [sp, #0x0]
+ str r3, [sp, #0x4]
+ add r3, sp, #0x8
+ bl SOCLi_ReadFrom
+ cmp r0, #0x0
+ addlt sp, sp, #0x14
+ ldmltia sp!, {lr}
+ bxlt lr
+ ldr r1, [sp, #0x18]
+ cmp r1, #0x0
+ addeq sp, sp, #0x14
+ ldmeqia sp!, {lr}
+ bxeq lr
+ ldrh r2, [sp, #0x8]
+ mov r3, r2, asr #0x8
+ mov r2, r2, lsl #0x8
+ and r3, r3, #0xff
+ and r2, r2, #0xff00
+ orr r2, r3, r2
+ strh r2, [r1, #0x2]
+ ldr lr, [sp, #0xc]
+ mov r3, lr, lsr #0x18
+ mov r2, lr, lsr #0x8
+ mov r12, lr, lsl #0x8
+ mov lr, lr, lsl #0x18
+ and r3, r3, #0xff
+ and r2, r2, #0xff00
+ and r12, r12, #0xff0000
+ orr r2, r3, r2
+ and r3, lr, #0xff000000
+ orr r2, r12, r2
+ orr r2, r3, r2
+ str r2, [r1, #0x4]
+ add sp, sp, #0x14
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start SOC_Read
+SOC_Read: ; 0x0209A91C
+ stmdb sp!, {lr}
+ sub sp, sp, #0xc
+ mov r12, #0x0
+ str r12, [sp, #0x0]
+ str r3, [sp, #0x4]
+ mov r3, r12
+ bl SOCLi_ReadFrom
+ add sp, sp, #0xc
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start SOC_Connect
+SOC_Connect: ; 0x0209A944
+ stmdb sp!, {r4,lr}
+ ldrh r2, [r1, #0x2]
+ ldr lr, [r1, #0x4]
+ mov r4, r2, asr #0x8
+ mov r1, r2, lsl #0x8
+ mov r3, lr, lsr #0x18
+ mov r2, lr, lsr #0x8
+ mov r12, lr, lsl #0x8
+ mov lr, lr, lsl #0x18
+ and r4, r4, #0xff
+ and r1, r1, #0xff00
+ orr r1, r4, r1
+ mov r1, r1, lsl #0x10
+ and r3, r3, #0xff
+ and r2, r2, #0xff00
+ and r12, r12, #0xff0000
+ orr r2, r3, r2
+ and r3, lr, #0xff000000
+ orr r2, r12, r2
+ mov r1, r1, lsr #0x10
+ orr r2, r3, r2
+ bl SOCL_Connect
+ ldmia sp!, {r4,lr}
+ bx lr
+
+ arm_func_start SOC_Bind
+SOC_Bind: ; 0x0209A9A4
+ ldrh r1, [r1, #0x2]
+ ldr ip, _0209A9CC ; =SOCL_Bind
+ mov r2, r1, asr #0x8
+ mov r1, r1, lsl #0x8
+ and r2, r2, #0xff
+ and r1, r1, #0xff00
+ orr r1, r2, r1
+ mov r1, r1, lsl #0x10
+ mov r1, r1, lsr #0x10
+ bx r12
+ .balign 4
+_0209A9CC: .word SOCL_Bind
+
+ arm_func_start SOC_Socket
+SOC_Socket: ; 0x0209A9D0
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ cmp r1, #0x1
+ bne _0209A9F4
+ ldr r0, _0209AA08 ; =SOCLSocketParamTCP
+ bl SOCL_CreateSocket
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+_0209A9F4:
+ ldr r0, _0209AA0C ; =SOCLSocketParamUDP
+ bl SOCL_CreateSocket
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+ .balign 4
+_0209AA08: .word SOCLSocketParamTCP
+_0209AA0C: .word SOCLSocketParamUDP