diff --git a/config/SOUE01/splits.txt b/config/SOUE01/splits.txt index 232dd3e7..e4658c04 100644 --- a/config/SOUE01/splits.txt +++ b/config/SOUE01/splits.txt @@ -157,7 +157,7 @@ m/m_heap.cpp: .rodata start:0x804F0570 end:0x804F0580 .data start:0x80542990 end:0x80542AA8 .sdata start:0x80573FF8 end:0x80574000 - .sbss start:0x80575C38 end:0x80575C50 + .sbss start:0x80575C38 end:0x80575C4C .bss start:0x805CB078 end:0x805CB088 m/m_mtx.cpp: diff --git a/config/SOUE01/symbols.txt b/config/SOUE01/symbols.txt index 1254741b..ef76ae55 100644 --- a/config/SOUE01/symbols.txt +++ b/config/SOUE01/symbols.txt @@ -17817,11 +17817,11 @@ copyAttribute__5mHeapFUi = .text:0x802F0F00; // type:function size:0x34 setCurrentHeap__5mHeapFPQ23EGG4Heap = .text:0x802F0F40; // type:function size:0x4 createExpHeap__5mHeapFUlPQ23EGG4HeapPCcUlUl = .text:0x802F0F50; // type:function size:0x10C adjustExpHeap__5mHeapFPQ23EGG7ExpHeap = .text:0x802F1060; // type:function size:0x68 -expHeapCost__5mHeapFUlUl = .text:0x802F10D0; // type:function size:0x18 +expHeapCost__5mHeapFUli = .text:0x802F10D0; // type:function size:0x18 createFrmHeap__5mHeapFUlPQ23EGG4HeapPCcUlUl = .text:0x802F10F0; // type:function size:0x10C destroyFrmHeap__5mHeapFPQ23EGG7FrmHeap = .text:0x802F1200; // type:function size:0x1C adjustFrmHeap__5mHeapFPQ23EGG7FrmHeap = .text:0x802F1220; // type:function size:0x68 -frmHeapCost__5mHeapFUlUl = .text:0x802F1290; // type:function size:0x18 +frmHeapCost__5mHeapFUli = .text:0x802F1290; // type:function size:0x18 setTempHeap__5mHeapFPPQ23EGG4HeapPQ23EGG4Heap = .text:0x802F12B0; // type:function size:0x38 restoreTempHeap__5mHeapFPPQ23EGG4Heapi = .text:0x802F12F0; // type:function size:0x58 createHeap__5mHeapFUlPQ23EGG4HeapPCc = .text:0x802F1350; // type:function size:0x74 @@ -40263,7 +40263,7 @@ s_SavedCurrentHeap__5mHeap = .sbss:0x80575C38; // type:object size:0x4 data:4byt g_archiveHeap__5mHeap = .sbss:0x80575C3C; // type:object size:0x4 data:4byte g_commandHeap__5mHeap = .sbss:0x80575C40; // type:object size:0x4 data:4byte g_dylinkHeap__5mHeap = .sbss:0x80575C44; // type:object size:0x4 data:4byte -g_assertHeap__5mHeap = .sbss:0x80575C48; // type:object size:0x8 data:4byte +g_assertHeap__5mHeap = .sbss:0x80575C48; // type:object size:0x4 data:4byte lbl_80575C50 = .sbss:0x80575C50; // type:object size:0x4 data:4byte lbl_80575C54 = .sbss:0x80575C54; // type:object size:0x4 data:4byte lbl_80575C58 = .sbss:0x80575C58; // type:object size:0x4 data:4byte diff --git a/configure.py b/configure.py index 7082ca12..7be624d0 100644 --- a/configure.py +++ b/configure.py @@ -289,7 +289,7 @@ config.libs = [ Object(NonMatching, "f/f_base.cpp"), Object(NonMatching, "f/f_list.cpp"), Object(NonMatching, "f/f_manager.cpp"), - Object(NonMatching, "m/m_heap.cpp"), + Object(Matching, "m/m_heap.cpp"), Object(NonMatching, "m/m_mtx.cpp"), # framework (f_name) # d stuff (d_name) diff --git a/include/m/m_heap.h b/include/m/m_heap.h index 4ee94d11..6fdd1de7 100644 --- a/include/m/m_heap.h +++ b/include/m/m_heap.h @@ -19,11 +19,11 @@ namespace mHeap { /* 802f0f40 */ EGG::Heap *setCurrentHeap(EGG::Heap *); /* 802f0f50 */ EGG::ExpHeap *createExpHeap(size_t size, EGG::Heap *parentHeap, char *name, s32 align, u32 unk); /* 802f1060 */ size_t adjustExpHeap(EGG::Heap *heap); -/* 802f10d0 */ size_t expHeapCost(size_t start, size_t size); +/* 802f10d0 */ size_t expHeapCost(size_t start, s32 size); /* 802f10f0 */ EGG::FrmHeap *createFrmHeap(size_t size, EGG::Heap *parentHeap, char *name, size_t align, size_t attrs); /* 802f1200 */ void destroyFrmHeap(EGG::FrmHeap *heap); /* 802f1220 */ size_t adjustFrmHeap(EGG::FrmHeap *heap); -/* 802f1290 */ size_t frmHeapCost(size_t start, size_t size); +/* 802f1290 */ size_t frmHeapCost(size_t start, s32 size); /* 802f12b0 */ EGG::Heap **setTempHeap(EGG::Heap **prevHeap, EGG::Heap *tempNewHeap); /* 802f12f0 */ EGG::Heap **restoreTempHeap(EGG::Heap **prevHeap, s32 size); /* 802f1350 */ EGG::ExpHeap *createHeap(size_t size, EGG::Heap *, char *name); diff --git a/src/m/m_heap.cpp b/src/m/m_heap.cpp index 4e932d30..782cdec2 100644 --- a/src/m/m_heap.cpp +++ b/src/m/m_heap.cpp @@ -5,7 +5,8 @@ namespace mHeap { -u8 g_DefaultGameHeapId = 1; +// Workaround because dtk won't cooperate with this file +u8 g_DefaultGameHeapId[8] = {1}; #define MIN_ALIGN 0x20 @@ -74,10 +75,11 @@ size_t adjustExpHeap(EGG::ExpHeap *heap) { } return ret; } -size_t expHeapCost(size_t size, size_t align) { - // TODO this generates an andc where it should be a nor + and - size_t r5 = align - 1; - return size + (~r5 & (r5 + 0x84)); +size_t expHeapCost(size_t size, s32 align) { + int a = align - 1; + long b = (0x84 + a); + + return size + (~(a) & b); } EGG::FrmHeap *createFrmHeap(size_t size, EGG::Heap *parent, const char *name, size_t align, size_t attrs) { @@ -125,9 +127,11 @@ size_t adjustFrmHeap(EGG::FrmHeap *heap) { return ret; } -size_t frmHeapCost(size_t size, size_t align) { - size_t r5 = align - 1; - return size + (~r5 & (r5 + 0x7d)); +size_t frmHeapCost(size_t size, s32 align) { + int a = align - 1; + long b = (0x7C + a); + + return size + (~(a) & b); } EGG::Heap **setTempHeap(EGG::Heap **prevHeap, EGG::Heap *tempNewHeap) { @@ -175,26 +179,27 @@ EGG::FrmHeap *makeFrmHeapAndUpdate(size_t size, EGG::Heap *parentHeap, const cha } int getDefaultGameHeapId() { - return g_DefaultGameHeapId; + return g_DefaultGameHeapId[0]; } inline bool isValidHeapId(u32 id) { return id >= 1 && id <= 2; } +const char *const s_GameHeapNames[4] = { + 0, + "ゲーム用汎用ヒープ1(mHeap::gameHeaps[1])", + "ゲーム用汎用ヒープ2(mHeap::gameHeaps[2])", + 0, +}; + EGG::ExpHeap *createGameHeap(int heapId, size_t size, EGG::Heap *parent) { - const char *s_GameHeapNames[4] = { - 0, - "ゲーム用汎用ヒープ1(mHeap::gameHeaps[1])", - "ゲーム用汎用ヒープ2(mHeap::gameHeaps[2])", - 0, - }; if (!isValidHeapId(heapId)) { return nullptr; } g_gameHeaps[heapId] = createHeap(size, parent, s_GameHeapNames[heapId]); - if (heapId == g_DefaultGameHeapId) { + if (heapId == g_DefaultGameHeapId[0]) { g_gameHeaps[0] = g_gameHeaps[heapId]; } return g_gameHeaps[heapId]; @@ -215,7 +220,8 @@ EGG::ExpHeap *createDylinkHeap(size_t size, EGG::Heap *parent) { return g_dylinkHeap; } EGG::AssertHeap *createAssertHeap(EGG::Heap *parent) { - const char *name = "アサートヒープ(mHeap::assertHeap)"; + // Help how do I tell dtk about string length? + const char *name = "アサートヒープ(mHeap::assertHeap)\0\0\0\0\0\0"; g_assertHeap = EGG::AssertHeap::create(EGG::AssertHeap::getSize(), parent); g_assertHeap->mName = name; return g_assertHeap;