summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/code_2.c5
-rw-r--r--src/code_80118A4.c23
-rw-r--r--src/code_803C190.c34
-rw-r--r--src/code_8040094.c47
-rw-r--r--src/code_8048480.c31
-rw-r--r--src/code_80521D0_1.c200
-rw-r--r--src/code_8094F88.c24
-rw-r--r--src/event_flag.c58
-rw-r--r--src/fatal_system.c26
-rw-r--r--src/main.c12
-rw-r--r--src/more_input.c132
-rw-r--r--src/music.c38
-rw-r--r--src/music_pre.c225
-rw-r--r--src/save.c2
-rw-r--r--src/save1.c72
15 files changed, 735 insertions, 194 deletions
diff --git a/src/code_2.c b/src/code_2.c
index fcec96d..ef469c8 100644
--- a/src/code_2.c
+++ b/src/code_2.c
@@ -3,6 +3,8 @@
#include "friend_area.h"
#include "input.h"
#include "bg.h"
+#include "music.h"
+#include "constants/bg_music.h"
extern void InitHeap(void);
extern void NDS_DebugInit(void);
@@ -39,7 +41,6 @@ extern void sub_800CDA8(u32);
extern void sub_800641C(u32, u32, u32);
extern void LoadTitleScreen(void);
extern void SetBGPaletteBufferColorRGB(s32, u8 *, s32, u8 *);
-extern void sub_800BDFC(u32);
extern void sub_80095CC(u32, u32);
extern void InitMainMenu(void);
extern void sub_8012468(void);
@@ -149,7 +150,7 @@ void GameLoop(void)
sub_8012558();
}
tmp3 = 1;
- sub_800BDFC(8);
+ StartNewBGM(MUS_LOADING_SCREEN);
flag = TRUE;
sub_80095CC(0, 20);
InitMainMenu();
diff --git a/src/code_80118A4.c b/src/code_80118A4.c
index 73cb8b2..c4022da 100644
--- a/src/code_80118A4.c
+++ b/src/code_80118A4.c
@@ -1,22 +1,19 @@
#include "global.h"
+#include "music.h"
+#include "constants/bg_music.h"
void sub_8011924(void);
void nullsub_26(void);
extern u8 sub_80023E4(u8);
-extern void sub_800BDFC(u16 r0);
-extern void FadeInNewBGM(u16 r0, u16 r1);
extern void sub_800BF48(u16 r0);
extern void sub_800BF80(void);
extern void sub_800BFD0(u16 r0);
extern void sub_800C3F8(u16 r0, u16 r1);
extern void sub_801199C(u16 r0);
-extern u16 sub_800C068();
extern void sub_800C074(u16 r0, u16 r1);
extern void sub_800C298(u16 r0);
-extern void sub_800C93C();
extern u8 sub_800C5D0(u16 r0);
-extern void sub_800C9CC();
extern void nullsub_27(void);
extern void nullsub_29(void);
@@ -49,12 +46,12 @@ void sub_8011760(void)
{
if(sub_80023E4(0xD) != 0)
{
- sub_800BDFC(0x13);
+ StartNewBGM(MUS_WORLD_CALAMITY);
return;
}
if(sub_80023E4(0xC) != 0)
{
- sub_800BDFC(0x7); // Pokemon Square Theme
+ StartNewBGM(MUS_POKEMON_SQUARE);
}
}
@@ -62,10 +59,10 @@ void sub_801178C(void)
{
if(sub_80023E4(0xD) != 0)
{
- sub_800BDFC(0x13);
+ StartNewBGM(MUS_WORLD_CALAMITY);
return;
}
- sub_800BDFC(0x7); // Pokemon Square Theme
+ StartNewBGM(MUS_POKEMON_SQUARE);
}
void sub_80117AC(void)
@@ -147,12 +144,12 @@ void sub_80118C4(u16 r0)
sub_800C3F8(0x3e5, r0);
}
-void sub_80118F0(u16 r0)
+void xxx_call_start_new_bgm(u16 songIndex)
{
- sub_800BDFC(r0);
+ StartNewBGM(songIndex);
}
-void sub_8011900(u16 songIndex, u16 speed)
+void xxx_call_fade_in_new_bgm(u16 songIndex, u16 speed)
{
FadeInNewBGM(songIndex, speed);
}
@@ -175,7 +172,7 @@ void sub_8011930(u16 r0)
u32 sub_8011940(u16 r0)
{
u32 temp;
- temp = sub_800C068();
+ temp = GetCurrentBGSong();
if(r0 == 999)
return temp != 999;
diff --git a/src/code_803C190.c b/src/code_803C190.c
new file mode 100644
index 0000000..26565c0
--- /dev/null
+++ b/src/code_803C190.c
@@ -0,0 +1,34 @@
+#include "global.h"
+
+struct unkStruct_80EBA18
+{
+ u32 unk0;
+ u32 unk4;
+};
+
+extern struct unkStruct_80EBA18 gUnknown_80EBA18[];
+extern s32 sub_80908D8(u32);
+
+u32 sub_803C190(u8 r0)
+{
+ return gUnknown_80EBA18[r0].unk0;
+}
+
+
+u32 sub_803C1A0(u8 r0)
+{
+ return gUnknown_80EBA18[r0].unk4;
+}
+
+s32 sub_803C1B4(s32 r0, u8 r1)
+{
+ s32 temp;
+ temp = sub_80908D8(r0);
+ if(r1 == 2)
+ {
+ temp += 2;
+ }
+ if(temp > 0xF)
+ temp = 0xF;
+ return temp;
+}
diff --git a/src/code_8040094.c b/src/code_8040094.c
index 97458c9..f322fa9 100644
--- a/src/code_8040094.c
+++ b/src/code_8040094.c
@@ -1,8 +1,27 @@
#include "global.h"
#include "time.h"
+#include "file_system.h"
+
+struct unkStruct_203B418
+{
+ u8 padding[0x181FB];
+ u32 unk181FC;
+ u32 unk18200;
+ u32 unk18204;
+ u32 unk18208;
+ u32 unk1820C;
+ u32 unk18210;
+ u8 padding2[3];
+ u8 unk18217;
+};
-extern u8 *gUnknown_203B418;
extern struct PlayTimeStruct *gUnknown_203B47C;
+extern struct unkStruct_203B418 *gUnknown_203B418;
+extern s32 gUnknown_80F6568[];
+extern u8 gUnknown_202EE01;
+extern const char gUnknown_80F6604; // "zmappat"
+extern struct FileArchive gUnknown_83B0000;
+extern struct OpenedFile *gUnknown_202EE04;
extern void sub_803F7BC(void);
extern void sub_80060EC(void);
@@ -14,7 +33,7 @@ extern void sub_8011860(void);
void sub_8040094(u8 r0)
{
- gUnknown_203B418[0x18217] = r0;
+ gUnknown_203B418->unk18217 = r0;
sub_803F7BC();
sub_80060EC();
IncrementPlayTime(gUnknown_203B47C);
@@ -24,3 +43,27 @@ void sub_8040094(u8 r0)
sub_8083F58();
sub_8011860();
}
+
+void sub_80400D4(void)
+{
+ s32 temp;
+ temp = gUnknown_203B418->unk18200;
+ if(temp == 0)
+ return;
+ if(temp > 0x1E)
+ temp = 0x1F;
+ gUnknown_203B418->unk181FC = gUnknown_80F6568[temp];
+ gUnknown_203B418->unk18200--;
+ if(gUnknown_203B418->unk18200 == 0)
+ gUnknown_203B418->unk18200 = gUnknown_203B418->unk18204;
+}
+
+void sub_8040124(void)
+{
+ gUnknown_202EE01 = 0;
+}
+
+void sub_8040130(void)
+{
+ gUnknown_202EE04 = OpenFileAndGetFileDataPtr(&gUnknown_80F6604, &gUnknown_83B0000);
+}
diff --git a/src/code_8048480.c b/src/code_8048480.c
index aac957a..8ede564 100644
--- a/src/code_8048480.c
+++ b/src/code_8048480.c
@@ -1,13 +1,25 @@
#include "global.h"
+struct unkDungeon_8041D5C
+{
+ u8 padding[0x70];
+ u8 *unk70[100];
+};
+
+extern u32 gUnknown_80F89F4;
+extern u32 gUnknown_202DF98;
+extern u32 gUnknown_80FB580;
+
extern void sub_807D148(u32 r0, u32 r1, u32 r2, u32 r3);
extern void sub_8075FCC(void);
extern void sub_8077AE4(u32 r0, u32 r1, u32 r2);
extern void sub_8072008(u32 r0, u32 r1, u32 r2, u8 r3);
extern void sub_8076D10(void);
-extern void sub_80522F4(u32 r0, u32 r1, u32 r2);
extern void sub_807232C(u32 r0, u32 r1, u32 r2);
-extern u32 gUnknown_80F89F4;
+
+extern void sub_8045B94(u32 *r0, struct unkDungeon_8041D5C *r1, u32);
+extern void sub_807A290(u32);
+extern void sub_80522F4(u32 r0, struct unkDungeon_8041D5C *r1, u32);
void sub_8048480(u32 r0, u32 r1)
{
@@ -36,7 +48,7 @@ void sub_80484BC(void)
sub_8076D10();
}
-void sub_80484C8(u32 r0, u32 r1)
+void sub_80484C8(u32 r0, struct unkDungeon_8041D5C *r1)
{
sub_80522F4(r0, r1, gUnknown_80F89F4);
}
@@ -45,3 +57,16 @@ void sub_80484DC(u32 r0, u32 r1)
{
sub_807232C(r0, r1, 1);
}
+
+void sub_80484E8(u32 r0, struct unkDungeon_8041D5C *r1)
+{
+ u8 *temp;
+ temp = r1->unk70[0];
+ if(temp[0xAC] == 1)
+ {
+ sub_807A290(r0);
+ return;
+ }
+ sub_8045B94(&gUnknown_202DF98, r1, 0);
+ sub_80522F4(r0, r1, gUnknown_80FB580);
+}
diff --git a/src/code_80521D0_1.c b/src/code_80521D0_1.c
new file mode 100644
index 0000000..dd6dc7c
--- /dev/null
+++ b/src/code_80521D0_1.c
@@ -0,0 +1,200 @@
+#include "global.h"
+
+extern s16 *sub_8085480(void);
+extern u32 sub_8085680(u32);
+extern u32 gUnknown_202E038;
+extern u8* gUnknown_203B418;
+
+extern u32 gUnknown_8106778;
+extern u32 gUnknown_81067BC;
+extern u32 gUnknown_81067E0;
+extern u32 gUnknown_8106834;
+extern u32 gUnknown_810688C;
+extern u32 gUnknown_81068D0;
+extern u32 gUnknown_8106918;
+extern u32 gUnknown_8106934;
+
+extern void sub_8086A3C(void);
+extern void sub_808D8BC(u32 *r0, u32 r1);
+extern void sub_8083E88(u32);
+extern void sub_80854D4(void);
+extern void sub_80855E4(void *);
+extern void sub_8085930(u32);
+extern void sub_8068FE0(u32, u32, u32);
+extern void sub_8085860(s16 r0, u32 r1);
+
+extern void sub_803E708(u32, u32);
+extern void sub_8052910(u32 *r0);
+extern void sub_8086448(void);
+extern void sub_8086598(void);
+extern void sub_808696C();
+extern void sub_80862BC(u32);
+extern void sub_8083E38(u32);
+extern void sub_806CDD4(u32, u32, u32);
+extern void sub_80869E4(u32, u32, u32, u32);
+extern void sub_806CE68(u32, u32);
+extern void sub_804539C(u32, u32, u32);
+extern void sub_803E46C(u32);
+extern void sub_8042B0C(u32);
+extern void sub_8085918(u32, u32);
+
+void sub_808C9C4(void)
+{
+ s16 *array;
+ u32 temp_2;
+
+ array = sub_8085480();
+ temp_2 = sub_8085680(7);
+ sub_8083E88(0x72);
+ sub_80854D4();
+ sub_8085930(0x4);
+ sub_80855E4(sub_8086A3C);
+ sub_8085918(temp_2, 0);
+ sub_8085860(array[2], array[3] - 3);
+ sub_808D8BC(&gUnknown_202E038, 0x14d);
+}
+
+void sub_808CA1C(void)
+{
+ u32 temp;
+ s32 counter;
+
+ temp = sub_8085680(7);
+ sub_808696C();
+ sub_803E708(0xA, 0x46);
+ sub_8052910(&gUnknown_8106778);
+ sub_803E708(0xA, 0x46);
+ sub_80869E4(temp, 4, 2, 4);
+ sub_803E708(0xA, 0x46);
+ sub_8052910(&gUnknown_81067BC);
+ sub_803E708(0xA, 0x46);
+ sub_8086448();
+ sub_8086598();
+ sub_803E708(0x20, 0x46);
+ sub_80862BC(temp);
+ sub_803E708(0x20, 0x46);
+ sub_80869E4(temp, 4, 2, 0);
+ sub_8052910(&gUnknown_81067E0);
+ sub_803E708(0xA, 0x46);
+ sub_8083E38(0x1c7);
+ sub_806CDD4(temp, 0xA, 0);
+ sub_803E708(0x14, 0x46);
+ sub_806CE68(temp, 0);
+ sub_803E708(0x4, 0x46);
+ sub_8083E38(0x1c7);
+ sub_806CDD4(temp, 0xA, 0);
+ sub_803E708(0x14, 0x46);
+ sub_8052910(&gUnknown_8106834);
+ sub_803E708(0xA, 0x46);
+ sub_806CDD4(temp, 0, 0);
+ for(counter = 0x17; counter >= 0; counter--)
+ {
+ sub_804539C(temp, 0, 0x80 << 1);
+ sub_803E46C(0x46);
+ }
+ sub_806CE68(temp, 0);
+ sub_803E708(0x20, 0x46);
+ sub_8042B0C(temp);
+ sub_8068FE0(temp, 0x87 << 2, 0);
+ gUnknown_203B418[4] = 1;
+ gUnknown_203B418[0x11] = 4;
+}
+
+void sub_808CB5C(void)
+{
+ s16 *array;
+ u32 temp_2;
+
+ array = sub_8085480();
+ temp_2 = sub_8085680(7);
+ sub_8083E88(0x72);
+ sub_80854D4();
+ sub_8085930(0x4);
+ sub_8068FE0(temp_2, 0x87 << 2, 0);
+ sub_8085860(array[2], array[3]);
+ sub_808D8BC(&gUnknown_202E038, 0x14d);
+}
+
+void nullsub_101(void)
+{
+}
+
+void sub_808CBB0(void)
+{
+ s16 *array;
+ u32 temp_2;
+
+ array = sub_8085480();
+ temp_2 = sub_8085680(0x1F);
+ sub_8083E88(0x72);
+ sub_80854D4();
+ sub_8085930(4);
+ sub_80855E4(sub_8086A3C);
+ sub_8085918(temp_2, 0);
+ sub_8085860(array[2], array[3] - 3);
+ sub_808D8BC(&gUnknown_202E038, 0x82 << 1);
+}
+
+void sub_808CC04(void)
+{
+ u32 temp;
+ s32 counter;
+
+ temp = sub_8085680(0x1F);
+ sub_808696C();
+ sub_803E708(0xA, 0x46);
+ sub_8052910(&gUnknown_810688C);
+ sub_803E708(0xA, 0x46);
+ sub_80869E4(temp, 4, 2, 4);
+ sub_803E708(0xA, 0x46);
+ sub_8052910(&gUnknown_81068D0);
+ sub_803E708(0xA, 0x46);
+ sub_8086448();
+ sub_8086598();
+ sub_803E708(0x20, 0x46);
+ sub_80862BC(temp);
+ sub_803E708(0x20, 0x46);
+ sub_80869E4(temp, 4, 2, 0);
+ sub_8052910(&gUnknown_8106918);
+ sub_803E708(0xA, 0x46);
+ sub_8083E38(0x1c7);
+ sub_806CDD4(temp, 0xA, 0);
+ sub_803E708(0x14, 0x46);
+ sub_806CE68(temp, 0);
+ sub_803E708(0x4, 0x46);
+ sub_8083E38(0x1c7);
+ sub_806CDD4(temp, 0xA, 0);
+ sub_803E708(0x14, 0x46);
+ sub_8052910(&gUnknown_8106934);
+ sub_803E708(0xA, 0x46);
+ sub_806CDD4(temp, 0, 0);
+ for(counter = 0x17; counter >= 0; counter--)
+ {
+ sub_804539C(temp, 0, 0x80 << 1);
+ sub_803E46C(0x46);
+ }
+ sub_806CE68(temp, 0);
+ sub_803E708(0x20, 0x46);
+ sub_8042B0C(temp);
+ sub_8068FE0(temp, 0x87 << 2, 0);
+ gUnknown_203B418[4] = 1;
+ gUnknown_203B418[0x11] = 4;
+
+}
+
+void sub_808CD44(void)
+{
+ s16 *array;
+ u32 temp_2;
+
+ array = sub_8085480();
+ temp_2 = sub_8085680(0x1F);
+ sub_8083E88(0x72);
+ sub_80854D4();
+ sub_8085930(0x4);
+ sub_80855E4(sub_8086A3C);
+ sub_8068FE0(temp_2, 0x87 << 2, 0);
+ sub_8085860(array[2], array[3] - 3);
+ sub_808D8BC(&gUnknown_202E038, 0x82 << 1);
+}
+
diff --git a/src/code_8094F88.c b/src/code_8094F88.c
index 95854d3..54da9b2 100644
--- a/src/code_8094F88.c
+++ b/src/code_8094F88.c
@@ -14,8 +14,8 @@ extern u32 *gUnknown_203B488;
extern u32 *gUnknown_203B48C;
-extern void sub_809488C(u32, u32, u32);
-extern void sub_8094924(u32, u32, u32);
+extern void sub_809488C(u32 *r0, u32 *r1, u32);
+extern void sub_8094924(u32 *r0, u32 *r1, u32);
// Forward Declaration
@@ -91,20 +91,20 @@ void DeconstructPlayTime(struct PlayTimeStruct *r0, u32 *outHours, u32 *outMinut
}
}
-void sub_8095044(u32 r0)
+void sub_8095044(u32 *r0)
{
- sub_809488C(r0, (u32)(gUnknown_203B47C) + 4, 0x6);
- sub_809488C(r0, (u32)(gUnknown_203B47C) + 3, 0x6);
- sub_809488C(r0, (u32)(gUnknown_203B47C) + 2, 0x6);
- sub_809488C(r0, (u32)(gUnknown_203B47C), 0xE);
+ sub_809488C(r0, (u32 *)(&(gUnknown_203B47C->frames)), 6);
+ sub_809488C(r0, (u32 *)(&(gUnknown_203B47C->seconds)), 6);
+ sub_809488C(r0, (u32 *)(&(gUnknown_203B47C->minutes)), 6);
+ sub_809488C(r0, (u32 *)(&(gUnknown_203B47C->hours)), 14);
}
-void sub_8095080(u32 r0)
+void sub_8095080(u32 *r0)
{
- sub_8094924(r0, (u32)(gUnknown_203B47C) + 4, 0x6);
- sub_8094924(r0, (u32)(gUnknown_203B47C) + 3, 0x6);
- sub_8094924(r0, (u32)(gUnknown_203B47C) + 2, 0x6);
- sub_8094924(r0, (u32)(gUnknown_203B47C), 0xE);
+ sub_8094924(r0, (u32 *)(&(gUnknown_203B47C->frames)), 6);
+ sub_8094924(r0, (u32 *)(&(gUnknown_203B47C->seconds)), 6);
+ sub_8094924(r0, (u32 *)(&(gUnknown_203B47C->minutes)), 6);
+ sub_8094924(r0, (u32 *)(&(gUnknown_203B47C->hours)), 14);
}
void sub_80950BC(void)
diff --git a/src/event_flag.c b/src/event_flag.c
index 501b1af..a19d3db 100644
--- a/src/event_flag.c
+++ b/src/event_flag.c
@@ -1,41 +1,39 @@
#include "global.h"
+#include "event_flag.h"
#include "memory.h"
-
-struct UnkEventStruct
-{
- /* 0x0 */ u32 unk0;
- /* 0x4 */ s16 unk4;
- /* 0x6 */ u16 unk6;
- /* 0x8 */ u16 unk8;
- /* 0xA */ s16 unkA;
-};
-
-struct UnkEventStruct2
-{
- /* 0x0 */ u32 unk0;
- /* 0x4 */ u32 *unk4;
- /* 0x8 */ u16 unk8;
- /* 0xA */ s16 unkA;
-};
+#include "friend_area.h"
extern void sub_800226C(u8 r0, u8 r1, u32* r2, u8 u3);
-extern void sub_800160C(struct UnkEventStruct2 *r0, u32 r1, u32 r2);
+extern void sub_800160C(struct UnkEventStruct *r0, u32 r1, u32 r2);
+extern u8 sub_8002658(s32);
extern u8 gUnknown_2000A88;
+bool8 sub_80026CC(s16 r0)
+{
+ return GetFriendAreaStatus(sub_8002658(r0));
+}
-// TODO fix stack allocation from 0xC to 0x8 to make this match
-//u8 sub_8002718(struct UnkEventStruct *r0)
-//{
-// struct UnkEventStruct2 temp;
-// sub_800160C(&temp, 0, 0);
-// MemoryCopy8(&gUnknown_2000A88, (u8 *)r0, (0x80 << 3));
-//
-// // TODO fix this comparison to make it match
-// if(temp.unkA != *(temp.unk4))
-// return 0;
-// return 1;
-//}
+void sub_80026E8(s16 r0)
+{
+ UnlockFriendArea(sub_8002658(r0));
+}
+
+bool8 sub_8002700(void *r0)
+{
+ MemoryCopy8(r0, &gUnknown_2000A88, 0x80 << 3);
+ return 1;
+}
+
+bool8 sub_8002718(u8 *r0)
+{
+ struct UnkEventStruct temp;
+ sub_800160C(&temp, 0, 0);
+ MemoryCopy8(&gUnknown_2000A88, r0, 0x80 << 3);
+ if (temp.unk0[5] != temp.unk4[0])
+ return 0;
+ return 1;
+}
void sub_8002758(u32 *r0)
{
diff --git a/src/fatal_system.c b/src/fatal_system.c
index 2079a38..3d5bb25 100644
--- a/src/fatal_system.c
+++ b/src/fatal_system.c
@@ -1,8 +1,30 @@
-#include "global.h"
+#include <stdarg.h>
+#include <stdio.h>
+#include "gba/gba.h"
+#include "config.h"
extern const char gNotMountText;
extern void Hang();
+void FatalErrorFormatMessage(const char *text, ...)
+{
+ char bufPrint[0x100];
+ va_list vArgv;
+ va_start(vArgv, text);
+ vsprintf(bufPrint, text, vArgv);
+ va_end(vArgv);
+}
+
+
+void sub_8011B88(const char *text, ...)
+{
+ char bufPrint[0x100];
+ va_list vArgv;
+ va_start(vArgv, text);
+ vsprintf(bufPrint, text, vArgv);
+ va_end(vArgv);
+}
+
void nullsub_28(void)
{
}
@@ -25,7 +47,7 @@ const char *sub_8011BAC(void)
}
// Unused
-void sub_8011BB4(void)
+void UnusedHang(void)
{
Hang();
}
diff --git a/src/main.c b/src/main.c
index 2d586a5..0960d70 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1,19 +1,21 @@
#include "global.h"
+#include "crt0.h"
#include "random.h"
#include "flash.h"
#include "text.h"
extern char ewram_start[];
-extern u8 gUnknown_202D4B8;
-extern void *gUnknown_202D5F0[6];
+typedef void (*IntrCallback)(void);
+
+extern u8 IntrMain_Buffer[0x120];
+extern IntrCallback gUnknown_202D5F0[6];
extern u16 gUnknown_202D7FC;
extern u8 gUnknown_202D7FE;
extern u8 gInterruptsEnabled;
extern u16 gUnknown_203B0AC;
extern s16 gUnknown_203B0AE;
extern u32 gIntrTable[];
-extern u32 IntrMain;
extern char alt_203B038[];
@@ -226,8 +228,8 @@ void SetInterruptFlag(u16 flag)
void InitIntrTable(const u32 *interrupt_table)
{
CpuCopy32(interrupt_table, &gIntrTable, 0x18); // 0x18 = 0x6 * 4 (0x4f00 is 32 bits)
- CpuCopy32(&IntrMain, &gUnknown_202D4B8, 0x120); // 0x120 = 0x48 * 4 (0x4f00 is 32 bits)
- INTR_VECTOR = &gUnknown_202D4B8;
+ CpuCopy32(&IntrMain, &IntrMain_Buffer, 0x120); // 0x120 = 0x48 * 4 (0x4f00 is 32 bits)
+ INTR_VECTOR = &IntrMain_Buffer;
}
u32 *sub_800B6E8(u32 r0)
diff --git a/src/more_input.c b/src/more_input.c
new file mode 100644
index 0000000..9ab4c97
--- /dev/null
+++ b/src/more_input.c
@@ -0,0 +1,132 @@
+#include "global.h"
+#include "input.h"
+
+struct UnkInputStruct
+{
+ /* 0x0 */ u8 unk0;
+ /* 0x1 */ u8 unk1;
+ /* 0x2 */ u8 unk2;
+ /* 0x3 */ u8 unk3;
+ /* 0x4 */ u8 unk4;
+ /* 0x5 */ u32 unk5;
+ /* 0x9 */ u32 unk9;
+ /* 0xD */ u32 unkD;
+ /* 0x12 */ u32 unk11;
+ /* 0x16 */ u32 unk15;
+ /* 0x1A */ u32 unk19;
+ /* 0x1E */ u32 unk1D;
+ /* 0x24 */ u32 unk24;
+ /* 0x28 */ u8 unk28;
+ /* 0x29 */ u8 a_button;
+ /* 0x2A */ u8 b_button;
+ /* 0x2B */ u8 dpad_right;
+ /* 0x2C */ u8 dpad_left;
+};
+
+
+extern void nullsub_34(struct UnkInputStruct *r0);
+extern struct Inputs gRealInputs;
+u32 sub_8012AE8(void);
+
+u32 sub_8012A64(struct UnkInputStruct *r0, u32 r1)
+{
+ if(r0 == NULL)
+ {
+ return sub_8012AE8();
+ }
+ if(r1 != -1)
+ {
+ nullsub_34(r0);
+ }
+ if(r0->unk1 != 0)
+ {
+ r0->unk1 = 0;
+ return 1;
+ }
+ if(r0->unk2 == 0)
+ {
+ return sub_8012AE8();
+ }
+ r0->unk2 = r0->unk1;
+ return 2;
+}
+
+u32 GetKeyPress(struct UnkInputStruct *r0)
+{
+ if(r0 != NULL)
+ {
+ if(r0->a_button != 0)
+ {
+ return 1;
+ }
+ if(r0->b_button != 0)
+ {
+ return 2;
+ }
+ if(r0->dpad_left != 0)
+ {
+ return 9;
+ }
+ if(r0->dpad_right != 0)
+ {
+ return 10;
+ }
+ }
+ return sub_8012AE8();
+}
+
+u32 sub_8012AE8(void)
+{
+ if ((gRealInputs.held & R_BUTTON) != 0) {
+ if ((gRealInputs.pressed & A_BUTTON) != 0) {
+ return 11;
+ }
+ if ((gRealInputs.repeated & DPAD_UP) != 0) {
+ return 12;
+ }
+ if ((gRealInputs.repeated & DPAD_DOWN) != 0) {
+ return 13;
+ }
+ if ((gRealInputs.repeated & DPAD_LEFT) != 0) {
+ return 14;
+ }
+ if ((gRealInputs.repeated & DPAD_RIGHT) != 0) {
+ return 15;
+ }
+ if ((gRealInputs.repeated & R_BUTTON) != 0) {
+ return 6;
+ }
+ }
+ else
+ {
+ if ((gRealInputs.pressed & A_BUTTON) != 0) {
+ return 1;
+ }
+ if ((gRealInputs.pressed & B_BUTTON) != 0) {
+ return 2;
+ }
+ if ((gRealInputs.pressed & SELECT_BUTTON) != 0) {
+ return 3;
+ }
+ if ((gRealInputs.pressed & START_BUTTON) != 0) {
+ return 4;
+ }
+ if ((gRealInputs.repeated & DPAD_UP) != 0) {
+ return 7;
+ }
+ if ((gRealInputs.repeated & DPAD_DOWN) != 0) {
+ return 8;
+ }
+ if ((gRealInputs.repeated & DPAD_LEFT) != 0) {
+ return 9;
+ }
+ if ((gRealInputs.repeated & DPAD_RIGHT) != 0) {
+ return 10;
+ }
+ if ((gRealInputs.repeated & L_BUTTON) != 0) {
+ return 5;
+ }
+ }
+ return 0;
+}
+
diff --git a/src/music.c b/src/music.c
index 1017b47..8f02775 100644
--- a/src/music.c
+++ b/src/music.c
@@ -1,7 +1,6 @@
#include "global.h"
#include "m4a.h"
-
-#define NUM_BG_SONGS 128
+#include "constants/bg_music.h"
extern u8 sub_80023E4(u32);
extern void sub_80118C4(u16);
@@ -15,8 +14,14 @@ extern void Random();
extern void sub_800BA5C();
extern void xxx_update_bg_sound_input();
-extern u16 gUnknown_202D688;
-extern u16 gUnknown_202D68A;
+// 0 - Only seen it initialized
+// 1 - Playing
+// 2 -
+// 3 - Fade Out?
+// 4 - Stopped
+extern u16 gBGMusicPlayerState;
+
+extern u16 gCurrentBGSong;
extern u16 gUnknown_202D690;
extern u8 gUnknown_202D694;
extern u32 gUnknown_203B0B8;
@@ -38,23 +43,20 @@ void sub_800C93C(void)
interrupt_flag = DisableInterrupts();
if(gUnknown_202D690 == 0)
{
- if(gUnknown_202D68A != 0x3e7)
+ if(gCurrentBGSong != 999)
{
- temp = gUnknown_202D688 - 1;
+ temp = gBGMusicPlayerState - 1;
if(temp <= 1)
{
- if(gUnknown_202D688 == 2)
+ if(gBGMusicPlayerState == 2)
{
gUnknown_202D694 = gUnknown_202D690;
}
- else
+ else if(gBGMusicPlayerState == 1)
{
- if(gUnknown_202D688 == 1)
- {
- gUnknown_202D694 = 1;
- }
+ gUnknown_202D694 = 1;
}
- gUnknown_202D688 = 4;
+ gBGMusicPlayerState = 4;
}
}
}
@@ -72,14 +74,14 @@ void sub_800C9CC(void)
m4aSoundVSyncOn();
if(gUnknown_202D690 == 0)
{
- if(gUnknown_202D68A != 0x3e7)
+ if(gCurrentBGSong != 999)
{
- if(gUnknown_202D688 == 4)
+ if(gBGMusicPlayerState == 4)
{
- gUnknown_202D688 = 1;
+ gBGMusicPlayerState = 1;
if(gUnknown_202D694 != 0)
{
- m4aSongNumStart(gUnknown_202D68A);
+ m4aSongNumStart(gCurrentBGSong);
}
else
{
@@ -99,6 +101,7 @@ void nullsub_179(void)
{
}
+// Unused
u8 sub_800CA38(u32 songIndex)
{
if(IsBGSong(songIndex))
@@ -190,6 +193,7 @@ void sub_800CB20(void)
Random();
}
+// Unused
u32 sub_800CB50(void)
{
return gUnknown_203B0B8;
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;
}
diff --git a/src/save.c b/src/save.c
index 50a682f..b6385a5 100644
--- a/src/save.c
+++ b/src/save.c
@@ -2,6 +2,7 @@
#include "flash.h"
#include "memory.h"
#include "save.h"
+#include "event_flag.h"
struct UnkStruct_sub_8011DAC {
u8 fill000[0x4];
@@ -44,7 +45,6 @@ extern volatile struct UnkStruct_203B184 *gUnknown_203B184;
extern void* MemoryAlloc(u32 a, u32 b);
extern void MemoryFree(void* a);
extern void SetRngState(s32 state);
-extern bool8 sub_8002718(u8 *a);
extern bool8 sub_800DAB0(u16, u8*, s32);
extern bool8 sub_800DAB4(u16, u8*, s32);
extern bool8 sub_800DAB8(void);
diff --git a/src/save1.c b/src/save1.c
index dd0fc45..e8f844c 100644
--- a/src/save1.c
+++ b/src/save1.c
@@ -11,27 +11,6 @@ struct UnkSaveStruct1
/* 0xA */ u8 unkA;
};
-struct UnkStruct
-{
- /* 0x0 */ u8 unk0;
- /* 0x1 */ u8 unk1;
- /* 0x2 */ u8 unk2;
- /* 0x3 */ u8 unk3;
- /* 0x4 */ u8 unk4;
- /* 0x5 */ u32 unk5;
- /* 0x9 */ u32 unk9;
- /* 0xD */ u32 unkD;
- /* 0x12 */ u32 unk11;
- /* 0x16 */ u32 unk15;
- /* 0x1A */ u32 unk19;
- /* 0x1E */ u32 unk1D;
- /* 0x24 */ u32 unk24;
- /* 0x28 */ u8 unk28;
- /* 0x29 */ u8 unk29;
- /* 0x2A */ u8 unk2A;
- /* 0x2B */ u8 unk2B;
- /* 0x2C */ u8 unk2C;
-};
extern void MemoryFree(void *);
extern void sub_8011860();
@@ -46,8 +25,6 @@ extern void xxx_call_update_bg_vram();
extern void sub_8009908();
extern void xxx_call_update_bg_sound_input();
extern void ResetSprites(u8 r0);
-extern u32 sub_8012AE8(void);
-extern void nullsub_34(struct UnkStruct *r0);
extern struct UnkSaveStruct1 *gUnknown_203B46C;
@@ -79,52 +56,3 @@ void sub_8012A18()
ResetSprites(0);
}
-u32 sub_8012A64(struct UnkStruct *r0, u32 r1)
-{
- if(r0 == NULL)
- {
- return sub_8012AE8();
- }
- if(r1 != -1)
- {
- nullsub_34(r0);
- }
- if(r0->unk1 != 0)
- {
- r0->unk1 = 0;
- return 1;
- }
- if(r0->unk2 == 0)
- {
- return sub_8012AE8();
- }
- r0->unk2 = r0->unk1;
- return 2;
-}
-
-// TODO match that one line
-//u32 GetKeyPress(struct UnkStruct *r0)
-//{
-// if(r0 == NULL)
-// {
-// return sub_8012AE8();
-// }
-// // TODO it's not a struct access..
-// if(r0->unk29 != 0)
-// {
-// return 1;
-// }
-// if(r0->unk2A != 0)
-// {
-// return 2;
-// }
-// if(r0->unk2C != 0)
-// {
-// return 9;
-// }
-// if(r0->unk2B == 0)
-// {
-// return sub_8012AE8();
-// }
-// return 0xA;
-//}