diff options
author | Michael Panzlaff <michael.panzlaff@fau.de> | 2021-07-03 14:49:13 +0200 |
---|---|---|
committer | Michael Panzlaff <michael.panzlaff@fau.de> | 2021-08-25 18:03:44 +0200 |
commit | 68dcc21efd11140a70419ada34ac5f2d9d526f69 (patch) | |
tree | 131c2712f1cd02a59c7eafaf334295a46ef56b1c | |
parent | 3f2b6670db01714364e1f1941c75e91df0f478fa (diff) |
arm7: decompile SND_bank
-rw-r--r-- | arm7/asm/SND_bank.s | 245 | ||||
-rw-r--r-- | arm7/lib/include/SND_bank.h | 11 | ||||
-rw-r--r-- | arm7/lib/src/SND_bank.c | 155 |
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; + } +} |