summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Panzlaff <michael.panzlaff@fau.de>2021-07-03 14:49:13 +0200
committerMichael Panzlaff <michael.panzlaff@fau.de>2021-08-25 18:03:44 +0200
commit68dcc21efd11140a70419ada34ac5f2d9d526f69 (patch)
tree131c2712f1cd02a59c7eafaf334295a46ef56b1c
parent3f2b6670db01714364e1f1941c75e91df0f478fa (diff)
arm7: decompile SND_bank
-rw-r--r--arm7/asm/SND_bank.s245
-rw-r--r--arm7/lib/include/SND_bank.h11
-rw-r--r--arm7/lib/src/SND_bank.c155
3 files changed, 166 insertions, 245 deletions
diff --git a/arm7/asm/SND_bank.s b/arm7/asm/SND_bank.s
deleted file mode 100644
index acf1ac44..00000000
--- a/arm7/asm/SND_bank.s
+++ /dev/null
@@ -1,245 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .text
-
- arm_func_start GetWaveData
-GetWaveData: ; 0x037FF114
- stmfd sp!, {lr}
- sub sp, sp, #4
- add r0, r0, r1, lsl #3
- ldr r0, [r0, #24]
- cmp r0, #0
- moveq r0, #0
- beq _037FF148
- ldr r1, [r0, #56] ; 0x38
- cmp r2, r1
- movcs r0, #0
- bcs _037FF148
- mov r1, r2
- bl SND_GetWaveDataAddress
-_037FF148:
- add sp, sp, #4
- ldmia sp!, {lr}
- bx lr
-
- arm_func_start SND_NoteOn
-SND_NoteOn: ; 0x037FF154
- stmdb sp!, {r4, r5, r6, r7, r8, r9, lr}
- sub sp, sp, #4
- mov r9, r0
- mov r8, r1
- mov r7, r2
- mov r6, r3
- ldr r5, [sp, #36] ; 0x24
- ldrb r4, [r5, #10]
- cmp r4, #255 ; 0xff
- mvneq r6, #0
- moveq r4, #0
- ldrb r0, [r5]
- cmp r0, #4
- addls pc, pc, r0, lsl #2
- b _037FF210
- b _037FF210
- b _037FF1A4
- b _037FF1EC
- b _037FF200
- b _037FF1A4
-_037FF1A4:
- cmp r0, #1
- ldrneh r1, [r5, #4]
- ldrneh r0, [r5, #2]
- orrne r1, r0, r1, lsl #16
- bne _037FF1CC
- ldr r0, [sp, #32]
- ldrh r1, [r5, #4]
- ldrh r2, [r5, #2]
- bl GetWaveData
- mov r1, r0
-_037FF1CC:
- cmp r1, #0
- moveq r0, #0
- beq _037FF214
- mov r0, r9
- add r2, r1, #12
- mov r3, r6
- bl SND_StartExChannelPcm
- b _037FF214
-_037FF1EC:
- mov r0, r9
- ldrh r1, [r5, #2]
- mov r2, r6
- bl SND_StartExChannelPsg
- b _037FF214
-_037FF200:
- mov r0, r9
- mov r1, r6
- bl SND_StartExChannelNoise
- b _037FF214
-_037FF210:
- mov r0, #0
-_037FF214:
- cmp r0, #0
- moveq r0, #0
- beq _037FF270
- strb r8, [r9, #8]
- ldrb r0, [r5, #6]
- strb r0, [r9, #5]
- strb r7, [r9, #9]
- mov r0, r9
- ldrb r1, [r5, #7]
- bl SND_SetExChannelAttack
- mov r0, r9
- ldrb r1, [r5, #8]
- bl SND_SetExChannelDecay
- mov r0, r9
- ldrb r1, [r5, #9]
- bl SND_SetExChannelSustain
- mov r0, r9
- mov r1, r4
- bl SND_SetExChannelRelease
- ldrb r0, [r5, #11]
- sub r0, r0, #64 ; 0x40
- strb r0, [r9, #10]
- mov r0, #1
-_037FF270:
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, r8, r9, lr}
- bx lr
-
- arm_func_start SND_GetWaveDataAddress
-SND_GetWaveDataAddress: ; 0x037FF27C
- stmdb sp!, {r4, r5, lr}
- sub sp, sp, #4
- mov r5, r0
- mov r4, r1
- bl SNDi_LockMutex
- add r0, r5, r4, lsl #2
- ldr r4, [r0, #60] ; 0x3c
- cmp r4, #0
- beq _037FF2AC
- cmp r4, #33554432 ; 0x2000000
- addcc r4, r5, r4
- b _037FF2B0
-_037FF2AC:
- mov r4, #0
-_037FF2B0:
- bl SNDi_UnlockMutex
- mov r0, r4
- add sp, sp, #4
- ldmia sp!, {r4, r5, lr}
- bx lr
-
- arm_func_start SND_ReadInstData
-SND_ReadInstData: ; 0x037FF2C4
- stmdb sp!, {r4, r5, r6, r7, lr}
- sub sp, sp, #4
- mov r6, r0
- movs r7, r1
- mov r5, r2
- mov r4, r3
- movmi r0, #0
- bmi _037FF43C
- bl SNDi_LockMutex
- ldr r0, [r6, #56] ; 0x38
- cmp r7, r0
- bcc _037FF300
- bl SNDi_UnlockMutex
- mov r0, #0
- b _037FF43C
-_037FF300:
- add r0, r6, r7, lsl #2
- ldr r3, [r0, #60] ; 0x3c
- strb r3, [r4]
- ldrb r0, [r4]
- cmp r0, #17
- addls pc, pc, r0, lsl #2
- b _037FF428
- b _037FF428
- b _037FF364
- b _037FF364
- b _037FF364
- b _037FF364
- b _037FF364
- b _037FF428
- b _037FF428
- b _037FF428
- b _037FF428
- b _037FF428
- b _037FF428
- b _037FF428
- b _037FF428
- b _037FF428
- b _037FF428
- b _037FF384
- b _037FF3D4
-_037FF364:
- add r3, r6, r3, lsr #8
- add r2, r4, #2
- mov r1, #5
-_037FF370:
- ldrh r0, [r3], #2
- strh r0, [r2], #2
- subs r1, r1, #1
- bne _037FF370
- b _037FF434
-_037FF384:
- add r2, r6, r3, lsr #8
- ldrb r1, [r2, #1]
- ldrb r0, [r6, r3, lsr #8]
- cmp r5, r0
- blt _037FF3A0
- cmp r5, r1
- ble _037FF3AC
-_037FF3A0:
- bl SNDi_UnlockMutex
- mov r0, #0
- b _037FF43C
-_037FF3AC:
- sub r1, r5, r0
- mov r0, #12
- mla r0, r1, r0, r2
- add r2, r0, #2
- mov r1, #6
-_037FF3C0:
- ldrh r0, [r2], #2
- strh r0, [r4], #2
- subs r1, r1, #1
- bne _037FF3C0
- b _037FF434
-_037FF3D4:
- mov r2, #0
- add r1, r6, r3, lsr #8
- b _037FF3F8
-_037FF3E0:
- add r2, r2, #1
- cmp r2, #8
- blt _037FF3F8
- bl SNDi_UnlockMutex
- mov r0, #0
- b _037FF43C
-_037FF3F8:
- ldrb r0, [r1, r2]
- cmp r5, r0
- bgt _037FF3E0
- mov r0, #12
- mla r0, r2, r0, r1
- add r2, r0, #8
- mov r1, #6
-_037FF414:
- ldrh r0, [r2], #2
- strh r0, [r4], #2
- subs r1, r1, #1
- bne _037FF414
- b _037FF434
-_037FF428:
- bl SNDi_UnlockMutex
- mov r0, #0
- b _037FF43C
-_037FF434:
- bl SNDi_UnlockMutex
- mov r0, #1
-_037FF43C:
- add sp, sp, #4
- ldmia sp!, {r4, r5, r6, r7, lr}
- bx lr
diff --git a/arm7/lib/include/SND_bank.h b/arm7/lib/include/SND_bank.h
new file mode 100644
index 00000000..36bdc08f
--- /dev/null
+++ b/arm7/lib/include/SND_bank.h
@@ -0,0 +1,11 @@
+#ifndef GUARD_SND_BANK_H
+#define GUARD_SND_BANK_H
+
+#include "nitro/SND_bank_shared.h"
+#include "nitro/types.h"
+
+BOOL SND_ReadInstData(const struct SNDBankData *bankData, s32 program, s32 midiKey, struct SNDInstData *instData);
+const struct SNDWaveData *SND_GetWaveDataAddress(const struct SNDWaveArc *waveArc, s32 wave);
+BOOL SND_NoteOn(struct SNDExChannel *chn, s32 midiKey, s32 velocity, s32 length, const struct SNDBankData *bankData, const struct SNDInstData *instData);
+
+#endif //GUARD_SND_BANK_H
diff --git a/arm7/lib/src/SND_bank.c b/arm7/lib/src/SND_bank.c
new file mode 100644
index 00000000..5c9fb3dd
--- /dev/null
+++ b/arm7/lib/src/SND_bank.c
@@ -0,0 +1,155 @@
+#include "SND_bank.h"
+
+#include "SND_main.h"
+#include "SND_exChannel.h"
+
+#include "mmap.h"
+
+static const struct SNDWaveData *GetWaveData(const struct SNDBankData *bankData, s32 waveArc, s32 wave);
+
+BOOL SND_ReadInstData(const struct SNDBankData *bankData, s32 program, s32 midiKey, struct SNDInstData *instData) {
+ s32 i;
+ struct SNDDrumSet *drumSet;
+ struct SNDKeySplit *keySplit;
+ u32 off;
+ u8 minKey, maxKey;
+
+ if (program < 0)
+ return FALSE;
+
+ SNDi_LockMutex();
+
+ if (program >= bankData->instCount) {
+ SNDi_UnlockMutex();
+ return FALSE;
+ }
+
+ off = bankData->instOffsets[program];
+ instData->type = SND_INST_OFFSET_TYPE(off);
+
+ switch (instData->type) {
+ case SND_INST_PCM:
+ case SND_INST_PSG:
+ case SND_INST_NOISE:
+ case SND_INST_DIRECTPCM:
+ case SND_INST_DUMMY:
+ instData->param = *SND_INST_OFFSET_NORMAL(bankData, off);
+ break;
+ case SND_INST_DRUM_TABLE:
+ drumSet = SND_INST_OFFSET_DRUMS(bankData, off);
+
+ // seperate variables needed for matching
+ maxKey = drumSet->maxKey;
+ minKey = drumSet->minKey;
+
+ if (midiKey < minKey || midiKey > maxKey) {
+ SNDi_UnlockMutex();
+ return FALSE;
+ }
+
+ *instData = drumSet->instruments[midiKey - drumSet->minKey];
+ break;
+ case SND_INST_KEY_SPLIT:
+ i = 0;
+ keySplit = SND_INST_OFFSET_KEYSPL(bankData, off);
+
+ while (midiKey > keySplit->key[i]) {
+ i++;
+ if (i >= SND_INST_MAX_KEYSPLIT) {
+ SNDi_UnlockMutex();
+ return FALSE;
+ }
+ }
+ *instData = keySplit->instruments[i];
+ break;
+ case SND_INST_ILLEGAL:
+ default:
+ SNDi_UnlockMutex();
+ return FALSE;
+ }
+
+ SNDi_UnlockMutex();
+ return TRUE;
+}
+
+const struct SNDWaveData *SND_GetWaveDataAddress(const struct SNDWaveArc *waveArc, s32 wave) {
+ SNDi_LockMutex();
+
+ const struct SNDWaveData *retval = (const struct SNDWaveData *)waveArc->waveOffsets[wave];
+ if (retval != NULL) {
+ if ((u32)retval < HW_MAIN_MEM) {
+ retval = (const struct SNDWaveData *)((u32)waveArc + (u32)retval);
+ }
+ } else {
+ retval = NULL;
+ }
+
+ SNDi_UnlockMutex();
+
+ return retval;
+}
+
+BOOL SND_NoteOn(struct SNDExChannel *chn, s32 midiKey, s32 velocity, s32 length, const struct SNDBankData *bankData, const struct SNDInstData *instData) {
+ const struct SNDWaveData *waveData;
+ u8 release;
+ BOOL success;
+
+ release = instData->param.envRelease;
+
+ if (release == 0xFF) {
+ length = -1;
+ release = 0;
+ }
+
+ switch (instData->type) {
+ case SND_INST_PCM:
+ case SND_INST_DIRECTPCM:
+ if (instData->type == SND_INST_PCM) {
+ waveData = GetWaveData(bankData, instData->param.wave[1], instData->param.wave[0]);
+ } else {
+ waveData = (const struct SNDWaveData *)((instData->param.wave[1] << 16) | instData->param.wave[0]);
+ }
+
+ if (waveData == NULL) {
+ success = FALSE;
+ } else {
+ success = SND_StartExChannelPcm(chn, &waveData->param, waveData->sampleData, length);
+ }
+ break;
+ case SND_INST_PSG:
+ success = SND_StartExChannelPsg(chn, instData->param.wave[0], length);
+ break;
+ case SND_INST_NOISE:
+ success = SND_StartExChannelNoise(chn, length);
+ break;
+ default:
+ success = FALSE;
+ break;
+ }
+
+ if (success == FALSE) {
+ return FALSE;
+ } else {
+ chn->midiKey = (u8)midiKey;
+ chn->rootMidiKey = instData->param.rootKey;
+ chn->velocity = (u8)velocity;
+ SND_SetExChannelAttack(chn, instData->param.envAttack);
+ SND_SetExChannelDecay(chn, instData->param.envDecay);
+ SND_SetExChannelSustain(chn, instData->param.envSustain);
+ SND_SetExChannelRelease(chn, release);
+ chn->initPan = (s8)(instData->param.pan - 0x40);
+ return TRUE;
+ }
+}
+
+static const struct SNDWaveData *GetWaveData(const struct SNDBankData *bankData, s32 waveArc, s32 wave) {
+ const struct SNDWaveArc *arcPtr = bankData->waveArcLinks[waveArc].waveArc;
+
+ if (arcPtr == NULL) {
+ return NULL;
+ } else if (wave < arcPtr->waveCount) {
+ return SND_GetWaveDataAddress(arcPtr, wave);
+ } else {
+ return NULL;
+ }
+}