summaryrefslogtreecommitdiff
path: root/arm9/asm/SND_command.s
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/asm/SND_command.s')
-rw-r--r--arm9/asm/SND_command.s617
1 files changed, 617 insertions, 0 deletions
diff --git a/arm9/asm/SND_command.s b/arm9/asm/SND_command.s
new file mode 100644
index 00000000..7218baa2
--- /dev/null
+++ b/arm9/asm/SND_command.s
@@ -0,0 +1,617 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .text
+
+ arm_func_start IsCommandAvailable
+IsCommandAvailable:
+ stmdb sp!, {r4,lr}
+ bl OS_IsRunOnEmulator
+_020CEC94:
+ cmp r0, #0x0
+ moveq r0, #0x1
+ ldmeqia sp!, {r4, lr}
+ bxeq lr
+ bl OS_DisableInterrupts
+ ldr r1, _020CECD0
+ mov r2, #0x10
+ str r2, [r1]
+ ldr r4, [r1]
+ bl OS_RestoreInterrupts
+ cmp r4, #0x0
+ movne r0, #0x1
+ moveq r0, #0x0
+ ldmia sp!, {r4, lr}
+ bx lr
+_020CECD0: .word 0x04FFF200
+
+ arm_func_start AllocCommand
+AllocCommand: ; 0x020CECD4
+ stmdb sp!, {r4,lr}
+ bl OS_DisableInterrupts
+ ldr r1, _020CED24 ; =0x021D3838
+ ldr r4, [r1, #0x0]
+ cmp r4, #0x0
+ bne _020CECFC
+ bl OS_RestoreInterrupts
+_020CECF0:
+ mov r0, #0x0
+ ldmia sp!, {r4, lr}
+ bx lr
+_020CECFC:
+ ldr r2, [r4, #0x0]
+ str r2, [r1, #0x0]
+ cmp r2, #0x0
+ ldreq r1, _020CED28 ; =0x021D3848
+ moveq r2, #0x0
+ streq r2, [r1, #0x0]
+ bl OS_RestoreInterrupts
+ mov r0, r4
+ ldmia sp!, {r4,lr}
+ bx lr
+ .balign 4
+_020CED24: .word 0x021D3838
+_020CED28: .word 0x021D3848
+
+ arm_func_start RequestCommandProc
+RequestCommandProc: ; 0x020CED2C
+ stmdb sp!, {r4-r5,lr}
+ sub sp, sp, #0x4
+ mov r5, #0x7
+ mov r4, #0x0
+_020CED3C:
+ mov r0, r5
+ mov r1, r4
+ mov r2, r4
+ bl PXI_SendWordByFifo
+_020CED4C:
+ cmp r0, #0
+ blt _020CED3C
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+
+ arm_func_start InitPXI
+InitPXI: ; 0x020CED60
+ stmdb sp!, {r4-r6,lr}
+ ldr r1, _020CEDC8 ; =PxiFifoCallback
+ mov r0, #0x7
+ bl PXI_SetFifoRecvCallback
+ bl IsCommandAvailable
+_020CED74:
+ cmp r0, #0x0
+ ldmeqia sp!, {r4-r6, lr}
+ bxeq lr
+ mov r0, #0x7
+ mov r1, #0x1
+ bl PXI_IsCallbackReady
+ cmp r0, #0x0
+ ldmneia sp!, {r4-r6, lr}
+ bxne lr
+ mov r6, #0x64
+ mov r5, #0x7
+ mov r4, #0x1
+_020CEDA4:
+ mov r0, r6
+ bl OS_SpinWait
+ mov r0, r5
+ mov r1, r4
+ bl PXI_IsCallbackReady
+ cmp r0, #0x0
+ beq _020CEDA4
+ ldmia sp!, {r4-r6, lr}
+ bx lr
+_020CEDC8: .word PxiFifoCallback
+
+ arm_func_start PxiFifoCallback
+PxiFifoCallback: ; 0x020CEDCC
+ stmdb sp!, {r4-r5,lr}
+ sub sp, sp, #0x4
+ mov r5, r1
+ bl OS_DisableInterrupts
+ mov r4, r0
+ mov r0, r5
+ bl SNDi_CallAlarmHandler
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+
+ arm_func_start SND_CountWaitingCommand
+SND_CountWaitingCommand: ; 0x020CEDFC
+ stmdb sp!, {r4,lr}
+ bl SND_CountFreeCommand
+ mov r4, r0
+ bl SND_CountReservedCommand
+ rsb r1, r4, #0x100
+ sub r0, r1, r0
+ ldmia sp!, {r4,lr}
+ bx lr
+
+ arm_func_start SND_CountReservedCommand
+SND_CountReservedCommand: ; 0x020CEE1C
+ stmdb sp!, {r4,lr}
+ bl OS_DisableInterrupts
+ ldr r1, _020CEE58 ; =0x021D3840
+ mov r4, #0x0
+ ldr r1, [r1, #0x0]
+ cmp r1, #0x0
+ beq _020CEE48
+_020CEE38:
+ ldr r1, [r1, #0x0]
+ add r4, r4, #0x1
+ cmp r1, #0x0
+ bne _020CEE38
+_020CEE48:
+ bl OS_RestoreInterrupts
+ mov r0, r4
+ ldmia sp!, {r4,lr}
+ bx lr
+ .balign 4
+_020CEE58: .word 0x021D3840
+
+ arm_func_start SND_CountFreeCommand
+SND_CountFreeCommand: ; 0x020CEE5C
+ stmdb sp!, {r4,lr}
+ bl OS_DisableInterrupts
+ ldr r1, _020CEE98 ; =0x021D3838
+ mov r4, #0x0
+ ldr r1, [r1, #0x0]
+ cmp r1, #0x0
+ beq _020CEE88
+_020CEE78:
+ ldr r1, [r1, #0x0]
+ add r4, r4, #0x1
+ cmp r1, #0x0
+ bne _020CEE78
+_020CEE88:
+ bl OS_RestoreInterrupts
+ mov r0, r4
+ ldmia sp!, {r4,lr}
+ bx lr
+ .balign 4
+_020CEE98: .word 0x021D3838
+
+ arm_func_start SND_IsFinishedCommandTag
+SND_IsFinishedCommandTag:
+ stmdb sp!, {r4,lr}
+ mov r4, r0
+ bl OS_DisableInterrupts
+ ldr r1, _020CEEEC ; =0x021D383C
+ ldr r1, [r1, #0x0]
+ cmp r4, r1
+ bls _020CEECC
+ sub r1, r4, r1
+ cmp r1, #0x80000000
+ movcc r4, #0x0
+ movcs r4, #0x1
+ b _020CEEDC
+_020CEECC:
+ sub r1, r1, r4
+ cmp r1, #0x80000000
+ movcc r4, #0x1
+ movcs r4, #0x0
+_020CEEDC:
+ bl OS_RestoreInterrupts
+ mov r0, r4
+ ldmia sp!, {r4,lr}
+ bx lr
+ .balign 4
+_020CEEEC: .word 0x021D383C
+
+ arm_func_start SND_GetCurrentCommandTag
+SND_GetCurrentCommandTag: ; 0x020CEEF0
+ stmdb sp!, {r4,lr}
+ bl OS_DisableInterrupts
+ ldr r1, _020CEF24 ; =0x021D3840
+ ldr r1, [r1, #0x0]
+ cmp r1, #0x0
+ ldreq r1, _020CEF28 ; =0x021D383C
+ ldreq r4, [r1, #0x0]
+ ldrne r1, _020CEF2C ; =0x021D3858
+ ldrne r4, [r1, #0x0]
+ bl OS_RestoreInterrupts
+ mov r0, r4
+ ldmia sp!, {r4,lr}
+ bx lr
+ .balign 4
+_020CEF24: .word 0x021D3840
+_020CEF28: .word 0x021D383C
+_020CEF2C: .word 0x021D3858
+
+ arm_func_start SND_WaitForCommandProc
+SND_WaitForCommandProc: ; 0x020CEF30
+ stmdb sp!, {r4-r5,lr}
+ sub sp, sp, #0x4
+ mov r5, r0
+ bl SND_IsFinishedCommandTag
+_020CEF40:
+ cmp r0, #0x0
+ addne sp, sp, #0x4
+ ldmneia sp!, {r4-r5, lr}
+ bxne lr
+ mov r4, #0x0
+_020CEF54:
+ mov r0, r4
+ bl SND_RecvCommandReply
+ cmp r0, #0x0
+ bne _020CEF54
+ mov r0, r5
+ bl SND_IsFinishedCommandTag
+ cmp r0, #0x0
+ addne sp, sp, #0x4
+ ldmneia sp!, {r4-r5, lr}
+ bxne lr
+ bl RequestCommandProc
+ mov r0, r5
+ bl SND_IsFinishedCommandTag
+ cmp r0, #0x0
+ addne sp, sp, #0x4
+ ldmneia sp!, {r4-r5, lr}
+ bxne lr
+ mov r4, #0x1
+_020CEF9C:
+ mov r0, r4
+ bl SND_RecvCommandReply
+ mov r0, r5
+ bl SND_IsFinishedCommandTag
+ cmp r0, #0x0
+ beq _020CEF9C
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r5, lr}
+ bx lr
+
+ arm_func_start SND_FlushCommand
+SND_FlushCommand: ; 0x020CEFC0
+ stmdb sp!, {r4-r9,lr}
+ sub sp, sp, #0x4
+ mov r5, r0
+ bl OS_DisableInterrupts
+ ldr r1, _020CF164 ; =0x021D3840
+ mov r4, r0
+ ldr r1, [r1, #0x0]
+ cmp r1, #0x0
+ bne _020CEFF8
+ bl OS_RestoreInterrupts
+ add sp, sp, #0x4
+ mov r0, #0x1
+ ldmia sp!, {r4-r9,lr}
+ bx lr
+_020CEFF8:
+ ldr r1, _020CF168 ; =0x021D3854
+ ldr r1, [r1, #0x0]
+ cmp r1, #0x8
+ blt _020CF03C
+ ands r1, r5, #0x1
+ bne _020CF024
+ bl OS_RestoreInterrupts
+ add sp, sp, #0x4
+ mov r0, #0x0
+ ldmia sp!, {r4-r9,lr}
+ bx lr
+_020CF024:
+ mov r0, #0x1
+ bl SND_RecvCommandReply
+ ldr r0, _020CF168 ; =0x021D3854
+ ldr r0, [r0, #0x0]
+ cmp r0, #0x8
+ bge _020CF024
+_020CF03C:
+ ldr r0, _020CF16C ; =0x021D3B00
+ mov r1, #0x1800
+ bl DC_FlushRange
+ ldr r1, _020CF164 ; =0x021D3840
+ mov r0, #0x7
+ ldr r1, [r1, #0x0]
+ mov r2, #0x0
+ bl PXI_SendWordByFifo
+_020CF05C:
+ cmp r0, #0x0
+ bge _020CF0E0
+ ands r0, r5, #0x1
+ bne _020CF084
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ add sp, sp, #0x4
+ mov r0, #0x0
+ ldmia sp!, {r4-r9, lr}
+ bx lr
+_020CF084:
+ ldr r1, _020CF164
+ mov r0, #0x7
+ ldr r1, [r1]
+ mov r2, #0x0
+ bl PXI_SendWordByFifo
+ cmp r0, #0x0
+ bge _020CF0E0
+ ldr r6, _020CF164
+ mov r9, #0x64
+ mov r8, #0x7
+ mov r7, #0x0
+_020CF0B0:
+ mov r0, r4
+ bl OS_RestoreInterrupts
+ mov r0, r9
+ bl OS_SpinWait
+ bl OS_DisableInterrupts
+ mov r4, r0
+ mov r0, r8
+ ldr r1, [r6]
+ mov r2, r7
+ bl PXI_SendWordByFifo
+ cmp r0, #0x0
+ blt _020CF0B0
+_020CF0E0:
+ ands r0, r5, #0x2
+ beq _020CF0EC
+ bl RequestCommandProc
+_020CF0EC:
+ ldr r0, _020CF170
+ ldr r1, _020CF164
+ ldr r3, [r0]
+ ldr r5, [r1]
+ add r1, r3, #0x1
+ ldr r2, _020CF174
+ str r1, [r0]
+ str r5, [r2, r3, lsl #2]
+ cmp r1, #0x8
+ movgt r1, #0x0
+ ldr r2, _020CF168
+ strgt r1, [r0]
+ ldr r1, _020CF178
+ ldr r3, [r2]
+ ldr r0, [r1]
+ add ip, r3, #0x1
+ add r6, r0, #0x1
+ ldr r5, _020CF164
+ mov lr, #0x0
+ ldr r3, _020CF17C
+ mov r0, r4
+ str lr, [r5]
+ str lr, [r3]
+ str ip, [r2]
+ str r6, [r1]
+ bl OS_RestoreInterrupts
+ mov r0, #0x1
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r9, lr}
+ bx lr
+_020CF164: .word 0x021D3840
+_020CF168: .word 0x021D3854
+_020CF16C: .word 0x021D3B00
+_020CF170: .word 0x021D3850
+_020CF174: .word 0x021D385C
+_020CF178: .word 0x021D3858
+_020CF17C: .word 0x021D3844
+
+ arm_func_start SND_PushCommand
+SND_PushCommand: ; 0x020CF180
+ stmdb sp!, {r4,lr}
+ mov r4, r0
+ bl OS_DisableInterrupts
+ ldr r2, _020CF1C0 ; =0x021D3844
+ ldr r1, [r2, #0x0]
+ cmp r1, #0x0
+ ldreq r1, _020CF1C4 ; =0x021D3840
+ streq r4, [r2, #0x0]
+ streq r4, [r1, #0x0]
+ strne r4, [r1, #0x0]
+ strne r4, [r2, #0x0]
+ mov r1, #0x0
+ str r1, [r4, #0x0]
+ bl OS_RestoreInterrupts
+ ldmia sp!, {r4,lr}
+ bx lr
+ .balign 4
+_020CF1C0: .word 0x021D3844
+_020CF1C4: .word 0x021D3840
+
+ arm_func_start SND_AllocCommand
+SND_AllocCommand:
+ stmdb sp!, {r4,lr}
+ mov r4, r0
+ bl IsCommandAvailable
+_020CF1D4:
+ cmp r0, #0x0
+ moveq r0, #0x0
+ ldmeqia sp!, {r4,lr}
+ bxeq lr
+ bl AllocCommand
+ cmp r0, #0x0
+ ldmneia sp!, {r4,lr}
+ bxne lr
+ ands r0, r4, #0x1
+ moveq r0, #0x0
+ ldmeqia sp!, {r4,lr}
+ bxeq lr
+ bl SND_CountWaitingCommand
+ cmp r0, #0x0
+ ble _020CF238
+ mov r4, #0x0
+_020CF214:
+ mov r0, r4
+ bl SND_RecvCommandReply
+ cmp r0, #0x0
+ bne _020CF214
+ bl AllocCommand
+ cmp r0, #0x0
+ beq _020CF240
+ ldmia sp!, {r4,lr}
+ bx lr
+_020CF238:
+ mov r0, #0x1
+ bl SND_FlushCommand
+_020CF240:
+ bl RequestCommandProc
+ mov r4, #0x1
+_020CF248:
+ mov r0, r4
+ bl SND_RecvCommandReply
+ bl AllocCommand
+ cmp r0, #0x0
+ beq _020CF248
+ ldmia sp!, {r4,lr}
+ bx lr
+
+ arm_func_start SND_RecvCommandReply
+SND_RecvCommandReply: ; 0x020CF264
+ stmdb sp!, {r4-r6,lr}
+ mov r4, r0
+ bl OS_DisableInterrupts
+ mov r5, r0
+ ands r0, r4, #0x1
+ beq _020CF2C0
+ bl SNDi_GetFinishedCommandTag
+ ldr r4, _020CF380 ; =0x021D383C
+ ldr r1, [r4, #0x0]
+ cmp r1, r0
+ bne _020CF2E8
+ mov r6, #0x64
+_020CF294:
+ mov r0, r5
+ bl OS_RestoreInterrupts
+ mov r0, r6
+ bl OS_SpinWait
+ bl OS_DisableInterrupts
+ mov r5, r0
+ bl SNDi_GetFinishedCommandTag
+ ldr r1, [r4, #0x0]
+ cmp r1, r0
+ beq _020CF294
+ b _020CF2E8
+_020CF2C0:
+ bl SNDi_GetFinishedCommandTag
+ ldr r1, _020CF380 ; =0x021D383C
+ ldr r1, [r1, #0x0]
+ cmp r1, r0
+ bne _020CF2E8
+ mov r0, r5
+ bl OS_RestoreInterrupts
+_020CF2DC:
+ mov r0, #0x0
+ ldmia sp!, {r4-r6, lr}
+ bx lr
+_020CF2E8:
+ ldr r0, _020CF384 ; =0x021D384C
+ ldr r2, _020CF388 ; =0x021D385C
+ ldr r3, [r0, #0x0]
+ add r1, r3, #0x1
+ ldr r4, [r2, r3, lsl #0x2]
+ str r1, [r0, #0x0]
+ cmp r1, #0x8
+ movgt r1, #0x0
+ strgt r1, [r0, #0x0]
+ ldr r0, [r4, #0x0]
+ mov r1, r4
+ cmp r0, #0x0
+ beq _020CF32C
+_020CF31C:
+ ldr r1, [r1, #0x0]
+ ldr r0, [r1, #0x0]
+ cmp r0, #0x0
+ bne _020CF31C
+_020CF32C:
+ ldr r0, _020CF38C ; =0x021D3848
+ ldr r3, _020CF390 ; =0x021D3854
+ ldr r0, [r0, #0x0]
+ ldr r2, _020CF380 ; =0x021D383C
+ cmp r0, #0x0
+ strne r4, [r0, #0x0]
+ ldreq r0, _020CF394 ; =0x021D3838
+ ldr lr, [r3, #0x0]
+ streq r4, [r0, #0x0]
+ ldr ip, _020CF38C ; =0x021D3848
+ sub r6, lr, #0x1
+ ldr r0, [r2, #0x0]
+ str r1, [r12, #0x0]
+ add lr, r0, #0x1
+ mov r0, r5
+ str r6, [r3, #0x0]
+ str lr, [r2, #0x0]
+ bl OS_RestoreInterrupts
+ mov r0, r4
+ ldmia sp!, {r4-r6,lr}
+ bx lr
+ .balign 4
+_020CF380: .word 0x021D383C
+_020CF384: .word 0x021D384C
+_020CF388: .word 0x021D385C
+_020CF38C: .word 0x021D3848
+_020CF390: .word 0x021D3854
+_020CF394: .word 0x021D3838
+
+ arm_func_start SND_CommandInit
+SND_CommandInit: ; 0x020CF398
+ stmdb sp!, {r4-r11,lr}
+ sub sp, sp, #0x4
+ bl InitPXI
+ ldr r3, _020CF478 ; =0x021D3B00
+ ldr r0, _020CF47C ; =0x021D3838
+ mov r4, #0x0
+ str r3, [r0, #0x0]
+ mov r1, r3
+ mov r0, #0x18
+_020CF3BC:
+ add r4, r4, #0x1
+ mla r2, r4, r0, r1
+ cmp r4, #0xff
+ str r2, [r3], #0x18
+ blt _020CF3BC
+ ldr r7, _020CF480 ; =0x021D4B00
+ mov r10, #0x0
+ ldr r5, _020CF484 ; =0x021D3840
+ ldr r4, _020CF488 ; =0x021D3844
+ ldr lr, _020CF48C ; =0x021D3854
+ ldr ip, _020CF490 ; =0x021D384C
+ ldr r3, _020CF494 ; =0x021D3850
+ ldr r1, _020CF498 ; =0x021D383C
+ ldr sb, _020CF49C ; =0x021D52E8
+ ldr r6, _020CF4A0 ; =0x021D3848
+ ldr r2, _020CF4A4 ; =0x021D3858
+ mov r8, #0x1
+ ldr r0, _020CF4A8 ; =0x021D3880
+ ldr fp, _020CF4AC ; =0x021D5360
+ str r9, [r6, #0x0]
+ str r10, [r7, #0x7e8]
+ str r10, [r5, #0x0]
+ str r10, [r4, #0x0]
+ str r10, [lr, #0x0]
+ str r10, [r12, #0x0]
+ str r10, [r3, #0x0]
+ str r8, [r2, #0x0]
+ str r10, [r1, #0x0]
+ str r0, [r11, #0x0]
+ bl SNDi_InitSharedWork
+ mov r0, r8
+ bl SND_AllocCommand
+_020CF43C:
+ cmp r0, #0x0
+ addeq sp, sp, #0x4
+ ldmeqia sp!, {r4-r11, lr}
+ bxeq lr
+ mov r2, #0x1D
+ mov r1, fp
+ str r2, [r0, #0x4]
+ ldr r1, [r1]
+ str r1, [r0, #0x8]
+ bl SND_PushCommand
+ mov r0, r8
+ bl SND_FlushCommand
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r11, lr}
+ bx lr
+_020CF478: .word 0x021D3B00
+_020CF47C: .word 0x021D3838
+_020CF480: .word 0x021D4B00
+_020CF484: .word 0x021D3840
+_020CF488: .word 0x021D3844
+_020CF48C: .word 0x021D3854
+_020CF490: .word 0x021D384C
+_020CF494: .word 0x021D3850
+_020CF498: .word 0x021D383C
+_020CF49C: .word 0x021D52E8
+_020CF4A0: .word 0x021D3848
+_020CF4A4: .word 0x021D3858
+_020CF4A8: .word 0x021D3880
+_020CF4AC: .word 0x021D5360