summaryrefslogtreecommitdiff
path: root/src/music_pre.c
diff options
context:
space:
mode:
authorSeth Barberee <seth.barberee@gmail.com>2021-01-07 16:10:24 -0600
committerSeth Barberee <seth.barberee@gmail.com>2021-01-09 10:33:29 -0600
commitec192a8fa80c389c67878d3da9f9faeb07b1451f (patch)
treece0ee74fdae92286e4ae091196bb5044c6a1f768 /src/music_pre.c
parent469212f7ee42d04e3160d357ed1f088f12edd391 (diff)
5% wooo
Diffstat (limited to 'src/music_pre.c')
-rw-r--r--src/music_pre.c225
1 files changed, 190 insertions, 35 deletions
diff --git a/src/music_pre.c b/src/music_pre.c
index 4260ea1..42a8cb0 100644
--- a/src/music_pre.c
+++ b/src/music_pre.c
@@ -2,24 +2,33 @@
#include "gba/io_reg.h"
#include "m4a.h"
#include "bg.h"
+#include "music.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 SoundBiasReset();
+extern void SoundBiasSet();
+extern void SetInterruptFlag(u16);
+extern void nullsub_25();
+extern void nullsub_18();
extern void sub_800C298(u16 r0);
-extern u16 sub_800CAE0(u16);
-extern u32 gUnknown_202D5F0[];
-extern u16 gUnknown_202D688;
-extern u16 gUnknown_202D68A;
+typedef void (*IntrCallback)(void);
+extern IntrCallback gUnknown_202D5F0[];
+
+extern u32 gUnknown_203B0A0;
+extern u16 gBGMusicPlayerState;
+extern u16 gCurrentBGSong;
extern u16 gUnknown_202D68C;
extern u16 gUnknown_202D68E;
extern u16 gUnknown_202D690;
extern u16 gUnknown_202D692;
extern u8 gUnknown_202D694;
+extern u8 gUnknown_203B099;
+extern u8 gUnknown_203B09B;
+extern u32 gUnknown_203B09C;
+extern u8 gUnknown_203B09A;
struct unkStruct_3000FD8
{
@@ -40,6 +49,152 @@ extern struct BGControlStruct gUnknown_202D6A8;
extern struct BGControlStruct gUnknown_202D6B0;
void sub_800BF80(void);
+void xxx_update_bg_sound_input(void);
+
+void sub_800BA5C(void)
+{
+ if(gUnknown_203B09A != 0)
+ {
+ gUnknown_203B09C++;
+ xxx_update_bg_sound_input();
+ }
+ gUnknown_203B09A = 1;
+ gUnknown_203B09B = 0;
+ gUnknown_203B09C = 0;
+ nullsub_25();
+
+ while(REG_VCOUNT > 159){}
+
+ gUnknown_203B099 = 1;
+ VBlankIntrWait();
+ nullsub_18();
+}
+
+#ifdef NONMATCHING
+void xxx_update_bg_sound_input(void)
+{
+ u8 store;
+ store = gUnknown_203B09B;
+ if(gUnknown_203B09B != 0){
+ gUnknown_203B09C++;
+ }
+ else {
+ gUnknown_203B09B = 1;
+ gUnknown_203B09A = store;
+ gUnknown_203B09C = store;
+ UpdateBGControlRegisters();
+ if(gUnknown_203B099 != 0)
+ UpdateSound();
+ UpdateInput();
+ gUnknown_203B099 = store;
+ gUnknown_203B0A4 = gUnknown_203B0A0;
+ }
+}
+#else
+NAKED
+void xxx_update_bg_sound_input(void)
+{
+ asm_unified("\tpush {r4,r5,lr}\n"
+ "\tldr r1, _0800BACC\n"
+ "\tldrb r4, [r1]\n"
+ "\tcmp r4, 0\n"
+ "\tbeq _0800BAD4\n"
+ "\tldr r1, _0800BAD0\n"
+ "\tldr r0, [r1]\n"
+ "\tadds r0, 0x1\n"
+ "\tstr r0, [r1]\n"
+ "\tb _0800BAFE\n"
+ "\t.align 2, 0\n"
+"_0800BACC: .4byte gUnknown_203B09B\n"
+"_0800BAD0: .4byte gUnknown_203B09C\n"
+"_0800BAD4:\n"
+ "\tmovs r0, 0x1\n"
+ "\tstrb r0, [r1]\n"
+ "\tldr r0, _0800BB04\n"
+ "\tstrb r4, [r0]\n"
+ "\tldr r0, _0800BB08\n"
+ "\tstr r4, [r0]\n"
+ "\tbl UpdateBGControlRegisters\n"
+ "\tldr r5, _0800BB0C\n"
+ "\tldrb r0, [r5]\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0800BAF0\n"
+ "\tbl UpdateSound\n"
+"_0800BAF0:\n"
+ "\tbl UpdateInput\n"
+ "\tstrb r4, [r5]\n"
+ "\tldr r0, _0800BB10\n"
+ "\tldr r1, _0800BB14\n"
+ "\tldr r1, [r1]\n"
+ "\tstr r1, [r0]\n"
+"_0800BAFE:\n"
+ "\tpop {r4,r5}\n"
+ "\tpop {r0}\n"
+ "\tbx r0\n"
+ "\t.align 2, 0\n"
+"_0800BB04: .4byte gUnknown_203B09A\n"
+"_0800BB08: .4byte gUnknown_203B09C\n"
+"_0800BB0C: .4byte gUnknown_203B099\n"
+"_0800BB10: .4byte gUnknown_203B0A4\n"
+"_0800BB14: .4byte gUnknown_203B0A0");
+}
+#endif
+
+void Timer3Intr(void)
+{
+ if(gUnknown_202D5F0[4])
+ gUnknown_202D5F0[4]();
+ SetInterruptFlag(INTR_FLAG_TIMER3);
+}
+
+// Unused
+u32 sub_800BB34(void)
+{
+ return gUnknown_203B0A0;
+}
+
+void nullsub_178(void)
+{
+}
+
+// Unused
+void sub_800BB44(void)
+{
+ u16 ie_store;
+ u16 dispcnt_store;
+ bool8 interrupt_flag;
+
+ while(REG_KEYINPUT != 0x3ff){}
+
+ interrupt_flag = DisableInterrupts();
+
+ while(REG_VCOUNT <= 159){}
+
+ dispcnt_store = REG_DISPCNT;
+ REG_DISPCNT = 0x80;
+
+ *(vu16 *)BG_PLTT = 0x7fff;
+
+ ie_store = REG_IE;
+ REG_IE = INTR_FLAG_KEYPAD | INTR_FLAG_GAMEPAK;
+
+ REG_KEYCNT = 0x8304;
+ REG_IME = 1;
+
+ SoundBiasReset();
+ asm("swi 0x3");
+ SoundBiasSet();
+
+ REG_IME = 0;
+ REG_IE = ie_store;
+ REG_KEYCNT = 0;
+ REG_DISPCNT = dispcnt_store;
+ *(vu16 *)BG_PLTT = 0;
+
+ if(interrupt_flag)
+ EnableInterrupts();
+ while(REG_KEYINPUT != 0x3ff){}
+}
void nullsub_17(void)
{
@@ -104,9 +259,9 @@ void sub_800BD08(void)
m4aSoundInit();
- gUnknown_202D688 = 0;
- gUnknown_202D68A = 0x3e7;
- gUnknown_202D68C = 0x3e7;
+ gBGMusicPlayerState = 0;
+ gCurrentBGSong = 999;
+ gUnknown_202D68C = 999;
gUnknown_202D68E = 0x3e5;
gUnknown_202D690 = 0;
gUnknown_202D692 = 0;
@@ -138,18 +293,18 @@ void sub_800BDDC(void)
}
-void sub_800BDFC(u16 songIndex)
+void StartNewBGM(u16 songIndex)
{
bool8 interrupt_flag;
u16 temp_store;
if(!IsBGSong(songIndex))
return;
- if(songIndex == 0x3e7)
+ if(songIndex == 999)
return;
- if(songIndex == gUnknown_202D68A)
+ if(songIndex == gCurrentBGSong)
{
- temp_store = gUnknown_202D688 - 1;
+ temp_store = gBGMusicPlayerState - 1;
if(temp_store <= 1)
return;
}
@@ -159,12 +314,12 @@ void sub_800BDFC(u16 songIndex)
return;
}
interrupt_flag = DisableInterrupts();
- gUnknown_202D68A = songIndex;
+ gCurrentBGSong = songIndex;
gUnknown_202D694 = 1;
if(gUnknown_202D690 == 0)
{
- gUnknown_202D688 = 1;
+ gBGMusicPlayerState = 1;
m4aSongNumStart(songIndex);
}
if(interrupt_flag)
@@ -178,11 +333,11 @@ void FadeInNewBGM(u16 SongIndex, u16 speed)
if(!IsBGSong(SongIndex))
return;
- if(SongIndex == 0x3e7)
+ if(SongIndex == 999)
return;
- if(SongIndex == gUnknown_202D68A)
+ if(SongIndex == gCurrentBGSong)
{
- temp_store = gUnknown_202D688 - 1;
+ temp_store = gBGMusicPlayerState - 1;
if((temp_store) <= 1)
return;
}
@@ -201,12 +356,12 @@ void FadeInNewBGM(u16 SongIndex, u16 speed)
}
interrupt_flag = DisableInterrupts();
- gUnknown_202D68A = SongIndex;
+ gCurrentBGSong = SongIndex;
gUnknown_202D694 = 1;
if(gUnknown_202D690 == 0)
{
- gUnknown_202D688 = 1;
+ gBGMusicPlayerState = 1;
m4aSongNumStart(SongIndex);
m4aMPlayImmInit(&gUnknown_20008F0);
m4aMPlayVolumeControl(&gUnknown_20008F0, 0xFF, 0);
@@ -219,10 +374,10 @@ void FadeInNewBGM(u16 SongIndex, u16 speed)
void sub_800BF48(u16 SongIndex)
{
- u16 preload = gUnknown_202D68A;
- if(preload == 0x3e7)
+ u16 preload = gCurrentBGSong;
+ if(preload == 999)
{
- sub_800BDFC(SongIndex);
+ StartNewBGM(SongIndex);
gUnknown_202D68C = preload;
return;
}
@@ -234,13 +389,13 @@ void sub_800BF80(void)
bool8 interrupt_flag = DisableInterrupts();
if(gUnknown_202D690 == 0)
{
- if(gUnknown_202D68A != 0x3e7)
+ if(gCurrentBGSong != 999)
{
m4aMPlayStop(&gUnknown_20008F0);
}
}
- gUnknown_202D68A = 0x3e7;
- gUnknown_202D68C = 0x3e7;
+ gCurrentBGSong = 999;
+ gUnknown_202D68C = 999;
if(interrupt_flag)
EnableInterrupts();
}
@@ -267,30 +422,30 @@ void sub_800BFD0(u16 speed)
interrupt_flag = DisableInterrupts();
if(gUnknown_202D690 == 0)
{
- if(gUnknown_202D68A != 0x3e7)
+ if(gCurrentBGSong != 999)
{
- if(gUnknown_202D688 == 2)
+ if(gBGMusicPlayerState == 2)
{
- gUnknown_202D688 = 3;
+ gBGMusicPlayerState = 3;
m4aMPlayFadeOut(&gUnknown_20008F0, speed);
}
else
{
- gUnknown_202D68A = 0x3e7;
+ gCurrentBGSong = 999;
m4aMPlayStop(&gUnknown_20008F0);
}
}
}
else
{
- gUnknown_202D68A = 0x3e7;
+ gCurrentBGSong = 999;
}
- gUnknown_202D68C = 0x3e7;
+ gUnknown_202D68C = 999;
if(interrupt_flag)
EnableInterrupts();
}
-u16 sub_800C068(void)
+u16 GetCurrentBGSong(void)
{
- return gUnknown_202D68A;
+ return gCurrentBGSong;
}