mirror of
https://github.com/pret/pmd-red.git
synced 2026-07-06 20:05:15 -05:00
91 lines
2.4 KiB
C
91 lines
2.4 KiB
C
#include "global.h"
|
|
#include "memory.h"
|
|
|
|
extern u32 gUnknown_80B7F14;
|
|
extern u32 gUnknown_80B7F88;
|
|
extern const char gLocateSetErrorMessage[];
|
|
extern struct HeapDescriptor gMainHeapDescriptor;
|
|
extern const char gLocalCreateErrorMessage[];
|
|
extern s32 MemorySearchFromBack(struct HeapDescriptor *heap, s32, s32);
|
|
extern s32 MemorySearchFromFront(struct HeapDescriptor *heap, s32, s32);
|
|
extern struct HeapDescriptor * _LocateSetBack(struct HeapDescriptor *, u32, u32, u32, u32);
|
|
extern struct HeapDescriptor * _LocateSetFront(struct HeapDescriptor *, u32, u32, u32, u32);
|
|
void DoFree(struct HeapDescriptor *, void *);
|
|
void *DoAlloc(struct HeapDescriptor *, s32, u32);
|
|
extern struct HeapDescriptor *DoCreateSubHeap(u32 *, u32);
|
|
|
|
void FatalError(u32 *, const char *, ...) __attribute__((noreturn));
|
|
|
|
|
|
s32 _LocateSet(struct HeapDescriptor *heap, s32 size, s32 group)
|
|
{
|
|
s32 index;
|
|
struct HeapDescriptor * uVar2;
|
|
s32 atb;
|
|
|
|
if (heap == NULL) {
|
|
heap = &gMainHeapDescriptor;
|
|
}
|
|
|
|
// Set some sort flag/attr?
|
|
atb = group >> 8 | 1;
|
|
|
|
// Reset it?
|
|
group = group & 0xff;
|
|
|
|
if ((atb & 2) != 0) {
|
|
index = MemorySearchFromFront(heap,atb,size);
|
|
if (index < 0) goto error;
|
|
uVar2 = _LocateSetFront(heap,index,atb,size,group);
|
|
return uVar2->freeCount;
|
|
}
|
|
else {
|
|
index = MemorySearchFromBack(heap,atb,size);
|
|
if (index < 0) goto error;
|
|
uVar2 = _LocateSetBack(heap,index,atb,size,group);
|
|
return uVar2->freeCount;
|
|
}
|
|
|
|
error:
|
|
// LocateSet [%p] buffer %8x size can't locate
|
|
// atb %02x grp %3d
|
|
FatalError(&gUnknown_80B7F14,
|
|
gLocateSetErrorMessage,
|
|
heap,size,atb,group);
|
|
}
|
|
|
|
void *MemoryAlloc(s32 size, s32 b)
|
|
{
|
|
DoAlloc(&gMainHeapDescriptor, size, b);
|
|
}
|
|
|
|
void MemoryFree(void *a)
|
|
{
|
|
DoFree(&gMainHeapDescriptor, a);
|
|
}
|
|
|
|
struct HeapDescriptor *MemoryLocate_LocalCreate(struct HeapDescriptor *parentHeap,u32 size,u32 param_3,u32 group)
|
|
{
|
|
int index;
|
|
struct HeapDescriptor *iVar2;
|
|
struct HeapDescriptor *iVar3;
|
|
s32 local_1c[2];
|
|
|
|
if (parentHeap == NULL) {
|
|
parentHeap = &gMainHeapDescriptor;
|
|
}
|
|
|
|
index = MemorySearchFromBack(parentHeap,9,size);
|
|
if (index < 0)
|
|
// Memroy LocalCreate buffer %08x size can't locate
|
|
FatalError(&gUnknown_80B7F88,gLocalCreateErrorMessage,size);
|
|
|
|
iVar2 = _LocateSetBack(parentHeap,index,9,size,group);
|
|
local_1c[0] = iVar2->freeCount;
|
|
local_1c[1] = iVar2->freeListLength;
|
|
|
|
iVar3 = DoCreateSubHeap(local_1c,param_3);
|
|
iVar3->parentHeap = parentHeap;
|
|
return iVar3;
|
|
}
|