From d8015068aa66910cc4659345fa8e87abcd2a0659 Mon Sep 17 00:00:00 2001 From: Yanis002 <35189056+Yanis002@users.noreply.github.com> Date: Mon, 17 Feb 2025 16:11:10 +0100 Subject: [PATCH] started main functions --- config/eur/arm9/delinks.txt | 3 + config/eur/arm9/symbols.txt | 2 +- config/jp/arm9/symbols.txt | 2 +- src/Main/Main.cpp | 134 ++++++++++++++++++++++++++++++++++++ 4 files changed, 139 insertions(+), 2 deletions(-) create mode 100644 src/Main/Main.cpp diff --git a/config/eur/arm9/delinks.txt b/config/eur/arm9/delinks.txt index 8a91900f..c2a612f5 100644 --- a/config/eur/arm9/delinks.txt +++ b/config/eur/arm9/delinks.txt @@ -9,3 +9,6 @@ libs/cpp/src/__register_global_object.c: complete .text start:0x0203ce74 end:0x0203ce94 .bss start:0x02051ad4 end:0x02051ad8 + +src/Main/Main.cpp: + .text start:0x02000800 end:0x02000bdc diff --git a/config/eur/arm9/symbols.txt b/config/eur/arm9/symbols.txt index ff6f16d8..0d5de340 100644 --- a/config/eur/arm9/symbols.txt +++ b/config/eur/arm9/symbols.txt @@ -23,7 +23,7 @@ func_020009fc kind:function(arm,size=0x78) addr:0x020009fc AutoloadCallback kind:function(arm,size=0x4) addr:0x02000a74 func_02000a78 kind:function(arm,size=0xe8) addr:0x02000a78 func_02000b60 kind:function(arm,size=0x4) addr:0x02000b60 -BuildInfo kind:data(any) addr:0x02000b64 +gBuildInfo kind:data(any) addr:0x02000b64 main kind:function(arm,size=0x14) addr:0x02000bc8 func_02000bdc kind:function(thumb,size=0x34) addr:0x02000bdc func_02000c10 kind:function(thumb,size=0xcc) addr:0x02000c10 diff --git a/config/jp/arm9/symbols.txt b/config/jp/arm9/symbols.txt index 51e756a7..f60db802 100644 --- a/config/jp/arm9/symbols.txt +++ b/config/jp/arm9/symbols.txt @@ -23,7 +23,7 @@ func_020009fc kind:function(arm,size=0x78) addr:0x020009fc AutoloadCallback kind:function(arm,size=0x4) addr:0x02000a74 func_02000a78 kind:function(arm,size=0xe8) addr:0x02000a78 func_02000b60 kind:function(arm,size=0x4) addr:0x02000b60 -BuildInfo kind:data(any) addr:0x02000b64 +gBuildInfo kind:data(any) addr:0x02000b64 main kind:function(arm,size=0x14) addr:0x02000bc8 func_02000bdc kind:function(thumb,size=0x34) addr:0x02000bdc func_02000c10 kind:function(thumb,size=0xcc) addr:0x02000c10 diff --git a/src/Main/Main.cpp b/src/Main/Main.cpp new file mode 100644 index 00000000..73cecdb7 --- /dev/null +++ b/src/Main/Main.cpp @@ -0,0 +1,134 @@ +#include "global.h" +#include "types.h" + +void func_0203b920(void); +void func_02011da0(void); +void func_0203cdb8(void); +void main(void); + +void func_02000a78(void); +void* func_0200093c(unk32, u32*, unk32); +void func_020009fc(void); +void func_02000950(unk32*); +void func_01ffbd70(void); + +#define UNK_027FFF9C (*(u32*)0x027FFF9C) +#define REG_IME (*(u32*)0x04000208) +#define REG_VCOUNT (*(u32*)0x04000006) +#define RAM_PALETTES ((u32*)0x05000000) +#define RAM_OAM ((u32*)0x07000000) + +typedef void (*UnkStruct_027e0000_Callback)(void); +struct UnkStruct_027e0000 { + unk8 mUnk_00[0x3FFC]; + UnkStruct_027e0000_Callback mUnk_3FFC; +}; +extern UnkStruct_027e0000* data_027e0000; + +extern unk32* data_0204cde0; +extern unk32* data_0204cdf8; +extern unk32* data_02044dc0; +extern unk32* data_02044dc0; + +struct BuildInfo { + /* 00 */ unk32* mUnk_00; + /* 04 */ unk32* mUnk_04; + /* 08 */ unk32* mUnk_08; + /* 0C */ unk32* mUnk_0C; + /* 10 */ unk32* mUnk_10; + /* 14 */ unk32* mUnk_14; + /* 18 */ unk32 mUnk_18; + /* 1C */ unk32 mUnk_1C; + /* 20 */ unk32 mUnk_20; + /* 24 */ char mUnk_24[28]; + /* 3D */ char mUnk_3D[40]; +}; +extern BuildInfo gBuildInfo; + +struct UnkStruct_02049a2c { + /* 00 */ unk8 mUnk_00[0xE8]; + /* E8 */ + + void func_02013394(void); +}; +extern UnkStruct_02049a2c* data_02049a2c; + +// non-matching +ARM void Entry(void) { + unk32* puVar1; + unk32* puVar2; + u32 uVar3; + unk32* puVar4; + + REG_IME = 0x04000000; + + do { + } while (REG_VCOUNT != 0x0); + + func_02000a78(); + func_0200093c(0, (u32*)data_027e0000, 0x4000); + func_0200093c(0, RAM_PALETTES, 0x400); + func_0200093c(0x200, RAM_OAM, 0x400); + func_02000950(gBuildInfo.mUnk_14); + func_020009fc(); + puVar4 = gBuildInfo.mUnk_10; + puVar1 = gBuildInfo.mUnk_0C; + + for (puVar2 = puVar1; puVar2 < puVar4; puVar2 = puVar2 + 0x1) { + *puVar2 = 0x0; + } + + uVar3 = (u32)puVar1 & 0xFFFFFFE0; + + do { + // inline asm? + // coproc_moveto_Data_Synchronization(0x0); + // coproc_moveto_Invalidate_Instruction_Cache_by_MVA(uVar3); + // coproc_moveto_Invalidate_Data_Cache_by_MVA(uVar3); + uVar3 = uVar3 + 0x20; + } while ((int)uVar3 < (int)puVar4); + + UNK_027FFF9C = 0x0; + data_027e0000->mUnk_3FFC = func_01ffbd70; + + func_0203b920(); + func_02011da0(); + func_0203cdb8(); + main(); +} + +// non-matching +ARM void* func_0200093c(unk32 param1, u32* param2, unk32 param3) { + u32* p = param2 + param3; + + while (param2 < p) { + *p++ = param1; + } + + return param2; +} + +void AutoloadCallback(void) { +} + +void func_02000b60(void) { +} + +BuildInfo gBuildInfo = { + .mUnk_00 = data_0204cde0, + .mUnk_04 = data_0204cdf8, + .mUnk_08 = data_02044dc0, + .mUnk_0C = data_02044dc0, + .mUnk_10 = (unk32*)0x02051AE0, + .mUnk_14 = NULL, + .mUnk_18 = 0x04027539, + .mUnk_1C = 0x04027539, + .mUnk_20 = 0xDEC00621, + "\xDE\xC0\x06![SDK+NINTENDO:BACKUP]", + "[SDK+MEI:libASR_V1.0.5-CW2.0-SDK4.0]" +}; + +// non-matching +void main(void) { + data_02049a2c->func_02013394(); +}