diff options
author | Seth Barberee <seth.barberee@gmail.com> | 2021-01-27 18:46:39 -0600 |
---|---|---|
committer | Seth Barberee <seth.barberee@gmail.com> | 2021-01-28 09:24:55 -0600 |
commit | 4886c9f7dcfbaea24ff56e47c81e8af027b86c98 (patch) | |
tree | 8ce1afc88c2d8fc006d32b57d9ab3acea01f0763 /src/music_pre.c | |
parent | cb77386b65b0a78c16ccd2dfd3d329aaf502ac2e (diff) |
decomp, label, doc, repeat
Diffstat (limited to 'src/music_pre.c')
-rw-r--r-- | src/music_pre.c | 372 |
1 files changed, 356 insertions, 16 deletions
diff --git a/src/music_pre.c b/src/music_pre.c index 42a8cb0..5c0589a 100644 --- a/src/music_pre.c +++ b/src/music_pre.c @@ -11,13 +11,17 @@ extern void SoundBiasSet(); extern void SetInterruptFlag(u16); extern void nullsub_25(); extern void nullsub_18(); +extern void UpdateSound(); +extern void UpdateInput(); extern void sub_800C298(u16 r0); typedef void (*IntrCallback)(void); extern IntrCallback gUnknown_202D5F0[]; +extern struct MusicPlayerInfo gUnknown_20008F0; // BGM?? extern u32 gUnknown_203B0A0; +extern u32 gUnknown_203B0A4; extern u16 gBGMusicPlayerState; extern u16 gCurrentBGSong; extern u16 gUnknown_202D68C; @@ -33,20 +37,19 @@ extern u8 gUnknown_203B09A; struct unkStruct_3000FD8 { u16 unk0; - u16 unk2; + u16 songIndex; u16 unk4; u8 unk6; - u8 padding; }; extern struct unkStruct_3000FD8 gUnknown_3000FD8[8]; extern u8 gUnknown_202D7FE; extern u16 gUnknown_202D7FC; -extern struct BGControlStruct gUnknown_202D698; -extern struct BGControlStruct gUnknown_202D6A0; -extern struct BGControlStruct gUnknown_202D6A8; -extern struct BGControlStruct gUnknown_202D6B0; +extern struct BGControlStruct gBG0Control; +extern struct BGControlStruct gBG1Control; +extern struct BGControlStruct gBG2Control; +extern struct BGControlStruct gBG3Control; void sub_800BF80(void); void xxx_update_bg_sound_input(void); @@ -219,18 +222,18 @@ void UpdateBGControlRegisters(void) BG[3] = 3; } - REG_BG0HOFS = gUnknown_202D698.hofs; - REG_BG0VOFS = gUnknown_202D698.vofs; - REG_BG1HOFS = gUnknown_202D6A0.hofs; - REG_BG1VOFS = gUnknown_202D6A0.vofs; - REG_BG2HOFS = gUnknown_202D6A8.hofs; - REG_BG2VOFS = gUnknown_202D6A8.vofs; - REG_BG3HOFS = gUnknown_202D6B0.hofs; - REG_BG3VOFS = gUnknown_202D6B0.vofs; + REG_BG0HOFS = gBG0Control.hofs; + REG_BG0VOFS = gBG0Control.vofs; + REG_BG1HOFS = gBG1Control.hofs; + REG_BG1VOFS = gBG1Control.vofs; + REG_BG2HOFS = gBG2Control.hofs; + REG_BG2VOFS = gBG2Control.vofs; + REG_BG3HOFS = gBG3Control.hofs; + REG_BG3VOFS = gBG3Control.vofs; REG_BG0CNT = BG[0] | 0xB0 << 6; REG_BG1CNT = BG[1] | 0xB4 << 6; - if(gUnknown_202D6A8.unk2 == 0x80 << 8) + if(gBG2Control.unk2 == 0x80 << 8) { REG_BG2CNT = BG[2] | 0x2e08; } @@ -276,7 +279,7 @@ void sub_800BD08(void) while(counter >= 0) { preload->unk0 = zero2; - preload->unk2 = 0x3e5; + preload->songIndex = 0x3e5; preload->unk4 = zero2; preload->unk6 = zero; counter--; @@ -449,3 +452,340 @@ u16 GetCurrentBGSong(void) { return gCurrentBGSong; } + +#ifdef NONMATCHING +void sub_800C074(u16 SongIndex,u16 param_2) +{ + bool8 interrupt_flag; + u16 msVar; + struct unkStruct_3000FD8 *preload; + + if (SongIndex == 0x3e5) + return; + if (0x100 < param_2) + param_2 = 0x100; + + if (sub_800CACC(SongIndex)) + { + msVar = sub_800CAE0(SongIndex); + if (msVar == 1) { + interrupt_flag = DisableInterrupts(); + gUnknown_202D68E = SongIndex; + if(gUnknown_202D690 == 0) + { + if (gCurrentBGSong != 999) + { + if ((u16)(gBGMusicPlayerState - 1U) < 2) + { + gUnknown_202D690 = msVar; + gUnknown_202D692 = 16; + gUnknown_202D694 = 0; + m4aMPlayFadeOutTemporarily(&gUnknown_20008F0,1); + } + else + { + if (gBGMusicPlayerState == 3) + gUnknown_202D690 = 2; + else + { + gUnknown_202D690 = 3; + m4aMPlayStop(&gUnknown_20008F0); + m4aSongNumStart(gUnknown_202D68E); + } + } + } + } + else + { + if (1 < (u16)(gUnknown_202D690 - 1U)) + { + m4aMPlayStop(&gUnknown_20008F0); + m4aSongNumStart(gUnknown_202D68E); + gUnknown_202D690 = 3; + } + } + switch(gCurrentBGSong) + { + case 26: // 0x1A + case 27: // 0x1B + case 28: // 0x1C + case 29: // 0x1D + case 30: // 0x1E + case 31: // 0x1F + case 34: // 0x22 + case 35: // 0x23 + case 37: // 0x25 + case 38: // 0x26 + case 117: // 0x75 + case 118: // 0x76 + case 119: // 0x77 + case 122: // 0x7A + case 127: // 0x7F + gUnknown_202D694 = 1; + break; + default: + break; + } + if (interrupt_flag) + EnableInterrupts(); + } + else + { + nullsub_20(SongIndex); + } + } + else + { + if (!sub_800CAAC(SongIndex)) + return; + msVar = sub_800CAE0(SongIndex); + preload = &gUnknown_3000FD8[msVar]; // need to load this before comparison to match + if (msVar <= 1) + nullsub_20(SongIndex); + else + { + interrupt_flag = DisableInterrupts(); + m4aSongNumStart(SongIndex); + preload->unk0 = 1; + preload->songIndex = SongIndex; + // TODO fix this comparison + // Generates eor/neg/lsr + preload->unk6 = param_2 != 0x100; + preload->unk4 = param_2; + if (interrupt_flag) + EnableInterrupts(); + } + } +} +#else +NAKED +void sub_800C074(u16 SongIndex, u16 param_2) +{ + asm_unified("\tpush {r4-r7,lr}\n" + "\tmov r7, r8\n" + "\tpush {r7}\n" + "\tlsls r0, 16\n" + "\tlsrs r5, r0, 16\n" + "\tmov r8, r5\n" + "\tlsls r1, 16\n" + "\tlsrs r6, r1, 16\n" + "\tldr r0, _0800C0FC\n" + "\tcmp r5, r0\n" + "\tbne _0800C08C\n" + "\tb _0800C208\n" +"_0800C08C:\n" + "\tmovs r7, 0x80\n" + "\tlsls r7, 1\n" + "\tcmp r6, r7\n" + "\tbls _0800C096\n" + "\tadds r6, r7, 0\n" +"_0800C096:\n" + "\tadds r0, r5, 0\n" + "\tbl sub_800CACC\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbne _0800C0A4\n" + "\tb _0800C1B0\n" +"_0800C0A4:\n" + "\tadds r0, r5, 0\n" + "\tbl sub_800CAE0\n" + "\tlsls r0, 16\n" + "\tlsrs r7, r0, 16\n" + "\tcmp r7, 0x1\n" + "\tbeq _0800C0B4\n" + "\tb _0800C1D0\n" +"_0800C0B4:\n" + "\tbl DisableInterrupts\n" + "\tlsls r0, 24\n" + "\tlsrs r0, 24\n" + "\tmov r8, r0\n" + "\tldr r6, _0800C100\n" + "\tstrh r5, [r6]\n" + "\tldr r4, _0800C104\n" + "\tldrh r0, [r4]\n" + "\tadds r2, r0, 0\n" + "\tcmp r2, 0\n" + "\tbne _0800C144\n" + "\tldr r0, _0800C108\n" + "\tldrh r1, [r0]\n" + "\tldr r0, _0800C10C\n" + "\tcmp r1, r0\n" + "\tbeq _0800C12C\n" + "\tldr r0, _0800C110\n" + "\tldrh r1, [r0]\n" + "\tsubs r0, r1, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tcmp r0, 0x1\n" + "\tbhi _0800C120\n" + "\tstrh r7, [r4]\n" + "\tldr r1, _0800C114\n" + "\tmovs r0, 0x10\n" + "\tstrh r0, [r1]\n" + "\tldr r0, _0800C118\n" + "\tstrb r2, [r0]\n" + "\tldr r0, _0800C11C\n" + "\tmovs r1, 0x1\n" + "\tbl m4aMPlayFadeOutTemporarily\n" + "\tb _0800C15E\n" + "\t.align 2, 0\n" +"_0800C0FC: .4byte 0x000003e5\n" +"_0800C100: .4byte gUnknown_202D68E\n" +"_0800C104: .4byte gUnknown_202D690\n" +"_0800C108: .4byte gCurrentBGSong\n" +"_0800C10C: .4byte 0x000003e7\n" +"_0800C110: .4byte gBGMusicPlayerState\n" +"_0800C114: .4byte gUnknown_202D692\n" +"_0800C118: .4byte gUnknown_202D694\n" +"_0800C11C: .4byte gUnknown_20008F0\n" +"_0800C120:\n" + "\tlsls r0, r1, 16\n" + "\tlsrs r0, 16\n" + "\tcmp r0, 0x3\n" + "\tbne _0800C12C\n" + "\tmovs r0, 0x2\n" + "\tb _0800C15C\n" +"_0800C12C:\n" + "\tmovs r0, 0x3\n" + "\tstrh r0, [r4]\n" + "\tldr r0, _0800C140\n" + "\tbl m4aMPlayStop\n" + "\tldrh r0, [r6]\n" + "\tbl m4aSongNumStart\n" + "\tb _0800C15E\n" + "\t.align 2, 0\n" +"_0800C140: .4byte gUnknown_20008F0\n" +"_0800C144:\n" + "\tsubs r0, 0x1\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tcmp r0, 0x1\n" + "\tbls _0800C15E\n" + "\tldr r0, _0800C17C\n" + "\tbl m4aMPlayStop\n" + "\tldrh r0, [r6]\n" + "\tbl m4aSongNumStart\n" + "\tmovs r0, 0x3\n" +"_0800C15C:\n" + "\tstrh r0, [r4]\n" +"_0800C15E:\n" + "\tldr r0, _0800C180\n" + "\tldrh r0, [r0]\n" + "\tcmp r0, 0x26\n" + "\tbgt _0800C184\n" + "\tcmp r0, 0x25\n" + "\tbge _0800C19A\n" + "\tcmp r0, 0x1A\n" + "\tblt _0800C1A0\n" + "\tcmp r0, 0x1F\n" + "\tble _0800C19A\n" + "\tcmp r0, 0x23\n" + "\tbgt _0800C1A0\n" + "\tcmp r0, 0x22\n" + "\tblt _0800C1A0\n" + "\tb _0800C19A\n" + "\t.align 2, 0\n" +"_0800C17C: .4byte gUnknown_20008F0\n" +"_0800C180: .4byte gCurrentBGSong\n" +"_0800C184:\n" + "\tcmp r0, 0x7A\n" + "\tbeq _0800C19A\n" + "\tcmp r0, 0x7A\n" + "\tbgt _0800C196\n" + "\tcmp r0, 0x77\n" + "\tbgt _0800C1A0\n" + "\tcmp r0, 0x75\n" + "\tblt _0800C1A0\n" + "\tb _0800C19A\n" +"_0800C196:\n" + "\tcmp r0, 0x7F\n" + "\tbne _0800C1A0\n" +"_0800C19A:\n" + "\tldr r1, _0800C1AC\n" + "\tmovs r0, 0x1\n" + "\tstrb r0, [r1]\n" +"_0800C1A0:\n" + "\tmov r0, r8\n" + "\tcmp r0, 0\n" + "\tbeq _0800C208\n" + "\tbl EnableInterrupts\n" + "\tb _0800C208\n" + "\t.align 2, 0\n" +"_0800C1AC: .4byte gUnknown_202D694\n" +"_0800C1B0:\n" + "\tadds r0, r5, 0\n" + "\tbl sub_800CAAC\n" + "\tlsls r0, 24\n" + "\tcmp r0, 0\n" + "\tbeq _0800C208\n" + "\tadds r0, r5, 0\n" + "\tbl sub_800CAE0\n" + "\tlsls r0, 16\n" + "\tlsrs r0, 16\n" + "\tlsls r2, r0, 3\n" + "\tldr r1, _0800C1D8\n" + "\tadds r4, r2, r1\n" + "\tcmp r0, 0x1\n" + "\tbhi _0800C1DC\n" +"_0800C1D0:\n" + "\tadds r0, r5, 0\n" + "\tbl nullsub_20\n" + "\tb _0800C208\n" + "\t.align 2, 0\n" +"_0800C1D8: .4byte gUnknown_3000FD8\n" +"_0800C1DC:\n" + "\tbl DisableInterrupts\n" + "\tlsls r0, 24\n" + "\tlsrs r5, r0, 24\n" + "\tmov r0, r8\n" + "\tbl m4aSongNumStart\n" + "\tmovs r0, 0x1\n" + "\tstrh r0, [r4]\n" + "\tmov r0, r8\n" + "\tstrh r0, [r4, 0x2]\n" + "\tcmp r6, r7\n" + "\tbne _0800C1FA\n" + "\tmovs r0, 0\n" + "\tb _0800C1FC\n" +"_0800C1FA:\n" + "\tmovs r0, 0x1\n" +"_0800C1FC:\n" + "\tstrb r0, [r4, 0x6]\n" + "\tstrh r6, [r4, 0x4]\n" + "\tcmp r5, 0\n" + "\tbeq _0800C208\n" + "\tbl EnableInterrupts\n" +"_0800C208:\n" + "\tpop {r3}\n" + "\tmov r8, r3\n" + "\tpop {r4-r7}\n" + "\tpop {r0}\n" + "\tbx r0"); +} +#endif + +void sub_800C214(u16 songIndex, u16 volume) +{ + bool8 interrupt_flag; + u16 msVar; + struct MusicPlayerInfo *info; + struct unkStruct_3000FD8 *preload; + + if (256 < volume) { + volume = 256; + } + + if ((!sub_800CACC(songIndex)) && (sub_800CAAC(songIndex))) { + msVar = sub_800CAE0(songIndex); + info = gMPlayTable[msVar].info; + preload = &gUnknown_3000FD8[msVar]; + if (msVar > 1) { + interrupt_flag = DisableInterrupts(); + if (preload->songIndex == songIndex) { + m4aMPlayVolumeControl(info, 0xf, volume); + } + if (interrupt_flag) + EnableInterrupts(); + } + } +} |