summaryrefslogtreecommitdiff
path: root/src/music_pre.c
diff options
context:
space:
mode:
authorSeth Barberee <seth.barberee@gmail.com>2020-12-17 13:17:58 -0600
committerGitHub <noreply@github.com>2020-12-17 13:17:58 -0600
commit096de8d9b2ffd90c52e790296bfd7c5436d45ca3 (patch)
tree9c5af2e04dea05221c71946a5dfc06471f77801d /src/music_pre.c
parentbc504264f1e54b3c1e482710c592e5549828bfe1 (diff)
parentf90f3affeb9b0a66aa7df68f5fdecd692033faf9 (diff)
Merge pull request #12 from SethBarberee/master
Merge work from SethBarberee/pmd-red into pret.
Diffstat (limited to 'src/music_pre.c')
-rw-r--r--src/music_pre.c241
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;
+}