mirror of
https://github.com/pret/pmd-red.git
synced 2026-03-21 17:46:39 -05:00
160 lines
2.9 KiB
C
160 lines
2.9 KiB
C
|
|
// Includes
|
|
#include "global.h"
|
|
#include "code_800B540.h"
|
|
|
|
// Static type declarations
|
|
|
|
struct HeapInitArgs {
|
|
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;
|
|
struct MemoryBlock gUnknown_2000EB0 = {};
|
|
struct MemoryBlock gUnknown_2000ED0[24] = {};
|
|
u8 gUnknown_20011D0[0x24000] = {};
|
|
|
|
// Static ROM declarations
|
|
|
|
// .rodata
|
|
|
|
// .text
|
|
|
|
void InitHeapInternal(void);
|
|
void DoInitHeap(struct MemoryBlock *a0, struct HeapInitArgs *args, struct MemoryBlock *a2, size_t a3);
|
|
|
|
void InitHeap(void)
|
|
{
|
|
InitHeapInternal();
|
|
}
|
|
|
|
void MemoryClear8(u8 *dst, int size)
|
|
{
|
|
while (size > 0)
|
|
{
|
|
size -= 1;
|
|
*dst++ = 0;
|
|
}
|
|
}
|
|
|
|
void MemoryClear16(u16 *dst, int size)
|
|
{
|
|
while (size > 0)
|
|
{
|
|
size -= 2;
|
|
*dst++ = 0;
|
|
}
|
|
}
|
|
|
|
void MemoryClear32(u32 *dst, int size)
|
|
{
|
|
CpuClear(dst, size);
|
|
}
|
|
|
|
void MemoryFill8(u8 *dst, u8 val, int size)
|
|
{
|
|
while (size > 0)
|
|
{
|
|
size -= 1;
|
|
*dst++ = val;
|
|
}
|
|
}
|
|
|
|
void MemoryFill16(u16 *dst, u16 val, int size)
|
|
{
|
|
while (size > 0)
|
|
{
|
|
size -= 2;
|
|
*dst++ = val;
|
|
}
|
|
}
|
|
|
|
void MemoryFill32(u32 *dst, u32 val, int size)
|
|
{
|
|
while (size > 0)
|
|
{
|
|
size -= 4;
|
|
*dst++ = val;
|
|
}
|
|
}
|
|
|
|
void MemoryCopy8(u8 *dst, const u8 *src, int size)
|
|
{
|
|
while (size > 0)
|
|
{
|
|
size -= 1;
|
|
*dst++ = *src++;
|
|
}
|
|
}
|
|
|
|
void MemoryCopy16(u16 *dst, const u16 *src, int size)
|
|
{
|
|
while (size > 0)
|
|
{
|
|
size -= 2;
|
|
*dst++ = *src++;
|
|
}
|
|
}
|
|
|
|
void MemoryCopy32(u32 *dst, const u32 *src, int size)
|
|
{
|
|
while (size > 0)
|
|
{
|
|
size -= 4;
|
|
*dst++ = *src++;
|
|
}
|
|
}
|
|
|
|
void InitHeapInternal(void)
|
|
{
|
|
struct HeapInitArgs args;
|
|
args.ptr = gUnknown_20011D0;
|
|
args.size = sizeof gUnknown_20011D0;
|
|
gUnknown_2000EA8 = 0;
|
|
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);
|
|
}
|