diff options
-rw-r--r-- | arm7/asm/SND_main.s | 193 | ||||
-rw-r--r-- | arm7/lib/include/SND.h | 10 | ||||
-rw-r--r-- | arm7/lib/include/SND_command.h | 7 | ||||
-rw-r--r-- | arm7/lib/include/SND_exChannel.h | 5 | ||||
-rw-r--r-- | arm7/lib/include/SND_main.h | 16 | ||||
-rw-r--r-- | arm7/lib/include/SND_seq.h | 7 | ||||
-rw-r--r-- | arm7/lib/include/SND_util.h | 8 | ||||
-rw-r--r-- | arm7/lib/src/SND_main.c | 114 |
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(); + } +} |