diff options
Diffstat (limited to 'arm7/asm/SND.s')
-rw-r--r-- | arm7/asm/SND.s | 484 |
1 files changed, 484 insertions, 0 deletions
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 |