diff options
-rw-r--r-- | asm/memory.s | 78 | ||||
-rw-r--r-- | src/memory.c | 51 |
2 files changed, 46 insertions, 83 deletions
diff --git a/asm/memory.s b/asm/memory.s index f6a0a38..a69aee7 100644 --- a/asm/memory.s +++ b/asm/memory.s @@ -5,84 +5,6 @@ .text - thumb_func_start DoInitHeap -DoInitHeap: - push {r4-r6,lr} - mov r6, r9 - mov r5, r8 - push {r5,r6} - ldr r4, [r1, 0x4] - mov r9, r4 - movs r4, 0x4 - negs r4, r4 - mov r5, r9 - ands r5, r4 - mov r9, r5 - ldr r6, _08002FFC - ldr r4, _08003000 - mov r8, r4 - ldr r5, [r4] - lsls r4, r5, 2 - adds r4, r6 - str r0, [r4] - adds r5, 0x1 - mov r4, r8 - str r5, [r4] - ldr r5, [r1] - str r5, [r0, 0x14] - mov r1, r9 - str r1, [r0, 0x18] - movs r1, 0x2 - str r1, [r0] - movs r4, 0 - str r4, [r0, 0x4] - str r2, [r0, 0x8] - movs r1, 0x1 - str r1, [r0, 0xC] - str r3, [r0, 0x10] - str r4, [r2] - str r4, [r2, 0x4] - str r5, [r2, 0xC] - mov r5, r9 - str r5, [r2, 0x10] - str r4, [r2, 0x14] - str r4, [r2, 0x8] - pop {r3,r4} - mov r8, r3 - mov r9, r4 - pop {r4-r6} - pop {r0} - bx r0 - .align 2, 0 -_08002FFC: .4byte gUnknown_2000E88 -_08003000: .4byte gUnknown_2000EA8 - thumb_func_end DoInitHeap - - thumb_func_start InitSubHeap -InitSubHeap: - push {r4,r5,lr} - sub sp, 0x8 - adds r3, r2, 0 - lsls r4, r3, 1 - adds r4, r3 - movs r2, 0x4 - negs r2, r2 - lsls r4, 3 - ldr r5, [r1, 0x4] - subs r5, r4 - ands r5, r2 - ldr r2, [r1] - adds r4, r2, r4 - str r4, [sp] - str r5, [sp, 0x4] - mov r1, sp - bl DoInitHeap - add sp, 0x8 - pop {r4,r5} - pop {r0} - bx r0 - thumb_func_end InitSubHeap - thumb_func_start xxx_memory_attr_related xxx_memory_attr_related: push {lr} 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); } |