summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm7/asm/SND_main.s193
-rw-r--r--arm7/lib/include/SND.h10
-rw-r--r--arm7/lib/include/SND_command.h7
-rw-r--r--arm7/lib/include/SND_exChannel.h5
-rw-r--r--arm7/lib/include/SND_main.h16
-rw-r--r--arm7/lib/include/SND_seq.h7
-rw-r--r--arm7/lib/include/SND_util.h8
-rw-r--r--arm7/lib/src/SND_main.c114
8 files changed, 166 insertions, 194 deletions
diff --git a/arm7/asm/SND_main.s b/arm7/asm/SND_main.s
deleted file mode 100644
index 2349de5b..00000000
--- a/arm7/asm/SND_main.s
+++ /dev/null
@@ -1,193 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .section .bss
-
- .global _03807A30
-_03807A30: ;0x03807A30
- .space 0x03807A34 - 0x03807A30
-
- .global _03807A34
-_03807A34: ;0x03807A34
- .space 0x03807A54 - 0x03807A34
-
- .global _03807A54
-_03807A54: ;0x03807A54
- .space 0x03807A74 - 0x03807A54
-
- .global _03807A74
-_03807A74: ;0x03807A74
- .space 0x03807AA0 - 0x03807A74
-
- .global _03807AA0
-_03807AA0: ;0x03807AA0
- .space 0x03807F44 - 0x03807AA0
-
- .section .text
-
- arm_func_start SndThread
-SndThread: ; 0x037FC2B0
- stmdb sp!, {r4, r5, r6, lr}
- bl SND_InitIntervalTimer
- bl SND_ExChannelInit
- bl SND_SeqInit
- bl SND_AlarmInit
- bl SND_Enable
- mov r0, #0
- mov r1, r0
- mov r2, r0
- mov r3, r0
- bl SND_SetOutputSelector
- mov r0, #127 ; 0x7f
- bl SND_SetMasterVolume
- bl SND_StartIntervalTimer
- mov r4, #1
- mov r5, #0
-_037FC2F0:
- mov r6, r5
- bl SND_WaitForIntervalTimer
- cmp r0, #1
- beq _037FC308
- cmp r0, #2
- b _037FC30C
-_037FC308:
- mov r6, r4
-_037FC30C:
- bl SND_UpdateExChannel
- bl SND_CommandProc
- mov r0, r6
- bl SND_SeqMain
- mov r0, r6
- bl SND_ExChannelMain
- bl SND_UpdateSharedWork
- bl SND_CalcRandom
- b _037FC2F0
-_037FC330:
- ldr r0, _037FC344 ; =_03807A54
- mov r1, #1
- mov r2, #0
- ldr ip, _037FC348 ; =OS_SendMessage
- bx ip
-_037FC344: .word _03807A54
-_037FC348: .word OS_SendMessage
-
- arm_func_start SNDi_UnlockMutex
-SNDi_UnlockMutex: ; 0x037FC34C
- bx lr
-
- arm_func_start SNDi_LockMutex
-SNDi_LockMutex: ; 0x037FC350
- bx lr
-
- arm_func_start SND_SendWakeupMessage
-SND_SendWakeupMessage: ; 0x037FC354
- ldr r0, _037FC368 ; =_03807A54
- mov r1, #2
- mov r2, #0
- ldr ip, _037FC36C ; =OS_SendMessage
- bx ip
-_037FC368: .word _03807A54
-_037FC36C: .word OS_SendMessage
-
- arm_func_start SND_WaitForIntervalTimer
-SND_WaitForIntervalTimer: ; 0x037FC370
- stmfd sp!, {lr}
- sub sp, sp, #4
- ldr r0, _037FC398 ; =_03807A54
- add r1, sp, #0
- mov r2, #1
- bl OS_ReceiveMessage
- ldr r0, [sp]
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_037FC398: .word _03807A54
-
- arm_func_start SND_StopIntervalTimer
-SND_StopIntervalTimer: ; 0x037FC39C
- ldr r0, _037FC3A8 ; =_03807A74
- ldr ip, _037FC3AC ; =OS_CancelAlarm
- bx ip
-_037FC3A8: .word _03807A74
-_037FC3AC: .word OS_CancelAlarm
-
- arm_func_start SND_StartIntervalTimer
-SND_StartIntervalTimer: ; 0x037FC3B0
- stmfd sp!, {lr}
- sub sp, sp, #12
- bl OS_GetTick
- mov ip, r0
- ldr r0, _037FC3FC ; =_037FC330
- str r0, [sp, #4]
- mov r0, #0
- str r0, [sp, #8]
- ldr r3, _037FC400 ; =0x00000AA8
- str r0, [sp]
- ldr r0, _037FC404 ; =_03807A74
- mov r2, #65536 ; 0x10000
- adds ip, ip, r2
- adc r2, r1, #0
- mov r1, ip
- bl OS_SetPeriodicAlarm
- add sp, sp, #12
- ldmia sp!, {lr}
- bx lr
-_037FC3FC: .word _037FC330
-_037FC400: .word 0x00000AA8
-_037FC404: .word _03807A74
-
- arm_func_start SND_InitIntervalTimer
-SND_InitIntervalTimer: ; 0x037FC408
- stmfd sp!, {lr}
- sub sp, sp, #4
- ldr r0, _037FC434 ; =_03807A54
- ldr r1, _037FC438 ; =_03807A34
- mov r2, #8
- bl OS_InitMessageQueue
- ldr r0, _037FC43C ; =_03807A74
- bl OS_CreateAlarm
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-_037FC434: .word _03807A54
-_037FC438: .word _03807A34
-_037FC43C: .word _03807A74
-
- arm_func_start SND_CreateThread
-SND_CreateThread: ; 0x037FC440
- stmfd sp!, {lr}
- sub sp, sp, #12
- mov r1, #1024 ; 0x400
- str r1, [sp]
- str r0, [sp, #4]
- ldr r0, _037FC47C ; =_03807AA0
- ldr r1, _037FC480 ; =SndThread
- mov r2, #0
- ldr r3, _037FC484 ; =_03807F44
- bl OS_CreateThread
- ldr r0, _037FC47C ; =_03807AA0
- bl OS_WakeupThreadDirect
- add sp, sp, #12
- ldmia sp!, {lr}
- bx lr
-_037FC47C: .word _03807AA0
-_037FC480: .word SndThread
-_037FC484: .word _03807F44
-
- arm_func_start SND_Init
-SND_Init: ; 0x037FC488
- stmdb sp!, {r4, lr}
- mov r4, r0
- ldr r0, _037FC4BC ; =_03807A30
- ldr r1, [r0]
- cmp r1, #0
- bne _037FC4B4
- mov r1, #1
- str r1, [r0]
- bl SND_CommandInit
- mov r0, r4
- bl SND_CreateThread
-_037FC4B4:
- ldmia sp!, {r4, lr}
- bx lr
-_037FC4BC: .word _03807A30
diff --git a/arm7/lib/include/SND.h b/arm7/lib/include/SND.h
new file mode 100644
index 00000000..69db1a16
--- /dev/null
+++ b/arm7/lib/include/SND.h
@@ -0,0 +1,10 @@
+#ifndef GUARD_SND_H
+#define GUARD_SND_H
+
+#include "nitro/types.h"
+
+void SND_Enable(void);
+void SND_SetOutputSelector(u8 leftOutputFrom, u8 rightOutputFrom, u8 outputCh1ToMixer, u8 outputCh3ToMixer);
+void SND_SetMasterVolume(u8 vol);
+
+#endif //GUARD_SND_H
diff --git a/arm7/lib/include/SND_command.h b/arm7/lib/include/SND_command.h
new file mode 100644
index 00000000..ea5452b9
--- /dev/null
+++ b/arm7/lib/include/SND_command.h
@@ -0,0 +1,7 @@
+#ifndef GUARD_SND_COMMAND_H
+#define GUARD_SND_COMMAND_H
+
+void SND_CommandInit(void);
+void SND_CommandProc(void);
+
+#endif //GUARD_SND_COMMAND_H
diff --git a/arm7/lib/include/SND_exChannel.h b/arm7/lib/include/SND_exChannel.h
index b9545435..976d2786 100644
--- a/arm7/lib/include/SND_exChannel.h
+++ b/arm7/lib/include/SND_exChannel.h
@@ -1,8 +1,11 @@
#ifndef GUARD_SND_EXCHANNEL_H
#define GUARD_SND_EXCHANNEL_H
-#include "global.h"
+#include "nitro/types.h"
+void SND_ExChannelInit(void);
BOOL SND_IsChannelActive(s32 idx);
+void SND_UpdateExChannel(void);
+void SND_ExChannelMain(BOOL update);
#endif //GUARD_SND_EXCHANNEL_H
diff --git a/arm7/lib/include/SND_main.h b/arm7/lib/include/SND_main.h
new file mode 100644
index 00000000..eba3ff44
--- /dev/null
+++ b/arm7/lib/include/SND_main.h
@@ -0,0 +1,16 @@
+#ifndef GUARD_SND_MAIN_H
+#define GUARD_SND_MAIN_H
+
+#include "nitro/types.h"
+
+void SND_Init(u32 priority);
+void SND_CreateThread(u32 priority);
+void SND_InitIntervalTimer(void);
+void SND_StartIntervalTimer(void);
+void SND_StopIntervalTimer(void);
+u32 SND_WaitForIntervalTimer(void);
+void SND_SendWakeupMessage(void);
+void SNDi_LockMutex(void);
+void SNDi_UnlockMutex(void);
+
+#endif //GUARD_SND_MAIN_H
diff --git a/arm7/lib/include/SND_seq.h b/arm7/lib/include/SND_seq.h
new file mode 100644
index 00000000..642cff3e
--- /dev/null
+++ b/arm7/lib/include/SND_seq.h
@@ -0,0 +1,7 @@
+#ifndef GUARD_SND_SEQ_H
+#define GUARD_SND_SEQ_H
+
+void SND_SeqInit(void);
+void SND_SeqMain(BOOL update);
+
+#endif //GUARD_SND_SEQ_H
diff --git a/arm7/lib/include/SND_util.h b/arm7/lib/include/SND_util.h
new file mode 100644
index 00000000..babf2a87
--- /dev/null
+++ b/arm7/lib/include/SND_util.h
@@ -0,0 +1,8 @@
+#ifndef GUARD_SND_UTIL_H
+#define GUARD_SND_UTIL_H
+
+#include "nitro/types.h"
+
+u32 SND_CalcRandom(void);
+
+#endif //GUARD_SND_UTIL_H
diff --git a/arm7/lib/src/SND_main.c b/arm7/lib/src/SND_main.c
new file mode 100644
index 00000000..96dcdc78
--- /dev/null
+++ b/arm7/lib/src/SND_main.c
@@ -0,0 +1,114 @@
+#include "SND_main.h"
+
+#include "global.h"
+
+#include "SND.h"
+#include "SND_alarm.h"
+#include "SND_capture.h"
+#include "SND_command.h"
+#include "SND_exChannel.h"
+#include "SND_seq.h"
+#include "SND_util.h"
+#include "SND_work.h"
+
+#include "OS_alarm.h"
+#include "OS_thread.h"
+#include "OS_message.h"
+#include "OS_tick.h"
+
+static void FUN_037fc330(void *);
+static void SndThread(void *);
+
+u8 sThreadStack[0x400];
+OSThread sThread;
+OSAlarm sAlarm;
+OSMessageQueue sMessageQueue;
+OSMessage sMessageArray[8];
+u32 sInitialized = 0;
+
+void SND_Init(u32 priority) {
+ if (sInitialized == 0) {
+ sInitialized = 1;
+ SND_CommandInit();
+ SND_CreateThread(priority);
+ }
+}
+
+void SND_CreateThread(u32 priority) {
+ OS_CreateThread(&sThread, SndThread, NULL, &sThreadStack[sizeof(sThreadStack)], sizeof(sThreadStack), priority);
+ OS_WakeupThreadDirect(&sThread);
+}
+
+void SND_InitIntervalTimer(void) {
+ OS_InitMessageQueue(&sMessageQueue, sMessageArray, 8);
+ OS_CreateAlarm(&sAlarm);
+}
+
+void SND_StartIntervalTimer(void) {
+ OSTick tick = OS_GetTick();
+ OS_SetPeriodicAlarm(&sAlarm, tick + 0x10000, 2728, FUN_037fc330, NULL);
+}
+
+void SND_StopIntervalTimer(void) {
+ OS_CancelAlarm(&sAlarm);
+}
+
+u32 SND_WaitForIntervalTimer(void) {
+ OSMessage result;
+ (void)OS_ReceiveMessage(&sMessageQueue, &result, 1);
+ return (u32)result;
+}
+
+void SND_SendWakeupMessage(void) {
+ (void)OS_SendMessage(&sMessageQueue, (OSMessage)2, 0);
+}
+
+void SNDi_LockMutex(void) {
+ // nothing
+}
+
+void SNDi_UnlockMutex(void) {
+ // nothing
+}
+
+static void FUN_037fc330(void *arg) {
+ (void)arg;
+ (void)OS_SendMessage(&sMessageQueue, (OSMessage)1, 0);
+}
+
+static void SndThread(void *arg) {
+ (void)arg;
+
+ SND_InitIntervalTimer();
+ SND_ExChannelInit();
+ SND_SeqInit();
+ SND_AlarmInit();
+ SND_Enable();
+ SND_SetOutputSelector(0, 0, 0, 0);
+ SND_SetMasterVolume(0x7F);
+ SND_StartIntervalTimer();
+
+ while (1) {
+ BOOL update = FALSE;
+
+ u32 result = SND_WaitForIntervalTimer();
+
+ switch (result) {
+ case 2:
+ update = FALSE;
+ break;
+ case 1:
+ update = TRUE;
+ break;
+ }
+
+ SND_UpdateExChannel();
+ SND_CommandProc();
+
+ SND_SeqMain(update);
+ SND_ExChannelMain(update);
+
+ SND_UpdateSharedWork();
+ (void)SND_CalcRandom();
+ }
+}