summaryrefslogtreecommitdiff
path: root/src/music.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/music.c')
-rw-r--r--src/music.c184
1 files changed, 180 insertions, 4 deletions
diff --git a/src/music.c b/src/music.c
index b6fed30..7767f16 100644
--- a/src/music.c
+++ b/src/music.c
@@ -1,6 +1,8 @@
#include "global.h"
#include "gba/m4a_internal.h"
+#define NUM_BG_SONGS 128
+
extern u8 sub_80023E4(u32);
extern void sub_80118C4(u16);
extern void sub_809C730();
@@ -13,18 +15,23 @@ extern void m4aMPlayContinue(struct MusicPlayerInfo *mplayInfo);
extern void m4aSoundVSyncOff();
extern void m4aMPlayStop(struct MusicPlayerInfo *mplayInfo);
-extern u16 sub_800CAE0(u16);
-extern u8 sub_800CACC(u32);
-extern u8 sub_800CAAC(u32);
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 u8 gUnknown_202D694;
+extern u32 gUnknown_203B0B8;
+extern u16 gUnknown_203B0BC;
extern struct MusicPlayerInfo gUnknown_20008F0;
+bool8 IsBGSong(u32);
+bool8 sub_800CAAC(u32);
+bool8 sub_800CACC(u32);
+u16 sub_800CAE0(u16);
void sub_800C93C(void)
{
@@ -98,3 +105,172 @@ void nullsub_179(void)
{
}
+#ifndef NONMATCHING
+NAKED
+#endif
+u8 sub_800CA38(u32 songIndex)
+{
+#ifdef NONMATCHING
+ if(IsBGSong(songIndex))
+ {
+ if(sub_800CAE0(songIndex) == 0)
+ {
+ return 1;
+ }
+ }
+ if(sub_800CACC(songIndex))
+ {
+ // TODO compiler gets weird here wanted to skip to next check
+ if(sub_800CAE0(songIndex) == 1)
+ {
+ _0800CA70:
+ return 1;
+ }
+ }
+ if(sub_800CAAC(songIndex))
+ {
+ if((sub_800CAE0(songIndex) > 1))
+ {
+ goto _0800CA70;
+ }
+ }
+ return 0;
+#else
+ asm_unified("\tpush {r4,lr}\n"
+ "\tadds r4, r0, 0\n"
+ "\tbl IsBGSong\n"
+ "\tlsls r0, 24\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0800CA54\n"
+ "\tlsls r0, r4, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tbl sub_800CAE0\n"
+ "\tlsls r0, 16\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0800CA70\n"
+"_0800CA54:\n"
+ "\tadds r0, r4, 0\n"
+ "\tbl sub_800CACC\n"
+ "\tlsls r0, 24\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0800CA74\n"
+ "\tlsls r0, r4, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tbl sub_800CAE0\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tcmp r0, 0x1\n"
+ "\tbne _0800CA90\n"
+"_0800CA70:\n"
+ "\tmovs r0, 0x1\n"
+ "\tb _0800CA92\n"
+"_0800CA74:\n"
+ "\tadds r0, r4, 0\n"
+ "\tbl sub_800CAAC\n"
+ "\tlsls r0, 24\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0800CA90\n"
+ "\tlsls r0, r4, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tbl sub_800CAE0\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r0, 16\n"
+ "\tcmp r0, 0x1\n"
+ "\tbhi _0800CA70\n"
+"_0800CA90:\n"
+ "\tmovs r0, 0\n"
+"_0800CA92:\n"
+ "\tpop {r4}\n"
+ "\tpop {r1}\n"
+ "\tbx r1");
+#endif
+}
+
+void nullsub_19(void)
+{
+}
+
+bool8 IsBGSong(u32 songIndex)
+{
+ if(songIndex <= NUM_BG_SONGS)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_800CAAC(u32 songIndex)
+{
+ if(songIndex - 300 <= 639)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+bool8 sub_800CACC(u32 songIndex)
+{
+ if(songIndex - 200 <= 19)
+ {
+ return TRUE;
+ }
+ return FALSE;
+}
+
+u16 sub_800CAE0(u16 songIndex)
+{
+ return gSongTable[songIndex].ms;
+}
+
+bool8 sub_800CAF0(u16 songIndex)
+{
+ // Had to cast this.. m4a_internal header has this as u32
+ if((u16)gMPlayTable[songIndex].info->status == 0)
+ {
+ return 0;
+ }
+ return 1;
+}
+
+void nullsub_20(void)
+{
+}
+
+void nullsub_21(void)
+{
+}
+
+void sub_800CB20(void)
+{
+ sub_800BA5C();
+ gUnknown_203B0B8++;
+ if((gUnknown_203B0BC & 5) != 0)
+ {
+ Random();
+ }
+ Random();
+}
+
+u32 sub_800CB50(void)
+{
+ return gUnknown_203B0B8;
+}
+
+void nullsub_180(void)
+{
+}
+
+void xxx_call_update_bg_sound_input(void)
+{
+ xxx_update_bg_sound_input();
+}
+
+void nullsub_181(void)
+{
+}
+
+u32 sub_800CB70(void)
+{
+ return 0;
+}
+