m_heap matching

This commit is contained in:
robojumper
2024-04-30 22:06:21 +02:00
parent b16a290037
commit 152238c9ce
5 changed files with 30 additions and 24 deletions
+1 -1
View File
@@ -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:
+3 -3
View File
@@ -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
+1 -1
View File
@@ -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)
+2 -2
View File
@@ -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);
+23 -17
View File
@@ -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;