diff options
Diffstat (limited to 'src/pokenav_before.c')
-rw-r--r-- | src/pokenav_before.c | 611 |
1 files changed, 611 insertions, 0 deletions
diff --git a/src/pokenav_before.c b/src/pokenav_before.c new file mode 100644 index 000000000..d0efd2bbd --- /dev/null +++ b/src/pokenav_before.c @@ -0,0 +1,611 @@ +#include "global.h" +#include "main.h" +#include "pokenav.h" +#include "battle.h" +#include "data2.h" +#include "de_rom_8040FE0.h" +#include "string_util.h" +#include "rom4.h" +#include "palette.h" +#include "task.h" +#include "unknown_task.h" +#include "sound.h" +#include "region_map.h" +#include "songs.h" +#include "flags.h" + +struct UnknownPokenav0 { + /* 0x0000 */ u8 fill0000[0x0300]; + /* 0x0300 */ void (*var300)(void); + /* 0x0304 */ u16 var304; + /* 0x0306 */ u8 fill0306; + /* 0x0308 */ u32 var308; + /* 0x030C */ u8 fill030C[0x6a9f]; + /* 0x6dab */ u8 var6dab; + /* 0x6dac */ u8 var6dac; + /* 0x6dad */ u8 var6dad; + /* 0x6dae */ u8 var6dae; + /* 0x6daf */ u8 fill6daf[0x3]; + /* 0x6db2 */ u8 var6db2; + /* 0x6db3 */ u8 fill6db3[0x29]; + /* 0x6ddc */ u8 var6ddc; + /* 0x6ddd */ u8 fill6ddd[0x198b]; + /* 0x8768 */ u32 var8768; + /* 0x876C */ u8 fill876B[0x00bc]; + /* 0x8828 */ u8 var8828; + /* 0x8829 */ u8 fill8829[0x07c0]; + /* 0x8FE8 */ u8 var8fe8; + /* 0x8FE9 */ u8 fill8FE9[0x035B]; + /* 0x9344 */ u8 var9344; + /* 0x9345 */ u8 fill9345[0x3b8b]; + /* 0xced0 */ u32 varCED0; +}; + +struct UnknownPokenav8fff { + /* 0x8fff */ u8 var8fff[5]; + /* 0x9004 */ u8 fill9004[0x6e90]; + /* 0x6e95 */ u8 var6e95; +}; + + +extern u8 ewram[]; +#define ewram0 (*(struct UnknownPokenav0*)(ewram + 0)) +#define ewram8fff (*(struct UnknownPokenav8fff*)(ewram + 0x8fff)) +extern u8 unk_2000000[]; + +extern void sub_80F1A90(); +extern bool8 sub_80F1AC4(); +extern void sub_80F36F0(); +extern bool8 sub_80F3724(); +extern void sub_80EBC10(); +extern void sub_80EBDBC(void (*func)(void)); +extern void sub_80EBBE8(); +extern bool8 sub_80F26BC(void); +extern void sub_80EBDD8(); +extern void sub_80EBD90(); +extern void sub_80EBD18(); +extern void sub_80F1A74(); +extern void sub_80F1FF0(); +extern void sub_80FB260(); +extern void sub_80EFE7C(); +extern void sub_80F5BF0(); +extern void sub_80F6F64(); +extern void _call_via_r0(void (*func)(void)); +extern void sub_80F19FC(); + +void sub_80EBA5C() { + switch (gMain.state) { + default: + gMain.state = 0; + case 0: + ewram0.var6dac = is_c1_link_related_active(); + if (!ewram0.var6dac) { + ewram0.var6dab = 0; + gMain.state++; + SetMainCallback2(&sub_80EBBE8); + break; + } + break; + case 1: + SetVBlankCallback(NULL); + break; + case 2: + ResetPaletteFade(); + break; + case 3: + ResetSpriteData(); + break; + case 4: + FreeAllSpritePalettes(); + break; + case 5: + ResetTasks(); + break; + case 6: + remove_some_task(); + break; + case 7: + sub_80F1A90(); + gMain.state++; + case 8: + if (sub_80F1AC4()) return; + break; + case 9: + sub_80F2688(); + gMain.state++; + + case 0xA: + if (sub_80F26BC()) return; + break; + case 0xB: + sub_80F36F0(); + gMain.state++; + case 0xC: + if (sub_80F3724()) return; + break; + case 0xD: + sub_80EBC10(); + sub_80EBDBC(&sub_80EBDD8); + break; + case 0xE: + ewram0.var6dab = 1; + PlaySE(SE_PN_ON); + SetMainCallback2(&sub_80EBD90); + SetVBlankCallback(&sub_80EBD18); + sub_80F1A74(); + break; + } + gMain.state++; +} + +void sub_80EBBE8() { + u8 var1; + if (!ewram0.var6dab) { + var1 = ewram0.var6dab; + do { + sub_80EBA5C(); + var1 = ewram0.var6dab; + } while (!var1); + } +} + +// Falla el acceso a 0x8fff +#if 0 + +u16 gKeyRepeatStartDelay; +void sub_80EBCA8(); + +//void sub_80EBC10() { +// u16 i; +// u16 *unk2; +// gKeyRepeatStartDelay = 0x14; +// unk_2000000[0x8828] = CalculatePlayerPartyCount(); +// unk_2000000[0x6ddc] = unk_2000000[0x9344] = 0; +// *(u32 *)&unk_2000000[0x8768] = 0; +// *(u32 *)&unk_2000000[0xced0] = 0; +// for (i = 0; i <= 4; ++i) { +// unk_2000000[0x8fff + i] = 0; +// unk2 = (u16 *)unk_2000000; +// unk2[i*2 + 0x4820] = 0x9B; +// unk2[i*2 + 0x4821] = 0x5B; +// } +// unk_2000000[0x8fff + 0x6e95] = 0; +// sub_80EBCA8(); +//} +void sub_80EBC10() { + u16 i; + u16 *unk2; + gKeyRepeatStartDelay = 0x14; + ewram0.var8828 = CalculatePlayerPartyCount(); + ewram0.var6ddc = 0; + ewram0.var9344 = 0; + ewram0.var8768 = 0; + ewram0.varCED0 = 0; + for (i = 0; i <= 4; ++i) { + ewram8fff.var8fff[i] = 0; + unk2 = (u16 *)ewram; + unk2[i*2 + 0x4820] = 0x9B; + unk2[i*2 + 0x4821] = 0x5B; + } + ewram8fff.var6e95 = 0; + sub_80EBCA8(); +} + +#else + +__attribute__((naked)) +void sub_80EBC10() { + asm_unified("push {r4-r7,lr}\n\ + ldr r1, _080EBC7C @ =gKeyRepeatStartDelay\n\ + movs r0, 0x14\n\ + strh r0, [r1]\n\ + bl CalculatePlayerPartyCount\n\ + ldr r2, _080EBC80 @ =0x02000000\n\ + ldr r1, _080EBC84 @ =0x00008828\n\ + adds r3, r2, r1\n\ + movs r1, 0\n\ + strb r0, [r3]\n\ + ldr r3, _080EBC88 @ =0x00006ddc\n\ + adds r0, r2, r3\n\ + strb r1, [r0]\n\ + ldr r3, _080EBC8C @ =0x00009344\n\ + adds r0, r2, r3\n\ + strb r1, [r0]\n\ + ldr r3, _080EBC90 @ =0x00008768\n\ + adds r0, r2, r3\n\ + str r1, [r0]\n\ + ldr r3, _080EBC94 @ =0x0000ced0\n\ + adds r0, r2, r3\n\ + str r1, [r0]\n\ + movs r3, 0\n\ + ldr r0, _080EBC98 @ =0x00008fff\n\ + adds r7, r2, r0\n\ + mov r12, r2\n\ + movs r6, 0\n\ + ldr r5, _080EBC9C @ =0x00009040\n\ + movs r4, 0x9B\n\ +_080EBC4C:\n\ + adds r0, r3, r7\n\ + strb r6, [r0]\n\ + lsls r1, r3, 2\n\ + adds r1, r2\n\ + adds r0, r1, r5\n\ + strh r4, [r0]\n\ + ldr r0, _080EBCA0 @ =0x00009042\n\ + adds r1, r0\n\ + movs r0, 0x5B\n\ + strh r0, [r1]\n\ + adds r0, r3, 0x1\n\ + lsls r0, 16\n\ + lsrs r3, r0, 16\n\ + cmp r3, 0x4\n\ + bls _080EBC4C\n\ + ldr r1, _080EBCA4 @ =0x00006e95\n\ + add r1, r12\n\ + movs r0, 0\n\ + strb r0, [r1]\n\ + bl sub_80EBCA8\n\ + pop {r4-r7}\n\ + pop {r0}\n\ + bx r0\n\ + .align 2, 0\n\ +_080EBC7C: .4byte gKeyRepeatStartDelay\n\ +_080EBC80: .4byte 0x02000000\n\ +_080EBC84: .4byte 0x00008828\n\ +_080EBC88: .4byte 0x00006ddc\n\ +_080EBC8C: .4byte 0x00009344\n\ +_080EBC90: .4byte 0x00008768\n\ +_080EBC94: .4byte 0x0000ced0\n\ +_080EBC98: .4byte 0x00008fff\n\ +_080EBC9C: .4byte 0x00009040\n\ +_080EBCA0: .4byte 0x00009042\n\ +_080EBCA4: .4byte 0x00006e95\n"); +} +#endif + +void sub_80EBCA8() { + unk_2000000[0x6db2] = 1; + unk_2000000[0x6db3] = 2; + unk_2000000[0x6db4] = 3; + if (FlagGet(SYS_RIBBON_GET)) { + unk_2000000[0x6db5] = 4; + } + else { + unk_2000000[0x6db5] = 0; + } + unk_2000000[0x6db6] = 5; +} + +void sub_80EBD18() { + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + sub_80F1FF0(); +} + +void sub_80EBD30() { + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + UpdateRegionMapVideoRegs(); + sub_80EFE7C(); +} + +void sub_80EBD4C() { + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + sub_80F5BF0(); + sub_8089668(); +} + +void sub_80EBD68() { + LoadOam(); + ProcessSpriteCopyRequests(); + TransferPlttBuffer(); + sub_80F6F64(); +} + +void sub_80EBD80() { + LoadOam(); + ProcessSpriteCopyRequests(); +} + +void sub_80EBD90() { + _call_via_r0(ewram0.var300); + AnimateSprites(); + BuildOamBuffer(); + RunTasks(); + UpdatePaletteFade(); + sub_80F19FC(); +} + +void sub_80EBDBC(void (*func)(void)) { + ewram0.var300 = func; + ewram0.var304 = 0; +} + +void sub_80F3FF0(); +bool8 sub_80F4024(); +void sub_80F2598(); +void sub_80EEE20(); +bool8 sub_80EEE54(); +void sub_80EEE08(); +void sub_80EF248(); +bool8 sub_80EF284(); +void sub_80F1B8C(); +bool8 sub_80F1BC8(u32 unk); +void sub_80EED2C(); +void sub_80F1DF0(); +bool8 sub_80F1E50(); +void sub_80EF428(); +void sub_80EC268(); + +void sub_80EBDD8() { + switch (ewram0.var304) { + case 0: + SetVBlankCallback(NULL); + REG_DISPCNT = 0; + ewram0.var6dad = ewram0.var6ddc; + ewram0.var6dae = 5; + ewram0.var304++; + break; + case 1: + sub_80F3FF0(); + ewram0.var304++; + case 2: + if (sub_80F4024()) return; + ewram0.var304++; + break; + case 3: + sub_80F2598(); + ewram0.var304++; + break; + case 4: + sub_80EEE20(); + ewram0.var304++; + case 5: + if (sub_80EEE54()) return; + sub_80EEE08(); + ewram0.var304++; + return; + case 6: + sub_80EF248(0); + ewram0.var304++; + case 7: + if (sub_80EF284(0)) return; + ewram0.var304++; + break; + case 8: + sub_80F1B8C(0); + ewram0.var304++; + case 9: + if (sub_80F1BC8(0)) return; + ewram0.var304++; + break; + case 10: + SetVBlankCallback(&sub_80EBD18); + ewram0.var304++; + break; + case 11: + BeginNormalPaletteFade(-1, 0, 0x10, 0, 0); + ewram0.var304++; + return; + case 12: + sub_80EED2C(0); + ewram0.var304++; + return; + case 13: + if (gPaletteFade.active) return; + ewram0.var304++; + return; + case 14: + sub_80F2C80(0); + ewram0.var304++; + case 15: + if (sub_80F2CBC(0)) return; + ewram0.var304++; + break; + case 16: + sub_80F1DF0(); + ewram0.var304++; + return; + case 17: + if (!sub_80F1E50()) { + sub_80EF428(0, 0); + sub_80EBDBC(&sub_80EC268); + } + return; + + } + +} + +bool8 sub_80EEF78(); +void sub_80EED1C(); + +void sub_80EC00C() { + switch (ewram0.var304) { + case 0: + if (!sub_80EEF78()) { + SetVBlankCallback(&sub_80EBD80); + sub_80EED1C(); + ewram0.var6dad = ewram0.var6ddc; + ewram0.var6dae = 5; + sub_80EEE08(); + ewram0.var304++; + } + break; + case 1: + sub_80EF248(0); + ewram0.var304++; + case 2: + if (sub_80EF284(0)) return; + ewram0.var304++; + break; + case 3: + sub_80F1B8C(0); + ewram0.var304++; + case 4: + if (sub_80F1BC8(0)) return; + ewram0.var304++; + break; + case 5: + if (sub_8055870()) return; + ewram0.var304++; + break; + case 6: + BeginNormalPaletteFade(ewram0.var308, -1, 0x10, 0, 0); + SetVBlankCallback(&sub_80EBD18); + ewram0.var304++; + break; + case 7: + sub_80EED2C(0); + ewram0.var304++; + break; + case 8: + if (gPaletteFade.active) return; + ewram0.var304++; + return; + case 9: + sub_80F2598(); + ewram0.var304++; + break; + case 10: + sub_80F2C80(0); + ewram0.var304++; + case 11: + if (sub_80F2CBC(0)) return; + ewram0.var304++; + return; + case 12: + sub_80F1DF0(); + ewram0.var304++; + return; + case 13: + if (sub_80F1E50()) return; + sub_80EF428(0, ewram0.var6dad); + sub_80EBDBC(&sub_80EC268); + } +} + +void sub_80F2D04(u32); +void sub_80EE9C0(u32, u8, u32); +bool8 sub_80EEA0C(); + +void sub_80EC210() { + switch (ewram0.var304) { + case 0: + sub_80F2D04(1); + sub_80EE9C0(0, ewram0.var6ddc, 0); + ewram0.var304++; + break; + case 1: + if (sub_80EEA0C()) return; + sub_80EBDBC(&sub_80EC268); + } +} + +#if 0 +bool8 sub_80EEC10(); +bool8 sub_80F6250(); +void sub_80EED9C(); +void sub_80F6208(); +void sub_80EDB88(); +void sub_80EC4A0(); +void sub_80EC81C(); +void sub_80F208C(); +void sub_80EE96C(); + +void sub_80EC268() { + if (ewram0.var304 != 3) { + // bls -> bgt + if (ewram0.var304 > 3) { + if (ewram0.var304 != 6) { + if (ewram0.var304 > 6) { + if (ewram0.var304 != 0xFF) return; + if (sub_80EEC10() == 0) { + if (gMain.newKeys == (A_BUTTON | B_BUTTON)) return; + sub_80EF428(0, ewram0.var6dad); + return; + } + PlaySE(0x5); + sub_80EF428(0, ewram0.var6dad); + sub_80EED9C(); + return; + + } + if (ewram0.var304 != 4) return; + if (sub_8055870() != 0) return; + if (ewram0.var8fe8 == 0) { + PlaySE(0x20); + sub_80EF428(0, 5); + ewram0.var304 = 0xFF; + return; + } + PlaySE(0x5); + sub_80EBDBC(&sub_80EDB88); + return; + } + if (ewram0.var304 != 4) return; + if (sub_8055870()) return; + if (!ewram0.var8fe8) { + PlaySE(0x20); + sub_80EF428(0, 5); + ewram0.var304 = 0xFF; + return; + } + PlaySE(5); + sub_80EBDBC(&sub_80EDB88); + return; + } + if (ewram0.var304 != 1) { + if (ewram0.var304 < 1) { + if (ewram0.var304 == 0) { + if (sub_80EEC10() == 0) { + if (gMain.newKeys != A_BUTTON) { + + } + ewram0.var6ddc = ewram0.var6dad; + // TODO arreglar esto + switch (ewram0.var6db2) { + case 1: + PlaySE(5); + sub_80EBDBC(&sub_80EC4A0); + return; + case 2: + PlaySE(5); + sub_80EBDBC(&sub_80EC81C); + return; + case 3: + ewram0.var304 = 6; + return; + case 4: + ewram0.var304 = 2; + return; + case 5: + ewram0.var304 = 1; + return; + } + } + PlaySE(0x5); + sub_80EF428(0, ewram0.var6dad); + sub_80EED9C(); + return; + } + } + sub_80F6208(); + ewram0.var304++; + if (sub_80F6250() != 0) return; + ewram0.var304++; + return; + } + sub_80F208C(); + sub_80EBDBC(&sub_80EE96C); + return; + } + if (sub_80F6250() != 0) return; + ewram0.var304++; + return; +} +#endif |