diff options
author | PikalaxALT <PikalaxALT@users.noreply.github.com> | 2019-08-10 05:15:50 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-08-10 05:15:50 -0400 |
commit | 9e969601456fb0ef392910d505e0e0673a902bd3 (patch) | |
tree | af8fdeb1c6cdf9cd8584f0d693a4049bfc408b9d /src/memory.c | |
parent | 250a331df9dbd312d572aaf0d629503417cfc9d4 (diff) | |
parent | ba6f243c728de5d5c024aeb177026bcc59909e2e (diff) |
Merge pull request #4 from nullableVoidPtr/master
Overhaul
Diffstat (limited to 'src/memory.c')
-rw-r--r-- | src/memory.c | 145 |
1 files changed, 145 insertions, 0 deletions
diff --git a/src/memory.c b/src/memory.c new file mode 100644 index 0000000..05c89a2 --- /dev/null +++ b/src/memory.c @@ -0,0 +1,145 @@ +#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); +} |