diff options
author | Michael Panzlaff <michael.panzlaff@fau.de> | 2021-06-25 23:43:40 +0200 |
---|---|---|
committer | Michael Panzlaff <michael.panzlaff@fau.de> | 2021-08-25 18:03:39 +0200 |
commit | eb13294661514e27b3b89e26b7a4401cc93feb93 (patch) | |
tree | adbcbc5c6e3bc1c4360fcdf654ebd6ff915029f5 | |
parent | 69200d83f7bf3c189e226f3561cef3a6ee7ee6ce (diff) |
decompile SND_alarm and SND_work
-rw-r--r-- | arm7/asm/SND_alarm.s | 144 | ||||
-rw-r--r-- | arm7/asm/SND_seq.s | 30 | ||||
-rw-r--r-- | arm7/asm/SND_unk_037FD440.s | 10 | ||||
-rw-r--r-- | arm7/asm/SND_work.s | 84 | ||||
-rw-r--r-- | arm7/lib/include/SND_alarm.h | 12 | ||||
-rw-r--r-- | arm7/lib/include/SND_capture.h | 6 | ||||
-rw-r--r-- | arm7/lib/include/SND_exChannel.h | 4 | ||||
-rw-r--r-- | arm7/lib/include/SND_work.h | 11 | ||||
-rw-r--r-- | arm7/lib/src/SND_alarm.c | 70 | ||||
-rw-r--r-- | arm7/lib/src/SND_work.c | 36 |
10 files changed, 148 insertions, 259 deletions
diff --git a/arm7/asm/SND_alarm.s b/arm7/asm/SND_alarm.s deleted file mode 100644 index 68740d65..00000000 --- a/arm7/asm/SND_alarm.s +++ /dev/null @@ -1,144 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .section .bss - - .global _03808EEC -_03808EEC: ;0x03808EEC - .space 0x038090EC - 0x03808EEC - - .section .text - - arm_func_start AlarmHandler -AlarmHandler: ; 0x037FF524 - stmdb sp!, {r4, r5, r6, lr} - mov r6, r0 - mov r5, #7 - mov r4, #0 -_037FF534: - mov r0, r5 - mov r1, r6 - mov r2, r4 - bl PXI_SendWordByFifo - cmp r0, #0 - blt _037FF534 - ldmia sp!, {r4, r5, r6, lr} - bx lr - - arm_func_start SND_StopAlarm -SND_StopAlarm: ; 0x037FF554 - stmdb sp!, {r4, lr} - ldr r1, _037FF590 ; =_03808EEC - add r4, r1, r0, lsl #6 - ldrb r0, [r1, r0, lsl #6] - cmp r0, #0 - beq _037FF588 - add r0, r4, #20 - bl OS_CancelAlarm - ldrb r0, [r4, #1] - add r0, r0, #1 - strb r0, [r4, #1] - mov r0, #0 - strb r0, [r4] -_037FF588: - ldmia sp!, {r4, lr} - bx lr -_037FF590: .word _03808EEC - - arm_func_start SND_StartAlarm -SND_StartAlarm: ; 0x037FF594 - stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} - sub sp, sp, #12 - mov r4, r0 - ldr r0, _037FF654 ; =_03808EEC - add r5, r0, r4, lsl #6 - ldrb r0, [r0, r4, lsl #6] - cmp r0, #0 - beq _037FF5C4 - add r0, r5, #20 - bl OS_CancelAlarm - mov r0, #0 - strb r0, [r5] -_037FF5C4: - ldr r9, [r5, #4] - ldr r8, [r5, #8] - ldr r7, [r5, #12] - ldr r6, [r5, #16] - ldrb r0, [r5, #1] - orr r4, r4, r0, lsl #8 - add r0, r5, #20 - bl OS_CreateAlarm - mov r0, #0 - cmp r6, r0 - cmpeq r7, r0 - bne _037FF610 - str r4, [sp] - add r0, r5, #20 - mov r1, r9 - mov r2, r8 - ldr r3, _037FF658 ; =AlarmHandler - bl OS_SetAlarm - b _037FF640 -_037FF610: - bl OS_GetTick - mov r2, r0 - ldr r0, _037FF658 ; =AlarmHandler - str r0, [sp, #4] - str r4, [sp, #8] - mov r3, r7 - str r6, [sp] - add r0, r5, #20 - adds r4, r9, r2 - adc r2, r8, r1 - mov r1, r4 - bl OS_SetPeriodicAlarm -_037FF640: - mov r0, #1 - strb r0, [r5] - add sp, sp, #12 - ldmia sp!, {r4, r5, r6, r7, r8, r9, lr} - bx lr -_037FF654: .word _03808EEC -_037FF658: .word AlarmHandler - - arm_func_start SND_SetupAlarm -SND_SetupAlarm: ; 0x037FF65C - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r8, r1 - mov r7, r2 - mov r6, r3 - ldr r5, [sp, #24] - ldr r1, _037FF6B4 ; =_03808EEC - add r4, r1, r0, lsl #6 - ldrb r0, [r1, r0, lsl #6] - cmp r0, #0 - beq _037FF694 - add r0, r4, #20 - bl OS_CancelAlarm - mov r0, #0 - strb r0, [r4] -_037FF694: - str r8, [r4, #4] - str r7, [r4, #8] - str r6, [r4, #12] - str r5, [r4, #16] - ldr r0, [sp, #28] - strb r0, [r4, #1] - ldmia sp!, {r4, r5, r6, r7, r8, lr} - bx lr -_037FF6B4: .word _03808EEC - - arm_func_start SND_AlarmInit -SND_AlarmInit: ; 0x037FF6B8 - mov r3, #0 - mov r2, r3 - ldr r1, _037FF6E0 ; =SNDi_Work -_037FF6C4: - add r0, r1, r3, lsl #6 - strb r2, [r0, #3968] ; 0xf80 - strb r2, [r0, #3969] ; 0xf81 - add r3, r3, #1 - cmp r3, #8 - blt _037FF6C4 - bx lr -_037FF6E0: .word SNDi_Work diff --git a/arm7/asm/SND_seq.s b/arm7/asm/SND_seq.s index cbf98551..fcf067df 100644 --- a/arm7/asm/SND_seq.s +++ b/arm7/asm/SND_seq.s @@ -51,7 +51,7 @@ _037FEA88: add sp, sp, #4 ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} bx lr -_037FEA94: .word _038084AC +_037FEA94: .word (SNDi_Work + 0x540) arm_func_start SNDi_SetPlayerParam SNDi_SetPlayerParam: ; 0x037FEA98 @@ -76,7 +76,7 @@ _037FEAD4: add sp, sp, #4 ldmia sp!, {lr} bx lr -_037FEAE0: .word _038084AC +_037FEAE0: .word (SNDi_Work + 0x540) arm_func_start SND_InvalidateBank SND_InvalidateBank: ; 0x037FEAE4 @@ -105,7 +105,7 @@ _037FEB2C: blt _037FEAFC ldmia sp!, {r4, r5, r6, r7, r8, lr} bx lr -_037FEB40: .word _038084AC +_037FEB40: .word (SNDi_Work + 0x540) arm_func_start SND_InvalidateSeq SND_InvalidateSeq: ; 0x037FEB44 @@ -152,7 +152,7 @@ _037FEBC4: add sp, sp, #4 ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} bx lr -_037FEBDC: .word _038084AC +_037FEBDC: .word (SNDi_Work + 0x540) arm_func_start SND_SetTrackAllocatableChannel SND_SetTrackAllocatableChannel: ; 0x037FEBE0 @@ -189,7 +189,7 @@ _037FEC48: add sp, sp, #4 ldmia sp!, {r4, r5, r6, r7, lr} bx lr -_037FEC54: .word _038084AC +_037FEC54: .word (SNDi_Work + 0x540) arm_func_start SND_SetTrackMute SND_SetTrackMute: ; 0x037FEC58 @@ -225,7 +225,7 @@ _037FECBC: add sp, sp, #4 ldmia sp!, {r4, r5, r6, r7, lr} bx lr -_037FECC8: .word _038084AC +_037FECC8: .word (SNDi_Work + 0x540) arm_func_start SND_SkipSeq SND_SkipSeq: ; 0x037FECCC @@ -285,7 +285,7 @@ _037FED58: _037FED88: ldmia sp!, {r4, r5, r6, r7, r8, lr} bx lr -_037FED90: .word _038084AC +_037FED90: .word (SNDi_Work + 0x540) _037FED94: .word SNDi_SharedWork arm_func_start SND_PauseSeq @@ -325,7 +325,7 @@ _037FEE0C: add sp, sp, #4 ldmia sp!, {r4, r5, r6, r7, lr} bx lr -_037FEE18: .word _038084AC +_037FEE18: .word (SNDi_Work + 0x540) arm_func_start SND_StopSeq SND_StopSeq: ; 0x037FEE1C @@ -351,7 +351,7 @@ SND_StopSeq: ; 0x037FEE1C _037FEE68: ldmia sp!, {r4, lr} bx lr -_037FEE70: .word _038084AC +_037FEE70: .word (SNDi_Work + 0x540) _037FEE74: .word SNDi_SharedWork arm_func_start SND_StartSeq @@ -373,7 +373,7 @@ SND_StartPreparedSeq: ; 0x037FEE94 orr r0, r0, #2 strb r0, [r2, r1] bx lr -_037FEEB0: .word _038084AC +_037FEEB0: .word (SNDi_Work + 0x540) arm_func_start SND_PrepareSeq SND_PrepareSeq: ; 0x037FEEB4 @@ -465,8 +465,8 @@ _037FEFF0: add sp, sp, #4 ldmia sp!, {r4, r5, r6, r7, r8, r9, lr} bx lr -_037FEFFC: .word _038084AC -_037FF000: .word _038086EC +_037FEFFC: .word (SNDi_Work + 0x540) +_037FF000: .word (SNDi_Work + 0x780) _037FF004: .word SNDi_SharedWork arm_func_start SND_SeqMain @@ -513,7 +513,7 @@ _037FF07C: strne r5, [r0, #4] ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, lr} bx lr -_037FF0A0: .word _038084AC +_037FF0A0: .word (SNDi_Work + 0x540) _037FF0A4: .word SNDi_SharedWork arm_func_start SND_SeqInit @@ -545,5 +545,5 @@ _037FF0E8: add sp, sp, #4 ldmia sp!, {lr} bx lr -_037FF10C: .word _038084AC -_037FF110: .word _038086EC +_037FF10C: .word (SNDi_Work + 0x540) +_037FF110: .word (SNDi_Work + 0x780) diff --git a/arm7/asm/SND_unk_037FD440.s b/arm7/asm/SND_unk_037FD440.s index 14e4bda9..1ba24f28 100644 --- a/arm7/asm/SND_unk_037FD440.s +++ b/arm7/asm/SND_unk_037FD440.s @@ -16,10 +16,6 @@ _03807F50: ;0x03807F50 _03807F58: ;0x03807F58 .space 0x03807F68 - 0x03807F58 - .global SNDi_SharedWork -SNDi_SharedWork: ;0x03807F68 - .space 0x03807F6C - 0x03807F68 - .section .text arm_func_start FUN_037FD440 @@ -82,7 +78,7 @@ _037FD4F0: blt _037FD4CC mvn r0, #0 bx lr -_037FD500: .word _038086EC +_037FD500: .word (SNDi_Work + 0x780) arm_func_start FUN_037FD504 FUN_037FD504: ; 0x037FD504 @@ -1186,7 +1182,7 @@ _037FE430: add sp, sp, #4 ldmia sp!, {r4, r5, lr} bx lr -_037FE43C: .word _038086EC +_037FE43C: .word (SNDi_Work + 0x780) arm_func_start FUN_037FE440 FUN_037FE440: ; 0x037FE440 @@ -1211,7 +1207,7 @@ FUN_037FE460: ; 0x037FE460 ldrne r0, _037FE488 ; =_038086EC addne r0, r0, r1, lsl #6 bx lr -_037FE488: .word _038086EC +_037FE488: .word (SNDi_Work + 0x780) arm_func_start FUN_037FE48C FUN_037FE48C: ; 0x037FE48C diff --git a/arm7/asm/SND_work.s b/arm7/asm/SND_work.s deleted file mode 100644 index fb7f51e9..00000000 --- a/arm7/asm/SND_work.s +++ /dev/null @@ -1,84 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .section .bss - - .global SNDi_Work -SNDi_Work: ;0x03807F6C - .space 0x038084AC - 0x03807F6C -#todo unsure if these two belong here - .global _038084AC -_038084AC: ;0x038084AC - .space 0x038086EC - 0x038084AC - - .global _038086EC -_038086EC: ;0x038086EC - .space 0x03808EEC - 0x038086EC - - .section .text - - arm_func_start SND_UpdateSharedWork -SND_UpdateSharedWork: ; 0x037FF448 - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #4 - mov r5, #0 - mov r4, r5 - ldr r0, _037FF4E4 ; =SNDi_SharedWork - ldr r0, [r0] - cmp r0, #0 - beq _037FF4D8 - mov r7, r5 - mov r6, #1 -_037FF470: - mov r0, r7 - bl SND_IsChannelActive - cmp r0, #0 - orrne r0, r5, r6, lsl r7 - movne r0, r0, lsl #16 - movne r5, r0, lsr #16 - add r7, r7, #1 - cmp r7, #16 - blt _037FF470 - mov r0, #0 - bl SND_IsCaptureActive - cmp r0, #0 - orrne r0, r4, #1 - movne r0, r0, lsl #16 - movne r4, r0, lsr #16 - mov r0, #1 - bl SND_IsCaptureActive - cmp r0, #0 - orrne r0, r4, #2 - movne r0, r0, lsl #16 - movne r4, r0, lsr #16 - ldr r0, _037FF4E4 ; =SNDi_SharedWork - ldr r1, [r0] - strh r5, [r1, #8] - ldr r0, [r0] - strh r4, [r0, #10] -_037FF4D8: - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, lr} - bx lr -_037FF4E4: .word SNDi_SharedWork - - arm_func_start SND_SetPlayerGlobalVariable -SND_SetPlayerGlobalVariable: ; 0x037FF4E8 - ldr r2, _037FF500 ; =SNDi_SharedWork - ldr r2, [r2] - add r0, r2, r0, lsl #1 - add r0, r0, #512 ; 0x200 - strh r1, [r0, #96] ; 0x60 - bx lr -_037FF500: .word SNDi_SharedWork - - arm_func_start SND_SetPlayerLocalVariable -SND_SetPlayerLocalVariable: ; 0x037FF504 - ldr r3, _037FF520 ; =SNDi_SharedWork - ldr ip, [r3] - mov r3, #36 ; 0x24 - mla r3, r0, r3, ip - add r0, r3, r1, lsl #1 - strh r2, [r0, #32] - bx lr -_037FF520: .word SNDi_SharedWork diff --git a/arm7/lib/include/SND_alarm.h b/arm7/lib/include/SND_alarm.h index 195b90bb..1eca6fe8 100644 --- a/arm7/lib/include/SND_alarm.h +++ b/arm7/lib/include/SND_alarm.h @@ -2,11 +2,11 @@ #define GUARD_SND_ALARM_H #include "global.h" -#include "SND_alarm_shared.h" +#include "nitro/SND_alarm_shared.h" -void SND_StopAlarm(u32 idx); -void SND_StartAlarm(u32 idx); -void SND_SetupAlarm(); -void SND_AlarmInit(); +void SND_AlarmInit(void); +void SND_SetupAlarm(s32 idx, OSTick tick, OSTick period, u32 id); +void SND_StartAlarm(s32 idx); +void SND_StopAlarm(s32 idx); -#endif //GUARD_SND_ALARM_H
\ No newline at end of file +#endif //GUARD_SND_ALARM_H diff --git a/arm7/lib/include/SND_capture.h b/arm7/lib/include/SND_capture.h new file mode 100644 index 00000000..78a09efa --- /dev/null +++ b/arm7/lib/include/SND_capture.h @@ -0,0 +1,6 @@ +#ifndef GUARD_SND_CAPTURE_H +#define GUARD_SND_CAPTURE_H + +BOOL SND_IsCaptureActive(s32 idx); + +#endif //GUARD_SND_CAPTURE_H diff --git a/arm7/lib/include/SND_exChannel.h b/arm7/lib/include/SND_exChannel.h index 05fbe3d7..b9545435 100644 --- a/arm7/lib/include/SND_exChannel.h +++ b/arm7/lib/include/SND_exChannel.h @@ -3,6 +3,6 @@ #include "global.h" -bool SND_IsChannelActive(u32 idx); +BOOL SND_IsChannelActive(s32 idx); -#endif //GUARD_SND_EXCHANNEL_H
\ No newline at end of file +#endif //GUARD_SND_EXCHANNEL_H diff --git a/arm7/lib/include/SND_work.h b/arm7/lib/include/SND_work.h index 9b834c6c..49933fc7 100644 --- a/arm7/lib/include/SND_work.h +++ b/arm7/lib/include/SND_work.h @@ -1,4 +1,13 @@ #ifndef GUARD_SND_WORK_H #define GUARD_SND_WORK_H -#endif //GUARD_SND_WORK_H
\ No newline at end of file +#include "nitro/SND_work_shared.h" + +extern struct SNDWork SNDi_Work; +extern struct SNDSharedWork *SNDi_SharedWork; + +void SND_SetPlayerLocalVariable(u32 player, u32 var, s16 value); +void SND_SetPlayerGlobalVariable(u32 var, s16 value); +void SND_UpdateSharedWork(void); + +#endif //GUARD_SND_WORK_H diff --git a/arm7/lib/src/SND_alarm.c b/arm7/lib/src/SND_alarm.c new file mode 100644 index 00000000..8eef3e19 --- /dev/null +++ b/arm7/lib/src/SND_alarm.c @@ -0,0 +1,70 @@ +#include "SND_alarm.h" + +#include "SND_work.h" +#include "OS_alarm.h" +#include "OS_tick.h" +#include "PXI_fifo.h" + +static void AlarmHandler(void *msg); + +void SND_AlarmInit(void) { + for (s32 i = 0; i < SND_ALARM_COUNT; i++) { + SNDi_Work.alarms[i].enable = 0; + SNDi_Work.alarms[i].id = 0; + } +} + +void SND_SetupAlarm(s32 idx, OSTick tick, OSTick period, u32 id) { + struct SNDAlarm *alarm = &SNDi_Work.alarms[idx]; + + if (alarm->enable) { + OS_CancelAlarm(&alarm->alarm); + alarm->enable = 0; + } + + alarm->tick = tick; + alarm->period = period; + alarm->id = (u8)id; +} + +void SND_StartAlarm(s32 idx) { + OSTick tick; + OSTick period; + + struct SNDAlarm *alarm = &SNDi_Work.alarms[idx]; + + if (alarm->enable != 0) { + OS_CancelAlarm(&alarm->alarm); + alarm->enable = 0; + } + + tick = alarm->tick; + period = alarm->period; + s32 arg = idx | (alarm->id << 8); + + OS_CreateAlarm(&alarm->alarm); + + if (period == 0) { + OS_SetAlarm(&alarm->alarm, tick, AlarmHandler, (void *)arg); + } else { + OS_SetPeriodicAlarm(&alarm->alarm, tick + OS_GetTick(), period, AlarmHandler, (void *)arg); + } + + alarm->enable = 1; +} + +void SND_StopAlarm(s32 idx) { + struct SNDAlarm *alarm = &SNDi_Work.alarms[idx]; + + if (alarm->enable != 0) { + OS_CancelAlarm(&alarm->alarm); + alarm->id++; + alarm->enable = 0; + } +} + +static void AlarmHandler(void *msg) { + while (PXI_SendWordByFifo(7, (u32)msg, 0) < 0) { + // nothing + } +} diff --git a/arm7/lib/src/SND_work.c b/arm7/lib/src/SND_work.c new file mode 100644 index 00000000..4b23056d --- /dev/null +++ b/arm7/lib/src/SND_work.c @@ -0,0 +1,36 @@ +#include "SND_work.h" + +#include "SND_exChannel.h" +#include "SND_capture.h" + +struct SNDWork SNDi_Work; +struct SNDSharedWork *SNDi_SharedWork; + +void SND_SetPlayerLocalVariable(u32 player, u32 var, s16 value) { + SNDi_SharedWork->players[player].localVars[var] = value; +} + +void SND_SetPlayerGlobalVariable(u32 var, s16 value) { + SNDi_SharedWork->globalVars[var] = value; +} + +void SND_UpdateSharedWork(void) { + u16 channelActiveMask = 0; + u16 channelCaptureMask = 0; + + if (SNDi_SharedWork == NULL) + return; + + for (s32 i = 0; i < SND_CHANNEL_COUNT; i++) { + if (SND_IsChannelActive(i)) + channelActiveMask |= 1 << i; + } + + if (SND_IsCaptureActive(0)) + channelCaptureMask |= 0x1; + if (SND_IsCaptureActive(1)) + channelCaptureMask |= 0x2; + + SNDi_SharedWork->channelStatus = channelActiveMask; + SNDi_SharedWork->captureStatus = channelCaptureMask; +} |