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