summaryrefslogtreecommitdiff
path: root/arm9/asm/SOC_socl_command.s
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/asm/SOC_socl_command.s')
-rw-r--r--arm9/asm/SOC_socl_command.s300
1 files changed, 300 insertions, 0 deletions
diff --git a/arm9/asm/SOC_socl_command.s b/arm9/asm/SOC_socl_command.s
new file mode 100644
index 00000000..693af250
--- /dev/null
+++ b/arm9/asm/SOC_socl_command.s
@@ -0,0 +1,300 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .section .bss
+
+ .global SOCLiCommandPackets
+SOCLiCommandPackets: ; 0x021C8D04
+ .space 0x4
+
+ .global SOCLiCommandPacketQueue
+SOCLiCommandPacketQueue: ; 0x021C8D08
+ .space 0x20
+
+ .text
+
+ arm_func_start SOCLi_CommandPacketHandler
+SOCLi_CommandPacketHandler: ; 0x02097878
+ stmdb sp!, {r4-r9,lr}
+ sub sp, sp, #0x4
+ mov r9, r0
+ add r6, sp, #0x0
+ mov r4, #0x0
+ mov r5, #0x1
+_02097890:
+ mov r0, r9
+ mov r1, r6
+ mov r2, r5
+ bl OS_ReadMessage
+ ldr r0, [sp, #0x0]
+ cmp r0, #0x0
+ addeq sp, sp, #0x4
+ ldmeqia sp!, {r4-r9,lr}
+ bxeq lr
+ ldr r1, [r0, #0x0]
+ blx r1
+ mov r7, r0
+ bl OS_DisableInterrupts
+ mov r8, r0
+ bl OS_DisableScheduler
+ mov r0, r9
+ mov r1, r4
+ mov r2, r4
+ bl OS_ReceiveMessage
+ ldr r0, [sp, #0x0]
+ ldr r0, [r0, #0x4]
+ cmp r0, #0x0
+ strne r7, [r0, #0x6c]
+ ldr r0, [sp, #0x0]
+ ldr r0, [r0, #0x8]
+ cmp r0, #0x0
+ beq _02097908
+ mov r1, r7
+ mov r2, r4
+ bl OS_SendMessage
+_02097908:
+ ldr r0, [sp, #0x0]
+ bl SOCLi_FreeCommandPacket
+ bl OS_EnableScheduler
+ mov r0, r8
+ bl OS_RestoreInterrupts
+ b _02097890
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r9,lr}
+ bx lr
+
+ arm_func_start SOCLi_ExecCommandPacketInCtrlPipe
+SOCLi_ExecCommandPacketInCtrlPipe: ; 0x0209792C
+ stmdb sp!, {r4,lr}
+ mov r4, r1
+ bl SOCLi_GetCtrlPipe
+ mov r1, r4
+ bl SOCLi_ExecCommandPacket
+ ldmia sp!, {r4,lr}
+ bx lr
+
+ arm_func_start SOCLi_ExecCommandPacketInSendPipe
+SOCLi_ExecCommandPacketInSendPipe:
+ ldr ip, _02097954 ; =SOCLi_ExecCommandPacket
+ ldr r0, [r0, #0x68]
+ bx r12
+ .balign 4
+_02097954: .word SOCLi_ExecCommandPacket
+
+ arm_func_start SOCLi_ExecCommandPacketInRecvPipe
+SOCLi_ExecCommandPacketInRecvPipe: ; 0x02097958
+ ldr ip, _02097964 ; =SOCLi_ExecCommandPacket
+ ldr r0, [r0, #0x64]
+ bx r12
+ .balign 4
+_02097964: .word SOCLi_ExecCommandPacket
+
+ arm_func_start SOCLi_ExecCommandPacket
+SOCLi_ExecCommandPacket: ; 0x02097968
+ stmdb sp!, {r4-r5,lr}
+ sub sp, sp, #0x2c
+ mov r4, r1
+ ldrsb r2, [r4, #0xd]
+ mov r5, r0
+ cmp r2, #0x1
+ bne _020979BC
+ add r0, sp, #0x8
+ add r1, sp, #0x4
+ mov r2, #0x1
+ bl OS_InitMessageQueue
+ add r2, sp, #0x8
+ mov r0, r5
+ mov r1, r4
+ str r2, [r4, #0x8]
+ bl SOCLi_SendCommandPacket
+ add r0, sp, #0x8
+ add r1, sp, #0x0
+ mov r2, #0x1
+ bl OS_ReceiveMessage
+ b _020979CC
+_020979BC:
+ mov r2, #0x0
+ str r2, [r4, #0x8]
+ bl SOCLi_SendCommandPacket
+ str r0, [sp, #0x0]
+_020979CC:
+ ldr r0, [sp, #0x0]
+ add sp, sp, #0x2c
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+
+ arm_func_start SOCLi_SendCommandPacketToCtrlPipe
+SOCLi_SendCommandPacketToCtrlPipe:
+ stmdb sp!, {r4,lr}
+ mov r4, r1
+ bl SOCLi_GetCtrlPipe
+ mov r1, r4
+ bl SOCLi_SendCommandPacket
+ ldmia sp!, {r4,lr}
+ bx lr
+
+ arm_func_start SOCLi_SendCommandPacket
+SOCLi_SendCommandPacket:
+ stmdb sp!, {r4-r5,lr}
+ sub sp, sp, #0x4
+ movs r5, r1
+ beq _02097A14
+ ldrsb r1, [r5, #0xd]
+ ands r1, r1, #0x1
+ beq _02097A1C
+_02097A14:
+ mov r2, #0x1
+ b _02097A20
+_02097A1C:
+ mov r2, #0x0
+_02097A20:
+ mov r1, r5
+ bl OS_SendMessage
+ movs r4, r0
+ bne _02097A38
+ mov r0, r5
+ bl SOCLi_FreeCommandPacket
+_02097A38:
+ cmp r4, #0x0
+ movne r0, #0x0
+ mvneq r0, #0x29
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+
+ arm_func_start SOCLi_GetCtrlPipe
+SOCLi_GetCtrlPipe: ; 0x02097A50
+ ldr r1, [r0, #0x64]
+ cmp r1, #0x0
+ ldreq r1, [r0, #0x68]
+ mov r0, r1
+ bx lr
+
+ arm_func_start SOCLi_FreeCommandPacket
+SOCLi_FreeCommandPacket:
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ movs r1, r0
+ addeq sp, sp, #0x4
+ ldmeqia sp!, {lr}
+ bxeq lr
+ ldr r0, _02097A94 ; =SOCLiCommandPacketQueue
+ mov r2, #0x0
+ bl OS_SendMessage
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+ .balign 4
+_02097A94: .word SOCLiCommandPacketQueue
+
+ arm_func_start SOCLi_CreateCommandPacket
+SOCLi_CreateCommandPacket: ; 0x02097A98
+ stmdb sp!, {r4-r6,lr}
+ mov r4, r2
+ mov r6, r0
+ mov r0, r4
+ mov r5, r1
+ bl SOCLi_AllocCommandPacket
+ cmp r0, #0x0
+ ldmeqia sp!, {r4-r6,lr}
+ bxeq lr
+ str r6, [r0, #0x0]
+ str r5, [r0, #0x4]
+ mov r1, #0x0
+ str r1, [r0, #0x8]
+ ldrsb r1, [r5, #0x73]
+ strb r1, [r0, #0xc]
+ strb r4, [r0, #0xd]
+ ldmia sp!, {r4-r6,lr}
+ bx lr
+
+ arm_func_start SOCLi_AllocCommandPacket
+SOCLi_AllocCommandPacket:
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ mov r2, r0
+ ldr r0, _02097B10 ; =SOCLiCommandPacketQueue
+ add r1, sp, #0x0
+ bl OS_ReceiveMessage
+ cmp r0, #0x0
+ ldrne r0, [sp, #0x0]
+ moveq r0, #0x0
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+ .balign 4
+_02097B10: .word SOCLiCommandPacketQueue
+
+ arm_func_start SOCLi_CleanupCommandPacketQueue
+SOCLi_CleanupCommandPacketQueue: ; 0x02097B14
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ ldr r0, _02097B6C ; =SOCLiCommandPacketQueue
+ ldr r1, [r0, #0x1c]
+ ldr r0, [r0, #0x14]
+ cmp r1, r0
+ addlt sp, sp, #0x4
+ mvnlt r0, #0x0
+ ldmltia sp!, {lr}
+ bxlt lr
+ ldr r0, _02097B70 ; =SOCLiConfigPtr
+ ldr r1, _02097B74 ; =SOCLiCommandPackets
+ ldr r2, [r0, #0x0]
+ ldr r0, [r1, #0x0]
+ ldr r1, [r2, #0x1c]
+ blx r1
+ ldr r1, _02097B74 ; =SOCLiCommandPackets
+ mov r0, #0x0
+ str r0, [r1, #0x0]
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+ .balign 4
+_02097B6C: .word SOCLiCommandPacketQueue
+_02097B70: .word SOCLiConfigPtr
+_02097B74: .word SOCLiCommandPackets
+
+ arm_func_start SOCLi_StartupCommandPacketQueue
+SOCLi_StartupCommandPacketQueue: ; 0x02097B78
+ stmdb sp!, {r4-r6,lr}
+ mov r4, r0
+ mov r0, #0x2c
+ mul r1, r4, r0
+ ldr r0, _02097C08 ; =SOCLiConfigPtr
+ mov r2, r4, lsl #0x2
+ add r2, r2, #0x3
+ ldr r0, [r0, #0x0]
+ add r1, r1, #0x3
+ bic r5, r2, #0x3
+ bic r2, r1, #0x3
+ ldr r1, [r0, #0x18]
+ add r0, r2, r5
+ blx r1
+ movs r6, r0
+ mvneq r0, #0x0
+ ldmeqia sp!, {r4-r6,lr}
+ bxeq lr
+ ldr r0, _02097C0C ; =SOCLiCommandPacketQueue
+ mov r1, r6
+ mov r2, r4
+ bl OS_InitMessageQueue
+ cmp r4, #0x0
+ add r5, r6, r5
+ ble _02097BF4
+_02097BDC:
+ mov r0, r5
+ bl SOCLi_FreeCommandPacket
+ sub r4, r4, #0x1
+ cmp r4, #0x0
+ add r5, r5, #0x2c
+ bgt _02097BDC
+_02097BF4:
+ ldr r1, _02097C10 ; =SOCLiCommandPackets
+ mov r0, #0x0
+ str r6, [r1, #0x0]
+ ldmia sp!, {r4-r6,lr}
+ bx lr
+ .balign 4
+_02097C08: .word SOCLiConfigPtr
+_02097C0C: .word SOCLiCommandPacketQueue
+_02097C10: .word SOCLiCommandPackets