This commit is contained in:
red031000
2020-05-29 18:45:08 +01:00
22 changed files with 1645 additions and 1836 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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:

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

185
arm9/lib/include/SND_main.h Normal file
View File

@@ -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

View File

@@ -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

View File

@@ -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

39
arm9/lib/src/SND_alarm.c Normal file
View File

@@ -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);
}

175
arm9/lib/src/SND_bank.c Normal file
View File

@@ -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;
}

333
arm9/lib/src/SND_command.c Normal file
View File

@@ -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;
}

View File

@@ -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);
}

28
arm9/lib/src/SND_main.c Normal file
View File

@@ -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);
}

238
arm9/lib/src/SND_util.c Normal file
View File

@@ -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);
}

115
arm9/lib/src/SND_work.c Normal file
View File

@@ -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));
}