more work on music functions

This commit is contained in:
Seth Barberee
2020-11-17 22:20:28 -06:00
parent 0f6b5a1649
commit 6e33dcb937
6 changed files with 1490 additions and 1518 deletions

File diff suppressed because it is too large Load Diff

1178
asm/music.s Normal file

File diff suppressed because it is too large Load Diff

25
include/m4a.h Normal file
View File

@@ -0,0 +1,25 @@
#ifndef GUARD_M4A_H
#define GUARD_M4A_H
#include "gba/m4a_internal.h"
void m4aSoundVSyncOn(void);
void m4aSoundVSyncOff(void);
void m4aSoundInit(void);
void m4aSoundMain(void);
void m4aSongNumStart(u16 n);
void m4aSongNumStartOrChange(u16 n);
void m4aSongNumStop(u16 n);
void m4aMPlayAllStop(void);
void m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo);
void m4aMPlayFadeOut(struct MusicPlayerInfo *mplayInfo, u16 speed);
void m4aMPlayFadeOutTemporarily(struct MusicPlayerInfo *mplayInfo, u16 speed);
void m4aMPlayFadeIn(struct MusicPlayerInfo *mplayInfo, u16 speed);
void m4aMPlayImmInit(struct MusicPlayerInfo *mplayInfo);
void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo);
extern struct MusicPlayerInfo gUnknown_20008F0; // BGM??
#endif //GUARD_M4A_H

View File

@@ -73,6 +73,8 @@ SECTIONS {
asm/code_800B540.o(.text);
src/code_800B5F0.o(.text);
asm/code_800B5F0.o(.text);
src/music_pre.o(.text);
asm/music.o(.text);
src/music.o(.text);
src/code_800C9CC.o(.text);
asm/code_800C9CC.o(.text);

View File

@@ -1,5 +1,5 @@
#include "global.h"
#include "gba/m4a_internal.h"
#include "m4a.h"
#define NUM_BG_SONGS 128
@@ -9,24 +9,18 @@ extern void sub_809C730();
extern bool8 DisableInterrupts();
extern bool8 EnableInterrupts();
extern void m4aSoundVSyncOn();
extern void m4aSongNumStart(u16);
extern void m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo);
extern void m4aSoundVSyncOff();
extern void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo);
extern void sub_800C3F8(u16, u16);
extern void Random();
extern void sub_800BA5C();
extern void xxx_update_bg_sound_input();
extern u16 gUnknown_202D690;
extern u16 gUnknown_202D68A;
extern u16 gUnknown_202D688;
extern u16 gUnknown_202D68A;
extern u16 gUnknown_202D690;
extern u8 gUnknown_202D694;
extern u32 gUnknown_203B0B8;
extern u16 gUnknown_203B0BC;
extern struct MusicPlayerInfo gUnknown_20008F0;
bool8 IsBGSong(u32);
bool8 sub_800CAAC(u32);
@@ -232,7 +226,7 @@ bool8 sub_800CAF0(u16 songIndex)
return 1;
}
void nullsub_20(void)
void nullsub_20(u16 songIndex)
{
}

281
src/music_pre.c Normal file
View File

@@ -0,0 +1,281 @@
#include "global.h"
#include "gba/io_reg.h"
#include "m4a.h"
extern void nullsub_19(void);
extern void nullsub_20(u16 songIndex);
extern bool8 EnableInterrupts(void);
extern bool8 DisableInterrupts(void);
extern bool8 IsBGSong(u32);
extern void sub_800C298(u16 r0);
extern u16 sub_800CAE0(u16);
extern u32 gUnknown_202D5F0[];
extern u16 gUnknown_202D688;
extern u16 gUnknown_202D68A;
extern u16 gUnknown_202D68C;
extern u16 gUnknown_202D68E;
extern u16 gUnknown_202D690;
extern u16 gUnknown_202D692;
extern u8 gUnknown_202D694;
struct unkStruct_3000FD8
{
u16 unk0;
u16 unk2;
u16 unk4;
u8 unk6;
u8 padding;
};
extern struct unkStruct_3000FD8 gUnknown_3000FD8[];
void sub_800BF80(void);
void sub_800BD08(void)
{
s32 counter;
u16 zero;
u16 zero2;
struct unkStruct_3000FD8 *preload;
DmaStop(0);
DmaStop(1);
DmaStop(2);
DmaStop(3);
m4aSoundInit();
gUnknown_202D688 = 0;
gUnknown_202D68A = 0x3e7;
gUnknown_202D68C = 0x3e7;
gUnknown_202D68E = 0x3e5;
gUnknown_202D690 = 0;
gUnknown_202D692 = 0;
gUnknown_202D694 = 0;
// Kinda hacky but makes things match
preload = gUnknown_3000FD8;
zero = 0;
zero2 = 0;
counter = 7;
while(counter >= 0)
{
preload->unk0 = zero2;
preload->unk2 = 0x3e5;
preload->unk4 = zero2;
preload->unk6 = zero;
counter--;
preload++;
}
nullsub_19();
}
void sub_800BDDC(void)
{
sub_800BF80();
sub_800C298(0x3e6);
sub_800C298(0x3e5);
}
void sub_800BDFC(u16 songIndex)
{
bool8 interrupt_flag;
u16 temp_store;
if(!IsBGSong(songIndex))
return;
if(songIndex == 0x3e7)
return;
if(songIndex == gUnknown_202D68A)
{
temp_store = gUnknown_202D688 - 1;
if(temp_store <= 1)
return;
}
if(sub_800CAE0(songIndex))
{
nullsub_20(songIndex);
return;
}
interrupt_flag = DisableInterrupts();
gUnknown_202D68A = songIndex;
gUnknown_202D694 = 1;
if(gUnknown_202D690 == 0)
{
gUnknown_202D688 = 1;
m4aSongNumStart(songIndex);
}
if(interrupt_flag)
EnableInterrupts();
}
#ifndef NONMATCHING
NAKED
#endif
void sub_800BE8C(u16 SongIndex, u16 r1)
{
#ifdef NONMATCHING
// TODO regswap memes
bool8 interrupt_flag;
u16 temp_store;
if(!IsBGSong(SongIndex))
return;
if(SongIndex == 0x3e7)
return;
if(SongIndex == gUnknown_202D68A)
{
temp_store = gUnknown_202D688 - 1;
if((temp_store) <= 1)
return;
}
if((r1 > 0x80 << 1))
{
r1 = 0x10;
}
else
{
if(r1 >> 4 == 0)
{
r1 = 1;
}
}
interrupt_flag = DisableInterrupts();
gUnknown_202D68A = SongIndex;
gUnknown_202D694 = 1;
if(gUnknown_202D690 == 0)
{
gUnknown_202D688 = 1;
m4aSongNumStart(SongIndex);
m4aMPlayImmInit(&gUnknown_20008F0);
m4aMPlayVolumeControl(&gUnknown_20008F0, 0xFF, 0);
m4aSongNumStop(SongIndex);
m4aMPlayFadeIn(&gUnknown_20008F0, r1);
}
if(interrupt_flag)
EnableInterrupts();
#else
asm_unified("\tpush {r4-r7,lr}\n"
"\tlsls r0, 16\n"
"\tlsrs r6, r0, 16\n"
"\tlsls r4, r1, 16\n"
"\tlsrs r5, r4, 16\n"
"\tadds r0, r6, 0\n"
"\tbl IsBGSong\n"
"\tlsls r0, 24\n"
"\tcmp r0, 0\n"
"\tbeq _0800BF2E\n"
"\tldr r0, _0800BECC\n"
"\tcmp r6, r0\n"
"\tbeq _0800BF2E\n"
"\tldr r0, _0800BED0\n"
"\tldrh r0, [r0]\n"
"\tcmp r6, r0\n"
"\tbne _0800BEBE\n"
"\tldr r0, _0800BED4\n"
"\tldrh r0, [r0]\n"
"\tsubs r0, 0x1\n"
"\tlsls r0, 16\n"
"\tlsrs r0, 16\n"
"\tcmp r0, 0x1\n"
"\tbls _0800BF2E\n"
"_0800BEBE:\n"
"\tmovs r0, 0x80\n"
"\tlsls r0, 1\n"
"\tcmp r5, r0\n"
"\tbls _0800BED8\n"
"\tmovs r5, 0x10\n"
"\tb _0800BEE0\n"
"\t.align 2, 0\n"
"_0800BECC: .4byte 0x000003e7\n"
"_0800BED0: .4byte gUnknown_202D68A\n"
"_0800BED4: .4byte gUnknown_202D688\n"
"_0800BED8:\n"
"\tlsrs r5, r4, 20\n"
"\tcmp r5, 0\n"
"\tbne _0800BEE0\n"
"\tmovs r5, 0x1\n"
"_0800BEE0:\n"
"\tbl DisableInterrupts\n"
"\tlsls r0, 24\n"
"\tlsrs r7, r0, 24\n"
"\tldr r0, _0800BF34\n"
"\tstrh r6, [r0]\n"
"\tldr r1, _0800BF38\n"
"\tmovs r0, 0x1\n"
"\tstrb r0, [r1]\n"
"\tldr r0, _0800BF3C\n"
"\tldrh r0, [r0]\n"
"\tcmp r0, 0\n"
"\tbne _0800BF26\n"
"\tldr r0, _0800BF40\n"
"\tmovs r1, 0x1\n"
"\tstrh r1, [r0]\n"
"\tadds r0, r6, 0\n"
"\tbl m4aSongNumStart\n"
"\tldr r4, _0800BF44\n"
"\tadds r0, r4, 0\n"
"\tbl m4aMPlayImmInit\n"
"\tadds r0, r4, 0\n"
"\tmovs r1, 0xFF\n"
"\tmovs r2, 0\n"
"\tbl m4aMPlayVolumeControl\n"
"\tadds r0, r6, 0\n"
"\tbl m4aSongNumStop\n"
"\tadds r0, r4, 0\n"
"\tadds r1, r5, 0\n"
"\tbl m4aMPlayFadeIn\n"
"_0800BF26:\n"
"\tcmp r7, 0\n"
"\tbeq _0800BF2E\n"
"\tbl EnableInterrupts\n"
"_0800BF2E:\n"
"\tpop {r4-r7}\n"
"\tpop {r0}\n"
"\tbx r0\n"
"\t.align 2, 0\n"
"_0800BF34: .4byte gUnknown_202D68A\n"
"_0800BF38: .4byte gUnknown_202D694\n"
"_0800BF3C: .4byte gUnknown_202D690\n"
"_0800BF40: .4byte gUnknown_202D688\n"
"_0800BF44: .4byte gUnknown_20008F0");
#endif
}
void sub_800BF48(u16 SongIndex)
{
u16 preload = gUnknown_202D68A;
if(preload == 0x3e7)
{
sub_800BDFC(SongIndex);
gUnknown_202D68C = preload;
return;
}
gUnknown_202D68C = SongIndex;
}
void sub_800BF80(void)
{
bool8 interrupt_flag = DisableInterrupts();
if(gUnknown_202D690 == 0)
{
if(gUnknown_202D68A != 0x3e7)
{
m4aMPlayStop(&gUnknown_20008F0);
}
}
gUnknown_202D68A = 0x3e7;
gUnknown_202D68C = 0x3e7;
if(interrupt_flag)
EnableInterrupts();
}