summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Panzlaff <michael.panzlaff@fau.de>2021-06-25 23:43:40 +0200
committerMichael Panzlaff <michael.panzlaff@fau.de>2021-08-25 18:03:39 +0200
commiteb13294661514e27b3b89e26b7a4401cc93feb93 (patch)
treeadbcbc5c6e3bc1c4360fcdf654ebd6ff915029f5
parent69200d83f7bf3c189e226f3561cef3a6ee7ee6ce (diff)
decompile SND_alarm and SND_work
-rw-r--r--arm7/asm/SND_alarm.s144
-rw-r--r--arm7/asm/SND_seq.s30
-rw-r--r--arm7/asm/SND_unk_037FD440.s10
-rw-r--r--arm7/asm/SND_work.s84
-rw-r--r--arm7/lib/include/SND_alarm.h12
-rw-r--r--arm7/lib/include/SND_capture.h6
-rw-r--r--arm7/lib/include/SND_exChannel.h4
-rw-r--r--arm7/lib/include/SND_work.h11
-rw-r--r--arm7/lib/src/SND_alarm.c70
-rw-r--r--arm7/lib/src/SND_work.c36
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;
+}