mirror of
https://github.com/pret/pmd-red.git
synced 2026-05-06 21:17:23 -05:00
179 lines
3.4 KiB
C
179 lines
3.4 KiB
C
#include "global.h"
|
|
#include "memory.h"
|
|
|
|
extern struct HeapFreeListElement gMainHeapFreeList[32];
|
|
extern u8 gMainHeap[HEAP_SIZE];
|
|
extern u32 gHeapCount;
|
|
extern struct HeapDescriptor gMainHeapDescriptor;
|
|
extern struct HeapDescriptor *gHeapDescriptorList[8];
|
|
|
|
extern void CpuClear(u32 *dest, s32 size);
|
|
|
|
void InitHeapInternal(void);
|
|
|
|
void InitHeap(void)
|
|
{
|
|
InitHeapInternal();
|
|
}
|
|
|
|
void MemoryClear8(u8 *dest, s32 size)
|
|
{
|
|
while (size > 0)
|
|
{
|
|
size -= 1;
|
|
*dest++ = 0;
|
|
}
|
|
}
|
|
|
|
void MemoryClear16(u16 *dest, s32 size)
|
|
{
|
|
while (size > 0)
|
|
{
|
|
size -= 2;
|
|
*dest++ = 0;
|
|
}
|
|
}
|
|
void MemoryClear32(u32 *dest, s32 size)
|
|
{
|
|
CpuClear(dest, size);
|
|
}
|
|
|
|
void MemoryFill8(u8 *dest, u8 value, s32 size)
|
|
{
|
|
while (size > 0)
|
|
{
|
|
size -= 1;
|
|
*dest++ = value;
|
|
}
|
|
}
|
|
|
|
void MemoryFill16(u16 *dest, u16 value, s32 size)
|
|
{
|
|
while (size > 0)
|
|
{
|
|
size -= 2;
|
|
*dest++ = value;
|
|
}
|
|
}
|
|
|
|
void MemoryFill32(u32 *dest, u32 value, s32 size)
|
|
{
|
|
while (size > 0)
|
|
{
|
|
size -= 4;
|
|
*dest++ = value;
|
|
}
|
|
}
|
|
|
|
void MemoryCopy8(u8 *dest, u8 *src, s32 size)
|
|
{
|
|
while (size > 0)
|
|
{
|
|
size -= 1;
|
|
*dest++ = *src++;
|
|
}
|
|
}
|
|
|
|
void MemoryCopy16(u16 *dest, u16 *src, s32 size)
|
|
{
|
|
while (size > 0)
|
|
{
|
|
size -= 2;
|
|
*dest++ = *src++;
|
|
}
|
|
}
|
|
|
|
void MemoryCopy32(u32 *dest, u32 *src, s32 size)
|
|
{
|
|
while (size > 0)
|
|
{
|
|
size -= 4;
|
|
*dest++ = *src++;
|
|
}
|
|
}
|
|
|
|
void InitHeapInternal(void)
|
|
{
|
|
struct HeapSettings settings;
|
|
|
|
settings.start = gMainHeap;
|
|
settings.size = HEAP_SIZE;
|
|
gHeapCount = 0;
|
|
DoInitHeap(&gMainHeapDescriptor, &settings, gMainHeapFreeList, sizeof(gMainHeapFreeList) / sizeof(struct HeapFreeListElement));
|
|
}
|
|
|
|
void DoInitHeap(struct HeapDescriptor *descriptor, struct HeapSettings *settings, struct HeapFreeListElement *freeList, u32 freeListLength)
|
|
{
|
|
u32 aligned_size;
|
|
|
|
aligned_size = settings->size & 0xFFFFFFFC;
|
|
|
|
gHeapDescriptorList[gHeapCount++] = descriptor;
|
|
|
|
descriptor->start = settings->start;
|
|
descriptor->size = aligned_size;
|
|
descriptor->unk0 = 2;
|
|
descriptor->parentHeap = NULL;
|
|
descriptor->freeList = freeList;
|
|
descriptor->freeCount = 1;
|
|
descriptor->freeListLength = freeListLength;
|
|
|
|
freeList->unk_atb = 0;
|
|
freeList->atb = 0;
|
|
freeList->block.start = descriptor->start;
|
|
freeList->block.size = aligned_size;
|
|
freeList->block.allocatedSize = 0;
|
|
freeList->grp = 0;
|
|
}
|
|
|
|
void InitSubHeap(struct HeapDescriptor *parentHeap, struct HeapMemoryBlock *block, u32 freeListMax)
|
|
{
|
|
u32 freeListSize;
|
|
u32 aligned_size;
|
|
u32 alignment;
|
|
struct HeapFreeListElement *freeList;
|
|
struct HeapSettings settings;
|
|
|
|
freeListSize = freeListMax * 3;
|
|
alignment = ~3;
|
|
freeListSize *= 8;
|
|
aligned_size = (block->size - freeListSize) & alignment;
|
|
freeList = (struct HeapFreeListElement *)block->start;
|
|
settings.start = &((u8 *)block->start)[freeListSize];
|
|
settings.size = aligned_size;
|
|
DoInitHeap(parentHeap, &settings, freeList, freeListMax);
|
|
}
|
|
|
|
u8 xxx_memory_attr_related(u32 r0)
|
|
{
|
|
u32 temp;
|
|
u32 return_var;
|
|
if(r0 == 0)
|
|
{
|
|
return 0;
|
|
}
|
|
if((r0 & 8) != 0)
|
|
{
|
|
return 4;
|
|
}
|
|
|
|
temp = r0 & 7;
|
|
if(temp == 7)
|
|
{
|
|
return_var = 1;;
|
|
}
|
|
else if(temp == 1)
|
|
{
|
|
return_var = 2;
|
|
}
|
|
else if(temp == 3)
|
|
{
|
|
return_var = 3;
|
|
}
|
|
else
|
|
{
|
|
return_var = 5;
|
|
}
|
|
return return_var;
|
|
}
|