summaryrefslogtreecommitdiff
path: root/arm7/asm/SND_exChannel.s
diff options
context:
space:
mode:
Diffstat (limited to 'arm7/asm/SND_exChannel.s')
-rw-r--r--arm7/asm/SND_exChannel.s645
1 files changed, 645 insertions, 0 deletions
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