Decompile some more of mainLoop.c

This commit is contained in:
Marcus Huderle 2020-08-05 17:47:06 -05:00
parent 946de7529d
commit 6b09adf8d4
14 changed files with 108 additions and 219 deletions

View File

@ -593,7 +593,7 @@ sub_0805060C: @ 0x0805060C
cmp r0, #0 cmp r0, #0
bne _0805061C bne _0805061C
movs r0, #2 movs r0, #2
bl sub_08056010 bl InitScreen
_0805061C: _0805061C:
pop {pc} pop {pc}
.align 2, 0 .align 2, 0
@ -3486,7 +3486,7 @@ sub_08051D2C: @ 0x08051D2C
movs r1, #8 movs r1, #8
bl DoFade bl DoFade
movs r0, #3 movs r0, #3
bl sub_08056010 bl InitScreen
pop {pc} pop {pc}
.align 2, 0 .align 2, 0
@ -4270,12 +4270,12 @@ _080523AC:
cmp r0, #0 cmp r0, #0
bne _080523C8 bne _080523C8
movs r0, #2 movs r0, #2
bl sub_08056010 bl InitScreen
b _080523CC b _080523CC
.align 2, 0 .align 2, 0
_080523C4: .4byte gUnk_03000FD0 _080523C4: .4byte gUnk_03000FD0
_080523C8: _080523C8:
bl sub_080560A8 bl DoSoftReset
_080523CC: _080523CC:
pop {r4, pc} pop {r4, pc}
.align 2, 0 .align 2, 0

View File

@ -2755,7 +2755,7 @@ sub_08053C60: @ 0x08053C60
ldr r0, _08053C80 @ =0x80100000 ldr r0, _08053C80 @ =0x80100000
bl PlaySFX bl PlaySFX
movs r0, #3 movs r0, #3
bl sub_08056010 bl InitScreen
pop {pc} pop {pc}
.align 2, 0 .align 2, 0
_08053C80: .4byte 0x80100000 _08053C80: .4byte 0x80100000

View File

@ -4,107 +4,6 @@
.syntax unified .syntax unified
.text .text
thumb_func_start sub_08055FF4
sub_08055FF4: @ 0x08055FF4
push {lr}
movs r2, #0
ldr r0, _0805600C @ =gUnk_03000FF0
ldrh r1, [r0]
movs r0, #0xf
ands r0, r1
cmp r0, #0xf
bne _08056006
movs r2, #1
_08056006:
adds r0, r2, #0
pop {pc}
.align 2, 0
_0805600C: .4byte gUnk_03000FF0
thumb_func_start sub_08056010
sub_08056010: @ 0x08056010
ldr r1, _0805601C @ =gUnk_03001000
movs r2, #0
strb r0, [r1, #2]
strb r2, [r1, #3]
strb r2, [r1, #4]
bx lr
.align 2, 0
_0805601C: .4byte gUnk_03001000
thumb_func_start sub_08056020
sub_08056020: @ 0x08056020
push {r4, lr}
ldr r2, _08056088 @ =0x04000208
movs r1, #0
strh r1, [r2]
ldr r0, _0805608C @ =0x04000200
strh r1, [r0]
ldr r0, _08056090 @ =0x04000004
strh r1, [r0]
ldr r0, _08056094 @ =0x04000202
strh r1, [r0]
strh r1, [r2]
ldr r1, _08056098 @ =0x040000B0
ldrh r2, [r1, #0xa]
ldr r4, _0805609C @ =0x0000C5FF
adds r0, r4, #0
ands r0, r2
strh r0, [r1, #0xa]
ldrh r2, [r1, #0xa]
ldr r3, _080560A0 @ =0x00007FFF
adds r0, r3, #0
ands r0, r2
strh r0, [r1, #0xa]
ldrh r0, [r1, #0xa]
adds r1, #0xc
ldrh r2, [r1, #0xa]
adds r0, r4, #0
ands r0, r2
strh r0, [r1, #0xa]
ldrh r2, [r1, #0xa]
adds r0, r3, #0
ands r0, r2
strh r0, [r1, #0xa]
ldrh r0, [r1, #0xa]
adds r1, #0xc
ldrh r2, [r1, #0xa]
adds r0, r4, #0
ands r0, r2
strh r0, [r1, #0xa]
ldrh r2, [r1, #0xa]
adds r0, r3, #0
ands r0, r2
strh r0, [r1, #0xa]
ldrh r0, [r1, #0xa]
ldr r0, _080560A4 @ =0x040000D4
ldrh r1, [r0, #0xa]
ands r4, r1
strh r4, [r0, #0xa]
ldrh r1, [r0, #0xa]
ands r3, r1
strh r3, [r0, #0xa]
ldrh r0, [r0, #0xa]
pop {r4, pc}
.align 2, 0
_08056088: .4byte 0x04000208
_0805608C: .4byte 0x04000200
_08056090: .4byte 0x04000004
_08056094: .4byte 0x04000202
_08056098: .4byte 0x040000B0
_0805609C: .4byte 0x0000C5FF
_080560A0: .4byte 0x00007FFF
_080560A4: .4byte 0x040000D4
thumb_func_start sub_080560A8
sub_080560A8: @ 0x080560A8
push {lr}
bl sub_08056020
movs r0, #0xde
bl SoftReset
pop {pc}
.align 2, 0
thumb_func_start sub_080560B8 thumb_func_start sub_080560B8
sub_080560B8: @ 0x080560B8 sub_080560B8: @ 0x080560B8

View File

@ -2771,7 +2771,7 @@ _0805FBC0: .4byte gScreen
sub_0805FBC4: @ 0x0805FBC4 sub_0805FBC4: @ 0x0805FBC4
push {lr} push {lr}
movs r0, #0 movs r0, #0
bl sub_08056010 bl InitScreen
pop {pc} pop {pc}
.align 2, 0 .align 2, 0

View File

@ -6253,7 +6253,7 @@ _0807FB90: .4byte gLinkEntity
sub_0807FB94: @ 0x0807FB94 sub_0807FB94: @ 0x0807FB94
push {lr} push {lr}
movs r0, #4 movs r0, #4
bl sub_08056010 bl InitScreen
pop {pc} pop {pc}
.align 2, 0 .align 2, 0

View File

@ -661,7 +661,7 @@ sub_080A3980: @ 0x080A3980
ldrb r0, [r0] ldrb r0, [r0]
cmp r0, #0 cmp r0, #0
bne _080A398E bne _080A398E
bl sub_080560A8 bl DoSoftReset
_080A398E: _080A398E:
pop {pc} pop {pc}
.align 2, 0 .align 2, 0

View File

@ -1,60 +0,0 @@
.include "asm/macros.inc"
.include "constants/constants.inc"
.syntax unified
.text
thumb_func_start sub_08055F70
sub_08055F70: @ 0x08055F70
push {lr}
bl sub_08056020
movs r0, #0xfe
bl RegisterRamReset
movs r1, #0xa0
lsls r1, r1, #0x13
ldr r2, _08055FC8 @ =0x00007FFF
adds r0, r2, #0
strh r0, [r1]
ldr r1, _08055FCC @ =0x04000204
ldr r2, _08055FD0 @ =0x00004014
adds r0, r2, #0
strh r0, [r1]
ldr r2, _08055FD4 @ =0x0003FFD0
ldr r0, _08055FD8 @ =gUnk_02000030
adds r1, r2, #0
bl _DmaZero
ldr r0, _08055FDC @ =gUnk_080B2CD8
ldr r3, _08055FE0 @ =sub_080B197C
subs r2, r0, r3
cmp r2, #0
beq _08055FAA
ldr r1, _08055FE4 @ =gUnk_030056F0
adds r0, r3, #0
bl sub_0801D66C
_08055FAA:
ldr r0, _08055FE8 @ =gUnk_080B2CD8
ldr r3, _08055FEC @ =gUnk_080B2CD8
subs r2, r0, r3
cmp r2, #0
beq _08055FBC
ldr r1, _08055FF0 @ =gUnk_02038560
adds r0, r3, #0
bl sub_0801D66C
_08055FBC:
movs r0, #0
bl sub_0801DA90
bl sub_08016B34
pop {pc}
.align 2, 0
_08055FC8: .4byte 0x00007FFF
_08055FCC: .4byte 0x04000204
_08055FD0: .4byte 0x00004014
_08055FD4: .4byte 0x0003FFD0
_08055FD8: .4byte gUnk_02000030
_08055FDC: .4byte gUnk_080B2CD8
_08055FE0: .4byte sub_080B197C
_08055FE4: .4byte gUnk_030056F0
_08055FE8: .4byte gUnk_080B2CD8
_08055FEC: .4byte gUnk_080B2CD8
_08055FF0: .4byte gUnk_02038560

View File

@ -8,4 +8,6 @@ gUnk_080B2A70:: @ 080B2A70
.incbin "baserom.gba", 0x0B2A70, 0x0000268 .incbin "baserom.gba", 0x0B2A70, 0x0000268
gUnk_080B2CD8:: @ 080B2CD8 gUnk_080B2CD8:: @ 080B2CD8
gUnk_080B2CD8_2:: @ 080B2CD8
gUnk_080B2CD8_3:: @ 080B2CD8
.incbin "baserom.gba", 0x0B2CD8, 0x0000010 .incbin "baserom.gba", 0x0B2CD8, 0x0000010

View File

@ -14,10 +14,18 @@ typedef struct { // 0x03001000
u32 spritePriority; u32 spritePriority;
} MainStruct; } MainStruct;
enum {
SCREEN_INTRO,
SCREEN_CHOOSE_FILE,
SCREEN_GAMEPLAY,
SCREEN_GAME_OVER,
SCREEN_CREDITS,
};
typedef struct { typedef struct {
u8 interruptFlag; u8 interruptFlag;
u8 field_0x1; u8 field_0x1;
u8 loadType; u8 screen;
u8 funcIndex; u8 funcIndex;
u8 transition; u8 transition;
u8 field_0x5; u8 field_0x5;
@ -45,8 +53,6 @@ extern Main gUnk_03001000;
extern UI gUnk_02032EC0; extern UI gUnk_02032EC0;
extern void sub_08055F70(void);
extern void sub_080A3204(void); extern void sub_080A3204(void);
extern void sub_0807CE90(void); extern void sub_0807CE90(void);
extern void sub_080560B8(void); extern void sub_080560B8(void);
@ -55,11 +61,10 @@ extern void sub_0804FFE4(void);
extern void sub_08056418(void); extern void sub_08056418(void);
extern void sub_080ADD30(void); extern void sub_080ADD30(void);
extern void sub_08056010(u32); extern void InitScreen(u32);
extern void sub_08016E78(void); extern void sub_08016E78(void);
extern void ReadKeyInput(void); extern void ReadKeyInput(void);
extern u32 sub_08055FF4(void); extern void DoSoftReset(void);
extern void sub_080560A8(void);
extern void sub_08056260(void); extern void sub_08056260(void);
extern void VBlankIntrWait(); extern void VBlankIntrWait();
extern s32 _call_via_r0(s32); extern s32 _call_via_r0(s32);

View File

@ -462,7 +462,6 @@ SECTIONS {
src/sub_08055E08.o(.text); src/sub_08055E08.o(.text);
asm/sub_08055E24.o(.text); asm/sub_08055E24.o(.text);
src/mainLoop.o(.text); src/mainLoop.o(.text);
asm/sub_08055F70.o(.text);
asm/code_08055FF4.o(.text); asm/code_08055FF4.o(.text);
src/textbox.o(.text); src/textbox.o(.text);
asm/code_08056418.o(.text); asm/code_08056418.o(.text);

View File

@ -1,26 +1,10 @@
#include "global.h" #include "global.h"
#include "entity.h" #include "entity.h"
#include "area.h" #include "area.h"
#include "main.h"
#include "functions.h" #include "functions.h"
#include "screen.h" #include "screen.h"
typedef struct {
u8 interruptFlag;
u8 field_0x1;
u8 loadType;
u8 funcIndex;
u8 transition;
u16 field_0x5;
u8 muteAudio;
u8 field_0x8;
u8 countdown;
u8 field_0xa;
u8 field_0xb;
u8 ticks;
u8 field_0xe;
u8 field_0xf;
} Main;
typedef struct { typedef struct {
u8 filler [18]; u8 filler [18];
u32 unk; u32 unk;
@ -32,7 +16,6 @@ extern void (*const gUnk_080D4120[])();
extern void (*const gUnk_080D412C[])(); extern void (*const gUnk_080D412C[])();
extern Main gUnk_03001000;
extern struct_02018EB0 gUnk_02018EB0; extern struct_02018EB0 gUnk_02018EB0;
extern u8 gUnk_03000FD0; extern u8 gUnk_03000FD0;

View File

@ -2,26 +2,23 @@
#include "entity.h" #include "entity.h"
#include "readKeyInput.h" #include "readKeyInput.h"
void StoreKeyInput(Input *pkeyInput, u32 ioKeyInput); static void StoreKeyInput(Input*, u32);
void ReadKeyInput(void) void ReadKeyInput(void)
{ {
u32 reg = ~*(u16*)0x04000130 & 0x3FF; u32 keyInput = ~REG_KEYINPUT & KEYS_MASK;
Input* input = &gUnk_03000FF0; StoreKeyInput(&gUnk_03000FF0, keyInput);
StoreKeyInput(input, reg);
} }
void StoreKeyInput(Input *input, u32 ioKeyInput) static void StoreKeyInput(Input *input, u32 keyInput)
{ {
u32 difference; u32 heldKeys = input->heldKeys;
u32 temp = input->heldKeys; u32 difference = keyInput & ~heldKeys;
difference = ioKeyInput & ~temp;
input->newKeys = difference; input->newKeys = difference;
if (ioKeyInput == temp) { if (keyInput == heldKeys) {
if (--input->unk7 == 0) { if (--input->unk7 == 0) {
input->unk7 = 4; input->unk7 = 4;
input->unk4 = ioKeyInput; input->unk4 = keyInput;
} }
else { else {
input->unk4 = 0; input->unk4 = 0;
@ -31,5 +28,5 @@ void StoreKeyInput(Input *input, u32 ioKeyInput)
input->unk7 = 0x14; input->unk7 = 0x14;
input->unk4 = difference; input->unk4 = difference;
} }
input->heldKeys = ioKeyInput; input->heldKeys = keyInput;
} }

View File

@ -2,13 +2,18 @@
#include "functions.h" #include "functions.h"
#include "main.h" #include "main.h"
#include "random.h" #include "random.h"
#include "readKeyInput.h"
extern void sub_0804FF84(u32); extern void sub_0804FF84(u32);
extern void _DmaZero(void*, u32);
extern u32 gUnk_020176A0; extern u32 gUnk_020176A0;
extern const void (*gUnk_08100CBC[])(); extern const void (*gUnk_08100CBC[])();
extern void VBlankInterruptWait(void); 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) { void MainLoop(void) {
int var0; int var0;
@ -27,11 +32,11 @@ void MainLoop(void) {
sub_080ADD30(); sub_080ADD30();
gRand = 0x1234567; gRand = 0x1234567;
_DmaZero(&gUnk_03001000, 16); _DmaZero(&gUnk_03001000, 16);
sub_08056010(0); InitScreen(SCREEN_INTRO);
while (1) { while (1) {
ReadKeyInput(); ReadKeyInput();
if (sub_08055FF4()) { if (SoftResetKeysPressed()) {
sub_080560A8(); DoSoftReset();
} }
switch (gUnk_03001000.field_0x1) { switch (gUnk_03001000.field_0x1) {
@ -55,7 +60,7 @@ void MainLoop(void) {
} }
gUnk_03001000.ticks++; gUnk_03001000.ticks++;
gUnk_08100CBC[gUnk_03001000.loadType](); gUnk_08100CBC[gUnk_03001000.screen]();
sub_08056458(); sub_08056458();
sub_08050154(); sub_08050154();
sub_080A3480(); sub_080A3480();
@ -65,3 +70,65 @@ void MainLoop(void) {
sub_08016E78(); 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));
}

View File

@ -1,13 +1,10 @@
#include "global.h" #include "global.h"
#include "main.h"
extern void sub_08056010(u32);
extern u8 gUnk_03000FD0; extern u8 gUnk_03000FD0;
void sub_080AD834(void) void sub_080AD834(void) {
if (gUnk_03000FD0 == 0) {
{ InitScreen(SCREEN_CHOOSE_FILE);
if (gUnk_03000FD0 == '\0') {
sub_08056010(1);
} }
return;
} }