From 58b4df70b5e522476702d089580ddd2320928527 Mon Sep 17 00:00:00 2001 From: Henny022p Date: Wed, 24 Mar 2021 00:33:12 +0100 Subject: [PATCH] decompile audio --- asm/code_080A29BC.s | 56 ------------- asm/code_080A3480.s | 195 ------------------------------------------- data/songs.s | 2 +- include/audio.h | 11 +-- include/gba/m4a.h | 3 + include/main.h | 1 - include/structures.h | 8 +- src/audio.c | 141 +++++++++++++++++++++++++++++-- 8 files changed, 148 insertions(+), 269 deletions(-) diff --git a/asm/code_080A29BC.s b/asm/code_080A29BC.s index c0b7228f..6f24e856 100644 --- a/asm/code_080A29BC.s +++ b/asm/code_080A29BC.s @@ -981,59 +981,3 @@ _080A31FC: _080A3200: pop {r4, r5, pc} .align 2, 0 - - thumb_func_start InitSound -InitSound: @ 0xInitSound - push {lr} - bl sub_080A3210 - bl m4aSoundInit - pop {pc} - - thumb_func_start sub_080A3210 -sub_080A3210: @ 0x080A3210 - push {r4, lr} - ldr r4, _080A3230 @ =gUnk_02021EE0 - adds r0, r4, #0 - movs r1, #0x18 - bl MemClear - bl sub_080A35C8 - movs r0, #0x80 - lsls r0, r0, #1 - strh r0, [r4, #0x12] - strh r0, [r4, #4] - bl m4aMPlayAllStop - pop {r4, pc} - .align 2, 0 -_080A3230: .4byte gUnk_02021EE0 - - thumb_func_start sub_080A3234 -sub_080A3234: @ 0x080A3234 - push {lr} - ldr r1, _080A3244 @ =gUnk_02021EE0 - strh r0, [r1, #8] - strh r0, [r1, #0xa] - ldrh r0, [r1, #0x14] - bl sub_080A353C - pop {pc} - .align 2, 0 -_080A3244: .4byte gUnk_02021EE0 - - thumb_func_start sub_080A3248 -sub_080A3248: @ 0x080A3248 - push {lr} - ldr r1, _080A3258 @ =gUnk_02021EE0 - strh r0, [r1, #0x10] - strh r0, [r1, #0xe] - ldrh r0, [r1, #0x14] - bl sub_080A353C - pop {pc} - .align 2, 0 -_080A3258: .4byte gUnk_02021EE0 - - thumb_func_start sub_080A325C -sub_080A325C: @ 0x080A325C - ldr r1, _080A3264 @ =gUnk_02021EE0 - strh r0, [r1, #0x12] - bx lr - .align 2, 0 -_080A3264: .4byte gUnk_02021EE0 diff --git a/asm/code_080A3480.s b/asm/code_080A3480.s index 2ade5735..fefbe855 100644 --- a/asm/code_080A3480.s +++ b/asm/code_080A3480.s @@ -6,201 +6,6 @@ .text - thumb_func_start sub_080A3480 -sub_080A3480: @ 0x080A3480 - push {r4, lr} - ldr r4, _080A34A4 @ =gUnk_02021EE0 - movs r0, #0xa - ldrsh r1, [r4, r0] - movs r2, #8 - ldrsh r0, [r4, r2] - cmp r1, r0 - beq _080A34C4 - adds r0, r1, #0 - movs r2, #8 - ldrsh r1, [r4, r2] - bl sub_080A3518 - adds r1, r0, #0 - cmp r1, #0 - bne _080A34A8 - ldrh r0, [r4, #0xa] - b _080A34AC - .align 2, 0 -_080A34A4: .4byte gUnk_02021EE0 -_080A34A8: - ldrh r0, [r4, #8] - adds r0, r0, r1 -_080A34AC: - strh r0, [r4, #8] - movs r1, #8 - ldrsh r0, [r4, r1] - cmp r0, #0 - bge _080A34BC - movs r0, #0 - strh r0, [r4, #0xa] - strh r0, [r4, #8] -_080A34BC: - ldrh r0, [r4, #0x14] - bl sub_080A353C - b _080A3516 -_080A34C4: - movs r2, #0x10 - ldrsh r1, [r4, r2] - movs r2, #0xe - ldrsh r0, [r4, r2] - cmp r1, r0 - beq _080A3516 - adds r0, r1, #0 - movs r2, #0xe - ldrsh r1, [r4, r2] - bl sub_080A3518 - adds r1, r0, #0 - cmp r1, #0 - bne _080A34FC - ldrb r0, [r4, #2] - ldrh r2, [r4, #0x10] - cmp r0, #0 - beq _080A34F8 - cmp r2, #0 - bne _080A34F8 - strb r1, [r4, #2] - strh r1, [r4, #0x14] - movs r0, #0 - bl m4aSongNumStop - b _080A3502 -_080A34F8: - strh r2, [r4, #0xe] - b _080A3502 -_080A34FC: - ldrh r0, [r4, #0xe] - adds r0, r0, r1 - strh r0, [r4, #0xe] -_080A3502: - movs r1, #0xe - ldrsh r0, [r4, r1] - cmp r0, #0 - bge _080A3510 - movs r0, #0 - strh r0, [r4, #0x10] - strh r0, [r4, #0xe] -_080A3510: - ldrh r0, [r4, #0x14] - bl sub_080A353C -_080A3516: - pop {r4, pc} - - thumb_func_start sub_080A3518 -sub_080A3518: @ 0x080A3518 - push {lr} - adds r2, r0, #0 - subs r0, r2, r1 - cmp r0, #0 - ble _080A352C - adds r1, #4 - cmp r2, r1 - ble _080A3532 - movs r0, #4 - b _080A353A -_080A352C: - subs r1, #4 - cmp r2, r1 - blt _080A3536 -_080A3532: - movs r0, #0 - b _080A353A -_080A3536: - movs r0, #4 - rsbs r0, r0, #0 -_080A353A: - pop {pc} - - thumb_func_start sub_080A353C -sub_080A353C: @ 0x080A353C - push {r4, r5, lr} - adds r3, r0, #0 - cmp r3, #0 - beq _080A358C - subs r0, r3, #1 - cmp r0, #0x62 - bhi _080A3558 - ldr r0, _080A3554 @ =gUnk_02021EE0 - movs r1, #0xe - ldrsh r5, [r0, r1] - b _080A355E - .align 2, 0 -_080A3554: .4byte gUnk_02021EE0 -_080A3558: - ldr r0, _080A3590 @ =gUnk_02021EE0 - movs r1, #0x12 - ldrsh r5, [r0, r1] -_080A355E: - movs r1, #8 - ldrsh r0, [r0, r1] - muls r0, r5, r0 - lsrs r5, r0, #8 - ldr r2, _080A3594 @ =gMPlayTable - ldr r1, _080A3598 @ =gSongTable - lsls r0, r3, #3 - adds r0, r0, r1 - ldrh r1, [r0, #4] - lsls r0, r1, #1 - adds r0, r0, r1 - lsls r0, r0, #2 - adds r0, r0, r2 - ldr r4, [r0] - adds r0, r4, #0 - bl m4aMPlayImmInit - ldr r1, _080A359C @ =0x0000FFFF - lsls r2, r5, #0x10 - lsrs r2, r2, #0x10 - adds r0, r4, #0 - bl m4aMPlayVolumeControl -_080A358C: - pop {r4, r5, pc} - .align 2, 0 -_080A3590: .4byte gUnk_02021EE0 -_080A3594: .4byte gMPlayTable -_080A3598: .4byte gSongTable -_080A359C: .4byte 0x0000FFFF - - thumb_func_start sub_080A35A0 -sub_080A35A0: @ 0x080A35A0 - push {lr} - ldr r2, _080A35B0 @ =gUnk_02021EE0 - movs r1, #0x80 - lsls r1, r1, #1 - strh r1, [r2, #0xa] - bl sub_080A353C - pop {pc} - .align 2, 0 -_080A35B0: .4byte gUnk_02021EE0 - - thumb_func_start sub_080A35B4 -sub_080A35B4: @ 0x080A35B4 - push {lr} - ldr r2, _080A35C4 @ =gUnk_02021EE0 - movs r1, #0 - strh r1, [r2, #0xa] - bl sub_080A353C - pop {pc} - .align 2, 0 -_080A35C4: .4byte gUnk_02021EE0 - - thumb_func_start sub_080A35C8 -sub_080A35C8: @ 0x080A35C8 - ldr r1, _080A35DC @ =gUnk_02021EE0 - movs r0, #0x80 - lsls r0, r0, #1 - strh r0, [r1, #6] - strh r0, [r1, #8] - strh r0, [r1, #0xa] - strh r0, [r1, #0xc] - strh r0, [r1, #0xe] - strh r0, [r1, #0x10] - bx lr - .align 2, 0 -_080A35DC: .4byte gUnk_02021EE0 - thumb_func_start HandleCreditsScreen HandleCreditsScreen: @ 0x080A35E0 push {lr} diff --git a/data/songs.s b/data/songs.s index 79dcca2e..ca816f80 100644 --- a/data/songs.s +++ b/data/songs.s @@ -1,6 +1,6 @@ .section .rodata -song_08DCC48C:: @ 08DCC48C +sfxNone:: @ 08DCC48C .incbin "baserom.gba", 0xDCC48C, 0x0000240 bgmCastleTournament:: @ 08DCC6CC diff --git a/include/audio.h b/include/audio.h index 29fb90ad..98a1f9cf 100644 --- a/include/audio.h +++ b/include/audio.h @@ -23,7 +23,7 @@ typedef enum { BGM_VAATI_THEME, BGM_EZLO_THEME, BGM_STORY, - BGM_FESTIVAL_APPROACH, //0x10 + BGM_FESTIVAL_APPROACH, BGM_BEAT_VAATI, BGM_UNUSED_12, BGM_BEANSTALK, @@ -39,7 +39,7 @@ typedef enum { BGM_MINISH_WOODS, BGM_CRENEL_STORM, BGM_CASTOR_WILDS, - BGM_HYRULE_TOWN, //0x20 + BGM_HYRULE_TOWN, BGM_ROYAL_VALLEY, BGM_CLOUD_TOPS, BGM_DARK_HYRULE_CASTLE, @@ -55,7 +55,7 @@ typedef enum { BGM_FIGHT_THEME, BGM_BOSS_THEME, BGM_VAATI_REBORN, - BGM_VAATI_TRANSFIGURED, // 0x30 + BGM_VAATI_TRANSFIGURED, BGM_CASTLE_COLLAPSE, BGM_VAATI_WRATH, BGM_FIGHT_THEME2, @@ -71,7 +71,7 @@ typedef enum { BGM_UNUSED_3D, BGM_UNUSED_3E, BGM_UNUSED_3F, - BGM_UNUSED_40, // 0x40 + BGM_UNUSED_40, BGM_UNUSED_41, BGM_UNUSED_42, BGM_UNUSED_43, @@ -152,7 +152,7 @@ typedef enum { SFX_VO_EZLO1, SFX_VO_EZLO2, SFX_VO_EZLO3, - SFX_VO_EZLO4, //0x90 + SFX_VO_EZLO4, SFX_VO_EZLO5, SFX_VO_EZLO6, SFX_VO_EZLO7, @@ -574,6 +574,7 @@ typedef enum { SONG_UNK_11 = 0x80110000, } Sound; +void InitSound(void); void SoundReq(Sound sound); #endif // AUDIO_H diff --git a/include/gba/m4a.h b/include/gba/m4a.h index 745bc801..15e1a972 100644 --- a/include/gba/m4a.h +++ b/include/gba/m4a.h @@ -60,11 +60,14 @@ typedef struct MusicPlayer { extern const MusicPlayer gMPlayTable[]; extern const Song gSongTable[]; +void m4aSoundInit(void); void m4aSongNumStart(u16 n); void m4aSongNumStartOrContinue(u16 n); void m4aSongNumStop(u16 n); void m4aMPlayAllStop(void); +void m4aMPlayImmInit(MusicPlayerInfo* mplayInfo); void m4aMPlayTempoControl(MusicPlayerInfo* mplayInfo, u16 tempo); +void m4aMPlayVolumeControl(MusicPlayerInfo* mplayInfo, u16 trackBits, u16 volume); void m4aSoundVSyncOn(void); void m4aSoundVSyncOff(void); diff --git a/include/main.h b/include/main.h index 1653a40e..feaaf73e 100644 --- a/include/main.h +++ b/include/main.h @@ -79,7 +79,6 @@ extern UI gUnk_02032EC0; void InitScreen(u32 screen); -extern void InitSound(void); extern void sub_08056208(void); extern void sub_0804FFE4(void); extern void sub_080ADD30(void); diff --git a/include/structures.h b/include/structures.h index f35da59f..81bb36b4 100644 --- a/include/structures.h +++ b/include/structures.h @@ -190,10 +190,10 @@ typedef struct struct_02021EE0 { s16 unk_06; s16 unk_08; s16 unk_0a; - u16 unk_0c; - u16 unk_0e; - u16 unk_10; - u16 unk_12; + s16 unk_0c; + s16 unk_0e; + s16 unk_10; + s16 unk_12; u16 currentBgm; } struct_02021EE0; diff --git a/src/audio.c b/src/audio.c index b19ea58f..e294f01a 100644 --- a/src/audio.c +++ b/src/audio.c @@ -2,17 +2,49 @@ #include "main.h" #include "gba/m4a.h" #include "audio.h" +#include "utils.h" #include "structures.h" -extern void sub_080A35A0(u32); -extern void sub_080A35C8(void); -extern void sub_080A353C(u32); -extern void sub_080A3234(u32); -extern void sub_080A35B4(u32); +s32 sub_080A3518(s32, s32); +void sub_080A353C(u32); +void sub_080A35A0(u32); +void sub_080A35B4(u32); +void sub_080A35C8(void); #define IS_BGM(song) (song) - 1 <= NUM_BGM - 1 #define IS_SFX(song) (song) - 1 > NUM_BGM - 1 +void sub_080A3210(void); + +void InitSound(void){ + sub_080A3210(); + m4aSoundInit(); +} + +void sub_080A3210(void){ + MemClear(&gUnk_02021EE0, 0x18); + sub_080A35C8(); + gUnk_02021EE0.unk_12 = 0x100; + gUnk_02021EE0.unk_04 = 0x100; + m4aMPlayAllStop(); +} + +void sub_080A3234(u32 arg){ + gUnk_02021EE0.unk_08 = arg; + gUnk_02021EE0.unk_0a = arg; + sub_080A353C(gUnk_02021EE0.currentBgm); +} + +void sub_080A3248(u32 arg){ + gUnk_02021EE0.unk_10 = arg; + gUnk_02021EE0.unk_0e = arg; + sub_080A353C(gUnk_02021EE0.currentBgm); +} + +void sub_080A325C(u32 arg){ + gUnk_02021EE0.unk_12 = arg; +} + void SoundReq(Sound sound) { u32 song; struct_02021EE0* ptr; @@ -111,7 +143,102 @@ void SoundReq(Sound sound) { } } -extern const SongHeader song_08DCC48C; +void sub_080A3480(void) { + u32 iVar2; + struct_02021EE0* ptr = &gUnk_02021EE0; + + if (ptr->unk_0a != ptr->unk_08) { + iVar2 = sub_080A3518(ptr->unk_0a, ptr->unk_08); + if (iVar2 == 0) { + ptr->unk_08 = ptr->unk_0a; + } else { + ptr->unk_08 = ptr->unk_08 + iVar2; + } + if (ptr->unk_08 < 0) { + ptr->unk_0a = 0; + ptr->unk_08 = 0; + } + sub_080A353C(ptr->currentBgm); + } else { + if (ptr->unk_10 != ptr->unk_0e) { + iVar2 = sub_080A3518(ptr->unk_10, ptr->unk_0e); + if (iVar2 == 0) { + if (ptr->unk_02 != 0 && ptr->unk_10 == 0) { + ptr->unk_02 = 0; + ptr->currentBgm = 0; + m4aSongNumStop(0); + } else { + ptr->unk_0e = ptr->unk_10; + } + } else { + ptr->unk_0e += iVar2; + } + if (ptr->unk_0e < 0) { + ptr->unk_10 = 0; + ptr->unk_0e = 0; + } + sub_080A353C(ptr->currentBgm); + } + } +} + +s32 sub_080A3518(s32 unk_1, s32 unk_2){ + if (unk_1 - unk_2 >= 1) { + unk_2 += 4; + if (unk_1 > unk_2) + return 4; + else + return 0; + } else { + unk_2 -= 4; + if (unk_1 < unk_2) + return -4; + else + return 0; + } +} + +void sub_080A353C(u32 song){ + u32 volume; + u32 iVar2; + MusicPlayerInfo* musicPlayerInfo; + + if(song == 0) + return; + + if (IS_BGM(song)) { + volume = gUnk_02021EE0.unk_0e; + } + else{ + volume = gUnk_02021EE0.unk_12; + } + iVar2 = gUnk_02021EE0.unk_08; + volume = iVar2 * volume / 0x100; + musicPlayerInfo = gMPlayTable[gSongTable[song].ms].info; + m4aMPlayImmInit(musicPlayerInfo); + m4aMPlayVolumeControl(musicPlayerInfo, 0xffff, volume); +} + +void sub_080A35A0(u32 song){ + gUnk_02021EE0.unk_0a = 0x100; + sub_080A353C(song); +} + +void sub_080A35B4(u32 song){ + gUnk_02021EE0.unk_0a = 0; + sub_080A353C(song); +} + +void sub_080A35C8(){ + gUnk_02021EE0.unk_06 = 0x100; + gUnk_02021EE0.unk_08 = 0x100; + gUnk_02021EE0.unk_0a = 0x100; + gUnk_02021EE0.unk_0c = 0x100; + gUnk_02021EE0.unk_0e = 0x100; + gUnk_02021EE0.unk_10 = 0x100; +} + +extern const SongHeader sfxNone; extern const SongHeader bgmCastleTournament; extern const SongHeader bgmVaatiMotif; extern const SongHeader bgmTitleScreen; @@ -621,7 +748,7 @@ extern const SongHeader sfx220; extern const SongHeader sfx221; const Song gSongTable[] = { - { &song_08DCC48C, 0x001f, 0x001f }, + { &sfxNone, 0x001f, 0x001f }, { &bgmCastleTournament, 0x001f, 0x001f }, { &bgmVaatiMotif, 0x001f, 0x001f }, { &bgmTitleScreen, 0x001f, 0x001f },