summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/code.c32
-rw-r--r--src/code_80001E0.c8
-rw-r--r--src/code_800558C.c151
-rw-r--r--src/code_800B5F0.c99
-rw-r--r--src/code_80118A4.c191
-rw-r--r--src/code_80118A4_1.c69
-rw-r--r--src/code_801D760.c60
-rw-r--r--src/code_8027C84.c25
-rw-r--r--src/code_8027C84_pre.c86
-rw-r--r--src/code_80428A0.c145
-rw-r--r--src/code_8048480.c21
-rw-r--r--src/code_80521D0.c90
-rw-r--r--src/code_808DAB4.c10
-rw-r--r--src/code_8092334.c50
-rw-r--r--src/code_8094F88.c35
-rw-r--r--src/code_8095014.c87
-rw-r--r--src/code_8098BDC.c166
-rw-r--r--src/code_80A7714.c27
-rw-r--r--src/code_8272724.c17
-rw-r--r--src/dungeon.c67
-rw-r--r--src/event_flag.c53
-rw-r--r--src/file_system.c34
-rw-r--r--src/input.c144
-rw-r--r--src/libisagbprn.c177
-rw-r--r--src/main.c2
-rw-r--r--src/memory1.c11
-rw-r--r--src/personality_test.c17
-rw-r--r--src/pokemon.c26
-rw-r--r--src/pokemon_1.c194
-rw-r--r--src/pokemon_mid.c85
-rw-r--r--src/save.c213
-rw-r--r--src/save1.c117
-rw-r--r--src/save_mid.c158
33 files changed, 2662 insertions, 5 deletions
diff --git a/src/code.c b/src/code.c
new file mode 100644
index 0000000..49180c2
--- /dev/null
+++ b/src/code.c
@@ -0,0 +1,32 @@
+#include "global.h"
+
+extern void xxx_dungeon_8042F6C(u32 r0);
+extern void NDS_LoadOverlay_GroundMain();
+extern u32 xxx_script_related_8098468();
+
+void NDS_LoadOverlay_GroundMain()
+{
+
+}
+
+void nullsub_2(u32 r0)
+{
+
+}
+
+u32 xxx_script_related_8001334()
+{
+ return xxx_script_related_8098468();
+}
+
+void xxx_dungeon_8001340(u32 r0)
+{
+ nullsub_2(r0);
+ xxx_dungeon_8042F6C(r0);
+ NDS_LoadOverlay_GroundMain();
+}
+
+void nullsub_3(void)
+{
+
+}
diff --git a/src/code_80001E0.c b/src/code_80001E0.c
new file mode 100644
index 0000000..417853a
--- /dev/null
+++ b/src/code_80001E0.c
@@ -0,0 +1,8 @@
+#include "global.h"
+
+extern u32 gUnknown_3004000;
+
+u32 *sub_80001E0(void)
+{
+ return &gUnknown_3004000;
+}
diff --git a/src/code_800558C.c b/src/code_800558C.c
new file mode 100644
index 0000000..773e773
--- /dev/null
+++ b/src/code_800558C.c
@@ -0,0 +1,151 @@
+#include "global.h"
+#include "code_800558C.h"
+
+extern u32 gUnknown_203B47C;
+
+extern u32 gUnknown_2026E3C;
+extern u32 gUnknown_2026E58;
+extern u32 gUnknown_2026E54;
+extern u32 gUnknown_2026E50;
+extern u16 gUnknown_2026E4E;
+extern u8 gUnknown_2026E38;
+
+extern void sub_800CC44(u32 r0, u32 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;
+ gUnknown_2026E3C = gUnknown_2026E58;
+
+ temp = 0;
+ if (gUnknown_2026E54 == 0)
+ {
+ temp = 1;
+ }
+ gUnknown_2026E54 = temp;
+
+ temp = 0;
+
+ if (gUnknown_2026E50 == 0)
+ {
+ temp = 1;
+ }
+ 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
+}
+
+#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;
+ gUnknown_2026E3C = gUnknown_2026E58;
+ temp = 0;
+
+ if (gUnknown_2026E54 == 0)
+ {
+ temp = 1;
+ }
+ gUnknown_2026E54 = temp;
+
+ temp = 0;
+
+ if (gUnknown_2026E50 == 0)
+ {
+ temp = 1;
+ }
+ 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
+}
diff --git a/src/code_800B5F0.c b/src/code_800B5F0.c
new file mode 100644
index 0000000..35b5282
--- /dev/null
+++ b/src/code_800B5F0.c
@@ -0,0 +1,99 @@
+#include "global.h"
+
+extern bool8 gInterruptsEnabled;
+extern u32 gIntrTable[];
+extern u32 IntrMain;
+extern u8 gUnknown_202D4B8;
+extern u32 gUnknown_202D5F0[];
+
+bool8 EnableInterrupts(void)
+{
+ if(gInterruptsEnabled == FALSE)
+ {
+ return FALSE;
+ }
+
+ if((REG_IME & 1) != 0)
+ {
+ return FALSE;
+ }
+ else
+ {
+ REG_IME = 1;
+ return TRUE;
+ }
+}
+
+bool8 DisableInterrupts(void)
+{
+ if(gInterruptsEnabled == 0)
+ {
+ return FALSE;
+ }
+
+ if((REG_IME & 1) == 0)
+ {
+ return FALSE;
+ }
+ else
+ {
+ REG_IME = 0;
+ return TRUE;
+ }
+
+}
+
+bool8 sub_800B650(void)
+{
+ if(gInterruptsEnabled == FALSE)
+ {
+ return FALSE;
+ }
+
+ if((REG_IME & 1) != 0)
+ {
+ return FALSE;
+ }
+ else
+ {
+ return TRUE;
+ }
+}
+
+void SetInterruptFlag(u16 flag)
+{
+ if(gInterruptsEnabled == FALSE)
+ {
+ return;
+ }
+
+ REG_IME = 0;
+ INTR_CHECK |= flag;
+ REG_IME = 1;
+}
+
+void sub_800B6B0(const u32 *r0)
+{
+ CpuCopy32(r0, &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;
+}
+
+u32 *sub_800B6E8(u32 r0)
+{
+ return &gIntrTable[r0];
+}
+
+u32 sub_800B6F4(u32 r0, u32 r1)
+{
+ u32 temp;
+ u32 interrupt_var;
+
+ interrupt_var = DisableInterrupts();
+ temp = gUnknown_202D5F0[r0];
+ gUnknown_202D5F0[r0] = r1;
+ if(interrupt_var != FALSE){
+ EnableInterrupts();
+ }
+ return temp;
+}
diff --git a/src/code_80118A4.c b/src/code_80118A4.c
new file mode 100644
index 0000000..85782d7
--- /dev/null
+++ b/src/code_80118A4.c
@@ -0,0 +1,191 @@
+#include "global.h"
+
+void sub_8011924(void);
+void nullsub_26(void);
+
+extern void sub_800BDFC(u16 r0);
+extern void sub_800BE8C(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 u8 sub_800C5D0(u16 r0);
+
+extern void nullsub_27(void);
+extern void nullsub_29(void);
+extern void nullsub_30(void);
+extern void nullsub_31(void);
+extern void nullsub_32(void);
+extern void nullsub_28(void);
+
+struct UnkStructType
+{
+ /* 0x0 */ s16 unk0;
+
+};
+
+extern u16 gUnknown_80D4144[];
+extern struct UnkStructType gUnknown_202DE20;
+extern struct UnkStructType gUnknown_202DE22;
+extern u32 gUnknown_202DE1C;
+extern u32 gUnknown_203B14C;
+
+void sub_80118A4(void)
+{
+ sub_8011924();
+ sub_801199C(0x3e6);
+ sub_801199C(0x3e5);
+}
+
+void sub_80118C4(u16 r0)
+{
+ sub_800BFD0(r0);
+ sub_800C3F8(0x3e6, r0);
+ sub_800C3F8(0x3e5, r0);
+}
+
+void sub_80118F0(u16 r0)
+{
+ sub_800BDFC(r0);
+}
+
+void sub_8011900(u16 r0, u16 r1)
+{
+ sub_800BE8C(r0, r1);
+}
+
+void sub_8011914(u16 r0)
+{
+ sub_800BF48(r0);
+}
+
+void sub_8011924()
+{
+ sub_800BF80();
+}
+
+void sub_8011930(u16 r0)
+{
+ sub_800BFD0(r0);
+}
+
+// TODO fix this nonmatching
+#ifndef NONMATCHING
+NAKED
+#endif
+u32 sub_8011940(u16 r0)
+{
+#ifdef NONMATCHING
+ u32 temp;
+ temp = sub_800C068();
+
+ if(r0 == 0x3e7)
+ {
+ temp ^= r0;
+ // TODO this OR/NEG apparently is close
+ temp |= -temp;
+ return temp >> 31;
+ }
+
+ if(temp != r0)
+ return 0;
+ else
+ return 1;
+#else
+ asm_unified("\tpush {r4,lr}\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r4, r0, 16\n"
+ "\tbl sub_800C068\n"
+ "\tlsls r0, 16\n"
+ "\tlsrs r1, r0, 16\n"
+ "\tldr r0, _08011960\n"
+ "\tcmp r4, r0\n"
+ "\tbne _08011964\n"
+ "\teors r1, r4\n"
+ "\tnegs r0, r1\n"
+ "\torrs r0, r1\n"
+ "\tlsrs r0, 31\n"
+ "\tb _0801196C\n"
+ "\t.align 2,0\n"
+ "_08011960: .4byte 0x000003e7\n"
+ "_08011964:\n"
+ "\tmovs r0, 0\n"
+ "\tcmp r1, r4\n"
+ "\tbne _0801196C\n"
+ "\tmovs r0, 0x1\n"
+ "_0801196C:\n"
+ "\tpop {r4}\n"
+ "\tpop {r1}\n"
+ "\tbx r1");
+#endif
+}
+
+void sub_8011974(u16 r0, u16 r1)
+{
+ sub_800C074(r0, r1);
+}
+
+void sub_8011988(u16 r0)
+{
+ sub_800C074(r0, 0x80 << 1);
+}
+
+void sub_801199C(u16 r0)
+{
+ sub_800C298(r0);
+}
+
+void sub_80119AC(u16 r0, u16 r1)
+{
+ sub_800C3F8(r0, r1);
+}
+
+u8 sub_80119C0(u16 r0)
+{
+ return sub_800C5D0(r0);
+}
+
+void sub_80119D4(u32 r0)
+{
+ if(gUnknown_202DE20.unk0 > 0)
+ return;
+ sub_800C074(gUnknown_80D4144[r0], 0x80 << 1);
+ gUnknown_202DE20.unk0 = 4;
+}
+
+void sub_8011A04(void)
+{
+ if(gUnknown_202DE22.unk0 > 0)
+ return;
+ gUnknown_202DE22.unk0 = 3;
+ sub_800C074(0x131, 0x80 << 1);
+}
+
+void sub_8011A2C(u32 r0)
+{
+ gUnknown_202DE1C = r0;
+}
+
+void NDS_DebugInit(void)
+{
+ nullsub_26();
+ nullsub_27();
+ nullsub_29();
+ nullsub_30();
+ nullsub_31();
+ nullsub_32();
+ nullsub_28();
+ gUnknown_203B14C = 1; // Maybe a flag saying Debug is on?
+}
+
+void nullsub_25(void)
+{
+}
+
+void nullsub_26(void)
+{
+}
diff --git a/src/code_80118A4_1.c b/src/code_80118A4_1.c
new file mode 100644
index 0000000..c2fa641
--- /dev/null
+++ b/src/code_80118A4_1.c
@@ -0,0 +1,69 @@
+#include "global.h"
+
+extern u8 gUnknown_203B150;
+
+void nullsub_199(void)
+{
+}
+
+void nullsub_27(void)
+{
+}
+
+void sub_8011B08(void)
+{
+ gUnknown_203B150 = 1;
+}
+
+void sub_8011B14(void)
+{
+ gUnknown_203B150 = 0;
+}
+
+#ifndef NONMATCHING
+NAKED
+#endif
+u8 sub_8011B20(void)
+{
+#ifdef NONMATCHING
+ // TODO figure out why I mix up my mv/ldr for these kinds of comparisons
+ u8 temp;
+ if(gUnknown_203B150 == 0)
+ {
+ temp = 1;
+ }
+ else
+ {
+ temp = 0;
+ }
+ gUnknown_203B150 = temp;
+ return gUnknown_203B150;
+#else
+ asm_unified("\tpush {lr}\n"
+ "\tldr r1, _08011B38\n"
+ "\tmovs r2, 0\n"
+ "\tldrb r0, [r1]\n"
+ "\tcmp r0, 0\n"
+ "\tbne _08011B2E\n"
+ "\tmovs r2, 0x1\n"
+"_08011B2E:\n"
+ "\tstrb r2, [r1]\n"
+ "\tldrb r0, [r1]\n"
+ "\tpop {r1}\n"
+ "\tbx r1\n"
+ "\t.align 2, 0\n"
+"_08011B38: .4byte gUnknown_203B150");
+#endif
+}
+
+// unused
+u8 sub_8011B3C(void)
+{
+ return gUnknown_203B150;
+}
+
+// unused
+void nullsub_137(void)
+{
+
+}
diff --git a/src/code_801D760.c b/src/code_801D760.c
new file mode 100644
index 0000000..89cd661
--- /dev/null
+++ b/src/code_801D760.c
@@ -0,0 +1,60 @@
+#include "global.h"
+
+extern u32 sub_8022860();
+extern void sub_8022908();
+extern void sub_801D208(u8);
+extern void sub_8027168();
+extern u32 sub_80270A4();
+extern u32 sub_8025F68();
+extern u8 sub_802604C();
+extern void sub_8026058();
+
+struct unk_203B250
+{
+ u32 unk0;
+ u16 unk4;
+ u8 unk6;
+ u8 unk7;
+};
+
+struct unk_203B250 *gUnknown_203B250;
+
+void sub_801D760()
+{
+ u32 temp;
+ temp = sub_8022860();
+ if (temp <= 1)
+ return;
+ if (temp > 3)
+ return;
+ sub_8022908();
+ sub_801D208(1);
+
+}
+
+void sub_801D77C()
+{
+ u32 temp;
+ temp = sub_80270A4();
+ if (temp <= 1)
+ return;
+ if (temp > 3)
+ return;
+ sub_8027168();
+ sub_801D208(1);
+
+}
+
+void sub_801D798(void)
+{
+ u32 temp;
+ temp = sub_8025F68();
+ if (temp <= 1)
+ return;
+ if (temp > 3)
+ return;
+ if(sub_802604C() != 0)
+ gUnknown_203B250->unk7 = gUnknown_203B250->unk6;
+ sub_8026058();
+ sub_801D208(2);
+}
diff --git a/src/code_8027C84.c b/src/code_8027C84.c
new file mode 100644
index 0000000..e21400c
--- /dev/null
+++ b/src/code_8027C84.c
@@ -0,0 +1,25 @@
+#include "global.h"
+
+extern u8 gUnknown_80F42D0[];
+extern u8 gUnknown_80F42F0[];
+extern u8 gUnknown_203B408;
+
+u8 sub_803D0D8()
+{
+ return gUnknown_203B408;
+}
+
+void sub_803D0E4(u8 r0)
+{
+ gUnknown_203B408 = r0;
+}
+
+u8 sub_803D0F0(u8 r0)
+{
+ return gUnknown_80F42F0[r0];
+}
+
+u8 sub_803D100(u8 r0)
+{
+ return gUnknown_80F42D0[r0];
+}
diff --git a/src/code_8027C84_pre.c b/src/code_8027C84_pre.c
new file mode 100644
index 0000000..2dbdd66
--- /dev/null
+++ b/src/code_8027C84_pre.c
@@ -0,0 +1,86 @@
+#include "global.h"
+
+
+struct UnkOtherStructTemp
+{
+ /* 0x0 */ u32 unk0;
+ /* 0x4 */ u32 unk4;
+ /* 0x8 */ u32 unk8;
+ /* 0xC */ u32 unkC;
+ /* 0x10 */ u32 unk10;
+ /* 0x14 */ u32 unk14;
+ /* 0x18 */ u32 unk18;
+ /* 0x1C */ u32 unk1C;
+ /* 0x20 */ u16 *unk20;
+ /* 0x24 */ u16 unk24;
+ /* 0x26 */ u16 unk26;
+ /* 0x28 */ u16 unk28;
+ /* 0x2A */ u16 unk2A;
+};
+
+struct UnkStructTemp
+{
+ /* 0x0 */ u32 unk0;
+ /* 0x4 */ u32 unk4;
+ /* 0x8 */ u32 unk8;
+ /* 0xC */ u32 unkC;
+ /* 0x10 */ u32 unk10;
+ /* 0x14 */ u32 unk14;
+ /* 0x18 */ u32 unk18;
+ /* 0x1C */ u32 unk1C;
+ /* 0x20 */ struct UnkOtherStructTemp *unk20;
+ /* 0x24 */ u16 unk24;
+ /* 0x26 */ u16 unk26;
+ /* 0x28 */ u16 unk28;
+ /* 0x2A */ u16 unk2A;
+};
+
+
+extern struct UnkStructTemp *gUnknown_203B2BC;
+u32 sub_801B410();
+void sub_801B450();
+void sub_8027184(u8 r0);
+u32 sub_801EF38(u8 r0);
+struct UnkOtherStructTemp *sub_801F194();
+void sub_8027184(u8 r0);
+void sub_801F214();
+
+void sub_8027C84()
+{
+ u32 temp = sub_801B410();
+ if(temp <= 1)
+ return;
+ if(temp > 3)
+ return;
+ sub_801B450();
+ sub_8027184(0xB);
+}
+
+//void sub_8027CA0()
+//{
+// struct UnkOtherStructTemp *temp_store;
+// u32 temp = sub_801EF38(1);
+// if(temp > 4)
+// return;
+// switch(temp)
+// {
+// case 0:
+// case 1:
+// break;
+// case 2:
+// sub_801F214();
+// sub_8027184(0x2);
+// return;
+// case 3:
+// case 4:
+// temp_store = sub_801F194();
+// gUnknown_203B2BC->unk20 = temp_store;
+// // TODO missing
+// // lsls r0, 3
+// // adds r0, r1, r0
+// // Why are we shifting the pointer by 3?
+// gUnknown_203B2BC->unk24 = temp_store->unk2A;
+// sub_8027184(0x10);
+// break;
+// }
+//}
diff --git a/src/code_80428A0.c b/src/code_80428A0.c
new file mode 100644
index 0000000..eab25f3
--- /dev/null
+++ b/src/code_80428A0.c
@@ -0,0 +1,145 @@
+#include "global.h"
+
+extern void sub_804151C(u32 r0, u32 r1, u32 r2);
+extern void sub_803E708(u32 r0, u32 r1);
+extern void sub_80416A4(u32 r0, u32 r1, u32 r2);
+extern void sub_80421C0(u32 r0, u32 r1);
+
+void sub_80428A0(u32 r0)
+{
+ sub_804151C(r0, 0x29, 1);
+}
+
+void sub_80428B0(u32 r0)
+{
+ sub_804151C(r0, 0x1a9, 0);
+}
+
+
+void sub_80428C4(u32 r0)
+{
+ sub_804151C(r0, 0x1a9, 0);
+}
+
+
+void sub_80428D8(u32 r0)
+{
+ sub_804151C(r0, 0x1a9, 0);
+}
+
+void sub_80428EC(u32 r0)
+{
+ sub_804151C(r0, 0x1a9, 0);
+}
+
+void sub_8042900(u32 r0)
+{
+ sub_804151C(r0, 0xD4 << 1, 0);
+}
+
+void sub_8042910(u32 r0)
+{
+ sub_804151C(r0, 0x29, 0);
+}
+
+void sub_8042920(u32 r0)
+{
+ sub_804151C(r0, 0x48, 0);
+}
+
+void sub_8042930(u32 r0)
+{
+ sub_804151C(r0, 0xD3 << 1, 1);
+}
+
+void sub_8042940(u32 r0)
+{
+ sub_804151C(r0, 0xC7 << 1, 0);
+}
+
+void sub_8042950(u32 r0)
+{
+ sub_804151C(r0, 0xD8 << 1, 1);
+ sub_803E708(0xA, 0x42);
+}
+
+void sub_8042968(u32 r0)
+{
+ sub_804151C(r0, 0xD4 << 1, 0);
+}
+
+void sub_8042978(u32 r0)
+{
+ sub_804151C(r0, 0x1a9, 0);
+}
+
+void sub_804298C(u32 r0)
+{
+ sub_804151C(r0, 0x1a9, 0);
+}
+
+void sub_80429A0(u32 r0)
+{
+ sub_804151C(r0, 0x199, 0);
+}
+
+void sub_80429B4(u32 r0)
+{
+ sub_804151C(r0, 0x1ab, 0);
+}
+
+void sub_80429C8(u32 r0)
+{
+ sub_804151C(r0, 0x4, 1);
+}
+
+void sub_80429D8(u32 r0)
+{
+ sub_804151C(r0, 0x8F << 1, 1);
+}
+
+void sub_80429E8(u32 r0)
+{
+ sub_804151C(r0, 0x11d, 1);
+}
+
+void sub_80429FC(u32 r0)
+{
+ sub_80416A4(r0, 0xCF << 1, 1);
+ sub_80421C0(0, 0xD4);
+}
+
+void sub_8042A14(u32 r0)
+{
+ sub_80416A4(r0, 0x36, 1);
+}
+
+void sub_8042A24(u32 r0)
+{
+ sub_804151C(r0, 0x15, 1);
+}
+
+void sub_8042A34(u32 r0)
+{
+ sub_80416A4(r0, 0x9F << 1, 0);
+}
+
+void sub_8042A44(u32 r0)
+{
+ sub_804151C(r0, 0xDA << 1, 1);
+}
+
+void sub_8042A54(u32 r0)
+{
+ sub_80416A4(r0, 0x37, 1);
+}
+
+void sub_8042A64(u32 r0)
+{
+ sub_80416A4(r0, 0x29, 1);
+}
+
+void sub_8042A74(u32 r0)
+{
+ sub_804151C(r0, 0x18, 1);
+}
diff --git a/src/code_8048480.c b/src/code_8048480.c
new file mode 100644
index 0000000..7033590
--- /dev/null
+++ b/src/code_8048480.c
@@ -0,0 +1,21 @@
+#include "global.h"
+
+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, u32 r3);
+
+void sub_8048480(u32 r0, u32 r1)
+{
+ sub_807D148(r0, r1, 0, 0);
+}
+
+void sub_8048490(void)
+{
+ sub_8075FCC();
+}
+
+void sub_804849C(u32 r0, u32 r1)
+{
+ sub_8077AE4(r0, r1, 1);
+}
diff --git a/src/code_80521D0.c b/src/code_80521D0.c
new file mode 100644
index 0000000..914b02d
--- /dev/null
+++ b/src/code_80521D0.c
@@ -0,0 +1,90 @@
+#include "global.h"
+
+extern void sub_80526D0(u8 r0);
+extern u8 sub_8045888(u32 r0);
+extern void sub_80523A8(u32 r0, u32 r1, u8 r2);
+extern u8 sub_8052DC0(u32);
+extern u8 sub_803F428(u32);
+
+void sub_805229C(void)
+{
+ return sub_80526D0(0x50);
+}
+
+void sub_80522A8(u32 r0, u32 r1)
+{
+ if (sub_8045888(r0) != 0){
+ sub_80523A8(r0, r1, 1);
+ }
+}
+
+void sub_80522C8(u32 r0, u32 r1)
+{
+ if (sub_8045888(r0) != 0){
+ sub_80523A8(r0, r1, 0);
+ }
+}
+
+void sub_80522E8(u32 r0, u32 r1)
+{
+ sub_80523A8(r0, r1, 0);
+}
+
+void sub_80522F4(u32 r0, u32 r1, u32 r2)
+{
+ u8 temp;
+ u32 temp_reg;
+ u32 temp2;
+ temp = sub_8045888(r0);
+ temp_reg = (-temp | temp);
+ temp2 = temp_reg >> 31;
+ if(sub_8052DC0(r1) != 0)
+ {
+ temp2 = 1;
+ }
+ if(temp2 != 0)
+ {
+ sub_80523A8(r0, r2, 1);
+ }
+}
+
+void sub_805232C(u32 r0, u32 r1, u32 r2)
+{
+ u8 temp;
+ u32 temp_reg;
+ u32 temp2;
+ temp = sub_8045888(r0);
+ temp_reg = (-temp | temp);
+ temp2 = temp_reg >> 31;
+ if(sub_8052DC0(r1) != 0)
+ {
+ temp2 = 1;
+ }
+ if(temp2 != 0)
+ {
+ sub_80523A8(r0, r2, 0);
+ }
+}
+
+void sub_8052364(u32 r0, u32 r1, u32 r2)
+{
+ u8 temp;
+ u32 temp_reg;
+ u32 temp2;
+ temp = sub_8045888(r0);
+ temp_reg = (-temp | temp);
+ temp2 = temp_reg >> 31;
+ if(sub_803F428(r1) != 0)
+ {
+ temp2 = 1;
+ }
+ if(temp2 != 0)
+ {
+ sub_80523A8(r0, r2, 1);
+ }
+}
+
+void sub_805239C(u32 r0, u32 r1)
+{
+ sub_80523A8(r0, r1, 1);
+}
diff --git a/src/code_808DAB4.c b/src/code_808DAB4.c
new file mode 100644
index 0000000..e7e7110
--- /dev/null
+++ b/src/code_808DAB4.c
@@ -0,0 +1,10 @@
+#include "global.h"
+
+extern void sub_808DE50(void* r0, void * r1, u32 r2, u32 r3);
+
+extern void * gUnknown_203B45C;
+
+void sub_808DE30(void* r0, u32 r1)
+{
+ sub_808DE50(r0, gUnknown_203B45C + (r1 * 0x58), r1, r1 * 0x58);
+}
diff --git a/src/code_8092334.c b/src/code_8092334.c
new file mode 100644
index 0000000..d12bc44
--- /dev/null
+++ b/src/code_8092334.c
@@ -0,0 +1,50 @@
+#include "global.h"
+
+extern u32 gUnformattedTypeStrings[]; // unformatted type names
+extern u32 gFormattedTypeStrings[]; // formatted type names
+extern u8 gUnknown_810AC7C[];
+extern u8 gUnknown_810AC6A[];
+extern u8 *gAbilityNames[];
+extern u8 *AbilityDescriptions[];
+extern u32 gBoughtFriendAreas;
+extern u32 *gUnknown_203B468;
+
+u32 GetUnformattedTypeString(u8 type)
+{
+ return gUnformattedTypeStrings[type];
+}
+
+u32 GetFormattedTypeString(u8 type)
+{
+ return gFormattedTypeStrings[type];
+}
+
+u8 sub_8092354(u8 r0)
+{
+ return gUnknown_810AC7C[r0];
+}
+
+u8 sub_8092364(u8 r0)
+{
+ return gUnknown_810AC6A[r0];
+}
+
+void sub_8092374(char *r0, u8 r1)
+{
+ strncpy(r0, gAbilityNames[r1], 0x50);
+}
+
+u8 *sub_8092390(u8 r0)
+{
+ return AbilityDescriptions[r0];
+}
+
+void sub_80923A0(void)
+{
+ gUnknown_203B468 = &gBoughtFriendAreas;
+}
+
+u32 *sub_80923B0(void)
+{
+ return &gBoughtFriendAreas;
+}
diff --git a/src/code_8094F88.c b/src/code_8094F88.c
new file mode 100644
index 0000000..2a0e618
--- /dev/null
+++ b/src/code_8094F88.c
@@ -0,0 +1,35 @@
+#include "global.h"
+
+struct unkTimeStruct
+{
+ u16 unk0;
+ u8 unk2;
+ u8 unk3;
+ u8 unk4;
+};
+
+extern struct unkTimeStruct *gUnknown_203B47C;
+extern struct unkTimeStruct gPlayTime;
+
+// Forward Declaration
+void sub_8094FA8(struct unkTimeStruct *Time);
+
+
+void sub_8094F88(void)
+{
+ gUnknown_203B47C = &gPlayTime;
+ sub_8094FA8(&gPlayTime);
+}
+
+struct unkTimeStruct *sub_8094FA0(void)
+{
+ return &gPlayTime;
+}
+
+void sub_8094FA8(struct unkTimeStruct *Time)
+{
+ Time->unk4 = 0;
+ Time->unk3 = 0;
+ Time->unk2 = 0;
+ Time->unk0 = 0;
+}
diff --git a/src/code_8095014.c b/src/code_8095014.c
new file mode 100644
index 0000000..7f3fb05
--- /dev/null
+++ b/src/code_8095014.c
@@ -0,0 +1,87 @@
+#include "global.h"
+
+struct unk_8094FB4
+{
+ s16 unk0;
+ u8 unk2;
+ u8 unk3;
+ u8 unk4;
+};
+
+
+extern u32 *gUnknown_203B480;
+extern u32 *gUnknown_203B484;
+extern u32 *gUnknown_203B488;
+extern u32 *gUnknown_203B48C;
+
+extern u32 gUnknown_203B47C;
+extern u32 gUnknown_2038C88;
+extern u32 gUnknown_2039288;
+extern u32 gUnknown_20392E8;
+extern u32 gUnknown_20393C0;
+
+extern void sub_809488C(u32, u32, u32);
+extern void sub_8094924(u32, u32, u32);
+
+void sub_8095014(struct unk_8094FB4 *r0, u32 *r1, u32 *r2, u32 *r3)
+{
+ u32 temp;
+ if(r0->unk0 <= 0x270f)
+ {
+ *r1 = r0->unk0;
+ *r2 = r0->unk2;
+ temp = r0->unk3;
+ }
+ else
+ {
+ *r1 = 0x270f;
+ *r2 = 0x3B;
+ temp = 0x3B;
+ }
+ *r3 = temp;
+}
+
+void sub_8095044(u32 r0)
+{
+ sub_809488C(r0, gUnknown_203B47C + 4, 0x6);
+ sub_809488C(r0, gUnknown_203B47C + 3, 0x6);
+ sub_809488C(r0, gUnknown_203B47C + 2, 0x6);
+ sub_809488C(r0, gUnknown_203B47C, 0xE);
+}
+
+void sub_8095080(u32 r0)
+{
+ sub_8094924(r0, gUnknown_203B47C + 4, 0x6);
+ sub_8094924(r0, gUnknown_203B47C + 3, 0x6);
+ sub_8094924(r0, gUnknown_203B47C + 2, 0x6);
+ sub_8094924(r0, gUnknown_203B47C, 0xE);
+}
+
+void sub_80950BC(void)
+{
+ gUnknown_203B480 = &gUnknown_2038C88;
+ gUnknown_203B484 = &gUnknown_2039288;
+ gUnknown_203B488 = &gUnknown_20392E8;
+ gUnknown_203B48C = &gUnknown_20393C0;
+}
+
+u32 *sub_80950F8(void)
+{
+ return &gUnknown_2038C88;
+}
+
+u32 *sub_8095100(void)
+{
+ return &gUnknown_2039288;
+}
+
+u32 *sub_8095108(void)
+{
+ return &gUnknown_20392E8;
+}
+
+u32 *sub_8095110(void)
+{
+ return &gUnknown_20393C0;
+}
+
diff --git a/src/code_8098BDC.c b/src/code_8098BDC.c
new file mode 100644
index 0000000..bd56fb3
--- /dev/null
+++ b/src/code_8098BDC.c
@@ -0,0 +1,166 @@
+#include "global.h"
+
+extern u32 gUnknown_203B47C;
+
+extern void sub_809B57C();
+extern void GroundScript_Unlock();
+extern void sub_809D25C();
+extern void sub_80A59DC();
+extern void sub_809B614();
+extern void sub_809CA20();
+extern void sub_80A6E80();
+extern void sub_8099BE4();
+extern void sub_8099744();
+extern void sub_8011860();
+extern void sub_8094FB4(u32 r0);
+extern void sub_800CB20();
+extern void sub_800485C();
+extern void nullsub_120();
+extern void sub_80A5E70();
+extern void sub_809B638();
+extern void nullsub_106();
+extern void sub_80A73EC();
+extern void sub_8099750();
+extern void sub_8009908();
+extern void xxx_call_update_bg_sound_input();
+extern void sub_80A6E68();
+extern void GroundMap_Action();
+extern void nullsub_124();
+extern void GroundLives_Action();
+extern void GroundObject_Action();
+extern void GroundEffect_Action();
+
+extern s32 sub_8001658(u8, u8);
+extern s32 sub_8001784(u8, u8, u8);
+extern void sub_809CB8C();
+extern void sub_8001D88();
+extern void sub_80015C0(u8, u8);
+extern void sub_80018D8(u8, u8, u32);
+extern void sub_800199C(u8, u8, u8, s32);
+extern void sub_8098CC8();
+extern void sub_809674C();
+extern void sub_80961B4();
+extern void sub_8091FB4();
+extern u8 sub_8001CC4(u8, u8, u8);
+extern void sub_8091980(u32);
+
+void sub_8098BDC(void)
+{
+ sub_809B57C();
+ GroundScript_Unlock();
+ sub_809D25C();
+ sub_80A59DC();
+ sub_809B614();
+ sub_809CA20();
+ sub_80A6E80();
+ sub_8099BE4();
+ sub_8099744();
+ sub_8011860();
+ sub_8094FB4(gUnknown_203B47C);
+ sub_800CB20();
+ sub_800485C();
+ nullsub_120();
+ sub_80A5E70();
+ sub_809B638();
+ nullsub_106();
+ sub_80A73EC();
+ sub_8099750();
+ sub_8009908();
+ xxx_call_update_bg_sound_input();
+ sub_80A6E68();
+ GroundMap_Action();
+ nullsub_124();
+ GroundLives_Action();
+ GroundObject_Action();
+ GroundEffect_Action();
+}
+
+void sub_8098C58(void)
+{
+ s32 temp;
+ sub_80015C0(0, 0x36);
+ sub_80015C0(0, 0x39);
+ sub_809CB8C();
+ sub_8001D88();
+
+ if(sub_8001658(0, 0x2A) != 0)
+ {
+ temp = sub_8001658(0, 0x29);
+ temp++;
+ if(temp > 0xF){
+ temp = 0;
+ }
+ sub_80018D8(0, 0x29, temp);
+ sub_80018D8(0, 0x2A, 0);
+ }
+
+ // TODO this uses r2 but it should be r3
+ // Else this matches so nonmatch for now
+#ifdef NONMATCHING
+ temp = sub_8001784(0, 0x42, 0);
+ if(temp <= 0)
+ {
+ temp = 1;
+ }
+ sub_800199C(0, 0x42, 0, temp - 1);
+#else
+ asm_unified("\tmovs r0, 0\n"
+ "\tmovs r1, 0x42\n"
+ "\tmovs r2, 0\n"
+ "\tbl sub_8001784\n"
+ "\tadds r3, r0, 0\n"
+ "\tcmp r3, 0\n"
+ "\tbgt _08098CB4\n"
+ "\tmovs r3, 0x1\n"
+"_08098CB4:\n"
+ "\tsubs r3, 0x1\n"
+ "\tmovs r0, 0\n"
+ "\tmovs r1, 0x42\n"
+ "\tmovs r2, 0\n"
+ "\tbl sub_800199C");
+#endif
+
+ sub_8098CC8();
+}
+
+void sub_8098CC8(void)
+{
+ u32 temp;
+ if(sub_8001CC4(0x3, 0xB, 0) != 0)
+ {
+ temp = 0;
+ }
+ else if(sub_8001CC4(0x3, 0xF, 0) != 0)
+ {
+ temp = 1;
+ }
+ else if(sub_8001CC4(0x3, 0x12, 0) != 0)
+ {
+ temp = 2;
+ }
+ else
+ {
+ temp = 3;
+ }
+ sub_8091980(temp);
+ sub_809674C();
+ sub_80961B4();
+ sub_8091FB4();
+}
+
+// TODO lsrs should be asrs on my first arg
+//u8 sub_8098D1C(u16 r0, u32 r1, s32 r2)
+//{
+// if(gUnknown_20398A8 == 0)
+// {
+// Log(0, &gUnknown_8115F5C, r0, r2);
+// gUnknown_20398A8 = 1;
+// gUnknown_20398AC = 1;
+// gUnknown_20398B0 = r2;
+// gUnknown_20398B4 = 2;
+// gUnknown_20398BE = r0;
+// gUnknown_20398C0 = r1;
+// return 1;
+// }
+// return 0;
+//}
diff --git a/src/code_80A7714.c b/src/code_80A7714.c
new file mode 100644
index 0000000..0522ef1
--- /dev/null
+++ b/src/code_80A7714.c
@@ -0,0 +1,27 @@
+#include "global.h"
+
+extern void sub_80A68A0(void);
+extern void sub_80A7094(u32 r0, u32 r1, u32 r2, u32 r3);
+extern void sub_80A7310(u32 r0, u32 r1, u32 r2, u32 r3);
+extern s16 gUnknown_2039DE0;
+
+void sub_80A7714(void)
+{
+ sub_80A68A0();
+}
+
+void sub_80A7720(u32 r0, u32 r1, u32 r2)
+{
+ sub_80A7094(r0, 0, r1, r2);
+ sub_80A7310(r0, r1, 0, r2);
+}
+
+void sub_80A7744(void)
+{
+ gUnknown_2039DE0 = -1;
+}
+
+void sub_80A7754(void)
+{
+ gUnknown_2039DE0 = -1;
+}
diff --git a/src/code_8272724.c b/src/code_8272724.c
new file mode 100644
index 0000000..945be97
--- /dev/null
+++ b/src/code_8272724.c
@@ -0,0 +1,17 @@
+#include "global.h"
+
+extern void sub_8272774(u32 *r0, u32 r1);
+extern void sub_8272884(u32 *r0, u32 r1);
+
+extern u32 gUnknown_2027370; // TODO defined in text.c and join later
+
+void sub_8272760(u32 r0)
+{
+ sub_8272774(&gUnknown_2027370, r0);
+}
+
+// TODO once sub_8272774 is decomped
+//void sub_8272870(u32 r0)
+//{
+// sub_8272884(&gUnknown_2027370, r0);
+//}
diff --git a/src/dungeon.c b/src/dungeon.c
new file mode 100644
index 0000000..9684ef2
--- /dev/null
+++ b/src/dungeon.c
@@ -0,0 +1,67 @@
+#include "global.h"
+#include "dungeon.h"
+
+const u8 *GetDungeonName1(u8 dungeon)
+{
+ return gDungeonNames[dungeon].name1;
+}
+
+const u8 *GetDungeonName2(u8 dungeon)
+{
+ return gDungeonNames[dungeon].name2;
+}
+
+u8 GetStairDirection(u8 dungeon)
+{
+ return gDungeons[dungeon].stairDirection;
+}
+
+s16 GetUnkC(u8 dungeon)
+{
+ return gDungeons[dungeon].timer;
+}
+
+bool8 GetSaveBeforeEntering(u8 dungeon)
+{
+ return gDungeons[dungeon].saveBeforeEntering;
+}
+
+u8 GetUnk9(u8 dungeon)
+{
+ return gDungeons[dungeon].unk9;
+}
+
+u8 GetLevelCondition(u8 dungeon)
+{
+ return gDungeons[dungeon].levelCondition;
+}
+
+u8 GetMaxItemCount(u8 dungeon)
+{
+ return gDungeons[dungeon].maxItemCount;
+}
+
+u8 GetMoneyCondition(u8 dungeon)
+{
+ return gDungeons[dungeon].moneyCondition;
+}
+
+s8 GetUnk3(u8 dungeon)
+{
+ return gDungeons[dungeon].unk3;
+}
+
+bool8 GetRecruitable(u8 dungeon)
+{
+ return gDungeons[dungeon].isRecruitable;
+}
+
+u8 sub_8090158(u8 dungeon)
+{
+ return gDungeons[dungeon].unk8;
+}
+
+s16 sub_8090168(u8 dungeon)
+{
+ return gDungeons[dungeon].unkE;
+}
diff --git a/src/event_flag.c b/src/event_flag.c
new file mode 100644
index 0000000..501b1af
--- /dev/null
+++ b/src/event_flag.c
@@ -0,0 +1,53 @@
+#include "global.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;
+};
+
+extern void sub_800226C(u8 r0, u8 r1, u32* r2, u8 u3);
+extern void sub_800160C(struct UnkEventStruct2 *r0, u32 r1, u32 r2);
+
+extern u8 gUnknown_2000A88;
+
+
+// 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_8002758(u32 *r0)
+{
+ sub_800226C(0, 0x1, r0, 0x9);
+}
+
+u8 sub_800276C(void)
+{
+ return 0;
+}
+
+void nullsub_140(void)
+{
+
+}
diff --git a/src/file_system.c b/src/file_system.c
index 61d9ec4..c328d6a 100644
--- a/src/file_system.c
+++ b/src/file_system.c
@@ -7,10 +7,31 @@ extern u32 gFileCacheCursorPosition;
extern u32 gUnknown_202D2A4;
extern int sprintf(char *, const char *, ...);
+extern u32 sub_800AAB4(u32 r0, u32 r1, u32 r2);
u8 *GetSiroPtr(struct OpenedFile *);
void NDS_DecompressRLE(void *);
+struct UnkFileStruct
+{
+ /* 0x0 */ u32 unk0;
+ /* 0x4 */ u32 unk4;
+};
+
+extern u32 gUnknown_80B96E4[];
+
+void sub_800A894(struct UnkFileStruct *r0, s32 r1)
+{
+ s32 temp;
+ temp = r1;
+ if(r1 <= 0)
+ temp = 1;
+ if(temp > 299)
+ temp = 299;
+ r0->unk4 = gUnknown_80B96E4[temp];
+ r0->unk0 = 0;
+}
+
void InitFileSystem(void)
{
s32 i;
@@ -173,3 +194,16 @@ void *UnusedGetSir0Ptr(struct SiroArchive *siro)
void NDS_DecompressRLE(void *unused)
{
}
+
+void nullsub_16(void)
+{
+}
+
+void nullsub_175(void)
+{
+}
+
+u32 sub_800AAA8(u32 r0, u32 r1, struct UnkFileStruct1 *r2)
+{
+ return sub_800AAB4(r0, r1, r2->unk4);
+}
diff --git a/src/input.c b/src/input.c
new file mode 100644
index 0000000..99d894b
--- /dev/null
+++ b/src/input.c
@@ -0,0 +1,144 @@
+#include "global.h"
+#include "input.h"
+
+EWRAM_DATA struct Input gUnknown_2025600;
+EWRAM_DATA struct UnkInputStruct1 gUnknown_20255F0;
+EWRAM_DATA struct UnkInputStruct1 gUnknown_2025638;
+EWRAM_DATA struct UnkInputStruct1 gUnknown_2025648;
+EWRAM_DATA struct UnkInputStruct2 gUnknown_2025668;
+EWRAM_DATA u32 gUnknown_202562C;
+
+void InitInput(void)
+{
+ gUnknown_20255F0.unk0 = 0;
+ gUnknown_20255F0.unk2 = 0;
+ gUnknown_20255F0.unk4 = 0;
+ gUnknown_20255F0.unk6 = 0;
+
+ gUnknown_2025638.unk0 = 0;
+ gUnknown_2025638.unk2 = 0;
+ gUnknown_2025638.unk4 = 0;
+ gUnknown_2025638.unk6 = 0;
+
+ gUnknown_202562C = 4854977; // ????? (0x4a14c1)
+
+ gUnknown_2025600.unk20 = 0;
+ gUnknown_2025600.unk0 = 0xffff; // probably a mask
+ gUnknown_2025600.unk2 = -1;
+ gUnknown_2025600.unk4 = -1;
+ gUnknown_2025600.unk6 = -1;
+ gUnknown_2025600.unk1C = -1;
+ gUnknown_2025600.unk1E = -1;
+ gUnknown_2025600.unk8 = -1;
+ gUnknown_2025600.unkA = -1;
+ gUnknown_2025600.unkC = -1;
+ gUnknown_2025600.unkE = -1;
+ gUnknown_2025600.unk10 = -1;
+ gUnknown_2025600.unk12 = -1;
+ gUnknown_2025600.unk14 = -1;
+ gUnknown_2025600.unk16 = -1;
+ gUnknown_2025600.unk28 = 0;
+ gUnknown_2025600.unk29 = 0;
+
+ gUnknown_2025668.unk0 = 0;
+ gUnknown_2025668.unk2 = 0;
+}
+
+void sub_800485C(void)
+{
+ gUnknown_20255F0 = gUnknown_2025638;
+
+ gUnknown_2025638.unk0 = 0;
+ gUnknown_2025638.unk2 = 0;
+ gUnknown_2025638.unk4 = 0;
+ gUnknown_2025638.unk6 = 0;
+
+ gUnknown_2025600.unk0 = 0xffff;
+ gUnknown_2025600.unk2 = -1;
+ gUnknown_2025600.unk4 = -1;
+ gUnknown_2025600.unk6 = -1;
+ gUnknown_2025600.unk8 = -1;
+ gUnknown_2025600.unkA = -1;
+ gUnknown_2025600.unkC = -1;
+ gUnknown_2025600.unkE = -1;
+ gUnknown_2025600.unk10 = -1;
+ gUnknown_2025600.unk12 = -1;
+ gUnknown_2025600.unk14 = -1;
+ gUnknown_2025600.unk16 = -1;
+
+ gUnknown_2025600.unk28 = 0;
+ gUnknown_2025600.unk29 = 0;
+}
+
+// Unused
+u8 sub_80048B8(void)
+{
+ return 0;
+}
+
+u8 sub_80048BC(void)
+{
+ return 0;
+}
+
+// Unused
+u8 sub_80048C0(void)
+{
+ return 0;
+}
+
+// Unused
+u8 sub_80048C4(void)
+{
+ return 0;
+}
+
+u8 sub_80048C8(void)
+{
+ return 0;
+}
+
+// Unused
+u8 sub_80048CC(void)
+{
+ return 0;
+}
+
+void sub_80048D0(void)
+{
+ gUnknown_20255F0.unk4 = 0;
+ gUnknown_2025648.unkC = 0;
+ gUnknown_2025648.unk8 = 0;
+ gUnknown_2025668.unk0 = 0x3e7;
+ gUnknown_2025668.unk2 = 0x3e7;
+
+}
+
+void sub_80048F8(void)
+{
+ gUnknown_20255F0.unk2 = 0;
+ gUnknown_2025638.unk2 = 0;
+ gUnknown_2025648.unk2 = 0;
+}
+
+void sub_8004914(void)
+{
+ gUnknown_2025600.unk20 = 0x5;
+ gUnknown_2025600.unk24 = 0;
+ gUnknown_2025600.unk0 = 0xffff;
+ gUnknown_2025600.unk2 = -1;
+ gUnknown_2025600.unk4 = -1;
+ gUnknown_2025600.unk6 = -1;
+ gUnknown_2025600.unk8 = -1;
+ gUnknown_2025600.unkA = -1;
+ gUnknown_2025600.unkC = -1;
+ gUnknown_2025600.unkE = -1;
+ gUnknown_2025600.unk10 = -1;
+ gUnknown_2025600.unk12 = -1;
+ gUnknown_2025600.unk14 = -1;
+ gUnknown_2025600.unk16 = -1;
+
+ gUnknown_2025600.unk28 = 0;
+ gUnknown_2025600.unk29 = 0;
+
+}
diff --git a/src/libisagbprn.c b/src/libisagbprn.c
new file mode 100644
index 0000000..e0e979e
--- /dev/null
+++ b/src/libisagbprn.c
@@ -0,0 +1,177 @@
+#include <stdarg.h>
+#include <stdio.h>
+#include "gba/gba.h"
+#include "config.h"
+
+#define AGB_PRINT_FLUSH_ADDR 0x9FE209D
+#define AGB_PRINT_STRUCT_ADDR 0x9FE20F8
+#define AGB_PRINT_PROTECT_ADDR 0x9FE2FFE
+#define WSCNT_DATA (WAITCNT_PHI_OUT_16MHZ | WAITCNT_WS0_S_2 | WAITCNT_WS0_N_4)
+
+// originally for auto no$gba support, the string "no$gba" should be at this address,
+// the user needs to read this string out as the memory viewer won't show it.
+#define NOCASHGBAIDADDR 0x4FFFA00
+#define NOCASHGBAPRINTADDR1 0x4FFFA10 // automatically adds a newline after the string has finished
+#define NOCASHGBAPRINTADDR2 0x4FFFA14 // does not automatically add the newline. by default, NOCASHGBAPRINTADDR2 is used. this is used to keep strings consistent between no$gba and VBA-RR, but a user can choose to forgo this.
+
+struct AGBPrintStruct
+{
+ u16 m_nRequest;
+ u16 m_nBank;
+ u16 m_nGet;
+ u16 m_nPut;
+};
+
+typedef void (*LPFN_PRINT_FLUSH)(void);
+
+#ifndef NDEBUG
+
+void AGBPrintFlush1Block(void);
+
+void AGBPrintInit(void)
+{
+ volatile struct AGBPrintStruct *pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR;
+ u16 *pWSCNT = (u16 *)REG_ADDR_WAITCNT;
+ u16 *pProtect = (u16 *)AGB_PRINT_PROTECT_ADDR;
+ u16 nOldWSCNT = *pWSCNT;
+ *pWSCNT = WSCNT_DATA;
+ *pProtect = 0x20;
+ pPrint->m_nRequest = pPrint->m_nGet = pPrint->m_nPut = 0;
+ pPrint->m_nBank = 0xFD;
+ *pProtect = 0;
+ *pWSCNT = nOldWSCNT;
+}
+
+static void AGBPutcInternal(const char cChr)
+{
+ volatile struct AGBPrintStruct *pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR;
+ u16 *pPrintBuf = (u16 *)(0x8000000 + (pPrint->m_nBank << 16));
+ u16 *pProtect = (u16 *)AGB_PRINT_PROTECT_ADDR;
+ u16 nData = pPrintBuf[pPrint->m_nPut / 2];
+ *pProtect = 0x20;
+ nData = (pPrint->m_nPut & 1) ? (nData & 0xFF) | (cChr << 8) : (nData & 0xFF00) | cChr;
+ pPrintBuf[pPrint->m_nPut / 2] = nData;
+ pPrint->m_nPut++;
+ *pProtect = 0;
+}
+
+void AGBPutc(const char cChr)
+{
+ u16 *pWSCNT = (u16 *)REG_ADDR_WAITCNT;
+ u16 nOldWSCNT = *pWSCNT;
+ volatile struct AGBPrintStruct *pPrint;
+ *pWSCNT = WSCNT_DATA;
+ AGBPutcInternal(cChr);
+ *pWSCNT = nOldWSCNT;
+ pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR;
+ if (pPrint->m_nPut == ((pPrint->m_nGet - 1) & 0xFFFF))
+ AGBPrintFlush1Block();
+}
+
+void AGBPrint(const char *pBuf)
+{
+ volatile struct AGBPrintStruct *pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR;
+ u16 *pWSCNT = (u16 *)REG_ADDR_WAITCNT;
+ u16 nOldWSCNT = *pWSCNT;
+ *pWSCNT = WSCNT_DATA;
+ while (*pBuf)
+ {
+ AGBPutc(*pBuf);
+ pBuf++;
+ }
+ *pWSCNT = nOldWSCNT;
+}
+
+void AGBPrintf(const char *pBuf, ...)
+{
+ char bufPrint[0x100];
+ va_list vArgv;
+ va_start(vArgv, pBuf);
+ vsprintf(bufPrint, pBuf, vArgv);
+ va_end(vArgv);
+ AGBPrint(bufPrint);
+}
+
+static void AGBPrintTransferDataInternal(u32 bAllData)
+{
+ LPFN_PRINT_FLUSH lpfnFuncFlush;
+ u16 *pIME;
+ u16 nIME;
+ u16 *pWSCNT;
+ u16 nOldWSCNT;
+ u16 *pProtect;
+ volatile struct AGBPrintStruct *pPrint;
+
+ pProtect = (u16 *)AGB_PRINT_PROTECT_ADDR;
+ pPrint = (struct AGBPrintStruct *)AGB_PRINT_STRUCT_ADDR;
+ lpfnFuncFlush = (LPFN_PRINT_FLUSH)AGB_PRINT_FLUSH_ADDR;
+ pIME = (u16 *)REG_ADDR_IME;
+ nIME = *pIME;
+ pWSCNT = (u16 *)REG_ADDR_WAITCNT;
+ nOldWSCNT = *pWSCNT;
+ *pIME = nIME & ~1;
+ *pWSCNT = WSCNT_DATA;
+
+ if (bAllData)
+ {
+ while (pPrint->m_nPut != pPrint->m_nGet)
+ {
+ *pProtect = 0x20;
+ lpfnFuncFlush();
+ *pProtect = 0;
+ }
+ }
+ else if (pPrint->m_nPut != pPrint->m_nGet)
+ {
+ *pProtect = 0x20;
+ lpfnFuncFlush();
+ *pProtect = 0;
+ }
+
+ *pWSCNT = nOldWSCNT;
+ *pIME = nIME;
+}
+
+void AGBPrintFlush1Block(void)
+{
+ AGBPrintTransferDataInternal(FALSE);
+}
+
+void AGBPrintFlush(void)
+{
+ AGBPrintTransferDataInternal(TRUE);
+}
+
+void AGBAssert(const char *pFile, int nLine, const char *pExpression, int nStopProgram)
+{
+ if (nStopProgram)
+ {
+ AGBPrintf("ASSERTION FAILED FILE=[%s] LINE=[%d] EXP=[%s] \n", pFile, nLine, pExpression);
+ AGBPrintFlush();
+ asm(".hword 0xEFFF");
+ }
+ else
+ {
+ AGBPrintf("WARING FILE=[%s] LINE=[%d] EXP=[%s] \n", pFile, nLine, pExpression);
+ }
+}
+
+// no$gba print functions, uncomment to use
+/*
+void NoCashGBAPrint(const char *pBuf)
+{
+ *(volatile u32*)NOCASHGBAPRINTADDR2 = (u32)pBuf;
+}
+
+void NoCashGBAPrintf(const char *pBuf, ...)
+{
+ char bufPrint[0x100];
+ va_list vArgv;
+ va_start(vArgv, pBuf);
+ vsprintf(bufPrint, pBuf, vArgv);
+ va_end(vArgv);
+ NoCashGBAPrint(bufPrint);
+}
+*/
+
+#endif
diff --git a/src/main.c b/src/main.c
index d05db7f..7dcfc4a 100644
--- a/src/main.c
+++ b/src/main.c
@@ -1,6 +1,7 @@
#include "global.h"
#include "random.h"
#include "flash.h"
+#include "text.h"
extern char ewram_start[];
@@ -34,7 +35,6 @@ extern void InitInput(void);
extern void InitBGPaletteBuffer(void);
extern void sub_80057E8(void);
extern void InitFileSystem(void);
-extern void sub_8006218(void);
extern void sub_80098A0(void);
extern void sub_80096E0(void);
extern void sub_800B6F4(int, void *);
diff --git a/src/memory1.c b/src/memory1.c
new file mode 100644
index 0000000..8efcc04
--- /dev/null
+++ b/src/memory1.c
@@ -0,0 +1,11 @@
+#include "global.h"
+
+void nullsub_141(void)
+{
+
+}
+
+void nullsub_142(void)
+{
+
+}
diff --git a/src/personality_test.c b/src/personality_test.c
new file mode 100644
index 0000000..0bec4a7
--- /dev/null
+++ b/src/personality_test.c
@@ -0,0 +1,17 @@
+#include "global.h"
+#include "constants/species.h"
+
+const u16 gPartners[10] =
+{
+ SPECIES_CHARMANDER,
+ SPECIES_BULBASAUR,
+ SPECIES_SQUIRTLE,
+ SPECIES_PIKACHU,
+ SPECIES_CHIKORITA,
+ SPECIES_TOTODILE,
+ SPECIES_CYNDAQUIL,
+ SPECIES_TORCHIC,
+ SPECIES_TREECKO,
+ SPECIES_MUDKIP
+};
+
diff --git a/src/pokemon.c b/src/pokemon.c
new file mode 100644
index 0000000..55316d6
--- /dev/null
+++ b/src/pokemon.c
@@ -0,0 +1,26 @@
+#include "global.h"
+#include "pokemon.h"
+#include "file_system.h"
+
+extern u32 *gUnknown_203B45C;
+extern u32 gUnknown_202F400;
+extern struct FileArchive gUnknown_8300500;
+extern const char gUnknown_81075F4;
+extern struct OpenedFile *gMonsterParametersFile;
+extern u16 gUnknown_20384E8;
+extern struct gPokemon gMonsterParameters;
+
+void LoadMonsterParameters(void)
+{
+ gUnknown_203B45C = &gUnknown_202F400;
+ gMonsterParametersFile = OpenFileAndGetFileDataPtr(&gUnknown_81075F4, &gUnknown_8300500);
+ // TODO verify this... other parts imply this is an array
+ gMonsterParameters.species = gMonsterParametersFile->data;
+ gUnknown_20384E8 = 0;
+}
+
+u32 *sub_808CE00(void)
+{
+ return &gUnknown_202F400;
+
+}
diff --git a/src/pokemon_1.c b/src/pokemon_1.c
new file mode 100644
index 0000000..c2434e1
--- /dev/null
+++ b/src/pokemon_1.c
@@ -0,0 +1,194 @@
+#include "global.h"
+#include "pokemon.h"
+#include "file_system.h"
+
+extern int sprintf(char *, const char *, ...);
+
+extern struct gPokemon *gMonsterParameters;
+extern struct FileArchive gUnknown_8510000;
+extern const char gUnknown_8107684;
+
+struct unkEvolve
+{
+ /* 0x0 */ struct EvolveStruct1 conditions;
+ /* 0x4 */ struct EvolveNeeds needs;
+};
+
+#ifndef NONMATCHING
+NAKED
+#endif
+void sub_808DD48(s16 r0, struct unkEvolve *r1)
+{
+#ifdef NONMATCHING
+ struct EvolveStruct1 temp2;
+ struct EvolveNeeds temp1;
+ temp1 = gMonsterParameters[r0].need;
+ temp2 = gMonsterParameters[r0].pre; // TODO should be using r2 but it uses r0
+ r1->conditions = temp2;
+ r1->needs = temp1;
+#else
+ asm_unified("\tlsls r0, 16\n"
+ "\tasrs r0, 16\n"
+ "\tldr r2, _0808DD64\n"
+ "\tldr r3, [r2]\n"
+ "\tlsls r2, r0, 3\n"
+ "\tadds r2, r0\n"
+ "\tlsls r2, 3\n"
+ "\tadds r2, r3\n"
+ "\tldr r3, [r2, 0x38]\n"
+ "\tldr r2, [r2, 0x34]\n"
+ "\tstr r2, [r1]\n"
+ "\tstr r3, [r1, 0x4]\n"
+ "\tbx lr\n"
+ "\t.align 2, 0\n"
+"_0808DD64: .4byte gMonsterParameters");
+#endif
+}
+
+#ifndef NONMATCHING
+NAKED
+#endif
+// Pretty confided args are correct yet compiler disagrees
+u8 sub_808DD68(s16 r0, u32 r1)
+{
+#ifdef NONMATCHING
+ if (r1 != 0)
+ {
+ return 0xA;
+ }
+ else
+ {
+ return gMonsterParameters[r0].overworld_sprite;
+ }
+#else
+ asm_unified("\tpush {lr}\n"
+ "\tlsls r0, 16\n"
+ "\tasrs r2, r0, 16\n"
+ "\tcmp r1, 0\n"
+ "\tbne _0808DD88\n"
+ "\tldr r0, _0808DD84\n"
+ "\tldr r1, [r0]\n"
+ "\tlsls r0, r2, 3\n"
+ "\tadds r0, r2\n"
+ "\tlsls r0, 3\n"
+ "\tadds r0, r1\n"
+ "\tldrb r0, [r0, 0x8]\n"
+ "\tb _0808DD8A\n"
+ "\t.align 2, 0\n"
+"_0808DD84: .4byte gMonsterParameters\n"
+"_0808DD88:\n"
+ "\tmovs r0, 0xA\n"
+"_0808DD8A:\n"
+ "\tpop {r1}\n"
+ "\tbx r1");
+
+#endif
+}
+
+#ifndef NONMATCHING
+NAKED
+#endif
+struct OpenedFile *sub_808DD90(s16 r0)
+{
+#ifdef NONMATCHING
+ // Looks like this loads the dialogue sprite for the pokemon
+
+ // Two words: register memes... else it matches
+ // Fix this and then one after matches too
+ char buffer[0xC];
+ if(gMonsterParameters[r0].dialogue_sprites == 0)
+ {
+ return NULL;
+ }
+ sprintf(buffer, &gUnknown_8107684);
+ return OpenFile(buffer, &gUnknown_8510000);
+#else
+ asm_unified("\tpush {lr}\n"
+ "\tsub sp, 0xC\n"
+ "\tlsls r0, 16\n"
+ "\tasrs r2, r0, 16\n"
+ "\tldr r0, _0808DDBC\n"
+ "\tldr r1, [r0]\n"
+ "\tlsls r0, r2, 3\n"
+ "\tadds r0, r2\n"
+ "\tlsls r0, 3\n"
+ "\tadds r0, r1\n"
+ "\tldrh r0, [r0, 0x10]\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0808DDC8\n"
+ "\tldr r1, _0808DDC0\n"
+ "\tmov r0, sp\n"
+ "\tbl sprintf\n"
+ "\tldr r1, _0808DDC4\n"
+ "\tmov r0, sp\n"
+ "\tbl OpenFile\n"
+ "\tb _0808DDCA\n"
+ "\t.align 2, 0\n"
+"_0808DDBC: .4byte gMonsterParameters\n"
+"_0808DDC0: .4byte gUnknown_8107684\n"
+"_0808DDC4: .4byte gUnknown_8510000\n"
+"_0808DDC8:\n"
+ "\tmovs r0, 0\n"
+"_0808DDCA:\n"
+ "\tadd sp, 0xC\n"
+ "\tpop {r1}\n"
+ "\tbx r1");
+#endif
+}
+
+#ifndef NONMATCHING
+NAKED
+#endif
+struct OpenedFile *sub_808DDD0(s16 r0)
+{
+#ifdef NONMATCHING
+ // Looks like this loads the dialogue sprite for the pokemon
+
+ // Two words: register memes... else it matches
+ char buffer[0xC];
+ if(gMonsterParameters[r0].dialogue_sprites == 0)
+ {
+ return NULL;
+ }
+ sprintf(buffer, &gUnknown_8107684);
+ return OpenFileAndGetFileDataPtr(buffer, &gUnknown_8510000);
+#else
+ asm_unified("\tpush {lr}\n"
+ "\tsub sp, 0xC\n"
+ "\tlsls r0, 16\n"
+ "\tasrs r2, r0, 16\n"
+ "\tldr r0, _0808DDFC\n"
+ "\tldr r1, [r0]\n"
+ "\tlsls r0, r2, 3\n"
+ "\tadds r0, r2\n"
+ "\tlsls r0, 3\n"
+ "\tadds r0, r1\n"
+ "\tldrh r0, [r0, 0x10]\n"
+ "\tcmp r0, 0\n"
+ "\tbeq _0808DE08\n"
+ "\tldr r1, _0808DE00\n"
+ "\tmov r0, sp\n"
+ "\tbl sprintf\n"
+ "\tldr r1, _0808DE04\n"
+ "\tmov r0, sp\n"
+ "\tbl OpenFileAndGetFileDataPtr\n"
+ "\tb _0808DE0A\n"
+ "\t.align 2, 0\n"
+ "_0808DDFC: .4byte gMonsterParameters\n"
+ "_0808DE00: .4byte gUnknown_8107684\n"
+ "_0808DE04: .4byte gUnknown_8510000\n"
+ "_0808DE08:\n"
+ "\tmovs r0, 0\n"
+ "_0808DE0A:\n"
+ "\tadd sp, 0xC\n"
+ "\tpop {r1}\n"
+ "\tbx r1");
+
+#endif
+}
+
+bool8 sub_808DE10(s16 r0, s32 r1)
+{
+ // checking to see if dialogue sprite is available??
+ return (gMonsterParameters[r0].dialogue_sprites >> r1) & 1;
+}
diff --git a/src/pokemon_mid.c b/src/pokemon_mid.c
new file mode 100644
index 0000000..e348784
--- /dev/null
+++ b/src/pokemon_mid.c
@@ -0,0 +1,85 @@
+#include "global.h"
+#include "pokemon.h"
+
+extern struct gPokemon *gMonsterParameters;
+
+u8 *GetCategoryString(s16 r0)
+{
+ return gMonsterParameters[r0].category;
+}
+
+u8 GetPokemonSize(s16 r0)
+{
+ return gMonsterParameters[r0].size;
+}
+
+u8 GetShadowSize(s16 r0)
+{
+ return gMonsterParameters[r0].shadow_size;
+}
+
+s32 GetMoveSpeed(s16 r0)
+{
+ return gMonsterParameters[r0].move_speed;
+}
+
+u8 GetWalkableTiles(s16 r0)
+{
+ return gMonsterParameters[r0].walkable_tiles;
+}
+
+u8 GetUnk1B(s16 r0)
+{
+ return ((u8)(gMonsterParameters[r0].unk1B) << 25) >> 24;
+}
+
+bool8 GetIsMoving(s16 r0)
+{
+ return gMonsterParameters[r0].isMoving;
+}
+
+u8 GetUnk1D(s16 r0)
+{
+ return gMonsterParameters[r0].unk1D;
+}
+
+u16 GetLowKickDmg(s16 r0)
+{
+ return gMonsterParameters[r0].lowkick_dmg;
+}
+
+u16 GetSizeOrbDmg(s16 r0)
+{
+ return gMonsterParameters[r0].sizeorb_dmg;
+}
+
+u8 GetFriendArea(s16 r0)
+{
+ return gMonsterParameters[r0].friend_area;
+}
+
+u16 GetBaseHP(s16 r0)
+{
+ return gMonsterParameters[r0].base_hp;
+}
+
+bool8 GetUnk33(s16 r0)
+{
+ return gMonsterParameters[r0].unk33;
+}
+
+u8 GetUnk12(s16 r0)
+{
+ return gMonsterParameters[r0].unk12;
+}
+
+s16 sub_808DC0C(s16 r0)
+{
+ return gMonsterParameters[r0].pre.evolve_from;
+}
+
+// TODO fix calculation to match
+//u32 sub_808DC28(s16 r0, u32 r1)
+//{
+// return gMonsterParameters[r0].base_att + (r1 << 1);
+//}
diff --git a/src/save.c b/src/save.c
index 5d39bfe..67e52d0 100644
--- a/src/save.c
+++ b/src/save.c
@@ -1,10 +1,48 @@
#include "global.h"
+#include "flash.h"
+#include "memory.h"
+#include "save.h"
+struct UnkStruct_sub_8011DAC {
+ u8 fill000[0x4];
+ u8 unk004[0x400];
+ u8 fill404[0x10];
+ u32 unk414;
+ u32 unk418;
+ u32 unk41C;
+ u32 unk420;
+ u32 unk424;
+ u32 unk428;
+ u8 fill42C[0x4];
+ u32 unk430;
+ u32 unk434;
+ u32 unk438;
+ u32 unk43C;
+ u32 unk440;
+ u32 unk444;
+ u8 fill448[0x538C];
+};
+
+extern s32 gUnknown_202DE28;
extern u32 gUnknown_203B17C;
extern u32 gUnknown_203B180;
-extern u32 *gUnknown_203B184;
-extern u32 gUnknown_202DE28;
+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);
+extern u32 sub_808EE9C(void* a, s32 b);
+extern u32 sub_808F2B0(void* a, s32 b);
+extern u32 sub_8091D14(void* a, s32 b);
+extern u32 sub_809222C(void* a, s32 b);
+extern u32 sub_80927F4(void* a, s32 b);
+extern u32 sub_80954CC(void* a, s32 b);
+extern u32 sub_8096FA0(void* a, s32 b);
+extern u32 sub_8097D98(void* a, s32 b);
u32 sub_8011C1C(void)
{
@@ -16,12 +54,12 @@ void sub_8011C28(u32 in)
gUnknown_203B17C = in;
}
-u32 sub_8011C34(void)
+s32 sub_8011C34(void)
{
return gUnknown_202DE28;
}
-void sub_8011C40(u32 in)
+void sub_8011C40(s32 in)
{
gUnknown_202DE28 = in;
}
@@ -62,3 +100,170 @@ bool8 ValidateChecksum(u8 *in, u32 size)
return TRUE;
return FALSE;
}
+
+void sub_8011CA8(u32 *out, s32 size)
+{
+ if (gUnknown_203B184 == NULL) {
+ AGB_WARNING("A warning most likely went here.");
+ *out += (size + 0xFFF) / 0x1000;
+ } else {
+ *out += (size + 0xFFF) / 0x1000;
+ }
+}
+
+u32 WriteSaveSector(s32 *a, u8 *src, s32 size)
+{
+ u32 r1;
+ s32 r6 = *a;
+ sub_8011CA8(a, size);
+ CalculateChecksum(src, size);
+ if (gUnknown_203B184 == NULL) {
+ r1 = WriteFlashData(r6, src, size);
+ }
+ else if (sub_800DAB8()) {
+ if (!sub_800DAB4(r6, src, size)) {
+ r1 = 3;
+ }
+ else {
+ r1 = 0;
+ }
+ }
+ else {
+ return 2;
+ }
+ if (r1 == 4) {
+ return 1;
+ }
+ if (r1) {
+ return 2;
+ }
+ return 0;
+}
+
+u32 ReadSaveSector(s32 *a, u8 *dest, s32 size)
+{
+ u32 r1;
+ s32 r6 = *a;
+ sub_8011CA8(a, size);
+ if (gUnknown_203B184 == NULL) {
+ r1 = ReadFlashData(r6, dest, size);
+ }
+ else if (sub_800DAB8()) {
+ if (!sub_800DAB0(r6, dest, size)) {
+ r1 = 1;
+ }
+ else {
+ r1 = 0;
+ }
+ }
+ else {
+ return 1;
+ }
+ if (r1) {
+ return 1;
+ }
+ if (ValidateChecksum(dest, size)) {
+ return 2;
+ }
+ return 0;
+}
+
+bool8 sub_8011DA8(void)
+{
+ return TRUE;
+}
+
+u32 sub_8011DAC(u32 *a)
+{
+ struct UnkStruct_sub_8011DAC *r5 = MemoryAlloc(sizeof(struct UnkStruct_sub_8011DAC), 5);
+ u8 *r4 = (u8*)r5->fill448;
+ u32 r7 = ReadSaveSector(a, (u8*)r5, sizeof(struct UnkStruct_sub_8011DAC));
+ u32 r1;
+ if (r7)
+ {
+ r7 = ReadSaveSector(a, (u8*)r5, sizeof(struct UnkStruct_sub_8011DAC));
+ }
+ else
+ {
+ sub_8011CA8(a, sizeof(struct UnkStruct_sub_8011DAC));
+ }
+ if (!r7)
+ {
+ if (r5->unk414 != 0x5071412) {
+ r7 = 4;
+ }
+ }
+ if (!r7)
+ {
+ if (gUnknown_203B184 == NULL) {
+ sub_8011C28(r5->unk41C);
+ sub_8011C40(r5->unk418);
+ SetRngState(r5->unk420);
+ }
+ else {
+ gUnknown_203B184->unk054 = r5->unk41C;
+ gUnknown_203B184->unk050 = r5->unk418;
+ gUnknown_203B184->unk058 = r5->unk420;
+ }
+ }
+ if (!r7)
+ {
+ if (gUnknown_203B184 == NULL) {
+ if (!sub_8002718(r5->unk004)) {
+ r7 = 4;
+ }
+ }
+ else {
+ MemoryCopy8(gUnknown_203B184->unk04C, r5->unk004, ARRAY_COUNT(r5->unk004));
+ }
+ }
+ if (!r7)
+ {
+ r1 = sub_808EE9C(r4, 0x4650);
+ if (r1 != r5->unk424) {
+ r7 = 3;
+ }
+ r4 += 0x4650;
+ r1 = sub_808F2B0(r4, 0x258);
+ if (r1 != r5->unk428) {
+ r7 = 3;
+ }
+ r4 += 0x258;
+ r1 = sub_8091D14(r4, 0x1D8);
+ if (r1 != r5->unk430) {
+ r7 = 3;
+ }
+ r4 += 0x1d8;
+ r1 = sub_809222C(r4, 0x10);
+ if (r1 != r5->unk434) {
+ r7 = 3;
+ }
+ r4 += 0x10;
+ r1 = sub_80927F4(r4, 0x8);
+ if (r1 != r5->unk438) {
+ r7 = 3;
+ }
+ r4 += 0x8;
+ r1 = sub_8097D98(r4, 0x100);
+ if (r1 != r5->unk43C) {
+ r7 = 3;
+ }
+ r4 += 0x100;
+ r1 = sub_80954CC(r4, 0x594);
+ if (r1 != r5->unk440) {
+ r7 = 3;
+ }
+ r4 += 0x594;
+ r1 = sub_8096FA0(r4, 0x221);
+ if (r1 != r5->unk444) {
+ r7 = 3;
+ }
+ }
+ MemoryFree(r5);
+ return r7;
+}
+
+u32 sub_8011F9C(s32 *r0, u8 *r1, s32 r2)
+{
+ return ReadSaveSector(r0, r1, r2);
+}
diff --git a/src/save1.c b/src/save1.c
index b7de6c6..a194557 100644
--- a/src/save1.c
+++ b/src/save1.c
@@ -1,6 +1,55 @@
#include "global.h"
+#include "code_800558C.h"
+#include "input.h"
+
+
+struct UnkSaveStruct1
+{
+ /* 0x0 */ u32 unk0;
+ /* 0x4 */ u32 unk4;
+ /* 0x8 */ u16 unk8;
+ /* 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();
+extern void xxx_draw_string_80144C4();
+extern void nullsub_8(u8);
+extern void sub_8005180();
+extern void sub_800CB20();
+extern void CopySpritesToOam();
+extern void sub_8005304();
+extern void TransferBGPaletteBuffer();
+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;
extern u8 *gUnknown_203B194;
@@ -11,3 +60,71 @@ void sub_80129FC()
gUnknown_203B194 = NULL;
}
}
+
+void sub_8012A18()
+{
+ sub_8011860();
+ xxx_draw_string_80144C4();
+ nullsub_8(gUnknown_203B46C->unkA);
+ sub_8005180();
+ sub_80060EC();
+ sub_800CB20();
+ sub_800485C(); // Input related
+ CopySpritesToOam();
+ sub_8005304();
+ TransferBGPaletteBuffer();
+ xxx_call_update_bg_vram();
+ sub_8009908();
+ xxx_call_update_bg_sound_input();
+ 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;
+//}
diff --git a/src/save_mid.c b/src/save_mid.c
new file mode 100644
index 0000000..67ad932
--- /dev/null
+++ b/src/save_mid.c
@@ -0,0 +1,158 @@
+#include "global.h"
+#include "save.h"
+
+extern struct UnkStruct_203B184 *gUnknown_203B184;
+extern struct unkTimeStruct *gUnknown_203B47C;
+
+extern u32 gUnknown_203B460;
+extern u32 gUnknown_203B45C;
+extern u32 gUnknown_203B480;
+extern u32 gUnknown_203B484;
+extern u32 gUnknown_203B488;
+extern u32 gUnknown_203B48C;
+extern u32 gUnknown_203B490;
+extern u32 gUnknown_203B464;
+extern u32 gUnknown_203B494;
+extern u32 gUnknown_203B498;
+extern u32 gUnknown_203B468;
+extern u32 gUnknown_203B46C;
+
+extern void sub_800135C(void);
+extern u32 sub_808CE00(void);
+extern void sub_808CE08(void);
+extern u32 sub_80909D0(void);
+extern void sub_80909D8(void);
+extern u32 sub_809208C(void);
+extern void sub_8092094(void);
+extern u32 sub_80923B0(void);
+extern void sub_80923B8(void);
+extern u32 sub_8094990(void);
+extern void sub_8094998(u8 r0);
+extern u32 sub_80950F8(void);
+extern u32 sub_8095100(void);
+extern u32 sub_8095108(void);
+extern u32 sub_8095110(void);
+extern void sub_8095118(void);
+extern u32 sub_80958F8(void);
+extern void sub_8095900(void);
+extern u32 sub_8097680(void);
+extern void sub_80972F4(void);
+extern void sub_80974E8(void);
+extern u32 sub_8097F6C(void);
+extern void sub_8097F74(void);
+
+extern void sub_8011C28(u32 r0);
+extern void sub_8011C40(s32 r0);
+extern void sub_8097748(void);
+extern void sub_8012240();
+
+
+extern void sub_8094FA8(struct unkTimeStruct *Time); // defined in src/code_8094F88.c
+extern struct unkTimeStruct *sub_8094FA0(void);
+
+void sub_80122D0();
+void sub_80122F4();
+void sub_8012300();
+void sub_80976A8();
+void sub_80122A8();
+
+void sub_8012284(void)
+{
+ sub_80122D0();
+ sub_80122F4();
+ sub_8012300();
+}
+
+void sub_8012298(void)
+{
+ sub_80976A8();
+ sub_80122A8();
+}
+
+void sub_80122A8(void)
+{
+ sub_80122D0();
+ sub_80122F4();
+ sub_8012300();
+ sub_8012240();
+
+}
+
+void nullsub_33(void)
+{
+}
+
+void sub_80122C4(void)
+{
+ sub_80122A8();
+}
+
+void sub_80122D0(void)
+{
+ sub_8011C28(0);
+ sub_8011C40(-1);
+ sub_8097748();
+ sub_8094FA8(gUnknown_203B47C);
+}
+
+void sub_80122F4(void)
+{
+ sub_800135C();
+}
+
+void sub_8012300(void)
+{
+ sub_80923B8();
+ sub_808CE08();
+ sub_80909D8();
+ sub_8092094();
+ sub_80972F4();
+ sub_8095118();
+ sub_8095900();
+ sub_80974E8();
+ sub_8094998(1);
+ sub_8097F74();
+}
+
+
+// Unused
+void nullsub_200(u32 r0)
+{
+}
+
+// Unused
+void sub_8012334(struct UnkStruct_203B184 *r0)
+{
+ gUnknown_203B184 = r0;
+ if(r0 != NULL)
+ {
+ gUnknown_203B460 = r0->unk0;
+ gUnknown_203B45C = r0->unk4;
+ gUnknown_203B480 = r0->unk8;
+ gUnknown_203B484 = r0->unkC;
+ gUnknown_203B488 = r0->unk10;
+ gUnknown_203B48C = r0->unk14;
+ gUnknown_203B490 = r0->unk18;
+ gUnknown_203B464 = r0->unk1C;
+ gUnknown_203B494 = r0->unk20;
+ gUnknown_203B498 = r0->unk24;
+ gUnknown_203B468 = r0->unk28;
+ gUnknown_203B46C = r0->unk2C;
+ gUnknown_203B47C = r0->unk30;
+ return;
+ }
+ gUnknown_203B460 = sub_80909D0();
+ gUnknown_203B45C = sub_808CE00();
+ gUnknown_203B480 = sub_80950F8();
+ gUnknown_203B484 = sub_8095100();
+ gUnknown_203B488 = sub_8095108();
+ gUnknown_203B48C = sub_8095110();
+ gUnknown_203B490 = sub_80958F8();
+ gUnknown_203B464 = sub_809208C();
+ gUnknown_203B494 = sub_8097680();
+ gUnknown_203B498 = sub_8097F6C();
+ gUnknown_203B468 = sub_80923B0();
+ gUnknown_203B46C = sub_8094990();
+ gUnknown_203B47C = sub_8094FA0();
+
+}