summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSeth Barberee <seth.barberee@gmail.com>2020-11-10 13:54:27 -0600
committerSeth Barberee <seth.barberee@gmail.com>2020-11-10 13:54:27 -0600
commit0578f4a0623b0e3078f922c37a587d6bbafdbf4d (patch)
treec7e5b9530cf4a43b322042fc030cd23999a4be1e /src
parentbfceb5d70946c5335d8023f7ec2d98951d33d475 (diff)
more work on music.c and few more funcs
Diffstat (limited to 'src')
-rw-r--r--src/code_800558C.c142
-rw-r--r--src/code_800C9CC.c237
-rw-r--r--src/music.c184
3 files changed, 449 insertions, 114 deletions
diff --git a/src/code_800558C.c b/src/code_800558C.c
index 4cc90e9..13e3255 100644
--- a/src/code_800558C.c
+++ b/src/code_800558C.c
@@ -6,146 +6,68 @@ extern u32 gUnknown_203B47C;
extern u8 gUnknown_2026E38;
extern u32 gUnknown_2026E3C;
extern u16 gUnknown_2026E4E;
-extern u32 gUnknown_2026E50;
-extern u32 gUnknown_2026E54;
+extern bool32 gUnknown_2026E50;
+extern bool32 gUnknown_2026E54;
extern u32 gUnknown_2026E58;
-extern void sub_800CC44(u32 r0, u32 r1);
+extern void sub_800CC44(s32 r0, s32 r1);
// Unused
-#ifndef NONMATCHING
-NAKED
-#endif
void sub_80060A8(void)
{
-#ifdef NONMATCHING
- // TODO ordering of statements is wrong but regs are good so f*** it.
- // My mv/ldr stuff for temp is out of order
- u32 temp;
+
+ bool32 temp;
+ bool32 preload;
+ bool32 preload2;
+
gUnknown_2026E3C = gUnknown_2026E58;
- temp = 0;
- if (gUnknown_2026E54 == 0)
+ preload = gUnknown_2026E54;
+ temp = FALSE;
+ if (!gUnknown_2026E54)
{
- temp = 1;
+ temp = TRUE;
}
gUnknown_2026E54 = temp;
- temp = 0;
-
- if (gUnknown_2026E50 == 0)
+ preload2 = gUnknown_2026E50;
+ temp = FALSE;
+ if (!gUnknown_2026E50)
{
- temp = 1;
+ temp = TRUE;
}
gUnknown_2026E50 = temp;
- gUnknown_2026E38 = 0;
-#else
- asm_unified("\tpush {lr}\n"
- "\tldr r1, _080060D8\n"
- "\tldr r0, _080060DC\n"
- "\tldr r0, [r0]\n"
- "\tstr r0, [r1]\n"
- "\tldr r2, _080060E0\n"
- "\tmovs r1, 0\n"
- "\tldr r0, [r2]\n"
- "\tcmp r0, 0\n"
- "\tbne _080060BE\n"
- "\tmovs r1, 0x1\n"
-"_080060BE:\n"
- "\tstr r1, [r2]\n"
- "\tldr r2, _080060E4\n"
- "\tmovs r1, 0\n"
- "\tldr r0, [r2]\n"
- "\tcmp r0, 0\n"
- "\tbne _080060CC\n"
- "\tmovs r1, 0x1\n"
-"_080060CC:\n"
- "\tstr r1, [r2]\n"
- "\tldr r1, _080060E8\n"
- "\tmovs r0, 0\n"
- "\tstrb r0, [r1]\n"
- "\tpop {r0}\n"
- "\tbx r0\n"
- "\t.align 2, 0\n"
-"_080060D8: .4byte gUnknown_2026E3C\n"
-"_080060DC: .4byte gUnknown_2026E58\n"
-"_080060E0: .4byte gUnknown_2026E54\n"
-"_080060E4: .4byte gUnknown_2026E50\n"
-"_080060E8: .4byte gUnknown_2026E38");
-
-#endif
+ gUnknown_2026E38 = FALSE;
}
-#ifndef NONMATCHING
-NAKED
-#endif
void sub_80060EC(void)
{
-#ifdef NONMATCHING
- // TODO ordering of statements is wrong but regs are good so f*** it.
- u32 temp;
+ bool32 temp;
+ bool32 preload;
+ bool32 preload2;
+
gUnknown_2026E3C = gUnknown_2026E58;
- temp = 0;
- if (gUnknown_2026E54 == 0)
+ preload = gUnknown_2026E54;
+ temp = FALSE;
+
+ if (!gUnknown_2026E54)
{
- temp = 1;
+ temp = TRUE;
}
gUnknown_2026E54 = temp;
- temp = 0;
+
+ preload2 = gUnknown_2026E50;
+ temp = FALSE;
- if (gUnknown_2026E50 == 0)
+ if (!gUnknown_2026E50)
{
- temp = 1;
+ temp = TRUE;
}
gUnknown_2026E50 = temp;
sub_800CC44((gUnknown_2026E4E & (0xF8 << 5)) >> 8, gUnknown_2026E4E & 0x1F);
- gUnknown_2026E38 = 1;
-#else
- asm_unified("\tpush {lr}\n"
- "\tldr r1, _08006130\n"
- "\tldr r0, _08006134\n"
- "\tldr r0, [r0]\n"
- "\tstr r0, [r1]\n"
- "\tldr r2, _08006138\n"
- "\tmovs r1, 0\n"
- "\tldr r0, [r2]\n"
- "\tcmp r0, 0\n"
- "\tbne _08006102\n"
- "\tmovs r1, 0x1\n"
- "_08006102:\n"
- "\tstr r1, [r2]\n"
- "\tldr r2, _0800613C\n"
- "\tmovs r1, 0\n"
- "\tldr r0, [r2]\n"
- "\tcmp r0, 0\n"
- "\tbne _08006110\n"
- "\tmovs r1, 0x1\n"
- "_08006110:\n"
- "\tstr r1, [r2]\n"
- "\tldr r0, _08006140\n"
- "\tldrh r2, [r0]\n"
- "\tmovs r0, 0xF8\n"
- "\tlsls r0, 5\n"
- "\tands r0, r2\n"
- "\tlsrs r0, 8\n"
- "\tmovs r1, 0x1F\n"
- "\tands r1, r2\n"
- "\tbl sub_800CC44\n"
- "\tldr r1, _08006144\n"
- "\tmovs r0, 0x1\n"
- "\tstrb r0, [r1]\n"
- "\tpop {r0}\n"
- "\tbx r0\n"
- "\t.align 2, 0\n"
- "_08006130: .4byte gUnknown_2026E3C\n"
- "_08006134: .4byte gUnknown_2026E58\n"
- "_08006138: .4byte gUnknown_2026E54\n"
- "_0800613C: .4byte gUnknown_2026E50\n"
- "_08006140: .4byte gUnknown_2026E4E\n"
- "_08006144: .4byte gUnknown_2026E38");
-#endif
+ gUnknown_2026E38 = TRUE;
}
diff --git a/src/code_800C9CC.c b/src/code_800C9CC.c
new file mode 100644
index 0000000..27445f0
--- /dev/null
+++ b/src/code_800C9CC.c
@@ -0,0 +1,237 @@
+#include "global.h"
+#include "input.h"
+
+struct unkStruct_809CC88
+{
+ u16 padding;
+ u16 unk2;
+ u16 unk4;
+ u16 unk6;
+};
+
+extern u16 gUnknown_203B0BC;
+extern u8 gUnknown_202D6B8;
+extern u8 gUnknown_202D6B9;
+extern u16 gUnknown_202D7FA;
+
+extern struct unkStruct_809CC88 gUnknown_202D698;
+extern struct unkStruct_809CC88 gUnknown_202D6A0;
+extern struct unkStruct_809CC88 gUnknown_202D6A8;
+extern struct unkStruct_809CC88 gUnknown_202D6B0;
+
+void ReadKeyInput(struct UnkInputStruct1 *r0)
+{
+ u16 keyInput = REG_KEYINPUT ^ KEYS_MASK;
+ r0->unk0 = 0;
+
+ if((keyInput & DPAD_UP) != 0)
+ {
+ r0->unk0 = DPAD_UP;
+ }
+
+ if((keyInput & DPAD_DOWN) != 0)
+ {
+ r0->unk0 |= DPAD_DOWN;
+ }
+
+ if((keyInput & DPAD_LEFT) != 0)
+ {
+ r0->unk0 |= DPAD_LEFT;
+ }
+
+ if((keyInput & DPAD_RIGHT) != 0)
+ {
+ r0->unk0 |= DPAD_RIGHT;
+ }
+
+ if((keyInput & A_BUTTON) != 0)
+ {
+ r0->unk0 |= A_BUTTON;
+ }
+
+ if((keyInput & B_BUTTON) != 0)
+ {
+ r0->unk0 |= B_BUTTON;
+ }
+
+ if((keyInput & START_BUTTON) != 0)
+ {
+ r0->unk0 |= START_BUTTON;
+ }
+
+ if((keyInput & SELECT_BUTTON) != 0)
+ {
+ r0->unk0 |= SELECT_BUTTON;
+ }
+
+ if((keyInput & R_BUTTON) != 0)
+ {
+ r0->unk0 |= R_BUTTON;
+ }
+
+ if((keyInput & L_BUTTON) != 0)
+ {
+ r0->unk0 |= L_BUTTON;
+ }
+ gUnknown_203B0BC = keyInput;
+}
+
+void sub_800CC44(s32 r0, s32 r1)
+{
+ u32 preload1;
+ u8 preload2;
+ u8 preload3;
+
+ if(r0 < 0)
+ {
+ r0 = 0;
+ }
+ else
+ {
+ if(r0 > 0x10)
+ {
+ r0 = 0x10;
+ }
+ }
+ if(r1 < 0)
+ {
+ r1 = 0;
+ }
+ else
+ {
+ if(r1 > 0x10)
+ {
+ r1 = 0x10;
+ }
+ }
+ gUnknown_202D6B8 = r0;
+ gUnknown_202D6B9 = r1;
+
+ // Forcing the correct loads
+ preload1 = gUnknown_202D7FA;
+ preload2 = gUnknown_202D6B8;
+ preload3 = gUnknown_202D6B9;
+
+ gUnknown_202D7FA = (gUnknown_202D6B9 << 8) | gUnknown_202D6B8;
+
+}
+
+void sub_800CC88(u32 r0, u32 r1)
+{
+ gUnknown_202D698.unk4 = r0;
+ gUnknown_202D698.unk6 = r1;
+}
+
+void sub_800CC94(u32 r0, u32 r1)
+{
+ gUnknown_202D6A0.unk4 = r0;
+ gUnknown_202D6A0.unk6 = r1;
+}
+
+void sub_800CCA0(u32 r0, u32 r1)
+{
+ gUnknown_202D6A8.unk4 = r0;
+ gUnknown_202D6A8.unk6 = r1;
+}
+
+void sub_800CCAC(u32 r0, u32 r1)
+{
+ gUnknown_202D6B0.unk4 = r0;
+ gUnknown_202D6B0.unk6 = r1;
+}
+
+void sub_800CCB8(s32 r0, u32 r1, u32 r2)
+{
+ if(r0 == 1)
+ {
+ goto _0800CCD4;
+ }
+ if(r0 <= 1)
+ {
+ goto _0800CCCA;
+ }
+ if(r0 == 2)
+ {
+ goto _0800CCDE;
+ }
+ if(r0 == 3)
+ {
+ goto _0800CCE8;
+ }
+
+ _0800CCCA:
+ sub_800CC88(r1, r2);
+ return;
+ _0800CCD4:
+ sub_800CC94(r1, r2);
+ return;
+ _0800CCDE:
+ sub_800CCA0(r1, r2);
+ return;
+ _0800CCE8:
+ sub_800CCAC(r1, r2);
+}
+
+void sub_800CCF4(s32 r0, u32 r1)
+{
+ if(r0 == 1)
+ {
+ goto _0800CD10;
+ }
+ if(r0 <= 1)
+ {
+ goto _0800CD06;
+ }
+ if(r0 == 2)
+ {
+ goto _0800CD18;
+ }
+ if(r0 == 3)
+ {
+ goto _0800CD20;
+ }
+
+ _0800CD06:
+ gUnknown_202D698.unk4 = r1;
+ return;
+ _0800CD10:
+ gUnknown_202D6A0.unk4 = r1;
+ return;
+ _0800CD18:
+ gUnknown_202D6A8.unk4 = r1;
+ return;
+ _0800CD20:
+ gUnknown_202D6B0.unk4 = r1;
+}
+
+void sub_800CD2C(s32 r0, u32 r1)
+{
+ if(r0 == 1)
+ {
+ goto _0800CD48;
+ }
+ if(r0 <= 1)
+ {
+ goto _0800CD3E;
+ }
+ if(r0 == 2)
+ {
+ goto _0800CD50;
+ }
+ if(r0 == 3)
+ {
+ goto _0800CD58;
+ }
+
+ _0800CD3E:
+ gUnknown_202D698.unk6 = r1;
+ return;
+ _0800CD48:
+ gUnknown_202D6A0.unk6 = r1;
+ return;
+ _0800CD50:
+ gUnknown_202D6A8.unk6 = r1;
+ return;
+ _0800CD58:
+ gUnknown_202D6B0.unk6 = r1;
+}
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;
+}
+