#include "global.h" #include "functions.h" #include "main.h" #include "random.h" #include "readKeyInput.h" extern void sub_0804FF84(u32); extern u32 gUnk_020176A0; extern const void (*gUnk_08100CBC[])(); extern void VBlankInterruptWait(void); extern void DisableInterruptsAndDMA(void); extern void sub_0801D66C(void*, u8*, int); extern void sub_08016B34(void); static void sub_08055F70(void); static bool32 SoftResetKeysPressed(void); void MainLoop(void) { int var0; sub_08055F70(); sub_080A3204(); sub_0805616C(); sub_0807CE90(); sub_080560B8(); sub_08056208(); gUnk_02000010.field_0x4 = 193; sub_0804FFE4(); DmaSet(3, 0x5000000U, &gUnk_020176A0, 0x84000080U); sub_0804FF84(1); sub_08056418(); sub_080ADD30(); gRand = 0x1234567; _DmaZero(&gUnk_03001000, 16); InitScreen(SCREEN_INTRO); while (1) { ReadKeyInput(); if (SoftResetKeysPressed()) { DoSoftReset(); } switch (gUnk_03001000.field_0x1) { case 1: sub_08056260(); break; case 0: default: if (gUnk_03001000.countdown != 0) { do { VBlankIntrWait(); } while (--gUnk_03001000.countdown); } if (gUnk_03001000.field_0x9 != 0) { gUnk_03001000.field_0x9--; var0 = gUnk_03001000.field_0xa; while (var0-- > 0) { VBlankIntrWait(); } } gUnk_03001000.ticks++; gUnk_08100CBC[gUnk_03001000.screen](); sub_08056458(); sub_08050154(); sub_080A3480(); break; } sub_08016E78(); } } // Interrupt handlers that are loaded into RAM. extern u8 sub_080B197C[]; extern u8 gUnk_030056F0[]; extern u8 gUnk_02038560[]; extern u8 gUnk_080B2CD8[]; extern u8 gUnk_080B2CD8_2[]; extern u8 gUnk_080B2CD8_3[]; extern u8 gUnk_02000030[]; static void sub_08055F70(void) { u32 size; DisableInterruptsAndDMA(); RegisterRamReset(RESET_ALL & ~RESET_EWRAM); *(vu16 *)BG_PLTT = 0x7FFF; REG_WAITCNT = WAITCNT_PREFETCH_ENABLE | WAITCNT_WS0_S_1 | WAITCNT_WS0_N_3; size = 0x3FFD0; _DmaZero(gUnk_02000030, size); size = (u32)gUnk_080B2CD8 - (u32)sub_080B197C; if (size != 0) { sub_0801D66C(sub_080B197C, gUnk_030056F0, size); } size = (u32)gUnk_080B2CD8_2 - (u32)gUnk_080B2CD8_3; if (size != 0) { sub_0801D66C(gUnk_080B2CD8_3, gUnk_02038560, size); } sub_0801DA90(0); sub_08016B34(); } #define SOFT_RESET_KEYS (A_BUTTON | B_BUTTON | SELECT_BUTTON | START_BUTTON) static bool32 SoftResetKeysPressed(void) { return (gUnk_03000FF0.heldKeys & SOFT_RESET_KEYS) == SOFT_RESET_KEYS; } void InitScreen(u32 screen) { gUnk_03001000.screen = screen; gUnk_03001000.funcIndex = 0; gUnk_03001000.transition = 0; } void DisableInterruptsAndDMA(void) { REG_IME = 0; REG_IE = 0; REG_DISPSTAT = 0; REG_IF = 0; REG_IME = 0; DmaStop(0); DmaStop(1); DmaStop(2); DmaStop(3); } void DoSoftReset(void) { DisableInterruptsAndDMA(); SoftReset(RESET_ALL & ~(RESET_EWRAM | RESET_SIO_REGS)); }