summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm7/arm7.lsf8
-rw-r--r--arm7/asm/SND.s504
-rw-r--r--arm7/asm/SND_alarm.s144
-rw-r--r--arm7/asm/SND_bank.s245
-rw-r--r--arm7/asm/SND_capture.s38
-rw-r--r--arm7/asm/SND_channel.s208
-rw-r--r--arm7/asm/SND_command.s639
-rw-r--r--arm7/asm/SND_exChannel.s645
-rw-r--r--arm7/asm/SND_lfo.s77
-rw-r--r--arm7/asm/SND_lockChannel.s167
-rw-r--r--arm7/asm/SND_main.s197
-rw-r--r--arm7/asm/SND_seq.s549
-rw-r--r--arm7/asm/SND_unk_037FD440.s1621
-rw-r--r--arm7/asm/SND_util.s190
-rw-r--r--arm7/asm/SND_wave.s43
-rw-r--r--arm7/asm/SND_work.s84
-rw-r--r--arm7/asm/wram2.s16
-rw-r--r--arm7/global.inc51
-rw-r--r--arm7/lib/include/MI_memory.h5
-rw-r--r--arm7/lib/include/OS_alarm.h1
-rw-r--r--arm7/lib/include/PM.h9
-rw-r--r--arm7/lib/include/PXI_fifo.h3
-rw-r--r--arm7/lib/include/SND_alarm.h12
-rw-r--r--arm7/lib/include/SND_bank.h17
-rw-r--r--arm7/lib/include/SND_capture.h10
-rw-r--r--arm7/lib/include/SND_channel.h32
-rw-r--r--arm7/lib/include/SND_command.h9
-rw-r--r--arm7/lib/include/SND_exChannel.h41
-rw-r--r--arm7/lib/include/SND_global.h15
-rw-r--r--arm7/lib/include/SND_lfo.h8
-rw-r--r--arm7/lib/include/SND_main.h16
-rw-r--r--arm7/lib/include/SND_seq.h24
-rw-r--r--arm7/lib/include/SND_util.h16
-rw-r--r--arm7/lib/include/SND_work.h11
-rw-r--r--arm7/lib/include/registers.h23
-rw-r--r--arm7/lib/include/syscall.h4
-rw-r--r--arm7/lib/src/OS_reset.c3
-rw-r--r--arm7/lib/src/SND_alarm.c83
-rw-r--r--arm7/lib/src/SND_bank.c194
-rw-r--r--arm7/lib/src/SND_capture.c25
-rw-r--r--arm7/lib/src/SND_channel.c192
-rw-r--r--arm7/lib/src/SND_command.c329
-rw-r--r--arm7/lib/src/SND_exChannel.c685
-rw-r--r--arm7/lib/src/SND_global.c63
-rw-r--r--arm7/lib/src/SND_main.c133
-rw-r--r--arm7/lib/src/SND_seq.c1324
-rw-r--r--arm7/lib/src/SND_util.c109
-rw-r--r--arm7/lib/src/SND_work.c41
-rw-r--r--arm9/lib/NitroSDK/include/PXI_fifo.h23
-rw-r--r--arm9/lib/NitroSDK/include/SND_bank.h79
-rw-r--r--arm9/lib/NitroSDK/include/SND_command.h50
-rw-r--r--arm9/lib/NitroSDK/include/SND_main.h14
-rw-r--r--arm9/lib/NitroSDK/include/SND_work.h45
-rw-r--r--include/nitro/PXI_fifo_shared.h25
-rw-r--r--include/nitro/SND_alarm_shared.h21
-rw-r--r--include/nitro/SND_bank_shared.h97
-rw-r--r--include/nitro/SND_command_shared.h55
-rw-r--r--include/nitro/SND_exChannel_shared.h114
-rw-r--r--include/nitro/SND_main_shared.h180
-rw-r--r--include/nitro/SND_seq_shared.h90
-rw-r--r--include/nitro/SND_work_shared.h100
61 files changed, 3951 insertions, 5805 deletions
diff --git a/arm7/arm7.lsf b/arm7/arm7.lsf
index 4c14fd1e..950f30e7 100644
--- a/arm7/arm7.lsf
+++ b/arm7/arm7.lsf
@@ -40,16 +40,12 @@ Autoload WRAM
Object PXI_fifo.o
Object EXI_genPort.o
Object PAD_xyButton.o
- Object SND.o
+ Object SND_global.o
+ Object SND_channel.o
Object SND_util.o
Object SND_main.o
Object SND_capture.o
- Object SND_channel.o
- Object SND_lfo.o
- Object SND_wave.o
- Object SND_lockChannel.o
Object SND_exChannel.o
- Object SND_unk_037FD440.o
Object SND_seq.o
Object SND_bank.o
Object SND_work.o
diff --git a/arm7/asm/SND.s b/arm7/asm/SND.s
deleted file mode 100644
index 8bab9030..00000000
--- a/arm7/asm/SND.s
+++ /dev/null
@@ -1,504 +0,0 @@
-#todo split further
-
- .include "asm/macros.inc"
- .include "global.inc"
-
- .section .data
-
- .global sMasterPan
-sMasterPan:
- .word 0xFFFFFFFF
-
- .section .bss
-
- .global sSurroundDecay
-sSurroundDecay: ;0x03807A0C
- .space 0x03807A10 - 0x03807A0C
-
- .global sOrgPan
-sOrgPan: ;0x03807A10
- .space 0x03807A20 - 0x03807A10
-
- .global sOrgVolume
-sOrgVolume: ;0x03807A20
- .space 0x03807A30 - 0x03807A20
-
- .section .text
-
- arm_func_start SND_SetOutputSelector
-SND_SetOutputSelector: ; 0x037FBA0C
- ldr ip, _037FBA40 ; =0x04000501
- ldrb ip, [ip]
- ands ip, ip, #128 ; 0x80
- movne ip, #1
- moveq ip, #0
- mov ip, ip, lsl #7
- orr r3, ip, r3, lsl #5
- orr r2, r3, r2, lsl #4
- orr r1, r2, r1, lsl #2
- orr r1, r0, r1
- ldr r0, _037FBA40 ; =0x04000501
- strb r1, [r0]
- bx lr
-_037FBA40: .word 0x04000501
-
- arm_func_start SND_SetMasterVolume
-SND_SetMasterVolume: ; 0x037FBA44
- ldr r1, _037FBA50 ; =0x04000500
- strb r0, [r1]
- bx lr
-_037FBA50: .word 0x04000500
-
- arm_func_start SND_EndSleep
-SND_EndSleep: ; 0x037FBA54
- stmfd sp!, {lr}
- sub sp, sp, #4
- ldr r1, _037FBA94 ; =0x04000304
- ldrh r0, [r1]
- orr r0, r0, #1
- strh r0, [r1]
- mov r0, #1
- bl PMi_SetControl
- mov r0, #256 ; 0x100
- bl FUN_037FBA9C
- ldr r0, _037FBA98 ; =0x0007AB80
- bl OS_SpinWait
- bl SND_Enable
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_037FBA94: .word 0x04000304
-_037FBA98: .word 0x0007AB80
-
- arm_func_start FUN_037FBA9C
-FUN_037FBA9C: ; 0x037FBA9C
- ldr ip, _037FBAA4 ; =SVC_SoundBiasSet
- bx ip
-_037FBAA4: .word SVC_SoundBiasSet
-
- arm_func_start SND_BeginSleep
-SND_BeginSleep: ; 0x037FBAA8
- stmfd sp!, {lr}
- sub sp, sp, #4
- bl SND_Disable
- mov r0, #128 ; 0x80
- bl FUN_037FBAEC
- mov r0, #262144 ; 0x40000
- bl OS_SpinWait
- mov r0, #1
- bl PMi_ResetControl
- ldr r1, _037FBAE8 ; =0x04000304
- ldrh r0, [r1]
- bic r0, r0, #1
- strh r0, [r1]
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_037FBAE8: .word 0x04000304
-
- arm_func_start FUN_037FBAEC
-FUN_037FBAEC: ; 0x037FBAEC
- ldr ip, _037FBAF4 ; =SVC_SoundBiasReset
- bx ip
-_037FBAF4: .word SVC_SoundBiasReset
-
- arm_func_start SND_Shutdown
-SND_Shutdown: ; 0x037FBAF8
- stmdb sp!, {r4, r5, lr}
- sub sp, sp, #4
- bl SND_Disable
- mov r5, #0
- mov r4, #1
-_037FBB0C:
- mov r0, r5
- mov r1, r4
- bl SND_StopChannel
- add r5, r5, #1
- cmp r5, #16
- blt _037FBB0C
- mov r1, #0
- ldr r0, _037FBB44 ; =0x04000508
- strb r1, [r0]
- ldr r0, _037FBB48 ; =0x04000509
- strb r1, [r0]
- add sp, sp, #4
- ldmia sp!, {r4, r5, lr}
- bx lr
-_037FBB44: .word 0x04000508
-_037FBB48: .word 0x04000509
-
- arm_func_start SND_Disable
-SND_Disable: ; 0x037FBB4C
- ldr r1, _037FBB60 ; =0x04000501
- ldrb r0, [r1]
- bic r0, r0, #128 ; 0x80
- strb r0, [r1]
- bx lr
-_037FBB60: .word 0x04000501
-
- arm_func_start SND_Enable
-SND_Enable: ; 0x037FBB64
- ldr r1, _037FBB78 ; =0x04000501
- ldrb r0, [r1]
- orr r0, r0, #128 ; 0x80
- strb r0, [r1]
- bx lr
-_037FBB78: .word 0x04000501
-
- arm_func_start CalcSurroundDecay
-CalcSurroundDecay: ; 0x037FBB7C
- cmp r1, #24
- bge _037FBBAC
- ldr r2, _037FBBE0 ; =sSurroundDecay
- ldr r3, [r2]
- ldr r2, _037FBBE4 ; =0x00007FFF
- sub r2, r2, r3
- add r1, r1, #40 ; 0x28
- mul r1, r3, r1
- add r1, r1, r2, lsl #6
- mul r1, r0, r1
- mov r0, r1, asr #21
- bx lr
-_037FBBAC:
- cmp r1, #104 ; 0x68
- bxle lr
- ldr r2, _037FBBE0 ; =sSurroundDecay
- ldr ip, [r2]
- ldr r2, _037FBBE4 ; =0x00007FFF
- add r3, ip, r2
- rsb r2, ip, #0
- sub r1, r1, #40 ; 0x28
- mul r1, r2, r1
- add r1, r1, r3, lsl #6
- mul r1, r0, r1
- mov r0, r1, asr #21
- bx lr
-_037FBBE0: .word sSurroundDecay
-_037FBBE4: .word 0x00007FFF
-
- arm_func_start SNDi_SetSurroundDecay
-SNDi_SetSurroundDecay: ; 0x037FBBE8
- stmdb sp!, {r4, r5, r6, r7, r8, lr}
- ldr r1, _037FBC40 ; =sSurroundDecay
- str r0, [r1]
- mov r4, #0
- ldr r6, _037FBC44 ; =sOrgVolume
- mov r7, #1
- ldr r5, _037FBC48 ; =0x0000FFF5
-_037FBC04:
- mov r0, r7, lsl r4
- ands r0, r0, r5
- beq _037FBC2C
- mov r8, r4, lsl #4
- add r0, r8, #67108864 ; 0x4000000
- ldrb r1, [r0, #1026] ; 0x402
- ldrb r0, [r6, r4]
- bl CalcSurroundDecay
- add r1, r8, #67108864 ; 0x4000000
- strb r0, [r1, #1024] ; 0x400
-_037FBC2C:
- add r4, r4, #1
- cmp r4, #16
- blt _037FBC04
- ldmia sp!, {r4, r5, r6, r7, r8, lr}
- bx lr
-_037FBC40: .word sSurroundDecay
-_037FBC44: .word sOrgVolume
-_037FBC48: .word 0x0000FFF5
-
- arm_func_start SND_GetChannelControl
-SND_GetChannelControl: ; 0x037FBC4C
- mov r0, r0, lsl #4
- add r0, r0, #67108864 ; 0x4000000
- ldr r0, [r0, #1024] ; 0x400
- bx lr
-
- arm_func_start SND_SetMasterPan
-SND_SetMasterPan: ; 0x037FBC5C
- ldr r1, _037FBCB8 ; =sMasterPan
- str r0, [r1]
- cmp r0, #0
- blt _037FBC90
- mov r2, #0
- and r1, r0, #255 ; 0xff
-_037FBC74:
- mov r0, r2, lsl #4
- add r0, r0, #67108864 ; 0x4000000
- strb r1, [r0, #1026] ; 0x402
- add r2, r2, #1
- cmp r2, #16
- blt _037FBC74
- bx lr
-_037FBC90:
- mov r3, #0
- ldr r2, _037FBCBC ; =sOrgPan
-_037FBC98:
- ldrb r1, [r2, r3]
- mov r0, r3, lsl #4
- add r0, r0, #67108864 ; 0x4000000
- strb r1, [r0, #1026] ; 0x402
- add r3, r3, #1
- cmp r3, #16
- blt _037FBC98
- bx lr
-_037FBCB8: .word sMasterPan
-_037FBCBC: .word sOrgPan
-
- arm_func_start SND_IsChannelActive
-SND_IsChannelActive: ; 0x037FBCC0
- mov r0, r0, lsl #4
- add r0, r0, #67108864 ; 0x4000000
- ldrb r0, [r0, #1027] ; 0x403
- ands r0, r0, #128 ; 0x80
- movne r0, #1
- moveq r0, #0
- bx lr
-
- arm_func_start SND_SetChannelPan
-SND_SetChannelPan: ; 0x037FBCDC
- stmdb sp!, {r4, lr}
- ldr r2, _037FBD44 ; =sOrgPan
- strb r1, [r2, r0]
- ldr r2, _037FBD48 ; =sMasterPan
- ldr r2, [r2]
- cmp r2, #0
- movge r1, r2
- mov r4, r0, lsl #4
- add r2, r4, #67108864 ; 0x4000000
- strb r1, [r2, #1026] ; 0x402
- ldr r2, _037FBD4C ; =sSurroundDecay
- ldr r2, [r2]
- cmp r2, #0
- ble _037FBD3C
- mov r2, #1
- mov r3, r2, lsl r0
- ldr r2, _037FBD50 ; =0x0000FFF5
- ands r2, r3, r2
- beq _037FBD3C
- ldr r2, _037FBD54 ; =sOrgVolume
- ldrb r0, [r2, r0]
- bl CalcSurroundDecay
- add r1, r4, #67108864 ; 0x4000000
- strb r0, [r1, #1024] ; 0x400
-_037FBD3C:
- ldmia sp!, {r4, lr}
- bx lr
-_037FBD44: .word sOrgPan
-_037FBD48: .word sMasterPan
-_037FBD4C: .word sSurroundDecay
-_037FBD50: .word 0x0000FFF5
-_037FBD54: .word sOrgVolume
-
- arm_func_start SND_SetChannelTimer
-SND_SetChannelTimer: ; 0x037FBD58
- rsb r1, r1, #65536 ; 0x10000
- mov r0, r0, lsl #4
- add r0, r0, #67108864 ; 0x4000000
- add r0, r0, #1024 ; 0x400
- strh r1, [r0, #8]
- bx lr
-
- arm_func_start SND_SetChannelVolume
-SND_SetChannelVolume: ; 0x037FBD70
- stmdb sp!, {r4, r5, lr}
- sub sp, sp, #4
- mov r5, r0
- mov r4, r2
- ldr r0, _037FBDE8 ; =sOrgVolume
- strb r1, [r0, r5]
- ldr r0, _037FBDEC ; =sSurroundDecay
- ldr r0, [r0]
- cmp r0, #0
- ble _037FBDC8
- mov r0, #1
- mov r2, r0, lsl r5
- ldr r0, _037FBDF0 ; =0x0000FFF5
- ands r0, r2, r0
- beq _037FBDC8
- mov r0, r5, lsl #4
- add r0, r0, #67108864 ; 0x4000000
- ldrb r2, [r0, #1026] ; 0x402
- mov r0, r1
- mov r1, r2
- bl CalcSurroundDecay
- mov r1, r0
-_037FBDC8:
- orr r1, r1, r4, lsl #8
- mov r0, r5, lsl #4
- add r0, r0, #67108864 ; 0x4000000
- add r0, r0, #1024 ; 0x400
- strh r1, [r0]
- add sp, sp, #4
- ldmia sp!, {r4, r5, lr}
- bx lr
-_037FBDE8: .word sOrgVolume
-_037FBDEC: .word sSurroundDecay
-_037FBDF0: .word 0x0000FFF5
-
- arm_func_start SND_StopChannel
-SND_StopChannel: ; 0x037FBDF4
- mov r3, r0, lsl #4
- ldr r2, _037FBE1C ; =0x04000400
- add ip, r2, r0, lsl #4
- add r0, r3, #67108864 ; 0x4000000
- ldr r0, [r0, #1024] ; 0x400
- bic r2, r0, #-2147483648 ; 0x80000000
- ands r0, r1, #1
- orrne r2, r2, #32768 ; 0x8000
- str r2, [ip]
- bx lr
-_037FBE1C: .word 0x04000400
-
- arm_func_start SND_SetupChannelNoise
-SND_SetupChannelNoise: ; 0x037FBE20
- stmdb sp!, {r4, r5, r6, r7, lr}
- sub sp, sp, #4
- mov r7, r2
- mov r6, r3
- ldr r5, [sp, #24]
- mov r4, r0, lsl #4
- ldr r2, _037FBEBC ; =sOrgPan
- strb r5, [r2, r0]
- ldr r2, _037FBEC0 ; =sMasterPan
- ldr r2, [r2]
- cmp r2, #0
- movge r5, r2
- ldr r2, _037FBEC4 ; =sOrgVolume
- strb r1, [r2, r0]
- ldr r2, _037FBEC8 ; =sSurroundDecay
- ldr r2, [r2]
- cmp r2, #0
- ble _037FBE8C
- mov r2, #1
- mov r2, r2, lsl r0
- ldr r0, _037FBECC ; =0x0000FFF5
- ands r0, r2, r0
- beq _037FBE8C
- mov r0, r1
- mov r1, r5
- bl CalcSurroundDecay
- mov r1, r0
-_037FBE8C:
- mov r0, r5, lsl #16
- orr r0, r0, #1610612736 ; 0x60000000
- orr r0, r0, r7, lsl #8
- orr r1, r1, r0
- add r0, r4, #67108864 ; 0x4000000
- str r1, [r0, #1024] ; 0x400
- rsb r1, r6, #65536 ; 0x10000
- add r0, r0, #1024 ; 0x400
- strh r1, [r0, #8]
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, lr}
- bx lr
-_037FBEBC: .word sOrgPan
-_037FBEC0: .word sMasterPan
-_037FBEC4: .word sOrgVolume
-_037FBEC8: .word sSurroundDecay
-_037FBECC: .word 0x0000FFF5
-
- arm_func_start SND_SetupChannelPsg
-SND_SetupChannelPsg: ; 0x037FBED0
- stmdb sp!, {r4, r5, r6, r7, lr}
- sub sp, sp, #4
- mov r7, r1
- mov r6, r3
- ldr r5, [sp, #28]
- mov r4, r0, lsl #4
- ldr r1, _037FBF74 ; =sOrgPan
- strb r5, [r1, r0]
- ldr r1, _037FBF78 ; =sMasterPan
- ldr r1, [r1]
- cmp r1, #0
- movge r5, r1
- ldr r1, _037FBF7C ; =sOrgVolume
- strb r2, [r1, r0]
- ldr r1, _037FBF80 ; =sSurroundDecay
- ldr r1, [r1]
- cmp r1, #0
- ble _037FBF3C
- mov r1, #1
- mov r1, r1, lsl r0
- ldr r0, _037FBF84 ; =0x0000FFF5
- ands r0, r1, r0
- beq _037FBF3C
- mov r0, r2
- mov r1, r5
- bl CalcSurroundDecay
- mov r2, r0
-_037FBF3C:
- mov r0, r7, lsl #24
- orr r0, r0, #1610612736 ; 0x60000000
- orr r0, r0, r5, lsl #16
- orr r0, r0, r6, lsl #8
- orr r1, r2, r0
- add r0, r4, #67108864 ; 0x4000000
- str r1, [r0, #1024] ; 0x400
- ldr r1, [sp, #24]
- rsb r1, r1, #65536 ; 0x10000
- add r0, r0, #1024 ; 0x400
- strh r1, [r0, #8]
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, lr}
- bx lr
-_037FBF74: .word sOrgPan
-_037FBF78: .word sMasterPan
-_037FBF7C: .word sOrgVolume
-_037FBF80: .word sSurroundDecay
-_037FBF84: .word 0x0000FFF5
-
- arm_func_start SND_SetupChannelPcm
-SND_SetupChannelPcm: ; 0x037FBF88
- stmdb sp!, {r4, r5, r6, r7, r8, lr}
- mov r8, r1
- mov r7, r2
- mov r6, r3
- ldr r1, [sp, #32]
- ldr r5, [sp, #44] ; 0x2c
- mov r4, r0, lsl #4
- ldr r2, _037FC044 ; =sOrgPan
- strb r5, [r2, r0]
- ldr r2, _037FC048 ; =sMasterPan
- ldr r2, [r2]
- cmp r2, #0
- movge r5, r2
- ldr r2, _037FC04C ; =sOrgVolume
- strb r1, [r2, r0]
- ldr r2, _037FC050 ; =sSurroundDecay
- ldr r2, [r2]
- cmp r2, #0
- ble _037FBFF8
- mov r2, #1
- mov r2, r2, lsl r0
- ldr r0, _037FC054 ; =0x0000FFF5
- ands r0, r2, r0
- beq _037FBFF8
- mov r0, r1
- mov r1, r5
- bl CalcSurroundDecay
- mov r1, r0
-_037FBFF8:
- ldr r2, [sp, #36] ; 0x24
- mov r0, r7, lsl #29
- orr r0, r0, r6, lsl #27
- orr r0, r0, r5, lsl #16
- orr r0, r0, r2, lsl #8
- orr r0, r1, r0
- add r1, r4, #67108864 ; 0x4000000
- str r0, [r1, #1024] ; 0x400
- ldr r0, [sp, #40] ; 0x28
- rsb r2, r0, #65536 ; 0x10000
- add r0, r1, #1024 ; 0x400
- strh r2, [r0, #8]
- ldr r2, [sp, #24]
- strh r2, [r0, #10]
- ldr r0, [sp, #28]
- str r0, [r1, #1036] ; 0x40c
- str r8, [r1, #1028] ; 0x404
- ldmia sp!, {r4, r5, r6, r7, r8, lr}
- bx lr
-_037FC044: .word sOrgPan
-_037FC048: .word sMasterPan
-_037FC04C: .word sOrgVolume
-_037FC050: .word sSurroundDecay
-_037FC054: .word 0x0000FFF5
diff --git a/arm7/asm/SND_alarm.s b/arm7/asm/SND_alarm.s
deleted file mode 100644
index 68740d65..00000000
--- a/arm7/asm/SND_alarm.s
+++ /dev/null
@@ -1,144 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .section .bss
-
- .global _03808EEC
-_03808EEC: ;0x03808EEC
- .space 0x038090EC - 0x03808EEC
-
- .section .text
-
- arm_func_start AlarmHandler
-AlarmHandler: ; 0x037FF524
- stmdb sp!, {r4, r5, r6, lr}
- mov r6, r0
- mov r5, #7
- mov r4, #0
-_037FF534:
- mov r0, r5
- mov r1, r6
- mov r2, r4
- bl PXI_SendWordByFifo
- cmp r0, #0
- blt _037FF534
- ldmia sp!, {r4, r5, r6, lr}
- bx lr
-
- arm_func_start SND_StopAlarm
-SND_StopAlarm: ; 0x037FF554
- stmdb sp!, {r4, lr}
- ldr r1, _037FF590 ; =_03808EEC
- add r4, r1, r0, lsl #6
- ldrb r0, [r1, r0, lsl #6]
- cmp r0, #0
- beq _037FF588
- add r0, r4, #20
- bl OS_CancelAlarm
- ldrb r0, [r4, #1]
- add r0, r0, #1
- strb r0, [r4, #1]
- mov r0, #0
- strb r0, [r4]
-_037FF588:
- ldmia sp!, {r4, lr}
- bx lr
-_037FF590: .word _03808EEC
-
- arm_func_start SND_StartAlarm
-SND_StartAlarm: ; 0x037FF594
- stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
- sub sp, sp, #12
- mov r4, r0
- ldr r0, _037FF654 ; =_03808EEC
- add r5, r0, r4, lsl #6
- ldrb r0, [r0, r4, lsl #6]
- cmp r0, #0
- beq _037FF5C4
- add r0, r5, #20
- bl OS_CancelAlarm
- mov r0, #0
- strb r0, [r5]
-_037FF5C4:
- ldr r9, [r5, #4]
- ldr r8, [r5, #8]
- ldr r7, [r5, #12]
- ldr r6, [r5, #16]
- ldrb r0, [r5, #1]
- orr r4, r4, r0, lsl #8
- add r0, r5, #20
- bl OS_CreateAlarm
- mov r0, #0
- cmp r6, r0
- cmpeq r7, r0
- bne _037FF610
- str r4, [sp]
- add r0, r5, #20
- mov r1, r9
- mov r2, r8
- ldr r3, _037FF658 ; =AlarmHandler
- bl OS_SetAlarm
- b _037FF640
-_037FF610:
- bl OS_GetTick
- mov r2, r0
- ldr r0, _037FF658 ; =AlarmHandler
- str r0, [sp, #4]
- str r4, [sp, #8]
- mov r3, r7
- str r6, [sp]
- add r0, r5, #20
- adds r4, r9, r2
- adc r2, r8, r1
- mov r1, r4
- bl OS_SetPeriodicAlarm
-_037FF640:
- mov r0, #1
- strb r0, [r5]
- add sp, sp, #12
- ldmia sp!, {r4, r5, r6, r7, r8, r9, lr}
- bx lr
-_037FF654: .word _03808EEC
-_037FF658: .word AlarmHandler
-
- arm_func_start SND_SetupAlarm
-SND_SetupAlarm: ; 0x037FF65C
- stmdb sp!, {r4, r5, r6, r7, r8, lr}
- mov r8, r1
- mov r7, r2
- mov r6, r3
- ldr r5, [sp, #24]
- ldr r1, _037FF6B4 ; =_03808EEC
- add r4, r1, r0, lsl #6
- ldrb r0, [r1, r0, lsl #6]
- cmp r0, #0
- beq _037FF694
- add r0, r4, #20
- bl OS_CancelAlarm
- mov r0, #0
- strb r0, [r4]
-_037FF694:
- str r8, [r4, #4]
- str r7, [r4, #8]
- str r6, [r4, #12]
- str r5, [r4, #16]
- ldr r0, [sp, #28]
- strb r0, [r4, #1]
- ldmia sp!, {r4, r5, r6, r7, r8, lr}
- bx lr
-_037FF6B4: .word _03808EEC
-
- arm_func_start SND_AlarmInit
-SND_AlarmInit: ; 0x037FF6B8
- mov r3, #0
- mov r2, r3
- ldr r1, _037FF6E0 ; =SNDi_Work
-_037FF6C4:
- add r0, r1, r3, lsl #6
- strb r2, [r0, #3968] ; 0xf80
- strb r2, [r0, #3969] ; 0xf81
- add r3, r3, #1
- cmp r3, #8
- blt _037FF6C4
- bx lr
-_037FF6E0: .word SNDi_Work
diff --git a/arm7/asm/SND_bank.s b/arm7/asm/SND_bank.s
deleted file mode 100644
index acf1ac44..00000000
--- a/arm7/asm/SND_bank.s
+++ /dev/null
@@ -1,245 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .text
-
- arm_func_start GetWaveData
-GetWaveData: ; 0x037FF114
- stmfd sp!, {lr}
- sub sp, sp, #4
- add r0, r0, r1, lsl #3
- ldr r0, [r0, #24]
- cmp r0, #0
- moveq r0, #0
- beq _037FF148
- ldr r1, [r0, #56] ; 0x38
- cmp r2, r1
- movcs r0, #0
- bcs _037FF148
- mov r1, r2
- bl SND_GetWaveDataAddress
-_037FF148:
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-
- arm_func_start SND_NoteOn
-SND_NoteOn: ; 0x037FF154
- stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
- sub sp, sp, #4
- mov r9, r0
- mov r8, r1
- mov r7, r2
- mov r6, r3
- ldr r5, [sp, #36] ; 0x24
- ldrb r4, [r5, #10]
- cmp r4, #255 ; 0xff
- mvneq r6, #0
- moveq r4, #0
- ldrb r0, [r5]
- cmp r0, #4
- addls pc, pc, r0, lsl #2
- b _037FF210
- b _037FF210
- b _037FF1A4
- b _037FF1EC
- b _037FF200
- b _037FF1A4
-_037FF1A4:
- cmp r0, #1
- ldrneh r1, [r5, #4]
- ldrneh r0, [r5, #2]
- orrne r1, r0, r1, lsl #16
- bne _037FF1CC
- ldr r0, [sp, #32]
- ldrh r1, [r5, #4]
- ldrh r2, [r5, #2]
- bl GetWaveData
- mov r1, r0
-_037FF1CC:
- cmp r1, #0
- moveq r0, #0
- beq _037FF214
- mov r0, r9
- add r2, r1, #12
- mov r3, r6
- bl SND_StartExChannelPcm
- b _037FF214
-_037FF1EC:
- mov r0, r9
- ldrh r1, [r5, #2]
- mov r2, r6
- bl SND_StartExChannelPsg
- b _037FF214
-_037FF200:
- mov r0, r9
- mov r1, r6
- bl SND_StartExChannelNoise
- b _037FF214
-_037FF210:
- mov r0, #0
-_037FF214:
- cmp r0, #0
- moveq r0, #0
- beq _037FF270
- strb r8, [r9, #8]
- ldrb r0, [r5, #6]
- strb r0, [r9, #5]
- strb r7, [r9, #9]
- mov r0, r9
- ldrb r1, [r5, #7]
- bl SND_SetExChannelAttack
- mov r0, r9
- ldrb r1, [r5, #8]
- bl SND_SetExChannelDecay
- mov r0, r9
- ldrb r1, [r5, #9]
- bl SND_SetExChannelSustain
- mov r0, r9
- mov r1, r4
- bl SND_SetExChannelRelease
- ldrb r0, [r5, #11]
- sub r0, r0, #64 ; 0x40
- strb r0, [r9, #10]
- mov r0, #1
-_037FF270:
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, r8, r9, lr}
- bx lr
-
- arm_func_start SND_GetWaveDataAddress
-SND_GetWaveDataAddress: ; 0x037FF27C
- stmdb sp!, {r4, r5, lr}
- sub sp, sp, #4
- mov r5, r0
- mov r4, r1
- bl SNDi_LockMutex
- add r0, r5, r4, lsl #2
- ldr r4, [r0, #60] ; 0x3c
- cmp r4, #0
- beq _037FF2AC
- cmp r4, #33554432 ; 0x2000000
- addcc r4, r5, r4
- b _037FF2B0
-_037FF2AC:
- mov r4, #0
-_037FF2B0:
- bl SNDi_UnlockMutex
- mov r0, r4
- add sp, sp, #4
- ldmia sp!, {r4, r5, lr}
- bx lr
-
- arm_func_start SND_ReadInstData
-SND_ReadInstData: ; 0x037FF2C4
- stmdb sp!, {r4, r5, r6, r7, lr}
- sub sp, sp, #4
- mov r6, r0
- movs r7, r1
- mov r5, r2
- mov r4, r3
- movmi r0, #0
- bmi _037FF43C
- bl SNDi_LockMutex
- ldr r0, [r6, #56] ; 0x38
- cmp r7, r0
- bcc _037FF300
- bl SNDi_UnlockMutex
- mov r0, #0
- b _037FF43C
-_037FF300:
- add r0, r6, r7, lsl #2
- ldr r3, [r0, #60] ; 0x3c
- strb r3, [r4]
- ldrb r0, [r4]
- cmp r0, #17
- addls pc, pc, r0, lsl #2
- b _037FF428
- b _037FF428
- b _037FF364
- b _037FF364
- b _037FF364
- b _037FF364
- b _037FF364
- b _037FF428
- b _037FF428
- b _037FF428
- b _037FF428
- b _037FF428
- b _037FF428
- b _037FF428
- b _037FF428
- b _037FF428
- b _037FF428
- b _037FF384
- b _037FF3D4
-_037FF364:
- add r3, r6, r3, lsr #8
- add r2, r4, #2
- mov r1, #5
-_037FF370:
- ldrh r0, [r3], #2
- strh r0, [r2], #2
- subs r1, r1, #1
- bne _037FF370
- b _037FF434
-_037FF384:
- add r2, r6, r3, lsr #8
- ldrb r1, [r2, #1]
- ldrb r0, [r6, r3, lsr #8]
- cmp r5, r0
- blt _037FF3A0
- cmp r5, r1
- ble _037FF3AC
-_037FF3A0:
- bl SNDi_UnlockMutex
- mov r0, #0
- b _037FF43C
-_037FF3AC:
- sub r1, r5, r0
- mov r0, #12
- mla r0, r1, r0, r2
- add r2, r0, #2
- mov r1, #6
-_037FF3C0:
- ldrh r0, [r2], #2
- strh r0, [r4], #2
- subs r1, r1, #1
- bne _037FF3C0
- b _037FF434
-_037FF3D4:
- mov r2, #0
- add r1, r6, r3, lsr #8
- b _037FF3F8
-_037FF3E0:
- add r2, r2, #1
- cmp r2, #8
- blt _037FF3F8
- bl SNDi_UnlockMutex
- mov r0, #0
- b _037FF43C
-_037FF3F8:
- ldrb r0, [r1, r2]
- cmp r5, r0
- bgt _037FF3E0
- mov r0, #12
- mla r0, r2, r0, r1
- add r2, r0, #8
- mov r1, #6
-_037FF414:
- ldrh r0, [r2], #2
- strh r0, [r4], #2
- subs r1, r1, #1
- bne _037FF414
- b _037FF434
-_037FF428:
- bl SNDi_UnlockMutex
- mov r0, #0
- b _037FF43C
-_037FF434:
- bl SNDi_UnlockMutex
- mov r0, #1
-_037FF43C:
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, lr}
- bx lr
diff --git a/arm7/asm/SND_capture.s b/arm7/asm/SND_capture.s
deleted file mode 100644
index d40e792e..00000000
--- a/arm7/asm/SND_capture.s
+++ /dev/null
@@ -1,38 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .text
-
- arm_func_start SND_IsCaptureActive
-SND_IsCaptureActive: ; 0x037FC4C0
- add r0, r0, #67108864 ; 0x4000000
- ldrb r0, [r0, #1288] ; 0x508
- ands r0, r0, #128 ; 0x80
- movne r0, #1
- moveq r0, #0
- bx lr
-
- arm_func_start SND_SetupCapture
-SND_SetupCapture: ; 0x037FC4D8
- stmdb sp!, {r4, r5, lr}
- sub sp, sp, #4
- mov r4, r0, lsl #3
- ldr ip, [sp, #16]
- cmp ip, #0
- movne r5, #0
- moveq r5, #1
- ldr lr, [sp, #24]
- ldr ip, [sp, #20]
- mov r1, r1, lsl #3
- orr r1, r1, r5, lsl #2
- orr r1, r1, ip, lsl #1
- orr r1, lr, r1
- add r0, r0, #67108864 ; 0x4000000
- strb r1, [r0, #1288] ; 0x508
- add r0, r4, #67108864 ; 0x4000000
- str r2, [r0, #1296] ; 0x510
- add r0, r0, #1280 ; 0x500
- strh r3, [r0, #20]
- add sp, sp, #4
- ldmia sp!, {r4, r5, lr}
- bx lr
diff --git a/arm7/asm/SND_channel.s b/arm7/asm/SND_channel.s
deleted file mode 100644
index 850c06f3..00000000
--- a/arm7/asm/SND_channel.s
+++ /dev/null
@@ -1,208 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .text
-
- arm_func_start FUN_037FC530
-FUN_037FC530: ; 0x037FC530
- stmdb sp!, {r4, r5, r6, lr}
- mov r6, r0
- mov r5, r1
- add r0, r6, #40 ; 0x28
- bl SND_GetLfoValue
- mov r4, r0
- mov ip, r0, asr #31
- mov r3, #0
- cmp ip, r3
- cmpeq r0, r3
- beq _037FC5B0
- ldrb r1, [r6, #40] ; 0x28
- cmp r1, #0
- beq _037FC59C
- cmp r1, #1
- beq _037FC584
- cmp r1, #2
- moveq ip, ip, lsl #6
- orreq ip, ip, r0, lsr #26
- moveq r4, r0, lsl #6
- b _037FC5A8
-_037FC584:
- mov r2, #60 ; 0x3c
- umull r4, r1, r0, r2
- mla r1, r0, r3, r1
- mla r1, ip, r2, r1
- mov ip, r1
- b _037FC5A8
-_037FC59C:
- mov ip, ip, lsl #6
- orr ip, ip, r0, lsr #26
- mov r4, r0, lsl #6
-_037FC5A8:
- mov r4, r4, lsr #14
- orr r4, r4, ip, lsl #18
-_037FC5B0:
- cmp r5, #0
- beq _037FC5C0
- add r0, r6, #40 ; 0x28
- bl SND_UpdateLfo
-_037FC5C0:
- mov r0, r4
- ldmia sp!, {r4, r5, r6, lr}
- bx lr
-
- arm_func_start FUN_037FC5CC
-FUN_037FC5CC: ; 0x037FC5CC
- stmdb sp!, {r4, r5, lr}
- sub sp, sp, #4
- mov r4, r0
- mov r5, r1
- ldrsh r3, [r4, #50] ; 0x32
- cmp r3, #0
- moveq r0, #0
- beq _037FC630
- ldr r0, [r4, #20]
- ldr r2, [r4, #24]
- cmp r0, r2
- movge r0, #0
- bge _037FC630
- sub r0, r2, r0
- smull r0, r1, r3, r0
- mov r3, r2, asr #31
- bl _ll_sdiv
- cmp r5, #0
- beq _037FC630
- ldrb r1, [r4, #3]
- mov r1, r1, lsl #29
- movs r1, r1, lsr #31
- ldrne r1, [r4, #20]
- addne r1, r1, #1
- strne r1, [r4, #20]
-_037FC630:
- add sp, sp, #4
- ldmia sp!, {r4, r5, lr}
- bx lr
-
- arm_func_start FUN_037FC63C
-FUN_037FC63C: ; 0x037FC63C
- stmfd sp!, {lr}
- sub sp, sp, #4
- ldrh lr, [r0, #36] ; 0x24
- and r2, lr, #255 ; 0xff
- ldrh ip, [r1, #36] ; 0x24
- and r0, ip, #255 ; 0xff
- mov r2, r2, lsl #4
- mov r3, r0, lsl #4
- ldr r1, _037FC698 ; =_03807294
- ldrb r0, [r1, lr, asr #8]
- mov r2, r2, asr r0
- ldrb r0, [r1, ip, asr #8]
- mov r0, r3, asr r0
- cmp r2, r0
- beq _037FC688
- cmp r2, r0
- movlt r0, #1
- mvnge r0, #0
- b _037FC68C
-_037FC688:
- mov r0, #0
-_037FC68C:
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_037FC698: .word _03807294
-
- arm_func_start FUN_037FC69C
-FUN_037FC69C: ; 0x037FC69C
- stmdb sp!, {r4, lr}
- mov r4, r0
- ldr r0, _037FC6E4 ; =0xFFFE9680
- str r0, [r4, #16]
- mov r0, #0
- strb r0, [r4, #2]
- str r1, [r4, #52] ; 0x34
- add r0, r4, #40 ; 0x28
- bl SND_StartLfo
- ldrb r0, [r4, #3]
- orr r0, r0, #2
- strb r0, [r4, #3]
- ldrb r0, [r4, #3]
- bic r0, r0, #1
- orr r0, r0, #1
- strb r0, [r4, #3]
- ldmia sp!, {r4, lr}
- bx lr
-_037FC6E4: .word 0xFFFE9680
-
- arm_func_start FUN_037FC6E8
-FUN_037FC6E8: ; 0x037FC6E8
- stmdb sp!, {r4, lr}
- mov r4, r0
- mov ip, #0
- str ip, [r4, #80] ; 0x50
- str r1, [r4, #72] ; 0x48
- str r2, [r4, #76] ; 0x4c
- str ip, [r4, #52] ; 0x34
- strb r3, [r4, #34] ; 0x22
- mov r1, #127 ; 0x7f
- strh r1, [r4, #36] ; 0x24
- ldrb r2, [r4, #3]
- bic r2, r2, #2
- strb r2, [r4, #3]
- ldrb r2, [r4, #3]
- orr r2, r2, #4
- strb r2, [r4, #3]
- mov r2, #60 ; 0x3c
- strb r2, [r4, #8]
- strb r2, [r4, #5]
- strb r1, [r4, #9]
- strb ip, [r4, #10]
- strh ip, [r4, #12]
- strh ip, [r4, #6]
- strh ip, [r4, #14]
- strb ip, [r4, #11]
- strb r1, [r4, #4]
- strh ip, [r4, #50] ; 0x32
- str ip, [r4, #24]
- str ip, [r4, #20]
- bl SND_SetExChannelAttack
- mov r0, r4
- mov r1, #127 ; 0x7f
- bl SND_SetExChannelDecay
- mov r0, r4
- mov r1, #127 ; 0x7f
- bl SND_SetExChannelSustain
- mov r0, r4
- mov r1, #127 ; 0x7f
- bl SND_SetExChannelRelease
- add r0, r4, #40 ; 0x28
- bl SND_InitLfoParam
- ldmia sp!, {r4, lr}
- bx lr
-
- arm_func_start FUN_037FC794
-FUN_037FC794: ; 0x037FC794
- stmfd sp!, {lr}
- sub sp, sp, #4
- mov r1, r0
- cmp r1, #127 ; 0x7f
- ldreq r0, _037FC7F0 ; =0x0000FFFF
- beq _037FC7E4
- cmp r1, #126 ; 0x7e
- moveq r0, #15360 ; 0x3c00
- beq _037FC7E4
- cmp r1, #50 ; 0x32
- movlt r0, r1, lsl #1
- addlt r0, r0, #1
- movlt r0, r0, lsl #16
- movlt r0, r0, lsr #16
- blt _037FC7E4
- mov r0, #7680 ; 0x1e00
- rsb r1, r1, #126 ; 0x7e
- bl _s32_div_f
- mov r0, r0, lsl #16
- mov r0, r0, lsr #16
-_037FC7E4:
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_037FC7F0: .word 0x0000FFFF
diff --git a/arm7/asm/SND_command.s b/arm7/asm/SND_command.s
deleted file mode 100644
index ec1a5014..00000000
--- a/arm7/asm/SND_command.s
+++ /dev/null
@@ -1,639 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .section .bss
-
- .global _038090EC
-_038090EC: ;0x038090EC
- .space 0x0380910C - 0x038090EC
-
- .global _0380910C
-_0380910C: ;0x0380910C
- .space 0x0380912C - 0x0380910C
-
- .section .text
-
- arm_func_start ReadDriverInfo
-ReadDriverInfo: ; 0x037FF6E4
- stmdb sp!, {r4, r5, lr}
- sub sp, sp, #4
- mov r5, r0
- ldr r0, _037FF74C ; =SNDi_Work
- mov r1, r5
- mov r2, #4480 ; 0x1180
- bl MIi_CpuCopy32
- ldr r1, _037FF74C ; =SNDi_Work
- add r0, r5, #4096 ; 0x1000
- str r1, [r0, #448] ; 0x1c0
- mov r4, #0
-_037FF710:
- mov r0, r4
- bl SND_GetChannelControl
- add r1, r5, r4, lsl #2
- add r1, r1, #4096 ; 0x1000
- str r0, [r1, #384] ; 0x180
- add r4, r4, #1
- cmp r4, #16
- blt _037FF710
- mov r0, #0
- bl SND_GetLockedChannel
- add r1, r5, #4096 ; 0x1000
- str r0, [r1, #452] ; 0x1c4
- add sp, sp, #4
- ldmia sp!, {r4, r5, lr}
- bx lr
-_037FF74C: .word SNDi_Work
-
- arm_func_start StopTimer
-StopTimer: ; 0x037FF750
- stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
- sub sp, sp, #4
- mov r7, r0
- mov r6, r1
- mov r9, r2
- mov r5, r3
- bl OS_DisableInterrupts
- mov r4, r0
- mov r8, #0
- b _037FF790
-_037FF778:
- ands r0, r9, #1
- beq _037FF788
- mov r0, r8
- bl SND_StopAlarm
-_037FF788:
- add r8, r8, #1
- mov r9, r9, lsr #1
-_037FF790:
- cmp r8, #8
- bge _037FF7A0
- cmp r9, #0
- bne _037FF778
-_037FF7A0:
- mov r8, #0
- b _037FF7C4
-_037FF7A8:
- ands r0, r7, #1
- beq _037FF7BC
- mov r0, r8
- mov r1, r5
- bl SND_StopChannel
-_037FF7BC:
- add r8, r8, #1
- mov r7, r7, lsr #1
-_037FF7C4:
- cmp r8, #16
- bge _037FF7D4
- cmp r7, #0
- bne _037FF7A8
-_037FF7D4:
- ands r0, r6, #1
- movne r1, #0
- ldrne r0, _037FF80C ; =0x04000508
- strneb r1, [r0]
- ands r0, r6, #2
- movne r1, #0
- ldrne r0, _037FF810 ; =0x04000509
- strneb r1, [r0]
- mov r0, r4
- bl OS_RestoreInterrupts
- bl SND_UpdateSharedWork
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, r8, r9, lr}
- bx lr
-_037FF80C: .word 0x04000508
-_037FF810: .word 0x04000509
-
- arm_func_start StartTimer
-StartTimer: ; 0x037FF814
- stmdb sp!, {r4, r5, r6, r7, lr}
- sub sp, sp, #4
- mov r7, r0
- mov r6, r1
- mov r5, r2
- bl OS_DisableInterrupts
- mov r4, r0
- mov r2, #0
- b _037FF858
-_037FF838:
- ands r0, r7, #1
- movne r0, r2, lsl #4
- addne r0, r0, #67108864 ; 0x4000000
- ldrneb r1, [r0, #1027] ; 0x403
- orrne r1, r1, #128 ; 0x80
- strneb r1, [r0, #1027] ; 0x403
- add r2, r2, #1
- mov r7, r7, lsr #1
-_037FF858:
- cmp r2, #16
- bge _037FF868
- cmp r7, #0
- bne _037FF838
-_037FF868:
- ands r0, r6, #1
- beq _037FF8A0
- ands r0, r6, #2
- ldreq r1, _037FF8FC ; =0x04000508
- ldreqb r0, [r1]
- orreq r0, r0, #128 ; 0x80
- streqb r0, [r1]
- beq _037FF8B4
- ldr r2, _037FF8FC ; =0x04000508
- ldrh r1, [r2]
- ldr r0, _037FF900 ; =0x00008080
- orr r0, r1, r0
- strh r0, [r2]
- b _037FF8B4
-_037FF8A0:
- ands r0, r6, #2
- ldrne r1, _037FF904 ; =0x04000509
- ldrneb r0, [r1]
- orrne r0, r0, #128 ; 0x80
- strneb r0, [r1]
-_037FF8B4:
- mov r6, #0
- b _037FF8D4
-_037FF8BC:
- ands r0, r5, #1
- beq _037FF8CC
- mov r0, r6
- bl SND_StartAlarm
-_037FF8CC:
- add r6, r6, #1
- mov r5, r5, lsr #1
-_037FF8D4:
- cmp r6, #8
- bge _037FF8E4
- cmp r5, #0
- bne _037FF8BC
-_037FF8E4:
- mov r0, r4
- bl OS_RestoreInterrupts
- bl SND_UpdateSharedWork
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, lr}
- bx lr
-_037FF8FC: .word 0x04000508
-_037FF900: .word 0x00008080
-_037FF904: .word 0x04000509
-
- arm_func_start SetChannelPan
-SetChannelPan: ; 0x037FF908
- stmdb sp!, {r4, r5, r6, lr}
- mov r6, r0
- mov r5, r1
- mov r4, #0
- b _037FF938
-_037FF91C:
- ands r0, r6, #1
- beq _037FF930
- mov r0, r4
- mov r1, r5
- bl SND_SetChannelPan
-_037FF930:
- add r4, r4, #1
- mov r6, r6, lsr #1
-_037FF938:
- cmp r4, #16
- bge _037FF948
- cmp r6, #0
- bne _037FF91C
-_037FF948:
- ldmia sp!, {r4, r5, r6, lr}
- bx lr
-
- arm_func_start SetChannelVolume
-SetChannelVolume: ; 0x037FF950
- stmdb sp!, {r4, r5, r6, r7, lr}
- sub sp, sp, #4
- mov r7, r0
- mov r6, r1
- mov r5, r2
- mov r4, #0
- b _037FF98C
-_037FF96C:
- ands r0, r7, #1
- beq _037FF984
- mov r0, r4
- mov r1, r6
- mov r2, r5
- bl SND_SetChannelVolume
-_037FF984:
- add r4, r4, #1
- mov r7, r7, lsr #1
-_037FF98C:
- cmp r4, #16
- bge _037FF99C
- cmp r7, #0
- bne _037FF96C
-_037FF99C:
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, lr}
- bx lr
-
- arm_func_start SetChannelTimer
-SetChannelTimer: ; 0x037FF9A8
- stmdb sp!, {r4, r5, r6, lr}
- mov r6, r0
- mov r5, r1
- mov r4, #0
- b _037FF9D8
-_037FF9BC:
- ands r0, r6, #1
- beq _037FF9D0
- mov r0, r4
- mov r1, r5
- bl SND_SetChannelTimer
-_037FF9D0:
- add r4, r4, #1
- mov r6, r6, lsr #1
-_037FF9D8:
- cmp r4, #16
- bge _037FF9E8
- cmp r6, #0
- bne _037FF9BC
-_037FF9E8:
- ldmia sp!, {r4, r5, r6, lr}
- bx lr
-
- arm_func_start InitPXI
-InitPXI: ; 0x037FF9F0
- mov r0, #7
- ldr r1, _037FFA00 ; =PxiFifoCallback
- ldr ip, _037FFA04 ; =PXI_SetFifoRecvCallback
- bx ip
-_037FFA00: .word PxiFifoCallback
-_037FFA04: .word PXI_SetFifoRecvCallback
-
- arm_func_start PxiFifoCallback
-PxiFifoCallback: ; 0x037FFA08
- stmdb sp!, {r4, r5, lr}
- sub sp, sp, #4
- mov r5, r1
- bl OS_DisableInterrupts
- mov r4, r0
- cmp r5, #33554432 ; 0x2000000
- bcc _037FFA38
- ldr r0, _037FFA58 ; =_038090EC
- mov r1, r5
- mov r2, #0
- bl OS_SendMessage
- b _037FFA44
-_037FFA38:
- cmp r5, #0
- bne _037FFA44
- bl SND_SendWakeupMessage
-_037FFA44:
- mov r0, r4
- bl OS_RestoreInterrupts
- add sp, sp, #4
- ldmia sp!, {r4, r5, lr}
- bx lr
-_037FFA58: .word _038090EC
-
- arm_func_start SND_CommandProc
-SND_CommandProc: ; 0x037FFA5C
- stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
- sub sp, sp, #52 ; 0x34
- ldr r7, _037FFEC4 ; =SNDi_SharedWork
- ldr r9, _037FFEC8 ; =_038090EC
- add r8, sp, #24
- mov r4, #0
- ldr r6, _037FFECC ; =0x0000FFFF
- ldr r5, _037FFED0 ; =0x003FFFFF
- b _037FFEA0
-_037FFA80:
- ldr lr, [sp, #24]
- b _037FFE88
-_037FFA88:
- add ip, sp, #28
- ldmia lr!, {r0, r1, r2, r3}
- stmia ip!, {r0, r1, r2, r3}
- ldmia lr, {r0, r1}
- stmia ip, {r0, r1}
- ldr r0, [sp, #32]
- cmp r0, #33 ; 0x21
- addls pc, pc, r0, lsl #2
- b _037FFE84
- b _037FFB34
- b _037FFB4C
- b _037FFB58
- b _037FFB70
- b _037FFB7C
- b _037FFB8C
- b _037FFB9C
- b _037FFBB4
- b _037FFBDC
- b _037FFBF0
- b _037FFC04
- b _037FFC20
- b _037FFC38
- b _037FFC50
- b _037FFD08
- b _037FFD74
- b _037FFDA8
- b _037FFC68
- b _037FFCB0
- b _037FFCD4
- b _037FFCE4
- b _037FFCF8
- b _037FFDD4
- b _037FFDE0
- b _037FFDEC
- b _037FFDF8
- b _037FFE10
- b _037FFE20
- b _037FFE30
- b _037FFE70
- b _037FFE40
- b _037FFE50
- b _037FFE60
- b _037FFE7C
-_037FFB34:
- ldr r0, [sp, #36] ; 0x24
- ldr r1, [sp, #40] ; 0x28
- ldr r2, [sp, #44] ; 0x2c
- ldr r3, [sp, #48] ; 0x30
- bl SND_StartSeq
- b _037FFE84
-_037FFB4C:
- ldr r0, [sp, #36] ; 0x24
- bl SND_StopSeq
- b _037FFE84
-_037FFB58:
- ldr r0, [sp, #36] ; 0x24
- ldr r1, [sp, #40] ; 0x28
- ldr r2, [sp, #44] ; 0x2c
- ldr r3, [sp, #48] ; 0x30
- bl SND_PrepareSeq
- b _037FFE84
-_037FFB70:
- ldr r0, [sp, #36] ; 0x24
- bl SND_StartPreparedSeq
- b _037FFE84
-_037FFB7C:
- ldr r0, [sp, #36] ; 0x24
- ldr r1, [sp, #40] ; 0x28
- bl SND_PauseSeq
- b _037FFE84
-_037FFB8C:
- ldr r0, [sp, #36] ; 0x24
- ldr r1, [sp, #40] ; 0x28
- bl SND_SkipSeq
- b _037FFE84
-_037FFB9C:
- ldr r0, [sp, #36] ; 0x24
- ldr r1, [sp, #40] ; 0x28
- ldr r2, [sp, #44] ; 0x2c
- ldr r3, [sp, #48] ; 0x30
- bl SNDi_SetPlayerParam
- b _037FFE84
-_037FFBB4:
- ldr r1, [sp, #36] ; 0x24
- mov r0, r1, lsr #24
- and r0, r0, #255 ; 0xff
- str r0, [sp]
- bic r0, r1, #-16777216 ; 0xff000000
- ldr r1, [sp, #40] ; 0x28
- ldr r2, [sp, #44] ; 0x2c
- ldr r3, [sp, #48] ; 0x30
- bl SNDi_SetTrackParam
- b _037FFE84
-_037FFBDC:
- ldr r0, [sp, #36] ; 0x24
- ldr r1, [sp, #40] ; 0x28
- ldr r2, [sp, #44] ; 0x2c
- bl SND_SetTrackMute
- b _037FFE84
-_037FFBF0:
- ldr r0, [sp, #36] ; 0x24
- ldr r1, [sp, #40] ; 0x28
- ldr r2, [sp, #44] ; 0x2c
- bl SND_SetTrackAllocatableChannel
- b _037FFE84
-_037FFC04:
- ldr r0, [sp, #36] ; 0x24
- ldr r1, [sp, #40] ; 0x28
- ldr r2, [sp, #44] ; 0x2c
- mov r2, r2, lsl #16
- mov r2, r2, asr #16
- bl SND_SetPlayerLocalVariable
- b _037FFE84
-_037FFC20:
- ldr r0, [sp, #36] ; 0x24
- ldr r1, [sp, #40] ; 0x28
- mov r1, r1, lsl #16
- mov r1, r1, asr #16
- bl SND_SetPlayerGlobalVariable
- b _037FFE84
-_037FFC38:
- ldr r0, [sp, #36] ; 0x24
- ldr r1, [sp, #40] ; 0x28
- ldr r2, [sp, #44] ; 0x2c
- ldr r3, [sp, #48] ; 0x30
- bl StartTimer
- b _037FFE84
-_037FFC50:
- ldr r0, [sp, #36] ; 0x24
- ldr r1, [sp, #40] ; 0x28
- ldr r2, [sp, #44] ; 0x2c
- ldr r3, [sp, #48] ; 0x30
- bl StopTimer
- b _037FFE84
-_037FFC68:
- ldr r1, [sp, #44] ; 0x2c
- mov r0, r1, lsr #29
- and r0, r0, #1
- str r0, [sp]
- mov r0, r1, lsr #28
- and r0, r0, #1
- str r0, [sp, #4]
- mov r0, r1, lsr #27
- and r0, r0, #1
- str r0, [sp, #8]
- mov r0, r1, lsr #31
- and r0, r0, #1
- mov r1, r1, lsr #30
- and r1, r1, #1
- ldr r2, [sp, #36] ; 0x24
- ldr r3, [sp, #40] ; 0x28
- bl SND_SetupCapture
- b _037FFE84
-_037FFCB0:
- ldr r0, [sp, #48] ; 0x30
- str r0, [sp, #4]
- ldr r3, [sp, #44] ; 0x2c
- str r4, [sp]
- ldr r0, [sp, #36] ; 0x24
- ldr r1, [sp, #40] ; 0x28
- mov r2, #0
- bl SND_SetupAlarm
- b _037FFE84
-_037FFCD4:
- ldr r0, [sp, #36] ; 0x24
- ldr r1, [sp, #40] ; 0x28
- bl SetChannelTimer
- b _037FFE84
-_037FFCE4:
- ldr r0, [sp, #36] ; 0x24
- ldr r1, [sp, #40] ; 0x28
- ldr r2, [sp, #44] ; 0x2c
- bl SetChannelVolume
- b _037FFE84
-_037FFCF8:
- ldr r0, [sp, #36] ; 0x24
- ldr r1, [sp, #40] ; 0x28
- bl SetChannelPan
- b _037FFE84
-_037FFD08:
- ldr r3, [sp, #48] ; 0x30
- ldr r1, [sp, #36] ; 0x24
- ldr r0, [sp, #44] ; 0x2c
- and r2, r3, r6
- str r2, [sp]
- and r2, r0, r5
- str r2, [sp, #4]
- mov r2, r0, lsr #24
- and r2, r2, #127 ; 0x7f
- str r2, [sp, #8]
- mov r0, r0, lsr #22
- and r0, r0, #3
- str r0, [sp, #12]
- and r0, r6, r1, lsr #16
- str r0, [sp, #16]
- mov r0, r3, lsr #16
- and r0, r0, #127 ; 0x7f
- str r0, [sp, #20]
- and r0, r1, r6
- ldr r1, [sp, #40] ; 0x28
- bic r1, r1, #-134217728 ; 0xf8000000
- mov r2, r3, lsr #24
- and r2, r2, #3
- mov r3, r3, lsr #26
- and r3, r3, #3
- bl SND_SetupChannelPcm
- b _037FFE84
-_037FFD74:
- ldr r1, [sp, #44] ; 0x2c
- ldr r3, [sp, #40] ; 0x28
- and r0, r6, r1, lsr #8
- str r0, [sp]
- and r0, r1, #127 ; 0x7f
- str r0, [sp, #4]
- ldr r0, [sp, #36] ; 0x24
- ldr r1, [sp, #48] ; 0x30
- and r2, r3, #127 ; 0x7f
- mov r3, r3, lsr #8
- and r3, r3, #3
- bl SND_SetupChannelPsg
- b _037FFE84
-_037FFDA8:
- ldr r3, [sp, #44] ; 0x2c
- ldr r2, [sp, #40] ; 0x28
- and r0, r3, #127 ; 0x7f
- str r0, [sp]
- ldr r0, [sp, #36] ; 0x24
- and r1, r2, #127 ; 0x7f
- mov r2, r2, lsr #8
- and r2, r2, #3
- and r3, r6, r3, lsr #8
- bl SND_SetupChannelNoise
- b _037FFE84
-_037FFDD4:
- ldr r0, [sp, #36] ; 0x24
- bl SNDi_SetSurroundDecay
- b _037FFE84
-_037FFDE0:
- ldr r0, [sp, #36] ; 0x24
- bl SND_SetMasterVolume
- b _037FFE84
-_037FFDEC:
- ldr r0, [sp, #36] ; 0x24
- bl SND_SetMasterPan
- b _037FFE84
-_037FFDF8:
- ldr r0, [sp, #36] ; 0x24
- ldr r1, [sp, #40] ; 0x28
- ldr r2, [sp, #44] ; 0x2c
- ldr r3, [sp, #48] ; 0x30
- bl SND_SetOutputSelector
- b _037FFE84
-_037FFE10:
- ldr r0, [sp, #36] ; 0x24
- ldr r1, [sp, #40] ; 0x28
- bl SND_LockChannel
- b _037FFE84
-_037FFE20:
- ldr r0, [sp, #36] ; 0x24
- ldr r1, [sp, #40] ; 0x28
- bl SND_UnlockChannel
- b _037FFE84
-_037FFE30:
- ldr r0, [sp, #36] ; 0x24
- ldr r1, [sp, #40] ; 0x28
- bl SND_StopUnlockedChannel
- b _037FFE84
-_037FFE40:
- ldr r0, [sp, #36] ; 0x24
- ldr r1, [sp, #40] ; 0x28
- bl SND_InvalidateSeq
- b _037FFE84
-_037FFE50:
- ldr r0, [sp, #36] ; 0x24
- ldr r1, [sp, #40] ; 0x28
- bl SND_InvalidateBank
- b _037FFE84
-_037FFE60:
- ldr r0, [sp, #36] ; 0x24
- ldr r1, [sp, #40] ; 0x28
- bl SND_InvalidateWave
- b _037FFE84
-_037FFE70:
- ldr r0, [sp, #36] ; 0x24
- str r0, [r7]
- b _037FFE84
-_037FFE7C:
- ldr r0, [sp, #36] ; 0x24
- bl ReadDriverInfo
-_037FFE84:
- ldr lr, [sp, #28]
-_037FFE88:
- cmp lr, #0
- bne _037FFA88
- ldr r1, [r7]
- ldr r0, [r1]
- add r0, r0, #1
- str r0, [r1]
-_037FFEA0:
- mov r0, r9
- mov r1, r8
- mov r2, r4
- bl OS_ReceiveMessage
- cmp r0, #0
- bne _037FFA80
- add sp, sp, #52 ; 0x34
- ldmia sp!, {r4, r5, r6, r7, r8, r9, lr}
- bx lr
-_037FFEC4: .word SNDi_SharedWork
-_037FFEC8: .word _038090EC
-_037FFECC: .word 0x0000FFFF
-_037FFED0: .word 0x003FFFFF
-
- arm_func_start SND_CommandInit
-SND_CommandInit: ; 0x037FFED4
- stmfd sp!, {lr}
- sub sp, sp, #4
- ldr r0, _037FFF08 ; =_038090EC
- ldr r1, _037FFF0C ; =_0380910C
- mov r2, #8
- bl OS_InitMessageQueue
- bl InitPXI
- mov r1, #0
- ldr r0, _037FFF10 ; =SNDi_SharedWork
- str r1, [r0]
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_037FFF08: .word _038090EC
-_037FFF0C: .word _0380910C
-_037FFF10: .word SNDi_SharedWork
diff --git a/arm7/asm/SND_exChannel.s b/arm7/asm/SND_exChannel.s
deleted file mode 100644
index b1ac819b..00000000
--- a/arm7/asm/SND_exChannel.s
+++ /dev/null
@@ -1,645 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .text
-
- arm_func_start SND_FreeExChannel
-SND_FreeExChannel: ; 0x037FCB80
- cmp r0, #0
- movne r1, #0
- strne r1, [r0, #72] ; 0x48
- strne r1, [r0, #76] ; 0x4c
- bx lr
-
- arm_func_start SND_AllocExChannel
-SND_AllocExChannel: ; 0x037FCB94
- stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
- sub sp, sp, #4
- mov sl, r0
- mov r9, r1
- mov fp, r3
- ldr r0, _037FCCBC ; =_03807F48
- ldr r0, [r0]
- mvn r0, r0
- and sl, sl, r0
- cmp r2, #0
- ldreq r0, _037FCCC0 ; =_03807F44
- ldreq r0, [r0]
- mvneq r0, r0
- andeq sl, sl, r0
- mov r8, #0
- mov r7, r8
- mov r5, #1
- mov r4, #84 ; 0x54
-_037FCBDC:
- ldr r0, _037FCCC4 ; =_03807298
- ldrb r1, [r0, r7]
- mov r0, r5, lsl r1
- ands r0, sl, r0
- beq _037FCC34
- ldr r0, _037FCCC8 ; =SNDi_Work
- mla r6, r1, r4, r0
- cmp r8, #0
- moveq r8, r6
- beq _037FCC34
- ldrb r1, [r8, #34] ; 0x22
- ldrb r0, [r6, #34] ; 0x22
- cmp r0, r1
- bhi _037FCC34
- cmp r0, r1
- bne _037FCC30
- mov r0, r8
- mov r1, r6
- bl FUN_037FC63C
- cmp r0, #0
- bge _037FCC34
-_037FCC30:
- mov r8, r6
-_037FCC34:
- add r7, r7, #1
- cmp r7, #16
- blt _037FCBDC
- cmp r8, #0
- moveq r0, #0
- beq _037FCCB0
- ldrb r0, [r8, #34] ; 0x22
- cmp r9, r0
- movlt r0, #0
- blt _037FCCB0
- ldr r3, [r8, #72] ; 0x48
- cmp r3, #0
- beq _037FCC7C
- mov r0, r8
- mov r1, #0
- ldr r2, [r8, #76] ; 0x4c
- mov lr, pc
- bx r3
-_037FCC7C:
- ldrb r0, [r8, #3]
- bic r0, r0, #248 ; 0xf8
- orr r0, r0, #16
- strb r0, [r8, #3]
- ldrb r0, [r8, #3]
- bic r0, r0, #1
- strb r0, [r8, #3]
- mov r0, r8
- mov r1, fp
- ldr r2, [sp, #40] ; 0x28
- mov r3, r9
- bl FUN_037FC6E8
- mov r0, r8
-_037FCCB0:
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
- bx lr
-_037FCCBC: .word _03807F48
-_037FCCC0: .word _03807F44
-_037FCCC4: .word _03807298
-_037FCCC8: .word SNDi_Work
-
- arm_func_start SND_IsExChannelActive
-SND_IsExChannelActive: ; 0x037FCCCC
- ldrb r0, [r0, #3]
- mov r0, r0, lsl #31
- mov r0, r0, lsr #31
- bx lr
-
- arm_func_start SND_ReleaseExChannel
-SND_ReleaseExChannel: ; 0x037FCCDC
- mov r1, #3
- strb r1, [r0, #2]
- bx lr
-
- arm_func_start SND_SetExChannelRelease
-SND_SetExChannelRelease: ; 0x037FCCE8
- stmdb sp!, {r4, lr}
- mov r4, r0
- mov r0, r1
- bl FUN_037FC794
- strh r0, [r4, #32]
- ldmia sp!, {r4, lr}
- bx lr
-
- arm_func_start SND_SetExChannelSustain
-SND_SetExChannelSustain: ; 0x037FCD04
- strb r1, [r0, #29]
- bx lr
-
- arm_func_start SND_SetExChannelDecay
-SND_SetExChannelDecay: ; 0x037FCD0C
- stmdb sp!, {r4, lr}
- mov r4, r0
- mov r0, r1
- bl FUN_037FC794
- strh r0, [r4, #30]
- ldmia sp!, {r4, lr}
- bx lr
-
- arm_func_start SND_SetExChannelAttack
-SND_SetExChannelAttack: ; 0x037FCD28
- cmp r1, #109 ; 0x6d
- rsblt r1, r1, #255 ; 0xff
- strltb r1, [r0, #28]
- rsbge r2, r1, #127 ; 0x7f
- ldrge r1, _037FCD48 ; =_038072A8
- ldrgeb r1, [r1, r2]
- strgeb r1, [r0, #28]
- bx lr
-_037FCD48: .word _038072A8
-
- arm_func_start SND_UpdateExChannelEnvelope
-SND_UpdateExChannelEnvelope: ; 0x037FCD4C
- cmp r1, #0
- beq _037FCDF0
- ldrb r1, [r0, #2]
- cmp r1, #3
- addls pc, pc, r1, lsl #2
- b _037FCDF0
- b _037FCD74
- b _037FCDA4
- b _037FCDF0
- b _037FCDE0
-_037FCD74:
- ldr r1, [r0, #16]
- rsb r2, r1, #0
- ldrb r1, [r0, #28]
- mul r1, r2, r1
- mov r1, r1, asr #8
- rsb r1, r1, #0
- str r1, [r0, #16]
- ldr r1, [r0, #16]
- cmp r1, #0
- moveq r1, #1
- streqb r1, [r0, #2]
- b _037FCDF0
-_037FCDA4:
- ldrb r1, [r0, #29]
- mov r2, r1, lsl #1
- ldr r1, _037FCDFC ; =SNDi_DecibelSquareTable
- ldrsh r1, [r1, r2]
- mov r3, r1, lsl #7
- ldr r2, [r0, #16]
- ldrh r1, [r0, #30]
- sub r1, r2, r1
- str r1, [r0, #16]
- ldr r1, [r0, #16]
- cmp r1, r3
- strle r3, [r0, #16]
- movle r1, #2
- strleb r1, [r0, #2]
- b _037FCDF0
-_037FCDE0:
- ldr r2, [r0, #16]
- ldrh r1, [r0, #32]
- sub r1, r2, r1
- str r1, [r0, #16]
-_037FCDF0:
- ldr r0, [r0, #16]
- mov r0, r0, asr #7
- bx lr
-_037FCDFC: .word SNDi_DecibelSquareTable
-
- arm_func_start SND_StartExChannelNoise
-SND_StartExChannelNoise: ; 0x037FCE00
- stmfd sp!, {lr}
- sub sp, sp, #4
- ldrb r2, [r0]
- cmp r2, #14
- movcc r0, #0
- bcc _037FCE3C
- cmp r2, #15
- movhi r0, #0
- bhi _037FCE3C
- mov r2, #2
- strb r2, [r0, #1]
- ldr r2, _037FCE48 ; =0x00001F46
- strh r2, [r0, #60] ; 0x3c
- bl FUN_037FC69C
- mov r0, #1
-_037FCE3C:
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_037FCE48: .word 0x00001F46
-
- arm_func_start SND_StartExChannelPsg
-SND_StartExChannelPsg: ; 0x037FCE4C
- stmfd sp!, {lr}
- sub sp, sp, #4
- ldrb r3, [r0]
- cmp r3, #8
- movcc r0, #0
- bcc _037FCE90
- cmp r3, #13
- movhi r0, #0
- bhi _037FCE90
- mov r3, #1
- strb r3, [r0, #1]
- str r1, [r0, #68] ; 0x44
- ldr r1, _037FCE9C ; =0x00001F46
- strh r1, [r0, #60] ; 0x3c
- mov r1, r2
- bl FUN_037FC69C
- mov r0, #1
-_037FCE90:
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_037FCE9C: .word 0x00001F46
-
- arm_func_start SND_StartExChannelPcm
-SND_StartExChannelPcm: ; 0x037FCEA0
- stmdb sp!, {r4, lr}
- mov r4, r0
- mov lr, r2
- mov r0, #0
- strb r0, [r4, #1]
- add ip, r4, #56 ; 0x38
- ldmia r1, {r0, r1, r2}
- stmia ip, {r0, r1, r2}
- str lr, [r4, #68] ; 0x44
- mov r0, r4
- mov r1, r3
- bl FUN_037FC69C
- mov r0, #1
- ldmia sp!, {r4, lr}
- bx lr
-
- arm_func_start SND_ExChannelMain
-SND_ExChannelMain: ; 0x037FCEDC
- stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
- sub sp, sp, #28
- mov r6, r0
- mov r4, #0
- mov fp, r4
- mov r7, #1
- str r4, [sp, #8]
- mov r0, #127 ; 0x7f
- str r0, [sp, #20]
- str r4, [sp, #16]
- str r4, [sp, #12]
- str r4, [sp, #4]
- str r4, [sp]
-_037FCF10:
- ldr r8, [sp]
- mov sl, r8
- mov r9, r8
- mov r1, #84 ; 0x54
- ldr r0, _037FD1E4 ; =SNDi_Work
- mla r5, r4, r1, r0
- ldrb r1, [r5, #3]
- mov r0, r1, lsl #31
- movs r0, r0, lsr #31
- beq _037FD1CC
- mov r0, r1, lsl #30
- movs r0, r0, lsr #31
- beq _037FCF74
- bic r0, r1, #248 ; 0xf8
- mov r1, r1, lsl #24
- mov r1, r1, lsr #27
- orr r1, r1, #1
- and r1, r1, #255 ; 0xff
- and r1, r1, #31
- orr r0, r0, r1, lsl #3
- strb r0, [r5, #3]
- ldrb r0, [r5, #3]
- bic r0, r0, #2
- strb r0, [r5, #3]
- b _037FCFC0
-_037FCF74:
- mov r0, r4
- bl SND_IsChannelActive
- cmp r0, #0
- bne _037FCFC0
- ldr r3, [r5, #72] ; 0x48
- cmp r3, #0
- streqb fp, [r5, #34] ; 0x22
- beq _037FCFA8
- mov r0, r5
- mov r1, r7
- ldr r2, [r5, #76] ; 0x4c
- mov lr, pc
- bx r3
-_037FCFA8:
- ldr r0, [sp, #4]
- strh r0, [r5, #36] ; 0x24
- ldrb r0, [r5, #3]
- bic r0, r0, #1
- strb r0, [r5, #3]
- b _037FD1CC
-_037FCFC0:
- ldrb r0, [r5, #9]
- mov r1, r0, lsl #1
- ldr r0, _037FD1E8 ; =SNDi_DecibelSquareTable
- ldrsh r0, [r0, r1]
- add r8, r8, r0
- ldrb r1, [r5, #8]
- ldrb r0, [r5, #5]
- sub r0, r1, r0
- add sl, sl, r0, lsl #6
- mov r0, r5
- mov r1, r6
- bl SND_UpdateExChannelEnvelope
- add r8, r8, r0
- mov r0, r5
- mov r1, r6
- bl FUN_037FC5CC
- add r2, sl, r0
- ldrsh r0, [r5, #12]
- add r1, r8, r0
- ldrsh r0, [r5, #6]
- add r8, r1, r0
- ldrsh r0, [r5, #14]
- add sl, r2, r0
- mov r0, r5
- mov r1, r6
- bl FUN_037FC530
- ldrb r1, [r5, #40] ; 0x28
- cmp r1, #0
- beq _037FD05C
- cmp r1, #1
- beq _037FD048
- cmp r1, #2
- addeq r9, r9, r0
- b _037FD060
-_037FD048:
- mov r1, #32768 ; 0x8000
- rsb r1, r1, #0
- cmp r8, r1
- addgt r8, r8, r0
- b _037FD060
-_037FD05C:
- add sl, sl, r0
-_037FD060:
- ldrsb r0, [r5, #10]
- add r9, r9, r0
- ldrb r0, [r5, #4]
- cmp r0, #127 ; 0x7f
- mulne r0, r9, r0
- addne r0, r0, #64 ; 0x40
- movne r9, r0, asr #7
- ldrsb r0, [r5, #11]
- add r9, r9, r0
- ldrb r0, [r5, #2]
- cmp r0, #3
- bne _037FD0EC
- ldr r0, _037FD1EC ; =0xFFFFFD2D
- cmp r8, r0
- bgt _037FD0EC
- ldrb r0, [r5, #3]
- bic r0, r0, #248 ; 0xf8
- orr r0, r0, #16
- strb r0, [r5, #3]
- ldr r3, [r5, #72] ; 0x48
- cmp r3, #0
- ldreq r0, [sp, #8]
- streqb r0, [r5, #34] ; 0x22
- beq _037FD0D4
- mov r0, r5
- mov r1, r7
- ldr r2, [r5, #76] ; 0x4c
- mov lr, pc
- bx r3
-_037FD0D4:
- ldr r0, [sp, #12]
- strh r0, [r5, #36] ; 0x24
- ldrb r0, [r5, #3]
- bic r0, r0, #1
- strb r0, [r5, #3]
- b _037FD1CC
-_037FD0EC:
- mov r0, r8
- bl SND_CalcChannelVolume
- mov r8, r0
- ldrh r0, [r5, #60] ; 0x3c
- mov r1, sl
- bl SND_CalcTimer
- ldrb r1, [r5, #1]
- cmp r1, #1
- ldreq r1, _037FD1F0 ; =0x0000FFFC
- andeq r0, r0, r1
- moveq r0, r0, lsl #16
- moveq r0, r0, lsr #16
- adds r9, r9, #64 ; 0x40
- ldrmi r9, [sp, #16]
- bmi _037FD130
- cmp r9, #127 ; 0x7f
- ldrgt r9, [sp, #20]
-_037FD130:
- ldrh r1, [r5, #36] ; 0x24
- cmp r8, r1
- beq _037FD164
- strh r8, [r5, #36] ; 0x24
- ldrb r2, [r5, #3]
- bic r1, r2, #248 ; 0xf8
- mov r2, r2, lsl #24
- mov r2, r2, lsr #27
- orr r2, r2, #8
- and r2, r2, #255 ; 0xff
- and r2, r2, #31
- orr r1, r1, r2, lsl #3
- strb r1, [r5, #3]
-_037FD164:
- ldrh r1, [r5, #38] ; 0x26
- cmp r0, r1
- beq _037FD198
- strh r0, [r5, #38] ; 0x26
- ldrb r0, [r5, #3]
- bic r1, r0, #248 ; 0xf8
- mov r0, r0, lsl #24
- mov r0, r0, lsr #27
- orr r0, r0, #4
- and r0, r0, #255 ; 0xff
- and r0, r0, #31
- orr r0, r1, r0, lsl #3
- strb r0, [r5, #3]
-_037FD198:
- ldrb r0, [r5, #35] ; 0x23
- cmp r9, r0
- beq _037FD1CC
- strb r9, [r5, #35] ; 0x23
- ldrb r0, [r5, #3]
- bic r1, r0, #248 ; 0xf8
- mov r0, r0, lsl #24
- mov r0, r0, lsr #27
- orr r0, r0, #16
- and r0, r0, #255 ; 0xff
- and r0, r0, #31
- orr r0, r1, r0, lsl #3
- strb r0, [r5, #3]
-_037FD1CC:
- add r4, r4, #1
- cmp r4, #16
- blt _037FCF10
- add sp, sp, #28
- ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
- bx lr
-_037FD1E4: .word SNDi_Work
-_037FD1E8: .word SNDi_DecibelSquareTable
-_037FD1EC: .word 0xFFFFFD2D
-_037FD1F0: .word 0x0000FFFC
-
- arm_func_start SND_UpdateExChannel
-SND_UpdateExChannel: ; 0x037FD1F4
- stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
- sub sp, sp, #24
- mov r8, #0
- mov r4, #2
- mov r5, #1
- mov r6, r8
- ldr r7, _037FD3DC ; =SNDi_Work
- mov sl, #84 ; 0x54
-_037FD214:
- mla r9, r8, sl, r7
- ldrb r0, [r9, #3]
- mov r0, r0, lsl #24
- movs r0, r0, lsr #27
- beq _037FD374
- ands r0, r0, #2
- beq _037FD23C
- mov r0, r8
- mov r1, r6
- bl SND_StopChannel
-_037FD23C:
- ldrb r0, [r9, #3]
- mov r0, r0, lsl #24
- mov r1, r0, lsr #27
- ands r0, r1, #1
- beq _037FD318
- ldrb r0, [r9, #1]
- cmp r0, #0
- beq _037FD270
- cmp r0, #1
- beq _037FD2C8
- cmp r0, #2
- beq _037FD2F4
- b _037FD374
-_037FD270:
- ldrb r0, [r9, #57] ; 0x39
- cmp r0, #0
- movne r3, r5
- moveq r3, r4
- ldrh r1, [r9, #36] ; 0x24
- ldrh r0, [r9, #62] ; 0x3e
- str r0, [sp]
- ldr r0, [r9, #64] ; 0x40
- str r0, [sp, #4]
- and r0, r1, #255 ; 0xff
- str r0, [sp, #8]
- mov r0, r1, asr #8
- str r0, [sp, #12]
- ldrh r0, [r9, #38] ; 0x26
- str r0, [sp, #16]
- ldrb r0, [r9, #35] ; 0x23
- str r0, [sp, #20]
- mov r0, r8
- ldr r1, [r9, #68] ; 0x44
- ldrb r2, [r9, #56] ; 0x38
- bl SND_SetupChannelPcm
- b _037FD374
-_037FD2C8:
- ldrh r3, [r9, #36] ; 0x24
- ldrh r0, [r9, #38] ; 0x26
- str r0, [sp]
- ldrb r0, [r9, #35] ; 0x23
- str r0, [sp, #4]
- mov r0, r8
- ldr r1, [r9, #68] ; 0x44
- and r2, r3, #255 ; 0xff
- mov r3, r3, asr #8
- bl SND_SetupChannelPsg
- b _037FD374
-_037FD2F4:
- ldrh r2, [r9, #36] ; 0x24
- ldrb r0, [r9, #35] ; 0x23
- str r0, [sp]
- mov r0, r8
- and r1, r2, #255 ; 0xff
- mov r2, r2, asr #8
- ldrh r3, [r9, #38] ; 0x26
- bl SND_SetupChannelNoise
- b _037FD374
-_037FD318:
- ands r0, r1, #4
- beq _037FD32C
- mov r0, r8
- ldrh r1, [r9, #38] ; 0x26
- bl SND_SetChannelTimer
-_037FD32C:
- ldrb r0, [r9, #3]
- mov r0, r0, lsl #24
- mov r0, r0, lsr #27
- ands r0, r0, #8
- beq _037FD354
- ldrh r2, [r9, #36] ; 0x24
- mov r0, r8
- and r1, r2, #255 ; 0xff
- mov r2, r2, asr #8
- bl SND_SetChannelVolume
-_037FD354:
- ldrb r0, [r9, #3]
- mov r0, r0, lsl #24
- mov r0, r0, lsr #27
- ands r0, r0, #16
- beq _037FD374
- mov r0, r8
- ldrb r1, [r9, #35] ; 0x23
- bl SND_SetChannelPan
-_037FD374:
- add r8, r8, #1
- cmp r8, #16
- blt _037FD214
- mov r5, #0
- ldr r3, _037FD3DC ; =SNDi_Work
- mov r1, #84 ; 0x54
-_037FD38C:
- mla r4, r5, r1, r3
- ldrb r0, [r4, #3]
- mov r0, r0, lsl #24
- movs r0, r0, lsr #27
- beq _037FD3C4
- ands r0, r0, #1
- movne r0, r5, lsl #4
- addne r0, r0, #67108864 ; 0x4000000
- ldrneb r2, [r0, #1027] ; 0x403
- orrne r2, r2, #128 ; 0x80
- strneb r2, [r0, #1027] ; 0x403
- ldrb r0, [r4, #3]
- bic r0, r0, #248 ; 0xf8
- strb r0, [r4, #3]
-_037FD3C4:
- add r5, r5, #1
- cmp r5, #16
- blt _037FD38C
- add sp, sp, #24
- ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
- bx lr
-_037FD3DC: .word SNDi_Work
-
- arm_func_start SND_ExChannelInit
-SND_ExChannelInit: ; 0x037FD3E0
- mov ip, #0
- ldr r2, _037FD434 ; =SNDi_Work
- mov r0, #84 ; 0x54
-_037FD3EC:
- mul r1, ip, r0
- add r3, r2, r1
- strb ip, [r2, r1]
- ldrb r1, [r3, #3]
- bic r1, r1, #248 ; 0xf8
- strb r1, [r3, #3]
- ldrb r1, [r3, #3]
- bic r1, r1, #1
- strb r1, [r3, #3]
- add ip, ip, #1
- cmp ip, #16
- blt _037FD3EC
- mov r1, #0
- ldr r0, _037FD438 ; =_03807F48
- str r1, [r0]
- ldr r0, _037FD43C ; =_03807F44
- str r1, [r0]
- bx lr
-_037FD434: .word SNDi_Work
-_037FD438: .word _03807F48
-_037FD43C: .word _03807F44
diff --git a/arm7/asm/SND_lfo.s b/arm7/asm/SND_lfo.s
deleted file mode 100644
index cca10305..00000000
--- a/arm7/asm/SND_lfo.s
+++ /dev/null
@@ -1,77 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .text
-
- arm_func_start SND_GetLfoValue
-SND_GetLfoValue: ; 0x037FC7F4
- stmdb sp!, {r4, lr}
- mov r4, r0
- ldrb r0, [r4, #2]
- cmp r0, #0
- moveq r0, #0
- beq _037FC83C
- ldrh r1, [r4, #6]
- ldrh r0, [r4, #4]
- cmp r1, r0
- movcc r0, #0
- bcc _037FC83C
- ldrh r0, [r4, #8]
- mov r0, r0, lsr #8
- bl SND_SinIdx
- ldrb r2, [r4, #3]
- ldrb r1, [r4, #2]
- mul r0, r1, r0
- mul r0, r2, r0
-_037FC83C:
- ldmia sp!, {r4, lr}
- bx lr
-
- arm_func_start SND_UpdateLfo
-SND_UpdateLfo: ; 0x037FC844
- ldrh r2, [r0, #6]
- ldrh r1, [r0, #4]
- cmp r2, r1
- addcc r1, r2, #1
- strcch r1, [r0, #6]
- bxcc lr
- ldrh r2, [r0, #8]
- ldrb r1, [r0, #1]
- mov r3, r1, lsl #6
- add r1, r2, r1, lsl #6
- mov r2, r1, lsr #8
- b _037FC878
-_037FC874:
- sub r2, r2, #128 ; 0x80
-_037FC878:
- cmp r2, #128 ; 0x80
- bcs _037FC874
- ldrh r1, [r0, #8]
- add r1, r1, r3
- strh r1, [r0, #8]
- ldrh r1, [r0, #8]
- and r1, r1, #255 ; 0xff
- strh r1, [r0, #8]
- ldrh r1, [r0, #8]
- orr r1, r1, r2, lsl #8
- strh r1, [r0, #8]
- bx lr
-
- arm_func_start SND_StartLfo
-SND_StartLfo: ; 0x037FC8A8
- mov r1, #0
- strh r1, [r0, #8]
- strh r1, [r0, #6]
- bx lr
-
- arm_func_start SND_InitLfoParam
-SND_InitLfoParam: ; 0x037FC8B8
- mov r2, #0
- strb r2, [r0]
- strb r2, [r0, #2]
- mov r1, #1
- strb r1, [r0, #3]
- mov r1, #16
- strb r1, [r0, #1]
- strh r2, [r0, #4]
- bx lr
diff --git a/arm7/asm/SND_lockChannel.s b/arm7/asm/SND_lockChannel.s
deleted file mode 100644
index b525e0d1..00000000
--- a/arm7/asm/SND_lockChannel.s
+++ /dev/null
@@ -1,167 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .section .bss
-
- .global _03807F48
-_03807F48: ;0x03807F48
- .space 0x03807F4C - 0x03807F48
-
- .section .text
-
- arm_func_start SND_GetLockedChannel
-SND_GetLockedChannel: ; 0x037FC964
- ands r0, r0, #1
- ldrne r0, _037FC97C ; =_03807F44
- ldrne r0, [r0]
- ldreq r0, _037FC980 ; =_03807F48
- ldreq r0, [r0]
- bx lr
-_037FC97C: .word _03807F44
-_037FC980: .word _03807F48
-
- arm_func_start SND_UnlockChannel
-SND_UnlockChannel: ; 0x037FC984
- ands r1, r1, #1
- ldreq r1, _037FC9B8 ; =_03807F48
- ldreq r2, [r1]
- mvneq r0, r0
- andeq r0, r2, r0
- streq r0, [r1]
- bxeq lr
- ldr r1, _037FC9BC ; =_03807F44
- ldr r2, [r1]
- mvn r0, r0
- and r0, r2, r0
- str r0, [r1]
- bx lr
-_037FC9B8: .word _03807F48
-_037FC9BC: .word _03807F44
-
- arm_func_start SND_LockChannel
-SND_LockChannel: ; 0x037FC9C0
- stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
- sub sp, sp, #4
- mov sl, r0
- mov r9, r1
- mov r7, sl
- mov r6, #0
- mov fp, r6
- str r6, [sp]
- mov r4, r6
- mov r5, #1
- b _037FCA6C
-_037FC9EC:
- ands r0, r7, #1
- beq _037FCA64
- mov r1, #84 ; 0x54
- ldr r0, _037FCAAC ; =SNDi_Work
- mla r8, r6, r1, r0
- ldr r0, _037FCAB0 ; =_03807F48
- ldr r1, [r0]
- mov r0, r5, lsl r6
- ands r0, r1, r0
- bne _037FCA64
- ldr r3, [r8, #72] ; 0x48
- cmp r3, #0
- beq _037FCA34
- mov r0, r8
- mov r1, fp
- ldr r2, [r8, #76] ; 0x4c
- mov lr, pc
- bx r3
-_037FCA34:
- mov r0, r6
- ldr r1, [sp]
- bl SND_StopChannel
- strb r4, [r8, #34] ; 0x22
- mov r0, r8
- bl SND_FreeExChannel
- ldrb r0, [r8, #3]
- bic r0, r0, #248 ; 0xf8
- strb r0, [r8, #3]
- ldrb r0, [r8, #3]
- bic r0, r0, #1
- strb r0, [r8, #3]
-_037FCA64:
- add r6, r6, #1
- mov r7, r7, lsr #1
-_037FCA6C:
- cmp r6, #16
- bge _037FCA7C
- cmp r7, #0
- bne _037FC9EC
-_037FCA7C:
- ands r0, r9, #1
- ldrne r0, _037FCAB4 ; =_03807F44
- ldrne r1, [r0]
- orrne r1, r1, sl
- strne r1, [r0]
- ldreq r0, _037FCAB0 ; =_03807F48
- ldreq r1, [r0]
- orreq r1, r1, sl
- streq r1, [r0]
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
- bx lr
-_037FCAAC: .word SNDi_Work
-_037FCAB0: .word _03807F48
-_037FCAB4: .word _03807F44
-
- arm_func_start SND_StopUnlockedChannel
-SND_StopUnlockedChannel: ; 0x037FCAB8
- stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
- sub sp, sp, #4
- mov sl, r0
- mov r8, #0
- mov r6, r8
- mov r5, r8
- mov r4, r8
- ldr fp, _037FCB78 ; =SNDi_Work
- mov r7, #1
- b _037FCB5C
-_037FCAE0:
- ands r0, sl, #1
- beq _037FCB54
- mov r0, #84 ; 0x54
- mla r9, r8, r0, fp
- ldr r0, _037FCB7C ; =_03807F48
- ldr r1, [r0]
- mov r0, r7, lsl r8
- ands r0, r1, r0
- bne _037FCB54
- ldr r3, [r9, #72] ; 0x48
- cmp r3, #0
- beq _037FCB24
- mov r0, r9
- mov r1, r6
- ldr r2, [r9, #76] ; 0x4c
- mov lr, pc
- bx r3
-_037FCB24:
- mov r0, r8
- mov r1, r5
- bl SND_StopChannel
- strb r4, [r9, #34] ; 0x22
- mov r0, r9
- bl SND_FreeExChannel
- ldrb r0, [r9, #3]
- bic r0, r0, #248 ; 0xf8
- strb r0, [r9, #3]
- ldrb r0, [r9, #3]
- bic r0, r0, #1
- strb r0, [r9, #3]
-_037FCB54:
- add r8, r8, #1
- mov sl, sl, lsr #1
-_037FCB5C:
- cmp r8, #16
- bge _037FCB6C
- cmp sl, #0
- bne _037FCAE0
-_037FCB6C:
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
- bx lr
-_037FCB78: .word SNDi_Work
-_037FCB7C: .word _03807F48
diff --git a/arm7/asm/SND_main.s b/arm7/asm/SND_main.s
deleted file mode 100644
index 2353d2c2..00000000
--- a/arm7/asm/SND_main.s
+++ /dev/null
@@ -1,197 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .section .bss
-
- .global _03807A30
-_03807A30: ;0x03807A30
- .space 0x03807A34 - 0x03807A30
-
- .global _03807A34
-_03807A34: ;0x03807A34
- .space 0x03807A54 - 0x03807A34
-
- .global _03807A54
-_03807A54: ;0x03807A54
- .space 0x03807A74 - 0x03807A54
-
- .global _03807A74
-_03807A74: ;0x03807A74
- .space 0x03807AA0 - 0x03807A74
-
- .global _03807AA0
-_03807AA0: ;0x03807AA0
- .space 0x03807F44 - 0x03807AA0
-
- .global _03807F44
-_03807F44: ;0x03807F44
- .space 0x03807F48 - 0x03807F44
-
- .section .text
-
- arm_func_start SndThread
-SndThread: ; 0x037FC2B0
- stmdb sp!, {r4, r5, r6, lr}
- bl SND_InitIntervalTimer
- bl SND_ExChannelInit
- bl SND_SeqInit
- bl SND_AlarmInit
- bl SND_Enable
- mov r0, #0
- mov r1, r0
- mov r2, r0
- mov r3, r0
- bl SND_SetOutputSelector
- mov r0, #127 ; 0x7f
- bl SND_SetMasterVolume
- bl SND_StartIntervalTimer
- mov r4, #1
- mov r5, #0
-_037FC2F0:
- mov r6, r5
- bl SND_WaitForIntervalTimer
- cmp r0, #1
- beq _037FC308
- cmp r0, #2
- b _037FC30C
-_037FC308:
- mov r6, r4
-_037FC30C:
- bl SND_UpdateExChannel
- bl SND_CommandProc
- mov r0, r6
- bl SND_SeqMain
- mov r0, r6
- bl SND_ExChannelMain
- bl SND_UpdateSharedWork
- bl SND_CalcRandom
- b _037FC2F0
-_037FC330:
- ldr r0, _037FC344 ; =_03807A54
- mov r1, #1
- mov r2, #0
- ldr ip, _037FC348 ; =OS_SendMessage
- bx ip
-_037FC344: .word _03807A54
-_037FC348: .word OS_SendMessage
-
- arm_func_start SNDi_UnlockMutex
-SNDi_UnlockMutex: ; 0x037FC34C
- bx lr
-
- arm_func_start SNDi_LockMutex
-SNDi_LockMutex: ; 0x037FC350
- bx lr
-
- arm_func_start SND_SendWakeupMessage
-SND_SendWakeupMessage: ; 0x037FC354
- ldr r0, _037FC368 ; =_03807A54
- mov r1, #2
- mov r2, #0
- ldr ip, _037FC36C ; =OS_SendMessage
- bx ip
-_037FC368: .word _03807A54
-_037FC36C: .word OS_SendMessage
-
- arm_func_start SND_WaitForIntervalTimer
-SND_WaitForIntervalTimer: ; 0x037FC370
- stmfd sp!, {lr}
- sub sp, sp, #4
- ldr r0, _037FC398 ; =_03807A54
- add r1, sp, #0
- mov r2, #1
- bl OS_ReceiveMessage
- ldr r0, [sp]
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_037FC398: .word _03807A54
-
- arm_func_start SND_StopIntervalTimer
-SND_StopIntervalTimer: ; 0x037FC39C
- ldr r0, _037FC3A8 ; =_03807A74
- ldr ip, _037FC3AC ; =OS_CancelAlarm
- bx ip
-_037FC3A8: .word _03807A74
-_037FC3AC: .word OS_CancelAlarm
-
- arm_func_start SND_StartIntervalTimer
-SND_StartIntervalTimer: ; 0x037FC3B0
- stmfd sp!, {lr}
- sub sp, sp, #12
- bl OS_GetTick
- mov ip, r0
- ldr r0, _037FC3FC ; =_037FC330
- str r0, [sp, #4]
- mov r0, #0
- str r0, [sp, #8]
- ldr r3, _037FC400 ; =0x00000AA8
- str r0, [sp]
- ldr r0, _037FC404 ; =_03807A74
- mov r2, #65536 ; 0x10000
- adds ip, ip, r2
- adc r2, r1, #0
- mov r1, ip
- bl OS_SetPeriodicAlarm
- add sp, sp, #12
- ldmia sp!, {lr}
- bx lr
-_037FC3FC: .word _037FC330
-_037FC400: .word 0x00000AA8
-_037FC404: .word _03807A74
-
- arm_func_start SND_InitIntervalTimer
-SND_InitIntervalTimer: ; 0x037FC408
- stmfd sp!, {lr}
- sub sp, sp, #4
- ldr r0, _037FC434 ; =_03807A54
- ldr r1, _037FC438 ; =_03807A34
- mov r2, #8
- bl OS_InitMessageQueue
- ldr r0, _037FC43C ; =_03807A74
- bl OS_CreateAlarm
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_037FC434: .word _03807A54
-_037FC438: .word _03807A34
-_037FC43C: .word _03807A74
-
- arm_func_start SND_CreateThread
-SND_CreateThread: ; 0x037FC440
- stmfd sp!, {lr}
- sub sp, sp, #12
- mov r1, #1024 ; 0x400
- str r1, [sp]
- str r0, [sp, #4]
- ldr r0, _037FC47C ; =_03807AA0
- ldr r1, _037FC480 ; =SndThread
- mov r2, #0
- ldr r3, _037FC484 ; =_03807F44
- bl OS_CreateThread
- ldr r0, _037FC47C ; =_03807AA0
- bl OS_WakeupThreadDirect
- add sp, sp, #12
- ldmia sp!, {lr}
- bx lr
-_037FC47C: .word _03807AA0
-_037FC480: .word SndThread
-_037FC484: .word _03807F44
-
- arm_func_start SND_Init
-SND_Init: ; 0x037FC488
- stmdb sp!, {r4, lr}
- mov r4, r0
- ldr r0, _037FC4BC ; =_03807A30
- ldr r1, [r0]
- cmp r1, #0
- bne _037FC4B4
- mov r1, #1
- str r1, [r0]
- bl SND_CommandInit
- mov r0, r4
- bl SND_CreateThread
-_037FC4B4:
- ldmia sp!, {r4, lr}
- bx lr
-_037FC4BC: .word _03807A30
diff --git a/arm7/asm/SND_seq.s b/arm7/asm/SND_seq.s
deleted file mode 100644
index cbf98551..00000000
--- a/arm7/asm/SND_seq.s
+++ /dev/null
@@ -1,549 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .text
-
- arm_func_start SNDi_SetTrackParam
-SNDi_SetTrackParam: ; 0x037FE9F4
- stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
- sub sp, sp, #4
- mov sl, r1
- mov r9, r2
- mov r8, r3
- ldr r7, [sp, #40] ; 0x28
- ldr r2, _037FEA94 ; =_038084AC
- mov r1, #36 ; 0x24
- mla fp, r0, r1, r2
- mov r6, #0
- mov r0, r8, lsl #16
- mov r4, r0, lsr #16
- and r5, r8, #255 ; 0xff
- b _037FEA78
-_037FEA2C:
- ands r0, sl, #1
- beq _037FEA70
- mov r0, fp
- mov r1, r6
- bl FUN_037FE460
- cmp r0, #0
- beq _037FEA70
- cmp r7, #1
- beq _037FEA64
- cmp r7, #2
- beq _037FEA6C
- cmp r7, #4
- streq r8, [r0, r9]
- b _037FEA70
-_037FEA64:
- strb r5, [r0, r9]
- b _037FEA70
-_037FEA6C:
- strh r4, [r0, r9]
-_037FEA70:
- add r6, r6, #1
- mov sl, sl, lsr #1
-_037FEA78:
- cmp r6, #16
- bge _037FEA88
- cmp sl, #0
- bne _037FEA2C
-_037FEA88:
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
- bx lr
-_037FEA94: .word _038084AC
-
- arm_func_start SNDi_SetPlayerParam
-SNDi_SetPlayerParam: ; 0x037FEA98
- stmfd sp!, {lr}
- sub sp, sp, #4
- ldr lr, _037FEAE0 ; =_038084AC
- mov ip, #36 ; 0x24
- mla ip, r0, ip, lr
- cmp r3, #1
- beq _037FEAC8
- cmp r3, #2
- beq _037FEAD0
- cmp r3, #4
- streq r2, [ip, r1]
- b _037FEAD4
-_037FEAC8:
- strb r2, [ip, r1]
- b _037FEAD4
-_037FEAD0:
- strh r2, [ip, r1]
-_037FEAD4:
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_037FEAE0: .word _038084AC
-
- arm_func_start SND_InvalidateBank
-SND_InvalidateBank: ; 0x037FEAE4
- stmdb sp!, {r4, r5, r6, r7, r8, lr}
- mov r7, r0
- mov r6, r1
- mov r5, #0
- ldr r4, _037FEB40 ; =_038084AC
- mov r8, #36 ; 0x24
-_037FEAFC:
- mul r1, r5, r8
- add r0, r4, r1
- ldrb r1, [r4, r1]
- mov r1, r1, lsl #31
- movs r1, r1, lsr #31
- beq _037FEB2C
- ldr r1, [r0, #32]
- cmp r7, r1
- bhi _037FEB2C
- cmp r1, r6
- bhi _037FEB2C
- bl FUN_037FE3AC
-_037FEB2C:
- add r5, r5, #1
- cmp r5, #16
- blt _037FEAFC
- ldmia sp!, {r4, r5, r6, r7, r8, lr}
- bx lr
-_037FEB40: .word _038084AC
-
- arm_func_start SND_InvalidateSeq
-SND_InvalidateSeq: ; 0x037FEB44
- stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
- sub sp, sp, #4
- mov sl, r0
- mov r9, r1
- mov r7, #0
- mov r5, r7
- ldr fp, _037FEBDC ; =_038084AC
- mov r4, #36 ; 0x24
-_037FEB64:
- mul r0, r7, r4
- add r8, fp, r0
- ldrb r0, [fp, r0]
- mov r0, r0, lsl #31
- movs r0, r0, lsr #31
- beq _037FEBC4
- mov r6, r5
- b _037FEBBC
-_037FEB84:
- mov r0, r8
- mov r1, r6
- bl FUN_037FE460
- cmp r0, #0
- beq _037FEBB8
- ldr r0, [r0, #40] ; 0x28
- cmp sl, r0
- bhi _037FEBB8
- cmp r0, r9
- bhi _037FEBB8
- mov r0, r8
- bl FUN_037FE3AC
- b _037FEBC4
-_037FEBB8:
- add r6, r6, #1
-_037FEBBC:
- cmp r6, #16
- blt _037FEB84
-_037FEBC4:
- add r7, r7, #1
- cmp r7, #16
- blt _037FEB64
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
- bx lr
-_037FEBDC: .word _038084AC
-
- arm_func_start SND_SetTrackAllocatableChannel
-SND_SetTrackAllocatableChannel: ; 0x037FEBE0
- stmdb sp!, {r4, r5, r6, r7, lr}
- sub sp, sp, #4
- mov r6, r1
- ldr r3, _037FEC54 ; =_038084AC
- mov r1, #36 ; 0x24
- mla r5, r0, r1, r3
- mov r4, #0
- mov r0, r2, lsl #16
- mov r7, r0, lsr #16
- b _037FEC38
-_037FEC08:
- ands r0, r6, #1
- beq _037FEC30
- mov r0, r5
- mov r1, r4
- bl FUN_037FE460
- cmp r0, #0
- strneh r7, [r0, #30]
- ldrneb r1, [r0]
- orrne r1, r1, #128 ; 0x80
- strneb r1, [r0]
-_037FEC30:
- add r4, r4, #1
- mov r6, r6, lsr #1
-_037FEC38:
- cmp r4, #16
- bge _037FEC48
- cmp r6, #0
- bne _037FEC08
-_037FEC48:
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, lr}
- bx lr
-_037FEC54: .word _038084AC
-
- arm_func_start SND_SetTrackMute
-SND_SetTrackMute: ; 0x037FEC58
- stmdb sp!, {r4, r5, r6, r7, lr}
- sub sp, sp, #4
- mov r7, r1
- mov r6, r2
- ldr r2, _037FECC8 ; =_038084AC
- mov r1, #36 ; 0x24
- mla r5, r0, r1, r2
- mov r4, #0
- b _037FECAC
-_037FEC7C:
- ands r0, r7, #1
- beq _037FECA4
- mov r0, r5
- mov r1, r4
- bl FUN_037FE460
- cmp r0, #0
- beq _037FECA4
- mov r1, r5
- mov r2, r6
- bl FUN_037FD440
-_037FECA4:
- add r4, r4, #1
- mov r7, r7, lsr #1
-_037FECAC:
- cmp r4, #16
- bge _037FECBC
- cmp r7, #0
- bne _037FEC7C
-_037FECBC:
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, lr}
- bx lr
-_037FECC8: .word _038084AC
-
- arm_func_start SND_SkipSeq
-SND_SkipSeq: ; 0x037FECCC
- stmdb sp!, {r4, r5, r6, r7, r8, lr}
- mov r6, r1
- ldr r2, _037FED90 ; =_038084AC
- mov r1, #36 ; 0x24
- mla r5, r0, r1, r2
- mov r8, #0
- mov r4, #127 ; 0x7f
-_037FECE8:
- mov r0, r5
- mov r1, r8
- bl FUN_037FE460
- movs r7, r0
- beq _037FED10
- mov r1, r5
- mov r2, r4
- bl FUN_037FE588
- mov r0, r7
- bl FUN_037FE54C
-_037FED10:
- add r8, r8, #1
- cmp r8, #16
- blt _037FECE8
- bl SND_StopIntervalTimer
- mov r4, #0
- mov r7, r4
- b _037FED50
-_037FED2C:
- mov r0, r5
- mov r1, r7
- bl FUN_037FD548
- cmp r0, #0
- beq _037FED4C
- mov r0, r5
- bl FUN_037FE3AC
- b _037FED58
-_037FED4C:
- add r4, r4, #1
-_037FED50:
- cmp r4, r6
- bcc _037FED2C
-_037FED58:
- bl SND_StartIntervalTimer
- ldr r0, _037FED94 ; =SNDi_SharedWork
- ldr r0, [r0]
- cmp r0, #0
- beq _037FED88
- add r3, r0, #64 ; 0x40
- ldrb r1, [r5, #1]
- mov r0, #36 ; 0x24
- mul r2, r1, r0
- ldr r0, [r3, r2]
- add r0, r0, r4
- str r0, [r3, r2]
-_037FED88:
- ldmia sp!, {r4, r5, r6, r7, r8, lr}
- bx lr
-_037FED90: .word _038084AC
-_037FED94: .word SNDi_SharedWork
-
- arm_func_start SND_PauseSeq
-SND_PauseSeq: ; 0x037FED98
- stmdb sp!, {r4, r5, r6, r7, lr}
- sub sp, sp, #4
- ldr r5, _037FEE18 ; =_038084AC
- mov r2, #36 ; 0x24
- mul r3, r0, r2
- add r4, r5, r3
- ldrb r0, [r5, r3]
- bic r2, r0, #4
- and r0, r1, #255 ; 0xff
- and r0, r0, #1
- orr r0, r2, r0, lsl #2
- strb r0, [r5, r3]
- cmp r1, #0
- beq _037FEE0C
- mov r7, #0
- mov r5, #127 ; 0x7f
-_037FEDD8:
- mov r0, r4
- mov r1, r7
- bl FUN_037FE460
- movs r6, r0
- beq _037FEE00
- mov r1, r4
- mov r2, r5
- bl FUN_037FE588
- mov r0, r6
- bl FUN_037FE54C
-_037FEE00:
- add r7, r7, #1
- cmp r7, #16
- blt _037FEDD8
-_037FEE0C:
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, lr}
- bx lr
-_037FEE18: .word _038084AC
-
- arm_func_start SND_StopSeq
-SND_StopSeq: ; 0x037FEE1C
- stmdb sp!, {r4, lr}
- mov r4, r0
- ldr r2, _037FEE70 ; =_038084AC
- mov r0, #36 ; 0x24
- mul r1, r4, r0
- add r0, r2, r1
- ldrb r1, [r2, r1]
- mov r1, r1, lsl #31
- movs r1, r1, lsr #31
- beq _037FEE68
- bl FUN_037FE3AC
- ldr r0, _037FEE74 ; =SNDi_SharedWork
- ldr r2, [r0]
- cmp r2, #0
- ldrne r1, [r2, #4]
- movne r0, #1
- mvnne r0, r0, lsl r4
- andne r0, r1, r0
- strne r0, [r2, #4]
-_037FEE68:
- ldmia sp!, {r4, lr}
- bx lr
-_037FEE70: .word _038084AC
-_037FEE74: .word SNDi_SharedWork
-
- arm_func_start SND_StartSeq
-SND_StartSeq: ; 0x037FEE78
- stmdb sp!, {r4, lr}
- mov r4, r0
- bl SND_PrepareSeq
- mov r0, r4
- bl SND_StartPreparedSeq
- ldmia sp!, {r4, lr}
- bx lr
-
- arm_func_start SND_StartPreparedSeq
-SND_StartPreparedSeq: ; 0x037FEE94
- ldr r2, _037FEEB0 ; =_038084AC
- mov r1, #36 ; 0x24
- mul r1, r0, r1
- ldrb r0, [r2, r1]
- orr r0, r0, #2
- strb r0, [r2, r1]
- bx lr
-_037FEEB0: .word _038084AC
-
- arm_func_start SND_PrepareSeq
-SND_PrepareSeq: ; 0x037FEEB4
- stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
- sub sp, sp, #4
- mov r4, r0
- mov r8, r1
- mov r6, r2
- mov r5, r3
- ldr r1, _037FEFFC ; =_038084AC
- mov r0, #36 ; 0x24
- mul r0, r4, r0
- add r7, r1, r0
- ldrb r0, [r1, r0]
- mov r0, r0, lsl #31
- movs r0, r0, lsr #31
- beq _037FEEF4
- mov r0, r7
- bl FUN_037FE3AC
-_037FEEF4:
- mov r0, r7
- mov r1, r5
- bl FUN_037FE5F8
- bl FUN_037FD4C0
- movs r9, r0
- bmi _037FEFF0
- ldr r0, _037FF000 ; =_038086EC
- add r5, r0, r9, lsl #6
- mov r0, r5
- bl FUN_037FE6BC
- mov r0, r5
- mov r1, r8
- mov r2, r6
- bl FUN_037FE6A8
- strb r9, [r7, #8]
- ldr r0, [r5, #40] ; 0x28
- bl FUN_037FE9B8
- ldr r0, [r5, #40] ; 0x28
- bl FUN_037FE968
- add r2, r5, #40 ; 0x28
- ldr r1, [r5, #40] ; 0x28
- add r1, r1, #1
- str r1, [r5, #40] ; 0x28
- cmp r0, #254 ; 0xfe
- ldrne r0, [r2]
- subne r0, r0, #1
- strne r0, [r2]
- bne _037FEFB8
- mov r0, r5
- bl FUN_037FE918
- mov r0, r0, lsl #15
- mov r5, r0, lsr #16
- mov r6, #1
- ldr r8, _037FF000 ; =_038086EC
- b _037FEFB0
-_037FEF80:
- ands r0, r5, #1
- beq _037FEFA4
- bl FUN_037FD4C0
- movs r9, r0
- bmi _037FEFB8
- add r0, r8, r9, lsl #6
- bl FUN_037FE6BC
- add r0, r7, r6
- strb r9, [r0, #8]
-_037FEFA4:
- add r6, r6, #1
- mov r0, r5, lsl #15
- mov r5, r0, lsr #16
-_037FEFB0:
- cmp r5, #0
- bne _037FEF80
-_037FEFB8:
- ldrb r0, [r7]
- bic r0, r0, #1
- orr r0, r0, #1
- strb r0, [r7]
- ldrb r0, [r7]
- bic r0, r0, #2
- strb r0, [r7]
- ldr r0, _037FF004 ; =SNDi_SharedWork
- ldr r2, [r0]
- cmp r2, #0
- ldrne r1, [r2, #4]
- movne r0, #1
- orrne r0, r1, r0, lsl r4
- strne r0, [r2, #4]
-_037FEFF0:
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, r8, r9, lr}
- bx lr
-_037FEFFC: .word _038084AC
-_037FF000: .word _038086EC
-_037FF004: .word SNDi_SharedWork
-
- arm_func_start SND_SeqMain
-SND_SeqMain: ; 0x037FF008
- stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
- mov r8, r0
- mov r5, #0
- mov r6, r5
- mov sl, #1
- ldr r4, _037FF0A0 ; =_038084AC
- mov r9, #36 ; 0x24
-_037FF024:
- mul r0, r6, r9
- add r7, r4, r0
- ldrb r1, [r4, r0]
- mov r0, r1, lsl #31
- movs r0, r0, lsr #31
- beq _037FF07C
- mov r0, r1, lsl #30
- movs r0, r0, lsr #31
- beq _037FF06C
- cmp r8, #0
- beq _037FF064
- mov r0, r1, lsl #29
- movs r0, r0, lsr #31
- bne _037FF064
- mov r0, r7
- bl FUN_037FE48C
-_037FF064:
- mov r0, r7
- bl FUN_037FE1A0
-_037FF06C:
- ldrb r0, [r7]
- mov r0, r0, lsl #31
- movs r0, r0, lsr #31
- orrne r5, r5, sl, lsl r6
-_037FF07C:
- add r6, r6, #1
- cmp r6, #16
- blt _037FF024
- ldr r0, _037FF0A4 ; =SNDi_SharedWork
- ldr r0, [r0]
- cmp r0, #0
- strne r5, [r0, #4]
- ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
- bx lr
-_037FF0A0: .word _038084AC
-_037FF0A4: .word SNDi_SharedWork
-
- arm_func_start SND_SeqInit
-SND_SeqInit: ; 0x037FF0A8
- stmfd sp!, {lr}
- sub sp, sp, #4
- mov lr, #0
- ldr r3, _037FF10C ; =_038084AC
- mov r0, #36 ; 0x24
-_037FF0BC:
- mul r2, lr, r0
- add ip, r3, r2
- ldrb r1, [r3, r2]
- bic r1, r1, #1
- strb r1, [r3, r2]
- strb lr, [ip, #1]
- add lr, lr, #1
- cmp lr, #16
- blt _037FF0BC
- mov r2, #0
- ldr r1, _037FF110 ; =_038086EC
-_037FF0E8:
- ldrb r0, [r1, r2, lsl #6]
- bic r0, r0, #1
- strb r0, [r1, r2, lsl #6]
- add r2, r2, #1
- cmp r2, #32
- blt _037FF0E8
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_037FF10C: .word _038084AC
-_037FF110: .word _038086EC
diff --git a/arm7/asm/SND_unk_037FD440.s b/arm7/asm/SND_unk_037FD440.s
deleted file mode 100644
index 14e4bda9..00000000
--- a/arm7/asm/SND_unk_037FD440.s
+++ /dev/null
@@ -1,1621 +0,0 @@
-#todo identify and split
- .include "asm/macros.inc"
- .include "global.inc"
-
- .section .bss
-
- .global _03807F4C
-_03807F4C: ;0x03807F4C
- .space 0x03807F50 - 0x03807F4C
-
- .global _03807F50
-_03807F50: ;0x03807F50
- .space 0x03807F58 - 0x03807F50
-
- .global _03807F58
-_03807F58: ;0x03807F58
- .space 0x03807F68 - 0x03807F58
-
- .global SNDi_SharedWork
-SNDi_SharedWork: ;0x03807F68
- .space 0x03807F6C - 0x03807F68
-
- .section .text
-
- arm_func_start FUN_037FD440
-FUN_037FD440: ; 0x037FD440
- stmdb sp!, {r4, lr}
- mov r4, r0
- cmp r2, #3
- addls pc, pc, r2, lsl #2
- b _037FD4B8
- b _037FD464
- b _037FD474
- b _037FD484
- b _037FD49C
-_037FD464:
- ldrb r0, [r4]
- bic r0, r0, #4
- strb r0, [r4]
- b _037FD4B8
-_037FD474:
- ldrb r0, [r4]
- orr r0, r0, #4
- strb r0, [r4]
- b _037FD4B8
-_037FD484:
- ldrb r2, [r4]
- orr r2, r2, #4
- strb r2, [r4]
- mvn r2, #0
- bl FUN_037FE588
- b _037FD4B8
-_037FD49C:
- ldrb r2, [r4]
- orr r2, r2, #4
- strb r2, [r4]
- mov r2, #127 ; 0x7f
- bl FUN_037FE588
- mov r0, r4
- bl FUN_037FE54C
-_037FD4B8:
- ldmia sp!, {r4, lr}
- bx lr
-
- arm_func_start FUN_037FD4C0
-FUN_037FD4C0: ; 0x037FD4C0
- mov r0, #0
- ldr r3, _037FD500 ; =_038086EC
- b _037FD4F0
-_037FD4CC:
- add ip, r3, r0, lsl #6
- ldrb r1, [r3, r0, lsl #6]
- mov r2, r1, lsl #31
- movs r2, r2, lsr #31
- biceq r1, r1, #1
- orreq r1, r1, #1
- streqb r1, [ip]
- bxeq lr
- add r0, r0, #1
-_037FD4F0:
- cmp r0, #32
- blt _037FD4CC
- mvn r0, #0
- bx lr
-_037FD500: .word _038086EC
-
- arm_func_start FUN_037FD504
-FUN_037FD504: ; 0x037FD504
- ldr r2, _037FD544 ; =SNDi_SharedWork
- ldr r2, [r2]
- cmp r2, #0
- moveq r0, #0
- bxeq lr
- cmp r1, #16
- addge r2, r2, #608 ; 0x260
- subge r0, r1, #16
- addge r0, r2, r0, lsl #1
- bxge lr
- add r3, r2, #32
- ldrb r2, [r0, #1]
- mov r0, #36 ; 0x24
- mla r0, r2, r0, r3
- add r0, r0, r1, lsl #1
- bx lr
-_037FD544: .word SNDi_SharedWork
-
- arm_func_start FUN_037FD548
-FUN_037FD548: ; 0x037FD548
- stmdb sp!, {r4, r5, r6, r7, r8, lr}
- mov r8, r0
- mov r7, r1
- mov r6, #0
- mov r5, r6
- mov r4, #1
-_037FD560:
- mov r0, r8
- mov r1, r5
- bl FUN_037FE460
- cmp r0, #0
- beq _037FD5A8
- ldr r1, [r0, #40] ; 0x28
- cmp r1, #0
- beq _037FD5A8
- mov r1, r8
- mov r2, r5
- mov r3, r7
- bl FUN_037FD5C8
- cmp r0, #0
- moveq r6, r4
- beq _037FD5A8
- mov r0, r8
- mov r1, r5
- bl FUN_037FE3EC
-_037FD5A8:
- add r5, r5, #1
- cmp r5, #16
- blt _037FD560
- cmp r6, #0
- moveq r0, #1
- movne r0, #0
- ldmia sp!, {r4, r5, r6, r7, r8, lr}
- bx lr
-
- arm_func_start FUN_037FD5C8
-FUN_037FD5C8: ; 0x037FD5C8
- stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
- sub sp, sp, #52 ; 0x34
- mov r9, r0
- mov r8, r1
- str r3, [sp, #4]
- ldr r2, [r9, #60] ; 0x3c
- b _037FD61C
-_037FD5E4:
- ldr r0, [r2, #52] ; 0x34
- cmp r0, #0
- subgt r0, r0, #1
- strgt r0, [r2, #52] ; 0x34
- ldrb r0, [r2, #3]
- mov r0, r0, lsl #29
- movs r0, r0, lsr #31
- bne _037FD618
- ldr r1, [r2, #20]
- ldr r0, [r2, #24]
- cmp r1, r0
- addlt r0, r1, #1
- strlt r0, [r2, #20]
-_037FD618:
- ldr r2, [r2, #80] ; 0x50
-_037FD61C:
- cmp r2, #0
- bne _037FD5E4
- ldrb r1, [r9]
- mov r0, r1, lsl #27
- movs r0, r0, lsr #31
- beq _037FD64C
- ldr r0, [r9, #60] ; 0x3c
- cmp r0, #0
- movne r0, #0
- bne _037FDF84
- bic r0, r1, #16
- strb r0, [r9]
-_037FD64C:
- ldr r0, [r9, #32]
- cmp r0, #0
- ble _037FD670
- sub r0, r0, #1
- str r0, [r9, #32]
- ldr r0, [r9, #32]
- cmp r0, #0
- movgt r0, #0
- bgt _037FDF84
-_037FD670:
- ldr r0, [r9, #40] ; 0x28
- bl FUN_037FE9B8
- add r0, r9, #40 ; 0x28
- str r0, [sp, #28]
- mov r0, #2
- str r0, [sp, #32]
- mov r0, #127 ; 0x7f
- str r0, [sp, #36] ; 0x24
- mov fp, #0
- mvn r0, #0
- str r0, [sp, #40] ; 0x28
- mov sl, #1
- mov r0, #3
- str r0, [sp, #20]
- mov r0, #4
- str r0, [sp, #24]
- b _037FDF64
-_037FD6B4:
- mov r4, fp
- mov r6, sl
- ldr r0, [r9, #40] ; 0x28
- bl FUN_037FE968
- mov r7, r0
- ldr r0, [r9, #40] ; 0x28
- add r0, r0, #1
- str r0, [r9, #40] ; 0x28
- cmp r7, #162 ; 0xa2
- bne _037FD700
- ldr r0, [r9, #40] ; 0x28
- bl FUN_037FE968
- mov r7, r0
- ldr r0, [r9, #40] ; 0x28
- add r0, r0, #1
- str r0, [r9, #40] ; 0x28
- ldrb r0, [r9]
- mov r0, r0, lsl #25
- mov r6, r0, lsr #31
-_037FD700:
- cmp r7, #160 ; 0xa0
- bne _037FD72C
- ldr r0, [r9, #40] ; 0x28
- bl FUN_037FE968
- mov r7, r0
- ldr r0, [r9, #40] ; 0x28
- add r0, r0, #1
- str r0, [r9, #40] ; 0x28
- ldr r0, [sp, #20]
- str r0, [sp, #8]
- mov r4, sl
-_037FD72C:
- cmp r7, #161 ; 0xa1
- bne _037FD758
- ldr r0, [r9, #40] ; 0x28
- bl FUN_037FE968
- mov r7, r0
- ldr r0, [r9, #40] ; 0x28
- add r0, r0, #1
- str r0, [r9, #40] ; 0x28
- ldr r0, [sp, #24]
- str r0, [sp, #8]
- mov r4, sl
-_037FD758:
- ands r0, r7, #128 ; 0x80
- bne _037FD82C
- ldr r0, [r9, #40] ; 0x28
- bl FUN_037FE968
- str r0, [sp, #12]
- ldr r0, [sp, #28]
- ldr r0, [r0]
- add r1, r0, #1
- ldr r0, [sp, #28]
- str r1, [r0]
- cmp r4, #0
- ldrne r2, [sp, #8]
- ldreq r2, [sp, #32]
- mov r0, r9
- mov r1, r8
- bl FUN_037FE7B0
- mov r5, r0
- ldrsb r0, [r9, #19]
- add r4, r7, r0
- cmp r6, #0
- beq _037FDF64
- cmp r4, #0
- movlt r4, fp
- blt _037FD7C0
- cmp r4, #127 ; 0x7f
- ldrgt r4, [sp, #36] ; 0x24
-_037FD7C0:
- ldrb r0, [r9]
- mov r0, r0, lsl #29
- movs r0, r0, lsr #31
- bne _037FD800
- ldr r0, [sp, #4]
- cmp r0, #0
- beq _037FD800
- cmp r5, #0
- movgt r0, r5
- ldrle r0, [sp, #40] ; 0x28
- str r0, [sp]
- mov r0, r9
- mov r1, r8
- mov r2, r4
- ldr r3, [sp, #12]
- bl FUN_037FDF94
-_037FD800:
- strb r4, [r9, #20]
- ldrb r0, [r9]
- mov r0, r0, lsl #30
- movs r0, r0, lsr #31
- beq _037FDF64
- str r5, [r9, #32]
- cmp r5, #0
- ldreqb r0, [r9]
- orreq r0, r0, #16
- streqb r0, [r9]
- b _037FDF64
-_037FD82C:
- and r0, r7, #240 ; 0xf0
- cmp r0, #192 ; 0xc0
- bgt _037FD868
- cmp r0, #192 ; 0xc0
- bge _037FD9B8
- cmp r0, #144 ; 0x90
- bgt _037FD85C
- cmp r0, #144 ; 0x90
- bge _037FD8D8
- cmp r0, #128 ; 0x80
- beq _037FD890
- b _037FDF64
-_037FD85C:
- cmp r0, #176 ; 0xb0
- beq _037FDC68
- b _037FDF64
-_037FD868:
- cmp r0, #224 ; 0xe0
- bgt _037FD884
- cmp r0, #224 ; 0xe0
- bge _037FDC14
- cmp r0, #208 ; 0xd0
- beq _037FD9B8
- b _037FDF64
-_037FD884:
- cmp r0, #240 ; 0xf0
- beq _037FDEC0
- b _037FDF64
-_037FD890:
- cmp r4, #0
- ldrne r2, [sp, #8]
- ldreq r2, [sp, #32]
- mov r0, r9
- mov r1, r8
- bl FUN_037FE7B0
- cmp r6, #0
- beq _037FDF64
- cmp r7, #128 ; 0x80
- beq _037FD8C4
- cmp r7, #129 ; 0x81
- beq _037FD8CC
- b _037FDF64
-_037FD8C4:
- str r0, [r9, #32]
- b _037FDF64
-_037FD8CC:
- cmp r0, #65536 ; 0x10000
- strlth r0, [r9, #2]
- b _037FDF64
-_037FD8D8:
- cmp r7, #147 ; 0x93
- beq _037FD8F4
- cmp r7, #148 ; 0x94
- beq _037FD958
- cmp r7, #149 ; 0x95
- beq _037FD974
- b _037FDF64
-_037FD8F4:
- ldr r0, [r9, #40] ; 0x28
- bl FUN_037FE968
- mov r4, r0
- ldr r0, [r9, #40] ; 0x28
- add r0, r0, #1
- str r0, [r9, #40] ; 0x28
- mov r0, r9
- bl FUN_037FE8B8
- mov r5, r0
- cmp r6, #0
- beq _037FDF64
- mov r0, r8
- mov r1, r4
- bl FUN_037FE460
- movs r4, r0
- beq _037FDF64
- cmp r4, r9
- beq _037FDF64
- mov r1, r8
- bl FUN_037FE440
- mov r0, r4
- ldr r1, [r9, #36] ; 0x24
- mov r2, r5
- bl FUN_037FE6A8
- b _037FDF64
-_037FD958:
- mov r0, r9
- bl FUN_037FE8B8
- cmp r6, #0
- ldrne r1, [r9, #36] ; 0x24
- addne r0, r1, r0
- strne r0, [r9, #40] ; 0x28
- b _037FDF64
-_037FD974:
- mov r0, r9
- bl FUN_037FE8B8
- cmp r6, #0
- beq _037FDF64
- ldrb r1, [r9, #59] ; 0x3b
- cmp r1, #3
- bcs _037FDF64
- ldr r2, [r9, #40] ; 0x28
- add r1, r9, r1, lsl #2
- str r2, [r1, #44] ; 0x2c
- ldrb r1, [r9, #59] ; 0x3b
- add r1, r1, #1
- strb r1, [r9, #59] ; 0x3b
- ldr r1, [r9, #36] ; 0x24
- add r0, r1, r0
- str r0, [r9, #40] ; 0x28
- b _037FDF64
-_037FD9B8:
- cmp r4, #0
- ldrne r2, [sp, #8]
- moveq r2, fp
- mov r0, r9
- mov r1, r8
- bl FUN_037FE7B0
- strb r0, [sp, #44] ; 0x2c
- cmp r6, #0
- beq _037FDF64
- sub r0, r7, #192 ; 0xc0
- cmp r0, #23
- addls pc, pc, r0, lsl #2
- b _037FDF64
- b _037FDBE4
- b _037FDA4C
- b _037FDA64
- b _037FDBCC
- b _037FDBD8
- b _037FDA70
- b _037FDA7C
- b _037FDA88
- b _037FDB48
- b _037FDB90
- b _037FDAB0
- b _037FDABC
- b _037FDAC8
- b _037FDAD4
- b _037FDBB0
- b _037FDAA4
- b _037FDAE0
- b _037FDAEC
- b _037FDAF8
- b _037FDB04
- b _037FDB10
- b _037FDA58
- b _037FDBF4
- b _037FDB7C
-_037FDA4C:
- ldrb r0, [sp, #44] ; 0x2c
- strb r0, [r9, #4]
- b _037FDF64
-_037FDA58:
- ldrb r0, [sp, #44] ; 0x2c
- strb r0, [r9, #5]
- b _037FDF64
-_037FDA64:
- ldrb r0, [sp, #44] ; 0x2c
- strb r0, [r8, #5]
- b _037FDF64
-_037FDA70:
- ldrb r0, [sp, #44] ; 0x2c
- strb r0, [r9, #7]
- b _037FDF64
-_037FDA7C:
- ldrb r0, [sp, #44] ; 0x2c
- strb r0, [r9, #18]
- b _037FDF64
-_037FDA88:
- ldrb r0, [r9]
- bic r1, r0, #2
- ldrb r0, [sp, #44] ; 0x2c
- and r0, r0, #1
- orr r0, r1, r0, lsl #1
- strb r0, [r9]
- b _037FDF64
-_037FDAA4:
- ldrb r0, [sp, #44] ; 0x2c
- strb r0, [r9, #21]
- b _037FDF64
-_037FDAB0:
- ldrb r0, [sp, #44] ; 0x2c
- strb r0, [r9, #26]
- b _037FDF64
-_037FDABC:
- ldrb r0, [sp, #44] ; 0x2c
- strb r0, [r9, #25]
- b _037FDF64
-_037FDAC8:
- ldrb r0, [sp, #44] ; 0x2c
- strb r0, [r9, #24]
- b _037FDF64
-_037FDAD4:
- ldrb r0, [sp, #44] ; 0x2c
- strb r0, [r9, #27]
- b _037FDF64
-_037FDAE0:
- ldrb r0, [sp, #44] ; 0x2c
- strb r0, [r9, #14]
- b _037FDF64
-_037FDAEC:
- ldrb r0, [sp, #44] ; 0x2c
- strb r0, [r9, #15]
- b _037FDF64
-_037FDAF8:
- ldrb r0, [sp, #44] ; 0x2c
- strb r0, [r9, #16]
- b _037FDF64
-_037FDB04:
- ldrb r0, [sp, #44] ; 0x2c
- strb r0, [r9, #17]
- b _037FDF64
-_037FDB10:
- ldrb r0, [r9, #59] ; 0x3b
- cmp r0, #3
- bcs _037FDF64
- ldr r1, [r9, #40] ; 0x28
- add r0, r9, r0, lsl #2
- str r1, [r0, #44] ; 0x2c
- ldrb r1, [sp, #44] ; 0x2c
- ldrb r0, [r9, #59] ; 0x3b
- add r0, r9, r0
- strb r1, [r0, #56] ; 0x38
- ldrb r0, [r9, #59] ; 0x3b
- add r0, r0, #1
- strb r0, [r9, #59] ; 0x3b
- b _037FDF64
-_037FDB48:
- ldrb r0, [r9]
- bic r1, r0, #8
- ldrb r0, [sp, #44] ; 0x2c
- and r0, r0, #1
- orr r0, r1, r0, lsl #3
- strb r0, [r9]
- mov r0, r9
- mov r1, r8
- ldr r2, [sp, #40] ; 0x28
- bl FUN_037FE588
- mov r0, r9
- bl FUN_037FE54C
- b _037FDF64
-_037FDB7C:
- mov r0, r9
- mov r1, r8
- ldrb r2, [sp, #44] ; 0x2c
- bl FUN_037FD440
- b _037FDF64
-_037FDB90:
- ldrb r1, [sp, #44] ; 0x2c
- ldrsb r0, [r9, #19]
- add r0, r1, r0
- strb r0, [r9, #20]
- ldrb r0, [r9]
- orr r0, r0, #32
- strb r0, [r9]
- b _037FDF64
-_037FDBB0:
- ldrb r0, [r9]
- bic r1, r0, #32
- ldrb r0, [sp, #44] ; 0x2c
- and r0, r0, #1
- orr r0, r1, r0, lsl #5
- strb r0, [r9]
- b _037FDF64
-_037FDBCC:
- ldrsb r0, [sp, #44] ; 0x2c
- strb r0, [r9, #19]
- b _037FDF64
-_037FDBD8:
- ldrsb r0, [sp, #44] ; 0x2c
- strb r0, [r9, #6]
- b _037FDF64
-_037FDBE4:
- ldrb r0, [sp, #44] ; 0x2c
- sub r0, r0, #64 ; 0x40
- strb r0, [r9, #8]
- b _037FDF64
-_037FDBF4:
- ldr r0, _037FDF90 ; =_03807F4C
- ldr r0, [r0]
- cmp r0, #0
- beq _037FDF64
- mov r0, r8
- ldrb r1, [sp, #44] ; 0x2c
- bl FUN_037FD504
- b _037FDF64
-_037FDC14:
- cmp r4, #0
- ldrne r2, [sp, #8]
- moveq r2, sl
- mov r0, r9
- mov r1, r8
- bl FUN_037FE7B0
- mov r0, r0, lsl #16
- mov r0, r0, asr #16
- cmp r6, #0
- beq _037FDF64
- cmp r7, #224 ; 0xe0
- beq _037FDC60
- cmp r7, #225 ; 0xe1
- beq _037FDC58
- cmp r7, #227 ; 0xe3
- streqh r0, [r9, #22]
- b _037FDF64
-_037FDC58:
- strh r0, [r8, #24]
- b _037FDF64
-_037FDC60:
- strh r0, [r9, #28]
- b _037FDF64
-_037FDC68:
- ldr r0, [r9, #40] ; 0x28
- bl FUN_037FE968
- str r0, [sp, #16]
- ldr r0, [r9, #40] ; 0x28
- add r0, r0, #1
- str r0, [r9, #40] ; 0x28
- cmp r4, #0
- ldrne r2, [sp, #8]
- moveq r2, sl
- mov r0, r9
- mov r1, r8
- bl FUN_037FE7B0
- mov r0, r0, lsl #16
- mov r5, r0, asr #16
- mov r0, r8
- ldr r1, [sp, #16]
- bl FUN_037FD504
- mov r4, r0
- cmp r6, #0
- beq _037FDF64
- cmp r4, #0
- beq _037FDF64
- sub r0, r7, #176 ; 0xb0
- cmp r0, #13
- addls pc, pc, r0, lsl #2
- b _037FDF64
- b _037FDD08
- b _037FDD10
- b _037FDD20
- b _037FDD30
- b _037FDD40
- b _037FDD5C
- b _037FDD80
- b _037FDF64
- b _037FDDB8
- b _037FDDE4
- b _037FDE10
- b _037FDE3C
- b _037FDE68
- b _037FDE94
-_037FDD08:
- strh r5, [r4]
- b _037FDF64
-_037FDD10:
- ldrsh r0, [r4]
- add r0, r0, r5
- strh r0, [r4]
- b _037FDF64
-_037FDD20:
- ldrsh r0, [r4]
- sub r0, r0, r5
- strh r0, [r4]
- b _037FDF64
-_037FDD30:
- ldrsh r0, [r4]
- mul r1, r0, r5
- strh r1, [r4]
- b _037FDF64
-_037FDD40:
- cmp r5, #0
- beq _037FDF64
- ldrsh r0, [r4]
- mov r1, r5
- bl _s32_div_f
- strh r0, [r4]
- b _037FDF64
-_037FDD5C:
- cmp r5, #0
- ldrgesh r0, [r4]
- movge r0, r0, lsl r5
- strgeh r0, [r4]
- ldrltsh r1, [r4]
- rsblt r0, r5, #0
- movlt r0, r1, asr r0
- strlth r0, [r4]
- b _037FDF64
-_037FDD80:
- mov r6, fp
- cmp r5, #0
- movlt r6, sl
- rsblt r0, r5, #0
- movlt r0, r0, lsl #16
- movlt r5, r0, asr #16
- bl SND_CalcRandom
- add r1, r5, #1
- mul r1, r0, r1
- mov r0, r1, asr #16
- cmp r6, #0
- rsbne r0, r0, #0
- strh r0, [r4]
- b _037FDF64
-_037FDDB8:
- ldrsh r0, [r4]
- cmp r0, r5
- moveq r2, sl
- movne r2, fp
- ldrb r0, [r9]
- bic r1, r0, #64 ; 0x40
- and r0, r2, #255 ; 0xff
- and r0, r0, #1
- orr r0, r1, r0, lsl #6
- strb r0, [r9]
- b _037FDF64
-_037FDDE4:
- ldrsh r0, [r4]
- cmp r0, r5
- movge r2, sl
- movlt r2, fp
- ldrb r0, [r9]
- bic r1, r0, #64 ; 0x40
- and r0, r2, #255 ; 0xff
- and r0, r0, #1
- orr r0, r1, r0, lsl #6
- strb r0, [r9]
- b _037FDF64
-_037FDE10:
- ldrsh r0, [r4]
- cmp r0, r5
- movgt r2, sl
- movle r2, fp
- ldrb r0, [r9]
- bic r1, r0, #64 ; 0x40
- and r0, r2, #255 ; 0xff
- and r0, r0, #1
- orr r0, r1, r0, lsl #6
- strb r0, [r9]
- b _037FDF64
-_037FDE3C:
- ldrsh r0, [r4]
- cmp r0, r5
- movle r2, sl
- movgt r2, fp
- ldrb r0, [r9]
- bic r1, r0, #64 ; 0x40
- and r0, r2, #255 ; 0xff
- and r0, r0, #1
- orr r0, r1, r0, lsl #6
- strb r0, [r9]
- b _037FDF64
-_037FDE68:
- ldrsh r0, [r4]
- cmp r0, r5
- movlt r2, sl
- movge r2, fp
- ldrb r0, [r9]
- bic r1, r0, #64 ; 0x40
- and r0, r2, #255 ; 0xff
- and r0, r0, #1
- orr r0, r1, r0, lsl #6
- strb r0, [r9]
- b _037FDF64
-_037FDE94:
- ldrsh r0, [r4]
- cmp r0, r5
- movne r2, sl
- moveq r2, fp
- ldrb r0, [r9]
- bic r1, r0, #64 ; 0x40
- and r0, r2, #255 ; 0xff
- and r0, r0, #1
- orr r0, r1, r0, lsl #6
- strb r0, [r9]
- b _037FDF64
-_037FDEC0:
- cmp r6, #0
- beq _037FDF64
- sub r0, r7, #252 ; 0xfc
- cmp r0, #3
- addls pc, pc, r0, lsl #2
- b _037FDF64
- b _037FDF10
- b _037FDEE8
- b _037FDF64
- b _037FDF5C
-_037FDEE8:
- ldrb r0, [r9, #59] ; 0x3b
- cmp r0, #0
- beq _037FDF64
- sub r0, r0, #1
- strb r0, [r9, #59] ; 0x3b
- ldrb r0, [r9, #59] ; 0x3b
- add r0, r9, r0, lsl #2
- ldr r0, [r0, #44] ; 0x2c
- str r0, [r9, #40] ; 0x28
- b _037FDF64
-_037FDF10:
- ldrb r0, [r9, #59] ; 0x3b
- cmp r0, #0
- beq _037FDF64
- sub r1, r0, #1
- add r2, r9, r1
- ldrb r0, [r2, #56] ; 0x38
- cmp r0, #0
- beq _037FDF40
- sub r0, r0, #1
- ands r0, r0, #255 ; 0xff
- streqb r1, [r9, #59] ; 0x3b
- beq _037FDF64
-_037FDF40:
- strb r0, [r2, #56] ; 0x38
- ldrb r0, [r9, #59] ; 0x3b
- sub r0, r0, #1
- add r0, r9, r0, lsl #2
- ldr r0, [r0, #44] ; 0x2c
- str r0, [r9, #40] ; 0x28
- b _037FDF64
-_037FDF5C:
- mvn r0, #0
- b _037FDF84
-_037FDF64:
- ldr r0, [r9, #32]
- cmp r0, #0
- bne _037FDF80
- ldrb r0, [r9]
- mov r0, r0, lsl #27
- movs r0, r0, lsr #31
- beq _037FD6B4
-_037FDF80:
- mov r0, #0
-_037FDF84:
- add sp, sp, #52 ; 0x34
- ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
- bx lr
-_037FDF90: .word _03807F4C
-
- arm_func_start FUN_037FDF94
-FUN_037FDF94: ; 0x037FDF94
- stmdb sp!, {r4, r5, r6, r7, r8, lr}
- sub sp, sp, #24
- mov r8, r0
- mov r7, r1
- mov r6, r2
- mov r5, r3
- mov r4, #0
- ldrb r0, [r8]
- mov r0, r0, lsl #28
- movs r0, r0, lsr #31
- beq _037FDFD0
- ldr r4, [r8, #60] ; 0x3c
- cmp r4, #0
- strneb r6, [r4, #8]
- strneb r5, [r4, #9]
-_037FDFD0:
- cmp r4, #0
- bne _037FE0C4
- ldr r0, [r7, #32]
- ldrh r1, [r8, #2]
- mov r2, r6
- add r3, sp, #8
- bl SND_ReadInstData
- cmp r0, #0
- beq _037FE18C
- ldrb r0, [sp, #8]
- cmp r0, #4
- addls pc, pc, r0, lsl #2
- b _037FE030
- b _037FE030
- b _037FE018
- b _037FE020
- b _037FE028
- b _037FE018
-_037FE018:
- ldr r1, _037FE198 ; =0x0000FFFF
- b _037FE034
-_037FE020:
- mov r1, #16128 ; 0x3f00
- b _037FE034
-_037FE028:
- mov r1, #49152 ; 0xc000
- b _037FE034
-_037FE030:
- b _037FE18C
-_037FE034:
- ldrh r0, [r8, #30]
- and r0, r1, r0
- str r8, [sp]
- ldrb r2, [r7, #4]
- ldrb r1, [r8, #18]
- add r1, r2, r1
- ldrb r2, [r8]
- mov r2, r2, lsl #24
- mov r2, r2, lsr #31
- ldr r3, _037FE19C ; =FUN_037FE344
- bl SND_AllocExChannel
- movs r4, r0
- beq _037FE18C
- ldrb r0, [r8]
- mov r0, r0, lsl #28
- movs r0, r0, lsr #31
- mvnne r3, #0
- ldreq r3, [sp, #48] ; 0x30
- ldr r0, [r7, #32]
- str r0, [sp]
- add r0, sp, #8
- str r0, [sp, #4]
- mov r0, r4
- mov r1, r6
- mov r2, r5
- bl SND_NoteOn
- cmp r0, #0
- bne _037FE0B8
- mov r0, #0
- strb r0, [r4, #34] ; 0x22
- mov r0, r4
- bl SND_FreeExChannel
- b _037FE18C
-_037FE0B8:
- ldr r0, [r8, #60] ; 0x3c
- str r0, [r4, #80] ; 0x50
- str r4, [r8, #60] ; 0x3c
-_037FE0C4:
- ldrb r1, [r8, #14]
- cmp r1, #255 ; 0xff
- beq _037FE0D8
- mov r0, r4
- bl SND_SetExChannelAttack
-_037FE0D8:
- ldrb r1, [r8, #15]
- cmp r1, #255 ; 0xff
- beq _037FE0EC
- mov r0, r4
- bl SND_SetExChannelDecay
-_037FE0EC:
- ldrb r1, [r8, #16]
- cmp r1, #255 ; 0xff
- beq _037FE100
- mov r0, r4
- bl SND_SetExChannelSustain
-_037FE100:
- ldrb r1, [r8, #17]
- cmp r1, #255 ; 0xff
- beq _037FE114
- mov r0, r4
- bl SND_SetExChannelRelease
-_037FE114:
- ldrsh r0, [r8, #22]
- strh r0, [r4, #50] ; 0x32
- ldrb r0, [r8]
- mov r0, r0, lsl #26
- movs r0, r0, lsr #31
- beq _037FE144
- ldrsh r1, [r4, #50] ; 0x32
- ldrb r0, [r8, #20]
- sub r0, r0, r6
- mov r0, r0, lsl #22
- add r0, r1, r0, asr #16
- strh r0, [r4, #50] ; 0x32
-_037FE144:
- ldrb r0, [r8, #21]
- cmp r0, #0
- bne _037FE168
- ldr r0, [sp, #48] ; 0x30
- str r0, [r4, #24]
- ldrb r0, [r4, #3]
- bic r0, r0, #4
- strb r0, [r4, #3]
- b _037FE184
-_037FE168:
- mul r1, r0, r0
- ldrsh r0, [r4, #50] ; 0x32
- cmp r0, #0
- rsblt r0, r0, #0
- mul r0, r1, r0
- mov r0, r0, asr #11
- str r0, [r4, #24]
-_037FE184:
- mov r0, #0
- str r0, [r4, #20]
-_037FE18C:
- add sp, sp, #24
- ldmia sp!, {r4, r5, r6, r7, r8, lr}
- bx lr
-_037FE198: .word 0x0000FFFF
-_037FE19C: .word FUN_037FE344
-
- arm_func_start FUN_037FE1A0
-FUN_037FE1A0: ; 0x037FE1A0
- stmdb sp!, {r4, r5, r6, lr}
- mov r6, r0
- mov r5, #0
- mov r4, #1
-_037FE1B0:
- mov r0, r6
- mov r1, r5
- bl FUN_037FE460
- cmp r0, #0
- beq _037FE1D0
- mov r1, r6
- mov r2, r4
- bl FUN_037FE1E4
-_037FE1D0:
- add r5, r5, #1
- cmp r5, #16
- blt _037FE1B0
- ldmia sp!, {r4, r5, r6, lr}
- bx lr
-
- arm_func_start FUN_037FE1E4
-FUN_037FE1E4: ; 0x037FE1E4
- stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
- sub sp, sp, #4
- mov sl, r0
- mov fp, r2
- ldrb r0, [r1, #5]
- mov r0, r0, lsl #1
- ldr r4, _037FE340 ; =SNDi_DecibelSquareTable
- ldrsh r3, [r4, r0]
- ldrb r0, [sl, #4]
- mov r0, r0, lsl #1
- ldrsh r2, [r4, r0]
- ldrb r0, [sl, #5]
- mov r0, r0, lsl #1
- ldrsh r0, [r4, r0]
- add r0, r2, r0
- add r3, r3, r0
- ldrsh r2, [sl, #10]
- ldrsh r0, [r1, #6]
- add r2, r2, r0
- ldrsb r4, [sl, #6]
- ldrb r0, [sl, #7]
- mov r0, r0, lsl #6
- mul r1, r4, r0
- ldrsh r0, [sl, #12]
- add r0, r0, r1, asr #7
- ldrsb r1, [sl, #8]
- ldrb r4, [sl, #1]
- cmp r4, #127 ; 0x7f
- mulne r4, r1, r4
- addne r1, r4, #64 ; 0x40
- movne r1, r1, asr #7
- ldrsb r4, [sl, #9]
- add r1, r1, r4
- mov r4, #32768 ; 0x8000
- rsb r4, r4, #0
- cmp r3, r4
- movlt r3, r4
- mov r4, #32768 ; 0x8000
- rsb r4, r4, #0
- cmp r2, r4
- movlt r2, r4
- mvn r4, #127 ; 0x7f
- cmp r1, r4
- movlt r1, r4
- blt _037FE2A0
- cmp r1, #127 ; 0x7f
- movgt r1, #127 ; 0x7f
-_037FE2A0:
- ldr r9, [sl, #60] ; 0x3c
- mov r4, #1
- mov r3, r3, lsl #16
- mov r7, r3, asr #16
- mov r0, r0, lsl #16
- mov r6, r0, asr #16
- mov r0, r1, lsl #24
- mov r5, r0, asr #24
- mov r0, r2, lsl #16
- mov r8, r0, asr #16
- b _037FE32C
-_037FE2CC:
- strh r8, [r9, #6]
- ldrb r0, [r9, #2]
- cmp r0, #3
- beq _037FE328
- strh r7, [r9, #12]
- strh r6, [r9, #14]
- strb r5, [r9, #11]
- ldrb r0, [sl, #1]
- strb r0, [r9, #4]
- ldrh r0, [sl, #24]
- strh r0, [r9, #40] ; 0x28
- ldrh r0, [sl, #26]
- strh r0, [r9, #42] ; 0x2a
- ldrh r0, [sl, #28]
- strh r0, [r9, #44] ; 0x2c
- ldr r0, [r9, #52] ; 0x34
- cmp r0, #0
- bne _037FE328
- cmp fp, #0
- beq _037FE328
- strb r4, [r9, #34] ; 0x22
- mov r0, r9
- bl SND_ReleaseExChannel
-_037FE328:
- ldr r9, [r9, #80] ; 0x50
-_037FE32C:
- cmp r9, #0
- bne _037FE2CC
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
- bx lr
-_037FE340: .word SNDi_DecibelSquareTable
-
- arm_func_start FUN_037FE344
-FUN_037FE344: ; 0x037FE344
- stmdb sp!, {r4, r5, lr}
- sub sp, sp, #4
- mov r5, r0
- mov r4, r2
- cmp r1, #1
- bne _037FE368
- mov r1, #0
- strb r1, [r5, #34] ; 0x22
- bl SND_FreeExChannel
-_037FE368:
- ldr r1, [r4, #60] ; 0x3c
- cmp r1, r5
- ldreq r0, [r5, #80] ; 0x50
- streq r0, [r4, #60] ; 0x3c
- beq _037FE3A0
- b _037FE394
-_037FE380:
- cmp r0, r5
- ldreq r0, [r5, #80] ; 0x50
- streq r0, [r1, #80] ; 0x50
- beq _037FE3A0
- mov r1, r0
-_037FE394:
- ldr r0, [r1, #80] ; 0x50
- cmp r0, #0
- bne _037FE380
-_037FE3A0:
- add sp, sp, #4
- ldmia sp!, {r4, r5, lr}
- bx lr
-
- arm_func_start FUN_037FE3AC
-FUN_037FE3AC: ; 0x037FE3AC
- stmdb sp!, {r4, r5, lr}
- sub sp, sp, #4
- mov r5, r0
- mov r4, #0
-_037FE3BC:
- mov r0, r5
- mov r1, r4
- bl FUN_037FE3EC
- add r4, r4, #1
- cmp r4, #16
- blt _037FE3BC
- ldrb r0, [r5]
- bic r0, r0, #1
- strb r0, [r5]
- add sp, sp, #4
- ldmia sp!, {r4, r5, lr}
- bx lr
-
- arm_func_start FUN_037FE3EC
-FUN_037FE3EC: ; 0x037FE3EC
- stmdb sp!, {r4, r5, lr}
- sub sp, sp, #4
- mov r5, r0
- mov r4, r1
- bl FUN_037FE460
- cmp r0, #0
- beq _037FE430
- mov r1, r5
- bl FUN_037FE440
- add r3, r5, #8
- ldr r2, _037FE43C ; =_038086EC
- ldrb r1, [r3, r4]
- ldrb r0, [r2, r1, lsl #6]
- bic r0, r0, #1
- strb r0, [r2, r1, lsl #6]
- mov r0, #255 ; 0xff
- strb r0, [r3, r4]
-_037FE430:
- add sp, sp, #4
- ldmia sp!, {r4, r5, lr}
- bx lr
-_037FE43C: .word _038086EC
-
- arm_func_start FUN_037FE440
-FUN_037FE440: ; 0x037FE440
- stmdb sp!, {r4, lr}
- mov r4, r0
- mvn r2, #0
- bl FUN_037FE588
- mov r0, r4
- bl FUN_037FE54C
- ldmia sp!, {r4, lr}
- bx lr
-
- arm_func_start FUN_037FE460
-FUN_037FE460: ; 0x037FE460
- cmp r1, #15
- movgt r0, #0
- bxgt lr
- add r0, r0, r1
- ldrb r1, [r0, #8]
- cmp r1, #255 ; 0xff
- moveq r0, #0
- ldrne r0, _037FE488 ; =_038086EC
- addne r0, r0, r1, lsl #6
- bx lr
-_037FE488: .word _038086EC
-
- arm_func_start FUN_037FE48C
-FUN_037FE48C: ; 0x037FE48C
- stmdb sp!, {r4, r5, r6, r7, lr}
- sub sp, sp, #4
- mov r6, r0
- mov r5, #0
- add r1, r6, #28
- b _037FE4B4
-_037FE4A4:
- ldrh r0, [r1]
- sub r0, r0, #240 ; 0xf0
- strh r0, [r1]
- add r5, r5, #1
-_037FE4B4:
- ldrh r0, [r6, #28]
- cmp r0, #240 ; 0xf0
- bcs _037FE4A4
- mov r4, #0
- mov r7, #1
- b _037FE4F0
-_037FE4CC:
- mov r0, r6
- mov r1, r7
- bl FUN_037FD548
- cmp r0, #0
- beq _037FE4EC
- mov r0, r6
- bl FUN_037FE3AC
- b _037FE4F8
-_037FE4EC:
- add r4, r4, #1
-_037FE4F0:
- cmp r4, r5
- blt _037FE4CC
-_037FE4F8:
- ldr r0, _037FE548 ; =SNDi_SharedWork
- ldr r0, [r0]
- cmp r0, #0
- beq _037FE524
- add r3, r0, #64 ; 0x40
- ldrb r1, [r6, #1]
- mov r0, #36 ; 0x24
- mul r2, r1, r0
- ldr r0, [r3, r2]
- add r0, r0, r4
- str r0, [r3, r2]
-_037FE524:
- ldrh r2, [r6, #24]
- ldrh r0, [r6, #26]
- mul r1, r2, r0
- ldrh r0, [r6, #28]
- add r0, r0, r1, asr #8
- strh r0, [r6, #28]
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, lr}
- bx lr
-_037FE548: .word SNDi_SharedWork
-
- arm_func_start FUN_037FE54C
-FUN_037FE54C: ; 0x037FE54C
- stmdb sp!, {r4, r5, lr}
- sub sp, sp, #4
- mov r5, r0
- ldr r4, [r5, #60] ; 0x3c
- b _037FE56C
-_037FE560:
- mov r0, r4
- bl SND_FreeExChannel
- ldr r4, [r4, #80] ; 0x50
-_037FE56C:
- cmp r4, #0
- bne _037FE560
- mov r0, #0
- str r0, [r5, #60] ; 0x3c
- add sp, sp, #4
- ldmia sp!, {r4, r5, lr}
- bx lr
-
- arm_func_start FUN_037FE588
-FUN_037FE588: ; 0x037FE588
- stmdb sp!, {r4, r5, r6, r7, lr}
- sub sp, sp, #4
- mov r4, r0
- mov r7, r2
- mov r2, #0
- bl FUN_037FE1E4
- ldr r6, [r4, #60] ; 0x3c
- and r5, r7, #255 ; 0xff
- mov r4, #1
- b _037FE5E4
-_037FE5B0:
- mov r0, r6
- bl SND_IsExChannelActive
- cmp r0, #0
- beq _037FE5E0
- cmp r7, #0
- blt _037FE5D4
- mov r0, r6
- mov r1, r5
- bl SND_SetExChannelRelease
-_037FE5D4:
- strb r4, [r6, #34] ; 0x22
- mov r0, r6
- bl SND_ReleaseExChannel
-_037FE5E0:
- ldr r6, [r6, #80] ; 0x50
-_037FE5E4:
- cmp r6, #0
- bne _037FE5B0
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, lr}
- bx lr
-
- arm_func_start FUN_037FE5F8
-FUN_037FE5F8: ; 0x037FE5F8
- stmdb sp!, {r4, lr}
- ldrb r2, [r0]
- bic r2, r2, #4
- strb r2, [r0]
- str r1, [r0, #32]
- mov r1, #120 ; 0x78
- strh r1, [r0, #24]
- mov r1, #256 ; 0x100
- strh r1, [r0, #26]
- mov r1, #240 ; 0xf0
- strh r1, [r0, #28]
- mov r1, #127 ; 0x7f
- strb r1, [r0, #5]
- mov r3, #0
- strh r3, [r0, #6]
- mov r1, #64 ; 0x40
- strb r1, [r0, #4]
- mov r2, #255 ; 0xff
-_037FE640:
- add r1, r0, r3
- strb r2, [r1, #8]
- add r3, r3, #1
- cmp r3, #16
- blt _037FE640
- ldr r2, _037FE6A4 ; =SNDi_SharedWork
- ldr r3, [r2]
- cmp r3, #0
- beq _037FE69C
- mov r4, #0
- ldrb ip, [r0, #1]
- mov r1, #36 ; 0x24
- mla r3, ip, r1, r3
- str r4, [r3, #64] ; 0x40
- mvn lr, #0
-_037FE67C:
- ldr r3, [r2]
- ldrb ip, [r0, #1]
- mla r3, ip, r1, r3
- add r3, r3, r4, lsl #1
- strh lr, [r3, #32]
- add r4, r4, #1
- cmp r4, #16
- blt _037FE67C
-_037FE69C:
- ldmia sp!, {r4, lr}
- bx lr
-_037FE6A4: .word SNDi_SharedWork
-
- arm_func_start FUN_037FE6A8
-FUN_037FE6A8: ; 0x037FE6A8
- str r1, [r0, #36] ; 0x24
- ldr r1, [r0, #36] ; 0x24
- add r1, r1, r2
- str r1, [r0, #40] ; 0x28
- bx lr
-
- arm_func_start FUN_037FE6BC
-FUN_037FE6BC: ; 0x037FE6BC
- stmdb sp!, {r4, lr}
- mov r4, r0
- mov r0, #0
- str r0, [r4, #36] ; 0x24
- str r0, [r4, #40] ; 0x28
- ldrb r1, [r4]
- orr r1, r1, #2
- strb r1, [r4]
- ldrb r1, [r4]
- bic r1, r1, #4
- strb r1, [r4]
- ldrb r1, [r4]
- bic r1, r1, #8
- strb r1, [r4]
- ldrb r1, [r4]
- bic r1, r1, #16
- strb r1, [r4]
- ldrb r1, [r4]
- bic r1, r1, #32
- strb r1, [r4]
- ldrb r1, [r4]
- orr r1, r1, #64 ; 0x40
- strb r1, [r4]
- ldrb r1, [r4]
- bic r1, r1, #128 ; 0x80
- strb r1, [r4]
- strb r0, [r4, #59] ; 0x3b
- strh r0, [r4, #2]
- mov r1, #64 ; 0x40
- strb r1, [r4, #18]
- mov r2, #127 ; 0x7f
- strb r2, [r4, #4]
- strb r2, [r4, #5]
- strh r0, [r4, #10]
- strb r0, [r4, #8]
- strb r0, [r4, #9]
- strb r0, [r4, #6]
- strh r0, [r4, #12]
- mov r1, #255 ; 0xff
- strb r1, [r4, #14]
- strb r1, [r4, #15]
- strb r1, [r4, #16]
- strb r1, [r4, #17]
- strb r2, [r4, #1]
- mov r1, #2
- strb r1, [r4, #7]
- mov r1, #60 ; 0x3c
- strb r1, [r4, #20]
- strb r0, [r4, #21]
- strh r0, [r4, #22]
- strb r0, [r4, #19]
- ldr r0, _037FE7AC ; =0x0000FFFF
- strh r0, [r4, #30]
- add r0, r4, #24
- bl SND_InitLfoParam
- mov r0, #0
- str r0, [r4, #32]
- str r0, [r4, #60] ; 0x3c
- ldmia sp!, {r4, lr}
- bx lr
-_037FE7AC: .word 0x0000FFFF
-
- arm_func_start FUN_037FE7B0
-FUN_037FE7B0: ; 0x037FE7B0
- stmdb sp!, {r4, r5, r6, lr}
- mov r4, r0
- mov r6, r1
- cmp r2, #4
- addls pc, pc, r2, lsl #2
- b _037FE86C
- b _037FE7DC
- b _037FE7F8
- b _037FE804
- b _037FE83C
- b _037FE810
-_037FE7DC:
- ldr r0, [r4, #40] ; 0x28
- bl FUN_037FE968
- mov r5, r0
- ldr r0, [r4, #40] ; 0x28
- add r0, r0, #1
- str r0, [r4, #40] ; 0x28
- b _037FE86C
-_037FE7F8:
- bl FUN_037FE918
- mov r5, r0
- b _037FE86C
-_037FE804:
- bl FUN_037FE878
- mov r5, r0
- b _037FE86C
-_037FE810:
- ldr r0, [r4, #40] ; 0x28
- bl FUN_037FE968
- mov r1, r0
- ldr r0, [r4, #40] ; 0x28
- add r0, r0, #1
- str r0, [r4, #40] ; 0x28
- mov r0, r6
- bl FUN_037FD504
- cmp r0, #0
- ldrnesh r5, [r0]
- b _037FE86C
-_037FE83C:
- bl FUN_037FE918
- mov r5, r0, lsl #16
- mov r0, r4
- bl FUN_037FE918
- mov r0, r0, lsl #16
- mov r4, r0, asr #16
- bl SND_CalcRandom
- sub r1, r4, r5, asr #16
- add r1, r1, #1
- mul r1, r0, r1
- mov r0, r1, asr #16
- add r5, r0, r5, asr #16
-_037FE86C:
- mov r0, r5
- ldmia sp!, {r4, r5, r6, lr}
- bx lr
-
- arm_func_start FUN_037FE878
-FUN_037FE878: ; 0x037FE878
- stmdb sp!, {r4, r5, r6, lr}
- mov r6, r0
- mov r5, #0
- add r4, r6, #40 ; 0x28
-_037FE888:
- ldr r0, [r6, #40] ; 0x28
- bl FUN_037FE968
- ldr r1, [r4]
- add r1, r1, #1
- str r1, [r4]
- and r1, r0, #127 ; 0x7f
- orr r5, r1, r5, lsl #7
- ands r0, r0, #128 ; 0x80
- bne _037FE888
- mov r0, r5
- ldmia sp!, {r4, r5, r6, lr}
- bx lr
-
- arm_func_start FUN_037FE8B8
-FUN_037FE8B8: ; 0x037FE8B8
- stmdb sp!, {r4, r5, lr}
- sub sp, sp, #4
- mov r4, r0
- ldr r0, [r4, #40] ; 0x28
- bl FUN_037FE968
- mov r5, r0
- ldr r0, [r4, #40] ; 0x28
- add r0, r0, #1
- str r0, [r4, #40] ; 0x28
- ldr r0, [r4, #40] ; 0x28
- bl FUN_037FE968
- ldr r1, [r4, #40] ; 0x28
- add r1, r1, #1
- str r1, [r4, #40] ; 0x28
- orr r5, r5, r0, lsl #8
- ldr r0, [r4, #40] ; 0x28
- bl FUN_037FE968
- ldr r1, [r4, #40] ; 0x28
- add r1, r1, #1
- str r1, [r4, #40] ; 0x28
- orr r0, r5, r0, lsl #16
- add sp, sp, #4
- ldmia sp!, {r4, r5, lr}
- bx lr
-
- arm_func_start FUN_037FE918
-FUN_037FE918: ; 0x037FE918
- stmdb sp!, {r4, r5, lr}
- sub sp, sp, #4
- mov r5, r0
- ldr r0, [r5, #40] ; 0x28
- bl FUN_037FE968
- mov r4, r0
- ldr r0, [r5, #40] ; 0x28
- add r0, r0, #1
- str r0, [r5, #40] ; 0x28
- ldr r0, [r5, #40] ; 0x28
- bl FUN_037FE968
- ldr r1, [r5, #40] ; 0x28
- add r1, r1, #1
- str r1, [r5, #40] ; 0x28
- orr r0, r4, r0, lsl #8
- mov r0, r0, lsl #16
- mov r0, r0, lsr #16
- add sp, sp, #4
- ldmia sp!, {r4, r5, lr}
- bx lr
-
- arm_func_start FUN_037FE968
-FUN_037FE968: ; 0x037FE968
- stmdb sp!, {r4, lr}
- mov r4, r0
- ldr r0, _037FE9B0 ; =_03807F50
- ldr r1, [r0]
- cmp r4, r1
- bcc _037FE98C
- ldr r0, [r0, #4]
- cmp r4, r0
- bcc _037FE994
-_037FE98C:
- mov r0, r4
- bl FUN_037FE9B8
-_037FE994:
- ldr r0, _037FE9B0 ; =_03807F50
- ldr r0, [r0]
- sub r1, r4, r0
- ldr r0, _037FE9B4 ; =_03807F58
- ldrb r0, [r0, r1]
- ldmia sp!, {r4, lr}
- bx lr
-_037FE9B0: .word _03807F50
-_037FE9B4: .word _03807F58
-
- arm_func_start FUN_037FE9B8
-FUN_037FE9B8: ; 0x037FE9B8
- bic r2, r0, #3
- ldr r0, _037FE9F0 ; =_03807F50
- str r2, [r0]
- add r1, r2, #16
- str r1, [r0, #4]
- ldr r1, [r2]
- str r1, [r0, #8]
- ldr r1, [r2, #4]
- str r1, [r0, #12]
- ldr r1, [r2, #8]
- str r1, [r0, #16]
- ldr r1, [r2, #12]
- str r1, [r0, #20]
- bx lr
-_037FE9F0: .word _03807F50
diff --git a/arm7/asm/SND_util.s b/arm7/asm/SND_util.s
deleted file mode 100644
index 4d136781..00000000
--- a/arm7/asm/SND_util.s
+++ /dev/null
@@ -1,190 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .section .data
-
- .global _03807660
-_03807660:
- .word 0x12345678
-
- .section .text
-
- arm_func_start SND_CalcRandom
-SND_CalcRandom: ; 0x037FC058
- ldr r2, _037FC080 ; =_03807660
- ldr r3, [r2]
- ldr r0, _037FC084 ; =0x0019660D
- ldr r1, _037FC088 ; =0x3C6EF35F
- mla r0, r3, r0, r1
- str r0, [r2]
- mov r0, r0, lsr #16
- mov r0, r0, lsl #16
- mov r0, r0, lsr #16
- bx lr
-_037FC080: .word _03807660
-_037FC084: .word 0x0019660D
-_037FC088: .word 0x3C6EF35F
-
- arm_func_start SND_SinIdx
-SND_SinIdx: ; 0x037FC08C
- cmp r0, #32
- ldrlt r1, _037FC0F4 ; =_03807170
- ldrltsb r0, [r1, r0]
- bxlt lr
- cmp r0, #64 ; 0x40
- rsblt r1, r0, #64 ; 0x40
- ldrlt r0, _037FC0F4 ; =_03807170
- ldrltsb r0, [r0, r1]
- bxlt lr
- cmp r0, #96 ; 0x60
- bge _037FC0D4
- sub r1, r0, #64 ; 0x40
- ldr r0, _037FC0F4 ; =_03807170
- ldrsb r0, [r0, r1]
- rsb r0, r0, #0
- mov r0, r0, lsl #24
- mov r0, r0, asr #24
- bx lr
-_037FC0D4:
- sub r0, r0, #96 ; 0x60
- rsb r1, r0, #32
- ldr r0, _037FC0F4 ; =_03807170
- ldrsb r0, [r0, r1]
- rsb r0, r0, #0
- mov r0, r0, lsl #24
- mov r0, r0, asr #24
- bx lr
-_037FC0F4: .word _03807170
-
- arm_func_start SND_CalcChannelVolume
-SND_CalcChannelVolume: ; 0x037FC0F8
- stmdb sp!, {r4, lr}
- mov r4, r0
- ldr r0, _037FC168 ; =0xFFFFFD2D
- cmp r4, r0
- movlt r4, r0
- blt _037FC118
- cmp r4, #0
- movgt r4, #0
-_037FC118:
- ldr r0, _037FC16C ; =0x000002D3
- add r0, r4, r0
- bl FUN_037FC170
- mvn r1, #239 ; 0xef
- cmp r4, r1
- movlt r1, #3
- blt _037FC154
- mvn r1, #119 ; 0x77
- cmp r4, r1
- movlt r1, #2
- blt _037FC154
- mvn r1, #59 ; 0x3b
- cmp r4, r1
- movlt r1, #1
- movge r1, #0
-_037FC154:
- orr r0, r0, r1, lsl #8
- mov r0, r0, lsl #16
- mov r0, r0, lsr #16
- ldmia sp!, {r4, lr}
- bx lr
-_037FC168: .word 0xFFFFFD2D
-_037FC16C: .word 0x000002D3
-
- arm_func_start FUN_037FC170
-FUN_037FC170: ; 0x037FC170
- ldr ip, _037FC178 ; =SVC_GetVolumeTable
- bx ip
-_037FC178: .word SVC_GetVolumeTable
-
- arm_func_start SND_CalcTimer
-SND_CalcTimer: ; 0x037FC17C
- stmdb sp!, {r4, r5, lr}
- sub sp, sp, #4
- mov r5, r0
- mov r4, #0
- rsb r0, r1, #0
- b _037FC19C
-_037FC194:
- sub r4, r4, #1
- add r0, r0, #768 ; 0x300
-_037FC19C:
- cmp r0, #0
- blt _037FC194
- b _037FC1B0
-_037FC1A8:
- add r4, r4, #1
- sub r0, r0, #768 ; 0x300
-_037FC1B0:
- cmp r0, #768 ; 0x300
- bge _037FC1A8
- bl FUN_037FC2A4
- mov r2, #0
- mov r1, #65536 ; 0x10000
- adds lr, r0, r1
- adc ip, r2, #0
- mov r3, r5, asr #31
- umull r1, r0, lr, r5
- mla r0, lr, r3, r0
- mla r0, ip, r5, r0
- sub lr, r4, #16
- cmp lr, #0
- bgt _037FC208
- rsb r2, lr, #0
- mov r3, r0, lsr r2
- mov r5, r1, lsr r2
- rsb r1, r2, #32
- orr r5, r5, r0, lsl r1
- sub r1, r2, #32
- orr r5, r5, r0, lsr r1
- b _037FC264
-_037FC208:
- cmp lr, #32
- bge _037FC25C
- mvn r5, #0
- rsb r4, lr, #32
- mov ip, r5, lsl r4
- rsb r3, r4, #32
- orr ip, ip, r5, lsr r3
- sub r3, r4, #32
- orr ip, ip, r5, lsl r3
- and r3, r0, ip
- and r5, r1, r5, lsl r4
- cmp r3, r2
- cmpeq r5, r2
- ldrne r0, _037FC2A0 ; =0x0000FFFF
- bne _037FC294
- mov r5, r1, lsl lr
- mov r3, r0, lsl lr
- orr r3, r3, r1, lsr r4
- sub r0, lr, #32
- orr r3, r3, r1, lsl r0
- b _037FC264
-_037FC25C:
- ldr r0, _037FC2A0 ; =0x0000FFFF
- b _037FC294
-_037FC264:
- mov r1, #0
- mov r0, #16
- cmp r3, r1
- cmpeq r5, r0
- movcc r5, r0
- bcc _037FC28C
- ldr r0, _037FC2A0 ; =0x0000FFFF
- cmp r3, r1
- cmpeq r5, r0
- movhi r5, r0
-_037FC28C:
- mov r0, r5, lsl #16
- mov r0, r0, lsr #16
-_037FC294:
- add sp, sp, #4
- ldmia sp!, {r4, r5, lr}
- bx lr
-_037FC2A0: .word 0x0000FFFF
-
- arm_func_start FUN_037FC2A4
-FUN_037FC2A4: ; 0x037FC2A4
- ldr ip, _037FC2AC ; =SVC_GetPitchTable
- bx ip
-_037FC2AC: .word SVC_GetPitchTable
diff --git a/arm7/asm/SND_wave.s b/arm7/asm/SND_wave.s
deleted file mode 100644
index e18acc43..00000000
--- a/arm7/asm/SND_wave.s
+++ /dev/null
@@ -1,43 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .text
-
- arm_func_start SND_InvalidateWave
-SND_InvalidateWave: ; 0x037FC8DC
- stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
- sub sp, sp, #4
- mov r7, r0
- mov r6, r1
- mov r5, #0
- mov r9, r5
- ldr r4, _037FC960 ; =SNDi_Work
- mov r8, #84 ; 0x54
-_037FC8FC:
- mla r2, r5, r8, r4
- ldrb r1, [r2, #3]
- mov r0, r1, lsl #31
- movs r0, r0, lsr #31
- beq _037FC944
- ldrb r0, [r2, #1]
- cmp r0, #0
- bne _037FC944
- ldr r0, [r2, #68] ; 0x44
- cmp r7, r0
- bhi _037FC944
- cmp r0, r6
- bhi _037FC944
- bic r0, r1, #2
- strb r0, [r2, #3]
- mov r0, r5
- mov r1, r9
- bl SND_StopChannel
-_037FC944:
- add r0, r5, #1
- and r5, r0, #255 ; 0xff
- cmp r5, #16
- bcc _037FC8FC
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, r8, r9, lr}
- bx lr
-_037FC960: .word SNDi_Work
diff --git a/arm7/asm/SND_work.s b/arm7/asm/SND_work.s
deleted file mode 100644
index fb7f51e9..00000000
--- a/arm7/asm/SND_work.s
+++ /dev/null
@@ -1,84 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .section .bss
-
- .global SNDi_Work
-SNDi_Work: ;0x03807F6C
- .space 0x038084AC - 0x03807F6C
-#todo unsure if these two belong here
- .global _038084AC
-_038084AC: ;0x038084AC
- .space 0x038086EC - 0x038084AC
-
- .global _038086EC
-_038086EC: ;0x038086EC
- .space 0x03808EEC - 0x038086EC
-
- .section .text
-
- arm_func_start SND_UpdateSharedWork
-SND_UpdateSharedWork: ; 0x037FF448
- stmdb sp!, {r4, r5, r6, r7, lr}
- sub sp, sp, #4
- mov r5, #0
- mov r4, r5
- ldr r0, _037FF4E4 ; =SNDi_SharedWork
- ldr r0, [r0]
- cmp r0, #0
- beq _037FF4D8
- mov r7, r5
- mov r6, #1
-_037FF470:
- mov r0, r7
- bl SND_IsChannelActive
- cmp r0, #0
- orrne r0, r5, r6, lsl r7
- movne r0, r0, lsl #16
- movne r5, r0, lsr #16
- add r7, r7, #1
- cmp r7, #16
- blt _037FF470
- mov r0, #0
- bl SND_IsCaptureActive
- cmp r0, #0
- orrne r0, r4, #1
- movne r0, r0, lsl #16
- movne r4, r0, lsr #16
- mov r0, #1
- bl SND_IsCaptureActive
- cmp r0, #0
- orrne r0, r4, #2
- movne r0, r0, lsl #16
- movne r4, r0, lsr #16
- ldr r0, _037FF4E4 ; =SNDi_SharedWork
- ldr r1, [r0]
- strh r5, [r1, #8]
- ldr r0, [r0]
- strh r4, [r0, #10]
-_037FF4D8:
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, lr}
- bx lr
-_037FF4E4: .word SNDi_SharedWork
-
- arm_func_start SND_SetPlayerGlobalVariable
-SND_SetPlayerGlobalVariable: ; 0x037FF4E8
- ldr r2, _037FF500 ; =SNDi_SharedWork
- ldr r2, [r2]
- add r0, r2, r0, lsl #1
- add r0, r0, #512 ; 0x200
- strh r1, [r0, #96] ; 0x60
- bx lr
-_037FF500: .word SNDi_SharedWork
-
- arm_func_start SND_SetPlayerLocalVariable
-SND_SetPlayerLocalVariable: ; 0x037FF504
- ldr r3, _037FF520 ; =SNDi_SharedWork
- ldr ip, [r3]
- mov r3, #36 ; 0x24
- mla r3, r0, r3, ip
- add r0, r3, r1, lsl #1
- strh r2, [r0, #32]
- bx lr
-_037FF520: .word SNDi_SharedWork
diff --git a/arm7/asm/wram2.s b/arm7/asm/wram2.s
index 7191db9d..6dfeea6f 100644
--- a/arm7/asm/wram2.s
+++ b/arm7/asm/wram2.s
@@ -962,8 +962,8 @@ _u32_div_not_0_f: ;@ 0x03806F94
mov r1, r3
bx lr
- .global _03807170
-_03807170:
+ .global sLfoSinTable
+sLfoSinTable:
.byte 0
.byte 6
.byte 12
@@ -1132,15 +1132,15 @@ SNDi_DecibelSquareTable:
.short -1
.short 0
- .global _03807294
-_03807294:
+ .global sSampleDataShiftTable
+sSampleDataShiftTable:
.byte 0
.byte 1
.byte 2
.byte 4
- .global _03807298
-_03807298:
+ .global sChannelAllocationOrder
+sChannelAllocationOrder:
.byte 4
.byte 5
.byte 6
@@ -1158,8 +1158,8 @@ _03807298:
.byte 15
.byte 13
- .global _038072A8
-_038072A8:
+ .global sAttackCoeffTable
+sAttackCoeffTable:
.byte 0
.byte 1
.byte 5
diff --git a/arm7/global.inc b/arm7/global.inc
index f6880895..6403574b 100644
--- a/arm7/global.inc
+++ b/arm7/global.inc
@@ -203,27 +203,26 @@
.extern SND_UpdateExChannel
.extern SND_UpdateLfo
.extern SND_UpdateSharedWork
-.extern FUN_037FC530
-.extern FUN_037FC5CC
-.extern FUN_037FC63C
-.extern FUN_037FC69C
-.extern FUN_037FC6E8
-.extern FUN_037FC794
-.extern FUN_037FD440
-.extern FUN_037FD4C0
-.extern FUN_037FD548
-.extern FUN_037FE1A0
-.extern FUN_037FE3AC
-.extern FUN_037FE460
-.extern FUN_037FE48C
-.extern FUN_037FE54C
-.extern FUN_037FE588
-.extern FUN_037FE5F8
-.extern FUN_037FE6A8
-.extern FUN_037FE6BC
-.extern FUN_037FE918
-.extern FUN_037FE968
-.extern FUN_037FE9B8
+.extern ExChannelLfoUpdate
+.extern ExChannelSweepUpdate
+.extern ExChannelVolumeCmp
+.extern ExChannelStart
+.extern ExChannelSetup
+.extern TrackMute
+.extern AllocateTrack
+.extern PlayerStepTicks
+.extern PlayerUpdateChannelVolume
+.extern PlayerStop
+.extern PlayerGetTrack
+.extern PlayerSeqMain
+.extern TrackFreeChannels
+.extern TrackReleaseChannels
+.extern PlayerSetBank
+.extern TrackSetSeq
+.extern TrackInit
+.extern TrackReadU16
+.extern SeqReadByte
+.extern SeqCacheFetch
.extern SPIi_CheckEntry
.extern SPIi_CheckException
.extern SPIi_GetException
@@ -350,11 +349,11 @@
.extern _ll_udiv
.extern _s32_div_f
.extern _u32_div_f
-.extern _03807170
+.extern sLfoSinTable
.extern SNDi_DecibelSquareTable
-.extern _03807294
-.extern _03807298
-.extern _038072A8
+.extern sSampleDataShiftTable
+.extern sChannelAllocationOrder
+.extern sAttackCoeffTable
.extern _038072BC
.extern _038072C0
.extern _038072C4
@@ -427,8 +426,6 @@
.extern _03807A54
.extern _03807A74
.extern _03807AA0
-.extern _03807F44
-.extern _03807F48
.extern _03807F4C
.extern _03807F50
.extern _03807F58
diff --git a/arm7/lib/include/MI_memory.h b/arm7/lib/include/MI_memory.h
index 1e0de0b9..6fa1d0ec 100644
--- a/arm7/lib/include/MI_memory.h
+++ b/arm7/lib/include/MI_memory.h
@@ -22,4 +22,9 @@ static inline void MI_CpuClear32(void *dest, u32 size)
MI_CpuFill32(dest, 0, size);
}
+static inline void MI_CpuCopy32(void *src, void *dst, u32 size)
+{
+ MIi_CpuCopy32((u32 *)src, (u32 *)dst, size);
+}
+
#endif //POKEDIAMOND_ARM7_MI_MEMORY_H
diff --git a/arm7/lib/include/OS_alarm.h b/arm7/lib/include/OS_alarm.h
index a4566348..ad14eaff 100644
--- a/arm7/lib/include/OS_alarm.h
+++ b/arm7/lib/include/OS_alarm.h
@@ -5,6 +5,7 @@
#include "nitro/OS_alarm_shared.h"
void OS_CreateAlarm(OSAlarm *alarm);
+void OS_CancelAlarm(OSAlarm *alarm);
BOOL OS_IsAlarmAvailable(void);
void OS_SetAlarm(OSAlarm *alarm, OSTick tick, OSAlarmHandler handler, void *arg);
void OS_SetPeriodicAlarm(OSAlarm *alarm, OSTick start, OSTick period, OSAlarmHandler handler, void *arg);
diff --git a/arm7/lib/include/PM.h b/arm7/lib/include/PM.h
new file mode 100644
index 00000000..136976e3
--- /dev/null
+++ b/arm7/lib/include/PM.h
@@ -0,0 +1,9 @@
+#ifndef GUARD_PM_H
+#define GUARD_PM_H
+
+#include "nitro/types.h"
+
+void PMi_SetControl(u8 ctrl);
+void PMi_ResetControl(u8 ctrl);
+
+#endif //GUARD_PM_H
diff --git a/arm7/lib/include/PXI_fifo.h b/arm7/lib/include/PXI_fifo.h
index 6d634f72..27f6b005 100644
--- a/arm7/lib/include/PXI_fifo.h
+++ b/arm7/lib/include/PXI_fifo.h
@@ -3,4 +3,7 @@
#include "nitro/PXI_fifo_shared.h"
+s32 PXI_SendWordByFifo(s32 fifotag, u32 data, BOOL err);
+void PXI_SetFifoRecvCallback(s32 fifotag, PXIFifoCallback callback);
+
#endif //POKEDIAMOND_ARM7_PXI_FIFO_H
diff --git a/arm7/lib/include/SND_alarm.h b/arm7/lib/include/SND_alarm.h
index 195b90bb..51f01bcc 100644
--- a/arm7/lib/include/SND_alarm.h
+++ b/arm7/lib/include/SND_alarm.h
@@ -2,11 +2,11 @@
#define GUARD_SND_ALARM_H
#include "global.h"
-#include "SND_alarm_shared.h"
+#include "nitro/SND_alarm_shared.h"
-void SND_StopAlarm(u32 idx);
-void SND_StartAlarm(u32 idx);
-void SND_SetupAlarm();
-void SND_AlarmInit();
+void SND_AlarmInit(void);
+void SND_SetupAlarm(s32 idx, OSTick tick, OSTick period, u32 id);
+void SND_StartAlarm(s32 idx);
+void SND_StopAlarm(s32 idx);
-#endif //GUARD_SND_ALARM_H \ No newline at end of file
+#endif // GUARD_SND_ALARM_H
diff --git a/arm7/lib/include/SND_bank.h b/arm7/lib/include/SND_bank.h
new file mode 100644
index 00000000..e22410ca
--- /dev/null
+++ b/arm7/lib/include/SND_bank.h
@@ -0,0 +1,17 @@
+#ifndef GUARD_SND_BANK_H
+#define GUARD_SND_BANK_H
+
+#include "nitro/types.h"
+#include "nitro/SND_bank_shared.h"
+
+BOOL SND_ReadInstData(
+ const struct SNDBankData *bankData, s32 program, s32 midiKey, struct SNDInstData *instData);
+const struct SNDWaveData *SND_GetWaveDataAddress(const struct SNDWaveArc *waveArc, s32 wave);
+BOOL SND_NoteOn(struct SNDExChannel *chn,
+ s32 midiKey,
+ s32 velocity,
+ s32 length,
+ const struct SNDBankData *bankData,
+ const struct SNDInstData *instData);
+
+#endif // GUARD_SND_BANK_H
diff --git a/arm7/lib/include/SND_capture.h b/arm7/lib/include/SND_capture.h
new file mode 100644
index 00000000..f71ce18d
--- /dev/null
+++ b/arm7/lib/include/SND_capture.h
@@ -0,0 +1,10 @@
+#ifndef GUARD_SND_CAPTURE_H
+#define GUARD_SND_CAPTURE_H
+
+#include "nitro/types.h"
+
+void SND_SetupCapture(
+ int idx, int format, void *captureData, int size, BOOL loop, int capCtrlSrc, int capCtrlDst);
+BOOL SND_IsCaptureActive(int idx);
+
+#endif // GUARD_SND_CAPTURE_H
diff --git a/arm7/lib/include/SND_channel.h b/arm7/lib/include/SND_channel.h
new file mode 100644
index 00000000..b401029a
--- /dev/null
+++ b/arm7/lib/include/SND_channel.h
@@ -0,0 +1,32 @@
+#ifndef GUARD_SND_CHANNEL_H
+#define GUARD_SND_CHANNEL_H
+
+#include "nitro/types.h"
+
+void SND_SetupChannelPcm(int chnIdx,
+ const void *data,
+ int format,
+ int loop,
+ int loopStart,
+ int loopLen,
+ int volume,
+ int volumeDiv,
+ int timer,
+ int pan);
+
+void SND_SetupChannelPsg(int chnIdx, int waveDuty, int volume, int volumeDiv, int timer, int pan);
+
+void SND_SetupChannelNoise(int chnIdx, int volume, int volumeDiv, int timer, int pan);
+
+void SND_StopChannel(int chnIdx, int hold);
+
+void SND_SetChannelVolume(int chnIdx, int volume, int volumeDiv);
+void SND_SetChannelTimer(int chnIdx, int timer);
+void SND_SetChannelPan(int chnIdx, int pan);
+
+BOOL SND_IsChannelActive(int idx);
+void SND_SetMasterPan(int pan);
+u32 SND_GetChannelControl(int idx);
+void SNDi_SetSurroundDecay(int decay);
+
+#endif // GUARD_SND_CHANNEL_H
diff --git a/arm7/lib/include/SND_command.h b/arm7/lib/include/SND_command.h
new file mode 100644
index 00000000..db42d177
--- /dev/null
+++ b/arm7/lib/include/SND_command.h
@@ -0,0 +1,9 @@
+#ifndef GUARD_SND_COMMAND_H
+#define GUARD_SND_COMMAND_H
+
+#include "nitro/SND_command_shared.h"
+
+void SND_CommandInit(void);
+void SND_CommandProc(void);
+
+#endif // GUARD_SND_COMMAND_H
diff --git a/arm7/lib/include/SND_exChannel.h b/arm7/lib/include/SND_exChannel.h
index 05fbe3d7..6e89cb72 100644
--- a/arm7/lib/include/SND_exChannel.h
+++ b/arm7/lib/include/SND_exChannel.h
@@ -1,8 +1,43 @@
#ifndef GUARD_SND_EXCHANNEL_H
#define GUARD_SND_EXCHANNEL_H
-#include "global.h"
+#include "nitro/types.h"
-bool SND_IsChannelActive(u32 idx);
+#include "nitro/SND_exChannel_shared.h"
+#include "nitro/SND_main_shared.h"
-#endif //GUARD_SND_EXCHANNEL_H \ No newline at end of file
+void SND_ExChannelInit(void);
+void SND_UpdateExChannel(void);
+void SND_ExChannelMain(BOOL step);
+BOOL SND_StartExChannelPcm(
+ struct SNDExChannel *chn, const struct SNDWaveParam *wave, const void *data, s32 length);
+BOOL SND_StartExChannelPsg(struct SNDExChannel *chn, s32 duty, s32 length);
+BOOL SND_StartExChannelNoise(struct SNDExChannel *chn, s32 length);
+s32 SND_UpdateExChannelEnvelope(struct SNDExChannel *chn, BOOL step);
+void SND_SetExChannelAttack(struct SNDExChannel *chn, s32 attack);
+void SND_SetExChannelDecay(struct SNDExChannel *chn, s32 decay);
+void SND_SetExChannelSustain(struct SNDExChannel *chn, s32 sustain);
+void SND_SetExChannelRelease(struct SNDExChannel *chn, s32 release);
+void SND_ReleaseExChannel(struct SNDExChannel *chn);
+BOOL SND_IsExChannelActive(struct SNDExChannel *chn);
+struct SNDExChannel *SND_AllocExChannel(u32 channelMask,
+ int priority,
+ u32 flags,
+ SNDExChannelCallback callback,
+ void *callbackUserData);
+void SND_FreeExChannel(struct SNDExChannel *chn);
+void SND_InvalidateWave(const void *start, const void *end);
+
+void SND_StopUnlockedChannel(u32 channelMask, u32 weak);
+void SND_LockChannel(u32 channelMask, u32 weak);
+void SND_UnlockChannel(u32 channelMask, u32 weak);
+u32 SND_GetLockedChannel(u32 weak);
+
+void SND_InvalidateWave(const void *begin, const void *end);
+
+void SND_InitLfoParam(struct SNDLfoParam *lfoParam);
+void SND_StartLfo(struct SNDLfo *lfo);
+void SND_UpdateLfo(struct SNDLfo *lfo);
+int SND_GetLfoValue(struct SNDLfo *lfo);
+
+#endif // GUARD_SND_EXCHANNEL_H
diff --git a/arm7/lib/include/SND_global.h b/arm7/lib/include/SND_global.h
new file mode 100644
index 00000000..cb91db66
--- /dev/null
+++ b/arm7/lib/include/SND_global.h
@@ -0,0 +1,15 @@
+#ifndef GUARD_SND_GLOBAL_H
+#define GUARD_SND_GLOBAL_H
+
+#include "nitro/types.h"
+
+void SND_Enable(void);
+void SND_Disable(void);
+void SND_Shutdown(void);
+void SND_BeginSleep(void);
+void SND_EndSleep(void);
+void SND_SetMasterVolume(int vol);
+void SND_SetOutputSelector(
+ int leftOutputFrom, int rightOutputFrom, int outputCh1ToMixer, int outputCh3ToMixer);
+
+#endif // GUARD_SND_GLOBAL_H
diff --git a/arm7/lib/include/SND_lfo.h b/arm7/lib/include/SND_lfo.h
new file mode 100644
index 00000000..71e0febf
--- /dev/null
+++ b/arm7/lib/include/SND_lfo.h
@@ -0,0 +1,8 @@
+#ifndef GUARD_SND_LFO_H
+#define GUARD_SND_LFO_H
+
+#include "nitro/types.h"
+
+#include "nitro/SND_exChannel_shared.h"
+
+#endif // GUARD_SND_LFO_H
diff --git a/arm7/lib/include/SND_main.h b/arm7/lib/include/SND_main.h
new file mode 100644
index 00000000..65e3f8d3
--- /dev/null
+++ b/arm7/lib/include/SND_main.h
@@ -0,0 +1,16 @@
+#ifndef GUARD_SND_MAIN_H
+#define GUARD_SND_MAIN_H
+
+#include "nitro/types.h"
+
+void SND_Init(u32 priority);
+void SND_CreateThread(u32 priority);
+void SND_InitIntervalTimer(void);
+void SND_StartIntervalTimer(void);
+void SND_StopIntervalTimer(void);
+u32 SND_WaitForIntervalTimer(void);
+void SND_SendWakeupMessage(void);
+void SNDi_LockMutex(void);
+void SNDi_UnlockMutex(void);
+
+#endif // GUARD_SND_MAIN_H
diff --git a/arm7/lib/include/SND_seq.h b/arm7/lib/include/SND_seq.h
new file mode 100644
index 00000000..4e54c0ff
--- /dev/null
+++ b/arm7/lib/include/SND_seq.h
@@ -0,0 +1,24 @@
+#ifndef GUARD_SND_SEQ_H
+#define GUARD_SND_SEQ_H
+
+#include "nitro/types.h"
+
+#include "nitro/SND_bank_shared.h"
+
+void SND_SeqInit(void);
+void SND_SeqMain(BOOL update);
+
+void SND_StartSeq(int player, const void *seq, u32 offset, struct SNDBankData *bank);
+void SND_StopSeq(int player);
+void SND_PrepareSeq(int player, const void *seq, u32 offset, struct SNDBankData *bank);
+void SND_StartPreparedSeq(int player);
+void SND_PauseSeq(int player, BOOL pause);
+void SND_SkipSeq(int player, u32 tick);
+void SNDi_SetPlayerParam(int player, u32 offset, u32 data, int size);
+void SNDi_SetTrackParam(int player, u32 trackMask, u32 offset, u32 data, int size);
+void SND_SetTrackMute(int player, u32 trackMask, BOOL mute);
+void SND_SetTrackAllocatableChannel(int player, u32 trackMask, u32 channelMask);
+void SND_InvalidateSeq(const void *start, const void *end);
+void SND_InvalidateBank(const void *start, const void *end);
+
+#endif // GUARD_SND_SEQ_H
diff --git a/arm7/lib/include/SND_util.h b/arm7/lib/include/SND_util.h
new file mode 100644
index 00000000..3b20a79f
--- /dev/null
+++ b/arm7/lib/include/SND_util.h
@@ -0,0 +1,16 @@
+#ifndef GUARD_SND_UTIL_H
+#define GUARD_SND_UTIL_H
+
+#include "nitro/types.h"
+
+#define SND_VOL_DB_MIN (-723)
+
+u16 SND_CalcRandom(void);
+s8 SND_SinIdx(int index);
+
+u16 SND_CalcChannelVolume(int value);
+u16 SND_CalcTimer(int timer, int pitch);
+
+extern const s16 SNDi_DecibelSquareTable[128];
+
+#endif // GUARD_SND_UTIL_H
diff --git a/arm7/lib/include/SND_work.h b/arm7/lib/include/SND_work.h
index 9b834c6c..536d4bd0 100644
--- a/arm7/lib/include/SND_work.h
+++ b/arm7/lib/include/SND_work.h
@@ -1,4 +1,13 @@
#ifndef GUARD_SND_WORK_H
#define GUARD_SND_WORK_H
-#endif //GUARD_SND_WORK_H \ No newline at end of file
+#include "nitro/SND_work_shared.h"
+
+extern struct SNDWork SNDi_Work;
+extern struct SNDSharedWork *SNDi_SharedWork;
+
+void SND_SetPlayerLocalVariable(int player, int var, s16 value);
+void SND_SetPlayerGlobalVariable(int var, s16 value);
+void SND_UpdateSharedWork(void);
+
+#endif // GUARD_SND_WORK_H
diff --git a/arm7/lib/include/registers.h b/arm7/lib/include/registers.h
index 1fb1e9ca..f30d237a 100644
--- a/arm7/lib/include/registers.h
+++ b/arm7/lib/include/registers.h
@@ -5,6 +5,29 @@
#define reg_EXTKEYIN (*(REGType16v *)0x4000136)
+#define reg_POWCNT2 (*(REGType16v *)0x4000304)
+
+
+#define reg_SOUNDCNT_VOL (*(REGType8v *)0x4000500)
+#define reg_SOUNDCNT_MIX (*(REGType8v *)0x4000501)
+
+#define reg_SOUNDxCNT_VOL(x) (*(REGType8v *)(0x4000400 + ((int)(x) * 0x10)))
+#define reg_SOUNDxCNT_VOLS(x) (*(REGType16v *)(0x4000400 + ((int)(x) * 0x10)))
+#define reg_SOUNDxCNT_PAN(x) (*(REGType8v *)(0x4000402 + ((int)(x) * 0x10)))
+#define reg_SOUNDxCNT_STAT(x) (*(REGType8v *)(0x4000403 + ((int)(x) * 0x10)))
+#define reg_SOUNDxCNT(x) (*(REGType32v *)(0x4000400 + ((int)x) * 0x10))
+#define reg_SOUNDoffCNT(off) (*(REGType32v *)(0x4000400 + (int)(off)))
+#define reg_SOUNDxSAD(x) (*(REGType32v *)(0x4000404 + ((int)x) * 0x10))
+#define reg_SOUNDoffSAD(off) (*(REGType32v *)(0x4000404 + (int)(off)))
+#define reg_SOUNDxTMR(x) (*(REGType16v *)(0x4000408 + ((int)x) * 0x10))
+#define reg_SOUNDoffTMR(off) (*(REGType16v *)(0x4000408 + (int)(off)))
+#define reg_SOUNDxPNT(x) (*(REGType16v *)(0x400040A + ((int)x) * 0x10))
+#define reg_SOUNDoffPNT(off) (*(REGType16v *)(0x400040A + (int)(off)))
+#define reg_SOUNDxLEN(x) (*(REGType32v *)(0x400040C + ((int)x) * 0x10))
+#define reg_SOUNDoffLEN(off) (*(REGType32v *)(0x400040C + (int)(off)))
+
+#define reg_SNDCAPxCNT(x) (*(REGType8v *)(0x4000508 + ((int)(x))))
+
#define EXTKEYIN_X (1<<0)
#define EXTKEYIN_Y (1<<1)
#define EXTKEYIN_DEBUG (1<<3)
diff --git a/arm7/lib/include/syscall.h b/arm7/lib/include/syscall.h
index 55462cc7..579fd790 100644
--- a/arm7/lib/include/syscall.h
+++ b/arm7/lib/include/syscall.h
@@ -2,5 +2,9 @@
#define POKEDIAMOND_ARM7_SYSCALL_H
void SVC_WaitByLoop(u32 ct);
+u8 SVC_GetVolumeTable(int idx);
+u16 SVC_GetPitchTable(int idx);
+void SVC_SoundBiasSet(int step);
+void SVC_SoundBiasReset(int step);
#endif //POKEDIAMOND_ARM7_SYSCALL_H
diff --git a/arm7/lib/src/OS_reset.c b/arm7/lib/src/OS_reset.c
index e0f380f8..13d59bfa 100644
--- a/arm7/lib/src/OS_reset.c
+++ b/arm7/lib/src/OS_reset.c
@@ -2,6 +2,7 @@
#include "OS_reset.h"
#include "OS_interrupt.h"
#include "OS_terminate_proc.h"
+#include "PXI_fifo.h"
static u16 OSi_IsInitReset = 0;
vu16 OSi_IsResetOccurred = 0;
@@ -10,8 +11,6 @@ extern void MI_StopDma(u32 dma);
extern OSIrqMask OS_SetIrqMask(OSIrqMask mask);
extern OSIrqMask OS_ResetRequestIrqMask(OSIrqMask mask);
extern void SND_Shutdown(void);
-extern void PXI_SetFifoRecvCallback(u32 param1, void* callback);
-extern u32 PXI_SendWordByFifo(u32 param1, u32 data, u32 param2);
extern void FUN_038073EC(void); //OSi_DoResetSystem, in wram
ARM_FUNC void OS_InitReset(void)
diff --git a/arm7/lib/src/SND_alarm.c b/arm7/lib/src/SND_alarm.c
new file mode 100644
index 00000000..9b71d8f3
--- /dev/null
+++ b/arm7/lib/src/SND_alarm.c
@@ -0,0 +1,83 @@
+#include "SND_alarm.h"
+
+#include "OS_alarm.h"
+#include "OS_tick.h"
+#include "PXI_fifo.h"
+#include "SND_work.h"
+
+static void AlarmHandler(void *msg);
+
+void SND_AlarmInit(void)
+{
+ for (s32 i = 0; i < SND_ALARM_COUNT; i++)
+ {
+ SNDi_Work.alarms[i].enable = 0;
+ SNDi_Work.alarms[i].id = 0;
+ }
+}
+
+void SND_SetupAlarm(s32 idx, OSTick tick, OSTick period, u32 id)
+{
+ struct SNDAlarm *alarm = &SNDi_Work.alarms[idx];
+
+ if (alarm->enable)
+ {
+ OS_CancelAlarm(&alarm->alarm);
+ alarm->enable = 0;
+ }
+
+ alarm->tick = tick;
+ alarm->period = period;
+ alarm->id = (u8)id;
+}
+
+void SND_StartAlarm(s32 idx)
+{
+ OSTick tick;
+ OSTick period;
+
+ struct SNDAlarm *alarm = &SNDi_Work.alarms[idx];
+
+ if (alarm->enable != 0)
+ {
+ OS_CancelAlarm(&alarm->alarm);
+ alarm->enable = 0;
+ }
+
+ tick = alarm->tick;
+ period = alarm->period;
+ s32 arg = idx | (alarm->id << 8);
+
+ OS_CreateAlarm(&alarm->alarm);
+
+ if (period == 0)
+ {
+ OS_SetAlarm(&alarm->alarm, tick, AlarmHandler, (void *)arg);
+ }
+ else
+ {
+ OS_SetPeriodicAlarm(&alarm->alarm, tick + OS_GetTick(), period, AlarmHandler, (void *)arg);
+ }
+
+ alarm->enable = 1;
+}
+
+void SND_StopAlarm(s32 idx)
+{
+ struct SNDAlarm *alarm = &SNDi_Work.alarms[idx];
+
+ if (alarm->enable != 0)
+ {
+ OS_CancelAlarm(&alarm->alarm);
+ alarm->id++;
+ alarm->enable = 0;
+ }
+}
+
+static void AlarmHandler(void *msg)
+{
+ while (PXI_SendWordByFifo(7, (u32)msg, 0) < 0)
+ {
+ // nothing
+ }
+}
diff --git a/arm7/lib/src/SND_bank.c b/arm7/lib/src/SND_bank.c
new file mode 100644
index 00000000..3437e021
--- /dev/null
+++ b/arm7/lib/src/SND_bank.c
@@ -0,0 +1,194 @@
+#include "SND_bank.h"
+
+#include "SND_exChannel.h"
+#include "SND_main.h"
+
+#include "mmap.h"
+
+static const struct SNDWaveData *GetWaveData(
+ const struct SNDBankData *bankData, s32 waveArc, s32 wave);
+
+BOOL SND_ReadInstData(
+ const struct SNDBankData *bankData, s32 program, s32 midiKey, struct SNDInstData *instData)
+{
+ s32 i;
+ struct SNDDrumSet *drumSet;
+ struct SNDKeySplit *keySplit;
+ u32 off;
+ u8 minKey, maxKey;
+
+ if (program < 0)
+ return FALSE;
+
+ SNDi_LockMutex();
+
+ if (program >= bankData->instCount)
+ {
+ SNDi_UnlockMutex();
+ return FALSE;
+ }
+
+ off = bankData->instOffsets[program];
+ instData->type = SND_INST_OFFSET_TYPE(off);
+
+ 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, off);
+ break;
+ case SND_INST_DRUM_TABLE:
+ drumSet = SND_INST_OFFSET_DRUMS(bankData, off);
+
+ // seperate variables needed for matching
+ maxKey = drumSet->maxKey;
+ minKey = drumSet->minKey;
+
+ if (midiKey < minKey || midiKey > maxKey)
+ {
+ SNDi_UnlockMutex();
+ return FALSE;
+ }
+
+ *instData = drumSet->instruments[midiKey - drumSet->minKey];
+ break;
+ case SND_INST_KEY_SPLIT:
+ i = 0;
+ keySplit = SND_INST_OFFSET_KEYSPL(bankData, off);
+
+ while (midiKey > keySplit->key[i])
+ {
+ i++;
+ if (i >= SND_INST_MAX_KEYSPLIT)
+ {
+ SNDi_UnlockMutex();
+ return FALSE;
+ }
+ }
+ *instData = keySplit->instruments[i];
+ break;
+ case SND_INST_ILLEGAL:
+ default:
+ SNDi_UnlockMutex();
+ return FALSE;
+ }
+
+ SNDi_UnlockMutex();
+ return TRUE;
+}
+
+const struct SNDWaveData *SND_GetWaveDataAddress(const struct SNDWaveArc *waveArc, s32 wave)
+{
+ SNDi_LockMutex();
+
+ const struct SNDWaveData *retval = (const struct SNDWaveData *)waveArc->waveOffsets[wave];
+ if (retval != NULL)
+ {
+ if ((u32)retval < HW_MAIN_MEM)
+ {
+ retval = (const struct SNDWaveData *)((u32)waveArc + (u32)retval);
+ }
+ }
+ else
+ {
+ retval = NULL;
+ }
+
+ SNDi_UnlockMutex();
+
+ return retval;
+}
+
+BOOL SND_NoteOn(struct SNDExChannel *chn,
+ s32 midiKey,
+ s32 velocity,
+ s32 length,
+ const struct SNDBankData *bankData,
+ const struct SNDInstData *instData)
+{
+ const struct SNDWaveData *waveData;
+ u8 release;
+ BOOL success;
+
+ release = instData->param.envRelease;
+
+ if (release == 0xFF)
+ {
+ length = -1;
+ release = 0;
+ }
+
+ switch (instData->type)
+ {
+ case SND_INST_PCM:
+ case SND_INST_DIRECTPCM:
+ if (instData->type == SND_INST_PCM)
+ {
+ waveData = GetWaveData(bankData, instData->param.wave[1], instData->param.wave[0]);
+ }
+ else
+ {
+ waveData = (const struct SNDWaveData *)((instData->param.wave[1] << 16) |
+ instData->param.wave[0]);
+ }
+
+ if (waveData == NULL)
+ {
+ success = FALSE;
+ }
+ else
+ {
+ success =
+ SND_StartExChannelPcm(chn, &waveData->param, waveData->sampleData, length);
+ }
+ break;
+ case SND_INST_PSG:
+ success = SND_StartExChannelPsg(chn, instData->param.wave[0], length);
+ break;
+ case SND_INST_NOISE:
+ success = SND_StartExChannelNoise(chn, length);
+ break;
+ default:
+ success = FALSE;
+ break;
+ }
+
+ if (success == FALSE)
+ {
+ return FALSE;
+ }
+ else
+ {
+ chn->midiKey = (u8)midiKey;
+ chn->rootMidiKey = instData->param.rootKey;
+ chn->velocity = (u8)velocity;
+ SND_SetExChannelAttack(chn, instData->param.envAttack);
+ SND_SetExChannelDecay(chn, instData->param.envDecay);
+ SND_SetExChannelSustain(chn, instData->param.envSustain);
+ SND_SetExChannelRelease(chn, release);
+ chn->initPan = (s8)(instData->param.pan - 0x40);
+ return TRUE;
+ }
+}
+
+static const struct SNDWaveData *GetWaveData(
+ const struct SNDBankData *bankData, s32 waveArc, s32 wave)
+{
+ const struct SNDWaveArc *arcPtr = bankData->waveArcLinks[waveArc].waveArc;
+
+ if (arcPtr == NULL)
+ {
+ return NULL;
+ }
+ else if (wave < arcPtr->waveCount)
+ {
+ return SND_GetWaveDataAddress(arcPtr, wave);
+ }
+ else
+ {
+ return NULL;
+ }
+}
diff --git a/arm7/lib/src/SND_capture.c b/arm7/lib/src/SND_capture.c
new file mode 100644
index 00000000..57494b72
--- /dev/null
+++ b/arm7/lib/src/SND_capture.c
@@ -0,0 +1,25 @@
+#include "SND_capture.h"
+
+#include "registers.h"
+
+enum SNDLoop
+{
+ SND_CAP_LOOP = 0,
+ SND_CAP_ONESHOT = 1
+};
+
+void SND_SetupCapture(
+ int idx, int format, void *captureData, int size, BOOL loop, int capCtrlSrc, int capCtrlDst)
+{
+ int off = idx * 8;
+
+ reg_SNDCAPxCNT(idx) = (u8)((format << 3) | ((loop ? SND_CAP_LOOP : SND_CAP_ONESHOT) << 2) |
+ (capCtrlSrc << 1) | capCtrlDst);
+ *(vu32 *)(0x4000510 + off) = (u32)captureData;
+ *(vu16 *)(0x4000514 + off) = (u16)size;
+}
+
+BOOL SND_IsCaptureActive(int idx)
+{
+ return (reg_SNDCAPxCNT(idx) & 0x80) != 0;
+}
diff --git a/arm7/lib/src/SND_channel.c b/arm7/lib/src/SND_channel.c
new file mode 100644
index 00000000..be0bba3a
--- /dev/null
+++ b/arm7/lib/src/SND_channel.c
@@ -0,0 +1,192 @@
+#include "SND_channel.h"
+
+#include "SND_work.h"
+#include "registers.h"
+
+static int sMasterPan = -1;
+
+static u8 sOrgVolume[SND_CHANNEL_COUNT];
+static u8 sOrgPan[SND_CHANNEL_COUNT];
+static int sSurroundDecay;
+
+static int CalcSurroundDecay(int vol, int pan);
+
+void SND_SetupChannelPcm(int chnIdx,
+ const void *data,
+ int format,
+ int loop,
+ int loopStart,
+ int loopLength,
+ int volume,
+ int volumeDiv,
+ int timer,
+ int pan)
+{
+ int off = chnIdx * 0x10;
+
+ sOrgPan[chnIdx] = (u8)pan;
+ if (sMasterPan >= 0)
+ pan = sMasterPan;
+
+ sOrgVolume[chnIdx] = (u8)volume;
+ if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5)
+ {
+ volume = CalcSurroundDecay(volume, pan);
+ }
+
+ reg_SOUNDoffCNT(off) =
+ (u32)((format << 29) | (loop << 27) | (pan << 16) | (volumeDiv << 8) | (volume));
+ reg_SOUNDoffTMR(off) = (u16)(0x10000 - timer);
+ reg_SOUNDoffPNT(off) = (u16)loopStart;
+ reg_SOUNDoffLEN(off) = (u32)loopLength;
+ reg_SOUNDoffSAD(off) = (u32)data;
+}
+
+void SND_SetupChannelPsg(int chnIdx, int duty, int volume, int volumeDiv, int timer, int pan)
+{
+ int off = chnIdx * 0x10;
+
+ sOrgPan[chnIdx] = (u8)pan;
+ if (sMasterPan >= 0)
+ pan = sMasterPan;
+
+ sOrgVolume[chnIdx] = (u8)volume;
+ if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5)
+ {
+ volume = CalcSurroundDecay(volume, pan);
+ }
+
+ reg_SOUNDoffCNT(off) =
+ (u32)(0x60000000 | (duty << 24) | (pan << 16) | (volumeDiv << 8) | volume);
+ reg_SOUNDoffTMR(off) = (u16)(0x10000 - timer);
+}
+
+void SND_SetupChannelNoise(int chnIdx, int volume, int volumeDiv, int timer, int pan)
+{
+ int off = chnIdx * 0x10;
+
+ sOrgPan[chnIdx] = (u8)pan;
+ if (sMasterPan >= 0)
+ pan = sMasterPan;
+
+ sOrgVolume[chnIdx] = (u8)volume;
+ if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5)
+ {
+ volume = CalcSurroundDecay(volume, pan);
+ }
+
+ reg_SOUNDoffCNT(off) = (u32)(0x60000000 | (pan << 16) | (volumeDiv << 8) | volume);
+ reg_SOUNDoffTMR(off) = (u16)(0x10000 - timer);
+}
+
+void SND_StopChannel(int idx, int hold)
+{
+ vu32 *reg = &reg_SOUNDxCNT(idx);
+
+ u32 v = *reg;
+
+ // disable channel
+ v &= ~0x80000000;
+
+ // set hold flag
+ if (hold & 1)
+ v |= 0x8000;
+
+ *reg = v;
+}
+
+void SND_SetChannelVolume(int chnIdx, int vol, int volDiv)
+{
+ sOrgVolume[chnIdx] = (u8)vol;
+
+ if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5)
+ {
+ int pan = reg_SOUNDxCNT_PAN(chnIdx);
+ vol = CalcSurroundDecay(vol, pan);
+ }
+
+ reg_SOUNDxCNT_VOLS(chnIdx) = (u16)((volDiv << 8) | vol);
+}
+
+void SND_SetChannelTimer(int chnIdx, int timer)
+{
+ reg_SOUNDxTMR(chnIdx) = (u16)(0x10000 - timer);
+}
+
+void SND_SetChannelPan(int chnIdx, int pan)
+{
+ sOrgPan[chnIdx] = (u8)pan;
+
+ if (sMasterPan >= 0)
+ {
+ pan = sMasterPan;
+ }
+
+ reg_SOUNDxCNT_PAN(chnIdx) = (u8)pan;
+
+ if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5)
+ {
+ reg_SOUNDxCNT_VOL(chnIdx) = (u8)CalcSurroundDecay(sOrgVolume[chnIdx], pan);
+ }
+}
+
+BOOL SND_IsChannelActive(int chnIdx)
+{
+ return (reg_SOUNDxCNT_STAT(chnIdx) & 0x80) != 0;
+}
+
+void SND_SetMasterPan(int pan)
+{
+ sMasterPan = pan;
+
+ if (pan >= 0)
+ {
+ for (int i = 0; i < SND_CHANNEL_COUNT; i++)
+ {
+ reg_SOUNDxCNT_PAN(i) = (u8)pan;
+ }
+ }
+ else
+ {
+ for (int i = 0; i < SND_CHANNEL_COUNT; i++)
+ {
+ reg_SOUNDxCNT_PAN(i) = sOrgPan[i];
+ }
+ }
+}
+
+u32 SND_GetChannelControl(int chnIdx)
+{
+ return reg_SOUNDxCNT(chnIdx);
+}
+
+void SNDi_SetSurroundDecay(int decay)
+{
+ sSurroundDecay = decay;
+
+ for (int i = 0; i < SND_CHANNEL_COUNT; i++)
+ {
+ // do not process channel 1+3 (capture playback channels)
+ if ((1 << i) & 0xFFF5)
+ {
+ int pan = reg_SOUNDxCNT_PAN(i);
+ reg_SOUNDxCNT_VOL(i) = (u8)CalcSurroundDecay(sOrgVolume[i], pan);
+ }
+ }
+}
+
+static int CalcSurroundDecay(int vol, int pan)
+{
+ if (pan < 24)
+ {
+ return vol * (sSurroundDecay * (pan + 40) + ((0x7FFF - sSurroundDecay) << 6)) >> 21;
+ }
+ else if (pan <= 104)
+ {
+ return vol;
+ }
+ else
+ {
+ return vol * (-sSurroundDecay * (pan - 40) + ((sSurroundDecay + 0x7FFF) << 6)) >> 21;
+ }
+}
diff --git a/arm7/lib/src/SND_command.c b/arm7/lib/src/SND_command.c
new file mode 100644
index 00000000..f561138a
--- /dev/null
+++ b/arm7/lib/src/SND_command.c
@@ -0,0 +1,329 @@
+#include "SND_command.h"
+
+#include "mmap.h"
+#include "registers.h"
+
+#include "MI_memory.h"
+#include "OS_message.h"
+#include "OS_system.h"
+#include "PXI_fifo.h"
+#include "SND_alarm.h"
+#include "SND_capture.h"
+#include "SND_channel.h"
+#include "SND_exChannel.h"
+#include "SND_global.h"
+#include "SND_main.h"
+#include "SND_seq.h"
+#include "SND_work.h"
+
+#define SND_MSG_ARRAY_SIZE 8
+
+static OSMessage sMsgArray[SND_MSG_ARRAY_SIZE];
+static struct OSMessageQueue sMsgQueue;
+
+static void InitPXI(void);
+static void StartTimer(u32 channelMask, u32 captureMask, u32 alarmMask, s32 unused);
+static void StopTimer(u32 channelMask, u32 captureMask, u32 alarmMask, s32 hold);
+static void SetChannelTimer(u32 channelMask, int timer);
+static void SetChannelVolume(u32 channelMask, int vol, int shift);
+static void SetChannelPan(u32 channelMask, int pan);
+static void ReadDriverInfo(struct SNDDriverInfo *driverInfo);
+
+void SND_CommandInit(void)
+{
+ OS_InitMessageQueue(&sMsgQueue, sMsgArray, SND_MSG_ARRAY_SIZE);
+ InitPXI();
+ SNDi_SharedWork = NULL;
+}
+
+void SND_CommandProc(void)
+{
+ struct SNDCommand cmd;
+ struct SNDCommand *cmd_ptr;
+ OSMessage msg;
+
+ while (OS_ReceiveMessage(&sMsgQueue, &msg, 0))
+ {
+ // casting it directly below doesn't appear to match
+ cmd_ptr = (struct SNDCommand *)msg;
+
+ while (cmd_ptr)
+ {
+ cmd = *cmd_ptr;
+
+ switch (cmd.id)
+ {
+ case SND_CMD_START_SEQ:
+ SND_StartSeq((int)cmd.arg[0],
+ (const void *)cmd.arg[1],
+ cmd.arg[2],
+ (struct SNDBankData *)cmd.arg[3]);
+ break;
+ case SND_CMD_STOP_SEQ:
+ SND_StopSeq((int)cmd.arg[0]);
+ break;
+ case SND_CMD_PREPARE_SEQ:
+ SND_PrepareSeq((int)cmd.arg[0],
+ (const void *)cmd.arg[1],
+ cmd.arg[2],
+ (struct SNDBankData *)cmd.arg[3]);
+ break;
+ case SND_CMD_START_PREPARED_SEQ:
+ SND_StartPreparedSeq((int)cmd.arg[0]);
+ break;
+ case SND_CMD_PAUSE_SEQ:
+ SND_PauseSeq((int)cmd.arg[0], (BOOL)cmd.arg[1]);
+ break;
+ case SND_CMD_SKIP_SEQ:
+ SND_SkipSeq((int)cmd.arg[0], cmd.arg[1]);
+ break;
+ case SND_CMD_PLAYER_PARAM:
+ SNDi_SetPlayerParam((int)cmd.arg[0], cmd.arg[1], cmd.arg[2], (int)cmd.arg[3]);
+ break;
+ case SND_CMD_TRACK_PARAM:
+ SNDi_SetTrackParam((int)cmd.arg[0] & 0xFFFFFF,
+ cmd.arg[1],
+ cmd.arg[2],
+ cmd.arg[3],
+ (u8)(cmd.arg[0] >> 24));
+ break;
+ case SND_CMD_MUTE_TRACK:
+ SND_SetTrackMute((int)cmd.arg[0], cmd.arg[1], (BOOL)cmd.arg[2]);
+ break;
+ case SND_CMD_ALLOCATABLE_CHANNEL:
+ SND_SetTrackAllocatableChannel((int)cmd.arg[0], cmd.arg[1], cmd.arg[2]);
+ break;
+ case SND_CMD_PLAYER_LOCAL_VAR:
+ SND_SetPlayerLocalVariable((int)cmd.arg[0], (int)cmd.arg[1], (s16)cmd.arg[2]);
+ break;
+ case SND_CMD_PLAYER_GLOBAL_VAR:
+ SND_SetPlayerGlobalVariable((int)cmd.arg[0], (s16)cmd.arg[1]);
+ break;
+ case SND_CMD_START_TIMER:
+ StartTimer(cmd.arg[0], cmd.arg[1], cmd.arg[2], (int)cmd.arg[3]);
+ break;
+ case SND_CMD_STOP_TIMER:
+ StopTimer(cmd.arg[0], cmd.arg[1], cmd.arg[2], (int)cmd.arg[3]);
+ break;
+ case SND_CMD_SETUP_CAPTURE:
+ SND_SetupCapture((int)(cmd.arg[2] >> 31u) & 1,
+ (int)(cmd.arg[2] >> 30u) & 1,
+ (void *)cmd.arg[0],
+ (int)cmd.arg[1],
+ (BOOL)(cmd.arg[2] >> 29u) & 1,
+ (int)(cmd.arg[2] >> 28u) & 1,
+ (int)(cmd.arg[2] >> 27u) & 1);
+ break;
+ case SND_CMD_SETUP_ALARM:
+ SND_SetupAlarm((int)cmd.arg[0], cmd.arg[1], cmd.arg[2], cmd.arg[3]);
+ break;
+ case SND_CMD_CHANNEL_TIMER:
+ SetChannelTimer(cmd.arg[0], (int)cmd.arg[1]);
+ break;
+ case SND_CMD_CHANNEL_VOLUME:
+ SetChannelVolume(cmd.arg[0], (int)cmd.arg[1], (int)cmd.arg[2]);
+ break;
+ case SND_CMD_CHANNEL_PAN:
+ SetChannelPan(cmd.arg[0], (int)cmd.arg[1]);
+ break;
+ case SND_CMD_SETUP_CHANNEL_PCM:
+ SND_SetupChannelPcm((int)cmd.arg[0] & 0xFFFF,
+ (void *)(cmd.arg[1] & 0x7FFFFFFu),
+ (int)(cmd.arg[3] >> 24u) & 0x3,
+ (int)(cmd.arg[3] >> 26u) & 0x3,
+ (int)cmd.arg[3] & 0xFFFF,
+ (int)cmd.arg[2] & 0x3FFFFF,
+ (int)(cmd.arg[2] >> 24u) & 0x7F,
+ (int)(cmd.arg[2] >> 22u) & 0x3,
+ (int)(cmd.arg[0] >> 16u) & 0xFFFF,
+ (int)(cmd.arg[3] >> 16u) & 0x7F);
+ break;
+ case SND_CMD_SETUP_CHANNEL_PSG:
+ SND_SetupChannelPsg((int)cmd.arg[0],
+ (int)cmd.arg[3],
+ (int)cmd.arg[1] & 0x7F,
+ (int)(cmd.arg[1] >> 8u) & 0x3,
+ (int)(cmd.arg[2] >> 8u) & 0xFFFF,
+ (int)cmd.arg[2] & 0x7F);
+ break;
+ case SND_CMD_SETUP_CHANNEL_NOISE:
+ SND_SetupChannelNoise((int)cmd.arg[0],
+ (int)cmd.arg[1] & 0x7F,
+ (int)(cmd.arg[1] >> 8u) & 0x3,
+ (int)(cmd.arg[2] >> 8u) & 0xFFFF,
+ (int)cmd.arg[2] & 0x7F);
+ break;
+ case SND_CMD_SURROUND_DECAY:
+ SNDi_SetSurroundDecay((int)cmd.arg[0]);
+ break;
+ case SND_CMD_MASTER_VOLUME:
+ SND_SetMasterVolume((int)cmd.arg[0]);
+ break;
+ case SND_CMD_MASTER_PAN:
+ SND_SetMasterPan((int)cmd.arg[0]);
+ break;
+ case SND_CMD_OUTPUT_SELECTOR:
+ SND_SetOutputSelector(
+ (int)cmd.arg[0], (int)cmd.arg[1], (int)cmd.arg[2], (int)cmd.arg[3]);
+ break;
+ case SND_CMD_LOCK_CHANNEL:
+ SND_LockChannel(cmd.arg[0], cmd.arg[1]);
+ break;
+ case SND_CMD_UNLOCK_CHANNEL:
+ SND_UnlockChannel(cmd.arg[0], cmd.arg[1]);
+ break;
+ case SND_CMD_STOP_UNLOCKED_CHANNEL:
+ SND_StopUnlockedChannel(cmd.arg[0], cmd.arg[1]);
+ break;
+ case SND_CMD_INVALIDATE_SEQ:
+ SND_InvalidateSeq((void *)cmd.arg[0], (void *)cmd.arg[1]);
+ break;
+ case SND_CMD_INVALIDATE_BANK:
+ SND_InvalidateBank((void *)cmd.arg[0], (void *)cmd.arg[1]);
+ break;
+ case SND_CMD_INVALIDATE_WAVE:
+ SND_InvalidateWave((void *)cmd.arg[0], (void *)cmd.arg[1]);
+ break;
+ case SND_CMD_SET_SHARED_WORK:
+ SNDi_SharedWork = (struct SNDSharedWork *)cmd.arg[0];
+ break;
+ case SND_CMD_READ_DRIVER_INFO:
+ ReadDriverInfo((struct SNDDriverInfo *)cmd.arg[0]);
+ break;
+ } // end switch
+
+ cmd_ptr = cmd.llNext;
+ } // end loop over command linked list
+
+ SNDi_SharedWork->finishedCommandTag++;
+ } // end loop over receive message
+}
+
+static void PxiFifoCallback(PXIFifoTag tag, u32 data, BOOL error)
+{
+ (void)tag;
+ (void)error;
+
+ OSIntrMode intrMode = OS_DisableInterrupts();
+
+ if (data >= HW_MAIN_MEM)
+ {
+ (void)OS_SendMessage(&sMsgQueue, (OSMessage)data, 0);
+ }
+ else
+ {
+ if (data == 0)
+ SND_SendWakeupMessage();
+ }
+
+ (void)OS_RestoreInterrupts(intrMode);
+}
+
+static void InitPXI(void)
+{
+ PXI_SetFifoRecvCallback(PXI_FIFO_TAG_SOUND, PxiFifoCallback);
+}
+
+static void SetChannelTimer(u32 channelMask, int timer)
+{
+ for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1)
+ {
+ if (channelMask & 1)
+ SND_SetChannelTimer(i, timer);
+ }
+}
+
+static void SetChannelVolume(u32 channelMask, int vol, int shift)
+{
+ for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1)
+ {
+ if (channelMask & 1)
+ SND_SetChannelVolume(i, vol, shift);
+ }
+}
+
+static void SetChannelPan(u32 channelMask, int pan)
+{
+ for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1)
+ {
+ if (channelMask & 1)
+ SND_SetChannelPan(i, pan);
+ }
+}
+
+static void StartTimer(u32 channelMask, u32 captureMask, u32 alarmMask, s32 unused)
+{
+ (void)unused;
+
+ OSIntrMode intrMode = OS_DisableInterrupts();
+
+ for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1)
+ {
+ if (channelMask & 1)
+ reg_SOUNDxCNT_STAT(i) |= 0x80;
+ }
+
+ if (captureMask & 1)
+ {
+ if (captureMask & 2)
+ {
+ *(vu16 *)&reg_SNDCAPxCNT(0) |= 0x8080;
+ }
+ else
+ {
+ reg_SNDCAPxCNT(0) |= 0x80;
+ }
+ }
+ else if (captureMask & 2)
+ {
+ reg_SNDCAPxCNT(1) |= 0x80;
+ }
+
+ for (int i = 0; i < SND_ALARM_COUNT && alarmMask != 0; i++, alarmMask >>= 1)
+ {
+ if (alarmMask & 1)
+ SND_StartAlarm(i);
+ }
+
+ (void)OS_RestoreInterrupts(intrMode);
+ SND_UpdateSharedWork();
+}
+
+static void StopTimer(u32 channelMask, u32 captureMask, u32 alarmMask, s32 hold)
+{
+ OSIntrMode intrMode = OS_DisableInterrupts();
+
+ for (int i = 0; i < SND_ALARM_COUNT && alarmMask != 0; i++, alarmMask >>= 1)
+ {
+ if (alarmMask & 1)
+ SND_StopAlarm(i);
+ }
+
+ for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1)
+ {
+ if (channelMask & 1)
+ SND_StopChannel(i, hold);
+ }
+
+ if (captureMask & 1)
+ reg_SNDCAPxCNT(0) = 0;
+ if (captureMask & 2)
+ reg_SNDCAPxCNT(1) = 0;
+
+ (void)OS_RestoreInterrupts(intrMode);
+ SND_UpdateSharedWork();
+}
+
+static void ReadDriverInfo(struct SNDDriverInfo *driverInfo)
+{
+ MI_CpuCopy32(&SNDi_Work, driverInfo, sizeof(SNDi_Work));
+
+ driverInfo->workPtr = &SNDi_Work;
+
+ for (int i = 0; i < SND_CHANNEL_COUNT; i++)
+ {
+ driverInfo->channelControls[i] = SND_GetChannelControl(i);
+ }
+
+ driverInfo->lockedChannels = SND_GetLockedChannel(0);
+}
diff --git a/arm7/lib/src/SND_exChannel.c b/arm7/lib/src/SND_exChannel.c
new file mode 100644
index 00000000..dfaabeda
--- /dev/null
+++ b/arm7/lib/src/SND_exChannel.c
@@ -0,0 +1,685 @@
+#include "SND_exChannel.h"
+
+#include "SND_channel.h"
+#include "SND_main.h"
+#include "SND_util.h"
+#include "SND_work.h"
+
+#include "registers.h"
+
+// TODO import these tables into here if we have a working .rodata section
+extern const u8 sChannelAllocationOrder[SND_CHANNEL_COUNT];
+extern const u8 sAttackCoeffTable[19];
+extern const u8 sSampleDataShiftTable[4];
+
+static u32 sLockedChannelMask;
+static u32 sWeakLockedChannelMask;
+
+static u16 CalcDecayCoeff(int vol);
+
+static int ExChannelSweepUpdate(struct SNDExChannel *chn, BOOL step);
+static int ExChannelLfoUpdate(struct SNDExChannel *chn, BOOL step);
+static void ExChannelStart(struct SNDExChannel *chn, int length);
+static int ExChannelVolumeCmp(struct SNDExChannel *chn_a, struct SNDExChannel *chn_b);
+static void ExChannelSetup(
+ struct SNDExChannel *, SNDExChannelCallback callback, void *callbackUserData, int priority);
+
+void SND_ExChannelInit(void)
+{
+ struct SNDExChannel *chn;
+ s32 i;
+
+ for (i = 0; i < SND_CHANNEL_COUNT; i++)
+ {
+ chn = &SNDi_Work.channels[i];
+
+ chn->id = (u8)i;
+ chn->flags.syncFlag = 0;
+ chn->flags.active = FALSE;
+ }
+
+ sLockedChannelMask = 0;
+ sWeakLockedChannelMask = 0;
+}
+
+void SND_UpdateExChannel(void)
+{
+ struct SNDExChannel *chn;
+ s32 i;
+
+ for (i = 0; i < SND_CHANNEL_COUNT; i++)
+ {
+ chn = &SNDi_Work.channels[i];
+
+ if (chn->flags.syncFlag == 0)
+ continue;
+
+ if (chn->flags.syncFlag & SND_CHN_SYNC_STOP)
+ SND_StopChannel(i, 0);
+
+ if (chn->flags.syncFlag & SND_CHN_SYNC_START)
+ {
+ switch (chn->type)
+ {
+ case SND_CHN_TYPE_PCM:
+ SND_SetupChannelPcm(i,
+ chn->waveDataPtr,
+ chn->waveParam.format,
+ chn->waveParam.loopEnabled ? 1 : 2,
+ (s32)chn->waveParam.loopStart,
+ (s32)chn->waveParam.loopLength,
+ chn->volume & 0xFF,
+ chn->volume >> 8,
+ chn->timer,
+ chn->pan);
+ break;
+ case SND_CHN_TYPE_PSG:
+ SND_SetupChannelPsg(i,
+ chn->dutyCycle,
+ chn->volume & 0xFF,
+ chn->volume >> 8,
+ chn->timer,
+ chn->pan);
+ break;
+ case SND_CHN_TYPE_NOISE:
+ SND_SetupChannelNoise(
+ i, chn->volume & 0xFF, chn->volume >> 8, chn->timer, chn->pan);
+ break;
+ }
+ }
+ else
+ {
+ if (chn->flags.syncFlag & SND_CHN_SYNC_TIMER)
+ {
+ SND_SetChannelTimer(i, chn->timer);
+ }
+ if (chn->flags.syncFlag & SND_CHN_SYNC_VOLUME)
+ {
+ SND_SetChannelVolume(i, chn->volume & 0xFF, chn->volume >> 8);
+ }
+ if (chn->flags.syncFlag & SND_CHN_SYNC_PAN)
+ {
+ SND_SetChannelPan(i, chn->pan);
+ }
+ }
+ }
+
+ for (i = 0; i < SND_CHANNEL_COUNT; i++)
+ {
+ chn = &SNDi_Work.channels[i];
+
+ if (!chn->flags.syncFlag)
+ continue;
+
+ if (chn->flags.syncFlag & SND_CHN_SYNC_START)
+ reg_SOUNDxCNT_STAT(i) |= 0x80;
+ chn->flags.syncFlag = 0;
+ }
+}
+
+void SND_ExChannelMain(BOOL step)
+{
+ struct SNDExChannel *chn;
+ s32 i;
+ s32 vol;
+ s32 pitch;
+ s32 pan;
+ s32 lfo;
+ u16 newTimer;
+
+ for (i = 0; i < SND_CHANNEL_COUNT; i++)
+ {
+ vol = 0;
+ pitch = 0;
+ pan = 0;
+ chn = &SNDi_Work.channels[i];
+
+ if (!chn->flags.active)
+ continue;
+
+ if (chn->flags.start)
+ {
+ chn->flags.syncFlag |= SND_CHN_SYNC_START;
+ chn->flags.start = FALSE;
+ }
+ else if (!SND_IsChannelActive(i))
+ {
+ if (chn->callback)
+ chn->callback(chn, 1, chn->callbackUserData);
+ else
+ chn->priority = 0;
+ chn->volume = 0;
+ chn->flags.active = FALSE;
+ continue;
+ }
+
+ vol += SNDi_DecibelSquareTable[chn->velocity];
+ pitch += (chn->midiKey - chn->rootMidiKey) * 0x40;
+
+ vol += SND_UpdateExChannelEnvelope(chn, step);
+ pitch += ExChannelSweepUpdate(chn, step);
+
+ vol += chn->userDecay;
+ vol += chn->userDecay2;
+ pitch += chn->userPitch;
+
+ lfo = ExChannelLfoUpdate(chn, step);
+
+ switch (chn->lfo.param.target)
+ {
+ case SND_LFO_VOLUME:
+ if (vol > -0x8000)
+ vol += lfo;
+ break;
+ case SND_LFO_PAN:
+ pan += lfo;
+ break;
+ case SND_LFO_PITCH:
+ pitch += lfo;
+ break;
+ }
+
+ pan += chn->initPan;
+ if (chn->panRange != 127)
+ {
+ pan = (pan * chn->panRange + 0x40) >> 7;
+ }
+ pan += chn->userPan;
+
+ if (chn->envStatus == SND_ENV_RELEASE && vol <= -723)
+ {
+ chn->flags.syncFlag = SND_CHN_SYNC_STOP;
+ if (chn->callback)
+ chn->callback(chn, 1, chn->callbackUserData);
+ else
+ chn->priority = 0;
+ chn->volume = 0;
+ chn->flags.active = 0;
+ }
+ else
+ {
+ vol = SND_CalcChannelVolume(vol);
+ newTimer = SND_CalcTimer(chn->waveParam.timer, pitch);
+
+ if (chn->type == SND_CHN_TYPE_PSG)
+ newTimer &= 0xFFFC;
+
+ pan += 0x40;
+ if (pan < 0)
+ pan = 0;
+ else if (pan > 127)
+ pan = 127;
+
+ if (vol != chn->volume)
+ {
+ chn->volume = (u16)vol;
+ chn->flags.syncFlag |= SND_CHN_SYNC_VOLUME;
+ }
+ if (newTimer != chn->timer)
+ {
+ chn->timer = (u16)newTimer;
+ chn->flags.syncFlag |= SND_CHN_SYNC_TIMER;
+ }
+ if (pan != chn->pan)
+ {
+ chn->pan = (u8)pan;
+ chn->flags.syncFlag |= SND_CHN_SYNC_PAN;
+ }
+ }
+ }
+}
+
+BOOL SND_StartExChannelPcm(
+ struct SNDExChannel *chn, const struct SNDWaveParam *wave, const void *data, s32 length)
+{
+ chn->type = SND_CHN_TYPE_PCM;
+ chn->waveParam = *wave;
+ chn->waveDataPtr = data;
+ ExChannelStart(chn, length);
+ return TRUE;
+}
+
+BOOL SND_StartExChannelPsg(struct SNDExChannel *chn, s32 duty, s32 length)
+{
+ if (chn->id < 8)
+ {
+ return FALSE;
+ }
+ else if (chn->id > 13)
+ {
+ return FALSE;
+ }
+ else
+ {
+ chn->type = SND_CHN_TYPE_PSG;
+ chn->dutyCycle = duty;
+ chn->waveParam.timer = 8006;
+ ExChannelStart(chn, length);
+ return TRUE;
+ }
+}
+
+BOOL SND_StartExChannelNoise(struct SNDExChannel *chn, s32 length)
+{
+ if (chn->id < 14)
+ {
+ return FALSE;
+ }
+ else if (chn->id > 15)
+ {
+ return FALSE;
+ }
+ else
+ {
+ chn->type = SND_CHN_TYPE_NOISE;
+ chn->waveParam.timer = 8006;
+ ExChannelStart(chn, length);
+ return TRUE;
+ }
+}
+
+s32 SND_UpdateExChannelEnvelope(struct SNDExChannel *chn, BOOL step)
+{
+ s32 sustain;
+
+ if (step)
+ {
+ switch (chn->envStatus)
+ {
+ case SND_ENV_ATTACK:
+ chn->envAttenuation = -((-chn->envAttenuation * chn->envAttack) >> 8);
+ if (chn->envAttenuation == 0)
+ chn->envStatus = SND_ENV_DECAY;
+ break;
+ case SND_ENV_DECAY:
+ sustain = SNDi_DecibelSquareTable[chn->envSustain] << 7;
+ chn->envAttenuation -= chn->envDecay;
+ if (chn->envAttenuation <= sustain)
+ {
+ chn->envAttenuation = sustain;
+ chn->envStatus = SND_ENV_SUSTAIN;
+ }
+ break;
+ case SND_ENV_SUSTAIN:
+ break;
+ case SND_ENV_RELEASE:
+ chn->envAttenuation -= chn->envRelease;
+ break;
+ }
+ }
+
+ return chn->envAttenuation >> 7;
+}
+
+void SND_SetExChannelAttack(struct SNDExChannel *chn, s32 attack)
+{
+ if (attack < 109)
+ chn->envAttack = (u8)(255 - attack);
+ else
+ chn->envAttack = sAttackCoeffTable[127 - attack];
+}
+
+void SND_SetExChannelDecay(struct SNDExChannel *chn, s32 decay)
+{
+ chn->envDecay = CalcDecayCoeff(decay);
+}
+
+void SND_SetExChannelSustain(struct SNDExChannel *chn, s32 sustain)
+{
+ chn->envSustain = (u8)sustain;
+}
+
+void SND_SetExChannelRelease(struct SNDExChannel *chn, s32 release)
+{
+ chn->envRelease = CalcDecayCoeff(release);
+}
+
+void SND_ReleaseExChannel(struct SNDExChannel *chn)
+{
+ chn->envStatus = SND_ENV_RELEASE;
+}
+
+BOOL SND_IsExChannelActive(struct SNDExChannel *chn)
+{
+ return chn->flags.active;
+}
+
+struct SNDExChannel *SND_AllocExChannel(
+ u32 channelMask, int priority, u32 flags, SNDExChannelCallback callback, void *callbackUserData)
+{
+ struct SNDExChannel *chnPrev;
+ int i;
+ struct SNDExChannel *chn;
+ u8 channelCandidate;
+
+ channelMask &= ~sLockedChannelMask;
+ if (flags == 0)
+ channelMask &= ~sWeakLockedChannelMask;
+
+ chnPrev = NULL;
+
+ for (i = 0; i < SND_CHANNEL_COUNT; i++)
+ {
+ channelCandidate = sChannelAllocationOrder[i];
+
+ if (channelMask & (1 << channelCandidate))
+ {
+ chn = &SNDi_Work.channels[channelCandidate];
+
+ if (chnPrev == NULL)
+ {
+ chnPrev = chn;
+ continue;
+ }
+
+ if (chn->priority > chnPrev->priority)
+ continue;
+
+ if (chn->priority != chnPrev->priority || ExChannelVolumeCmp(chnPrev, chn) < 0)
+ chnPrev = chn;
+ }
+ }
+
+ if (chnPrev == NULL)
+ return NULL;
+
+ if (priority < chnPrev->priority)
+ return NULL;
+
+ if (chnPrev->callback)
+ chnPrev->callback(chnPrev, 0, chnPrev->callbackUserData);
+
+ chnPrev->flags.syncFlag = 2;
+ chnPrev->flags.active = 0;
+ ExChannelSetup(chnPrev, callback, callbackUserData, priority);
+ return chnPrev;
+}
+
+void SND_FreeExChannel(struct SNDExChannel *chn)
+{
+ if (chn)
+ {
+ chn->callback = NULL;
+ chn->callbackUserData = NULL;
+ }
+}
+
+void SND_StopUnlockedChannel(u32 channelMask, u32 weak)
+{
+ (void)weak;
+
+ struct SNDExChannel *chn;
+
+ for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1)
+ {
+ if ((channelMask & 1) == 0)
+ continue;
+
+ chn = &SNDi_Work.channels[i];
+
+ if (sLockedChannelMask & (1 << i))
+ continue;
+
+ if (chn->callback)
+ chn->callback(chn, 0, chn->callbackUserData);
+
+ SND_StopChannel(i, 0);
+ chn->priority = 0;
+ SND_FreeExChannel(chn);
+ chn->flags.syncFlag = 0;
+ chn->flags.active = 0;
+ }
+}
+
+void SND_LockChannel(u32 channelMask, u32 weak)
+{
+ struct SNDExChannel *chn;
+ u32 j = channelMask;
+ int i = 0;
+
+ for (; i < SND_CHANNEL_COUNT && j != 0; i++, j >>= 1)
+ {
+ if ((j & 1) == 0)
+ continue;
+
+ chn = &SNDi_Work.channels[i];
+
+ if (sLockedChannelMask & (1 << i))
+ continue;
+
+ if (chn->callback)
+ chn->callback(chn, 0, chn->callbackUserData);
+
+ SND_StopChannel(i, 0);
+ chn->priority = 0;
+ SND_FreeExChannel(chn);
+ chn->flags.syncFlag = 0;
+ chn->flags.active = 0;
+ }
+
+ if (weak & 1)
+ {
+ sWeakLockedChannelMask |= channelMask;
+ }
+ else
+ {
+ sLockedChannelMask |= channelMask;
+ }
+}
+
+void SND_UnlockChannel(u32 channelMask, u32 weak)
+{
+ if (weak & 1)
+ {
+ sWeakLockedChannelMask &= ~channelMask;
+ }
+ else
+ {
+ sLockedChannelMask &= ~channelMask;
+ }
+}
+
+u32 SND_GetLockedChannel(u32 weak)
+{
+ if (weak & 1)
+ {
+ return sWeakLockedChannelMask;
+ }
+ else
+ {
+ return sLockedChannelMask;
+ }
+}
+
+void SND_InvalidateWave(const void *start, const void *end)
+{
+ for (u8 i = 0; i < SND_CHANNEL_COUNT; i++)
+ {
+ struct SNDExChannel *chn = &SNDi_Work.channels[i];
+
+ if (chn->flags.active && chn->type == 0 && start <= chn->waveDataPtr &&
+ chn->waveDataPtr <= end)
+ {
+ chn->flags.start = FALSE;
+ SND_StopChannel(i, 0);
+ }
+ }
+}
+
+void SND_InitLfoParam(struct SNDLfoParam *lfoParam)
+{
+ lfoParam->target = SND_LFO_PITCH;
+ lfoParam->depth = 0;
+ lfoParam->range = 1;
+ lfoParam->speed = 16;
+ lfoParam->delay = 0;
+}
+
+void SND_StartLfo(struct SNDLfo *lfo)
+{
+ lfo->counter = 0;
+ lfo->delayCounter = 0;
+}
+
+void SND_UpdateLfo(struct SNDLfo *lfo)
+{
+ if (lfo->delayCounter < lfo->param.delay)
+ {
+ lfo->delayCounter++;
+ }
+ else
+ {
+ u32 tmp = lfo->counter;
+ tmp += lfo->param.speed << 6;
+ tmp >>= 8;
+ while (tmp >= 0x80)
+ {
+ tmp -= 0x80;
+ }
+ lfo->counter += lfo->param.speed << 6;
+ lfo->counter &= 0xFF;
+ lfo->counter |= tmp << 8;
+ }
+}
+
+int SND_GetLfoValue(struct SNDLfo *lfo)
+{
+ if (lfo->param.depth == 0)
+ {
+ return 0;
+ }
+ else if (lfo->delayCounter < lfo->param.delay)
+ {
+ return 0;
+ }
+ else
+ {
+ return SND_SinIdx((s32)((u32)lfo->counter >> 8)) * lfo->param.depth * lfo->param.range;
+ }
+}
+
+static u16 CalcDecayCoeff(int vol)
+{
+ if (vol == 127)
+ return 0xFFFF;
+ else if (vol == 126)
+ return 0x3C00;
+ else if (vol < 50)
+ return (u16)(vol * 2 + 1);
+ else
+ return (u16)(0x1E00 / (126 - vol));
+}
+
+static void ExChannelSetup(
+ struct SNDExChannel *chn, SNDExChannelCallback callback, void *callbackUserData, int priority)
+{
+ chn->channelLLNext = NULL;
+ chn->callback = callback;
+ chn->callbackUserData = callbackUserData;
+ chn->length = 0;
+ chn->priority = (u8)priority;
+ chn->volume = 127;
+ chn->flags.start = FALSE;
+ chn->flags.autoSweep = TRUE;
+ chn->midiKey = 60;
+ chn->rootMidiKey = 60;
+ chn->velocity = 127;
+ chn->initPan = 0;
+ chn->userDecay = 0;
+ chn->userDecay2 = 0;
+ chn->userPitch = 0;
+ chn->userPan = 0;
+ chn->panRange = 127;
+ chn->sweepPitch = 0;
+ chn->sweepLength = 0;
+ chn->sweepCounter = 0;
+
+ SND_SetExChannelAttack(chn, 127);
+ SND_SetExChannelDecay(chn, 127);
+ SND_SetExChannelSustain(chn, 127);
+ SND_SetExChannelRelease(chn, 127);
+ SND_InitLfoParam(&chn->lfo.param);
+}
+
+static void ExChannelStart(struct SNDExChannel *chn, int length)
+{
+ chn->envAttenuation = -92544;
+ chn->envStatus = 0;
+ chn->length = length;
+ SND_StartLfo(&chn->lfo);
+ chn->flags.start = TRUE;
+ chn->flags.active = TRUE;
+}
+
+static int ExChannelVolumeCmp(struct SNDExChannel *chn_a, struct SNDExChannel *chn_b)
+{
+ int vol_a = chn_a->volume & 0xFF;
+ int vol_b = chn_b->volume & 0xFF;
+
+ vol_a <<= 4;
+ vol_b <<= 4;
+
+ vol_a >>= sSampleDataShiftTable[chn_a->volume >> 8];
+ vol_b >>= sSampleDataShiftTable[chn_b->volume >> 8];
+
+ if (vol_a != vol_b)
+ {
+ if (vol_a < vol_b)
+ return 1;
+ else
+ return -1;
+ }
+ return 0;
+}
+
+static int ExChannelSweepUpdate(struct SNDExChannel *chn, BOOL step)
+{
+ s64 result;
+
+ if (chn->sweepPitch == 0)
+ {
+ result = 0;
+ }
+ else if (chn->sweepCounter >= chn->sweepLength)
+ {
+ result = 0;
+ }
+ else
+ {
+ result = (s64)chn->sweepPitch * (chn->sweepLength - chn->sweepCounter) / chn->sweepLength;
+
+ if (step && chn->flags.autoSweep)
+ chn->sweepCounter++;
+ }
+
+ return (int)result;
+}
+
+static int ExChannelLfoUpdate(struct SNDExChannel *chn, BOOL step)
+{
+ s64 result = SND_GetLfoValue(&chn->lfo);
+
+ if (result != 0)
+ {
+ switch (chn->lfo.param.target)
+ {
+ case SND_LFO_VOLUME:
+ result *= 60;
+ break;
+ case SND_LFO_PITCH:
+ result <<= 6;
+ break;
+ case SND_LFO_PAN:
+ result <<= 6;
+ break;
+ }
+ result >>= 14;
+ }
+
+ if (step)
+ {
+ SND_UpdateLfo(&chn->lfo);
+ }
+
+ return (int)result;
+}
diff --git a/arm7/lib/src/SND_global.c b/arm7/lib/src/SND_global.c
new file mode 100644
index 00000000..c78fcd5f
--- /dev/null
+++ b/arm7/lib/src/SND_global.c
@@ -0,0 +1,63 @@
+#include "SND_global.h"
+
+#include "SND_channel.h"
+#include "SND_work.h"
+
+#include "OS_system.h"
+#include "PM.h"
+#include "registers.h"
+#include "syscall.h"
+
+void SND_Enable(void)
+{
+ reg_SOUNDCNT_MIX |= 0x80;
+}
+
+void SND_Disable(void)
+{
+ reg_SOUNDCNT_MIX &= ~0x80;
+}
+
+void SND_Shutdown(void)
+{
+ SND_Disable();
+
+ for (int i = 0; i < SND_CHANNEL_COUNT; i++)
+ {
+ SND_StopChannel(i, 1);
+ }
+
+ reg_SNDCAPxCNT(0) = 0;
+ reg_SNDCAPxCNT(1) = 0;
+}
+
+void SND_BeginSleep(void)
+{
+ SND_Disable();
+ SVC_SoundBiasReset(0x80);
+ OS_SpinWait(0x40000);
+ PMi_ResetControl(1);
+ reg_POWCNT2 &= ~1;
+}
+
+void SND_EndSleep(void)
+{
+ reg_POWCNT2 |= 1; // enable speakers
+ PMi_SetControl(1);
+ SVC_SoundBiasSet(0x100);
+ OS_SpinWait(0x7AB80); // what does this wait for and how long does it wait?
+ SND_Enable();
+}
+
+void SND_SetMasterVolume(int vol)
+{
+ reg_SOUNDCNT_VOL = (u8)vol;
+}
+
+void SND_SetOutputSelector(
+ int leftOutputFrom, int rightOutputFrom, int outputCh1ToMixer, int outputCh3ToMixer)
+{
+ int masterEnable = (reg_SOUNDCNT_MIX & 0x80) ? 1 : 0;
+ reg_SOUNDCNT_MIX = (u8)((masterEnable << 7) | (outputCh3ToMixer << 5) |
+ (outputCh1ToMixer << 4) | (rightOutputFrom << 2) | (leftOutputFrom));
+}
diff --git a/arm7/lib/src/SND_main.c b/arm7/lib/src/SND_main.c
new file mode 100644
index 00000000..fbf84573
--- /dev/null
+++ b/arm7/lib/src/SND_main.c
@@ -0,0 +1,133 @@
+#include "SND_main.h"
+
+#include "global.h"
+
+#include "SND_alarm.h"
+#include "SND_capture.h"
+#include "SND_command.h"
+#include "SND_exChannel.h"
+#include "SND_global.h"
+#include "SND_seq.h"
+#include "SND_util.h"
+#include "SND_work.h"
+
+#include "OS_alarm.h"
+#include "OS_message.h"
+#include "OS_thread.h"
+#include "OS_tick.h"
+
+static void FUN_037fc330(void *);
+static void SndThread(void *);
+
+u8 sThreadStack[0x400];
+OSThread sThread;
+OSAlarm sAlarm;
+OSMessageQueue sMessageQueue;
+OSMessage sMessageArray[8];
+u32 sInitialized = 0;
+
+void SND_Init(u32 priority)
+{
+ if (sInitialized == 0)
+ {
+ sInitialized = 1;
+ SND_CommandInit();
+ SND_CreateThread(priority);
+ }
+}
+
+void SND_CreateThread(u32 priority)
+{
+ OS_CreateThread(&sThread,
+ SndThread,
+ NULL,
+ &sThreadStack[sizeof(sThreadStack)],
+ sizeof(sThreadStack),
+ priority);
+ OS_WakeupThreadDirect(&sThread);
+}
+
+void SND_InitIntervalTimer(void)
+{
+ OS_InitMessageQueue(&sMessageQueue, sMessageArray, 8);
+ OS_CreateAlarm(&sAlarm);
+}
+
+void SND_StartIntervalTimer(void)
+{
+ OSTick tick = OS_GetTick();
+ OS_SetPeriodicAlarm(&sAlarm, tick + 0x10000, 2728, FUN_037fc330, NULL);
+}
+
+void SND_StopIntervalTimer(void)
+{
+ OS_CancelAlarm(&sAlarm);
+}
+
+u32 SND_WaitForIntervalTimer(void)
+{
+ OSMessage result;
+ (void)OS_ReceiveMessage(&sMessageQueue, &result, 1);
+ return (u32)result;
+}
+
+void SND_SendWakeupMessage(void)
+{
+ (void)OS_SendMessage(&sMessageQueue, (OSMessage)2, 0);
+}
+
+void SNDi_LockMutex(void)
+{
+ // nothing
+}
+
+void SNDi_UnlockMutex(void)
+{
+ // nothing
+}
+
+static void FUN_037fc330(void *arg)
+{
+ (void)arg;
+ (void)OS_SendMessage(&sMessageQueue, (OSMessage)1, 0);
+}
+
+static void SndThread(void *arg)
+{
+ (void)arg;
+
+ SND_InitIntervalTimer();
+ SND_ExChannelInit();
+ SND_SeqInit();
+ SND_AlarmInit();
+ SND_Enable();
+ SND_SetOutputSelector(0, 0, 0, 0);
+ SND_SetMasterVolume(0x7F);
+ SND_StartIntervalTimer();
+
+ while (1)
+ {
+ BOOL update = FALSE;
+
+ u32 result = SND_WaitForIntervalTimer();
+
+ switch (result)
+ {
+ case 2:
+ update = FALSE;
+ break;
+ case 1:
+ update = TRUE;
+ break;
+ }
+
+ SND_UpdateExChannel();
+ SND_CommandProc();
+
+ SND_SeqMain(update);
+ SND_ExChannelMain(update);
+
+ SND_UpdateSharedWork();
+ (void)SND_CalcRandom();
+ }
+}
diff --git a/arm7/lib/src/SND_seq.c b/arm7/lib/src/SND_seq.c
new file mode 100644
index 00000000..15b60596
--- /dev/null
+++ b/arm7/lib/src/SND_seq.c
@@ -0,0 +1,1324 @@
+#include "SND_seq.h"
+
+#include "SND_bank.h"
+#include "SND_exChannel.h"
+#include "SND_lfo.h"
+#include "SND_main.h"
+#include "SND_util.h"
+#include "SND_work.h"
+
+#define SND_TIMER_RATE 240
+
+#define SND_TRACK_MUTE_MODE_UNMUTE 0
+#define SND_TRACK_MUTE_MODE_MUTE 1
+#define SND_TRACK_MUTE_MODE_MUTE_RELEASE 2
+#define SND_TRACK_MUTE_MODE_MUTE_STOP 3
+
+enum SNDSeqProc
+{
+ SND_PROC_SKIP_NOTES = 0,
+ SND_PROC_PLAY_NOTES = 1,
+};
+
+enum SNDSeqVal
+{
+ SND_SEQ_VAL_U8 = 0,
+ SND_SEQ_VAL_U16 = 1,
+ SND_SEQ_VAL_VLV = 2,
+ SND_SEQ_VAL_RAN = 3,
+ SND_SEQ_VAL_VAR = 4,
+};
+
+static struct
+{
+ const u8 *begin;
+ const u8 *end;
+ union
+ {
+ u8 buf[16];
+ u32 buf32[4];
+ };
+} sSeqCache;
+static int sPrintEnabled;
+
+static void PlayerSeqMain(struct SNDPlayer *player);
+static void PlayerUpdateChannel(struct SNDPlayer *player);
+static void PlayerStop(struct SNDPlayer *player);
+static void PlayerInit(struct SNDPlayer *player, struct SNDBankData *bank);
+static int AllocateTrack(void);
+static void TrackInit(struct SNDTrack *track);
+static void TrackStart(struct SNDTrack *track, const void *seq, u32 offset);
+static void SeqCacheFetch(const u8 *addr);
+static u8 SeqReadByte(const u8 *addr);
+static u16 TrackReadU16(struct SNDTrack *track);
+static struct SNDTrack *PlayerGetTrack(struct SNDPlayer *player, int track);
+static void TrackReleaseChannels(struct SNDTrack *track, struct SNDPlayer *player, int release);
+static void TrackFreeChannels(struct SNDTrack *track);
+static BOOL PlayerStepTicks(struct SNDPlayer *player, u32 ticks);
+static void TrackMute(struct SNDTrack *track, struct SNDPlayer *player, int muteMode);
+static s16 *PlayerGetVariablePointer(const struct SNDPlayer *player, int var);
+static void TrackUpdateChannel(struct SNDTrack *track, struct SNDPlayer *player, int release);
+
+void SND_SeqInit(void)
+{
+ for (int i = 0; i < SND_PLAYER_COUNT; i++)
+ {
+ struct SNDPlayer *ply = &SNDi_Work.players[i];
+
+ ply->flags.active = FALSE;
+ ply->playerId = (u8)i;
+ }
+
+ for (int i = 0; i < SND_TRACK_COUNT; i++)
+ {
+ struct SNDTrack *trk = &SNDi_Work.tracks[i];
+
+ trk->flags.active = FALSE;
+ }
+}
+
+void SND_SeqMain(BOOL step)
+{
+ struct SNDPlayer *ply;
+ int i;
+ u32 playerStatus = 0;
+
+ for (i = 0; i < SND_PLAYER_COUNT; i++)
+ {
+ ply = &SNDi_Work.players[i];
+
+ if (!ply->flags.active)
+ continue;
+
+ if (ply->flags.prepared)
+ {
+ if (step && !ply->flags.paused)
+ PlayerSeqMain(ply);
+ PlayerUpdateChannel(ply);
+ }
+
+ if (ply->flags.active)
+ playerStatus |= 1 << i;
+ }
+
+ if (SNDi_SharedWork)
+ SNDi_SharedWork->playerStatus = playerStatus;
+}
+
+void SND_PrepareSeq(int player, const void *seq, u32 offset, struct SNDBankData *bankData)
+{
+ struct SNDPlayer *ply = &SNDi_Work.players[player];
+
+ if (ply->flags.active)
+ PlayerStop(ply);
+
+ PlayerInit(ply, bankData);
+
+ int allocTrkIdx = AllocateTrack();
+
+ if (allocTrkIdx < 0)
+ return;
+
+ struct SNDTrack *trk = &SNDi_Work.tracks[allocTrkIdx];
+ TrackInit(trk);
+ TrackStart(trk, seq, offset);
+ ply->tracks[0] = (u8)allocTrkIdx;
+ SeqCacheFetch(trk->cur);
+
+ u8 cmd = SeqReadByte(trk->cur);
+
+ trk->cur++;
+
+ if (cmd != 0xFE)
+ {
+ trk->cur--;
+ }
+ else
+ {
+ int track;
+ u16 trackMask;
+
+ for (trackMask = (u16)(TrackReadU16(trk) >> 1), track = 1; trackMask != 0;
+ track++, trackMask >>= 1)
+ {
+ if (trackMask & 1)
+ {
+ allocTrkIdx = AllocateTrack();
+ if (allocTrkIdx < 0)
+ break;
+ TrackInit(&SNDi_Work.tracks[allocTrkIdx]);
+ ply->tracks[track] = (u8)allocTrkIdx;
+ }
+ }
+ }
+
+ ply->flags.active = TRUE;
+ ply->flags.prepared = FALSE;
+
+ if (SNDi_SharedWork)
+ {
+ SNDi_SharedWork->playerStatus |= 1 << player;
+ }
+}
+
+void SND_StartPreparedSeq(int player)
+{
+ SNDi_Work.players[player].flags.prepared = TRUE;
+}
+
+void SND_StartSeq(int player, const void *seq, u32 offset, struct SNDBankData *bankData)
+{
+ SND_PrepareSeq(player, seq, offset, bankData);
+ SND_StartPreparedSeq(player);
+}
+
+void SND_StopSeq(int player)
+{
+ struct SNDPlayer *ply = &SNDi_Work.players[player];
+
+ if (ply->flags.active)
+ {
+ PlayerStop(ply);
+
+ if (SNDi_SharedWork)
+ {
+ SNDi_SharedWork->playerStatus &= ~(1 << player);
+ }
+ }
+}
+
+void SND_PauseSeq(int player, BOOL flag)
+{
+ struct SNDPlayer *ply = &SNDi_Work.players[player];
+
+ ply->flags.paused = flag;
+
+ if (flag)
+ {
+ for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++)
+ {
+ struct SNDTrack *trk = PlayerGetTrack(ply, i);
+
+ if (trk)
+ {
+ TrackReleaseChannels(trk, ply, 127);
+ TrackFreeChannels(trk);
+ }
+ }
+ }
+}
+
+void SND_SkipSeq(int player, u32 ticks)
+{
+ struct SNDPlayer *ply = &SNDi_Work.players[player];
+
+ for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++)
+ {
+ struct SNDTrack *trk = PlayerGetTrack(ply, i);
+
+ if (trk)
+ {
+ TrackReleaseChannels(trk, ply, 127);
+ TrackFreeChannels(trk);
+ }
+ }
+
+ SND_StopIntervalTimer();
+
+ u32 i;
+ for (i = 0; i < ticks; i++)
+ {
+ if (PlayerStepTicks(ply, 0))
+ {
+ PlayerStop(ply);
+ break;
+ }
+ }
+
+ SND_StartIntervalTimer();
+
+ if (SNDi_SharedWork)
+ {
+ SNDi_SharedWork->players[ply->playerId].tickCounter += i;
+ }
+}
+
+void SND_SetTrackMute(int player, u32 trackMask, int muteMode)
+{
+ struct SNDPlayer *ply = &SNDi_Work.players[player];
+
+ for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER && trackMask != 0; i++, trackMask >>= 1)
+ {
+ if (trackMask & 1)
+ {
+ struct SNDTrack *trk = PlayerGetTrack(ply, i);
+
+ if (trk)
+ {
+ TrackMute(trk, ply, muteMode);
+ }
+ }
+ }
+}
+
+void SND_SetTrackAllocatableChannel(int player, u32 trackMask, u32 channelMask)
+{
+ struct SNDPlayer *ply = &SNDi_Work.players[player];
+
+ for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER && trackMask != 0; i++, trackMask >>= 1)
+ {
+ if (trackMask & 1)
+ {
+ struct SNDTrack *trk = PlayerGetTrack(ply, i);
+
+ if (trk)
+ {
+ trk->channelMask = (u16)channelMask;
+ trk->flags.channelMask = TRUE;
+ }
+ }
+ }
+}
+
+void SND_InvalidateSeq(const void *start, const void *end)
+{
+ struct SNDPlayer *ply;
+ struct SNDTrack *trk;
+ int i;
+ int j;
+
+ for (i = 0; i < SND_PLAYER_COUNT; i++)
+ {
+ ply = &SNDi_Work.players[i];
+
+ if (!ply->flags.active)
+ continue;
+
+ for (j = 0; j < SND_TRACK_COUNT_PER_PLAYER; j++)
+ {
+ trk = PlayerGetTrack(ply, j);
+
+ if (!trk)
+ continue;
+
+ if (start <= trk->cur && trk->cur <= end)
+ {
+ PlayerStop(ply);
+ break;
+ }
+ }
+ }
+}
+
+void SND_InvalidateBank(const void *start, const void *end)
+{
+ for (int i = 0; i < SND_PLAYER_COUNT; i++)
+ {
+ struct SNDPlayer *ply = &SNDi_Work.players[i];
+
+ if (ply->flags.active && start <= ply->bank && ply->bank <= end)
+ PlayerStop(ply);
+ }
+}
+
+void SNDi_SetPlayerParam(int player, u32 offset, u32 data, int size)
+{
+ struct SNDPlayer *ply = &SNDi_Work.players[player];
+
+ switch (size)
+ {
+ case 1:
+ *(u8 *)((u8 *)ply + offset) = (u8)data;
+ break;
+ case 2:
+ *(u16 *)((u8 *)ply + offset) = (u16)data;
+ break;
+ case 4:
+ *(u32 *)((u8 *)ply + offset) = (u32)data;
+ break;
+ }
+}
+
+void SNDi_SetTrackParam(int player, u32 trackMask, u32 offset, u32 data, int size)
+{
+ struct SNDPlayer *ply = &SNDi_Work.players[player];
+
+ for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER && trackMask != 0; i++, trackMask >>= 1)
+ {
+ if (!(trackMask & 1))
+ continue;
+
+ struct SNDTrack *trk = PlayerGetTrack(ply, i);
+
+ if (!trk)
+ continue;
+
+ switch (size)
+ {
+ case 1:
+ *(u8 *)((u8 *)trk + offset) = (u8)data;
+ break;
+ case 2:
+ *(u16 *)((u8 *)trk + offset) = (u16)data;
+ break;
+ case 4:
+ *(u32 *)((u8 *)trk + offset) = (u32)data;
+ break;
+ }
+ }
+}
+
+static void SeqCacheFetch(const u8 *addr)
+{
+ addr = (const u8 *)((u32)addr & ~3);
+ sSeqCache.begin = addr;
+ sSeqCache.end = sSeqCache.begin + 16;
+
+ const u32 *src = (const u32 *)addr;
+
+ sSeqCache.buf32[0] = src[0];
+ sSeqCache.buf32[1] = src[1];
+ sSeqCache.buf32[2] = src[2];
+ sSeqCache.buf32[3] = src[3];
+}
+
+static u8 SeqReadByte(const u8 *addr)
+{
+ if (addr < sSeqCache.begin || addr >= sSeqCache.end)
+ SeqCacheFetch(addr);
+
+ return sSeqCache.buf[(u32)addr - (u32)sSeqCache.begin];
+}
+
+static inline u8 TrackReadU8(struct SNDTrack *track)
+{
+ u8 retval = SeqReadByte(track->cur);
+ track->cur++;
+ return retval;
+}
+
+static u16 TrackReadU16(struct SNDTrack *track)
+{
+ int retval;
+
+ retval = TrackReadU8(track);
+ retval |= TrackReadU8(track) << 8;
+
+ return (u16)retval;
+}
+
+static u32 TrackReadU24(struct SNDTrack *track)
+{
+ u32 retval;
+
+ retval = TrackReadU8(track);
+ retval |= TrackReadU8(track) << 8;
+ retval |= TrackReadU8(track) << 16;
+
+ return retval;
+}
+
+static int TrackReadVLV(struct SNDTrack *track)
+{
+ int retval = 0;
+ int b;
+
+ do
+ {
+ b = TrackReadU8(track);
+ retval = (retval << 7) | (b & 0x7F);
+ } while (b & 0x80);
+
+ return retval;
+}
+
+static int TrackParseValue(struct SNDTrack *track, struct SNDPlayer *player, int valueType)
+{
+ int retval;
+ int hi;
+ int lo;
+ int ran;
+ s16 *var;
+
+ // BUG: undefined behavior if invalid valueType is passed (uninitialized return value)
+
+ switch (valueType)
+ {
+ case SND_SEQ_VAL_U8:
+ retval = TrackReadU8(track);
+ break;
+ case SND_SEQ_VAL_U16:
+ retval = TrackReadU16(track);
+ break;
+ case SND_SEQ_VAL_VLV:
+ retval = TrackReadVLV(track);
+ break;
+ case SND_SEQ_VAL_VAR:
+ var = PlayerGetVariablePointer(player, TrackReadU8(track));
+ if (var)
+ retval = *var;
+ break;
+ case SND_SEQ_VAL_RAN:
+ lo = TrackReadU16(track) << 16;
+ hi = (s16)TrackReadU16(track);
+ ran = SND_CalcRandom();
+ retval = hi - (lo >> 16);
+ retval += 1;
+ retval = (ran * retval) >> 16;
+ retval += lo >> 16;
+ break;
+ }
+
+ return retval;
+}
+
+static void TrackInit(struct SNDTrack *track)
+{
+ track->base = NULL;
+ track->cur = NULL;
+
+ track->flags.noteWait = TRUE;
+ track->flags.muted = FALSE;
+ track->flags.tie = FALSE;
+ track->flags.noteFinishWait = FALSE;
+ track->flags.portamento = FALSE;
+ track->flags.cmp = TRUE;
+ track->flags.channelMask = FALSE;
+
+ track->callStackDepth = 0;
+ track->program = 0;
+ track->priority = 64;
+ track->volume = 127;
+ track->expression = 127;
+ track->extFader = 0;
+ track->pan = 0;
+ track->extPan = 0;
+ track->pitchBend = 0;
+ track->extPitch = 0;
+ track->envAttack = 255;
+ track->envDecay = 255;
+ track->envSustain = 255;
+ track->envRelease = 255;
+ track->panRange = 127;
+ track->bendRange = 2;
+ track->portamentoKey = 60;
+ track->portamentoTime = 0;
+ track->sweepPitch = 0;
+ track->transpose = 0;
+ track->channelMask = 0xFFFF;
+ SND_InitLfoParam(&track->mod);
+ track->wait = 0;
+ track->channelLLHead = NULL;
+}
+
+static void TrackStart(struct SNDTrack *track, const void *seq, u32 offset)
+{
+ track->base = (const u8 *)seq;
+ track->cur = &track->base[offset];
+}
+
+static void PlayerInit(struct SNDPlayer *player, struct SNDBankData *bank)
+{
+ player->flags.paused = FALSE;
+ player->bank = bank;
+ player->tempo = 120;
+ player->tempoRatio = 256;
+ player->tempoCounter = SND_TIMER_RATE;
+ player->volume = 0x7F;
+ player->extFader = 0;
+ player->prio = 64;
+
+ for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++)
+ {
+ player->tracks[i] = 0xFF;
+ }
+
+ if (SNDi_SharedWork)
+ {
+ SNDi_SharedWork->players[player->playerId].tickCounter = 0;
+
+ for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++)
+ {
+ SNDi_SharedWork->players[player->playerId].localVars[i] = -1;
+ }
+ }
+}
+
+static void TrackReleaseChannels(struct SNDTrack *track, struct SNDPlayer *player, int release)
+{
+ TrackUpdateChannel(track, player, 0);
+
+ for (struct SNDExChannel *chn = track->channelLLHead; chn; chn = chn->channelLLNext)
+ {
+ if (SND_IsExChannelActive(chn))
+ {
+ if (release >= 0)
+ SND_SetExChannelRelease(chn, release & 0xFF);
+ chn->priority = 1;
+ SND_ReleaseExChannel(chn);
+ }
+ }
+}
+
+static void TrackFreeChannels(struct SNDTrack *track)
+{
+ for (struct SNDExChannel *chn = track->channelLLHead; chn; chn = chn->channelLLNext)
+ {
+ SND_FreeExChannel(chn);
+ }
+
+ track->channelLLHead = NULL;
+}
+
+static void PlayerSeqMain(struct SNDPlayer *player)
+{
+ int ticks = 0;
+ int tempoInc;
+ int i;
+
+ while (player->tempoCounter >= SND_TIMER_RATE)
+ {
+ player->tempoCounter -= SND_TIMER_RATE;
+ ticks++;
+ }
+
+ for (i = 0; i < ticks; i++)
+ {
+ if (PlayerStepTicks(player, SND_PROC_PLAY_NOTES))
+ {
+ PlayerStop(player);
+ break;
+ }
+ }
+
+ if (SNDi_SharedWork)
+ {
+ SNDi_SharedWork->players[player->playerId].tickCounter += i;
+ }
+
+ tempoInc = player->tempo;
+ tempoInc *= player->tempoRatio;
+ tempoInc >>= 8;
+
+ player->tempoCounter += tempoInc;
+}
+
+static struct SNDTrack *PlayerGetTrack(struct SNDPlayer *player, int track)
+{
+ if (track > (SND_TRACK_COUNT_PER_PLAYER - 1))
+ return NULL;
+
+ if (player->tracks[track] == 0xFF)
+ return NULL;
+
+ return &SNDi_Work.tracks[player->tracks[track]];
+}
+
+static void TrackStop(struct SNDTrack *track, struct SNDPlayer *player)
+{
+ TrackReleaseChannels(track, player, -1);
+ TrackFreeChannels(track);
+}
+
+static void PlayerStopTrack(struct SNDPlayer *player, int trackIdx)
+{
+ struct SNDTrack *track = PlayerGetTrack(player, trackIdx);
+
+ if (track == NULL)
+ return;
+
+ TrackStop(track, player);
+ SNDi_Work.tracks[player->tracks[trackIdx]].flags.active = FALSE;
+ player->tracks[trackIdx] = 0xFF;
+}
+
+static void PlayerStop(struct SNDPlayer *player)
+{
+ for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++)
+ {
+ PlayerStopTrack(player, i);
+ }
+ player->flags.active = FALSE;
+}
+
+static void ChannelCallback(struct SNDExChannel *chn, int status, void *track_)
+{
+ struct SNDExChannel *cur;
+ struct SNDTrack *track;
+
+ track = (struct SNDTrack *)track_;
+
+ if (status == 1)
+ {
+ chn->priority = 0;
+ SND_FreeExChannel(chn);
+ }
+
+ if (track->channelLLHead == chn)
+ {
+ track->channelLLHead = chn->channelLLNext;
+ }
+ else
+ {
+ cur = track->channelLLHead;
+
+ while (cur->channelLLNext)
+ {
+ if (cur->channelLLNext == chn)
+ {
+ cur->channelLLNext = chn->channelLLNext;
+ return;
+ }
+ cur = cur->channelLLNext;
+ }
+ }
+}
+
+static void TrackUpdateChannel(struct SNDTrack *track, struct SNDPlayer *player, int release)
+{
+ int vol;
+ int fader;
+ int pan;
+ int pitch;
+
+ vol = SNDi_DecibelSquareTable[track->volume] + SNDi_DecibelSquareTable[track->expression] +
+ SNDi_DecibelSquareTable[player->volume];
+
+ fader = track->extFader + player->extFader;
+
+ pitch = track->pitchBend;
+ pitch *= track->bendRange << 6;
+ pitch >>= 7;
+ pitch += track->extPitch;
+
+ pan = track->pan;
+
+ if (track->panRange != 127)
+ pan = (pan * track->panRange + 0x40) >> 7;
+
+ pan += track->extPan;
+
+ if (vol < -0x8000)
+ vol = -0x8000;
+
+ if (fader < -0x8000)
+ fader = -0x8000;
+
+ if (pan < -128)
+ pan = -128;
+ else if (pan > 127)
+ pan = 127;
+
+ for (struct SNDExChannel *chn = track->channelLLHead; chn != NULL; chn = chn->channelLLNext)
+ {
+ chn->userDecay2 = (s16)fader;
+
+ if (chn->envStatus == 3)
+ continue;
+
+ chn->userDecay = (s16)vol;
+ chn->userPitch = (s16)pitch;
+ chn->userPan = (s8)pan;
+ chn->panRange = track->panRange;
+ chn->lfo.param = track->mod;
+
+ if (chn->length == 0 && release != 0)
+ {
+ chn->priority = 1;
+ SND_ReleaseExChannel(chn);
+ }
+ }
+}
+
+static void PlayerUpdateChannel(struct SNDPlayer *player)
+{
+ for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++)
+ {
+ struct SNDTrack *trk = PlayerGetTrack(player, i);
+ if (trk)
+ {
+ TrackUpdateChannel(trk, player, 1);
+ }
+ }
+}
+
+static void TrackPlayNote(
+ struct SNDTrack *track, struct SNDPlayer *player, int midiKey, int velocity, int length)
+{
+ struct SNDExChannel *chn = NULL;
+
+ if (track->flags.tie)
+ {
+ chn = track->channelLLHead;
+ if (chn)
+ {
+ chn->midiKey = (u8)midiKey;
+ chn->velocity = (u8)velocity;
+ }
+ }
+
+ if (chn == NULL)
+ {
+ struct SNDInstData inst;
+ if (!SND_ReadInstData(player->bank, track->program, midiKey, &inst))
+ return;
+
+ u32 allowedChannels;
+
+ // get bitmask with allocatable channels based on channel type
+ switch (inst.type)
+ {
+ case SND_INST_PCM:
+ case SND_INST_DIRECTPCM:
+ // all channels support PCM
+ allowedChannels = 0xFFFF;
+ break;
+ case SND_INST_PSG:
+ // only channels 8, 9, 10, 11, 12, 13 support PSG
+ allowedChannels = 0x3F00;
+ break;
+ case SND_INST_NOISE:
+ // only channels 14 and 15 support noise
+ allowedChannels = 0xC000;
+ break;
+ default:
+ return;
+ }
+
+ allowedChannels &= track->channelMask;
+
+ chn = SND_AllocExChannel(allowedChannels,
+ player->prio + track->priority,
+ track->flags.channelMask,
+ ChannelCallback,
+ track);
+ if (chn == NULL)
+ return;
+
+ if (!SND_NoteOn(
+ chn, midiKey, velocity, track->flags.tie ? -1 : length, player->bank, &inst))
+ {
+ chn->priority = 0;
+ SND_FreeExChannel(chn);
+ return;
+ }
+
+ chn->channelLLNext = track->channelLLHead;
+ track->channelLLHead = chn;
+ }
+
+ if (track->envAttack != 0xFF)
+ SND_SetExChannelAttack(chn, track->envAttack);
+
+ if (track->envDecay != 0xFF)
+ SND_SetExChannelDecay(chn, track->envDecay);
+
+ if (track->envSustain != 0xFF)
+ SND_SetExChannelSustain(chn, track->envSustain);
+
+ if (track->envRelease != 0xFF)
+ SND_SetExChannelRelease(chn, track->envRelease);
+
+ chn->sweepPitch = track->sweepPitch;
+ if (track->flags.portamento)
+ chn->sweepPitch += (s16)((track->portamentoKey - midiKey) << 6);
+
+ if (track->portamentoTime == 0)
+ {
+ chn->sweepLength = length;
+ chn->flags.autoSweep = FALSE;
+ }
+ else
+ {
+ int swp = track->portamentoTime * track->portamentoTime;
+ swp *= chn->sweepPitch < 0 ? -chn->sweepPitch : chn->sweepPitch;
+ swp >>= 11;
+ chn->sweepLength = swp;
+ }
+
+ chn->sweepCounter = 0;
+}
+
+static int TrackStepTicks(
+ struct SNDTrack *track, struct SNDPlayer *player, int trackIdx, u32 playNotes)
+{
+ (void)trackIdx;
+
+ struct SNDExChannel *chn;
+ u8 cmd;
+ enum SNDSeqVal valueType;
+ BOOL specialValueType;
+ BOOL runCmd;
+ s32 length;
+ int midiKey;
+
+ s32 par;
+
+ for (chn = track->channelLLHead; chn; chn = chn->channelLLNext)
+ {
+ if (chn->length > 0)
+ chn->length--;
+
+ if (!chn->flags.autoSweep && chn->sweepCounter < chn->sweepLength)
+ chn->sweepCounter++;
+ }
+
+ if (track->flags.noteFinishWait)
+ {
+ if (track->channelLLHead)
+ return 0;
+ track->flags.noteFinishWait = FALSE;
+ }
+
+ if (track->wait > 0)
+ {
+ track->wait--;
+ if (track->wait > 0)
+ return 0;
+ }
+
+ SeqCacheFetch(track->cur);
+
+ while (track->wait == 0 && !track->flags.noteFinishWait)
+ {
+ specialValueType = FALSE;
+ runCmd = TRUE;
+
+ cmd = TrackReadU8(track);
+
+ if (cmd == 0xA2)
+ {
+ cmd = TrackReadU8(track);
+ runCmd = track->flags.cmp;
+ }
+
+ if (cmd == 0xA0)
+ {
+ cmd = TrackReadU8(track);
+ valueType = SND_SEQ_VAL_RAN;
+ specialValueType = TRUE;
+ }
+
+ if (cmd == 0xA1)
+ {
+ cmd = TrackReadU8(track);
+ valueType = SND_SEQ_VAL_VAR;
+ specialValueType = TRUE;
+ }
+
+ if ((cmd & 0x80) == 0)
+ {
+ par = TrackReadU8(track);
+
+ length = TrackParseValue(track, player, specialValueType ? valueType : SND_SEQ_VAL_VLV);
+ midiKey = cmd + track->transpose;
+
+ if (!runCmd)
+ continue;
+
+ if (midiKey < 0)
+ midiKey = 0;
+ else if (midiKey > 127)
+ {
+ midiKey = 127;
+ }
+
+ if (!track->flags.muted && playNotes != 0)
+ {
+ TrackPlayNote(track, player, midiKey, par, (length > 0) ? length : -1);
+ }
+
+ track->portamentoKey = (u8)midiKey;
+
+ if (track->flags.noteWait)
+ {
+ track->wait = length;
+ if (length == 0)
+ {
+ track->flags.noteFinishWait = TRUE;
+ }
+ }
+
+ continue;
+ }
+
+ switch (cmd & 0xF0)
+ {
+ case 0x80:
+ par =
+ TrackParseValue(track, player, specialValueType ? valueType : SND_SEQ_VAL_VLV);
+ if (!runCmd)
+ break;
+
+ switch (cmd)
+ {
+ case 0x80:
+ track->wait = par;
+ break;
+ case 0x81:
+ if (par < 0x10000)
+ track->program = (u16)par;
+ break;
+ }
+ break;
+ case 0x90:
+ switch (cmd)
+ {
+ case 0x93:
+ {
+ u32 off;
+ struct SNDTrack *newTrack;
+
+ par = TrackReadU8(track);
+ off = TrackReadU24(track);
+ if (!runCmd)
+ break;
+
+ newTrack = PlayerGetTrack(player, par);
+ if (newTrack && newTrack != track)
+ {
+ TrackStop(newTrack, player);
+ TrackStart(newTrack, track->base, off);
+ }
+ }
+ break;
+ case 0x94:
+ {
+ u32 off = TrackReadU24(track);
+ if (!runCmd)
+ break;
+ track->cur = &track->base[off];
+ }
+ break;
+ case 0x95:
+ {
+ u32 off = TrackReadU24(track);
+ if (!runCmd)
+ break;
+
+ if (track->callStackDepth < SND_TRACK_MAX_CALL)
+ {
+ track->posCallStack[track->callStackDepth] = track->cur;
+ track->callStackDepth++;
+ track->cur = &track->base[off];
+ }
+ break;
+ }
+ }
+ break;
+ case 0xC0:
+ case 0xD0:
+ {
+ union
+ {
+ u8 _u8;
+ s8 _s8;
+ } par;
+ par._u8 = (u8)TrackParseValue(
+ track, player, specialValueType ? valueType : SND_SEQ_VAL_U8);
+ if (!runCmd)
+ break;
+
+ switch (cmd)
+ {
+ case 0xC1:
+ track->volume = par._u8;
+ break;
+ case 0xD5:
+ track->expression = par._u8;
+ break;
+ case 0xC2:
+ player->volume = par._u8;
+ break;
+ case 0xC5:
+ track->bendRange = par._u8;
+ break;
+ case 0xC6:
+ track->priority = par._u8;
+ break;
+ case 0xC7:
+ track->flags.noteWait = par._u8;
+ break;
+ case 0xCF:
+ track->portamentoTime = par._u8;
+ break;
+ case 0xCA:
+ track->mod.depth = par._u8;
+ break;
+ case 0xCB:
+ track->mod.speed = par._u8;
+ break;
+ case 0xCC:
+ track->mod.target = par._u8;
+ break;
+ case 0xCD:
+ track->mod.range = par._u8;
+ break;
+ case 0xD0:
+ track->envAttack = par._u8;
+ break;
+ case 0xD1:
+ track->envDecay = par._u8;
+ break;
+ case 0xD2:
+ track->envSustain = par._u8;
+ break;
+ case 0xD3:
+ track->envRelease = par._u8;
+ break;
+ case 0xD4:
+ if (track->callStackDepth < SND_TRACK_MAX_CALL)
+ {
+ track->posCallStack[track->callStackDepth] = track->cur;
+ track->loopCount[track->callStackDepth] = par._u8;
+ track->callStackDepth++;
+ }
+ break;
+ case 0xC8:
+ track->flags.tie = par._u8;
+ TrackReleaseChannels(track, player, -1);
+ TrackFreeChannels(track);
+ break;
+ case 0xD7:
+ TrackMute(track, player, par._u8);
+ break;
+ case 0xC9:
+ track->portamentoKey = (u8)(par._u8 + track->transpose);
+ track->flags.portamento = TRUE;
+ break;
+ case 0xCE:
+ track->flags.portamento = par._u8;
+ break;
+ case 0xC3:
+ track->transpose = par._s8;
+ break;
+ case 0xC4:
+ track->pitchBend = par._s8;
+ break;
+ case 0xC0:
+ track->pan = (s8)(par._u8 - 0x40);
+ break;
+ case 0xD6:
+ {
+ s16 *varPtr;
+
+ if (sPrintEnabled)
+ {
+ varPtr = PlayerGetVariablePointer(player, par._u8);
+ }
+ }
+ break;
+ }
+ }
+ break;
+ case 0xE0:
+ {
+ s16 par = (s16)TrackParseValue(
+ track, player, specialValueType ? valueType : SND_SEQ_VAL_U16);
+ if (!runCmd)
+ break;
+
+ switch (cmd)
+ {
+ case 0xE3:
+ track->sweepPitch = par;
+ break;
+ case 0xE1:
+ player->tempo = (u16)par;
+ break;
+ case 0xE0:
+ track->mod.delay = (u16)par;
+ break;
+ }
+ }
+ break;
+ case 0xB0:
+ {
+ int varNum = TrackReadU8(track);
+
+ s16 par = (s16)TrackParseValue(
+ track, player, specialValueType ? valueType : SND_SEQ_VAL_U16);
+ s16 *varPtr = PlayerGetVariablePointer(player, varNum);
+
+ if (!runCmd)
+ break;
+
+ if (varPtr == NULL)
+ break;
+
+ switch (cmd)
+ {
+ case 0xB0:
+ *varPtr = par;
+ break;
+ case 0xB1:
+ *varPtr += par;
+ break;
+ case 0xB2:
+ *varPtr -= par;
+ break;
+ case 0xB3:
+ *varPtr *= par;
+ break;
+ case 0xB4:
+ if (par != 0)
+ *varPtr /= par;
+ break;
+ case 0xB5:
+ if (par >= 0)
+ *varPtr <<= par;
+ else
+ *varPtr >>= -par;
+ break;
+ case 0xB6:
+ {
+ BOOL neg = FALSE;
+ if (par < 0)
+ {
+ neg = TRUE;
+ par = (s16)(-par);
+ }
+ s32 random = SND_CalcRandom();
+ random = (random * (par + 1)) >> 16;
+ if (neg)
+ random = -random;
+ *varPtr = (s16)random;
+ }
+ break;
+ case 0xB7:
+ break;
+ case 0xB8:
+ track->flags.cmp = *varPtr == par;
+ break;
+ case 0xB9:
+ track->flags.cmp = *varPtr >= par;
+ break;
+ case 0xBA:
+ track->flags.cmp = *varPtr > par;
+ break;
+ case 0xBB:
+ track->flags.cmp = *varPtr <= par;
+ break;
+ case 0xBC:
+ track->flags.cmp = *varPtr < par;
+ break;
+ case 0xBD:
+ track->flags.cmp = *varPtr != par;
+ break;
+ }
+ }
+ break;
+ case 0xF0:
+ if (!runCmd)
+ break;
+
+ switch (cmd)
+ {
+ case 0xFD:
+ if (track->callStackDepth != 0)
+ {
+ track->callStackDepth--;
+ track->cur = track->posCallStack[track->callStackDepth];
+ }
+ break;
+ case 0xFC:
+ {
+ if (track->callStackDepth == 0)
+ break;
+
+ // gosh, this was nasty to figure out
+ u8 loopCount = track->loopCount[track->callStackDepth - 1];
+ if (loopCount != 0)
+ {
+ loopCount--;
+ if (loopCount == 0)
+ {
+ track->callStackDepth--;
+ break;
+ }
+ }
+ track->loopCount[track->callStackDepth - 1] = loopCount;
+ track->cur = track->posCallStack[track->callStackDepth - 1];
+ }
+ break;
+ case 0xFE:
+ break;
+ case 0xFF:
+ return -1;
+ }
+ break;
+ }
+ }
+
+ return 0;
+}
+
+static BOOL PlayerStepTicks(struct SNDPlayer *player, u32 ticks)
+{
+ BOOL isPlaying = FALSE;
+
+ for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++)
+ {
+ struct SNDTrack *trk = PlayerGetTrack(player, i);
+
+ if (trk && trk->cur)
+ {
+ if (TrackStepTicks(trk, player, i, ticks))
+ PlayerStopTrack(player, i);
+ else
+ isPlaying = TRUE;
+ }
+ }
+
+ return !isPlaying;
+}
+
+static s16 *PlayerGetVariablePointer(const struct SNDPlayer *player, int var)
+{
+ if (SNDi_SharedWork == NULL)
+ return NULL;
+ else if (var < 16)
+ {
+ return &SNDi_SharedWork->players[player->playerId].localVars[var];
+ }
+ else
+ {
+ return &SNDi_SharedWork->globalVars[var - 16];
+ }
+}
+
+static int AllocateTrack(void)
+{
+ for (int i = 0; i < SND_TRACK_COUNT; i++)
+ {
+ if (!SNDi_Work.tracks[i].flags.active)
+ {
+ SNDi_Work.tracks[i].flags.active = TRUE;
+ return i;
+ }
+ }
+
+ return -1;
+}
+
+static void TrackMute(struct SNDTrack *track, struct SNDPlayer *player, int muteMode)
+{
+ switch (muteMode)
+ {
+ case SND_TRACK_MUTE_MODE_UNMUTE:
+ track->flags.muted = FALSE;
+ break;
+ case SND_TRACK_MUTE_MODE_MUTE:
+ track->flags.muted = TRUE;
+ break;
+ case SND_TRACK_MUTE_MODE_MUTE_RELEASE:
+ track->flags.muted = TRUE;
+ TrackReleaseChannels(track, player, -1);
+ break;
+ case SND_TRACK_MUTE_MODE_MUTE_STOP:
+ track->flags.muted = TRUE;
+ TrackReleaseChannels(track, player, 127);
+ TrackFreeChannels(track);
+ break;
+ }
+}
diff --git a/arm7/lib/src/SND_util.c b/arm7/lib/src/SND_util.c
new file mode 100644
index 00000000..5c0b220b
--- /dev/null
+++ b/arm7/lib/src/SND_util.c
@@ -0,0 +1,109 @@
+#include "SND_util.h"
+
+#include "syscall.h"
+
+// TODO remove this extern once the static const definition of it is here
+extern s8 sLfoSinTable[0x21];
+
+u16 SND_CalcTimer(int timer, int pitch)
+{
+ int octave = 0;
+ int pitch_normalized = -pitch;
+
+ while (pitch_normalized < 0)
+ {
+ octave--;
+ pitch_normalized += 768;
+ }
+
+ while (pitch_normalized >= 768)
+ {
+ octave++;
+ pitch_normalized -= 768;
+ }
+
+ u64 result = SVC_GetPitchTable(pitch_normalized);
+
+ result += 0x10000;
+ result *= timer;
+
+ int shift = octave - 16;
+
+ if (shift <= 0)
+ {
+ shift = -shift;
+ result >>= shift;
+ }
+ else if (shift < 32)
+ {
+ // clamp in case timer value overflows
+ u64 tmp = result & ~0uLL << (32 - shift);
+ if (tmp != 0)
+ return 0xFFFF;
+ result <<= shift;
+ }
+ else
+ {
+ return 0xFFFF;
+ }
+
+ if (result < 0x10)
+ result = 0x10;
+ else if (result > 0xFFFF)
+ result = 0xFFFF;
+
+ return (u16)result;
+}
+
+u16 SND_CalcChannelVolume(int value)
+{
+ if (value < SND_VOL_DB_MIN)
+ value = SND_VOL_DB_MIN;
+ else if (value > 0)
+ value = 0;
+
+ int result = SVC_GetVolumeTable(value + (-SND_VOL_DB_MIN));
+ int div;
+
+ if (value < -240)
+ div = 3;
+ else if (value < -120)
+ div = 2;
+ else if (value < -60)
+ div = 1;
+ else
+ div = 0;
+
+ return (u16)(result | (div << 8));
+}
+
+s8 SND_SinIdx(int x)
+{
+ // BUG: UB for out of range values
+
+ if (x < 0x20)
+ {
+ return sLfoSinTable[x];
+ }
+ else if (x < 0x40)
+ {
+ return sLfoSinTable[0x40 - x];
+ }
+ else if (x < 0x60)
+ {
+ return (s8)(-sLfoSinTable[x - 0x40]);
+ }
+ else
+ {
+ return (s8)(-sLfoSinTable[0x20 - (x - 0x60)]);
+ }
+}
+
+u16 SND_CalcRandom(void)
+{
+ static u32 state = 0x12345678;
+
+ // values from "Numerical Recipes"
+ state = state * 1664525u + 1013904223u;
+ return (u16)(state >> 16u);
+}
diff --git a/arm7/lib/src/SND_work.c b/arm7/lib/src/SND_work.c
new file mode 100644
index 00000000..2256ee3f
--- /dev/null
+++ b/arm7/lib/src/SND_work.c
@@ -0,0 +1,41 @@
+#include "SND_work.h"
+
+#include "SND_capture.h"
+#include "SND_channel.h"
+#include "SND_exChannel.h"
+
+struct SNDWork SNDi_Work;
+struct SNDSharedWork *SNDi_SharedWork;
+
+void SND_SetPlayerLocalVariable(int player, int var, s16 value)
+{
+ SNDi_SharedWork->players[player].localVars[var] = value;
+}
+
+void SND_SetPlayerGlobalVariable(int var, s16 value)
+{
+ SNDi_SharedWork->globalVars[var] = value;
+}
+
+void SND_UpdateSharedWork(void)
+{
+ u16 channelActiveMask = 0;
+ u16 channelCaptureMask = 0;
+
+ if (SNDi_SharedWork == NULL)
+ return;
+
+ for (s32 i = 0; i < SND_CHANNEL_COUNT; i++)
+ {
+ if (SND_IsChannelActive(i))
+ channelActiveMask |= 1 << i;
+ }
+
+ if (SND_IsCaptureActive(0))
+ channelCaptureMask |= 0x1;
+ if (SND_IsCaptureActive(1))
+ channelCaptureMask |= 0x2;
+
+ SNDi_SharedWork->channelStatus = channelActiveMask;
+ SNDi_SharedWork->captureStatus = channelCaptureMask;
+}
diff --git a/arm9/lib/NitroSDK/include/PXI_fifo.h b/arm9/lib/NitroSDK/include/PXI_fifo.h
index b1ca33f3..815da961 100644
--- a/arm9/lib/NitroSDK/include/PXI_fifo.h
+++ b/arm9/lib/NitroSDK/include/PXI_fifo.h
@@ -4,29 +4,6 @@
#include "nitro/PXI_fifo_shared.h"
#include "nitro/types.h"
-typedef enum
-{
- PXI_FIFO_SUCCESS = 0,
- PXI_FIFO_FAIL_SEND_ERR = -1,
- PXI_FIFO_FAIL_SEND_FULL = -2,
- PXI_FIFO_FAIL_RECV_ERR = -3,
- PXI_FIFO_FAIL_RECV_EMPTY = -4,
- PXI_FIFO_NO_CALLBACK_ENTRY = -5
-} PXIFifoStatus;
-
-typedef void (*PXIFifoCallback) (PXIFifoTag tag, u32 data, BOOL err);
-
-typedef union
-{
- struct
- {
- u32 tag:5;
- u32 err:1;
- u32 data:26;
- } e;
- u32 raw;
-} PXIFifoMessage;
-
void PXI_InitFifo(void);
void PXI_SetFifoRecvCallback(s32 fifotag, PXIFifoCallback callback);
BOOL PXI_IsCallbackReady(s32 fifotag, PXIProc proc);
diff --git a/arm9/lib/NitroSDK/include/SND_bank.h b/arm9/lib/NitroSDK/include/SND_bank.h
index b9000d57..58fd8307 100644
--- a/arm9/lib/NitroSDK/include/SND_bank.h
+++ b/arm9/lib/NitroSDK/include/SND_bank.h
@@ -4,84 +4,7 @@
#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
+#include "nitro/SND_bank_shared.h"
void SND_AssignWaveArc(struct SNDBankData *bankData, s32 index, struct SNDWaveArc *waveArc);
void SND_DestroyBank(struct SNDBankData *bankData);
diff --git a/arm9/lib/NitroSDK/include/SND_command.h b/arm9/lib/NitroSDK/include/SND_command.h
index ff392833..4d44c583 100644
--- a/arm9/lib/NitroSDK/include/SND_command.h
+++ b/arm9/lib/NitroSDK/include/SND_command.h
@@ -1,55 +1,9 @@
#ifndef GUARD_SND_COMMAND_H
#define GUARD_SND_COMMAND_H
-#include "global.h"
+#include "nitro/SND_command_shared.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
+#include "nitro/types.h"
void SND_CommandInit(void);
const struct SNDCommand *SND_RecvCommandReply(u32 flags);
diff --git a/arm9/lib/NitroSDK/include/SND_main.h b/arm9/lib/NitroSDK/include/SND_main.h
index 8fa9364e..aa476bae 100644
--- a/arm9/lib/NitroSDK/include/SND_main.h
+++ b/arm9/lib/NitroSDK/include/SND_main.h
@@ -9,18 +9,4 @@ 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
-} SNDBinaryBlockHeader; // size = 0x8
-
#endif // GUARD_SND_MAIN_H
diff --git a/arm9/lib/NitroSDK/include/SND_work.h b/arm9/lib/NitroSDK/include/SND_work.h
index a8a3d62b..f3ed08c8 100644
--- a/arm9/lib/NitroSDK/include/SND_work.h
+++ b/arm9/lib/NitroSDK/include/SND_work.h
@@ -6,51 +6,6 @@
#include "SND_main.h"
#include "nitro/SND_work_shared.h"
-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);
diff --git a/include/nitro/PXI_fifo_shared.h b/include/nitro/PXI_fifo_shared.h
index 297625a1..a4ed454f 100644
--- a/include/nitro/PXI_fifo_shared.h
+++ b/include/nitro/PXI_fifo_shared.h
@@ -13,6 +13,8 @@
#ifndef POKEDIAMOND_PXI_FIFO_SHARED_H
#define POKEDIAMOND_PXI_FIFO_SHARED_H
+#include "nitro/types.h"
+
typedef enum
{
PXI_PROC_ARM9 = 0,
@@ -40,4 +42,27 @@ typedef enum {
PXI_MAX_FIFO_TAG = 32 // MAX FIFO TAG
} PXIFifoTag;
+typedef enum
+{
+ PXI_FIFO_SUCCESS = 0,
+ PXI_FIFO_FAIL_SEND_ERR = -1,
+ PXI_FIFO_FAIL_SEND_FULL = -2,
+ PXI_FIFO_FAIL_RECV_ERR = -3,
+ PXI_FIFO_FAIL_RECV_EMPTY = -4,
+ PXI_FIFO_NO_CALLBACK_ENTRY = -5
+} PXIFifoStatus;
+
+typedef union
+{
+ struct
+ {
+ u32 tag:5;
+ u32 err:1;
+ u32 data:26;
+ } e;
+ u32 raw;
+} PXIFifoMessage;
+
+typedef void (*PXIFifoCallback) (PXIFifoTag tag, u32 data, BOOL err);
+
#endif //POKEDIAMOND_PXI_FIFO_SHARED_H
diff --git a/include/nitro/SND_alarm_shared.h b/include/nitro/SND_alarm_shared.h
index a1e8ed9d..2c9e02e4 100644
--- a/include/nitro/SND_alarm_shared.h
+++ b/include/nitro/SND_alarm_shared.h
@@ -13,18 +13,19 @@
#ifndef POKEDIAMOND_SND_ALARM_SHARED_H
#define POKEDIAMOND_SND_ALARM_SHARED_H
-#include "nitro/OS_tick_shared.h"
#include "nitro/OS_alarm_shared.h"
+#include "nitro/OS_tick_shared.h"
-struct SNDAlarm {
- u8 enable; // 0x00
- u8 id; // 0x01
- u16 unk_2; // 0x02
- OSTick tick; // 0x04
- OSTick period; // 0x0C
- OSAlarm alarm; // 0x14
-}; // size = 0x40
+struct SNDAlarm
+{
+ u8 enable; // 0x00
+ u8 id; // 0x01
+ u16 unk_2; // 0x02
+ OSTick tick; // 0x04
+ OSTick period; // 0x0C
+ OSAlarm alarm; // 0x14
+}; // size = 0x40
#define SND_ALARM_COUNT 8
-#endif //POKEDIAMOND_SND_ALARM_SHARED_H
+#endif // POKEDIAMOND_SND_ALARM_SHARED_H
diff --git a/include/nitro/SND_bank_shared.h b/include/nitro/SND_bank_shared.h
new file mode 100644
index 00000000..02fe7bba
--- /dev/null
+++ b/include/nitro/SND_bank_shared.h
@@ -0,0 +1,97 @@
+#ifndef GUARD_SND_BANK_SHARED_H
+#define GUARD_SND_BANK_SHARED_H
+
+#include "nitro/types.h"
+
+#include "nitro/SND_exChannel_shared.h"
+#include "nitro/SND_main_shared.h"
+
+#define SND_INST_MAX_KEYSPLIT 8
+
+#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_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 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 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 SNDInstPos
+{
+ u32 program; // 0x0
+ u32 index; // 0x4
+}; // size = 0x8
+
+struct SNDWaveData
+{
+ struct SNDWaveParam param; // 0x0
+ u8 sampleData[]; // 0xC
+}; // size = 0xC
+
+#endif // GUARD_SND_BANK_SHARED_H
diff --git a/include/nitro/SND_command_shared.h b/include/nitro/SND_command_shared.h
new file mode 100644
index 00000000..9e6e3b30
--- /dev/null
+++ b/include/nitro/SND_command_shared.h
@@ -0,0 +1,55 @@
+#ifndef GUARD_SND_COMMAND_SHARED_H
+#define GUARD_SND_COMMAND_SHARED_H
+
+#include "nitro/types.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
+
+#endif // GUARD_SND_COMMAND_SHARED_H
diff --git a/include/nitro/SND_exChannel_shared.h b/include/nitro/SND_exChannel_shared.h
new file mode 100644
index 00000000..8c01b5cc
--- /dev/null
+++ b/include/nitro/SND_exChannel_shared.h
@@ -0,0 +1,114 @@
+#ifndef GUARD_SND_EXCHANNEL_SHARED_H
+#define GUARD_SND_EXCHANNEL_SHARED_H
+
+#include "nitro/types.h"
+
+#define SND_ENV_ATTACK 0
+#define SND_ENV_DECAY 1
+#define SND_ENV_SUSTAIN 2
+#define SND_ENV_RELEASE 3
+
+#define SND_CHN_TYPE_PCM 0
+#define SND_CHN_TYPE_PSG 1
+#define SND_CHN_TYPE_NOISE 2
+
+#define SND_CHN_SYNC_START 0x1
+#define SND_CHN_SYNC_STOP 0x2
+#define SND_CHN_SYNC_TIMER 0x4
+#define SND_CHN_SYNC_VOLUME 0x8
+#define SND_CHN_SYNC_PAN 0x10
+
+#define SND_LFO_PITCH 0
+#define SND_LFO_VOLUME 1
+#define SND_LFO_PAN 2
+
+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;
+
+typedef void (*SNDExChannelCallback)(struct SNDExChannel *chn, int status, void *userData);
+
+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;
+ s32 dutyCycle;
+ }; // 0x44
+
+ SNDExChannelCallback callback; // 0x48
+ void *callbackUserData; // 0x4C
+
+ struct SNDExChannel *channelLLNext; // 0x50
+}; // size = 0x54
+
+#endif // GUARD_SND_EXCHANNEL_SHARED_H
diff --git a/include/nitro/SND_main_shared.h b/include/nitro/SND_main_shared.h
index d77273ed..52addda0 100644
--- a/include/nitro/SND_main_shared.h
+++ b/include/nitro/SND_main_shared.h
@@ -13,164 +13,22 @@
#ifndef POKEDIAMOND_SND_MAIN_SHARED_H
#define POKEDIAMOND_SND_MAIN_SHARED_H
-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 SNDBankData;
-
-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 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 //POKEDIAMOND_SND_MAIN_SHARED_H
- \ No newline at end of file
+#include "nitro/types.h"
+
+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
+} SNDBinaryBlockHeader; // size = 0x8
+
+#endif // POKEDIAMOND_SND_MAIN_SHARED_H
diff --git a/include/nitro/SND_seq_shared.h b/include/nitro/SND_seq_shared.h
new file mode 100644
index 00000000..00a0ea74
--- /dev/null
+++ b/include/nitro/SND_seq_shared.h
@@ -0,0 +1,90 @@
+#ifndef GUARD_SND_SEQ_SHARED_H
+#define GUARD_SND_SEQ_SHARED_H
+
+#include "nitro/SND_exChannel_shared.h"
+
+#define SND_TRACK_COUNT_PER_PLAYER 16
+#define SND_INVALID_TRACK_INDEX 0xFF
+
+struct SNDBankData;
+
+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 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 *base; // 0x24
+ const u8 *cur; // 0x28
+ const u8 *posCallStack[SND_TRACK_MAX_CALL]; // 0x2C
+ u8 loopCount[SND_TRACK_MAX_CALL]; // 0x38
+ u8 callStackDepth; // 0x3B
+
+ struct SNDExChannel *channelLLHead; // 0x3C
+}; // size = 0x40
+
+#endif // GUARD_SND_SEQ_SHARED_H
diff --git a/include/nitro/SND_work_shared.h b/include/nitro/SND_work_shared.h
index 0de3981e..ec2d3c84 100644
--- a/include/nitro/SND_work_shared.h
+++ b/include/nitro/SND_work_shared.h
@@ -14,33 +14,89 @@
#define POKEDIAMOND_SND_WORK_SHARED_H
#include "nitro/SND_alarm_shared.h"
+#include "nitro/SND_bank_shared.h"
#include "nitro/SND_main_shared.h"
-
+#include "nitro/SND_seq_shared.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 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
extern struct SNDWork SNDi_Work;
extern struct SNDSharedWork *SNDi_SharedWork;
-
- #endif //POKEDIAMOND_SND_WORK_SHARED_H
+
+#endif // POKEDIAMOND_SND_WORK_SHARED_H