diff options
-rw-r--r-- | arm7/arm7.lsf | 22 | ||||
-rw-r--r-- | arm7/asm/EXI_genPort.s | 44 | ||||
-rw-r--r-- | arm7/asm/MI_dma.s | 74 | ||||
-rw-r--r-- | arm7/asm/MI_memory.s | 221 | ||||
-rw-r--r-- | arm7/asm/MI_swap.s | 9 | ||||
-rw-r--r-- | arm7/asm/PAD_xyButton.s | 50 | ||||
-rw-r--r-- | arm7/asm/PXI_fifo.s | 238 | ||||
-rw-r--r-- | arm7/asm/PXI_init.s | 10 | ||||
-rw-r--r-- | arm7/asm/SND.s | 484 | ||||
-rw-r--r-- | arm7/asm/SND_alarm.s | 138 | ||||
-rw-r--r-- | arm7/asm/SND_bank.s | 245 | ||||
-rw-r--r-- | arm7/asm/SND_capture.s | 38 | ||||
-rw-r--r-- | arm7/asm/SND_channel.s | 208 | ||||
-rw-r--r-- | arm7/asm/SND_command.s | 629 | ||||
-rw-r--r-- | arm7/asm/SND_exChannel.s | 645 | ||||
-rw-r--r-- | arm7/asm/SND_lfo.s | 77 | ||||
-rw-r--r-- | arm7/asm/SND_lockChannel.s | 161 | ||||
-rw-r--r-- | arm7/asm/SND_main.s | 171 | ||||
-rw-r--r-- | arm7/asm/SND_seq.s | 549 | ||||
-rw-r--r-- | arm7/asm/SND_unk_037FD440.s | 1603 | ||||
-rw-r--r-- | arm7/asm/SND_util.s | 184 | ||||
-rw-r--r-- | arm7/asm/SND_wave.s | 43 | ||||
-rw-r--r-- | arm7/asm/SND_work.s | 70 | ||||
-rw-r--r-- | arm7/asm/dtcm.s | 5800 | ||||
-rw-r--r-- | arm7/global.inc | 97 |
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
|