diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/code_800558C.c | 142 | ||||
-rw-r--r-- | src/code_800C9CC.c | 237 | ||||
-rw-r--r-- | src/music.c | 184 |
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; +} + |