From 6b09adf8d41c4abdaab460176a7d98c25c12b049 Mon Sep 17 00:00:00 2001 From: Marcus Huderle Date: Wed, 5 Aug 2020 17:47:06 -0500 Subject: [PATCH] Decompile some more of mainLoop.c --- asm/code_08050038.s | 8 ++-- asm/code_080526F8.s | 2 +- asm/code_08055FF4.s | 101 ------------------------------------------- asm/code_0805E744.s | 2 +- asm/code_0807CC3C.s | 2 +- asm/code_080A3480.s | 2 +- asm/sub_08055F70.s | 60 ------------------------- data/data_080B2A70.s | 2 + include/main.h | 17 +++++--- linker.ld | 1 - src/code_0804AA84.c | 19 +------- src/input.c | 21 ++++----- src/mainLoop.c | 79 ++++++++++++++++++++++++++++++--- src/sub_080AD834.c | 11 ++--- 14 files changed, 108 insertions(+), 219 deletions(-) delete mode 100644 asm/sub_08055F70.s diff --git a/asm/code_08050038.s b/asm/code_08050038.s index 3f48d62d..6a621a70 100644 --- a/asm/code_08050038.s +++ b/asm/code_08050038.s @@ -593,7 +593,7 @@ sub_0805060C: @ 0x0805060C cmp r0, #0 bne _0805061C movs r0, #2 - bl sub_08056010 + bl InitScreen _0805061C: pop {pc} .align 2, 0 @@ -3486,7 +3486,7 @@ sub_08051D2C: @ 0x08051D2C movs r1, #8 bl DoFade movs r0, #3 - bl sub_08056010 + bl InitScreen pop {pc} .align 2, 0 @@ -4270,12 +4270,12 @@ _080523AC: cmp r0, #0 bne _080523C8 movs r0, #2 - bl sub_08056010 + bl InitScreen b _080523CC .align 2, 0 _080523C4: .4byte gUnk_03000FD0 _080523C8: - bl sub_080560A8 + bl DoSoftReset _080523CC: pop {r4, pc} .align 2, 0 diff --git a/asm/code_080526F8.s b/asm/code_080526F8.s index 9e43fbd2..81b19e6a 100644 --- a/asm/code_080526F8.s +++ b/asm/code_080526F8.s @@ -2755,7 +2755,7 @@ sub_08053C60: @ 0x08053C60 ldr r0, _08053C80 @ =0x80100000 bl PlaySFX movs r0, #3 - bl sub_08056010 + bl InitScreen pop {pc} .align 2, 0 _08053C80: .4byte 0x80100000 diff --git a/asm/code_08055FF4.s b/asm/code_08055FF4.s index 2be77ac1..0ce62bc1 100644 --- a/asm/code_08055FF4.s +++ b/asm/code_08055FF4.s @@ -4,107 +4,6 @@ .syntax unified .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 sub_080560B8: @ 0x080560B8 diff --git a/asm/code_0805E744.s b/asm/code_0805E744.s index 5f06dd29..1e196837 100644 --- a/asm/code_0805E744.s +++ b/asm/code_0805E744.s @@ -2771,7 +2771,7 @@ _0805FBC0: .4byte gScreen sub_0805FBC4: @ 0x0805FBC4 push {lr} movs r0, #0 - bl sub_08056010 + bl InitScreen pop {pc} .align 2, 0 diff --git a/asm/code_0807CC3C.s b/asm/code_0807CC3C.s index 4ededc8c..61f52c24 100644 --- a/asm/code_0807CC3C.s +++ b/asm/code_0807CC3C.s @@ -6253,7 +6253,7 @@ _0807FB90: .4byte gLinkEntity sub_0807FB94: @ 0x0807FB94 push {lr} movs r0, #4 - bl sub_08056010 + bl InitScreen pop {pc} .align 2, 0 diff --git a/asm/code_080A3480.s b/asm/code_080A3480.s index 4b5ad21e..c629c34d 100644 --- a/asm/code_080A3480.s +++ b/asm/code_080A3480.s @@ -661,7 +661,7 @@ sub_080A3980: @ 0x080A3980 ldrb r0, [r0] cmp r0, #0 bne _080A398E - bl sub_080560A8 + bl DoSoftReset _080A398E: pop {pc} .align 2, 0 diff --git a/asm/sub_08055F70.s b/asm/sub_08055F70.s deleted file mode 100644 index 5cb4e821..00000000 --- a/asm/sub_08055F70.s +++ /dev/null @@ -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 diff --git a/data/data_080B2A70.s b/data/data_080B2A70.s index bee9d349..b90f8e8e 100644 --- a/data/data_080B2A70.s +++ b/data/data_080B2A70.s @@ -8,4 +8,6 @@ gUnk_080B2A70:: @ 080B2A70 .incbin "baserom.gba", 0x0B2A70, 0x0000268 gUnk_080B2CD8:: @ 080B2CD8 +gUnk_080B2CD8_2:: @ 080B2CD8 +gUnk_080B2CD8_3:: @ 080B2CD8 .incbin "baserom.gba", 0x0B2CD8, 0x0000010 \ No newline at end of file diff --git a/include/main.h b/include/main.h index c98a1e9a..4a58a344 100644 --- a/include/main.h +++ b/include/main.h @@ -14,10 +14,18 @@ typedef struct { // 0x03001000 u32 spritePriority; } MainStruct; +enum { + SCREEN_INTRO, + SCREEN_CHOOSE_FILE, + SCREEN_GAMEPLAY, + SCREEN_GAME_OVER, + SCREEN_CREDITS, +}; + typedef struct { u8 interruptFlag; u8 field_0x1; - u8 loadType; + u8 screen; u8 funcIndex; u8 transition; u8 field_0x5; @@ -45,8 +53,6 @@ extern Main gUnk_03001000; extern UI gUnk_02032EC0; - -extern void sub_08055F70(void); extern void sub_080A3204(void); extern void sub_0807CE90(void); extern void sub_080560B8(void); @@ -55,11 +61,10 @@ extern void sub_0804FFE4(void); extern void sub_08056418(void); extern void sub_080ADD30(void); -extern void sub_08056010(u32); +extern void InitScreen(u32); extern void sub_08016E78(void); extern void ReadKeyInput(void); -extern u32 sub_08055FF4(void); -extern void sub_080560A8(void); +extern void DoSoftReset(void); extern void sub_08056260(void); extern void VBlankIntrWait(); extern s32 _call_via_r0(s32); diff --git a/linker.ld b/linker.ld index 2b36cabf..07210c60 100644 --- a/linker.ld +++ b/linker.ld @@ -462,7 +462,6 @@ SECTIONS { src/sub_08055E08.o(.text); asm/sub_08055E24.o(.text); src/mainLoop.o(.text); - asm/sub_08055F70.o(.text); asm/code_08055FF4.o(.text); src/textbox.o(.text); asm/code_08056418.o(.text); diff --git a/src/code_0804AA84.c b/src/code_0804AA84.c index 5eddfc28..f861d4f0 100644 --- a/src/code_0804AA84.c +++ b/src/code_0804AA84.c @@ -1,26 +1,10 @@ #include "global.h" #include "entity.h" #include "area.h" +#include "main.h" #include "functions.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 { u8 filler [18]; u32 unk; @@ -32,7 +16,6 @@ extern void (*const gUnk_080D4120[])(); extern void (*const gUnk_080D412C[])(); -extern Main gUnk_03001000; extern struct_02018EB0 gUnk_02018EB0; extern u8 gUnk_03000FD0; diff --git a/src/input.c b/src/input.c index 438a6e6b..101a3ac6 100644 --- a/src/input.c +++ b/src/input.c @@ -2,26 +2,23 @@ #include "entity.h" #include "readKeyInput.h" -void StoreKeyInput(Input *pkeyInput, u32 ioKeyInput); +static void StoreKeyInput(Input*, u32); void ReadKeyInput(void) { - u32 reg = ~*(u16*)0x04000130 & 0x3FF; - Input* input = &gUnk_03000FF0; - StoreKeyInput(input, reg); + u32 keyInput = ~REG_KEYINPUT & KEYS_MASK; + StoreKeyInput(&gUnk_03000FF0, keyInput); } -void StoreKeyInput(Input *input, u32 ioKeyInput) +static void StoreKeyInput(Input *input, u32 keyInput) { - u32 difference; - u32 temp = input->heldKeys; - - difference = ioKeyInput & ~temp; + u32 heldKeys = input->heldKeys; + u32 difference = keyInput & ~heldKeys; input->newKeys = difference; - if (ioKeyInput == temp) { + if (keyInput == heldKeys) { if (--input->unk7 == 0) { input->unk7 = 4; - input->unk4 = ioKeyInput; + input->unk4 = keyInput; } else { input->unk4 = 0; @@ -31,5 +28,5 @@ void StoreKeyInput(Input *input, u32 ioKeyInput) input->unk7 = 0x14; input->unk4 = difference; } - input->heldKeys = ioKeyInput; + input->heldKeys = keyInput; } \ No newline at end of file diff --git a/src/mainLoop.c b/src/mainLoop.c index 0d04e5a8..f1c8df1c 100644 --- a/src/mainLoop.c +++ b/src/mainLoop.c @@ -2,13 +2,18 @@ #include "functions.h" #include "main.h" #include "random.h" +#include "readKeyInput.h" extern void sub_0804FF84(u32); -extern void _DmaZero(void*, 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; @@ -27,11 +32,11 @@ void MainLoop(void) { sub_080ADD30(); gRand = 0x1234567; _DmaZero(&gUnk_03001000, 16); - sub_08056010(0); + InitScreen(SCREEN_INTRO); while (1) { ReadKeyInput(); - if (sub_08055FF4()) { - sub_080560A8(); + if (SoftResetKeysPressed()) { + DoSoftReset(); } switch (gUnk_03001000.field_0x1) { @@ -55,7 +60,7 @@ void MainLoop(void) { } gUnk_03001000.ticks++; - gUnk_08100CBC[gUnk_03001000.loadType](); + gUnk_08100CBC[gUnk_03001000.screen](); sub_08056458(); sub_08050154(); sub_080A3480(); @@ -65,3 +70,65 @@ void MainLoop(void) { 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)); +} diff --git a/src/sub_080AD834.c b/src/sub_080AD834.c index b7b01918..9b1dd87b 100644 --- a/src/sub_080AD834.c +++ b/src/sub_080AD834.c @@ -1,13 +1,10 @@ #include "global.h" +#include "main.h" -extern void sub_08056010(u32); extern u8 gUnk_03000FD0; -void sub_080AD834(void) - -{ - if (gUnk_03000FD0 == '\0') { - sub_08056010(1); +void sub_080AD834(void) { + if (gUnk_03000FD0 == 0) { + InitScreen(SCREEN_CHOOSE_FILE); } - return; }