summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm9/asm/SND_alarm.s82
-rw-r--r--arm9/asm/SND_bank.s328
-rw-r--r--arm9/asm/SND_command.s677
-rw-r--r--arm9/asm/SND_interface.s459
-rw-r--r--arm9/asm/SND_main.s55
-rw-r--r--arm9/asm/SND_util.s109
-rw-r--r--arm9/asm/SND_work.s121
-rw-r--r--arm9/asm/unk_020ADA84.s10
-rw-r--r--arm9/lib/include/SND_alarm.h25
-rw-r--r--arm9/lib/include/SND_bank.h95
-rw-r--r--arm9/lib/include/SND_command.h67
-rw-r--r--arm9/lib/include/SND_interface.h62
-rw-r--r--arm9/lib/include/SND_main.h185
-rw-r--r--arm9/lib/include/SND_util.h14
-rw-r--r--arm9/lib/include/SND_work.h92
-rw-r--r--arm9/lib/src/SND_alarm.c39
-rw-r--r--arm9/lib/src/SND_bank.c175
-rw-r--r--arm9/lib/src/SND_command.c333
-rw-r--r--arm9/lib/src/SND_interface.c172
-rw-r--r--arm9/lib/src/SND_main.c28
-rw-r--r--arm9/lib/src/SND_util.c238
-rw-r--r--arm9/lib/src/SND_work.c115
22 files changed, 1645 insertions, 1836 deletions
diff --git a/arm9/asm/SND_alarm.s b/arm9/asm/SND_alarm.s
deleted file mode 100644
index 1a76b9de..00000000
--- a/arm9/asm/SND_alarm.s
+++ /dev/null
@@ -1,82 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .section .bss
- .global UNK_021D5300
-UNK_021D5300: ; 0x021D5300
- .space 0x60
-
- .text
-
- arm_func_start SNDi_CallAlarmHandler
-SNDi_CallAlarmHandler: ; 0x020CF4B0
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- ldr r3, _020CF50C ; =UNK_021D5300
- 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 UNK_021D5300
-
- arm_func_start SNDi_SetAlarmHandler
-SNDi_SetAlarmHandler:
- mov r3, #0xc
- mul r3, r0, r3
- ldr r0, _020CF53C ; =UNK_021D5300
- 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 UNK_021D5300
-
- arm_func_start SNDi_IncAlarmId
-SNDi_IncAlarmId: ; 0x020CF540
- ldr r2, _020CF55C ; =UNK_021D5300
- 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 UNK_021D5300
-
- arm_func_start SND_AlarmInit
-SND_AlarmInit: ; 0x020CF560
- ldr r1, _020CF58C ; =UNK_021D5300
- 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 UNK_021D5300
diff --git a/arm9/asm/SND_bank.s b/arm9/asm/SND_bank.s
deleted file mode 100644
index df62e2b6..00000000
--- a/arm9/asm/SND_bank.s
+++ /dev/null
@@ -1,328 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .text
-
- 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
diff --git a/arm9/asm/SND_command.s b/arm9/asm/SND_command.s
deleted file mode 100644
index 0da65567..00000000
--- a/arm9/asm/SND_command.s
+++ /dev/null
@@ -1,677 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .extern UNK_021D5360
-
- .section .bss
-
- .global UNK_021D3838
-UNK_021D3838: ; 0x021D3838
- .space 0x4
-
- .global UNK_021D383C
-UNK_021D383C: ; 0x021D383C
- .space 0x4
-
- .global UNK_021D3840
-UNK_021D3840: ; 0x021D3840
- .space 0x4
-
- .global UNK_021D3844
-UNK_021D3844: ; 0x021D3844
- .space 0x4
-
- .global UNK_021D3848
-UNK_021D3848: ; 0x021D3848
- .space 0x4
-
- .global UNK_021D384C
-UNK_021D384C: ; 0x021D384C
- .space 0x4
-
- .global UNK_021D3850
-UNK_021D3850: ; 0x021D3850
- .space 0x4
-
- .global UNK_021D3854
-UNK_021D3854: ; 0x021D3854
- .space 0x4
-
- .global UNK_021D3858
-UNK_021D3858: ; 0x021D3858
- .space 0x4
-
- .global UNK_021D385C
-UNK_021D385C: ; 0x021D385C
- .space 0x24
-
- .global UNK_021D3880
-UNK_021D3880: ; 0x021D3880
- .space 0x280
-
- .global UNK_021D3B00
-UNK_021D3B00: ; 0x021D3B00
- .space 0x1000
-
- .global UNK_021D4B00
-UNK_021D4B00: ; 0x021D4B00
- .space 0x7e8
-
- .global UNK_021D52E8
-UNK_021D52E8: ; 0x021D52E8
- .space 0x18
-
- .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 ; =UNK_021D3838
- 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 ; =UNK_021D3848
- moveq r2, #0x0
- streq r2, [r1, #0x0]
- bl OS_RestoreInterrupts
- mov r0, r4
- ldmia sp!, {r4,lr}
- bx lr
- .balign 4
-_020CED24: .word UNK_021D3838
-_020CED28: .word UNK_021D3848
-
- 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 ; =UNK_021D3840
- 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 UNK_021D3840
-
- arm_func_start SND_CountFreeCommand
-SND_CountFreeCommand: ; 0x020CEE5C
- stmdb sp!, {r4,lr}
- bl OS_DisableInterrupts
- ldr r1, _020CEE98 ; =UNK_021D3838
- 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 UNK_021D3838
-
- arm_func_start SND_IsFinishedCommandTag
-SND_IsFinishedCommandTag:
- stmdb sp!, {r4,lr}
- mov r4, r0
- bl OS_DisableInterrupts
- ldr r1, _020CEEEC ; =UNK_021D383C
- 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 UNK_021D383C
-
- arm_func_start SND_GetCurrentCommandTag
-SND_GetCurrentCommandTag: ; 0x020CEEF0
- stmdb sp!, {r4,lr}
- bl OS_DisableInterrupts
- ldr r1, _020CEF24 ; =UNK_021D3840
- ldr r1, [r1, #0x0]
- cmp r1, #0x0
- ldreq r1, _020CEF28 ; =UNK_021D383C
- ldreq r4, [r1, #0x0]
- ldrne r1, _020CEF2C ; =UNK_021D3858
- ldrne r4, [r1, #0x0]
- bl OS_RestoreInterrupts
- mov r0, r4
- ldmia sp!, {r4,lr}
- bx lr
- .balign 4
-_020CEF24: .word UNK_021D3840
-_020CEF28: .word UNK_021D383C
-_020CEF2C: .word UNK_021D3858
-
- 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 ; =UNK_021D3840
- 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 ; =UNK_021D3854
- 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 ; =UNK_021D3854
- ldr r0, [r0, #0x0]
- cmp r0, #0x8
- bge _020CF024
-_020CF03C:
- ldr r0, _020CF16C ; =UNK_021D3B00
- mov r1, #0x1800
- bl DC_FlushRange
- ldr r1, _020CF164 ; =UNK_021D3840
- 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 UNK_021D3840
-_020CF168: .word UNK_021D3854
-_020CF16C: .word UNK_021D3B00
-_020CF170: .word UNK_021D3850
-_020CF174: .word UNK_021D385C
-_020CF178: .word UNK_021D3858
-_020CF17C: .word UNK_021D3844
-
- arm_func_start SND_PushCommand
-SND_PushCommand: ; 0x020CF180
- stmdb sp!, {r4,lr}
- mov r4, r0
- bl OS_DisableInterrupts
- ldr r2, _020CF1C0 ; =UNK_021D3844
- ldr r1, [r2, #0x0]
- cmp r1, #0x0
- ldreq r1, _020CF1C4 ; =UNK_021D3840
- 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 UNK_021D3844
-_020CF1C4: .word UNK_021D3840
-
- 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 ; =UNK_021D383C
- 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 ; =UNK_021D383C
- 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 ; =UNK_021D384C
- ldr r2, _020CF388 ; =UNK_021D385C
- 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 ; =UNK_021D3848
- ldr r3, _020CF390 ; =UNK_021D3854
- ldr r0, [r0, #0x0]
- ldr r2, _020CF380 ; =UNK_021D383C
- cmp r0, #0x0
- strne r4, [r0, #0x0]
- ldreq r0, _020CF394 ; =UNK_021D3838
- ldr lr, [r3, #0x0]
- streq r4, [r0, #0x0]
- ldr ip, _020CF38C ; =UNK_021D3848
- 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 UNK_021D383C
-_020CF384: .word UNK_021D384C
-_020CF388: .word UNK_021D385C
-_020CF38C: .word UNK_021D3848
-_020CF390: .word UNK_021D3854
-_020CF394: .word UNK_021D3838
-
- arm_func_start SND_CommandInit
-SND_CommandInit: ; 0x020CF398
- stmdb sp!, {r4-r11,lr}
- sub sp, sp, #0x4
- bl InitPXI
- ldr r3, _020CF478 ; =UNK_021D3B00
- ldr r0, _020CF47C ; =UNK_021D3838
- 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 ; =UNK_021D4B00
- mov r10, #0x0
- ldr r5, _020CF484 ; =UNK_021D3840
- ldr r4, _020CF488 ; =UNK_021D3844
- ldr lr, _020CF48C ; =UNK_021D3854
- ldr ip, _020CF490 ; =UNK_021D384C
- ldr r3, _020CF494 ; =UNK_021D3850
- ldr r1, _020CF498 ; =UNK_021D383C
- ldr sb, _020CF49C ; =UNK_021D52E8
- ldr r6, _020CF4A0 ; =UNK_021D3848
- ldr r2, _020CF4A4 ; =UNK_021D3858
- mov r8, #0x1
- ldr r0, _020CF4A8 ; =UNK_021D3880
- ldr fp, _020CF4AC ; =UNK_021D5360
- 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 UNK_021D3B00
-_020CF47C: .word UNK_021D3838
-_020CF480: .word UNK_021D4B00
-_020CF484: .word UNK_021D3840
-_020CF488: .word UNK_021D3844
-_020CF48C: .word UNK_021D3854
-_020CF490: .word UNK_021D384C
-_020CF494: .word UNK_021D3850
-_020CF498: .word UNK_021D383C
-_020CF49C: .word UNK_021D52E8
-_020CF4A0: .word UNK_021D3848
-_020CF4A4: .word UNK_021D3858
-_020CF4A8: .word UNK_021D3880
-_020CF4AC: .word UNK_021D5360
diff --git a/arm9/asm/SND_interface.s b/arm9/asm/SND_interface.s
deleted file mode 100644
index 121d325b..00000000
--- a/arm9/asm/SND_interface.s
+++ /dev/null
@@ -1,459 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .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
diff --git a/arm9/asm/SND_main.s b/arm9/asm/SND_main.s
deleted file mode 100644
index 49db7a65..00000000
--- a/arm9/asm/SND_main.s
+++ /dev/null
@@ -1,55 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .section .bss
-
- .global UNK_021D381C
-UNK_021D381C: ; 0x021D381C
- .space 0x4
-
- .global UNK_021D3820
-UNK_021D3820: ; 0x021D3820
- .space 0x18
-
- .text
-
- arm_func_start SNDi_UnlockMutex
-SNDi_UnlockMutex: ; 0x020CEC18
- ldr ip, _020CEC24 ; =OS_UnlockMutex
- ldr r0, _020CEC28 ; =UNK_021D3820
- bx r12
- .balign 4
-_020CEC24: .word OS_UnlockMutex
-_020CEC28: .word UNK_021D3820
-
- arm_func_start SNDi_LockMutex
-SNDi_LockMutex: ; 0x020CEC2C
- ldr ip, _020CEC38 ; =OS_LockMutex
- ldr r0, _020CEC3C ; =UNK_021D3820
- bx r12
- .balign 4
-_020CEC38: .word OS_LockMutex
-_020CEC3C: .word UNK_021D3820
-
- arm_func_start SND_Init
-SND_Init: ; 0x020CEC40
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- ldr r1, _020CEC84 ; =UNK_021D381C
- ldr r0, [r1, #0x0]
- cmp r0, #0x0
- addne sp, sp, #0x4
- ldmneia sp!, {lr}
- bxne lr
- ldr r0, _020CEC88 ; =UNK_021D3820
- 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 UNK_021D381C
-_020CEC88: .word UNK_021D3820
diff --git a/arm9/asm/SND_util.s b/arm9/asm/SND_util.s
deleted file mode 100644
index 7ac950b9..00000000
--- a/arm9/asm/SND_util.s
+++ /dev/null
@@ -1,109 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .section .rodata
-
- .global UNK_02103BAC
-UNK_02103BAC: ; 0x02103BAC
- .byte 0x00, 0x80, 0x5B, 0xFE, 0x97, 0xFE, 0xBB, 0xFE, 0xD4, 0xFE, 0xE7, 0xFE, 0xF7, 0xFE, 0x04, 0xFF
- .byte 0x10, 0xFF, 0x1A, 0xFF, 0x23, 0xFF, 0x2C, 0xFF, 0x33, 0xFF, 0x3A, 0xFF, 0x40, 0xFF, 0x46, 0xFF
- .byte 0x4C, 0xFF, 0x51, 0xFF, 0x56, 0xFF, 0x5B, 0xFF, 0x5F, 0xFF, 0x64, 0xFF, 0x68, 0xFF, 0x6C, 0xFF
- .byte 0x6F, 0xFF, 0x73, 0xFF, 0x76, 0xFF, 0x7A, 0xFF, 0x7D, 0xFF, 0x80, 0xFF, 0x83, 0xFF, 0x86, 0xFF
- .byte 0x88, 0xFF, 0x8B, 0xFF, 0x8E, 0xFF, 0x90, 0xFF, 0x92, 0xFF, 0x95, 0xFF, 0x97, 0xFF, 0x99, 0xFF
- .byte 0x9C, 0xFF, 0x9E, 0xFF, 0xA0, 0xFF, 0xA2, 0xFF, 0xA4, 0xFF, 0xA6, 0xFF, 0xA8, 0xFF, 0xAA, 0xFF
- .byte 0xAB, 0xFF, 0xAD, 0xFF, 0xAF, 0xFF, 0xB1, 0xFF, 0xB2, 0xFF, 0xB4, 0xFF, 0xB6, 0xFF, 0xB7, 0xFF
- .byte 0xB9, 0xFF, 0xBA, 0xFF, 0xBC, 0xFF, 0xBD, 0xFF, 0xBF, 0xFF, 0xC0, 0xFF, 0xC2, 0xFF, 0xC3, 0xFF
- .byte 0xC4, 0xFF, 0xC6, 0xFF, 0xC7, 0xFF, 0xC8, 0xFF, 0xCA, 0xFF, 0xCB, 0xFF, 0xCC, 0xFF, 0xCD, 0xFF
- .byte 0xCF, 0xFF, 0xD0, 0xFF, 0xD1, 0xFF, 0xD2, 0xFF, 0xD3, 0xFF, 0xD5, 0xFF, 0xD6, 0xFF, 0xD7, 0xFF
- .byte 0xD8, 0xFF, 0xD9, 0xFF, 0xDA, 0xFF, 0xDB, 0xFF, 0xDC, 0xFF, 0xDD, 0xFF, 0xDE, 0xFF, 0xDF, 0xFF
- .byte 0xE0, 0xFF, 0xE1, 0xFF, 0xE2, 0xFF, 0xE3, 0xFF, 0xE4, 0xFF, 0xE5, 0xFF, 0xE6, 0xFF, 0xE7, 0xFF
- .byte 0xE8, 0xFF, 0xE9, 0xFF, 0xE9, 0xFF, 0xEA, 0xFF, 0xEB, 0xFF, 0xEC, 0xFF, 0xED, 0xFF, 0xEE, 0xFF
- .byte 0xEF, 0xFF, 0xEF, 0xFF, 0xF0, 0xFF, 0xF1, 0xFF, 0xF2, 0xFF, 0xF3, 0xFF, 0xF4, 0xFF, 0xF4, 0xFF
- .byte 0xF5, 0xFF, 0xF6, 0xFF, 0xF7, 0xFF, 0xF7, 0xFF, 0xF8, 0xFF, 0xF9, 0xFF, 0xFA, 0xFF, 0xFA, 0xFF
- .byte 0xFB, 0xFF, 0xFC, 0xFF, 0xFD, 0xFF, 0xFD, 0xFF, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x00
-
- .global UNK_02103CAC
-UNK_02103CAC: ; 0x02103CAC
- .byte 0x00, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01
- .byte 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01
- .byte 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01
- .byte 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01
- .byte 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01
- .byte 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01
- .byte 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02
- .byte 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02
- .byte 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x02, 0x03, 0x03, 0x03
- .byte 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03
- .byte 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04
- .byte 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04, 0x04
- .byte 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05, 0x05
- .byte 0x05, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06, 0x06
- .byte 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x08, 0x08, 0x08, 0x08
- .byte 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09, 0x09
- .byte 0x09, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0A, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B, 0x0B
- .byte 0x0B, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0C, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0D, 0x0E
- .byte 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0E, 0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x10, 0x10, 0x10, 0x10, 0x10
- .byte 0x10, 0x11, 0x11, 0x11, 0x11, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13, 0x13, 0x13, 0x14
- .byte 0x14, 0x14, 0x14, 0x14, 0x15, 0x15, 0x15, 0x15, 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17, 0x18
- .byte 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x1A, 0x1A, 0x1A, 0x1B, 0x1B, 0x1B, 0x1C, 0x1C, 0x1C
- .byte 0x1D, 0x1D, 0x1D, 0x1E, 0x1E, 0x1E, 0x1F, 0x1F, 0x1F, 0x20, 0x20, 0x20, 0x21, 0x21, 0x22, 0x22
- .byte 0x22, 0x23, 0x23, 0x24, 0x24, 0x24, 0x25, 0x25, 0x26, 0x26, 0x27, 0x27, 0x27, 0x28, 0x28, 0x29
- .byte 0x29, 0x2A, 0x2A, 0x2B, 0x2B, 0x2C, 0x2C, 0x2D, 0x2D, 0x2E, 0x2E, 0x2F, 0x2F, 0x30, 0x31, 0x31
- .byte 0x32, 0x32, 0x33, 0x33, 0x34, 0x35, 0x35, 0x36, 0x36, 0x37, 0x38, 0x38, 0x39, 0x3A, 0x3A, 0x3B
- .byte 0x3C, 0x3C, 0x3D, 0x3E, 0x3F, 0x3F, 0x40, 0x41, 0x42, 0x42, 0x43, 0x44, 0x45, 0x45, 0x46, 0x47
- .byte 0x48, 0x49, 0x4A, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x52, 0x53, 0x54, 0x55
- .byte 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x67
- .byte 0x68, 0x69, 0x6A, 0x6B, 0x6D, 0x6E, 0x6F, 0x71, 0x72, 0x73, 0x75, 0x76, 0x77, 0x79, 0x7A, 0x7B
- .byte 0x7D, 0x7E, 0x7F, 0x20, 0x21, 0x21, 0x21, 0x22, 0x22, 0x23, 0x23, 0x23, 0x24, 0x24, 0x25, 0x25
- .byte 0x26, 0x26, 0x26, 0x27, 0x27, 0x28, 0x28, 0x29, 0x29, 0x2A, 0x2A, 0x2B, 0x2B, 0x2C, 0x2C, 0x2D
- .byte 0x2D, 0x2E, 0x2E, 0x2F, 0x2F, 0x30, 0x30, 0x31, 0x31, 0x32, 0x33, 0x33, 0x34, 0x34, 0x35, 0x36
- .byte 0x36, 0x37, 0x37, 0x38, 0x39, 0x39, 0x3A, 0x3B, 0x3B, 0x3C, 0x3D, 0x3E, 0x3E, 0x3F, 0x40, 0x40
- .byte 0x41, 0x42, 0x43, 0x43, 0x44, 0x45, 0x46, 0x47, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4D
- .byte 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D
- .byte 0x5E, 0x5F, 0x60, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6F, 0x70
- .byte 0x71, 0x73, 0x74, 0x75, 0x77, 0x78, 0x79, 0x7B, 0x7C, 0x7E, 0x7E, 0x40, 0x41, 0x42, 0x43, 0x43
- .byte 0x44, 0x45, 0x46, 0x47, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51
- .byte 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61
- .byte 0x62, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6B, 0x6C, 0x6D, 0x6E, 0x70, 0x71, 0x72, 0x74, 0x75
- .byte 0x76, 0x78, 0x79, 0x7B, 0x7C, 0x7D, 0x7E, 0x40, 0x41, 0x42, 0x42, 0x43, 0x44, 0x45, 0x46, 0x46
- .byte 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55
- .byte 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x65, 0x66
- .byte 0x67, 0x68, 0x69, 0x6A, 0x6C, 0x6D, 0x6E, 0x6F, 0x71, 0x72, 0x73, 0x75, 0x76, 0x77, 0x79, 0x7A
- .byte 0x7C, 0x7D, 0x7E, 0x7F
-
- .text
-
- 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 ; =UNK_02103CAC
- 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 UNK_02103CAC
diff --git a/arm9/asm/SND_work.s b/arm9/asm/SND_work.s
deleted file mode 100644
index 88ff04bb..00000000
--- a/arm9/asm/SND_work.s
+++ /dev/null
@@ -1,121 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .section .bss
-
- .global UNK_021D5360
-UNK_021D5360: ; 0x021D5360
- .space 0x4
-
- .text
-
- 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 ; =UNK_021D5360
- mov r1, #0x4
- ldr r0, [r0, #0x0]
- bl DC_InvalidateRange
- ldr r0, _020CF640 ; =UNK_021D5360
- ldr r0, [r0, #0x0]
- ldr r0, [r0, #0x0]
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
- .balign 4
-_020CF640: .word UNK_021D5360
-
- arm_func_start SND_GetPlayerTickCounter
-SND_GetPlayerTickCounter: ; 0x020CF644
- stmdb sp!, {r4,lr}
- mov r1, #0x24
- mul r4, r0, r1
- ldr r0, _020CF680 ; =UNK_021D5360
- mov r1, #0x4
- ldr r0, [r0, #0x0]
- add r0, r0, #0x40
- add r0, r0, r4
- bl DC_InvalidateRange
- ldr r0, _020CF680 ; =UNK_021D5360
- ldr r0, [r0, #0x0]
- add r0, r0, r4
- ldr r0, [r0, #0x40]
- ldmia sp!, {r4,lr}
- bx lr
- .balign 4
-_020CF680: .word UNK_021D5360
-
- arm_func_start SND_GetChannelStatus
-SND_GetChannelStatus: ; 0x020CF684
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- ldr r0, _020CF6B8 ; =UNK_021D5360
- mov r1, #0x2
- ldr r0, [r0, #0x0]
- add r0, r0, #0x8
- bl DC_InvalidateRange
- ldr r0, _020CF6B8 ; =UNK_021D5360
- ldr r0, [r0, #0x0]
- ldrh r0, [r0, #0x8]
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
- .balign 4
-_020CF6B8: .word UNK_021D5360
-
- arm_func_start SND_GetPlayerStatus
-SND_GetPlayerStatus: ; 0x020CF6BC
- stmdb sp!, {lr}
- sub sp, sp, #0x4
- ldr r0, _020CF6F0 ; =UNK_021D5360
- mov r1, #0x4
- ldr r0, [r0, #0x0]
- add r0, r0, #0x4
- bl DC_InvalidateRange
- ldr r0, _020CF6F0 ; =UNK_021D5360
- ldr r0, [r0, #0x0]
- ldr r0, [r0, #0x4]
- add sp, sp, #0x4
- ldmia sp!, {lr}
- bx lr
- .balign 4
-_020CF6F0: .word UNK_021D5360
diff --git a/arm9/asm/unk_020ADA84.s b/arm9/asm/unk_020ADA84.s
index db2eaa4b..e590a607 100644
--- a/arm9/asm/unk_020ADA84.s
+++ b/arm9/asm/unk_020ADA84.s
@@ -1,7 +1,7 @@
.include "asm/macros.inc"
.include "global.inc"
- .extern UNK_02103BAC
+ .extern SNDi_DecibelTable
.extern GXi_DmaId
.section .rodata
@@ -24277,7 +24277,7 @@ FUN_020C0BA0: ; 0x020C0BA0
ldmeqia sp!, {r4-r11,pc}
mov r0, #0x8000
rsb r0, r0, #0x0
- ldr r4, _020C0D18 ; =UNK_02103BAC
+ ldr r4, _020C0D18 ; =SNDi_DecibelTable
str r0, [sp, #0x4]
mov r5, #0x1
mov r11, #0x0
@@ -24367,7 +24367,7 @@ _020C0D00:
ldmia sp!, {r4-r11,pc}
.balign 4
_020C0D14: .word UNK_021D1E08
-_020C0D18: .word UNK_02103BAC
+_020C0D18: .word SNDi_DecibelTable
_020C0D1C: .word 0x00007FFF
arm_func_start FUN_020C0D20
@@ -27918,7 +27918,7 @@ FUN_020C3C88:
sub sp, sp, #0x4
ldr r5, _020C3D94 ; =UNK_021D2DFC
mov r7, #0x0
- ldr r4, _020C3D98 ; =UNK_02103BAC
+ ldr r4, _020C3D98 ; =SNDi_DecibelTable
_020C3C9C:
ldr r1, [r5, #0x110]
mov r0, r1, lsl #0x1f
@@ -27988,7 +27988,7 @@ _020C3D7C:
ldmia sp!, {r4-r7,pc}
.balign 4
_020C3D94: .word UNK_021D2DFC
-_020C3D98: .word UNK_02103BAC
+_020C3D98: .word SNDi_DecibelTable
arm_func_start FUN_020C3D9C
FUN_020C3D9C:
diff --git a/arm9/lib/include/SND_alarm.h b/arm9/lib/include/SND_alarm.h
new file mode 100644
index 00000000..cf5db862
--- /dev/null
+++ b/arm9/lib/include/SND_alarm.h
@@ -0,0 +1,25 @@
+#ifndef GUARD_SND_ALARM_H
+#define GUARD_SND_ALARM_H
+
+#include "global.h"
+#include "OS_alarm.h"
+
+typedef void (*SNDAlarmCallback)(void *);
+
+struct SNDAlarm {
+ u8 enable; // 0x00
+ u8 id; // 0x01
+ u16 unk_2; // 0x02
+ OSTick tick; // 0x04
+ OSTick period; // 0x0C
+ OSAlarm alarm; // 0x14
+}; // size = 0x40
+
+void SND_AlarmInit(void);
+void SNDi_IncAlarmId(u32 idx);
+u8 SNDi_SetAlarmHandler(u32 idx, SNDAlarmCallback cb, void *data);
+void SNDi_CallAlarmHandler(s32 idx);
+
+#define SND_ALARM_COUNT 8
+
+#endif
diff --git a/arm9/lib/include/SND_bank.h b/arm9/lib/include/SND_bank.h
new file mode 100644
index 00000000..b9000d57
--- /dev/null
+++ b/arm9/lib/include/SND_bank.h
@@ -0,0 +1,95 @@
+#ifndef GUARD_SND_BANK_H
+#define GUARD_SND_BANK_H
+
+#include "global.h"
+
+#include "SND_main.h"
+
+#define SND_INST_ILLEGAL 0
+#define SND_INST_PCM 1
+#define SND_INST_PSG 2
+#define SND_INST_NOISE 3
+#define SND_INST_DIRECTPCM 4
+#define SND_INST_DUMMY 5
+#define SND_INST_DRUM_TABLE 16
+#define SND_INST_KEY_SPLIT 17
+
+#define SND_BANK_MAX_WAVEARC 4
+#define SND_INST_MAX_KEYSPLIT 8
+
+#define SND_INST_OFFSET_TYPE(off) ((u8)off)
+#define SND_INST_OFFSET_NORMAL(bank, off) ((struct SNDInstParam *)((u8 *)bank + (u32)(off >> 8)))
+#define SND_INST_OFFSET_DRUMS(bank, off) ((struct SNDDrumSet *)((u8 *)bank + (u32)(off >> 8)))
+#define SND_INST_OFFSET_KEYSPL(bank, off) ((struct SNDKeySplit *)((u8 *)bank + (u32)(off >> 8)))
+
+struct SNDWaveArc;
+
+struct SNDWaveArcLink {
+ struct SNDWaveArc *waveArc; // 0x0
+ struct SNDWaveArcLink *waveArcLLnext; // 0x4
+}; // size = 0x8
+
+struct SNDBankData {
+ struct SNDBinaryFileHeader fileHeader; // 0x00
+ struct SNDBinaryBlockHeader blockHeader; // 0x10
+ struct SNDWaveArcLink waveArcLinks[SND_BANK_MAX_WAVEARC]; // 0x18
+ u32 instCount; // 0x38
+ u32 instOffsets[]; // 0x3C
+}; // size = 0x40
+
+struct SNDWaveArc {
+ struct SNDBinaryFileHeader fileHeader; // 0x00
+ struct SNDBinaryBlockHeader blockHeader; // 0x10
+ struct SNDWaveArcLink *waveArcLLHead; // 0x18
+ u8 unk_1C[28]; // 0x1C
+ u32 waveCount; // 0x38
+ u32 waveOffsets[]; // 0x3C
+}; // size = 0x3C
+
+struct SNDInstParam {
+ u16 wave[2]; // 0x0
+ u8 rootKey; // 0x4
+ u8 envAttack; // 0x5
+ u8 envDecay; // 0x6
+ u8 envSustain; // 0x7
+ u8 envRelease; // 0x8
+ u8 pan; // 0x9
+}; // size = 0xA
+
+struct SNDInstData {
+ u8 type; // 0x0
+ u8 unk_1; // 0x1
+ struct SNDInstParam param; // 0x2
+}; // size = 0xC
+
+struct SNDKeySplit {
+ u8 key[SND_INST_MAX_KEYSPLIT]; // 0x0
+ struct SNDInstData instruments[]; // 0x8
+}; // size = 0x8
+
+struct SNDDrumSet {
+ u8 minKey;
+ u8 maxKey;
+ struct SNDInstData instruments[];
+}; // size = 0x2
+
+struct SNDInstPos {
+ u32 program; // 0x0
+ u32 index; // 0x4
+}; // size = 0x8
+
+struct SNDWaveData {
+ struct SNDWaveParam param; // 0x0
+ u8 sampleData[]; // 0xC
+}; // size = 0xC
+
+void SND_AssignWaveArc(struct SNDBankData *bankData, s32 index, struct SNDWaveArc *waveArc);
+void SND_DestroyBank(struct SNDBankData *bankData);
+void SND_DestroyWaveArc(struct SNDWaveArc *waveArc);
+struct SNDInstPos SND_GetFirstInstDataPos(const struct SNDBankData *bankData);
+BOOL SND_GetNextInstData(const struct SNDBankData *bankData, struct SNDInstData *instData, struct SNDInstPos *instPos);
+u32 SND_GetWaveDataCount(const struct SNDWaveArc *waveArc);
+void SND_SetWaveDataAddress(struct SNDWaveArc *waveArc, s32 index, const struct SNDWaveData *waveData);
+const struct SNDWaveData *SND_GetWaveDataAddress(const struct SNDWaveArc *waveArc, s32 index);
+
+#endif // GUARD_SND_BANK_H
diff --git a/arm9/lib/include/SND_command.h b/arm9/lib/include/SND_command.h
new file mode 100644
index 00000000..ff392833
--- /dev/null
+++ b/arm9/lib/include/SND_command.h
@@ -0,0 +1,67 @@
+#ifndef GUARD_SND_COMMAND_H
+#define GUARD_SND_COMMAND_H
+
+#include "global.h"
+
+#define SND_CMD_COUNT 256
+#define SND_CMD_ARG_MAX 4
+
+#define SND_CMD_FLAG_NOBLOCK 0x0
+#define SND_CMD_FLAG_BLOCK 0x1
+#define SND_CMD_FLAG_IMMEDIATE 0x2
+
+#define SND_CMD_START_SEQ 0x00
+#define SND_CMD_STOP_SEQ 0x01
+#define SND_CMD_PREPARE_SEQ 0x02
+#define SND_CMD_START_PREPARED_SEQ 0x03
+#define SND_CMD_PAUSE_SEQ 0x04
+#define SND_CMD_SKIP_SEQ 0x05
+#define SND_CMD_PLAYER_PARAM 0x06
+#define SND_CMD_TRACK_PARAM 0x07
+#define SND_CMD_MUTE_TRACK 0x08
+#define SND_CMD_ALLOCATABLE_CHANNEL 0x09
+#define SND_CMD_PLAYER_LOCAL_VAR 0x0A
+#define SND_CMD_PLAYER_GLOBAL_VAR 0x0B
+#define SND_CMD_START_TIMER 0x0C
+#define SND_CMD_STOP_TIMER 0x0D
+#define SND_CMD_SETUP_CHANNEL_PCM 0x0E
+#define SND_CMD_SETUP_CHANNEL_PSG 0x0F
+#define SND_CMD_SETUP_CHANNEL_NOISE 0x10
+#define SND_CMD_SETUP_CAPTURE 0x11
+#define SND_CMD_SETUP_ALARM 0x12
+#define SND_CMD_CHANNEL_TIMER 0x13
+#define SND_CMD_CHANNEL_VOLUME 0x14
+#define SND_CMD_CHANNEL_PAN 0x15
+#define SND_CMD_SURROUND_DECAY 0x16
+#define SND_CMD_MASTER_VOLUME 0x17
+#define SND_CMD_MASTER_PAN 0x18
+#define SND_CMD_OUTPUT_SELECTOR 0x19
+#define SND_CMD_LOCK_CHANNEL 0x1A
+#define SND_CMD_UNLOCK_CHANNEL 0x1B
+#define SND_CMD_STOP_UNLOCKED_CHANNEL 0x1C
+#define SND_CMD_SET_SHARED_WORK 0x1D
+#define SND_CMD_INVALIDATE_SEQ 0x1E
+#define SND_CMD_INVALIDATE_BANK 0x1F
+#define SND_CMD_INVALIDATE_WAVE 0x20
+#define SND_CMD_READ_DRIVER_INFO 0x21
+
+struct SNDCommand {
+ struct SNDCommand *llNext; // 0x0
+ s32 id; // 0x4
+ u32 arg[SND_CMD_ARG_MAX]; // 0x8
+}; // size = 0x18
+
+void SND_CommandInit(void);
+const struct SNDCommand *SND_RecvCommandReply(u32 flags);
+struct SNDCommand *SND_AllocCommand(u32 flags);
+void SND_PushCommand(struct SNDCommand *cmd);
+BOOL SND_FlushCommand(u32 flags);
+void SND_WaitForCommandProc(u32 tag);
+void SND_WaitForFreeCommand(s32 count);
+u32 SND_GetCurrentCommandTag(void);
+BOOL SND_IsFinishedCommandTag(u32 tag);
+s32 SND_CountFreeCommand(void);
+s32 SND_CountReservedCommand(void);
+s32 SND_CountWaitingCommand(void);
+
+#endif // GUARD_SND_COMMAND_H
diff --git a/arm9/lib/include/SND_interface.h b/arm9/lib/include/SND_interface.h
new file mode 100644
index 00000000..bd2c3869
--- /dev/null
+++ b/arm9/lib/include/SND_interface.h
@@ -0,0 +1,62 @@
+#ifndef GUARD_SND_INTERFACE_H
+#define GUARD_SND_INTERFACE_H
+
+#include "global.h"
+#include "SND_bank.h"
+#include "SND_work.h"
+
+void SND_StartSeq(s32 player, const void *seqBasePtr, u32 seqOffset, struct SNDBankData *bankData);
+void SND_StopSeq(s32 player);
+void SND_PrepareSeq(s32 player, const void *seqBasePtr, u32 seqOffset, struct SNDBankData *bankData);
+void SND_StartPreparedSeq(s32 player);
+void SND_PauseSeq(s32 player, BOOL flag);
+
+void SND_SetPlayerTempoRatio(s32 player, s32 ratio);
+void SND_SetPlayerVolume(s32 player, s32 volume);
+void SND_SetPlayerChannelPriority(s32 player, s32 prio);
+void SND_SetPlayerLocalVariable(s32 player, s32 varNo, s16 var);
+void SND_SetPlayerGlobalVariable(s32 varNo, s16 var);
+
+void SND_SetTrackVolume(s32 player, u32 trackBitMask, s32 volume);
+void SND_SetTrackPitch(s32 player, u32 trackBitMask, s32 pitch);
+void SND_SetTrackPan(s32 player, u32 trackBitMask, s32 pan);
+void SND_SetTrackPanRange(s32 player, u32 trackBitMask, s32 panRange);
+void SND_SetTrackModDepth(s32 player, u32 trackBitMask, s32 depth);
+void SND_SetTrackModSpeed(s32 player, u32 trackBitMask, s32 speed);
+void SND_SetTrackAllocatableChannel(s32 player, u32 trackBitMask, u32 chnBitMask);
+void SND_SetTrackMute(s32 player, u32 trackBitMask, BOOL flag);
+
+void SND_StartTimer(u32 chnBitMask, u32 capBitMask, u32 alarmBitMask, u32 flags);
+void SND_StopTimer(u32 chnBitMask, u32 capBitMask, u32 alarmBitMask, u32 flags);
+
+void SND_SetupCapture(s32 capture, s32 format, void *bufferPtr, u32 length, BOOL loopFlag, s32 in, s32 out);
+void SND_SetupAlarm(s32 alarm, u32 tick, u32 period, SNDAlarmCallback cb, void *userData);
+
+void SND_StopUnlockedChannel(u32 chnBitMask, u32 flags);
+void SND_LockChannel(u32 chnBitMask, u32 flags);
+void SND_UnlockChannel(u32 chnBitMask, u32 flags);
+
+void SND_SetChannelTimer(u32 chnBitMask, s32 timer);
+void SND_SetChannelVolume(u32 chnBitMask, s32 volume, s32 chnDataShift);
+void SND_SetChannelPan(u32 chnBitMask, s32 pan);
+void SND_SetupChannelPcm(s32 chn, s32 waveFormat, const void *dataAddr, s32 loopMode, s32 loopStart, s32 dataLen, s32 volume, s32 chnDataShift, s32 timer, s32 pan);
+void SND_SetupChannelPsg(s32 chn, s32 sndDuty, s32 volume, s32 chnDataShift, s32 timer, s32 pan);
+void SND_SetupChannelNoise(s32 chn, s32 volume, s32 chnDataShift, s32 timer, s32 pan);
+
+void SND_InvalidateSeqData(const void *start, const void *end);
+void SND_InvalidateBankData(const void *start, const void *end);
+void SND_InvalidateWaveData(const void *start, const void *end);
+
+void SND_SetMasterVolume(s32 volume);
+void SND_SetOutputSelector(s32 left, s32 right, s32 channel1, s32 channel3);
+void SND_SetMasterPan(s32 pan);
+void SND_ResetMasterPan(void);
+
+void SND_ReadDriverInfo(struct SNDDriverInfo *info);
+
+void SNDi_SetPlayerParam(s32 player, u32 offset, u32 data, s32 size);
+void SNDi_SetTrackParam(s32 player, u32 trackBitMask, u32 offset, u32 data, s32 size);
+void SNDi_SetSurroundDecay(s32 decay);
+void SNDi_SkipSeq(s32 player, u32 tick);
+
+#endif // GUARD_SND_INTERFACE_H
diff --git a/arm9/lib/include/SND_main.h b/arm9/lib/include/SND_main.h
new file mode 100644
index 00000000..7412c1ae
--- /dev/null
+++ b/arm9/lib/include/SND_main.h
@@ -0,0 +1,185 @@
+#ifndef GUARD_SND_MAIN_H
+#define GUARD_SND_MAIN_H
+
+#include "global.h"
+
+void SNDi_UnlockMutex(void);
+void SNDi_LockMutex(void);
+void SND_Init(void);
+
+struct SNDBinaryFileHeader {
+ s8 signature[4]; // 0x0
+ u16 byteOrder; // 0x4
+ u16 version; // 0x6
+ u32 fileSize; // 0x8
+ u16 headerSize; // 0xC
+ u16 dataBlocks; // 0xE
+}; // size = 0x10
+
+typedef struct SNDBinaryBlockHeader {
+ u32 type; // 0x0
+ u32 size; // 0x4
+}; // size = 0x8
+
+struct SNDWaveParam {
+ u8 format; // 0x0
+ u8 loopEnabled; // 0x1
+ u16 samplerate; // 0x2
+ u16 timer; // 0x4
+ u16 loopStart; // 0x6
+ u32 loopLength; // 0x8
+}; // size = 0xC
+
+struct SNDLfoParam {
+ u8 target; // 0x0
+ u8 speed; // 0x1
+ u8 depth; // 0x2
+ u8 range; // 0x3
+ u16 delay; // 0x4
+}; // size = 0x6
+
+struct SNDLfo {
+ struct SNDLfoParam param; // 0x0
+ u16 delayCounter; // 0x6
+ u16 counter; // 0x8
+}; // size = 0xA
+
+struct SNDExChannel {
+ u8 id; // 0x00
+ u8 type; // 0x01
+ u8 envStatus; // 0x02
+
+ struct {
+ u8 active : 1;
+ u8 start : 1;
+ u8 autoSweep : 1;
+ u8 syncFlag : 5;
+ } flags; // 0x03
+
+ u8 panRange; // 0x04
+ u8 rootMidiKey; // 0x05
+ s16 userDecay2; // 0x06
+
+ u8 midiKey; // 0x08
+ u8 velocity; // 0x09
+ s8 initPan; // 0x0A
+ s8 userPan; // 0x0B
+
+ s16 userDecay; // 0x0C
+ s16 userPitch; // 0x0E
+
+ s32 envAttenuation; // 0x10
+ s32 sweepCounter; // 0x14
+ s32 sweepLength; // 0x18
+
+ u8 envAttack; // 0x1C
+ u8 envSustain; // 0x1D
+ u16 envDecay; // 0x1E
+ u16 envRelease; // 0x20
+ u8 priority; // 0x22
+ u8 pan; // 0x23
+ u16 volume; // 0x24
+ u16 timer; // 0x26
+
+ struct SNDLfo lfo; // 0x28
+
+ s16 sweepPitch; // 0x32
+
+ s32 length; // 0x34
+
+ struct SNDWaveParam waveParam; // 0x38
+
+ union {
+ const void *waveDataPtr;
+ u32 dutyCycle;
+ }; // 0x44
+
+ void (*callback)(struct SNDExChannel *chn, u32 status, void *userData); // 0x48
+ void *callbackUserData; // 0x4C
+
+ struct SNDExChannel *channelLLNext; // 0x50
+}; // size = 0x54
+
+#define SND_TRACK_COUNT_PER_PLAYER 16
+#define SND_INVALID_TRACK_INDEX 0xFF
+
+struct SNDPlayer {
+ struct {
+ u8 active : 1;
+ u8 prepared : 1;
+ u8 paused : 1;
+ } flags; // 0x0
+
+ u8 playerId; // 0x1
+ u8 unk_2[2]; // 0x2
+
+ u8 prio; // 0x4
+ u8 volume; // 0x5
+ s16 extFader; // 0x6
+
+ u8 tracks[SND_TRACK_COUNT_PER_PLAYER]; // 0x8
+
+ u16 tempo; // 0x18
+ u16 tempoRatio; // 0x1A
+ u16 tempoCounter; // 0x1C
+ u8 unk_1E[2]; // 0x1E
+
+ struct SNDBankData *bank; // 0x20
+}; // size = 0x24
+
+#define SND_TRACK_MAX_CALL 3
+
+struct SNDBankData;
+
+struct SNDTrack {
+ struct {
+ u8 active : 1;
+ u8 noteWait : 1;
+ u8 muted : 1;
+ u8 tie : 1;
+ u8 noteFinishWait : 1;
+ u8 portamento : 1;
+ u8 cmp : 1; // ???
+ u8 channelMask : 1;
+ } flags; // 0x00
+
+ u8 panRange; // 0x01
+ u16 program; // 0x02
+
+ u8 volume; // 0x04
+ u8 expression; // 0x05
+ s8 pitchBend; // 0x06
+ u8 bendRange; // 0x07
+
+ s8 pan; // 0x08
+ s8 extPan; // 0x09
+ s16 extFader; // 0x0A
+ s16 extPitch; // 0x0C
+ u8 envAttack; // 0x0E
+ u8 envDecay; // 0x0F
+ u8 envSustain; // 0x10
+ u8 envRelease; // 0x11
+ u8 priority; // 0x12
+ s8 transpose; // 0x13
+
+ u8 portamentoKey; // 0x14
+ u8 portamentoTime; // 0x15
+ s16 sweepPitch; // 0x16
+
+ struct SNDLfoParam mod; // 0x18
+ u16 channelMask; // 0x1E
+
+ s32 wait; // 0x20
+
+ const u8 *trackDataStart; // 0x24
+ const u8 *trackDataPos; // 0x28
+ const u8 *posCallStack[SND_TRACK_MAX_CALL]; // 0x34
+ u8 loopCount[SND_TRACK_MAX_CALL]; // 0x38
+ u8 callStackDepth; // 0x3B
+
+ struct SNDExChannel *channelLLHead; // 0x3C
+}; // size = 0x40
+
+
+
+#endif // GUARD_SND_MAIN_H
diff --git a/arm9/lib/include/SND_util.h b/arm9/lib/include/SND_util.h
new file mode 100644
index 00000000..4137459a
--- /dev/null
+++ b/arm9/lib/include/SND_util.h
@@ -0,0 +1,14 @@
+#ifndef GUARD_SND_UTIL_H
+#define GUARD_SND_UTIL_H
+
+#include "global.h"
+
+void SND_CalcTimer(void);
+u16 SND_CalcChannelVolume(s32 x);
+
+extern const s16 SNDi_DecibelTable[0x80];
+
+// not used in pokediamond
+//extern const s16 SNDi_DecibelSquareTable[0x80];
+
+#endif // GUARD_SND_UTIL_H
diff --git a/arm9/lib/include/SND_work.h b/arm9/lib/include/SND_work.h
new file mode 100644
index 00000000..dec2bd71
--- /dev/null
+++ b/arm9/lib/include/SND_work.h
@@ -0,0 +1,92 @@
+#ifndef GUARD_SND_WORK_H
+#define GUARD_SND_WORK_H
+
+#include "global.h"
+
+#include "SND_main.h"
+#include "SND_alarm.h"
+
+#define SND_PLAYER_COUNT 16
+#define SND_CHANNEL_COUNT 16
+#define SND_TRACK_COUNT 32
+
+struct SNDWork {
+ struct SNDExChannel channels[SND_CHANNEL_COUNT]; // 0x00
+ struct SNDPlayer players[SND_PLAYER_COUNT]; // 0x540
+ struct SNDTrack tracks[SND_TRACK_COUNT]; // 0x780
+ struct SNDAlarm alarms[SND_ALARM_COUNT]; // 0xF80
+}; // size = 0x1180
+
+struct SNDSharedWork {
+ u32 finishedCommandTag; // 0x0
+ u32 playerStatus; // 0x4
+ u16 channelStatus; // 0x8
+ u16 captureStatus; // 0xA
+ u8 unk_C[0x14]; // 0xC
+ struct {
+ s16 localVars[16]; // local 0x0
+ u32 tickCounter; // local 0x20
+ } players[SND_PLAYER_COUNT]; // 0x20
+ s16 globalVars[16]; // 0x260
+}; // size = 0x280
+
+struct SNDDriverInfo {
+ struct SNDWork work; // 0x0000
+ u32 channelControls[SND_CHANNEL_COUNT]; // 0x1180
+ struct SNDWork *workPtr; // 0x11C0
+ u32 lockedChannels; // 0x11C4
+ u8 unk_XXX[24]; // 0x11C8
+}; // size = 0x11E0
+
+struct SNDChannelInfo {
+ struct {
+ BOOL active : 1;
+ BOOL locked: 1;
+ } flags; // 0x0
+ u16 volume; // 0x4
+ u8 pan; // 0x6
+ u8 unk_7; // 0x7
+ s32 envStatus; // 0x8
+}; // size = 0xC
+
+struct SNDPlayerInfo {
+ struct {
+ BOOL active : 1;
+ BOOL paused : 1;
+ } flags; // 0x0
+ u16 trackBitMask; // 0x4
+ u16 tempo; // 0x6
+ u8 volume; // 0x8
+ u8 unk_9[3]; // 0x9
+}; // size = 0xC
+
+struct SNDTrackInfo {
+ u16 program; // 0x0
+ u8 volume; // 0x2
+ u8 expression; // 0x3
+
+ s8 pitchBend; // 0x4
+ u8 bendRange; // 0x5
+ u8 pan; // 0x6
+ s8 transpose; // 0x7
+
+ u8 unk_8; // 0x8
+ u8 chnCount; // 0x9
+ u8 channel[SND_CHANNEL_COUNT]; // 0xA
+}; // size = 0x1A
+
+u32 SND_GetPlayerStatus(void);
+u16 SND_GetChannelStatus(void);
+//u16 SND_GetCaptureStatus(void);
+u32 SND_GetPlayerTickCounter(u32 playerId);
+//s16 SND_GetPlayerLocalVariable(u32 playerId, u32 var);
+//s16 SND_GetPlayerGlobalVariable(u32 var);
+//BOOL SND_ReadChannelInfo(const SNDDriverInfo *driverInfo, s32 chnId, SNDChannelInfo *chnInfo);
+//BOOL SND_ReadPlayerInfo(const SNDDriverInfo *driverInfo, s32 playerId, s32 trackId, SNDPlayerInfo *playerInfo);
+//BOOL SND_ReadTrackInfo(const SNDDriverInfo *driverInfo s32 playerId, s32 trackId, SNDTrackInfo *trackInfo);
+u32 SNDi_GetFinishedCommandTag(void);
+void SNDi_InitSharedWork(struct SNDSharedWork *sw);
+
+extern struct SNDSharedWork *SNDi_SharedWork;
+
+#endif // GUARD_SND_WORK_H
diff --git a/arm9/lib/src/SND_alarm.c b/arm9/lib/src/SND_alarm.c
new file mode 100644
index 00000000..b6178c8d
--- /dev/null
+++ b/arm9/lib/src/SND_alarm.c
@@ -0,0 +1,39 @@
+#include "SND_alarm.h"
+
+struct AlarmCallback {
+ SNDAlarmCallback cb;
+ void *data;
+ u8 id;
+};
+
+static struct AlarmCallback sCallbackTable[SND_ALARM_COUNT];
+
+ARM_FUNC void SND_AlarmInit(void) {
+ for (s32 i = 0; i < SND_ALARM_COUNT; i++) {
+ sCallbackTable[i].cb = NULL;
+ sCallbackTable[i].data = NULL;
+ sCallbackTable[i].id = 0;
+ }
+}
+
+ARM_FUNC void SNDi_IncAlarmId(u32 idx) {
+ struct AlarmCallback *ac = &sCallbackTable[idx];
+ ac->id++;
+}
+
+ARM_FUNC u8 SNDi_SetAlarmHandler(u32 idx, SNDAlarmCallback cb, void *data) {
+ struct AlarmCallback *ac = &sCallbackTable[idx];
+ ac->cb = cb;
+ ac->data = data;
+ ac->id++;
+ return ac->id;
+}
+
+ARM_FUNC void SNDi_CallAlarmHandler(s32 idx) {
+ struct AlarmCallback *ac = &sCallbackTable[idx & 0xFF];
+ if (((idx >> 8) & 0xFF) != ac->id)
+ return;
+ if (ac->cb == NULL)
+ return;
+ ac->cb(ac->data);
+}
diff --git a/arm9/lib/src/SND_bank.c b/arm9/lib/src/SND_bank.c
new file mode 100644
index 00000000..bc339234
--- /dev/null
+++ b/arm9/lib/src/SND_bank.c
@@ -0,0 +1,175 @@
+#include "SND_bank.h"
+#include "OS_mutex.h"
+
+void OS_LockMutex(struct OSMutex *);
+void OS_UnlockMutex(struct OSMutex *);
+void DC_StoreRange(const void *, u32);
+
+/*
+ * WaveArc linking seems to work like the following:
+ *
+ * Each SNDBankData can have up to 4 WaveArcs assigned.
+ * To avoid loading the same WaveArc by multiple banks,
+ * a linked list using WaveArcLinks is chained through all banks
+ * which use a WaveArc.
+ *
+ * That WaveArc has a head pointer, which points to the first
+ * WaveArcLink in that chain of banks.
+ */
+
+/*
+ * Set bank's wavearc link at index to specified wavearc
+ */
+ARM_FUNC void SND_AssignWaveArc(struct SNDBankData *bankData, s32 index, struct SNDWaveArc *waveArc) {
+ SNDi_LockMutex();
+ struct SNDWaveArc *selectedWaveArc = bankData->waveArcLinks[index].waveArc;
+ if (selectedWaveArc != NULL) {
+ if (waveArc == selectedWaveArc) {
+ SNDi_UnlockMutex();
+ return;
+ }
+
+ if (&bankData->waveArcLinks[index] == selectedWaveArc->waveArcLLHead) {
+ selectedWaveArc->waveArcLLHead = bankData->waveArcLinks[index].waveArcLLnext;
+ DC_StoreRange(bankData->waveArcLinks[index].waveArc, sizeof(struct SNDWaveArc));
+ } else {
+ struct SNDWaveArcLink *cur;
+ for (cur = selectedWaveArc->waveArcLLHead; cur != NULL; cur = cur->waveArcLLnext) {
+ if (&bankData->waveArcLinks[index] == cur->waveArcLLnext)
+ break;
+ }
+ cur->waveArcLLnext = bankData->waveArcLinks[index].waveArcLLnext;
+ DC_StoreRange(cur, sizeof(*cur));
+ }
+ }
+ struct SNDWaveArcLink *oldHead = waveArc->waveArcLLHead;
+ waveArc->waveArcLLHead = &bankData->waveArcLinks[index];
+ bankData->waveArcLinks[index].waveArcLLnext = oldHead;
+ bankData->waveArcLinks[index].waveArc = waveArc;
+ // BUG: Shouldn't the mutex unlock be after writing to cache?
+ SNDi_UnlockMutex();
+ DC_StoreRange(bankData, sizeof(*bankData));
+ DC_StoreRange(waveArc, sizeof(*waveArc));
+}
+
+ARM_FUNC void SND_DestroyBank(struct SNDBankData *bankData) {
+ SNDi_LockMutex();
+
+ for (s32 i = 0; i < SND_BANK_MAX_WAVEARC; i++) {
+ struct SNDWaveArcLink *curWaveArcLink = &bankData->waveArcLinks[i];
+ struct SNDWaveArc *curWaveArc = bankData->waveArcLinks[i].waveArc;
+
+ if (curWaveArc == NULL)
+ continue;
+
+ if (curWaveArcLink == curWaveArc->waveArcLLHead) {
+ curWaveArc->waveArcLLHead = bankData->waveArcLinks[i].waveArcLLnext;
+ DC_StoreRange(curWaveArc, sizeof(*curWaveArc));
+ } else {
+ struct SNDWaveArcLink *cur;
+ for (cur = curWaveArc->waveArcLLHead; cur != NULL; cur = cur->waveArcLLnext) {
+ if (&bankData->waveArcLinks[i] == cur->waveArcLLnext)
+ break;
+ }
+ cur->waveArcLLnext = bankData->waveArcLinks[i].waveArcLLnext;
+ DC_StoreRange(cur, sizeof(*cur));
+ }
+ }
+
+ SNDi_UnlockMutex();
+}
+
+ARM_FUNC void SND_DestroyWaveArc(struct SNDWaveArc *waveArc) {
+ SNDi_LockMutex();
+ struct SNDWaveArcLink *cur = waveArc->waveArcLLHead;
+
+ while (cur != NULL) {
+ struct SNDWaveArcLink *newCur = cur->waveArcLLnext;
+ cur->waveArc = NULL;
+ cur->waveArcLLnext = NULL;
+ DC_StoreRange(cur, sizeof(*cur));
+ cur = newCur;
+ }
+
+ SNDi_UnlockMutex();
+}
+
+ARM_FUNC struct SNDInstPos SND_GetFirstInstDataPos(const struct SNDBankData *bankData) {
+ struct SNDInstPos retval;
+ retval.program = 0;
+ retval.index = 0;
+ return retval;
+}
+
+ARM_FUNC static inline struct SNDDrumSet *test(const struct SNDBankData *bank, u32 off) {
+ return (struct SNDDrumSet *)((u8 *)bank + (off >> 8));
+}
+
+ARM_FUNC BOOL SND_GetNextInstData(const struct SNDBankData *bankData, struct SNDInstData *instData, struct SNDInstPos *instPos) {
+ while (instPos->program < bankData->instCount) {
+ struct SNDDrumSet *drums;
+ struct SNDKeySplit *keySplit;
+
+ u32 instOffset = bankData->instOffsets[instPos->program];
+ instData->type = SND_INST_OFFSET_TYPE(instOffset);
+
+ switch (instData->type) {
+ case SND_INST_PCM:
+ case SND_INST_PSG:
+ case SND_INST_NOISE:
+ case SND_INST_DIRECTPCM:
+ case SND_INST_DUMMY:
+ instData->param = *SND_INST_OFFSET_NORMAL(bankData, instOffset);
+ instPos->program++;
+ return TRUE;
+ case SND_INST_DRUM_TABLE:
+ drums = SND_INST_OFFSET_DRUMS(bankData, instOffset);
+ // silly programming 101: put a loop in a place that never loops
+ for (; instPos->index < drums->maxKey - drums->minKey + 1;) {
+ *instData = drums->instruments[instPos->index];
+ instPos->index++;
+ return TRUE;
+ }
+ break;
+ case SND_INST_KEY_SPLIT:
+ keySplit = SND_INST_OFFSET_KEYSPL(bankData, instOffset);
+ for (; instPos->index < SND_INST_MAX_KEYSPLIT;) {
+ if (keySplit->key[instPos->index] == 0)
+ break;
+ *instData = keySplit->instruments[instPos->index];
+ instPos->index++;
+ return TRUE;
+ }
+ break;
+ }
+
+ instPos->program++;
+ instPos->index = 0;
+ }
+ return FALSE;
+}
+
+ARM_FUNC u32 SND_GetWaveDataCount(const struct SNDWaveArc *waveArc) {
+ return waveArc->waveCount;
+}
+
+ARM_FUNC void SND_SetWaveDataAddress(struct SNDWaveArc *waveArc, s32 index, const struct SNDWaveData *waveData) {
+ SNDi_LockMutex();
+ waveArc->waveOffsets[index] = (u32)waveData;
+ DC_StoreRange(&waveArc->waveOffsets[index], sizeof(u32));
+ SNDi_UnlockMutex();
+}
+
+ARM_FUNC const struct SNDWaveData *SND_GetWaveDataAddress(const struct SNDWaveArc *waveArc, s32 index) {
+ SNDi_LockMutex();
+ u32 retval = waveArc->waveOffsets[index];
+ if (retval != 0) {
+ // < 0x2000000 aka, not a pointer to main RAM
+ if (retval < 0x2000000)
+ retval = (u32)&((u8 *)waveArc)[retval];
+ } else {
+ retval = 0;
+ }
+ SNDi_UnlockMutex();
+ return (struct SNDWaveData *)retval;
+}
diff --git a/arm9/lib/src/SND_command.c b/arm9/lib/src/SND_command.c
new file mode 100644
index 00000000..4a867ce3
--- /dev/null
+++ b/arm9/lib/src/SND_command.c
@@ -0,0 +1,333 @@
+#include "SND_command.h"
+#include "SND_work.h"
+#include "OS_system.h"
+
+#define SND_CMD_WAIT_QUEUE_COUNT 8
+
+static struct SNDCommand sCommandArray[SND_CMD_COUNT];
+static struct SNDSharedWork sSharedWork;
+static struct SNDCommand *sWaitingCommandListQueue[SND_CMD_WAIT_QUEUE_COUNT + 1]; // not sure why this is one element to large
+static struct SNDCommand *sReserveList;
+static struct SNDCommand *sReserveListEnd;
+static struct SNDCommand *sFreeListEnd;
+static s32 sWaitingCommandListQueueRead;
+static s32 sWaitingCommandListQueueWrite;
+static s32 sWaitingCommandListCount;
+static u32 sCurrentTag;
+static u32 sFinishedTag;
+static struct SNDCommand *sFreeList;
+
+// TODO remove these function declarations once they are in the headers
+extern s32 PXI_SendWordByFifo(u32, u32, u32);
+extern void PXI_SetFifoRecvCallback(u32, void (*)(s32, s32));
+extern BOOL PXI_IsCallbackReady(u32, u32);
+
+static void InitPXI(void);
+static void RequestCommandProc(void);
+static struct SNDCommand *AllocCommand(void);
+static BOOL IsCommandAvailable(void);
+
+ARM_FUNC void SND_CommandInit(void) {
+ InitPXI();
+ sFreeList = sCommandArray;
+ for (int i = 0; i < SND_CMD_COUNT - 1; i++) {
+ sCommandArray[i].llNext = &sCommandArray[i+1];
+ }
+ sCommandArray[SND_CMD_COUNT - 1].llNext = NULL;
+ sFreeListEnd = &sCommandArray[SND_CMD_COUNT - 1];
+ sReserveList = NULL;
+ sReserveListEnd = NULL;
+ sWaitingCommandListCount = 0;
+ sWaitingCommandListQueueRead = 0;
+ sWaitingCommandListQueueWrite = 0;
+ sCurrentTag = 1;
+ sFinishedTag = 0;
+ SNDi_SharedWork = &sSharedWork;
+ SNDi_InitSharedWork(SNDi_SharedWork);
+
+ struct SNDCommand *cmd = SND_AllocCommand(SND_CMD_FLAG_BLOCK);
+ if (cmd == NULL)
+ return;
+
+ cmd->id = SND_CMD_SET_SHARED_WORK;
+ cmd->arg[0] = (u32)SNDi_SharedWork;
+ SND_PushCommand(cmd);
+ SND_FlushCommand(SND_CMD_FLAG_BLOCK);
+}
+
+ARM_FUNC const struct SNDCommand *SND_RecvCommandReply(u32 flags) {
+ OSIntrMode oldirq = OS_DisableInterrupts();
+
+ if (flags & SND_CMD_FLAG_BLOCK) {
+ u32 tag = SNDi_GetFinishedCommandTag();
+ while (sFinishedTag == tag) {
+ OS_RestoreInterrupts(oldirq);
+ OS_SpinWait(100);
+ oldirq = OS_DisableInterrupts();
+ tag = SNDi_GetFinishedCommandTag();
+ }
+ } else {
+ u32 tag = SNDi_GetFinishedCommandTag();
+ if (sFinishedTag == tag) {
+ OS_RestoreInterrupts(oldirq);
+ return NULL;
+ }
+ }
+
+ struct SNDCommand *queueRead = sWaitingCommandListQueue[sWaitingCommandListQueueRead];
+
+ if (++sWaitingCommandListQueueRead > SND_CMD_WAIT_QUEUE_COUNT)
+ sWaitingCommandListQueueRead = 0;
+
+ struct SNDCommand *cur = queueRead;
+ while (cur->llNext != NULL)
+ cur = cur->llNext;
+
+ if (sFreeListEnd != NULL) {
+ sFreeListEnd->llNext = queueRead;
+ } else {
+ sFreeList = queueRead;
+ }
+
+ sFreeListEnd = cur;
+ sWaitingCommandListCount--;
+ sFinishedTag++;
+
+ OS_RestoreInterrupts(oldirq);
+ return queueRead;
+}
+
+ARM_FUNC struct SNDCommand *SND_AllocCommand(u32 flags) {
+ struct SNDCommand *cmd;
+ if (!IsCommandAvailable())
+ return NULL;
+
+ cmd = AllocCommand();
+ if (cmd != NULL)
+ return cmd;
+
+ if ((flags & SND_CMD_FLAG_BLOCK) == 0)
+ return NULL;
+
+ if (SND_CountWaitingCommand() > 0) {
+ while (SND_RecvCommandReply(SND_CMD_FLAG_NOBLOCK) != NULL) { }
+
+ cmd = AllocCommand();
+ if (cmd != NULL)
+ return cmd;
+ } else {
+ SND_FlushCommand(SND_CMD_FLAG_BLOCK);
+ }
+
+ RequestCommandProc();
+
+ do {
+ SND_RecvCommandReply(SND_CMD_FLAG_BLOCK);
+ cmd = AllocCommand();
+ } while (cmd == NULL);
+ return cmd;
+}
+
+ARM_FUNC void SND_PushCommand(struct SNDCommand *cmd) {
+ OSIntrMode oldirq = OS_DisableInterrupts();
+
+ struct SNDCommand *newend = cmd;
+ if (sReserveListEnd == NULL) {
+ sReserveList = cmd;
+ sReserveListEnd = cmd;
+ } else {
+ sReserveListEnd->llNext = cmd;
+ sReserveListEnd = cmd;
+ }
+
+ cmd->llNext = NULL;
+
+ OS_RestoreInterrupts(oldirq);
+}
+
+ARM_FUNC BOOL SND_FlushCommand(u32 flags) {
+ OSIntrMode oldirq = OS_DisableInterrupts();
+
+ if (sReserveList == NULL) {
+ OS_RestoreInterrupts(oldirq);
+ return TRUE;
+ }
+
+ if (sWaitingCommandListCount >= SND_CMD_WAIT_QUEUE_COUNT) {
+ if ((flags & SND_CMD_FLAG_BLOCK) == 0) {
+ OS_RestoreInterrupts(oldirq);
+ return FALSE;
+ }
+
+ do {
+ SND_RecvCommandReply(SND_CMD_FLAG_BLOCK);
+ } while (sWaitingCommandListCount >= SND_CMD_WAIT_QUEUE_COUNT);
+ }
+
+ DC_FlushRange(sCommandArray, sizeof(sCommandArray));
+
+ s32 result = PXI_SendWordByFifo(7, (u32)sReserveList, 0);
+ if (result < 0) {
+ if ((flags & SND_CMD_FLAG_BLOCK) == 0) {
+ OS_RestoreInterrupts(oldirq);
+ return FALSE;
+ }
+
+ result = PXI_SendWordByFifo(7, (u32)sReserveList, 0);
+ while (result < 0) {
+ OS_RestoreInterrupts(oldirq);
+ OS_SpinWait(100);
+ oldirq = OS_DisableInterrupts();
+ result = PXI_SendWordByFifo(7, (u32)sReserveList, 0);
+ }
+ }
+
+ if ((flags & SND_CMD_FLAG_IMMEDIATE) != 0) {
+ RequestCommandProc();
+ }
+
+ sWaitingCommandListQueue[sWaitingCommandListQueueWrite] = sReserveList;
+
+ if (++sWaitingCommandListQueueWrite > SND_CMD_WAIT_QUEUE_COUNT) {
+ sWaitingCommandListQueueWrite = 0;
+ }
+
+ sReserveList = NULL;
+ sReserveListEnd = NULL;
+ sWaitingCommandListCount++;
+ sCurrentTag++;
+
+ OS_RestoreInterrupts(oldirq);
+ return TRUE;
+}
+
+ARM_FUNC void SND_WaitForCommandProc(u32 tag) {
+ if (SND_IsFinishedCommandTag(tag))
+ return;
+
+ while (SND_RecvCommandReply(SND_CMD_FLAG_NOBLOCK) != NULL) { }
+
+ if (SND_IsFinishedCommandTag(tag))
+ return;
+
+ RequestCommandProc();
+
+ if (SND_IsFinishedCommandTag(tag))
+ return;
+
+ do {
+ SND_RecvCommandReply(SND_CMD_FLAG_BLOCK);
+ } while (SND_IsFinishedCommandTag(tag) == 0);
+}
+
+ARM_FUNC u32 SND_GetCurrentCommandTag(void) {
+ OSIntrMode oldirq = OS_DisableInterrupts();
+
+ u32 retval;
+ if (sReserveList == NULL)
+ retval = sFinishedTag;
+ else
+ retval = sCurrentTag;
+
+ OS_RestoreInterrupts(oldirq);
+ return retval;
+}
+
+ARM_FUNC BOOL SND_IsFinishedCommandTag(u32 tag) {
+ OSIntrMode oldirq = OS_DisableInterrupts();
+
+ BOOL result;
+ if (tag > sFinishedTag) {
+ if (tag - sFinishedTag < 0x80000000)
+ result = FALSE;
+ else
+ result = TRUE;
+ } else {
+ if (sFinishedTag - tag < 0x80000000)
+ result = TRUE;
+ else
+ result = FALSE;
+ }
+
+ OS_RestoreInterrupts(oldirq);
+ return result;
+}
+
+ARM_FUNC s32 SND_CountFreeCommand(void) {
+ OSIntrMode oldirq = OS_DisableInterrupts();
+
+ s32 count = 0;
+ for (struct SNDCommand *cmd = sFreeList; cmd != NULL; cmd = cmd->llNext)
+ count++;
+
+ OS_RestoreInterrupts(oldirq);
+ return count;
+}
+
+ARM_FUNC s32 SND_CountReservedCommand(void) {
+ OSIntrMode oldirq = OS_DisableInterrupts();
+
+ s32 count = 0;
+ for (struct SNDCommand *cmd = sReserveList; cmd != NULL; cmd = cmd->llNext)
+ count++;
+
+ OS_RestoreInterrupts(oldirq);
+ return count;
+}
+
+ARM_FUNC s32 SND_CountWaitingCommand(void) {
+ return SND_CMD_COUNT - SND_CountFreeCommand() - SND_CountReservedCommand();
+}
+
+ARM_FUNC static void PxiFifoCallback(s32 a, s32 b) {
+ OSIntrMode oldirq = OS_DisableInterrupts();
+ SNDi_CallAlarmHandler(b);
+ OS_RestoreInterrupts(oldirq);
+}
+
+ARM_FUNC static void InitPXI(void) {
+ PXI_SetFifoRecvCallback(7, PxiFifoCallback);
+
+ if (!IsCommandAvailable())
+ return;
+
+ if (PXI_IsCallbackReady(7, 1))
+ return;
+
+ do {
+ OS_SpinWait(100);
+ } while (!PXI_IsCallbackReady(7, 1));
+}
+
+ARM_FUNC static void RequestCommandProc(void) {
+ while (PXI_SendWordByFifo(7, 0, 0) < 0) { }
+}
+
+ARM_FUNC static struct SNDCommand *AllocCommand(void) {
+ OSIntrMode oldirq = OS_DisableInterrupts();
+ if (sFreeList == NULL) {
+ OS_RestoreInterrupts(oldirq);
+ return NULL;
+ }
+
+ struct SNDCommand *retval = sFreeList;
+
+ sFreeList = sFreeList->llNext;
+ if (sFreeList == NULL)
+ sFreeListEnd = NULL;
+ OS_RestoreInterrupts(oldirq);
+ return retval;
+}
+
+ARM_FUNC static BOOL IsCommandAvailable(void) {
+ if (!OS_IsRunOnEmulator())
+ return TRUE;
+
+ OSIntrMode oldirq = OS_DisableInterrupts();
+ // TODO use proper register names here
+ // is this some kind of debug or ensata register?
+ *(vu32 *)0x4FFF200 = 0x10;
+ u32 resp = *(vu32 *)0x4FFF200;
+ OS_RestoreInterrupts(oldirq);
+ return resp != 0;
+}
diff --git a/arm9/lib/src/SND_interface.c b/arm9/lib/src/SND_interface.c
new file mode 100644
index 00000000..e8369477
--- /dev/null
+++ b/arm9/lib/src/SND_interface.c
@@ -0,0 +1,172 @@
+#include "SND_interface.h"
+#include "SND_command.h"
+
+static void PushCommand_impl(s32 id, u32 par1, u32 par2, u32 par3, u32 par4);
+#define PushCmd1(id, a) PushCommand_impl(id, (u32)(a), 0, 0, 0)
+#define PushCmd2(id, a, b) PushCommand_impl(id, (u32)(a), (u32)(b), 0, 0)
+#define PushCmd3(id, a, b, c) PushCommand_impl(id, (u32)(a), (u32)(b), (u32)(c), 0)
+#define PushCmd4(id, a, b, c, d) PushCommand_impl(id, (u32)(a), (u32)(b), (u32)(c), (u32)(d))
+
+// TODO fill in "random" constants with macros
+
+// ARM_FUNC void SND_StartSeq(s32 player, const void *seqBasePtr, u32 seqOffset, struct SNDBankData *bankData) { }
+
+ARM_FUNC void SND_StopSeq(s32 player) {
+ PushCmd1(SND_CMD_STOP_SEQ, player);
+}
+
+ARM_FUNC void SND_PrepareSeq(s32 player, const void *seqBasePtr, u32 seqOffset, struct SNDBankData *bankData) {
+ PushCmd4(SND_CMD_PREPARE_SEQ, player, seqBasePtr, seqOffset, bankData);
+}
+
+ARM_FUNC void SND_StartPreparedSeq(s32 player) {
+ PushCmd1(SND_CMD_START_PREPARED_SEQ, player);
+}
+
+ARM_FUNC void SND_PauseSeq(s32 player, BOOL flag) {
+ PushCmd2(SND_CMD_PAUSE_SEQ, player, flag);
+}
+
+// ARM_FUNC void SND_SetPlayerTempoRatio(s32 player, s32 ratio) { }
+
+ARM_FUNC void SND_SetPlayerVolume(s32 player, s32 volume) {
+ SNDi_SetPlayerParam(player, 6, volume, 2);
+}
+
+ARM_FUNC void SND_SetPlayerChannelPriority(s32 player, s32 prio) {
+ SNDi_SetPlayerParam(player, 4, prio, 1);
+}
+
+// ARM_FUNC void SND_SetPlayerLocalVariable(s32 player, s32 varNo, s16 var) { }
+
+// ARM_FUNC void SND_SetPlayerGlobalVariable(s32 varNo, s16 var) { }
+
+// ARM_FUNC void SND_SetTrackVolume(s32 player, u32 trackBitMask, s32 volume) { }
+
+ARM_FUNC void SND_SetTrackPitch(s32 player, u32 trackBitMask, s32 pitch) {
+ SNDi_SetTrackParam(player, trackBitMask, 12, pitch, 2);
+}
+
+ARM_FUNC void SND_SetTrackPan(s32 player, u32 trackBitMask, s32 pan) {
+ SNDi_SetTrackParam(player, trackBitMask, 9, pan, 1);
+}
+
+ARM_FUNC void SND_SetTrackAllocatableChannel(s32 player, u32 trackBitMask, u32 chnBitMask) {
+ PushCmd3(SND_CMD_ALLOCATABLE_CHANNEL, player, trackBitMask, chnBitMask);
+}
+
+ARM_FUNC void SND_StartTimer(u32 chnBitMask, u32 capBitMask, u32 alarmBitMask, u32 flags) {
+ PushCmd4(SND_CMD_START_TIMER, chnBitMask, capBitMask, alarmBitMask, flags);
+}
+
+ARM_FUNC void SND_StopTimer(u32 chnBitMask, u32 capBitMask, u32 alarmBitMask, u32 flags) {
+ s32 i = 0;
+ u32 tmpMask = alarmBitMask;
+
+ while (i < SND_ALARM_COUNT && tmpMask != 0) {
+ if (tmpMask & 1)
+ SNDi_IncAlarmId(i);
+ i++;
+ tmpMask >>= 1;
+ }
+
+ PushCmd4(SND_CMD_STOP_TIMER, chnBitMask, capBitMask, alarmBitMask, flags);
+}
+
+ARM_FUNC void SND_SetupCapture(s32 capture, s32 format, void *bufferPtr, u32 length, BOOL loopFlag, s32 in, s32 out) {
+ PushCmd3(SND_CMD_SETUP_CAPTURE, bufferPtr, length,
+ (capture << 31) | (format << 30) | (loopFlag << 29) | (in << 28) | (out << 27));
+}
+
+ARM_FUNC void SND_SetupAlarm(s32 alarm, u32 tick, u32 period, SNDAlarmCallback cb, void *userData) {
+ PushCmd4(SND_CMD_SETUP_ALARM, alarm, tick, period, SNDi_SetAlarmHandler(alarm, cb, userData));
+}
+
+// ARM_FUNC void SND_SetTrackMute(s32 player, u32 trackBitMask, BOOL flag) { }
+
+// ARM_FUNC void SND_StopUnlockedChannel(u32 chnBitMask, u32 flags) { }
+
+ARM_FUNC void SND_LockChannel(u32 chnBitMask, u32 flags) {
+ PushCmd2(SND_CMD_LOCK_CHANNEL, chnBitMask, flags);
+}
+
+ARM_FUNC void SND_UnlockChannel(u32 chnBitMask, u32 flags) {
+ PushCmd2(SND_CMD_UNLOCK_CHANNEL, chnBitMask, flags);
+}
+
+ARM_FUNC void SND_SetChannelTimer(u32 chnBitMask, s32 timer) {
+ PushCmd2(SND_CMD_CHANNEL_TIMER, chnBitMask, timer);
+}
+
+ARM_FUNC void SND_SetChannelVolume(u32 chnBitMask, s32 volume, s32 chnDataShift) {
+ PushCmd3(SND_CMD_CHANNEL_VOLUME, chnBitMask, volume, chnDataShift);
+}
+
+ARM_FUNC void SND_SetChannelPan(u32 chnBitMask, s32 pan) {
+ PushCmd2(SND_CMD_CHANNEL_PAN, chnBitMask, pan);
+}
+
+ARM_FUNC void SND_SetupChannelPcm(s32 chn, s32 waveFormat, const void *dataAddr, s32 loopMode, s32 loopStart, s32 dataLen, s32 volume, s32 chnDataShift, s32 timer, s32 pan) {
+ PushCmd4(SND_CMD_SETUP_CHANNEL_PCM,
+ chn | (timer << 16),
+ dataAddr,
+ (volume << 24) | (chnDataShift << 22) | dataLen,
+ (loopMode << 26) | (waveFormat << 24) | (pan << 16) | loopStart);
+}
+
+// ARM_FUNC void SND_SetupChannelPsg(s32 chn, s32 sndDuty, s32 volume, s32 chnDataShift, s32 timer, s32 pan) { }
+
+// ARM_FUNC void SND_SetupChannelNoise(s32 chn, s32 volume, s32 chnDataShift, s32 timer, s32 pan) { }
+
+ARM_FUNC void SND_InvalidateSeqData(const void *start, const void *end) {
+ PushCmd2(SND_CMD_INVALIDATE_SEQ, start, end);
+}
+
+ARM_FUNC void SND_InvalidateBankData(const void *start, const void *end) {
+ PushCmd2(SND_CMD_INVALIDATE_BANK, start, end);
+}
+
+ARM_FUNC void SND_InvalidateWaveData(const void *start, const void *end) {
+ PushCmd2(SND_CMD_INVALIDATE_WAVE, start, end);
+}
+
+// ARM_FUNC void SND_SetMasterVolume(s32 volume) { }
+
+ARM_FUNC void SND_SetOutputSelector(s32 left, s32 right, s32 channel1, s32 channel3) {
+ PushCmd4(SND_CMD_OUTPUT_SELECTOR, left, right, channel1, channel3);
+}
+
+ARM_FUNC void SND_SetMasterPan(s32 pan) {
+ PushCmd1(SND_CMD_MASTER_PAN, pan);
+}
+
+ARM_FUNC void SND_ResetMasterPan(void) {
+ PushCmd1(SND_CMD_MASTER_PAN, -1);
+}
+
+// ARM_FUNC void SND_ReadDriverInfo(struct SNDDriverInfo *info) { }
+
+ARM_FUNC void SNDi_SetPlayerParam(s32 player, u32 offset, u32 data, s32 size) {
+ PushCmd4(SND_CMD_PLAYER_PARAM, player, offset, data, size);
+}
+
+ARM_FUNC void SNDi_SetTrackParam(s32 player, u32 trackBitMask, u32 offset, u32 data, s32 size) {
+ PushCmd4(SND_CMD_TRACK_PARAM, player | (size << 24), trackBitMask, offset, data);
+}
+
+// ARM_FUNC void SNDi_SetSurroundDecay(s32 decay) { }
+
+// ARM_FUNC void SNDi_SkipSeq(s32 player, u32 tick) { }
+
+ARM_FUNC static void PushCommand_impl(s32 id, u32 par1, u32 par2, u32 par3, u32 par4) {
+ struct SNDCommand *cmd = SND_AllocCommand(SND_CMD_FLAG_BLOCK);
+ if (cmd == NULL)
+ return;
+
+ cmd->id = id;
+ cmd->arg[0] = par1;
+ cmd->arg[1] = par2;
+ cmd->arg[2] = par3;
+ cmd->arg[3] = par4;
+ SND_PushCommand(cmd);
+}
diff --git a/arm9/lib/src/SND_main.c b/arm9/lib/src/SND_main.c
new file mode 100644
index 00000000..f533b87c
--- /dev/null
+++ b/arm9/lib/src/SND_main.c
@@ -0,0 +1,28 @@
+#include "SND_main.h"
+
+#include "global.h"
+#include "OS_mutex.h"
+
+static struct OSMutex sSndMutex;
+static s32 sSndInitialized;
+
+// TODO remove these declarations once we have the functions in the headers
+void OS_UnlockMutex(struct OSMutex *);
+void OS_LockMutex(struct OSMutex *);
+
+ARM_FUNC void SND_Init(void) {
+ if (sSndInitialized)
+ return;
+ sSndInitialized = 1;
+ OS_InitMutex(&sSndMutex);
+ SND_CommandInit();
+ SND_AlarmInit();
+}
+
+ARM_FUNC void SNDi_LockMutex(void) {
+ OS_LockMutex(&sSndMutex);
+}
+
+ARM_FUNC void SNDi_UnlockMutex(void) {
+ OS_UnlockMutex(&sSndMutex);
+}
diff --git a/arm9/lib/src/SND_util.c b/arm9/lib/src/SND_util.c
new file mode 100644
index 00000000..6ff8cb14
--- /dev/null
+++ b/arm9/lib/src/SND_util.c
@@ -0,0 +1,238 @@
+#include "SND_util.h"
+
+// not used in pokediamond
+//static const u16 sPitchTable[0x600] = {
+// 0x0000, 0x003B, 0x0076, 0x00B2, 0x00ED, 0x0128, 0x0164, 0x019f,
+// 0x01DB, 0x0217, 0x0252, 0x028E, 0x02CA, 0x0305, 0x0341, 0x037D,
+// 0x03B9, 0x03F5, 0x0431, 0x046E, 0x04AA, 0x04E6, 0x0522, 0x055F,
+// 0x059B, 0x05D8, 0x0614, 0x0651, 0x068D, 0x06CA, 0x0707, 0x0743,
+// 0x0780, 0x07BD, 0x07FA, 0x0837, 0x0874, 0x08B1, 0x08EF, 0x092C,
+// 0x0969, 0x09A7, 0x09E4, 0x0A21, 0x0A5F, 0x0A9C, 0x0ADA, 0x0B18,
+// 0x0B56, 0x0B93, 0x0BD1, 0x0C0F, 0x0C4D, 0x0C8B, 0x0CC9, 0x0D07,
+// 0x0D45, 0x0D84, 0x0DC2, 0x0E00, 0x0E3F, 0x0E7D, 0x0EBC, 0x0EFA,
+// 0x0F39, 0x0F78, 0x0FB6, 0x0FF5, 0x1034, 0x1073, 0x10B2, 0x10F1,
+// 0x1130, 0x116F, 0x11AE, 0x11EE, 0x122D, 0x126C, 0x12AC, 0x12EB,
+// 0x132B, 0x136B, 0x13AA, 0x13EA, 0x142A, 0x146A, 0x14A9, 0x14E9,
+// 0x1529, 0x1569, 0x15AA, 0x15EA, 0x162A, 0x166A, 0x16AB, 0x16EB,
+// 0x172C, 0x176C, 0x17AD, 0x17ED, 0x182E, 0x186F, 0x18B0, 0x18F0,
+// 0x1931, 0x1972, 0x19B3, 0x19F5, 0x1A36, 0x1A77, 0x1AB8, 0x1AFA,
+// 0x1B3B, 0x1B7D, 0x1BBE, 0x1C00, 0x1C41, 0x1C83, 0x1CC5, 0x1D07,
+// 0x1D48, 0x1D8A, 0x1DCC, 0x1E0E, 0x1E51, 0x1E93, 0x1ED5, 0x1F17,
+// 0x1F5A, 0x1F9C, 0x1FDF, 0x2021, 0x2064, 0x20A6, 0x20E9, 0x212C,
+// 0x216F, 0x21B2, 0x21F5, 0x2238, 0x227B, 0x22BE, 0x2301, 0x2344,
+// 0x2388, 0x23CB, 0x240E, 0x2452, 0x2496, 0x24D9, 0x251D, 0x2561,
+// 0x25A4, 0x25E8, 0x262C, 0x2670, 0x26B4, 0x26F8, 0x273D, 0x2781,
+// 0x27C5, 0x280A, 0x284E, 0x2892, 0x28D7, 0x291C, 0x2960, 0x29A5,
+// 0x29EA, 0x2A2F, 0x2A74, 0x2AB9, 0x2AFE, 0x2B43, 0x2B88, 0x2BCD,
+// 0x2C13, 0x2C58, 0x2C9D, 0x2CE3, 0x2D28, 0x2D6E, 0x2DB4, 0x2DF9,
+// 0x2E3F, 0x2E85, 0x2ECB, 0x2F11, 0x2F57, 0x2F9D, 0x2FE3, 0x302A,
+// 0x3070, 0x30B6, 0x30FD, 0x3143, 0x318A, 0x31D0, 0x3217, 0x325E,
+// 0x32A5, 0x32EC, 0x3332, 0x3379, 0x33C1, 0x3408, 0x344F, 0x3496,
+// 0x34DD, 0x3525, 0x356C, 0x35B4, 0x35FB, 0x3643, 0x368B, 0x36D3,
+// 0x371A, 0x3762, 0x37AA, 0x37F2, 0x383A, 0x3883, 0x38CB, 0x3913,
+// 0x395C, 0x39A4, 0x39ED, 0x3A35, 0x3A7E, 0x3AC6, 0x3B0F, 0x3B58,
+// 0x3BA1, 0x3BEA, 0x3C33, 0x3C7C, 0x3CC5, 0x3D0E, 0x3D58, 0x3DA1,
+// 0x3DEA, 0x3E34, 0x3E7D, 0x3EC7, 0x3F11, 0x3F5A, 0x3FA4, 0x3FEE,
+// 0x4038, 0x4082, 0x40CC, 0x4116, 0x4161, 0x41AB, 0x41F5, 0x4240,
+// 0x428A, 0x42D5, 0x431F, 0x436A, 0x43B5, 0x4400, 0x444B, 0x4495,
+// 0x44E1, 0x452C, 0x4577, 0x45C2, 0x460D, 0x4659, 0x46A4, 0x46F0,
+// 0x473B, 0x4787, 0x47D3, 0x481E, 0x486A, 0x48B6, 0x4902, 0x494E,
+// 0x499A, 0x49E6, 0x4A33, 0x4A7F, 0x4ACB, 0x4B18, 0x4B64, 0x4BB1,
+// 0x4BFE, 0x4C4A, 0x4C97, 0x4CE4, 0x4D31, 0x4D7E, 0x4DCB, 0x4E18,
+// 0x4E66, 0x4EB3, 0x4F00, 0x4F4E, 0x4F9B, 0x4FE9, 0x5036, 0x5084,
+// 0x50D2, 0x5120, 0x516E, 0x51BC, 0x520A, 0x5258, 0x52A6, 0x52F4,
+// 0x5343, 0x5391, 0x53E0, 0x542E, 0x547D, 0x54CC, 0x551A, 0x5569,
+// 0x55B8, 0x5607, 0x5656, 0x56A5, 0x56F4, 0x5744, 0x5793, 0x57E2,
+// 0x5832, 0x5882, 0x58D1, 0x5921, 0x5971, 0x59C1, 0x5A10, 0x5A60,
+// 0x5AB0, 0x5B01, 0x5B51, 0x5BA1, 0x5BF1, 0x5C42, 0x5C92, 0x5CE3,
+// 0x5D34, 0x5D84, 0x5DD5, 0x5E26, 0x5E77, 0x5EC8, 0x5F19, 0x5F6A,
+// 0x5FBB, 0x600D, 0x605E, 0x60B0, 0x6101, 0x6153, 0x61A4, 0x61F6,
+// 0x6248, 0x629A, 0x62EC, 0x633E, 0x6390, 0x63E2, 0x6434, 0x6487,
+// 0x64D9, 0x652C, 0x657E, 0x65D1, 0x6624, 0x6676, 0x66C9, 0x671C,
+// 0x676F, 0x67C2, 0x6815, 0x6869, 0x68BC, 0x690F, 0x6963, 0x69B6,
+// 0x6A0A, 0x6A5E, 0x6AB1, 0x6B05, 0x6B59, 0x6BAD, 0x6C01, 0x6C55,
+// 0x6CAA, 0x6CFE, 0x6D52, 0x6DA7, 0x6DFB, 0x6E50, 0x6EA4, 0x6EF9,
+// 0x6F4E, 0x6FA3, 0x6FF8, 0x704D, 0x70A2, 0x70F7, 0x714D, 0x71A2,
+// 0x71F7, 0x724D, 0x72A2, 0x72F8, 0x734E, 0x73A4, 0x73FA, 0x7450,
+// 0x74A6, 0x74FC, 0x7552, 0x75A8, 0x75FF, 0x7655, 0x76AC, 0x7702,
+// 0x7759, 0x77B0, 0x7807, 0x785E, 0x78B4, 0x790C, 0x7963, 0x79BA,
+// 0x7A11, 0x7A69, 0x7AC0, 0x7B18, 0x7B6F, 0x7BC7, 0x7C1F, 0x7C77,
+// 0x7CCF, 0x7D27, 0x7D7F, 0x7DD7, 0x7E2F, 0x7E88, 0x7EE0, 0x7F38,
+// 0x7F91, 0x7FEA, 0x8042, 0x809B, 0x80F4, 0x814D, 0x81A6, 0x81FF,
+// 0x8259, 0x82B2, 0x830B, 0x8365, 0x83BE, 0x8418, 0x8472, 0x84CB,
+// 0x8525, 0x857F, 0x85D9, 0x8633, 0x868E, 0x86E8, 0x8742, 0x879D,
+// 0x87F7, 0x8852, 0x88AC, 0x8907, 0x8962, 0x89BD, 0x8A18, 0x8A73,
+// 0x8ACE, 0x8B2A, 0x8B85, 0x8BE0, 0x8C3C, 0x8C97, 0x8CF3, 0x8D4F,
+// 0x8DAB, 0x8E07, 0x8E63, 0x8EBF, 0x8F1B, 0x8F77, 0x8FD4, 0x9030,
+// 0x908C, 0x90E9, 0x9146, 0x91A2, 0x91FF, 0x925C, 0x92B9, 0x9316,
+// 0x9373, 0x93D1, 0x942E, 0x948C, 0x94E9, 0x9547, 0x95A4, 0x9602,
+// 0x9660, 0x96BE, 0x971C, 0x977A, 0x97D8, 0x9836, 0x9895, 0x98F3,
+// 0x9952, 0x99B0, 0x9A0F, 0x9A6E, 0x9ACD, 0x9B2C, 0x9B8B, 0x9BEA,
+// 0x9C49, 0x9CA8, 0x9D08, 0x9D67, 0x9DC7, 0x9E26, 0x9E86, 0x9EE6,
+// 0x9F46, 0x9FA6, 0xA006, 0xA066, 0xA0C6, 0xA127, 0xA187, 0xA1E8,
+// 0xA248, 0xA2A9, 0xA30A, 0xA36B, 0xA3CC, 0xA42D, 0xA48E, 0xA4EF,
+// 0xA550, 0xA5B2, 0xA613, 0xA675, 0xA6D6, 0xA738, 0xA79A, 0xA7FC,
+// 0xA85E, 0xA8C0, 0xA922, 0xA984, 0xA9E7, 0xAA49, 0xAAAC, 0xAB0E,
+// 0xAB71, 0xABD4, 0xAC37, 0xAC9A, 0xACFD, 0xAD60, 0xADC3, 0xAE27,
+// 0xAE8A, 0xAEED, 0xAF51, 0xAFB5, 0xB019, 0xB07C, 0xB0E0, 0xB145,
+// 0xB1A9, 0xB20D, 0xB271, 0xB2D6, 0xB33A, 0xB39F, 0xB403, 0xB468,
+// 0xB4CD, 0xB532, 0xB597, 0xB5FC, 0xB662, 0xB6C7, 0xB72C, 0xB792,
+// 0xB7F7, 0xB85D, 0xB8C3, 0xB929, 0xB98F, 0xB9F5, 0xBA5B, 0xBAC1,
+// 0xBB28, 0xBB8E, 0xBBF5, 0xBC5B, 0xBCC2, 0xBD29, 0xBD90, 0xBDF7,
+// 0xBE5E, 0xBEC5, 0xBF2C, 0xBF94, 0xBFFB, 0xC063, 0xC0CA, 0xC132,
+// 0xC19A, 0xC202, 0xC26A, 0xC2D2, 0xC33A, 0xC3A2, 0xC40B, 0xC473,
+// 0xC4DC, 0xC544, 0xC5AD, 0xC616, 0xC67F, 0xC6E8, 0xC751, 0xC7BB,
+// 0xC824, 0xC88D, 0xC8F7, 0xC960, 0xC9CA, 0xCA34, 0xCA9E, 0xCB08,
+// 0xCB72, 0xCBDC, 0xCC47, 0xCCB1, 0xCD1B, 0xCD86, 0xCDF1, 0xCE5B,
+// 0xCEC6, 0xCF31, 0xCF9C, 0xD008, 0xD073, 0xD0DE, 0xD14A, 0xD1B5,
+// 0xD221, 0xD28D, 0xD2F8, 0xD364, 0xD3D0, 0xD43D, 0xD4A9, 0xD515,
+// 0xD582, 0xD5EE, 0xD65B, 0xD6C7, 0xD734, 0xD7A1, 0xD80E, 0xD87B,
+// 0xD8E9, 0xD956, 0xD9C3, 0xDA31, 0xDA9E, 0xDB0C, 0xDB7A, 0xDBE8,
+// 0xDC56, 0xDCC4, 0xDD32, 0xDDA0, 0xDE0F, 0xDE7D, 0xDEEC, 0xDF5B,
+// 0xDFC9, 0xE038, 0xE0A7, 0xE116, 0xE186, 0xE1F5, 0xE264, 0xE2D4,
+// 0xE343, 0xE3B3, 0xE423, 0xE493, 0xE503, 0xE573, 0xE5E3, 0xE654,
+// 0xE6C4, 0xE735, 0xE7A5, 0xE816, 0xE887, 0xE8F8, 0xE969, 0xE9DA,
+// 0xEA4B, 0xEABC, 0xEB2E, 0xEB9F, 0xEC11, 0xEC83, 0xECF5, 0xED66,
+// 0xEDD9, 0xEE4B, 0xEEBD, 0xEF2F, 0xEFA2, 0xF014, 0xF087, 0xF0FA,
+// 0xF16D, 0xF1E0, 0xF253, 0xF2C6, 0xF339, 0xF3AD, 0xF420, 0xF494,
+// 0xF507, 0xF57B, 0xF5EF, 0xF663, 0xF6D7, 0xF74C, 0xF7C0, 0xF834,
+// 0xF8A9, 0xF91E, 0xF992, 0xFA07, 0xFA7C, 0xFAF1, 0xFB66, 0xFBDC,
+// 0xFC51, 0xFCC7, 0xFD3C, 0xFDB2, 0xFE28, 0xFE9E, 0xFF14, 0xFF8A,
+//};
+
+static const u8 sVolumeTable[724] = {
+ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
+ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
+ 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3,
+ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+ 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
+ 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6,
+ 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8,
+ 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9,
+ 9, 9, 0xA, 0xA, 0xA, 0xA, 0xA, 0xA, 0xA, 0xA, 0xB,
+ 0xB, 0xB, 0xB, 0xB, 0xB, 0xB, 0xB, 0xC, 0xC, 0xC, 0xC,
+ 0xC, 0xC, 0xC, 0xC, 0xD, 0xD, 0xD, 0xD, 0xD, 0xD, 0xE,
+ 0xE, 0xE, 0xE, 0xE, 0xE, 0xE, 0xF, 0xF, 0xF, 0xF, 0xF,
+ 0x10, 0x10, 0x10, 0x10, 0x10, 0x10, 0x11, 0x11, 0x11,
+ 0x11, 0x11, 0x12, 0x12, 0x12, 0x12, 0x12, 0x13, 0x13,
+ 0x13, 0x13, 0x14, 0x14, 0x14, 0x14, 0x14, 0x15, 0x15,
+ 0x15, 0x15, 0x16, 0x16, 0x16, 0x16, 0x17, 0x17, 0x17,
+ 0x18, 0x18, 0x18, 0x18, 0x19, 0x19, 0x19, 0x19, 0x1A,
+ 0x1A, 0x1A, 0x1B, 0x1B, 0x1B, 0x1C, 0x1C, 0x1C, 0x1D,
+ 0x1D, 0x1D, 0x1E, 0x1E, 0x1E, 0x1F, 0x1F, 0x1F, 0x20,
+ 0x20, 0x20, 0x21, 0x21, 0x22, 0x22, 0x22, 0x23, 0x23,
+ 0x24, 0x24, 0x24, 0x25, 0x25, 0x26, 0x26, 0x27, 0x27,
+ 0x27, 0x28, 0x28, 0x29, 0x29, 0x2A, 0x2A, 0x2B, 0x2B,
+ 0x2C, 0x2C, 0x2D, 0x2D, 0x2E, 0x2E, 0x2F, 0x2F, 0x30,
+ 0x31, 0x31, 0x32, 0x32, 0x33, 0x33, 0x34, 0x35, 0x35,
+ 0x36, 0x36, 0x37, 0x38, 0x38, 0x39, 0x3A, 0x3A, 0x3B,
+ 0x3C, 0x3C, 0x3D, 0x3E, 0x3F, 0x3F, 0x40, 0x41, 0x42,
+ 0x42, 0x43, 0x44, 0x45, 0x45, 0x46, 0x47, 0x48, 0x49,
+ 0x4A, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51,
+ 0x52, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
+ 0x5A, 0x5B, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63,
+ 0x64, 0x65, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6D, 0x6E,
+ 0x6F, 0x71, 0x72, 0x73, 0x75, 0x76, 0x77, 0x79, 0x7A,
+ 0x7B, 0x7D, 0x7E, 0x7F, 0x20, 0x21, 0x21, 0x21, 0x22,
+ 0x22, 0x23, 0x23, 0x23, 0x24, 0x24, 0x25, 0x25, 0x26,
+ 0x26, 0x26, 0x27, 0x27, 0x28, 0x28, 0x29, 0x29, 0x2A,
+ 0x2A, 0x2B, 0x2B, 0x2C, 0x2C, 0x2D, 0x2D, 0x2E, 0x2E,
+ 0x2F, 0x2F, 0x30, 0x30, 0x31, 0x31, 0x32, 0x33, 0x33,
+ 0x34, 0x34, 0x35, 0x36, 0x36, 0x37, 0x37, 0x38, 0x39,
+ 0x39, 0x3A, 0x3B, 0x3B, 0x3C, 0x3D, 0x3E, 0x3E, 0x3F,
+ 0x40, 0x40, 0x41, 0x42, 0x43, 0x43, 0x44, 0x45, 0x46,
+ 0x47, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4D,
+ 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56,
+ 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F,
+ 0x60, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x69, 0x6A,
+ 0x6B, 0x6C, 0x6D, 0x6F, 0x70, 0x71, 0x73, 0x74, 0x75,
+ 0x77, 0x78, 0x79, 0x7B, 0x7C, 0x7E, 0x7E, 0x40, 0x41,
+ 0x42, 0x43, 0x43, 0x44, 0x45, 0x46, 0x47, 0x47, 0x48,
+ 0x49, 0x4A, 0x4B, 0x4C, 0x4C, 0x4D, 0x4E, 0x4F, 0x50,
+ 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59,
+ 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62,
+ 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6B, 0x6C, 0x6D,
+ 0x6E, 0x70, 0x71, 0x72, 0x74, 0x75, 0x76, 0x78, 0x79,
+ 0x7B, 0x7C, 0x7D, 0x7E, 0x40, 0x41, 0x42, 0x42, 0x43,
+ 0x44, 0x45, 0x46, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B,
+ 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, 0x50, 0x51, 0x52, 0x53,
+ 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C,
+ 0x5D, 0x5E, 0x5F, 0x60, 0x61, 0x62, 0x63, 0x65, 0x66,
+ 0x67, 0x68, 0x69, 0x6A, 0x6C, 0x6D, 0x6E, 0x6F, 0x71,
+ 0x72, 0x73, 0x75, 0x76, 0x77, 0x79, 0x7A, 0x7C, 0x7D,
+ 0x7E, 0x7F,
+};
+
+const s16 SNDi_DecibelTable[0x80] = {
+ -32768,-421,-361, -325, -300, -281, -265, -252,
+ -240, -230, -221, -212, -205, -198, -192, -186,
+ -180, -175, -170, -165, -161, -156, -152, -148,
+ -145, -141, -138, -134, -131, -128, -125, -122,
+ -120, -117, -114, -112, -110, -107, -105, -103,
+ -100, -98, -96, -94, -92, -90, -88, -86,
+ -85, -83, -81, -79, -78, -76, -74, -73,
+ -71, -70, -68, -67, -65, -64, -62, -61,
+ -60, -58, -57, -56, -54, -53, -52, -51,
+ -49, -48, -47, -46, -45, -43, -42, -41,
+ -40, -39, -38, -37, -36, -35, -34, -33,
+ -32, -31, -30, -29, -28, -27, -26, -25,
+ -24, -23, -23, -22, -21, -20, -19, -18,
+ -17, -17, -16, -15, -14, -13, -12, -12,
+ -11, -10, -9, -9, -8, -7, -6, -6,
+ -5, -4, -3, -3, -2, -1, -1, 0,
+};
+
+// not used in pokediamond
+//const s16 SNDi_DecibelSquareTable[0x80] = {
+// -32768,-722,-721, -651, -601, -562, -530, -503,
+// -480, -460, -442, -425, -410, -396, -383, -371,
+// -360, -349, -339, -330, -321, -313, -305, -297,
+// -289, -282, -276, -269, -263, -257, -251, -245,
+// -239, -234, -229, -224, -219, -214, -210, -205,
+// -201, -196, -192, -188, -184, -180, -176, -173,
+// -169, -165, -162, -158, -155, -152, -149, -145,
+// -142, -139, -136, -133, -130, -127, -125, -122,
+// -119, -116, -114, -111, -109, -106, -103, -101,
+// -99, -96, -94, -91, -89, -87, -85, -82,
+// -80, -78, -76, -74, -72, -70, -68, -66,
+// -64, -62, -60, -58, -56, -54, -52, -50,
+// -49, -47, -45, -43, -42, -40, -38, -36,
+// -35, -33, -31, -30, -28, -27, -25, -23,
+// -22, -20, -19, -17, -16, -14, -13, -11,
+// -10, -8, -7, -6, -4, -3, -1, 0,
+//};
+
+ARM_FUNC u16 SND_CalcChannelVolume(s32 x) {
+ // directly using s32 doesn't match
+ int decibels = (int)x;
+ if (decibels < -723)
+ decibels = -723;
+ else if (decibels > 0)
+ decibels = 0;
+
+ u32 resultLo = sVolumeTable[decibels + 723];
+ u32 resultHi;
+
+ if (decibels < -240) {
+ resultHi = 3;
+ } else {
+ if (decibels < -120) {
+ resultHi = 2;
+ } else {
+ if (decibels < -60) {
+ resultHi = 1;
+ } else {
+ resultHi = 0;
+ }
+ }
+ }
+
+ return (u16)((resultHi << 8u) | resultLo);
+}
diff --git a/arm9/lib/src/SND_work.c b/arm9/lib/src/SND_work.c
new file mode 100644
index 00000000..a0fb547d
--- /dev/null
+++ b/arm9/lib/src/SND_work.c
@@ -0,0 +1,115 @@
+#include "SND_work.h"
+#include "SND_alarm.h"
+#include "SND_main.h"
+
+struct SNDSharedWork *SNDi_SharedWork;
+
+void DC_InvalidateRange(void *mem, u32 size);
+void DC_FlushRange(void *mem, u32 size);
+
+u32 SND_GetPlayerStatus(void) {
+ DC_InvalidateRange(&SNDi_SharedWork->playerStatus, 4);
+ return SNDi_SharedWork->playerStatus;
+}
+
+u16 SND_GetChannelStatus(void) {
+ DC_InvalidateRange(&SNDi_SharedWork->channelStatus, 2);
+ return SNDi_SharedWork->channelStatus;
+}
+
+//u16 SND_GetCaptureStatus(void) {
+// DC_InvalidateRange(&SNDi_SharedWork->captureStatus, 2);
+// return SNDi_SharedWork->captureStatus;
+//}
+
+u32 SND_GetPlayerTickCounter(u32 playerId) {
+ DC_InvalidateRange(&SNDi_SharedWork->players[playerId].tickCounter, 4);
+ return SNDi_SharedWork->players[playerId].tickCounter;
+}
+
+//s16 SND_GetPlayerLocalVariable(u32 playerId, u32 var) {
+// DC_InvalidateRange(&SNDi_SharedWork->players[playerId].localVars[var], 2);
+// return SNDi_SharedWork->players[playerId].localVars[var];
+//}
+//
+//s16 SND_GetPlayerLocalVariable(u32 var) {
+// DC_InvalidateRange(&SNDi_SharedWork->globalVars[var], 2);
+// return SNDi_SharedWork->globalVars[var];
+//}
+//
+//BOOL SND_ReadChannelInfo(const SNDDriverInfo *driverInfo, s32 chnId, SNDChannelInfo *chnInfo) {
+// // T O D O, implement if it's actually used
+//}
+//
+//BOOL SND_ReadPlayerInfo(const SNDDriverInfo *driverInfo, s32 playerId, SNDPlayerInfo *playerInfo) {
+// if (playerId < 0 || playerId >= SND_PLAYER_COUNT)
+// return FALSE;
+// SNDPlayer *player = &driverInfo->work.players[playerId];
+// playerInfo->trackBitMask = 0;
+// for (s32 i = 0; i < SND_TRACK_COUNT; i++) {
+// if (player->tracks[i] != SND_INVALID_TRACK_INDEX) {
+// playerInfo->trackBitMask |= (1 << i);
+// }
+// }
+// playerInfo->flags.active = player->flags.active;
+// playerInfo->flags.paused = player->flags.paused;
+// playerInfo->tempo = player->tempo;
+// playerInfo->volume = player->volume;
+// return TRUE;
+//}
+//
+//
+//BOOL SND_ReadTrackInfo(const SNDDriverInfo *driverInfo s32 playerId, s32 trackId, SNDTrackInfo *trackInfo) {
+// if (playerId < 0 || playerId >= SND_PLAYER_COUNT)
+// return FALSE;
+// if (trackId < 0 || trackId >= SND_TRACK_COUNT)
+// return FALSE;
+// SNDPlayer *player = &driverInfo->work.players[playerId];
+// if (player->tracks[trackId] == SND_INVALID_TRACK_INDEX)
+// return FALSE;
+// SNDTrack *track = &driverInfo->work.tracks[trackId];
+// trackInfo->program = track->program;
+// trackInfo->volume = track->volume;
+// trackInfo->expression = track->expression;
+// trackInfo->pitchBend = track->pitchBend;
+// trackInfo->bendRange = track->bendRange;
+// trackInfo->pan = track->pan + 0x40; // 0x40 == MIDI center pan
+// trackInfo->transpose = track->transpose;
+// trackInfo->chnCount = 0;
+//
+// //#define LL_READ_PTR(ptr, basePtr, base) (ptr ? ((typeof(ptr))(s32)(ptr) - (s32)(basePtr) + (s32)&(base)) : NULL)
+// //for (SNDExChannel *exChn = LL_READ_PTR(track->channelLLHead, driverInfo->workPtr, driverInfo->work);
+// // exChn != NULL; exChn = LL_READ_PTR(exChn->channelLLNext, driverInfo->workPtr, driverInfo->work))
+// //{
+// // trackInfo->channel[trackInfo->chnCount] = exChn->id;
+// // trackInfo->chnCount++;
+// //}
+// //#undef LL_READ_PTR
+//
+// return TRUE;
+//}
+
+ARM_FUNC u32 SNDi_GetFinishedCommandTag(void) {
+ DC_InvalidateRange(&SNDi_SharedWork->finishedCommandTag, 4);
+ return SNDi_SharedWork->finishedCommandTag;
+}
+
+ARM_FUNC void SNDi_InitSharedWork(struct SNDSharedWork *sw) {
+ sw->playerStatus = 0;
+ sw->channelStatus = 0;
+ sw->captureStatus = 0;
+ sw->finishedCommandTag = 0;
+
+ for (s32 i = 0; i < SND_PLAYER_COUNT; i++) {
+ sw->players[i].tickCounter = 0;
+ for (s32 j = 0; j < 16; j++) {
+ sw->players[i].localVars[j] = -1;
+ }
+ }
+
+ for (s32 i = 0; i < 16; i++) {
+ sw->globalVars[i] = -1;
+ }
+
+ DC_FlushRange(sw, sizeof(*sw));
+}