diff options
author | Michael Panzlaff <michael.panzlaff@fau.de> | 2021-06-27 00:04:45 +0200 |
---|---|---|
committer | Michael Panzlaff <michael.panzlaff@fau.de> | 2021-08-25 18:03:40 +0200 |
commit | f9aae26dd2155d78f111907f47feb0ec5be9f30c (patch) | |
tree | 415daaf7270b05950892b2b81a68bdb6982e4d63 | |
parent | 83c92e11bdb440c80042ad7434966a03bc7b18c3 (diff) |
arm7: decompile SND_lockChannel
-rw-r--r-- | arm7/asm/SND_exChannel.s | 16 | ||||
-rw-r--r-- | arm7/asm/SND_lockChannel.s | 171 | ||||
-rw-r--r-- | arm7/global.inc | 4 | ||||
-rw-r--r-- | arm7/lib/include/SND_exChannel.h | 3 | ||||
-rw-r--r-- | arm7/lib/include/SND_lockChannel.h | 11 | ||||
-rw-r--r-- | arm7/lib/src/SND_lockChannel.c | 79 |
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; + } +} |