summaryrefslogtreecommitdiff
path: root/src/memory.c
diff options
context:
space:
mode:
authorPikalaxALT <pikalaxalt@gmail.com>2017-12-12 22:09:52 -0500
committerPikalaxALT <pikalaxalt@gmail.com>2017-12-12 22:09:52 -0500
commit7d0a8444ff4c796960883e00a1392b921741d9f0 (patch)
tree92b27f8e08234d86af4f87cf2b922153ecb52e1a /src/memory.c
parent48f00a9b910f770211c2ac653160d5708956e2f8 (diff)
through InitSubHeapmemory
Diffstat (limited to 'src/memory.c')
-rw-r--r--src/memory.c51
1 files changed, 46 insertions, 5 deletions
diff --git a/src/memory.c b/src/memory.c
index 1cf31f5..47bf641 100644
--- a/src/memory.c
+++ b/src/memory.c
@@ -6,15 +6,27 @@
// Static type declarations
struct HeapInitArgs {
- void *ptr;
+ u8 *ptr;
u32 size;
};
+struct MemoryBlock {
+ u32 unk_00;
+ u32 unk_04;
+ struct MemoryBlock *next;
+ u32 unk_0c;
+ size_t unk_10;
+ u8 *data;
+ size_t unk_18;
+ u32 unk_1c;
+};
+
// Static RAM declarations
+struct MemoryBlock *gUnknown_2000E88[8] = {};
u32 gUnknown_2000EA8 = 0;
-u8 gUnknown_2000EB0[0x20] = {};
-u8 gUnknown_2000ED0[0x300] = {};
+struct MemoryBlock gUnknown_2000EB0 = {};
+struct MemoryBlock gUnknown_2000ED0[24] = {};
u8 gUnknown_20011D0[0x24000] = {};
// Static ROM declarations
@@ -24,7 +36,7 @@ u8 gUnknown_20011D0[0x24000] = {};
// .text
void InitHeapInternal(void);
-void DoInitHeap(void *a0, struct HeapInitArgs *args, void *a2, size_t a3);
+void DoInitHeap(struct MemoryBlock *a0, struct HeapInitArgs *args, struct MemoryBlock *a2, size_t a3);
void InitHeap(void)
{
@@ -114,5 +126,34 @@ void InitHeapInternal(void)
args.ptr = gUnknown_20011D0;
args.size = sizeof gUnknown_20011D0;
gUnknown_2000EA8 = 0;
- DoInitHeap(gUnknown_2000EB0, &args, gUnknown_2000ED0, sizeof gUnknown_2000EB0);
+ DoInitHeap(&gUnknown_2000EB0, &args, gUnknown_2000ED0, sizeof gUnknown_2000EB0);
+}
+
+void DoInitHeap(struct MemoryBlock *a0, struct HeapInitArgs *args, struct MemoryBlock *a2, size_t a3)
+{
+ size_t size = args->size & ~3; // r9
+ gUnknown_2000E88[gUnknown_2000EA8] = a0;
+ gUnknown_2000EA8++;
+ a0->data = args->ptr;
+ a0->unk_18 = size;
+ a0->unk_00 = 2;
+ a0->unk_04 = 0;
+ a0->next = a2;
+ a0->unk_0c = 1;
+ a0->unk_10 = a3;
+ a2->unk_00 = 0;
+ a2->unk_04 = 0;
+ a2->unk_0c = (intptr_t)args->ptr;
+ a2->unk_10 = size;
+ a2->data = NULL;
+ a2->next = NULL;
+}
+
+void InitSubHeap(struct MemoryBlock *a0, struct HeapInitArgs *srcArgs, size_t size)
+{
+ size_t size_ = size * 3;
+ int r2 = ~3;
+ size_t size__ = r2 & (srcArgs->size - size_ * 8);
+ struct HeapInitArgs args = {srcArgs->ptr + size_ * 8, size__};
+ DoInitHeap(a0, &args, (struct MemoryBlock *)srcArgs->ptr, size);
}