From bc451c7cca2b74d92c2615b5ab60c94d5c724af4 Mon Sep 17 00:00:00 2001 From: red031000 Date: Sun, 22 Aug 2021 00:33:00 +0100 Subject: litearlly two item icons --- files/itemtool/itemdata/item_icon/.gitignore | 4 ++++ files/itemtool/itemdata/item_icon/narc_0176.NCGR | Bin 560 -> 0 bytes files/itemtool/itemdata/item_icon/narc_0176.png | Bin 0 -> 277 bytes files/itemtool/itemdata/item_icon/narc_0177.NCLR | Bin 552 -> 0 bytes files/itemtool/itemdata/item_icon/narc_0178.NCGR | Bin 560 -> 0 bytes files/itemtool/itemdata/item_icon/narc_0178.png | Bin 0 -> 292 bytes files/itemtool/itemdata/item_icon/narc_0179.NCLR | Bin 552 -> 0 bytes filesystem.mk | 6 +++++- graphics_rules.mk | 6 ++++++ 9 files changed, 15 insertions(+), 1 deletion(-) delete mode 100644 files/itemtool/itemdata/item_icon/narc_0176.NCGR create mode 100644 files/itemtool/itemdata/item_icon/narc_0176.png delete mode 100644 files/itemtool/itemdata/item_icon/narc_0177.NCLR delete mode 100644 files/itemtool/itemdata/item_icon/narc_0178.NCGR create mode 100644 files/itemtool/itemdata/item_icon/narc_0178.png delete mode 100644 files/itemtool/itemdata/item_icon/narc_0179.NCLR diff --git a/files/itemtool/itemdata/item_icon/.gitignore b/files/itemtool/itemdata/item_icon/.gitignore index 6710dbd1..44e4e13d 100644 --- a/files/itemtool/itemdata/item_icon/.gitignore +++ b/files/itemtool/itemdata/item_icon/.gitignore @@ -172,3 +172,7 @@ narc_0172.NCGR narc_0172.NCLR narc_0174.NCGR narc_0174.NCLR +narc_0176.NCGR +narc_0176.NCLR +narc_0178.NCGR +narc_0178.NCLR diff --git a/files/itemtool/itemdata/item_icon/narc_0176.NCGR b/files/itemtool/itemdata/item_icon/narc_0176.NCGR deleted file mode 100644 index a3e9ccc7..00000000 Binary files a/files/itemtool/itemdata/item_icon/narc_0176.NCGR and /dev/null differ diff --git a/files/itemtool/itemdata/item_icon/narc_0176.png b/files/itemtool/itemdata/item_icon/narc_0176.png new file mode 100644 index 00000000..639d3cce Binary files /dev/null and b/files/itemtool/itemdata/item_icon/narc_0176.png differ diff --git a/files/itemtool/itemdata/item_icon/narc_0177.NCLR b/files/itemtool/itemdata/item_icon/narc_0177.NCLR deleted file mode 100644 index c732a021..00000000 Binary files a/files/itemtool/itemdata/item_icon/narc_0177.NCLR and /dev/null differ diff --git a/files/itemtool/itemdata/item_icon/narc_0178.NCGR b/files/itemtool/itemdata/item_icon/narc_0178.NCGR deleted file mode 100644 index 8e933bc2..00000000 Binary files a/files/itemtool/itemdata/item_icon/narc_0178.NCGR and /dev/null differ diff --git a/files/itemtool/itemdata/item_icon/narc_0178.png b/files/itemtool/itemdata/item_icon/narc_0178.png new file mode 100644 index 00000000..35073906 Binary files /dev/null and b/files/itemtool/itemdata/item_icon/narc_0178.png differ diff --git a/files/itemtool/itemdata/item_icon/narc_0179.NCLR b/files/itemtool/itemdata/item_icon/narc_0179.NCLR deleted file mode 100644 index acb93512..00000000 Binary files a/files/itemtool/itemdata/item_icon/narc_0179.NCLR and /dev/null differ diff --git a/filesystem.mk b/filesystem.mk index c0cd6ac5..e3f1f318 100644 --- a/filesystem.mk +++ b/filesystem.mk @@ -1756,7 +1756,11 @@ files/itemtool/itemdata/item_icon.narc: \ files/itemtool/itemdata/item_icon/narc_0172.NCGR \ files/itemtool/itemdata/item_icon/narc_0172.NCLR \ files/itemtool/itemdata/item_icon/narc_0174.NCGR \ - files/itemtool/itemdata/item_icon/narc_0174.NCLR + files/itemtool/itemdata/item_icon/narc_0174.NCLR \ + files/itemtool/itemdata/item_icon/narc_0176.NCGR \ + files/itemtool/itemdata/item_icon/narc_0176.NCLR \ + files/itemtool/itemdata/item_icon/narc_0178.NCGR \ + files/itemtool/itemdata/item_icon/narc_0178.NCLR files/application/custom_ball/data/cb_data.narc: \ diff --git a/graphics_rules.mk b/graphics_rules.mk index 80f178f0..5bad9e5e 100644 --- a/graphics_rules.mk +++ b/graphics_rules.mk @@ -81,6 +81,8 @@ CLOBBER_SIZE_VERSION101_NCGR_FILES := files/graphic/bag_gra/narc_0002.NCGR \ files/itemtool/itemdata/item_icon/narc_0170.NCGR \ files/itemtool/itemdata/item_icon/narc_0172.NCGR \ files/itemtool/itemdata/item_icon/narc_0174.NCGR \ + files/itemtool/itemdata/item_icon/narc_0176.NCGR \ + files/itemtool/itemdata/item_icon/narc_0178.NCGR \ files/poketool/icongra/poke_icon/narc_0007.NCGR \ files/poketool/icongra/poke_icon/narc_0008.NCGR \ files/poketool/icongra/poke_icon/narc_0009.NCGR \ @@ -628,6 +630,8 @@ NCGR_CLEAN_LIST := files/application/wifi_earth/wifi_earth/narc_0005.NCGR \ files/itemtool/itemdata/item_icon/narc_0170.NCGR \ files/itemtool/itemdata/item_icon/narc_0172.NCGR \ files/itemtool/itemdata/item_icon/narc_0174.NCGR \ + files/itemtool/itemdata/item_icon/narc_0176.NCGR \ + files/itemtool/itemdata/item_icon/narc_0178.NCGR \ files/poketool/icongra/poke_icon/narc_0007.NCGR \ files/poketool/icongra/poke_icon/narc_0008.NCGR \ files/poketool/icongra/poke_icon/narc_0009.NCGR \ @@ -920,6 +924,8 @@ NCLR_CLEAN_LIST := files/application/wifi_earth/wifi_earth/narc_0006.NCLR \ files/itemtool/itemdata/item_icon/narc_0170.NCLR \ files/itemtool/itemdata/item_icon/narc_0172.NCLR \ files/itemtool/itemdata/item_icon/narc_0174.NCLR \ + files/itemtool/itemdata/item_icon/narc_0176.NCLR \ + files/itemtool/itemdata/item_icon/narc_0178.NCLR \ files/poketool/icongra/poke_icon/narc_0000.NCLR \ files/poketool/pokegra/pokegra/narc_0010.NCLR \ files/poketool/pokegra/pokegra/narc_0011.NCLR \ -- cgit v1.2.3 From 3fdad08888cb5f9b72e30613e1b1c951e3a07be6 Mon Sep 17 00:00:00 2001 From: red031000 Date: Sun, 22 Aug 2021 04:03:11 +0100 Subject: MOD59_SetupBg --- arm9/modules/59/asm/mod59_021D74E0_asm.s | 208 ------------------------------- arm9/modules/59/include/mod59_021D74E0.h | 6 +- arm9/modules/59/src/mod59_021D74E0_src.c | 88 ++++++++++++- arm9/src/font.c | 2 +- include/font.h | 2 +- 5 files changed, 90 insertions(+), 216 deletions(-) diff --git a/arm9/modules/59/asm/mod59_021D74E0_asm.s b/arm9/modules/59/asm/mod59_021D74E0_asm.s index 6e1c1392..5c7a519e 100644 --- a/arm9/modules/59/asm/mod59_021D74E0_asm.s +++ b/arm9/modules/59/asm/mod59_021D74E0_asm.s @@ -5,214 +5,6 @@ .extern MOD59_021D7730 - thumb_func_start MOD59_021D778C -MOD59_021D778C: ; 0x021D778C - push {r3, r4, r5, lr} - sub sp, #0x78 - ldr r5, _021D7954 ; =0x021D9F18 - add r4, r0, #0 - add r3, sp, #0x50 - mov r2, #5 -_021D7798: - ldmia r5!, {r0, r1} - stmia r3!, {r0, r1} - sub r2, r2, #1 - bne _021D7798 - add r0, sp, #0x50 - bl GX_SetBanks - ldr r0, [r4] - bl BgConfig_Alloc - add r3, sp, #0x40 - ldr r5, _021D7958 ; =0x021D9DCC - str r0, [r4, #0x18] - add r2, r3, #0 - ldmia r5!, {r0, r1} - stmia r3!, {r0, r1} - ldmia r5!, {r0, r1} - stmia r3!, {r0, r1} - add r0, r2, #0 - bl SetBothScreensModesAndDisable - ldr r5, _021D795C ; =0x021D9EA0 - add r3, sp, #0x24 - ldmia r5!, {r0, r1} - add r2, r3, #0 - stmia r3!, {r0, r1} - ldmia r5!, {r0, r1} - stmia r3!, {r0, r1} - ldmia r5!, {r0, r1} - stmia r3!, {r0, r1} - ldr r0, [r5] - mov r1, #0 - str r0, [r3] - mov r0, #0xf - strb r0, [r2, #0x12] - mov r0, #6 - strb r0, [r2, #0x13] - ldr r0, [r4, #0x18] - add r3, r1, #0 - bl InitBgFromTemplate - ldr r0, [r4, #0x18] - mov r1, #0 - bl BgClearTilemapBufferAndCommit - mov r0, #0xe - add r2, sp, #0x24 - strb r0, [r2, #0x12] - mov r0, #5 - strb r0, [r2, #0x13] - ldr r0, [r4, #0x18] - mov r1, #1 - mov r3, #0 - bl InitBgFromTemplate - ldr r0, [r4, #0x18] - mov r1, #1 - bl BgClearTilemapBufferAndCommit - mov r0, #0xd - add r2, sp, #0x24 - strb r0, [r2, #0x12] - mov r0, #4 - strb r0, [r2, #0x13] - ldr r0, [r4, #0x18] - mov r1, #2 - mov r3, #0 - bl InitBgFromTemplate - ldr r0, [r4, #0x18] - mov r1, #2 - bl BgClearTilemapBufferAndCommit - mov r0, #0xc - add r2, sp, #0x24 - strb r0, [r2, #0x12] - mov r1, #3 - strb r1, [r2, #0x13] - ldr r0, [r4, #0x18] - mov r3, #0 - bl InitBgFromTemplate - ldr r0, [r4, #0x18] - mov r1, #3 - bl BgClearTilemapBufferAndCommit - mov r1, #0 - str r1, [sp] - ldr r0, [r4] - ldr r2, _021D7960 ; =0x000003E2 - str r0, [sp, #4] - ldr r0, [r4, #0x18] - mov r3, #4 - bl FUN_0200CD68 - mov r1, #0 - str r1, [sp] - ldr r0, [r4] - ldr r2, _021D7964 ; =0x000003D9 - str r0, [sp, #4] - ldr r0, [r4, #0x18] - mov r3, #3 - bl FUN_0200CB00 - ldr r2, [r4] - mov r0, #0 - mov r1, #0xa0 - bl FUN_02002ED0 - ldr r2, [r4] - mov r0, #0 - mov r1, #0xc0 - bl FUN_02002EEC - ldr r5, _021D7968 ; =0x021D9EBC - add r3, sp, #8 - ldmia r5!, {r0, r1} - add r2, r3, #0 - stmia r3!, {r0, r1} - ldmia r5!, {r0, r1} - stmia r3!, {r0, r1} - ldmia r5!, {r0, r1} - stmia r3!, {r0, r1} - ldr r0, [r5] - mov r1, #0xf - str r0, [r3] - add r0, sp, #8 - strb r1, [r0, #0x12] - mov r1, #6 - strb r1, [r0, #0x13] - ldr r0, [r4, #0x18] - mov r1, #4 - mov r3, #0 - bl InitBgFromTemplate - ldr r0, [r4, #0x18] - mov r1, #4 - bl BgClearTilemapBufferAndCommit - mov r1, #0xe - add r0, sp, #8 - strb r1, [r0, #0x12] - mov r1, #5 - strb r1, [r0, #0x13] - ldr r0, [r4, #0x18] - add r2, sp, #8 - mov r3, #0 - bl InitBgFromTemplate - ldr r0, [r4, #0x18] - mov r1, #5 - bl BgClearTilemapBufferAndCommit - mov r1, #0xd - add r0, sp, #8 - strb r1, [r0, #0x12] - mov r1, #4 - strb r1, [r0, #0x13] - ldr r0, [r4, #0x18] - mov r1, #6 - add r2, sp, #8 - mov r3, #0 - bl InitBgFromTemplate - ldr r0, [r4, #0x18] - mov r1, #6 - bl BgClearTilemapBufferAndCommit - mov r1, #0xc - add r0, sp, #8 - strb r1, [r0, #0x12] - mov r1, #3 - strb r1, [r0, #0x13] - ldr r0, [r4, #0x18] - mov r1, #7 - add r2, sp, #8 - mov r3, #0 - bl InitBgFromTemplate - ldr r0, [r4, #0x18] - mov r1, #7 - bl BgClearTilemapBufferAndCommit - mov r0, #0 - add r1, r0, #0 - bl ToggleBgLayer - mov r0, #1 - mov r1, #0 - bl ToggleBgLayer - mov r0, #2 - mov r1, #0 - bl ToggleBgLayer - mov r0, #3 - mov r1, #0 - bl ToggleBgLayer - mov r0, #4 - mov r1, #0 - bl ToggleBgLayer - mov r0, #5 - mov r1, #0 - bl ToggleBgLayer - mov r0, #6 - mov r1, #0 - bl ToggleBgLayer - mov r0, #7 - mov r1, #0 - bl ToggleBgLayer - add r0, r4, #0 - bl MOD59_021D8058 - mov r0, #0 - str r0, [r4, #0x78] - add sp, #0x78 - pop {r3, r4, r5, pc} - .align 2, 0 -_021D7954: .word MOD59_021D9F18 -_021D7958: .word MOD59_021D9DCC -_021D795C: .word MOD59_021D9EA0 -_021D7960: .word 0x000003E2 -_021D7964: .word 0x000003D9 -_021D7968: .word MOD59_021D9EBC - thumb_func_end MOD59_021D778C - thumb_func_start MOD59_021D796C MOD59_021D796C: ; 0x021D796C push {r4, lr} diff --git a/arm9/modules/59/include/mod59_021D74E0.h b/arm9/modules/59/include/mod59_021D74E0.h index d6f52bba..0a594ad3 100644 --- a/arm9/modules/59/include/mod59_021D74E0.h +++ b/arm9/modules/59/include/mod59_021D74E0.h @@ -23,11 +23,12 @@ typedef struct MOD59_OverlayData u32 Unk0C; u32 Unk10; struct UnkStruct_02006234 *Unk14; - struct BgConfig *Unk18; + struct BgConfig *bgConfig; u8 padding[0x54]; struct MOD59_UnkPlayerStruct *playerStruct; struct MOD59_UnkPlayerStruct *rivalStruct; - u8 padding2[0x10]; + u32 Unk78; + u8 padding2[0xC]; u8 Unk88; u8 Unk89; u8 Unk8A; @@ -42,5 +43,6 @@ BOOL MOD59_021D7564(struct UnkStruct_02006234 *param0, u32 *param1); BOOL MOD59_021D76C0(struct UnkStruct_02006234 *param0); void MOD59_021D7724(MOD59_OverlayData *data); BOOL MOD59_021D7730(void); +void MOD59_SetupBg(MOD59_OverlayData *data); #endif //POKEDIAMOND_MOD59_021D74E0_H diff --git a/arm9/modules/59/src/mod59_021D74E0_src.c b/arm9/modules/59/src/mod59_021D74E0_src.c index e104cf4f..92880515 100644 --- a/arm9/modules/59/src/mod59_021D74E0_src.c +++ b/arm9/modules/59/src/mod59_021D74E0_src.c @@ -13,12 +13,18 @@ extern void *FUN_02077A84(u32 heap_id, u32 param1, u32 param2, u32 param3, struc extern void FUN_0200E3A0(PMLCDTarget, int); -extern void MOD59_021D778C(MOD59_OverlayData *data); +//todo move with the other rodata +extern struct GraphicsBanks MOD59_021D9F18; +extern struct GraphicsModes MOD59_021D9DCC; +extern struct BgTemplate MOD59_021D9EA0; +extern struct BgTemplate MOD59_021D9EBC; + extern void MOD59_021D79F8(MOD59_OverlayData *data); extern void MOD59_021D7A34(MOD59_OverlayData *data); extern void MOD59_021D796C(MOD59_OverlayData *data); extern void MOD59_021D7A4C(MOD59_OverlayData *data); extern void MOD59_021D7A5C(MOD59_OverlayData *data); +extern void MOD59_021D8058(MOD59_OverlayData *data); extern u32 MOD59_021D8920(MOD59_OverlayData *data); extern void FUN_0200E1D0(u32 param0, u32 param1, u32 param2, u32 param3, u32 param4, u32 param5, u32 heap_id); @@ -26,13 +32,17 @@ extern u32 FUN_0200E308(void); extern void FUN_02077AC4(void *param0); +extern void FUN_0200CD68(struct BgConfig *param0, u32 param1, u32 param2, u32 param3, u8 frame_id, u32 heap_id); + +extern void FUN_0200CB00(struct BgConfig *param0, u32 param1, u32 param2, u32 param3, u8 frame_id, u32 heap_id); + FS_EXTERN_OVERLAY(MODULE_52); THUMB_FUNC BOOL MOD59_Init(struct UnkStruct_02006234 *param0) { CreateHeap(3, 0x52, 1 << 18); MOD59_OverlayData *data = (MOD59_OverlayData *) OverlayManager_CreateAndGetData(param0, sizeof(MOD59_OverlayData), 0x52); - (void)memset((void *)data, 0, 0xb4); + (void)memset((void *)data, 0, sizeof(MOD59_OverlayData)); data->heap_id = 0x52; s32 *field18 = OverlayManager_GetField18(param0); @@ -72,7 +82,7 @@ THUMB_FUNC BOOL MOD59_021D7564(struct UnkStruct_02006234 *param0, u32 *param1) SetKeyRepeatTimers(4, 8); - MOD59_021D778C(data); + MOD59_SetupBg(data); MOD59_021D79F8(data); MOD59_021D7A4C(data); @@ -177,7 +187,7 @@ THUMB_FUNC BOOL MOD59_021D76C0(struct UnkStruct_02006234 *param0) THUMB_FUNC void MOD59_021D7724(MOD59_OverlayData *data) { - DoScheduledBgGpuUpdates(data->Unk18); + DoScheduledBgGpuUpdates(data->bgConfig); } THUMB_FUNC BOOL MOD59_021D7730(void) @@ -200,3 +210,73 @@ THUMB_FUNC BOOL MOD59_021D7730(void) return ret; } + +THUMB_FUNC void MOD59_SetupBg(MOD59_OverlayData *data) +{ + struct GraphicsBanks graphicsBanks = MOD59_021D9F18; + GX_SetBanks(&graphicsBanks); + data->bgConfig = BgConfig_Alloc(data->heap_id); + + struct GraphicsModes graphicsModes = MOD59_021D9DCC; + SetBothScreensModesAndDisable(&graphicsModes); + + struct BgTemplate bgTemplateMain = MOD59_021D9EA0; + bgTemplateMain.screenBase = 15; + bgTemplateMain.charBase = 6; + InitBgFromTemplate(data->bgConfig, GF_BG_LYR_MAIN_0, &bgTemplateMain, 0); + BgClearTilemapBufferAndCommit(data->bgConfig, GF_BG_LYR_MAIN_0); + + bgTemplateMain.screenBase = 14; + bgTemplateMain.charBase = 5; + InitBgFromTemplate(data->bgConfig, GF_BG_LYR_MAIN_1, &bgTemplateMain, 0); + BgClearTilemapBufferAndCommit(data->bgConfig, GF_BG_LYR_MAIN_1); + + bgTemplateMain.screenBase = 13; + bgTemplateMain.charBase = 4; + InitBgFromTemplate(data->bgConfig, GF_BG_LYR_MAIN_2, &bgTemplateMain, 0); + BgClearTilemapBufferAndCommit(data->bgConfig, GF_BG_LYR_MAIN_2); + + bgTemplateMain.screenBase = 12; + bgTemplateMain.charBase = 3; + InitBgFromTemplate(data->bgConfig, GF_BG_LYR_MAIN_3, &bgTemplateMain, 0); + BgClearTilemapBufferAndCommit(data->bgConfig, GF_BG_LYR_MAIN_3); + + FUN_0200CD68(data->bgConfig, 0, 994, 4, 0, data->heap_id); + FUN_0200CB00(data->bgConfig, 0, 985, 3, 0, data->heap_id); + FUN_02002ED0(GF_BG_LYR_MAIN_0, 160, data->heap_id); + FUN_02002EEC(GF_BG_LYR_MAIN_0, 192, data->heap_id); + + struct BgTemplate bgTemplateSub = MOD59_021D9EBC; + bgTemplateSub.screenBase = 15; + bgTemplateSub.charBase = 6; + InitBgFromTemplate(data->bgConfig, GF_BG_LYR_SUB_0, &bgTemplateSub, 0); + BgClearTilemapBufferAndCommit(data->bgConfig, GF_BG_LYR_SUB_0); + + bgTemplateSub.screenBase = 14; + bgTemplateSub.charBase = 5; + InitBgFromTemplate(data->bgConfig, GF_BG_LYR_SUB_1, &bgTemplateSub, 0); + BgClearTilemapBufferAndCommit(data->bgConfig, GF_BG_LYR_SUB_1); + + bgTemplateSub.screenBase = 13; + bgTemplateSub.charBase = 4; + InitBgFromTemplate(data->bgConfig, GF_BG_LYR_SUB_2, &bgTemplateSub, 0); + BgClearTilemapBufferAndCommit(data->bgConfig, GF_BG_LYR_SUB_2); + + bgTemplateSub.screenBase = 12; + bgTemplateSub.charBase = 3; + InitBgFromTemplate(data->bgConfig, GF_BG_LYR_SUB_3, &bgTemplateSub, 0); + BgClearTilemapBufferAndCommit(data->bgConfig, GF_BG_LYR_SUB_3); + + ToggleBgLayer(GF_BG_LYR_MAIN_0, GX_LAYER_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_MAIN_1, GX_LAYER_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_MAIN_2, GX_LAYER_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_MAIN_3, GX_LAYER_TOGGLE_OFF); + + ToggleBgLayer(GF_BG_LYR_SUB_0, GX_LAYER_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_SUB_1, GX_LAYER_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_SUB_2, GX_LAYER_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_SUB_3, GX_LAYER_TOGGLE_OFF); + + MOD59_021D8058(data); + data->Unk78 = 0; +} diff --git a/arm9/src/font.c b/arm9/src/font.c index 5e46b237..537a7337 100644 --- a/arm9/src/font.c +++ b/arm9/src/font.c @@ -169,7 +169,7 @@ THUMB_FUNC void FUN_02002ED0(enum GFBgLayer layer, u32 baseAddr, u32 heap_id) NARC_GRAPHIC_FONT, NARC_font_narc_0006_NCLR, layer, baseAddr, 0x20, heap_id); } -THUMB_FUNC void FUN_02002EEC(u32 layer, u32 baseAddr, u32 heap_id) +THUMB_FUNC void FUN_02002EEC(enum GFBgLayer layer, u32 baseAddr, u32 heap_id) { GfGfxLoader_GXLoadPal( NARC_GRAPHIC_FONT, NARC_font_narc_0007_NCLR, layer, baseAddr, 0x20, heap_id); diff --git a/include/font.h b/include/font.h index 3c0f4267..8b16b9c7 100644 --- a/include/font.h +++ b/include/font.h @@ -31,7 +31,7 @@ u32 FUN_02002DE0(u32 param0, u16 *str, u32 param2); u32 FUN_02002E14(u32 param0, struct String *str, u32 param2); s32 GetFontAttribute(u8 fontId, s32 attr); void FUN_02002ED0(enum GFBgLayer layer, u32 baseAddr, u32 heap_id); -void FUN_02002EEC(u32 layer, u32 baseAddr, u32 heap_id); +void FUN_02002EEC(enum GFBgLayer layer, u32 baseAddr, u32 heap_id); s32 FUN_02002F08(u32 param0, struct String *str, u32 param2); u32 FUN_02002F40(u32 param0, struct String *str, u32 param2, u32 param3); u32 FUN_02002F58(const u16 *str); -- cgit v1.2.3 From fe565be6ef25a91f9372dbb791fddf789e5a64c7 Mon Sep 17 00:00:00 2001 From: red031000 Date: Sun, 22 Aug 2021 16:23:59 +0100 Subject: some cleanup --- arm9/modules/59/src/mod59_021D74E0_src.c | 5 +---- arm9/src/render_window.c | 16 ++++++++-------- include/render_window.h | 4 ++-- 3 files changed, 11 insertions(+), 14 deletions(-) diff --git a/arm9/modules/59/src/mod59_021D74E0_src.c b/arm9/modules/59/src/mod59_021D74E0_src.c index 92880515..7d6be2ca 100644 --- a/arm9/modules/59/src/mod59_021D74E0_src.c +++ b/arm9/modules/59/src/mod59_021D74E0_src.c @@ -7,6 +7,7 @@ #include "GX_layers.h" #include "unk_02024E64.h" #include "bg_window.h" +#include "render_window.h" #include "module_52.h" extern void *FUN_02077A84(u32 heap_id, u32 param1, u32 param2, u32 param3, struct Options *options); @@ -32,10 +33,6 @@ extern u32 FUN_0200E308(void); extern void FUN_02077AC4(void *param0); -extern void FUN_0200CD68(struct BgConfig *param0, u32 param1, u32 param2, u32 param3, u8 frame_id, u32 heap_id); - -extern void FUN_0200CB00(struct BgConfig *param0, u32 param1, u32 param2, u32 param3, u8 frame_id, u32 heap_id); - FS_EXTERN_OVERLAY(MODULE_52); THUMB_FUNC BOOL MOD59_Init(struct UnkStruct_02006234 *param0) diff --git a/arm9/src/render_window.c b/arm9/src/render_window.c index 7a682eb6..33682cc0 100644 --- a/arm9/src/render_window.c +++ b/arm9/src/render_window.c @@ -88,10 +88,10 @@ THUMB_FUNC s32 FUN_0200CAFC(void) } THUMB_FUNC void FUN_0200CB00( - struct BgConfig *bg_config, u32 layer, u32 num_tiles, u32 param3, u8 param4, u32 heap_id) + struct BgConfig *bg_config, u32 layer, u32 num_tiles, u32 param3, u8 frame_id, u32 heap_id) { s32 r1; - if (param4 != 0) + if (frame_id != 0) { r1 = NARC_winframe_narc_0001_NCGR; } @@ -103,7 +103,7 @@ THUMB_FUNC void FUN_0200CB00( GfGfxLoader_LoadCharData( NARC_GRAPHIC_WINFRAME, r1, bg_config, layer, num_tiles, 0, FALSE, heap_id); - if (param4 == 2) + if (frame_id == 2) { r1 = NARC_winframe_narc_0045_NCLR; } @@ -192,20 +192,20 @@ THUMB_FUNC s32 FUN_0200CD64(s32 param0) } THUMB_FUNC void FUN_0200CD68( - struct BgConfig *param0, u32 param1, u32 param2, u32 param3, u8 param4, u32 param5) + struct BgConfig *bg_config, u32 layer, u32 num_tiles, u32 param3, u8 frame_id, u32 heap_id) { GfGfxLoader_LoadCharData( - NARC_GRAPHIC_WINFRAME, FUN_0200CD60(param4), param0, param1, param2, 0, FALSE, param5); + NARC_GRAPHIC_WINFRAME, FUN_0200CD60(frame_id), bg_config, layer, num_tiles, 0, FALSE, heap_id); - if (param1 < 4) + if (layer < 4) { GfGfxLoader_GXLoadPal( - NARC_GRAPHIC_WINFRAME, FUN_0200CD64(param4), 0, param3 << 5, 32, param5); + NARC_GRAPHIC_WINFRAME, FUN_0200CD64(frame_id), 0, param3 << 5, 32, heap_id); return; } - GfGfxLoader_GXLoadPal(NARC_GRAPHIC_WINFRAME, FUN_0200CD64(param4), 4, param3 << 5, 32, param5); + GfGfxLoader_GXLoadPal(NARC_GRAPHIC_WINFRAME, FUN_0200CD64(frame_id), 4, param3 << 5, 32, heap_id); } THUMB_FUNC void DrawFrame2(struct BgConfig *bgConfig, diff --git a/include/render_window.h b/include/render_window.h index 385c61ad..6fcd6dde 100644 --- a/include/render_window.h +++ b/include/render_window.h @@ -43,7 +43,7 @@ struct UnkStruct_0200CABC_3 u32 FUN_0200CABC(struct BgConfig *bgConfig, u32 layer, u32 numTiles, u32 param3, u32 heap_id); s32 FUN_0200CAFC(void); void FUN_0200CB00( - struct BgConfig *bg_config, u32 layer, u32 num_tiles, u32 param3, u8 param4, u32 heap_id); + struct BgConfig *bg_config, u32 layer, u32 num_tiles, u32 param3, u8 frame_id, u32 heap_id); void DrawFrame1(struct BgConfig *bgConfig, u8 bgId, u8 x, @@ -57,7 +57,7 @@ void ClearFrameAndWindow1(struct Window *window, BOOL copy_to_vram); s32 FUN_0200CD60(s32 param0); s32 FUN_0200CD64(s32 param0); void FUN_0200CD68( - struct BgConfig *param0, u32 param1, u32 param2, u32 param3, u8 param4, u32 param5); + struct BgConfig *bg_config, u32 layer, u32 param2, u32 param3, u8 frame_id, u32 heap_id); void DrawFrame2(struct BgConfig *bgConfig, u8 bgId, u8 x, -- cgit v1.2.3 From cab63597e1abc5f79f1d2bbb8fc6e0ac12b79824 Mon Sep 17 00:00:00 2001 From: red031000 Date: Sun, 22 Aug 2021 23:51:46 +0100 Subject: substantial mod59 struct changes --- arm9/modules/59/asm/mod59_021D74E0_asm.s | 86 -------------------------------- arm9/modules/59/include/mod59_021D74E0.h | 19 +++++-- arm9/modules/59/src/mod59_021D74E0_src.c | 54 ++++++++++++++++++-- 3 files changed, 64 insertions(+), 95 deletions(-) diff --git a/arm9/modules/59/asm/mod59_021D74E0_asm.s b/arm9/modules/59/asm/mod59_021D74E0_asm.s index d1e39e08..77bc1174 100644 --- a/arm9/modules/59/asm/mod59_021D74E0_asm.s +++ b/arm9/modules/59/asm/mod59_021D74E0_asm.s @@ -5,92 +5,6 @@ .extern MOD59_021D7730 - thumb_func_start MOD59_021D796C -MOD59_021D796C: ; 0x021D796C - push {r4, lr} - add r4, r0, #0 - mov r0, #0 - add r1, r0, #0 - bl ToggleBgLayer - mov r0, #1 - mov r1, #0 - bl ToggleBgLayer - mov r0, #2 - mov r1, #0 - bl ToggleBgLayer - mov r0, #3 - mov r1, #0 - bl ToggleBgLayer - mov r0, #4 - mov r1, #0 - bl ToggleBgLayer - mov r0, #5 - mov r1, #0 - bl ToggleBgLayer - mov r0, #6 - mov r1, #0 - bl ToggleBgLayer - mov r0, #7 - mov r1, #0 - bl ToggleBgLayer - ldr r0, [r4, #0x18] - mov r1, #0 - bl FreeBgTilemapBuffer - ldr r0, [r4, #0x18] - mov r1, #1 - bl FreeBgTilemapBuffer - ldr r0, [r4, #0x18] - mov r1, #2 - bl FreeBgTilemapBuffer - ldr r0, [r4, #0x18] - mov r1, #3 - bl FreeBgTilemapBuffer - ldr r0, [r4, #0x18] - mov r1, #4 - bl FreeBgTilemapBuffer - ldr r0, [r4, #0x18] - mov r1, #5 - bl FreeBgTilemapBuffer - ldr r0, [r4, #0x18] - mov r1, #6 - bl FreeBgTilemapBuffer - ldr r0, [r4, #0x18] - mov r1, #7 - bl FreeBgTilemapBuffer - ldr r0, [r4, #0x18] - bl FreeToHeap - pop {r4, pc} - thumb_func_end MOD59_021D796C - - thumb_func_start MOD59_021D79F8 -MOD59_021D79F8: ; 0x021D79F8 - push {r4, lr} - add r4, r0, #0 - ldr r2, _021D7A30 ; =0x00000155 - ldr r3, [r4] - mov r0, #1 - mov r1, #0x1a - bl NewMsgDataFromNarc - str r0, [r4, #0x4c] - bl FUN_0201BD5C - mov r0, #0 - ldr r3, [r4] - add r1, r0, #0 - mov r2, #6 - bl FUN_020142EC - str r0, [r4, #0x60] - ldr r0, [r4] - bl ScrStrBufs_new - str r0, [r4, #0x64] - mov r0, #0 - str r0, [r4, #0x50] - str r0, [r4, #0x54] - str r0, [r4, #0x2c] - pop {r4, pc} - nop -_021D7A30: .word 0x00000155 - thumb_func_end MOD59_021D79F8 - thumb_func_start MOD59_021D7A34 MOD59_021D7A34: ; 0x021D7A34 push {r4, lr} diff --git a/arm9/modules/59/include/mod59_021D74E0.h b/arm9/modules/59/include/mod59_021D74E0.h index 0a594ad3..d193202e 100644 --- a/arm9/modules/59/include/mod59_021D74E0.h +++ b/arm9/modules/59/include/mod59_021D74E0.h @@ -24,18 +24,27 @@ typedef struct MOD59_OverlayData u32 Unk10; struct UnkStruct_02006234 *Unk14; struct BgConfig *bgConfig; - u8 padding[0x54]; + u8 padding[0x10]; + u32 Unk2C; + u8 padding2[0x1C]; + struct MsgData *msgData; + u32 Unk50; + u32 Unk54; + u8 padding3[0x8]; + u32 Unk60; // unknown if this is the right type, possibly a pointer instead? + struct ScrStrBufs *strBufs; + u8 padding4[0x8]; struct MOD59_UnkPlayerStruct *playerStruct; struct MOD59_UnkPlayerStruct *rivalStruct; u32 Unk78; - u8 padding2[0xC]; + u8 padding5[0xC]; u8 Unk88; u8 Unk89; u8 Unk8A; u8 Unk8B; - u8 padding3[4]; + u8 padding6[4]; u32 Unk90; - u8 padding4[32]; + u8 padding7[32]; } MOD59_OverlayData; BOOL MOD59_Init(struct UnkStruct_02006234 *param0); @@ -44,5 +53,7 @@ BOOL MOD59_021D76C0(struct UnkStruct_02006234 *param0); void MOD59_021D7724(MOD59_OverlayData *data); BOOL MOD59_021D7730(void); void MOD59_SetupBg(MOD59_OverlayData *data); +void MOD59_DestroyBg(MOD59_OverlayData *data); +void MOD59_SetupMsg(MOD59_OverlayData *data); #endif //POKEDIAMOND_MOD59_021D74E0_H diff --git a/arm9/modules/59/src/mod59_021D74E0_src.c b/arm9/modules/59/src/mod59_021D74E0_src.c index 7d6be2ca..5a5d0126 100644 --- a/arm9/modules/59/src/mod59_021D74E0_src.c +++ b/arm9/modules/59/src/mod59_021D74E0_src.c @@ -8,6 +8,9 @@ #include "unk_02024E64.h" #include "bg_window.h" #include "render_window.h" +#include "msgdata.h" +#include "text.h" +#include "script_buffers.h" #include "module_52.h" extern void *FUN_02077A84(u32 heap_id, u32 param1, u32 param2, u32 param3, struct Options *options); @@ -20,9 +23,7 @@ extern struct GraphicsModes MOD59_021D9DCC; extern struct BgTemplate MOD59_021D9EA0; extern struct BgTemplate MOD59_021D9EBC; -extern void MOD59_021D79F8(MOD59_OverlayData *data); extern void MOD59_021D7A34(MOD59_OverlayData *data); -extern void MOD59_021D796C(MOD59_OverlayData *data); extern void MOD59_021D7A4C(MOD59_OverlayData *data); extern void MOD59_021D7A5C(MOD59_OverlayData *data); extern void MOD59_021D8058(MOD59_OverlayData *data); @@ -31,6 +32,8 @@ extern u32 MOD59_021D8920(MOD59_OverlayData *data); extern void FUN_0200E1D0(u32 param0, u32 param1, u32 param2, u32 param3, u32 param4, u32 param5, u32 heap_id); extern u32 FUN_0200E308(void); +extern u32 FUN_020142EC(u32 param0, u32 param1, u32 param2, u32 heap_id); + extern void FUN_02077AC4(void *param0); FS_EXTERN_OVERLAY(MODULE_52); @@ -80,7 +83,7 @@ THUMB_FUNC BOOL MOD59_021D7564(struct UnkStruct_02006234 *param0, u32 *param1) SetKeyRepeatTimers(4, 8); MOD59_SetupBg(data); - MOD59_021D79F8(data); + MOD59_SetupMsg(data); MOD59_021D7A4C(data); Main_SetVBlankIntrCB((void (*)(void *))MOD59_021D7724, data); @@ -115,7 +118,7 @@ THUMB_FUNC BOOL MOD59_021D7564(struct UnkStruct_02006234 *param0, u32 *param1) } MOD59_021D7A34(data); - MOD59_021D796C(data); + MOD59_DestroyBg(data); MOD59_021D7A5C(data); Main_SetVBlankIntrCB(NULL, NULL); @@ -130,7 +133,7 @@ THUMB_FUNC BOOL MOD59_021D7564(struct UnkStruct_02006234 *param0, u32 *param1) } MOD59_021D7A34(data); - MOD59_021D796C(data); + MOD59_DestroyBg(data); MOD59_021D7A5C(data); Main_SetVBlankIntrCB(NULL, NULL); @@ -277,3 +280,44 @@ THUMB_FUNC void MOD59_SetupBg(MOD59_OverlayData *data) MOD59_021D8058(data); data->Unk78 = 0; } + +THUMB_FUNC void MOD59_DestroyBg(MOD59_OverlayData *data) +{ + ToggleBgLayer(GF_BG_LYR_MAIN_0, GX_LAYER_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_MAIN_1, GX_LAYER_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_MAIN_2, GX_LAYER_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_MAIN_3, GX_LAYER_TOGGLE_OFF); + + ToggleBgLayer(GF_BG_LYR_SUB_0, GX_LAYER_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_SUB_1, GX_LAYER_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_SUB_2, GX_LAYER_TOGGLE_OFF); + ToggleBgLayer(GF_BG_LYR_SUB_3, GX_LAYER_TOGGLE_OFF); + + FreeBgTilemapBuffer(data->bgConfig, GF_BG_LYR_MAIN_0); + FreeBgTilemapBuffer(data->bgConfig, GF_BG_LYR_MAIN_1); + FreeBgTilemapBuffer(data->bgConfig, GF_BG_LYR_MAIN_2); + FreeBgTilemapBuffer(data->bgConfig, GF_BG_LYR_MAIN_3); + + FreeBgTilemapBuffer(data->bgConfig, GF_BG_LYR_SUB_0); + FreeBgTilemapBuffer(data->bgConfig, GF_BG_LYR_SUB_1); + FreeBgTilemapBuffer(data->bgConfig, GF_BG_LYR_SUB_2); + FreeBgTilemapBuffer(data->bgConfig, GF_BG_LYR_SUB_3); + + FreeToHeap(data->bgConfig); +} + +THUMB_FUNC void MOD59_SetupMsg(MOD59_OverlayData *data) +{ + data->msgData = NewMsgDataFromNarc(1, NARC_MSGDATA_MSG, 0x155, data->heap_id); + + FUN_0201BD5C(); + + data->Unk60 = FUN_020142EC(0, 0, 6, data->heap_id); + + data->strBufs = ScrStrBufs_new(data->heap_id); + + data->Unk50 = 0; + data->Unk54 = 0; + data->Unk2C = 0; +} + -- cgit v1.2.3 From 4893eb00f1efb025894b948655da69d4804d4912 Mon Sep 17 00:00:00 2001 From: red031000 Date: Mon, 23 Aug 2021 13:47:03 +0100 Subject: fix issues --- arm9/modules/59/include/mod59_021D74E0.h | 26 ++++++++++++------------ arm9/modules/59/src/mod59_021D74E0_src.c | 35 ++++++++++++++++---------------- 2 files changed, 31 insertions(+), 30 deletions(-) diff --git a/arm9/modules/59/include/mod59_021D74E0.h b/arm9/modules/59/include/mod59_021D74E0.h index d193202e..059f80c8 100644 --- a/arm9/modules/59/include/mod59_021D74E0.h +++ b/arm9/modules/59/include/mod59_021D74E0.h @@ -20,30 +20,30 @@ typedef struct MOD59_OverlayData u32 heap_id; struct SaveBlock2 *sav2; struct Options *options; - u32 Unk0C; - u32 Unk10; - struct UnkStruct_02006234 *Unk14; + u32 unk0C; + u32 unk10; + struct UnkStruct_02006234 *unk14; struct BgConfig *bgConfig; u8 padding[0x10]; - u32 Unk2C; + u32 unk2C; u8 padding2[0x1C]; struct MsgData *msgData; - u32 Unk50; - u32 Unk54; + u32 unk50; + u32 unk54; u8 padding3[0x8]; - u32 Unk60; // unknown if this is the right type, possibly a pointer instead? + u32 unk60; // unknown if this is the right type, possibly a pointer instead? struct ScrStrBufs *strBufs; u8 padding4[0x8]; struct MOD59_UnkPlayerStruct *playerStruct; struct MOD59_UnkPlayerStruct *rivalStruct; - u32 Unk78; + u32 unk78; u8 padding5[0xC]; - u8 Unk88; - u8 Unk89; - u8 Unk8A; - u8 Unk8B; + u8 unk88; + u8 unk89; + u8 unk8A; + u8 unk8B; u8 padding6[4]; - u32 Unk90; + u32 unk90; u8 padding7[32]; } MOD59_OverlayData; diff --git a/arm9/modules/59/src/mod59_021D74E0_src.c b/arm9/modules/59/src/mod59_021D74E0_src.c index 5a5d0126..1a301bc1 100644 --- a/arm9/modules/59/src/mod59_021D74E0_src.c +++ b/arm9/modules/59/src/mod59_021D74E0_src.c @@ -9,6 +9,7 @@ #include "bg_window.h" #include "render_window.h" #include "msgdata.h" +#include "msgdata/msg.naix" #include "text.h" #include "script_buffers.h" #include "module_52.h" @@ -48,15 +49,15 @@ THUMB_FUNC BOOL MOD59_Init(struct UnkStruct_02006234 *param0) s32 *field18 = OverlayManager_GetField18(param0); data->sav2 = (struct SaveBlock2 *)field18[2]; //? data->options = Sav2_PlayerData_GetOptionsAddr(data->sav2); - data->Unk10 = data->Unk0C = 0; - data->Unk14 = NULL; + data->unk10 = data->unk0C = 0; + data->unk14 = NULL; data->playerStruct = (struct MOD59_UnkPlayerStruct *)FUN_02077A84(0x52, 0, 0, 7, data->options); data->rivalStruct = (struct MOD59_UnkPlayerStruct *)FUN_02077A84(0x52, 3, 0, 7, data->options); - data->Unk88 = 0; - data->Unk89 = 0; - data->Unk8A = 0; - data->Unk8B = 0; - data->Unk90 = 0; + data->unk88 = 0; + data->unk89 = 0; + data->unk8A = 0; + data->unk8B = 0; + data->unk90 = 0; return TRUE; } @@ -101,7 +102,7 @@ THUMB_FUNC BOOL MOD59_021D7564(struct UnkStruct_02006234 *param0, u32 *param1) *param1 = 2; } - if (data->Unk14 == NULL) + if (data->unk14 == NULL) { break; } @@ -143,13 +144,13 @@ THUMB_FUNC BOOL MOD59_021D7564(struct UnkStruct_02006234 *param0, u32 *param1) break; case 4: - if (OverlayManager_Run(data->Unk14) != TRUE) + if (OverlayManager_Run(data->unk14) != TRUE) { break; } - OverlayManager_delete(data->Unk14); - data->Unk14 = NULL; + OverlayManager_delete(data->unk14); + data->unk14 = NULL; *param1 = 5; @@ -278,7 +279,7 @@ THUMB_FUNC void MOD59_SetupBg(MOD59_OverlayData *data) ToggleBgLayer(GF_BG_LYR_SUB_3, GX_LAYER_TOGGLE_OFF); MOD59_021D8058(data); - data->Unk78 = 0; + data->unk78 = 0; } THUMB_FUNC void MOD59_DestroyBg(MOD59_OverlayData *data) @@ -308,16 +309,16 @@ THUMB_FUNC void MOD59_DestroyBg(MOD59_OverlayData *data) THUMB_FUNC void MOD59_SetupMsg(MOD59_OverlayData *data) { - data->msgData = NewMsgDataFromNarc(1, NARC_MSGDATA_MSG, 0x155, data->heap_id); + data->msgData = NewMsgDataFromNarc(1, NARC_MSGDATA_MSG, NARC_msg_narc_0341_bin, data->heap_id); FUN_0201BD5C(); - data->Unk60 = FUN_020142EC(0, 0, 6, data->heap_id); + data->unk60 = FUN_020142EC(0, 0, 6, data->heap_id); data->strBufs = ScrStrBufs_new(data->heap_id); - data->Unk50 = 0; - data->Unk54 = 0; - data->Unk2C = 0; + data->unk50 = 0; + data->unk54 = 0; + data->unk2C = 0; } -- cgit v1.2.3 From 4195577deb16293f0e0cb93fe9a6da80cc0c97eb Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Wed, 23 Jun 2021 13:20:51 +0200 Subject: arm7: add OS_CancelAlarm declaration --- arm7/lib/include/OS_alarm.h | 1 + 1 file changed, 1 insertion(+) diff --git a/arm7/lib/include/OS_alarm.h b/arm7/lib/include/OS_alarm.h index a4566348..ad14eaff 100644 --- a/arm7/lib/include/OS_alarm.h +++ b/arm7/lib/include/OS_alarm.h @@ -5,6 +5,7 @@ #include "nitro/OS_alarm_shared.h" void OS_CreateAlarm(OSAlarm *alarm); +void OS_CancelAlarm(OSAlarm *alarm); BOOL OS_IsAlarmAvailable(void); void OS_SetAlarm(OSAlarm *alarm, OSTick tick, OSAlarmHandler handler, void *arg); void OS_SetPeriodicAlarm(OSAlarm *alarm, OSTick start, OSTick period, OSAlarmHandler handler, void *arg); -- cgit v1.2.3 From 69200d83f7bf3c189e226f3561cef3a6ee7ee6ce Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Fri, 25 Jun 2021 15:01:22 +0200 Subject: move PXI function declarations from OS_reset to their respective headers --- arm7/lib/include/PXI_fifo.h | 3 +++ arm7/lib/src/OS_reset.c | 3 +-- arm9/lib/NitroSDK/include/PXI_fifo.h | 23 ----------------------- include/nitro/PXI_fifo_shared.h | 25 +++++++++++++++++++++++++ 4 files changed, 29 insertions(+), 25 deletions(-) diff --git a/arm7/lib/include/PXI_fifo.h b/arm7/lib/include/PXI_fifo.h index 6d634f72..27f6b005 100644 --- a/arm7/lib/include/PXI_fifo.h +++ b/arm7/lib/include/PXI_fifo.h @@ -3,4 +3,7 @@ #include "nitro/PXI_fifo_shared.h" +s32 PXI_SendWordByFifo(s32 fifotag, u32 data, BOOL err); +void PXI_SetFifoRecvCallback(s32 fifotag, PXIFifoCallback callback); + #endif //POKEDIAMOND_ARM7_PXI_FIFO_H diff --git a/arm7/lib/src/OS_reset.c b/arm7/lib/src/OS_reset.c index e0f380f8..13d59bfa 100644 --- a/arm7/lib/src/OS_reset.c +++ b/arm7/lib/src/OS_reset.c @@ -2,6 +2,7 @@ #include "OS_reset.h" #include "OS_interrupt.h" #include "OS_terminate_proc.h" +#include "PXI_fifo.h" static u16 OSi_IsInitReset = 0; vu16 OSi_IsResetOccurred = 0; @@ -10,8 +11,6 @@ extern void MI_StopDma(u32 dma); extern OSIrqMask OS_SetIrqMask(OSIrqMask mask); extern OSIrqMask OS_ResetRequestIrqMask(OSIrqMask mask); extern void SND_Shutdown(void); -extern void PXI_SetFifoRecvCallback(u32 param1, void* callback); -extern u32 PXI_SendWordByFifo(u32 param1, u32 data, u32 param2); extern void FUN_038073EC(void); //OSi_DoResetSystem, in wram ARM_FUNC void OS_InitReset(void) diff --git a/arm9/lib/NitroSDK/include/PXI_fifo.h b/arm9/lib/NitroSDK/include/PXI_fifo.h index b1ca33f3..815da961 100644 --- a/arm9/lib/NitroSDK/include/PXI_fifo.h +++ b/arm9/lib/NitroSDK/include/PXI_fifo.h @@ -4,29 +4,6 @@ #include "nitro/PXI_fifo_shared.h" #include "nitro/types.h" -typedef enum -{ - PXI_FIFO_SUCCESS = 0, - PXI_FIFO_FAIL_SEND_ERR = -1, - PXI_FIFO_FAIL_SEND_FULL = -2, - PXI_FIFO_FAIL_RECV_ERR = -3, - PXI_FIFO_FAIL_RECV_EMPTY = -4, - PXI_FIFO_NO_CALLBACK_ENTRY = -5 -} PXIFifoStatus; - -typedef void (*PXIFifoCallback) (PXIFifoTag tag, u32 data, BOOL err); - -typedef union -{ - struct - { - u32 tag:5; - u32 err:1; - u32 data:26; - } e; - u32 raw; -} PXIFifoMessage; - void PXI_InitFifo(void); void PXI_SetFifoRecvCallback(s32 fifotag, PXIFifoCallback callback); BOOL PXI_IsCallbackReady(s32 fifotag, PXIProc proc); diff --git a/include/nitro/PXI_fifo_shared.h b/include/nitro/PXI_fifo_shared.h index 297625a1..a4ed454f 100644 --- a/include/nitro/PXI_fifo_shared.h +++ b/include/nitro/PXI_fifo_shared.h @@ -13,6 +13,8 @@ #ifndef POKEDIAMOND_PXI_FIFO_SHARED_H #define POKEDIAMOND_PXI_FIFO_SHARED_H +#include "nitro/types.h" + typedef enum { PXI_PROC_ARM9 = 0, @@ -40,4 +42,27 @@ typedef enum { PXI_MAX_FIFO_TAG = 32 // MAX FIFO TAG } PXIFifoTag; +typedef enum +{ + PXI_FIFO_SUCCESS = 0, + PXI_FIFO_FAIL_SEND_ERR = -1, + PXI_FIFO_FAIL_SEND_FULL = -2, + PXI_FIFO_FAIL_RECV_ERR = -3, + PXI_FIFO_FAIL_RECV_EMPTY = -4, + PXI_FIFO_NO_CALLBACK_ENTRY = -5 +} PXIFifoStatus; + +typedef union +{ + struct + { + u32 tag:5; + u32 err:1; + u32 data:26; + } e; + u32 raw; +} PXIFifoMessage; + +typedef void (*PXIFifoCallback) (PXIFifoTag tag, u32 data, BOOL err); + #endif //POKEDIAMOND_PXI_FIFO_SHARED_H -- cgit v1.2.3 From eb13294661514e27b3b89e26b7a4401cc93feb93 Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Fri, 25 Jun 2021 23:43:40 +0200 Subject: decompile SND_alarm and SND_work --- arm7/asm/SND_alarm.s | 144 --------------------------------------- arm7/asm/SND_seq.s | 30 ++++---- arm7/asm/SND_unk_037FD440.s | 10 +-- arm7/asm/SND_work.s | 84 ----------------------- arm7/lib/include/SND_alarm.h | 12 ++-- arm7/lib/include/SND_capture.h | 6 ++ arm7/lib/include/SND_exChannel.h | 4 +- arm7/lib/include/SND_work.h | 11 ++- arm7/lib/src/SND_alarm.c | 70 +++++++++++++++++++ arm7/lib/src/SND_work.c | 36 ++++++++++ 10 files changed, 148 insertions(+), 259 deletions(-) delete mode 100644 arm7/asm/SND_alarm.s delete mode 100644 arm7/asm/SND_work.s create mode 100644 arm7/lib/include/SND_capture.h create mode 100644 arm7/lib/src/SND_alarm.c create mode 100644 arm7/lib/src/SND_work.c 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; +} -- cgit v1.2.3 From b6fe47016315d94a96095633f00ace8a5673ddbb Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Sat, 26 Jun 2021 16:09:22 +0200 Subject: arm7: move bad variable from SND_main to SND_lockChannel --- arm7/asm/SND_lockChannel.s | 4 ++++ arm7/asm/SND_main.s | 4 ---- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/arm7/asm/SND_lockChannel.s b/arm7/asm/SND_lockChannel.s index b525e0d1..4a96a890 100644 --- a/arm7/asm/SND_lockChannel.s +++ b/arm7/asm/SND_lockChannel.s @@ -3,6 +3,10 @@ .section .bss + .global _03807F44 +_03807F44: ;0x03807F44 + .space 0x03807F48 - 0x03807F44 + .global _03807F48 _03807F48: ;0x03807F48 .space 0x03807F4C - 0x03807F48 diff --git a/arm7/asm/SND_main.s b/arm7/asm/SND_main.s index 2353d2c2..2349de5b 100644 --- a/arm7/asm/SND_main.s +++ b/arm7/asm/SND_main.s @@ -23,10 +23,6 @@ _03807A74: ;0x03807A74 _03807AA0: ;0x03807AA0 .space 0x03807F44 - 0x03807AA0 - .global _03807F44 -_03807F44: ;0x03807F44 - .space 0x03807F48 - 0x03807F44 - .section .text arm_func_start SndThread -- cgit v1.2.3 From beb52cb6569ea02d7bcb4bf33c3c18224d3c8c78 Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Sat, 26 Jun 2021 16:44:34 +0200 Subject: arm7: decompile SND_main --- arm7/asm/SND_main.s | 193 --------------------------------------- arm7/lib/include/SND.h | 10 ++ arm7/lib/include/SND_command.h | 7 ++ arm7/lib/include/SND_exChannel.h | 5 +- arm7/lib/include/SND_main.h | 16 ++++ arm7/lib/include/SND_seq.h | 7 ++ arm7/lib/include/SND_util.h | 8 ++ arm7/lib/src/SND_main.c | 114 +++++++++++++++++++++++ 8 files changed, 166 insertions(+), 194 deletions(-) delete mode 100644 arm7/asm/SND_main.s create mode 100644 arm7/lib/include/SND.h create mode 100644 arm7/lib/include/SND_command.h create mode 100644 arm7/lib/include/SND_main.h create mode 100644 arm7/lib/include/SND_seq.h create mode 100644 arm7/lib/include/SND_util.h create mode 100644 arm7/lib/src/SND_main.c 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(); + } +} -- cgit v1.2.3 From 130696200f1d68628520ba361355f5358d16847b Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Sat, 26 Jun 2021 18:59:04 +0200 Subject: move more sound structs from arm9 to common include --- arm9/lib/NitroSDK/include/SND_bank.h | 29 +---------------------------- include/nitro/SND_bank_shared.h | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 36 insertions(+), 28 deletions(-) create mode 100644 include/nitro/SND_bank_shared.h diff --git a/arm9/lib/NitroSDK/include/SND_bank.h b/arm9/lib/NitroSDK/include/SND_bank.h index b9000d57..335dae01 100644 --- a/arm9/lib/NitroSDK/include/SND_bank.h +++ b/arm9/lib/NitroSDK/include/SND_bank.h @@ -4,6 +4,7 @@ #include "global.h" #include "SND_main.h" +#include "nitro/SND_bank_shared.h" #define SND_INST_ILLEGAL 0 #define SND_INST_PCM 1 @@ -15,7 +16,6 @@ #define SND_INST_KEY_SPLIT 17 #define SND_BANK_MAX_WAVEARC 4 -#define SND_INST_MAX_KEYSPLIT 8 #define SND_INST_OFFSET_TYPE(off) ((u8)off) #define SND_INST_OFFSET_NORMAL(bank, off) ((struct SNDInstParam *)((u8 *)bank + (u32)(off >> 8))) @@ -46,33 +46,6 @@ struct SNDWaveArc { u32 waveOffsets[]; // 0x3C }; // size = 0x3C -struct SNDInstParam { - u16 wave[2]; // 0x0 - u8 rootKey; // 0x4 - u8 envAttack; // 0x5 - u8 envDecay; // 0x6 - u8 envSustain; // 0x7 - u8 envRelease; // 0x8 - u8 pan; // 0x9 -}; // size = 0xA - -struct SNDInstData { - u8 type; // 0x0 - u8 unk_1; // 0x1 - struct SNDInstParam param; // 0x2 -}; // size = 0xC - -struct SNDKeySplit { - u8 key[SND_INST_MAX_KEYSPLIT]; // 0x0 - struct SNDInstData instruments[]; // 0x8 -}; // size = 0x8 - -struct SNDDrumSet { - u8 minKey; - u8 maxKey; - struct SNDInstData instruments[]; -}; // size = 0x2 - struct SNDInstPos { u32 program; // 0x0 u32 index; // 0x4 diff --git a/include/nitro/SND_bank_shared.h b/include/nitro/SND_bank_shared.h new file mode 100644 index 00000000..58b1fd8f --- /dev/null +++ b/include/nitro/SND_bank_shared.h @@ -0,0 +1,35 @@ +#ifndef GUARD_SND_BANK_SHARED_H +#define GUARD_SND_BANK_SHARED_H + +#include "nitro/types.h" + +#define SND_INST_MAX_KEYSPLIT 8 + +struct SNDInstParam { + u16 wave[2]; // 0x0 + u8 rootKey; // 0x4 + u8 envAttack; // 0x5 + u8 envDecay; // 0x6 + u8 envSustain; // 0x7 + u8 envRelease; // 0x8 + u8 pan; // 0x9 +}; // size = 0xA + +struct SNDInstData { + u8 type; // 0x0 + u8 unk_1; // 0x1 + struct SNDInstParam param; // 0x2 +}; // size = 0xC + +struct SNDKeySplit { + u8 key[SND_INST_MAX_KEYSPLIT]; // 0x0 + struct SNDInstData instruments[]; // 0x8 +}; // size = 0x8 + +struct SNDDrumSet { + u8 minKey; + u8 maxKey; + struct SNDInstData instruments[]; +}; // size = 0x2 + +#endif //GUARD_SND_BANK_SHARED_H -- cgit v1.2.3 From 83c92e11bdb440c80042ad7434966a03bc7b18c3 Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Sat, 26 Jun 2021 19:07:04 +0200 Subject: arm7: decompile SND_wave --- arm7/asm/SND_wave.s | 43 ------------------------------------------- arm7/lib/include/SND.h | 1 + arm7/lib/include/SND_wave.h | 6 ++++++ arm7/lib/src/SND_wave.c | 15 +++++++++++++++ 4 files changed, 22 insertions(+), 43 deletions(-) delete mode 100644 arm7/asm/SND_wave.s create mode 100644 arm7/lib/include/SND_wave.h create mode 100644 arm7/lib/src/SND_wave.c diff --git a/arm7/asm/SND_wave.s b/arm7/asm/SND_wave.s deleted file mode 100644 index e18acc43..00000000 --- a/arm7/asm/SND_wave.s +++ /dev/null @@ -1,43 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .text - - arm_func_start SND_InvalidateWave -SND_InvalidateWave: ; 0x037FC8DC - stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} - sub sp, sp, #4 - mov r7, r0 - mov r6, r1 - mov r5, #0 - mov r9, r5 - ldr r4, _037FC960 ; =SNDi_Work - mov r8, #84 ; 0x54 -_037FC8FC: - mla r2, r5, r8, r4 - ldrb r1, [r2, #3] - mov r0, r1, lsl #31 - movs r0, r0, lsr #31 - beq _037FC944 - ldrb r0, [r2, #1] - cmp r0, #0 - bne _037FC944 - ldr r0, [r2, #68] ; 0x44 - cmp r7, r0 - bhi _037FC944 - cmp r0, r6 - bhi _037FC944 - bic r0, r1, #2 - strb r0, [r2, #3] - mov r0, r5 - mov r1, r9 - bl SND_StopChannel -_037FC944: - add r0, r5, #1 - and r5, r0, #255 ; 0xff - cmp r5, #16 - bcc _037FC8FC - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, r8, r9, lr} - bx lr -_037FC960: .word SNDi_Work diff --git a/arm7/lib/include/SND.h b/arm7/lib/include/SND.h index 69db1a16..b471ac72 100644 --- a/arm7/lib/include/SND.h +++ b/arm7/lib/include/SND.h @@ -6,5 +6,6 @@ void SND_Enable(void); void SND_SetOutputSelector(u8 leftOutputFrom, u8 rightOutputFrom, u8 outputCh1ToMixer, u8 outputCh3ToMixer); void SND_SetMasterVolume(u8 vol); +void SND_StopChannel(s32 idx, BOOL hold); #endif //GUARD_SND_H diff --git a/arm7/lib/include/SND_wave.h b/arm7/lib/include/SND_wave.h new file mode 100644 index 00000000..e1ae93fe --- /dev/null +++ b/arm7/lib/include/SND_wave.h @@ -0,0 +1,6 @@ +#ifndef GUARD_SND_WAVE_H +#define GUARD_SND_WAVE_H + +void SND_InvalidateWave(void *begin, void *end); + +#endif //GUARD_SND_WAVE_H diff --git a/arm7/lib/src/SND_wave.c b/arm7/lib/src/SND_wave.c new file mode 100644 index 00000000..75d84e5f --- /dev/null +++ b/arm7/lib/src/SND_wave.c @@ -0,0 +1,15 @@ +#include "SND_wave.h" + +#include "SND.h" +#include "SND_work.h" + +void SND_InvalidateWave(void *start, void *end) { + for (u8 i = 0; i < SND_CHANNEL_COUNT; i++) { + struct SNDExChannel *chn = &SNDi_Work.channels[i]; + + if (chn->flags.active && chn->type == 0 && start <= chn->waveDataPtr && chn->waveDataPtr <= end) { + chn->flags.start = FALSE; + SND_StopChannel(i, 0); + } + } +} -- cgit v1.2.3 From f9aae26dd2155d78f111907f47feb0ec5be9f30c Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Sun, 27 Jun 2021 00:04:45 +0200 Subject: arm7: decompile SND_lockChannel --- arm7/asm/SND_exChannel.s | 16 ++-- arm7/asm/SND_lockChannel.s | 171 ------------------------------------- arm7/global.inc | 4 +- arm7/lib/include/SND_exChannel.h | 3 + arm7/lib/include/SND_lockChannel.h | 11 +++ arm7/lib/src/SND_lockChannel.c | 79 +++++++++++++++++ 6 files changed, 103 insertions(+), 181 deletions(-) delete mode 100644 arm7/asm/SND_lockChannel.s create mode 100644 arm7/lib/include/SND_lockChannel.h create mode 100644 arm7/lib/src/SND_lockChannel.c diff --git a/arm7/asm/SND_exChannel.s b/arm7/asm/SND_exChannel.s index b1ac819b..f6e8fe4d 100644 --- a/arm7/asm/SND_exChannel.s +++ b/arm7/asm/SND_exChannel.s @@ -18,12 +18,12 @@ SND_AllocExChannel: ; 0x037FCB94 mov sl, r0 mov r9, r1 mov fp, r3 - ldr r0, _037FCCBC ; =_03807F48 + ldr r0, _037FCCBC ; =sUnlockedChannelMask ldr r0, [r0] mvn r0, r0 and sl, sl, r0 cmp r2, #0 - ldreq r0, _037FCCC0 ; =_03807F44 + ldreq r0, _037FCCC0 ; =sLockedChannelMask ldreq r0, [r0] mvneq r0, r0 andeq sl, sl, r0 @@ -92,8 +92,8 @@ _037FCCB0: add sp, sp, #4 ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} bx lr -_037FCCBC: .word _03807F48 -_037FCCC0: .word _03807F44 +_037FCCBC: .word sUnlockedChannelMask +_037FCCC0: .word sLockedChannelMask _037FCCC4: .word _03807298 _037FCCC8: .word SNDi_Work @@ -635,11 +635,11 @@ _037FD3EC: cmp ip, #16 blt _037FD3EC mov r1, #0 - ldr r0, _037FD438 ; =_03807F48 + ldr r0, _037FD438 ; =sUnlockedChannelMask str r1, [r0] - ldr r0, _037FD43C ; =_03807F44 + ldr r0, _037FD43C ; =sLockedCHannelMask str r1, [r0] bx lr _037FD434: .word SNDi_Work -_037FD438: .word _03807F48 -_037FD43C: .word _03807F44 +_037FD438: .word sUnlockedChannelMask +_037FD43C: .word sLockedChannelMask diff --git a/arm7/asm/SND_lockChannel.s b/arm7/asm/SND_lockChannel.s deleted file mode 100644 index 4a96a890..00000000 --- a/arm7/asm/SND_lockChannel.s +++ /dev/null @@ -1,171 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .section .bss - - .global _03807F44 -_03807F44: ;0x03807F44 - .space 0x03807F48 - 0x03807F44 - - .global _03807F48 -_03807F48: ;0x03807F48 - .space 0x03807F4C - 0x03807F48 - - .section .text - - arm_func_start SND_GetLockedChannel -SND_GetLockedChannel: ; 0x037FC964 - ands r0, r0, #1 - ldrne r0, _037FC97C ; =_03807F44 - ldrne r0, [r0] - ldreq r0, _037FC980 ; =_03807F48 - ldreq r0, [r0] - bx lr -_037FC97C: .word _03807F44 -_037FC980: .word _03807F48 - - arm_func_start SND_UnlockChannel -SND_UnlockChannel: ; 0x037FC984 - ands r1, r1, #1 - ldreq r1, _037FC9B8 ; =_03807F48 - ldreq r2, [r1] - mvneq r0, r0 - andeq r0, r2, r0 - streq r0, [r1] - bxeq lr - ldr r1, _037FC9BC ; =_03807F44 - ldr r2, [r1] - mvn r0, r0 - and r0, r2, r0 - str r0, [r1] - bx lr -_037FC9B8: .word _03807F48 -_037FC9BC: .word _03807F44 - - arm_func_start SND_LockChannel -SND_LockChannel: ; 0x037FC9C0 - stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - sub sp, sp, #4 - mov sl, r0 - mov r9, r1 - mov r7, sl - mov r6, #0 - mov fp, r6 - str r6, [sp] - mov r4, r6 - mov r5, #1 - b _037FCA6C -_037FC9EC: - ands r0, r7, #1 - beq _037FCA64 - mov r1, #84 ; 0x54 - ldr r0, _037FCAAC ; =SNDi_Work - mla r8, r6, r1, r0 - ldr r0, _037FCAB0 ; =_03807F48 - ldr r1, [r0] - mov r0, r5, lsl r6 - ands r0, r1, r0 - bne _037FCA64 - ldr r3, [r8, #72] ; 0x48 - cmp r3, #0 - beq _037FCA34 - mov r0, r8 - mov r1, fp - ldr r2, [r8, #76] ; 0x4c - mov lr, pc - bx r3 -_037FCA34: - mov r0, r6 - ldr r1, [sp] - bl SND_StopChannel - strb r4, [r8, #34] ; 0x22 - mov r0, r8 - bl SND_FreeExChannel - ldrb r0, [r8, #3] - bic r0, r0, #248 ; 0xf8 - strb r0, [r8, #3] - ldrb r0, [r8, #3] - bic r0, r0, #1 - strb r0, [r8, #3] -_037FCA64: - add r6, r6, #1 - mov r7, r7, lsr #1 -_037FCA6C: - cmp r6, #16 - bge _037FCA7C - cmp r7, #0 - bne _037FC9EC -_037FCA7C: - ands r0, r9, #1 - ldrne r0, _037FCAB4 ; =_03807F44 - ldrne r1, [r0] - orrne r1, r1, sl - strne r1, [r0] - ldreq r0, _037FCAB0 ; =_03807F48 - ldreq r1, [r0] - orreq r1, r1, sl - streq r1, [r0] - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - bx lr -_037FCAAC: .word SNDi_Work -_037FCAB0: .word _03807F48 -_037FCAB4: .word _03807F44 - - arm_func_start SND_StopUnlockedChannel -SND_StopUnlockedChannel: ; 0x037FCAB8 - stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - sub sp, sp, #4 - mov sl, r0 - mov r8, #0 - mov r6, r8 - mov r5, r8 - mov r4, r8 - ldr fp, _037FCB78 ; =SNDi_Work - mov r7, #1 - b _037FCB5C -_037FCAE0: - ands r0, sl, #1 - beq _037FCB54 - mov r0, #84 ; 0x54 - mla r9, r8, r0, fp - ldr r0, _037FCB7C ; =_03807F48 - ldr r1, [r0] - mov r0, r7, lsl r8 - ands r0, r1, r0 - bne _037FCB54 - ldr r3, [r9, #72] ; 0x48 - cmp r3, #0 - beq _037FCB24 - mov r0, r9 - mov r1, r6 - ldr r2, [r9, #76] ; 0x4c - mov lr, pc - bx r3 -_037FCB24: - mov r0, r8 - mov r1, r5 - bl SND_StopChannel - strb r4, [r9, #34] ; 0x22 - mov r0, r9 - bl SND_FreeExChannel - ldrb r0, [r9, #3] - bic r0, r0, #248 ; 0xf8 - strb r0, [r9, #3] - ldrb r0, [r9, #3] - bic r0, r0, #1 - strb r0, [r9, #3] -_037FCB54: - add r8, r8, #1 - mov sl, sl, lsr #1 -_037FCB5C: - cmp r8, #16 - bge _037FCB6C - cmp sl, #0 - bne _037FCAE0 -_037FCB6C: - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - bx lr -_037FCB78: .word SNDi_Work -_037FCB7C: .word _03807F48 diff --git a/arm7/global.inc b/arm7/global.inc index f6880895..b89a6c21 100644 --- a/arm7/global.inc +++ b/arm7/global.inc @@ -427,8 +427,8 @@ .extern _03807A54 .extern _03807A74 .extern _03807AA0 -.extern _03807F44 -.extern _03807F48 +.extern sLockedChannelMask +.extern sUnlockedChannelMask .extern _03807F4C .extern _03807F50 .extern _03807F58 diff --git a/arm7/lib/include/SND_exChannel.h b/arm7/lib/include/SND_exChannel.h index 976d2786..8450a629 100644 --- a/arm7/lib/include/SND_exChannel.h +++ b/arm7/lib/include/SND_exChannel.h @@ -3,9 +3,12 @@ #include "nitro/types.h" +#include "nitro/SND_main_shared.h" + void SND_ExChannelInit(void); BOOL SND_IsChannelActive(s32 idx); void SND_UpdateExChannel(void); void SND_ExChannelMain(BOOL update); +void SND_FreeExChannel(struct SNDExChannel *chn); #endif //GUARD_SND_EXCHANNEL_H diff --git a/arm7/lib/include/SND_lockChannel.h b/arm7/lib/include/SND_lockChannel.h new file mode 100644 index 00000000..ed7fd872 --- /dev/null +++ b/arm7/lib/include/SND_lockChannel.h @@ -0,0 +1,11 @@ +#ifndef GUARD_SND_LOCKCHANNEL_H +#define GUARD_SND_LOCKCHANNEL_H + +#include "nitro/types.h" + +void SND_StopUnlockedChannel(u32 channelMask); +void SND_LockChannel(u32 channelMask, u32 locked); +void SND_UnlockChannel(u32 channelMask, u32 locked); +u32 SND_GetLockedChannel(u32 locked); + +#endif //GUARD_SND_LOCKCHANNEL_H diff --git a/arm7/lib/src/SND_lockChannel.c b/arm7/lib/src/SND_lockChannel.c new file mode 100644 index 00000000..cecfd871 --- /dev/null +++ b/arm7/lib/src/SND_lockChannel.c @@ -0,0 +1,79 @@ +#include "SND_lockChannel.h" + +#include "SND_work.h" +#include "SND_exChannel.h" +#include "SND.h" + +// TODO make these vars static after merging this file with exChannel +u32 sUnlockedChannelMask; +u32 sLockedChannelMask; + +void SND_StopUnlockedChannel(u32 channelMask) { + struct SNDExChannel *chn; + + for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1) { + if ((channelMask & 1) == 0) + continue; + + chn = &SNDi_Work.channels[i]; + + if (sUnlockedChannelMask & (1 << i)) + continue; + + if (chn->callback) + chn->callback(chn, 0, chn->callbackUserData); + + SND_StopChannel(i, 0); + chn->priority = 0; + SND_FreeExChannel(chn); + chn->flags.syncFlag = 0; + chn->flags.active = 0; + } +} + +void SND_LockChannel(u32 channelMask, u32 locked) { + struct SNDExChannel *chn; + u32 j = channelMask; + int i = 0; + + for (; i < SND_CHANNEL_COUNT && j != 0; i++, j >>= 1) { + if ((j & 1) == 0) + continue; + + chn = &SNDi_Work.channels[i]; + + if (sUnlockedChannelMask & (1 << i)) + continue; + + if (chn->callback) + chn->callback(chn, 0, chn->callbackUserData); + + SND_StopChannel(i, 0); + chn->priority = 0; + SND_FreeExChannel(chn); + chn->flags.syncFlag = 0; + chn->flags.active = 0; + } + + if (locked & 1) { + sLockedChannelMask |= channelMask; + } else { + sUnlockedChannelMask |= channelMask; + } +} + +void SND_UnlockChannel(u32 channelMask, u32 locked) { + if (locked & 1) { + sLockedChannelMask &= ~channelMask; + } else { + sUnlockedChannelMask &= ~channelMask; + } +} + +u32 SND_GetLockedChannel(u32 locked) { + if (locked & 1) { + return sLockedChannelMask; + } else { + return sUnlockedChannelMask; + } +} -- cgit v1.2.3 From d049ab8b4a071b7718461dc8b513f34466fec931 Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Wed, 30 Jun 2021 19:03:31 +0200 Subject: add some more sound header stuff --- arm7/lib/include/SND_channel.h | 42 ++++++++++++++++++++++++++++++++++++ arm7/lib/include/SND_exChannel.h | 2 ++ arm7/lib/include/registers.h | 7 ++++++ include/nitro/SND_exChannel_shared.h | 25 +++++++++++++++++++++ include/nitro/SND_main_shared.h | 4 ++-- 5 files changed, 78 insertions(+), 2 deletions(-) create mode 100644 arm7/lib/include/SND_channel.h create mode 100644 include/nitro/SND_exChannel_shared.h diff --git a/arm7/lib/include/SND_channel.h b/arm7/lib/include/SND_channel.h new file mode 100644 index 00000000..5f90aa66 --- /dev/null +++ b/arm7/lib/include/SND_channel.h @@ -0,0 +1,42 @@ +#ifndef GUARD_SND_CHANNEL_H +#define GUARD_SND_CHANNEL_H + +#include "nitro/types.h" + +void SND_SetupChannelPcm( + s32 chnIdx, + const void *data, + s32 format, + s32 loop, + s32 loopStart, + s32 loopLen, + s32 volume, + s32 volumeDiv, + s32 timer, + s32 pan +); + +void SND_SetupChannelPsg( + s32 chnIdx, + s32 waveDuty, + s32 volume, + s32 volumeDiv, + s32 timer, + s32 pan +); + +void SND_SetupChannelNoise( + s32 chnIdx, + s32 volume, + s32 volumeDiv, + s32 timer, + s32 pan +); + +void SND_StopChannel(s32 chnIdx, s32 hold); + +void SND_SetChannelVolume(s32 chnIdx, s32 volume, s32 volumeDiv); +void SND_SetChannelPan(s32 chnIdx, s32 pan); +void SND_SetChannelTimer(s32 chnIdx, s32 timer); + +#endif //GUARD_SND_CHANNEL_H diff --git a/arm7/lib/include/SND_exChannel.h b/arm7/lib/include/SND_exChannel.h index 8450a629..cc07d34f 100644 --- a/arm7/lib/include/SND_exChannel.h +++ b/arm7/lib/include/SND_exChannel.h @@ -11,4 +11,6 @@ void SND_UpdateExChannel(void); void SND_ExChannelMain(BOOL update); void SND_FreeExChannel(struct SNDExChannel *chn); +typedef void (*SNDExChannelCallback)(struct SNDExChannel *chn, s32 status, void *userData); + #endif //GUARD_SND_EXCHANNEL_H diff --git a/arm7/lib/include/registers.h b/arm7/lib/include/registers.h index 1fb1e9ca..bc55d0d8 100644 --- a/arm7/lib/include/registers.h +++ b/arm7/lib/include/registers.h @@ -5,6 +5,13 @@ #define reg_EXTKEYIN (*(REGType16v *)0x4000136) +#define reg_SOUNDxCNT_STAT(x) (*((REGType8v *)0x4000403 + ((int)(x) * 0x10))) +#define reg_SOUNDxCNT(x) (*((REGType32v *)0x4000400 + ((int)x) * 0x10)) +#define reg_SOUNDxSAD(x) (*((REGType32v *)0x4000404 + ((int)x) * 0x10)) +#define reg_SOUNDxTMR(x) (*((REGType16v *)0x4000408 + ((int)x) * 0x10)) +#define reg_SOUNDxPNT(x) (*((REGType16v *)0x400040A + ((int)x) * 0x10)) +#define reg_SOUNDxLEN(x) (*((REGType32v *)0x400040C + ((int)x) * 0x10)) + #define EXTKEYIN_X (1<<0) #define EXTKEYIN_Y (1<<1) #define EXTKEYIN_DEBUG (1<<3) diff --git a/include/nitro/SND_exChannel_shared.h b/include/nitro/SND_exChannel_shared.h new file mode 100644 index 00000000..eb702f16 --- /dev/null +++ b/include/nitro/SND_exChannel_shared.h @@ -0,0 +1,25 @@ +#ifndef GUARD_SND_EXCHANNEL_SHARED_H +#define GUARD_SND_EXCHANNEL_SHARED_H + +#include "nitro/types.h" + +#define SND_ENV_ATTACK 0 +#define SND_ENV_DECAY 1 +#define SND_ENV_SUSTAIN 2 +#define SND_ENV_RELEASE 3 + +#define SND_CHN_TYPE_PCM 0 +#define SND_CHN_TYPE_PSG 1 +#define SND_CHN_TYPE_NOISE 2 + +#define SND_CHN_SYNC_START 0x1 +#define SND_CHN_SYNC_STOP 0x2 +#define SND_CHN_SYNC_TIMER 0x4 +#define SND_CHN_SYNC_VOLUME 0x8 +#define SND_CHN_SYNC_PAN 0x10 + +#define SND_LFO_PITCH 0 +#define SND_LFO_VOLUME 1 +#define SND_LFO_PAN 2 + +#endif //GUARD_SND_EXCHANNEL_SHARED_H diff --git a/include/nitro/SND_main_shared.h b/include/nitro/SND_main_shared.h index d77273ed..154d93b6 100644 --- a/include/nitro/SND_main_shared.h +++ b/include/nitro/SND_main_shared.h @@ -83,7 +83,7 @@ struct SNDExChannel { union { const void *waveDataPtr; - u32 dutyCycle; + s32 dutyCycle; }; // 0x44 void (*callback)(struct SNDExChannel *chn, u32 status, void *userData); // 0x48 @@ -173,4 +173,4 @@ struct SNDTrack { }; // size = 0x40 #endif //POKEDIAMOND_SND_MAIN_SHARED_H - \ No newline at end of file + -- cgit v1.2.3 From 45bbe700e7686ab96b7fc805ea2ea6d024f6077f Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Thu, 1 Jul 2021 00:09:40 +0200 Subject: arm7: decompile SND_exChannel --- arm7/asm/SND_channel.s | 28 +- arm7/asm/SND_exChannel.s | 645 ------------------------------------- arm7/asm/SND_util.s | 10 +- arm7/asm/wram2.s | 16 +- arm7/global.inc | 21 +- arm7/lib/include/SND_channel.h | 3 + arm7/lib/include/SND_exChannel.h | 25 +- arm7/lib/include/SND_lockChannel.h | 4 + arm7/lib/include/SND_util.h | 7 + arm7/lib/src/SND_exChannel.c | 346 ++++++++++++++++++++ arm7/lib/src/SND_lockChannel.c | 18 +- 11 files changed, 427 insertions(+), 696 deletions(-) delete mode 100644 arm7/asm/SND_exChannel.s create mode 100644 arm7/lib/src/SND_exChannel.c diff --git a/arm7/asm/SND_channel.s b/arm7/asm/SND_channel.s index 850c06f3..44744493 100644 --- a/arm7/asm/SND_channel.s +++ b/arm7/asm/SND_channel.s @@ -3,8 +3,8 @@ .text - arm_func_start FUN_037FC530 -FUN_037FC530: ; 0x037FC530 + arm_func_start ExChannelLfoUpdate +ExChannelLfoUpdate: ; 0x037FC530 stmdb sp!, {r4, r5, r6, lr} mov r6, r0 mov r5, r1 @@ -50,8 +50,8 @@ _037FC5C0: ldmia sp!, {r4, r5, r6, lr} bx lr - arm_func_start FUN_037FC5CC -FUN_037FC5CC: ; 0x037FC5CC + arm_func_start ExChannelSweepUpdate +ExChannelSweepUpdate: ; 0x037FC5CC stmdb sp!, {r4, r5, lr} sub sp, sp, #4 mov r4, r0 @@ -82,8 +82,8 @@ _037FC630: ldmia sp!, {r4, r5, lr} bx lr - arm_func_start FUN_037FC63C -FUN_037FC63C: ; 0x037FC63C + arm_func_start ExChannelVolumeCmp +ExChannelVolumeCmp: ; 0x037FC63C stmfd sp!, {lr} sub sp, sp, #4 ldrh lr, [r0, #36] ; 0x24 @@ -92,7 +92,7 @@ FUN_037FC63C: ; 0x037FC63C and r0, ip, #255 ; 0xff mov r2, r2, lsl #4 mov r3, r0, lsl #4 - ldr r1, _037FC698 ; =_03807294 + ldr r1, _037FC698 ; =sSampleDataShiftTable ldrb r0, [r1, lr, asr #8] mov r2, r2, asr r0 ldrb r0, [r1, ip, asr #8] @@ -109,10 +109,10 @@ _037FC68C: add sp, sp, #4 ldmia sp!, {lr} bx lr -_037FC698: .word _03807294 +_037FC698: .word sSampleDataShiftTable - arm_func_start FUN_037FC69C -FUN_037FC69C: ; 0x037FC69C + arm_func_start ExChannelStart +ExChannelStart: ; 0x037FC69C stmdb sp!, {r4, lr} mov r4, r0 ldr r0, _037FC6E4 ; =0xFFFE9680 @@ -133,8 +133,8 @@ FUN_037FC69C: ; 0x037FC69C bx lr _037FC6E4: .word 0xFFFE9680 - arm_func_start FUN_037FC6E8 -FUN_037FC6E8: ; 0x037FC6E8 + arm_func_start ExChannelSetup +ExChannelSetup: ; 0x037FC6E8 stmdb sp!, {r4, lr} mov r4, r0 mov ip, #0 @@ -179,8 +179,8 @@ FUN_037FC6E8: ; 0x037FC6E8 ldmia sp!, {r4, lr} bx lr - arm_func_start FUN_037FC794 -FUN_037FC794: ; 0x037FC794 + arm_func_start CalcDecayCoeff +CalcDecayCoeff: ; 0x037FC794 stmfd sp!, {lr} sub sp, sp, #4 mov r1, r0 diff --git a/arm7/asm/SND_exChannel.s b/arm7/asm/SND_exChannel.s deleted file mode 100644 index f6e8fe4d..00000000 --- a/arm7/asm/SND_exChannel.s +++ /dev/null @@ -1,645 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .text - - arm_func_start SND_FreeExChannel -SND_FreeExChannel: ; 0x037FCB80 - cmp r0, #0 - movne r1, #0 - strne r1, [r0, #72] ; 0x48 - strne r1, [r0, #76] ; 0x4c - bx lr - - arm_func_start SND_AllocExChannel -SND_AllocExChannel: ; 0x037FCB94 - stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - sub sp, sp, #4 - mov sl, r0 - mov r9, r1 - mov fp, r3 - ldr r0, _037FCCBC ; =sUnlockedChannelMask - ldr r0, [r0] - mvn r0, r0 - and sl, sl, r0 - cmp r2, #0 - ldreq r0, _037FCCC0 ; =sLockedChannelMask - ldreq r0, [r0] - mvneq r0, r0 - andeq sl, sl, r0 - mov r8, #0 - mov r7, r8 - mov r5, #1 - mov r4, #84 ; 0x54 -_037FCBDC: - ldr r0, _037FCCC4 ; =_03807298 - ldrb r1, [r0, r7] - mov r0, r5, lsl r1 - ands r0, sl, r0 - beq _037FCC34 - ldr r0, _037FCCC8 ; =SNDi_Work - mla r6, r1, r4, r0 - cmp r8, #0 - moveq r8, r6 - beq _037FCC34 - ldrb r1, [r8, #34] ; 0x22 - ldrb r0, [r6, #34] ; 0x22 - cmp r0, r1 - bhi _037FCC34 - cmp r0, r1 - bne _037FCC30 - mov r0, r8 - mov r1, r6 - bl FUN_037FC63C - cmp r0, #0 - bge _037FCC34 -_037FCC30: - mov r8, r6 -_037FCC34: - add r7, r7, #1 - cmp r7, #16 - blt _037FCBDC - cmp r8, #0 - moveq r0, #0 - beq _037FCCB0 - ldrb r0, [r8, #34] ; 0x22 - cmp r9, r0 - movlt r0, #0 - blt _037FCCB0 - ldr r3, [r8, #72] ; 0x48 - cmp r3, #0 - beq _037FCC7C - mov r0, r8 - mov r1, #0 - ldr r2, [r8, #76] ; 0x4c - mov lr, pc - bx r3 -_037FCC7C: - ldrb r0, [r8, #3] - bic r0, r0, #248 ; 0xf8 - orr r0, r0, #16 - strb r0, [r8, #3] - ldrb r0, [r8, #3] - bic r0, r0, #1 - strb r0, [r8, #3] - mov r0, r8 - mov r1, fp - ldr r2, [sp, #40] ; 0x28 - mov r3, r9 - bl FUN_037FC6E8 - mov r0, r8 -_037FCCB0: - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - bx lr -_037FCCBC: .word sUnlockedChannelMask -_037FCCC0: .word sLockedChannelMask -_037FCCC4: .word _03807298 -_037FCCC8: .word SNDi_Work - - arm_func_start SND_IsExChannelActive -SND_IsExChannelActive: ; 0x037FCCCC - ldrb r0, [r0, #3] - mov r0, r0, lsl #31 - mov r0, r0, lsr #31 - bx lr - - arm_func_start SND_ReleaseExChannel -SND_ReleaseExChannel: ; 0x037FCCDC - mov r1, #3 - strb r1, [r0, #2] - bx lr - - arm_func_start SND_SetExChannelRelease -SND_SetExChannelRelease: ; 0x037FCCE8 - stmdb sp!, {r4, lr} - mov r4, r0 - mov r0, r1 - bl FUN_037FC794 - strh r0, [r4, #32] - ldmia sp!, {r4, lr} - bx lr - - arm_func_start SND_SetExChannelSustain -SND_SetExChannelSustain: ; 0x037FCD04 - strb r1, [r0, #29] - bx lr - - arm_func_start SND_SetExChannelDecay -SND_SetExChannelDecay: ; 0x037FCD0C - stmdb sp!, {r4, lr} - mov r4, r0 - mov r0, r1 - bl FUN_037FC794 - strh r0, [r4, #30] - ldmia sp!, {r4, lr} - bx lr - - arm_func_start SND_SetExChannelAttack -SND_SetExChannelAttack: ; 0x037FCD28 - cmp r1, #109 ; 0x6d - rsblt r1, r1, #255 ; 0xff - strltb r1, [r0, #28] - rsbge r2, r1, #127 ; 0x7f - ldrge r1, _037FCD48 ; =_038072A8 - ldrgeb r1, [r1, r2] - strgeb r1, [r0, #28] - bx lr -_037FCD48: .word _038072A8 - - arm_func_start SND_UpdateExChannelEnvelope -SND_UpdateExChannelEnvelope: ; 0x037FCD4C - cmp r1, #0 - beq _037FCDF0 - ldrb r1, [r0, #2] - cmp r1, #3 - addls pc, pc, r1, lsl #2 - b _037FCDF0 - b _037FCD74 - b _037FCDA4 - b _037FCDF0 - b _037FCDE0 -_037FCD74: - ldr r1, [r0, #16] - rsb r2, r1, #0 - ldrb r1, [r0, #28] - mul r1, r2, r1 - mov r1, r1, asr #8 - rsb r1, r1, #0 - str r1, [r0, #16] - ldr r1, [r0, #16] - cmp r1, #0 - moveq r1, #1 - streqb r1, [r0, #2] - b _037FCDF0 -_037FCDA4: - ldrb r1, [r0, #29] - mov r2, r1, lsl #1 - ldr r1, _037FCDFC ; =SNDi_DecibelSquareTable - ldrsh r1, [r1, r2] - mov r3, r1, lsl #7 - ldr r2, [r0, #16] - ldrh r1, [r0, #30] - sub r1, r2, r1 - str r1, [r0, #16] - ldr r1, [r0, #16] - cmp r1, r3 - strle r3, [r0, #16] - movle r1, #2 - strleb r1, [r0, #2] - b _037FCDF0 -_037FCDE0: - ldr r2, [r0, #16] - ldrh r1, [r0, #32] - sub r1, r2, r1 - str r1, [r0, #16] -_037FCDF0: - ldr r0, [r0, #16] - mov r0, r0, asr #7 - bx lr -_037FCDFC: .word SNDi_DecibelSquareTable - - arm_func_start SND_StartExChannelNoise -SND_StartExChannelNoise: ; 0x037FCE00 - stmfd sp!, {lr} - sub sp, sp, #4 - ldrb r2, [r0] - cmp r2, #14 - movcc r0, #0 - bcc _037FCE3C - cmp r2, #15 - movhi r0, #0 - bhi _037FCE3C - mov r2, #2 - strb r2, [r0, #1] - ldr r2, _037FCE48 ; =0x00001F46 - strh r2, [r0, #60] ; 0x3c - bl FUN_037FC69C - mov r0, #1 -_037FCE3C: - add sp, sp, #4 - ldmia sp!, {lr} - bx lr -_037FCE48: .word 0x00001F46 - - arm_func_start SND_StartExChannelPsg -SND_StartExChannelPsg: ; 0x037FCE4C - stmfd sp!, {lr} - sub sp, sp, #4 - ldrb r3, [r0] - cmp r3, #8 - movcc r0, #0 - bcc _037FCE90 - cmp r3, #13 - movhi r0, #0 - bhi _037FCE90 - mov r3, #1 - strb r3, [r0, #1] - str r1, [r0, #68] ; 0x44 - ldr r1, _037FCE9C ; =0x00001F46 - strh r1, [r0, #60] ; 0x3c - mov r1, r2 - bl FUN_037FC69C - mov r0, #1 -_037FCE90: - add sp, sp, #4 - ldmia sp!, {lr} - bx lr -_037FCE9C: .word 0x00001F46 - - arm_func_start SND_StartExChannelPcm -SND_StartExChannelPcm: ; 0x037FCEA0 - stmdb sp!, {r4, lr} - mov r4, r0 - mov lr, r2 - mov r0, #0 - strb r0, [r4, #1] - add ip, r4, #56 ; 0x38 - ldmia r1, {r0, r1, r2} - stmia ip, {r0, r1, r2} - str lr, [r4, #68] ; 0x44 - mov r0, r4 - mov r1, r3 - bl FUN_037FC69C - mov r0, #1 - ldmia sp!, {r4, lr} - bx lr - - arm_func_start SND_ExChannelMain -SND_ExChannelMain: ; 0x037FCEDC - stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - sub sp, sp, #28 - mov r6, r0 - mov r4, #0 - mov fp, r4 - mov r7, #1 - str r4, [sp, #8] - mov r0, #127 ; 0x7f - str r0, [sp, #20] - str r4, [sp, #16] - str r4, [sp, #12] - str r4, [sp, #4] - str r4, [sp] -_037FCF10: - ldr r8, [sp] - mov sl, r8 - mov r9, r8 - mov r1, #84 ; 0x54 - ldr r0, _037FD1E4 ; =SNDi_Work - mla r5, r4, r1, r0 - ldrb r1, [r5, #3] - mov r0, r1, lsl #31 - movs r0, r0, lsr #31 - beq _037FD1CC - mov r0, r1, lsl #30 - movs r0, r0, lsr #31 - beq _037FCF74 - bic r0, r1, #248 ; 0xf8 - mov r1, r1, lsl #24 - mov r1, r1, lsr #27 - orr r1, r1, #1 - and r1, r1, #255 ; 0xff - and r1, r1, #31 - orr r0, r0, r1, lsl #3 - strb r0, [r5, #3] - ldrb r0, [r5, #3] - bic r0, r0, #2 - strb r0, [r5, #3] - b _037FCFC0 -_037FCF74: - mov r0, r4 - bl SND_IsChannelActive - cmp r0, #0 - bne _037FCFC0 - ldr r3, [r5, #72] ; 0x48 - cmp r3, #0 - streqb fp, [r5, #34] ; 0x22 - beq _037FCFA8 - mov r0, r5 - mov r1, r7 - ldr r2, [r5, #76] ; 0x4c - mov lr, pc - bx r3 -_037FCFA8: - ldr r0, [sp, #4] - strh r0, [r5, #36] ; 0x24 - ldrb r0, [r5, #3] - bic r0, r0, #1 - strb r0, [r5, #3] - b _037FD1CC -_037FCFC0: - ldrb r0, [r5, #9] - mov r1, r0, lsl #1 - ldr r0, _037FD1E8 ; =SNDi_DecibelSquareTable - ldrsh r0, [r0, r1] - add r8, r8, r0 - ldrb r1, [r5, #8] - ldrb r0, [r5, #5] - sub r0, r1, r0 - add sl, sl, r0, lsl #6 - mov r0, r5 - mov r1, r6 - bl SND_UpdateExChannelEnvelope - add r8, r8, r0 - mov r0, r5 - mov r1, r6 - bl FUN_037FC5CC - add r2, sl, r0 - ldrsh r0, [r5, #12] - add r1, r8, r0 - ldrsh r0, [r5, #6] - add r8, r1, r0 - ldrsh r0, [r5, #14] - add sl, r2, r0 - mov r0, r5 - mov r1, r6 - bl FUN_037FC530 - ldrb r1, [r5, #40] ; 0x28 - cmp r1, #0 - beq _037FD05C - cmp r1, #1 - beq _037FD048 - cmp r1, #2 - addeq r9, r9, r0 - b _037FD060 -_037FD048: - mov r1, #32768 ; 0x8000 - rsb r1, r1, #0 - cmp r8, r1 - addgt r8, r8, r0 - b _037FD060 -_037FD05C: - add sl, sl, r0 -_037FD060: - ldrsb r0, [r5, #10] - add r9, r9, r0 - ldrb r0, [r5, #4] - cmp r0, #127 ; 0x7f - mulne r0, r9, r0 - addne r0, r0, #64 ; 0x40 - movne r9, r0, asr #7 - ldrsb r0, [r5, #11] - add r9, r9, r0 - ldrb r0, [r5, #2] - cmp r0, #3 - bne _037FD0EC - ldr r0, _037FD1EC ; =0xFFFFFD2D - cmp r8, r0 - bgt _037FD0EC - ldrb r0, [r5, #3] - bic r0, r0, #248 ; 0xf8 - orr r0, r0, #16 - strb r0, [r5, #3] - ldr r3, [r5, #72] ; 0x48 - cmp r3, #0 - ldreq r0, [sp, #8] - streqb r0, [r5, #34] ; 0x22 - beq _037FD0D4 - mov r0, r5 - mov r1, r7 - ldr r2, [r5, #76] ; 0x4c - mov lr, pc - bx r3 -_037FD0D4: - ldr r0, [sp, #12] - strh r0, [r5, #36] ; 0x24 - ldrb r0, [r5, #3] - bic r0, r0, #1 - strb r0, [r5, #3] - b _037FD1CC -_037FD0EC: - mov r0, r8 - bl SND_CalcChannelVolume - mov r8, r0 - ldrh r0, [r5, #60] ; 0x3c - mov r1, sl - bl SND_CalcTimer - ldrb r1, [r5, #1] - cmp r1, #1 - ldreq r1, _037FD1F0 ; =0x0000FFFC - andeq r0, r0, r1 - moveq r0, r0, lsl #16 - moveq r0, r0, lsr #16 - adds r9, r9, #64 ; 0x40 - ldrmi r9, [sp, #16] - bmi _037FD130 - cmp r9, #127 ; 0x7f - ldrgt r9, [sp, #20] -_037FD130: - ldrh r1, [r5, #36] ; 0x24 - cmp r8, r1 - beq _037FD164 - strh r8, [r5, #36] ; 0x24 - ldrb r2, [r5, #3] - bic r1, r2, #248 ; 0xf8 - mov r2, r2, lsl #24 - mov r2, r2, lsr #27 - orr r2, r2, #8 - and r2, r2, #255 ; 0xff - and r2, r2, #31 - orr r1, r1, r2, lsl #3 - strb r1, [r5, #3] -_037FD164: - ldrh r1, [r5, #38] ; 0x26 - cmp r0, r1 - beq _037FD198 - strh r0, [r5, #38] ; 0x26 - ldrb r0, [r5, #3] - bic r1, r0, #248 ; 0xf8 - mov r0, r0, lsl #24 - mov r0, r0, lsr #27 - orr r0, r0, #4 - and r0, r0, #255 ; 0xff - and r0, r0, #31 - orr r0, r1, r0, lsl #3 - strb r0, [r5, #3] -_037FD198: - ldrb r0, [r5, #35] ; 0x23 - cmp r9, r0 - beq _037FD1CC - strb r9, [r5, #35] ; 0x23 - ldrb r0, [r5, #3] - bic r1, r0, #248 ; 0xf8 - mov r0, r0, lsl #24 - mov r0, r0, lsr #27 - orr r0, r0, #16 - and r0, r0, #255 ; 0xff - and r0, r0, #31 - orr r0, r1, r0, lsl #3 - strb r0, [r5, #3] -_037FD1CC: - add r4, r4, #1 - cmp r4, #16 - blt _037FCF10 - add sp, sp, #28 - ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - bx lr -_037FD1E4: .word SNDi_Work -_037FD1E8: .word SNDi_DecibelSquareTable -_037FD1EC: .word 0xFFFFFD2D -_037FD1F0: .word 0x0000FFFC - - arm_func_start SND_UpdateExChannel -SND_UpdateExChannel: ; 0x037FD1F4 - stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} - sub sp, sp, #24 - mov r8, #0 - mov r4, #2 - mov r5, #1 - mov r6, r8 - ldr r7, _037FD3DC ; =SNDi_Work - mov sl, #84 ; 0x54 -_037FD214: - mla r9, r8, sl, r7 - ldrb r0, [r9, #3] - mov r0, r0, lsl #24 - movs r0, r0, lsr #27 - beq _037FD374 - ands r0, r0, #2 - beq _037FD23C - mov r0, r8 - mov r1, r6 - bl SND_StopChannel -_037FD23C: - ldrb r0, [r9, #3] - mov r0, r0, lsl #24 - mov r1, r0, lsr #27 - ands r0, r1, #1 - beq _037FD318 - ldrb r0, [r9, #1] - cmp r0, #0 - beq _037FD270 - cmp r0, #1 - beq _037FD2C8 - cmp r0, #2 - beq _037FD2F4 - b _037FD374 -_037FD270: - ldrb r0, [r9, #57] ; 0x39 - cmp r0, #0 - movne r3, r5 - moveq r3, r4 - ldrh r1, [r9, #36] ; 0x24 - ldrh r0, [r9, #62] ; 0x3e - str r0, [sp] - ldr r0, [r9, #64] ; 0x40 - str r0, [sp, #4] - and r0, r1, #255 ; 0xff - str r0, [sp, #8] - mov r0, r1, asr #8 - str r0, [sp, #12] - ldrh r0, [r9, #38] ; 0x26 - str r0, [sp, #16] - ldrb r0, [r9, #35] ; 0x23 - str r0, [sp, #20] - mov r0, r8 - ldr r1, [r9, #68] ; 0x44 - ldrb r2, [r9, #56] ; 0x38 - bl SND_SetupChannelPcm - b _037FD374 -_037FD2C8: - ldrh r3, [r9, #36] ; 0x24 - ldrh r0, [r9, #38] ; 0x26 - str r0, [sp] - ldrb r0, [r9, #35] ; 0x23 - str r0, [sp, #4] - mov r0, r8 - ldr r1, [r9, #68] ; 0x44 - and r2, r3, #255 ; 0xff - mov r3, r3, asr #8 - bl SND_SetupChannelPsg - b _037FD374 -_037FD2F4: - ldrh r2, [r9, #36] ; 0x24 - ldrb r0, [r9, #35] ; 0x23 - str r0, [sp] - mov r0, r8 - and r1, r2, #255 ; 0xff - mov r2, r2, asr #8 - ldrh r3, [r9, #38] ; 0x26 - bl SND_SetupChannelNoise - b _037FD374 -_037FD318: - ands r0, r1, #4 - beq _037FD32C - mov r0, r8 - ldrh r1, [r9, #38] ; 0x26 - bl SND_SetChannelTimer -_037FD32C: - ldrb r0, [r9, #3] - mov r0, r0, lsl #24 - mov r0, r0, lsr #27 - ands r0, r0, #8 - beq _037FD354 - ldrh r2, [r9, #36] ; 0x24 - mov r0, r8 - and r1, r2, #255 ; 0xff - mov r2, r2, asr #8 - bl SND_SetChannelVolume -_037FD354: - ldrb r0, [r9, #3] - mov r0, r0, lsl #24 - mov r0, r0, lsr #27 - ands r0, r0, #16 - beq _037FD374 - mov r0, r8 - ldrb r1, [r9, #35] ; 0x23 - bl SND_SetChannelPan -_037FD374: - add r8, r8, #1 - cmp r8, #16 - blt _037FD214 - mov r5, #0 - ldr r3, _037FD3DC ; =SNDi_Work - mov r1, #84 ; 0x54 -_037FD38C: - mla r4, r5, r1, r3 - ldrb r0, [r4, #3] - mov r0, r0, lsl #24 - movs r0, r0, lsr #27 - beq _037FD3C4 - ands r0, r0, #1 - movne r0, r5, lsl #4 - addne r0, r0, #67108864 ; 0x4000000 - ldrneb r2, [r0, #1027] ; 0x403 - orrne r2, r2, #128 ; 0x80 - strneb r2, [r0, #1027] ; 0x403 - ldrb r0, [r4, #3] - bic r0, r0, #248 ; 0xf8 - strb r0, [r4, #3] -_037FD3C4: - add r5, r5, #1 - cmp r5, #16 - blt _037FD38C - add sp, sp, #24 - ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, lr} - bx lr -_037FD3DC: .word SNDi_Work - - arm_func_start SND_ExChannelInit -SND_ExChannelInit: ; 0x037FD3E0 - mov ip, #0 - ldr r2, _037FD434 ; =SNDi_Work - mov r0, #84 ; 0x54 -_037FD3EC: - mul r1, ip, r0 - add r3, r2, r1 - strb ip, [r2, r1] - ldrb r1, [r3, #3] - bic r1, r1, #248 ; 0xf8 - strb r1, [r3, #3] - ldrb r1, [r3, #3] - bic r1, r1, #1 - strb r1, [r3, #3] - add ip, ip, #1 - cmp ip, #16 - blt _037FD3EC - mov r1, #0 - ldr r0, _037FD438 ; =sUnlockedChannelMask - str r1, [r0] - ldr r0, _037FD43C ; =sLockedCHannelMask - str r1, [r0] - bx lr -_037FD434: .word SNDi_Work -_037FD438: .word sUnlockedChannelMask -_037FD43C: .word sLockedChannelMask diff --git a/arm7/asm/SND_util.s b/arm7/asm/SND_util.s index 4d136781..7964fe4e 100644 --- a/arm7/asm/SND_util.s +++ b/arm7/asm/SND_util.s @@ -28,18 +28,18 @@ _037FC088: .word 0x3C6EF35F arm_func_start SND_SinIdx SND_SinIdx: ; 0x037FC08C cmp r0, #32 - ldrlt r1, _037FC0F4 ; =_03807170 + ldrlt r1, _037FC0F4 ; =sLfoSinTable ldrltsb r0, [r1, r0] bxlt lr cmp r0, #64 ; 0x40 rsblt r1, r0, #64 ; 0x40 - ldrlt r0, _037FC0F4 ; =_03807170 + ldrlt r0, _037FC0F4 ; =sLfoSinTable ldrltsb r0, [r0, r1] bxlt lr cmp r0, #96 ; 0x60 bge _037FC0D4 sub r1, r0, #64 ; 0x40 - ldr r0, _037FC0F4 ; =_03807170 + ldr r0, _037FC0F4 ; =sLfoSinTable ldrsb r0, [r0, r1] rsb r0, r0, #0 mov r0, r0, lsl #24 @@ -48,13 +48,13 @@ SND_SinIdx: ; 0x037FC08C _037FC0D4: sub r0, r0, #96 ; 0x60 rsb r1, r0, #32 - ldr r0, _037FC0F4 ; =_03807170 + ldr r0, _037FC0F4 ; =sLfoSinTable ldrsb r0, [r0, r1] rsb r0, r0, #0 mov r0, r0, lsl #24 mov r0, r0, asr #24 bx lr -_037FC0F4: .word _03807170 +_037FC0F4: .word sLfoSinTable arm_func_start SND_CalcChannelVolume SND_CalcChannelVolume: ; 0x037FC0F8 diff --git a/arm7/asm/wram2.s b/arm7/asm/wram2.s index 7191db9d..6dfeea6f 100644 --- a/arm7/asm/wram2.s +++ b/arm7/asm/wram2.s @@ -962,8 +962,8 @@ _u32_div_not_0_f: ;@ 0x03806F94 mov r1, r3 bx lr - .global _03807170 -_03807170: + .global sLfoSinTable +sLfoSinTable: .byte 0 .byte 6 .byte 12 @@ -1132,15 +1132,15 @@ SNDi_DecibelSquareTable: .short -1 .short 0 - .global _03807294 -_03807294: + .global sSampleDataShiftTable +sSampleDataShiftTable: .byte 0 .byte 1 .byte 2 .byte 4 - .global _03807298 -_03807298: + .global sChannelAllocationOrder +sChannelAllocationOrder: .byte 4 .byte 5 .byte 6 @@ -1158,8 +1158,8 @@ _03807298: .byte 15 .byte 13 - .global _038072A8 -_038072A8: + .global sAttackCoeffTable +sAttackCoeffTable: .byte 0 .byte 1 .byte 5 diff --git a/arm7/global.inc b/arm7/global.inc index b89a6c21..d7f446e1 100644 --- a/arm7/global.inc +++ b/arm7/global.inc @@ -203,12 +203,11 @@ .extern SND_UpdateExChannel .extern SND_UpdateLfo .extern SND_UpdateSharedWork -.extern FUN_037FC530 -.extern FUN_037FC5CC -.extern FUN_037FC63C -.extern FUN_037FC69C -.extern FUN_037FC6E8 -.extern FUN_037FC794 +.extern ExChannelLfoUpdate +.extern ExChannelSweepUpdate +.extern ExChannelVolumeCmp +.extern ExChannelStart +.extern ExChannelSetup .extern FUN_037FD440 .extern FUN_037FD4C0 .extern FUN_037FD548 @@ -350,11 +349,11 @@ .extern _ll_udiv .extern _s32_div_f .extern _u32_div_f -.extern _03807170 +.extern sLfoSinTable .extern SNDi_DecibelSquareTable -.extern _03807294 -.extern _03807298 -.extern _038072A8 +.extern sSampleDataShiftTable +.extern sChannelAllocationOrder +.extern sAttackCoeffTable .extern _038072BC .extern _038072C0 .extern _038072C4 @@ -427,8 +426,6 @@ .extern _03807A54 .extern _03807A74 .extern _03807AA0 -.extern sLockedChannelMask -.extern sUnlockedChannelMask .extern _03807F4C .extern _03807F50 .extern _03807F58 diff --git a/arm7/lib/include/SND_channel.h b/arm7/lib/include/SND_channel.h index 5f90aa66..718e7e2b 100644 --- a/arm7/lib/include/SND_channel.h +++ b/arm7/lib/include/SND_channel.h @@ -39,4 +39,7 @@ void SND_SetChannelVolume(s32 chnIdx, s32 volume, s32 volumeDiv); void SND_SetChannelPan(s32 chnIdx, s32 pan); void SND_SetChannelTimer(s32 chnIdx, s32 timer); +// TODO move this function to SND_exChannel.c +u16 CalcDecayCoeff(s32 value); + #endif //GUARD_SND_CHANNEL_H diff --git a/arm7/lib/include/SND_exChannel.h b/arm7/lib/include/SND_exChannel.h index cc07d34f..dfd93f21 100644 --- a/arm7/lib/include/SND_exChannel.h +++ b/arm7/lib/include/SND_exChannel.h @@ -3,14 +3,33 @@ #include "nitro/types.h" +#include "nitro/SND_exChannel_shared.h" #include "nitro/SND_main_shared.h" +typedef void (*SNDExChannelCallback)(struct SNDExChannel *chn, s32 status, void *userData); + void SND_ExChannelInit(void); -BOOL SND_IsChannelActive(s32 idx); void SND_UpdateExChannel(void); -void SND_ExChannelMain(BOOL update); +void SND_ExChannelMain(BOOL step); +BOOL SND_StartExChannelPcm(struct SNDExChannel *chn, const struct SNDWaveParam *wave, const void *data, s32 length); +BOOL SND_StartExChannelPsg(struct SNDExChannel *chn, s32 duty, s32 length); +BOOL SND_StartExChannelNoise(struct SNDExChannel *chn, s32 length); +s32 SND_UpdateExChannelEnvelope(struct SNDExChannel *chn, BOOL step); +void SND_SetExChannelAttack(struct SNDExChannel *chn, s32 attack); +void SND_SetExChannelDecay(struct SNDExChannel *chn, s32 decay); +void SND_SetExChannelSustain(struct SNDExChannel *chn, s32 sustain); +void SND_SetExChannelRelease(struct SNDExChannel *chn, s32 release); +void SND_ReleaseExChannel(struct SNDExChannel *chn); +BOOL SND_IsExChannelActive(struct SNDExChannel *chn); +struct SNDExChannel *SND_AllocExChannel(u32 channelMask, int priority, u32 flags, SNDExChannelCallback callback, void *callbackUserData); void SND_FreeExChannel(struct SNDExChannel *chn); +BOOL SND_IsChannelActive(s32 idx); -typedef void (*SNDExChannelCallback)(struct SNDExChannel *chn, s32 status, void *userData); +// TODO internal functions, move these so exChannel +s32 ExChannelSweepUpdate(struct SNDExChannel *chn, BOOL step); +s32 ExChannelLfoUpdate(struct SNDExChannel *chn, BOOL step); +void ExChannelStart(struct SNDExChannel *chn, s32); +s32 ExChannelVolumeCmp(struct SNDExChannel *chn_a, struct SNDExChannel *chn_b); +void ExChannelSetup(struct SNDExChannel *, SNDExChannelCallback callback, void *callbackUserData, s32 priority); #endif //GUARD_SND_EXCHANNEL_H diff --git a/arm7/lib/include/SND_lockChannel.h b/arm7/lib/include/SND_lockChannel.h index ed7fd872..9673fb51 100644 --- a/arm7/lib/include/SND_lockChannel.h +++ b/arm7/lib/include/SND_lockChannel.h @@ -8,4 +8,8 @@ void SND_LockChannel(u32 channelMask, u32 locked); void SND_UnlockChannel(u32 channelMask, u32 locked); u32 SND_GetLockedChannel(u32 locked); +// TODO remove these externs if lockChannel is merged with exChannel +extern u32 sLockedChannelMask; +extern u32 sWeakLockedChannelMask; + #endif //GUARD_SND_LOCKCHANNEL_H diff --git a/arm7/lib/include/SND_util.h b/arm7/lib/include/SND_util.h index babf2a87..1bfdb7a8 100644 --- a/arm7/lib/include/SND_util.h +++ b/arm7/lib/include/SND_util.h @@ -3,6 +3,13 @@ #include "nitro/types.h" +#define SND_DECIBEL_SQUARE_TABLE_COUNT + u32 SND_CalcRandom(void); +u16 SND_CalcChannelVolume(s32 value); +u16 SND_CalcTimer(s32 timer, s32 pitch); + +extern const s16 SNDi_DecibelSquareTable[128]; + #endif //GUARD_SND_UTIL_H diff --git a/arm7/lib/src/SND_exChannel.c b/arm7/lib/src/SND_exChannel.c new file mode 100644 index 00000000..7919b5f7 --- /dev/null +++ b/arm7/lib/src/SND_exChannel.c @@ -0,0 +1,346 @@ +#include "SND_exChannel.h" + +#include "SND_channel.h" +#include "SND_main.h" +#include "SND_work.h" +#include "SND_lockChannel.h" +#include "SND_util.h" + +#include "registers.h" + +// TODO import these tables into here if they belong here +extern u8 sChannelAllocationOrder[SND_CHANNEL_COUNT]; +extern u8 sAttackCoeffTable[19]; + +void SND_ExChannelInit(void) { + struct SNDExChannel *chn; + s32 i; + + for (i = 0; i < SND_CHANNEL_COUNT; i++) { + chn = &SNDi_Work.channels[i]; + + chn->id = (u8)i; + chn->flags.syncFlag = 0; + chn->flags.active = FALSE; + } + + sLockedChannelMask = 0; + sWeakLockedChannelMask = 0; +} + +void SND_UpdateExChannel(void) { + struct SNDExChannel *chn; + s32 i; + + for (i = 0; i < SND_CHANNEL_COUNT; i++) { + chn = &SNDi_Work.channels[i]; + + if (chn->flags.syncFlag == 0) + continue; + + if (chn->flags.syncFlag & SND_CHN_SYNC_STOP) + SND_StopChannel(i, 0); + + if (chn->flags.syncFlag & SND_CHN_SYNC_START) { + switch (chn->type) { + case SND_CHN_TYPE_PCM: + SND_SetupChannelPcm( + i, + chn->waveDataPtr, + chn->waveParam.format, + chn->waveParam.loopEnabled ? 1 : 2, + (s32)chn->waveParam.loopStart, + (s32)chn->waveParam.loopLength, + chn->volume & 0xFF, + chn->volume >> 8, + chn->timer, + chn->pan + ); + break; + case SND_CHN_TYPE_PSG: + SND_SetupChannelPsg( + i, + chn->dutyCycle, + chn->volume & 0xFF, + chn->volume >> 8, + chn->timer, + chn->pan + ); + break; + case SND_CHN_TYPE_NOISE: + SND_SetupChannelNoise( + i, + chn->volume & 0xFF, + chn->volume >> 8, + chn->timer, + chn->pan + ); + break; + } + } else { + if (chn->flags.syncFlag & SND_CHN_SYNC_TIMER) { + SND_SetChannelTimer(i, chn->timer); + } + if (chn->flags.syncFlag & SND_CHN_SYNC_VOLUME) { + SND_SetChannelVolume(i, chn->volume & 0xFF, chn->volume >> 8); + } + if (chn->flags.syncFlag & SND_CHN_SYNC_PAN) { + SND_SetChannelPan(i, chn->pan); + } + } + } + + for (i = 0; i < SND_CHANNEL_COUNT; i++) { + chn = &SNDi_Work.channels[i]; + + if (!chn->flags.syncFlag) + continue; + + if (chn->flags.syncFlag & SND_CHN_SYNC_START) + reg_SOUNDxCNT_STAT(i) |= 0x80; + chn->flags.syncFlag = 0; + } +} + +void SND_ExChannelMain(BOOL step) { + struct SNDExChannel *chn; + s32 i; + s32 vol; + s32 pitch; + s32 pan; + s32 lfo; + u16 newTimer; + + for (i = 0; i < SND_CHANNEL_COUNT; i++) { + vol = 0; + pitch = 0; + pan = 0; + chn = &SNDi_Work.channels[i]; + + if (!chn->flags.active) + continue; + + if (chn->flags.start) { + chn->flags.syncFlag |= SND_CHN_SYNC_START; + chn->flags.start = FALSE; + } else if (!SND_IsChannelActive(i)) { + if (chn->callback) + chn->callback(chn, 1, chn->callbackUserData); + else + chn->priority = 0; + chn->volume = 0; + chn->flags.active = FALSE; + continue; + } + + vol += SNDi_DecibelSquareTable[chn->velocity]; + pitch += (chn->midiKey - chn->rootMidiKey) * 0x40; + + vol += SND_UpdateExChannelEnvelope(chn, step); + pitch += ExChannelSweepUpdate(chn, step); + + vol += chn->userDecay; + vol += chn->userDecay2; + pitch += chn->userPitch; + + lfo = ExChannelLfoUpdate(chn, step); + + switch (chn->lfo.param.target) { + case SND_LFO_VOLUME: + if (vol > -0x8000) + vol += lfo; + break; + case SND_LFO_PAN: + pan += lfo; + break; + case SND_LFO_PITCH: + pitch += lfo; + break; + } + + pan += chn->initPan; + if (chn->panRange != 127) { + pan = (pan * chn->panRange + 0x40) >> 7; + } + pan += chn->userPan; + + if (chn->envStatus == SND_ENV_RELEASE && vol <= -723) { + chn->flags.syncFlag = SND_CHN_SYNC_STOP; + if (chn->callback) + chn->callback(chn, 1, chn->callbackUserData); + else + chn->priority = 0; + chn->volume = 0; + chn->flags.active = 0; + } else { + vol = SND_CalcChannelVolume(vol); + newTimer = SND_CalcTimer(chn->waveParam.timer, pitch); + + if (chn->type == SND_CHN_TYPE_PSG) + newTimer &= 0xFFFC; + + pan += 0x40; + if (pan < 0) + pan = 0; + else if (pan > 127) + pan = 127; + + if (vol != chn->volume) { + chn->volume = (u16)vol; + chn->flags.syncFlag |= SND_CHN_SYNC_VOLUME; + } + if (newTimer != chn->timer) { + chn->timer = (u16)newTimer; + chn->flags.syncFlag |= SND_CHN_SYNC_TIMER; + } + if (pan != chn->pan) { + chn->pan = (u8)pan; + chn->flags.syncFlag |= SND_CHN_SYNC_PAN; + } + } + } +} + +BOOL SND_StartExChannelPcm(struct SNDExChannel *chn, const struct SNDWaveParam *wave, const void *data, s32 length) { + chn->type = SND_CHN_TYPE_PCM; + chn->waveParam = *wave; + chn->waveDataPtr = data; + ExChannelStart(chn, length); + return TRUE; +} + +BOOL SND_StartExChannelPsg(struct SNDExChannel *chn, s32 duty, s32 length) { + if (chn->id < 8) { + return FALSE; + } else if (chn->id > 13) { + return FALSE; + } else { + chn->type = SND_CHN_TYPE_PSG; + chn->dutyCycle = duty; + chn->waveParam.timer = 8006; + ExChannelStart(chn, length); + return TRUE; + } +} + +BOOL SND_StartExChannelNoise(struct SNDExChannel *chn, s32 length) { + if (chn->id < 14) { + return FALSE; + } else if (chn->id > 15) { + return FALSE; + } else { + chn->type = SND_CHN_TYPE_NOISE; + chn->waveParam.timer = 8006; + ExChannelStart(chn, length); + return TRUE; + } +} + +s32 SND_UpdateExChannelEnvelope(struct SNDExChannel *chn, BOOL step) { + s32 sustain; + + if (step) { + switch (chn->envStatus) { + case SND_ENV_ATTACK: + chn->envAttenuation = -((-chn->envAttenuation * chn->envAttack) >> 8); + if (chn->envAttenuation == 0) + chn->envStatus = SND_ENV_DECAY; + break; + case SND_ENV_DECAY: + sustain = SNDi_DecibelSquareTable[chn->envSustain] << 7; + chn->envAttenuation -= chn->envDecay; + if (chn->envAttenuation <= sustain) { + chn->envAttenuation = sustain; + chn->envStatus = SND_ENV_SUSTAIN; + } + break; + case SND_ENV_SUSTAIN: + break; + case SND_ENV_RELEASE: + chn->envAttenuation -= chn->envRelease; + break; + } + } + + return chn->envAttenuation >> 7; +} + +void SND_SetExChannelAttack(struct SNDExChannel *chn, s32 attack) { + if (attack < 109) + chn->envAttack = (u8)(255 - attack); + else + chn->envAttack = sAttackCoeffTable[127 - attack]; +} + +void SND_SetExChannelDecay(struct SNDExChannel *chn, s32 decay) { + chn->envDecay = CalcDecayCoeff(decay); +} + +void SND_SetExChannelSustain(struct SNDExChannel *chn, s32 sustain) { + chn->envSustain = (u8)sustain; +} + +void SND_SetExChannelRelease(struct SNDExChannel *chn, s32 release) { + chn->envRelease = CalcDecayCoeff(release); +} + +void SND_ReleaseExChannel(struct SNDExChannel *chn) { + chn->envStatus = SND_ENV_RELEASE; +} + +BOOL SND_IsExChannelActive(struct SNDExChannel *chn) { + return chn->flags.active; +} + +struct SNDExChannel *SND_AllocExChannel(u32 channelMask, int priority, u32 flags, SNDExChannelCallback callback, void *callbackUserData) { + struct SNDExChannel *chnPrev; + int i; + struct SNDExChannel *chn; + u8 channelCandidate; + + channelMask &= ~sLockedChannelMask; + if (flags == 0) + channelMask &= ~sWeakLockedChannelMask; + + chnPrev = NULL; + + for (i = 0; i < SND_CHANNEL_COUNT; i++) { + channelCandidate = sChannelAllocationOrder[i]; + + if (channelMask & (1 << channelCandidate)) { + chn = &SNDi_Work.channels[channelCandidate]; + + if (chnPrev == NULL) { + chnPrev = chn; + continue; + } + + if (chn->priority > chnPrev->priority) + continue; + + if (chn->priority != chnPrev->priority || ExChannelVolumeCmp(chnPrev, chn) < 0) + chnPrev = chn; + } + } + + if (chnPrev == NULL) + return NULL; + + if (priority < chnPrev->priority) + return NULL; + + if (chnPrev->callback) + chnPrev->callback(chnPrev, 0, chnPrev->callbackUserData); + + chnPrev->flags.syncFlag = 2; + chnPrev->flags.active = 0; + ExChannelSetup(chnPrev, callback, callbackUserData, priority); + return chnPrev; +} + +void SND_FreeExChannel(struct SNDExChannel *chn) { + if (chn) { + chn->callback = NULL; + chn->callbackUserData = NULL; + } +} diff --git a/arm7/lib/src/SND_lockChannel.c b/arm7/lib/src/SND_lockChannel.c index cecfd871..92e04e5e 100644 --- a/arm7/lib/src/SND_lockChannel.c +++ b/arm7/lib/src/SND_lockChannel.c @@ -5,8 +5,8 @@ #include "SND.h" // TODO make these vars static after merging this file with exChannel -u32 sUnlockedChannelMask; u32 sLockedChannelMask; +u32 sWeakLockedChannelMask; void SND_StopUnlockedChannel(u32 channelMask) { struct SNDExChannel *chn; @@ -17,7 +17,7 @@ void SND_StopUnlockedChannel(u32 channelMask) { chn = &SNDi_Work.channels[i]; - if (sUnlockedChannelMask & (1 << i)) + if (sLockedChannelMask & (1 << i)) continue; if (chn->callback) @@ -42,7 +42,7 @@ void SND_LockChannel(u32 channelMask, u32 locked) { chn = &SNDi_Work.channels[i]; - if (sUnlockedChannelMask & (1 << i)) + if (sLockedChannelMask & (1 << i)) continue; if (chn->callback) @@ -56,24 +56,24 @@ void SND_LockChannel(u32 channelMask, u32 locked) { } if (locked & 1) { - sLockedChannelMask |= channelMask; + sWeakLockedChannelMask |= channelMask; } else { - sUnlockedChannelMask |= channelMask; + sLockedChannelMask |= channelMask; } } void SND_UnlockChannel(u32 channelMask, u32 locked) { if (locked & 1) { - sLockedChannelMask &= ~channelMask; + sWeakLockedChannelMask &= ~channelMask; } else { - sUnlockedChannelMask &= ~channelMask; + sLockedChannelMask &= ~channelMask; } } u32 SND_GetLockedChannel(u32 locked) { if (locked & 1) { - return sLockedChannelMask; + return sWeakLockedChannelMask; } else { - return sUnlockedChannelMask; + return sLockedChannelMask; } } -- cgit v1.2.3 From 449da4e1036ef58a11c71f80833443da49c36ff6 Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Thu, 1 Jul 2021 02:11:30 +0200 Subject: arm7: decompile SND_lfo --- arm7/asm/SND_lfo.s | 77 --------------------------------------------- arm7/lib/include/SND_lfo.h | 13 ++++++++ arm7/lib/include/SND_util.h | 3 +- arm7/lib/src/SND_lfo.c | 43 +++++++++++++++++++++++++ 4 files changed, 58 insertions(+), 78 deletions(-) delete mode 100644 arm7/asm/SND_lfo.s create mode 100644 arm7/lib/include/SND_lfo.h create mode 100644 arm7/lib/src/SND_lfo.c diff --git a/arm7/asm/SND_lfo.s b/arm7/asm/SND_lfo.s deleted file mode 100644 index cca10305..00000000 --- a/arm7/asm/SND_lfo.s +++ /dev/null @@ -1,77 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .text - - arm_func_start SND_GetLfoValue -SND_GetLfoValue: ; 0x037FC7F4 - stmdb sp!, {r4, lr} - mov r4, r0 - ldrb r0, [r4, #2] - cmp r0, #0 - moveq r0, #0 - beq _037FC83C - ldrh r1, [r4, #6] - ldrh r0, [r4, #4] - cmp r1, r0 - movcc r0, #0 - bcc _037FC83C - ldrh r0, [r4, #8] - mov r0, r0, lsr #8 - bl SND_SinIdx - ldrb r2, [r4, #3] - ldrb r1, [r4, #2] - mul r0, r1, r0 - mul r0, r2, r0 -_037FC83C: - ldmia sp!, {r4, lr} - bx lr - - arm_func_start SND_UpdateLfo -SND_UpdateLfo: ; 0x037FC844 - ldrh r2, [r0, #6] - ldrh r1, [r0, #4] - cmp r2, r1 - addcc r1, r2, #1 - strcch r1, [r0, #6] - bxcc lr - ldrh r2, [r0, #8] - ldrb r1, [r0, #1] - mov r3, r1, lsl #6 - add r1, r2, r1, lsl #6 - mov r2, r1, lsr #8 - b _037FC878 -_037FC874: - sub r2, r2, #128 ; 0x80 -_037FC878: - cmp r2, #128 ; 0x80 - bcs _037FC874 - ldrh r1, [r0, #8] - add r1, r1, r3 - strh r1, [r0, #8] - ldrh r1, [r0, #8] - and r1, r1, #255 ; 0xff - strh r1, [r0, #8] - ldrh r1, [r0, #8] - orr r1, r1, r2, lsl #8 - strh r1, [r0, #8] - bx lr - - arm_func_start SND_StartLfo -SND_StartLfo: ; 0x037FC8A8 - mov r1, #0 - strh r1, [r0, #8] - strh r1, [r0, #6] - bx lr - - arm_func_start SND_InitLfoParam -SND_InitLfoParam: ; 0x037FC8B8 - mov r2, #0 - strb r2, [r0] - strb r2, [r0, #2] - mov r1, #1 - strb r1, [r0, #3] - mov r1, #16 - strb r1, [r0, #1] - strh r2, [r0, #4] - bx lr diff --git a/arm7/lib/include/SND_lfo.h b/arm7/lib/include/SND_lfo.h new file mode 100644 index 00000000..065e0ed6 --- /dev/null +++ b/arm7/lib/include/SND_lfo.h @@ -0,0 +1,13 @@ +#ifndef GUARD_SND_LFO_H +#define GUARD_SND_LFO_H + +#include "nitro/types.h" + +#include "nitro/SND_main_shared.h" + +void SND_InitLfoParam(struct SNDLfoParam *lfoParam); +void SND_StartLfo(struct SNDLfo *lfo); +void SND_UpdateLfo(struct SNDLfo *lfo); +s32 SND_LfoGetValue(struct SNDLfo *lfo); + +#endif //GUARD_SND_LFO_H diff --git a/arm7/lib/include/SND_util.h b/arm7/lib/include/SND_util.h index 1bfdb7a8..d9bc56c0 100644 --- a/arm7/lib/include/SND_util.h +++ b/arm7/lib/include/SND_util.h @@ -5,7 +5,8 @@ #define SND_DECIBEL_SQUARE_TABLE_COUNT -u32 SND_CalcRandom(void); +u16 SND_CalcRandom(void); +s8 SND_SinIdx(s32 index); u16 SND_CalcChannelVolume(s32 value); u16 SND_CalcTimer(s32 timer, s32 pitch); diff --git a/arm7/lib/src/SND_lfo.c b/arm7/lib/src/SND_lfo.c new file mode 100644 index 00000000..eca98197 --- /dev/null +++ b/arm7/lib/src/SND_lfo.c @@ -0,0 +1,43 @@ +#include "SND_lfo.h" + +#include "SND_util.h" +#include "SND_exChannel.h" + +void SND_InitLfoParam(struct SNDLfoParam *lfoParam) { + lfoParam->target = SND_LFO_PITCH; + lfoParam->depth = 0; + lfoParam->range = 1; + lfoParam->speed = 16; + lfoParam->delay = 0; +} + +void SND_StartLfo(struct SNDLfo *lfo) { + lfo->counter = 0; + lfo->delayCounter = 0; +} + +void SND_UpdateLfo(struct SNDLfo *lfo) { + if (lfo->delayCounter < lfo->param.delay) { + lfo->delayCounter++; + } else { + u32 tmp = lfo->counter; + tmp += lfo->param.speed << 6; + tmp >>= 8; + while (tmp >= 0x80) { + tmp -= 0x80; + } + lfo->counter += lfo->param.speed << 6; + lfo->counter &= 0xFF; + lfo->counter |= tmp << 8; + } +} + +s32 SND_GetLfoValue(struct SNDLfo *lfo) { + if (lfo->param.depth == 0) { + return 0; + } else if (lfo->delayCounter < lfo->param.delay) { + return 0; + } else { + return SND_SinIdx((s32)((u32)lfo->counter >> 8)) * lfo->param.depth * lfo->param.range; + } +} -- cgit v1.2.3 From 3f2b6670db01714364e1f1941c75e91df0f478fa Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Fri, 2 Jul 2021 23:55:05 +0200 Subject: refactor sound headers --- arm7/lib/include/SND_lfo.h | 2 +- arm9/lib/NitroSDK/include/SND_bank.h | 50 ---------- arm9/lib/NitroSDK/include/SND_main.h | 14 --- include/nitro/SND_bank_shared.h | 53 +++++++++++ include/nitro/SND_exChannel_shared.h | 79 ++++++++++++++++ include/nitro/SND_main_shared.h | 176 ++++------------------------------- include/nitro/SND_seq_shared.h | 84 +++++++++++++++++ include/nitro/SND_work_shared.h | 4 +- 8 files changed, 236 insertions(+), 226 deletions(-) create mode 100644 include/nitro/SND_seq_shared.h diff --git a/arm7/lib/include/SND_lfo.h b/arm7/lib/include/SND_lfo.h index 065e0ed6..05d4647e 100644 --- a/arm7/lib/include/SND_lfo.h +++ b/arm7/lib/include/SND_lfo.h @@ -3,7 +3,7 @@ #include "nitro/types.h" -#include "nitro/SND_main_shared.h" +#include "nitro/SND_exChannel_shared.h" void SND_InitLfoParam(struct SNDLfoParam *lfoParam); void SND_StartLfo(struct SNDLfo *lfo); diff --git a/arm9/lib/NitroSDK/include/SND_bank.h b/arm9/lib/NitroSDK/include/SND_bank.h index 335dae01..58fd8307 100644 --- a/arm9/lib/NitroSDK/include/SND_bank.h +++ b/arm9/lib/NitroSDK/include/SND_bank.h @@ -6,56 +6,6 @@ #include "SND_main.h" #include "nitro/SND_bank_shared.h" -#define SND_INST_ILLEGAL 0 -#define SND_INST_PCM 1 -#define SND_INST_PSG 2 -#define SND_INST_NOISE 3 -#define SND_INST_DIRECTPCM 4 -#define SND_INST_DUMMY 5 -#define SND_INST_DRUM_TABLE 16 -#define SND_INST_KEY_SPLIT 17 - -#define SND_BANK_MAX_WAVEARC 4 - -#define SND_INST_OFFSET_TYPE(off) ((u8)off) -#define SND_INST_OFFSET_NORMAL(bank, off) ((struct SNDInstParam *)((u8 *)bank + (u32)(off >> 8))) -#define SND_INST_OFFSET_DRUMS(bank, off) ((struct SNDDrumSet *)((u8 *)bank + (u32)(off >> 8))) -#define SND_INST_OFFSET_KEYSPL(bank, off) ((struct SNDKeySplit *)((u8 *)bank + (u32)(off >> 8))) - -struct SNDWaveArc; - -struct SNDWaveArcLink { - struct SNDWaveArc *waveArc; // 0x0 - struct SNDWaveArcLink *waveArcLLnext; // 0x4 -}; // size = 0x8 - -struct SNDBankData { - struct SNDBinaryFileHeader fileHeader; // 0x00 - struct SNDBinaryBlockHeader blockHeader; // 0x10 - struct SNDWaveArcLink waveArcLinks[SND_BANK_MAX_WAVEARC]; // 0x18 - u32 instCount; // 0x38 - u32 instOffsets[]; // 0x3C -}; // size = 0x40 - -struct SNDWaveArc { - struct SNDBinaryFileHeader fileHeader; // 0x00 - struct SNDBinaryBlockHeader blockHeader; // 0x10 - struct SNDWaveArcLink *waveArcLLHead; // 0x18 - u8 unk_1C[28]; // 0x1C - u32 waveCount; // 0x38 - u32 waveOffsets[]; // 0x3C -}; // size = 0x3C - -struct SNDInstPos { - u32 program; // 0x0 - u32 index; // 0x4 -}; // size = 0x8 - -struct SNDWaveData { - struct SNDWaveParam param; // 0x0 - u8 sampleData[]; // 0xC -}; // size = 0xC - void SND_AssignWaveArc(struct SNDBankData *bankData, s32 index, struct SNDWaveArc *waveArc); void SND_DestroyBank(struct SNDBankData *bankData); void SND_DestroyWaveArc(struct SNDWaveArc *waveArc); diff --git a/arm9/lib/NitroSDK/include/SND_main.h b/arm9/lib/NitroSDK/include/SND_main.h index 8fa9364e..aa476bae 100644 --- a/arm9/lib/NitroSDK/include/SND_main.h +++ b/arm9/lib/NitroSDK/include/SND_main.h @@ -9,18 +9,4 @@ void SNDi_UnlockMutex(void); void SNDi_LockMutex(void); void SND_Init(void); -struct SNDBinaryFileHeader { - s8 signature[4]; // 0x0 - u16 byteOrder; // 0x4 - u16 version; // 0x6 - u32 fileSize; // 0x8 - u16 headerSize; // 0xC - u16 dataBlocks; // 0xE -}; // size = 0x10 - -typedef struct SNDBinaryBlockHeader { - u32 type; // 0x0 - u32 size; // 0x4 -} SNDBinaryBlockHeader; // size = 0x8 - #endif // GUARD_SND_MAIN_H diff --git a/include/nitro/SND_bank_shared.h b/include/nitro/SND_bank_shared.h index 58b1fd8f..f5292bcc 100644 --- a/include/nitro/SND_bank_shared.h +++ b/include/nitro/SND_bank_shared.h @@ -3,8 +3,27 @@ #include "nitro/types.h" +#include "nitro/SND_exChannel_shared.h" +#include "nitro/SND_main_shared.h" + #define SND_INST_MAX_KEYSPLIT 8 +#define SND_INST_ILLEGAL 0 +#define SND_INST_PCM 1 +#define SND_INST_PSG 2 +#define SND_INST_NOISE 3 +#define SND_INST_DIRECTPCM 4 +#define SND_INST_DUMMY 5 +#define SND_INST_DRUM_TABLE 16 +#define SND_INST_KEY_SPLIT 17 + +#define SND_BANK_MAX_WAVEARC 4 + +#define SND_INST_OFFSET_TYPE(off) ((u8)off) +#define SND_INST_OFFSET_NORMAL(bank, off) ((struct SNDInstParam *)((u8 *)bank + (u32)(off >> 8))) +#define SND_INST_OFFSET_DRUMS(bank, off) ((struct SNDDrumSet *)((u8 *)bank + (u32)(off >> 8))) +#define SND_INST_OFFSET_KEYSPL(bank, off) ((struct SNDKeySplit *)((u8 *)bank + (u32)(off >> 8))) + struct SNDInstParam { u16 wave[2]; // 0x0 u8 rootKey; // 0x4 @@ -32,4 +51,38 @@ struct SNDDrumSet { struct SNDInstData instruments[]; }; // size = 0x2 +struct SNDWaveArc; + +struct SNDWaveArcLink { + struct SNDWaveArc *waveArc; // 0x0 + struct SNDWaveArcLink *waveArcLLnext; // 0x4 +}; // size = 0x8 + +struct SNDBankData { + struct SNDBinaryFileHeader fileHeader; // 0x00 + struct SNDBinaryBlockHeader blockHeader; // 0x10 + struct SNDWaveArcLink waveArcLinks[SND_BANK_MAX_WAVEARC]; // 0x18 + u32 instCount; // 0x38 + u32 instOffsets[]; // 0x3C +}; // size = 0x40 + +struct SNDWaveArc { + struct SNDBinaryFileHeader fileHeader; // 0x00 + struct SNDBinaryBlockHeader blockHeader; // 0x10 + struct SNDWaveArcLink *waveArcLLHead; // 0x18 + u8 unk_1C[28]; // 0x1C + u32 waveCount; // 0x38 + u32 waveOffsets[]; // 0x3C +}; // size = 0x3C + +struct SNDInstPos { + u32 program; // 0x0 + u32 index; // 0x4 +}; // size = 0x8 + +struct SNDWaveData { + struct SNDWaveParam param; // 0x0 + u8 sampleData[]; // 0xC +}; // size = 0xC + #endif //GUARD_SND_BANK_SHARED_H diff --git a/include/nitro/SND_exChannel_shared.h b/include/nitro/SND_exChannel_shared.h index eb702f16..386e6ac8 100644 --- a/include/nitro/SND_exChannel_shared.h +++ b/include/nitro/SND_exChannel_shared.h @@ -22,4 +22,83 @@ #define SND_LFO_VOLUME 1 #define SND_LFO_PAN 2 +struct SNDWaveParam { + u8 format; // 0x0 + u8 loopEnabled; // 0x1 + u16 samplerate; // 0x2 + u16 timer; // 0x4 + u16 loopStart; // 0x6 + u32 loopLength; // 0x8 +}; // size = 0xC + +struct SNDLfoParam { + u8 target; // 0x0 + u8 speed; // 0x1 + u8 depth; // 0x2 + u8 range; // 0x3 + u16 delay; // 0x4 +}; // size = 0x6 + +struct SNDLfo { + struct SNDLfoParam param; // 0x0 + u16 delayCounter; // 0x6 + u16 counter; // 0x8 +}; // size = 0xA + +struct SNDExChannel { + u8 id; // 0x00 + u8 type; // 0x01 + u8 envStatus; // 0x02 + + struct { + u8 active : 1; + u8 start : 1; + u8 autoSweep : 1; + u8 syncFlag : 5; + } flags; // 0x03 + + u8 panRange; // 0x04 + u8 rootMidiKey; // 0x05 + s16 userDecay2; // 0x06 + + u8 midiKey; // 0x08 + u8 velocity; // 0x09 + s8 initPan; // 0x0A + s8 userPan; // 0x0B + + s16 userDecay; // 0x0C + s16 userPitch; // 0x0E + + s32 envAttenuation; // 0x10 + s32 sweepCounter; // 0x14 + s32 sweepLength; // 0x18 + + u8 envAttack; // 0x1C + u8 envSustain; // 0x1D + u16 envDecay; // 0x1E + u16 envRelease; // 0x20 + u8 priority; // 0x22 + u8 pan; // 0x23 + u16 volume; // 0x24 + u16 timer; // 0x26 + + struct SNDLfo lfo; // 0x28 + + s16 sweepPitch; // 0x32 + + s32 length; // 0x34 + + struct SNDWaveParam waveParam; // 0x38 + + union { + const void *waveDataPtr; + s32 dutyCycle; + }; // 0x44 + + void (*callback)(struct SNDExChannel *chn, u32 status, void *userData); // 0x48 + void *callbackUserData; // 0x4C + + struct SNDExChannel *channelLLNext; // 0x50 +}; // size = 0x54 + #endif //GUARD_SND_EXCHANNEL_SHARED_H diff --git a/include/nitro/SND_main_shared.h b/include/nitro/SND_main_shared.h index 154d93b6..9b238245 100644 --- a/include/nitro/SND_main_shared.h +++ b/include/nitro/SND_main_shared.h @@ -13,164 +13,20 @@ #ifndef POKEDIAMOND_SND_MAIN_SHARED_H #define POKEDIAMOND_SND_MAIN_SHARED_H -struct SNDWaveParam { - u8 format; // 0x0 - u8 loopEnabled; // 0x1 - u16 samplerate; // 0x2 - u16 timer; // 0x4 - u16 loopStart; // 0x6 - u32 loopLength; // 0x8 -}; // size = 0xC - -struct SNDLfoParam { - u8 target; // 0x0 - u8 speed; // 0x1 - u8 depth; // 0x2 - u8 range; // 0x3 - u16 delay; // 0x4 -}; // size = 0x6 - -struct SNDLfo { - struct SNDLfoParam param; // 0x0 - u16 delayCounter; // 0x6 - u16 counter; // 0x8 -}; // size = 0xA - -struct SNDExChannel { - u8 id; // 0x00 - u8 type; // 0x01 - u8 envStatus; // 0x02 - - struct { - u8 active : 1; - u8 start : 1; - u8 autoSweep : 1; - u8 syncFlag : 5; - } flags; // 0x03 - - u8 panRange; // 0x04 - u8 rootMidiKey; // 0x05 - s16 userDecay2; // 0x06 - - u8 midiKey; // 0x08 - u8 velocity; // 0x09 - s8 initPan; // 0x0A - s8 userPan; // 0x0B - - s16 userDecay; // 0x0C - s16 userPitch; // 0x0E - - s32 envAttenuation; // 0x10 - s32 sweepCounter; // 0x14 - s32 sweepLength; // 0x18 - - u8 envAttack; // 0x1C - u8 envSustain; // 0x1D - u16 envDecay; // 0x1E - u16 envRelease; // 0x20 - u8 priority; // 0x22 - u8 pan; // 0x23 - u16 volume; // 0x24 - u16 timer; // 0x26 - - struct SNDLfo lfo; // 0x28 - - s16 sweepPitch; // 0x32 - - s32 length; // 0x34 - - struct SNDWaveParam waveParam; // 0x38 - - union { - const void *waveDataPtr; - s32 dutyCycle; - }; // 0x44 - - void (*callback)(struct SNDExChannel *chn, u32 status, void *userData); // 0x48 - void *callbackUserData; // 0x4C - - struct SNDExChannel *channelLLNext; // 0x50 -}; // size = 0x54 - -#define SND_TRACK_COUNT_PER_PLAYER 16 -#define SND_INVALID_TRACK_INDEX 0xFF - -struct SNDBankData; - -struct SNDPlayer { - struct { - u8 active : 1; - u8 prepared : 1; - u8 paused : 1; - } flags; // 0x0 - - u8 playerId; // 0x1 - u8 unk_2[2]; // 0x2 - - u8 prio; // 0x4 - u8 volume; // 0x5 - s16 extFader; // 0x6 - - u8 tracks[SND_TRACK_COUNT_PER_PLAYER]; // 0x8 - - u16 tempo; // 0x18 - u16 tempoRatio; // 0x1A - u16 tempoCounter; // 0x1C - u8 unk_1E[2]; // 0x1E - - struct SNDBankData *bank; // 0x20 -}; // size = 0x24 - -#define SND_TRACK_MAX_CALL 3 - -struct SNDTrack { - struct { - u8 active : 1; - u8 noteWait : 1; - u8 muted : 1; - u8 tie : 1; - u8 noteFinishWait : 1; - u8 portamento : 1; - u8 cmp : 1; // ??? - u8 channelMask : 1; - } flags; // 0x00 - - u8 panRange; // 0x01 - u16 program; // 0x02 - - u8 volume; // 0x04 - u8 expression; // 0x05 - s8 pitchBend; // 0x06 - u8 bendRange; // 0x07 - - s8 pan; // 0x08 - s8 extPan; // 0x09 - s16 extFader; // 0x0A - s16 extPitch; // 0x0C - u8 envAttack; // 0x0E - u8 envDecay; // 0x0F - u8 envSustain; // 0x10 - u8 envRelease; // 0x11 - u8 priority; // 0x12 - s8 transpose; // 0x13 - - u8 portamentoKey; // 0x14 - u8 portamentoTime; // 0x15 - s16 sweepPitch; // 0x16 - - struct SNDLfoParam mod; // 0x18 - u16 channelMask; // 0x1E - - s32 wait; // 0x20 - - const u8 *trackDataStart; // 0x24 - const u8 *trackDataPos; // 0x28 - const u8 *posCallStack[SND_TRACK_MAX_CALL]; // 0x34 - u8 loopCount[SND_TRACK_MAX_CALL]; // 0x38 - u8 callStackDepth; // 0x3B - - struct SNDExChannel *channelLLHead; // 0x3C -}; // size = 0x40 - - #endif //POKEDIAMOND_SND_MAIN_SHARED_H +#include "nitro/types.h" + +struct SNDBinaryFileHeader { + s8 signature[4]; // 0x0 + u16 byteOrder; // 0x4 + u16 version; // 0x6 + u32 fileSize; // 0x8 + u16 headerSize; // 0xC + u16 dataBlocks; // 0xE +}; // size = 0x10 + +typedef struct SNDBinaryBlockHeader { + u32 type; // 0x0 + u32 size; // 0x4 +} SNDBinaryBlockHeader; // size = 0x8 +#endif //POKEDIAMOND_SND_MAIN_SHARED_H diff --git a/include/nitro/SND_seq_shared.h b/include/nitro/SND_seq_shared.h new file mode 100644 index 00000000..6ff6189c --- /dev/null +++ b/include/nitro/SND_seq_shared.h @@ -0,0 +1,84 @@ +#ifndef GUARD_SND_SEQ_SHARED_H +#define GUARD_SND_SEQ_SHARED_H + +#define SND_TRACK_COUNT_PER_PLAYER 16 +#define SND_INVALID_TRACK_INDEX 0xFF + +struct SNDBankData; + +struct SNDPlayer { + struct { + u8 active : 1; + u8 prepared : 1; + u8 paused : 1; + } flags; // 0x0 + + u8 playerId; // 0x1 + u8 unk_2[2]; // 0x2 + + u8 prio; // 0x4 + u8 volume; // 0x5 + s16 extFader; // 0x6 + + u8 tracks[SND_TRACK_COUNT_PER_PLAYER]; // 0x8 + + u16 tempo; // 0x18 + u16 tempoRatio; // 0x1A + u16 tempoCounter; // 0x1C + u8 unk_1E[2]; // 0x1E + + struct SNDBankData *bank; // 0x20 +}; // size = 0x24 + +#define SND_TRACK_MAX_CALL 3 + +struct SNDTrack { + struct { + u8 active : 1; + u8 noteWait : 1; + u8 muted : 1; + u8 tie : 1; + u8 noteFinishWait : 1; + u8 portamento : 1; + u8 cmp : 1; // ??? + u8 channelMask : 1; + } flags; // 0x00 + + u8 panRange; // 0x01 + u16 program; // 0x02 + + u8 volume; // 0x04 + u8 expression; // 0x05 + s8 pitchBend; // 0x06 + u8 bendRange; // 0x07 + + s8 pan; // 0x08 + s8 extPan; // 0x09 + s16 extFader; // 0x0A + s16 extPitch; // 0x0C + u8 envAttack; // 0x0E + u8 envDecay; // 0x0F + u8 envSustain; // 0x10 + u8 envRelease; // 0x11 + u8 priority; // 0x12 + s8 transpose; // 0x13 + + u8 portamentoKey; // 0x14 + u8 portamentoTime; // 0x15 + s16 sweepPitch; // 0x16 + + struct SNDLfoParam mod; // 0x18 + u16 channelMask; // 0x1E + + s32 wait; // 0x20 + + const u8 *trackDataStart; // 0x24 + const u8 *trackDataPos; // 0x28 + const u8 *posCallStack[SND_TRACK_MAX_CALL]; // 0x34 + u8 loopCount[SND_TRACK_MAX_CALL]; // 0x38 + u8 callStackDepth; // 0x3B + + struct SNDExChannel *channelLLHead; // 0x3C +}; // size = 0x40 + +#endif //GUARD_SND_SEQ_SHARED_H diff --git a/include/nitro/SND_work_shared.h b/include/nitro/SND_work_shared.h index 0de3981e..08eda013 100644 --- a/include/nitro/SND_work_shared.h +++ b/include/nitro/SND_work_shared.h @@ -13,8 +13,10 @@ #ifndef POKEDIAMOND_SND_WORK_SHARED_H #define POKEDIAMOND_SND_WORK_SHARED_H -#include "nitro/SND_alarm_shared.h" #include "nitro/SND_main_shared.h" +#include "nitro/SND_alarm_shared.h" +#include "nitro/SND_bank_shared.h" +#include "nitro/SND_seq_shared.h" #define SND_PLAYER_COUNT 16 #define SND_CHANNEL_COUNT 16 -- cgit v1.2.3 From 68dcc21efd11140a70419ada34ac5f2d9d526f69 Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Sat, 3 Jul 2021 14:49:13 +0200 Subject: arm7: decompile SND_bank --- arm7/asm/SND_bank.s | 245 -------------------------------------------- arm7/lib/include/SND_bank.h | 11 ++ arm7/lib/src/SND_bank.c | 155 ++++++++++++++++++++++++++++ 3 files changed, 166 insertions(+), 245 deletions(-) delete mode 100644 arm7/asm/SND_bank.s create mode 100644 arm7/lib/include/SND_bank.h create mode 100644 arm7/lib/src/SND_bank.c 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; + } +} -- cgit v1.2.3 From c0b5972e6e55ea33746ec45317410b17e35e4929 Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Sat, 3 Jul 2021 21:25:05 +0200 Subject: more header refactoring --- arm7/lib/include/SND_util.h | 8 ++++---- arm7/lib/include/syscall.h | 2 ++ 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/arm7/lib/include/SND_util.h b/arm7/lib/include/SND_util.h index d9bc56c0..80534b94 100644 --- a/arm7/lib/include/SND_util.h +++ b/arm7/lib/include/SND_util.h @@ -3,13 +3,13 @@ #include "nitro/types.h" -#define SND_DECIBEL_SQUARE_TABLE_COUNT +#define SND_VOL_DB_MIN (-723) u16 SND_CalcRandom(void); -s8 SND_SinIdx(s32 index); +s8 SND_SinIdx(int index); -u16 SND_CalcChannelVolume(s32 value); -u16 SND_CalcTimer(s32 timer, s32 pitch); +u16 SND_CalcChannelVolume(int value); +u16 SND_CalcTimer(int timer, int pitch); extern const s16 SNDi_DecibelSquareTable[128]; diff --git a/arm7/lib/include/syscall.h b/arm7/lib/include/syscall.h index 55462cc7..1ac6fe49 100644 --- a/arm7/lib/include/syscall.h +++ b/arm7/lib/include/syscall.h @@ -2,5 +2,7 @@ #define POKEDIAMOND_ARM7_SYSCALL_H void SVC_WaitByLoop(u32 ct); +u8 SVC_GetVolumeTable(int idx); +u16 SVC_GetPitchTable(int idx); #endif //POKEDIAMOND_ARM7_SYSCALL_H -- cgit v1.2.3 From d5304686baf62f8bd2faa40884278b060e24671e Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Sat, 3 Jul 2021 21:30:50 +0200 Subject: arm7: decompile SND_util --- arm7/asm/SND_util.s | 190 ------------------------------------------------ arm7/lib/src/SND_util.c | 91 +++++++++++++++++++++++ 2 files changed, 91 insertions(+), 190 deletions(-) delete mode 100644 arm7/asm/SND_util.s create mode 100644 arm7/lib/src/SND_util.c diff --git a/arm7/asm/SND_util.s b/arm7/asm/SND_util.s deleted file mode 100644 index 7964fe4e..00000000 --- a/arm7/asm/SND_util.s +++ /dev/null @@ -1,190 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .section .data - - .global _03807660 -_03807660: - .word 0x12345678 - - .section .text - - arm_func_start SND_CalcRandom -SND_CalcRandom: ; 0x037FC058 - ldr r2, _037FC080 ; =_03807660 - ldr r3, [r2] - ldr r0, _037FC084 ; =0x0019660D - ldr r1, _037FC088 ; =0x3C6EF35F - mla r0, r3, r0, r1 - str r0, [r2] - mov r0, r0, lsr #16 - mov r0, r0, lsl #16 - mov r0, r0, lsr #16 - bx lr -_037FC080: .word _03807660 -_037FC084: .word 0x0019660D -_037FC088: .word 0x3C6EF35F - - arm_func_start SND_SinIdx -SND_SinIdx: ; 0x037FC08C - cmp r0, #32 - ldrlt r1, _037FC0F4 ; =sLfoSinTable - ldrltsb r0, [r1, r0] - bxlt lr - cmp r0, #64 ; 0x40 - rsblt r1, r0, #64 ; 0x40 - ldrlt r0, _037FC0F4 ; =sLfoSinTable - ldrltsb r0, [r0, r1] - bxlt lr - cmp r0, #96 ; 0x60 - bge _037FC0D4 - sub r1, r0, #64 ; 0x40 - ldr r0, _037FC0F4 ; =sLfoSinTable - ldrsb r0, [r0, r1] - rsb r0, r0, #0 - mov r0, r0, lsl #24 - mov r0, r0, asr #24 - bx lr -_037FC0D4: - sub r0, r0, #96 ; 0x60 - rsb r1, r0, #32 - ldr r0, _037FC0F4 ; =sLfoSinTable - ldrsb r0, [r0, r1] - rsb r0, r0, #0 - mov r0, r0, lsl #24 - mov r0, r0, asr #24 - bx lr -_037FC0F4: .word sLfoSinTable - - arm_func_start SND_CalcChannelVolume -SND_CalcChannelVolume: ; 0x037FC0F8 - stmdb sp!, {r4, lr} - mov r4, r0 - ldr r0, _037FC168 ; =0xFFFFFD2D - cmp r4, r0 - movlt r4, r0 - blt _037FC118 - cmp r4, #0 - movgt r4, #0 -_037FC118: - ldr r0, _037FC16C ; =0x000002D3 - add r0, r4, r0 - bl FUN_037FC170 - mvn r1, #239 ; 0xef - cmp r4, r1 - movlt r1, #3 - blt _037FC154 - mvn r1, #119 ; 0x77 - cmp r4, r1 - movlt r1, #2 - blt _037FC154 - mvn r1, #59 ; 0x3b - cmp r4, r1 - movlt r1, #1 - movge r1, #0 -_037FC154: - orr r0, r0, r1, lsl #8 - mov r0, r0, lsl #16 - mov r0, r0, lsr #16 - ldmia sp!, {r4, lr} - bx lr -_037FC168: .word 0xFFFFFD2D -_037FC16C: .word 0x000002D3 - - arm_func_start FUN_037FC170 -FUN_037FC170: ; 0x037FC170 - ldr ip, _037FC178 ; =SVC_GetVolumeTable - bx ip -_037FC178: .word SVC_GetVolumeTable - - arm_func_start SND_CalcTimer -SND_CalcTimer: ; 0x037FC17C - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r5, r0 - mov r4, #0 - rsb r0, r1, #0 - b _037FC19C -_037FC194: - sub r4, r4, #1 - add r0, r0, #768 ; 0x300 -_037FC19C: - cmp r0, #0 - blt _037FC194 - b _037FC1B0 -_037FC1A8: - add r4, r4, #1 - sub r0, r0, #768 ; 0x300 -_037FC1B0: - cmp r0, #768 ; 0x300 - bge _037FC1A8 - bl FUN_037FC2A4 - mov r2, #0 - mov r1, #65536 ; 0x10000 - adds lr, r0, r1 - adc ip, r2, #0 - mov r3, r5, asr #31 - umull r1, r0, lr, r5 - mla r0, lr, r3, r0 - mla r0, ip, r5, r0 - sub lr, r4, #16 - cmp lr, #0 - bgt _037FC208 - rsb r2, lr, #0 - mov r3, r0, lsr r2 - mov r5, r1, lsr r2 - rsb r1, r2, #32 - orr r5, r5, r0, lsl r1 - sub r1, r2, #32 - orr r5, r5, r0, lsr r1 - b _037FC264 -_037FC208: - cmp lr, #32 - bge _037FC25C - mvn r5, #0 - rsb r4, lr, #32 - mov ip, r5, lsl r4 - rsb r3, r4, #32 - orr ip, ip, r5, lsr r3 - sub r3, r4, #32 - orr ip, ip, r5, lsl r3 - and r3, r0, ip - and r5, r1, r5, lsl r4 - cmp r3, r2 - cmpeq r5, r2 - ldrne r0, _037FC2A0 ; =0x0000FFFF - bne _037FC294 - mov r5, r1, lsl lr - mov r3, r0, lsl lr - orr r3, r3, r1, lsr r4 - sub r0, lr, #32 - orr r3, r3, r1, lsl r0 - b _037FC264 -_037FC25C: - ldr r0, _037FC2A0 ; =0x0000FFFF - b _037FC294 -_037FC264: - mov r1, #0 - mov r0, #16 - cmp r3, r1 - cmpeq r5, r0 - movcc r5, r0 - bcc _037FC28C - ldr r0, _037FC2A0 ; =0x0000FFFF - cmp r3, r1 - cmpeq r5, r0 - movhi r5, r0 -_037FC28C: - mov r0, r5, lsl #16 - mov r0, r0, lsr #16 -_037FC294: - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr -_037FC2A0: .word 0x0000FFFF - - arm_func_start FUN_037FC2A4 -FUN_037FC2A4: ; 0x037FC2A4 - ldr ip, _037FC2AC ; =SVC_GetPitchTable - bx ip -_037FC2AC: .word SVC_GetPitchTable diff --git a/arm7/lib/src/SND_util.c b/arm7/lib/src/SND_util.c new file mode 100644 index 00000000..6a939c02 --- /dev/null +++ b/arm7/lib/src/SND_util.c @@ -0,0 +1,91 @@ +#include "SND_util.h" + +#include "syscall.h" + +// TODO remove this extern once the static const definition of it is here +extern s8 sLfoSinTable[0x21]; + +u16 SND_CalcTimer(int timer, int pitch) { + int octave = 0; + int pitch_normalized = -pitch; + + while (pitch_normalized < 0) { + octave--; + pitch_normalized += 768; + } + + while (pitch_normalized >= 768) { + octave++; + pitch_normalized -= 768; + } + + u64 result = SVC_GetPitchTable(pitch_normalized); + + result += 0x10000; + result *= timer; + + int shift = octave - 16; + + if (shift <= 0) { + shift = -shift; + result >>= shift; + } else if (shift < 32) { + // what ??? + u64 tmp = result & ~0uLL << (32 - shift); + if (tmp != 0) + return 0xFFFF; + result <<= shift; + } else { + return 0xFFFF; + } + + if (result < 0x10) + result = 0x10; + else if (result > 0xFFFF) + result = 0xFFFF; + + return (u16)result; +} + +u16 SND_CalcChannelVolume(int value) { + if (value < SND_VOL_DB_MIN) + value = SND_VOL_DB_MIN; + else if (value > 0) + value = 0; + + int result = SVC_GetVolumeTable(value + (-SND_VOL_DB_MIN)); + int div; + + if (value < -240) + div = 3; + else if (value < -120) + div = 2; + else if (value < -60) + div = 1; + else + div = 0; + + return (u16)(result | (div << 8)); +} + +s8 SND_SinIdx(int x) { + // BUG: UB for out of range values + + if (x < 0x20) { + return sLfoSinTable[x]; + } else if (x < 0x40) { + return sLfoSinTable[0x40 - x]; + } else if (x < 0x60) { + return (s8)(-sLfoSinTable[x - 0x40]); + } else { + return (s8)(-sLfoSinTable[0x20 - (x - 0x60)]); + } +} + +u16 SND_CalcRandom(void) { + static u32 state = 0x12345678; + + // values from "Numerical Recipes" + state = state * 1664525u + 1013904223u; + return (u16)(state >> 16u); +} -- cgit v1.2.3 From c607834736e32183b56150e478f90ee7edc233af Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Wed, 7 Jul 2021 00:24:21 +0200 Subject: arm7: decompile SND_capture --- arm7/asm/SND_capture.s | 38 -------------------------------------- arm7/lib/include/SND_capture.h | 5 ++++- arm7/lib/include/registers.h | 2 ++ arm7/lib/src/SND_capture.c | 19 +++++++++++++++++++ 4 files changed, 25 insertions(+), 39 deletions(-) delete mode 100644 arm7/asm/SND_capture.s create mode 100644 arm7/lib/src/SND_capture.c diff --git a/arm7/asm/SND_capture.s b/arm7/asm/SND_capture.s deleted file mode 100644 index d40e792e..00000000 --- a/arm7/asm/SND_capture.s +++ /dev/null @@ -1,38 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .text - - arm_func_start SND_IsCaptureActive -SND_IsCaptureActive: ; 0x037FC4C0 - add r0, r0, #67108864 ; 0x4000000 - ldrb r0, [r0, #1288] ; 0x508 - ands r0, r0, #128 ; 0x80 - movne r0, #1 - moveq r0, #0 - bx lr - - arm_func_start SND_SetupCapture -SND_SetupCapture: ; 0x037FC4D8 - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r4, r0, lsl #3 - ldr ip, [sp, #16] - cmp ip, #0 - movne r5, #0 - moveq r5, #1 - ldr lr, [sp, #24] - ldr ip, [sp, #20] - mov r1, r1, lsl #3 - orr r1, r1, r5, lsl #2 - orr r1, r1, ip, lsl #1 - orr r1, lr, r1 - add r0, r0, #67108864 ; 0x4000000 - strb r1, [r0, #1288] ; 0x508 - add r0, r4, #67108864 ; 0x4000000 - str r2, [r0, #1296] ; 0x510 - add r0, r0, #1280 ; 0x500 - strh r3, [r0, #20] - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr diff --git a/arm7/lib/include/SND_capture.h b/arm7/lib/include/SND_capture.h index 78a09efa..1878f90e 100644 --- a/arm7/lib/include/SND_capture.h +++ b/arm7/lib/include/SND_capture.h @@ -1,6 +1,9 @@ #ifndef GUARD_SND_CAPTURE_H #define GUARD_SND_CAPTURE_H -BOOL SND_IsCaptureActive(s32 idx); +#include "nitro/types.h" + +void SND_SetupCapture(int idx, int format, void *captureData, int size, BOOL loop, int capCtrlSrc, int capCtrlDst); +BOOL SND_IsCaptureActive(int idx); #endif //GUARD_SND_CAPTURE_H diff --git a/arm7/lib/include/registers.h b/arm7/lib/include/registers.h index bc55d0d8..e9280957 100644 --- a/arm7/lib/include/registers.h +++ b/arm7/lib/include/registers.h @@ -12,6 +12,8 @@ #define reg_SOUNDxPNT(x) (*((REGType16v *)0x400040A + ((int)x) * 0x10)) #define reg_SOUNDxLEN(x) (*((REGType32v *)0x400040C + ((int)x) * 0x10)) +#define reg_SNDCAPxCNT(x) (*((REGType8v *)0x4000508 + ((int)(x)))) + #define EXTKEYIN_X (1<<0) #define EXTKEYIN_Y (1<<1) #define EXTKEYIN_DEBUG (1<<3) diff --git a/arm7/lib/src/SND_capture.c b/arm7/lib/src/SND_capture.c new file mode 100644 index 00000000..8b604d10 --- /dev/null +++ b/arm7/lib/src/SND_capture.c @@ -0,0 +1,19 @@ +#include "SND_capture.h" + +#include "registers.h" + +enum SNDLoop { + SND_CAP_LOOP = 0, SND_CAP_ONESHOT = 1 +}; + +void SND_SetupCapture(int idx, int format, void *captureData, int size, BOOL loop, int capCtrlSrc, int capCtrlDst) { + int off = idx * 8; + + reg_SNDCAPxCNT(idx) = (u8)((format << 3) | ((loop ? SND_CAP_LOOP : SND_CAP_ONESHOT) << 2) | (capCtrlSrc << 1) | capCtrlDst); + *(vu32 *)(0x4000510 + off) = (u32)captureData; + *(vu16 *)(0x4000514 + off) = (u16)size; +} + +BOOL SND_IsCaptureActive(int idx) { + return (reg_SNDCAPxCNT(idx) & 0x80) != 0; +} -- cgit v1.2.3 From 6fda29badc3e915d019ab6f6c1cddc19d18614b2 Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Wed, 7 Jul 2021 02:27:19 +0200 Subject: arm7: decompile SND_channel --- arm7/asm/SND_channel.s | 208 ----------------------------------- arm7/lib/include/SND_channel.h | 4 +- arm7/lib/include/SND_exChannel.h | 12 +- arm7/lib/include/SND_lfo.h | 2 +- arm7/lib/src/SND_channel.c | 116 +++++++++++++++++++ arm7/lib/src/SND_lfo.c | 2 +- include/nitro/SND_exChannel_shared.h | 6 +- 7 files changed, 131 insertions(+), 219 deletions(-) delete mode 100644 arm7/asm/SND_channel.s create mode 100644 arm7/lib/src/SND_channel.c diff --git a/arm7/asm/SND_channel.s b/arm7/asm/SND_channel.s deleted file mode 100644 index 44744493..00000000 --- a/arm7/asm/SND_channel.s +++ /dev/null @@ -1,208 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .text - - arm_func_start ExChannelLfoUpdate -ExChannelLfoUpdate: ; 0x037FC530 - stmdb sp!, {r4, r5, r6, lr} - mov r6, r0 - mov r5, r1 - add r0, r6, #40 ; 0x28 - bl SND_GetLfoValue - mov r4, r0 - mov ip, r0, asr #31 - mov r3, #0 - cmp ip, r3 - cmpeq r0, r3 - beq _037FC5B0 - ldrb r1, [r6, #40] ; 0x28 - cmp r1, #0 - beq _037FC59C - cmp r1, #1 - beq _037FC584 - cmp r1, #2 - moveq ip, ip, lsl #6 - orreq ip, ip, r0, lsr #26 - moveq r4, r0, lsl #6 - b _037FC5A8 -_037FC584: - mov r2, #60 ; 0x3c - umull r4, r1, r0, r2 - mla r1, r0, r3, r1 - mla r1, ip, r2, r1 - mov ip, r1 - b _037FC5A8 -_037FC59C: - mov ip, ip, lsl #6 - orr ip, ip, r0, lsr #26 - mov r4, r0, lsl #6 -_037FC5A8: - mov r4, r4, lsr #14 - orr r4, r4, ip, lsl #18 -_037FC5B0: - cmp r5, #0 - beq _037FC5C0 - add r0, r6, #40 ; 0x28 - bl SND_UpdateLfo -_037FC5C0: - mov r0, r4 - ldmia sp!, {r4, r5, r6, lr} - bx lr - - arm_func_start ExChannelSweepUpdate -ExChannelSweepUpdate: ; 0x037FC5CC - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r4, r0 - mov r5, r1 - ldrsh r3, [r4, #50] ; 0x32 - cmp r3, #0 - moveq r0, #0 - beq _037FC630 - ldr r0, [r4, #20] - ldr r2, [r4, #24] - cmp r0, r2 - movge r0, #0 - bge _037FC630 - sub r0, r2, r0 - smull r0, r1, r3, r0 - mov r3, r2, asr #31 - bl _ll_sdiv - cmp r5, #0 - beq _037FC630 - ldrb r1, [r4, #3] - mov r1, r1, lsl #29 - movs r1, r1, lsr #31 - ldrne r1, [r4, #20] - addne r1, r1, #1 - strne r1, [r4, #20] -_037FC630: - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr - - arm_func_start ExChannelVolumeCmp -ExChannelVolumeCmp: ; 0x037FC63C - stmfd sp!, {lr} - sub sp, sp, #4 - ldrh lr, [r0, #36] ; 0x24 - and r2, lr, #255 ; 0xff - ldrh ip, [r1, #36] ; 0x24 - and r0, ip, #255 ; 0xff - mov r2, r2, lsl #4 - mov r3, r0, lsl #4 - ldr r1, _037FC698 ; =sSampleDataShiftTable - ldrb r0, [r1, lr, asr #8] - mov r2, r2, asr r0 - ldrb r0, [r1, ip, asr #8] - mov r0, r3, asr r0 - cmp r2, r0 - beq _037FC688 - cmp r2, r0 - movlt r0, #1 - mvnge r0, #0 - b _037FC68C -_037FC688: - mov r0, #0 -_037FC68C: - add sp, sp, #4 - ldmia sp!, {lr} - bx lr -_037FC698: .word sSampleDataShiftTable - - arm_func_start ExChannelStart -ExChannelStart: ; 0x037FC69C - stmdb sp!, {r4, lr} - mov r4, r0 - ldr r0, _037FC6E4 ; =0xFFFE9680 - str r0, [r4, #16] - mov r0, #0 - strb r0, [r4, #2] - str r1, [r4, #52] ; 0x34 - add r0, r4, #40 ; 0x28 - bl SND_StartLfo - ldrb r0, [r4, #3] - orr r0, r0, #2 - strb r0, [r4, #3] - ldrb r0, [r4, #3] - bic r0, r0, #1 - orr r0, r0, #1 - strb r0, [r4, #3] - ldmia sp!, {r4, lr} - bx lr -_037FC6E4: .word 0xFFFE9680 - - arm_func_start ExChannelSetup -ExChannelSetup: ; 0x037FC6E8 - stmdb sp!, {r4, lr} - mov r4, r0 - mov ip, #0 - str ip, [r4, #80] ; 0x50 - str r1, [r4, #72] ; 0x48 - str r2, [r4, #76] ; 0x4c - str ip, [r4, #52] ; 0x34 - strb r3, [r4, #34] ; 0x22 - mov r1, #127 ; 0x7f - strh r1, [r4, #36] ; 0x24 - ldrb r2, [r4, #3] - bic r2, r2, #2 - strb r2, [r4, #3] - ldrb r2, [r4, #3] - orr r2, r2, #4 - strb r2, [r4, #3] - mov r2, #60 ; 0x3c - strb r2, [r4, #8] - strb r2, [r4, #5] - strb r1, [r4, #9] - strb ip, [r4, #10] - strh ip, [r4, #12] - strh ip, [r4, #6] - strh ip, [r4, #14] - strb ip, [r4, #11] - strb r1, [r4, #4] - strh ip, [r4, #50] ; 0x32 - str ip, [r4, #24] - str ip, [r4, #20] - bl SND_SetExChannelAttack - mov r0, r4 - mov r1, #127 ; 0x7f - bl SND_SetExChannelDecay - mov r0, r4 - mov r1, #127 ; 0x7f - bl SND_SetExChannelSustain - mov r0, r4 - mov r1, #127 ; 0x7f - bl SND_SetExChannelRelease - add r0, r4, #40 ; 0x28 - bl SND_InitLfoParam - ldmia sp!, {r4, lr} - bx lr - - arm_func_start CalcDecayCoeff -CalcDecayCoeff: ; 0x037FC794 - stmfd sp!, {lr} - sub sp, sp, #4 - mov r1, r0 - cmp r1, #127 ; 0x7f - ldreq r0, _037FC7F0 ; =0x0000FFFF - beq _037FC7E4 - cmp r1, #126 ; 0x7e - moveq r0, #15360 ; 0x3c00 - beq _037FC7E4 - cmp r1, #50 ; 0x32 - movlt r0, r1, lsl #1 - addlt r0, r0, #1 - movlt r0, r0, lsl #16 - movlt r0, r0, lsr #16 - blt _037FC7E4 - mov r0, #7680 ; 0x1e00 - rsb r1, r1, #126 ; 0x7e - bl _s32_div_f - mov r0, r0, lsl #16 - mov r0, r0, lsr #16 -_037FC7E4: - add sp, sp, #4 - ldmia sp!, {lr} - bx lr -_037FC7F0: .word 0x0000FFFF diff --git a/arm7/lib/include/SND_channel.h b/arm7/lib/include/SND_channel.h index 718e7e2b..ea179968 100644 --- a/arm7/lib/include/SND_channel.h +++ b/arm7/lib/include/SND_channel.h @@ -3,6 +3,8 @@ #include "nitro/types.h" +#include "SND_exChannel.h" + void SND_SetupChannelPcm( s32 chnIdx, const void *data, @@ -40,6 +42,6 @@ void SND_SetChannelPan(s32 chnIdx, s32 pan); void SND_SetChannelTimer(s32 chnIdx, s32 timer); // TODO move this function to SND_exChannel.c -u16 CalcDecayCoeff(s32 value); +u16 CalcDecayCoeff(int value); #endif //GUARD_SND_CHANNEL_H diff --git a/arm7/lib/include/SND_exChannel.h b/arm7/lib/include/SND_exChannel.h index dfd93f21..fcc3a548 100644 --- a/arm7/lib/include/SND_exChannel.h +++ b/arm7/lib/include/SND_exChannel.h @@ -6,8 +6,6 @@ #include "nitro/SND_exChannel_shared.h" #include "nitro/SND_main_shared.h" -typedef void (*SNDExChannelCallback)(struct SNDExChannel *chn, s32 status, void *userData); - void SND_ExChannelInit(void); void SND_UpdateExChannel(void); void SND_ExChannelMain(BOOL step); @@ -26,10 +24,10 @@ void SND_FreeExChannel(struct SNDExChannel *chn); BOOL SND_IsChannelActive(s32 idx); // TODO internal functions, move these so exChannel -s32 ExChannelSweepUpdate(struct SNDExChannel *chn, BOOL step); -s32 ExChannelLfoUpdate(struct SNDExChannel *chn, BOOL step); -void ExChannelStart(struct SNDExChannel *chn, s32); -s32 ExChannelVolumeCmp(struct SNDExChannel *chn_a, struct SNDExChannel *chn_b); -void ExChannelSetup(struct SNDExChannel *, SNDExChannelCallback callback, void *callbackUserData, s32 priority); +int ExChannelSweepUpdate(struct SNDExChannel *chn, BOOL step); +int ExChannelLfoUpdate(struct SNDExChannel *chn, BOOL step); +void ExChannelStart(struct SNDExChannel *chn, int length); +int ExChannelVolumeCmp(struct SNDExChannel *chn_a, struct SNDExChannel *chn_b); +void ExChannelSetup(struct SNDExChannel *, SNDExChannelCallback callback, void *callbackUserData, int priority); #endif //GUARD_SND_EXCHANNEL_H diff --git a/arm7/lib/include/SND_lfo.h b/arm7/lib/include/SND_lfo.h index 05d4647e..43055c27 100644 --- a/arm7/lib/include/SND_lfo.h +++ b/arm7/lib/include/SND_lfo.h @@ -8,6 +8,6 @@ void SND_InitLfoParam(struct SNDLfoParam *lfoParam); void SND_StartLfo(struct SNDLfo *lfo); void SND_UpdateLfo(struct SNDLfo *lfo); -s32 SND_LfoGetValue(struct SNDLfo *lfo); +int SND_GetLfoValue(struct SNDLfo *lfo); #endif //GUARD_SND_LFO_H diff --git a/arm7/lib/src/SND_channel.c b/arm7/lib/src/SND_channel.c new file mode 100644 index 00000000..66acf606 --- /dev/null +++ b/arm7/lib/src/SND_channel.c @@ -0,0 +1,116 @@ +#include "SND_channel.h" + +#include "SND_lfo.h" + +// TODO remove this extern once we actually know where this table is +extern u8 sSampleDataShiftTable[4]; + +u16 CalcDecayCoeff(int vol) { + if (vol == 127) + return 0xFFFF; + else if (vol == 126) + return 0x3C00; + else if (vol < 50) + return (u16)(vol * 2 + 1); + else + return (u16)(0x1E00 / (126 - vol)); +} + +void ExChannelSetup(struct SNDExChannel *chn, SNDExChannelCallback callback, void *callbackUserData, int priority) { + chn->channelLLNext = NULL; + chn->callback = callback; + chn->callbackUserData = callbackUserData; + chn->length = 0; + chn->priority = (u8)priority; + chn->volume = 127; + chn->flags.start = FALSE; + chn->flags.autoSweep = TRUE; + chn->midiKey = 60; + chn->rootMidiKey = 60; + chn->velocity = 127; + chn->initPan = 0; + chn->userDecay = 0; + chn->userDecay2 = 0; + chn->userPitch = 0; + chn->userPan = 0; + chn->panRange = 127; + chn->sweepPitch = 0; + chn->sweepLength = 0; + chn->sweepCounter = 0; + + SND_SetExChannelAttack(chn, 127); + SND_SetExChannelDecay(chn, 127); + SND_SetExChannelSustain(chn, 127); + SND_SetExChannelRelease(chn, 127); + SND_InitLfoParam(&chn->lfo.param); +} + +void ExChannelStart(struct SNDExChannel *chn, int length) { + chn->envAttenuation = -92544; + chn->envStatus = 0; + chn->length = length; + SND_StartLfo(&chn->lfo); + chn->flags.start = TRUE; + chn->flags.active = TRUE; +} + +int ExChannelVolumeCmp(struct SNDExChannel *chn_a, struct SNDExChannel *chn_b) { + int vol_a = chn_a->volume & 0xFF; + int vol_b = chn_b->volume & 0xFF; + + vol_a <<= 4; + vol_b <<= 4; + + vol_a >>= sSampleDataShiftTable[chn_a->volume >> 8]; + vol_b >>= sSampleDataShiftTable[chn_b->volume >> 8]; + + if (vol_a != vol_b) { + if (vol_a < vol_b) + return 1; + else + return -1; + } + return 0; +} + +int ExChannelSweepUpdate(struct SNDExChannel *chn, BOOL step) { + s64 result; + + if (chn->sweepPitch == 0) { + result = 0; + } else if (chn->sweepCounter >= chn->sweepLength) { + result = 0; + } else { + result = (s64)chn->sweepPitch * (chn->sweepLength - chn->sweepCounter) / chn->sweepLength; + + if (step && chn->flags.autoSweep) + chn->sweepCounter++; + } + + return (int)result; +} + +int ExChannelLfoUpdate(struct SNDExChannel *chn, BOOL step) { + s64 result = SND_GetLfoValue(&chn->lfo); + + if (result != 0) { + switch (chn->lfo.param.target) { + case SND_LFO_VOLUME: + result *= 60; + break; + case SND_LFO_PITCH: + result <<= 6; + break; + case SND_LFO_PAN: + result <<= 6; + break; + } + result >>= 14; + } + + if (step) { + SND_UpdateLfo(&chn->lfo); + } + + return (int)result; +} diff --git a/arm7/lib/src/SND_lfo.c b/arm7/lib/src/SND_lfo.c index eca98197..262c6d27 100644 --- a/arm7/lib/src/SND_lfo.c +++ b/arm7/lib/src/SND_lfo.c @@ -32,7 +32,7 @@ void SND_UpdateLfo(struct SNDLfo *lfo) { } } -s32 SND_GetLfoValue(struct SNDLfo *lfo) { +int SND_GetLfoValue(struct SNDLfo *lfo) { if (lfo->param.depth == 0) { return 0; } else if (lfo->delayCounter < lfo->param.delay) { diff --git a/include/nitro/SND_exChannel_shared.h b/include/nitro/SND_exChannel_shared.h index 386e6ac8..c7743cd6 100644 --- a/include/nitro/SND_exChannel_shared.h +++ b/include/nitro/SND_exChannel_shared.h @@ -45,6 +45,10 @@ struct SNDLfo { u16 counter; // 0x8 }; // size = 0xA +struct SNDExChannel; + +typedef void (*SNDExChannelCallback)(struct SNDExChannel *chn, int status, void *userData); + struct SNDExChannel { u8 id; // 0x00 u8 type; // 0x01 @@ -95,7 +99,7 @@ struct SNDExChannel { s32 dutyCycle; }; // 0x44 - void (*callback)(struct SNDExChannel *chn, u32 status, void *userData); // 0x48 + SNDExChannelCallback callback; // 0x48 void *callbackUserData; // 0x4C struct SNDExChannel *channelLLNext; // 0x50 -- cgit v1.2.3 From 3adc1b31e95dde87e60f338113c83bcca2974c33 Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Wed, 7 Jul 2021 13:53:26 +0200 Subject: add MI_CpuCopy32 --- arm7/lib/include/MI_memory.h | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/arm7/lib/include/MI_memory.h b/arm7/lib/include/MI_memory.h index 1e0de0b9..73d62e97 100644 --- a/arm7/lib/include/MI_memory.h +++ b/arm7/lib/include/MI_memory.h @@ -22,4 +22,9 @@ static inline void MI_CpuClear32(void *dest, u32 size) MI_CpuFill32(dest, 0, size); } +static inline void MI_CpuCopy32(void *src, void *dst, u32 size) +{ + MIi_CopyCopy32((u32 *)src, (u32 *)dst, size); +} + #endif //POKEDIAMOND_ARM7_MI_MEMORY_H -- cgit v1.2.3 From 62059593a2d5dc7369ff898e0664fa0ae82c577c Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Wed, 7 Jul 2021 23:32:03 +0200 Subject: refactor snd headers --- arm9/lib/NitroSDK/include/SND_command.h | 50 ++---------------------------- include/nitro/SND_command_shared.h | 54 +++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+), 48 deletions(-) create mode 100644 include/nitro/SND_command_shared.h diff --git a/arm9/lib/NitroSDK/include/SND_command.h b/arm9/lib/NitroSDK/include/SND_command.h index ff392833..4d44c583 100644 --- a/arm9/lib/NitroSDK/include/SND_command.h +++ b/arm9/lib/NitroSDK/include/SND_command.h @@ -1,55 +1,9 @@ #ifndef GUARD_SND_COMMAND_H #define GUARD_SND_COMMAND_H -#include "global.h" +#include "nitro/SND_command_shared.h" -#define SND_CMD_COUNT 256 -#define SND_CMD_ARG_MAX 4 - -#define SND_CMD_FLAG_NOBLOCK 0x0 -#define SND_CMD_FLAG_BLOCK 0x1 -#define SND_CMD_FLAG_IMMEDIATE 0x2 - -#define SND_CMD_START_SEQ 0x00 -#define SND_CMD_STOP_SEQ 0x01 -#define SND_CMD_PREPARE_SEQ 0x02 -#define SND_CMD_START_PREPARED_SEQ 0x03 -#define SND_CMD_PAUSE_SEQ 0x04 -#define SND_CMD_SKIP_SEQ 0x05 -#define SND_CMD_PLAYER_PARAM 0x06 -#define SND_CMD_TRACK_PARAM 0x07 -#define SND_CMD_MUTE_TRACK 0x08 -#define SND_CMD_ALLOCATABLE_CHANNEL 0x09 -#define SND_CMD_PLAYER_LOCAL_VAR 0x0A -#define SND_CMD_PLAYER_GLOBAL_VAR 0x0B -#define SND_CMD_START_TIMER 0x0C -#define SND_CMD_STOP_TIMER 0x0D -#define SND_CMD_SETUP_CHANNEL_PCM 0x0E -#define SND_CMD_SETUP_CHANNEL_PSG 0x0F -#define SND_CMD_SETUP_CHANNEL_NOISE 0x10 -#define SND_CMD_SETUP_CAPTURE 0x11 -#define SND_CMD_SETUP_ALARM 0x12 -#define SND_CMD_CHANNEL_TIMER 0x13 -#define SND_CMD_CHANNEL_VOLUME 0x14 -#define SND_CMD_CHANNEL_PAN 0x15 -#define SND_CMD_SURROUND_DECAY 0x16 -#define SND_CMD_MASTER_VOLUME 0x17 -#define SND_CMD_MASTER_PAN 0x18 -#define SND_CMD_OUTPUT_SELECTOR 0x19 -#define SND_CMD_LOCK_CHANNEL 0x1A -#define SND_CMD_UNLOCK_CHANNEL 0x1B -#define SND_CMD_STOP_UNLOCKED_CHANNEL 0x1C -#define SND_CMD_SET_SHARED_WORK 0x1D -#define SND_CMD_INVALIDATE_SEQ 0x1E -#define SND_CMD_INVALIDATE_BANK 0x1F -#define SND_CMD_INVALIDATE_WAVE 0x20 -#define SND_CMD_READ_DRIVER_INFO 0x21 - -struct SNDCommand { - struct SNDCommand *llNext; // 0x0 - s32 id; // 0x4 - u32 arg[SND_CMD_ARG_MAX]; // 0x8 -}; // size = 0x18 +#include "nitro/types.h" void SND_CommandInit(void); const struct SNDCommand *SND_RecvCommandReply(u32 flags); diff --git a/include/nitro/SND_command_shared.h b/include/nitro/SND_command_shared.h new file mode 100644 index 00000000..40dbe283 --- /dev/null +++ b/include/nitro/SND_command_shared.h @@ -0,0 +1,54 @@ +#ifndef GUARD_SND_COMMAND_SHARED_H +#define GUARD_SND_COMMAND_SHARED_H + +#include "nitro/types.h" + +#define SND_CMD_COUNT 256 +#define SND_CMD_ARG_MAX 4 + +#define SND_CMD_FLAG_NOBLOCK 0x0 +#define SND_CMD_FLAG_BLOCK 0x1 +#define SND_CMD_FLAG_IMMEDIATE 0x2 + +#define SND_CMD_START_SEQ 0x00 +#define SND_CMD_STOP_SEQ 0x01 +#define SND_CMD_PREPARE_SEQ 0x02 +#define SND_CMD_START_PREPARED_SEQ 0x03 +#define SND_CMD_PAUSE_SEQ 0x04 +#define SND_CMD_SKIP_SEQ 0x05 +#define SND_CMD_PLAYER_PARAM 0x06 +#define SND_CMD_TRACK_PARAM 0x07 +#define SND_CMD_MUTE_TRACK 0x08 +#define SND_CMD_ALLOCATABLE_CHANNEL 0x09 +#define SND_CMD_PLAYER_LOCAL_VAR 0x0A +#define SND_CMD_PLAYER_GLOBAL_VAR 0x0B +#define SND_CMD_START_TIMER 0x0C +#define SND_CMD_STOP_TIMER 0x0D +#define SND_CMD_SETUP_CHANNEL_PCM 0x0E +#define SND_CMD_SETUP_CHANNEL_PSG 0x0F +#define SND_CMD_SETUP_CHANNEL_NOISE 0x10 +#define SND_CMD_SETUP_CAPTURE 0x11 +#define SND_CMD_SETUP_ALARM 0x12 +#define SND_CMD_CHANNEL_TIMER 0x13 +#define SND_CMD_CHANNEL_VOLUME 0x14 +#define SND_CMD_CHANNEL_PAN 0x15 +#define SND_CMD_SURROUND_DECAY 0x16 +#define SND_CMD_MASTER_VOLUME 0x17 +#define SND_CMD_MASTER_PAN 0x18 +#define SND_CMD_OUTPUT_SELECTOR 0x19 +#define SND_CMD_LOCK_CHANNEL 0x1A +#define SND_CMD_UNLOCK_CHANNEL 0x1B +#define SND_CMD_STOP_UNLOCKED_CHANNEL 0x1C +#define SND_CMD_SET_SHARED_WORK 0x1D +#define SND_CMD_INVALIDATE_SEQ 0x1E +#define SND_CMD_INVALIDATE_BANK 0x1F +#define SND_CMD_INVALIDATE_WAVE 0x20 +#define SND_CMD_READ_DRIVER_INFO 0x21 + +struct SNDCommand { + struct SNDCommand *llNext; // 0x0 + s32 id; // 0x4 + u32 arg[SND_CMD_ARG_MAX]; // 0x8 +}; // size = 0x18 + +#endif //GUARD_SND_COMMAND_SHARED_H -- cgit v1.2.3 From 6e37656a84a76cd315b870a8002e2fec0fa0f00e Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Thu, 8 Jul 2021 13:38:52 +0200 Subject: minor fixes --- arm7/lib/include/MI_memory.h | 2 +- arm7/lib/include/SND_lockChannel.h | 8 ++++---- arm7/lib/src/SND_lockChannel.c | 16 +++++++++------- 3 files changed, 14 insertions(+), 12 deletions(-) diff --git a/arm7/lib/include/MI_memory.h b/arm7/lib/include/MI_memory.h index 73d62e97..6fa1d0ec 100644 --- a/arm7/lib/include/MI_memory.h +++ b/arm7/lib/include/MI_memory.h @@ -24,7 +24,7 @@ static inline void MI_CpuClear32(void *dest, u32 size) static inline void MI_CpuCopy32(void *src, void *dst, u32 size) { - MIi_CopyCopy32((u32 *)src, (u32 *)dst, size); + MIi_CpuCopy32((u32 *)src, (u32 *)dst, size); } #endif //POKEDIAMOND_ARM7_MI_MEMORY_H diff --git a/arm7/lib/include/SND_lockChannel.h b/arm7/lib/include/SND_lockChannel.h index 9673fb51..461745b3 100644 --- a/arm7/lib/include/SND_lockChannel.h +++ b/arm7/lib/include/SND_lockChannel.h @@ -3,10 +3,10 @@ #include "nitro/types.h" -void SND_StopUnlockedChannel(u32 channelMask); -void SND_LockChannel(u32 channelMask, u32 locked); -void SND_UnlockChannel(u32 channelMask, u32 locked); -u32 SND_GetLockedChannel(u32 locked); +void SND_StopUnlockedChannel(u32 channelMask, u32 weak); +void SND_LockChannel(u32 channelMask, u32 weak); +void SND_UnlockChannel(u32 channelMask, u32 weak); +u32 SND_GetLockedChannel(u32 weak); // TODO remove these externs if lockChannel is merged with exChannel extern u32 sLockedChannelMask; diff --git a/arm7/lib/src/SND_lockChannel.c b/arm7/lib/src/SND_lockChannel.c index 92e04e5e..608ed67a 100644 --- a/arm7/lib/src/SND_lockChannel.c +++ b/arm7/lib/src/SND_lockChannel.c @@ -8,7 +8,9 @@ u32 sLockedChannelMask; u32 sWeakLockedChannelMask; -void SND_StopUnlockedChannel(u32 channelMask) { +void SND_StopUnlockedChannel(u32 channelMask, u32 weak) { + (void)weak; + struct SNDExChannel *chn; for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1) { @@ -31,7 +33,7 @@ void SND_StopUnlockedChannel(u32 channelMask) { } } -void SND_LockChannel(u32 channelMask, u32 locked) { +void SND_LockChannel(u32 channelMask, u32 weak) { struct SNDExChannel *chn; u32 j = channelMask; int i = 0; @@ -55,23 +57,23 @@ void SND_LockChannel(u32 channelMask, u32 locked) { chn->flags.active = 0; } - if (locked & 1) { + if (weak & 1) { sWeakLockedChannelMask |= channelMask; } else { sLockedChannelMask |= channelMask; } } -void SND_UnlockChannel(u32 channelMask, u32 locked) { - if (locked & 1) { +void SND_UnlockChannel(u32 channelMask, u32 weak) { + if (weak & 1) { sWeakLockedChannelMask &= ~channelMask; } else { sLockedChannelMask &= ~channelMask; } } -u32 SND_GetLockedChannel(u32 locked) { - if (locked & 1) { +u32 SND_GetLockedChannel(u32 weak) { + if (weak & 1) { return sWeakLockedChannelMask; } else { return sLockedChannelMask; -- cgit v1.2.3 From 4fbf785bbdfee9be474724caf8b804b0544d0f79 Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Thu, 8 Jul 2021 15:28:40 +0200 Subject: arm7: decompile SND_command --- arm7/asm/SND_command.s | 639 ----------------------------------- arm7/lib/include/SND.h | 4 +- arm7/lib/include/SND_channel.h | 4 + arm7/lib/include/SND_command.h | 2 + arm7/lib/include/SND_exChannel.h | 1 + arm7/lib/include/SND_main.h | 2 + arm7/lib/include/SND_seq.h | 17 + arm7/lib/include/SND_wave.h | 2 +- arm7/lib/include/SND_work.h | 4 +- arm7/lib/src/SND_command.c | 302 +++++++++++++++++ arm7/lib/src/SND_lockChannel.c | 2 +- arm7/lib/src/SND_wave.c | 4 +- arm7/lib/src/SND_work.c | 4 +- arm9/lib/NitroSDK/include/SND_work.h | 45 --- include/nitro/SND_work_shared.h | 45 +++ 15 files changed, 382 insertions(+), 695 deletions(-) delete mode 100644 arm7/asm/SND_command.s create mode 100644 arm7/lib/src/SND_command.c diff --git a/arm7/asm/SND_command.s b/arm7/asm/SND_command.s deleted file mode 100644 index ec1a5014..00000000 --- a/arm7/asm/SND_command.s +++ /dev/null @@ -1,639 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .section .bss - - .global _038090EC -_038090EC: ;0x038090EC - .space 0x0380910C - 0x038090EC - - .global _0380910C -_0380910C: ;0x0380910C - .space 0x0380912C - 0x0380910C - - .section .text - - arm_func_start ReadDriverInfo -ReadDriverInfo: ; 0x037FF6E4 - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r5, r0 - ldr r0, _037FF74C ; =SNDi_Work - mov r1, r5 - mov r2, #4480 ; 0x1180 - bl MIi_CpuCopy32 - ldr r1, _037FF74C ; =SNDi_Work - add r0, r5, #4096 ; 0x1000 - str r1, [r0, #448] ; 0x1c0 - mov r4, #0 -_037FF710: - mov r0, r4 - bl SND_GetChannelControl - add r1, r5, r4, lsl #2 - add r1, r1, #4096 ; 0x1000 - str r0, [r1, #384] ; 0x180 - add r4, r4, #1 - cmp r4, #16 - blt _037FF710 - mov r0, #0 - bl SND_GetLockedChannel - add r1, r5, #4096 ; 0x1000 - str r0, [r1, #452] ; 0x1c4 - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr -_037FF74C: .word SNDi_Work - - arm_func_start StopTimer -StopTimer: ; 0x037FF750 - stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} - sub sp, sp, #4 - mov r7, r0 - mov r6, r1 - mov r9, r2 - mov r5, r3 - bl OS_DisableInterrupts - mov r4, r0 - mov r8, #0 - b _037FF790 -_037FF778: - ands r0, r9, #1 - beq _037FF788 - mov r0, r8 - bl SND_StopAlarm -_037FF788: - add r8, r8, #1 - mov r9, r9, lsr #1 -_037FF790: - cmp r8, #8 - bge _037FF7A0 - cmp r9, #0 - bne _037FF778 -_037FF7A0: - mov r8, #0 - b _037FF7C4 -_037FF7A8: - ands r0, r7, #1 - beq _037FF7BC - mov r0, r8 - mov r1, r5 - bl SND_StopChannel -_037FF7BC: - add r8, r8, #1 - mov r7, r7, lsr #1 -_037FF7C4: - cmp r8, #16 - bge _037FF7D4 - cmp r7, #0 - bne _037FF7A8 -_037FF7D4: - ands r0, r6, #1 - movne r1, #0 - ldrne r0, _037FF80C ; =0x04000508 - strneb r1, [r0] - ands r0, r6, #2 - movne r1, #0 - ldrne r0, _037FF810 ; =0x04000509 - strneb r1, [r0] - mov r0, r4 - bl OS_RestoreInterrupts - bl SND_UpdateSharedWork - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, r8, r9, lr} - bx lr -_037FF80C: .word 0x04000508 -_037FF810: .word 0x04000509 - - arm_func_start StartTimer -StartTimer: ; 0x037FF814 - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #4 - mov r7, r0 - mov r6, r1 - mov r5, r2 - bl OS_DisableInterrupts - mov r4, r0 - mov r2, #0 - b _037FF858 -_037FF838: - ands r0, r7, #1 - movne r0, r2, lsl #4 - addne r0, r0, #67108864 ; 0x4000000 - ldrneb r1, [r0, #1027] ; 0x403 - orrne r1, r1, #128 ; 0x80 - strneb r1, [r0, #1027] ; 0x403 - add r2, r2, #1 - mov r7, r7, lsr #1 -_037FF858: - cmp r2, #16 - bge _037FF868 - cmp r7, #0 - bne _037FF838 -_037FF868: - ands r0, r6, #1 - beq _037FF8A0 - ands r0, r6, #2 - ldreq r1, _037FF8FC ; =0x04000508 - ldreqb r0, [r1] - orreq r0, r0, #128 ; 0x80 - streqb r0, [r1] - beq _037FF8B4 - ldr r2, _037FF8FC ; =0x04000508 - ldrh r1, [r2] - ldr r0, _037FF900 ; =0x00008080 - orr r0, r1, r0 - strh r0, [r2] - b _037FF8B4 -_037FF8A0: - ands r0, r6, #2 - ldrne r1, _037FF904 ; =0x04000509 - ldrneb r0, [r1] - orrne r0, r0, #128 ; 0x80 - strneb r0, [r1] -_037FF8B4: - mov r6, #0 - b _037FF8D4 -_037FF8BC: - ands r0, r5, #1 - beq _037FF8CC - mov r0, r6 - bl SND_StartAlarm -_037FF8CC: - add r6, r6, #1 - mov r5, r5, lsr #1 -_037FF8D4: - cmp r6, #8 - bge _037FF8E4 - cmp r5, #0 - bne _037FF8BC -_037FF8E4: - mov r0, r4 - bl OS_RestoreInterrupts - bl SND_UpdateSharedWork - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, lr} - bx lr -_037FF8FC: .word 0x04000508 -_037FF900: .word 0x00008080 -_037FF904: .word 0x04000509 - - arm_func_start SetChannelPan -SetChannelPan: ; 0x037FF908 - stmdb sp!, {r4, r5, r6, lr} - mov r6, r0 - mov r5, r1 - mov r4, #0 - b _037FF938 -_037FF91C: - ands r0, r6, #1 - beq _037FF930 - mov r0, r4 - mov r1, r5 - bl SND_SetChannelPan -_037FF930: - add r4, r4, #1 - mov r6, r6, lsr #1 -_037FF938: - cmp r4, #16 - bge _037FF948 - cmp r6, #0 - bne _037FF91C -_037FF948: - ldmia sp!, {r4, r5, r6, lr} - bx lr - - arm_func_start SetChannelVolume -SetChannelVolume: ; 0x037FF950 - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #4 - mov r7, r0 - mov r6, r1 - mov r5, r2 - mov r4, #0 - b _037FF98C -_037FF96C: - ands r0, r7, #1 - beq _037FF984 - mov r0, r4 - mov r1, r6 - mov r2, r5 - bl SND_SetChannelVolume -_037FF984: - add r4, r4, #1 - mov r7, r7, lsr #1 -_037FF98C: - cmp r4, #16 - bge _037FF99C - cmp r7, #0 - bne _037FF96C -_037FF99C: - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, lr} - bx lr - - arm_func_start SetChannelTimer -SetChannelTimer: ; 0x037FF9A8 - stmdb sp!, {r4, r5, r6, lr} - mov r6, r0 - mov r5, r1 - mov r4, #0 - b _037FF9D8 -_037FF9BC: - ands r0, r6, #1 - beq _037FF9D0 - mov r0, r4 - mov r1, r5 - bl SND_SetChannelTimer -_037FF9D0: - add r4, r4, #1 - mov r6, r6, lsr #1 -_037FF9D8: - cmp r4, #16 - bge _037FF9E8 - cmp r6, #0 - bne _037FF9BC -_037FF9E8: - ldmia sp!, {r4, r5, r6, lr} - bx lr - - arm_func_start InitPXI -InitPXI: ; 0x037FF9F0 - mov r0, #7 - ldr r1, _037FFA00 ; =PxiFifoCallback - ldr ip, _037FFA04 ; =PXI_SetFifoRecvCallback - bx ip -_037FFA00: .word PxiFifoCallback -_037FFA04: .word PXI_SetFifoRecvCallback - - arm_func_start PxiFifoCallback -PxiFifoCallback: ; 0x037FFA08 - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r5, r1 - bl OS_DisableInterrupts - mov r4, r0 - cmp r5, #33554432 ; 0x2000000 - bcc _037FFA38 - ldr r0, _037FFA58 ; =_038090EC - mov r1, r5 - mov r2, #0 - bl OS_SendMessage - b _037FFA44 -_037FFA38: - cmp r5, #0 - bne _037FFA44 - bl SND_SendWakeupMessage -_037FFA44: - mov r0, r4 - bl OS_RestoreInterrupts - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr -_037FFA58: .word _038090EC - - arm_func_start SND_CommandProc -SND_CommandProc: ; 0x037FFA5C - stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} - sub sp, sp, #52 ; 0x34 - ldr r7, _037FFEC4 ; =SNDi_SharedWork - ldr r9, _037FFEC8 ; =_038090EC - add r8, sp, #24 - mov r4, #0 - ldr r6, _037FFECC ; =0x0000FFFF - ldr r5, _037FFED0 ; =0x003FFFFF - b _037FFEA0 -_037FFA80: - ldr lr, [sp, #24] - b _037FFE88 -_037FFA88: - add ip, sp, #28 - ldmia lr!, {r0, r1, r2, r3} - stmia ip!, {r0, r1, r2, r3} - ldmia lr, {r0, r1} - stmia ip, {r0, r1} - ldr r0, [sp, #32] - cmp r0, #33 ; 0x21 - addls pc, pc, r0, lsl #2 - b _037FFE84 - b _037FFB34 - b _037FFB4C - b _037FFB58 - b _037FFB70 - b _037FFB7C - b _037FFB8C - b _037FFB9C - b _037FFBB4 - b _037FFBDC - b _037FFBF0 - b _037FFC04 - b _037FFC20 - b _037FFC38 - b _037FFC50 - b _037FFD08 - b _037FFD74 - b _037FFDA8 - b _037FFC68 - b _037FFCB0 - b _037FFCD4 - b _037FFCE4 - b _037FFCF8 - b _037FFDD4 - b _037FFDE0 - b _037FFDEC - b _037FFDF8 - b _037FFE10 - b _037FFE20 - b _037FFE30 - b _037FFE70 - b _037FFE40 - b _037FFE50 - b _037FFE60 - b _037FFE7C -_037FFB34: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - ldr r2, [sp, #44] ; 0x2c - ldr r3, [sp, #48] ; 0x30 - bl SND_StartSeq - b _037FFE84 -_037FFB4C: - ldr r0, [sp, #36] ; 0x24 - bl SND_StopSeq - b _037FFE84 -_037FFB58: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - ldr r2, [sp, #44] ; 0x2c - ldr r3, [sp, #48] ; 0x30 - bl SND_PrepareSeq - b _037FFE84 -_037FFB70: - ldr r0, [sp, #36] ; 0x24 - bl SND_StartPreparedSeq - b _037FFE84 -_037FFB7C: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - bl SND_PauseSeq - b _037FFE84 -_037FFB8C: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - bl SND_SkipSeq - b _037FFE84 -_037FFB9C: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - ldr r2, [sp, #44] ; 0x2c - ldr r3, [sp, #48] ; 0x30 - bl SNDi_SetPlayerParam - b _037FFE84 -_037FFBB4: - ldr r1, [sp, #36] ; 0x24 - mov r0, r1, lsr #24 - and r0, r0, #255 ; 0xff - str r0, [sp] - bic r0, r1, #-16777216 ; 0xff000000 - ldr r1, [sp, #40] ; 0x28 - ldr r2, [sp, #44] ; 0x2c - ldr r3, [sp, #48] ; 0x30 - bl SNDi_SetTrackParam - b _037FFE84 -_037FFBDC: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - ldr r2, [sp, #44] ; 0x2c - bl SND_SetTrackMute - b _037FFE84 -_037FFBF0: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - ldr r2, [sp, #44] ; 0x2c - bl SND_SetTrackAllocatableChannel - b _037FFE84 -_037FFC04: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - ldr r2, [sp, #44] ; 0x2c - mov r2, r2, lsl #16 - mov r2, r2, asr #16 - bl SND_SetPlayerLocalVariable - b _037FFE84 -_037FFC20: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - mov r1, r1, lsl #16 - mov r1, r1, asr #16 - bl SND_SetPlayerGlobalVariable - b _037FFE84 -_037FFC38: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - ldr r2, [sp, #44] ; 0x2c - ldr r3, [sp, #48] ; 0x30 - bl StartTimer - b _037FFE84 -_037FFC50: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - ldr r2, [sp, #44] ; 0x2c - ldr r3, [sp, #48] ; 0x30 - bl StopTimer - b _037FFE84 -_037FFC68: - ldr r1, [sp, #44] ; 0x2c - mov r0, r1, lsr #29 - and r0, r0, #1 - str r0, [sp] - mov r0, r1, lsr #28 - and r0, r0, #1 - str r0, [sp, #4] - mov r0, r1, lsr #27 - and r0, r0, #1 - str r0, [sp, #8] - mov r0, r1, lsr #31 - and r0, r0, #1 - mov r1, r1, lsr #30 - and r1, r1, #1 - ldr r2, [sp, #36] ; 0x24 - ldr r3, [sp, #40] ; 0x28 - bl SND_SetupCapture - b _037FFE84 -_037FFCB0: - ldr r0, [sp, #48] ; 0x30 - str r0, [sp, #4] - ldr r3, [sp, #44] ; 0x2c - str r4, [sp] - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - mov r2, #0 - bl SND_SetupAlarm - b _037FFE84 -_037FFCD4: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - bl SetChannelTimer - b _037FFE84 -_037FFCE4: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - ldr r2, [sp, #44] ; 0x2c - bl SetChannelVolume - b _037FFE84 -_037FFCF8: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - bl SetChannelPan - b _037FFE84 -_037FFD08: - ldr r3, [sp, #48] ; 0x30 - ldr r1, [sp, #36] ; 0x24 - ldr r0, [sp, #44] ; 0x2c - and r2, r3, r6 - str r2, [sp] - and r2, r0, r5 - str r2, [sp, #4] - mov r2, r0, lsr #24 - and r2, r2, #127 ; 0x7f - str r2, [sp, #8] - mov r0, r0, lsr #22 - and r0, r0, #3 - str r0, [sp, #12] - and r0, r6, r1, lsr #16 - str r0, [sp, #16] - mov r0, r3, lsr #16 - and r0, r0, #127 ; 0x7f - str r0, [sp, #20] - and r0, r1, r6 - ldr r1, [sp, #40] ; 0x28 - bic r1, r1, #-134217728 ; 0xf8000000 - mov r2, r3, lsr #24 - and r2, r2, #3 - mov r3, r3, lsr #26 - and r3, r3, #3 - bl SND_SetupChannelPcm - b _037FFE84 -_037FFD74: - ldr r1, [sp, #44] ; 0x2c - ldr r3, [sp, #40] ; 0x28 - and r0, r6, r1, lsr #8 - str r0, [sp] - and r0, r1, #127 ; 0x7f - str r0, [sp, #4] - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #48] ; 0x30 - and r2, r3, #127 ; 0x7f - mov r3, r3, lsr #8 - and r3, r3, #3 - bl SND_SetupChannelPsg - b _037FFE84 -_037FFDA8: - ldr r3, [sp, #44] ; 0x2c - ldr r2, [sp, #40] ; 0x28 - and r0, r3, #127 ; 0x7f - str r0, [sp] - ldr r0, [sp, #36] ; 0x24 - and r1, r2, #127 ; 0x7f - mov r2, r2, lsr #8 - and r2, r2, #3 - and r3, r6, r3, lsr #8 - bl SND_SetupChannelNoise - b _037FFE84 -_037FFDD4: - ldr r0, [sp, #36] ; 0x24 - bl SNDi_SetSurroundDecay - b _037FFE84 -_037FFDE0: - ldr r0, [sp, #36] ; 0x24 - bl SND_SetMasterVolume - b _037FFE84 -_037FFDEC: - ldr r0, [sp, #36] ; 0x24 - bl SND_SetMasterPan - b _037FFE84 -_037FFDF8: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - ldr r2, [sp, #44] ; 0x2c - ldr r3, [sp, #48] ; 0x30 - bl SND_SetOutputSelector - b _037FFE84 -_037FFE10: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - bl SND_LockChannel - b _037FFE84 -_037FFE20: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - bl SND_UnlockChannel - b _037FFE84 -_037FFE30: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - bl SND_StopUnlockedChannel - b _037FFE84 -_037FFE40: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - bl SND_InvalidateSeq - b _037FFE84 -_037FFE50: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - bl SND_InvalidateBank - b _037FFE84 -_037FFE60: - ldr r0, [sp, #36] ; 0x24 - ldr r1, [sp, #40] ; 0x28 - bl SND_InvalidateWave - b _037FFE84 -_037FFE70: - ldr r0, [sp, #36] ; 0x24 - str r0, [r7] - b _037FFE84 -_037FFE7C: - ldr r0, [sp, #36] ; 0x24 - bl ReadDriverInfo -_037FFE84: - ldr lr, [sp, #28] -_037FFE88: - cmp lr, #0 - bne _037FFA88 - ldr r1, [r7] - ldr r0, [r1] - add r0, r0, #1 - str r0, [r1] -_037FFEA0: - mov r0, r9 - mov r1, r8 - mov r2, r4 - bl OS_ReceiveMessage - cmp r0, #0 - bne _037FFA80 - add sp, sp, #52 ; 0x34 - ldmia sp!, {r4, r5, r6, r7, r8, r9, lr} - bx lr -_037FFEC4: .word SNDi_SharedWork -_037FFEC8: .word _038090EC -_037FFECC: .word 0x0000FFFF -_037FFED0: .word 0x003FFFFF - - arm_func_start SND_CommandInit -SND_CommandInit: ; 0x037FFED4 - stmfd sp!, {lr} - sub sp, sp, #4 - ldr r0, _037FFF08 ; =_038090EC - ldr r1, _037FFF0C ; =_0380910C - mov r2, #8 - bl OS_InitMessageQueue - bl InitPXI - mov r1, #0 - ldr r0, _037FFF10 ; =SNDi_SharedWork - str r1, [r0] - add sp, sp, #4 - ldmia sp!, {lr} - bx lr -_037FFF08: .word _038090EC -_037FFF0C: .word _0380910C -_037FFF10: .word SNDi_SharedWork diff --git a/arm7/lib/include/SND.h b/arm7/lib/include/SND.h index b471ac72..c417ab0e 100644 --- a/arm7/lib/include/SND.h +++ b/arm7/lib/include/SND.h @@ -4,8 +4,6 @@ #include "nitro/types.h" void SND_Enable(void); -void SND_SetOutputSelector(u8 leftOutputFrom, u8 rightOutputFrom, u8 outputCh1ToMixer, u8 outputCh3ToMixer); -void SND_SetMasterVolume(u8 vol); -void SND_StopChannel(s32 idx, BOOL hold); +void SND_SetOutputSelector(int leftOutputFrom, int rightOutputFrom, int outputCh1ToMixer, int outputCh3ToMixer); #endif //GUARD_SND_H diff --git a/arm7/lib/include/SND_channel.h b/arm7/lib/include/SND_channel.h index ea179968..8b74b579 100644 --- a/arm7/lib/include/SND_channel.h +++ b/arm7/lib/include/SND_channel.h @@ -5,6 +5,8 @@ #include "SND_exChannel.h" +void SNDi_SetSurroundDecay(int decay); + void SND_SetupChannelPcm( s32 chnIdx, const void *data, @@ -41,6 +43,8 @@ void SND_SetChannelVolume(s32 chnIdx, s32 volume, s32 volumeDiv); void SND_SetChannelPan(s32 chnIdx, s32 pan); void SND_SetChannelTimer(s32 chnIdx, s32 timer); +u32 SND_GetChannelControl(int idx); + // TODO move this function to SND_exChannel.c u16 CalcDecayCoeff(int value); diff --git a/arm7/lib/include/SND_command.h b/arm7/lib/include/SND_command.h index ea5452b9..c22cd459 100644 --- a/arm7/lib/include/SND_command.h +++ b/arm7/lib/include/SND_command.h @@ -1,6 +1,8 @@ #ifndef GUARD_SND_COMMAND_H #define GUARD_SND_COMMAND_H +#include "nitro/SND_command_shared.h" + void SND_CommandInit(void); void SND_CommandProc(void); diff --git a/arm7/lib/include/SND_exChannel.h b/arm7/lib/include/SND_exChannel.h index fcc3a548..038a1a49 100644 --- a/arm7/lib/include/SND_exChannel.h +++ b/arm7/lib/include/SND_exChannel.h @@ -22,6 +22,7 @@ BOOL SND_IsExChannelActive(struct SNDExChannel *chn); struct SNDExChannel *SND_AllocExChannel(u32 channelMask, int priority, u32 flags, SNDExChannelCallback callback, void *callbackUserData); void SND_FreeExChannel(struct SNDExChannel *chn); BOOL SND_IsChannelActive(s32 idx); +void SND_InvalidateWave(const void *start, const void *end); // TODO internal functions, move these so exChannel int ExChannelSweepUpdate(struct SNDExChannel *chn, BOOL step); diff --git a/arm7/lib/include/SND_main.h b/arm7/lib/include/SND_main.h index eba3ff44..fc72ae33 100644 --- a/arm7/lib/include/SND_main.h +++ b/arm7/lib/include/SND_main.h @@ -12,5 +12,7 @@ u32 SND_WaitForIntervalTimer(void); void SND_SendWakeupMessage(void); void SNDi_LockMutex(void); void SNDi_UnlockMutex(void); +void SND_SetMasterVolume(int vol); +void SND_SetMasterPan(int pan); #endif //GUARD_SND_MAIN_H diff --git a/arm7/lib/include/SND_seq.h b/arm7/lib/include/SND_seq.h index 642cff3e..25b63a35 100644 --- a/arm7/lib/include/SND_seq.h +++ b/arm7/lib/include/SND_seq.h @@ -1,7 +1,24 @@ #ifndef GUARD_SND_SEQ_H #define GUARD_SND_SEQ_H +#include "nitro/types.h" + +#include "nitro/SND_bank_shared.h" + void SND_SeqInit(void); void SND_SeqMain(BOOL update); +void SND_StartSeq(int player, const void *seq, u32 offset, struct SNDBankData *bank); +void SND_StopSeq(int player); +void SND_PrepareSeq(int player, const void *seq, u32 offset, struct SNDBankData *bank); +void SND_StartPreparedSeq(int player); +void SND_PauseSeq(int player, BOOL pause); +void SND_SkipSeq(int player, u32 tick); +void SNDi_SetPlayerParam(int player, u32 offset, u32 data, int size); +void SNDi_SetTrackParam(int player, u32 trackMask, u32 offset, u32 data, int size); +void SND_SetTrackMute(int player, u32 trackMask, BOOL mute); +void SND_SetTrackAllocatableChannel(int player, u32 trackMask, u32 channelMask); +void SND_InvalidateSeq(const void *start, const void *end); +void SND_InvalidateBank(const void *start, const void *end); + #endif //GUARD_SND_SEQ_H diff --git a/arm7/lib/include/SND_wave.h b/arm7/lib/include/SND_wave.h index e1ae93fe..fd76b1a5 100644 --- a/arm7/lib/include/SND_wave.h +++ b/arm7/lib/include/SND_wave.h @@ -1,6 +1,6 @@ #ifndef GUARD_SND_WAVE_H #define GUARD_SND_WAVE_H -void SND_InvalidateWave(void *begin, void *end); +void SND_InvalidateWave(const void *begin, const void *end); #endif //GUARD_SND_WAVE_H diff --git a/arm7/lib/include/SND_work.h b/arm7/lib/include/SND_work.h index 49933fc7..0125a52d 100644 --- a/arm7/lib/include/SND_work.h +++ b/arm7/lib/include/SND_work.h @@ -6,8 +6,8 @@ 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_SetPlayerLocalVariable(int player, int var, s16 value); +void SND_SetPlayerGlobalVariable(int var, s16 value); void SND_UpdateSharedWork(void); #endif //GUARD_SND_WORK_H diff --git a/arm7/lib/src/SND_command.c b/arm7/lib/src/SND_command.c new file mode 100644 index 00000000..fc059c89 --- /dev/null +++ b/arm7/lib/src/SND_command.c @@ -0,0 +1,302 @@ +#include "SND_command.h" + +#include "registers.h" +#include "mmap.h" + +#include "MI_memory.h" +#include "PXI_fifo.h" +#include "OS_message.h" +#include "OS_system.h" +#include "SND.h" +#include "SND_alarm.h" +#include "SND_capture.h" +#include "SND_channel.h" +#include "SND_exChannel.h" +#include "SND_lockChannel.h" +#include "SND_main.h" +#include "SND_seq.h" +#include "SND_work.h" + +#define SND_MSG_ARRAY_SIZE 8 + +static OSMessage sMsgArray[SND_MSG_ARRAY_SIZE]; +static struct OSMessageQueue sMsgQueue; + +static void InitPXI(void); +static void StartTimer(u32 channelMask, u32 captureMask, u32 alarmMask, s32 unused); +static void StopTimer(u32 channelMask, u32 captureMask, u32 alarmMask, s32 hold); +static void SetChannelTimer(u32 channelMask, int timer); +static void SetChannelVolume(u32 channelMask, int vol, int shift); +static void SetChannelPan(u32 channelMask, int pan); +static void ReadDriverInfo(struct SNDDriverInfo *driverInfo); + +void SND_CommandInit(void) { + OS_InitMessageQueue(&sMsgQueue, sMsgArray, SND_MSG_ARRAY_SIZE); + InitPXI(); + SNDi_SharedWork = NULL; +} + +void SND_CommandProc(void) { + struct SNDCommand cmd; + struct SNDCommand *cmd_ptr; + OSMessage msg; + + while (OS_ReceiveMessage(&sMsgQueue, &msg, 0)) { + // casting it directly below doesn't appear to match + cmd_ptr = (struct SNDCommand *)msg; + + while (cmd_ptr) { + cmd = *cmd_ptr; + + switch (cmd.id) { + case SND_CMD_START_SEQ: + SND_StartSeq((int)cmd.arg[0], (const void *)cmd.arg[1], cmd.arg[2], (struct SNDBankData *)cmd.arg[3]); + break; + case SND_CMD_STOP_SEQ: + SND_StopSeq((int)cmd.arg[0]); + break; + case SND_CMD_PREPARE_SEQ: + SND_PrepareSeq((int)cmd.arg[0], (const void *)cmd.arg[1], cmd.arg[2], (struct SNDBankData *)cmd.arg[3]); + break; + case SND_CMD_START_PREPARED_SEQ: + SND_StartPreparedSeq((int)cmd.arg[0]); + break; + case SND_CMD_PAUSE_SEQ: + SND_PauseSeq((int)cmd.arg[0], (BOOL)cmd.arg[1]); + break; + case SND_CMD_SKIP_SEQ: + SND_SkipSeq((int)cmd.arg[0], cmd.arg[1]); + break; + case SND_CMD_PLAYER_PARAM: + SNDi_SetPlayerParam((int)cmd.arg[0], cmd.arg[1], cmd.arg[2], (int)cmd.arg[3]); + break; + case SND_CMD_TRACK_PARAM: + SNDi_SetTrackParam((int)cmd.arg[0] & 0xFFFFFF, cmd.arg[1], cmd.arg[2], cmd.arg[3], (u8)(cmd.arg[0] >> 24)); + break; + case SND_CMD_MUTE_TRACK: + SND_SetTrackMute((int)cmd.arg[0], cmd.arg[1], (BOOL)cmd.arg[2]); + break; + case SND_CMD_ALLOCATABLE_CHANNEL: + SND_SetTrackAllocatableChannel((int)cmd.arg[0], cmd.arg[1], cmd.arg[2]); + break; + case SND_CMD_PLAYER_LOCAL_VAR: + SND_SetPlayerLocalVariable((int)cmd.arg[0], (int)cmd.arg[1], (s16)cmd.arg[2]); + break; + case SND_CMD_PLAYER_GLOBAL_VAR: + SND_SetPlayerGlobalVariable((int)cmd.arg[0], (s16)cmd.arg[1]); + break; + case SND_CMD_START_TIMER: + StartTimer(cmd.arg[0], cmd.arg[1], cmd.arg[2], (int)cmd.arg[3]); + break; + case SND_CMD_STOP_TIMER: + StopTimer(cmd.arg[0], cmd.arg[1], cmd.arg[2], (int)cmd.arg[3]); + break; + case SND_CMD_SETUP_CAPTURE: + SND_SetupCapture( + (int)(cmd.arg[2] >> 31u) & 1, + (int)(cmd.arg[2] >> 30u) & 1, + (void *)cmd.arg[0], + (int)cmd.arg[1], + (BOOL)(cmd.arg[2] >> 29u) & 1, + (int)(cmd.arg[2] >> 28u) & 1, + (int)(cmd.arg[2] >> 27u) & 1 + ); + break; + case SND_CMD_SETUP_ALARM: + SND_SetupAlarm( + (int)cmd.arg[0], + cmd.arg[1], + cmd.arg[2], + cmd.arg[3] + ); + break; + case SND_CMD_CHANNEL_TIMER: + SetChannelTimer(cmd.arg[0], (int)cmd.arg[1]); + break; + case SND_CMD_CHANNEL_VOLUME: + SetChannelVolume(cmd.arg[0], (int)cmd.arg[1], (int)cmd.arg[2]); + break; + case SND_CMD_CHANNEL_PAN: + SetChannelPan(cmd.arg[0], (int)cmd.arg[1]); + break; + case SND_CMD_SETUP_CHANNEL_PCM: + SND_SetupChannelPcm( + (int)cmd.arg[0] & 0xFFFF, + (void *)(cmd.arg[1] & 0x7FFFFFFu), + (int)(cmd.arg[3] >> 24u) & 0x3, + (int)(cmd.arg[3] >> 26u) & 0x3, + (int)cmd.arg[3] & 0xFFFF, + (int)cmd.arg[2] & 0x3FFFFF, + (int)(cmd.arg[2] >> 24u) & 0x7F, + (int)(cmd.arg[2] >> 22u) & 0x3, + (int)(cmd.arg[0] >> 16u) & 0xFFFF, + (int)(cmd.arg[3] >> 16u) & 0x7F + ); + break; + case SND_CMD_SETUP_CHANNEL_PSG: + SND_SetupChannelPsg( + (int)cmd.arg[0], + (int)cmd.arg[3], + (int)cmd.arg[1] & 0x7F, + (int)(cmd.arg[1] >> 8u) & 0x3, + (int)(cmd.arg[2] >> 8u) & 0xFFFF, + (int)cmd.arg[2] & 0x7F + ); + break; + case SND_CMD_SETUP_CHANNEL_NOISE: + SND_SetupChannelNoise( + (int)cmd.arg[0], + (int)cmd.arg[1] & 0x7F, + (int)(cmd.arg[1] >> 8u) & 0x3, + (int)(cmd.arg[2] >> 8u) & 0xFFFF, + (int)cmd.arg[2] & 0x7F + ); + break; + case SND_CMD_SURROUND_DECAY: + SNDi_SetSurroundDecay((int)cmd.arg[0]); + break; + case SND_CMD_MASTER_VOLUME: + SND_SetMasterVolume((int)cmd.arg[0]); + break; + case SND_CMD_MASTER_PAN: + SND_SetMasterPan((int)cmd.arg[0]); + break; + case SND_CMD_OUTPUT_SELECTOR: + SND_SetOutputSelector((int)cmd.arg[0], (int)cmd.arg[1], (int)cmd.arg[2], (int)cmd.arg[3]); + break; + case SND_CMD_LOCK_CHANNEL: + SND_LockChannel(cmd.arg[0], cmd.arg[1]); + break; + case SND_CMD_UNLOCK_CHANNEL: + SND_UnlockChannel(cmd.arg[0], cmd.arg[1]); + break; + case SND_CMD_STOP_UNLOCKED_CHANNEL: + SND_StopUnlockedChannel(cmd.arg[0], cmd.arg[1]); + break; + case SND_CMD_INVALIDATE_SEQ: + SND_InvalidateSeq((void *)cmd.arg[0], (void *)cmd.arg[1]); + break; + case SND_CMD_INVALIDATE_BANK: + SND_InvalidateBank((void *)cmd.arg[0], (void *)cmd.arg[1]); + break; + case SND_CMD_INVALIDATE_WAVE: + SND_InvalidateWave((void *)cmd.arg[0], (void *)cmd.arg[1]); + break; + case SND_CMD_SET_SHARED_WORK: + SNDi_SharedWork = (struct SNDSharedWork *)cmd.arg[0]; + break; + case SND_CMD_READ_DRIVER_INFO: + ReadDriverInfo((struct SNDDriverInfo *)cmd.arg[0]); + break; + } // end switch + + cmd_ptr = cmd.llNext; + } // end loop over command linked list + + SNDi_SharedWork->finishedCommandTag++; + } // end loop over receive message +} + +static void PxiFifoCallback(PXIFifoTag tag, u32 data, BOOL error) { + (void)tag; + (void)error; + + OSIntrMode intrMode = OS_DisableInterrupts(); + + if (data >= HW_MAIN_MEM) { + (void)OS_SendMessage(&sMsgQueue, (OSMessage)data, 0); + } else { + if (data == 0) + SND_SendWakeupMessage(); + } + + (void)OS_RestoreInterrupts(intrMode); +} + +static void InitPXI(void) { + PXI_SetFifoRecvCallback(PXI_FIFO_TAG_SOUND, PxiFifoCallback); +} + +static void SetChannelTimer(u32 channelMask, int timer) { + for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1) { + if (channelMask & 1) + SND_SetChannelTimer(i, timer); + } +} + +static void SetChannelVolume(u32 channelMask, int vol, int shift) { + for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1) { + if (channelMask & 1) + SND_SetChannelVolume(i, vol, shift); + } +} + +static void SetChannelPan(u32 channelMask, int pan) { + for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1) { + if (channelMask & 1) + SND_SetChannelPan(i, pan); + } +} + +static void StartTimer(u32 channelMask, u32 captureMask, u32 alarmMask, s32 unused) { + (void)unused; + + OSIntrMode intrMode = OS_DisableInterrupts(); + + for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1) { + if (channelMask & 1) + reg_SOUNDxCNT_STAT(i) |= 0x80; + } + + if (captureMask & 1) { + if (captureMask & 2) { + *(vu16 *)®_SNDCAPxCNT(0) |= 0x8080; + } else { + reg_SNDCAPxCNT(0) |= 0x80; + } + } else if (captureMask & 2) { + reg_SNDCAPxCNT(1) |= 0x80; + } + + for (int i = 0; i < SND_ALARM_COUNT && alarmMask != 0; i++, alarmMask >>= 1) { + if (alarmMask & 1) + SND_StartAlarm(i); + } + + (void)OS_RestoreInterrupts(intrMode); + SND_UpdateSharedWork(); +} + +static void StopTimer(u32 channelMask, u32 captureMask, u32 alarmMask, s32 hold) { + OSIntrMode intrMode = OS_DisableInterrupts(); + + for (int i = 0; i < SND_ALARM_COUNT && alarmMask != 0; i++, alarmMask >>= 1) { + if (alarmMask & 1) + SND_StopAlarm(i); + } + + for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1) { + if (channelMask & 1) + SND_StopChannel(i, hold); + } + + if (captureMask & 1) + reg_SNDCAPxCNT(0) = 0; + if (captureMask & 2) + reg_SNDCAPxCNT(1) = 0; + + (void)OS_RestoreInterrupts(intrMode); + SND_UpdateSharedWork(); +} + +static void ReadDriverInfo(struct SNDDriverInfo *driverInfo) { + MI_CpuCopy32(&SNDi_Work, driverInfo, sizeof(SNDi_Work)); + + driverInfo->workPtr = &SNDi_Work; + + for (int i = 0; i < SND_CHANNEL_COUNT; i++) { + driverInfo->channelControls[i] = SND_GetChannelControl(i); + } + + driverInfo->lockedChannels = SND_GetLockedChannel(0); +} diff --git a/arm7/lib/src/SND_lockChannel.c b/arm7/lib/src/SND_lockChannel.c index 608ed67a..871cf716 100644 --- a/arm7/lib/src/SND_lockChannel.c +++ b/arm7/lib/src/SND_lockChannel.c @@ -2,7 +2,7 @@ #include "SND_work.h" #include "SND_exChannel.h" -#include "SND.h" +#include "SND_channel.h" // TODO make these vars static after merging this file with exChannel u32 sLockedChannelMask; diff --git a/arm7/lib/src/SND_wave.c b/arm7/lib/src/SND_wave.c index 75d84e5f..21c48dc8 100644 --- a/arm7/lib/src/SND_wave.c +++ b/arm7/lib/src/SND_wave.c @@ -1,9 +1,9 @@ #include "SND_wave.h" -#include "SND.h" +#include "SND_channel.h" #include "SND_work.h" -void SND_InvalidateWave(void *start, void *end) { +void SND_InvalidateWave(const void *start, const void *end) { for (u8 i = 0; i < SND_CHANNEL_COUNT; i++) { struct SNDExChannel *chn = &SNDi_Work.channels[i]; diff --git a/arm7/lib/src/SND_work.c b/arm7/lib/src/SND_work.c index 4b23056d..3f0d10f0 100644 --- a/arm7/lib/src/SND_work.c +++ b/arm7/lib/src/SND_work.c @@ -6,11 +6,11 @@ struct SNDWork SNDi_Work; struct SNDSharedWork *SNDi_SharedWork; -void SND_SetPlayerLocalVariable(u32 player, u32 var, s16 value) { +void SND_SetPlayerLocalVariable(int player, int var, s16 value) { SNDi_SharedWork->players[player].localVars[var] = value; } -void SND_SetPlayerGlobalVariable(u32 var, s16 value) { +void SND_SetPlayerGlobalVariable(int var, s16 value) { SNDi_SharedWork->globalVars[var] = value; } diff --git a/arm9/lib/NitroSDK/include/SND_work.h b/arm9/lib/NitroSDK/include/SND_work.h index a8a3d62b..f3ed08c8 100644 --- a/arm9/lib/NitroSDK/include/SND_work.h +++ b/arm9/lib/NitroSDK/include/SND_work.h @@ -6,51 +6,6 @@ #include "SND_main.h" #include "nitro/SND_work_shared.h" -struct SNDDriverInfo { - struct SNDWork work; // 0x0000 - u32 channelControls[SND_CHANNEL_COUNT]; // 0x1180 - struct SNDWork *workPtr; // 0x11C0 - u32 lockedChannels; // 0x11C4 - u8 unk_XXX[24]; // 0x11C8 -}; // size = 0x11E0 - -struct SNDChannelInfo { - struct { - BOOL active : 1; - BOOL locked: 1; - } flags; // 0x0 - u16 volume; // 0x4 - u8 pan; // 0x6 - u8 unk_7; // 0x7 - s32 envStatus; // 0x8 -}; // size = 0xC - -struct SNDPlayerInfo { - struct { - BOOL active : 1; - BOOL paused : 1; - } flags; // 0x0 - u16 trackBitMask; // 0x4 - u16 tempo; // 0x6 - u8 volume; // 0x8 - u8 unk_9[3]; // 0x9 -}; // size = 0xC - -struct SNDTrackInfo { - u16 program; // 0x0 - u8 volume; // 0x2 - u8 expression; // 0x3 - - s8 pitchBend; // 0x4 - u8 bendRange; // 0x5 - u8 pan; // 0x6 - s8 transpose; // 0x7 - - u8 unk_8; // 0x8 - u8 chnCount; // 0x9 - u8 channel[SND_CHANNEL_COUNT]; // 0xA -}; // size = 0x1A - u32 SND_GetPlayerStatus(void); u16 SND_GetChannelStatus(void); //u16 SND_GetCaptureStatus(void); diff --git a/include/nitro/SND_work_shared.h b/include/nitro/SND_work_shared.h index 08eda013..02cc8bff 100644 --- a/include/nitro/SND_work_shared.h +++ b/include/nitro/SND_work_shared.h @@ -42,6 +42,51 @@ struct SNDSharedWork { s16 globalVars[16]; // 0x260 }; // size = 0x280 +struct SNDDriverInfo { + struct SNDWork work; // 0x0000 + u32 channelControls[SND_CHANNEL_COUNT]; // 0x1180 + struct SNDWork *workPtr; // 0x11C0 + u32 lockedChannels; // 0x11C4 + u8 unk_XXX[24]; // 0x11C8 +}; // size = 0x11E0 + +struct SNDChannelInfo { + struct { + BOOL active : 1; + BOOL locked: 1; + } flags; // 0x0 + u16 volume; // 0x4 + u8 pan; // 0x6 + u8 unk_7; // 0x7 + s32 envStatus; // 0x8 +}; // size = 0xC + +struct SNDPlayerInfo { + struct { + BOOL active : 1; + BOOL paused : 1; + } flags; // 0x0 + u16 trackBitMask; // 0x4 + u16 tempo; // 0x6 + u8 volume; // 0x8 + u8 unk_9[3]; // 0x9 +}; // size = 0xC + +struct SNDTrackInfo { + u16 program; // 0x0 + u8 volume; // 0x2 + u8 expression; // 0x3 + + s8 pitchBend; // 0x4 + u8 bendRange; // 0x5 + u8 pan; // 0x6 + s8 transpose; // 0x7 + + u8 unk_8; // 0x8 + u8 chnCount; // 0x9 + u8 channel[SND_CHANNEL_COUNT]; // 0xA +}; // size = 0x1A + extern struct SNDWork SNDi_Work; extern struct SNDSharedWork *SNDi_SharedWork; -- cgit v1.2.3 From 5cc94282b5c8e2b991a443f9e64e91c466cb00f1 Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Fri, 9 Jul 2021 01:47:28 +0200 Subject: fix small error in seq header --- include/nitro/SND_seq_shared.h | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/nitro/SND_seq_shared.h b/include/nitro/SND_seq_shared.h index 6ff6189c..ff73e951 100644 --- a/include/nitro/SND_seq_shared.h +++ b/include/nitro/SND_seq_shared.h @@ -72,9 +72,9 @@ struct SNDTrack { s32 wait; // 0x20 - const u8 *trackDataStart; // 0x24 - const u8 *trackDataPos; // 0x28 - const u8 *posCallStack[SND_TRACK_MAX_CALL]; // 0x34 + const u8 *base; // 0x24 + const u8 *cur; // 0x28 + const u8 *posCallStack[SND_TRACK_MAX_CALL]; // 0x2C u8 loopCount[SND_TRACK_MAX_CALL]; // 0x38 u8 callStackDepth; // 0x3B -- cgit v1.2.3 From bedb58ea94b44f8b4168fd731339fec38ee21988 Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Fri, 9 Jul 2021 13:43:54 +0200 Subject: arm7: decompile SND_seq --- arm7/asm/SND_seq.s | 549 ------------------------------------ arm7/asm/SND_unk_037FD440.s | 130 ++++----- arm7/global.inc | 30 +- arm7/lib/include/SND_unk_037FD440.h | 22 ++ arm7/lib/src/SND_seq.c | 266 +++++++++++++++++ 5 files changed, 368 insertions(+), 629 deletions(-) delete mode 100644 arm7/asm/SND_seq.s create mode 100644 arm7/lib/include/SND_unk_037FD440.h create mode 100644 arm7/lib/src/SND_seq.c diff --git a/arm7/asm/SND_seq.s b/arm7/asm/SND_seq.s deleted file mode 100644 index fcf067df..00000000 --- a/arm7/asm/SND_seq.s +++ /dev/null @@ -1,549 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - - .text - - arm_func_start SNDi_SetTrackParam -SNDi_SetTrackParam: ; 0x037FE9F4 - stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - sub sp, sp, #4 - mov sl, r1 - mov r9, r2 - mov r8, r3 - ldr r7, [sp, #40] ; 0x28 - ldr r2, _037FEA94 ; =_038084AC - mov r1, #36 ; 0x24 - mla fp, r0, r1, r2 - mov r6, #0 - mov r0, r8, lsl #16 - mov r4, r0, lsr #16 - and r5, r8, #255 ; 0xff - b _037FEA78 -_037FEA2C: - ands r0, sl, #1 - beq _037FEA70 - mov r0, fp - mov r1, r6 - bl FUN_037FE460 - cmp r0, #0 - beq _037FEA70 - cmp r7, #1 - beq _037FEA64 - cmp r7, #2 - beq _037FEA6C - cmp r7, #4 - streq r8, [r0, r9] - b _037FEA70 -_037FEA64: - strb r5, [r0, r9] - b _037FEA70 -_037FEA6C: - strh r4, [r0, r9] -_037FEA70: - add r6, r6, #1 - mov sl, sl, lsr #1 -_037FEA78: - cmp r6, #16 - bge _037FEA88 - cmp sl, #0 - bne _037FEA2C -_037FEA88: - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - bx lr -_037FEA94: .word (SNDi_Work + 0x540) - - arm_func_start SNDi_SetPlayerParam -SNDi_SetPlayerParam: ; 0x037FEA98 - stmfd sp!, {lr} - sub sp, sp, #4 - ldr lr, _037FEAE0 ; =_038084AC - mov ip, #36 ; 0x24 - mla ip, r0, ip, lr - cmp r3, #1 - beq _037FEAC8 - cmp r3, #2 - beq _037FEAD0 - cmp r3, #4 - streq r2, [ip, r1] - b _037FEAD4 -_037FEAC8: - strb r2, [ip, r1] - b _037FEAD4 -_037FEAD0: - strh r2, [ip, r1] -_037FEAD4: - add sp, sp, #4 - ldmia sp!, {lr} - bx lr -_037FEAE0: .word (SNDi_Work + 0x540) - - arm_func_start SND_InvalidateBank -SND_InvalidateBank: ; 0x037FEAE4 - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r7, r0 - mov r6, r1 - mov r5, #0 - ldr r4, _037FEB40 ; =_038084AC - mov r8, #36 ; 0x24 -_037FEAFC: - mul r1, r5, r8 - add r0, r4, r1 - ldrb r1, [r4, r1] - mov r1, r1, lsl #31 - movs r1, r1, lsr #31 - beq _037FEB2C - ldr r1, [r0, #32] - cmp r7, r1 - bhi _037FEB2C - cmp r1, r6 - bhi _037FEB2C - bl FUN_037FE3AC -_037FEB2C: - add r5, r5, #1 - cmp r5, #16 - blt _037FEAFC - ldmia sp!, {r4, r5, r6, r7, r8, lr} - bx lr -_037FEB40: .word (SNDi_Work + 0x540) - - arm_func_start SND_InvalidateSeq -SND_InvalidateSeq: ; 0x037FEB44 - stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - sub sp, sp, #4 - mov sl, r0 - mov r9, r1 - mov r7, #0 - mov r5, r7 - ldr fp, _037FEBDC ; =_038084AC - mov r4, #36 ; 0x24 -_037FEB64: - mul r0, r7, r4 - add r8, fp, r0 - ldrb r0, [fp, r0] - mov r0, r0, lsl #31 - movs r0, r0, lsr #31 - beq _037FEBC4 - mov r6, r5 - b _037FEBBC -_037FEB84: - mov r0, r8 - mov r1, r6 - bl FUN_037FE460 - cmp r0, #0 - beq _037FEBB8 - ldr r0, [r0, #40] ; 0x28 - cmp sl, r0 - bhi _037FEBB8 - cmp r0, r9 - bhi _037FEBB8 - mov r0, r8 - bl FUN_037FE3AC - b _037FEBC4 -_037FEBB8: - add r6, r6, #1 -_037FEBBC: - cmp r6, #16 - blt _037FEB84 -_037FEBC4: - add r7, r7, #1 - cmp r7, #16 - blt _037FEB64 - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - bx lr -_037FEBDC: .word (SNDi_Work + 0x540) - - arm_func_start SND_SetTrackAllocatableChannel -SND_SetTrackAllocatableChannel: ; 0x037FEBE0 - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #4 - mov r6, r1 - ldr r3, _037FEC54 ; =_038084AC - mov r1, #36 ; 0x24 - mla r5, r0, r1, r3 - mov r4, #0 - mov r0, r2, lsl #16 - mov r7, r0, lsr #16 - b _037FEC38 -_037FEC08: - ands r0, r6, #1 - beq _037FEC30 - mov r0, r5 - mov r1, r4 - bl FUN_037FE460 - cmp r0, #0 - strneh r7, [r0, #30] - ldrneb r1, [r0] - orrne r1, r1, #128 ; 0x80 - strneb r1, [r0] -_037FEC30: - add r4, r4, #1 - mov r6, r6, lsr #1 -_037FEC38: - cmp r4, #16 - bge _037FEC48 - cmp r6, #0 - bne _037FEC08 -_037FEC48: - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, lr} - bx lr -_037FEC54: .word (SNDi_Work + 0x540) - - arm_func_start SND_SetTrackMute -SND_SetTrackMute: ; 0x037FEC58 - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #4 - mov r7, r1 - mov r6, r2 - ldr r2, _037FECC8 ; =_038084AC - mov r1, #36 ; 0x24 - mla r5, r0, r1, r2 - mov r4, #0 - b _037FECAC -_037FEC7C: - ands r0, r7, #1 - beq _037FECA4 - mov r0, r5 - mov r1, r4 - bl FUN_037FE460 - cmp r0, #0 - beq _037FECA4 - mov r1, r5 - mov r2, r6 - bl FUN_037FD440 -_037FECA4: - add r4, r4, #1 - mov r7, r7, lsr #1 -_037FECAC: - cmp r4, #16 - bge _037FECBC - cmp r7, #0 - bne _037FEC7C -_037FECBC: - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, lr} - bx lr -_037FECC8: .word (SNDi_Work + 0x540) - - arm_func_start SND_SkipSeq -SND_SkipSeq: ; 0x037FECCC - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r6, r1 - ldr r2, _037FED90 ; =_038084AC - mov r1, #36 ; 0x24 - mla r5, r0, r1, r2 - mov r8, #0 - mov r4, #127 ; 0x7f -_037FECE8: - mov r0, r5 - mov r1, r8 - bl FUN_037FE460 - movs r7, r0 - beq _037FED10 - mov r1, r5 - mov r2, r4 - bl FUN_037FE588 - mov r0, r7 - bl FUN_037FE54C -_037FED10: - add r8, r8, #1 - cmp r8, #16 - blt _037FECE8 - bl SND_StopIntervalTimer - mov r4, #0 - mov r7, r4 - b _037FED50 -_037FED2C: - mov r0, r5 - mov r1, r7 - bl FUN_037FD548 - cmp r0, #0 - beq _037FED4C - mov r0, r5 - bl FUN_037FE3AC - b _037FED58 -_037FED4C: - add r4, r4, #1 -_037FED50: - cmp r4, r6 - bcc _037FED2C -_037FED58: - bl SND_StartIntervalTimer - ldr r0, _037FED94 ; =SNDi_SharedWork - ldr r0, [r0] - cmp r0, #0 - beq _037FED88 - add r3, r0, #64 ; 0x40 - ldrb r1, [r5, #1] - mov r0, #36 ; 0x24 - mul r2, r1, r0 - ldr r0, [r3, r2] - add r0, r0, r4 - str r0, [r3, r2] -_037FED88: - ldmia sp!, {r4, r5, r6, r7, r8, lr} - bx lr -_037FED90: .word (SNDi_Work + 0x540) -_037FED94: .word SNDi_SharedWork - - arm_func_start SND_PauseSeq -SND_PauseSeq: ; 0x037FED98 - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #4 - ldr r5, _037FEE18 ; =_038084AC - mov r2, #36 ; 0x24 - mul r3, r0, r2 - add r4, r5, r3 - ldrb r0, [r5, r3] - bic r2, r0, #4 - and r0, r1, #255 ; 0xff - and r0, r0, #1 - orr r0, r2, r0, lsl #2 - strb r0, [r5, r3] - cmp r1, #0 - beq _037FEE0C - mov r7, #0 - mov r5, #127 ; 0x7f -_037FEDD8: - mov r0, r4 - mov r1, r7 - bl FUN_037FE460 - movs r6, r0 - beq _037FEE00 - mov r1, r4 - mov r2, r5 - bl FUN_037FE588 - mov r0, r6 - bl FUN_037FE54C -_037FEE00: - add r7, r7, #1 - cmp r7, #16 - blt _037FEDD8 -_037FEE0C: - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, lr} - bx lr -_037FEE18: .word (SNDi_Work + 0x540) - - arm_func_start SND_StopSeq -SND_StopSeq: ; 0x037FEE1C - stmdb sp!, {r4, lr} - mov r4, r0 - ldr r2, _037FEE70 ; =_038084AC - mov r0, #36 ; 0x24 - mul r1, r4, r0 - add r0, r2, r1 - ldrb r1, [r2, r1] - mov r1, r1, lsl #31 - movs r1, r1, lsr #31 - beq _037FEE68 - bl FUN_037FE3AC - ldr r0, _037FEE74 ; =SNDi_SharedWork - ldr r2, [r0] - cmp r2, #0 - ldrne r1, [r2, #4] - movne r0, #1 - mvnne r0, r0, lsl r4 - andne r0, r1, r0 - strne r0, [r2, #4] -_037FEE68: - ldmia sp!, {r4, lr} - bx lr -_037FEE70: .word (SNDi_Work + 0x540) -_037FEE74: .word SNDi_SharedWork - - arm_func_start SND_StartSeq -SND_StartSeq: ; 0x037FEE78 - stmdb sp!, {r4, lr} - mov r4, r0 - bl SND_PrepareSeq - mov r0, r4 - bl SND_StartPreparedSeq - ldmia sp!, {r4, lr} - bx lr - - arm_func_start SND_StartPreparedSeq -SND_StartPreparedSeq: ; 0x037FEE94 - ldr r2, _037FEEB0 ; =_038084AC - mov r1, #36 ; 0x24 - mul r1, r0, r1 - ldrb r0, [r2, r1] - orr r0, r0, #2 - strb r0, [r2, r1] - bx lr -_037FEEB0: .word (SNDi_Work + 0x540) - - arm_func_start SND_PrepareSeq -SND_PrepareSeq: ; 0x037FEEB4 - stmdb sp!, {r4, r5, r6, r7, r8, r9, lr} - sub sp, sp, #4 - mov r4, r0 - mov r8, r1 - mov r6, r2 - mov r5, r3 - ldr r1, _037FEFFC ; =_038084AC - mov r0, #36 ; 0x24 - mul r0, r4, r0 - add r7, r1, r0 - ldrb r0, [r1, r0] - mov r0, r0, lsl #31 - movs r0, r0, lsr #31 - beq _037FEEF4 - mov r0, r7 - bl FUN_037FE3AC -_037FEEF4: - mov r0, r7 - mov r1, r5 - bl FUN_037FE5F8 - bl FUN_037FD4C0 - movs r9, r0 - bmi _037FEFF0 - ldr r0, _037FF000 ; =_038086EC - add r5, r0, r9, lsl #6 - mov r0, r5 - bl FUN_037FE6BC - mov r0, r5 - mov r1, r8 - mov r2, r6 - bl FUN_037FE6A8 - strb r9, [r7, #8] - ldr r0, [r5, #40] ; 0x28 - bl FUN_037FE9B8 - ldr r0, [r5, #40] ; 0x28 - bl FUN_037FE968 - add r2, r5, #40 ; 0x28 - ldr r1, [r5, #40] ; 0x28 - add r1, r1, #1 - str r1, [r5, #40] ; 0x28 - cmp r0, #254 ; 0xfe - ldrne r0, [r2] - subne r0, r0, #1 - strne r0, [r2] - bne _037FEFB8 - mov r0, r5 - bl FUN_037FE918 - mov r0, r0, lsl #15 - mov r5, r0, lsr #16 - mov r6, #1 - ldr r8, _037FF000 ; =_038086EC - b _037FEFB0 -_037FEF80: - ands r0, r5, #1 - beq _037FEFA4 - bl FUN_037FD4C0 - movs r9, r0 - bmi _037FEFB8 - add r0, r8, r9, lsl #6 - bl FUN_037FE6BC - add r0, r7, r6 - strb r9, [r0, #8] -_037FEFA4: - add r6, r6, #1 - mov r0, r5, lsl #15 - mov r5, r0, lsr #16 -_037FEFB0: - cmp r5, #0 - bne _037FEF80 -_037FEFB8: - ldrb r0, [r7] - bic r0, r0, #1 - orr r0, r0, #1 - strb r0, [r7] - ldrb r0, [r7] - bic r0, r0, #2 - strb r0, [r7] - ldr r0, _037FF004 ; =SNDi_SharedWork - ldr r2, [r0] - cmp r2, #0 - ldrne r1, [r2, #4] - movne r0, #1 - orrne r0, r1, r0, lsl r4 - strne r0, [r2, #4] -_037FEFF0: - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, r8, r9, lr} - bx lr -_037FEFFC: .word (SNDi_Work + 0x540) -_037FF000: .word (SNDi_Work + 0x780) -_037FF004: .word SNDi_SharedWork - - arm_func_start SND_SeqMain -SND_SeqMain: ; 0x037FF008 - stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, lr} - mov r8, r0 - mov r5, #0 - mov r6, r5 - mov sl, #1 - ldr r4, _037FF0A0 ; =_038084AC - mov r9, #36 ; 0x24 -_037FF024: - mul r0, r6, r9 - add r7, r4, r0 - ldrb r1, [r4, r0] - mov r0, r1, lsl #31 - movs r0, r0, lsr #31 - beq _037FF07C - mov r0, r1, lsl #30 - movs r0, r0, lsr #31 - beq _037FF06C - cmp r8, #0 - beq _037FF064 - mov r0, r1, lsl #29 - movs r0, r0, lsr #31 - bne _037FF064 - mov r0, r7 - bl FUN_037FE48C -_037FF064: - mov r0, r7 - bl FUN_037FE1A0 -_037FF06C: - ldrb r0, [r7] - mov r0, r0, lsl #31 - movs r0, r0, lsr #31 - orrne r5, r5, sl, lsl r6 -_037FF07C: - add r6, r6, #1 - cmp r6, #16 - blt _037FF024 - ldr r0, _037FF0A4 ; =SNDi_SharedWork - ldr r0, [r0] - cmp r0, #0 - strne r5, [r0, #4] - ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, lr} - bx lr -_037FF0A0: .word (SNDi_Work + 0x540) -_037FF0A4: .word SNDi_SharedWork - - arm_func_start SND_SeqInit -SND_SeqInit: ; 0x037FF0A8 - stmfd sp!, {lr} - sub sp, sp, #4 - mov lr, #0 - ldr r3, _037FF10C ; =_038084AC - mov r0, #36 ; 0x24 -_037FF0BC: - mul r2, lr, r0 - add ip, r3, r2 - ldrb r1, [r3, r2] - bic r1, r1, #1 - strb r1, [r3, r2] - strb lr, [ip, #1] - add lr, lr, #1 - cmp lr, #16 - blt _037FF0BC - mov r2, #0 - ldr r1, _037FF110 ; =_038086EC -_037FF0E8: - ldrb r0, [r1, r2, lsl #6] - bic r0, r0, #1 - strb r0, [r1, r2, lsl #6] - add r2, r2, #1 - cmp r2, #32 - blt _037FF0E8 - add sp, sp, #4 - ldmia sp!, {lr} - bx lr -_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 1ba24f28..2ca56045 100644 --- a/arm7/asm/SND_unk_037FD440.s +++ b/arm7/asm/SND_unk_037FD440.s @@ -18,8 +18,8 @@ _03807F58: ;0x03807F58 .section .text - arm_func_start FUN_037FD440 -FUN_037FD440: ; 0x037FD440 + arm_func_start TrackMute +TrackMute: ; 0x037FD440 stmdb sp!, {r4, lr} mov r4, r0 cmp r2, #3 @@ -44,22 +44,22 @@ _037FD484: orr r2, r2, #4 strb r2, [r4] mvn r2, #0 - bl FUN_037FE588 + bl TrackReleaseChannels b _037FD4B8 _037FD49C: ldrb r2, [r4] orr r2, r2, #4 strb r2, [r4] mov r2, #127 ; 0x7f - bl FUN_037FE588 + bl TrackReleaseChannels mov r0, r4 - bl FUN_037FE54C + bl TrackFreeChannels _037FD4B8: ldmia sp!, {r4, lr} bx lr - arm_func_start FUN_037FD4C0 -FUN_037FD4C0: ; 0x037FD4C0 + arm_func_start AllocateTrack +AllocateTrack: ; 0x037FD4C0 mov r0, #0 ldr r3, _037FD500 ; =_038086EC b _037FD4F0 @@ -100,8 +100,8 @@ FUN_037FD504: ; 0x037FD504 bx lr _037FD544: .word SNDi_SharedWork - arm_func_start FUN_037FD548 -FUN_037FD548: ; 0x037FD548 + arm_func_start PlayerStepTicks +PlayerStepTicks: ; 0x037FD548 stmdb sp!, {r4, r5, r6, r7, r8, lr} mov r8, r0 mov r7, r1 @@ -111,7 +111,7 @@ FUN_037FD548: ; 0x037FD548 _037FD560: mov r0, r8 mov r1, r5 - bl FUN_037FE460 + bl PlayerGetTrack cmp r0, #0 beq _037FD5A8 ldr r1, [r0, #40] ; 0x28 @@ -187,7 +187,7 @@ _037FD64C: bgt _037FDF84 _037FD670: ldr r0, [r9, #40] ; 0x28 - bl FUN_037FE9B8 + bl SeqCacheFetch add r0, r9, #40 ; 0x28 str r0, [sp, #28] mov r0, #2 @@ -207,7 +207,7 @@ _037FD6B4: mov r4, fp mov r6, sl ldr r0, [r9, #40] ; 0x28 - bl FUN_037FE968 + bl SeqReadByte mov r7, r0 ldr r0, [r9, #40] ; 0x28 add r0, r0, #1 @@ -215,7 +215,7 @@ _037FD6B4: cmp r7, #162 ; 0xa2 bne _037FD700 ldr r0, [r9, #40] ; 0x28 - bl FUN_037FE968 + bl SeqReadByte mov r7, r0 ldr r0, [r9, #40] ; 0x28 add r0, r0, #1 @@ -227,7 +227,7 @@ _037FD700: cmp r7, #160 ; 0xa0 bne _037FD72C ldr r0, [r9, #40] ; 0x28 - bl FUN_037FE968 + bl SeqReadByte mov r7, r0 ldr r0, [r9, #40] ; 0x28 add r0, r0, #1 @@ -239,7 +239,7 @@ _037FD72C: cmp r7, #161 ; 0xa1 bne _037FD758 ldr r0, [r9, #40] ; 0x28 - bl FUN_037FE968 + bl SeqReadByte mov r7, r0 ldr r0, [r9, #40] ; 0x28 add r0, r0, #1 @@ -251,7 +251,7 @@ _037FD758: ands r0, r7, #128 ; 0x80 bne _037FD82C ldr r0, [r9, #40] ; 0x28 - bl FUN_037FE968 + bl SeqReadByte str r0, [sp, #12] ldr r0, [sp, #28] ldr r0, [r0] @@ -363,7 +363,7 @@ _037FD8D8: b _037FDF64 _037FD8F4: ldr r0, [r9, #40] ; 0x28 - bl FUN_037FE968 + bl SeqReadByte mov r4, r0 ldr r0, [r9, #40] ; 0x28 add r0, r0, #1 @@ -375,7 +375,7 @@ _037FD8F4: beq _037FDF64 mov r0, r8 mov r1, r4 - bl FUN_037FE460 + bl PlayerGetTrack movs r4, r0 beq _037FDF64 cmp r4, r9 @@ -385,7 +385,7 @@ _037FD8F4: mov r0, r4 ldr r1, [r9, #36] ; 0x24 mov r2, r5 - bl FUN_037FE6A8 + bl TrackSetSeq b _037FDF64 _037FD958: mov r0, r9 @@ -540,15 +540,15 @@ _037FDB48: mov r0, r9 mov r1, r8 ldr r2, [sp, #40] ; 0x28 - bl FUN_037FE588 + bl TrackReleaseChannels mov r0, r9 - bl FUN_037FE54C + bl TrackFreeChannels b _037FDF64 _037FDB7C: mov r0, r9 mov r1, r8 ldrb r2, [sp, #44] ; 0x2c - bl FUN_037FD440 + bl TrackMute b _037FDF64 _037FDB90: ldrb r1, [sp, #44] ; 0x2c @@ -615,7 +615,7 @@ _037FDC60: b _037FDF64 _037FDC68: ldr r0, [r9, #40] ; 0x28 - bl FUN_037FE968 + bl SeqReadByte str r0, [sp, #16] ldr r0, [r9, #40] ; 0x28 add r0, r0, #1 @@ -989,8 +989,8 @@ _037FE18C: _037FE198: .word 0x0000FFFF _037FE19C: .word FUN_037FE344 - arm_func_start FUN_037FE1A0 -FUN_037FE1A0: ; 0x037FE1A0 + arm_func_start PlayerUpdateChannelVolume +PlayerUpdateChannelVolume: ; 0x037FE1A0 stmdb sp!, {r4, r5, r6, lr} mov r6, r0 mov r5, #0 @@ -998,7 +998,7 @@ FUN_037FE1A0: ; 0x037FE1A0 _037FE1B0: mov r0, r6 mov r1, r5 - bl FUN_037FE460 + bl PlayerGetTrack cmp r0, #0 beq _037FE1D0 mov r1, r6 @@ -1139,8 +1139,8 @@ _037FE3A0: ldmia sp!, {r4, r5, lr} bx lr - arm_func_start FUN_037FE3AC -FUN_037FE3AC: ; 0x037FE3AC + arm_func_start PlayerStop +PlayerStop: ; 0x037FE3AC stmdb sp!, {r4, r5, lr} sub sp, sp, #4 mov r5, r0 @@ -1165,7 +1165,7 @@ FUN_037FE3EC: ; 0x037FE3EC sub sp, sp, #4 mov r5, r0 mov r4, r1 - bl FUN_037FE460 + bl PlayerGetTrack cmp r0, #0 beq _037FE430 mov r1, r5 @@ -1189,14 +1189,14 @@ FUN_037FE440: ; 0x037FE440 stmdb sp!, {r4, lr} mov r4, r0 mvn r2, #0 - bl FUN_037FE588 + bl TrackReleaseChannels mov r0, r4 - bl FUN_037FE54C + bl TrackFreeChannels ldmia sp!, {r4, lr} bx lr - arm_func_start FUN_037FE460 -FUN_037FE460: ; 0x037FE460 + arm_func_start PlayerGetTrack +PlayerGetTrack: ; 0x037FE460 cmp r1, #15 movgt r0, #0 bxgt lr @@ -1209,8 +1209,8 @@ FUN_037FE460: ; 0x037FE460 bx lr _037FE488: .word (SNDi_Work + 0x780) - arm_func_start FUN_037FE48C -FUN_037FE48C: ; 0x037FE48C + arm_func_start PlayerSeqMain +PlayerSeqMain: ; 0x037FE48C stmdb sp!, {r4, r5, r6, r7, lr} sub sp, sp, #4 mov r6, r0 @@ -1232,11 +1232,11 @@ _037FE4B4: _037FE4CC: mov r0, r6 mov r1, r7 - bl FUN_037FD548 + bl PlayerStepTicks cmp r0, #0 beq _037FE4EC mov r0, r6 - bl FUN_037FE3AC + bl PlayerStop b _037FE4F8 _037FE4EC: add r4, r4, #1 @@ -1267,8 +1267,8 @@ _037FE524: bx lr _037FE548: .word SNDi_SharedWork - arm_func_start FUN_037FE54C -FUN_037FE54C: ; 0x037FE54C + arm_func_start TrackFreeChannels +TrackFreeChannels: ; 0x037FE54C stmdb sp!, {r4, r5, lr} sub sp, sp, #4 mov r5, r0 @@ -1287,8 +1287,8 @@ _037FE56C: ldmia sp!, {r4, r5, lr} bx lr - arm_func_start FUN_037FE588 -FUN_037FE588: ; 0x037FE588 + arm_func_start TrackReleaseChannels +TrackReleaseChannels: ; 0x037FE588 stmdb sp!, {r4, r5, r6, r7, lr} sub sp, sp, #4 mov r4, r0 @@ -1322,8 +1322,8 @@ _037FE5E4: ldmia sp!, {r4, r5, r6, r7, lr} bx lr - arm_func_start FUN_037FE5F8 -FUN_037FE5F8: ; 0x037FE5F8 + arm_func_start PlayerSetBank +PlayerSetBank: ; 0x037FE5F8 stmdb sp!, {r4, lr} ldrb r2, [r0] bic r2, r2, #4 @@ -1372,16 +1372,16 @@ _037FE69C: bx lr _037FE6A4: .word SNDi_SharedWork - arm_func_start FUN_037FE6A8 -FUN_037FE6A8: ; 0x037FE6A8 + arm_func_start TrackSetSeq +TrackSetSeq: ; 0x037FE6A8 str r1, [r0, #36] ; 0x24 ldr r1, [r0, #36] ; 0x24 add r1, r1, r2 str r1, [r0, #40] ; 0x28 bx lr - arm_func_start FUN_037FE6BC -FUN_037FE6BC: ; 0x037FE6BC + arm_func_start TrackInit +TrackInit: ; 0x037FE6BC stmdb sp!, {r4, lr} mov r4, r0 mov r0, #0 @@ -1459,14 +1459,14 @@ FUN_037FE7B0: ; 0x037FE7B0 b _037FE810 _037FE7DC: ldr r0, [r4, #40] ; 0x28 - bl FUN_037FE968 + bl SeqReadByte mov r5, r0 ldr r0, [r4, #40] ; 0x28 add r0, r0, #1 str r0, [r4, #40] ; 0x28 b _037FE86C _037FE7F8: - bl FUN_037FE918 + bl TrackReadHword mov r5, r0 b _037FE86C _037FE804: @@ -1475,7 +1475,7 @@ _037FE804: b _037FE86C _037FE810: ldr r0, [r4, #40] ; 0x28 - bl FUN_037FE968 + bl SeqReadByte mov r1, r0 ldr r0, [r4, #40] ; 0x28 add r0, r0, #1 @@ -1486,10 +1486,10 @@ _037FE810: ldrnesh r5, [r0] b _037FE86C _037FE83C: - bl FUN_037FE918 + bl TrackReadHword mov r5, r0, lsl #16 mov r0, r4 - bl FUN_037FE918 + bl TrackReadHword mov r0, r0, lsl #16 mov r4, r0, asr #16 bl SND_CalcRandom @@ -1511,7 +1511,7 @@ FUN_037FE878: ; 0x037FE878 add r4, r6, #40 ; 0x28 _037FE888: ldr r0, [r6, #40] ; 0x28 - bl FUN_037FE968 + bl SeqReadByte ldr r1, [r4] add r1, r1, #1 str r1, [r4] @@ -1529,19 +1529,19 @@ FUN_037FE8B8: ; 0x037FE8B8 sub sp, sp, #4 mov r4, r0 ldr r0, [r4, #40] ; 0x28 - bl FUN_037FE968 + bl SeqReadByte mov r5, r0 ldr r0, [r4, #40] ; 0x28 add r0, r0, #1 str r0, [r4, #40] ; 0x28 ldr r0, [r4, #40] ; 0x28 - bl FUN_037FE968 + bl SeqReadByte ldr r1, [r4, #40] ; 0x28 add r1, r1, #1 str r1, [r4, #40] ; 0x28 orr r5, r5, r0, lsl #8 ldr r0, [r4, #40] ; 0x28 - bl FUN_037FE968 + bl SeqReadByte ldr r1, [r4, #40] ; 0x28 add r1, r1, #1 str r1, [r4, #40] ; 0x28 @@ -1550,19 +1550,19 @@ FUN_037FE8B8: ; 0x037FE8B8 ldmia sp!, {r4, r5, lr} bx lr - arm_func_start FUN_037FE918 -FUN_037FE918: ; 0x037FE918 + arm_func_start TrackReadHword +TrackReadHword: ; 0x037FE918 stmdb sp!, {r4, r5, lr} sub sp, sp, #4 mov r5, r0 ldr r0, [r5, #40] ; 0x28 - bl FUN_037FE968 + bl SeqReadByte mov r4, r0 ldr r0, [r5, #40] ; 0x28 add r0, r0, #1 str r0, [r5, #40] ; 0x28 ldr r0, [r5, #40] ; 0x28 - bl FUN_037FE968 + bl SeqReadByte ldr r1, [r5, #40] ; 0x28 add r1, r1, #1 str r1, [r5, #40] ; 0x28 @@ -1573,8 +1573,8 @@ FUN_037FE918: ; 0x037FE918 ldmia sp!, {r4, r5, lr} bx lr - arm_func_start FUN_037FE968 -FUN_037FE968: ; 0x037FE968 + arm_func_start SeqReadByte +SeqReadByte: ; 0x037FE968 stmdb sp!, {r4, lr} mov r4, r0 ldr r0, _037FE9B0 ; =_03807F50 @@ -1586,7 +1586,7 @@ FUN_037FE968: ; 0x037FE968 bcc _037FE994 _037FE98C: mov r0, r4 - bl FUN_037FE9B8 + bl SeqCacheFetch _037FE994: ldr r0, _037FE9B0 ; =_03807F50 ldr r0, [r0] @@ -1598,8 +1598,8 @@ _037FE994: _037FE9B0: .word _03807F50 _037FE9B4: .word _03807F58 - arm_func_start FUN_037FE9B8 -FUN_037FE9B8: ; 0x037FE9B8 + arm_func_start SeqCacheFetch +SeqCacheFetch: ; 0x037FE9B8 bic r2, r0, #3 ldr r0, _037FE9F0 ; =_03807F50 str r2, [r0] diff --git a/arm7/global.inc b/arm7/global.inc index d7f446e1..9702d548 100644 --- a/arm7/global.inc +++ b/arm7/global.inc @@ -208,21 +208,21 @@ .extern ExChannelVolumeCmp .extern ExChannelStart .extern ExChannelSetup -.extern FUN_037FD440 -.extern FUN_037FD4C0 -.extern FUN_037FD548 -.extern FUN_037FE1A0 -.extern FUN_037FE3AC -.extern FUN_037FE460 -.extern FUN_037FE48C -.extern FUN_037FE54C -.extern FUN_037FE588 -.extern FUN_037FE5F8 -.extern FUN_037FE6A8 -.extern FUN_037FE6BC -.extern FUN_037FE918 -.extern FUN_037FE968 -.extern FUN_037FE9B8 +.extern TrackMute +.extern AllocateTrack +.extern PlayerStepTicks +.extern PlayerUpdateChannelVolume +.extern PlayerStop +.extern PlayerGetTrack +.extern PlayerSeqMain +.extern TrackFreeChannels +.extern TrackReleaseChannels +.extern PlayerSetBank +.extern TrackSetSeq +.extern TrackInit +.extern TrackReadHword +.extern SeqReadByte +.extern SeqCacheFetch .extern SPIi_CheckEntry .extern SPIi_CheckException .extern SPIi_GetException diff --git a/arm7/lib/include/SND_unk_037FD440.h b/arm7/lib/include/SND_unk_037FD440.h new file mode 100644 index 00000000..460217c6 --- /dev/null +++ b/arm7/lib/include/SND_unk_037FD440.h @@ -0,0 +1,22 @@ +#ifndef GUARD_SND_UNK_H +#define GUARD_SND_UNK_H + +#include "nitro/types.h" + +struct SNDTrack *PlayerGetTrack(struct SNDPlayer *player, int track); +void PlayerStop(struct SNDPlayer *); +void TrackMute(struct SNDTrack *track, struct SNDPlayer *player, int muteMode); +void TrackReleaseChannels(struct SNDTrack *track, struct SNDPlayer *player, int release); +void TrackFreeChannels(struct SNDTrack *track); +BOOL PlayerStepTicks(struct SNDPlayer *player, u32 ticks); +void PlayerSetBank(struct SNDPlayer *player, struct SNDBankData *bankData); +int AllocateTrack(void); +void TrackInit(struct SNDTrack *track); +void TrackSetSeq(struct SNDTrack *track, const void *seq, u32 offset); +void SeqCacheFetch(const void *addr); +u8 SeqReadByte(const void *addr); +u16 TrackReadHword(struct SNDTrack *track); +void PlayerSeqMain(struct SNDPlayer *player); +void PlayerUpdateChannelVolume(struct SNDPlayer *player); + +#endif //GUARD_SND_UNK_H diff --git a/arm7/lib/src/SND_seq.c b/arm7/lib/src/SND_seq.c new file mode 100644 index 00000000..3153c392 --- /dev/null +++ b/arm7/lib/src/SND_seq.c @@ -0,0 +1,266 @@ +#include "SND_seq.h" + +#include "SND_main.h" +#include "SND_work.h" +#include "SND_unk_037FD440.h" + +void SND_SeqInit(void) { + for (int i = 0; i < SND_PLAYER_COUNT; i++) { + struct SNDPlayer *ply = &SNDi_Work.players[i]; + + ply->flags.active = FALSE; + ply->playerId = (u8)i; + } + + for (int i = 0; i < SND_TRACK_COUNT; i++) { + struct SNDTrack *trk = &SNDi_Work.tracks[i]; + + trk->flags.active = FALSE; + } +} + +void SND_SeqMain(BOOL step) { + struct SNDPlayer *ply; + int i; + u32 playerStatus = 0; + + for (i = 0; i < SND_PLAYER_COUNT; i++) { + ply = &SNDi_Work.players[i]; + + if (!ply->flags.active) + continue; + + if (ply->flags.prepared) { + if (step && !ply->flags.paused) + PlayerSeqMain(ply); + PlayerUpdateChannelVolume(ply); + } + + if (ply->flags.active) + playerStatus |= 1 << i; + } + + if (SNDi_SharedWork) + SNDi_SharedWork->playerStatus = playerStatus; +} + +void SND_PrepareSeq(int player, const void *seq, u32 offset, struct SNDBankData *bankData) { + struct SNDPlayer *ply = &SNDi_Work.players[player]; + + if (ply->flags.active) + PlayerStop(ply); + + PlayerSetBank(ply, bankData); + + int allocTrkIdx = AllocateTrack(); + + if (allocTrkIdx < 0) + return; + + struct SNDTrack *trk = &SNDi_Work.tracks[allocTrkIdx]; + TrackInit(trk); + TrackSetSeq(trk, seq, offset); + ply->tracks[0] = (u8)allocTrkIdx; + SeqCacheFetch(trk->cur); + + u8 cmd = SeqReadByte(trk->cur); + + trk->cur++; + + if (cmd != 0xFE) { + trk->cur--; + } else { + int track; + u16 trackMask; + + for (trackMask = (u16)(TrackReadHword(trk) >> 1), track = 1; trackMask != 0; track++, trackMask >>= 1) { + if (trackMask & 1) { + allocTrkIdx = AllocateTrack(); + if (allocTrkIdx < 0) + break; + TrackInit(&SNDi_Work.tracks[allocTrkIdx]); + ply->tracks[track] = (u8)allocTrkIdx; + } + } + } + + ply->flags.active = TRUE; + ply->flags.prepared = FALSE; + + if (SNDi_SharedWork) { + SNDi_SharedWork->playerStatus |= 1 << player; + } +} + +void SND_StartPreparedSeq(int player) { + SNDi_Work.players[player].flags.prepared = TRUE; +} + +void SND_StartSeq(int player, const void *seq, u32 offset, struct SNDBankData *bankData) { + SND_PrepareSeq(player, seq, offset, bankData); + SND_StartPreparedSeq(player); +} + +void SND_StopSeq(int player) { + struct SNDPlayer *ply = &SNDi_Work.players[player]; + + if (ply->flags.active) { + PlayerStop(ply); + + if (SNDi_SharedWork) { + SNDi_SharedWork->playerStatus &= ~(1 << player); + } + } +} + +void SND_PauseSeq(int player, BOOL flag) { + struct SNDPlayer *ply = &SNDi_Work.players[player]; + + ply->flags.paused = flag; + + if (flag) { + for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) { + struct SNDTrack *trk = PlayerGetTrack(ply, i); + + if (trk) { + TrackReleaseChannels(trk, ply, 127); + TrackFreeChannels(trk); + } + } + } +} + +void SND_SkipSeq(int player, u32 ticks) { + struct SNDPlayer *ply = &SNDi_Work.players[player]; + + for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) { + struct SNDTrack *trk = PlayerGetTrack(ply, i); + + if (trk) { + TrackReleaseChannels(trk, ply, 127); + TrackFreeChannels(trk); + } + } + + SND_StopIntervalTimer(); + + u32 i; + for (i = 0; i < ticks; i++) { + if (PlayerStepTicks(ply, 0)) { + PlayerStop(ply); + break; + } + } + + SND_StartIntervalTimer(); + + if (SNDi_SharedWork) { + SNDi_SharedWork->players[ply->playerId].tickCounter += i; + } +} + +void SND_SetTrackMute(int player, u32 trackMask, int muteMode) { + struct SNDPlayer *ply = &SNDi_Work.players[player]; + + for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER && trackMask != 0; i++, trackMask >>= 1) { + if (trackMask & 1) { + struct SNDTrack *trk = PlayerGetTrack(ply, i); + + if (trk) { + TrackMute(trk, ply, muteMode); + } + } + } +} + +void SND_SetTrackAllocatableChannel(int player, u32 trackMask, u32 channelMask) { + struct SNDPlayer *ply = &SNDi_Work.players[player]; + + for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER && trackMask != 0; i++, trackMask >>= 1) { + if (trackMask & 1) { + struct SNDTrack *trk = PlayerGetTrack(ply, i); + + if (trk) { + trk->channelMask = (u16)channelMask; + trk->flags.channelMask = TRUE; + } + } + } +} + +void SND_InvalidateSeq(const void *start, const void *end) { + struct SNDPlayer *ply; + struct SNDTrack *trk; + int i; + int j; + + for (i = 0; i < SND_PLAYER_COUNT; i++) { + ply = &SNDi_Work.players[i]; + + if (!ply->flags.active) + continue; + + for (j = 0; j < SND_TRACK_COUNT_PER_PLAYER; j++) { + trk = PlayerGetTrack(ply, j); + + if (!trk) + continue; + + if (start <= trk->cur && trk->cur <= end) { + PlayerStop(ply); + break; + } + } + } +} + +void SND_InvalidateBank(const void *start, const void *end) { + for (int i = 0; i < SND_PLAYER_COUNT; i++) { + struct SNDPlayer *ply = &SNDi_Work.players[i]; + + if (ply->flags.active && start <= ply->bank && ply->bank <= end) + PlayerStop(ply); + } +} + +void SNDi_SetPlayerParam(int player, u32 offset, u32 data, int size) { + struct SNDPlayer *ply = &SNDi_Work.players[player]; + + switch (size) { + case 1: + *(u8 *)((u8 *)ply + offset) = (u8)data; + break; + case 2: + *(u16 *)((u8 *)ply + offset) = (u16)data; + break; + case 4: + *(u32 *)((u8 *)ply + offset) = (u32)data; + break; + } +} + +void SNDi_SetTrackParam(int player, u32 trackMask, u32 offset, u32 data, int size) { + struct SNDPlayer *ply = &SNDi_Work.players[player]; + + for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER && trackMask != 0; i++, trackMask >>= 1) { + if (!(trackMask & 1)) + continue; + + struct SNDTrack *trk = PlayerGetTrack(ply, i); + + if (!trk) + continue; + + switch (size) { + case 1: + *(u8 *)((u8 *)trk + offset) = (u8)data; + break; + case 2: + *(u16 *)((u8 *)trk + offset) = (u16)data; + break; + case 4: + *(u32 *)((u8 *)trk + offset) = (u32)data; + break; + } + } +} -- cgit v1.2.3 From 0da1dc3cb5db999b5035c28858134ba6fbcc661c Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Fri, 9 Jul 2021 18:19:29 +0200 Subject: arm7: decompile SND --- arm7/asm/SND.s | 504 --------------------------------------- arm7/lib/include/PM.h | 9 + arm7/lib/include/SND.h | 6 + arm7/lib/include/SND_channel.h | 48 ++-- arm7/lib/include/SND_exChannel.h | 2 +- arm7/lib/include/registers.h | 30 ++- arm7/lib/include/syscall.h | 2 + arm7/lib/src/SND.c | 201 ++++++++++++++++ 8 files changed, 265 insertions(+), 537 deletions(-) delete mode 100644 arm7/asm/SND.s create mode 100644 arm7/lib/include/PM.h create mode 100644 arm7/lib/src/SND.c diff --git a/arm7/asm/SND.s b/arm7/asm/SND.s deleted file mode 100644 index 8bab9030..00000000 --- a/arm7/asm/SND.s +++ /dev/null @@ -1,504 +0,0 @@ -#todo split further - - .include "asm/macros.inc" - .include "global.inc" - - .section .data - - .global sMasterPan -sMasterPan: - .word 0xFFFFFFFF - - .section .bss - - .global sSurroundDecay -sSurroundDecay: ;0x03807A0C - .space 0x03807A10 - 0x03807A0C - - .global sOrgPan -sOrgPan: ;0x03807A10 - .space 0x03807A20 - 0x03807A10 - - .global sOrgVolume -sOrgVolume: ;0x03807A20 - .space 0x03807A30 - 0x03807A20 - - .section .text - - arm_func_start SND_SetOutputSelector -SND_SetOutputSelector: ; 0x037FBA0C - ldr ip, _037FBA40 ; =0x04000501 - ldrb ip, [ip] - ands ip, ip, #128 ; 0x80 - movne ip, #1 - moveq ip, #0 - mov ip, ip, lsl #7 - orr r3, ip, r3, lsl #5 - orr r2, r3, r2, lsl #4 - orr r1, r2, r1, lsl #2 - orr r1, r0, r1 - ldr r0, _037FBA40 ; =0x04000501 - strb r1, [r0] - bx lr -_037FBA40: .word 0x04000501 - - arm_func_start SND_SetMasterVolume -SND_SetMasterVolume: ; 0x037FBA44 - ldr r1, _037FBA50 ; =0x04000500 - strb r0, [r1] - bx lr -_037FBA50: .word 0x04000500 - - arm_func_start SND_EndSleep -SND_EndSleep: ; 0x037FBA54 - stmfd sp!, {lr} - sub sp, sp, #4 - ldr r1, _037FBA94 ; =0x04000304 - ldrh r0, [r1] - orr r0, r0, #1 - strh r0, [r1] - mov r0, #1 - bl PMi_SetControl - mov r0, #256 ; 0x100 - bl FUN_037FBA9C - ldr r0, _037FBA98 ; =0x0007AB80 - bl OS_SpinWait - bl SND_Enable - add sp, sp, #4 - ldmia sp!, {lr} - bx lr -_037FBA94: .word 0x04000304 -_037FBA98: .word 0x0007AB80 - - arm_func_start FUN_037FBA9C -FUN_037FBA9C: ; 0x037FBA9C - ldr ip, _037FBAA4 ; =SVC_SoundBiasSet - bx ip -_037FBAA4: .word SVC_SoundBiasSet - - arm_func_start SND_BeginSleep -SND_BeginSleep: ; 0x037FBAA8 - stmfd sp!, {lr} - sub sp, sp, #4 - bl SND_Disable - mov r0, #128 ; 0x80 - bl FUN_037FBAEC - mov r0, #262144 ; 0x40000 - bl OS_SpinWait - mov r0, #1 - bl PMi_ResetControl - ldr r1, _037FBAE8 ; =0x04000304 - ldrh r0, [r1] - bic r0, r0, #1 - strh r0, [r1] - add sp, sp, #4 - ldmia sp!, {lr} - bx lr -_037FBAE8: .word 0x04000304 - - arm_func_start FUN_037FBAEC -FUN_037FBAEC: ; 0x037FBAEC - ldr ip, _037FBAF4 ; =SVC_SoundBiasReset - bx ip -_037FBAF4: .word SVC_SoundBiasReset - - arm_func_start SND_Shutdown -SND_Shutdown: ; 0x037FBAF8 - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - bl SND_Disable - mov r5, #0 - mov r4, #1 -_037FBB0C: - mov r0, r5 - mov r1, r4 - bl SND_StopChannel - add r5, r5, #1 - cmp r5, #16 - blt _037FBB0C - mov r1, #0 - ldr r0, _037FBB44 ; =0x04000508 - strb r1, [r0] - ldr r0, _037FBB48 ; =0x04000509 - strb r1, [r0] - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr -_037FBB44: .word 0x04000508 -_037FBB48: .word 0x04000509 - - arm_func_start SND_Disable -SND_Disable: ; 0x037FBB4C - ldr r1, _037FBB60 ; =0x04000501 - ldrb r0, [r1] - bic r0, r0, #128 ; 0x80 - strb r0, [r1] - bx lr -_037FBB60: .word 0x04000501 - - arm_func_start SND_Enable -SND_Enable: ; 0x037FBB64 - ldr r1, _037FBB78 ; =0x04000501 - ldrb r0, [r1] - orr r0, r0, #128 ; 0x80 - strb r0, [r1] - bx lr -_037FBB78: .word 0x04000501 - - arm_func_start CalcSurroundDecay -CalcSurroundDecay: ; 0x037FBB7C - cmp r1, #24 - bge _037FBBAC - ldr r2, _037FBBE0 ; =sSurroundDecay - ldr r3, [r2] - ldr r2, _037FBBE4 ; =0x00007FFF - sub r2, r2, r3 - add r1, r1, #40 ; 0x28 - mul r1, r3, r1 - add r1, r1, r2, lsl #6 - mul r1, r0, r1 - mov r0, r1, asr #21 - bx lr -_037FBBAC: - cmp r1, #104 ; 0x68 - bxle lr - ldr r2, _037FBBE0 ; =sSurroundDecay - ldr ip, [r2] - ldr r2, _037FBBE4 ; =0x00007FFF - add r3, ip, r2 - rsb r2, ip, #0 - sub r1, r1, #40 ; 0x28 - mul r1, r2, r1 - add r1, r1, r3, lsl #6 - mul r1, r0, r1 - mov r0, r1, asr #21 - bx lr -_037FBBE0: .word sSurroundDecay -_037FBBE4: .word 0x00007FFF - - arm_func_start SNDi_SetSurroundDecay -SNDi_SetSurroundDecay: ; 0x037FBBE8 - stmdb sp!, {r4, r5, r6, r7, r8, lr} - ldr r1, _037FBC40 ; =sSurroundDecay - str r0, [r1] - mov r4, #0 - ldr r6, _037FBC44 ; =sOrgVolume - mov r7, #1 - ldr r5, _037FBC48 ; =0x0000FFF5 -_037FBC04: - mov r0, r7, lsl r4 - ands r0, r0, r5 - beq _037FBC2C - mov r8, r4, lsl #4 - add r0, r8, #67108864 ; 0x4000000 - ldrb r1, [r0, #1026] ; 0x402 - ldrb r0, [r6, r4] - bl CalcSurroundDecay - add r1, r8, #67108864 ; 0x4000000 - strb r0, [r1, #1024] ; 0x400 -_037FBC2C: - add r4, r4, #1 - cmp r4, #16 - blt _037FBC04 - ldmia sp!, {r4, r5, r6, r7, r8, lr} - bx lr -_037FBC40: .word sSurroundDecay -_037FBC44: .word sOrgVolume -_037FBC48: .word 0x0000FFF5 - - arm_func_start SND_GetChannelControl -SND_GetChannelControl: ; 0x037FBC4C - mov r0, r0, lsl #4 - add r0, r0, #67108864 ; 0x4000000 - ldr r0, [r0, #1024] ; 0x400 - bx lr - - arm_func_start SND_SetMasterPan -SND_SetMasterPan: ; 0x037FBC5C - ldr r1, _037FBCB8 ; =sMasterPan - str r0, [r1] - cmp r0, #0 - blt _037FBC90 - mov r2, #0 - and r1, r0, #255 ; 0xff -_037FBC74: - mov r0, r2, lsl #4 - add r0, r0, #67108864 ; 0x4000000 - strb r1, [r0, #1026] ; 0x402 - add r2, r2, #1 - cmp r2, #16 - blt _037FBC74 - bx lr -_037FBC90: - mov r3, #0 - ldr r2, _037FBCBC ; =sOrgPan -_037FBC98: - ldrb r1, [r2, r3] - mov r0, r3, lsl #4 - add r0, r0, #67108864 ; 0x4000000 - strb r1, [r0, #1026] ; 0x402 - add r3, r3, #1 - cmp r3, #16 - blt _037FBC98 - bx lr -_037FBCB8: .word sMasterPan -_037FBCBC: .word sOrgPan - - arm_func_start SND_IsChannelActive -SND_IsChannelActive: ; 0x037FBCC0 - mov r0, r0, lsl #4 - add r0, r0, #67108864 ; 0x4000000 - ldrb r0, [r0, #1027] ; 0x403 - ands r0, r0, #128 ; 0x80 - movne r0, #1 - moveq r0, #0 - bx lr - - arm_func_start SND_SetChannelPan -SND_SetChannelPan: ; 0x037FBCDC - stmdb sp!, {r4, lr} - ldr r2, _037FBD44 ; =sOrgPan - strb r1, [r2, r0] - ldr r2, _037FBD48 ; =sMasterPan - ldr r2, [r2] - cmp r2, #0 - movge r1, r2 - mov r4, r0, lsl #4 - add r2, r4, #67108864 ; 0x4000000 - strb r1, [r2, #1026] ; 0x402 - ldr r2, _037FBD4C ; =sSurroundDecay - ldr r2, [r2] - cmp r2, #0 - ble _037FBD3C - mov r2, #1 - mov r3, r2, lsl r0 - ldr r2, _037FBD50 ; =0x0000FFF5 - ands r2, r3, r2 - beq _037FBD3C - ldr r2, _037FBD54 ; =sOrgVolume - ldrb r0, [r2, r0] - bl CalcSurroundDecay - add r1, r4, #67108864 ; 0x4000000 - strb r0, [r1, #1024] ; 0x400 -_037FBD3C: - ldmia sp!, {r4, lr} - bx lr -_037FBD44: .word sOrgPan -_037FBD48: .word sMasterPan -_037FBD4C: .word sSurroundDecay -_037FBD50: .word 0x0000FFF5 -_037FBD54: .word sOrgVolume - - arm_func_start SND_SetChannelTimer -SND_SetChannelTimer: ; 0x037FBD58 - rsb r1, r1, #65536 ; 0x10000 - mov r0, r0, lsl #4 - add r0, r0, #67108864 ; 0x4000000 - add r0, r0, #1024 ; 0x400 - strh r1, [r0, #8] - bx lr - - arm_func_start SND_SetChannelVolume -SND_SetChannelVolume: ; 0x037FBD70 - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r5, r0 - mov r4, r2 - ldr r0, _037FBDE8 ; =sOrgVolume - strb r1, [r0, r5] - ldr r0, _037FBDEC ; =sSurroundDecay - ldr r0, [r0] - cmp r0, #0 - ble _037FBDC8 - mov r0, #1 - mov r2, r0, lsl r5 - ldr r0, _037FBDF0 ; =0x0000FFF5 - ands r0, r2, r0 - beq _037FBDC8 - mov r0, r5, lsl #4 - add r0, r0, #67108864 ; 0x4000000 - ldrb r2, [r0, #1026] ; 0x402 - mov r0, r1 - mov r1, r2 - bl CalcSurroundDecay - mov r1, r0 -_037FBDC8: - orr r1, r1, r4, lsl #8 - mov r0, r5, lsl #4 - add r0, r0, #67108864 ; 0x4000000 - add r0, r0, #1024 ; 0x400 - strh r1, [r0] - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr -_037FBDE8: .word sOrgVolume -_037FBDEC: .word sSurroundDecay -_037FBDF0: .word 0x0000FFF5 - - arm_func_start SND_StopChannel -SND_StopChannel: ; 0x037FBDF4 - mov r3, r0, lsl #4 - ldr r2, _037FBE1C ; =0x04000400 - add ip, r2, r0, lsl #4 - add r0, r3, #67108864 ; 0x4000000 - ldr r0, [r0, #1024] ; 0x400 - bic r2, r0, #-2147483648 ; 0x80000000 - ands r0, r1, #1 - orrne r2, r2, #32768 ; 0x8000 - str r2, [ip] - bx lr -_037FBE1C: .word 0x04000400 - - arm_func_start SND_SetupChannelNoise -SND_SetupChannelNoise: ; 0x037FBE20 - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #4 - mov r7, r2 - mov r6, r3 - ldr r5, [sp, #24] - mov r4, r0, lsl #4 - ldr r2, _037FBEBC ; =sOrgPan - strb r5, [r2, r0] - ldr r2, _037FBEC0 ; =sMasterPan - ldr r2, [r2] - cmp r2, #0 - movge r5, r2 - ldr r2, _037FBEC4 ; =sOrgVolume - strb r1, [r2, r0] - ldr r2, _037FBEC8 ; =sSurroundDecay - ldr r2, [r2] - cmp r2, #0 - ble _037FBE8C - mov r2, #1 - mov r2, r2, lsl r0 - ldr r0, _037FBECC ; =0x0000FFF5 - ands r0, r2, r0 - beq _037FBE8C - mov r0, r1 - mov r1, r5 - bl CalcSurroundDecay - mov r1, r0 -_037FBE8C: - mov r0, r5, lsl #16 - orr r0, r0, #1610612736 ; 0x60000000 - orr r0, r0, r7, lsl #8 - orr r1, r1, r0 - add r0, r4, #67108864 ; 0x4000000 - str r1, [r0, #1024] ; 0x400 - rsb r1, r6, #65536 ; 0x10000 - add r0, r0, #1024 ; 0x400 - strh r1, [r0, #8] - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, lr} - bx lr -_037FBEBC: .word sOrgPan -_037FBEC0: .word sMasterPan -_037FBEC4: .word sOrgVolume -_037FBEC8: .word sSurroundDecay -_037FBECC: .word 0x0000FFF5 - - arm_func_start SND_SetupChannelPsg -SND_SetupChannelPsg: ; 0x037FBED0 - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #4 - mov r7, r1 - mov r6, r3 - ldr r5, [sp, #28] - mov r4, r0, lsl #4 - ldr r1, _037FBF74 ; =sOrgPan - strb r5, [r1, r0] - ldr r1, _037FBF78 ; =sMasterPan - ldr r1, [r1] - cmp r1, #0 - movge r5, r1 - ldr r1, _037FBF7C ; =sOrgVolume - strb r2, [r1, r0] - ldr r1, _037FBF80 ; =sSurroundDecay - ldr r1, [r1] - cmp r1, #0 - ble _037FBF3C - mov r1, #1 - mov r1, r1, lsl r0 - ldr r0, _037FBF84 ; =0x0000FFF5 - ands r0, r1, r0 - beq _037FBF3C - mov r0, r2 - mov r1, r5 - bl CalcSurroundDecay - mov r2, r0 -_037FBF3C: - mov r0, r7, lsl #24 - orr r0, r0, #1610612736 ; 0x60000000 - orr r0, r0, r5, lsl #16 - orr r0, r0, r6, lsl #8 - orr r1, r2, r0 - add r0, r4, #67108864 ; 0x4000000 - str r1, [r0, #1024] ; 0x400 - ldr r1, [sp, #24] - rsb r1, r1, #65536 ; 0x10000 - add r0, r0, #1024 ; 0x400 - strh r1, [r0, #8] - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, lr} - bx lr -_037FBF74: .word sOrgPan -_037FBF78: .word sMasterPan -_037FBF7C: .word sOrgVolume -_037FBF80: .word sSurroundDecay -_037FBF84: .word 0x0000FFF5 - - arm_func_start SND_SetupChannelPcm -SND_SetupChannelPcm: ; 0x037FBF88 - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r8, r1 - mov r7, r2 - mov r6, r3 - ldr r1, [sp, #32] - ldr r5, [sp, #44] ; 0x2c - mov r4, r0, lsl #4 - ldr r2, _037FC044 ; =sOrgPan - strb r5, [r2, r0] - ldr r2, _037FC048 ; =sMasterPan - ldr r2, [r2] - cmp r2, #0 - movge r5, r2 - ldr r2, _037FC04C ; =sOrgVolume - strb r1, [r2, r0] - ldr r2, _037FC050 ; =sSurroundDecay - ldr r2, [r2] - cmp r2, #0 - ble _037FBFF8 - mov r2, #1 - mov r2, r2, lsl r0 - ldr r0, _037FC054 ; =0x0000FFF5 - ands r0, r2, r0 - beq _037FBFF8 - mov r0, r1 - mov r1, r5 - bl CalcSurroundDecay - mov r1, r0 -_037FBFF8: - ldr r2, [sp, #36] ; 0x24 - mov r0, r7, lsl #29 - orr r0, r0, r6, lsl #27 - orr r0, r0, r5, lsl #16 - orr r0, r0, r2, lsl #8 - orr r0, r1, r0 - add r1, r4, #67108864 ; 0x4000000 - str r0, [r1, #1024] ; 0x400 - ldr r0, [sp, #40] ; 0x28 - rsb r2, r0, #65536 ; 0x10000 - add r0, r1, #1024 ; 0x400 - strh r2, [r0, #8] - ldr r2, [sp, #24] - strh r2, [r0, #10] - ldr r0, [sp, #28] - str r0, [r1, #1036] ; 0x40c - str r8, [r1, #1028] ; 0x404 - ldmia sp!, {r4, r5, r6, r7, r8, lr} - bx lr -_037FC044: .word sOrgPan -_037FC048: .word sMasterPan -_037FC04C: .word sOrgVolume -_037FC050: .word sSurroundDecay -_037FC054: .word 0x0000FFF5 diff --git a/arm7/lib/include/PM.h b/arm7/lib/include/PM.h new file mode 100644 index 00000000..df2185be --- /dev/null +++ b/arm7/lib/include/PM.h @@ -0,0 +1,9 @@ +#ifndef GUARD_PM_H +#define GUARD_PM_H + +#include "nitro/types.h" + +void PMi_SetControl(int ctrl); +void PMi_ResetControl(int ctrl); + +#endif //GUARD_PM_H diff --git a/arm7/lib/include/SND.h b/arm7/lib/include/SND.h index c417ab0e..196377ed 100644 --- a/arm7/lib/include/SND.h +++ b/arm7/lib/include/SND.h @@ -4,6 +4,12 @@ #include "nitro/types.h" void SND_Enable(void); +void SND_Disable(void); +void SND_Shutdown(void); +void SND_BeginSleep(void); +void SND_EndSleep(void); +void SND_SetMasterPan(int pan); +void SND_SetMasterVolume(int vol); void SND_SetOutputSelector(int leftOutputFrom, int rightOutputFrom, int outputCh1ToMixer, int outputCh3ToMixer); #endif //GUARD_SND_H diff --git a/arm7/lib/include/SND_channel.h b/arm7/lib/include/SND_channel.h index 8b74b579..9e015beb 100644 --- a/arm7/lib/include/SND_channel.h +++ b/arm7/lib/include/SND_channel.h @@ -8,40 +8,40 @@ void SNDi_SetSurroundDecay(int decay); void SND_SetupChannelPcm( - s32 chnIdx, + int chnIdx, const void *data, - s32 format, - s32 loop, - s32 loopStart, - s32 loopLen, - s32 volume, - s32 volumeDiv, - s32 timer, - s32 pan + int format, + int loop, + int loopStart, + int loopLen, + int volume, + int volumeDiv, + int timer, + int pan ); void SND_SetupChannelPsg( - s32 chnIdx, - s32 waveDuty, - s32 volume, - s32 volumeDiv, - s32 timer, - s32 pan + int chnIdx, + int waveDuty, + int volume, + int volumeDiv, + int timer, + int pan ); void SND_SetupChannelNoise( - s32 chnIdx, - s32 volume, - s32 volumeDiv, - s32 timer, - s32 pan + int chnIdx, + int volume, + int volumeDiv, + int timer, + int pan ); -void SND_StopChannel(s32 chnIdx, s32 hold); +void SND_StopChannel(int chnIdx, int hold); -void SND_SetChannelVolume(s32 chnIdx, s32 volume, s32 volumeDiv); -void SND_SetChannelPan(s32 chnIdx, s32 pan); -void SND_SetChannelTimer(s32 chnIdx, s32 timer); +void SND_SetChannelVolume(int chnIdx, int volume, int volumeDiv); +void SND_SetChannelPan(int chnIdx, int pan); +void SND_SetChannelTimer(int chnIdx, int timer); u32 SND_GetChannelControl(int idx); diff --git a/arm7/lib/include/SND_exChannel.h b/arm7/lib/include/SND_exChannel.h index 038a1a49..66a1d78f 100644 --- a/arm7/lib/include/SND_exChannel.h +++ b/arm7/lib/include/SND_exChannel.h @@ -21,7 +21,7 @@ void SND_ReleaseExChannel(struct SNDExChannel *chn); BOOL SND_IsExChannelActive(struct SNDExChannel *chn); struct SNDExChannel *SND_AllocExChannel(u32 channelMask, int priority, u32 flags, SNDExChannelCallback callback, void *callbackUserData); void SND_FreeExChannel(struct SNDExChannel *chn); -BOOL SND_IsChannelActive(s32 idx); +BOOL SND_IsChannelActive(int idx); void SND_InvalidateWave(const void *start, const void *end); // TODO internal functions, move these so exChannel diff --git a/arm7/lib/include/registers.h b/arm7/lib/include/registers.h index e9280957..f30d237a 100644 --- a/arm7/lib/include/registers.h +++ b/arm7/lib/include/registers.h @@ -5,14 +5,28 @@ #define reg_EXTKEYIN (*(REGType16v *)0x4000136) -#define reg_SOUNDxCNT_STAT(x) (*((REGType8v *)0x4000403 + ((int)(x) * 0x10))) -#define reg_SOUNDxCNT(x) (*((REGType32v *)0x4000400 + ((int)x) * 0x10)) -#define reg_SOUNDxSAD(x) (*((REGType32v *)0x4000404 + ((int)x) * 0x10)) -#define reg_SOUNDxTMR(x) (*((REGType16v *)0x4000408 + ((int)x) * 0x10)) -#define reg_SOUNDxPNT(x) (*((REGType16v *)0x400040A + ((int)x) * 0x10)) -#define reg_SOUNDxLEN(x) (*((REGType32v *)0x400040C + ((int)x) * 0x10)) - -#define reg_SNDCAPxCNT(x) (*((REGType8v *)0x4000508 + ((int)(x)))) +#define reg_POWCNT2 (*(REGType16v *)0x4000304) + + +#define reg_SOUNDCNT_VOL (*(REGType8v *)0x4000500) +#define reg_SOUNDCNT_MIX (*(REGType8v *)0x4000501) + +#define reg_SOUNDxCNT_VOL(x) (*(REGType8v *)(0x4000400 + ((int)(x) * 0x10))) +#define reg_SOUNDxCNT_VOLS(x) (*(REGType16v *)(0x4000400 + ((int)(x) * 0x10))) +#define reg_SOUNDxCNT_PAN(x) (*(REGType8v *)(0x4000402 + ((int)(x) * 0x10))) +#define reg_SOUNDxCNT_STAT(x) (*(REGType8v *)(0x4000403 + ((int)(x) * 0x10))) +#define reg_SOUNDxCNT(x) (*(REGType32v *)(0x4000400 + ((int)x) * 0x10)) +#define reg_SOUNDoffCNT(off) (*(REGType32v *)(0x4000400 + (int)(off))) +#define reg_SOUNDxSAD(x) (*(REGType32v *)(0x4000404 + ((int)x) * 0x10)) +#define reg_SOUNDoffSAD(off) (*(REGType32v *)(0x4000404 + (int)(off))) +#define reg_SOUNDxTMR(x) (*(REGType16v *)(0x4000408 + ((int)x) * 0x10)) +#define reg_SOUNDoffTMR(off) (*(REGType16v *)(0x4000408 + (int)(off))) +#define reg_SOUNDxPNT(x) (*(REGType16v *)(0x400040A + ((int)x) * 0x10)) +#define reg_SOUNDoffPNT(off) (*(REGType16v *)(0x400040A + (int)(off))) +#define reg_SOUNDxLEN(x) (*(REGType32v *)(0x400040C + ((int)x) * 0x10)) +#define reg_SOUNDoffLEN(off) (*(REGType32v *)(0x400040C + (int)(off))) + +#define reg_SNDCAPxCNT(x) (*(REGType8v *)(0x4000508 + ((int)(x)))) #define EXTKEYIN_X (1<<0) #define EXTKEYIN_Y (1<<1) diff --git a/arm7/lib/include/syscall.h b/arm7/lib/include/syscall.h index 1ac6fe49..579fd790 100644 --- a/arm7/lib/include/syscall.h +++ b/arm7/lib/include/syscall.h @@ -4,5 +4,7 @@ void SVC_WaitByLoop(u32 ct); u8 SVC_GetVolumeTable(int idx); u16 SVC_GetPitchTable(int idx); +void SVC_SoundBiasSet(int step); +void SVC_SoundBiasReset(int step); #endif //POKEDIAMOND_ARM7_SYSCALL_H diff --git a/arm7/lib/src/SND.c b/arm7/lib/src/SND.c new file mode 100644 index 00000000..6c17fa69 --- /dev/null +++ b/arm7/lib/src/SND.c @@ -0,0 +1,201 @@ +#include "SND.h" + +#include "registers.h" +#include "syscall.h" + +#include "OS_system.h" +#include "PM.h" +#include "SND_exChannel.h" +#include "SND_work.h" +#include "SND_channel.h" + +static int sMasterPan = -1; + +static u8 sOrgVolume[SND_CHANNEL_COUNT]; +static u8 sOrgPan[SND_CHANNEL_COUNT]; +static int sSurroundDecay; + +static int CalcSurroundDecay(int vol, int pan); + +void SND_SetupChannelPcm(int chnIdx, const void *data, int format, int loop, int loopStart, int loopLength, int volume, int volumeDiv, int timer, int pan) { + int off = chnIdx * 0x10; + + sOrgPan[chnIdx] = (u8)pan; + if (sMasterPan >= 0) + pan = sMasterPan; + + sOrgVolume[chnIdx] = (u8)volume; + if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) { + volume = CalcSurroundDecay(volume, pan); + } + + reg_SOUNDoffCNT(off) = (u32)((format << 29) | (loop << 27) | (pan << 16) | (volumeDiv << 8) | (volume)); + reg_SOUNDoffTMR(off) = (u16)(0x10000 - timer); + reg_SOUNDoffPNT(off) = (u16)loopStart; + reg_SOUNDoffLEN(off) = (u32)loopLength; + reg_SOUNDoffSAD(off) = (u32)data; +} + +void SND_SetupChannelPsg(int chnIdx, int duty, int volume, int volumeDiv, int timer, int pan) { + int off = chnIdx * 0x10; + + sOrgPan[chnIdx] = (u8)pan; + if (sMasterPan >= 0) + pan = sMasterPan; + + sOrgVolume[chnIdx] = (u8)volume; + if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) { + volume = CalcSurroundDecay(volume, pan); + } + + reg_SOUNDoffCNT(off) = (u32)(0x60000000 | (duty << 24) | (pan << 16) | (volumeDiv << 8) | volume); + reg_SOUNDoffTMR(off) = (u16)(0x10000 - timer); +} + +void SND_SetupChannelNoise(int chnIdx, int volume, int volumeDiv, int timer, int pan) { + int off = chnIdx * 0x10; + + sOrgPan[chnIdx] = (u8)pan; + if (sMasterPan >= 0) + pan = sMasterPan; + + sOrgVolume[chnIdx] = (u8)volume; + if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) { + volume = CalcSurroundDecay(volume, pan); + } + + reg_SOUNDoffCNT(off) = (u32)(0x60000000 | (pan << 16) | (volumeDiv << 8) | volume); + reg_SOUNDoffTMR(off) = (u16)(0x10000 - timer); +} + +void SND_StopChannel(int idx, int hold) { + vu32 *reg = ®_SOUNDxCNT(idx); + + u32 v = *reg; + + // disable channel + v &= ~0x80000000; + + // set hold flag + if (hold & 1) + v |= 0x8000; + + *reg = v; +} + +void SND_SetChannelVolume(int chnIdx, int vol, int volDiv) { + sOrgVolume[chnIdx] = (u8)vol; + + if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) { + int pan = reg_SOUNDxCNT_PAN(chnIdx); + vol = CalcSurroundDecay(vol, pan); + } + + reg_SOUNDxCNT_VOLS(chnIdx) = (u16)((volDiv << 8) | vol); +} + +void SND_SetChannelTimer(int chnIdx, int timer) { + reg_SOUNDxTMR(chnIdx) = (u16)(0x10000 - timer); +} + +void SND_SetChannelPan(int chnIdx, int pan) { + sOrgPan[chnIdx] = (u8)pan; + + if (sMasterPan >= 0) { + pan = sMasterPan; + } + + reg_SOUNDxCNT_PAN(chnIdx) = (u8)pan; + + if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) { + reg_SOUNDxCNT_VOL(chnIdx) = (u8)CalcSurroundDecay(sOrgVolume[chnIdx], pan); + } +} + +BOOL SND_IsChannelActive(int chnIdx) { + return (reg_SOUNDxCNT_STAT(chnIdx) & 0x80) != 0; +} + +void SND_SetMasterPan(int pan) { + sMasterPan = pan; + + if (pan >= 0) { + for (int i = 0; i < SND_CHANNEL_COUNT; i++) { + reg_SOUNDxCNT_PAN(i) = (u8)pan; + } + } else { + for (int i = 0; i < SND_CHANNEL_COUNT; i++) { + reg_SOUNDxCNT_PAN(i) = sOrgPan[i]; + } + } +} + +u32 SND_GetChannelControl(int chnIdx) { + return reg_SOUNDxCNT(chnIdx); +} + +void SNDi_SetSurroundDecay(int decay) { + sSurroundDecay = decay; + + for (int i = 0; i < SND_CHANNEL_COUNT; i++) { + // do not process channel 1+3 (capture playback channels) + if ((1 << i) & 0xFFF5) { + int pan = reg_SOUNDxCNT_PAN(i); + reg_SOUNDxCNT_VOL(i) = (u8)CalcSurroundDecay(sOrgVolume[i], pan); + } + } +} + +static int CalcSurroundDecay(int vol, int pan) { + if (pan < 24) { + return vol * (sSurroundDecay * (pan + 40) + ((0x7FFF - sSurroundDecay) << 6)) >> 21; + } else if (pan <= 104) { + return vol; + } else { + return vol * (-sSurroundDecay * (pan - 40) + ((sSurroundDecay + 0x7FFF) << 6)) >> 21; + } +} + +void SND_Enable(void) { + reg_SOUNDCNT_MIX |= 0x80; +} + +void SND_Disable(void) { + reg_SOUNDCNT_MIX &= ~0x80; +} + +void SND_Shutdown(void) { + SND_Disable(); + + for (int i = 0; i < SND_CHANNEL_COUNT; i++) { + SND_StopChannel(i, 1); + } + + reg_SNDCAPxCNT(0) = 0; + reg_SNDCAPxCNT(1) = 0; +} + +void SND_BeginSleep(void) { + SND_Disable(); + SVC_SoundBiasReset(0x80); + OS_SpinWait(0x40000); + PMi_ResetControl(1); + reg_POWCNT2 &= ~1; +} + +void SND_EndSleep(void) { + reg_POWCNT2 |= 1; // enable speakers + PMi_SetControl(1); + SVC_SoundBiasSet(0x100); + OS_SpinWait(0x7AB80); // what does this wait for and how long does it wait? + SND_Enable(); +} + +void SND_SetMasterVolume(int vol) { + reg_SOUNDCNT_VOL = (u8)vol; +} + +void SND_SetOutputSelector(int leftOutputFrom, int rightOutputFrom, int outputCh1ToMixer, int outputCh3ToMixer) { + int masterEnable = (reg_SOUNDCNT_MIX & 0x80) ? 1 : 0; + reg_SOUNDCNT_MIX = (u8)((masterEnable << 7) | (outputCh3ToMixer << 5) | (outputCh1ToMixer << 4) | (rightOutputFrom << 2) | (leftOutputFrom)); +} -- cgit v1.2.3 From 9148e1b93023ccafed96d2bfc199ba3ee289e02e Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Sat, 10 Jul 2021 01:36:57 +0200 Subject: arm7: document SND_unk functions --- arm7/asm/SND_unk_037FD440.s | 124 ++++++++++++++++++------------------ arm7/global.inc | 2 +- arm7/lib/include/SND_unk_037FD440.h | 2 +- arm7/lib/src/SND_seq.c | 2 +- 4 files changed, 65 insertions(+), 65 deletions(-) diff --git a/arm7/asm/SND_unk_037FD440.s b/arm7/asm/SND_unk_037FD440.s index 2ca56045..b36cf546 100644 --- a/arm7/asm/SND_unk_037FD440.s +++ b/arm7/asm/SND_unk_037FD440.s @@ -4,16 +4,16 @@ .section .bss - .global _03807F4C -_03807F4C: ;0x03807F4C + .global sPrintEnabled +sPrintEnabled: ;0x03807F4C .space 0x03807F50 - 0x03807F4C - .global _03807F50 -_03807F50: ;0x03807F50 + .global sSeqCacheRange +sSeqCacheRange: ;0x03807F50 .space 0x03807F58 - 0x03807F50 - .global _03807F58 -_03807F58: ;0x03807F58 + .global sSeqCache +sSeqCache: ;0x03807F58 .space 0x03807F68 - 0x03807F58 .section .text @@ -80,8 +80,8 @@ _037FD4F0: bx lr _037FD500: .word (SNDi_Work + 0x780) - arm_func_start FUN_037FD504 -FUN_037FD504: ; 0x037FD504 + arm_func_start PlayerGetVariablePointer +PlayerGetVariablePointer: ; 0x037FD504 ldr r2, _037FD544 ; =SNDi_SharedWork ldr r2, [r2] cmp r2, #0 @@ -120,13 +120,13 @@ _037FD560: mov r1, r8 mov r2, r5 mov r3, r7 - bl FUN_037FD5C8 + bl TrackStepTicks cmp r0, #0 moveq r6, r4 beq _037FD5A8 mov r0, r8 mov r1, r5 - bl FUN_037FE3EC + bl PlayerStopTrack _037FD5A8: add r5, r5, #1 cmp r5, #16 @@ -137,8 +137,8 @@ _037FD5A8: ldmia sp!, {r4, r5, r6, r7, r8, lr} bx lr - arm_func_start FUN_037FD5C8 -FUN_037FD5C8: ; 0x037FD5C8 + arm_func_start TrackStepTicks +TrackStepTicks: ; 0x037FD5C8 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} sub sp, sp, #52 ; 0x34 mov r9, r0 @@ -263,7 +263,7 @@ _037FD758: ldreq r2, [sp, #32] mov r0, r9 mov r1, r8 - bl FUN_037FE7B0 + bl TrackParseValue mov r5, r0 ldrsb r0, [r9, #19] add r4, r7, r0 @@ -290,7 +290,7 @@ _037FD7C0: mov r1, r8 mov r2, r4 ldr r3, [sp, #12] - bl FUN_037FDF94 + bl TrackPlayNote _037FD800: strb r4, [r9, #20] ldrb r0, [r9] @@ -338,7 +338,7 @@ _037FD890: ldreq r2, [sp, #32] mov r0, r9 mov r1, r8 - bl FUN_037FE7B0 + bl TrackParseValue cmp r6, #0 beq _037FDF64 cmp r7, #128 ; 0x80 @@ -369,7 +369,7 @@ _037FD8F4: add r0, r0, #1 str r0, [r9, #40] ; 0x28 mov r0, r9 - bl FUN_037FE8B8 + bl TrackReadU24 mov r5, r0 cmp r6, #0 beq _037FDF64 @@ -381,7 +381,7 @@ _037FD8F4: cmp r4, r9 beq _037FDF64 mov r1, r8 - bl FUN_037FE440 + bl TrackStop mov r0, r4 ldr r1, [r9, #36] ; 0x24 mov r2, r5 @@ -389,7 +389,7 @@ _037FD8F4: b _037FDF64 _037FD958: mov r0, r9 - bl FUN_037FE8B8 + bl TrackReadU24 cmp r6, #0 ldrne r1, [r9, #36] ; 0x24 addne r0, r1, r0 @@ -397,7 +397,7 @@ _037FD958: b _037FDF64 _037FD974: mov r0, r9 - bl FUN_037FE8B8 + bl TrackReadU24 cmp r6, #0 beq _037FDF64 ldrb r1, [r9, #59] ; 0x3b @@ -419,7 +419,7 @@ _037FD9B8: moveq r2, fp mov r0, r9 mov r1, r8 - bl FUN_037FE7B0 + bl TrackParseValue strb r0, [sp, #44] ; 0x2c cmp r6, #0 beq _037FDF64 @@ -581,13 +581,13 @@ _037FDBE4: strb r0, [r9, #8] b _037FDF64 _037FDBF4: - ldr r0, _037FDF90 ; =_03807F4C + ldr r0, _037FDF90 ; =sPrintEnabled ldr r0, [r0] cmp r0, #0 beq _037FDF64 mov r0, r8 ldrb r1, [sp, #44] ; 0x2c - bl FUN_037FD504 + bl PlayerGetVariablePointer b _037FDF64 _037FDC14: cmp r4, #0 @@ -595,7 +595,7 @@ _037FDC14: moveq r2, sl mov r0, r9 mov r1, r8 - bl FUN_037FE7B0 + bl TrackParseValue mov r0, r0, lsl #16 mov r0, r0, asr #16 cmp r6, #0 @@ -625,12 +625,12 @@ _037FDC68: moveq r2, sl mov r0, r9 mov r1, r8 - bl FUN_037FE7B0 + bl TrackParseValue mov r0, r0, lsl #16 mov r5, r0, asr #16 mov r0, r8 ldr r1, [sp, #16] - bl FUN_037FD504 + bl PlayerGetVariablePointer mov r4, r0 cmp r6, #0 beq _037FDF64 @@ -837,10 +837,10 @@ _037FDF84: add sp, sp, #52 ; 0x34 ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} bx lr -_037FDF90: .word _03807F4C +_037FDF90: .word sPrintEnabled - arm_func_start FUN_037FDF94 -FUN_037FDF94: ; 0x037FDF94 + arm_func_start TrackPlayNote +TrackPlayNote: ; 0x037FDF94 stmdb sp!, {r4, r5, r6, r7, r8, lr} sub sp, sp, #24 mov r8, r0 @@ -896,7 +896,7 @@ _037FE034: ldrb r2, [r8] mov r2, r2, lsl #24 mov r2, r2, lsr #31 - ldr r3, _037FE19C ; =FUN_037FE344 + ldr r3, _037FE19C ; =ChannelCallback bl SND_AllocExChannel movs r4, r0 beq _037FE18C @@ -987,7 +987,7 @@ _037FE18C: ldmia sp!, {r4, r5, r6, r7, r8, lr} bx lr _037FE198: .word 0x0000FFFF -_037FE19C: .word FUN_037FE344 +_037FE19C: .word ChannelCallback arm_func_start PlayerUpdateChannelVolume PlayerUpdateChannelVolume: ; 0x037FE1A0 @@ -1003,7 +1003,7 @@ _037FE1B0: beq _037FE1D0 mov r1, r6 mov r2, r4 - bl FUN_037FE1E4 + bl TrackUpdateChannelVolume _037FE1D0: add r5, r5, #1 cmp r5, #16 @@ -1011,8 +1011,8 @@ _037FE1D0: ldmia sp!, {r4, r5, r6, lr} bx lr - arm_func_start FUN_037FE1E4 -FUN_037FE1E4: ; 0x037FE1E4 + arm_func_start TrackUpdateChannelVolume +TrackUpdateChannelVolume: ; 0x037FE1E4 stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} sub sp, sp, #4 mov sl, r0 @@ -1106,8 +1106,8 @@ _037FE32C: bx lr _037FE340: .word SNDi_DecibelSquareTable - arm_func_start FUN_037FE344 -FUN_037FE344: ; 0x037FE344 + arm_func_start ChannelCallback +ChannelCallback: ; 0x037FE344 stmdb sp!, {r4, r5, lr} sub sp, sp, #4 mov r5, r0 @@ -1148,7 +1148,7 @@ PlayerStop: ; 0x037FE3AC _037FE3BC: mov r0, r5 mov r1, r4 - bl FUN_037FE3EC + bl PlayerStopTrack add r4, r4, #1 cmp r4, #16 blt _037FE3BC @@ -1159,8 +1159,8 @@ _037FE3BC: ldmia sp!, {r4, r5, lr} bx lr - arm_func_start FUN_037FE3EC -FUN_037FE3EC: ; 0x037FE3EC + arm_func_start PlayerStopTrack +PlayerStopTrack: ; 0x037FE3EC stmdb sp!, {r4, r5, lr} sub sp, sp, #4 mov r5, r0 @@ -1169,7 +1169,7 @@ FUN_037FE3EC: ; 0x037FE3EC cmp r0, #0 beq _037FE430 mov r1, r5 - bl FUN_037FE440 + bl TrackStop add r3, r5, #8 ldr r2, _037FE43C ; =_038086EC ldrb r1, [r3, r4] @@ -1184,8 +1184,8 @@ _037FE430: bx lr _037FE43C: .word (SNDi_Work + 0x780) - arm_func_start FUN_037FE440 -FUN_037FE440: ; 0x037FE440 + arm_func_start TrackStop +TrackStop: ; 0x037FE440 stmdb sp!, {r4, lr} mov r4, r0 mvn r2, #0 @@ -1294,7 +1294,7 @@ TrackReleaseChannels: ; 0x037FE588 mov r4, r0 mov r7, r2 mov r2, #0 - bl FUN_037FE1E4 + bl TrackUpdateChannelVolume ldr r6, [r4, #60] ; 0x3c and r5, r7, #255 ; 0xff mov r4, #1 @@ -1444,8 +1444,8 @@ TrackInit: ; 0x037FE6BC bx lr _037FE7AC: .word 0x0000FFFF - arm_func_start FUN_037FE7B0 -FUN_037FE7B0: ; 0x037FE7B0 + arm_func_start TrackParseValue +TrackParseValue: ; 0x037FE7B0 stmdb sp!, {r4, r5, r6, lr} mov r4, r0 mov r6, r1 @@ -1466,11 +1466,11 @@ _037FE7DC: str r0, [r4, #40] ; 0x28 b _037FE86C _037FE7F8: - bl TrackReadHword + bl TrackReadU16 mov r5, r0 b _037FE86C _037FE804: - bl FUN_037FE878 + bl TrackReadVLV mov r5, r0 b _037FE86C _037FE810: @@ -1481,15 +1481,15 @@ _037FE810: add r0, r0, #1 str r0, [r4, #40] ; 0x28 mov r0, r6 - bl FUN_037FD504 + bl PlayerGetVariablePointer cmp r0, #0 ldrnesh r5, [r0] b _037FE86C _037FE83C: - bl TrackReadHword + bl TrackReadU16 mov r5, r0, lsl #16 mov r0, r4 - bl TrackReadHword + bl TrackReadU16 mov r0, r0, lsl #16 mov r4, r0, asr #16 bl SND_CalcRandom @@ -1503,8 +1503,8 @@ _037FE86C: ldmia sp!, {r4, r5, r6, lr} bx lr - arm_func_start FUN_037FE878 -FUN_037FE878: ; 0x037FE878 + arm_func_start TrackReadVLV +TrackReadVLV: ; 0x037FE878 stmdb sp!, {r4, r5, r6, lr} mov r6, r0 mov r5, #0 @@ -1523,8 +1523,8 @@ _037FE888: ldmia sp!, {r4, r5, r6, lr} bx lr - arm_func_start FUN_037FE8B8 -FUN_037FE8B8: ; 0x037FE8B8 + arm_func_start TrackReadU24 +TrackReadU24: ; 0x037FE8B8 stmdb sp!, {r4, r5, lr} sub sp, sp, #4 mov r4, r0 @@ -1550,8 +1550,8 @@ FUN_037FE8B8: ; 0x037FE8B8 ldmia sp!, {r4, r5, lr} bx lr - arm_func_start TrackReadHword -TrackReadHword: ; 0x037FE918 + arm_func_start TrackReadU16 +TrackReadU16: ; 0x037FE918 stmdb sp!, {r4, r5, lr} sub sp, sp, #4 mov r5, r0 @@ -1577,7 +1577,7 @@ TrackReadHword: ; 0x037FE918 SeqReadByte: ; 0x037FE968 stmdb sp!, {r4, lr} mov r4, r0 - ldr r0, _037FE9B0 ; =_03807F50 + ldr r0, _037FE9B0 ; =sSeqCacheRange ldr r1, [r0] cmp r4, r1 bcc _037FE98C @@ -1588,20 +1588,20 @@ _037FE98C: mov r0, r4 bl SeqCacheFetch _037FE994: - ldr r0, _037FE9B0 ; =_03807F50 + ldr r0, _037FE9B0 ; =sSeqCacheRange ldr r0, [r0] sub r1, r4, r0 - ldr r0, _037FE9B4 ; =_03807F58 + ldr r0, _037FE9B4 ; =sSeqCache ldrb r0, [r0, r1] ldmia sp!, {r4, lr} bx lr -_037FE9B0: .word _03807F50 -_037FE9B4: .word _03807F58 +_037FE9B0: .word sSeqCacheRange +_037FE9B4: .word sSeqCache arm_func_start SeqCacheFetch SeqCacheFetch: ; 0x037FE9B8 bic r2, r0, #3 - ldr r0, _037FE9F0 ; =_03807F50 + ldr r0, _037FE9F0 ; =sSeqCacheRange str r2, [r0] add r1, r2, #16 str r1, [r0, #4] @@ -1614,4 +1614,4 @@ SeqCacheFetch: ; 0x037FE9B8 ldr r1, [r2, #12] str r1, [r0, #20] bx lr -_037FE9F0: .word _03807F50 +_037FE9F0: .word sSeqCacheRange diff --git a/arm7/global.inc b/arm7/global.inc index 9702d548..6403574b 100644 --- a/arm7/global.inc +++ b/arm7/global.inc @@ -220,7 +220,7 @@ .extern PlayerSetBank .extern TrackSetSeq .extern TrackInit -.extern TrackReadHword +.extern TrackReadU16 .extern SeqReadByte .extern SeqCacheFetch .extern SPIi_CheckEntry diff --git a/arm7/lib/include/SND_unk_037FD440.h b/arm7/lib/include/SND_unk_037FD440.h index 460217c6..5eef03df 100644 --- a/arm7/lib/include/SND_unk_037FD440.h +++ b/arm7/lib/include/SND_unk_037FD440.h @@ -15,7 +15,7 @@ void TrackInit(struct SNDTrack *track); void TrackSetSeq(struct SNDTrack *track, const void *seq, u32 offset); void SeqCacheFetch(const void *addr); u8 SeqReadByte(const void *addr); -u16 TrackReadHword(struct SNDTrack *track); +u16 TrackReadU16(struct SNDTrack *track); void PlayerSeqMain(struct SNDPlayer *player); void PlayerUpdateChannelVolume(struct SNDPlayer *player); diff --git a/arm7/lib/src/SND_seq.c b/arm7/lib/src/SND_seq.c index 3153c392..6421b08f 100644 --- a/arm7/lib/src/SND_seq.c +++ b/arm7/lib/src/SND_seq.c @@ -73,7 +73,7 @@ void SND_PrepareSeq(int player, const void *seq, u32 offset, struct SNDBankData int track; u16 trackMask; - for (trackMask = (u16)(TrackReadHword(trk) >> 1), track = 1; trackMask != 0; track++, trackMask >>= 1) { + for (trackMask = (u16)(TrackReadU16(trk) >> 1), track = 1; trackMask != 0; track++, trackMask >>= 1) { if (trackMask & 1) { allocTrkIdx = AllocateTrack(); if (allocTrkIdx < 0) -- cgit v1.2.3 From c2bd97bebcecbe1d1743572ea99fa82fb9019832 Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Sun, 1 Aug 2021 02:45:26 +0200 Subject: arm7: decompile SND_unk_037FD440 --- arm7/asm/SND_unk_037FD440.s | 1617 ----------------------------------- arm7/lib/include/SND_unk_037FD440.h | 13 +- arm7/lib/src/SND_seq.c | 6 +- arm7/lib/src/SND_unk_037FD440.c | 904 ++++++++++++++++++++ include/nitro/SND_seq_shared.h | 2 + 5 files changed, 917 insertions(+), 1625 deletions(-) delete mode 100644 arm7/asm/SND_unk_037FD440.s create mode 100644 arm7/lib/src/SND_unk_037FD440.c diff --git a/arm7/asm/SND_unk_037FD440.s b/arm7/asm/SND_unk_037FD440.s deleted file mode 100644 index b36cf546..00000000 --- a/arm7/asm/SND_unk_037FD440.s +++ /dev/null @@ -1,1617 +0,0 @@ -#todo identify and split - .include "asm/macros.inc" - .include "global.inc" - - .section .bss - - .global sPrintEnabled -sPrintEnabled: ;0x03807F4C - .space 0x03807F50 - 0x03807F4C - - .global sSeqCacheRange -sSeqCacheRange: ;0x03807F50 - .space 0x03807F58 - 0x03807F50 - - .global sSeqCache -sSeqCache: ;0x03807F58 - .space 0x03807F68 - 0x03807F58 - - .section .text - - arm_func_start TrackMute -TrackMute: ; 0x037FD440 - stmdb sp!, {r4, lr} - mov r4, r0 - cmp r2, #3 - addls pc, pc, r2, lsl #2 - b _037FD4B8 - b _037FD464 - b _037FD474 - b _037FD484 - b _037FD49C -_037FD464: - ldrb r0, [r4] - bic r0, r0, #4 - strb r0, [r4] - b _037FD4B8 -_037FD474: - ldrb r0, [r4] - orr r0, r0, #4 - strb r0, [r4] - b _037FD4B8 -_037FD484: - ldrb r2, [r4] - orr r2, r2, #4 - strb r2, [r4] - mvn r2, #0 - bl TrackReleaseChannels - b _037FD4B8 -_037FD49C: - ldrb r2, [r4] - orr r2, r2, #4 - strb r2, [r4] - mov r2, #127 ; 0x7f - bl TrackReleaseChannels - mov r0, r4 - bl TrackFreeChannels -_037FD4B8: - ldmia sp!, {r4, lr} - bx lr - - arm_func_start AllocateTrack -AllocateTrack: ; 0x037FD4C0 - mov r0, #0 - ldr r3, _037FD500 ; =_038086EC - b _037FD4F0 -_037FD4CC: - add ip, r3, r0, lsl #6 - ldrb r1, [r3, r0, lsl #6] - mov r2, r1, lsl #31 - movs r2, r2, lsr #31 - biceq r1, r1, #1 - orreq r1, r1, #1 - streqb r1, [ip] - bxeq lr - add r0, r0, #1 -_037FD4F0: - cmp r0, #32 - blt _037FD4CC - mvn r0, #0 - bx lr -_037FD500: .word (SNDi_Work + 0x780) - - arm_func_start PlayerGetVariablePointer -PlayerGetVariablePointer: ; 0x037FD504 - ldr r2, _037FD544 ; =SNDi_SharedWork - ldr r2, [r2] - cmp r2, #0 - moveq r0, #0 - bxeq lr - cmp r1, #16 - addge r2, r2, #608 ; 0x260 - subge r0, r1, #16 - addge r0, r2, r0, lsl #1 - bxge lr - add r3, r2, #32 - ldrb r2, [r0, #1] - mov r0, #36 ; 0x24 - mla r0, r2, r0, r3 - add r0, r0, r1, lsl #1 - bx lr -_037FD544: .word SNDi_SharedWork - - arm_func_start PlayerStepTicks -PlayerStepTicks: ; 0x037FD548 - stmdb sp!, {r4, r5, r6, r7, r8, lr} - mov r8, r0 - mov r7, r1 - mov r6, #0 - mov r5, r6 - mov r4, #1 -_037FD560: - mov r0, r8 - mov r1, r5 - bl PlayerGetTrack - cmp r0, #0 - beq _037FD5A8 - ldr r1, [r0, #40] ; 0x28 - cmp r1, #0 - beq _037FD5A8 - mov r1, r8 - mov r2, r5 - mov r3, r7 - bl TrackStepTicks - cmp r0, #0 - moveq r6, r4 - beq _037FD5A8 - mov r0, r8 - mov r1, r5 - bl PlayerStopTrack -_037FD5A8: - add r5, r5, #1 - cmp r5, #16 - blt _037FD560 - cmp r6, #0 - moveq r0, #1 - movne r0, #0 - ldmia sp!, {r4, r5, r6, r7, r8, lr} - bx lr - - arm_func_start TrackStepTicks -TrackStepTicks: ; 0x037FD5C8 - stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - sub sp, sp, #52 ; 0x34 - mov r9, r0 - mov r8, r1 - str r3, [sp, #4] - ldr r2, [r9, #60] ; 0x3c - b _037FD61C -_037FD5E4: - ldr r0, [r2, #52] ; 0x34 - cmp r0, #0 - subgt r0, r0, #1 - strgt r0, [r2, #52] ; 0x34 - ldrb r0, [r2, #3] - mov r0, r0, lsl #29 - movs r0, r0, lsr #31 - bne _037FD618 - ldr r1, [r2, #20] - ldr r0, [r2, #24] - cmp r1, r0 - addlt r0, r1, #1 - strlt r0, [r2, #20] -_037FD618: - ldr r2, [r2, #80] ; 0x50 -_037FD61C: - cmp r2, #0 - bne _037FD5E4 - ldrb r1, [r9] - mov r0, r1, lsl #27 - movs r0, r0, lsr #31 - beq _037FD64C - ldr r0, [r9, #60] ; 0x3c - cmp r0, #0 - movne r0, #0 - bne _037FDF84 - bic r0, r1, #16 - strb r0, [r9] -_037FD64C: - ldr r0, [r9, #32] - cmp r0, #0 - ble _037FD670 - sub r0, r0, #1 - str r0, [r9, #32] - ldr r0, [r9, #32] - cmp r0, #0 - movgt r0, #0 - bgt _037FDF84 -_037FD670: - ldr r0, [r9, #40] ; 0x28 - bl SeqCacheFetch - add r0, r9, #40 ; 0x28 - str r0, [sp, #28] - mov r0, #2 - str r0, [sp, #32] - mov r0, #127 ; 0x7f - str r0, [sp, #36] ; 0x24 - mov fp, #0 - mvn r0, #0 - str r0, [sp, #40] ; 0x28 - mov sl, #1 - mov r0, #3 - str r0, [sp, #20] - mov r0, #4 - str r0, [sp, #24] - b _037FDF64 -_037FD6B4: - mov r4, fp - mov r6, sl - ldr r0, [r9, #40] ; 0x28 - bl SeqReadByte - mov r7, r0 - ldr r0, [r9, #40] ; 0x28 - add r0, r0, #1 - str r0, [r9, #40] ; 0x28 - cmp r7, #162 ; 0xa2 - bne _037FD700 - ldr r0, [r9, #40] ; 0x28 - bl SeqReadByte - mov r7, r0 - ldr r0, [r9, #40] ; 0x28 - add r0, r0, #1 - str r0, [r9, #40] ; 0x28 - ldrb r0, [r9] - mov r0, r0, lsl #25 - mov r6, r0, lsr #31 -_037FD700: - cmp r7, #160 ; 0xa0 - bne _037FD72C - ldr r0, [r9, #40] ; 0x28 - bl SeqReadByte - mov r7, r0 - ldr r0, [r9, #40] ; 0x28 - add r0, r0, #1 - str r0, [r9, #40] ; 0x28 - ldr r0, [sp, #20] - str r0, [sp, #8] - mov r4, sl -_037FD72C: - cmp r7, #161 ; 0xa1 - bne _037FD758 - ldr r0, [r9, #40] ; 0x28 - bl SeqReadByte - mov r7, r0 - ldr r0, [r9, #40] ; 0x28 - add r0, r0, #1 - str r0, [r9, #40] ; 0x28 - ldr r0, [sp, #24] - str r0, [sp, #8] - mov r4, sl -_037FD758: - ands r0, r7, #128 ; 0x80 - bne _037FD82C - ldr r0, [r9, #40] ; 0x28 - bl SeqReadByte - str r0, [sp, #12] - ldr r0, [sp, #28] - ldr r0, [r0] - add r1, r0, #1 - ldr r0, [sp, #28] - str r1, [r0] - cmp r4, #0 - ldrne r2, [sp, #8] - ldreq r2, [sp, #32] - mov r0, r9 - mov r1, r8 - bl TrackParseValue - mov r5, r0 - ldrsb r0, [r9, #19] - add r4, r7, r0 - cmp r6, #0 - beq _037FDF64 - cmp r4, #0 - movlt r4, fp - blt _037FD7C0 - cmp r4, #127 ; 0x7f - ldrgt r4, [sp, #36] ; 0x24 -_037FD7C0: - ldrb r0, [r9] - mov r0, r0, lsl #29 - movs r0, r0, lsr #31 - bne _037FD800 - ldr r0, [sp, #4] - cmp r0, #0 - beq _037FD800 - cmp r5, #0 - movgt r0, r5 - ldrle r0, [sp, #40] ; 0x28 - str r0, [sp] - mov r0, r9 - mov r1, r8 - mov r2, r4 - ldr r3, [sp, #12] - bl TrackPlayNote -_037FD800: - strb r4, [r9, #20] - ldrb r0, [r9] - mov r0, r0, lsl #30 - movs r0, r0, lsr #31 - beq _037FDF64 - str r5, [r9, #32] - cmp r5, #0 - ldreqb r0, [r9] - orreq r0, r0, #16 - streqb r0, [r9] - b _037FDF64 -_037FD82C: - and r0, r7, #240 ; 0xf0 - cmp r0, #192 ; 0xc0 - bgt _037FD868 - cmp r0, #192 ; 0xc0 - bge _037FD9B8 - cmp r0, #144 ; 0x90 - bgt _037FD85C - cmp r0, #144 ; 0x90 - bge _037FD8D8 - cmp r0, #128 ; 0x80 - beq _037FD890 - b _037FDF64 -_037FD85C: - cmp r0, #176 ; 0xb0 - beq _037FDC68 - b _037FDF64 -_037FD868: - cmp r0, #224 ; 0xe0 - bgt _037FD884 - cmp r0, #224 ; 0xe0 - bge _037FDC14 - cmp r0, #208 ; 0xd0 - beq _037FD9B8 - b _037FDF64 -_037FD884: - cmp r0, #240 ; 0xf0 - beq _037FDEC0 - b _037FDF64 -_037FD890: - cmp r4, #0 - ldrne r2, [sp, #8] - ldreq r2, [sp, #32] - mov r0, r9 - mov r1, r8 - bl TrackParseValue - cmp r6, #0 - beq _037FDF64 - cmp r7, #128 ; 0x80 - beq _037FD8C4 - cmp r7, #129 ; 0x81 - beq _037FD8CC - b _037FDF64 -_037FD8C4: - str r0, [r9, #32] - b _037FDF64 -_037FD8CC: - cmp r0, #65536 ; 0x10000 - strlth r0, [r9, #2] - b _037FDF64 -_037FD8D8: - cmp r7, #147 ; 0x93 - beq _037FD8F4 - cmp r7, #148 ; 0x94 - beq _037FD958 - cmp r7, #149 ; 0x95 - beq _037FD974 - b _037FDF64 -_037FD8F4: - ldr r0, [r9, #40] ; 0x28 - bl SeqReadByte - mov r4, r0 - ldr r0, [r9, #40] ; 0x28 - add r0, r0, #1 - str r0, [r9, #40] ; 0x28 - mov r0, r9 - bl TrackReadU24 - mov r5, r0 - cmp r6, #0 - beq _037FDF64 - mov r0, r8 - mov r1, r4 - bl PlayerGetTrack - movs r4, r0 - beq _037FDF64 - cmp r4, r9 - beq _037FDF64 - mov r1, r8 - bl TrackStop - mov r0, r4 - ldr r1, [r9, #36] ; 0x24 - mov r2, r5 - bl TrackSetSeq - b _037FDF64 -_037FD958: - mov r0, r9 - bl TrackReadU24 - cmp r6, #0 - ldrne r1, [r9, #36] ; 0x24 - addne r0, r1, r0 - strne r0, [r9, #40] ; 0x28 - b _037FDF64 -_037FD974: - mov r0, r9 - bl TrackReadU24 - cmp r6, #0 - beq _037FDF64 - ldrb r1, [r9, #59] ; 0x3b - cmp r1, #3 - bcs _037FDF64 - ldr r2, [r9, #40] ; 0x28 - add r1, r9, r1, lsl #2 - str r2, [r1, #44] ; 0x2c - ldrb r1, [r9, #59] ; 0x3b - add r1, r1, #1 - strb r1, [r9, #59] ; 0x3b - ldr r1, [r9, #36] ; 0x24 - add r0, r1, r0 - str r0, [r9, #40] ; 0x28 - b _037FDF64 -_037FD9B8: - cmp r4, #0 - ldrne r2, [sp, #8] - moveq r2, fp - mov r0, r9 - mov r1, r8 - bl TrackParseValue - strb r0, [sp, #44] ; 0x2c - cmp r6, #0 - beq _037FDF64 - sub r0, r7, #192 ; 0xc0 - cmp r0, #23 - addls pc, pc, r0, lsl #2 - b _037FDF64 - b _037FDBE4 - b _037FDA4C - b _037FDA64 - b _037FDBCC - b _037FDBD8 - b _037FDA70 - b _037FDA7C - b _037FDA88 - b _037FDB48 - b _037FDB90 - b _037FDAB0 - b _037FDABC - b _037FDAC8 - b _037FDAD4 - b _037FDBB0 - b _037FDAA4 - b _037FDAE0 - b _037FDAEC - b _037FDAF8 - b _037FDB04 - b _037FDB10 - b _037FDA58 - b _037FDBF4 - b _037FDB7C -_037FDA4C: - ldrb r0, [sp, #44] ; 0x2c - strb r0, [r9, #4] - b _037FDF64 -_037FDA58: - ldrb r0, [sp, #44] ; 0x2c - strb r0, [r9, #5] - b _037FDF64 -_037FDA64: - ldrb r0, [sp, #44] ; 0x2c - strb r0, [r8, #5] - b _037FDF64 -_037FDA70: - ldrb r0, [sp, #44] ; 0x2c - strb r0, [r9, #7] - b _037FDF64 -_037FDA7C: - ldrb r0, [sp, #44] ; 0x2c - strb r0, [r9, #18] - b _037FDF64 -_037FDA88: - ldrb r0, [r9] - bic r1, r0, #2 - ldrb r0, [sp, #44] ; 0x2c - and r0, r0, #1 - orr r0, r1, r0, lsl #1 - strb r0, [r9] - b _037FDF64 -_037FDAA4: - ldrb r0, [sp, #44] ; 0x2c - strb r0, [r9, #21] - b _037FDF64 -_037FDAB0: - ldrb r0, [sp, #44] ; 0x2c - strb r0, [r9, #26] - b _037FDF64 -_037FDABC: - ldrb r0, [sp, #44] ; 0x2c - strb r0, [r9, #25] - b _037FDF64 -_037FDAC8: - ldrb r0, [sp, #44] ; 0x2c - strb r0, [r9, #24] - b _037FDF64 -_037FDAD4: - ldrb r0, [sp, #44] ; 0x2c - strb r0, [r9, #27] - b _037FDF64 -_037FDAE0: - ldrb r0, [sp, #44] ; 0x2c - strb r0, [r9, #14] - b _037FDF64 -_037FDAEC: - ldrb r0, [sp, #44] ; 0x2c - strb r0, [r9, #15] - b _037FDF64 -_037FDAF8: - ldrb r0, [sp, #44] ; 0x2c - strb r0, [r9, #16] - b _037FDF64 -_037FDB04: - ldrb r0, [sp, #44] ; 0x2c - strb r0, [r9, #17] - b _037FDF64 -_037FDB10: - ldrb r0, [r9, #59] ; 0x3b - cmp r0, #3 - bcs _037FDF64 - ldr r1, [r9, #40] ; 0x28 - add r0, r9, r0, lsl #2 - str r1, [r0, #44] ; 0x2c - ldrb r1, [sp, #44] ; 0x2c - ldrb r0, [r9, #59] ; 0x3b - add r0, r9, r0 - strb r1, [r0, #56] ; 0x38 - ldrb r0, [r9, #59] ; 0x3b - add r0, r0, #1 - strb r0, [r9, #59] ; 0x3b - b _037FDF64 -_037FDB48: - ldrb r0, [r9] - bic r1, r0, #8 - ldrb r0, [sp, #44] ; 0x2c - and r0, r0, #1 - orr r0, r1, r0, lsl #3 - strb r0, [r9] - mov r0, r9 - mov r1, r8 - ldr r2, [sp, #40] ; 0x28 - bl TrackReleaseChannels - mov r0, r9 - bl TrackFreeChannels - b _037FDF64 -_037FDB7C: - mov r0, r9 - mov r1, r8 - ldrb r2, [sp, #44] ; 0x2c - bl TrackMute - b _037FDF64 -_037FDB90: - ldrb r1, [sp, #44] ; 0x2c - ldrsb r0, [r9, #19] - add r0, r1, r0 - strb r0, [r9, #20] - ldrb r0, [r9] - orr r0, r0, #32 - strb r0, [r9] - b _037FDF64 -_037FDBB0: - ldrb r0, [r9] - bic r1, r0, #32 - ldrb r0, [sp, #44] ; 0x2c - and r0, r0, #1 - orr r0, r1, r0, lsl #5 - strb r0, [r9] - b _037FDF64 -_037FDBCC: - ldrsb r0, [sp, #44] ; 0x2c - strb r0, [r9, #19] - b _037FDF64 -_037FDBD8: - ldrsb r0, [sp, #44] ; 0x2c - strb r0, [r9, #6] - b _037FDF64 -_037FDBE4: - ldrb r0, [sp, #44] ; 0x2c - sub r0, r0, #64 ; 0x40 - strb r0, [r9, #8] - b _037FDF64 -_037FDBF4: - ldr r0, _037FDF90 ; =sPrintEnabled - ldr r0, [r0] - cmp r0, #0 - beq _037FDF64 - mov r0, r8 - ldrb r1, [sp, #44] ; 0x2c - bl PlayerGetVariablePointer - b _037FDF64 -_037FDC14: - cmp r4, #0 - ldrne r2, [sp, #8] - moveq r2, sl - mov r0, r9 - mov r1, r8 - bl TrackParseValue - mov r0, r0, lsl #16 - mov r0, r0, asr #16 - cmp r6, #0 - beq _037FDF64 - cmp r7, #224 ; 0xe0 - beq _037FDC60 - cmp r7, #225 ; 0xe1 - beq _037FDC58 - cmp r7, #227 ; 0xe3 - streqh r0, [r9, #22] - b _037FDF64 -_037FDC58: - strh r0, [r8, #24] - b _037FDF64 -_037FDC60: - strh r0, [r9, #28] - b _037FDF64 -_037FDC68: - ldr r0, [r9, #40] ; 0x28 - bl SeqReadByte - str r0, [sp, #16] - ldr r0, [r9, #40] ; 0x28 - add r0, r0, #1 - str r0, [r9, #40] ; 0x28 - cmp r4, #0 - ldrne r2, [sp, #8] - moveq r2, sl - mov r0, r9 - mov r1, r8 - bl TrackParseValue - mov r0, r0, lsl #16 - mov r5, r0, asr #16 - mov r0, r8 - ldr r1, [sp, #16] - bl PlayerGetVariablePointer - mov r4, r0 - cmp r6, #0 - beq _037FDF64 - cmp r4, #0 - beq _037FDF64 - sub r0, r7, #176 ; 0xb0 - cmp r0, #13 - addls pc, pc, r0, lsl #2 - b _037FDF64 - b _037FDD08 - b _037FDD10 - b _037FDD20 - b _037FDD30 - b _037FDD40 - b _037FDD5C - b _037FDD80 - b _037FDF64 - b _037FDDB8 - b _037FDDE4 - b _037FDE10 - b _037FDE3C - b _037FDE68 - b _037FDE94 -_037FDD08: - strh r5, [r4] - b _037FDF64 -_037FDD10: - ldrsh r0, [r4] - add r0, r0, r5 - strh r0, [r4] - b _037FDF64 -_037FDD20: - ldrsh r0, [r4] - sub r0, r0, r5 - strh r0, [r4] - b _037FDF64 -_037FDD30: - ldrsh r0, [r4] - mul r1, r0, r5 - strh r1, [r4] - b _037FDF64 -_037FDD40: - cmp r5, #0 - beq _037FDF64 - ldrsh r0, [r4] - mov r1, r5 - bl _s32_div_f - strh r0, [r4] - b _037FDF64 -_037FDD5C: - cmp r5, #0 - ldrgesh r0, [r4] - movge r0, r0, lsl r5 - strgeh r0, [r4] - ldrltsh r1, [r4] - rsblt r0, r5, #0 - movlt r0, r1, asr r0 - strlth r0, [r4] - b _037FDF64 -_037FDD80: - mov r6, fp - cmp r5, #0 - movlt r6, sl - rsblt r0, r5, #0 - movlt r0, r0, lsl #16 - movlt r5, r0, asr #16 - bl SND_CalcRandom - add r1, r5, #1 - mul r1, r0, r1 - mov r0, r1, asr #16 - cmp r6, #0 - rsbne r0, r0, #0 - strh r0, [r4] - b _037FDF64 -_037FDDB8: - ldrsh r0, [r4] - cmp r0, r5 - moveq r2, sl - movne r2, fp - ldrb r0, [r9] - bic r1, r0, #64 ; 0x40 - and r0, r2, #255 ; 0xff - and r0, r0, #1 - orr r0, r1, r0, lsl #6 - strb r0, [r9] - b _037FDF64 -_037FDDE4: - ldrsh r0, [r4] - cmp r0, r5 - movge r2, sl - movlt r2, fp - ldrb r0, [r9] - bic r1, r0, #64 ; 0x40 - and r0, r2, #255 ; 0xff - and r0, r0, #1 - orr r0, r1, r0, lsl #6 - strb r0, [r9] - b _037FDF64 -_037FDE10: - ldrsh r0, [r4] - cmp r0, r5 - movgt r2, sl - movle r2, fp - ldrb r0, [r9] - bic r1, r0, #64 ; 0x40 - and r0, r2, #255 ; 0xff - and r0, r0, #1 - orr r0, r1, r0, lsl #6 - strb r0, [r9] - b _037FDF64 -_037FDE3C: - ldrsh r0, [r4] - cmp r0, r5 - movle r2, sl - movgt r2, fp - ldrb r0, [r9] - bic r1, r0, #64 ; 0x40 - and r0, r2, #255 ; 0xff - and r0, r0, #1 - orr r0, r1, r0, lsl #6 - strb r0, [r9] - b _037FDF64 -_037FDE68: - ldrsh r0, [r4] - cmp r0, r5 - movlt r2, sl - movge r2, fp - ldrb r0, [r9] - bic r1, r0, #64 ; 0x40 - and r0, r2, #255 ; 0xff - and r0, r0, #1 - orr r0, r1, r0, lsl #6 - strb r0, [r9] - b _037FDF64 -_037FDE94: - ldrsh r0, [r4] - cmp r0, r5 - movne r2, sl - moveq r2, fp - ldrb r0, [r9] - bic r1, r0, #64 ; 0x40 - and r0, r2, #255 ; 0xff - and r0, r0, #1 - orr r0, r1, r0, lsl #6 - strb r0, [r9] - b _037FDF64 -_037FDEC0: - cmp r6, #0 - beq _037FDF64 - sub r0, r7, #252 ; 0xfc - cmp r0, #3 - addls pc, pc, r0, lsl #2 - b _037FDF64 - b _037FDF10 - b _037FDEE8 - b _037FDF64 - b _037FDF5C -_037FDEE8: - ldrb r0, [r9, #59] ; 0x3b - cmp r0, #0 - beq _037FDF64 - sub r0, r0, #1 - strb r0, [r9, #59] ; 0x3b - ldrb r0, [r9, #59] ; 0x3b - add r0, r9, r0, lsl #2 - ldr r0, [r0, #44] ; 0x2c - str r0, [r9, #40] ; 0x28 - b _037FDF64 -_037FDF10: - ldrb r0, [r9, #59] ; 0x3b - cmp r0, #0 - beq _037FDF64 - sub r1, r0, #1 - add r2, r9, r1 - ldrb r0, [r2, #56] ; 0x38 - cmp r0, #0 - beq _037FDF40 - sub r0, r0, #1 - ands r0, r0, #255 ; 0xff - streqb r1, [r9, #59] ; 0x3b - beq _037FDF64 -_037FDF40: - strb r0, [r2, #56] ; 0x38 - ldrb r0, [r9, #59] ; 0x3b - sub r0, r0, #1 - add r0, r9, r0, lsl #2 - ldr r0, [r0, #44] ; 0x2c - str r0, [r9, #40] ; 0x28 - b _037FDF64 -_037FDF5C: - mvn r0, #0 - b _037FDF84 -_037FDF64: - ldr r0, [r9, #32] - cmp r0, #0 - bne _037FDF80 - ldrb r0, [r9] - mov r0, r0, lsl #27 - movs r0, r0, lsr #31 - beq _037FD6B4 -_037FDF80: - mov r0, #0 -_037FDF84: - add sp, sp, #52 ; 0x34 - ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - bx lr -_037FDF90: .word sPrintEnabled - - arm_func_start TrackPlayNote -TrackPlayNote: ; 0x037FDF94 - stmdb sp!, {r4, r5, r6, r7, r8, lr} - sub sp, sp, #24 - mov r8, r0 - mov r7, r1 - mov r6, r2 - mov r5, r3 - mov r4, #0 - ldrb r0, [r8] - mov r0, r0, lsl #28 - movs r0, r0, lsr #31 - beq _037FDFD0 - ldr r4, [r8, #60] ; 0x3c - cmp r4, #0 - strneb r6, [r4, #8] - strneb r5, [r4, #9] -_037FDFD0: - cmp r4, #0 - bne _037FE0C4 - ldr r0, [r7, #32] - ldrh r1, [r8, #2] - mov r2, r6 - add r3, sp, #8 - bl SND_ReadInstData - cmp r0, #0 - beq _037FE18C - ldrb r0, [sp, #8] - cmp r0, #4 - addls pc, pc, r0, lsl #2 - b _037FE030 - b _037FE030 - b _037FE018 - b _037FE020 - b _037FE028 - b _037FE018 -_037FE018: - ldr r1, _037FE198 ; =0x0000FFFF - b _037FE034 -_037FE020: - mov r1, #16128 ; 0x3f00 - b _037FE034 -_037FE028: - mov r1, #49152 ; 0xc000 - b _037FE034 -_037FE030: - b _037FE18C -_037FE034: - ldrh r0, [r8, #30] - and r0, r1, r0 - str r8, [sp] - ldrb r2, [r7, #4] - ldrb r1, [r8, #18] - add r1, r2, r1 - ldrb r2, [r8] - mov r2, r2, lsl #24 - mov r2, r2, lsr #31 - ldr r3, _037FE19C ; =ChannelCallback - bl SND_AllocExChannel - movs r4, r0 - beq _037FE18C - ldrb r0, [r8] - mov r0, r0, lsl #28 - movs r0, r0, lsr #31 - mvnne r3, #0 - ldreq r3, [sp, #48] ; 0x30 - ldr r0, [r7, #32] - str r0, [sp] - add r0, sp, #8 - str r0, [sp, #4] - mov r0, r4 - mov r1, r6 - mov r2, r5 - bl SND_NoteOn - cmp r0, #0 - bne _037FE0B8 - mov r0, #0 - strb r0, [r4, #34] ; 0x22 - mov r0, r4 - bl SND_FreeExChannel - b _037FE18C -_037FE0B8: - ldr r0, [r8, #60] ; 0x3c - str r0, [r4, #80] ; 0x50 - str r4, [r8, #60] ; 0x3c -_037FE0C4: - ldrb r1, [r8, #14] - cmp r1, #255 ; 0xff - beq _037FE0D8 - mov r0, r4 - bl SND_SetExChannelAttack -_037FE0D8: - ldrb r1, [r8, #15] - cmp r1, #255 ; 0xff - beq _037FE0EC - mov r0, r4 - bl SND_SetExChannelDecay -_037FE0EC: - ldrb r1, [r8, #16] - cmp r1, #255 ; 0xff - beq _037FE100 - mov r0, r4 - bl SND_SetExChannelSustain -_037FE100: - ldrb r1, [r8, #17] - cmp r1, #255 ; 0xff - beq _037FE114 - mov r0, r4 - bl SND_SetExChannelRelease -_037FE114: - ldrsh r0, [r8, #22] - strh r0, [r4, #50] ; 0x32 - ldrb r0, [r8] - mov r0, r0, lsl #26 - movs r0, r0, lsr #31 - beq _037FE144 - ldrsh r1, [r4, #50] ; 0x32 - ldrb r0, [r8, #20] - sub r0, r0, r6 - mov r0, r0, lsl #22 - add r0, r1, r0, asr #16 - strh r0, [r4, #50] ; 0x32 -_037FE144: - ldrb r0, [r8, #21] - cmp r0, #0 - bne _037FE168 - ldr r0, [sp, #48] ; 0x30 - str r0, [r4, #24] - ldrb r0, [r4, #3] - bic r0, r0, #4 - strb r0, [r4, #3] - b _037FE184 -_037FE168: - mul r1, r0, r0 - ldrsh r0, [r4, #50] ; 0x32 - cmp r0, #0 - rsblt r0, r0, #0 - mul r0, r1, r0 - mov r0, r0, asr #11 - str r0, [r4, #24] -_037FE184: - mov r0, #0 - str r0, [r4, #20] -_037FE18C: - add sp, sp, #24 - ldmia sp!, {r4, r5, r6, r7, r8, lr} - bx lr -_037FE198: .word 0x0000FFFF -_037FE19C: .word ChannelCallback - - arm_func_start PlayerUpdateChannelVolume -PlayerUpdateChannelVolume: ; 0x037FE1A0 - stmdb sp!, {r4, r5, r6, lr} - mov r6, r0 - mov r5, #0 - mov r4, #1 -_037FE1B0: - mov r0, r6 - mov r1, r5 - bl PlayerGetTrack - cmp r0, #0 - beq _037FE1D0 - mov r1, r6 - mov r2, r4 - bl TrackUpdateChannelVolume -_037FE1D0: - add r5, r5, #1 - cmp r5, #16 - blt _037FE1B0 - ldmia sp!, {r4, r5, r6, lr} - bx lr - - arm_func_start TrackUpdateChannelVolume -TrackUpdateChannelVolume: ; 0x037FE1E4 - stmdb sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - sub sp, sp, #4 - mov sl, r0 - mov fp, r2 - ldrb r0, [r1, #5] - mov r0, r0, lsl #1 - ldr r4, _037FE340 ; =SNDi_DecibelSquareTable - ldrsh r3, [r4, r0] - ldrb r0, [sl, #4] - mov r0, r0, lsl #1 - ldrsh r2, [r4, r0] - ldrb r0, [sl, #5] - mov r0, r0, lsl #1 - ldrsh r0, [r4, r0] - add r0, r2, r0 - add r3, r3, r0 - ldrsh r2, [sl, #10] - ldrsh r0, [r1, #6] - add r2, r2, r0 - ldrsb r4, [sl, #6] - ldrb r0, [sl, #7] - mov r0, r0, lsl #6 - mul r1, r4, r0 - ldrsh r0, [sl, #12] - add r0, r0, r1, asr #7 - ldrsb r1, [sl, #8] - ldrb r4, [sl, #1] - cmp r4, #127 ; 0x7f - mulne r4, r1, r4 - addne r1, r4, #64 ; 0x40 - movne r1, r1, asr #7 - ldrsb r4, [sl, #9] - add r1, r1, r4 - mov r4, #32768 ; 0x8000 - rsb r4, r4, #0 - cmp r3, r4 - movlt r3, r4 - mov r4, #32768 ; 0x8000 - rsb r4, r4, #0 - cmp r2, r4 - movlt r2, r4 - mvn r4, #127 ; 0x7f - cmp r1, r4 - movlt r1, r4 - blt _037FE2A0 - cmp r1, #127 ; 0x7f - movgt r1, #127 ; 0x7f -_037FE2A0: - ldr r9, [sl, #60] ; 0x3c - mov r4, #1 - mov r3, r3, lsl #16 - mov r7, r3, asr #16 - mov r0, r0, lsl #16 - mov r6, r0, asr #16 - mov r0, r1, lsl #24 - mov r5, r0, asr #24 - mov r0, r2, lsl #16 - mov r8, r0, asr #16 - b _037FE32C -_037FE2CC: - strh r8, [r9, #6] - ldrb r0, [r9, #2] - cmp r0, #3 - beq _037FE328 - strh r7, [r9, #12] - strh r6, [r9, #14] - strb r5, [r9, #11] - ldrb r0, [sl, #1] - strb r0, [r9, #4] - ldrh r0, [sl, #24] - strh r0, [r9, #40] ; 0x28 - ldrh r0, [sl, #26] - strh r0, [r9, #42] ; 0x2a - ldrh r0, [sl, #28] - strh r0, [r9, #44] ; 0x2c - ldr r0, [r9, #52] ; 0x34 - cmp r0, #0 - bne _037FE328 - cmp fp, #0 - beq _037FE328 - strb r4, [r9, #34] ; 0x22 - mov r0, r9 - bl SND_ReleaseExChannel -_037FE328: - ldr r9, [r9, #80] ; 0x50 -_037FE32C: - cmp r9, #0 - bne _037FE2CC - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, r8, r9, sl, fp, lr} - bx lr -_037FE340: .word SNDi_DecibelSquareTable - - arm_func_start ChannelCallback -ChannelCallback: ; 0x037FE344 - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r5, r0 - mov r4, r2 - cmp r1, #1 - bne _037FE368 - mov r1, #0 - strb r1, [r5, #34] ; 0x22 - bl SND_FreeExChannel -_037FE368: - ldr r1, [r4, #60] ; 0x3c - cmp r1, r5 - ldreq r0, [r5, #80] ; 0x50 - streq r0, [r4, #60] ; 0x3c - beq _037FE3A0 - b _037FE394 -_037FE380: - cmp r0, r5 - ldreq r0, [r5, #80] ; 0x50 - streq r0, [r1, #80] ; 0x50 - beq _037FE3A0 - mov r1, r0 -_037FE394: - ldr r0, [r1, #80] ; 0x50 - cmp r0, #0 - bne _037FE380 -_037FE3A0: - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr - - arm_func_start PlayerStop -PlayerStop: ; 0x037FE3AC - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r5, r0 - mov r4, #0 -_037FE3BC: - mov r0, r5 - mov r1, r4 - bl PlayerStopTrack - add r4, r4, #1 - cmp r4, #16 - blt _037FE3BC - ldrb r0, [r5] - bic r0, r0, #1 - strb r0, [r5] - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr - - arm_func_start PlayerStopTrack -PlayerStopTrack: ; 0x037FE3EC - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r5, r0 - mov r4, r1 - bl PlayerGetTrack - cmp r0, #0 - beq _037FE430 - mov r1, r5 - bl TrackStop - add r3, r5, #8 - ldr r2, _037FE43C ; =_038086EC - ldrb r1, [r3, r4] - ldrb r0, [r2, r1, lsl #6] - bic r0, r0, #1 - strb r0, [r2, r1, lsl #6] - mov r0, #255 ; 0xff - strb r0, [r3, r4] -_037FE430: - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr -_037FE43C: .word (SNDi_Work + 0x780) - - arm_func_start TrackStop -TrackStop: ; 0x037FE440 - stmdb sp!, {r4, lr} - mov r4, r0 - mvn r2, #0 - bl TrackReleaseChannels - mov r0, r4 - bl TrackFreeChannels - ldmia sp!, {r4, lr} - bx lr - - arm_func_start PlayerGetTrack -PlayerGetTrack: ; 0x037FE460 - cmp r1, #15 - movgt r0, #0 - bxgt lr - add r0, r0, r1 - ldrb r1, [r0, #8] - cmp r1, #255 ; 0xff - moveq r0, #0 - ldrne r0, _037FE488 ; =_038086EC - addne r0, r0, r1, lsl #6 - bx lr -_037FE488: .word (SNDi_Work + 0x780) - - arm_func_start PlayerSeqMain -PlayerSeqMain: ; 0x037FE48C - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #4 - mov r6, r0 - mov r5, #0 - add r1, r6, #28 - b _037FE4B4 -_037FE4A4: - ldrh r0, [r1] - sub r0, r0, #240 ; 0xf0 - strh r0, [r1] - add r5, r5, #1 -_037FE4B4: - ldrh r0, [r6, #28] - cmp r0, #240 ; 0xf0 - bcs _037FE4A4 - mov r4, #0 - mov r7, #1 - b _037FE4F0 -_037FE4CC: - mov r0, r6 - mov r1, r7 - bl PlayerStepTicks - cmp r0, #0 - beq _037FE4EC - mov r0, r6 - bl PlayerStop - b _037FE4F8 -_037FE4EC: - add r4, r4, #1 -_037FE4F0: - cmp r4, r5 - blt _037FE4CC -_037FE4F8: - ldr r0, _037FE548 ; =SNDi_SharedWork - ldr r0, [r0] - cmp r0, #0 - beq _037FE524 - add r3, r0, #64 ; 0x40 - ldrb r1, [r6, #1] - mov r0, #36 ; 0x24 - mul r2, r1, r0 - ldr r0, [r3, r2] - add r0, r0, r4 - str r0, [r3, r2] -_037FE524: - ldrh r2, [r6, #24] - ldrh r0, [r6, #26] - mul r1, r2, r0 - ldrh r0, [r6, #28] - add r0, r0, r1, asr #8 - strh r0, [r6, #28] - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, lr} - bx lr -_037FE548: .word SNDi_SharedWork - - arm_func_start TrackFreeChannels -TrackFreeChannels: ; 0x037FE54C - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r5, r0 - ldr r4, [r5, #60] ; 0x3c - b _037FE56C -_037FE560: - mov r0, r4 - bl SND_FreeExChannel - ldr r4, [r4, #80] ; 0x50 -_037FE56C: - cmp r4, #0 - bne _037FE560 - mov r0, #0 - str r0, [r5, #60] ; 0x3c - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr - - arm_func_start TrackReleaseChannels -TrackReleaseChannels: ; 0x037FE588 - stmdb sp!, {r4, r5, r6, r7, lr} - sub sp, sp, #4 - mov r4, r0 - mov r7, r2 - mov r2, #0 - bl TrackUpdateChannelVolume - ldr r6, [r4, #60] ; 0x3c - and r5, r7, #255 ; 0xff - mov r4, #1 - b _037FE5E4 -_037FE5B0: - mov r0, r6 - bl SND_IsExChannelActive - cmp r0, #0 - beq _037FE5E0 - cmp r7, #0 - blt _037FE5D4 - mov r0, r6 - mov r1, r5 - bl SND_SetExChannelRelease -_037FE5D4: - strb r4, [r6, #34] ; 0x22 - mov r0, r6 - bl SND_ReleaseExChannel -_037FE5E0: - ldr r6, [r6, #80] ; 0x50 -_037FE5E4: - cmp r6, #0 - bne _037FE5B0 - add sp, sp, #4 - ldmia sp!, {r4, r5, r6, r7, lr} - bx lr - - arm_func_start PlayerSetBank -PlayerSetBank: ; 0x037FE5F8 - stmdb sp!, {r4, lr} - ldrb r2, [r0] - bic r2, r2, #4 - strb r2, [r0] - str r1, [r0, #32] - mov r1, #120 ; 0x78 - strh r1, [r0, #24] - mov r1, #256 ; 0x100 - strh r1, [r0, #26] - mov r1, #240 ; 0xf0 - strh r1, [r0, #28] - mov r1, #127 ; 0x7f - strb r1, [r0, #5] - mov r3, #0 - strh r3, [r0, #6] - mov r1, #64 ; 0x40 - strb r1, [r0, #4] - mov r2, #255 ; 0xff -_037FE640: - add r1, r0, r3 - strb r2, [r1, #8] - add r3, r3, #1 - cmp r3, #16 - blt _037FE640 - ldr r2, _037FE6A4 ; =SNDi_SharedWork - ldr r3, [r2] - cmp r3, #0 - beq _037FE69C - mov r4, #0 - ldrb ip, [r0, #1] - mov r1, #36 ; 0x24 - mla r3, ip, r1, r3 - str r4, [r3, #64] ; 0x40 - mvn lr, #0 -_037FE67C: - ldr r3, [r2] - ldrb ip, [r0, #1] - mla r3, ip, r1, r3 - add r3, r3, r4, lsl #1 - strh lr, [r3, #32] - add r4, r4, #1 - cmp r4, #16 - blt _037FE67C -_037FE69C: - ldmia sp!, {r4, lr} - bx lr -_037FE6A4: .word SNDi_SharedWork - - arm_func_start TrackSetSeq -TrackSetSeq: ; 0x037FE6A8 - str r1, [r0, #36] ; 0x24 - ldr r1, [r0, #36] ; 0x24 - add r1, r1, r2 - str r1, [r0, #40] ; 0x28 - bx lr - - arm_func_start TrackInit -TrackInit: ; 0x037FE6BC - stmdb sp!, {r4, lr} - mov r4, r0 - mov r0, #0 - str r0, [r4, #36] ; 0x24 - str r0, [r4, #40] ; 0x28 - ldrb r1, [r4] - orr r1, r1, #2 - strb r1, [r4] - ldrb r1, [r4] - bic r1, r1, #4 - strb r1, [r4] - ldrb r1, [r4] - bic r1, r1, #8 - strb r1, [r4] - ldrb r1, [r4] - bic r1, r1, #16 - strb r1, [r4] - ldrb r1, [r4] - bic r1, r1, #32 - strb r1, [r4] - ldrb r1, [r4] - orr r1, r1, #64 ; 0x40 - strb r1, [r4] - ldrb r1, [r4] - bic r1, r1, #128 ; 0x80 - strb r1, [r4] - strb r0, [r4, #59] ; 0x3b - strh r0, [r4, #2] - mov r1, #64 ; 0x40 - strb r1, [r4, #18] - mov r2, #127 ; 0x7f - strb r2, [r4, #4] - strb r2, [r4, #5] - strh r0, [r4, #10] - strb r0, [r4, #8] - strb r0, [r4, #9] - strb r0, [r4, #6] - strh r0, [r4, #12] - mov r1, #255 ; 0xff - strb r1, [r4, #14] - strb r1, [r4, #15] - strb r1, [r4, #16] - strb r1, [r4, #17] - strb r2, [r4, #1] - mov r1, #2 - strb r1, [r4, #7] - mov r1, #60 ; 0x3c - strb r1, [r4, #20] - strb r0, [r4, #21] - strh r0, [r4, #22] - strb r0, [r4, #19] - ldr r0, _037FE7AC ; =0x0000FFFF - strh r0, [r4, #30] - add r0, r4, #24 - bl SND_InitLfoParam - mov r0, #0 - str r0, [r4, #32] - str r0, [r4, #60] ; 0x3c - ldmia sp!, {r4, lr} - bx lr -_037FE7AC: .word 0x0000FFFF - - arm_func_start TrackParseValue -TrackParseValue: ; 0x037FE7B0 - stmdb sp!, {r4, r5, r6, lr} - mov r4, r0 - mov r6, r1 - cmp r2, #4 - addls pc, pc, r2, lsl #2 - b _037FE86C - b _037FE7DC - b _037FE7F8 - b _037FE804 - b _037FE83C - b _037FE810 -_037FE7DC: - ldr r0, [r4, #40] ; 0x28 - bl SeqReadByte - mov r5, r0 - ldr r0, [r4, #40] ; 0x28 - add r0, r0, #1 - str r0, [r4, #40] ; 0x28 - b _037FE86C -_037FE7F8: - bl TrackReadU16 - mov r5, r0 - b _037FE86C -_037FE804: - bl TrackReadVLV - mov r5, r0 - b _037FE86C -_037FE810: - ldr r0, [r4, #40] ; 0x28 - bl SeqReadByte - mov r1, r0 - ldr r0, [r4, #40] ; 0x28 - add r0, r0, #1 - str r0, [r4, #40] ; 0x28 - mov r0, r6 - bl PlayerGetVariablePointer - cmp r0, #0 - ldrnesh r5, [r0] - b _037FE86C -_037FE83C: - bl TrackReadU16 - mov r5, r0, lsl #16 - mov r0, r4 - bl TrackReadU16 - mov r0, r0, lsl #16 - mov r4, r0, asr #16 - bl SND_CalcRandom - sub r1, r4, r5, asr #16 - add r1, r1, #1 - mul r1, r0, r1 - mov r0, r1, asr #16 - add r5, r0, r5, asr #16 -_037FE86C: - mov r0, r5 - ldmia sp!, {r4, r5, r6, lr} - bx lr - - arm_func_start TrackReadVLV -TrackReadVLV: ; 0x037FE878 - stmdb sp!, {r4, r5, r6, lr} - mov r6, r0 - mov r5, #0 - add r4, r6, #40 ; 0x28 -_037FE888: - ldr r0, [r6, #40] ; 0x28 - bl SeqReadByte - ldr r1, [r4] - add r1, r1, #1 - str r1, [r4] - and r1, r0, #127 ; 0x7f - orr r5, r1, r5, lsl #7 - ands r0, r0, #128 ; 0x80 - bne _037FE888 - mov r0, r5 - ldmia sp!, {r4, r5, r6, lr} - bx lr - - arm_func_start TrackReadU24 -TrackReadU24: ; 0x037FE8B8 - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r4, r0 - ldr r0, [r4, #40] ; 0x28 - bl SeqReadByte - mov r5, r0 - ldr r0, [r4, #40] ; 0x28 - add r0, r0, #1 - str r0, [r4, #40] ; 0x28 - ldr r0, [r4, #40] ; 0x28 - bl SeqReadByte - ldr r1, [r4, #40] ; 0x28 - add r1, r1, #1 - str r1, [r4, #40] ; 0x28 - orr r5, r5, r0, lsl #8 - ldr r0, [r4, #40] ; 0x28 - bl SeqReadByte - ldr r1, [r4, #40] ; 0x28 - add r1, r1, #1 - str r1, [r4, #40] ; 0x28 - orr r0, r5, r0, lsl #16 - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr - - arm_func_start TrackReadU16 -TrackReadU16: ; 0x037FE918 - stmdb sp!, {r4, r5, lr} - sub sp, sp, #4 - mov r5, r0 - ldr r0, [r5, #40] ; 0x28 - bl SeqReadByte - mov r4, r0 - ldr r0, [r5, #40] ; 0x28 - add r0, r0, #1 - str r0, [r5, #40] ; 0x28 - ldr r0, [r5, #40] ; 0x28 - bl SeqReadByte - ldr r1, [r5, #40] ; 0x28 - add r1, r1, #1 - str r1, [r5, #40] ; 0x28 - orr r0, r4, r0, lsl #8 - mov r0, r0, lsl #16 - mov r0, r0, lsr #16 - add sp, sp, #4 - ldmia sp!, {r4, r5, lr} - bx lr - - arm_func_start SeqReadByte -SeqReadByte: ; 0x037FE968 - stmdb sp!, {r4, lr} - mov r4, r0 - ldr r0, _037FE9B0 ; =sSeqCacheRange - ldr r1, [r0] - cmp r4, r1 - bcc _037FE98C - ldr r0, [r0, #4] - cmp r4, r0 - bcc _037FE994 -_037FE98C: - mov r0, r4 - bl SeqCacheFetch -_037FE994: - ldr r0, _037FE9B0 ; =sSeqCacheRange - ldr r0, [r0] - sub r1, r4, r0 - ldr r0, _037FE9B4 ; =sSeqCache - ldrb r0, [r0, r1] - ldmia sp!, {r4, lr} - bx lr -_037FE9B0: .word sSeqCacheRange -_037FE9B4: .word sSeqCache - - arm_func_start SeqCacheFetch -SeqCacheFetch: ; 0x037FE9B8 - bic r2, r0, #3 - ldr r0, _037FE9F0 ; =sSeqCacheRange - str r2, [r0] - add r1, r2, #16 - str r1, [r0, #4] - ldr r1, [r2] - str r1, [r0, #8] - ldr r1, [r2, #4] - str r1, [r0, #12] - ldr r1, [r2, #8] - str r1, [r0, #16] - ldr r1, [r2, #12] - str r1, [r0, #20] - bx lr -_037FE9F0: .word sSeqCacheRange diff --git a/arm7/lib/include/SND_unk_037FD440.h b/arm7/lib/include/SND_unk_037FD440.h index 5eef03df..f73825c8 100644 --- a/arm7/lib/include/SND_unk_037FD440.h +++ b/arm7/lib/include/SND_unk_037FD440.h @@ -3,20 +3,23 @@ #include "nitro/types.h" +#include "nitro/SND_seq_shared.h" +#include "nitro/SND_work_shared.h" + struct SNDTrack *PlayerGetTrack(struct SNDPlayer *player, int track); void PlayerStop(struct SNDPlayer *); void TrackMute(struct SNDTrack *track, struct SNDPlayer *player, int muteMode); void TrackReleaseChannels(struct SNDTrack *track, struct SNDPlayer *player, int release); void TrackFreeChannels(struct SNDTrack *track); BOOL PlayerStepTicks(struct SNDPlayer *player, u32 ticks); -void PlayerSetBank(struct SNDPlayer *player, struct SNDBankData *bankData); +void PlayerInit(struct SNDPlayer *player, struct SNDBankData *bankData); int AllocateTrack(void); void TrackInit(struct SNDTrack *track); -void TrackSetSeq(struct SNDTrack *track, const void *seq, u32 offset); -void SeqCacheFetch(const void *addr); -u8 SeqReadByte(const void *addr); +void TrackStart(struct SNDTrack *track, const void *seq, u32 offset); +void SeqCacheFetch(const u8 *addr); +u8 SeqReadByte(const u8 *addr); u16 TrackReadU16(struct SNDTrack *track); void PlayerSeqMain(struct SNDPlayer *player); -void PlayerUpdateChannelVolume(struct SNDPlayer *player); +void PlayerUpdateChannel(struct SNDPlayer *player); #endif //GUARD_SND_UNK_H diff --git a/arm7/lib/src/SND_seq.c b/arm7/lib/src/SND_seq.c index 6421b08f..65ec9d6a 100644 --- a/arm7/lib/src/SND_seq.c +++ b/arm7/lib/src/SND_seq.c @@ -33,7 +33,7 @@ void SND_SeqMain(BOOL step) { if (ply->flags.prepared) { if (step && !ply->flags.paused) PlayerSeqMain(ply); - PlayerUpdateChannelVolume(ply); + PlayerUpdateChannel(ply); } if (ply->flags.active) @@ -50,7 +50,7 @@ void SND_PrepareSeq(int player, const void *seq, u32 offset, struct SNDBankData if (ply->flags.active) PlayerStop(ply); - PlayerSetBank(ply, bankData); + PlayerInit(ply, bankData); int allocTrkIdx = AllocateTrack(); @@ -59,7 +59,7 @@ void SND_PrepareSeq(int player, const void *seq, u32 offset, struct SNDBankData struct SNDTrack *trk = &SNDi_Work.tracks[allocTrkIdx]; TrackInit(trk); - TrackSetSeq(trk, seq, offset); + TrackStart(trk, seq, offset); ply->tracks[0] = (u8)allocTrkIdx; SeqCacheFetch(trk->cur); diff --git a/arm7/lib/src/SND_unk_037FD440.c b/arm7/lib/src/SND_unk_037FD440.c new file mode 100644 index 00000000..253ccecb --- /dev/null +++ b/arm7/lib/src/SND_unk_037FD440.c @@ -0,0 +1,904 @@ +#include "SND_unk_037FD440.h" + +#include "SND_util.h" +#include "SND_lfo.h" +#include "SND_exChannel.h" +#include "SND_bank.h" + +#define SND_TRACK_MUTE_MODE_UNMUTE 0 +#define SND_TRACK_MUTE_MODE_MUTE 1 +#define SND_TRACK_MUTE_MODE_MUTE_RELEASE 2 +#define SND_TRACK_MUTE_MODE_MUTE_STOP 3 + +enum SNDSeqProc { + SND_PROC_SKIP_NOTES = 0, + SND_PROC_PLAY_NOTES = 1, +}; + +enum SNDSeqVal { + SND_SEQ_VAL_U8 = 0, + SND_SEQ_VAL_U16 = 1, + SND_SEQ_VAL_VLV = 2, + SND_SEQ_VAL_RAN = 3, + SND_SEQ_VAL_VAR = 4, +}; + +#define SND_TIMER_RATE 240 + +static struct { + const u8 *begin; + const u8 *end; + union { + u8 buf[16]; + u32 buf32[4]; + }; +} sSeqCache; +static int sPrintEnabled; + + + +static s16 *PlayerGetVariablePointer(const struct SNDPlayer *player, int var); +static void TrackUpdateChannel(struct SNDTrack *track, struct SNDPlayer *player, int release); + +// TODO make static +void SeqCacheFetch(const u8 *addr) { + addr = (const u8 *)((u32)addr & ~3); + sSeqCache.begin = addr; + sSeqCache.end = sSeqCache.begin + 16; + + const u32 *src = (const u32 *)addr; + + sSeqCache.buf32[0] = src[0]; + sSeqCache.buf32[1] = src[1]; + sSeqCache.buf32[2] = src[2]; + sSeqCache.buf32[3] = src[3]; +} + +// TODO make static +u8 SeqReadByte(const u8 *addr) { + if (addr < sSeqCache.begin || addr >= sSeqCache.end) + SeqCacheFetch(addr); + + return sSeqCache.buf[(u32)addr - (u32)sSeqCache.begin]; +} + +static inline u8 TrackReadU8(struct SNDTrack *track) { + u8 retval = SeqReadByte(track->cur); + track->cur++; + return retval; +} + +// TODO make static +u16 TrackReadU16(struct SNDTrack *track) { + int retval; + + retval = TrackReadU8(track); + retval |= TrackReadU8(track) << 8; + + return (u16)retval; +} + +static u32 TrackReadU24(struct SNDTrack *track) { + u32 retval; + + retval = TrackReadU8(track); + retval |= TrackReadU8(track) << 8; + retval |= TrackReadU8(track) << 16; + + return retval; +} + +static int TrackReadVLV(struct SNDTrack *track) { + int retval = 0; + int b; + + do { + b = TrackReadU8(track); + retval = (retval << 7) | (b & 0x7F); + } while(b & 0x80); + + return retval; +} + +static int TrackParseValue(struct SNDTrack *track, struct SNDPlayer *player, int valueType) { + int retval; + int hi; + int lo; + int ran; + s16 *var; + + // BUG: undefined behavior if invalid valueType is passed (uninitialized return value) + + switch (valueType) { + case SND_SEQ_VAL_U8: + retval = TrackReadU8(track); + break; + case SND_SEQ_VAL_U16: + retval = TrackReadU16(track); + break; + case SND_SEQ_VAL_VLV: + retval = TrackReadVLV(track); + break; + case SND_SEQ_VAL_VAR: + var = PlayerGetVariablePointer(player, TrackReadU8(track)); + if (var) + retval = *var; + break; + case SND_SEQ_VAL_RAN: + lo = TrackReadU16(track) << 16; + hi = (s16)TrackReadU16(track); + ran = SND_CalcRandom(); + retval = hi - (lo >> 16); + retval += 1; + retval = (ran * retval) >> 16; + retval += lo >> 16; + break; + } + + return retval; +} + +// TODO make static +void TrackInit(struct SNDTrack *track) { + track->base = NULL; + track->cur = NULL; + + track->flags.noteWait = TRUE; + track->flags.muted = FALSE; + track->flags.tie = FALSE; + track->flags.noteFinishWait = FALSE; + track->flags.portamento = FALSE; + track->flags.cmp = TRUE; + track->flags.channelMask = FALSE; + + track->callStackDepth = 0; + track->program = 0; + track->priority = 64; + track->volume = 127; + track->expression = 127; + track->extFader = 0; + track->pan = 0; + track->extPan = 0; + track->pitchBend = 0; + track->extPitch = 0; + track->envAttack = 255; + track->envDecay = 255; + track->envSustain = 255; + track->envRelease = 255; + track->panRange = 127; + track->bendRange = 2; + track->portamentoKey = 60; + track->portamentoTime = 0; + track->sweepPitch = 0; + track->transpose = 0; + track->channelMask = 0xFFFF; + SND_InitLfoParam(&track->mod); + track->wait = 0; + track->channelLLHead = NULL; +} + +// TODO make static +void TrackStart(struct SNDTrack *track, const void *seq, u32 offset) { + track->base = (const u8 *)seq; + track->cur = &track->base[offset]; +} + +// TODO make static later +void PlayerInit(struct SNDPlayer *player, struct SNDBankData *bank) { + player->flags.paused = FALSE; + player->bank = bank; + player->tempo = 120; + player->tempoRatio = 256; + player->tempoCounter = SND_TIMER_RATE; + player->volume = 0x7F; + player->extFader = 0; + player->prio = 64; + + for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) { + player->tracks[i] = 0xFF; + } + + if (SNDi_SharedWork) { + SNDi_SharedWork->players[player->playerId].tickCounter = 0; + + for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) { + SNDi_SharedWork->players[player->playerId].localVars[i] = -1; + } + } +} + +// TODO make static +void TrackReleaseChannels(struct SNDTrack *track, struct SNDPlayer *player, int release) { + TrackUpdateChannel(track, player, 0); + + for (struct SNDExChannel *chn = track->channelLLHead; chn; chn = chn->channelLLNext) { + if (SND_IsExChannelActive(chn)) { + if (release >= 0) + SND_SetExChannelRelease(chn, release & 0xFF); + chn->priority = 1; + SND_ReleaseExChannel(chn); + } + } +} + +// TODO make static +void TrackFreeChannels(struct SNDTrack *track) { + for (struct SNDExChannel *chn = track->channelLLHead; chn; chn = chn->channelLLNext) { + SND_FreeExChannel(chn); + } + + track->channelLLHead = NULL; +} + +void PlayerSeqMain(struct SNDPlayer *player) { + int ticks = 0; + int tempoInc; + int i; + + while (player->tempoCounter >= SND_TIMER_RATE) { + player->tempoCounter -= SND_TIMER_RATE; + ticks++; + } + + for (i = 0; i < ticks; i++) { + if (PlayerStepTicks(player, SND_PROC_PLAY_NOTES)) { + PlayerStop(player); + break; + } + } + + if (SNDi_SharedWork) { + SNDi_SharedWork->players[player->playerId].tickCounter += i; + } + + tempoInc = player->tempo; + tempoInc *= player->tempoRatio; + tempoInc >>= 8; + + player->tempoCounter += tempoInc; +} + +struct SNDTrack *PlayerGetTrack(struct SNDPlayer *player, int track) { + if (track > (SND_TRACK_COUNT_PER_PLAYER - 1)) + return NULL; + + if (player->tracks[track] == 0xFF) + return NULL; + + return &SNDi_Work.tracks[player->tracks[track]]; +} + +static void TrackStop(struct SNDTrack *track, struct SNDPlayer *player) { + TrackReleaseChannels(track, player, -1); + TrackFreeChannels(track); +} + +static void PlayerStopTrack(struct SNDPlayer *player, int trackIdx) { + struct SNDTrack *track = PlayerGetTrack(player, trackIdx); + + if (track == NULL) + return; + + TrackStop(track, player); + SNDi_Work.tracks[player->tracks[trackIdx]].flags.active = FALSE; + player->tracks[trackIdx] = 0xFF; +} + +void PlayerStop(struct SNDPlayer *player) { + for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) { + PlayerStopTrack(player, i); + } + player->flags.active = FALSE; +} + +static void ChannelCallback(struct SNDExChannel *chn, int status, void *track_) { + struct SNDExChannel *cur; + struct SNDTrack *track; + + track = (struct SNDTrack *)track_; + + if (status == 1) { + chn->priority = 0; + SND_FreeExChannel(chn); + } + + if (track->channelLLHead == chn) { + track->channelLLHead = chn->channelLLNext; + } else { + cur = track->channelLLHead; + + while (cur->channelLLNext) { + if (cur->channelLLNext == chn) { + cur->channelLLNext = chn->channelLLNext; + return; + } + cur = cur->channelLLNext; + } + } +} + +static void TrackUpdateChannel(struct SNDTrack *track, struct SNDPlayer *player, int release) { + int vol; + int fader; + int pan; + int pitch; + + vol = SNDi_DecibelSquareTable[track->volume] + + SNDi_DecibelSquareTable[track->expression] + + SNDi_DecibelSquareTable[player->volume]; + + fader = track->extFader + player->extFader; + + pitch = track->pitchBend; + pitch *= track->bendRange << 6; + pitch >>= 7; + pitch += track->extPitch; + + pan = track->pan; + + if (track->panRange != 127) + pan = (pan * track->panRange + 0x40) >> 7; + + pan += track->extPan; + + if (vol < -0x8000) + vol = -0x8000; + + if (fader < -0x8000) + fader = -0x8000; + + if (pan < -128) + pan = -128; + else if (pan > 127) + pan = 127; + + for (struct SNDExChannel *chn = track->channelLLHead; chn != NULL; chn = chn->channelLLNext) { + chn->userDecay2 = (short)fader; + + if (chn->envStatus == 3) + continue; + + chn->userDecay = (s16)vol; + chn->userPitch = (s16)pitch; + chn->userPan = (s8)pan; + chn->panRange = track->panRange; + chn->lfo.param = track->mod; + + if (chn->length == 0 && release != 0) { + chn->priority = 1; + SND_ReleaseExChannel(chn); + } + } +} + +// TODO make static +void PlayerUpdateChannel(struct SNDPlayer *player) { + for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) { + struct SNDTrack *trk = PlayerGetTrack(player, i); + if (trk) { + TrackUpdateChannel(trk, player, 1); + } + } +} + +static void TrackPlayNote(struct SNDTrack *track, struct SNDPlayer *player, int midiKey, int velocity, int length) { + struct SNDExChannel *chn = NULL; + + if (track->flags.tie) { + chn = track->channelLLHead; + if (chn) { + chn->midiKey = (u8)midiKey; + chn->velocity = (u8)velocity; + } + } + + if (chn == NULL) { + struct SNDInstData inst; + if (!SND_ReadInstData(player->bank, track->program, midiKey, &inst)) + return; + + u32 allowedChannels; + + switch (inst.type) { + case SND_INST_PCM: + case SND_INST_DIRECTPCM: + // all channels support PCM + allowedChannels = 0xFFFF; + break; + case SND_INST_PSG: + // only channels 8, 9, 10, 11, 12, 13 support PSG + allowedChannels = 0x3F00; + break; + case SND_INST_NOISE: + // only channels 14 and 15 support noise + allowedChannels = 0xC000; + break; + default: + return; + } + + allowedChannels &= track->channelMask; + + chn = SND_AllocExChannel(allowedChannels, player->prio + track->priority, track->flags.channelMask, ChannelCallback, track); + if (chn == NULL) + return; + + if (!SND_NoteOn(chn, midiKey, velocity, track->flags.tie ? -1 : length, player->bank, &inst)) { + chn->priority = 0; + SND_FreeExChannel(chn); + return; + } + + chn->channelLLNext = track->channelLLHead; + track->channelLLHead = chn; + } + + if (track->envAttack != 0xFF) + SND_SetExChannelAttack(chn, track->envAttack); + + if (track->envDecay != 0xFF) + SND_SetExChannelDecay(chn, track->envDecay); + + if (track->envSustain != 0xFF) + SND_SetExChannelSustain(chn, track->envSustain); + + if (track->envRelease != 0xFF) + SND_SetExChannelRelease(chn, track->envRelease); + + chn->sweepPitch = track->sweepPitch; + if (track->flags.portamento) + chn->sweepPitch += (short)((track->portamentoKey - midiKey) << 6); + + if (track->portamentoTime == 0) { + chn->sweepLength = length; + chn->flags.autoSweep = FALSE; + } else { + int swp = track->portamentoTime * track->portamentoTime; + swp *= chn->sweepPitch < 0 ? -chn->sweepPitch : chn->sweepPitch; + swp >>= 11; + chn->sweepLength = swp; + } + + chn->sweepCounter = 0; +} + +static int TrackStepTicks(struct SNDTrack *track, struct SNDPlayer *player, int trackIdx, u32 playNotes) { + (void)trackIdx; + + struct SNDExChannel *chn; + u8 cmd; + enum SNDSeqVal valueType; + BOOL specialValueType; + BOOL runCmd; + s32 length; + int midiKey; + + s32 par; + + + for (chn = track->channelLLHead; chn; chn = chn->channelLLNext) { + if (chn->length > 0) + chn->length--; + + if (!chn->flags.autoSweep && chn->sweepCounter < chn->sweepLength) + chn->sweepCounter++; + } + + if (track->flags.noteFinishWait) { + if (track->channelLLHead) + return 0; + track->flags.noteFinishWait = FALSE; + } + + if (track->wait > 0) { + track->wait--; + if (track->wait > 0) + return 0; + } + + SeqCacheFetch(track->cur); + + while (track->wait == 0 && !track->flags.noteFinishWait) { + specialValueType = FALSE; + runCmd = TRUE; + + cmd = TrackReadU8(track); + + if (cmd == 0xA2) { + cmd = TrackReadU8(track); + runCmd = track->flags.cmp; + } + + if (cmd == 0xA0) { + cmd = TrackReadU8(track); + valueType = SND_SEQ_VAL_RAN; + specialValueType = TRUE; + } + + if (cmd == 0xA1) { + cmd = TrackReadU8(track); + valueType = SND_SEQ_VAL_VAR; + specialValueType = TRUE; + } + + if ((cmd & 0x80) == 0) { + par = TrackReadU8(track); + + length = TrackParseValue(track, player, specialValueType ? valueType : SND_SEQ_VAL_VLV); + midiKey = cmd + track->transpose; + + if (!runCmd) + continue; + + if (midiKey < 0) + midiKey = 0; + else if (midiKey > 127) { + midiKey = 127; + } + + if (!track->flags.muted && playNotes != 0) { + TrackPlayNote(track, player, midiKey, par, (length > 0) ? length : -1); + } + + track->portamentoKey = (u8)midiKey; + + if (track->flags.noteWait) { + track->wait = length; + if (length == 0) { + track->flags.noteFinishWait = TRUE; + } + } + + continue; + } + + switch (cmd & 0xF0) { + case 0x80: + par = TrackParseValue(track, player, specialValueType ? valueType : SND_SEQ_VAL_VLV); + if (!runCmd) + break; + + switch (cmd) { + case 0x80: + track->wait = par; + break; + case 0x81: + if (par < 0x10000) + track->program = (u16)par; + break; + } + break; + case 0x90: + switch (cmd) { + case 0x93: + { + u32 off; + struct SNDTrack *newTrack; + + par = TrackReadU8(track); + off = TrackReadU24(track); + if (!runCmd) + break; + + newTrack = PlayerGetTrack(player, par); + if (newTrack && newTrack != track) { + TrackStop(newTrack, player); + TrackStart(newTrack, track->base, off); + } + } + break; + case 0x94: + { + u32 off = TrackReadU24(track); + if (!runCmd) + break; + track->cur = &track->base[off]; + } + break; + case 0x95: + { + u32 off = TrackReadU24(track); + if (!runCmd) + break; + + if (track->callStackDepth < SND_TRACK_MAX_CALL) { + track->posCallStack[track->callStackDepth] = track->cur; + track->callStackDepth++; + track->cur = &track->base[off]; + } + break; + } + } + break; + case 0xC0: + case 0xD0: + { + union { + u8 _u8; + s8 _s8; + } par; + par._u8 = (u8)TrackParseValue(track, player, specialValueType ? valueType : SND_SEQ_VAL_U8); + if (!runCmd) + break; + + switch (cmd) { + case 0xC1: + track->volume = par._u8; + break; + case 0xD5: + track->expression = par._u8; + break; + case 0xC2: + player->volume = par._u8; + break; + case 0xC5: + track->bendRange = par._u8; + break; + case 0xC6: + track->priority = par._u8; + break; + case 0xC7: + track->flags.noteWait = par._u8; + break; + case 0xCF: + track->portamentoTime = par._u8; + break; + case 0xCA: + track->mod.depth = par._u8; + break; + case 0xCB: + track->mod.speed = par._u8; + break; + case 0xCC: + track->mod.target = par._u8; + break; + case 0xCD: + track->mod.range = par._u8; + break; + case 0xD0: + track->envAttack = par._u8; + break; + case 0xD1: + track->envDecay = par._u8; + break; + case 0xD2: + track->envSustain = par._u8; + break; + case 0xD3: + track->envRelease = par._u8; + break; + case 0xD4: + if (track->callStackDepth < SND_TRACK_MAX_CALL) { + track->posCallStack[track->callStackDepth] = track->cur; + track->loopCount[track->callStackDepth] = par._u8; + track->callStackDepth++; + } + break; + case 0xC8: + track->flags.tie = par._u8; + TrackReleaseChannels(track, player, -1); + TrackFreeChannels(track); + break; + case 0xD7: + TrackMute(track, player, par._u8); + break; + case 0xC9: + track->portamentoKey = (u8)(par._u8 + track->transpose); + track->flags.portamento = TRUE; + break; + case 0xCE: + track->flags.portamento = par._u8; + break; + case 0xC3: + track->transpose = par._s8; + break; + case 0xC4: + track->pitchBend = par._s8; + break; + case 0xC0: + track->pan = (s8)(par._u8 - 0x40); + break; + case 0xD6: + { + s16 *varPtr; + + if (sPrintEnabled) { + varPtr = PlayerGetVariablePointer(player, par._u8); + } + } + break; + } + } + break; + case 0xE0: + { + s16 par = (s16)TrackParseValue(track, player, specialValueType ? valueType : SND_SEQ_VAL_U16); + if (!runCmd) + break; + + switch (cmd) { + case 0xE3: + track->sweepPitch = par; + break; + case 0xE1: + player->tempo = (u16)par; + break; + case 0xE0: + track->mod.delay = (u16)par; + break; + } + } + break; + case 0xB0: + { + // TODO fix refalloc -> stack on varNum + int varNum = TrackReadU8(track); + + s16 par = (s16)TrackParseValue(track, player, specialValueType ? valueType : SND_SEQ_VAL_U16); + s16 *varPtr = PlayerGetVariablePointer(player, varNum); + + if (!runCmd) + break; + + if (varPtr == NULL) + break; + + switch (cmd) { + case 0xB0: + *varPtr = par; + break; + case 0xB1: + *varPtr += par; + break; + case 0xB2: + *varPtr -= par; + break; + case 0xB3: + *varPtr *= par; + break; + case 0xB4: + if (par != 0) + *varPtr /= par; + break; + case 0xB5: + if (par >= 0) + *varPtr <<= par; + else + *varPtr >>= -par; + break; + case 0xB6: + { + BOOL neg = FALSE; + if (par < 0) { + neg = TRUE; + par = (s16)(-par); + } + s32 random = SND_CalcRandom(); + random = (random * (par + 1)) >> 16; + if (neg) + random = -random; + *varPtr = (s16)random; + } + break; + case 0xB7: + break; + case 0xB8: + track->flags.cmp = *varPtr == par; + break; + case 0xB9: + track->flags.cmp = *varPtr >= par; + break; + case 0xBA: + track->flags.cmp = *varPtr > par; + break; + case 0xBB: + track->flags.cmp = *varPtr <= par; + break; + case 0xBC: + track->flags.cmp = *varPtr < par; + break; + case 0xBD: + track->flags.cmp = *varPtr != par; + break; + } + } + break; + case 0xF0: + if (!runCmd) + break; + + switch (cmd) { + case 0xFD: + if (track->callStackDepth != 0) { + track->callStackDepth--; + track->cur = track->posCallStack[track->callStackDepth]; + } + break; + case 0xFC: + { + if (track->callStackDepth == 0) + break; + + // gosh, this was nasty to figure out + u8 loopCount = track->loopCount[track->callStackDepth - 1]; + if (loopCount != 0) { + loopCount--; + if (loopCount == 0) { + track->callStackDepth--; + break; + } + } + track->loopCount[track->callStackDepth - 1] = loopCount; + track->cur = track->posCallStack[track->callStackDepth - 1]; + } + break; + case 0xFE: + break; + case 0xFF: + return -1; + } + break; + } + } + + return 0; +} + +BOOL PlayerStepTicks(struct SNDPlayer *player, u32 ticks) { + BOOL isPlaying = FALSE; + + for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) { + struct SNDTrack *trk = PlayerGetTrack(player, i); + + if (trk && trk->cur) { + if (TrackStepTicks(trk, player, i, ticks)) + PlayerStopTrack(player, i); + else + isPlaying = TRUE; + } + } + + return !isPlaying; +} + +static s16 *PlayerGetVariablePointer(const struct SNDPlayer *player, int var) { + if (SNDi_SharedWork == NULL) + return NULL; + else if (var < 16) { + return &SNDi_SharedWork->players[player->playerId].localVars[var]; + } else { + return &SNDi_SharedWork->globalVars[var - 16]; + } +} + +int AllocateTrack(void) { + for (int i = 0; i < SND_TRACK_COUNT; i++) { + if (!SNDi_Work.tracks[i].flags.active) { + SNDi_Work.tracks[i].flags.active = TRUE; + return i; + } + } + + return -1; +} + +// TODO make static after merging with SND_seq +void TrackMute(struct SNDTrack *track, struct SNDPlayer *player, int muteMode) { + switch (muteMode) { + case SND_TRACK_MUTE_MODE_UNMUTE: + track->flags.muted = FALSE; + break; + case SND_TRACK_MUTE_MODE_MUTE: + track->flags.muted = TRUE; + break; + case SND_TRACK_MUTE_MODE_MUTE_RELEASE: + track->flags.muted = TRUE; + TrackReleaseChannels(track, player, -1); + break; + case SND_TRACK_MUTE_MODE_MUTE_STOP: + track->flags.muted = TRUE; + TrackReleaseChannels(track, player, 127); + TrackFreeChannels(track); + break; + } +} diff --git a/include/nitro/SND_seq_shared.h b/include/nitro/SND_seq_shared.h index ff73e951..d76fc8d0 100644 --- a/include/nitro/SND_seq_shared.h +++ b/include/nitro/SND_seq_shared.h @@ -1,6 +1,8 @@ #ifndef GUARD_SND_SEQ_SHARED_H #define GUARD_SND_SEQ_SHARED_H +#include "nitro/SND_exChannel_shared.h" + #define SND_TRACK_COUNT_PER_PLAYER 16 #define SND_INVALID_TRACK_INDEX 0xFF -- cgit v1.2.3 From 80b1041da789f4c83318287ca59c5f95ae84fb6a Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Sun, 1 Aug 2021 03:00:03 +0200 Subject: arm7: merge SND_seq SND_unk --- arm7/arm7.lsf | 1 - arm7/lib/include/SND_unk_037FD440.h | 25 - arm7/lib/src/SND_seq.c | 905 +++++++++++++++++++++++++++++++++++- arm7/lib/src/SND_unk_037FD440.c | 904 ----------------------------------- 4 files changed, 904 insertions(+), 931 deletions(-) delete mode 100644 arm7/lib/include/SND_unk_037FD440.h delete mode 100644 arm7/lib/src/SND_unk_037FD440.c diff --git a/arm7/arm7.lsf b/arm7/arm7.lsf index 4c14fd1e..074e5311 100644 --- a/arm7/arm7.lsf +++ b/arm7/arm7.lsf @@ -49,7 +49,6 @@ Autoload WRAM Object SND_wave.o Object SND_lockChannel.o Object SND_exChannel.o - Object SND_unk_037FD440.o Object SND_seq.o Object SND_bank.o Object SND_work.o diff --git a/arm7/lib/include/SND_unk_037FD440.h b/arm7/lib/include/SND_unk_037FD440.h deleted file mode 100644 index f73825c8..00000000 --- a/arm7/lib/include/SND_unk_037FD440.h +++ /dev/null @@ -1,25 +0,0 @@ -#ifndef GUARD_SND_UNK_H -#define GUARD_SND_UNK_H - -#include "nitro/types.h" - -#include "nitro/SND_seq_shared.h" -#include "nitro/SND_work_shared.h" - -struct SNDTrack *PlayerGetTrack(struct SNDPlayer *player, int track); -void PlayerStop(struct SNDPlayer *); -void TrackMute(struct SNDTrack *track, struct SNDPlayer *player, int muteMode); -void TrackReleaseChannels(struct SNDTrack *track, struct SNDPlayer *player, int release); -void TrackFreeChannels(struct SNDTrack *track); -BOOL PlayerStepTicks(struct SNDPlayer *player, u32 ticks); -void PlayerInit(struct SNDPlayer *player, struct SNDBankData *bankData); -int AllocateTrack(void); -void TrackInit(struct SNDTrack *track); -void TrackStart(struct SNDTrack *track, const void *seq, u32 offset); -void SeqCacheFetch(const u8 *addr); -u8 SeqReadByte(const u8 *addr); -u16 TrackReadU16(struct SNDTrack *track); -void PlayerSeqMain(struct SNDPlayer *player); -void PlayerUpdateChannel(struct SNDPlayer *player); - -#endif //GUARD_SND_UNK_H diff --git a/arm7/lib/src/SND_seq.c b/arm7/lib/src/SND_seq.c index 65ec9d6a..76664fdd 100644 --- a/arm7/lib/src/SND_seq.c +++ b/arm7/lib/src/SND_seq.c @@ -2,7 +2,58 @@ #include "SND_main.h" #include "SND_work.h" -#include "SND_unk_037FD440.h" +#include "SND_util.h" +#include "SND_lfo.h" +#include "SND_exChannel.h" +#include "SND_bank.h" + +#define SND_TIMER_RATE 240 + +#define SND_TRACK_MUTE_MODE_UNMUTE 0 +#define SND_TRACK_MUTE_MODE_MUTE 1 +#define SND_TRACK_MUTE_MODE_MUTE_RELEASE 2 +#define SND_TRACK_MUTE_MODE_MUTE_STOP 3 + +enum SNDSeqProc { + SND_PROC_SKIP_NOTES = 0, + SND_PROC_PLAY_NOTES = 1, +}; + +enum SNDSeqVal { + SND_SEQ_VAL_U8 = 0, + SND_SEQ_VAL_U16 = 1, + SND_SEQ_VAL_VLV = 2, + SND_SEQ_VAL_RAN = 3, + SND_SEQ_VAL_VAR = 4, +}; + +static struct { + const u8 *begin; + const u8 *end; + union { + u8 buf[16]; + u32 buf32[4]; + }; +} sSeqCache; +static int sPrintEnabled; + +static void PlayerSeqMain(struct SNDPlayer *player); +static void PlayerUpdateChannel(struct SNDPlayer *player); +static void PlayerStop(struct SNDPlayer *player); +static void PlayerInit(struct SNDPlayer *player, struct SNDBankData *bank); +static int AllocateTrack(void); +static void TrackInit(struct SNDTrack *track); +static void TrackStart(struct SNDTrack *track, const void *seq, u32 offset); +static void SeqCacheFetch(const u8 *addr); +static u8 SeqReadByte(const u8 *addr); +static u16 TrackReadU16(struct SNDTrack *track); +static struct SNDTrack *PlayerGetTrack(struct SNDPlayer *player, int track); +static void TrackReleaseChannels(struct SNDTrack *track, struct SNDPlayer *player, int release); +static void TrackFreeChannels(struct SNDTrack *track); +static BOOL PlayerStepTicks(struct SNDPlayer *player, u32 ticks); +static void TrackMute(struct SNDTrack *track, struct SNDPlayer *player, int muteMode); +static s16 *PlayerGetVariablePointer(const struct SNDPlayer *player, int var); +static void TrackUpdateChannel(struct SNDTrack *track, struct SNDPlayer *player, int release); void SND_SeqInit(void) { for (int i = 0; i < SND_PLAYER_COUNT; i++) { @@ -264,3 +315,855 @@ void SNDi_SetTrackParam(int player, u32 trackMask, u32 offset, u32 data, int siz } } } + +static void SeqCacheFetch(const u8 *addr) { + addr = (const u8 *)((u32)addr & ~3); + sSeqCache.begin = addr; + sSeqCache.end = sSeqCache.begin + 16; + + const u32 *src = (const u32 *)addr; + + sSeqCache.buf32[0] = src[0]; + sSeqCache.buf32[1] = src[1]; + sSeqCache.buf32[2] = src[2]; + sSeqCache.buf32[3] = src[3]; +} + +static u8 SeqReadByte(const u8 *addr) { + if (addr < sSeqCache.begin || addr >= sSeqCache.end) + SeqCacheFetch(addr); + + return sSeqCache.buf[(u32)addr - (u32)sSeqCache.begin]; +} + +static inline u8 TrackReadU8(struct SNDTrack *track) { + u8 retval = SeqReadByte(track->cur); + track->cur++; + return retval; +} + +static u16 TrackReadU16(struct SNDTrack *track) { + int retval; + + retval = TrackReadU8(track); + retval |= TrackReadU8(track) << 8; + + return (u16)retval; +} + +static u32 TrackReadU24(struct SNDTrack *track) { + u32 retval; + + retval = TrackReadU8(track); + retval |= TrackReadU8(track) << 8; + retval |= TrackReadU8(track) << 16; + + return retval; +} + +static int TrackReadVLV(struct SNDTrack *track) { + int retval = 0; + int b; + + do { + b = TrackReadU8(track); + retval = (retval << 7) | (b & 0x7F); + } while(b & 0x80); + + return retval; +} + +static int TrackParseValue(struct SNDTrack *track, struct SNDPlayer *player, int valueType) { + int retval; + int hi; + int lo; + int ran; + s16 *var; + + // BUG: undefined behavior if invalid valueType is passed (uninitialized return value) + + switch (valueType) { + case SND_SEQ_VAL_U8: + retval = TrackReadU8(track); + break; + case SND_SEQ_VAL_U16: + retval = TrackReadU16(track); + break; + case SND_SEQ_VAL_VLV: + retval = TrackReadVLV(track); + break; + case SND_SEQ_VAL_VAR: + var = PlayerGetVariablePointer(player, TrackReadU8(track)); + if (var) + retval = *var; + break; + case SND_SEQ_VAL_RAN: + lo = TrackReadU16(track) << 16; + hi = (s16)TrackReadU16(track); + ran = SND_CalcRandom(); + retval = hi - (lo >> 16); + retval += 1; + retval = (ran * retval) >> 16; + retval += lo >> 16; + break; + } + + return retval; +} + +static void TrackInit(struct SNDTrack *track) { + track->base = NULL; + track->cur = NULL; + + track->flags.noteWait = TRUE; + track->flags.muted = FALSE; + track->flags.tie = FALSE; + track->flags.noteFinishWait = FALSE; + track->flags.portamento = FALSE; + track->flags.cmp = TRUE; + track->flags.channelMask = FALSE; + + track->callStackDepth = 0; + track->program = 0; + track->priority = 64; + track->volume = 127; + track->expression = 127; + track->extFader = 0; + track->pan = 0; + track->extPan = 0; + track->pitchBend = 0; + track->extPitch = 0; + track->envAttack = 255; + track->envDecay = 255; + track->envSustain = 255; + track->envRelease = 255; + track->panRange = 127; + track->bendRange = 2; + track->portamentoKey = 60; + track->portamentoTime = 0; + track->sweepPitch = 0; + track->transpose = 0; + track->channelMask = 0xFFFF; + SND_InitLfoParam(&track->mod); + track->wait = 0; + track->channelLLHead = NULL; +} + +static void TrackStart(struct SNDTrack *track, const void *seq, u32 offset) { + track->base = (const u8 *)seq; + track->cur = &track->base[offset]; +} + +static void PlayerInit(struct SNDPlayer *player, struct SNDBankData *bank) { + player->flags.paused = FALSE; + player->bank = bank; + player->tempo = 120; + player->tempoRatio = 256; + player->tempoCounter = SND_TIMER_RATE; + player->volume = 0x7F; + player->extFader = 0; + player->prio = 64; + + for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) { + player->tracks[i] = 0xFF; + } + + if (SNDi_SharedWork) { + SNDi_SharedWork->players[player->playerId].tickCounter = 0; + + for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) { + SNDi_SharedWork->players[player->playerId].localVars[i] = -1; + } + } +} + +static void TrackReleaseChannels(struct SNDTrack *track, struct SNDPlayer *player, int release) { + TrackUpdateChannel(track, player, 0); + + for (struct SNDExChannel *chn = track->channelLLHead; chn; chn = chn->channelLLNext) { + if (SND_IsExChannelActive(chn)) { + if (release >= 0) + SND_SetExChannelRelease(chn, release & 0xFF); + chn->priority = 1; + SND_ReleaseExChannel(chn); + } + } +} + +static void TrackFreeChannels(struct SNDTrack *track) { + for (struct SNDExChannel *chn = track->channelLLHead; chn; chn = chn->channelLLNext) { + SND_FreeExChannel(chn); + } + + track->channelLLHead = NULL; +} + +static void PlayerSeqMain(struct SNDPlayer *player) { + int ticks = 0; + int tempoInc; + int i; + + while (player->tempoCounter >= SND_TIMER_RATE) { + player->tempoCounter -= SND_TIMER_RATE; + ticks++; + } + + for (i = 0; i < ticks; i++) { + if (PlayerStepTicks(player, SND_PROC_PLAY_NOTES)) { + PlayerStop(player); + break; + } + } + + if (SNDi_SharedWork) { + SNDi_SharedWork->players[player->playerId].tickCounter += i; + } + + tempoInc = player->tempo; + tempoInc *= player->tempoRatio; + tempoInc >>= 8; + + player->tempoCounter += tempoInc; +} + +static struct SNDTrack *PlayerGetTrack(struct SNDPlayer *player, int track) { + if (track > (SND_TRACK_COUNT_PER_PLAYER - 1)) + return NULL; + + if (player->tracks[track] == 0xFF) + return NULL; + + return &SNDi_Work.tracks[player->tracks[track]]; +} + +static void TrackStop(struct SNDTrack *track, struct SNDPlayer *player) { + TrackReleaseChannels(track, player, -1); + TrackFreeChannels(track); +} + +static void PlayerStopTrack(struct SNDPlayer *player, int trackIdx) { + struct SNDTrack *track = PlayerGetTrack(player, trackIdx); + + if (track == NULL) + return; + + TrackStop(track, player); + SNDi_Work.tracks[player->tracks[trackIdx]].flags.active = FALSE; + player->tracks[trackIdx] = 0xFF; +} + +static void PlayerStop(struct SNDPlayer *player) { + for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) { + PlayerStopTrack(player, i); + } + player->flags.active = FALSE; +} + +static void ChannelCallback(struct SNDExChannel *chn, int status, void *track_) { + struct SNDExChannel *cur; + struct SNDTrack *track; + + track = (struct SNDTrack *)track_; + + if (status == 1) { + chn->priority = 0; + SND_FreeExChannel(chn); + } + + if (track->channelLLHead == chn) { + track->channelLLHead = chn->channelLLNext; + } else { + cur = track->channelLLHead; + + while (cur->channelLLNext) { + if (cur->channelLLNext == chn) { + cur->channelLLNext = chn->channelLLNext; + return; + } + cur = cur->channelLLNext; + } + } +} + +static void TrackUpdateChannel(struct SNDTrack *track, struct SNDPlayer *player, int release) { + int vol; + int fader; + int pan; + int pitch; + + vol = SNDi_DecibelSquareTable[track->volume] + + SNDi_DecibelSquareTable[track->expression] + + SNDi_DecibelSquareTable[player->volume]; + + fader = track->extFader + player->extFader; + + pitch = track->pitchBend; + pitch *= track->bendRange << 6; + pitch >>= 7; + pitch += track->extPitch; + + pan = track->pan; + + if (track->panRange != 127) + pan = (pan * track->panRange + 0x40) >> 7; + + pan += track->extPan; + + if (vol < -0x8000) + vol = -0x8000; + + if (fader < -0x8000) + fader = -0x8000; + + if (pan < -128) + pan = -128; + else if (pan > 127) + pan = 127; + + for (struct SNDExChannel *chn = track->channelLLHead; chn != NULL; chn = chn->channelLLNext) { + chn->userDecay2 = (short)fader; + + if (chn->envStatus == 3) + continue; + + chn->userDecay = (s16)vol; + chn->userPitch = (s16)pitch; + chn->userPan = (s8)pan; + chn->panRange = track->panRange; + chn->lfo.param = track->mod; + + if (chn->length == 0 && release != 0) { + chn->priority = 1; + SND_ReleaseExChannel(chn); + } + } +} + +static void PlayerUpdateChannel(struct SNDPlayer *player) { + for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) { + struct SNDTrack *trk = PlayerGetTrack(player, i); + if (trk) { + TrackUpdateChannel(trk, player, 1); + } + } +} + +static void TrackPlayNote(struct SNDTrack *track, struct SNDPlayer *player, int midiKey, int velocity, int length) { + struct SNDExChannel *chn = NULL; + + if (track->flags.tie) { + chn = track->channelLLHead; + if (chn) { + chn->midiKey = (u8)midiKey; + chn->velocity = (u8)velocity; + } + } + + if (chn == NULL) { + struct SNDInstData inst; + if (!SND_ReadInstData(player->bank, track->program, midiKey, &inst)) + return; + + u32 allowedChannels; + + switch (inst.type) { + case SND_INST_PCM: + case SND_INST_DIRECTPCM: + // all channels support PCM + allowedChannels = 0xFFFF; + break; + case SND_INST_PSG: + // only channels 8, 9, 10, 11, 12, 13 support PSG + allowedChannels = 0x3F00; + break; + case SND_INST_NOISE: + // only channels 14 and 15 support noise + allowedChannels = 0xC000; + break; + default: + return; + } + + allowedChannels &= track->channelMask; + + chn = SND_AllocExChannel(allowedChannels, player->prio + track->priority, track->flags.channelMask, ChannelCallback, track); + if (chn == NULL) + return; + + if (!SND_NoteOn(chn, midiKey, velocity, track->flags.tie ? -1 : length, player->bank, &inst)) { + chn->priority = 0; + SND_FreeExChannel(chn); + return; + } + + chn->channelLLNext = track->channelLLHead; + track->channelLLHead = chn; + } + + if (track->envAttack != 0xFF) + SND_SetExChannelAttack(chn, track->envAttack); + + if (track->envDecay != 0xFF) + SND_SetExChannelDecay(chn, track->envDecay); + + if (track->envSustain != 0xFF) + SND_SetExChannelSustain(chn, track->envSustain); + + if (track->envRelease != 0xFF) + SND_SetExChannelRelease(chn, track->envRelease); + + chn->sweepPitch = track->sweepPitch; + if (track->flags.portamento) + chn->sweepPitch += (short)((track->portamentoKey - midiKey) << 6); + + if (track->portamentoTime == 0) { + chn->sweepLength = length; + chn->flags.autoSweep = FALSE; + } else { + int swp = track->portamentoTime * track->portamentoTime; + swp *= chn->sweepPitch < 0 ? -chn->sweepPitch : chn->sweepPitch; + swp >>= 11; + chn->sweepLength = swp; + } + + chn->sweepCounter = 0; +} + +static int TrackStepTicks(struct SNDTrack *track, struct SNDPlayer *player, int trackIdx, u32 playNotes) { + (void)trackIdx; + + struct SNDExChannel *chn; + u8 cmd; + enum SNDSeqVal valueType; + BOOL specialValueType; + BOOL runCmd; + s32 length; + int midiKey; + + s32 par; + + + for (chn = track->channelLLHead; chn; chn = chn->channelLLNext) { + if (chn->length > 0) + chn->length--; + + if (!chn->flags.autoSweep && chn->sweepCounter < chn->sweepLength) + chn->sweepCounter++; + } + + if (track->flags.noteFinishWait) { + if (track->channelLLHead) + return 0; + track->flags.noteFinishWait = FALSE; + } + + if (track->wait > 0) { + track->wait--; + if (track->wait > 0) + return 0; + } + + SeqCacheFetch(track->cur); + + while (track->wait == 0 && !track->flags.noteFinishWait) { + specialValueType = FALSE; + runCmd = TRUE; + + cmd = TrackReadU8(track); + + if (cmd == 0xA2) { + cmd = TrackReadU8(track); + runCmd = track->flags.cmp; + } + + if (cmd == 0xA0) { + cmd = TrackReadU8(track); + valueType = SND_SEQ_VAL_RAN; + specialValueType = TRUE; + } + + if (cmd == 0xA1) { + cmd = TrackReadU8(track); + valueType = SND_SEQ_VAL_VAR; + specialValueType = TRUE; + } + + if ((cmd & 0x80) == 0) { + par = TrackReadU8(track); + + length = TrackParseValue(track, player, specialValueType ? valueType : SND_SEQ_VAL_VLV); + midiKey = cmd + track->transpose; + + if (!runCmd) + continue; + + if (midiKey < 0) + midiKey = 0; + else if (midiKey > 127) { + midiKey = 127; + } + + if (!track->flags.muted && playNotes != 0) { + TrackPlayNote(track, player, midiKey, par, (length > 0) ? length : -1); + } + + track->portamentoKey = (u8)midiKey; + + if (track->flags.noteWait) { + track->wait = length; + if (length == 0) { + track->flags.noteFinishWait = TRUE; + } + } + + continue; + } + + switch (cmd & 0xF0) { + case 0x80: + par = TrackParseValue(track, player, specialValueType ? valueType : SND_SEQ_VAL_VLV); + if (!runCmd) + break; + + switch (cmd) { + case 0x80: + track->wait = par; + break; + case 0x81: + if (par < 0x10000) + track->program = (u16)par; + break; + } + break; + case 0x90: + switch (cmd) { + case 0x93: + { + u32 off; + struct SNDTrack *newTrack; + + par = TrackReadU8(track); + off = TrackReadU24(track); + if (!runCmd) + break; + + newTrack = PlayerGetTrack(player, par); + if (newTrack && newTrack != track) { + TrackStop(newTrack, player); + TrackStart(newTrack, track->base, off); + } + } + break; + case 0x94: + { + u32 off = TrackReadU24(track); + if (!runCmd) + break; + track->cur = &track->base[off]; + } + break; + case 0x95: + { + u32 off = TrackReadU24(track); + if (!runCmd) + break; + + if (track->callStackDepth < SND_TRACK_MAX_CALL) { + track->posCallStack[track->callStackDepth] = track->cur; + track->callStackDepth++; + track->cur = &track->base[off]; + } + break; + } + } + break; + case 0xC0: + case 0xD0: + { + union { + u8 _u8; + s8 _s8; + } par; + par._u8 = (u8)TrackParseValue(track, player, specialValueType ? valueType : SND_SEQ_VAL_U8); + if (!runCmd) + break; + + switch (cmd) { + case 0xC1: + track->volume = par._u8; + break; + case 0xD5: + track->expression = par._u8; + break; + case 0xC2: + player->volume = par._u8; + break; + case 0xC5: + track->bendRange = par._u8; + break; + case 0xC6: + track->priority = par._u8; + break; + case 0xC7: + track->flags.noteWait = par._u8; + break; + case 0xCF: + track->portamentoTime = par._u8; + break; + case 0xCA: + track->mod.depth = par._u8; + break; + case 0xCB: + track->mod.speed = par._u8; + break; + case 0xCC: + track->mod.target = par._u8; + break; + case 0xCD: + track->mod.range = par._u8; + break; + case 0xD0: + track->envAttack = par._u8; + break; + case 0xD1: + track->envDecay = par._u8; + break; + case 0xD2: + track->envSustain = par._u8; + break; + case 0xD3: + track->envRelease = par._u8; + break; + case 0xD4: + if (track->callStackDepth < SND_TRACK_MAX_CALL) { + track->posCallStack[track->callStackDepth] = track->cur; + track->loopCount[track->callStackDepth] = par._u8; + track->callStackDepth++; + } + break; + case 0xC8: + track->flags.tie = par._u8; + TrackReleaseChannels(track, player, -1); + TrackFreeChannels(track); + break; + case 0xD7: + TrackMute(track, player, par._u8); + break; + case 0xC9: + track->portamentoKey = (u8)(par._u8 + track->transpose); + track->flags.portamento = TRUE; + break; + case 0xCE: + track->flags.portamento = par._u8; + break; + case 0xC3: + track->transpose = par._s8; + break; + case 0xC4: + track->pitchBend = par._s8; + break; + case 0xC0: + track->pan = (s8)(par._u8 - 0x40); + break; + case 0xD6: + { + s16 *varPtr; + + if (sPrintEnabled) { + varPtr = PlayerGetVariablePointer(player, par._u8); + } + } + break; + } + } + break; + case 0xE0: + { + s16 par = (s16)TrackParseValue(track, player, specialValueType ? valueType : SND_SEQ_VAL_U16); + if (!runCmd) + break; + + switch (cmd) { + case 0xE3: + track->sweepPitch = par; + break; + case 0xE1: + player->tempo = (u16)par; + break; + case 0xE0: + track->mod.delay = (u16)par; + break; + } + } + break; + case 0xB0: + { + int varNum = TrackReadU8(track); + + s16 par = (s16)TrackParseValue(track, player, specialValueType ? valueType : SND_SEQ_VAL_U16); + s16 *varPtr = PlayerGetVariablePointer(player, varNum); + + if (!runCmd) + break; + + if (varPtr == NULL) + break; + + switch (cmd) { + case 0xB0: + *varPtr = par; + break; + case 0xB1: + *varPtr += par; + break; + case 0xB2: + *varPtr -= par; + break; + case 0xB3: + *varPtr *= par; + break; + case 0xB4: + if (par != 0) + *varPtr /= par; + break; + case 0xB5: + if (par >= 0) + *varPtr <<= par; + else + *varPtr >>= -par; + break; + case 0xB6: + { + BOOL neg = FALSE; + if (par < 0) { + neg = TRUE; + par = (s16)(-par); + } + s32 random = SND_CalcRandom(); + random = (random * (par + 1)) >> 16; + if (neg) + random = -random; + *varPtr = (s16)random; + } + break; + case 0xB7: + break; + case 0xB8: + track->flags.cmp = *varPtr == par; + break; + case 0xB9: + track->flags.cmp = *varPtr >= par; + break; + case 0xBA: + track->flags.cmp = *varPtr > par; + break; + case 0xBB: + track->flags.cmp = *varPtr <= par; + break; + case 0xBC: + track->flags.cmp = *varPtr < par; + break; + case 0xBD: + track->flags.cmp = *varPtr != par; + break; + } + } + break; + case 0xF0: + if (!runCmd) + break; + + switch (cmd) { + case 0xFD: + if (track->callStackDepth != 0) { + track->callStackDepth--; + track->cur = track->posCallStack[track->callStackDepth]; + } + break; + case 0xFC: + { + if (track->callStackDepth == 0) + break; + + // gosh, this was nasty to figure out + u8 loopCount = track->loopCount[track->callStackDepth - 1]; + if (loopCount != 0) { + loopCount--; + if (loopCount == 0) { + track->callStackDepth--; + break; + } + } + track->loopCount[track->callStackDepth - 1] = loopCount; + track->cur = track->posCallStack[track->callStackDepth - 1]; + } + break; + case 0xFE: + break; + case 0xFF: + return -1; + } + break; + } + } + + return 0; +} + +static BOOL PlayerStepTicks(struct SNDPlayer *player, u32 ticks) { + BOOL isPlaying = FALSE; + + for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) { + struct SNDTrack *trk = PlayerGetTrack(player, i); + + if (trk && trk->cur) { + if (TrackStepTicks(trk, player, i, ticks)) + PlayerStopTrack(player, i); + else + isPlaying = TRUE; + } + } + + return !isPlaying; +} + +static s16 *PlayerGetVariablePointer(const struct SNDPlayer *player, int var) { + if (SNDi_SharedWork == NULL) + return NULL; + else if (var < 16) { + return &SNDi_SharedWork->players[player->playerId].localVars[var]; + } else { + return &SNDi_SharedWork->globalVars[var - 16]; + } +} + +static int AllocateTrack(void) { + for (int i = 0; i < SND_TRACK_COUNT; i++) { + if (!SNDi_Work.tracks[i].flags.active) { + SNDi_Work.tracks[i].flags.active = TRUE; + return i; + } + } + + return -1; +} + +static void TrackMute(struct SNDTrack *track, struct SNDPlayer *player, int muteMode) { + switch (muteMode) { + case SND_TRACK_MUTE_MODE_UNMUTE: + track->flags.muted = FALSE; + break; + case SND_TRACK_MUTE_MODE_MUTE: + track->flags.muted = TRUE; + break; + case SND_TRACK_MUTE_MODE_MUTE_RELEASE: + track->flags.muted = TRUE; + TrackReleaseChannels(track, player, -1); + break; + case SND_TRACK_MUTE_MODE_MUTE_STOP: + track->flags.muted = TRUE; + TrackReleaseChannels(track, player, 127); + TrackFreeChannels(track); + break; + } +} diff --git a/arm7/lib/src/SND_unk_037FD440.c b/arm7/lib/src/SND_unk_037FD440.c deleted file mode 100644 index 253ccecb..00000000 --- a/arm7/lib/src/SND_unk_037FD440.c +++ /dev/null @@ -1,904 +0,0 @@ -#include "SND_unk_037FD440.h" - -#include "SND_util.h" -#include "SND_lfo.h" -#include "SND_exChannel.h" -#include "SND_bank.h" - -#define SND_TRACK_MUTE_MODE_UNMUTE 0 -#define SND_TRACK_MUTE_MODE_MUTE 1 -#define SND_TRACK_MUTE_MODE_MUTE_RELEASE 2 -#define SND_TRACK_MUTE_MODE_MUTE_STOP 3 - -enum SNDSeqProc { - SND_PROC_SKIP_NOTES = 0, - SND_PROC_PLAY_NOTES = 1, -}; - -enum SNDSeqVal { - SND_SEQ_VAL_U8 = 0, - SND_SEQ_VAL_U16 = 1, - SND_SEQ_VAL_VLV = 2, - SND_SEQ_VAL_RAN = 3, - SND_SEQ_VAL_VAR = 4, -}; - -#define SND_TIMER_RATE 240 - -static struct { - const u8 *begin; - const u8 *end; - union { - u8 buf[16]; - u32 buf32[4]; - }; -} sSeqCache; -static int sPrintEnabled; - - - -static s16 *PlayerGetVariablePointer(const struct SNDPlayer *player, int var); -static void TrackUpdateChannel(struct SNDTrack *track, struct SNDPlayer *player, int release); - -// TODO make static -void SeqCacheFetch(const u8 *addr) { - addr = (const u8 *)((u32)addr & ~3); - sSeqCache.begin = addr; - sSeqCache.end = sSeqCache.begin + 16; - - const u32 *src = (const u32 *)addr; - - sSeqCache.buf32[0] = src[0]; - sSeqCache.buf32[1] = src[1]; - sSeqCache.buf32[2] = src[2]; - sSeqCache.buf32[3] = src[3]; -} - -// TODO make static -u8 SeqReadByte(const u8 *addr) { - if (addr < sSeqCache.begin || addr >= sSeqCache.end) - SeqCacheFetch(addr); - - return sSeqCache.buf[(u32)addr - (u32)sSeqCache.begin]; -} - -static inline u8 TrackReadU8(struct SNDTrack *track) { - u8 retval = SeqReadByte(track->cur); - track->cur++; - return retval; -} - -// TODO make static -u16 TrackReadU16(struct SNDTrack *track) { - int retval; - - retval = TrackReadU8(track); - retval |= TrackReadU8(track) << 8; - - return (u16)retval; -} - -static u32 TrackReadU24(struct SNDTrack *track) { - u32 retval; - - retval = TrackReadU8(track); - retval |= TrackReadU8(track) << 8; - retval |= TrackReadU8(track) << 16; - - return retval; -} - -static int TrackReadVLV(struct SNDTrack *track) { - int retval = 0; - int b; - - do { - b = TrackReadU8(track); - retval = (retval << 7) | (b & 0x7F); - } while(b & 0x80); - - return retval; -} - -static int TrackParseValue(struct SNDTrack *track, struct SNDPlayer *player, int valueType) { - int retval; - int hi; - int lo; - int ran; - s16 *var; - - // BUG: undefined behavior if invalid valueType is passed (uninitialized return value) - - switch (valueType) { - case SND_SEQ_VAL_U8: - retval = TrackReadU8(track); - break; - case SND_SEQ_VAL_U16: - retval = TrackReadU16(track); - break; - case SND_SEQ_VAL_VLV: - retval = TrackReadVLV(track); - break; - case SND_SEQ_VAL_VAR: - var = PlayerGetVariablePointer(player, TrackReadU8(track)); - if (var) - retval = *var; - break; - case SND_SEQ_VAL_RAN: - lo = TrackReadU16(track) << 16; - hi = (s16)TrackReadU16(track); - ran = SND_CalcRandom(); - retval = hi - (lo >> 16); - retval += 1; - retval = (ran * retval) >> 16; - retval += lo >> 16; - break; - } - - return retval; -} - -// TODO make static -void TrackInit(struct SNDTrack *track) { - track->base = NULL; - track->cur = NULL; - - track->flags.noteWait = TRUE; - track->flags.muted = FALSE; - track->flags.tie = FALSE; - track->flags.noteFinishWait = FALSE; - track->flags.portamento = FALSE; - track->flags.cmp = TRUE; - track->flags.channelMask = FALSE; - - track->callStackDepth = 0; - track->program = 0; - track->priority = 64; - track->volume = 127; - track->expression = 127; - track->extFader = 0; - track->pan = 0; - track->extPan = 0; - track->pitchBend = 0; - track->extPitch = 0; - track->envAttack = 255; - track->envDecay = 255; - track->envSustain = 255; - track->envRelease = 255; - track->panRange = 127; - track->bendRange = 2; - track->portamentoKey = 60; - track->portamentoTime = 0; - track->sweepPitch = 0; - track->transpose = 0; - track->channelMask = 0xFFFF; - SND_InitLfoParam(&track->mod); - track->wait = 0; - track->channelLLHead = NULL; -} - -// TODO make static -void TrackStart(struct SNDTrack *track, const void *seq, u32 offset) { - track->base = (const u8 *)seq; - track->cur = &track->base[offset]; -} - -// TODO make static later -void PlayerInit(struct SNDPlayer *player, struct SNDBankData *bank) { - player->flags.paused = FALSE; - player->bank = bank; - player->tempo = 120; - player->tempoRatio = 256; - player->tempoCounter = SND_TIMER_RATE; - player->volume = 0x7F; - player->extFader = 0; - player->prio = 64; - - for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) { - player->tracks[i] = 0xFF; - } - - if (SNDi_SharedWork) { - SNDi_SharedWork->players[player->playerId].tickCounter = 0; - - for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) { - SNDi_SharedWork->players[player->playerId].localVars[i] = -1; - } - } -} - -// TODO make static -void TrackReleaseChannels(struct SNDTrack *track, struct SNDPlayer *player, int release) { - TrackUpdateChannel(track, player, 0); - - for (struct SNDExChannel *chn = track->channelLLHead; chn; chn = chn->channelLLNext) { - if (SND_IsExChannelActive(chn)) { - if (release >= 0) - SND_SetExChannelRelease(chn, release & 0xFF); - chn->priority = 1; - SND_ReleaseExChannel(chn); - } - } -} - -// TODO make static -void TrackFreeChannels(struct SNDTrack *track) { - for (struct SNDExChannel *chn = track->channelLLHead; chn; chn = chn->channelLLNext) { - SND_FreeExChannel(chn); - } - - track->channelLLHead = NULL; -} - -void PlayerSeqMain(struct SNDPlayer *player) { - int ticks = 0; - int tempoInc; - int i; - - while (player->tempoCounter >= SND_TIMER_RATE) { - player->tempoCounter -= SND_TIMER_RATE; - ticks++; - } - - for (i = 0; i < ticks; i++) { - if (PlayerStepTicks(player, SND_PROC_PLAY_NOTES)) { - PlayerStop(player); - break; - } - } - - if (SNDi_SharedWork) { - SNDi_SharedWork->players[player->playerId].tickCounter += i; - } - - tempoInc = player->tempo; - tempoInc *= player->tempoRatio; - tempoInc >>= 8; - - player->tempoCounter += tempoInc; -} - -struct SNDTrack *PlayerGetTrack(struct SNDPlayer *player, int track) { - if (track > (SND_TRACK_COUNT_PER_PLAYER - 1)) - return NULL; - - if (player->tracks[track] == 0xFF) - return NULL; - - return &SNDi_Work.tracks[player->tracks[track]]; -} - -static void TrackStop(struct SNDTrack *track, struct SNDPlayer *player) { - TrackReleaseChannels(track, player, -1); - TrackFreeChannels(track); -} - -static void PlayerStopTrack(struct SNDPlayer *player, int trackIdx) { - struct SNDTrack *track = PlayerGetTrack(player, trackIdx); - - if (track == NULL) - return; - - TrackStop(track, player); - SNDi_Work.tracks[player->tracks[trackIdx]].flags.active = FALSE; - player->tracks[trackIdx] = 0xFF; -} - -void PlayerStop(struct SNDPlayer *player) { - for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) { - PlayerStopTrack(player, i); - } - player->flags.active = FALSE; -} - -static void ChannelCallback(struct SNDExChannel *chn, int status, void *track_) { - struct SNDExChannel *cur; - struct SNDTrack *track; - - track = (struct SNDTrack *)track_; - - if (status == 1) { - chn->priority = 0; - SND_FreeExChannel(chn); - } - - if (track->channelLLHead == chn) { - track->channelLLHead = chn->channelLLNext; - } else { - cur = track->channelLLHead; - - while (cur->channelLLNext) { - if (cur->channelLLNext == chn) { - cur->channelLLNext = chn->channelLLNext; - return; - } - cur = cur->channelLLNext; - } - } -} - -static void TrackUpdateChannel(struct SNDTrack *track, struct SNDPlayer *player, int release) { - int vol; - int fader; - int pan; - int pitch; - - vol = SNDi_DecibelSquareTable[track->volume] + - SNDi_DecibelSquareTable[track->expression] + - SNDi_DecibelSquareTable[player->volume]; - - fader = track->extFader + player->extFader; - - pitch = track->pitchBend; - pitch *= track->bendRange << 6; - pitch >>= 7; - pitch += track->extPitch; - - pan = track->pan; - - if (track->panRange != 127) - pan = (pan * track->panRange + 0x40) >> 7; - - pan += track->extPan; - - if (vol < -0x8000) - vol = -0x8000; - - if (fader < -0x8000) - fader = -0x8000; - - if (pan < -128) - pan = -128; - else if (pan > 127) - pan = 127; - - for (struct SNDExChannel *chn = track->channelLLHead; chn != NULL; chn = chn->channelLLNext) { - chn->userDecay2 = (short)fader; - - if (chn->envStatus == 3) - continue; - - chn->userDecay = (s16)vol; - chn->userPitch = (s16)pitch; - chn->userPan = (s8)pan; - chn->panRange = track->panRange; - chn->lfo.param = track->mod; - - if (chn->length == 0 && release != 0) { - chn->priority = 1; - SND_ReleaseExChannel(chn); - } - } -} - -// TODO make static -void PlayerUpdateChannel(struct SNDPlayer *player) { - for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) { - struct SNDTrack *trk = PlayerGetTrack(player, i); - if (trk) { - TrackUpdateChannel(trk, player, 1); - } - } -} - -static void TrackPlayNote(struct SNDTrack *track, struct SNDPlayer *player, int midiKey, int velocity, int length) { - struct SNDExChannel *chn = NULL; - - if (track->flags.tie) { - chn = track->channelLLHead; - if (chn) { - chn->midiKey = (u8)midiKey; - chn->velocity = (u8)velocity; - } - } - - if (chn == NULL) { - struct SNDInstData inst; - if (!SND_ReadInstData(player->bank, track->program, midiKey, &inst)) - return; - - u32 allowedChannels; - - switch (inst.type) { - case SND_INST_PCM: - case SND_INST_DIRECTPCM: - // all channels support PCM - allowedChannels = 0xFFFF; - break; - case SND_INST_PSG: - // only channels 8, 9, 10, 11, 12, 13 support PSG - allowedChannels = 0x3F00; - break; - case SND_INST_NOISE: - // only channels 14 and 15 support noise - allowedChannels = 0xC000; - break; - default: - return; - } - - allowedChannels &= track->channelMask; - - chn = SND_AllocExChannel(allowedChannels, player->prio + track->priority, track->flags.channelMask, ChannelCallback, track); - if (chn == NULL) - return; - - if (!SND_NoteOn(chn, midiKey, velocity, track->flags.tie ? -1 : length, player->bank, &inst)) { - chn->priority = 0; - SND_FreeExChannel(chn); - return; - } - - chn->channelLLNext = track->channelLLHead; - track->channelLLHead = chn; - } - - if (track->envAttack != 0xFF) - SND_SetExChannelAttack(chn, track->envAttack); - - if (track->envDecay != 0xFF) - SND_SetExChannelDecay(chn, track->envDecay); - - if (track->envSustain != 0xFF) - SND_SetExChannelSustain(chn, track->envSustain); - - if (track->envRelease != 0xFF) - SND_SetExChannelRelease(chn, track->envRelease); - - chn->sweepPitch = track->sweepPitch; - if (track->flags.portamento) - chn->sweepPitch += (short)((track->portamentoKey - midiKey) << 6); - - if (track->portamentoTime == 0) { - chn->sweepLength = length; - chn->flags.autoSweep = FALSE; - } else { - int swp = track->portamentoTime * track->portamentoTime; - swp *= chn->sweepPitch < 0 ? -chn->sweepPitch : chn->sweepPitch; - swp >>= 11; - chn->sweepLength = swp; - } - - chn->sweepCounter = 0; -} - -static int TrackStepTicks(struct SNDTrack *track, struct SNDPlayer *player, int trackIdx, u32 playNotes) { - (void)trackIdx; - - struct SNDExChannel *chn; - u8 cmd; - enum SNDSeqVal valueType; - BOOL specialValueType; - BOOL runCmd; - s32 length; - int midiKey; - - s32 par; - - - for (chn = track->channelLLHead; chn; chn = chn->channelLLNext) { - if (chn->length > 0) - chn->length--; - - if (!chn->flags.autoSweep && chn->sweepCounter < chn->sweepLength) - chn->sweepCounter++; - } - - if (track->flags.noteFinishWait) { - if (track->channelLLHead) - return 0; - track->flags.noteFinishWait = FALSE; - } - - if (track->wait > 0) { - track->wait--; - if (track->wait > 0) - return 0; - } - - SeqCacheFetch(track->cur); - - while (track->wait == 0 && !track->flags.noteFinishWait) { - specialValueType = FALSE; - runCmd = TRUE; - - cmd = TrackReadU8(track); - - if (cmd == 0xA2) { - cmd = TrackReadU8(track); - runCmd = track->flags.cmp; - } - - if (cmd == 0xA0) { - cmd = TrackReadU8(track); - valueType = SND_SEQ_VAL_RAN; - specialValueType = TRUE; - } - - if (cmd == 0xA1) { - cmd = TrackReadU8(track); - valueType = SND_SEQ_VAL_VAR; - specialValueType = TRUE; - } - - if ((cmd & 0x80) == 0) { - par = TrackReadU8(track); - - length = TrackParseValue(track, player, specialValueType ? valueType : SND_SEQ_VAL_VLV); - midiKey = cmd + track->transpose; - - if (!runCmd) - continue; - - if (midiKey < 0) - midiKey = 0; - else if (midiKey > 127) { - midiKey = 127; - } - - if (!track->flags.muted && playNotes != 0) { - TrackPlayNote(track, player, midiKey, par, (length > 0) ? length : -1); - } - - track->portamentoKey = (u8)midiKey; - - if (track->flags.noteWait) { - track->wait = length; - if (length == 0) { - track->flags.noteFinishWait = TRUE; - } - } - - continue; - } - - switch (cmd & 0xF0) { - case 0x80: - par = TrackParseValue(track, player, specialValueType ? valueType : SND_SEQ_VAL_VLV); - if (!runCmd) - break; - - switch (cmd) { - case 0x80: - track->wait = par; - break; - case 0x81: - if (par < 0x10000) - track->program = (u16)par; - break; - } - break; - case 0x90: - switch (cmd) { - case 0x93: - { - u32 off; - struct SNDTrack *newTrack; - - par = TrackReadU8(track); - off = TrackReadU24(track); - if (!runCmd) - break; - - newTrack = PlayerGetTrack(player, par); - if (newTrack && newTrack != track) { - TrackStop(newTrack, player); - TrackStart(newTrack, track->base, off); - } - } - break; - case 0x94: - { - u32 off = TrackReadU24(track); - if (!runCmd) - break; - track->cur = &track->base[off]; - } - break; - case 0x95: - { - u32 off = TrackReadU24(track); - if (!runCmd) - break; - - if (track->callStackDepth < SND_TRACK_MAX_CALL) { - track->posCallStack[track->callStackDepth] = track->cur; - track->callStackDepth++; - track->cur = &track->base[off]; - } - break; - } - } - break; - case 0xC0: - case 0xD0: - { - union { - u8 _u8; - s8 _s8; - } par; - par._u8 = (u8)TrackParseValue(track, player, specialValueType ? valueType : SND_SEQ_VAL_U8); - if (!runCmd) - break; - - switch (cmd) { - case 0xC1: - track->volume = par._u8; - break; - case 0xD5: - track->expression = par._u8; - break; - case 0xC2: - player->volume = par._u8; - break; - case 0xC5: - track->bendRange = par._u8; - break; - case 0xC6: - track->priority = par._u8; - break; - case 0xC7: - track->flags.noteWait = par._u8; - break; - case 0xCF: - track->portamentoTime = par._u8; - break; - case 0xCA: - track->mod.depth = par._u8; - break; - case 0xCB: - track->mod.speed = par._u8; - break; - case 0xCC: - track->mod.target = par._u8; - break; - case 0xCD: - track->mod.range = par._u8; - break; - case 0xD0: - track->envAttack = par._u8; - break; - case 0xD1: - track->envDecay = par._u8; - break; - case 0xD2: - track->envSustain = par._u8; - break; - case 0xD3: - track->envRelease = par._u8; - break; - case 0xD4: - if (track->callStackDepth < SND_TRACK_MAX_CALL) { - track->posCallStack[track->callStackDepth] = track->cur; - track->loopCount[track->callStackDepth] = par._u8; - track->callStackDepth++; - } - break; - case 0xC8: - track->flags.tie = par._u8; - TrackReleaseChannels(track, player, -1); - TrackFreeChannels(track); - break; - case 0xD7: - TrackMute(track, player, par._u8); - break; - case 0xC9: - track->portamentoKey = (u8)(par._u8 + track->transpose); - track->flags.portamento = TRUE; - break; - case 0xCE: - track->flags.portamento = par._u8; - break; - case 0xC3: - track->transpose = par._s8; - break; - case 0xC4: - track->pitchBend = par._s8; - break; - case 0xC0: - track->pan = (s8)(par._u8 - 0x40); - break; - case 0xD6: - { - s16 *varPtr; - - if (sPrintEnabled) { - varPtr = PlayerGetVariablePointer(player, par._u8); - } - } - break; - } - } - break; - case 0xE0: - { - s16 par = (s16)TrackParseValue(track, player, specialValueType ? valueType : SND_SEQ_VAL_U16); - if (!runCmd) - break; - - switch (cmd) { - case 0xE3: - track->sweepPitch = par; - break; - case 0xE1: - player->tempo = (u16)par; - break; - case 0xE0: - track->mod.delay = (u16)par; - break; - } - } - break; - case 0xB0: - { - // TODO fix refalloc -> stack on varNum - int varNum = TrackReadU8(track); - - s16 par = (s16)TrackParseValue(track, player, specialValueType ? valueType : SND_SEQ_VAL_U16); - s16 *varPtr = PlayerGetVariablePointer(player, varNum); - - if (!runCmd) - break; - - if (varPtr == NULL) - break; - - switch (cmd) { - case 0xB0: - *varPtr = par; - break; - case 0xB1: - *varPtr += par; - break; - case 0xB2: - *varPtr -= par; - break; - case 0xB3: - *varPtr *= par; - break; - case 0xB4: - if (par != 0) - *varPtr /= par; - break; - case 0xB5: - if (par >= 0) - *varPtr <<= par; - else - *varPtr >>= -par; - break; - case 0xB6: - { - BOOL neg = FALSE; - if (par < 0) { - neg = TRUE; - par = (s16)(-par); - } - s32 random = SND_CalcRandom(); - random = (random * (par + 1)) >> 16; - if (neg) - random = -random; - *varPtr = (s16)random; - } - break; - case 0xB7: - break; - case 0xB8: - track->flags.cmp = *varPtr == par; - break; - case 0xB9: - track->flags.cmp = *varPtr >= par; - break; - case 0xBA: - track->flags.cmp = *varPtr > par; - break; - case 0xBB: - track->flags.cmp = *varPtr <= par; - break; - case 0xBC: - track->flags.cmp = *varPtr < par; - break; - case 0xBD: - track->flags.cmp = *varPtr != par; - break; - } - } - break; - case 0xF0: - if (!runCmd) - break; - - switch (cmd) { - case 0xFD: - if (track->callStackDepth != 0) { - track->callStackDepth--; - track->cur = track->posCallStack[track->callStackDepth]; - } - break; - case 0xFC: - { - if (track->callStackDepth == 0) - break; - - // gosh, this was nasty to figure out - u8 loopCount = track->loopCount[track->callStackDepth - 1]; - if (loopCount != 0) { - loopCount--; - if (loopCount == 0) { - track->callStackDepth--; - break; - } - } - track->loopCount[track->callStackDepth - 1] = loopCount; - track->cur = track->posCallStack[track->callStackDepth - 1]; - } - break; - case 0xFE: - break; - case 0xFF: - return -1; - } - break; - } - } - - return 0; -} - -BOOL PlayerStepTicks(struct SNDPlayer *player, u32 ticks) { - BOOL isPlaying = FALSE; - - for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) { - struct SNDTrack *trk = PlayerGetTrack(player, i); - - if (trk && trk->cur) { - if (TrackStepTicks(trk, player, i, ticks)) - PlayerStopTrack(player, i); - else - isPlaying = TRUE; - } - } - - return !isPlaying; -} - -static s16 *PlayerGetVariablePointer(const struct SNDPlayer *player, int var) { - if (SNDi_SharedWork == NULL) - return NULL; - else if (var < 16) { - return &SNDi_SharedWork->players[player->playerId].localVars[var]; - } else { - return &SNDi_SharedWork->globalVars[var - 16]; - } -} - -int AllocateTrack(void) { - for (int i = 0; i < SND_TRACK_COUNT; i++) { - if (!SNDi_Work.tracks[i].flags.active) { - SNDi_Work.tracks[i].flags.active = TRUE; - return i; - } - } - - return -1; -} - -// TODO make static after merging with SND_seq -void TrackMute(struct SNDTrack *track, struct SNDPlayer *player, int muteMode) { - switch (muteMode) { - case SND_TRACK_MUTE_MODE_UNMUTE: - track->flags.muted = FALSE; - break; - case SND_TRACK_MUTE_MODE_MUTE: - track->flags.muted = TRUE; - break; - case SND_TRACK_MUTE_MODE_MUTE_RELEASE: - track->flags.muted = TRUE; - TrackReleaseChannels(track, player, -1); - break; - case SND_TRACK_MUTE_MODE_MUTE_STOP: - track->flags.muted = TRUE; - TrackReleaseChannels(track, player, 127); - TrackFreeChannels(track); - break; - } -} -- cgit v1.2.3 From 72f92a37748688de99ad007f3d221853c394f203 Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Sun, 1 Aug 2021 03:09:03 +0200 Subject: arm7: merge SND_lockChannel into SND_exChannel --- arm7/arm7.lsf | 1 - arm7/lib/include/SND_exChannel.h | 5 +++ arm7/lib/include/SND_lockChannel.h | 15 ------- arm7/lib/src/SND_command.c | 1 - arm7/lib/src/SND_exChannel.c | 76 ++++++++++++++++++++++++++++++++++- arm7/lib/src/SND_lockChannel.c | 81 -------------------------------------- 6 files changed, 80 insertions(+), 99 deletions(-) delete mode 100644 arm7/lib/include/SND_lockChannel.h delete mode 100644 arm7/lib/src/SND_lockChannel.c diff --git a/arm7/arm7.lsf b/arm7/arm7.lsf index 074e5311..46b4ffb8 100644 --- a/arm7/arm7.lsf +++ b/arm7/arm7.lsf @@ -47,7 +47,6 @@ Autoload WRAM Object SND_channel.o Object SND_lfo.o Object SND_wave.o - Object SND_lockChannel.o Object SND_exChannel.o Object SND_seq.o Object SND_bank.o diff --git a/arm7/lib/include/SND_exChannel.h b/arm7/lib/include/SND_exChannel.h index 66a1d78f..9ebedc76 100644 --- a/arm7/lib/include/SND_exChannel.h +++ b/arm7/lib/include/SND_exChannel.h @@ -31,4 +31,9 @@ void ExChannelStart(struct SNDExChannel *chn, int length); int ExChannelVolumeCmp(struct SNDExChannel *chn_a, struct SNDExChannel *chn_b); void ExChannelSetup(struct SNDExChannel *, SNDExChannelCallback callback, void *callbackUserData, int priority); +void SND_StopUnlockedChannel(u32 channelMask, u32 weak); +void SND_LockChannel(u32 channelMask, u32 weak); +void SND_UnlockChannel(u32 channelMask, u32 weak); +u32 SND_GetLockedChannel(u32 weak); + #endif //GUARD_SND_EXCHANNEL_H diff --git a/arm7/lib/include/SND_lockChannel.h b/arm7/lib/include/SND_lockChannel.h deleted file mode 100644 index 461745b3..00000000 --- a/arm7/lib/include/SND_lockChannel.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef GUARD_SND_LOCKCHANNEL_H -#define GUARD_SND_LOCKCHANNEL_H - -#include "nitro/types.h" - -void SND_StopUnlockedChannel(u32 channelMask, u32 weak); -void SND_LockChannel(u32 channelMask, u32 weak); -void SND_UnlockChannel(u32 channelMask, u32 weak); -u32 SND_GetLockedChannel(u32 weak); - -// TODO remove these externs if lockChannel is merged with exChannel -extern u32 sLockedChannelMask; -extern u32 sWeakLockedChannelMask; - -#endif //GUARD_SND_LOCKCHANNEL_H diff --git a/arm7/lib/src/SND_command.c b/arm7/lib/src/SND_command.c index fc059c89..1ffcb0d5 100644 --- a/arm7/lib/src/SND_command.c +++ b/arm7/lib/src/SND_command.c @@ -12,7 +12,6 @@ #include "SND_capture.h" #include "SND_channel.h" #include "SND_exChannel.h" -#include "SND_lockChannel.h" #include "SND_main.h" #include "SND_seq.h" #include "SND_work.h" diff --git a/arm7/lib/src/SND_exChannel.c b/arm7/lib/src/SND_exChannel.c index 7919b5f7..f3ba922b 100644 --- a/arm7/lib/src/SND_exChannel.c +++ b/arm7/lib/src/SND_exChannel.c @@ -3,7 +3,6 @@ #include "SND_channel.h" #include "SND_main.h" #include "SND_work.h" -#include "SND_lockChannel.h" #include "SND_util.h" #include "registers.h" @@ -12,6 +11,9 @@ extern u8 sChannelAllocationOrder[SND_CHANNEL_COUNT]; extern u8 sAttackCoeffTable[19]; +static u32 sLockedChannelMask; +static u32 sWeakLockedChannelMask; + void SND_ExChannelInit(void) { struct SNDExChannel *chn; s32 i; @@ -344,3 +346,75 @@ void SND_FreeExChannel(struct SNDExChannel *chn) { chn->callbackUserData = NULL; } } + +void SND_StopUnlockedChannel(u32 channelMask, u32 weak) { + (void)weak; + + struct SNDExChannel *chn; + + for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1) { + if ((channelMask & 1) == 0) + continue; + + chn = &SNDi_Work.channels[i]; + + if (sLockedChannelMask & (1 << i)) + continue; + + if (chn->callback) + chn->callback(chn, 0, chn->callbackUserData); + + SND_StopChannel(i, 0); + chn->priority = 0; + SND_FreeExChannel(chn); + chn->flags.syncFlag = 0; + chn->flags.active = 0; + } +} + +void SND_LockChannel(u32 channelMask, u32 weak) { + struct SNDExChannel *chn; + u32 j = channelMask; + int i = 0; + + for (; i < SND_CHANNEL_COUNT && j != 0; i++, j >>= 1) { + if ((j & 1) == 0) + continue; + + chn = &SNDi_Work.channels[i]; + + if (sLockedChannelMask & (1 << i)) + continue; + + if (chn->callback) + chn->callback(chn, 0, chn->callbackUserData); + + SND_StopChannel(i, 0); + chn->priority = 0; + SND_FreeExChannel(chn); + chn->flags.syncFlag = 0; + chn->flags.active = 0; + } + + if (weak & 1) { + sWeakLockedChannelMask |= channelMask; + } else { + sLockedChannelMask |= channelMask; + } +} + +void SND_UnlockChannel(u32 channelMask, u32 weak) { + if (weak & 1) { + sWeakLockedChannelMask &= ~channelMask; + } else { + sLockedChannelMask &= ~channelMask; + } +} + +u32 SND_GetLockedChannel(u32 weak) { + if (weak & 1) { + return sWeakLockedChannelMask; + } else { + return sLockedChannelMask; + } +} diff --git a/arm7/lib/src/SND_lockChannel.c b/arm7/lib/src/SND_lockChannel.c deleted file mode 100644 index 871cf716..00000000 --- a/arm7/lib/src/SND_lockChannel.c +++ /dev/null @@ -1,81 +0,0 @@ -#include "SND_lockChannel.h" - -#include "SND_work.h" -#include "SND_exChannel.h" -#include "SND_channel.h" - -// TODO make these vars static after merging this file with exChannel -u32 sLockedChannelMask; -u32 sWeakLockedChannelMask; - -void SND_StopUnlockedChannel(u32 channelMask, u32 weak) { - (void)weak; - - struct SNDExChannel *chn; - - for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1) { - if ((channelMask & 1) == 0) - continue; - - chn = &SNDi_Work.channels[i]; - - if (sLockedChannelMask & (1 << i)) - continue; - - if (chn->callback) - chn->callback(chn, 0, chn->callbackUserData); - - SND_StopChannel(i, 0); - chn->priority = 0; - SND_FreeExChannel(chn); - chn->flags.syncFlag = 0; - chn->flags.active = 0; - } -} - -void SND_LockChannel(u32 channelMask, u32 weak) { - struct SNDExChannel *chn; - u32 j = channelMask; - int i = 0; - - for (; i < SND_CHANNEL_COUNT && j != 0; i++, j >>= 1) { - if ((j & 1) == 0) - continue; - - chn = &SNDi_Work.channels[i]; - - if (sLockedChannelMask & (1 << i)) - continue; - - if (chn->callback) - chn->callback(chn, 0, chn->callbackUserData); - - SND_StopChannel(i, 0); - chn->priority = 0; - SND_FreeExChannel(chn); - chn->flags.syncFlag = 0; - chn->flags.active = 0; - } - - if (weak & 1) { - sWeakLockedChannelMask |= channelMask; - } else { - sLockedChannelMask |= channelMask; - } -} - -void SND_UnlockChannel(u32 channelMask, u32 weak) { - if (weak & 1) { - sWeakLockedChannelMask &= ~channelMask; - } else { - sLockedChannelMask &= ~channelMask; - } -} - -u32 SND_GetLockedChannel(u32 weak) { - if (weak & 1) { - return sWeakLockedChannelMask; - } else { - return sLockedChannelMask; - } -} -- cgit v1.2.3 From 9a42ad73f93adceb0c39067906e0639c8f56aa31 Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Sun, 1 Aug 2021 11:57:01 +0200 Subject: arm7: merge SND_wave into SND_exChannel --- arm7/arm7.lsf | 1 - arm7/lib/include/SND_exChannel.h | 2 ++ arm7/lib/include/SND_wave.h | 6 ------ arm7/lib/src/SND_exChannel.c | 11 +++++++++++ arm7/lib/src/SND_wave.c | 15 --------------- 5 files changed, 13 insertions(+), 22 deletions(-) delete mode 100644 arm7/lib/include/SND_wave.h delete mode 100644 arm7/lib/src/SND_wave.c diff --git a/arm7/arm7.lsf b/arm7/arm7.lsf index 46b4ffb8..c3960f04 100644 --- a/arm7/arm7.lsf +++ b/arm7/arm7.lsf @@ -46,7 +46,6 @@ Autoload WRAM Object SND_capture.o Object SND_channel.o Object SND_lfo.o - Object SND_wave.o Object SND_exChannel.o Object SND_seq.o Object SND_bank.o diff --git a/arm7/lib/include/SND_exChannel.h b/arm7/lib/include/SND_exChannel.h index 9ebedc76..6bc4ab29 100644 --- a/arm7/lib/include/SND_exChannel.h +++ b/arm7/lib/include/SND_exChannel.h @@ -36,4 +36,6 @@ void SND_LockChannel(u32 channelMask, u32 weak); void SND_UnlockChannel(u32 channelMask, u32 weak); u32 SND_GetLockedChannel(u32 weak); +void SND_InvalidateWave(const void *begin, const void *end); + #endif //GUARD_SND_EXCHANNEL_H diff --git a/arm7/lib/include/SND_wave.h b/arm7/lib/include/SND_wave.h deleted file mode 100644 index fd76b1a5..00000000 --- a/arm7/lib/include/SND_wave.h +++ /dev/null @@ -1,6 +0,0 @@ -#ifndef GUARD_SND_WAVE_H -#define GUARD_SND_WAVE_H - -void SND_InvalidateWave(const void *begin, const void *end); - -#endif //GUARD_SND_WAVE_H diff --git a/arm7/lib/src/SND_exChannel.c b/arm7/lib/src/SND_exChannel.c index f3ba922b..54c5a3c4 100644 --- a/arm7/lib/src/SND_exChannel.c +++ b/arm7/lib/src/SND_exChannel.c @@ -418,3 +418,14 @@ u32 SND_GetLockedChannel(u32 weak) { return sLockedChannelMask; } } + +void SND_InvalidateWave(const void *start, const void *end) { + for (u8 i = 0; i < SND_CHANNEL_COUNT; i++) { + struct SNDExChannel *chn = &SNDi_Work.channels[i]; + + if (chn->flags.active && chn->type == 0 && start <= chn->waveDataPtr && chn->waveDataPtr <= end) { + chn->flags.start = FALSE; + SND_StopChannel(i, 0); + } + } +} diff --git a/arm7/lib/src/SND_wave.c b/arm7/lib/src/SND_wave.c deleted file mode 100644 index 21c48dc8..00000000 --- a/arm7/lib/src/SND_wave.c +++ /dev/null @@ -1,15 +0,0 @@ -#include "SND_wave.h" - -#include "SND_channel.h" -#include "SND_work.h" - -void SND_InvalidateWave(const void *start, const void *end) { - for (u8 i = 0; i < SND_CHANNEL_COUNT; i++) { - struct SNDExChannel *chn = &SNDi_Work.channels[i]; - - if (chn->flags.active && chn->type == 0 && start <= chn->waveDataPtr && chn->waveDataPtr <= end) { - chn->flags.start = FALSE; - SND_StopChannel(i, 0); - } - } -} -- cgit v1.2.3 From 5adc7017a33cf6d55cf76d95a72fc6f5d879bcc3 Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Sun, 1 Aug 2021 12:00:10 +0200 Subject: arm7: merge SND_lfo into SND_exChannel --- arm7/arm7.lsf | 1 - arm7/lib/include/SND_exChannel.h | 5 +++++ arm7/lib/include/SND_lfo.h | 5 ----- arm7/lib/src/SND_exChannel.c | 39 ++++++++++++++++++++++++++++++++++++ arm7/lib/src/SND_lfo.c | 43 ---------------------------------------- 5 files changed, 44 insertions(+), 49 deletions(-) delete mode 100644 arm7/lib/src/SND_lfo.c diff --git a/arm7/arm7.lsf b/arm7/arm7.lsf index c3960f04..e313647d 100644 --- a/arm7/arm7.lsf +++ b/arm7/arm7.lsf @@ -45,7 +45,6 @@ Autoload WRAM Object SND_main.o Object SND_capture.o Object SND_channel.o - Object SND_lfo.o Object SND_exChannel.o Object SND_seq.o Object SND_bank.o diff --git a/arm7/lib/include/SND_exChannel.h b/arm7/lib/include/SND_exChannel.h index 6bc4ab29..03fd4b41 100644 --- a/arm7/lib/include/SND_exChannel.h +++ b/arm7/lib/include/SND_exChannel.h @@ -38,4 +38,9 @@ u32 SND_GetLockedChannel(u32 weak); void SND_InvalidateWave(const void *begin, const void *end); +void SND_InitLfoParam(struct SNDLfoParam *lfoParam); +void SND_StartLfo(struct SNDLfo *lfo); +void SND_UpdateLfo(struct SNDLfo *lfo); +int SND_GetLfoValue(struct SNDLfo *lfo); + #endif //GUARD_SND_EXCHANNEL_H diff --git a/arm7/lib/include/SND_lfo.h b/arm7/lib/include/SND_lfo.h index 43055c27..f3737f08 100644 --- a/arm7/lib/include/SND_lfo.h +++ b/arm7/lib/include/SND_lfo.h @@ -5,9 +5,4 @@ #include "nitro/SND_exChannel_shared.h" -void SND_InitLfoParam(struct SNDLfoParam *lfoParam); -void SND_StartLfo(struct SNDLfo *lfo); -void SND_UpdateLfo(struct SNDLfo *lfo); -int SND_GetLfoValue(struct SNDLfo *lfo); - #endif //GUARD_SND_LFO_H diff --git a/arm7/lib/src/SND_exChannel.c b/arm7/lib/src/SND_exChannel.c index 54c5a3c4..6081150f 100644 --- a/arm7/lib/src/SND_exChannel.c +++ b/arm7/lib/src/SND_exChannel.c @@ -429,3 +429,42 @@ void SND_InvalidateWave(const void *start, const void *end) { } } } + +void SND_InitLfoParam(struct SNDLfoParam *lfoParam) { + lfoParam->target = SND_LFO_PITCH; + lfoParam->depth = 0; + lfoParam->range = 1; + lfoParam->speed = 16; + lfoParam->delay = 0; +} + +void SND_StartLfo(struct SNDLfo *lfo) { + lfo->counter = 0; + lfo->delayCounter = 0; +} + +void SND_UpdateLfo(struct SNDLfo *lfo) { + if (lfo->delayCounter < lfo->param.delay) { + lfo->delayCounter++; + } else { + u32 tmp = lfo->counter; + tmp += lfo->param.speed << 6; + tmp >>= 8; + while (tmp >= 0x80) { + tmp -= 0x80; + } + lfo->counter += lfo->param.speed << 6; + lfo->counter &= 0xFF; + lfo->counter |= tmp << 8; + } +} + +int SND_GetLfoValue(struct SNDLfo *lfo) { + if (lfo->param.depth == 0) { + return 0; + } else if (lfo->delayCounter < lfo->param.delay) { + return 0; + } else { + return SND_SinIdx((s32)((u32)lfo->counter >> 8)) * lfo->param.depth * lfo->param.range; + } +} diff --git a/arm7/lib/src/SND_lfo.c b/arm7/lib/src/SND_lfo.c deleted file mode 100644 index 262c6d27..00000000 --- a/arm7/lib/src/SND_lfo.c +++ /dev/null @@ -1,43 +0,0 @@ -#include "SND_lfo.h" - -#include "SND_util.h" -#include "SND_exChannel.h" - -void SND_InitLfoParam(struct SNDLfoParam *lfoParam) { - lfoParam->target = SND_LFO_PITCH; - lfoParam->depth = 0; - lfoParam->range = 1; - lfoParam->speed = 16; - lfoParam->delay = 0; -} - -void SND_StartLfo(struct SNDLfo *lfo) { - lfo->counter = 0; - lfo->delayCounter = 0; -} - -void SND_UpdateLfo(struct SNDLfo *lfo) { - if (lfo->delayCounter < lfo->param.delay) { - lfo->delayCounter++; - } else { - u32 tmp = lfo->counter; - tmp += lfo->param.speed << 6; - tmp >>= 8; - while (tmp >= 0x80) { - tmp -= 0x80; - } - lfo->counter += lfo->param.speed << 6; - lfo->counter &= 0xFF; - lfo->counter |= tmp << 8; - } -} - -int SND_GetLfoValue(struct SNDLfo *lfo) { - if (lfo->param.depth == 0) { - return 0; - } else if (lfo->delayCounter < lfo->param.delay) { - return 0; - } else { - return SND_SinIdx((s32)((u32)lfo->counter >> 8)) * lfo->param.depth * lfo->param.range; - } -} -- cgit v1.2.3 From 94657eec81f491a4d5925b2965bb1ea0d635705e Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Sun, 1 Aug 2021 12:07:49 +0200 Subject: arm7: merge SND_channel into SND_exChannel --- arm7/arm7.lsf | 1 - arm7/lib/include/SND_channel.h | 51 ----------------- arm7/lib/include/SND_exChannel.h | 42 ++++++++++++++ arm7/lib/src/SND.c | 1 - arm7/lib/src/SND_channel.c | 116 --------------------------------------- arm7/lib/src/SND_command.c | 1 - arm7/lib/src/SND_exChannel.c | 114 +++++++++++++++++++++++++++++++++++++- 7 files changed, 155 insertions(+), 171 deletions(-) delete mode 100644 arm7/lib/include/SND_channel.h delete mode 100644 arm7/lib/src/SND_channel.c diff --git a/arm7/arm7.lsf b/arm7/arm7.lsf index e313647d..c8c7e318 100644 --- a/arm7/arm7.lsf +++ b/arm7/arm7.lsf @@ -44,7 +44,6 @@ Autoload WRAM Object SND_util.o Object SND_main.o Object SND_capture.o - Object SND_channel.o Object SND_exChannel.o Object SND_seq.o Object SND_bank.o diff --git a/arm7/lib/include/SND_channel.h b/arm7/lib/include/SND_channel.h deleted file mode 100644 index 9e015beb..00000000 --- a/arm7/lib/include/SND_channel.h +++ /dev/null @@ -1,51 +0,0 @@ -#ifndef GUARD_SND_CHANNEL_H -#define GUARD_SND_CHANNEL_H - -#include "nitro/types.h" - -#include "SND_exChannel.h" - -void SNDi_SetSurroundDecay(int decay); - -void SND_SetupChannelPcm( - int chnIdx, - const void *data, - int format, - int loop, - int loopStart, - int loopLen, - int volume, - int volumeDiv, - int timer, - int pan -); - -void SND_SetupChannelPsg( - int chnIdx, - int waveDuty, - int volume, - int volumeDiv, - int timer, - int pan -); - -void SND_SetupChannelNoise( - int chnIdx, - int volume, - int volumeDiv, - int timer, - int pan -); - -void SND_StopChannel(int chnIdx, int hold); - -void SND_SetChannelVolume(int chnIdx, int volume, int volumeDiv); -void SND_SetChannelPan(int chnIdx, int pan); -void SND_SetChannelTimer(int chnIdx, int timer); - -u32 SND_GetChannelControl(int idx); - -// TODO move this function to SND_exChannel.c -u16 CalcDecayCoeff(int value); - -#endif //GUARD_SND_CHANNEL_H diff --git a/arm7/lib/include/SND_exChannel.h b/arm7/lib/include/SND_exChannel.h index 03fd4b41..a2d19971 100644 --- a/arm7/lib/include/SND_exChannel.h +++ b/arm7/lib/include/SND_exChannel.h @@ -42,5 +42,47 @@ void SND_InitLfoParam(struct SNDLfoParam *lfoParam); void SND_StartLfo(struct SNDLfo *lfo); void SND_UpdateLfo(struct SNDLfo *lfo); int SND_GetLfoValue(struct SNDLfo *lfo); +void SNDi_SetSurroundDecay(int decay); + +void SND_SetupChannelPcm( + int chnIdx, + const void *data, + int format, + int loop, + int loopStart, + int loopLen, + int volume, + int volumeDiv, + int timer, + int pan +); + +void SND_SetupChannelPsg( + int chnIdx, + int waveDuty, + int volume, + int volumeDiv, + int timer, + int pan +); + +void SND_SetupChannelNoise( + int chnIdx, + int volume, + int volumeDiv, + int timer, + int pan +); + +void SND_StopChannel(int chnIdx, int hold); + +void SND_SetChannelVolume(int chnIdx, int volume, int volumeDiv); +void SND_SetChannelPan(int chnIdx, int pan); +void SND_SetChannelTimer(int chnIdx, int timer); + +u32 SND_GetChannelControl(int idx); + +// TODO move this function to SND_exChannel.c +u16 CalcDecayCoeff(int value); #endif //GUARD_SND_EXCHANNEL_H diff --git a/arm7/lib/src/SND.c b/arm7/lib/src/SND.c index 6c17fa69..c4b9d900 100644 --- a/arm7/lib/src/SND.c +++ b/arm7/lib/src/SND.c @@ -7,7 +7,6 @@ #include "PM.h" #include "SND_exChannel.h" #include "SND_work.h" -#include "SND_channel.h" static int sMasterPan = -1; diff --git a/arm7/lib/src/SND_channel.c b/arm7/lib/src/SND_channel.c deleted file mode 100644 index 66acf606..00000000 --- a/arm7/lib/src/SND_channel.c +++ /dev/null @@ -1,116 +0,0 @@ -#include "SND_channel.h" - -#include "SND_lfo.h" - -// TODO remove this extern once we actually know where this table is -extern u8 sSampleDataShiftTable[4]; - -u16 CalcDecayCoeff(int vol) { - if (vol == 127) - return 0xFFFF; - else if (vol == 126) - return 0x3C00; - else if (vol < 50) - return (u16)(vol * 2 + 1); - else - return (u16)(0x1E00 / (126 - vol)); -} - -void ExChannelSetup(struct SNDExChannel *chn, SNDExChannelCallback callback, void *callbackUserData, int priority) { - chn->channelLLNext = NULL; - chn->callback = callback; - chn->callbackUserData = callbackUserData; - chn->length = 0; - chn->priority = (u8)priority; - chn->volume = 127; - chn->flags.start = FALSE; - chn->flags.autoSweep = TRUE; - chn->midiKey = 60; - chn->rootMidiKey = 60; - chn->velocity = 127; - chn->initPan = 0; - chn->userDecay = 0; - chn->userDecay2 = 0; - chn->userPitch = 0; - chn->userPan = 0; - chn->panRange = 127; - chn->sweepPitch = 0; - chn->sweepLength = 0; - chn->sweepCounter = 0; - - SND_SetExChannelAttack(chn, 127); - SND_SetExChannelDecay(chn, 127); - SND_SetExChannelSustain(chn, 127); - SND_SetExChannelRelease(chn, 127); - SND_InitLfoParam(&chn->lfo.param); -} - -void ExChannelStart(struct SNDExChannel *chn, int length) { - chn->envAttenuation = -92544; - chn->envStatus = 0; - chn->length = length; - SND_StartLfo(&chn->lfo); - chn->flags.start = TRUE; - chn->flags.active = TRUE; -} - -int ExChannelVolumeCmp(struct SNDExChannel *chn_a, struct SNDExChannel *chn_b) { - int vol_a = chn_a->volume & 0xFF; - int vol_b = chn_b->volume & 0xFF; - - vol_a <<= 4; - vol_b <<= 4; - - vol_a >>= sSampleDataShiftTable[chn_a->volume >> 8]; - vol_b >>= sSampleDataShiftTable[chn_b->volume >> 8]; - - if (vol_a != vol_b) { - if (vol_a < vol_b) - return 1; - else - return -1; - } - return 0; -} - -int ExChannelSweepUpdate(struct SNDExChannel *chn, BOOL step) { - s64 result; - - if (chn->sweepPitch == 0) { - result = 0; - } else if (chn->sweepCounter >= chn->sweepLength) { - result = 0; - } else { - result = (s64)chn->sweepPitch * (chn->sweepLength - chn->sweepCounter) / chn->sweepLength; - - if (step && chn->flags.autoSweep) - chn->sweepCounter++; - } - - return (int)result; -} - -int ExChannelLfoUpdate(struct SNDExChannel *chn, BOOL step) { - s64 result = SND_GetLfoValue(&chn->lfo); - - if (result != 0) { - switch (chn->lfo.param.target) { - case SND_LFO_VOLUME: - result *= 60; - break; - case SND_LFO_PITCH: - result <<= 6; - break; - case SND_LFO_PAN: - result <<= 6; - break; - } - result >>= 14; - } - - if (step) { - SND_UpdateLfo(&chn->lfo); - } - - return (int)result; -} diff --git a/arm7/lib/src/SND_command.c b/arm7/lib/src/SND_command.c index 1ffcb0d5..ada6161c 100644 --- a/arm7/lib/src/SND_command.c +++ b/arm7/lib/src/SND_command.c @@ -10,7 +10,6 @@ #include "SND.h" #include "SND_alarm.h" #include "SND_capture.h" -#include "SND_channel.h" #include "SND_exChannel.h" #include "SND_main.h" #include "SND_seq.h" diff --git a/arm7/lib/src/SND_exChannel.c b/arm7/lib/src/SND_exChannel.c index 6081150f..7e41aea3 100644 --- a/arm7/lib/src/SND_exChannel.c +++ b/arm7/lib/src/SND_exChannel.c @@ -1,6 +1,5 @@ #include "SND_exChannel.h" -#include "SND_channel.h" #include "SND_main.h" #include "SND_work.h" #include "SND_util.h" @@ -14,6 +13,9 @@ extern u8 sAttackCoeffTable[19]; static u32 sLockedChannelMask; static u32 sWeakLockedChannelMask; +// TODO remove this extern once we actually know where this table is +extern u8 sSampleDataShiftTable[4]; + void SND_ExChannelInit(void) { struct SNDExChannel *chn; s32 i; @@ -468,3 +470,113 @@ int SND_GetLfoValue(struct SNDLfo *lfo) { return SND_SinIdx((s32)((u32)lfo->counter >> 8)) * lfo->param.depth * lfo->param.range; } } + +u16 CalcDecayCoeff(int vol) { + if (vol == 127) + return 0xFFFF; + else if (vol == 126) + return 0x3C00; + else if (vol < 50) + return (u16)(vol * 2 + 1); + else + return (u16)(0x1E00 / (126 - vol)); +} + +void ExChannelSetup(struct SNDExChannel *chn, SNDExChannelCallback callback, void *callbackUserData, int priority) { + chn->channelLLNext = NULL; + chn->callback = callback; + chn->callbackUserData = callbackUserData; + chn->length = 0; + chn->priority = (u8)priority; + chn->volume = 127; + chn->flags.start = FALSE; + chn->flags.autoSweep = TRUE; + chn->midiKey = 60; + chn->rootMidiKey = 60; + chn->velocity = 127; + chn->initPan = 0; + chn->userDecay = 0; + chn->userDecay2 = 0; + chn->userPitch = 0; + chn->userPan = 0; + chn->panRange = 127; + chn->sweepPitch = 0; + chn->sweepLength = 0; + chn->sweepCounter = 0; + + SND_SetExChannelAttack(chn, 127); + SND_SetExChannelDecay(chn, 127); + SND_SetExChannelSustain(chn, 127); + SND_SetExChannelRelease(chn, 127); + SND_InitLfoParam(&chn->lfo.param); +} + +void ExChannelStart(struct SNDExChannel *chn, int length) { + chn->envAttenuation = -92544; + chn->envStatus = 0; + chn->length = length; + SND_StartLfo(&chn->lfo); + chn->flags.start = TRUE; + chn->flags.active = TRUE; +} + +int ExChannelVolumeCmp(struct SNDExChannel *chn_a, struct SNDExChannel *chn_b) { + int vol_a = chn_a->volume & 0xFF; + int vol_b = chn_b->volume & 0xFF; + + vol_a <<= 4; + vol_b <<= 4; + + vol_a >>= sSampleDataShiftTable[chn_a->volume >> 8]; + vol_b >>= sSampleDataShiftTable[chn_b->volume >> 8]; + + if (vol_a != vol_b) { + if (vol_a < vol_b) + return 1; + else + return -1; + } + return 0; +} + +int ExChannelSweepUpdate(struct SNDExChannel *chn, BOOL step) { + s64 result; + + if (chn->sweepPitch == 0) { + result = 0; + } else if (chn->sweepCounter >= chn->sweepLength) { + result = 0; + } else { + result = (s64)chn->sweepPitch * (chn->sweepLength - chn->sweepCounter) / chn->sweepLength; + + if (step && chn->flags.autoSweep) + chn->sweepCounter++; + } + + return (int)result; +} + +int ExChannelLfoUpdate(struct SNDExChannel *chn, BOOL step) { + s64 result = SND_GetLfoValue(&chn->lfo); + + if (result != 0) { + switch (chn->lfo.param.target) { + case SND_LFO_VOLUME: + result *= 60; + break; + case SND_LFO_PITCH: + result <<= 6; + break; + case SND_LFO_PAN: + result <<= 6; + break; + } + result >>= 14; + } + + if (step) { + SND_UpdateLfo(&chn->lfo); + } + + return (int)result; +} -- cgit v1.2.3 From 07509f83f91c412f9150c52b4467429ac46eefe2 Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Sun, 1 Aug 2021 12:39:24 +0200 Subject: arm7: split SND into SND_global and SND_channel --- arm7/arm7.lsf | 3 +- arm7/lib/include/SND.h | 15 --- arm7/lib/include/SND_channel.h | 47 +++++++++ arm7/lib/include/SND_exChannel.h | 43 --------- arm7/lib/include/SND_global.h | 14 +++ arm7/lib/include/SND_main.h | 2 - arm7/lib/src/SND.c | 200 --------------------------------------- arm7/lib/src/SND_channel.c | 151 +++++++++++++++++++++++++++++ arm7/lib/src/SND_command.c | 3 +- arm7/lib/src/SND_exChannel.c | 5 +- arm7/lib/src/SND_global.c | 53 +++++++++++ arm7/lib/src/SND_main.c | 2 +- arm7/lib/src/SND_work.c | 1 + 13 files changed, 275 insertions(+), 264 deletions(-) delete mode 100644 arm7/lib/include/SND.h create mode 100644 arm7/lib/include/SND_channel.h create mode 100644 arm7/lib/include/SND_global.h delete mode 100644 arm7/lib/src/SND.c create mode 100644 arm7/lib/src/SND_channel.c create mode 100644 arm7/lib/src/SND_global.c diff --git a/arm7/arm7.lsf b/arm7/arm7.lsf index c8c7e318..950f30e7 100644 --- a/arm7/arm7.lsf +++ b/arm7/arm7.lsf @@ -40,7 +40,8 @@ Autoload WRAM Object PXI_fifo.o Object EXI_genPort.o Object PAD_xyButton.o - Object SND.o + Object SND_global.o + Object SND_channel.o Object SND_util.o Object SND_main.o Object SND_capture.o diff --git a/arm7/lib/include/SND.h b/arm7/lib/include/SND.h deleted file mode 100644 index 196377ed..00000000 --- a/arm7/lib/include/SND.h +++ /dev/null @@ -1,15 +0,0 @@ -#ifndef GUARD_SND_H -#define GUARD_SND_H - -#include "nitro/types.h" - -void SND_Enable(void); -void SND_Disable(void); -void SND_Shutdown(void); -void SND_BeginSleep(void); -void SND_EndSleep(void); -void SND_SetMasterPan(int pan); -void SND_SetMasterVolume(int vol); -void SND_SetOutputSelector(int leftOutputFrom, int rightOutputFrom, int outputCh1ToMixer, int outputCh3ToMixer); - -#endif //GUARD_SND_H diff --git a/arm7/lib/include/SND_channel.h b/arm7/lib/include/SND_channel.h new file mode 100644 index 00000000..0c3cbe7b --- /dev/null +++ b/arm7/lib/include/SND_channel.h @@ -0,0 +1,47 @@ +#ifndef GUARD_SND_CHANNEL_H +#define GUARD_SND_CHANNEL_H + +#include "nitro/types.h" + +void SND_SetupChannelPcm( + int chnIdx, + const void *data, + int format, + int loop, + int loopStart, + int loopLen, + int volume, + int volumeDiv, + int timer, + int pan +); + +void SND_SetupChannelPsg( + int chnIdx, + int waveDuty, + int volume, + int volumeDiv, + int timer, + int pan +); + +void SND_SetupChannelNoise( + int chnIdx, + int volume, + int volumeDiv, + int timer, + int pan +); + +void SND_StopChannel(int chnIdx, int hold); + +void SND_SetChannelVolume(int chnIdx, int volume, int volumeDiv); +void SND_SetChannelTimer(int chnIdx, int timer); +void SND_SetChannelPan(int chnIdx, int pan); + +BOOL SND_IsChannelActive(int idx); +void SND_SetMasterPan(int pan); +u32 SND_GetChannelControl(int idx); +void SNDi_SetSurroundDecay(int decay); + +#endif //GUARD_SND_CHANNEL_H diff --git a/arm7/lib/include/SND_exChannel.h b/arm7/lib/include/SND_exChannel.h index a2d19971..99f8de21 100644 --- a/arm7/lib/include/SND_exChannel.h +++ b/arm7/lib/include/SND_exChannel.h @@ -21,7 +21,6 @@ void SND_ReleaseExChannel(struct SNDExChannel *chn); BOOL SND_IsExChannelActive(struct SNDExChannel *chn); struct SNDExChannel *SND_AllocExChannel(u32 channelMask, int priority, u32 flags, SNDExChannelCallback callback, void *callbackUserData); void SND_FreeExChannel(struct SNDExChannel *chn); -BOOL SND_IsChannelActive(int idx); void SND_InvalidateWave(const void *start, const void *end); // TODO internal functions, move these so exChannel @@ -42,47 +41,5 @@ void SND_InitLfoParam(struct SNDLfoParam *lfoParam); void SND_StartLfo(struct SNDLfo *lfo); void SND_UpdateLfo(struct SNDLfo *lfo); int SND_GetLfoValue(struct SNDLfo *lfo); -void SNDi_SetSurroundDecay(int decay); - -void SND_SetupChannelPcm( - int chnIdx, - const void *data, - int format, - int loop, - int loopStart, - int loopLen, - int volume, - int volumeDiv, - int timer, - int pan -); - -void SND_SetupChannelPsg( - int chnIdx, - int waveDuty, - int volume, - int volumeDiv, - int timer, - int pan -); - -void SND_SetupChannelNoise( - int chnIdx, - int volume, - int volumeDiv, - int timer, - int pan -); - -void SND_StopChannel(int chnIdx, int hold); - -void SND_SetChannelVolume(int chnIdx, int volume, int volumeDiv); -void SND_SetChannelPan(int chnIdx, int pan); -void SND_SetChannelTimer(int chnIdx, int timer); - -u32 SND_GetChannelControl(int idx); - -// TODO move this function to SND_exChannel.c -u16 CalcDecayCoeff(int value); #endif //GUARD_SND_EXCHANNEL_H diff --git a/arm7/lib/include/SND_global.h b/arm7/lib/include/SND_global.h new file mode 100644 index 00000000..47bb7a69 --- /dev/null +++ b/arm7/lib/include/SND_global.h @@ -0,0 +1,14 @@ +#ifndef GUARD_SND_GLOBAL_H +#define GUARD_SND_GLOBAL_H + +#include "nitro/types.h" + +void SND_Enable(void); +void SND_Disable(void); +void SND_Shutdown(void); +void SND_BeginSleep(void); +void SND_EndSleep(void); +void SND_SetMasterVolume(int vol); +void SND_SetOutputSelector(int leftOutputFrom, int rightOutputFrom, int outputCh1ToMixer, int outputCh3ToMixer); + +#endif //GUARD_SND_GLOBAL_H diff --git a/arm7/lib/include/SND_main.h b/arm7/lib/include/SND_main.h index fc72ae33..eba3ff44 100644 --- a/arm7/lib/include/SND_main.h +++ b/arm7/lib/include/SND_main.h @@ -12,7 +12,5 @@ u32 SND_WaitForIntervalTimer(void); void SND_SendWakeupMessage(void); void SNDi_LockMutex(void); void SNDi_UnlockMutex(void); -void SND_SetMasterVolume(int vol); -void SND_SetMasterPan(int pan); #endif //GUARD_SND_MAIN_H diff --git a/arm7/lib/src/SND.c b/arm7/lib/src/SND.c deleted file mode 100644 index c4b9d900..00000000 --- a/arm7/lib/src/SND.c +++ /dev/null @@ -1,200 +0,0 @@ -#include "SND.h" - -#include "registers.h" -#include "syscall.h" - -#include "OS_system.h" -#include "PM.h" -#include "SND_exChannel.h" -#include "SND_work.h" - -static int sMasterPan = -1; - -static u8 sOrgVolume[SND_CHANNEL_COUNT]; -static u8 sOrgPan[SND_CHANNEL_COUNT]; -static int sSurroundDecay; - -static int CalcSurroundDecay(int vol, int pan); - -void SND_SetupChannelPcm(int chnIdx, const void *data, int format, int loop, int loopStart, int loopLength, int volume, int volumeDiv, int timer, int pan) { - int off = chnIdx * 0x10; - - sOrgPan[chnIdx] = (u8)pan; - if (sMasterPan >= 0) - pan = sMasterPan; - - sOrgVolume[chnIdx] = (u8)volume; - if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) { - volume = CalcSurroundDecay(volume, pan); - } - - reg_SOUNDoffCNT(off) = (u32)((format << 29) | (loop << 27) | (pan << 16) | (volumeDiv << 8) | (volume)); - reg_SOUNDoffTMR(off) = (u16)(0x10000 - timer); - reg_SOUNDoffPNT(off) = (u16)loopStart; - reg_SOUNDoffLEN(off) = (u32)loopLength; - reg_SOUNDoffSAD(off) = (u32)data; -} - -void SND_SetupChannelPsg(int chnIdx, int duty, int volume, int volumeDiv, int timer, int pan) { - int off = chnIdx * 0x10; - - sOrgPan[chnIdx] = (u8)pan; - if (sMasterPan >= 0) - pan = sMasterPan; - - sOrgVolume[chnIdx] = (u8)volume; - if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) { - volume = CalcSurroundDecay(volume, pan); - } - - reg_SOUNDoffCNT(off) = (u32)(0x60000000 | (duty << 24) | (pan << 16) | (volumeDiv << 8) | volume); - reg_SOUNDoffTMR(off) = (u16)(0x10000 - timer); -} - -void SND_SetupChannelNoise(int chnIdx, int volume, int volumeDiv, int timer, int pan) { - int off = chnIdx * 0x10; - - sOrgPan[chnIdx] = (u8)pan; - if (sMasterPan >= 0) - pan = sMasterPan; - - sOrgVolume[chnIdx] = (u8)volume; - if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) { - volume = CalcSurroundDecay(volume, pan); - } - - reg_SOUNDoffCNT(off) = (u32)(0x60000000 | (pan << 16) | (volumeDiv << 8) | volume); - reg_SOUNDoffTMR(off) = (u16)(0x10000 - timer); -} - -void SND_StopChannel(int idx, int hold) { - vu32 *reg = ®_SOUNDxCNT(idx); - - u32 v = *reg; - - // disable channel - v &= ~0x80000000; - - // set hold flag - if (hold & 1) - v |= 0x8000; - - *reg = v; -} - -void SND_SetChannelVolume(int chnIdx, int vol, int volDiv) { - sOrgVolume[chnIdx] = (u8)vol; - - if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) { - int pan = reg_SOUNDxCNT_PAN(chnIdx); - vol = CalcSurroundDecay(vol, pan); - } - - reg_SOUNDxCNT_VOLS(chnIdx) = (u16)((volDiv << 8) | vol); -} - -void SND_SetChannelTimer(int chnIdx, int timer) { - reg_SOUNDxTMR(chnIdx) = (u16)(0x10000 - timer); -} - -void SND_SetChannelPan(int chnIdx, int pan) { - sOrgPan[chnIdx] = (u8)pan; - - if (sMasterPan >= 0) { - pan = sMasterPan; - } - - reg_SOUNDxCNT_PAN(chnIdx) = (u8)pan; - - if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) { - reg_SOUNDxCNT_VOL(chnIdx) = (u8)CalcSurroundDecay(sOrgVolume[chnIdx], pan); - } -} - -BOOL SND_IsChannelActive(int chnIdx) { - return (reg_SOUNDxCNT_STAT(chnIdx) & 0x80) != 0; -} - -void SND_SetMasterPan(int pan) { - sMasterPan = pan; - - if (pan >= 0) { - for (int i = 0; i < SND_CHANNEL_COUNT; i++) { - reg_SOUNDxCNT_PAN(i) = (u8)pan; - } - } else { - for (int i = 0; i < SND_CHANNEL_COUNT; i++) { - reg_SOUNDxCNT_PAN(i) = sOrgPan[i]; - } - } -} - -u32 SND_GetChannelControl(int chnIdx) { - return reg_SOUNDxCNT(chnIdx); -} - -void SNDi_SetSurroundDecay(int decay) { - sSurroundDecay = decay; - - for (int i = 0; i < SND_CHANNEL_COUNT; i++) { - // do not process channel 1+3 (capture playback channels) - if ((1 << i) & 0xFFF5) { - int pan = reg_SOUNDxCNT_PAN(i); - reg_SOUNDxCNT_VOL(i) = (u8)CalcSurroundDecay(sOrgVolume[i], pan); - } - } -} - -static int CalcSurroundDecay(int vol, int pan) { - if (pan < 24) { - return vol * (sSurroundDecay * (pan + 40) + ((0x7FFF - sSurroundDecay) << 6)) >> 21; - } else if (pan <= 104) { - return vol; - } else { - return vol * (-sSurroundDecay * (pan - 40) + ((sSurroundDecay + 0x7FFF) << 6)) >> 21; - } -} - -void SND_Enable(void) { - reg_SOUNDCNT_MIX |= 0x80; -} - -void SND_Disable(void) { - reg_SOUNDCNT_MIX &= ~0x80; -} - -void SND_Shutdown(void) { - SND_Disable(); - - for (int i = 0; i < SND_CHANNEL_COUNT; i++) { - SND_StopChannel(i, 1); - } - - reg_SNDCAPxCNT(0) = 0; - reg_SNDCAPxCNT(1) = 0; -} - -void SND_BeginSleep(void) { - SND_Disable(); - SVC_SoundBiasReset(0x80); - OS_SpinWait(0x40000); - PMi_ResetControl(1); - reg_POWCNT2 &= ~1; -} - -void SND_EndSleep(void) { - reg_POWCNT2 |= 1; // enable speakers - PMi_SetControl(1); - SVC_SoundBiasSet(0x100); - OS_SpinWait(0x7AB80); // what does this wait for and how long does it wait? - SND_Enable(); -} - -void SND_SetMasterVolume(int vol) { - reg_SOUNDCNT_VOL = (u8)vol; -} - -void SND_SetOutputSelector(int leftOutputFrom, int rightOutputFrom, int outputCh1ToMixer, int outputCh3ToMixer) { - int masterEnable = (reg_SOUNDCNT_MIX & 0x80) ? 1 : 0; - reg_SOUNDCNT_MIX = (u8)((masterEnable << 7) | (outputCh3ToMixer << 5) | (outputCh1ToMixer << 4) | (rightOutputFrom << 2) | (leftOutputFrom)); -} diff --git a/arm7/lib/src/SND_channel.c b/arm7/lib/src/SND_channel.c new file mode 100644 index 00000000..99b80a7c --- /dev/null +++ b/arm7/lib/src/SND_channel.c @@ -0,0 +1,151 @@ +#include "SND_channel.h" + +#include "registers.h" +#include "SND_work.h" + +static int sMasterPan = -1; + +static u8 sOrgVolume[SND_CHANNEL_COUNT]; +static u8 sOrgPan[SND_CHANNEL_COUNT]; +static int sSurroundDecay; + +static int CalcSurroundDecay(int vol, int pan); + +void SND_SetupChannelPcm(int chnIdx, const void *data, int format, int loop, int loopStart, int loopLength, int volume, int volumeDiv, int timer, int pan) { + int off = chnIdx * 0x10; + + sOrgPan[chnIdx] = (u8)pan; + if (sMasterPan >= 0) + pan = sMasterPan; + + sOrgVolume[chnIdx] = (u8)volume; + if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) { + volume = CalcSurroundDecay(volume, pan); + } + + reg_SOUNDoffCNT(off) = (u32)((format << 29) | (loop << 27) | (pan << 16) | (volumeDiv << 8) | (volume)); + reg_SOUNDoffTMR(off) = (u16)(0x10000 - timer); + reg_SOUNDoffPNT(off) = (u16)loopStart; + reg_SOUNDoffLEN(off) = (u32)loopLength; + reg_SOUNDoffSAD(off) = (u32)data; +} + +void SND_SetupChannelPsg(int chnIdx, int duty, int volume, int volumeDiv, int timer, int pan) { + int off = chnIdx * 0x10; + + sOrgPan[chnIdx] = (u8)pan; + if (sMasterPan >= 0) + pan = sMasterPan; + + sOrgVolume[chnIdx] = (u8)volume; + if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) { + volume = CalcSurroundDecay(volume, pan); + } + + reg_SOUNDoffCNT(off) = (u32)(0x60000000 | (duty << 24) | (pan << 16) | (volumeDiv << 8) | volume); + reg_SOUNDoffTMR(off) = (u16)(0x10000 - timer); +} + +void SND_SetupChannelNoise(int chnIdx, int volume, int volumeDiv, int timer, int pan) { + int off = chnIdx * 0x10; + + sOrgPan[chnIdx] = (u8)pan; + if (sMasterPan >= 0) + pan = sMasterPan; + + sOrgVolume[chnIdx] = (u8)volume; + if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) { + volume = CalcSurroundDecay(volume, pan); + } + + reg_SOUNDoffCNT(off) = (u32)(0x60000000 | (pan << 16) | (volumeDiv << 8) | volume); + reg_SOUNDoffTMR(off) = (u16)(0x10000 - timer); +} + +void SND_StopChannel(int idx, int hold) { + vu32 *reg = ®_SOUNDxCNT(idx); + + u32 v = *reg; + + // disable channel + v &= ~0x80000000; + + // set hold flag + if (hold & 1) + v |= 0x8000; + + *reg = v; +} + +void SND_SetChannelVolume(int chnIdx, int vol, int volDiv) { + sOrgVolume[chnIdx] = (u8)vol; + + if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) { + int pan = reg_SOUNDxCNT_PAN(chnIdx); + vol = CalcSurroundDecay(vol, pan); + } + + reg_SOUNDxCNT_VOLS(chnIdx) = (u16)((volDiv << 8) | vol); +} + +void SND_SetChannelTimer(int chnIdx, int timer) { + reg_SOUNDxTMR(chnIdx) = (u16)(0x10000 - timer); +} + +void SND_SetChannelPan(int chnIdx, int pan) { + sOrgPan[chnIdx] = (u8)pan; + + if (sMasterPan >= 0) { + pan = sMasterPan; + } + + reg_SOUNDxCNT_PAN(chnIdx) = (u8)pan; + + if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) { + reg_SOUNDxCNT_VOL(chnIdx) = (u8)CalcSurroundDecay(sOrgVolume[chnIdx], pan); + } +} + +BOOL SND_IsChannelActive(int chnIdx) { + return (reg_SOUNDxCNT_STAT(chnIdx) & 0x80) != 0; +} + +void SND_SetMasterPan(int pan) { + sMasterPan = pan; + + if (pan >= 0) { + for (int i = 0; i < SND_CHANNEL_COUNT; i++) { + reg_SOUNDxCNT_PAN(i) = (u8)pan; + } + } else { + for (int i = 0; i < SND_CHANNEL_COUNT; i++) { + reg_SOUNDxCNT_PAN(i) = sOrgPan[i]; + } + } +} + +u32 SND_GetChannelControl(int chnIdx) { + return reg_SOUNDxCNT(chnIdx); +} + +void SNDi_SetSurroundDecay(int decay) { + sSurroundDecay = decay; + + for (int i = 0; i < SND_CHANNEL_COUNT; i++) { + // do not process channel 1+3 (capture playback channels) + if ((1 << i) & 0xFFF5) { + int pan = reg_SOUNDxCNT_PAN(i); + reg_SOUNDxCNT_VOL(i) = (u8)CalcSurroundDecay(sOrgVolume[i], pan); + } + } +} + +static int CalcSurroundDecay(int vol, int pan) { + if (pan < 24) { + return vol * (sSurroundDecay * (pan + 40) + ((0x7FFF - sSurroundDecay) << 6)) >> 21; + } else if (pan <= 104) { + return vol; + } else { + return vol * (-sSurroundDecay * (pan - 40) + ((sSurroundDecay + 0x7FFF) << 6)) >> 21; + } +} diff --git a/arm7/lib/src/SND_command.c b/arm7/lib/src/SND_command.c index ada6161c..bcb43d73 100644 --- a/arm7/lib/src/SND_command.c +++ b/arm7/lib/src/SND_command.c @@ -7,10 +7,11 @@ #include "PXI_fifo.h" #include "OS_message.h" #include "OS_system.h" -#include "SND.h" +#include "SND_channel.h" #include "SND_alarm.h" #include "SND_capture.h" #include "SND_exChannel.h" +#include "SND_global.h" #include "SND_main.h" #include "SND_seq.h" #include "SND_work.h" diff --git a/arm7/lib/src/SND_exChannel.c b/arm7/lib/src/SND_exChannel.c index 7e41aea3..01bd4f3e 100644 --- a/arm7/lib/src/SND_exChannel.c +++ b/arm7/lib/src/SND_exChannel.c @@ -1,5 +1,6 @@ #include "SND_exChannel.h" +#include "SND_channel.h" #include "SND_main.h" #include "SND_work.h" #include "SND_util.h" @@ -16,6 +17,8 @@ static u32 sWeakLockedChannelMask; // TODO remove this extern once we actually know where this table is extern u8 sSampleDataShiftTable[4]; +static u16 CalcDecayCoeff(int vol); + void SND_ExChannelInit(void) { struct SNDExChannel *chn; s32 i; @@ -471,7 +474,7 @@ int SND_GetLfoValue(struct SNDLfo *lfo) { } } -u16 CalcDecayCoeff(int vol) { +static u16 CalcDecayCoeff(int vol) { if (vol == 127) return 0xFFFF; else if (vol == 126) diff --git a/arm7/lib/src/SND_global.c b/arm7/lib/src/SND_global.c new file mode 100644 index 00000000..0654934f --- /dev/null +++ b/arm7/lib/src/SND_global.c @@ -0,0 +1,53 @@ +#include "SND_global.h" + +#include "SND_channel.h" +#include "SND_work.h" + +#include "OS_system.h" +#include "PM.h" +#include "registers.h" +#include "syscall.h" + +void SND_Enable(void) { + reg_SOUNDCNT_MIX |= 0x80; +} + +void SND_Disable(void) { + reg_SOUNDCNT_MIX &= ~0x80; +} + +void SND_Shutdown(void) { + SND_Disable(); + + for (int i = 0; i < SND_CHANNEL_COUNT; i++) { + SND_StopChannel(i, 1); + } + + reg_SNDCAPxCNT(0) = 0; + reg_SNDCAPxCNT(1) = 0; +} + +void SND_BeginSleep(void) { + SND_Disable(); + SVC_SoundBiasReset(0x80); + OS_SpinWait(0x40000); + PMi_ResetControl(1); + reg_POWCNT2 &= ~1; +} + +void SND_EndSleep(void) { + reg_POWCNT2 |= 1; // enable speakers + PMi_SetControl(1); + SVC_SoundBiasSet(0x100); + OS_SpinWait(0x7AB80); // what does this wait for and how long does it wait? + SND_Enable(); +} + +void SND_SetMasterVolume(int vol) { + reg_SOUNDCNT_VOL = (u8)vol; +} + +void SND_SetOutputSelector(int leftOutputFrom, int rightOutputFrom, int outputCh1ToMixer, int outputCh3ToMixer) { + int masterEnable = (reg_SOUNDCNT_MIX & 0x80) ? 1 : 0; + reg_SOUNDCNT_MIX = (u8)((masterEnable << 7) | (outputCh3ToMixer << 5) | (outputCh1ToMixer << 4) | (rightOutputFrom << 2) | (leftOutputFrom)); +} diff --git a/arm7/lib/src/SND_main.c b/arm7/lib/src/SND_main.c index 96dcdc78..24e81d2c 100644 --- a/arm7/lib/src/SND_main.c +++ b/arm7/lib/src/SND_main.c @@ -2,11 +2,11 @@ #include "global.h" -#include "SND.h" #include "SND_alarm.h" #include "SND_capture.h" #include "SND_command.h" #include "SND_exChannel.h" +#include "SND_global.h" #include "SND_seq.h" #include "SND_util.h" #include "SND_work.h" diff --git a/arm7/lib/src/SND_work.c b/arm7/lib/src/SND_work.c index 3f0d10f0..d40ccdc6 100644 --- a/arm7/lib/src/SND_work.c +++ b/arm7/lib/src/SND_work.c @@ -1,5 +1,6 @@ #include "SND_work.h" +#include "SND_channel.h" #include "SND_exChannel.h" #include "SND_capture.h" -- cgit v1.2.3 From 17bd4c9973fff575355a8c35532f37d7c05dbf60 Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Sun, 1 Aug 2021 12:41:55 +0200 Subject: arm7: make more SND_exChannel functions static --- arm7/lib/include/SND_exChannel.h | 7 ------- arm7/lib/src/SND_exChannel.c | 16 +++++++++++----- 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/arm7/lib/include/SND_exChannel.h b/arm7/lib/include/SND_exChannel.h index 99f8de21..2d9a5a8c 100644 --- a/arm7/lib/include/SND_exChannel.h +++ b/arm7/lib/include/SND_exChannel.h @@ -23,13 +23,6 @@ struct SNDExChannel *SND_AllocExChannel(u32 channelMask, int priority, u32 flags void SND_FreeExChannel(struct SNDExChannel *chn); void SND_InvalidateWave(const void *start, const void *end); -// TODO internal functions, move these so exChannel -int ExChannelSweepUpdate(struct SNDExChannel *chn, BOOL step); -int ExChannelLfoUpdate(struct SNDExChannel *chn, BOOL step); -void ExChannelStart(struct SNDExChannel *chn, int length); -int ExChannelVolumeCmp(struct SNDExChannel *chn_a, struct SNDExChannel *chn_b); -void ExChannelSetup(struct SNDExChannel *, SNDExChannelCallback callback, void *callbackUserData, int priority); - void SND_StopUnlockedChannel(u32 channelMask, u32 weak); void SND_LockChannel(u32 channelMask, u32 weak); void SND_UnlockChannel(u32 channelMask, u32 weak); diff --git a/arm7/lib/src/SND_exChannel.c b/arm7/lib/src/SND_exChannel.c index 01bd4f3e..bf5012e2 100644 --- a/arm7/lib/src/SND_exChannel.c +++ b/arm7/lib/src/SND_exChannel.c @@ -19,6 +19,12 @@ extern u8 sSampleDataShiftTable[4]; static u16 CalcDecayCoeff(int vol); +static int ExChannelSweepUpdate(struct SNDExChannel *chn, BOOL step); +static int ExChannelLfoUpdate(struct SNDExChannel *chn, BOOL step); +static void ExChannelStart(struct SNDExChannel *chn, int length); +static int ExChannelVolumeCmp(struct SNDExChannel *chn_a, struct SNDExChannel *chn_b); +static void ExChannelSetup(struct SNDExChannel *, SNDExChannelCallback callback, void *callbackUserData, int priority); + void SND_ExChannelInit(void) { struct SNDExChannel *chn; s32 i; @@ -485,7 +491,7 @@ static u16 CalcDecayCoeff(int vol) { return (u16)(0x1E00 / (126 - vol)); } -void ExChannelSetup(struct SNDExChannel *chn, SNDExChannelCallback callback, void *callbackUserData, int priority) { +static void ExChannelSetup(struct SNDExChannel *chn, SNDExChannelCallback callback, void *callbackUserData, int priority) { chn->channelLLNext = NULL; chn->callback = callback; chn->callbackUserData = callbackUserData; @@ -514,7 +520,7 @@ void ExChannelSetup(struct SNDExChannel *chn, SNDExChannelCallback callback, voi SND_InitLfoParam(&chn->lfo.param); } -void ExChannelStart(struct SNDExChannel *chn, int length) { +static void ExChannelStart(struct SNDExChannel *chn, int length) { chn->envAttenuation = -92544; chn->envStatus = 0; chn->length = length; @@ -523,7 +529,7 @@ void ExChannelStart(struct SNDExChannel *chn, int length) { chn->flags.active = TRUE; } -int ExChannelVolumeCmp(struct SNDExChannel *chn_a, struct SNDExChannel *chn_b) { +static int ExChannelVolumeCmp(struct SNDExChannel *chn_a, struct SNDExChannel *chn_b) { int vol_a = chn_a->volume & 0xFF; int vol_b = chn_b->volume & 0xFF; @@ -542,7 +548,7 @@ int ExChannelVolumeCmp(struct SNDExChannel *chn_a, struct SNDExChannel *chn_b) { return 0; } -int ExChannelSweepUpdate(struct SNDExChannel *chn, BOOL step) { +static int ExChannelSweepUpdate(struct SNDExChannel *chn, BOOL step) { s64 result; if (chn->sweepPitch == 0) { @@ -559,7 +565,7 @@ int ExChannelSweepUpdate(struct SNDExChannel *chn, BOOL step) { return (int)result; } -int ExChannelLfoUpdate(struct SNDExChannel *chn, BOOL step) { +static int ExChannelLfoUpdate(struct SNDExChannel *chn, BOOL step) { s64 result = SND_GetLfoValue(&chn->lfo); if (result != 0) { -- cgit v1.2.3 From 6482eb6e2a1a99c4b65502b5bc1f97a98690519a Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Sun, 1 Aug 2021 12:46:53 +0200 Subject: arm7: snd: remove some old TODOs --- arm7/lib/src/SND_exChannel.c | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/arm7/lib/src/SND_exChannel.c b/arm7/lib/src/SND_exChannel.c index bf5012e2..c2231640 100644 --- a/arm7/lib/src/SND_exChannel.c +++ b/arm7/lib/src/SND_exChannel.c @@ -7,16 +7,14 @@ #include "registers.h" -// TODO import these tables into here if they belong here -extern u8 sChannelAllocationOrder[SND_CHANNEL_COUNT]; -extern u8 sAttackCoeffTable[19]; +// TODO import these tables into here if we have a working .rodata section +extern const u8 sChannelAllocationOrder[SND_CHANNEL_COUNT]; +extern const u8 sAttackCoeffTable[19]; +extern const u8 sSampleDataShiftTable[4]; static u32 sLockedChannelMask; static u32 sWeakLockedChannelMask; -// TODO remove this extern once we actually know where this table is -extern u8 sSampleDataShiftTable[4]; - static u16 CalcDecayCoeff(int vol); static int ExChannelSweepUpdate(struct SNDExChannel *chn, BOOL step); -- cgit v1.2.3 From d72270d4bd4c3160f98812de51cfb76fb6b47295 Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Tue, 3 Aug 2021 18:44:55 +0200 Subject: arm7: run clang-format on SND_* --- arm7/lib/include/SND_alarm.h | 2 +- arm7/lib/include/SND_bank.h | 14 +- arm7/lib/include/SND_capture.h | 5 +- arm7/lib/include/SND_channel.h | 25 +- arm7/lib/include/SND_command.h | 2 +- arm7/lib/include/SND_exChannel.h | 11 +- arm7/lib/include/SND_global.h | 5 +- arm7/lib/include/SND_lfo.h | 2 +- arm7/lib/include/SND_main.h | 2 +- arm7/lib/include/SND_seq.h | 2 +- arm7/lib/include/SND_util.h | 2 +- arm7/lib/include/SND_work.h | 2 +- arm7/lib/src/SND_alarm.c | 41 +- arm7/lib/src/SND_bank.c | 195 ++++--- arm7/lib/src/SND_capture.c | 16 +- arm7/lib/src/SND_channel.c | 107 ++-- arm7/lib/src/SND_command.c | 366 ++++++------ arm7/lib/src/SND_exChannel.c | 434 ++++++++------ arm7/lib/src/SND_global.c | 30 +- arm7/lib/src/SND_main.c | 65 ++- arm7/lib/src/SND_seq.c | 1046 +++++++++++++++++++--------------- arm7/lib/src/SND_util.c | 48 +- arm7/lib/src/SND_work.c | 16 +- include/nitro/SND_alarm_shared.h | 21 +- include/nitro/SND_bank_shared.h | 135 +++-- include/nitro/SND_command_shared.h | 87 +-- include/nitro/SND_exChannel_shared.h | 100 ++-- include/nitro/SND_main_shared.h | 30 +- include/nitro/SND_seq_shared.h | 110 ++-- include/nitro/SND_work_shared.h | 123 ++-- 30 files changed, 1751 insertions(+), 1293 deletions(-) diff --git a/arm7/lib/include/SND_alarm.h b/arm7/lib/include/SND_alarm.h index 1eca6fe8..51f01bcc 100644 --- a/arm7/lib/include/SND_alarm.h +++ b/arm7/lib/include/SND_alarm.h @@ -9,4 +9,4 @@ 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 +#endif // GUARD_SND_ALARM_H diff --git a/arm7/lib/include/SND_bank.h b/arm7/lib/include/SND_bank.h index 36bdc08f..e22410ca 100644 --- a/arm7/lib/include/SND_bank.h +++ b/arm7/lib/include/SND_bank.h @@ -1,11 +1,17 @@ #ifndef GUARD_SND_BANK_H #define GUARD_SND_BANK_H -#include "nitro/SND_bank_shared.h" #include "nitro/types.h" +#include "nitro/SND_bank_shared.h" -BOOL SND_ReadInstData(const struct SNDBankData *bankData, s32 program, s32 midiKey, struct SNDInstData *instData); +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); +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 +#endif // GUARD_SND_BANK_H diff --git a/arm7/lib/include/SND_capture.h b/arm7/lib/include/SND_capture.h index 1878f90e..f71ce18d 100644 --- a/arm7/lib/include/SND_capture.h +++ b/arm7/lib/include/SND_capture.h @@ -3,7 +3,8 @@ #include "nitro/types.h" -void SND_SetupCapture(int idx, int format, void *captureData, int size, BOOL loop, int capCtrlSrc, int capCtrlDst); +void SND_SetupCapture( + int idx, int format, void *captureData, int size, BOOL loop, int capCtrlSrc, int capCtrlDst); BOOL SND_IsCaptureActive(int idx); -#endif //GUARD_SND_CAPTURE_H +#endif // GUARD_SND_CAPTURE_H diff --git a/arm7/lib/include/SND_channel.h b/arm7/lib/include/SND_channel.h index 0c3cbe7b..b401029a 100644 --- a/arm7/lib/include/SND_channel.h +++ b/arm7/lib/include/SND_channel.h @@ -3,8 +3,7 @@ #include "nitro/types.h" -void SND_SetupChannelPcm( - int chnIdx, +void SND_SetupChannelPcm(int chnIdx, const void *data, int format, int loop, @@ -13,25 +12,11 @@ void SND_SetupChannelPcm( int volume, int volumeDiv, int timer, - int pan -); + int pan); -void SND_SetupChannelPsg( - int chnIdx, - int waveDuty, - int volume, - int volumeDiv, - int timer, - int pan -); +void SND_SetupChannelPsg(int chnIdx, int waveDuty, int volume, int volumeDiv, int timer, int pan); -void SND_SetupChannelNoise( - int chnIdx, - int volume, - int volumeDiv, - int timer, - int pan -); +void SND_SetupChannelNoise(int chnIdx, int volume, int volumeDiv, int timer, int pan); void SND_StopChannel(int chnIdx, int hold); @@ -44,4 +29,4 @@ void SND_SetMasterPan(int pan); u32 SND_GetChannelControl(int idx); void SNDi_SetSurroundDecay(int decay); -#endif //GUARD_SND_CHANNEL_H +#endif // GUARD_SND_CHANNEL_H diff --git a/arm7/lib/include/SND_command.h b/arm7/lib/include/SND_command.h index c22cd459..db42d177 100644 --- a/arm7/lib/include/SND_command.h +++ b/arm7/lib/include/SND_command.h @@ -6,4 +6,4 @@ void SND_CommandInit(void); void SND_CommandProc(void); -#endif //GUARD_SND_COMMAND_H +#endif // GUARD_SND_COMMAND_H diff --git a/arm7/lib/include/SND_exChannel.h b/arm7/lib/include/SND_exChannel.h index 2d9a5a8c..6e89cb72 100644 --- a/arm7/lib/include/SND_exChannel.h +++ b/arm7/lib/include/SND_exChannel.h @@ -9,7 +9,8 @@ void SND_ExChannelInit(void); void SND_UpdateExChannel(void); void SND_ExChannelMain(BOOL step); -BOOL SND_StartExChannelPcm(struct SNDExChannel *chn, const struct SNDWaveParam *wave, const void *data, s32 length); +BOOL SND_StartExChannelPcm( + struct SNDExChannel *chn, const struct SNDWaveParam *wave, const void *data, s32 length); BOOL SND_StartExChannelPsg(struct SNDExChannel *chn, s32 duty, s32 length); BOOL SND_StartExChannelNoise(struct SNDExChannel *chn, s32 length); s32 SND_UpdateExChannelEnvelope(struct SNDExChannel *chn, BOOL step); @@ -19,7 +20,11 @@ void SND_SetExChannelSustain(struct SNDExChannel *chn, s32 sustain); void SND_SetExChannelRelease(struct SNDExChannel *chn, s32 release); void SND_ReleaseExChannel(struct SNDExChannel *chn); BOOL SND_IsExChannelActive(struct SNDExChannel *chn); -struct SNDExChannel *SND_AllocExChannel(u32 channelMask, int priority, u32 flags, SNDExChannelCallback callback, void *callbackUserData); +struct SNDExChannel *SND_AllocExChannel(u32 channelMask, + int priority, + u32 flags, + SNDExChannelCallback callback, + void *callbackUserData); void SND_FreeExChannel(struct SNDExChannel *chn); void SND_InvalidateWave(const void *start, const void *end); @@ -35,4 +40,4 @@ void SND_StartLfo(struct SNDLfo *lfo); void SND_UpdateLfo(struct SNDLfo *lfo); int SND_GetLfoValue(struct SNDLfo *lfo); -#endif //GUARD_SND_EXCHANNEL_H +#endif // GUARD_SND_EXCHANNEL_H diff --git a/arm7/lib/include/SND_global.h b/arm7/lib/include/SND_global.h index 47bb7a69..cb91db66 100644 --- a/arm7/lib/include/SND_global.h +++ b/arm7/lib/include/SND_global.h @@ -9,6 +9,7 @@ void SND_Shutdown(void); void SND_BeginSleep(void); void SND_EndSleep(void); void SND_SetMasterVolume(int vol); -void SND_SetOutputSelector(int leftOutputFrom, int rightOutputFrom, int outputCh1ToMixer, int outputCh3ToMixer); +void SND_SetOutputSelector( + int leftOutputFrom, int rightOutputFrom, int outputCh1ToMixer, int outputCh3ToMixer); -#endif //GUARD_SND_GLOBAL_H +#endif // GUARD_SND_GLOBAL_H diff --git a/arm7/lib/include/SND_lfo.h b/arm7/lib/include/SND_lfo.h index f3737f08..71e0febf 100644 --- a/arm7/lib/include/SND_lfo.h +++ b/arm7/lib/include/SND_lfo.h @@ -5,4 +5,4 @@ #include "nitro/SND_exChannel_shared.h" -#endif //GUARD_SND_LFO_H +#endif // GUARD_SND_LFO_H diff --git a/arm7/lib/include/SND_main.h b/arm7/lib/include/SND_main.h index eba3ff44..65e3f8d3 100644 --- a/arm7/lib/include/SND_main.h +++ b/arm7/lib/include/SND_main.h @@ -13,4 +13,4 @@ void SND_SendWakeupMessage(void); void SNDi_LockMutex(void); void SNDi_UnlockMutex(void); -#endif //GUARD_SND_MAIN_H +#endif // GUARD_SND_MAIN_H diff --git a/arm7/lib/include/SND_seq.h b/arm7/lib/include/SND_seq.h index 25b63a35..4e54c0ff 100644 --- a/arm7/lib/include/SND_seq.h +++ b/arm7/lib/include/SND_seq.h @@ -21,4 +21,4 @@ void SND_SetTrackAllocatableChannel(int player, u32 trackMask, u32 channelMask); void SND_InvalidateSeq(const void *start, const void *end); void SND_InvalidateBank(const void *start, const void *end); -#endif //GUARD_SND_SEQ_H +#endif // GUARD_SND_SEQ_H diff --git a/arm7/lib/include/SND_util.h b/arm7/lib/include/SND_util.h index 80534b94..3b20a79f 100644 --- a/arm7/lib/include/SND_util.h +++ b/arm7/lib/include/SND_util.h @@ -13,4 +13,4 @@ u16 SND_CalcTimer(int timer, int pitch); extern const s16 SNDi_DecibelSquareTable[128]; -#endif //GUARD_SND_UTIL_H +#endif // GUARD_SND_UTIL_H diff --git a/arm7/lib/include/SND_work.h b/arm7/lib/include/SND_work.h index 0125a52d..536d4bd0 100644 --- a/arm7/lib/include/SND_work.h +++ b/arm7/lib/include/SND_work.h @@ -10,4 +10,4 @@ void SND_SetPlayerLocalVariable(int player, int var, s16 value); void SND_SetPlayerGlobalVariable(int var, s16 value); void SND_UpdateSharedWork(void); -#endif //GUARD_SND_WORK_H +#endif // GUARD_SND_WORK_H diff --git a/arm7/lib/src/SND_alarm.c b/arm7/lib/src/SND_alarm.c index 8eef3e19..9b71d8f3 100644 --- a/arm7/lib/src/SND_alarm.c +++ b/arm7/lib/src/SND_alarm.c @@ -1,23 +1,27 @@ #include "SND_alarm.h" -#include "SND_work.h" #include "OS_alarm.h" #include "OS_tick.h" #include "PXI_fifo.h" +#include "SND_work.h" static void AlarmHandler(void *msg); -void SND_AlarmInit(void) { - for (s32 i = 0; i < SND_ALARM_COUNT; i++) { +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) { +void SND_SetupAlarm(s32 idx, OSTick tick, OSTick period, u32 id) +{ struct SNDAlarm *alarm = &SNDi_Work.alarms[idx]; - if (alarm->enable) { + if (alarm->enable) + { OS_CancelAlarm(&alarm->alarm); alarm->enable = 0; } @@ -27,13 +31,15 @@ void SND_SetupAlarm(s32 idx, OSTick tick, OSTick period, u32 id) { alarm->id = (u8)id; } -void SND_StartAlarm(s32 idx) { +void SND_StartAlarm(s32 idx) +{ OSTick tick; OSTick period; - + struct SNDAlarm *alarm = &SNDi_Work.alarms[idx]; - if (alarm->enable != 0) { + if (alarm->enable != 0) + { OS_CancelAlarm(&alarm->alarm); alarm->enable = 0; } @@ -44,27 +50,34 @@ void SND_StartAlarm(s32 idx) { OS_CreateAlarm(&alarm->alarm); - if (period == 0) { + if (period == 0) + { OS_SetAlarm(&alarm->alarm, tick, AlarmHandler, (void *)arg); - } else { + } + else + { OS_SetPeriodicAlarm(&alarm->alarm, tick + OS_GetTick(), period, AlarmHandler, (void *)arg); } alarm->enable = 1; } -void SND_StopAlarm(s32 idx) { +void SND_StopAlarm(s32 idx) +{ struct SNDAlarm *alarm = &SNDi_Work.alarms[idx]; - if (alarm->enable != 0) { + 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) { +static void AlarmHandler(void *msg) +{ + while (PXI_SendWordByFifo(7, (u32)msg, 0) < 0) + { // nothing } } diff --git a/arm7/lib/src/SND_bank.c b/arm7/lib/src/SND_bank.c index 5c9fb3dd..3437e021 100644 --- a/arm7/lib/src/SND_bank.c +++ b/arm7/lib/src/SND_bank.c @@ -1,13 +1,16 @@ #include "SND_bank.h" -#include "SND_main.h" #include "SND_exChannel.h" +#include "SND_main.h" #include "mmap.h" -static const struct SNDWaveData *GetWaveData(const struct SNDBankData *bankData, s32 waveArc, s32 wave); +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) { +BOOL SND_ReadInstData( + const struct SNDBankData *bankData, s32 program, s32 midiKey, struct SNDInstData *instData) +{ s32 i; struct SNDDrumSet *drumSet; struct SNDKeySplit *keySplit; @@ -16,10 +19,11 @@ BOOL SND_ReadInstData(const struct SNDBankData *bankData, s32 program, s32 midiK if (program < 0) return FALSE; - + SNDi_LockMutex(); - if (program >= bankData->instCount) { + if (program >= bankData->instCount) + { SNDi_UnlockMutex(); return FALSE; } @@ -27,60 +31,69 @@ BOOL SND_ReadInstData(const struct SNDBankData *bankData, s32 program, s32 midiK 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) { + 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 = keySplit->instruments[i]; - break; - case SND_INST_ILLEGAL: - default: - 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) { +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) { + if (retval != NULL) + { + if ((u32)retval < HW_MAIN_MEM) + { retval = (const struct SNDWaveData *)((u32)waveArc + (u32)retval); } - } else { + } + else + { retval = NULL; } @@ -89,47 +102,66 @@ const struct SNDWaveData *SND_GetWaveDataAddress(const struct SNDWaveArc *waveAr return retval; } -BOOL SND_NoteOn(struct SNDExChannel *chn, s32 midiKey, s32 velocity, s32 length, const struct SNDBankData *bankData, const struct SNDInstData *instData) { +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) { + 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]); - } + 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) { + 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; - } 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; + break; } - - if (success == FALSE) { + + if (success == FALSE) + { return FALSE; - } else { + } + else + { chn->midiKey = (u8)midiKey; chn->rootMidiKey = instData->param.rootKey; chn->velocity = (u8)velocity; @@ -142,14 +174,21 @@ BOOL SND_NoteOn(struct SNDExChannel *chn, s32 midiKey, s32 velocity, s32 length, } } -static const struct SNDWaveData *GetWaveData(const struct SNDBankData *bankData, s32 waveArc, s32 wave) { +static const struct SNDWaveData *GetWaveData( + const struct SNDBankData *bankData, s32 waveArc, s32 wave) +{ const struct SNDWaveArc *arcPtr = bankData->waveArcLinks[waveArc].waveArc; - if (arcPtr == NULL) { + if (arcPtr == NULL) + { return NULL; - } else if (wave < arcPtr->waveCount) { + } + else if (wave < arcPtr->waveCount) + { return SND_GetWaveDataAddress(arcPtr, wave); - } else { + } + else + { return NULL; } } diff --git a/arm7/lib/src/SND_capture.c b/arm7/lib/src/SND_capture.c index 8b604d10..57494b72 100644 --- a/arm7/lib/src/SND_capture.c +++ b/arm7/lib/src/SND_capture.c @@ -2,18 +2,24 @@ #include "registers.h" -enum SNDLoop { - SND_CAP_LOOP = 0, SND_CAP_ONESHOT = 1 +enum SNDLoop +{ + SND_CAP_LOOP = 0, + SND_CAP_ONESHOT = 1 }; -void SND_SetupCapture(int idx, int format, void *captureData, int size, BOOL loop, int capCtrlSrc, int capCtrlDst) { +void SND_SetupCapture( + int idx, int format, void *captureData, int size, BOOL loop, int capCtrlSrc, int capCtrlDst) +{ int off = idx * 8; - reg_SNDCAPxCNT(idx) = (u8)((format << 3) | ((loop ? SND_CAP_LOOP : SND_CAP_ONESHOT) << 2) | (capCtrlSrc << 1) | capCtrlDst); + reg_SNDCAPxCNT(idx) = (u8)((format << 3) | ((loop ? SND_CAP_LOOP : SND_CAP_ONESHOT) << 2) | + (capCtrlSrc << 1) | capCtrlDst); *(vu32 *)(0x4000510 + off) = (u32)captureData; *(vu16 *)(0x4000514 + off) = (u16)size; } -BOOL SND_IsCaptureActive(int idx) { +BOOL SND_IsCaptureActive(int idx) +{ return (reg_SNDCAPxCNT(idx) & 0x80) != 0; } diff --git a/arm7/lib/src/SND_channel.c b/arm7/lib/src/SND_channel.c index 99b80a7c..be0bba3a 100644 --- a/arm7/lib/src/SND_channel.c +++ b/arm7/lib/src/SND_channel.c @@ -1,7 +1,7 @@ #include "SND_channel.h" -#include "registers.h" #include "SND_work.h" +#include "registers.h" static int sMasterPan = -1; @@ -11,50 +11,67 @@ static int sSurroundDecay; static int CalcSurroundDecay(int vol, int pan); -void SND_SetupChannelPcm(int chnIdx, const void *data, int format, int loop, int loopStart, int loopLength, int volume, int volumeDiv, int timer, int pan) { +void SND_SetupChannelPcm(int chnIdx, + const void *data, + int format, + int loop, + int loopStart, + int loopLength, + int volume, + int volumeDiv, + int timer, + int pan) +{ int off = chnIdx * 0x10; sOrgPan[chnIdx] = (u8)pan; if (sMasterPan >= 0) pan = sMasterPan; - + sOrgVolume[chnIdx] = (u8)volume; - if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) { + if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) + { volume = CalcSurroundDecay(volume, pan); } - reg_SOUNDoffCNT(off) = (u32)((format << 29) | (loop << 27) | (pan << 16) | (volumeDiv << 8) | (volume)); + reg_SOUNDoffCNT(off) = + (u32)((format << 29) | (loop << 27) | (pan << 16) | (volumeDiv << 8) | (volume)); reg_SOUNDoffTMR(off) = (u16)(0x10000 - timer); reg_SOUNDoffPNT(off) = (u16)loopStart; reg_SOUNDoffLEN(off) = (u32)loopLength; reg_SOUNDoffSAD(off) = (u32)data; } -void SND_SetupChannelPsg(int chnIdx, int duty, int volume, int volumeDiv, int timer, int pan) { +void SND_SetupChannelPsg(int chnIdx, int duty, int volume, int volumeDiv, int timer, int pan) +{ int off = chnIdx * 0x10; sOrgPan[chnIdx] = (u8)pan; if (sMasterPan >= 0) pan = sMasterPan; - + sOrgVolume[chnIdx] = (u8)volume; - if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) { + if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) + { volume = CalcSurroundDecay(volume, pan); } - reg_SOUNDoffCNT(off) = (u32)(0x60000000 | (duty << 24) | (pan << 16) | (volumeDiv << 8) | volume); + reg_SOUNDoffCNT(off) = + (u32)(0x60000000 | (duty << 24) | (pan << 16) | (volumeDiv << 8) | volume); reg_SOUNDoffTMR(off) = (u16)(0x10000 - timer); } -void SND_SetupChannelNoise(int chnIdx, int volume, int volumeDiv, int timer, int pan) { +void SND_SetupChannelNoise(int chnIdx, int volume, int volumeDiv, int timer, int pan) +{ int off = chnIdx * 0x10; sOrgPan[chnIdx] = (u8)pan; if (sMasterPan >= 0) pan = sMasterPan; - + sOrgVolume[chnIdx] = (u8)volume; - if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) { + if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) + { volume = CalcSurroundDecay(volume, pan); } @@ -62,7 +79,8 @@ void SND_SetupChannelNoise(int chnIdx, int volume, int volumeDiv, int timer, int reg_SOUNDoffTMR(off) = (u16)(0x10000 - timer); } -void SND_StopChannel(int idx, int hold) { +void SND_StopChannel(int idx, int hold) +{ vu32 *reg = ®_SOUNDxCNT(idx); u32 v = *reg; @@ -77,10 +95,12 @@ void SND_StopChannel(int idx, int hold) { *reg = v; } -void SND_SetChannelVolume(int chnIdx, int vol, int volDiv) { +void SND_SetChannelVolume(int chnIdx, int vol, int volDiv) +{ sOrgVolume[chnIdx] = (u8)vol; - if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) { + if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) + { int pan = reg_SOUNDxCNT_PAN(chnIdx); vol = CalcSurroundDecay(vol, pan); } @@ -88,64 +108,85 @@ void SND_SetChannelVolume(int chnIdx, int vol, int volDiv) { reg_SOUNDxCNT_VOLS(chnIdx) = (u16)((volDiv << 8) | vol); } -void SND_SetChannelTimer(int chnIdx, int timer) { +void SND_SetChannelTimer(int chnIdx, int timer) +{ reg_SOUNDxTMR(chnIdx) = (u16)(0x10000 - timer); } -void SND_SetChannelPan(int chnIdx, int pan) { +void SND_SetChannelPan(int chnIdx, int pan) +{ sOrgPan[chnIdx] = (u8)pan; - if (sMasterPan >= 0) { + if (sMasterPan >= 0) + { pan = sMasterPan; } reg_SOUNDxCNT_PAN(chnIdx) = (u8)pan; - if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) { + if (sSurroundDecay > 0 && (1 << chnIdx) & 0xFFF5) + { reg_SOUNDxCNT_VOL(chnIdx) = (u8)CalcSurroundDecay(sOrgVolume[chnIdx], pan); } } -BOOL SND_IsChannelActive(int chnIdx) { +BOOL SND_IsChannelActive(int chnIdx) +{ return (reg_SOUNDxCNT_STAT(chnIdx) & 0x80) != 0; } -void SND_SetMasterPan(int pan) { +void SND_SetMasterPan(int pan) +{ sMasterPan = pan; - if (pan >= 0) { - for (int i = 0; i < SND_CHANNEL_COUNT; i++) { + if (pan >= 0) + { + for (int i = 0; i < SND_CHANNEL_COUNT; i++) + { reg_SOUNDxCNT_PAN(i) = (u8)pan; } - } else { - for (int i = 0; i < SND_CHANNEL_COUNT; i++) { + } + else + { + for (int i = 0; i < SND_CHANNEL_COUNT; i++) + { reg_SOUNDxCNT_PAN(i) = sOrgPan[i]; } } } -u32 SND_GetChannelControl(int chnIdx) { +u32 SND_GetChannelControl(int chnIdx) +{ return reg_SOUNDxCNT(chnIdx); } -void SNDi_SetSurroundDecay(int decay) { +void SNDi_SetSurroundDecay(int decay) +{ sSurroundDecay = decay; - for (int i = 0; i < SND_CHANNEL_COUNT; i++) { + for (int i = 0; i < SND_CHANNEL_COUNT; i++) + { // do not process channel 1+3 (capture playback channels) - if ((1 << i) & 0xFFF5) { + if ((1 << i) & 0xFFF5) + { int pan = reg_SOUNDxCNT_PAN(i); reg_SOUNDxCNT_VOL(i) = (u8)CalcSurroundDecay(sOrgVolume[i], pan); } } } -static int CalcSurroundDecay(int vol, int pan) { - if (pan < 24) { +static int CalcSurroundDecay(int vol, int pan) +{ + if (pan < 24) + { return vol * (sSurroundDecay * (pan + 40) + ((0x7FFF - sSurroundDecay) << 6)) >> 21; - } else if (pan <= 104) { + } + else if (pan <= 104) + { return vol; - } else { + } + else + { return vol * (-sSurroundDecay * (pan - 40) + ((sSurroundDecay + 0x7FFF) << 6)) >> 21; } } diff --git a/arm7/lib/src/SND_command.c b/arm7/lib/src/SND_command.c index bcb43d73..f561138a 100644 --- a/arm7/lib/src/SND_command.c +++ b/arm7/lib/src/SND_command.c @@ -1,15 +1,15 @@ #include "SND_command.h" -#include "registers.h" #include "mmap.h" +#include "registers.h" #include "MI_memory.h" -#include "PXI_fifo.h" #include "OS_message.h" #include "OS_system.h" -#include "SND_channel.h" +#include "PXI_fifo.h" #include "SND_alarm.h" #include "SND_capture.h" +#include "SND_channel.h" #include "SND_exChannel.h" #include "SND_global.h" #include "SND_main.h" @@ -29,164 +29,167 @@ static void SetChannelVolume(u32 channelMask, int vol, int shift); static void SetChannelPan(u32 channelMask, int pan); static void ReadDriverInfo(struct SNDDriverInfo *driverInfo); -void SND_CommandInit(void) { +void SND_CommandInit(void) +{ OS_InitMessageQueue(&sMsgQueue, sMsgArray, SND_MSG_ARRAY_SIZE); InitPXI(); SNDi_SharedWork = NULL; } -void SND_CommandProc(void) { +void SND_CommandProc(void) +{ struct SNDCommand cmd; struct SNDCommand *cmd_ptr; OSMessage msg; - while (OS_ReceiveMessage(&sMsgQueue, &msg, 0)) { + while (OS_ReceiveMessage(&sMsgQueue, &msg, 0)) + { // casting it directly below doesn't appear to match cmd_ptr = (struct SNDCommand *)msg; - while (cmd_ptr) { + while (cmd_ptr) + { cmd = *cmd_ptr; - switch (cmd.id) { - case SND_CMD_START_SEQ: - SND_StartSeq((int)cmd.arg[0], (const void *)cmd.arg[1], cmd.arg[2], (struct SNDBankData *)cmd.arg[3]); - break; - case SND_CMD_STOP_SEQ: - SND_StopSeq((int)cmd.arg[0]); - break; - case SND_CMD_PREPARE_SEQ: - SND_PrepareSeq((int)cmd.arg[0], (const void *)cmd.arg[1], cmd.arg[2], (struct SNDBankData *)cmd.arg[3]); - break; - case SND_CMD_START_PREPARED_SEQ: - SND_StartPreparedSeq((int)cmd.arg[0]); - break; - case SND_CMD_PAUSE_SEQ: - SND_PauseSeq((int)cmd.arg[0], (BOOL)cmd.arg[1]); - break; - case SND_CMD_SKIP_SEQ: - SND_SkipSeq((int)cmd.arg[0], cmd.arg[1]); - break; - case SND_CMD_PLAYER_PARAM: - SNDi_SetPlayerParam((int)cmd.arg[0], cmd.arg[1], cmd.arg[2], (int)cmd.arg[3]); - break; - case SND_CMD_TRACK_PARAM: - SNDi_SetTrackParam((int)cmd.arg[0] & 0xFFFFFF, cmd.arg[1], cmd.arg[2], cmd.arg[3], (u8)(cmd.arg[0] >> 24)); - break; - case SND_CMD_MUTE_TRACK: - SND_SetTrackMute((int)cmd.arg[0], cmd.arg[1], (BOOL)cmd.arg[2]); - break; - case SND_CMD_ALLOCATABLE_CHANNEL: - SND_SetTrackAllocatableChannel((int)cmd.arg[0], cmd.arg[1], cmd.arg[2]); - break; - case SND_CMD_PLAYER_LOCAL_VAR: - SND_SetPlayerLocalVariable((int)cmd.arg[0], (int)cmd.arg[1], (s16)cmd.arg[2]); - break; - case SND_CMD_PLAYER_GLOBAL_VAR: - SND_SetPlayerGlobalVariable((int)cmd.arg[0], (s16)cmd.arg[1]); - break; - case SND_CMD_START_TIMER: - StartTimer(cmd.arg[0], cmd.arg[1], cmd.arg[2], (int)cmd.arg[3]); - break; - case SND_CMD_STOP_TIMER: - StopTimer(cmd.arg[0], cmd.arg[1], cmd.arg[2], (int)cmd.arg[3]); - break; - case SND_CMD_SETUP_CAPTURE: - SND_SetupCapture( - (int)(cmd.arg[2] >> 31u) & 1, - (int)(cmd.arg[2] >> 30u) & 1, - (void *)cmd.arg[0], - (int)cmd.arg[1], - (BOOL)(cmd.arg[2] >> 29u) & 1, - (int)(cmd.arg[2] >> 28u) & 1, - (int)(cmd.arg[2] >> 27u) & 1 - ); - break; - case SND_CMD_SETUP_ALARM: - SND_SetupAlarm( - (int)cmd.arg[0], - cmd.arg[1], - cmd.arg[2], - cmd.arg[3] - ); - break; - case SND_CMD_CHANNEL_TIMER: - SetChannelTimer(cmd.arg[0], (int)cmd.arg[1]); - break; - case SND_CMD_CHANNEL_VOLUME: - SetChannelVolume(cmd.arg[0], (int)cmd.arg[1], (int)cmd.arg[2]); - break; - case SND_CMD_CHANNEL_PAN: - SetChannelPan(cmd.arg[0], (int)cmd.arg[1]); - break; - case SND_CMD_SETUP_CHANNEL_PCM: - SND_SetupChannelPcm( - (int)cmd.arg[0] & 0xFFFF, - (void *)(cmd.arg[1] & 0x7FFFFFFu), - (int)(cmd.arg[3] >> 24u) & 0x3, - (int)(cmd.arg[3] >> 26u) & 0x3, - (int)cmd.arg[3] & 0xFFFF, - (int)cmd.arg[2] & 0x3FFFFF, - (int)(cmd.arg[2] >> 24u) & 0x7F, - (int)(cmd.arg[2] >> 22u) & 0x3, - (int)(cmd.arg[0] >> 16u) & 0xFFFF, - (int)(cmd.arg[3] >> 16u) & 0x7F - ); - break; - case SND_CMD_SETUP_CHANNEL_PSG: - SND_SetupChannelPsg( - (int)cmd.arg[0], - (int)cmd.arg[3], - (int)cmd.arg[1] & 0x7F, - (int)(cmd.arg[1] >> 8u) & 0x3, - (int)(cmd.arg[2] >> 8u) & 0xFFFF, - (int)cmd.arg[2] & 0x7F - ); - break; - case SND_CMD_SETUP_CHANNEL_NOISE: - SND_SetupChannelNoise( - (int)cmd.arg[0], - (int)cmd.arg[1] & 0x7F, - (int)(cmd.arg[1] >> 8u) & 0x3, - (int)(cmd.arg[2] >> 8u) & 0xFFFF, - (int)cmd.arg[2] & 0x7F - ); - break; - case SND_CMD_SURROUND_DECAY: - SNDi_SetSurroundDecay((int)cmd.arg[0]); - break; - case SND_CMD_MASTER_VOLUME: - SND_SetMasterVolume((int)cmd.arg[0]); - break; - case SND_CMD_MASTER_PAN: - SND_SetMasterPan((int)cmd.arg[0]); - break; - case SND_CMD_OUTPUT_SELECTOR: - SND_SetOutputSelector((int)cmd.arg[0], (int)cmd.arg[1], (int)cmd.arg[2], (int)cmd.arg[3]); - break; - case SND_CMD_LOCK_CHANNEL: - SND_LockChannel(cmd.arg[0], cmd.arg[1]); - break; - case SND_CMD_UNLOCK_CHANNEL: - SND_UnlockChannel(cmd.arg[0], cmd.arg[1]); - break; - case SND_CMD_STOP_UNLOCKED_CHANNEL: - SND_StopUnlockedChannel(cmd.arg[0], cmd.arg[1]); - break; - case SND_CMD_INVALIDATE_SEQ: - SND_InvalidateSeq((void *)cmd.arg[0], (void *)cmd.arg[1]); - break; - case SND_CMD_INVALIDATE_BANK: - SND_InvalidateBank((void *)cmd.arg[0], (void *)cmd.arg[1]); - break; - case SND_CMD_INVALIDATE_WAVE: - SND_InvalidateWave((void *)cmd.arg[0], (void *)cmd.arg[1]); - break; - case SND_CMD_SET_SHARED_WORK: - SNDi_SharedWork = (struct SNDSharedWork *)cmd.arg[0]; - break; - case SND_CMD_READ_DRIVER_INFO: - ReadDriverInfo((struct SNDDriverInfo *)cmd.arg[0]); - break; + switch (cmd.id) + { + case SND_CMD_START_SEQ: + SND_StartSeq((int)cmd.arg[0], + (const void *)cmd.arg[1], + cmd.arg[2], + (struct SNDBankData *)cmd.arg[3]); + break; + case SND_CMD_STOP_SEQ: + SND_StopSeq((int)cmd.arg[0]); + break; + case SND_CMD_PREPARE_SEQ: + SND_PrepareSeq((int)cmd.arg[0], + (const void *)cmd.arg[1], + cmd.arg[2], + (struct SNDBankData *)cmd.arg[3]); + break; + case SND_CMD_START_PREPARED_SEQ: + SND_StartPreparedSeq((int)cmd.arg[0]); + break; + case SND_CMD_PAUSE_SEQ: + SND_PauseSeq((int)cmd.arg[0], (BOOL)cmd.arg[1]); + break; + case SND_CMD_SKIP_SEQ: + SND_SkipSeq((int)cmd.arg[0], cmd.arg[1]); + break; + case SND_CMD_PLAYER_PARAM: + SNDi_SetPlayerParam((int)cmd.arg[0], cmd.arg[1], cmd.arg[2], (int)cmd.arg[3]); + break; + case SND_CMD_TRACK_PARAM: + SNDi_SetTrackParam((int)cmd.arg[0] & 0xFFFFFF, + cmd.arg[1], + cmd.arg[2], + cmd.arg[3], + (u8)(cmd.arg[0] >> 24)); + break; + case SND_CMD_MUTE_TRACK: + SND_SetTrackMute((int)cmd.arg[0], cmd.arg[1], (BOOL)cmd.arg[2]); + break; + case SND_CMD_ALLOCATABLE_CHANNEL: + SND_SetTrackAllocatableChannel((int)cmd.arg[0], cmd.arg[1], cmd.arg[2]); + break; + case SND_CMD_PLAYER_LOCAL_VAR: + SND_SetPlayerLocalVariable((int)cmd.arg[0], (int)cmd.arg[1], (s16)cmd.arg[2]); + break; + case SND_CMD_PLAYER_GLOBAL_VAR: + SND_SetPlayerGlobalVariable((int)cmd.arg[0], (s16)cmd.arg[1]); + break; + case SND_CMD_START_TIMER: + StartTimer(cmd.arg[0], cmd.arg[1], cmd.arg[2], (int)cmd.arg[3]); + break; + case SND_CMD_STOP_TIMER: + StopTimer(cmd.arg[0], cmd.arg[1], cmd.arg[2], (int)cmd.arg[3]); + break; + case SND_CMD_SETUP_CAPTURE: + SND_SetupCapture((int)(cmd.arg[2] >> 31u) & 1, + (int)(cmd.arg[2] >> 30u) & 1, + (void *)cmd.arg[0], + (int)cmd.arg[1], + (BOOL)(cmd.arg[2] >> 29u) & 1, + (int)(cmd.arg[2] >> 28u) & 1, + (int)(cmd.arg[2] >> 27u) & 1); + break; + case SND_CMD_SETUP_ALARM: + SND_SetupAlarm((int)cmd.arg[0], cmd.arg[1], cmd.arg[2], cmd.arg[3]); + break; + case SND_CMD_CHANNEL_TIMER: + SetChannelTimer(cmd.arg[0], (int)cmd.arg[1]); + break; + case SND_CMD_CHANNEL_VOLUME: + SetChannelVolume(cmd.arg[0], (int)cmd.arg[1], (int)cmd.arg[2]); + break; + case SND_CMD_CHANNEL_PAN: + SetChannelPan(cmd.arg[0], (int)cmd.arg[1]); + break; + case SND_CMD_SETUP_CHANNEL_PCM: + SND_SetupChannelPcm((int)cmd.arg[0] & 0xFFFF, + (void *)(cmd.arg[1] & 0x7FFFFFFu), + (int)(cmd.arg[3] >> 24u) & 0x3, + (int)(cmd.arg[3] >> 26u) & 0x3, + (int)cmd.arg[3] & 0xFFFF, + (int)cmd.arg[2] & 0x3FFFFF, + (int)(cmd.arg[2] >> 24u) & 0x7F, + (int)(cmd.arg[2] >> 22u) & 0x3, + (int)(cmd.arg[0] >> 16u) & 0xFFFF, + (int)(cmd.arg[3] >> 16u) & 0x7F); + break; + case SND_CMD_SETUP_CHANNEL_PSG: + SND_SetupChannelPsg((int)cmd.arg[0], + (int)cmd.arg[3], + (int)cmd.arg[1] & 0x7F, + (int)(cmd.arg[1] >> 8u) & 0x3, + (int)(cmd.arg[2] >> 8u) & 0xFFFF, + (int)cmd.arg[2] & 0x7F); + break; + case SND_CMD_SETUP_CHANNEL_NOISE: + SND_SetupChannelNoise((int)cmd.arg[0], + (int)cmd.arg[1] & 0x7F, + (int)(cmd.arg[1] >> 8u) & 0x3, + (int)(cmd.arg[2] >> 8u) & 0xFFFF, + (int)cmd.arg[2] & 0x7F); + break; + case SND_CMD_SURROUND_DECAY: + SNDi_SetSurroundDecay((int)cmd.arg[0]); + break; + case SND_CMD_MASTER_VOLUME: + SND_SetMasterVolume((int)cmd.arg[0]); + break; + case SND_CMD_MASTER_PAN: + SND_SetMasterPan((int)cmd.arg[0]); + break; + case SND_CMD_OUTPUT_SELECTOR: + SND_SetOutputSelector( + (int)cmd.arg[0], (int)cmd.arg[1], (int)cmd.arg[2], (int)cmd.arg[3]); + break; + case SND_CMD_LOCK_CHANNEL: + SND_LockChannel(cmd.arg[0], cmd.arg[1]); + break; + case SND_CMD_UNLOCK_CHANNEL: + SND_UnlockChannel(cmd.arg[0], cmd.arg[1]); + break; + case SND_CMD_STOP_UNLOCKED_CHANNEL: + SND_StopUnlockedChannel(cmd.arg[0], cmd.arg[1]); + break; + case SND_CMD_INVALIDATE_SEQ: + SND_InvalidateSeq((void *)cmd.arg[0], (void *)cmd.arg[1]); + break; + case SND_CMD_INVALIDATE_BANK: + SND_InvalidateBank((void *)cmd.arg[0], (void *)cmd.arg[1]); + break; + case SND_CMD_INVALIDATE_WAVE: + SND_InvalidateWave((void *)cmd.arg[0], (void *)cmd.arg[1]); + break; + case SND_CMD_SET_SHARED_WORK: + SNDi_SharedWork = (struct SNDSharedWork *)cmd.arg[0]; + break; + case SND_CMD_READ_DRIVER_INFO: + ReadDriverInfo((struct SNDDriverInfo *)cmd.arg[0]); + break; } // end switch cmd_ptr = cmd.llNext; @@ -196,15 +199,19 @@ void SND_CommandProc(void) { } // end loop over receive message } -static void PxiFifoCallback(PXIFifoTag tag, u32 data, BOOL error) { +static void PxiFifoCallback(PXIFifoTag tag, u32 data, BOOL error) +{ (void)tag; (void)error; OSIntrMode intrMode = OS_DisableInterrupts(); - if (data >= HW_MAIN_MEM) { + if (data >= HW_MAIN_MEM) + { (void)OS_SendMessage(&sMsgQueue, (OSMessage)data, 0); - } else { + } + else + { if (data == 0) SND_SendWakeupMessage(); } @@ -212,52 +219,68 @@ static void PxiFifoCallback(PXIFifoTag tag, u32 data, BOOL error) { (void)OS_RestoreInterrupts(intrMode); } -static void InitPXI(void) { +static void InitPXI(void) +{ PXI_SetFifoRecvCallback(PXI_FIFO_TAG_SOUND, PxiFifoCallback); } -static void SetChannelTimer(u32 channelMask, int timer) { - for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1) { +static void SetChannelTimer(u32 channelMask, int timer) +{ + for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1) + { if (channelMask & 1) SND_SetChannelTimer(i, timer); } } -static void SetChannelVolume(u32 channelMask, int vol, int shift) { - for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1) { +static void SetChannelVolume(u32 channelMask, int vol, int shift) +{ + for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1) + { if (channelMask & 1) SND_SetChannelVolume(i, vol, shift); } } -static void SetChannelPan(u32 channelMask, int pan) { - for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1) { +static void SetChannelPan(u32 channelMask, int pan) +{ + for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1) + { if (channelMask & 1) SND_SetChannelPan(i, pan); } } -static void StartTimer(u32 channelMask, u32 captureMask, u32 alarmMask, s32 unused) { +static void StartTimer(u32 channelMask, u32 captureMask, u32 alarmMask, s32 unused) +{ (void)unused; OSIntrMode intrMode = OS_DisableInterrupts(); - for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1) { + for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1) + { if (channelMask & 1) reg_SOUNDxCNT_STAT(i) |= 0x80; } - if (captureMask & 1) { - if (captureMask & 2) { + if (captureMask & 1) + { + if (captureMask & 2) + { *(vu16 *)®_SNDCAPxCNT(0) |= 0x8080; - } else { + } + else + { reg_SNDCAPxCNT(0) |= 0x80; } - } else if (captureMask & 2) { + } + else if (captureMask & 2) + { reg_SNDCAPxCNT(1) |= 0x80; } - for (int i = 0; i < SND_ALARM_COUNT && alarmMask != 0; i++, alarmMask >>= 1) { + for (int i = 0; i < SND_ALARM_COUNT && alarmMask != 0; i++, alarmMask >>= 1) + { if (alarmMask & 1) SND_StartAlarm(i); } @@ -266,15 +289,18 @@ static void StartTimer(u32 channelMask, u32 captureMask, u32 alarmMask, s32 unus SND_UpdateSharedWork(); } -static void StopTimer(u32 channelMask, u32 captureMask, u32 alarmMask, s32 hold) { +static void StopTimer(u32 channelMask, u32 captureMask, u32 alarmMask, s32 hold) +{ OSIntrMode intrMode = OS_DisableInterrupts(); - for (int i = 0; i < SND_ALARM_COUNT && alarmMask != 0; i++, alarmMask >>= 1) { + for (int i = 0; i < SND_ALARM_COUNT && alarmMask != 0; i++, alarmMask >>= 1) + { if (alarmMask & 1) SND_StopAlarm(i); } - for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1) { + for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1) + { if (channelMask & 1) SND_StopChannel(i, hold); } @@ -288,12 +314,14 @@ static void StopTimer(u32 channelMask, u32 captureMask, u32 alarmMask, s32 hold) SND_UpdateSharedWork(); } -static void ReadDriverInfo(struct SNDDriverInfo *driverInfo) { +static void ReadDriverInfo(struct SNDDriverInfo *driverInfo) +{ MI_CpuCopy32(&SNDi_Work, driverInfo, sizeof(SNDi_Work)); driverInfo->workPtr = &SNDi_Work; - for (int i = 0; i < SND_CHANNEL_COUNT; i++) { + for (int i = 0; i < SND_CHANNEL_COUNT; i++) + { driverInfo->channelControls[i] = SND_GetChannelControl(i); } diff --git a/arm7/lib/src/SND_exChannel.c b/arm7/lib/src/SND_exChannel.c index c2231640..dfaabeda 100644 --- a/arm7/lib/src/SND_exChannel.c +++ b/arm7/lib/src/SND_exChannel.c @@ -2,8 +2,8 @@ #include "SND_channel.h" #include "SND_main.h" -#include "SND_work.h" #include "SND_util.h" +#include "SND_work.h" #include "registers.h" @@ -21,15 +21,18 @@ static int ExChannelSweepUpdate(struct SNDExChannel *chn, BOOL step); static int ExChannelLfoUpdate(struct SNDExChannel *chn, BOOL step); static void ExChannelStart(struct SNDExChannel *chn, int length); static int ExChannelVolumeCmp(struct SNDExChannel *chn_a, struct SNDExChannel *chn_b); -static void ExChannelSetup(struct SNDExChannel *, SNDExChannelCallback callback, void *callbackUserData, int priority); +static void ExChannelSetup( + struct SNDExChannel *, SNDExChannelCallback callback, void *callbackUserData, int priority); -void SND_ExChannelInit(void) { +void SND_ExChannelInit(void) +{ struct SNDExChannel *chn; s32 i; - for (i = 0; i < SND_CHANNEL_COUNT; i++) { + for (i = 0; i < SND_CHANNEL_COUNT; i++) + { chn = &SNDi_Work.channels[i]; - + chn->id = (u8)i; chn->flags.syncFlag = 0; chn->flags.active = FALSE; @@ -39,11 +42,13 @@ void SND_ExChannelInit(void) { sWeakLockedChannelMask = 0; } -void SND_UpdateExChannel(void) { +void SND_UpdateExChannel(void) +{ struct SNDExChannel *chn; s32 i; - for (i = 0; i < SND_CHANNEL_COUNT; i++) { + for (i = 0; i < SND_CHANNEL_COUNT; i++) + { chn = &SNDi_Work.channels[i]; if (chn->flags.syncFlag == 0) @@ -51,69 +56,69 @@ void SND_UpdateExChannel(void) { if (chn->flags.syncFlag & SND_CHN_SYNC_STOP) SND_StopChannel(i, 0); - - if (chn->flags.syncFlag & SND_CHN_SYNC_START) { - switch (chn->type) { - case SND_CHN_TYPE_PCM: - SND_SetupChannelPcm( - i, - chn->waveDataPtr, - chn->waveParam.format, - chn->waveParam.loopEnabled ? 1 : 2, - (s32)chn->waveParam.loopStart, - (s32)chn->waveParam.loopLength, - chn->volume & 0xFF, - chn->volume >> 8, - chn->timer, - chn->pan - ); - break; - case SND_CHN_TYPE_PSG: - SND_SetupChannelPsg( - i, - chn->dutyCycle, - chn->volume & 0xFF, - chn->volume >> 8, - chn->timer, - chn->pan - ); - break; - case SND_CHN_TYPE_NOISE: - SND_SetupChannelNoise( - i, - chn->volume & 0xFF, - chn->volume >> 8, - chn->timer, - chn->pan - ); - break; + + if (chn->flags.syncFlag & SND_CHN_SYNC_START) + { + switch (chn->type) + { + case SND_CHN_TYPE_PCM: + SND_SetupChannelPcm(i, + chn->waveDataPtr, + chn->waveParam.format, + chn->waveParam.loopEnabled ? 1 : 2, + (s32)chn->waveParam.loopStart, + (s32)chn->waveParam.loopLength, + chn->volume & 0xFF, + chn->volume >> 8, + chn->timer, + chn->pan); + break; + case SND_CHN_TYPE_PSG: + SND_SetupChannelPsg(i, + chn->dutyCycle, + chn->volume & 0xFF, + chn->volume >> 8, + chn->timer, + chn->pan); + break; + case SND_CHN_TYPE_NOISE: + SND_SetupChannelNoise( + i, chn->volume & 0xFF, chn->volume >> 8, chn->timer, chn->pan); + break; } - } else { - if (chn->flags.syncFlag & SND_CHN_SYNC_TIMER) { + } + else + { + if (chn->flags.syncFlag & SND_CHN_SYNC_TIMER) + { SND_SetChannelTimer(i, chn->timer); } - if (chn->flags.syncFlag & SND_CHN_SYNC_VOLUME) { + if (chn->flags.syncFlag & SND_CHN_SYNC_VOLUME) + { SND_SetChannelVolume(i, chn->volume & 0xFF, chn->volume >> 8); } - if (chn->flags.syncFlag & SND_CHN_SYNC_PAN) { + if (chn->flags.syncFlag & SND_CHN_SYNC_PAN) + { SND_SetChannelPan(i, chn->pan); } } } - for (i = 0; i < SND_CHANNEL_COUNT; i++) { + for (i = 0; i < SND_CHANNEL_COUNT; i++) + { chn = &SNDi_Work.channels[i]; if (!chn->flags.syncFlag) continue; - + if (chn->flags.syncFlag & SND_CHN_SYNC_START) reg_SOUNDxCNT_STAT(i) |= 0x80; chn->flags.syncFlag = 0; } } -void SND_ExChannelMain(BOOL step) { +void SND_ExChannelMain(BOOL step) +{ struct SNDExChannel *chn; s32 i; s32 vol; @@ -122,7 +127,8 @@ void SND_ExChannelMain(BOOL step) { s32 lfo; u16 newTimer; - for (i = 0; i < SND_CHANNEL_COUNT; i++) { + for (i = 0; i < SND_CHANNEL_COUNT; i++) + { vol = 0; pitch = 0; pan = 0; @@ -130,11 +136,14 @@ void SND_ExChannelMain(BOOL step) { if (!chn->flags.active) continue; - - if (chn->flags.start) { + + if (chn->flags.start) + { chn->flags.syncFlag |= SND_CHN_SYNC_START; chn->flags.start = FALSE; - } else if (!SND_IsChannelActive(i)) { + } + else if (!SND_IsChannelActive(i)) + { if (chn->callback) chn->callback(chn, 1, chn->callbackUserData); else @@ -143,7 +152,7 @@ void SND_ExChannelMain(BOOL step) { chn->flags.active = FALSE; continue; } - + vol += SNDi_DecibelSquareTable[chn->velocity]; pitch += (chn->midiKey - chn->rootMidiKey) * 0x40; @@ -156,26 +165,29 @@ void SND_ExChannelMain(BOOL step) { lfo = ExChannelLfoUpdate(chn, step); - switch (chn->lfo.param.target) { - case SND_LFO_VOLUME: - if (vol > -0x8000) - vol += lfo; - break; - case SND_LFO_PAN: - pan += lfo; - break; - case SND_LFO_PITCH: - pitch += lfo; - break; + switch (chn->lfo.param.target) + { + case SND_LFO_VOLUME: + if (vol > -0x8000) + vol += lfo; + break; + case SND_LFO_PAN: + pan += lfo; + break; + case SND_LFO_PITCH: + pitch += lfo; + break; } pan += chn->initPan; - if (chn->panRange != 127) { + if (chn->panRange != 127) + { pan = (pan * chn->panRange + 0x40) >> 7; } pan += chn->userPan; - if (chn->envStatus == SND_ENV_RELEASE && vol <= -723) { + if (chn->envStatus == SND_ENV_RELEASE && vol <= -723) + { chn->flags.syncFlag = SND_CHN_SYNC_STOP; if (chn->callback) chn->callback(chn, 1, chn->callbackUserData); @@ -183,28 +195,33 @@ void SND_ExChannelMain(BOOL step) { chn->priority = 0; chn->volume = 0; chn->flags.active = 0; - } else { + } + else + { vol = SND_CalcChannelVolume(vol); newTimer = SND_CalcTimer(chn->waveParam.timer, pitch); if (chn->type == SND_CHN_TYPE_PSG) newTimer &= 0xFFFC; - + pan += 0x40; if (pan < 0) pan = 0; else if (pan > 127) pan = 127; - - if (vol != chn->volume) { + + if (vol != chn->volume) + { chn->volume = (u16)vol; chn->flags.syncFlag |= SND_CHN_SYNC_VOLUME; } - if (newTimer != chn->timer) { + if (newTimer != chn->timer) + { chn->timer = (u16)newTimer; chn->flags.syncFlag |= SND_CHN_SYNC_TIMER; } - if (pan != chn->pan) { + if (pan != chn->pan) + { chn->pan = (u8)pan; chn->flags.syncFlag |= SND_CHN_SYNC_PAN; } @@ -212,7 +229,9 @@ void SND_ExChannelMain(BOOL step) { } } -BOOL SND_StartExChannelPcm(struct SNDExChannel *chn, const struct SNDWaveParam *wave, const void *data, s32 length) { +BOOL SND_StartExChannelPcm( + struct SNDExChannel *chn, const struct SNDWaveParam *wave, const void *data, s32 length) +{ chn->type = SND_CHN_TYPE_PCM; chn->waveParam = *wave; chn->waveDataPtr = data; @@ -220,12 +239,18 @@ BOOL SND_StartExChannelPcm(struct SNDExChannel *chn, const struct SNDWaveParam * return TRUE; } -BOOL SND_StartExChannelPsg(struct SNDExChannel *chn, s32 duty, s32 length) { - if (chn->id < 8) { +BOOL SND_StartExChannelPsg(struct SNDExChannel *chn, s32 duty, s32 length) +{ + if (chn->id < 8) + { return FALSE; - } else if (chn->id > 13) { + } + else if (chn->id > 13) + { return FALSE; - } else { + } + else + { chn->type = SND_CHN_TYPE_PSG; chn->dutyCycle = duty; chn->waveParam.timer = 8006; @@ -234,12 +259,18 @@ BOOL SND_StartExChannelPsg(struct SNDExChannel *chn, s32 duty, s32 length) { } } -BOOL SND_StartExChannelNoise(struct SNDExChannel *chn, s32 length) { - if (chn->id < 14) { +BOOL SND_StartExChannelNoise(struct SNDExChannel *chn, s32 length) +{ + if (chn->id < 14) + { return FALSE; - } else if (chn->id > 15) { + } + else if (chn->id > 15) + { return FALSE; - } else { + } + else + { chn->type = SND_CHN_TYPE_NOISE; chn->waveParam.timer = 8006; ExChannelStart(chn, length); @@ -247,63 +278,75 @@ BOOL SND_StartExChannelNoise(struct SNDExChannel *chn, s32 length) { } } -s32 SND_UpdateExChannelEnvelope(struct SNDExChannel *chn, BOOL step) { +s32 SND_UpdateExChannelEnvelope(struct SNDExChannel *chn, BOOL step) +{ s32 sustain; - if (step) { - switch (chn->envStatus) { - case SND_ENV_ATTACK: - chn->envAttenuation = -((-chn->envAttenuation * chn->envAttack) >> 8); - if (chn->envAttenuation == 0) - chn->envStatus = SND_ENV_DECAY; - break; - case SND_ENV_DECAY: - sustain = SNDi_DecibelSquareTable[chn->envSustain] << 7; - chn->envAttenuation -= chn->envDecay; - if (chn->envAttenuation <= sustain) { - chn->envAttenuation = sustain; - chn->envStatus = SND_ENV_SUSTAIN; - } - break; - case SND_ENV_SUSTAIN: - break; - case SND_ENV_RELEASE: - chn->envAttenuation -= chn->envRelease; - break; + if (step) + { + switch (chn->envStatus) + { + case SND_ENV_ATTACK: + chn->envAttenuation = -((-chn->envAttenuation * chn->envAttack) >> 8); + if (chn->envAttenuation == 0) + chn->envStatus = SND_ENV_DECAY; + break; + case SND_ENV_DECAY: + sustain = SNDi_DecibelSquareTable[chn->envSustain] << 7; + chn->envAttenuation -= chn->envDecay; + if (chn->envAttenuation <= sustain) + { + chn->envAttenuation = sustain; + chn->envStatus = SND_ENV_SUSTAIN; + } + break; + case SND_ENV_SUSTAIN: + break; + case SND_ENV_RELEASE: + chn->envAttenuation -= chn->envRelease; + break; } } return chn->envAttenuation >> 7; } -void SND_SetExChannelAttack(struct SNDExChannel *chn, s32 attack) { +void SND_SetExChannelAttack(struct SNDExChannel *chn, s32 attack) +{ if (attack < 109) chn->envAttack = (u8)(255 - attack); else chn->envAttack = sAttackCoeffTable[127 - attack]; } -void SND_SetExChannelDecay(struct SNDExChannel *chn, s32 decay) { +void SND_SetExChannelDecay(struct SNDExChannel *chn, s32 decay) +{ chn->envDecay = CalcDecayCoeff(decay); } -void SND_SetExChannelSustain(struct SNDExChannel *chn, s32 sustain) { +void SND_SetExChannelSustain(struct SNDExChannel *chn, s32 sustain) +{ chn->envSustain = (u8)sustain; } -void SND_SetExChannelRelease(struct SNDExChannel *chn, s32 release) { +void SND_SetExChannelRelease(struct SNDExChannel *chn, s32 release) +{ chn->envRelease = CalcDecayCoeff(release); } -void SND_ReleaseExChannel(struct SNDExChannel *chn) { +void SND_ReleaseExChannel(struct SNDExChannel *chn) +{ chn->envStatus = SND_ENV_RELEASE; } -BOOL SND_IsExChannelActive(struct SNDExChannel *chn) { +BOOL SND_IsExChannelActive(struct SNDExChannel *chn) +{ return chn->flags.active; } -struct SNDExChannel *SND_AllocExChannel(u32 channelMask, int priority, u32 flags, SNDExChannelCallback callback, void *callbackUserData) { +struct SNDExChannel *SND_AllocExChannel( + u32 channelMask, int priority, u32 flags, SNDExChannelCallback callback, void *callbackUserData) +{ struct SNDExChannel *chnPrev; int i; struct SNDExChannel *chn; @@ -315,20 +358,23 @@ struct SNDExChannel *SND_AllocExChannel(u32 channelMask, int priority, u32 flags chnPrev = NULL; - for (i = 0; i < SND_CHANNEL_COUNT; i++) { + for (i = 0; i < SND_CHANNEL_COUNT; i++) + { channelCandidate = sChannelAllocationOrder[i]; - if (channelMask & (1 << channelCandidate)) { + if (channelMask & (1 << channelCandidate)) + { chn = &SNDi_Work.channels[channelCandidate]; - if (chnPrev == NULL) { + if (chnPrev == NULL) + { chnPrev = chn; continue; } - + if (chn->priority > chnPrev->priority) continue; - + if (chn->priority != chnPrev->priority || ExChannelVolumeCmp(chnPrev, chn) < 0) chnPrev = chn; } @@ -336,35 +382,39 @@ struct SNDExChannel *SND_AllocExChannel(u32 channelMask, int priority, u32 flags if (chnPrev == NULL) return NULL; - + if (priority < chnPrev->priority) return NULL; if (chnPrev->callback) chnPrev->callback(chnPrev, 0, chnPrev->callbackUserData); - + chnPrev->flags.syncFlag = 2; chnPrev->flags.active = 0; ExChannelSetup(chnPrev, callback, callbackUserData, priority); return chnPrev; } -void SND_FreeExChannel(struct SNDExChannel *chn) { - if (chn) { +void SND_FreeExChannel(struct SNDExChannel *chn) +{ + if (chn) + { chn->callback = NULL; chn->callbackUserData = NULL; } } -void SND_StopUnlockedChannel(u32 channelMask, u32 weak) { +void SND_StopUnlockedChannel(u32 channelMask, u32 weak) +{ (void)weak; struct SNDExChannel *chn; - - for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1) { + + for (int i = 0; i < SND_CHANNEL_COUNT && channelMask != 0; i++, channelMask >>= 1) + { if ((channelMask & 1) == 0) continue; - + chn = &SNDi_Work.channels[i]; if (sLockedChannelMask & (1 << i)) @@ -381,12 +431,14 @@ void SND_StopUnlockedChannel(u32 channelMask, u32 weak) { } } -void SND_LockChannel(u32 channelMask, u32 weak) { +void SND_LockChannel(u32 channelMask, u32 weak) +{ struct SNDExChannel *chn; u32 j = channelMask; int i = 0; - for (; i < SND_CHANNEL_COUNT && j != 0; i++, j >>= 1) { + for (; i < SND_CHANNEL_COUNT && j != 0; i++, j >>= 1) + { if ((j & 1) == 0) continue; @@ -405,41 +457,57 @@ void SND_LockChannel(u32 channelMask, u32 weak) { chn->flags.active = 0; } - if (weak & 1) { + if (weak & 1) + { sWeakLockedChannelMask |= channelMask; - } else { + } + else + { sLockedChannelMask |= channelMask; } } -void SND_UnlockChannel(u32 channelMask, u32 weak) { - if (weak & 1) { +void SND_UnlockChannel(u32 channelMask, u32 weak) +{ + if (weak & 1) + { sWeakLockedChannelMask &= ~channelMask; - } else { + } + else + { sLockedChannelMask &= ~channelMask; } } -u32 SND_GetLockedChannel(u32 weak) { - if (weak & 1) { +u32 SND_GetLockedChannel(u32 weak) +{ + if (weak & 1) + { return sWeakLockedChannelMask; - } else { + } + else + { return sLockedChannelMask; } } -void SND_InvalidateWave(const void *start, const void *end) { - for (u8 i = 0; i < SND_CHANNEL_COUNT; i++) { +void SND_InvalidateWave(const void *start, const void *end) +{ + for (u8 i = 0; i < SND_CHANNEL_COUNT; i++) + { struct SNDExChannel *chn = &SNDi_Work.channels[i]; - if (chn->flags.active && chn->type == 0 && start <= chn->waveDataPtr && chn->waveDataPtr <= end) { + if (chn->flags.active && chn->type == 0 && start <= chn->waveDataPtr && + chn->waveDataPtr <= end) + { chn->flags.start = FALSE; SND_StopChannel(i, 0); } } } -void SND_InitLfoParam(struct SNDLfoParam *lfoParam) { +void SND_InitLfoParam(struct SNDLfoParam *lfoParam) +{ lfoParam->target = SND_LFO_PITCH; lfoParam->depth = 0; lfoParam->range = 1; @@ -447,19 +515,25 @@ void SND_InitLfoParam(struct SNDLfoParam *lfoParam) { lfoParam->delay = 0; } -void SND_StartLfo(struct SNDLfo *lfo) { +void SND_StartLfo(struct SNDLfo *lfo) +{ lfo->counter = 0; lfo->delayCounter = 0; } -void SND_UpdateLfo(struct SNDLfo *lfo) { - if (lfo->delayCounter < lfo->param.delay) { +void SND_UpdateLfo(struct SNDLfo *lfo) +{ + if (lfo->delayCounter < lfo->param.delay) + { lfo->delayCounter++; - } else { + } + else + { u32 tmp = lfo->counter; tmp += lfo->param.speed << 6; tmp >>= 8; - while (tmp >= 0x80) { + while (tmp >= 0x80) + { tmp -= 0x80; } lfo->counter += lfo->param.speed << 6; @@ -468,17 +542,24 @@ void SND_UpdateLfo(struct SNDLfo *lfo) { } } -int SND_GetLfoValue(struct SNDLfo *lfo) { - if (lfo->param.depth == 0) { +int SND_GetLfoValue(struct SNDLfo *lfo) +{ + if (lfo->param.depth == 0) + { return 0; - } else if (lfo->delayCounter < lfo->param.delay) { + } + else if (lfo->delayCounter < lfo->param.delay) + { return 0; - } else { + } + else + { return SND_SinIdx((s32)((u32)lfo->counter >> 8)) * lfo->param.depth * lfo->param.range; } } -static u16 CalcDecayCoeff(int vol) { +static u16 CalcDecayCoeff(int vol) +{ if (vol == 127) return 0xFFFF; else if (vol == 126) @@ -489,7 +570,9 @@ static u16 CalcDecayCoeff(int vol) { return (u16)(0x1E00 / (126 - vol)); } -static void ExChannelSetup(struct SNDExChannel *chn, SNDExChannelCallback callback, void *callbackUserData, int priority) { +static void ExChannelSetup( + struct SNDExChannel *chn, SNDExChannelCallback callback, void *callbackUserData, int priority) +{ chn->channelLLNext = NULL; chn->callback = callback; chn->callbackUserData = callbackUserData; @@ -518,7 +601,8 @@ static void ExChannelSetup(struct SNDExChannel *chn, SNDExChannelCallback callba SND_InitLfoParam(&chn->lfo.param); } -static void ExChannelStart(struct SNDExChannel *chn, int length) { +static void ExChannelStart(struct SNDExChannel *chn, int length) +{ chn->envAttenuation = -92544; chn->envStatus = 0; chn->length = length; @@ -527,7 +611,8 @@ static void ExChannelStart(struct SNDExChannel *chn, int length) { chn->flags.active = TRUE; } -static int ExChannelVolumeCmp(struct SNDExChannel *chn_a, struct SNDExChannel *chn_b) { +static int ExChannelVolumeCmp(struct SNDExChannel *chn_a, struct SNDExChannel *chn_b) +{ int vol_a = chn_a->volume & 0xFF; int vol_b = chn_b->volume & 0xFF; @@ -537,7 +622,8 @@ static int ExChannelVolumeCmp(struct SNDExChannel *chn_a, struct SNDExChannel *c vol_a >>= sSampleDataShiftTable[chn_a->volume >> 8]; vol_b >>= sSampleDataShiftTable[chn_b->volume >> 8]; - if (vol_a != vol_b) { + if (vol_a != vol_b) + { if (vol_a < vol_b) return 1; else @@ -546,14 +632,20 @@ static int ExChannelVolumeCmp(struct SNDExChannel *chn_a, struct SNDExChannel *c return 0; } -static int ExChannelSweepUpdate(struct SNDExChannel *chn, BOOL step) { +static int ExChannelSweepUpdate(struct SNDExChannel *chn, BOOL step) +{ s64 result; - if (chn->sweepPitch == 0) { + if (chn->sweepPitch == 0) + { result = 0; - } else if (chn->sweepCounter >= chn->sweepLength) { + } + else if (chn->sweepCounter >= chn->sweepLength) + { result = 0; - } else { + } + else + { result = (s64)chn->sweepPitch * (chn->sweepLength - chn->sweepCounter) / chn->sweepLength; if (step && chn->flags.autoSweep) @@ -563,25 +655,29 @@ static int ExChannelSweepUpdate(struct SNDExChannel *chn, BOOL step) { return (int)result; } -static int ExChannelLfoUpdate(struct SNDExChannel *chn, BOOL step) { +static int ExChannelLfoUpdate(struct SNDExChannel *chn, BOOL step) +{ s64 result = SND_GetLfoValue(&chn->lfo); - if (result != 0) { - switch (chn->lfo.param.target) { - case SND_LFO_VOLUME: - result *= 60; - break; - case SND_LFO_PITCH: - result <<= 6; - break; - case SND_LFO_PAN: - result <<= 6; - break; + if (result != 0) + { + switch (chn->lfo.param.target) + { + case SND_LFO_VOLUME: + result *= 60; + break; + case SND_LFO_PITCH: + result <<= 6; + break; + case SND_LFO_PAN: + result <<= 6; + break; } result >>= 14; } - if (step) { + if (step) + { SND_UpdateLfo(&chn->lfo); } diff --git a/arm7/lib/src/SND_global.c b/arm7/lib/src/SND_global.c index 0654934f..c78fcd5f 100644 --- a/arm7/lib/src/SND_global.c +++ b/arm7/lib/src/SND_global.c @@ -8,18 +8,22 @@ #include "registers.h" #include "syscall.h" -void SND_Enable(void) { +void SND_Enable(void) +{ reg_SOUNDCNT_MIX |= 0x80; } -void SND_Disable(void) { +void SND_Disable(void) +{ reg_SOUNDCNT_MIX &= ~0x80; } -void SND_Shutdown(void) { +void SND_Shutdown(void) +{ SND_Disable(); - for (int i = 0; i < SND_CHANNEL_COUNT; i++) { + for (int i = 0; i < SND_CHANNEL_COUNT; i++) + { SND_StopChannel(i, 1); } @@ -27,7 +31,8 @@ void SND_Shutdown(void) { reg_SNDCAPxCNT(1) = 0; } -void SND_BeginSleep(void) { +void SND_BeginSleep(void) +{ SND_Disable(); SVC_SoundBiasReset(0x80); OS_SpinWait(0x40000); @@ -35,19 +40,24 @@ void SND_BeginSleep(void) { reg_POWCNT2 &= ~1; } -void SND_EndSleep(void) { - reg_POWCNT2 |= 1; // enable speakers +void SND_EndSleep(void) +{ + reg_POWCNT2 |= 1; // enable speakers PMi_SetControl(1); SVC_SoundBiasSet(0x100); OS_SpinWait(0x7AB80); // what does this wait for and how long does it wait? SND_Enable(); } -void SND_SetMasterVolume(int vol) { +void SND_SetMasterVolume(int vol) +{ reg_SOUNDCNT_VOL = (u8)vol; } -void SND_SetOutputSelector(int leftOutputFrom, int rightOutputFrom, int outputCh1ToMixer, int outputCh3ToMixer) { +void SND_SetOutputSelector( + int leftOutputFrom, int rightOutputFrom, int outputCh1ToMixer, int outputCh3ToMixer) +{ int masterEnable = (reg_SOUNDCNT_MIX & 0x80) ? 1 : 0; - reg_SOUNDCNT_MIX = (u8)((masterEnable << 7) | (outputCh3ToMixer << 5) | (outputCh1ToMixer << 4) | (rightOutputFrom << 2) | (leftOutputFrom)); + reg_SOUNDCNT_MIX = (u8)((masterEnable << 7) | (outputCh3ToMixer << 5) | + (outputCh1ToMixer << 4) | (rightOutputFrom << 2) | (leftOutputFrom)); } diff --git a/arm7/lib/src/SND_main.c b/arm7/lib/src/SND_main.c index 24e81d2c..fbf84573 100644 --- a/arm7/lib/src/SND_main.c +++ b/arm7/lib/src/SND_main.c @@ -12,8 +12,8 @@ #include "SND_work.h" #include "OS_alarm.h" -#include "OS_thread.h" #include "OS_message.h" +#include "OS_thread.h" #include "OS_tick.h" static void FUN_037fc330(void *); @@ -26,57 +26,74 @@ OSMessageQueue sMessageQueue; OSMessage sMessageArray[8]; u32 sInitialized = 0; -void SND_Init(u32 priority) { - if (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); +void SND_CreateThread(u32 priority) +{ + OS_CreateThread(&sThread, + SndThread, + NULL, + &sThreadStack[sizeof(sThreadStack)], + sizeof(sThreadStack), + priority); OS_WakeupThreadDirect(&sThread); } -void SND_InitIntervalTimer(void) { +void SND_InitIntervalTimer(void) +{ OS_InitMessageQueue(&sMessageQueue, sMessageArray, 8); OS_CreateAlarm(&sAlarm); } -void SND_StartIntervalTimer(void) { +void SND_StartIntervalTimer(void) +{ OSTick tick = OS_GetTick(); OS_SetPeriodicAlarm(&sAlarm, tick + 0x10000, 2728, FUN_037fc330, NULL); } -void SND_StopIntervalTimer(void) { +void SND_StopIntervalTimer(void) +{ OS_CancelAlarm(&sAlarm); } -u32 SND_WaitForIntervalTimer(void) { +u32 SND_WaitForIntervalTimer(void) +{ OSMessage result; (void)OS_ReceiveMessage(&sMessageQueue, &result, 1); return (u32)result; } -void SND_SendWakeupMessage(void) { +void SND_SendWakeupMessage(void) +{ (void)OS_SendMessage(&sMessageQueue, (OSMessage)2, 0); } -void SNDi_LockMutex(void) { +void SNDi_LockMutex(void) +{ // nothing } -void SNDi_UnlockMutex(void) { +void SNDi_UnlockMutex(void) +{ // nothing } -static void FUN_037fc330(void *arg) { +static void FUN_037fc330(void *arg) +{ (void)arg; (void)OS_SendMessage(&sMessageQueue, (OSMessage)1, 0); } -static void SndThread(void *arg) { +static void SndThread(void *arg) +{ (void)arg; SND_InitIntervalTimer(); @@ -88,18 +105,20 @@ static void SndThread(void *arg) { SND_SetMasterVolume(0x7F); SND_StartIntervalTimer(); - while (1) { + while (1) + { BOOL update = FALSE; - + u32 result = SND_WaitForIntervalTimer(); - switch (result) { - case 2: - update = FALSE; - break; - case 1: - update = TRUE; - break; + switch (result) + { + case 2: + update = FALSE; + break; + case 1: + update = TRUE; + break; } SND_UpdateExChannel(); diff --git a/arm7/lib/src/SND_seq.c b/arm7/lib/src/SND_seq.c index 76664fdd..e16ca9be 100644 --- a/arm7/lib/src/SND_seq.c +++ b/arm7/lib/src/SND_seq.c @@ -1,11 +1,11 @@ #include "SND_seq.h" +#include "SND_bank.h" +#include "SND_exChannel.h" +#include "SND_lfo.h" #include "SND_main.h" -#include "SND_work.h" #include "SND_util.h" -#include "SND_lfo.h" -#include "SND_exChannel.h" -#include "SND_bank.h" +#include "SND_work.h" #define SND_TIMER_RATE 240 @@ -14,23 +14,27 @@ #define SND_TRACK_MUTE_MODE_MUTE_RELEASE 2 #define SND_TRACK_MUTE_MODE_MUTE_STOP 3 -enum SNDSeqProc { +enum SNDSeqProc +{ SND_PROC_SKIP_NOTES = 0, SND_PROC_PLAY_NOTES = 1, }; -enum SNDSeqVal { - SND_SEQ_VAL_U8 = 0, +enum SNDSeqVal +{ + SND_SEQ_VAL_U8 = 0, SND_SEQ_VAL_U16 = 1, SND_SEQ_VAL_VLV = 2, SND_SEQ_VAL_RAN = 3, SND_SEQ_VAL_VAR = 4, }; -static struct { +static struct +{ const u8 *begin; const u8 *end; - union { + union + { u8 buf[16]; u32 buf32[4]; }; @@ -55,33 +59,39 @@ static void TrackMute(struct SNDTrack *track, struct SNDPlayer *player, int mute static s16 *PlayerGetVariablePointer(const struct SNDPlayer *player, int var); static void TrackUpdateChannel(struct SNDTrack *track, struct SNDPlayer *player, int release); -void SND_SeqInit(void) { - for (int i = 0; i < SND_PLAYER_COUNT; i++) { +void SND_SeqInit(void) +{ + for (int i = 0; i < SND_PLAYER_COUNT; i++) + { struct SNDPlayer *ply = &SNDi_Work.players[i]; ply->flags.active = FALSE; ply->playerId = (u8)i; } - for (int i = 0; i < SND_TRACK_COUNT; i++) { + for (int i = 0; i < SND_TRACK_COUNT; i++) + { struct SNDTrack *trk = &SNDi_Work.tracks[i]; trk->flags.active = FALSE; } } -void SND_SeqMain(BOOL step) { +void SND_SeqMain(BOOL step) +{ struct SNDPlayer *ply; int i; u32 playerStatus = 0; - for (i = 0; i < SND_PLAYER_COUNT; i++) { + for (i = 0; i < SND_PLAYER_COUNT; i++) + { ply = &SNDi_Work.players[i]; if (!ply->flags.active) continue; - - if (ply->flags.prepared) { + + if (ply->flags.prepared) + { if (step && !ply->flags.paused) PlayerSeqMain(ply); PlayerUpdateChannel(ply); @@ -95,19 +105,20 @@ void SND_SeqMain(BOOL step) { SNDi_SharedWork->playerStatus = playerStatus; } -void SND_PrepareSeq(int player, const void *seq, u32 offset, struct SNDBankData *bankData) { +void SND_PrepareSeq(int player, const void *seq, u32 offset, struct SNDBankData *bankData) +{ struct SNDPlayer *ply = &SNDi_Work.players[player]; if (ply->flags.active) PlayerStop(ply); - + PlayerInit(ply, bankData); int allocTrkIdx = AllocateTrack(); if (allocTrkIdx < 0) return; - + struct SNDTrack *trk = &SNDi_Work.tracks[allocTrkIdx]; TrackInit(trk); TrackStart(trk, seq, offset); @@ -118,14 +129,20 @@ void SND_PrepareSeq(int player, const void *seq, u32 offset, struct SNDBankData trk->cur++; - if (cmd != 0xFE) { + if (cmd != 0xFE) + { trk->cur--; - } else { + } + else + { int track; u16 trackMask; - for (trackMask = (u16)(TrackReadU16(trk) >> 1), track = 1; trackMask != 0; track++, trackMask >>= 1) { - if (trackMask & 1) { + for (trackMask = (u16)(TrackReadU16(trk) >> 1), track = 1; trackMask != 0; + track++, trackMask >>= 1) + { + if (trackMask & 1) + { allocTrkIdx = AllocateTrack(); if (allocTrkIdx < 0) break; @@ -138,42 +155,52 @@ void SND_PrepareSeq(int player, const void *seq, u32 offset, struct SNDBankData ply->flags.active = TRUE; ply->flags.prepared = FALSE; - if (SNDi_SharedWork) { + if (SNDi_SharedWork) + { SNDi_SharedWork->playerStatus |= 1 << player; } } -void SND_StartPreparedSeq(int player) { +void SND_StartPreparedSeq(int player) +{ SNDi_Work.players[player].flags.prepared = TRUE; } -void SND_StartSeq(int player, const void *seq, u32 offset, struct SNDBankData *bankData) { +void SND_StartSeq(int player, const void *seq, u32 offset, struct SNDBankData *bankData) +{ SND_PrepareSeq(player, seq, offset, bankData); SND_StartPreparedSeq(player); } -void SND_StopSeq(int player) { +void SND_StopSeq(int player) +{ struct SNDPlayer *ply = &SNDi_Work.players[player]; - if (ply->flags.active) { + if (ply->flags.active) + { PlayerStop(ply); - if (SNDi_SharedWork) { + if (SNDi_SharedWork) + { SNDi_SharedWork->playerStatus &= ~(1 << player); } } } -void SND_PauseSeq(int player, BOOL flag) { +void SND_PauseSeq(int player, BOOL flag) +{ struct SNDPlayer *ply = &SNDi_Work.players[player]; ply->flags.paused = flag; - if (flag) { - for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) { + if (flag) + { + for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) + { struct SNDTrack *trk = PlayerGetTrack(ply, i); - if (trk) { + if (trk) + { TrackReleaseChannels(trk, ply, 127); TrackFreeChannels(trk); } @@ -181,13 +208,16 @@ void SND_PauseSeq(int player, BOOL flag) { } } -void SND_SkipSeq(int player, u32 ticks) { +void SND_SkipSeq(int player, u32 ticks) +{ struct SNDPlayer *ply = &SNDi_Work.players[player]; - for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) { + for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) + { struct SNDTrack *trk = PlayerGetTrack(ply, i); - if (trk) { + if (trk) + { TrackReleaseChannels(trk, ply, 127); TrackFreeChannels(trk); } @@ -196,8 +226,10 @@ void SND_SkipSeq(int player, u32 ticks) { SND_StopIntervalTimer(); u32 i; - for (i = 0; i < ticks; i++) { - if (PlayerStepTicks(ply, 0)) { + for (i = 0; i < ticks; i++) + { + if (PlayerStepTicks(ply, 0)) + { PlayerStop(ply); break; } @@ -205,33 +237,42 @@ void SND_SkipSeq(int player, u32 ticks) { SND_StartIntervalTimer(); - if (SNDi_SharedWork) { + if (SNDi_SharedWork) + { SNDi_SharedWork->players[ply->playerId].tickCounter += i; } } -void SND_SetTrackMute(int player, u32 trackMask, int muteMode) { +void SND_SetTrackMute(int player, u32 trackMask, int muteMode) +{ struct SNDPlayer *ply = &SNDi_Work.players[player]; - for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER && trackMask != 0; i++, trackMask >>= 1) { - if (trackMask & 1) { + for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER && trackMask != 0; i++, trackMask >>= 1) + { + if (trackMask & 1) + { struct SNDTrack *trk = PlayerGetTrack(ply, i); - - if (trk) { + + if (trk) + { TrackMute(trk, ply, muteMode); } } } } -void SND_SetTrackAllocatableChannel(int player, u32 trackMask, u32 channelMask) { +void SND_SetTrackAllocatableChannel(int player, u32 trackMask, u32 channelMask) +{ struct SNDPlayer *ply = &SNDi_Work.players[player]; - for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER && trackMask != 0; i++, trackMask >>= 1) { - if (trackMask & 1) { + for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER && trackMask != 0; i++, trackMask >>= 1) + { + if (trackMask & 1) + { struct SNDTrack *trk = PlayerGetTrack(ply, i); - if (trk) { + if (trk) + { trk->channelMask = (u16)channelMask; trk->flags.channelMask = TRUE; } @@ -239,25 +280,29 @@ void SND_SetTrackAllocatableChannel(int player, u32 trackMask, u32 channelMask) } } -void SND_InvalidateSeq(const void *start, const void *end) { +void SND_InvalidateSeq(const void *start, const void *end) +{ struct SNDPlayer *ply; struct SNDTrack *trk; int i; int j; - for (i = 0; i < SND_PLAYER_COUNT; i++) { + for (i = 0; i < SND_PLAYER_COUNT; i++) + { ply = &SNDi_Work.players[i]; if (!ply->flags.active) continue; - - for (j = 0; j < SND_TRACK_COUNT_PER_PLAYER; j++) { + + for (j = 0; j < SND_TRACK_COUNT_PER_PLAYER; j++) + { trk = PlayerGetTrack(ply, j); if (!trk) continue; - - if (start <= trk->cur && trk->cur <= end) { + + if (start <= trk->cur && trk->cur <= end) + { PlayerStop(ply); break; } @@ -265,8 +310,10 @@ void SND_InvalidateSeq(const void *start, const void *end) { } } -void SND_InvalidateBank(const void *start, const void *end) { - for (int i = 0; i < SND_PLAYER_COUNT; i++) { +void SND_InvalidateBank(const void *start, const void *end) +{ + for (int i = 0; i < SND_PLAYER_COUNT; i++) + { struct SNDPlayer *ply = &SNDi_Work.players[i]; if (ply->flags.active && start <= ply->bank && ply->bank <= end) @@ -274,49 +321,55 @@ void SND_InvalidateBank(const void *start, const void *end) { } } -void SNDi_SetPlayerParam(int player, u32 offset, u32 data, int size) { +void SNDi_SetPlayerParam(int player, u32 offset, u32 data, int size) +{ struct SNDPlayer *ply = &SNDi_Work.players[player]; - switch (size) { - case 1: - *(u8 *)((u8 *)ply + offset) = (u8)data; - break; - case 2: - *(u16 *)((u8 *)ply + offset) = (u16)data; - break; - case 4: - *(u32 *)((u8 *)ply + offset) = (u32)data; - break; + switch (size) + { + case 1: + *(u8 *)((u8 *)ply + offset) = (u8)data; + break; + case 2: + *(u16 *)((u8 *)ply + offset) = (u16)data; + break; + case 4: + *(u32 *)((u8 *)ply + offset) = (u32)data; + break; } } -void SNDi_SetTrackParam(int player, u32 trackMask, u32 offset, u32 data, int size) { +void SNDi_SetTrackParam(int player, u32 trackMask, u32 offset, u32 data, int size) +{ struct SNDPlayer *ply = &SNDi_Work.players[player]; - for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER && trackMask != 0; i++, trackMask >>= 1) { + for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER && trackMask != 0; i++, trackMask >>= 1) + { if (!(trackMask & 1)) continue; - + struct SNDTrack *trk = PlayerGetTrack(ply, i); if (!trk) continue; - switch (size) { - case 1: - *(u8 *)((u8 *)trk + offset) = (u8)data; - break; - case 2: - *(u16 *)((u8 *)trk + offset) = (u16)data; - break; - case 4: - *(u32 *)((u8 *)trk + offset) = (u32)data; - break; + switch (size) + { + case 1: + *(u8 *)((u8 *)trk + offset) = (u8)data; + break; + case 2: + *(u16 *)((u8 *)trk + offset) = (u16)data; + break; + case 4: + *(u32 *)((u8 *)trk + offset) = (u32)data; + break; } } } -static void SeqCacheFetch(const u8 *addr) { +static void SeqCacheFetch(const u8 *addr) +{ addr = (const u8 *)((u32)addr & ~3); sSeqCache.begin = addr; sSeqCache.end = sSeqCache.begin + 16; @@ -329,20 +382,23 @@ static void SeqCacheFetch(const u8 *addr) { sSeqCache.buf32[3] = src[3]; } -static u8 SeqReadByte(const u8 *addr) { +static u8 SeqReadByte(const u8 *addr) +{ if (addr < sSeqCache.begin || addr >= sSeqCache.end) SeqCacheFetch(addr); - + return sSeqCache.buf[(u32)addr - (u32)sSeqCache.begin]; } -static inline u8 TrackReadU8(struct SNDTrack *track) { +static inline u8 TrackReadU8(struct SNDTrack *track) +{ u8 retval = SeqReadByte(track->cur); track->cur++; return retval; } -static u16 TrackReadU16(struct SNDTrack *track) { +static u16 TrackReadU16(struct SNDTrack *track) +{ int retval; retval = TrackReadU8(track); @@ -351,7 +407,8 @@ static u16 TrackReadU16(struct SNDTrack *track) { return (u16)retval; } -static u32 TrackReadU24(struct SNDTrack *track) { +static u32 TrackReadU24(struct SNDTrack *track) +{ u32 retval; retval = TrackReadU8(track); @@ -361,19 +418,22 @@ static u32 TrackReadU24(struct SNDTrack *track) { return retval; } -static int TrackReadVLV(struct SNDTrack *track) { +static int TrackReadVLV(struct SNDTrack *track) +{ int retval = 0; int b; - do { + do + { b = TrackReadU8(track); retval = (retval << 7) | (b & 0x7F); - } while(b & 0x80); + } while (b & 0x80); return retval; } -static int TrackParseValue(struct SNDTrack *track, struct SNDPlayer *player, int valueType) { +static int TrackParseValue(struct SNDTrack *track, struct SNDPlayer *player, int valueType) +{ int retval; int hi; int lo; @@ -382,36 +442,38 @@ static int TrackParseValue(struct SNDTrack *track, struct SNDPlayer *player, int // BUG: undefined behavior if invalid valueType is passed (uninitialized return value) - switch (valueType) { - case SND_SEQ_VAL_U8: - retval = TrackReadU8(track); - break; - case SND_SEQ_VAL_U16: - retval = TrackReadU16(track); - break; - case SND_SEQ_VAL_VLV: - retval = TrackReadVLV(track); - break; - case SND_SEQ_VAL_VAR: - var = PlayerGetVariablePointer(player, TrackReadU8(track)); - if (var) - retval = *var; - break; - case SND_SEQ_VAL_RAN: - lo = TrackReadU16(track) << 16; - hi = (s16)TrackReadU16(track); - ran = SND_CalcRandom(); - retval = hi - (lo >> 16); - retval += 1; - retval = (ran * retval) >> 16; - retval += lo >> 16; - break; + switch (valueType) + { + case SND_SEQ_VAL_U8: + retval = TrackReadU8(track); + break; + case SND_SEQ_VAL_U16: + retval = TrackReadU16(track); + break; + case SND_SEQ_VAL_VLV: + retval = TrackReadVLV(track); + break; + case SND_SEQ_VAL_VAR: + var = PlayerGetVariablePointer(player, TrackReadU8(track)); + if (var) + retval = *var; + break; + case SND_SEQ_VAL_RAN: + lo = TrackReadU16(track) << 16; + hi = (s16)TrackReadU16(track); + ran = SND_CalcRandom(); + retval = hi - (lo >> 16); + retval += 1; + retval = (ran * retval) >> 16; + retval += lo >> 16; + break; } - + return retval; } -static void TrackInit(struct SNDTrack *track) { +static void TrackInit(struct SNDTrack *track) +{ track->base = NULL; track->cur = NULL; @@ -449,12 +511,14 @@ static void TrackInit(struct SNDTrack *track) { track->channelLLHead = NULL; } -static void TrackStart(struct SNDTrack *track, const void *seq, u32 offset) { +static void TrackStart(struct SNDTrack *track, const void *seq, u32 offset) +{ track->base = (const u8 *)seq; track->cur = &track->base[offset]; } -static void PlayerInit(struct SNDPlayer *player, struct SNDBankData *bank) { +static void PlayerInit(struct SNDPlayer *player, struct SNDBankData *bank) +{ player->flags.paused = FALSE; player->bank = bank; player->tempo = 120; @@ -464,24 +528,30 @@ static void PlayerInit(struct SNDPlayer *player, struct SNDBankData *bank) { player->extFader = 0; player->prio = 64; - for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) { + for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) + { player->tracks[i] = 0xFF; } - if (SNDi_SharedWork) { + if (SNDi_SharedWork) + { SNDi_SharedWork->players[player->playerId].tickCounter = 0; - for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) { + for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) + { SNDi_SharedWork->players[player->playerId].localVars[i] = -1; } } } -static void TrackReleaseChannels(struct SNDTrack *track, struct SNDPlayer *player, int release) { +static void TrackReleaseChannels(struct SNDTrack *track, struct SNDPlayer *player, int release) +{ TrackUpdateChannel(track, player, 0); - for (struct SNDExChannel *chn = track->channelLLHead; chn; chn = chn->channelLLNext) { - if (SND_IsExChannelActive(chn)) { + for (struct SNDExChannel *chn = track->channelLLHead; chn; chn = chn->channelLLNext) + { + if (SND_IsExChannelActive(chn)) + { if (release >= 0) SND_SetExChannelRelease(chn, release & 0xFF); chn->priority = 1; @@ -490,32 +560,39 @@ static void TrackReleaseChannels(struct SNDTrack *track, struct SNDPlayer *playe } } -static void TrackFreeChannels(struct SNDTrack *track) { - for (struct SNDExChannel *chn = track->channelLLHead; chn; chn = chn->channelLLNext) { +static void TrackFreeChannels(struct SNDTrack *track) +{ + for (struct SNDExChannel *chn = track->channelLLHead; chn; chn = chn->channelLLNext) + { SND_FreeExChannel(chn); } track->channelLLHead = NULL; } -static void PlayerSeqMain(struct SNDPlayer *player) { +static void PlayerSeqMain(struct SNDPlayer *player) +{ int ticks = 0; int tempoInc; int i; - while (player->tempoCounter >= SND_TIMER_RATE) { + while (player->tempoCounter >= SND_TIMER_RATE) + { player->tempoCounter -= SND_TIMER_RATE; ticks++; } - for (i = 0; i < ticks; i++) { - if (PlayerStepTicks(player, SND_PROC_PLAY_NOTES)) { + for (i = 0; i < ticks; i++) + { + if (PlayerStepTicks(player, SND_PROC_PLAY_NOTES)) + { PlayerStop(player); break; } } - if (SNDi_SharedWork) { + if (SNDi_SharedWork) + { SNDi_SharedWork->players[player->playerId].tickCounter += i; } @@ -526,57 +603,69 @@ static void PlayerSeqMain(struct SNDPlayer *player) { player->tempoCounter += tempoInc; } -static struct SNDTrack *PlayerGetTrack(struct SNDPlayer *player, int track) { +static struct SNDTrack *PlayerGetTrack(struct SNDPlayer *player, int track) +{ if (track > (SND_TRACK_COUNT_PER_PLAYER - 1)) return NULL; - + if (player->tracks[track] == 0xFF) return NULL; - + return &SNDi_Work.tracks[player->tracks[track]]; } -static void TrackStop(struct SNDTrack *track, struct SNDPlayer *player) { +static void TrackStop(struct SNDTrack *track, struct SNDPlayer *player) +{ TrackReleaseChannels(track, player, -1); TrackFreeChannels(track); } -static void PlayerStopTrack(struct SNDPlayer *player, int trackIdx) { +static void PlayerStopTrack(struct SNDPlayer *player, int trackIdx) +{ struct SNDTrack *track = PlayerGetTrack(player, trackIdx); if (track == NULL) return; - + TrackStop(track, player); SNDi_Work.tracks[player->tracks[trackIdx]].flags.active = FALSE; player->tracks[trackIdx] = 0xFF; } -static void PlayerStop(struct SNDPlayer *player) { - for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) { +static void PlayerStop(struct SNDPlayer *player) +{ + for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) + { PlayerStopTrack(player, i); } player->flags.active = FALSE; } -static void ChannelCallback(struct SNDExChannel *chn, int status, void *track_) { +static void ChannelCallback(struct SNDExChannel *chn, int status, void *track_) +{ struct SNDExChannel *cur; struct SNDTrack *track; - + track = (struct SNDTrack *)track_; - if (status == 1) { + if (status == 1) + { chn->priority = 0; SND_FreeExChannel(chn); } - if (track->channelLLHead == chn) { + if (track->channelLLHead == chn) + { track->channelLLHead = chn->channelLLNext; - } else { + } + else + { cur = track->channelLLHead; - while (cur->channelLLNext) { - if (cur->channelLLNext == chn) { + while (cur->channelLLNext) + { + if (cur->channelLLNext == chn) + { cur->channelLLNext = chn->channelLLNext; return; } @@ -585,15 +674,15 @@ static void ChannelCallback(struct SNDExChannel *chn, int status, void *track_) } } -static void TrackUpdateChannel(struct SNDTrack *track, struct SNDPlayer *player, int release) { +static void TrackUpdateChannel(struct SNDTrack *track, struct SNDPlayer *player, int release) +{ int vol; int fader; int pan; int pitch; - vol = SNDi_DecibelSquareTable[track->volume] + - SNDi_DecibelSquareTable[track->expression] + - SNDi_DecibelSquareTable[player->volume]; + vol = SNDi_DecibelSquareTable[track->volume] + SNDi_DecibelSquareTable[track->expression] + + SNDi_DecibelSquareTable[player->volume]; fader = track->extFader + player->extFader; @@ -606,21 +695,22 @@ static void TrackUpdateChannel(struct SNDTrack *track, struct SNDPlayer *player, if (track->panRange != 127) pan = (pan * track->panRange + 0x40) >> 7; - + pan += track->extPan; if (vol < -0x8000) vol = -0x8000; - + if (fader < -0x8000) fader = -0x8000; - + if (pan < -128) pan = -128; else if (pan > 127) pan = 127; - - for (struct SNDExChannel *chn = track->channelLLHead; chn != NULL; chn = chn->channelLLNext) { + + for (struct SNDExChannel *chn = track->channelLLHead; chn != NULL; chn = chn->channelLLNext) + { chn->userDecay2 = (short)fader; if (chn->envStatus == 3) @@ -632,65 +722,81 @@ static void TrackUpdateChannel(struct SNDTrack *track, struct SNDPlayer *player, chn->panRange = track->panRange; chn->lfo.param = track->mod; - if (chn->length == 0 && release != 0) { + if (chn->length == 0 && release != 0) + { chn->priority = 1; SND_ReleaseExChannel(chn); } } } -static void PlayerUpdateChannel(struct SNDPlayer *player) { - for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) { +static void PlayerUpdateChannel(struct SNDPlayer *player) +{ + for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) + { struct SNDTrack *trk = PlayerGetTrack(player, i); - if (trk) { + if (trk) + { TrackUpdateChannel(trk, player, 1); } } } -static void TrackPlayNote(struct SNDTrack *track, struct SNDPlayer *player, int midiKey, int velocity, int length) { +static void TrackPlayNote( + struct SNDTrack *track, struct SNDPlayer *player, int midiKey, int velocity, int length) +{ struct SNDExChannel *chn = NULL; - if (track->flags.tie) { + if (track->flags.tie) + { chn = track->channelLLHead; - if (chn) { + if (chn) + { chn->midiKey = (u8)midiKey; chn->velocity = (u8)velocity; } } - if (chn == NULL) { + if (chn == NULL) + { struct SNDInstData inst; if (!SND_ReadInstData(player->bank, track->program, midiKey, &inst)) return; u32 allowedChannels; - switch (inst.type) { - case SND_INST_PCM: - case SND_INST_DIRECTPCM: - // all channels support PCM - allowedChannels = 0xFFFF; - break; - case SND_INST_PSG: - // only channels 8, 9, 10, 11, 12, 13 support PSG - allowedChannels = 0x3F00; - break; - case SND_INST_NOISE: - // only channels 14 and 15 support noise - allowedChannels = 0xC000; - break; - default: - return; + switch (inst.type) + { + case SND_INST_PCM: + case SND_INST_DIRECTPCM: + // all channels support PCM + allowedChannels = 0xFFFF; + break; + case SND_INST_PSG: + // only channels 8, 9, 10, 11, 12, 13 support PSG + allowedChannels = 0x3F00; + break; + case SND_INST_NOISE: + // only channels 14 and 15 support noise + allowedChannels = 0xC000; + break; + default: + return; } allowedChannels &= track->channelMask; - chn = SND_AllocExChannel(allowedChannels, player->prio + track->priority, track->flags.channelMask, ChannelCallback, track); + chn = SND_AllocExChannel(allowedChannels, + player->prio + track->priority, + track->flags.channelMask, + ChannelCallback, + track); if (chn == NULL) return; - - if (!SND_NoteOn(chn, midiKey, velocity, track->flags.tie ? -1 : length, player->bank, &inst)) { + + if (!SND_NoteOn( + chn, midiKey, velocity, track->flags.tie ? -1 : length, player->bank, &inst)) + { chn->priority = 0; SND_FreeExChannel(chn); return; @@ -702,7 +808,7 @@ static void TrackPlayNote(struct SNDTrack *track, struct SNDPlayer *player, int if (track->envAttack != 0xFF) SND_SetExChannelAttack(chn, track->envAttack); - + if (track->envDecay != 0xFF) SND_SetExChannelDecay(chn, track->envDecay); @@ -711,15 +817,18 @@ static void TrackPlayNote(struct SNDTrack *track, struct SNDPlayer *player, int if (track->envRelease != 0xFF) SND_SetExChannelRelease(chn, track->envRelease); - + chn->sweepPitch = track->sweepPitch; if (track->flags.portamento) chn->sweepPitch += (short)((track->portamentoKey - midiKey) << 6); - - if (track->portamentoTime == 0) { + + if (track->portamentoTime == 0) + { chn->sweepLength = length; chn->flags.autoSweep = FALSE; - } else { + } + else + { int swp = track->portamentoTime * track->portamentoTime; swp *= chn->sweepPitch < 0 ? -chn->sweepPitch : chn->sweepPitch; swp >>= 11; @@ -729,7 +838,9 @@ static void TrackPlayNote(struct SNDTrack *track, struct SNDPlayer *player, int chn->sweepCounter = 0; } -static int TrackStepTicks(struct SNDTrack *track, struct SNDPlayer *player, int trackIdx, u32 playNotes) { +static int TrackStepTicks( + struct SNDTrack *track, struct SNDPlayer *player, int trackIdx, u32 playNotes) +{ (void)trackIdx; struct SNDExChannel *chn; @@ -742,22 +853,24 @@ static int TrackStepTicks(struct SNDTrack *track, struct SNDPlayer *player, int s32 par; - - for (chn = track->channelLLHead; chn; chn = chn->channelLLNext) { + for (chn = track->channelLLHead; chn; chn = chn->channelLLNext) + { if (chn->length > 0) chn->length--; - + if (!chn->flags.autoSweep && chn->sweepCounter < chn->sweepLength) chn->sweepCounter++; } - if (track->flags.noteFinishWait) { + if (track->flags.noteFinishWait) + { if (track->channelLLHead) return 0; track->flags.noteFinishWait = FALSE; } - if (track->wait > 0) { + if (track->wait > 0) + { track->wait--; if (track->wait > 0) return 0; @@ -765,30 +878,35 @@ static int TrackStepTicks(struct SNDTrack *track, struct SNDPlayer *player, int SeqCacheFetch(track->cur); - while (track->wait == 0 && !track->flags.noteFinishWait) { + while (track->wait == 0 && !track->flags.noteFinishWait) + { specialValueType = FALSE; runCmd = TRUE; cmd = TrackReadU8(track); - if (cmd == 0xA2) { + if (cmd == 0xA2) + { cmd = TrackReadU8(track); runCmd = track->flags.cmp; } - if (cmd == 0xA0) { + if (cmd == 0xA0) + { cmd = TrackReadU8(track); valueType = SND_SEQ_VAL_RAN; specialValueType = TRUE; } - if (cmd == 0xA1) { + if (cmd == 0xA1) + { cmd = TrackReadU8(track); valueType = SND_SEQ_VAL_VAR; specialValueType = TRUE; } - if ((cmd & 0x80) == 0) { + if ((cmd & 0x80) == 0) + { par = TrackReadU8(track); length = TrackParseValue(track, player, specialValueType ? valueType : SND_SEQ_VAL_VLV); @@ -796,22 +914,26 @@ static int TrackStepTicks(struct SNDTrack *track, struct SNDPlayer *player, int if (!runCmd) continue; - + if (midiKey < 0) midiKey = 0; - else if (midiKey > 127) { + else if (midiKey > 127) + { midiKey = 127; } - if (!track->flags.muted && playNotes != 0) { + if (!track->flags.muted && playNotes != 0) + { TrackPlayNote(track, player, midiKey, par, (length > 0) ? length : -1); } - + track->portamentoKey = (u8)midiKey; - if (track->flags.noteWait) { + if (track->flags.noteWait) + { track->wait = length; - if (length == 0) { + if (length == 0) + { track->flags.noteFinishWait = TRUE; } } @@ -819,157 +941,168 @@ static int TrackStepTicks(struct SNDTrack *track, struct SNDPlayer *player, int continue; } - switch (cmd & 0xF0) { - case 0x80: - par = TrackParseValue(track, player, specialValueType ? valueType : SND_SEQ_VAL_VLV); - if (!runCmd) - break; - - switch (cmd) { + switch (cmd & 0xF0) + { case 0x80: - track->wait = par; - break; - case 0x81: - if (par < 0x10000) - track->program = (u16)par; - break; - } - break; - case 0x90: - switch (cmd) { - case 0x93: - { - u32 off; - struct SNDTrack *newTrack; - - par = TrackReadU8(track); - off = TrackReadU24(track); - if (!runCmd) - break; + par = + TrackParseValue(track, player, specialValueType ? valueType : SND_SEQ_VAL_VLV); + if (!runCmd) + break; - newTrack = PlayerGetTrack(player, par); - if (newTrack && newTrack != track) { - TrackStop(newTrack, player); - TrackStart(newTrack, track->base, off); - } - } - break; - case 0x94: + switch (cmd) { - u32 off = TrackReadU24(track); - if (!runCmd) + case 0x80: + track->wait = par; + break; + case 0x81: + if (par < 0x10000) + track->program = (u16)par; break; - track->cur = &track->base[off]; } break; - case 0x95: + case 0x90: + switch (cmd) { - u32 off = TrackReadU24(track); - if (!runCmd) - break; + case 0x93: + { + u32 off; + struct SNDTrack *newTrack; - if (track->callStackDepth < SND_TRACK_MAX_CALL) { - track->posCallStack[track->callStackDepth] = track->cur; - track->callStackDepth++; + par = TrackReadU8(track); + off = TrackReadU24(track); + if (!runCmd) + break; + + newTrack = PlayerGetTrack(player, par); + if (newTrack && newTrack != track) + { + TrackStop(newTrack, player); + TrackStart(newTrack, track->base, off); + } + } + break; + case 0x94: + { + u32 off = TrackReadU24(track); + if (!runCmd) + break; track->cur = &track->base[off]; } break; + case 0x95: + { + u32 off = TrackReadU24(track); + if (!runCmd) + break; + + if (track->callStackDepth < SND_TRACK_MAX_CALL) + { + track->posCallStack[track->callStackDepth] = track->cur; + track->callStackDepth++; + track->cur = &track->base[off]; + } + break; + } } - } - break; - case 0xC0: - case 0xD0: + break; + case 0xC0: + case 0xD0: { - union { + union + { u8 _u8; s8 _s8; } par; - par._u8 = (u8)TrackParseValue(track, player, specialValueType ? valueType : SND_SEQ_VAL_U8); + par._u8 = (u8)TrackParseValue( + track, player, specialValueType ? valueType : SND_SEQ_VAL_U8); if (!runCmd) break; - switch (cmd) { - case 0xC1: - track->volume = par._u8; - break; - case 0xD5: - track->expression = par._u8; - break; - case 0xC2: - player->volume = par._u8; - break; - case 0xC5: - track->bendRange = par._u8; - break; - case 0xC6: - track->priority = par._u8; - break; - case 0xC7: - track->flags.noteWait = par._u8; - break; - case 0xCF: - track->portamentoTime = par._u8; - break; - case 0xCA: - track->mod.depth = par._u8; - break; - case 0xCB: - track->mod.speed = par._u8; - break; - case 0xCC: - track->mod.target = par._u8; - break; - case 0xCD: - track->mod.range = par._u8; - break; - case 0xD0: - track->envAttack = par._u8; - break; - case 0xD1: - track->envDecay = par._u8; - break; - case 0xD2: - track->envSustain = par._u8; - break; - case 0xD3: - track->envRelease = par._u8; - break; - case 0xD4: - if (track->callStackDepth < SND_TRACK_MAX_CALL) { - track->posCallStack[track->callStackDepth] = track->cur; - track->loopCount[track->callStackDepth] = par._u8; - track->callStackDepth++; - } - break; - case 0xC8: - track->flags.tie = par._u8; - TrackReleaseChannels(track, player, -1); - TrackFreeChannels(track); - break; - case 0xD7: - TrackMute(track, player, par._u8); - break; - case 0xC9: - track->portamentoKey = (u8)(par._u8 + track->transpose); - track->flags.portamento = TRUE; - break; - case 0xCE: - track->flags.portamento = par._u8; - break; - case 0xC3: - track->transpose = par._s8; - break; - case 0xC4: - track->pitchBend = par._s8; - break; - case 0xC0: - track->pan = (s8)(par._u8 - 0x40); - break; - case 0xD6: + switch (cmd) + { + case 0xC1: + track->volume = par._u8; + break; + case 0xD5: + track->expression = par._u8; + break; + case 0xC2: + player->volume = par._u8; + break; + case 0xC5: + track->bendRange = par._u8; + break; + case 0xC6: + track->priority = par._u8; + break; + case 0xC7: + track->flags.noteWait = par._u8; + break; + case 0xCF: + track->portamentoTime = par._u8; + break; + case 0xCA: + track->mod.depth = par._u8; + break; + case 0xCB: + track->mod.speed = par._u8; + break; + case 0xCC: + track->mod.target = par._u8; + break; + case 0xCD: + track->mod.range = par._u8; + break; + case 0xD0: + track->envAttack = par._u8; + break; + case 0xD1: + track->envDecay = par._u8; + break; + case 0xD2: + track->envSustain = par._u8; + break; + case 0xD3: + track->envRelease = par._u8; + break; + case 0xD4: + if (track->callStackDepth < SND_TRACK_MAX_CALL) + { + track->posCallStack[track->callStackDepth] = track->cur; + track->loopCount[track->callStackDepth] = par._u8; + track->callStackDepth++; + } + break; + case 0xC8: + track->flags.tie = par._u8; + TrackReleaseChannels(track, player, -1); + TrackFreeChannels(track); + break; + case 0xD7: + TrackMute(track, player, par._u8); + break; + case 0xC9: + track->portamentoKey = (u8)(par._u8 + track->transpose); + track->flags.portamento = TRUE; + break; + case 0xCE: + track->flags.portamento = par._u8; + break; + case 0xC3: + track->transpose = par._s8; + break; + case 0xC4: + track->pitchBend = par._s8; + break; + case 0xC0: + track->pan = (s8)(par._u8 - 0x40); + break; + case 0xD6: { s16 *varPtr; - if (sPrintEnabled) { + if (sPrintEnabled) + { varPtr = PlayerGetVariablePointer(player, par._u8); } } @@ -977,30 +1110,33 @@ static int TrackStepTicks(struct SNDTrack *track, struct SNDPlayer *player, int } } break; - case 0xE0: + case 0xE0: { - s16 par = (s16)TrackParseValue(track, player, specialValueType ? valueType : SND_SEQ_VAL_U16); + s16 par = (s16)TrackParseValue( + track, player, specialValueType ? valueType : SND_SEQ_VAL_U16); if (!runCmd) break; - switch (cmd) { - case 0xE3: - track->sweepPitch = par; - break; - case 0xE1: - player->tempo = (u16)par; - break; - case 0xE0: - track->mod.delay = (u16)par; - break; + switch (cmd) + { + case 0xE3: + track->sweepPitch = par; + break; + case 0xE1: + player->tempo = (u16)par; + break; + case 0xE0: + track->mod.delay = (u16)par; + break; } } break; - case 0xB0: + case 0xB0: { int varNum = TrackReadU8(track); - s16 par = (s16)TrackParseValue(track, player, specialValueType ? valueType : SND_SEQ_VAL_U16); + s16 par = (s16)TrackParseValue( + track, player, specialValueType ? valueType : SND_SEQ_VAL_U16); s16 *varPtr = PlayerGetVariablePointer(player, varNum); if (!runCmd) @@ -1009,33 +1145,35 @@ static int TrackStepTicks(struct SNDTrack *track, struct SNDPlayer *player, int if (varPtr == NULL) break; - switch (cmd) { - case 0xB0: - *varPtr = par; - break; - case 0xB1: - *varPtr += par; - break; - case 0xB2: - *varPtr -= par; - break; - case 0xB3: - *varPtr *= par; - break; - case 0xB4: - if (par != 0) - *varPtr /= par; - break; - case 0xB5: - if (par >= 0) - *varPtr <<= par; - else - *varPtr >>= -par; - break; - case 0xB6: + switch (cmd) + { + case 0xB0: + *varPtr = par; + break; + case 0xB1: + *varPtr += par; + break; + case 0xB2: + *varPtr -= par; + break; + case 0xB3: + *varPtr *= par; + break; + case 0xB4: + if (par != 0) + *varPtr /= par; + break; + case 0xB5: + if (par >= 0) + *varPtr <<= par; + else + *varPtr >>= -par; + break; + case 0xB6: { BOOL neg = FALSE; - if (par < 0) { + if (par < 0) + { neg = TRUE; par = (s16)(-par); } @@ -1046,77 +1184,84 @@ static int TrackStepTicks(struct SNDTrack *track, struct SNDPlayer *player, int *varPtr = (s16)random; } break; - case 0xB7: - break; - case 0xB8: - track->flags.cmp = *varPtr == par; - break; - case 0xB9: - track->flags.cmp = *varPtr >= par; - break; - case 0xBA: - track->flags.cmp = *varPtr > par; - break; - case 0xBB: - track->flags.cmp = *varPtr <= par; - break; - case 0xBC: - track->flags.cmp = *varPtr < par; - break; - case 0xBD: - track->flags.cmp = *varPtr != par; - break; + case 0xB7: + break; + case 0xB8: + track->flags.cmp = *varPtr == par; + break; + case 0xB9: + track->flags.cmp = *varPtr >= par; + break; + case 0xBA: + track->flags.cmp = *varPtr > par; + break; + case 0xBB: + track->flags.cmp = *varPtr <= par; + break; + case 0xBC: + track->flags.cmp = *varPtr < par; + break; + case 0xBD: + track->flags.cmp = *varPtr != par; + break; } } break; - case 0xF0: - if (!runCmd) - break; - - switch (cmd) { - case 0xFD: - if (track->callStackDepth != 0) { - track->callStackDepth--; - track->cur = track->posCallStack[track->callStackDepth]; - } - break; - case 0xFC: - { - if (track->callStackDepth == 0) - break; + case 0xF0: + if (!runCmd) + break; - // gosh, this was nasty to figure out - u8 loopCount = track->loopCount[track->callStackDepth - 1]; - if (loopCount != 0) { - loopCount--; - if (loopCount == 0) { + switch (cmd) + { + case 0xFD: + if (track->callStackDepth != 0) + { track->callStackDepth--; + track->cur = track->posCallStack[track->callStackDepth]; + } + break; + case 0xFC: + { + if (track->callStackDepth == 0) break; + + // gosh, this was nasty to figure out + u8 loopCount = track->loopCount[track->callStackDepth - 1]; + if (loopCount != 0) + { + loopCount--; + if (loopCount == 0) + { + track->callStackDepth--; + break; + } } + track->loopCount[track->callStackDepth - 1] = loopCount; + track->cur = track->posCallStack[track->callStackDepth - 1]; } - track->loopCount[track->callStackDepth - 1] = loopCount; - track->cur = track->posCallStack[track->callStackDepth - 1]; + break; + case 0xFE: + break; + case 0xFF: + return -1; } break; - case 0xFE: - break; - case 0xFF: - return -1; - } - break; } } return 0; } -static BOOL PlayerStepTicks(struct SNDPlayer *player, u32 ticks) { +static BOOL PlayerStepTicks(struct SNDPlayer *player, u32 ticks) +{ BOOL isPlaying = FALSE; - for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) { + for (int i = 0; i < SND_TRACK_COUNT_PER_PLAYER; i++) + { struct SNDTrack *trk = PlayerGetTrack(player, i); - if (trk && trk->cur) { + if (trk && trk->cur) + { if (TrackStepTicks(trk, player, i, ticks)) PlayerStopTrack(player, i); else @@ -1127,19 +1272,26 @@ static BOOL PlayerStepTicks(struct SNDPlayer *player, u32 ticks) { return !isPlaying; } -static s16 *PlayerGetVariablePointer(const struct SNDPlayer *player, int var) { +static s16 *PlayerGetVariablePointer(const struct SNDPlayer *player, int var) +{ if (SNDi_SharedWork == NULL) return NULL; - else if (var < 16) { + else if (var < 16) + { return &SNDi_SharedWork->players[player->playerId].localVars[var]; - } else { + } + else + { return &SNDi_SharedWork->globalVars[var - 16]; } } -static int AllocateTrack(void) { - for (int i = 0; i < SND_TRACK_COUNT; i++) { - if (!SNDi_Work.tracks[i].flags.active) { +static int AllocateTrack(void) +{ + for (int i = 0; i < SND_TRACK_COUNT; i++) + { + if (!SNDi_Work.tracks[i].flags.active) + { SNDi_Work.tracks[i].flags.active = TRUE; return i; } @@ -1148,22 +1300,24 @@ static int AllocateTrack(void) { return -1; } -static void TrackMute(struct SNDTrack *track, struct SNDPlayer *player, int muteMode) { - switch (muteMode) { - case SND_TRACK_MUTE_MODE_UNMUTE: - track->flags.muted = FALSE; - break; - case SND_TRACK_MUTE_MODE_MUTE: - track->flags.muted = TRUE; - break; - case SND_TRACK_MUTE_MODE_MUTE_RELEASE: - track->flags.muted = TRUE; - TrackReleaseChannels(track, player, -1); - break; - case SND_TRACK_MUTE_MODE_MUTE_STOP: - track->flags.muted = TRUE; - TrackReleaseChannels(track, player, 127); - TrackFreeChannels(track); - break; +static void TrackMute(struct SNDTrack *track, struct SNDPlayer *player, int muteMode) +{ + switch (muteMode) + { + case SND_TRACK_MUTE_MODE_UNMUTE: + track->flags.muted = FALSE; + break; + case SND_TRACK_MUTE_MODE_MUTE: + track->flags.muted = TRUE; + break; + case SND_TRACK_MUTE_MODE_MUTE_RELEASE: + track->flags.muted = TRUE; + TrackReleaseChannels(track, player, -1); + break; + case SND_TRACK_MUTE_MODE_MUTE_STOP: + track->flags.muted = TRUE; + TrackReleaseChannels(track, player, 127); + TrackFreeChannels(track); + break; } } diff --git a/arm7/lib/src/SND_util.c b/arm7/lib/src/SND_util.c index 6a939c02..c9a98c3f 100644 --- a/arm7/lib/src/SND_util.c +++ b/arm7/lib/src/SND_util.c @@ -5,16 +5,19 @@ // TODO remove this extern once the static const definition of it is here extern s8 sLfoSinTable[0x21]; -u16 SND_CalcTimer(int timer, int pitch) { +u16 SND_CalcTimer(int timer, int pitch) +{ int octave = 0; int pitch_normalized = -pitch; - while (pitch_normalized < 0) { + while (pitch_normalized < 0) + { octave--; pitch_normalized += 768; } - while (pitch_normalized >= 768) { + while (pitch_normalized >= 768) + { octave++; pitch_normalized -= 768; } @@ -23,19 +26,24 @@ u16 SND_CalcTimer(int timer, int pitch) { result += 0x10000; result *= timer; - + int shift = octave - 16; - if (shift <= 0) { + if (shift <= 0) + { shift = -shift; result >>= shift; - } else if (shift < 32) { + } + else if (shift < 32) + { // what ??? u64 tmp = result & ~0uLL << (32 - shift); if (tmp != 0) return 0xFFFF; result <<= shift; - } else { + } + else + { return 0xFFFF; } @@ -47,7 +55,8 @@ u16 SND_CalcTimer(int timer, int pitch) { return (u16)result; } -u16 SND_CalcChannelVolume(int value) { +u16 SND_CalcChannelVolume(int value) +{ if (value < SND_VOL_DB_MIN) value = SND_VOL_DB_MIN; else if (value > 0) @@ -68,21 +77,30 @@ u16 SND_CalcChannelVolume(int value) { return (u16)(result | (div << 8)); } -s8 SND_SinIdx(int x) { +s8 SND_SinIdx(int x) +{ // BUG: UB for out of range values - - if (x < 0x20) { + + if (x < 0x20) + { return sLfoSinTable[x]; - } else if (x < 0x40) { + } + else if (x < 0x40) + { return sLfoSinTable[0x40 - x]; - } else if (x < 0x60) { + } + else if (x < 0x60) + { return (s8)(-sLfoSinTable[x - 0x40]); - } else { + } + else + { return (s8)(-sLfoSinTable[0x20 - (x - 0x60)]); } } -u16 SND_CalcRandom(void) { +u16 SND_CalcRandom(void) +{ static u32 state = 0x12345678; // values from "Numerical Recipes" diff --git a/arm7/lib/src/SND_work.c b/arm7/lib/src/SND_work.c index d40ccdc6..2256ee3f 100644 --- a/arm7/lib/src/SND_work.c +++ b/arm7/lib/src/SND_work.c @@ -1,28 +1,32 @@ #include "SND_work.h" +#include "SND_capture.h" #include "SND_channel.h" #include "SND_exChannel.h" -#include "SND_capture.h" struct SNDWork SNDi_Work; struct SNDSharedWork *SNDi_SharedWork; -void SND_SetPlayerLocalVariable(int player, int var, s16 value) { +void SND_SetPlayerLocalVariable(int player, int var, s16 value) +{ SNDi_SharedWork->players[player].localVars[var] = value; } -void SND_SetPlayerGlobalVariable(int var, s16 value) { +void SND_SetPlayerGlobalVariable(int var, s16 value) +{ SNDi_SharedWork->globalVars[var] = value; } -void SND_UpdateSharedWork(void) { +void SND_UpdateSharedWork(void) +{ u16 channelActiveMask = 0; u16 channelCaptureMask = 0; if (SNDi_SharedWork == NULL) return; - - for (s32 i = 0; i < SND_CHANNEL_COUNT; i++) { + + for (s32 i = 0; i < SND_CHANNEL_COUNT; i++) + { if (SND_IsChannelActive(i)) channelActiveMask |= 1 << i; } diff --git a/include/nitro/SND_alarm_shared.h b/include/nitro/SND_alarm_shared.h index a1e8ed9d..2c9e02e4 100644 --- a/include/nitro/SND_alarm_shared.h +++ b/include/nitro/SND_alarm_shared.h @@ -13,18 +13,19 @@ #ifndef POKEDIAMOND_SND_ALARM_SHARED_H #define POKEDIAMOND_SND_ALARM_SHARED_H -#include "nitro/OS_tick_shared.h" #include "nitro/OS_alarm_shared.h" +#include "nitro/OS_tick_shared.h" -struct SNDAlarm { - u8 enable; // 0x00 - u8 id; // 0x01 - u16 unk_2; // 0x02 - OSTick tick; // 0x04 - OSTick period; // 0x0C - OSAlarm alarm; // 0x14 -}; // size = 0x40 +struct SNDAlarm +{ + u8 enable; // 0x00 + u8 id; // 0x01 + u16 unk_2; // 0x02 + OSTick tick; // 0x04 + OSTick period; // 0x0C + OSAlarm alarm; // 0x14 +}; // size = 0x40 #define SND_ALARM_COUNT 8 -#endif //POKEDIAMOND_SND_ALARM_SHARED_H +#endif // POKEDIAMOND_SND_ALARM_SHARED_H diff --git a/include/nitro/SND_bank_shared.h b/include/nitro/SND_bank_shared.h index f5292bcc..02fe7bba 100644 --- a/include/nitro/SND_bank_shared.h +++ b/include/nitro/SND_bank_shared.h @@ -8,14 +8,14 @@ #define SND_INST_MAX_KEYSPLIT 8 -#define SND_INST_ILLEGAL 0 -#define SND_INST_PCM 1 -#define SND_INST_PSG 2 -#define SND_INST_NOISE 3 -#define SND_INST_DIRECTPCM 4 -#define SND_INST_DUMMY 5 +#define SND_INST_ILLEGAL 0 +#define SND_INST_PCM 1 +#define SND_INST_PSG 2 +#define SND_INST_NOISE 3 +#define SND_INST_DIRECTPCM 4 +#define SND_INST_DUMMY 5 #define SND_INST_DRUM_TABLE 16 -#define SND_INST_KEY_SPLIT 17 +#define SND_INST_KEY_SPLIT 17 #define SND_BANK_MAX_WAVEARC 4 @@ -24,65 +24,74 @@ #define SND_INST_OFFSET_DRUMS(bank, off) ((struct SNDDrumSet *)((u8 *)bank + (u32)(off >> 8))) #define SND_INST_OFFSET_KEYSPL(bank, off) ((struct SNDKeySplit *)((u8 *)bank + (u32)(off >> 8))) -struct SNDInstParam { - u16 wave[2]; // 0x0 - u8 rootKey; // 0x4 - u8 envAttack; // 0x5 - u8 envDecay; // 0x6 - u8 envSustain; // 0x7 - u8 envRelease; // 0x8 - u8 pan; // 0x9 -}; // size = 0xA - -struct SNDInstData { - u8 type; // 0x0 - u8 unk_1; // 0x1 - struct SNDInstParam param; // 0x2 -}; // size = 0xC - -struct SNDKeySplit { - u8 key[SND_INST_MAX_KEYSPLIT]; // 0x0 - struct SNDInstData instruments[]; // 0x8 -}; // size = 0x8 - -struct SNDDrumSet { +struct SNDInstParam +{ + u16 wave[2]; // 0x0 + u8 rootKey; // 0x4 + u8 envAttack; // 0x5 + u8 envDecay; // 0x6 + u8 envSustain; // 0x7 + u8 envRelease; // 0x8 + u8 pan; // 0x9 +}; // size = 0xA + +struct SNDInstData +{ + u8 type; // 0x0 + u8 unk_1; // 0x1 + struct SNDInstParam param; // 0x2 +}; // size = 0xC + +struct SNDKeySplit +{ + u8 key[SND_INST_MAX_KEYSPLIT]; // 0x0 + struct SNDInstData instruments[]; // 0x8 +}; // size = 0x8 + +struct SNDDrumSet +{ u8 minKey; u8 maxKey; struct SNDInstData instruments[]; -}; // size = 0x2 +}; // size = 0x2 struct SNDWaveArc; -struct SNDWaveArcLink { - struct SNDWaveArc *waveArc; // 0x0 - struct SNDWaveArcLink *waveArcLLnext; // 0x4 -}; // size = 0x8 - -struct SNDBankData { - struct SNDBinaryFileHeader fileHeader; // 0x00 - struct SNDBinaryBlockHeader blockHeader; // 0x10 - struct SNDWaveArcLink waveArcLinks[SND_BANK_MAX_WAVEARC]; // 0x18 - u32 instCount; // 0x38 - u32 instOffsets[]; // 0x3C -}; // size = 0x40 - -struct SNDWaveArc { - struct SNDBinaryFileHeader fileHeader; // 0x00 - struct SNDBinaryBlockHeader blockHeader; // 0x10 - struct SNDWaveArcLink *waveArcLLHead; // 0x18 - u8 unk_1C[28]; // 0x1C - u32 waveCount; // 0x38 - u32 waveOffsets[]; // 0x3C -}; // size = 0x3C - -struct SNDInstPos { - u32 program; // 0x0 - u32 index; // 0x4 -}; // size = 0x8 - -struct SNDWaveData { - struct SNDWaveParam param; // 0x0 - u8 sampleData[]; // 0xC -}; // size = 0xC - -#endif //GUARD_SND_BANK_SHARED_H +struct SNDWaveArcLink +{ + struct SNDWaveArc *waveArc; // 0x0 + struct SNDWaveArcLink *waveArcLLnext; // 0x4 +}; // size = 0x8 + +struct SNDBankData +{ + struct SNDBinaryFileHeader fileHeader; // 0x00 + struct SNDBinaryBlockHeader blockHeader; // 0x10 + struct SNDWaveArcLink waveArcLinks[SND_BANK_MAX_WAVEARC]; // 0x18 + u32 instCount; // 0x38 + u32 instOffsets[]; // 0x3C +}; // size = 0x40 + +struct SNDWaveArc +{ + struct SNDBinaryFileHeader fileHeader; // 0x00 + struct SNDBinaryBlockHeader blockHeader; // 0x10 + struct SNDWaveArcLink *waveArcLLHead; // 0x18 + u8 unk_1C[28]; // 0x1C + u32 waveCount; // 0x38 + u32 waveOffsets[]; // 0x3C +}; // size = 0x3C + +struct SNDInstPos +{ + u32 program; // 0x0 + u32 index; // 0x4 +}; // size = 0x8 + +struct SNDWaveData +{ + struct SNDWaveParam param; // 0x0 + u8 sampleData[]; // 0xC +}; // size = 0xC + +#endif // GUARD_SND_BANK_SHARED_H diff --git a/include/nitro/SND_command_shared.h b/include/nitro/SND_command_shared.h index 40dbe283..9e6e3b30 100644 --- a/include/nitro/SND_command_shared.h +++ b/include/nitro/SND_command_shared.h @@ -6,49 +6,50 @@ #define SND_CMD_COUNT 256 #define SND_CMD_ARG_MAX 4 -#define SND_CMD_FLAG_NOBLOCK 0x0 -#define SND_CMD_FLAG_BLOCK 0x1 -#define SND_CMD_FLAG_IMMEDIATE 0x2 +#define SND_CMD_FLAG_NOBLOCK 0x0 +#define SND_CMD_FLAG_BLOCK 0x1 +#define SND_CMD_FLAG_IMMEDIATE 0x2 -#define SND_CMD_START_SEQ 0x00 -#define SND_CMD_STOP_SEQ 0x01 -#define SND_CMD_PREPARE_SEQ 0x02 -#define SND_CMD_START_PREPARED_SEQ 0x03 -#define SND_CMD_PAUSE_SEQ 0x04 -#define SND_CMD_SKIP_SEQ 0x05 -#define SND_CMD_PLAYER_PARAM 0x06 -#define SND_CMD_TRACK_PARAM 0x07 -#define SND_CMD_MUTE_TRACK 0x08 -#define SND_CMD_ALLOCATABLE_CHANNEL 0x09 -#define SND_CMD_PLAYER_LOCAL_VAR 0x0A -#define SND_CMD_PLAYER_GLOBAL_VAR 0x0B -#define SND_CMD_START_TIMER 0x0C -#define SND_CMD_STOP_TIMER 0x0D -#define SND_CMD_SETUP_CHANNEL_PCM 0x0E -#define SND_CMD_SETUP_CHANNEL_PSG 0x0F -#define SND_CMD_SETUP_CHANNEL_NOISE 0x10 -#define SND_CMD_SETUP_CAPTURE 0x11 -#define SND_CMD_SETUP_ALARM 0x12 -#define SND_CMD_CHANNEL_TIMER 0x13 -#define SND_CMD_CHANNEL_VOLUME 0x14 -#define SND_CMD_CHANNEL_PAN 0x15 -#define SND_CMD_SURROUND_DECAY 0x16 -#define SND_CMD_MASTER_VOLUME 0x17 -#define SND_CMD_MASTER_PAN 0x18 -#define SND_CMD_OUTPUT_SELECTOR 0x19 -#define SND_CMD_LOCK_CHANNEL 0x1A -#define SND_CMD_UNLOCK_CHANNEL 0x1B -#define SND_CMD_STOP_UNLOCKED_CHANNEL 0x1C -#define SND_CMD_SET_SHARED_WORK 0x1D -#define SND_CMD_INVALIDATE_SEQ 0x1E -#define SND_CMD_INVALIDATE_BANK 0x1F -#define SND_CMD_INVALIDATE_WAVE 0x20 -#define SND_CMD_READ_DRIVER_INFO 0x21 +#define SND_CMD_START_SEQ 0x00 +#define SND_CMD_STOP_SEQ 0x01 +#define SND_CMD_PREPARE_SEQ 0x02 +#define SND_CMD_START_PREPARED_SEQ 0x03 +#define SND_CMD_PAUSE_SEQ 0x04 +#define SND_CMD_SKIP_SEQ 0x05 +#define SND_CMD_PLAYER_PARAM 0x06 +#define SND_CMD_TRACK_PARAM 0x07 +#define SND_CMD_MUTE_TRACK 0x08 +#define SND_CMD_ALLOCATABLE_CHANNEL 0x09 +#define SND_CMD_PLAYER_LOCAL_VAR 0x0A +#define SND_CMD_PLAYER_GLOBAL_VAR 0x0B +#define SND_CMD_START_TIMER 0x0C +#define SND_CMD_STOP_TIMER 0x0D +#define SND_CMD_SETUP_CHANNEL_PCM 0x0E +#define SND_CMD_SETUP_CHANNEL_PSG 0x0F +#define SND_CMD_SETUP_CHANNEL_NOISE 0x10 +#define SND_CMD_SETUP_CAPTURE 0x11 +#define SND_CMD_SETUP_ALARM 0x12 +#define SND_CMD_CHANNEL_TIMER 0x13 +#define SND_CMD_CHANNEL_VOLUME 0x14 +#define SND_CMD_CHANNEL_PAN 0x15 +#define SND_CMD_SURROUND_DECAY 0x16 +#define SND_CMD_MASTER_VOLUME 0x17 +#define SND_CMD_MASTER_PAN 0x18 +#define SND_CMD_OUTPUT_SELECTOR 0x19 +#define SND_CMD_LOCK_CHANNEL 0x1A +#define SND_CMD_UNLOCK_CHANNEL 0x1B +#define SND_CMD_STOP_UNLOCKED_CHANNEL 0x1C +#define SND_CMD_SET_SHARED_WORK 0x1D +#define SND_CMD_INVALIDATE_SEQ 0x1E +#define SND_CMD_INVALIDATE_BANK 0x1F +#define SND_CMD_INVALIDATE_WAVE 0x20 +#define SND_CMD_READ_DRIVER_INFO 0x21 -struct SNDCommand { - struct SNDCommand *llNext; // 0x0 - s32 id; // 0x4 - u32 arg[SND_CMD_ARG_MAX]; // 0x8 -}; // size = 0x18 +struct SNDCommand +{ + struct SNDCommand *llNext; // 0x0 + s32 id; // 0x4 + u32 arg[SND_CMD_ARG_MAX]; // 0x8 +}; // size = 0x18 -#endif //GUARD_SND_COMMAND_SHARED_H +#endif // GUARD_SND_COMMAND_SHARED_H diff --git a/include/nitro/SND_exChannel_shared.h b/include/nitro/SND_exChannel_shared.h index c7743cd6..8c01b5cc 100644 --- a/include/nitro/SND_exChannel_shared.h +++ b/include/nitro/SND_exChannel_shared.h @@ -22,87 +22,93 @@ #define SND_LFO_VOLUME 1 #define SND_LFO_PAN 2 -struct SNDWaveParam { - u8 format; // 0x0 +struct SNDWaveParam +{ + u8 format; // 0x0 u8 loopEnabled; // 0x1 u16 samplerate; // 0x2 - u16 timer; // 0x4 - u16 loopStart; // 0x6 + u16 timer; // 0x4 + u16 loopStart; // 0x6 u32 loopLength; // 0x8 }; // size = 0xC -struct SNDLfoParam { - u8 target; // 0x0 - u8 speed; // 0x1 - u8 depth; // 0x2 - u8 range; // 0x3 - u16 delay; // 0x4 +struct SNDLfoParam +{ + u8 target; // 0x0 + u8 speed; // 0x1 + u8 depth; // 0x2 + u8 range; // 0x3 + u16 delay; // 0x4 }; // size = 0x6 -struct SNDLfo { - struct SNDLfoParam param; // 0x0 - u16 delayCounter; // 0x6 - u16 counter; // 0x8 +struct SNDLfo +{ + struct SNDLfoParam param; // 0x0 + u16 delayCounter; // 0x6 + u16 counter; // 0x8 }; // size = 0xA struct SNDExChannel; typedef void (*SNDExChannelCallback)(struct SNDExChannel *chn, int status, void *userData); -struct SNDExChannel { - u8 id; // 0x00 - u8 type; // 0x01 - u8 envStatus; // 0x02 +struct SNDExChannel +{ + u8 id; // 0x00 + u8 type; // 0x01 + u8 envStatus; // 0x02 - struct { + struct + { u8 active : 1; u8 start : 1; u8 autoSweep : 1; u8 syncFlag : 5; - } flags; // 0x03 + } flags; // 0x03 - u8 panRange; // 0x04 - u8 rootMidiKey; // 0x05 - s16 userDecay2; // 0x06 + u8 panRange; // 0x04 + u8 rootMidiKey; // 0x05 + s16 userDecay2; // 0x06 - u8 midiKey; // 0x08 - u8 velocity; // 0x09 - s8 initPan; // 0x0A - s8 userPan; // 0x0B + u8 midiKey; // 0x08 + u8 velocity; // 0x09 + s8 initPan; // 0x0A + s8 userPan; // 0x0B - s16 userDecay; // 0x0C - s16 userPitch; // 0x0E + s16 userDecay; // 0x0C + s16 userPitch; // 0x0E s32 envAttenuation; // 0x10 - s32 sweepCounter; // 0x14 - s32 sweepLength; // 0x18 + s32 sweepCounter; // 0x14 + s32 sweepLength; // 0x18 - u8 envAttack; // 0x1C - u8 envSustain; // 0x1D - u16 envDecay; // 0x1E - u16 envRelease; // 0x20 - u8 priority; // 0x22 - u8 pan; // 0x23 - u16 volume; // 0x24 - u16 timer; // 0x26 + u8 envAttack; // 0x1C + u8 envSustain; // 0x1D + u16 envDecay; // 0x1E + u16 envRelease; // 0x20 + u8 priority; // 0x22 + u8 pan; // 0x23 + u16 volume; // 0x24 + u16 timer; // 0x26 - struct SNDLfo lfo; // 0x28 + struct SNDLfo lfo; // 0x28 - s16 sweepPitch; // 0x32 + s16 sweepPitch; // 0x32 - s32 length; // 0x34 + s32 length; // 0x34 - struct SNDWaveParam waveParam; // 0x38 + struct SNDWaveParam waveParam; // 0x38 - union { + union + { const void *waveDataPtr; s32 dutyCycle; - }; // 0x44 + }; // 0x44 SNDExChannelCallback callback; // 0x48 void *callbackUserData; // 0x4C struct SNDExChannel *channelLLNext; // 0x50 -}; // size = 0x54 +}; // size = 0x54 -#endif //GUARD_SND_EXCHANNEL_SHARED_H +#endif // GUARD_SND_EXCHANNEL_SHARED_H diff --git a/include/nitro/SND_main_shared.h b/include/nitro/SND_main_shared.h index 9b238245..52addda0 100644 --- a/include/nitro/SND_main_shared.h +++ b/include/nitro/SND_main_shared.h @@ -15,18 +15,20 @@ #include "nitro/types.h" -struct SNDBinaryFileHeader { - s8 signature[4]; // 0x0 - u16 byteOrder; // 0x4 - u16 version; // 0x6 - u32 fileSize; // 0x8 - u16 headerSize; // 0xC - u16 dataBlocks; // 0xE -}; // size = 0x10 +struct SNDBinaryFileHeader +{ + s8 signature[4]; // 0x0 + u16 byteOrder; // 0x4 + u16 version; // 0x6 + u32 fileSize; // 0x8 + u16 headerSize; // 0xC + u16 dataBlocks; // 0xE +}; // size = 0x10 -typedef struct SNDBinaryBlockHeader { - u32 type; // 0x0 - u32 size; // 0x4 -} SNDBinaryBlockHeader; // size = 0x8 - -#endif //POKEDIAMOND_SND_MAIN_SHARED_H +typedef struct SNDBinaryBlockHeader +{ + u32 type; // 0x0 + u32 size; // 0x4 +} SNDBinaryBlockHeader; // size = 0x8 + +#endif // POKEDIAMOND_SND_MAIN_SHARED_H diff --git a/include/nitro/SND_seq_shared.h b/include/nitro/SND_seq_shared.h index d76fc8d0..00a0ea74 100644 --- a/include/nitro/SND_seq_shared.h +++ b/include/nitro/SND_seq_shared.h @@ -8,34 +8,38 @@ struct SNDBankData; -struct SNDPlayer { - struct { +struct SNDPlayer +{ + struct + { u8 active : 1; u8 prepared : 1; u8 paused : 1; - } flags; // 0x0 + } flags; // 0x0 - u8 playerId; // 0x1 - u8 unk_2[2]; // 0x2 + u8 playerId; // 0x1 + u8 unk_2[2]; // 0x2 - u8 prio; // 0x4 - u8 volume; // 0x5 - s16 extFader; // 0x6 + u8 prio; // 0x4 + u8 volume; // 0x5 + s16 extFader; // 0x6 - u8 tracks[SND_TRACK_COUNT_PER_PLAYER]; // 0x8 + u8 tracks[SND_TRACK_COUNT_PER_PLAYER]; // 0x8 - u16 tempo; // 0x18 - u16 tempoRatio; // 0x1A - u16 tempoCounter; // 0x1C - u8 unk_1E[2]; // 0x1E + u16 tempo; // 0x18 + u16 tempoRatio; // 0x1A + u16 tempoCounter; // 0x1C + u8 unk_1E[2]; // 0x1E - struct SNDBankData *bank; // 0x20 -}; // size = 0x24 + struct SNDBankData *bank; // 0x20 +}; // size = 0x24 #define SND_TRACK_MAX_CALL 3 -struct SNDTrack { - struct { +struct SNDTrack +{ + struct + { u8 active : 1; u8 noteWait : 1; u8 muted : 1; @@ -44,43 +48,43 @@ struct SNDTrack { u8 portamento : 1; u8 cmp : 1; // ??? u8 channelMask : 1; - } flags; // 0x00 - - u8 panRange; // 0x01 - u16 program; // 0x02 - - u8 volume; // 0x04 - u8 expression; // 0x05 - s8 pitchBend; // 0x06 - u8 bendRange; // 0x07 - - s8 pan; // 0x08 - s8 extPan; // 0x09 - s16 extFader; // 0x0A - s16 extPitch; // 0x0C - u8 envAttack; // 0x0E - u8 envDecay; // 0x0F - u8 envSustain; // 0x10 - u8 envRelease; // 0x11 - u8 priority; // 0x12 - s8 transpose; // 0x13 - - u8 portamentoKey; // 0x14 - u8 portamentoTime; // 0x15 - s16 sweepPitch; // 0x16 - - struct SNDLfoParam mod; // 0x18 - u16 channelMask; // 0x1E - - s32 wait; // 0x20 - - const u8 *base; // 0x24 - const u8 *cur; // 0x28 + } flags; // 0x00 + + u8 panRange; // 0x01 + u16 program; // 0x02 + + u8 volume; // 0x04 + u8 expression; // 0x05 + s8 pitchBend; // 0x06 + u8 bendRange; // 0x07 + + s8 pan; // 0x08 + s8 extPan; // 0x09 + s16 extFader; // 0x0A + s16 extPitch; // 0x0C + u8 envAttack; // 0x0E + u8 envDecay; // 0x0F + u8 envSustain; // 0x10 + u8 envRelease; // 0x11 + u8 priority; // 0x12 + s8 transpose; // 0x13 + + u8 portamentoKey; // 0x14 + u8 portamentoTime; // 0x15 + s16 sweepPitch; // 0x16 + + struct SNDLfoParam mod; // 0x18 + u16 channelMask; // 0x1E + + s32 wait; // 0x20 + + const u8 *base; // 0x24 + const u8 *cur; // 0x28 const u8 *posCallStack[SND_TRACK_MAX_CALL]; // 0x2C - u8 loopCount[SND_TRACK_MAX_CALL]; // 0x38 - u8 callStackDepth; // 0x3B + u8 loopCount[SND_TRACK_MAX_CALL]; // 0x38 + u8 callStackDepth; // 0x3B struct SNDExChannel *channelLLHead; // 0x3C -}; // size = 0x40 +}; // size = 0x40 -#endif //GUARD_SND_SEQ_SHARED_H +#endif // GUARD_SND_SEQ_SHARED_H diff --git a/include/nitro/SND_work_shared.h b/include/nitro/SND_work_shared.h index 02cc8bff..ec2d3c84 100644 --- a/include/nitro/SND_work_shared.h +++ b/include/nitro/SND_work_shared.h @@ -13,81 +13,90 @@ #ifndef POKEDIAMOND_SND_WORK_SHARED_H #define POKEDIAMOND_SND_WORK_SHARED_H -#include "nitro/SND_main_shared.h" #include "nitro/SND_alarm_shared.h" #include "nitro/SND_bank_shared.h" +#include "nitro/SND_main_shared.h" #include "nitro/SND_seq_shared.h" - + #define SND_PLAYER_COUNT 16 #define SND_CHANNEL_COUNT 16 #define SND_TRACK_COUNT 32 -struct SNDWork { - struct SNDExChannel channels[SND_CHANNEL_COUNT]; // 0x00 - struct SNDPlayer players[SND_PLAYER_COUNT]; // 0x540 - struct SNDTrack tracks[SND_TRACK_COUNT]; // 0x780 - struct SNDAlarm alarms[SND_ALARM_COUNT]; // 0xF80 -}; // size = 0x1180 +struct SNDWork +{ + struct SNDExChannel channels[SND_CHANNEL_COUNT]; // 0x00 + struct SNDPlayer players[SND_PLAYER_COUNT]; // 0x540 + struct SNDTrack tracks[SND_TRACK_COUNT]; // 0x780 + struct SNDAlarm alarms[SND_ALARM_COUNT]; // 0xF80 +}; // size = 0x1180 -struct SNDSharedWork { - u32 finishedCommandTag; // 0x0 - u32 playerStatus; // 0x4 - u16 channelStatus; // 0x8 - u16 captureStatus; // 0xA - u8 unk_C[0x14]; // 0xC - struct { - s16 localVars[16]; // local 0x0 - u32 tickCounter; // local 0x20 - } players[SND_PLAYER_COUNT]; // 0x20 - s16 globalVars[16]; // 0x260 -}; // size = 0x280 +struct SNDSharedWork +{ + u32 finishedCommandTag; // 0x0 + u32 playerStatus; // 0x4 + u16 channelStatus; // 0x8 + u16 captureStatus; // 0xA + u8 unk_C[0x14]; // 0xC + struct + { + s16 localVars[16]; // local 0x0 + u32 tickCounter; // local 0x20 + } players[SND_PLAYER_COUNT]; // 0x20 + s16 globalVars[16]; // 0x260 +}; // size = 0x280 -struct SNDDriverInfo { - struct SNDWork work; // 0x0000 +struct SNDDriverInfo +{ + struct SNDWork work; // 0x0000 u32 channelControls[SND_CHANNEL_COUNT]; // 0x1180 - struct SNDWork *workPtr; // 0x11C0 - u32 lockedChannels; // 0x11C4 - u8 unk_XXX[24]; // 0x11C8 -}; // size = 0x11E0 + struct SNDWork *workPtr; // 0x11C0 + u32 lockedChannels; // 0x11C4 + u8 unk_XXX[24]; // 0x11C8 +}; // size = 0x11E0 -struct SNDChannelInfo { - struct { +struct SNDChannelInfo +{ + struct + { BOOL active : 1; - BOOL locked: 1; - } flags; // 0x0 - u16 volume; // 0x4 - u8 pan; // 0x6 - u8 unk_7; // 0x7 - s32 envStatus; // 0x8 -}; // size = 0xC + BOOL locked : 1; + } flags; // 0x0 + u16 volume; // 0x4 + u8 pan; // 0x6 + u8 unk_7; // 0x7 + s32 envStatus; // 0x8 +}; // size = 0xC -struct SNDPlayerInfo { - struct { +struct SNDPlayerInfo +{ + struct + { BOOL active : 1; BOOL paused : 1; - } flags; // 0x0 - u16 trackBitMask; // 0x4 - u16 tempo; // 0x6 - u8 volume; // 0x8 - u8 unk_9[3]; // 0x9 -}; // size = 0xC + } flags; // 0x0 + u16 trackBitMask; // 0x4 + u16 tempo; // 0x6 + u8 volume; // 0x8 + u8 unk_9[3]; // 0x9 +}; // size = 0xC -struct SNDTrackInfo { - u16 program; // 0x0 - u8 volume; // 0x2 - u8 expression; // 0x3 +struct SNDTrackInfo +{ + u16 program; // 0x0 + u8 volume; // 0x2 + u8 expression; // 0x3 - s8 pitchBend; // 0x4 - u8 bendRange; // 0x5 - u8 pan; // 0x6 - s8 transpose; // 0x7 + s8 pitchBend; // 0x4 + u8 bendRange; // 0x5 + u8 pan; // 0x6 + s8 transpose; // 0x7 - u8 unk_8; // 0x8 - u8 chnCount; // 0x9 - u8 channel[SND_CHANNEL_COUNT]; // 0xA -}; // size = 0x1A + u8 unk_8; // 0x8 + u8 chnCount; // 0x9 + u8 channel[SND_CHANNEL_COUNT]; // 0xA +}; // size = 0x1A extern struct SNDWork SNDi_Work; extern struct SNDSharedWork *SNDi_SharedWork; - - #endif //POKEDIAMOND_SND_WORK_SHARED_H + +#endif // POKEDIAMOND_SND_WORK_SHARED_H -- cgit v1.2.3 From 0d7ce0e3ba9bc78a5d785e6857c4b8876ad2cf66 Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Wed, 25 Aug 2021 17:37:46 +0200 Subject: PR: implement review corrections 1 --- arm7/lib/include/PM.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arm7/lib/include/PM.h b/arm7/lib/include/PM.h index df2185be..136976e3 100644 --- a/arm7/lib/include/PM.h +++ b/arm7/lib/include/PM.h @@ -3,7 +3,7 @@ #include "nitro/types.h" -void PMi_SetControl(int ctrl); -void PMi_ResetControl(int ctrl); +void PMi_SetControl(u8 ctrl); +void PMi_ResetControl(u8 ctrl); #endif //GUARD_PM_H -- cgit v1.2.3 From a6e669f1da619f88d58839807e0c3a908bf6ced5 Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Wed, 25 Aug 2021 17:50:38 +0200 Subject: PR: implement review corrections 2 --- arm7/lib/src/SND_seq.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/arm7/lib/src/SND_seq.c b/arm7/lib/src/SND_seq.c index e16ca9be..d4f6b7b1 100644 --- a/arm7/lib/src/SND_seq.c +++ b/arm7/lib/src/SND_seq.c @@ -711,7 +711,7 @@ static void TrackUpdateChannel(struct SNDTrack *track, struct SNDPlayer *player, for (struct SNDExChannel *chn = track->channelLLHead; chn != NULL; chn = chn->channelLLNext) { - chn->userDecay2 = (short)fader; + chn->userDecay2 = (s16)fader; if (chn->envStatus == 3) continue; @@ -820,7 +820,7 @@ static void TrackPlayNote( chn->sweepPitch = track->sweepPitch; if (track->flags.portamento) - chn->sweepPitch += (short)((track->portamentoKey - midiKey) << 6); + chn->sweepPitch += (s16)((track->portamentoKey - midiKey) << 6); if (track->portamentoTime == 0) { -- cgit v1.2.3 From ab1ad9955b4f81e442b7a7114ec1ce82572c10ed Mon Sep 17 00:00:00 2001 From: Michael Panzlaff Date: Wed, 25 Aug 2021 17:57:32 +0200 Subject: PR: implement review corrections 3 --- arm7/lib/src/SND_seq.c | 1 + arm7/lib/src/SND_util.c | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/arm7/lib/src/SND_seq.c b/arm7/lib/src/SND_seq.c index d4f6b7b1..15b60596 100644 --- a/arm7/lib/src/SND_seq.c +++ b/arm7/lib/src/SND_seq.c @@ -765,6 +765,7 @@ static void TrackPlayNote( u32 allowedChannels; + // get bitmask with allocatable channels based on channel type switch (inst.type) { case SND_INST_PCM: diff --git a/arm7/lib/src/SND_util.c b/arm7/lib/src/SND_util.c index c9a98c3f..5c0b220b 100644 --- a/arm7/lib/src/SND_util.c +++ b/arm7/lib/src/SND_util.c @@ -36,7 +36,7 @@ u16 SND_CalcTimer(int timer, int pitch) } else if (shift < 32) { - // what ??? + // clamp in case timer value overflows u64 tmp = result & ~0uLL << (32 - shift); if (tmp != 0) return 0xFFFF; -- cgit v1.2.3 From cc9a32f7b9ea95df9683feaba0a18a4ef9d2dea9 Mon Sep 17 00:00:00 2001 From: red031000 Date: Thu, 26 Aug 2021 22:46:27 +0100 Subject: rename padding to filler --- arm9/modules/59/include/mod59_021D74E0.h | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/arm9/modules/59/include/mod59_021D74E0.h b/arm9/modules/59/include/mod59_021D74E0.h index 059f80c8..bee72507 100644 --- a/arm9/modules/59/include/mod59_021D74E0.h +++ b/arm9/modules/59/include/mod59_021D74E0.h @@ -24,27 +24,27 @@ typedef struct MOD59_OverlayData u32 unk10; struct UnkStruct_02006234 *unk14; struct BgConfig *bgConfig; - u8 padding[0x10]; + u8 filler1C[0x10]; u32 unk2C; - u8 padding2[0x1C]; + u8 filler30[0x1C]; struct MsgData *msgData; u32 unk50; u32 unk54; - u8 padding3[0x8]; + u8 filler58[0x8]; u32 unk60; // unknown if this is the right type, possibly a pointer instead? struct ScrStrBufs *strBufs; - u8 padding4[0x8]; + u8 filler68[0x8]; struct MOD59_UnkPlayerStruct *playerStruct; struct MOD59_UnkPlayerStruct *rivalStruct; u32 unk78; - u8 padding5[0xC]; + u8 filler7C[0xC]; u8 unk88; u8 unk89; u8 unk8A; u8 unk8B; - u8 padding6[4]; + u8 filler8C[4]; u32 unk90; - u8 padding7[32]; + u8 filler94[32]; } MOD59_OverlayData; BOOL MOD59_Init(struct UnkStruct_02006234 *param0); -- cgit v1.2.3