diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/code.c | 32 | ||||
-rw-r--r-- | src/code_80001E0.c | 8 | ||||
-rw-r--r-- | src/code_800558C.c | 151 | ||||
-rw-r--r-- | src/code_800B5F0.c | 99 | ||||
-rw-r--r-- | src/code_80118A4.c | 191 | ||||
-rw-r--r-- | src/code_80118A4_1.c | 69 | ||||
-rw-r--r-- | src/code_801D760.c | 60 | ||||
-rw-r--r-- | src/code_8027C84.c | 25 | ||||
-rw-r--r-- | src/code_8027C84_pre.c | 86 | ||||
-rw-r--r-- | src/code_80428A0.c | 145 | ||||
-rw-r--r-- | src/code_8048480.c | 21 | ||||
-rw-r--r-- | src/code_80521D0.c | 90 | ||||
-rw-r--r-- | src/code_808DAB4.c | 10 | ||||
-rw-r--r-- | src/code_8092334.c | 50 | ||||
-rw-r--r-- | src/code_8094F88.c | 35 | ||||
-rw-r--r-- | src/code_8095014.c | 87 | ||||
-rw-r--r-- | src/code_8098BDC.c | 166 | ||||
-rw-r--r-- | src/code_80A7714.c | 27 | ||||
-rw-r--r-- | src/code_8272724.c | 17 | ||||
-rw-r--r-- | src/dungeon.c | 67 | ||||
-rw-r--r-- | src/event_flag.c | 53 | ||||
-rw-r--r-- | src/file_system.c | 34 | ||||
-rw-r--r-- | src/input.c | 144 | ||||
-rw-r--r-- | src/libisagbprn.c | 177 | ||||
-rw-r--r-- | src/main.c | 2 | ||||
-rw-r--r-- | src/memory1.c | 11 | ||||
-rw-r--r-- | src/personality_test.c | 17 | ||||
-rw-r--r-- | src/pokemon.c | 26 | ||||
-rw-r--r-- | src/pokemon_1.c | 194 | ||||
-rw-r--r-- | src/pokemon_mid.c | 85 | ||||
-rw-r--r-- | src/save.c | 213 | ||||
-rw-r--r-- | src/save1.c | 117 | ||||
-rw-r--r-- | src/save_mid.c | 158 |
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 @@ -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); +//} @@ -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(); + +} |