summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Panzlaff <michael.panzlaff@fau.de>2021-06-27 00:04:45 +0200
committerMichael Panzlaff <michael.panzlaff@fau.de>2021-08-25 18:03:40 +0200
commitf9aae26dd2155d78f111907f47feb0ec5be9f30c (patch)
tree415daaf7270b05950892b2b81a68bdb6982e4d63
parent83c92e11bdb440c80042ad7434966a03bc7b18c3 (diff)
arm7: decompile SND_lockChannel
-rw-r--r--arm7/asm/SND_exChannel.s16
-rw-r--r--arm7/asm/SND_lockChannel.s171
-rw-r--r--arm7/global.inc4
-rw-r--r--arm7/lib/include/SND_exChannel.h3
-rw-r--r--arm7/lib/include/SND_lockChannel.h11
-rw-r--r--arm7/lib/src/SND_lockChannel.c79
6 files changed, 103 insertions, 181 deletions
diff --git a/arm7/asm/SND_exChannel.s b/arm7/asm/SND_exChannel.s
index b1ac819b..f6e8fe4d 100644
--- a/arm7/asm/SND_exChannel.s
+++ b/arm7/asm/SND_exChannel.s
@@ -18,12 +18,12 @@ SND_AllocExChannel: ; 0x037FCB94
mov sl, r0
mov r9, r1
mov fp, r3
- ldr r0, _037FCCBC ; =_03807F48
+ ldr r0, _037FCCBC ; =sUnlockedChannelMask
ldr r0, [r0]
mvn r0, r0
and sl, sl, r0
cmp r2, #0
- ldreq r0, _037FCCC0 ; =_03807F44
+ ldreq r0, _037FCCC0 ; =sLockedChannelMask
ldreq r0, [r0]
mvneq r0, r0
andeq sl, sl, r0
@@ -92,8 +92,8 @@ _037FCCB0:
add sp, sp, #4
ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr}
bx lr
-_037FCCBC: .word _03807F48
-_037FCCC0: .word _03807F44
+_037FCCBC: .word sUnlockedChannelMask
+_037FCCC0: .word sLockedChannelMask
_037FCCC4: .word _03807298
_037FCCC8: .word SNDi_Work
@@ -635,11 +635,11 @@ _037FD3EC:
cmp ip, #16
blt _037FD3EC
mov r1, #0
- ldr r0, _037FD438 ; =_03807F48
+ ldr r0, _037FD438 ; =sUnlockedChannelMask
str r1, [r0]
- ldr r0, _037FD43C ; =_03807F44
+ ldr r0, _037FD43C ; =sLockedCHannelMask
str r1, [r0]
bx lr
_037FD434: .word SNDi_Work
-_037FD438: .word _03807F48
-_037FD43C: .word _03807F44
+_037FD438: .word sUnlockedChannelMask
+_037FD43C: .word sLockedChannelMask
diff --git a/arm7/asm/SND_lockChannel.s b/arm7/asm/SND_lockChannel.s
deleted file mode 100644
index 4a96a890..00000000
--- a/arm7/asm/SND_lockChannel.s
+++ /dev/null
@@ -1,171 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .section .bss
-
- .global _03807F44
-_03807F44: ;0x03807F44
- .space 0x03807F48 - 0x03807F44
-
- .global _03807F48
-_03807F48: ;0x03807F48
- .space 0x03807F4C - 0x03807F48
-
- .section .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/global.inc b/arm7/global.inc
index f6880895..b89a6c21 100644
--- a/arm7/global.inc
+++ b/arm7/global.inc
@@ -427,8 +427,8 @@
.extern _03807A54
.extern _03807A74
.extern _03807AA0
-.extern _03807F44
-.extern _03807F48
+.extern sLockedChannelMask
+.extern sUnlockedChannelMask
.extern _03807F4C
.extern _03807F50
.extern _03807F58
diff --git a/arm7/lib/include/SND_exChannel.h b/arm7/lib/include/SND_exChannel.h
index 976d2786..8450a629 100644
--- a/arm7/lib/include/SND_exChannel.h
+++ b/arm7/lib/include/SND_exChannel.h
@@ -3,9 +3,12 @@
#include "nitro/types.h"
+#include "nitro/SND_main_shared.h"
+
void SND_ExChannelInit(void);
BOOL SND_IsChannelActive(s32 idx);
void SND_UpdateExChannel(void);
void SND_ExChannelMain(BOOL update);
+void SND_FreeExChannel(struct SNDExChannel *chn);
#endif //GUARD_SND_EXCHANNEL_H
diff --git a/arm7/lib/include/SND_lockChannel.h b/arm7/lib/include/SND_lockChannel.h
new file mode 100644
index 00000000..ed7fd872
--- /dev/null
+++ b/arm7/lib/include/SND_lockChannel.h
@@ -0,0 +1,11 @@
+#ifndef GUARD_SND_LOCKCHANNEL_H
+#define GUARD_SND_LOCKCHANNEL_H
+
+#include "nitro/types.h"
+
+void SND_StopUnlockedChannel(u32 channelMask);
+void SND_LockChannel(u32 channelMask, u32 locked);
+void SND_UnlockChannel(u32 channelMask, u32 locked);
+u32 SND_GetLockedChannel(u32 locked);
+
+#endif //GUARD_SND_LOCKCHANNEL_H
diff --git a/arm7/lib/src/SND_lockChannel.c b/arm7/lib/src/SND_lockChannel.c
new file mode 100644
index 00000000..cecfd871
--- /dev/null
+++ b/arm7/lib/src/SND_lockChannel.c
@@ -0,0 +1,79 @@
+#include "SND_lockChannel.h"
+
+#include "SND_work.h"
+#include "SND_exChannel.h"
+#include "SND.h"
+
+// TODO make these vars static after merging this file with exChannel
+u32 sUnlockedChannelMask;
+u32 sLockedChannelMask;
+
+void SND_StopUnlockedChannel(u32 channelMask) {
+ struct SNDExChannel *chn;
+
+ for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1) {
+ if ((channelMask & 1) == 0)
+ continue;
+
+ chn = &SNDi_Work.channels[i];
+
+ if (sUnlockedChannelMask & (1 << i))
+ continue;
+
+ if (chn->callback)
+ chn->callback(chn, 0, chn->callbackUserData);
+
+ SND_StopChannel(i, 0);
+ chn->priority = 0;
+ SND_FreeExChannel(chn);
+ chn->flags.syncFlag = 0;
+ chn->flags.active = 0;
+ }
+}
+
+void SND_LockChannel(u32 channelMask, u32 locked) {
+ struct SNDExChannel *chn;
+ u32 j = channelMask;
+ int i = 0;
+
+ for (; i < SND_CHANNEL_COUNT && j != 0; i++, j >>= 1) {
+ if ((j & 1) == 0)
+ continue;
+
+ chn = &SNDi_Work.channels[i];
+
+ if (sUnlockedChannelMask & (1 << i))
+ continue;
+
+ if (chn->callback)
+ chn->callback(chn, 0, chn->callbackUserData);
+
+ SND_StopChannel(i, 0);
+ chn->priority = 0;
+ SND_FreeExChannel(chn);
+ chn->flags.syncFlag = 0;
+ chn->flags.active = 0;
+ }
+
+ if (locked & 1) {
+ sLockedChannelMask |= channelMask;
+ } else {
+ sUnlockedChannelMask |= channelMask;
+ }
+}
+
+void SND_UnlockChannel(u32 channelMask, u32 locked) {
+ if (locked & 1) {
+ sLockedChannelMask &= ~channelMask;
+ } else {
+ sUnlockedChannelMask &= ~channelMask;
+ }
+}
+
+u32 SND_GetLockedChannel(u32 locked) {
+ if (locked & 1) {
+ return sLockedChannelMask;
+ } else {
+ return sUnlockedChannelMask;
+ }
+}