diff --git a/config/eur/arm9/symbols.txt b/config/eur/arm9/symbols.txt index f846e5dc..ff6f16d8 100644 --- a/config/eur/arm9/symbols.txt +++ b/config/eur/arm9/symbols.txt @@ -601,13 +601,13 @@ func_02011c04 kind:function(arm,size=0x40) addr:0x02011c04 func_02011c44 kind:function(arm,size=0x24) addr:0x02011c44 func_02011c68 kind:function(arm,size=0x138) addr:0x02011c68 func_02011da0 kind:function(arm,size=0x70) addr:0x02011da0 -func_02011e10 kind:function(arm,size=0x94) addr:0x02011e10 -func_02011ea4 kind:function(arm,size=0x6c) addr:0x02011ea4 -func_02011f10 kind:function(arm,size=0x20) addr:0x02011f10 -func_02011f30 kind:function(arm,size=0xc) addr:0x02011f30 -func_02011f3c kind:function(arm,size=0xb8) addr:0x02011f3c -func_02011ff4 kind:function(arm,size=0xc) addr:0x02011ff4 -func_02012000 kind:function(arm,size=0xc) addr:0x02012000 +_Z6SysNewP18UnkStruct_02011e10ii kind:function(arm,size=0x94) addr:0x02011e10 +_Z9SysDeletePv kind:function(arm,size=0x6c) addr:0x02011ea4 +_Z13func_02011f10i kind:function(arm,size=0x20) addr:0x02011f10 +_Z13func_02011f30i kind:function(arm,size=0xc) addr:0x02011f30 +_ZN9SysObjectnwEmjj kind:function(arm,size=0xb8) addr:0x02011f3c +_ZN9SysObjectdlEPv kind:function(arm,size=0xc) addr:0x02011ff4 +_ZN9SysObjectdaEPv kind:function(arm,size=0xc) addr:0x02012000 func_0201200c kind:function(arm,size=0x15c) addr:0x0201200c func_02012168 kind:function(arm,size=0x198) addr:0x02012168 func_02012300 kind:function(arm,size=0x3c) addr:0x02012300 diff --git a/include/System/SysFault.hpp b/include/System/SysFault.hpp new file mode 100644 index 00000000..968995b8 --- /dev/null +++ b/include/System/SysFault.hpp @@ -0,0 +1,10 @@ +#pragma once + +#include "types.h" + +class SysFault { + public: + void func_020125a4(char* file, u16 line, char* msg, ...); +}; + +extern SysFault data_02049984; diff --git a/include/System/SysNew.hpp b/include/System/SysNew.hpp new file mode 100644 index 00000000..5641613e --- /dev/null +++ b/include/System/SysNew.hpp @@ -0,0 +1,30 @@ +#pragma once + +#include "types.h" + +typedef u32 UnkId; +enum __UnkId { + UnkId_EXPH = 'EXPH', + UnkId_FRMH = 'FRMH', + UnkId_UNTH = 'UNTH', + UnkId_UNSH = 'UNSH', +}; + +struct UnkStruct_02011e10 { + /* 00 */ UnkId mId; + /* 04 */ unk8 mUnk_04[0x28]; + /* 2C */ +}; + +void* SysNew(UnkStruct_02011e10* param1, s32 length, s32 param3); +void SysDelete(void* ptr); +void* func_02011f10(s32 length); +void* func_02011f30(s32 length); + +class SysObject { + public: + static void* operator new(unsigned long length, u32 id, u32 idLength); + static void* operator new[](unsigned long length, u32* id, u32 idLength); + static void operator delete(void* ptr); + static void operator delete[](void* ptr); +}; diff --git a/src/Main/System/SysNew.cpp b/src/Main/System/SysNew.cpp new file mode 100644 index 00000000..dd7e6846 --- /dev/null +++ b/src/Main/System/SysNew.cpp @@ -0,0 +1,102 @@ +#include "System/SysNew.hpp" +#include "System/SysFault.hpp" +#include "global.h" + +extern "C" { +void* func_02001654(void); +void* func_020145b0(UnkId*, s32); +void* func_020010c0(void); +void* func_02001308(void); +UnkId* func_02001488(void); +UnkId* func_02014704(void); +UnkId* func_020011c8(UnkId*, void*); +UnkId* func_02014630(UnkId*, void*); +UnkId* func_02001684(UnkId*, void*); +void func_020011f4(void*); +} +extern char* data_0204372c[]; +extern UnkStruct_02011e10* data_0204999c[4]; + +// non-matching +ARM void* SysNew(UnkStruct_02011e10* param1, s32 length, s32 param3) { + void* newPtr = NULL; + void* ret; + + switch (param1->mId) { + case UnkId_EXPH: + newPtr = func_020010c0(); + break; + case UnkId_FRMH: + newPtr = func_02001308(); + break; + case UnkId_UNTH: + newPtr = func_02001654(); + break; + case UnkId_UNSH: + newPtr = func_020145b0(func_02014704(), length); + break; + default: + break; + } + + return newPtr; +} + +ARM void SysDelete(void* ptr) { + UnkId* pUnkId; + + if (ptr != NULL) { + pUnkId = func_02001488(); + + switch (*pUnkId) { + case UnkId_EXPH: + func_020011c8(pUnkId, ptr); + break; + case UnkId_UNTH: + func_02001684(pUnkId, ptr); + break; + case UnkId_UNSH: + func_02014630(func_02014704(), ptr); + break; + default: + break; + } + } +} + +ARM void* func_02011f10(s32 length) { return SysNew(data_0204999c[1], length, 4); } + +ARM void* func_02011f30(s32 length) { return func_02011f10(length); } + +// non-matching +ARM void* SysObject::operator new(unsigned long length, u32 id, u32 idLength) { + void* pvVar1; + char* uVar2; + u16 line; + char* uVar4; + UnkStruct_02011e10* pUVar5; + + pUVar5 = data_0204999c[id]; + pvVar1 = SysNew(pUVar5, length, idLength); + + if (pvVar1 == NULL) { + if (id == 1) { + func_020011f4(pUVar5); + uVar2 = data_0204372c[id]; + uVar4 = "%sノメモリガタリマセン.\nサイズ=%d\nノコリ =%d"; + line = 183; + } else if (id == 0) { + uVar2 = data_0204372c[id]; + uVar4 = "%sノメモリガタリマセン.\nサイズ=%d"; + line = 187; + } + + data_02049984.func_020125a4(__FILE__, line, uVar4, uVar2, length); + } + + return pvVar1; +} + +ARM void SysObject::operator delete(void* ptr) { SysDelete(ptr); } + +ARM void SysObject::operator delete[](void* ptr) { SysDelete(ptr); }