summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm7/arm7.lsf22
-rw-r--r--arm7/asm/EXI_genPort.s44
-rw-r--r--arm7/asm/MI_dma.s74
-rw-r--r--arm7/asm/MI_memory.s221
-rw-r--r--arm7/asm/MI_swap.s9
-rw-r--r--arm7/asm/PAD_xyButton.s50
-rw-r--r--arm7/asm/PXI_fifo.s238
-rw-r--r--arm7/asm/PXI_init.s10
-rw-r--r--arm7/asm/SND.s484
-rw-r--r--arm7/asm/SND_alarm.s138
-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.s629
-rw-r--r--arm7/asm/SND_exChannel.s645
-rw-r--r--arm7/asm/SND_lfo.s77
-rw-r--r--arm7/asm/SND_lockChannel.s161
-rw-r--r--arm7/asm/SND_main.s171
-rw-r--r--arm7/asm/SND_seq.s549
-rw-r--r--arm7/asm/SND_unk_037FD440.s1603
-rw-r--r--arm7/asm/SND_util.s184
-rw-r--r--arm7/asm/SND_wave.s43
-rw-r--r--arm7/asm/SND_work.s70
-rw-r--r--arm7/asm/dtcm.s5800
-rw-r--r--arm7/global.inc97
25 files changed, 6010 insertions, 5800 deletions
diff --git a/arm7/arm7.lsf b/arm7/arm7.lsf
index 99082905..65b9a5c8 100644
--- a/arm7/arm7.lsf
+++ b/arm7/arm7.lsf
@@ -33,6 +33,28 @@ Autoload WRAM
Object OS_system.o
Object OS_reset.o
Object OS_terminate_proc.o
+ Object MI_dma.o
+ Object MI_memory.o
+ Object MI_swap.o
+ Object PXI_init.o
+ Object PXI_fifo.o
+ Object EXI_genPort.o
+ Object PAD_xyButton.o
+ Object SND.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
+ Object SND_alarm.o
+ Object SND_command.o
Object dtcm.o
Object libsyscall.o
Object dtcm2.o
diff --git a/arm7/asm/EXI_genPort.s b/arm7/asm/EXI_genPort.s
new file mode 100644
index 00000000..ff2a46f7
--- /dev/null
+++ b/arm7/asm/EXI_genPort.s
@@ -0,0 +1,44 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .text
+
+ arm_func_start EXIi_SelectRcnt
+EXIi_SelectRcnt: ; 0x037FB8F0
+ mov r1, r0
+ mov r0, #49152 ; 0xc000
+ mov r1, r1, lsl #16
+ mov r1, r1, lsr #16
+ ldr ip, _037FB908 ; =EXIi_SetBitRcnt0L
+ bx ip
+_037FB908: .word EXIi_SetBitRcnt0L
+
+ arm_func_start EXIi_SetBitRcnt0L
+EXIi_SetBitRcnt0L: ; 0x037FB90C
+ mvn r3, r0
+ ldr r2, _037FB928 ; =0x04000134
+ ldrh r0, [r2]
+ and r0, r3, r0
+ orr r0, r1, r0
+ strh r0, [r2]
+ bx lr
+_037FB928: .word 0x04000134
+
+ arm_func_start FUN_037FB92C
+FUN_037FB92C: ; 0x037FB92C
+ stmdb sp!, {r4, lr}
+ mov r4, #0
+ mov r0, #32768 ; 0x8000
+ bl EXIi_SelectRcnt
+ ldr r0, _037FB964 ; =0x04000136
+ ldrh r1, [r0]
+ ands r0, r1, #128 ; 0x80
+ movne r4, #32768 ; 0x8000
+ and r0, r1, #11
+ orr r1, r4, r0, lsl #10
+ ldr r0, _037FB968 ; =0x027FFFA8
+ strh r1, [r0]
+ ldmia sp!, {r4, lr}
+ bx lr
+_037FB964: .word 0x04000136
+_037FB968: .word 0x027FFFA8
diff --git a/arm7/asm/MI_dma.s b/arm7/asm/MI_dma.s
new file mode 100644
index 00000000..8cbc8cb5
--- /dev/null
+++ b/arm7/asm/MI_dma.s
@@ -0,0 +1,74 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .text
+
+ arm_func_start MI_StopDma
+MI_StopDma: ; 0x037FB20C
+ stmdb sp!, {r4, lr}
+ mov r4, r0
+ bl OS_DisableInterrupts
+ mov r1, #6
+ mul r1, r4, r1
+ add r1, r1, #5
+ mov r1, r1, lsl #1
+ add r1, r1, #67108864 ; 0x4000000
+ ldrh r2, [r1, #176] ; 0xb0
+ bic r2, r2, #12800 ; 0x3200
+ strh r2, [r1, #176] ; 0xb0
+ ldrh r2, [r1, #176] ; 0xb0
+ bic r2, r2, #32768 ; 0x8000
+ strh r2, [r1, #176] ; 0xb0
+ ldrh r2, [r1, #176] ; 0xb0
+ ldrh r1, [r1, #176] ; 0xb0
+ cmp r4, #0
+ bne _037FB27C
+ mov r1, #12
+ mul r3, r4, r1
+ ldr r1, _037FB288 ; =0x040000B0
+ add r4, r3, r1
+ mov r2, #0
+ add r1, r3, #67108864 ; 0x4000000
+ str r2, [r1, #176] ; 0xb0
+ str r2, [r4, #4]
+ ldr r1, _037FB28C ; =0x81400001
+ str r1, [r4, #8]
+_037FB27C:
+ bl OS_RestoreInterrupts
+ ldmia sp!, {r4, lr}
+ bx lr
+_037FB288: .word 0x040000B0
+_037FB28C: .word 0x81400001
+
+ arm_func_start MI_WaitDma
+MI_WaitDma: ; 0x037FB290
+ stmdb sp!, {r4, lr}
+ mov r4, r0
+ bl OS_DisableInterrupts
+ mov r1, #3
+ mul r1, r4, r1
+ add r2, r1, #2
+ ldr r1, _037FB2F8 ; =0x040000B0
+ add r2, r1, r2, lsl #2
+_037FB2B0:
+ ldr r1, [r2]
+ ands r1, r1, #-2147483648 ; 0x80000000
+ bne _037FB2B0
+ cmp r4, #0
+ bne _037FB2EC
+ mov r1, #12
+ mul r3, r4, r1
+ ldr r1, _037FB2F8 ; =0x040000B0
+ add r4, r3, r1
+ mov r2, #0
+ add r1, r3, #67108864 ; 0x4000000
+ str r2, [r1, #176] ; 0xb0
+ str r2, [r4, #4]
+ ldr r1, _037FB2FC ; =0x81400001
+ str r1, [r4, #8]
+_037FB2EC:
+ bl OS_RestoreInterrupts
+ ldmia sp!, {r4, lr}
+ bx lr
+_037FB2F8: .word 0x040000B0
+_037FB2FC: .word 0x81400001
diff --git a/arm7/asm/MI_memory.s b/arm7/asm/MI_memory.s
new file mode 100644
index 00000000..7f3fdef2
--- /dev/null
+++ b/arm7/asm/MI_memory.s
@@ -0,0 +1,221 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .text
+
+ arm_func_start MIi_CpuClear16
+MIi_CpuClear16: ; 0x037FB300
+ mov r3, #0
+_037FB304:
+ cmp r3, r2
+ strlth r0, [r1, r3]
+ addlt r3, r3, #2
+ blt _037FB304
+ bx lr
+
+ arm_func_start MIi_CpuCopy16
+MIi_CpuCopy16: ; 0x037FB318
+ mov ip, #0
+_037FB31C:
+ cmp ip, r2
+ ldrlth r3, [r0, ip]
+ strlth r3, [r1, ip]
+ addlt ip, ip, #2
+ blt _037FB31C
+ bx lr
+
+ arm_func_start MIi_CpuClear32
+MIi_CpuClear32: ; 0x037FB334
+ add ip, r1, r2
+_037FB338:
+ cmp r1, ip
+ stmltia r1!, {r0}
+ blt _037FB338
+ bx lr
+
+ arm_func_start MIi_CpuCopy32
+MIi_CpuCopy32: ; 0x037FB348
+ add ip, r1, r2
+_037FB34C:
+ cmp r1, ip
+ ldmltia r0!, {r2}
+ stmltia r1!, {r2}
+ blt _037FB34C
+ bx lr
+
+ arm_func_start MIi_CpuClearFast
+MIi_CpuClearFast: ; 0x037FB360
+ stmdb sp!, {r4, r5, r6, r7, r8, r9}
+ add r9, r1, r2
+ mov ip, r2, lsr #5
+ add ip, r1, ip, lsl #5
+ mov r2, r0
+ mov r3, r2
+ mov r4, r2
+ mov r5, r2
+ mov r6, r2
+ mov r7, r2
+ mov r8, r2
+_037FB38C:
+ cmp r1, ip
+ stmltia r1!, {r0, r2, r3, r4, r5, r6, r7, r8}
+ blt _037FB38C
+_037FB398:
+ cmp r1, r9
+ stmltia r1!, {r0}
+ blt _037FB398
+ ldmia sp!, {r4, r5, r6, r7, r8, r9}
+ bx lr
+
+ arm_func_start MIi_CpuCopyFast
+MIi_CpuCopyFast: ; 0x037FB3AC
+ stmdb sp!, {r4, r5, r6, r7, r8, r9, sl}
+ add sl, r1, r2
+ mov ip, r2, lsr #5
+ add ip, r1, ip, lsl #5
+_037FB3BC:
+ cmp r1, ip
+ ldmltia r0!, {r2, r3, r4, r5, r6, r7, r8, r9}
+ stmltia r1!, {r2, r3, r4, r5, r6, r7, r8, r9}
+ blt _037FB3BC
+_037FB3CC:
+ cmp r1, sl
+ ldmltia r0!, {r2}
+ stmltia r1!, {r2}
+ blt _037FB3CC
+ ldmia sp!, {r4, r5, r6, r7, r8, r9, sl}
+ bx lr
+
+ arm_func_start MI_CpuFill8
+MI_CpuFill8: ; 0x037FB3E4
+ cmp r2, #0
+ bxeq lr
+ tst r0, #1
+ beq _037FB410
+ ldrh ip, [r0, #-1]
+ and ip, ip, #255 ; 0xff
+ orr r3, ip, r1, lsl #8
+ strh r3, [r0, #-1]
+ add r0, r0, #1
+ subs r2, r2, #1
+ bxeq lr
+_037FB410:
+ cmp r2, #2
+ bcc _037FB458
+ orr r1, r1, r1, lsl #8
+ tst r0, #2
+ beq _037FB430
+ strh r1, [r0], #2
+ subs r2, r2, #2
+ bxeq lr
+_037FB430:
+ orr r1, r1, r1, lsl #16
+ bics r3, r2, #3
+ beq _037FB450
+ sub r2, r2, r3
+ add ip, r3, r0
+_037FB444:
+ str r1, [r0], #4
+ cmp r0, ip
+ bcc _037FB444
+_037FB450:
+ tst r2, #2
+ strneh r1, [r0], #2
+_037FB458:
+ tst r2, #1
+ bxeq lr
+ ldrh r3, [r0]
+ and r3, r3, #65280 ; 0xff00
+ and r1, r1, #255 ; 0xff
+ orr r1, r1, r3
+ strh r1, [r0]
+ bx lr
+
+ arm_func_start MI_CpuCopy8
+MI_CpuCopy8: ; 0x037FB478
+ cmp r2, #0
+ bxeq lr
+ tst r1, #1
+ beq _037FB4B8
+ ldrh ip, [r1, #-1]
+ and ip, ip, #255 ; 0xff
+ tst r0, #1
+ ldrneh r3, [r0, #-1]
+ movne r3, r3, lsr #8
+ ldreqh r3, [r0]
+ orr r3, ip, r3, lsl #8
+ strh r3, [r1, #-1]
+ add r0, r0, #1
+ add r1, r1, #1
+ subs r2, r2, #1
+ bxeq lr
+_037FB4B8:
+ eor ip, r1, r0
+ tst ip, #1
+ beq _037FB50C
+ bic r0, r0, #1
+ ldrh ip, [r0], #2
+ mov r3, ip, lsr #8
+ subs r2, r2, #2
+ bcc _037FB4F0
+_037FB4D8:
+ ldrh ip, [r0], #2
+ orr ip, r3, ip, lsl #8
+ strh ip, [r1], #2
+ mov r3, ip, lsr #16
+ subs r2, r2, #2
+ bcs _037FB4D8
+_037FB4F0:
+ tst r2, #1
+ bxeq lr
+ ldrh ip, [r1]
+ and ip, ip, #65280 ; 0xff00
+ orr ip, ip, r3
+ strh ip, [r1]
+ bx lr
+_037FB50C:
+ tst ip, #2
+ beq _037FB538
+ bics r3, r2, #1
+ beq _037FB584
+ sub r2, r2, r3
+ add ip, r3, r1
+_037FB524:
+ ldrh r3, [r0], #2
+ strh r3, [r1], #2
+ cmp r1, ip
+ bcc _037FB524
+ b _037FB584
+_037FB538:
+ cmp r2, #2
+ bcc _037FB584
+ tst r1, #2
+ beq _037FB558
+ ldrh r3, [r0], #2
+ strh r3, [r1], #2
+ subs r2, r2, #2
+ bxeq lr
+_037FB558:
+ bics r3, r2, #3
+ beq _037FB578
+ sub r2, r2, r3
+ add ip, r3, r1
+_037FB568:
+ ldr r3, [r0], #4
+ str r3, [r1], #4
+ cmp r1, ip
+ bcc _037FB568
+_037FB578:
+ tst r2, #2
+ ldrneh r3, [r0], #2
+ strneh r3, [r1], #2
+_037FB584:
+ tst r2, #1
+ bxeq lr
+ ldrh r2, [r1]
+ ldrh r0, [r0]
+ and r2, r2, #65280 ; 0xff00
+ and r0, r0, #255 ; 0xff
+ orr r0, r2, r0
+ strh r0, [r1]
+ bx lr
diff --git a/arm7/asm/MI_swap.s b/arm7/asm/MI_swap.s
new file mode 100644
index 00000000..a5f08796
--- /dev/null
+++ b/arm7/asm/MI_swap.s
@@ -0,0 +1,9 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .text
+
+ arm_func_start MI_SwapWord
+MI_SwapWord: ; 0x037FB5A8
+ swp r0, r0, [r1]
+ bx lr
diff --git a/arm7/asm/PAD_xyButton.s b/arm7/asm/PAD_xyButton.s
new file mode 100644
index 00000000..ff5d5e4e
--- /dev/null
+++ b/arm7/asm/PAD_xyButton.s
@@ -0,0 +1,50 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .text
+
+ arm_func_start PAD_InitXYButton
+PAD_InitXYButton: ; 0x037FB96C
+ stmfd sp!, {lr}
+ sub sp, sp, #12
+ bl OS_IsTickAvailable
+ cmp r0, #0
+ beq _037FB98C
+ bl OS_IsAlarmAvailable
+ cmp r0, #0
+ bne _037FB994
+_037FB98C:
+ mov r0, #0
+ b _037FB9F0
+_037FB994:
+ ldr r0, _037FB9FC ; =PADi_XYButtonAvailable
+ ldr r0, [r0]
+ cmp r0, #0
+ movne r0, #0
+ bne _037FB9F0
+ ldr r0, _037FBA00 ; =_038079E0
+ bl OS_CreateAlarm
+ bl OS_GetTick
+ mov r2, r0
+ ldr r0, _037FBA04 ; =FUN_037FB92C
+ str r0, [sp, #4]
+ mov r0, #0
+ str r0, [sp, #8]
+ ldr r3, _037FBA08 ; =0x0000082E
+ str r0, [sp]
+ ldr r0, _037FBA00 ; =_038079E0
+ adds ip, r2, r3
+ adc r2, r1, #0
+ mov r1, ip
+ bl OS_SetPeriodicAlarm
+ mov r0, #1
+ ldr r1, _037FB9FC ; =PADi_XYButtonAvailable
+ str r0, [r1]
+_037FB9F0:
+ add sp, sp, #12
+ ldmia sp!, {lr}
+ bx lr
+_037FB9FC: .word PADi_XYButtonAvailable
+_037FBA00: .word _038079E0
+_037FBA04: .word FUN_037FB92C
+_037FBA08: .word 0x0000082E
diff --git a/arm7/asm/PXI_fifo.s b/arm7/asm/PXI_fifo.s
new file mode 100644
index 00000000..9824f7a9
--- /dev/null
+++ b/arm7/asm/PXI_fifo.s
@@ -0,0 +1,238 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .text
+
+ arm_func_start PXIi_HandlerRecvFifoNotEmpty
+PXIi_HandlerRecvFifoNotEmpty: ; 0x037FB5BC
+ stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
+ sub sp, sp, #8
+ ldr sl, _037FB6D0 ; =0x04000184
+ ldr r5, _037FB6D4 ; =_0380795C
+ mov r7, #68157440 ; 0x4100000
+ mov r6, #0
+ mvn r8, #3
+ mvn r9, #2
+ ldr r4, _037FB6D8 ; =0x04000188
+_037FB5E0:
+ ldrh r0, [sl]
+ ands r0, r0, #16384 ; 0x4000
+ ldrneh r0, [sl]
+ orrne r0, r0, #49152 ; 0xc000
+ strneh r0, [sl]
+ movne r1, r9
+ bne _037FB628
+ bl OS_DisableInterrupts
+ ldrh r1, [sl]
+ ands r1, r1, #256 ; 0x100
+ beq _037FB618
+ bl OS_RestoreInterrupts
+ mov r1, r8
+ b _037FB628
+_037FB618:
+ ldr r1, [r7]
+ str r1, [sp]
+ bl OS_RestoreInterrupts
+ mov r1, r6
+_037FB628:
+ cmp r1, r8
+ beq _037FB6C4
+ mvn r0, #2
+ cmp r1, r0
+ beq _037FB5E0
+ ldr r2, [sp]
+ mov r0, r2, lsl #27
+ movs r0, r0, lsr #27
+ beq _037FB5E0
+ ldr r3, [r5, r0, lsl #2]
+ cmp r3, #0
+ beq _037FB670
+ mov r1, r2, lsr #6
+ mov r2, r2, lsl #26
+ mov r2, r2, lsr #31
+ mov lr, pc
+ bx r3
+ b _037FB5E0
+_037FB670:
+ mov r0, r2, lsl #26
+ movs r0, r0, lsr #31
+ bne _037FB5E0
+ orr r0, r2, #32
+ str r0, [sp]
+ ldrh r0, [sl]
+ ands r0, r0, #16384 ; 0x4000
+ ldrneh r0, [sl]
+ orrne r0, r0, #49152 ; 0xc000
+ strneh r0, [sl]
+ bne _037FB5E0
+ bl OS_DisableInterrupts
+ ldrh r1, [sl]
+ ands r1, r1, #2
+ beq _037FB6B4
+ bl OS_RestoreInterrupts
+ b _037FB5E0
+_037FB6B4:
+ ldr r1, [sp]
+ str r1, [r4]
+ bl OS_RestoreInterrupts
+ b _037FB5E0
+_037FB6C4:
+ add sp, sp, #8
+ ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
+ bx lr
+_037FB6D0: .word 0x04000184
+_037FB6D4: .word _0380795C
+_037FB6D8: .word 0x04000188
+
+ arm_func_start PXI_SendWordByFifo
+PXI_SendWordByFifo: ; 0x037FB6DC
+ stmfd sp!, {lr}
+ sub sp, sp, #4
+ ldr r3, [sp]
+ bic r3, r3, #31
+ and r0, r0, #31
+ orr r0, r3, r0
+ str r0, [sp]
+ bic r3, r0, #32
+ and r0, r2, #1
+ orr r0, r3, r0, lsl #5
+ str r0, [sp]
+ and r2, r0, #63 ; 0x3f
+ bic r0, r1, #-67108864 ; 0xfc000000
+ orr r0, r2, r0, lsl #6
+ str r0, [sp]
+ ldr r1, _037FB778 ; =0x04000184
+ ldrh r0, [r1]
+ ands r0, r0, #16384 ; 0x4000
+ ldrneh r0, [r1]
+ orrne r0, r0, #49152 ; 0xc000
+ strneh r0, [r1]
+ mvnne r0, #0
+ bne _037FB76C
+ bl OS_DisableInterrupts
+ ldr r1, _037FB778 ; =0x04000184
+ ldrh r1, [r1]
+ ands r1, r1, #2
+ beq _037FB758
+ bl OS_RestoreInterrupts
+ mvn r0, #1
+ b _037FB76C
+_037FB758:
+ ldr r2, [sp]
+ ldr r1, _037FB77C ; =0x04000188
+ str r2, [r1]
+ bl OS_RestoreInterrupts
+ mov r0, #0
+_037FB76C:
+ add sp, sp, #4
+ ldmia sp!, {lr}
+ bx lr
+_037FB778: .word 0x04000184
+_037FB77C: .word 0x04000188
+
+ arm_func_start PXI_IsCallbackReady
+PXI_IsCallbackReady: ; 0x037FB780
+ mov r3, #1
+ mov r2, r3, lsl r0
+ ldr r0, _037FB7A4 ; =0x027FFC00
+ add r0, r0, r1, lsl #2
+ ldr r0, [r0, #904] ; 0x388
+ ands r0, r2, r0
+ moveq r3, #0
+ mov r0, r3
+ bx lr
+_037FB7A4: .word 0x027FFC00
+
+ arm_func_start PXI_SetFifoRecvCallback
+PXI_SetFifoRecvCallback: ; 0x037FB7A8
+ stmdb sp!, {r4, r5, lr}
+ sub sp, sp, #4
+ mov r4, r0
+ mov r5, r1
+ bl OS_DisableInterrupts
+ ldr r1, _037FB80C ; =_0380795C
+ str r5, [r1, r4, lsl #2]
+ cmp r5, #0
+ beq _037FB7E4
+ ldr r3, _037FB810 ; =0x027FFC00
+ ldr r2, [r3, #908] ; 0x38c
+ mov r1, #1
+ orr r1, r2, r1, lsl r4
+ str r1, [r3, #908] ; 0x38c
+ b _037FB7FC
+_037FB7E4:
+ ldr r3, _037FB810 ; =0x027FFC00
+ ldr r2, [r3, #908] ; 0x38c
+ mov r1, #1
+ mvn r1, r1, lsl r4
+ and r1, r2, r1
+ str r1, [r3, #908] ; 0x38c
+_037FB7FC:
+ bl OS_RestoreInterrupts
+ add sp, sp, #4
+ ldmia sp!, {r4, r5, lr}
+ bx lr
+_037FB80C: .word _0380795C
+_037FB810: .word 0x027FFC00
+
+ arm_func_start PXI_InitFifo
+PXI_InitFifo: ; 0x037FB814
+ stmdb sp!, {r4, r5, r6, r7, r8, lr}
+ bl OS_DisableInterrupts
+ mov r5, r0
+ ldr r0, _037FB8D4 ; =_03807958
+ ldrh r1, [r0]
+ cmp r1, #0
+ bne _037FB8C4
+ mov r1, #1
+ strh r1, [r0]
+ mov r2, #0
+ ldr r0, _037FB8D8 ; =0x027FFC00
+ str r2, [r0, #908] ; 0x38c
+ mov r1, r2
+ ldr r0, _037FB8DC ; =_0380795C
+_037FB84C:
+ str r1, [r0, r2, lsl #2]
+ add r2, r2, #1
+ cmp r2, #32
+ blt _037FB84C
+ ldr r1, _037FB8E0 ; =0x0000C408
+ ldr r0, _037FB8E4 ; =0x04000184
+ strh r1, [r0]
+ mov r0, #262144 ; 0x40000
+ bl OS_ResetRequestIrqMask
+ mov r0, #262144 ; 0x40000
+ ldr r1, _037FB8E8 ; =PXIi_HandlerRecvFifoNotEmpty
+ bl OS_SetIrqFunction
+ mov r0, #262144 ; 0x40000
+ bl OS_EnableIrqMask
+ mov r4, #8
+ mov r6, r4
+ ldr r8, _037FB8EC ; =0x04000180
+ mov r7, #1000 ; 0x3e8
+ b _037FB8BC
+_037FB898:
+ mov r0, r4, lsl #8
+ strh r0, [r8]
+ mov r0, r7
+ bl OS_SpinWait
+ ldrh r0, [r8]
+ and r0, r0, #15
+ cmp r0, r4
+ movne r4, r6
+ sub r4, r4, #1
+_037FB8BC:
+ cmp r4, #0
+ bge _037FB898
+_037FB8C4:
+ mov r0, r5
+ bl OS_RestoreInterrupts
+ ldmia sp!, {r4, r5, r6, r7, r8, lr}
+ bx lr
+_037FB8D4: .word _03807958
+_037FB8D8: .word 0x027FFC00
+_037FB8DC: .word _0380795C
+_037FB8E0: .word 0x0000C408
+_037FB8E4: .word 0x04000184
+_037FB8E8: .word PXIi_HandlerRecvFifoNotEmpty
+_037FB8EC: .word 0x04000180
diff --git a/arm7/asm/PXI_init.s b/arm7/asm/PXI_init.s
new file mode 100644
index 00000000..b5a60d6e
--- /dev/null
+++ b/arm7/asm/PXI_init.s
@@ -0,0 +1,10 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .text
+
+ arm_func_start PXI_Init
+PXI_Init: ; 0x037FB5B0
+ ldr ip, _037FB5B8 ; =PXI_InitFifo
+ bx ip
+_037FB5B8: .word PXI_InitFifo
diff --git a/arm7/asm/SND.s b/arm7/asm/SND.s
new file mode 100644
index 00000000..75c5b32f
--- /dev/null
+++ b/arm7/asm/SND.s
@@ -0,0 +1,484 @@
+#todo split further
+
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .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
new file mode 100644
index 00000000..9a582901
--- /dev/null
+++ b/arm7/asm/SND_alarm.s
@@ -0,0 +1,138 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .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
new file mode 100644
index 00000000..acf1ac44
--- /dev/null
+++ b/arm7/asm/SND_bank.s
@@ -0,0 +1,245 @@
+ .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
new file mode 100644
index 00000000..d40e792e
--- /dev/null
+++ b/arm7/asm/SND_capture.s
@@ -0,0 +1,38 @@
+ .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
new file mode 100644
index 00000000..850c06f3
--- /dev/null
+++ b/arm7/asm/SND_channel.s
@@ -0,0 +1,208 @@
+ .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
new file mode 100644
index 00000000..3b49c224
--- /dev/null
+++ b/arm7/asm/SND_command.s
@@ -0,0 +1,629 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .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
new file mode 100644
index 00000000..b1ac819b
--- /dev/null
+++ b/arm7/asm/SND_exChannel.s
@@ -0,0 +1,645 @@
+ .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
new file mode 100644
index 00000000..cca10305
--- /dev/null
+++ b/arm7/asm/SND_lfo.s
@@ -0,0 +1,77 @@
+ .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
new file mode 100644
index 00000000..cc568f66
--- /dev/null
+++ b/arm7/asm/SND_lockChannel.s
@@ -0,0 +1,161 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .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
new file mode 100644
index 00000000..4182b325
--- /dev/null
+++ b/arm7/asm/SND_main.s
@@ -0,0 +1,171 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .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
new file mode 100644
index 00000000..cbf98551
--- /dev/null
+++ b/arm7/asm/SND_seq.s
@@ -0,0 +1,549 @@
+ .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
new file mode 100644
index 00000000..f680881b
--- /dev/null
+++ b/arm7/asm/SND_unk_037FD440.s
@@ -0,0 +1,1603 @@
+#todo identify and split
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .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
new file mode 100644
index 00000000..256f5f41
--- /dev/null
+++ b/arm7/asm/SND_util.s
@@ -0,0 +1,184 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .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
new file mode 100644
index 00000000..e18acc43
--- /dev/null
+++ b/arm7/asm/SND_wave.s
@@ -0,0 +1,43 @@
+ .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
new file mode 100644
index 00000000..0965b37a
--- /dev/null
+++ b/arm7/asm/SND_work.s
@@ -0,0 +1,70 @@
+ .include "asm/macros.inc"
+ .include "global.inc"
+
+ .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/dtcm.s b/arm7/asm/dtcm.s
index f02a5a49..454742e5 100644
--- a/arm7/asm/dtcm.s
+++ b/arm7/asm/dtcm.s
@@ -2,5806 +2,6 @@
.include "global.inc"
.section .text
- arm_func_start MI_StopDma
-MI_StopDma: ; 0x037FB20C
- stmdb sp!, {r4, lr}
- mov r4, r0
- bl OS_DisableInterrupts
- mov r1, #6
- mul r1, r4, r1
- add r1, r1, #5
- mov r1, r1, lsl #1
- add r1, r1, #67108864 ; 0x4000000
- ldrh r2, [r1, #176] ; 0xb0
- bic r2, r2, #12800 ; 0x3200
- strh r2, [r1, #176] ; 0xb0
- ldrh r2, [r1, #176] ; 0xb0
- bic r2, r2, #32768 ; 0x8000
- strh r2, [r1, #176] ; 0xb0
- ldrh r2, [r1, #176] ; 0xb0
- ldrh r1, [r1, #176] ; 0xb0
- cmp r4, #0
- bne _037FB27C
- mov r1, #12
- mul r3, r4, r1
- ldr r1, _037FB288 ; =0x040000B0
- add r4, r3, r1
- mov r2, #0
- add r1, r3, #67108864 ; 0x4000000
- str r2, [r1, #176] ; 0xb0
- str r2, [r4, #4]
- ldr r1, _037FB28C ; =0x81400001
- str r1, [r4, #8]
-_037FB27C:
- bl OS_RestoreInterrupts
- ldmia sp!, {r4, lr}
- bx lr
-_037FB288: .word 0x040000B0
-_037FB28C: .word 0x81400001
-
- arm_func_start MI_WaitDma
-MI_WaitDma: ; 0x037FB290
- stmdb sp!, {r4, lr}
- mov r4, r0
- bl OS_DisableInterrupts
- mov r1, #3
- mul r1, r4, r1
- add r2, r1, #2
- ldr r1, _037FB2F8 ; =0x040000B0
- add r2, r1, r2, lsl #2
-_037FB2B0:
- ldr r1, [r2]
- ands r1, r1, #-2147483648 ; 0x80000000
- bne _037FB2B0
- cmp r4, #0
- bne _037FB2EC
- mov r1, #12
- mul r3, r4, r1
- ldr r1, _037FB2F8 ; =0x040000B0
- add r4, r3, r1
- mov r2, #0
- add r1, r3, #67108864 ; 0x4000000
- str r2, [r1, #176] ; 0xb0
- str r2, [r4, #4]
- ldr r1, _037FB2FC ; =0x81400001
- str r1, [r4, #8]
-_037FB2EC:
- bl OS_RestoreInterrupts
- ldmia sp!, {r4, lr}
- bx lr
-_037FB2F8: .word 0x040000B0
-_037FB2FC: .word 0x81400001
-
- arm_func_start MIi_CpuClear16
-MIi_CpuClear16: ; 0x037FB300
- mov r3, #0
-_037FB304:
- cmp r3, r2
- strlth r0, [r1, r3]
- addlt r3, r3, #2
- blt _037FB304
- bx lr
-
- arm_func_start MIi_CpuCopy16
-MIi_CpuCopy16: ; 0x037FB318
- mov ip, #0
-_037FB31C:
- cmp ip, r2
- ldrlth r3, [r0, ip]
- strlth r3, [r1, ip]
- addlt ip, ip, #2
- blt _037FB31C
- bx lr
-
- arm_func_start MIi_CpuClear32
-MIi_CpuClear32: ; 0x037FB334
- add ip, r1, r2
-_037FB338:
- cmp r1, ip
- stmltia r1!, {r0}
- blt _037FB338
- bx lr
-
- arm_func_start MIi_CpuCopy32
-MIi_CpuCopy32: ; 0x037FB348
- add ip, r1, r2
-_037FB34C:
- cmp r1, ip
- ldmltia r0!, {r2}
- stmltia r1!, {r2}
- blt _037FB34C
- bx lr
-
- arm_func_start MIi_CpuClearFast
-MIi_CpuClearFast: ; 0x037FB360
- stmdb sp!, {r4, r5, r6, r7, r8, r9}
- add r9, r1, r2
- mov ip, r2, lsr #5
- add ip, r1, ip, lsl #5
- mov r2, r0
- mov r3, r2
- mov r4, r2
- mov r5, r2
- mov r6, r2
- mov r7, r2
- mov r8, r2
-_037FB38C:
- cmp r1, ip
- stmltia r1!, {r0, r2, r3, r4, r5, r6, r7, r8}
- blt _037FB38C
-_037FB398:
- cmp r1, r9
- stmltia r1!, {r0}
- blt _037FB398
- ldmia sp!, {r4, r5, r6, r7, r8, r9}
- bx lr
-
- arm_func_start MIi_CpuCopyFast
-MIi_CpuCopyFast: ; 0x037FB3AC
- stmdb sp!, {r4, r5, r6, r7, r8, r9, sl}
- add sl, r1, r2
- mov ip, r2, lsr #5
- add ip, r1, ip, lsl #5
-_037FB3BC:
- cmp r1, ip
- ldmltia r0!, {r2, r3, r4, r5, r6, r7, r8, r9}
- stmltia r1!, {r2, r3, r4, r5, r6, r7, r8, r9}
- blt _037FB3BC
-_037FB3CC:
- cmp r1, sl
- ldmltia r0!, {r2}
- stmltia r1!, {r2}
- blt _037FB3CC
- ldmia sp!, {r4, r5, r6, r7, r8, r9, sl}
- bx lr
-
- arm_func_start MI_CpuFill8
-MI_CpuFill8: ; 0x037FB3E4
- cmp r2, #0
- bxeq lr
- tst r0, #1
- beq _037FB410
- ldrh ip, [r0, #-1]
- and ip, ip, #255 ; 0xff
- orr r3, ip, r1, lsl #8
- strh r3, [r0, #-1]
- add r0, r0, #1
- subs r2, r2, #1
- bxeq lr
-_037FB410:
- cmp r2, #2
- bcc _037FB458
- orr r1, r1, r1, lsl #8
- tst r0, #2
- beq _037FB430
- strh r1, [r0], #2
- subs r2, r2, #2
- bxeq lr
-_037FB430:
- orr r1, r1, r1, lsl #16
- bics r3, r2, #3
- beq _037FB450
- sub r2, r2, r3
- add ip, r3, r0
-_037FB444:
- str r1, [r0], #4
- cmp r0, ip
- bcc _037FB444
-_037FB450:
- tst r2, #2
- strneh r1, [r0], #2
-_037FB458:
- tst r2, #1
- bxeq lr
- ldrh r3, [r0]
- and r3, r3, #65280 ; 0xff00
- and r1, r1, #255 ; 0xff
- orr r1, r1, r3
- strh r1, [r0]
- bx lr
-
- arm_func_start MI_CpuCopy8
-MI_CpuCopy8: ; 0x037FB478
- cmp r2, #0
- bxeq lr
- tst r1, #1
- beq _037FB4B8
- ldrh ip, [r1, #-1]
- and ip, ip, #255 ; 0xff
- tst r0, #1
- ldrneh r3, [r0, #-1]
- movne r3, r3, lsr #8
- ldreqh r3, [r0]
- orr r3, ip, r3, lsl #8
- strh r3, [r1, #-1]
- add r0, r0, #1
- add r1, r1, #1
- subs r2, r2, #1
- bxeq lr
-_037FB4B8:
- eor ip, r1, r0
- tst ip, #1
- beq _037FB50C
- bic r0, r0, #1
- ldrh ip, [r0], #2
- mov r3, ip, lsr #8
- subs r2, r2, #2
- bcc _037FB4F0
-_037FB4D8:
- ldrh ip, [r0], #2
- orr ip, r3, ip, lsl #8
- strh ip, [r1], #2
- mov r3, ip, lsr #16
- subs r2, r2, #2
- bcs _037FB4D8
-_037FB4F0:
- tst r2, #1
- bxeq lr
- ldrh ip, [r1]
- and ip, ip, #65280 ; 0xff00
- orr ip, ip, r3
- strh ip, [r1]
- bx lr
-_037FB50C:
- tst ip, #2
- beq _037FB538
- bics r3, r2, #1
- beq _037FB584
- sub r2, r2, r3
- add ip, r3, r1
-_037FB524:
- ldrh r3, [r0], #2
- strh r3, [r1], #2
- cmp r1, ip
- bcc _037FB524
- b _037FB584
-_037FB538:
- cmp r2, #2
- bcc _037FB584
- tst r1, #2
- beq _037FB558
- ldrh r3, [r0], #2
- strh r3, [r1], #2
- subs r2, r2, #2
- bxeq lr
-_037FB558:
- bics r3, r2, #3
- beq _037FB578
- sub r2, r2, r3
- add ip, r3, r1
-_037FB568:
- ldr r3, [r0], #4
- str r3, [r1], #4
- cmp r1, ip
- bcc _037FB568
-_037FB578:
- tst r2, #2
- ldrneh r3, [r0], #2
- strneh r3, [r1], #2
-_037FB584:
- tst r2, #1
- bxeq lr
- ldrh r2, [r1]
- ldrh r0, [r0]
- and r2, r2, #65280 ; 0xff00
- and r0, r0, #255 ; 0xff
- orr r0, r2, r0
- strh r0, [r1]
- bx lr
-
- arm_func_start MI_SwapWord
-MI_SwapWord: ; 0x037FB5A8
- swp r0, r0, [r1]
- bx lr
-
- arm_func_start PXI_Init
-PXI_Init: ; 0x037FB5B0
- ldr ip, _037FB5B8 ; =PXI_InitFifo
- bx ip
-_037FB5B8: .word PXI_InitFifo
-
- arm_func_start PXIi_HandlerRecvFifoNotEmpty
-PXIi_HandlerRecvFifoNotEmpty: ; 0x037FB5BC
- stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
- sub sp, sp, #8
- ldr sl, _037FB6D0 ; =0x04000184
- ldr r5, _037FB6D4 ; =_0380795C
- mov r7, #68157440 ; 0x4100000
- mov r6, #0
- mvn r8, #3
- mvn r9, #2
- ldr r4, _037FB6D8 ; =0x04000188
-_037FB5E0:
- ldrh r0, [sl]
- ands r0, r0, #16384 ; 0x4000
- ldrneh r0, [sl]
- orrne r0, r0, #49152 ; 0xc000
- strneh r0, [sl]
- movne r1, r9
- bne _037FB628
- bl OS_DisableInterrupts
- ldrh r1, [sl]
- ands r1, r1, #256 ; 0x100
- beq _037FB618
- bl OS_RestoreInterrupts
- mov r1, r8
- b _037FB628
-_037FB618:
- ldr r1, [r7]
- str r1, [sp]
- bl OS_RestoreInterrupts
- mov r1, r6
-_037FB628:
- cmp r1, r8
- beq _037FB6C4
- mvn r0, #2
- cmp r1, r0
- beq _037FB5E0
- ldr r2, [sp]
- mov r0, r2, lsl #27
- movs r0, r0, lsr #27
- beq _037FB5E0
- ldr r3, [r5, r0, lsl #2]
- cmp r3, #0
- beq _037FB670
- mov r1, r2, lsr #6
- mov r2, r2, lsl #26
- mov r2, r2, lsr #31
- mov lr, pc
- bx r3
- b _037FB5E0
-_037FB670:
- mov r0, r2, lsl #26
- movs r0, r0, lsr #31
- bne _037FB5E0
- orr r0, r2, #32
- str r0, [sp]
- ldrh r0, [sl]
- ands r0, r0, #16384 ; 0x4000
- ldrneh r0, [sl]
- orrne r0, r0, #49152 ; 0xc000
- strneh r0, [sl]
- bne _037FB5E0
- bl OS_DisableInterrupts
- ldrh r1, [sl]
- ands r1, r1, #2
- beq _037FB6B4
- bl OS_RestoreInterrupts
- b _037FB5E0
-_037FB6B4:
- ldr r1, [sp]
- str r1, [r4]
- bl OS_RestoreInterrupts
- b _037FB5E0
-_037FB6C4:
- add sp, sp, #8
- ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, lr}
- bx lr
-_037FB6D0: .word 0x04000184
-_037FB6D4: .word _0380795C
-_037FB6D8: .word 0x04000188
-
- arm_func_start PXI_SendWordByFifo
-PXI_SendWordByFifo: ; 0x037FB6DC
- stmfd sp!, {lr}
- sub sp, sp, #4
- ldr r3, [sp]
- bic r3, r3, #31
- and r0, r0, #31
- orr r0, r3, r0
- str r0, [sp]
- bic r3, r0, #32
- and r0, r2, #1
- orr r0, r3, r0, lsl #5
- str r0, [sp]
- and r2, r0, #63 ; 0x3f
- bic r0, r1, #-67108864 ; 0xfc000000
- orr r0, r2, r0, lsl #6
- str r0, [sp]
- ldr r1, _037FB778 ; =0x04000184
- ldrh r0, [r1]
- ands r0, r0, #16384 ; 0x4000
- ldrneh r0, [r1]
- orrne r0, r0, #49152 ; 0xc000
- strneh r0, [r1]
- mvnne r0, #0
- bne _037FB76C
- bl OS_DisableInterrupts
- ldr r1, _037FB778 ; =0x04000184
- ldrh r1, [r1]
- ands r1, r1, #2
- beq _037FB758
- bl OS_RestoreInterrupts
- mvn r0, #1
- b _037FB76C
-_037FB758:
- ldr r2, [sp]
- ldr r1, _037FB77C ; =0x04000188
- str r2, [r1]
- bl OS_RestoreInterrupts
- mov r0, #0
-_037FB76C:
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_037FB778: .word 0x04000184
-_037FB77C: .word 0x04000188
-
- arm_func_start PXI_IsCallbackReady
-PXI_IsCallbackReady: ; 0x037FB780
- mov r3, #1
- mov r2, r3, lsl r0
- ldr r0, _037FB7A4 ; =0x027FFC00
- add r0, r0, r1, lsl #2
- ldr r0, [r0, #904] ; 0x388
- ands r0, r2, r0
- moveq r3, #0
- mov r0, r3
- bx lr
-_037FB7A4: .word 0x027FFC00
-
- arm_func_start PXI_SetFifoRecvCallback
-PXI_SetFifoRecvCallback: ; 0x037FB7A8
- stmdb sp!, {r4, r5, lr}
- sub sp, sp, #4
- mov r4, r0
- mov r5, r1
- bl OS_DisableInterrupts
- ldr r1, _037FB80C ; =_0380795C
- str r5, [r1, r4, lsl #2]
- cmp r5, #0
- beq _037FB7E4
- ldr r3, _037FB810 ; =0x027FFC00
- ldr r2, [r3, #908] ; 0x38c
- mov r1, #1
- orr r1, r2, r1, lsl r4
- str r1, [r3, #908] ; 0x38c
- b _037FB7FC
-_037FB7E4:
- ldr r3, _037FB810 ; =0x027FFC00
- ldr r2, [r3, #908] ; 0x38c
- mov r1, #1
- mvn r1, r1, lsl r4
- and r1, r2, r1
- str r1, [r3, #908] ; 0x38c
-_037FB7FC:
- bl OS_RestoreInterrupts
- add sp, sp, #4
- ldmia sp!, {r4, r5, lr}
- bx lr
-_037FB80C: .word _0380795C
-_037FB810: .word 0x027FFC00
-
- arm_func_start PXI_InitFifo
-PXI_InitFifo: ; 0x037FB814
- stmdb sp!, {r4, r5, r6, r7, r8, lr}
- bl OS_DisableInterrupts
- mov r5, r0
- ldr r0, _037FB8D4 ; =_03807958
- ldrh r1, [r0]
- cmp r1, #0
- bne _037FB8C4
- mov r1, #1
- strh r1, [r0]
- mov r2, #0
- ldr r0, _037FB8D8 ; =0x027FFC00
- str r2, [r0, #908] ; 0x38c
- mov r1, r2
- ldr r0, _037FB8DC ; =_0380795C
-_037FB84C:
- str r1, [r0, r2, lsl #2]
- add r2, r2, #1
- cmp r2, #32
- blt _037FB84C
- ldr r1, _037FB8E0 ; =0x0000C408
- ldr r0, _037FB8E4 ; =0x04000184
- strh r1, [r0]
- mov r0, #262144 ; 0x40000
- bl OS_ResetRequestIrqMask
- mov r0, #262144 ; 0x40000
- ldr r1, _037FB8E8 ; =PXIi_HandlerRecvFifoNotEmpty
- bl OS_SetIrqFunction
- mov r0, #262144 ; 0x40000
- bl OS_EnableIrqMask
- mov r4, #8
- mov r6, r4
- ldr r8, _037FB8EC ; =0x04000180
- mov r7, #1000 ; 0x3e8
- b _037FB8BC
-_037FB898:
- mov r0, r4, lsl #8
- strh r0, [r8]
- mov r0, r7
- bl OS_SpinWait
- ldrh r0, [r8]
- and r0, r0, #15
- cmp r0, r4
- movne r4, r6
- sub r4, r4, #1
-_037FB8BC:
- cmp r4, #0
- bge _037FB898
-_037FB8C4:
- mov r0, r5
- bl OS_RestoreInterrupts
- ldmia sp!, {r4, r5, r6, r7, r8, lr}
- bx lr
-_037FB8D4: .word _03807958
-_037FB8D8: .word 0x027FFC00
-_037FB8DC: .word _0380795C
-_037FB8E0: .word 0x0000C408
-_037FB8E4: .word 0x04000184
-_037FB8E8: .word PXIi_HandlerRecvFifoNotEmpty
-_037FB8EC: .word 0x04000180
-
- arm_func_start EXIi_SelectRcnt
-EXIi_SelectRcnt: ; 0x037FB8F0
- mov r1, r0
- mov r0, #49152 ; 0xc000
- mov r1, r1, lsl #16
- mov r1, r1, lsr #16
- ldr ip, _037FB908 ; =EXIi_SetBitRcnt0L
- bx ip
-_037FB908: .word EXIi_SetBitRcnt0L
-
- arm_func_start EXIi_SetBitRcnt0L
-EXIi_SetBitRcnt0L: ; 0x037FB90C
- mvn r3, r0
- ldr r2, _037FB928 ; =0x04000134
- ldrh r0, [r2]
- and r0, r3, r0
- orr r0, r1, r0
- strh r0, [r2]
- bx lr
-_037FB928: .word 0x04000134
-
- arm_func_start FUN_037FB92C
-FUN_037FB92C: ; 0x037FB92C
- stmdb sp!, {r4, lr}
- mov r4, #0
- mov r0, #32768 ; 0x8000
- bl EXIi_SelectRcnt
- ldr r0, _037FB964 ; =0x04000136
- ldrh r1, [r0]
- ands r0, r1, #128 ; 0x80
- movne r4, #32768 ; 0x8000
- and r0, r1, #11
- orr r1, r4, r0, lsl #10
- ldr r0, _037FB968 ; =0x027FFFA8
- strh r1, [r0]
- ldmia sp!, {r4, lr}
- bx lr
-_037FB964: .word 0x04000136
-_037FB968: .word 0x027FFFA8
-
- arm_func_start PAD_InitXYButton
-PAD_InitXYButton: ; 0x037FB96C
- stmfd sp!, {lr}
- sub sp, sp, #12
- bl OS_IsTickAvailable
- cmp r0, #0
- beq _037FB98C
- bl OS_IsAlarmAvailable
- cmp r0, #0
- bne _037FB994
-_037FB98C:
- mov r0, #0
- b _037FB9F0
-_037FB994:
- ldr r0, _037FB9FC ; =PADi_XYButtonAvailable
- ldr r0, [r0]
- cmp r0, #0
- movne r0, #0
- bne _037FB9F0
- ldr r0, _037FBA00 ; =_038079E0
- bl OS_CreateAlarm
- bl OS_GetTick
- mov r2, r0
- ldr r0, _037FBA04 ; =FUN_037FB92C
- str r0, [sp, #4]
- mov r0, #0
- str r0, [sp, #8]
- ldr r3, _037FBA08 ; =0x0000082E
- str r0, [sp]
- ldr r0, _037FBA00 ; =_038079E0
- adds ip, r2, r3
- adc r2, r1, #0
- mov r1, ip
- bl OS_SetPeriodicAlarm
- mov r0, #1
- ldr r1, _037FB9FC ; =PADi_XYButtonAvailable
- str r0, [r1]
-_037FB9F0:
- add sp, sp, #12
- ldmia sp!, {lr}
- bx lr
-_037FB9FC: .word PADi_XYButtonAvailable
-_037FBA00: .word _038079E0
-_037FBA04: .word FUN_037FB92C
-_037FBA08: .word 0x0000082E
-
- 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
-
- 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
-
- arm_func_start FUN_037FC2B0
-FUN_037FC2B0: ; 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 ; =FUN_037FC2B0
- 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 FUN_037FC2B0
-_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
-
- 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
-
- 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
-
- 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
-
- 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
-
- 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
-
- 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
-
- 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
-
- 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
-
- arm_func_start FUN_037FF114
-FUN_037FF114: ; 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 FUN_037FF114
- 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
-
- 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
-
- arm_func_start FUN_037FF524
-FUN_037FF524: ; 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 ; =FUN_037FF524
- bl OS_SetAlarm
- b _037FF640
-_037FF610:
- bl OS_GetTick
- mov r2, r0
- ldr r0, _037FF658 ; =FUN_037FF524
- 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 FUN_037FF524
-
- 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
-
- arm_func_start FUN_037FF6E4
-FUN_037FF6E4: ; 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 FUN_037FF750
-FUN_037FF750: ; 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 FUN_037FF814
-FUN_037FF814: ; 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 FUN_037FF908
-FUN_037FF908: ; 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 FUN_037FF950
-FUN_037FF950: ; 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 FUN_037FF9A8
-FUN_037FF9A8: ; 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 FUN_037FF9F0
-FUN_037FF9F0: ; 0x037FF9F0
- mov r0, #7
- ldr r1, _037FFA00 ; =FUN_037FFA08
- ldr ip, _037FFA04 ; =PXI_SetFifoRecvCallback
- bx ip
-_037FFA00: .word FUN_037FFA08
-_037FFA04: .word PXI_SetFifoRecvCallback
-
- arm_func_start FUN_037FFA08
-FUN_037FFA08: ; 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 FUN_037FF814
- b _037FFE84
-_037FFC50:
- ldr r0, [sp, #36] ; 0x24
- ldr r1, [sp, #40] ; 0x28
- ldr r2, [sp, #44] ; 0x2c
- ldr r3, [sp, #48] ; 0x30
- bl FUN_037FF750
- 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 FUN_037FF9A8
- b _037FFE84
-_037FFCE4:
- ldr r0, [sp, #36] ; 0x24
- ldr r1, [sp, #40] ; 0x28
- ldr r2, [sp, #44] ; 0x2c
- bl FUN_037FF950
- b _037FFE84
-_037FFCF8:
- ldr r0, [sp, #36] ; 0x24
- ldr r1, [sp, #40] ; 0x28
- bl FUN_037FF908
- 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 FUN_037FF6E4
-_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 FUN_037FF9F0
- 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
-
arm_func_start FS_Init
FS_Init: ; 0x037FFF14
ldr ip, _037FFF1C ; =CARD_Init
diff --git a/arm7/global.inc b/arm7/global.inc
index 1fafbbb6..c3bad2c7 100644
--- a/arm7/global.inc
+++ b/arm7/global.inc
@@ -101,14 +101,111 @@
.extern MI_CpuFill8
.extern MI_SwapWord
.extern PXI_Init
+.extern PXI_InitFifo
+.extern PXI_IsCallbackReady
.extern PXI_SendWordByFifo
.extern PXI_SetFifoRecvCallback
.extern EXIi_SelectRcnt
.extern EXIi_SetBitRcnt0L
+.extern FUN_037FB92C
+.extern SNDi_LockMutex
+.extern SNDi_SetPlayerParam
+.extern SNDi_SetSurroundDecay
+.extern SNDi_SetTrackParam
+.extern SNDi_UnlockMutex
+.extern SND_AlarmInit
+.extern SND_AllocExChannel
.extern SND_BeginSleep
+.extern SND_CalcChannelVolume
+.extern SND_CalcRandom
+.extern SND_CalcTimer
+.extern SND_CommandInit
+.extern SND_CommandProc
+.extern SND_Enable
.extern SND_EndSleep
+.extern SND_ExChannelInit
+.extern SND_ExChannelMain
+.extern SND_FreeExChannel
+.extern SND_GetChannelControl
+.extern SND_GetLfoValue
+.extern SND_GetLockedChannel
.extern SND_Init
+.extern SND_InitLfoParam
+.extern SND_InvalidateBank
+.extern SND_InvalidateSeq
+.extern SND_InvalidateWave
+.extern SND_IsCaptureActive
+.extern SND_IsChannelActive
+.extern SND_IsExChannelActive
+.extern SND_LockChannel
+.extern SND_NoteOn
+.extern SND_PauseSeq
+.extern SND_PrepareSeq
+.extern SND_ReadInstData
+.extern SND_ReleaseExChannel
+.extern SND_SendWakeupMessage
+.extern SND_SetChannelPan
+.extern SND_SetChannelTimer
+.extern SND_SetChannelVolume
+.extern SND_SetExChannelAttack
+.extern SND_SetExChannelDecay
+.extern SND_SetExChannelRelease
+.extern SND_SetExChannelSustain
+.extern SND_SetMasterPan
+.extern SND_SetMasterVolume
+.extern SND_SetOutputSelector
+.extern SND_SetPlayerGlobalVariable
+.extern SND_SetPlayerLocalVariable
+.extern SND_SetTrackAllocatableChannel
+.extern SND_SetTrackMute
+.extern SND_SetupAlarm
+.extern SND_SetupCapture
+.extern SND_SetupChannelNoise
+.extern SND_SetupChannelPcm
+.extern SND_SetupChannelPsg
+.extern SND_SeqInit
+.extern SND_SeqMain
.extern SND_Shutdown
+.extern SND_SinIdx
+.extern SND_SkipSeq
+.extern SND_StartAlarm
+.extern SND_StartExChannelNoise
+.extern SND_StartExChannelPcm
+.extern SND_StartExChannelPsg
+.extern SND_StartIntervalTimer
+.extern SND_StartLfo
+.extern SND_StartPreparedSeq
+.extern SND_StartSeq
+.extern SND_StopAlarm
+.extern SND_StopChannel
+.extern SND_StopIntervalTimer
+.extern SND_StopSeq
+.extern SND_StopUnlockedChannel
+.extern SND_UnlockChannel
+.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 SPI_Init
.extern PMi_ResetControl
.extern PMi_SetControl