diff options
Diffstat (limited to 'src/music_pre.c')
-rw-r--r-- | src/music_pre.c | 241 |
1 files changed, 241 insertions, 0 deletions
diff --git a/src/music_pre.c b/src/music_pre.c new file mode 100644 index 0000000..292f0a8 --- /dev/null +++ b/src/music_pre.c @@ -0,0 +1,241 @@ +#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[8]; + +void sub_800BF80(void); + +// Some kind of initializer for music? +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(); +} + +void FadeInNewBGM(u16 SongIndex, u16 speed) +{ + 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((speed > 256)) + { + speed = 16; + + } + else + { + if((speed >>= 4) == 0) + { + speed = 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, speed); + } + if(interrupt_flag) + EnableInterrupts(); +} + +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(); +} + +void sub_800BFD0(u16 speed) +{ + + u32 comparison; + bool8 interrupt_flag; + + // TODO clean this comparison up + comparison = 0x80 << 17; // 16777216 + if((speed * 65536) > comparison) + { + speed = 16; + } + else + { + if((speed >>= 4) == 0) + { + speed = 1; + } + } + interrupt_flag = DisableInterrupts(); + if(gUnknown_202D690 == 0) + { + if(gUnknown_202D68A != 0x3e7) + { + if(gUnknown_202D688 == 2) + { + gUnknown_202D688 = 3; + m4aMPlayFadeOut(&gUnknown_20008F0, speed); + } + else + { + gUnknown_202D68A = 0x3e7; + m4aMPlayStop(&gUnknown_20008F0); + } + } + } + else + { + gUnknown_202D68A = 0x3e7; + } + gUnknown_202D68C = 0x3e7; + if(interrupt_flag) + EnableInterrupts(); +} + +u16 sub_800C068(void) +{ + return gUnknown_202D68A; +} |