mirror of https://github.com/zeldaret/tmc.git
135 lines
3.3 KiB
C
135 lines
3.3 KiB
C
#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));
|
|
}
|