summaryrefslogtreecommitdiff
path: root/arm9/asm/libsnd.s
diff options
context:
space:
mode:
Diffstat (limited to 'arm9/asm/libsnd.s')
-rw-r--r--arm9/asm/libsnd.s1655
1 files changed, 1655 insertions, 0 deletions
diff --git a/arm9/asm/libsnd.s b/arm9/asm/libsnd.s
new file mode 100644
index 00000000..99351712
--- /dev/null
+++ b/arm9/asm/libsnd.s
@@ -0,0 +1,1655 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+ .section .text
+
+ arm_func_start PushCommand_impl
+PushCommand_impl: ; 0x020CE66C
+ stmdb sp!, {r4-r7,lr}
+ sub sp, sp, #0x4
+ mov r7, r0
+ mov r0, #0x1
+ mov r6, r1
+ mov r5, r2
+ mov r4, r3
+ bl SND_AllocCommand
+_020CE68C:
+ cmp r0, #0x0
+ addeq sp, sp, #0x4
+ ldmeqia sp!, {r4-r7, lr}
+ bxeq lr
+ str r7, [r0, #0x4]
+ str r6, [r0, #0x8]
+ str r5, [r0, #0xc]
+ ldr r1, [sp, #0x18]
+ str r4, [r0, #0x10]
+ str r1, [r0, #0x14]
+ bl SND_PushCommand
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r7, lr}
+ bx lr
+
+ arm_func_start SNDi_SetTrackParam
+SNDi_SetTrackParam: ; 0x020CE6C4
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ ldr r12, [sp, #0x8]
+ mov lr, r2
+ str r3, [sp, #0x0]
+ mov r2, r1
+ orr r1, r0, r12, lsl #0x18
+ mov r3, lr
+ mov r0, #0x7
+ bl PushCommand_impl
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start FUN_020CE6F8
+FUN_020CE6F8: ; 0x020CE6F8
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ mov lr, r1
+ mov r12, r2
+ str r3, [sp, #0x0]
+ mov r1, r0
+ mov r2, lr
+ mov r3, r12
+ mov r0, #0x6
+ bl PushCommand_impl
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start SND_ResetMasterPan
+SND_ResetMasterPan: ; 0x020CE72C
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ mov r2, #0x0
+ mov r3, r2
+ mov r0, #0x18
+ mvn r1, #0x0
+ str r2, [sp, #0x0]
+ bl PushCommand_impl
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start SND_SetMasterPan
+SND_SetMasterPan: ; 0x020CE758
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ mov r2, #0x0
+ mov r1, r0
+ mov r3, r2
+ mov r0, #0x18
+ str r2, [sp, #0x0]
+ bl PushCommand_impl
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start SND_SetOutputSelector
+SND_SetOutputSelector: ; 0x020CE784
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ mov lr, r1
+ mov r12, r2
+ str r3, [sp, #0x0]
+ mov r1, r0
+ mov r2, lr
+ mov r3, r12
+ mov r0, #0x19
+ bl PushCommand_impl
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start SND_InvalidateWaveData
+SND_InvalidateWaveData: ; 0x020CE7B8
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ mov r2, r1
+ mov r3, #0x0
+ mov r1, r0
+ mov r0, #0x20
+ str r3, [sp, #0x0]
+ bl PushCommand_impl
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start SND_InvalidateBankData
+SND_InvalidateBankData: ; 0x020CE7E4
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ mov r2, r1
+ mov r3, #0x0
+ mov r1, r0
+ mov r0, #0x1f
+ str r3, [sp, #0x0]
+ bl PushCommand_impl
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start SND_InvalidateSeqData
+SND_InvalidateSeqData: ; 0x020CE810
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ mov r2, r1
+ mov r3, #0x0
+ mov r1, r0
+ mov r0, #0x1e
+ str r3, [sp, #0x0]
+ bl PushCommand_impl
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start SND_SetupChannelPcm
+SND_SetupChannelPcm: ; 0x020CE83C
+ stmdb sp!, {r4-r5,lr}
+ sub sp, sp, #0x4
+ ldr r12, [sp, #0x18]
+ mov r3, r3, lsl #0x1a
+ orr r4, r3, r1, lsl #0x18
+ ldr r5, [sp, #0x24]
+ mov r3, r12, lsl #0x18
+ ldr r1, [sp, #0x1c]
+ ldr r12, [sp, #0x10]
+ orr r4, r4, r5, lsl #0x10
+ orr r4, r12, r4
+ ldr lr, [sp, #0x20]
+ orr r3, r3, r1, lsl #0x16
+ ldr r12, [sp, #0x14]
+ orr r1, r0, lr, lsl #0x10
+ orr r3, r12, r3
+ mov r0, #0xe
+ str r4, [sp, #0x0]
+ bl PushCommand_impl
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+
+ arm_func_start SND_SetChannelPan
+SND_SetChannelPan: ; 0x020CE894
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ mov r2, r1
+ mov r3, #0x0
+ mov r1, r0
+ mov r0, #0x15
+ str r3, [sp, #0x0]
+ bl PushCommand_impl
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start SND_SetChannelVolume
+SND_SetChannelVolume: ; 0x020CE8C0
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ mov lr, r1
+ mov r3, r2
+ mov r12, #0x0
+ mov r1, r0
+ mov r2, lr
+ mov r0, #0x14
+ str r12, [sp, #0x0]
+ bl PushCommand_impl
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start SND_SetChannelTimer
+SND_SetChannelTimer: ; 0x020CE8F4
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ mov r2, r1
+ mov r3, #0x0
+ mov r1, r0
+ mov r0, #0x13
+ str r3, [sp, #0x0]
+ bl PushCommand_impl
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start SND_UnlockChannel
+SND_UnlockChannel: ; 0x020CE920
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ mov r2, r1
+ mov r3, #0x0
+ mov r1, r0
+ mov r0, #0x1b
+ str r3, [sp, #0x0]
+ bl PushCommand_impl
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start SND_LockChannel
+SND_LockChannel: ; 0x020CE94C
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ mov r2, r1
+ mov r3, #0x0
+ mov r1, r0
+ mov r0, #0x1a
+ str r3, [sp, #0x0]
+ bl PushCommand_impl
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start SND_SetupAlarm
+SND_SetupAlarm: ; 0x020CE978
+ stmdb sp!, {r4-r6,lr}
+ sub sp, sp, #0x8
+ mov r4, r2
+ mov r5, r1
+ ldr r2, [sp, #0x18]
+ mov r6, r0
+ mov r1, r3
+ bl SNDi_SetAlarmHandler
+_020CE998:
+ str r0, [sp]
+ mov r1, r6
+ mov r2, r5
+ mov r3, r4
+ mov r0, #0x12
+ bl PushCommand_impl
+ add sp, sp, #0x8
+ ldmia sp!, {r4-r6, lr}
+ bx lr
+
+ arm_func_start SND_SetupCapture
+SND_SetupCapture: ; 0x020CE9BC
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ mov r0, r0, lsl #0x1f
+ orr r0, r0, r1, lsl #0x1e
+ ldr r12, [sp, #0x8]
+ mov r1, r2
+ orr r0, r0, r12, lsl #0x1d
+ ldr r2, [sp, #0xc]
+ mov lr, #0x0
+ orr r0, r0, r2, lsl #0x1c
+ ldr r12, [sp, #0x10]
+ mov r2, r3
+ orr r3, r0, r12, lsl #0x1b
+ mov r0, #0x11
+ str lr, [sp, #0x0]
+ bl PushCommand_impl
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start SND_StopTimer
+SND_StopTimer: ; 0x020CEA08
+ stmdb sp!, {r4-r9,lr}
+ sub sp, sp, #0x4
+ mov r7, r2
+ mov r9, r0
+ mov r8, r1
+ mov r6, r3
+ mov r4, r7
+ mov r5, #0x0
+ b _020CEA44
+_020CEA2C:
+ ands r0, r4, #0x1
+ beq _020CEA3C
+ mov r0, r5
+ bl SNDi_IncAlarmId
+_020CEA3C:
+ add r5, r5, #0x1
+ mov r4, r4, lsr #0x1
+_020CEA44:
+ cmp r5, #0x8
+ bge _020CEA54
+ cmp r4, #0x0
+ bne _020CEA2C
+_020CEA54:
+ mov r1, r9
+ mov r2, r8
+ mov r3, r7
+ mov r0, #0xd
+ str r6, [sp, #0x0]
+ bl PushCommand_impl
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r9,lr}
+ bx lr
+
+ arm_func_start SND_StartTimer
+SND_StartTimer: ; 0x020CEA78
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ mov lr, r1
+ mov r12, r2
+ str r3, [sp, #0x0]
+ mov r1, r0
+ mov r2, lr
+ mov r3, r12
+ mov r0, #0xc
+ bl PushCommand_impl
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start SND_SetTrackAllocatableChannel
+SND_SetTrackAllocatableChannel: ; 0x020CEAAC
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ mov lr, r1
+ mov r3, r2
+ mov r12, #0x0
+ mov r1, r0
+ mov r2, lr
+ mov r0, #0x9
+ str r12, [sp, #0x0]
+ bl PushCommand_impl
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start SND_SetTrackPan
+SND_SetTrackPan: ; 0x020CEAE0
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ mov r3, r2
+ mov r12, #0x1
+ mov r2, #0x9
+ str r12, [sp, #0x0]
+ bl SNDi_SetTrackParam
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start SND_SetTrackPitch
+SND_SetTrackPitch: ; 0x020CEB08
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ mov r3, r2
+ mov r12, #0x2
+ mov r2, #0xc
+ str r12, [sp, #0x0]
+ bl SNDi_SetTrackParam
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start SND_SetPlayerChannelPriority
+SND_SetPlayerChannelPriority: ; 0x020CEB30
+ ldr ip, _020CEB44 ; =FUN_020CE6F8
+ mov r2, r1
+ mov r1, #0x4
+ mov r3, #0x1
+ bx r12
+ .balign 4
+_020CEB44: .word FUN_020CE6F8
+
+ arm_func_start SND_SetPlayerVolume
+SND_SetPlayerVolume: ; 0x020CEB48
+ ldr ip, _020CEB5C ; =FUN_020CE6F8
+ mov r2, r1
+ mov r1, #0x6
+ mov r3, #0x2
+ bx r12
+ .balign 4
+_020CEB5C: .word FUN_020CE6F8
+
+ arm_func_start SND_PauseSeq
+SND_PauseSeq: ; 0x020CEB60
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ mov r2, r1
+ mov r3, #0x0
+ mov r1, r0
+ mov r0, #0x4
+ str r3, [sp, #0x0]
+ bl PushCommand_impl
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start SND_StartPreparedSeq
+SND_StartPreparedSeq: ; 0x020CEB8C
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ mov r2, #0x0
+ mov r1, r0
+ mov r3, r2
+ mov r0, #0x3
+ str r2, [sp, #0x0]
+ bl PushCommand_impl
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start SND_PrepareSeq
+SND_PrepareSeq: ; 0x020CEBB8
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ mov lr, r1
+ mov r12, r2
+ str r3, [sp, #0x0]
+ mov r1, r0
+ mov r2, lr
+ mov r3, r12
+ mov r0, #0x2
+ bl PushCommand_impl
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start SND_StopSeq
+SND_StopSeq: ; 0x020CEBEC
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ mov r2, #0x0
+ mov r1, r0
+ mov r3, r2
+ mov r0, #0x1
+ str r2, [sp, #0x0]
+ bl PushCommand_impl
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+
+ arm_func_start SNDi_UnlockMutex
+SNDi_UnlockMutex: ; 0x020CEC18
+ ldr ip, _020CEC24 ; =OS_UnlockMutex
+ ldr r0, _020CEC28 ; =0x021D3820
+ bx r12
+ .balign 4
+_020CEC24: .word OS_UnlockMutex
+_020CEC28: .word 0x021D3820
+
+ arm_func_start SNDi_LockMutex
+SNDi_LockMutex: ; 0x020CEC2C
+ ldr ip, _020CEC38 ; =OS_LockMutex
+ ldr r0, _020CEC3C ; =0x021D3820
+ bx r12
+ .balign 4
+_020CEC38: .word OS_LockMutex
+_020CEC3C: .word 0x021D3820
+
+ arm_func_start SND_Init
+SND_Init: ; 0x020CEC40
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ ldr r1, _020CEC84 ; =0x021D381C
+ ldr r0, [r1, #0x0]
+ cmp r0, #0x0
+ addne sp, sp, #0x4
+ ldmneia sp!, {lr}
+ bxne lr
+ ldr r0, _020CEC88 ; =0x021D3820
+ mov r2, #0x1
+ str r2, [r1, #0x0]
+ bl OS_InitMutex
+ bl SND_CommandInit
+ bl SND_AlarmInit
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+ .balign 4
+_020CEC84: .word 0x021D381C
+_020CEC88: .word 0x021D3820
+
+ 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
+
+ arm_func_start SNDi_CallAlarmHandler
+SNDi_CallAlarmHandler: ; 0x020CF4B0
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ ldr r3, _020CF50C ; =0x021D5300
+ and r2, r0, #0xff
+ mov r1, #0xc
+ mla r3, r2, r1, r3
+ mov r1, r0, asr #0x8
+ ldrb r0, [r3, #0x8]
+ and r1, r1, #0xff
+ cmp r1, r0
+ addne sp, sp, #0x4
+ ldmneia sp!, {lr}
+ bxne lr
+ ldr r1, [r3, #0x0]
+ cmp r1, #0x0
+ addeq sp, sp, #0x4
+ ldmeqia sp!, {lr}
+ bxeq lr
+ ldr r0, [r3, #0x4]
+ blx r1
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+ .balign 4
+_020CF50C: .word 0x021D5300
+
+ arm_func_start SNDi_SetAlarmHandler
+SNDi_SetAlarmHandler:
+ mov r3, #0xc
+ mul r3, r0, r3
+ ldr r0, _020CF53C ; =0x021D5300
+ str r1, [r0, r3]
+ add r1, r0, r3
+ str r2, [r1, #0x4]
+ ldrb r0, [r1, #0x8]
+ add r0, r0, #0x1
+ strb r0, [r1, #0x8]
+ ldrb r0, [r1, #0x8]
+ bx lr
+ .balign 4
+_020CF53C: .word 0x021D5300
+
+ arm_func_start SNDi_IncAlarmId
+SNDi_IncAlarmId: ; 0x020CF540
+ ldr r2, _020CF55C ; =0x021D5300
+ mov r1, #0xc
+ mla r1, r0, r1, r2
+ ldrb r0, [r1, #0x8]
+ add r0, r0, #0x1
+ strb r0, [r1, #0x8]
+ bx lr
+ .balign 4
+_020CF55C: .word 0x021D5300
+
+ arm_func_start SND_AlarmInit
+SND_AlarmInit: ; 0x020CF560
+ ldr r1, _020CF58C ; =0x021D5300
+ mov r2, #0x0
+ mov r0, r2
+_020CF56C:
+ str r0, [r1, #0x0]
+ str r0, [r1, #0x4]
+ add r2, r2, #0x1
+ strb r0, [r1, #0x8]
+ cmp r2, #0x8
+ add r1, r1, #0xc
+ blt _020CF56C
+ bx lr
+ .balign 4
+_020CF58C: .word 0x021D5300
+
+ arm_func_start SNDi_InitSharedWork
+SNDi_InitSharedWork: ; 0x020CF590
+ stmdb sp!, {r4,lr}
+ mov r4, #0x0
+ str r4, [r0, #0x4]
+ strh r4, [r0, #0x8]
+ strh r4, [r0, #0xa]
+ mov r12, r0
+ str r4, [r0, #0x0]
+ mov r3, r4
+ mvn r2, #0x0
+_020CF5B4:
+ mov lr, r3
+ str r3, [r12, #0x40]
+_020CF5BC:
+ add r1, r12, lr, lsl #0x1
+ add lr, lr, #0x1
+ strh r2, [r1, #0x20]
+ cmp lr, #0x10
+ blt _020CF5BC
+ add r4, r4, #0x1
+ cmp r4, #0x10
+ add r12, r12, #0x24
+ blt _020CF5B4
+ mov r3, #0x0
+ mvn r2, #0x0
+_020CF5E8:
+ add r1, r0, r3, lsl #0x1
+ add r1, r1, #0x200
+ add r3, r3, #0x1
+ strh r2, [r1, #0x60]
+ cmp r3, #0x10
+ blt _020CF5E8
+ mov r1, #0x280
+ bl DC_FlushRange
+ ldmia sp!, {r4,lr}
+ bx lr
+
+ arm_func_start SNDi_GetFinishedCommandTag
+SNDi_GetFinishedCommandTag: ; 0x020CF610
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ ldr r0, _020CF640 ; =0x021D5360
+ mov r1, #0x4
+ ldr r0, [r0, #0x0]
+ bl DC_InvalidateRange
+ ldr r0, _020CF640 ; =0x021D5360
+ ldr r0, [r0, #0x0]
+ ldr r0, [r0, #0x0]
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+ .balign 4
+_020CF640: .word 0x021D5360
+
+ arm_func_start SND_GetPlayerTickCounter
+SND_GetPlayerTickCounter: ; 0x020CF644
+ stmdb sp!, {r4,lr}
+ mov r1, #0x24
+ mul r4, r0, r1
+ ldr r0, _020CF680 ; =0x021D5360
+ mov r1, #0x4
+ ldr r0, [r0, #0x0]
+ add r0, r0, #0x40
+ add r0, r0, r4
+ bl DC_InvalidateRange
+ ldr r0, _020CF680 ; =0x021D5360
+ ldr r0, [r0, #0x0]
+ add r0, r0, r4
+ ldr r0, [r0, #0x40]
+ ldmia sp!, {r4,lr}
+ bx lr
+ .balign 4
+_020CF680: .word 0x021D5360
+
+ arm_func_start SND_GetChannelStatus
+SND_GetChannelStatus: ; 0x020CF684
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ ldr r0, _020CF6B8 ; =0x021D5360
+ mov r1, #0x2
+ ldr r0, [r0, #0x0]
+ add r0, r0, #0x8
+ bl DC_InvalidateRange
+ ldr r0, _020CF6B8 ; =0x021D5360
+ ldr r0, [r0, #0x0]
+ ldrh r0, [r0, #0x8]
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+ .balign 4
+_020CF6B8: .word 0x021D5360
+
+ arm_func_start SND_GetPlayerStatus
+SND_GetPlayerStatus: ; 0x020CF6BC
+ stmdb sp!, {lr}
+ sub sp, sp, #0x4
+ ldr r0, _020CF6F0 ; =0x021D5360
+ mov r1, #0x4
+ ldr r0, [r0, #0x0]
+ add r0, r0, #0x4
+ bl DC_InvalidateRange
+ ldr r0, _020CF6F0 ; =0x021D5360
+ ldr r0, [r0, #0x0]
+ ldr r0, [r0, #0x4]
+ add sp, sp, #0x4
+ ldmia sp!, {lr}
+ bx lr
+ .balign 4
+_020CF6F0: .word 0x021D5360
+
+ arm_func_start SND_CalcChannelVolume
+SND_CalcChannelVolume: ; 0x020CF6F4
+ ldr r1, _020CF75C ; =0xFFFFFD2D
+ cmp r0, r1
+ movlt r0, r1
+ blt _020CF70C
+ cmp r0, #0x0
+ movgt r0, #0x0
+_020CF70C:
+ ldr r1, _020CF760 ; =0x000002D3
+ ldr r2, _020CF764 ; =0x02103CAC
+ add r3, r0, r1
+ mvn r1, #0xef
+ cmp r0, r1
+ ldrb r2, [r2, r3]
+ movlt r0, #0x3
+ blt _020CF74C
+ mvn r1, #0x77
+ cmp r0, r1
+ movlt r0, #0x2
+ blt _020CF74C
+ mvn r1, #0x3b
+ cmp r0, r1
+ movlt r0, #0x1
+ movge r0, #0x0
+_020CF74C:
+ orr r0, r2, r0, lsl #0x8
+ mov r0, r0, lsl #0x10
+ mov r0, r0, lsr #0x10
+ bx lr
+ .balign 4
+_020CF75C: .word 0xFFFFFD2D
+_020CF760: .word 0x000002D3
+_020CF764: .word 0x02103CAC
+
+ arm_func_start SND_GetWaveDataAddress
+SND_GetWaveDataAddress: ; 0x020CF768
+ stmdb sp!, {r4-r5,lr}
+ sub sp, sp, #0x4
+ mov r5, r0
+ mov r4, r1
+ bl SNDi_LockMutex
+ add r0, r5, r4, lsl #0x2
+ ldr r4, [r0, #0x3c]
+ cmp r4, #0x0
+ beq _020CF798
+ cmp r4, #0x2000000
+ addcc r4, r5, r4
+ b _020CF79C
+_020CF798:
+ mov r4, #0x0
+_020CF79C:
+ bl SNDi_UnlockMutex
+ mov r0, r4
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+
+ arm_func_start SND_SetWaveDataAddress
+SND_SetWaveDataAddress: ; 0x020CF7B0
+ stmdb sp!, {r4-r6,lr}
+ mov r6, r0
+ mov r5, r1
+ mov r4, r2
+ bl SNDi_LockMutex
+ add r0, r6, #0x3c
+ add r2, r6, r5, lsl #0x2
+ add r0, r0, r5, lsl #0x2
+ mov r1, #0x4
+ str r4, [r2, #0x3c]
+ bl DC_StoreRange
+ bl SNDi_UnlockMutex
+ ldmia sp!, {r4-r6,lr}
+ bx lr
+
+ arm_func_start SND_GetWaveDataCount
+SND_GetWaveDataCount: ; 0x020CF7E8
+ ldr r0, [r0, #0x38]
+ bx lr
+
+ arm_func_start SND_GetNextInstData
+SND_GetNextInstData: ; 0x020CF7F0
+ stmdb sp!, {r4-r5,lr}
+ sub sp, sp, #0x4
+ ldr r4, [r2, #0x0]
+ ldr r3, [r0, #0x38]
+ cmp r4, r3
+ bhs _020CF9B8
+ mov r12, #0x0
+_020CF80C:
+ add r3, r0, r4, lsl #0x2
+ ldr r4, [r3, #0x3c]
+ strb r4, [r1, #0x0]
+ ldrb r3, [r1, #0x0]
+ cmp r3, #0x10
+ bgt _020CF850
+ cmp r3, #0x10
+ bge _020CF8A8
+ cmp r3, #0x5
+ addls pc, pc, r3, lsl #0x2
+ b _020CF998
+_020CF838:
+ b _020CF998
+ b _020CF85C
+ b _020CF85C
+ b _020CF85C
+ b _020CF85C
+ b _020CF85C
+_020CF850:
+ cmp r3, #0x11
+ beq _020CF924
+ b _020CF998
+_020CF85C:
+ mov r3, r4, lsr #0x8
+ add r5, r0, r4, lsr #0x8
+ ldrh r4, [r0, r3]
+ ldrh r3, [r5, #0x2]
+ add sp, sp, #0x4
+ mov r0, #0x1
+ strh r4, [r1, #0x2]
+ strh r3, [r1, #0x4]
+ ldrh r4, [r5, #0x4]
+ ldrh r3, [r5, #0x6]
+ strh r4, [r1, #0x6]
+ strh r3, [r1, #0x8]
+ ldrh r3, [r5, #0x8]
+ strh r3, [r1, #0xA]
+ ldr r1, [r2]
+ add r1, r1, #0x1
+ str r1, [r2]
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+_020CF8A8:
+ add r5, r0, r4, lsr #0x8
+ b _020CF904
+_020CF8B0:
+ mov r0, #0xc
+ mla r12, lr, r0, r5
+ ldrh r4, [r12, #0x2]
+ ldrh r3, [r12, #0x4]
+ add sp, sp, #0x4
+ mov r0, #0x1
+ strh r4, [r1, #0x0]
+ strh r3, [r1, #0x2]
+ ldrh r4, [r12, #0x6]
+ ldrh r3, [r12, #0x8]
+ strh r4, [r1, #0x4]
+ strh r3, [r1, #0x6]
+ ldrh r4, [r12, #0xa]
+ ldrh r3, [r12, #0xc]
+ strh r4, [r1, #0x8]
+ strh r3, [r1, #0xa]
+ ldr r1, [r2, #0x4]
+ add r1, r1, #0x1
+ str r1, [r2, #0x4]
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+_020CF904:
+ ldrb r4, [r5, #0x1]
+ ldrb r3, [r5, #0x0]
+ ldr lr, [r2, #0x4]
+ sub r3, r4, r3
+ add r3, r3, #0x1
+ cmp lr, r3
+ blo _020CF8B0
+ b _020CF998
+_020CF924:
+ add r4, r0, r4, lsr #0x8
+ b _020CF98C
+_020CF92C:
+ ldrb lr, [r4, r3]
+ cmp lr, #0x0
+ beq _020CF998
+ mov r0, #0xc
+ mla lr, r3, r0, r4
+ ldrh r12, [lr, #0x8]
+ ldrh r3, [lr, #0xa]
+ add sp, sp, #0x4
+ mov r0, #0x1
+ strh r12, [r1, #0x0]
+ strh r3, [r1, #0x2]
+ ldrh r12, [lr, #0xc]
+ ldrh r3, [lr, #0xe]
+ strh r12, [r1, #0x4]
+ strh r3, [r1, #0x6]
+ ldrh r12, [lr, #0x10]
+ ldrh r3, [lr, #0x12]
+ strh r12, [r1, #0x8]
+ strh r3, [r1, #0xa]
+ ldr r1, [r2, #0x4]
+ add r1, r1, #0x1
+ str r1, [r2, #0x4]
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+_020CF98C:
+ ldr r3, [r2, #0x4]
+ cmp r3, #0x8
+ blo _020CF92C
+_020CF998:
+ ldr r3, [r2, #0x0]
+ add r3, r3, #0x1
+ str r3, [r2, #0x0]
+ str r12, [r2, #0x4]
+ ldr r4, [r2, #0x0]
+ ldr r3, [r0, #0x38]
+ cmp r4, r3
+ blo _020CF80C
+_020CF9B8:
+ mov r0, #0x0
+ add sp, sp, #0x4
+ ldmia sp!, {r4-r5,lr}
+ bx lr
+
+ arm_func_start SND_GetFirstInstDataPos
+SND_GetFirstInstDataPos: ; 0x020CF9C8
+ sub sp, sp, #0x8
+ mov r1, #0x0
+ str r1, [sp, #0x0]
+ str r1, [sp, #0x4]
+ str r1, [r0, #0x0]
+ str r1, [r0, #0x4]
+ add sp, sp, #0x8
+ bx lr
+
+ arm_func_start SND_DestroyWaveArc
+SND_DestroyWaveArc: ; 0x020CF9E8
+ stmdb sp!, {r4-r6,lr}
+ mov r4, r0
+ bl SNDi_LockMutex
+ ldr r0, [r4, #0x18]
+ cmp r0, #0x0
+ beq _020CFA28
+ mov r5, #0x0
+ mov r4, #0x8
+_020CFA08:
+ ldr r6, [r0, #0x4]
+ mov r1, r4
+ str r5, [r0, #0x0]
+ str r5, [r0, #0x4]
+ bl DC_StoreRange
+ mov r0, r6
+ cmp r6, #0x0
+ bne _020CFA08
+_020CFA28:
+ bl SNDi_UnlockMutex
+ ldmia sp!, {r4-r6,lr}
+ bx lr
+
+ arm_func_start SND_DestroyBank
+SND_DestroyBank: ; 0x020CFA34
+ stmdb sp!, {r4-r8,lr}
+ mov r7, r0
+ bl SNDi_LockMutex
+ add r5, r7, #0x18
+ mov r6, #0x0
+ mov r8, #0x8
+ mov r4, #0x3c
+_020CFA50:
+ add r1, r7, r6, lsl #0x3
+ ldr r0, [r1, #0x18]
+ cmp r0, #0x0
+ beq _020CFAB8
+ ldr r3, [r0, #0x18]
+ cmp r5, r3
+ bne _020CFA80
+ ldr r2, [r1, #0x1c]
+ mov r1, r4
+ str r2, [r0, #0x18]
+ bl DC_StoreRange
+ b _020CFAB8
+_020CFA80:
+ cmp r3, #0x0
+ beq _020CFAA0
+_020CFA88:
+ ldr r0, [r3, #0x4]
+ cmp r5, r0
+ beq _020CFAA0
+ mov r3, r0
+ cmp r0, #0x0
+ bne _020CFA88
+_020CFAA0:
+ add r0, r7, r6, lsl #0x3
+ ldr r2, [r0, #0x1c]
+ mov r0, r3
+ mov r1, r8
+ str r2, [r3, #0x4]
+ bl DC_StoreRange
+_020CFAB8:
+ add r6, r6, #0x1
+ cmp r6, #0x4
+ add r5, r5, #0x8
+ blt _020CFA50
+ bl SNDi_UnlockMutex
+ ldmia sp!, {r4-r8,lr}
+ bx lr
+
+ arm_func_start SND_AssignWaveArc
+SND_AssignWaveArc: ; 0x020CFAD4
+ stmdb sp!, {r4-r6,lr}
+ mov r6, r0
+ mov r5, r1
+ mov r4, r2
+ bl SNDi_LockMutex
+ add r3, r6, r5, lsl #0x3
+ ldr r2, [r3, #0x18]
+ mov r12, r5, lsl #0x3
+ cmp r2, #0x0
+ beq _020CFB70
+ cmp r4, r2
+ bne _020CFB10
+ bl SNDi_UnlockMutex
+ ldmia sp!, {r4-r6,lr}
+ bx lr
+_020CFB10:
+ add r1, r6, #0x18
+ ldr r0, [r2, #0x18]
+ add r12, r1, r12
+ cmp r12, r0
+ bne _020CFB3C
+ ldr r0, [r3, #0x1c]
+ mov r1, #0x3c
+ str r0, [r2, #0x18]
+ ldr r0, [r3, #0x18]
+ bl DC_StoreRange
+ b _020CFB70
+_020CFB3C:
+ cmp r0, #0x0
+ beq _020CFB5C
+_020CFB44:
+ ldr r1, [r0, #0x4]
+ cmp r12, r1
+ beq _020CFB5C
+ mov r0, r1
+ cmp r1, #0x0
+ bne _020CFB44
+_020CFB5C:
+ add r1, r6, r5, lsl #0x3
+ ldr r2, [r1, #0x1c]
+ mov r1, #0x8
+ str r2, [r0, #0x4]
+ bl DC_StoreRange
+_020CFB70:
+ add r0, r6, #0x18
+ ldr r1, [r4, #0x18]
+ add r0, r0, r5, lsl #0x3
+ str r0, [r4, #0x18]
+ add r0, r6, r5, lsl #0x3
+ str r1, [r0, #0x1c]
+ str r4, [r0, #0x18]
+ bl SNDi_UnlockMutex
+ mov r0, r6
+ mov r1, #0x3c
+ bl DC_StoreRange
+ mov r0, r4
+ mov r1, #0x3c
+ bl DC_StoreRange
+ ldmia sp!, {r4-r6,lr}
+ bx lr