diff options
-rw-r--r-- | arm9/asm/SND_alarm.s | 82 | ||||
-rw-r--r-- | arm9/asm/SND_bank.s | 328 | ||||
-rw-r--r-- | arm9/asm/SND_command.s | 677 | ||||
-rw-r--r-- | arm9/asm/SND_interface.s | 459 | ||||
-rw-r--r-- | arm9/asm/SND_main.s | 55 | ||||
-rw-r--r-- | arm9/asm/SND_util.s | 109 | ||||
-rw-r--r-- | arm9/asm/SND_work.s | 121 | ||||
-rw-r--r-- | arm9/asm/unk_020ADA84.s | 10 | ||||
-rw-r--r-- | arm9/lib/include/SND_alarm.h | 25 | ||||
-rw-r--r-- | arm9/lib/include/SND_bank.h | 95 | ||||
-rw-r--r-- | arm9/lib/include/SND_command.h | 67 | ||||
-rw-r--r-- | arm9/lib/include/SND_interface.h | 62 | ||||
-rw-r--r-- | arm9/lib/include/SND_main.h | 185 | ||||
-rw-r--r-- | arm9/lib/include/SND_util.h | 14 | ||||
-rw-r--r-- | arm9/lib/include/SND_work.h | 92 | ||||
-rw-r--r-- | arm9/lib/src/SND_alarm.c | 39 | ||||
-rw-r--r-- | arm9/lib/src/SND_bank.c | 175 | ||||
-rw-r--r-- | arm9/lib/src/SND_command.c | 333 | ||||
-rw-r--r-- | arm9/lib/src/SND_interface.c | 172 | ||||
-rw-r--r-- | arm9/lib/src/SND_main.c | 28 | ||||
-rw-r--r-- | arm9/lib/src/SND_util.c | 238 | ||||
-rw-r--r-- | arm9/lib/src/SND_work.c | 115 |
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)); +} |