decompile memory.s

This commit is contained in:
DizzyEggg 2024-12-02 12:00:19 +01:00
parent 829585c787
commit 4b2f32bfd2
5 changed files with 374 additions and 621 deletions

View File

@ -1,416 +0,0 @@
#include "asm/constants/gba_constants.inc"
#include "asm/macros.inc"
.syntax unified
.text
thumb_func_start MemorySearchFromFront
MemorySearchFromFront:
push {r4-r7,lr}
adds r5, r0, 0
adds r6, r2, 0
movs r0, 0x4
ands r0, r1
cmp r0, 0
beq _080030CC
movs r4, 0
ldr r3, [r5, 0x8]
ldr r2, [r5, 0xC]
cmp r4, r2
bge _08003104
ldr r0, [r3, 0x4]
movs r1, 0x1
ands r0, r1
cmp r0, 0
bne _08003090
ldr r0, [r3, 0x10]
cmp r0, r6
blt _080030AC
movs r0, 0
b _08003108
_08003090:
adds r4, 0x1
adds r3, 0x18
cmp r4, r2
bge _08003104
ldr r0, [r3, 0x4]
movs r1, 0x1
ands r0, r1
cmp r0, 0
bne _08003090
ldr r0, [r3, 0x10]
cmp r0, r6
blt _080030AC
_080030A8:
adds r0, r4, 0
b _08003108
_080030AC:
cmp r4, r2
bge _08003104
movs r5, 0x1
adds r1, r2, 0
_080030B4:
ldr r0, [r3, 0x4]
ands r0, r5
cmp r0, 0
bne _080030C2
ldr r0, [r3, 0x10]
cmp r0, r6
bge _080030A8
_080030C2:
adds r4, 0x1
adds r3, 0x18
cmp r4, r1
blt _080030B4
b _08003104
_080030CC:
movs r7, 0x1
negs r7, r7
ldr r1, _08003100
movs r4, 0
ldr r3, [r5, 0x8]
ldr r2, [r5, 0xC]
cmp r4, r2
bge _080030FC
movs r5, 0x1
_080030DE:
ldr r0, [r3, 0x4]
ands r0, r5
cmp r0, 0
bne _080030F4
ldr r0, [r3, 0x10]
cmp r0, r6
blt _080030F4
cmp r0, r1
bge _080030F4
adds r7, r4, 0
adds r1, r0, 0
_080030F4:
adds r4, 0x1
adds r3, 0x18
cmp r4, r2
blt _080030DE
_080030FC:
adds r0, r7, 0
b _08003108
.align 2, 0
_08003100: .4byte 0x00024001
_08003104:
movs r0, 0x1
negs r0, r0
_08003108:
pop {r4-r7}
pop {r1}
bx r1
thumb_func_end MemorySearchFromFront
thumb_func_start MemorySearchFromBack
MemorySearchFromBack:
push {r4-r7,lr}
adds r4, r0, 0
adds r5, r2, 0
movs r0, 0x4
ands r0, r1
cmp r0, 0
beq _08003168
ldr r0, [r4, 0xC]
subs r3, r0, 0x1
lsls r0, r3, 1
adds r0, r3
lsls r0, 3
ldr r1, [r4, 0x8]
adds r2, r1, r0
b _08003132
_0800312E:
subs r3, 0x1
subs r2, 0x18
_08003132:
cmp r3, 0
blt _080031A8
ldr r0, [r2, 0x4]
movs r1, 0x1
ands r0, r1
cmp r0, 0
bne _0800312E
ldr r0, [r2, 0x10]
cmp r0, r5
blt _0800314A
_08003146:
adds r0, r3, 0
b _080031AC
_0800314A:
cmp r3, 0
blt _080031A8
movs r1, 0x1
_08003150:
ldr r0, [r2, 0x4]
ands r0, r1
cmp r0, 0
bne _0800315E
ldr r0, [r2, 0x10]
cmp r0, r5
bge _08003146
_0800315E:
subs r3, 0x1
subs r2, 0x18
cmp r3, 0
bge _08003150
b _080031A8
_08003168:
movs r7, 0x1
negs r7, r7
ldr r6, =0x24001
ldr r0, [r4, 0xC]
subs r3, r0, 0x1
lsls r0, r3, 1
adds r0, r3
lsls r0, 3
ldr r1, [r4, 0x8]
adds r2, r1, r0
cmp r3, 0
blt _080031A0
movs r1, 0x1
_08003182:
ldr r0, [r2, 0x4]
ands r0, r1
cmp r0, 0
bne _08003198
ldr r0, [r2, 0x10]
cmp r0, r5
blt _08003198
cmp r0, r6
bge _08003198
adds r7, r3, 0
adds r6, r0, 0
_08003198:
subs r3, 0x1
subs r2, 0x18
cmp r3, 0
bge _08003182
_080031A0:
adds r0, r7, 0
b _080031AC
.align 2, 0
.pool
_080031A8:
movs r0, 0x1
negs r0, r0
_080031AC:
pop {r4-r7}
pop {r1}
bx r1
thumb_func_end MemorySearchFromBack
thumb_func_start _LocateSetFront
_LocateSetFront:
push {r4-r7,lr}
mov r7, r10
mov r6, r9
mov r5, r8
push {r5-r7}
sub sp, 0x14
str r0, [sp, 0x8]
str r1, [sp, 0xC]
str r2, [sp]
str r3, [sp, 0x4]
adds r0, r3, 0
adds r0, 0x3
str r0, [sp, 0x10]
movs r0, 0x4
negs r0, r0
ldr r1, [sp, 0x10]
ands r1, r0
str r1, [sp, 0x10]
ldr r2, [sp, 0xC]
lsls r2, 1
mov r12, r2
ldr r0, [sp, 0xC]
add r0, r12
lsls r0, 3
ldr r5, [sp, 0x8]
ldr r2, [r5, 0x8]
adds r4, r2, r0
ldr r0, [r4, 0x10]
cmp r0, r1
ble _08003260
ldr r3, [r5, 0xC]
lsls r0, r3, 1
adds r0, r3
lsls r0, 3
adds r1, r2, r0
mov r9, r12
mov r10, r2
mov r12, r3
ldr r6, [r5, 0x10]
mov r8, r6
ldr r7, [sp, 0xC]
cmp r12, r7
ble _08003222
_0800320A:
adds r2, r1, 0
subs r2, 0x18
adds r0, r2, 0
ldm r0!, {r5-r7}
stm r1!, {r5-r7}
ldm r0!, {r5-r7}
stm r1!, {r5-r7}
subs r3, 0x1
adds r1, r2, 0
ldr r0, [sp, 0xC]
cmp r3, r0
bgt _0800320A
_08003222:
mov r2, r12
adds r2, 0x1
ldr r1, [sp, 0x8]
str r2, [r1, 0xC]
cmp r2, r8
ble _08003240
ldr r0, =gUnknown_80B7EB8
ldr r1, =gUnknown_80B7EC4
mov r3, r8
bl FatalError
.align 2, 0
.pool
_08003240:
ldr r0, [sp, 0xC]
add r0, r9
lsls r0, 3
adds r0, 0x18
mov r2, r10
adds r1, r2, r0
ldr r0, [r1, 0xC]
ldr r5, [sp, 0x10]
adds r0, r5
str r0, [r1, 0xC]
ldr r0, [r1, 0x10]
subs r0, r5
str r0, [r1, 0x10]
str r5, [r4, 0x10]
ldr r6, [sp, 0x4]
str r6, [r4, 0x14]
_08003260:
ldr r0, [sp]
bl xxx_memory_attr_related
str r0, [r4]
ldr r7, [sp]
str r7, [r4, 0x4]
ldr r0, [sp, 0x34]
str r0, [r4, 0x8]
adds r0, r4, 0
add sp, 0x14
pop {r3-r5}
mov r8, r3
mov r9, r4
mov r10, r5
pop {r4-r7}
pop {r1}
bx r1
thumb_func_end _LocateSetFront
thumb_func_start _LocateSetBack
_LocateSetBack:
push {r4-r7,lr}
mov r7, r10
mov r6, r9
mov r5, r8
push {r5-r7}
sub sp, 0x14
str r0, [sp, 0x8]
str r1, [sp, 0xC]
str r2, [sp]
str r3, [sp, 0x4]
adds r0, r3, 0
adds r0, 0x3
str r0, [sp, 0x10]
movs r0, 0x4
negs r0, r0
ldr r1, [sp, 0x10]
ands r1, r0
str r1, [sp, 0x10]
ldr r2, [sp, 0xC]
lsls r0, r2, 1
adds r0, r2
lsls r0, 3
ldr r5, [sp, 0x8]
ldr r1, [r5, 0x8]
adds r4, r1, r0
ldr r0, [r4, 0x10]
ldr r6, [sp, 0x10]
cmp r0, r6
ble _08003328
ldr r3, [r5, 0xC]
lsls r0, r3, 1
adds r0, r3
lsls r0, 3
adds r1, r0
mov r12, r3
ldr r7, [r5, 0x10]
mov r8, r7
ldr r0, [r4, 0xC]
mov r9, r0
movs r2, 0x18
adds r2, r4
mov r10, r2
ldr r5, [sp, 0xC]
cmp r12, r5
ble _080032F6
_080032DE:
adds r2, r1, 0
subs r2, 0x18
adds r0, r2, 0
ldm r0!, {r5-r7}
stm r1!, {r5-r7}
ldm r0!, {r5-r7}
stm r1!, {r5-r7}
subs r3, 0x1
adds r1, r2, 0
ldr r6, [sp, 0xC]
cmp r3, r6
bgt _080032DE
_080032F6:
mov r2, r12
adds r2, 0x1
ldr r7, [sp, 0x8]
str r2, [r7, 0xC]
cmp r2, r8
ble _08003314
ldr r0, =gUnknown_80B7EFC
ldr r1, =gUnknown_80B7EC4
mov r3, r8
bl FatalError
.align 2, 0
.pool
_08003314:
ldr r0, [r4, 0x10]
ldr r1, [sp, 0x10]
subs r0, r1
str r0, [r4, 0x10]
add r0, r9
mov r4, r10
str r0, [r4, 0xC]
str r1, [r4, 0x10]
ldr r2, [sp, 0x4]
str r2, [r4, 0x14]
_08003328:
ldr r0, [sp]
bl xxx_memory_attr_related
str r0, [r4]
ldr r5, [sp]
str r5, [r4, 0x4]
ldr r0, [sp, 0x34]
str r0, [r4, 0x8]
adds r0, r4, 0
add sp, 0x14
pop {r3-r5}
mov r8, r3
mov r9, r4
mov r10, r5
pop {r4-r7}
pop {r1}
bx r1
thumb_func_end _LocateSetBack
.align 2, 0 @ Don't pad with nop.

View File

@ -41,7 +41,7 @@ struct HeapDescriptor
/* 0x4 */ struct HeapDescriptor *parentHeap;
/* 0x8 */ struct HeapFreeListElement *freeList;
/* 0xC */ s32 freeCount;
/* 0x10 */ u32 freeListLength;
/* 0x10 */ s32 freeListLength;
/* 0x14 */ u8 *start;
/* 0x18 */ u32 size;
};

View File

@ -52,8 +52,6 @@ SECTIONS {
src/code_8002774.o(.text);
asm/code_8002774_2.o(.text);
src/memory.o(.text);
asm/memory.o(.text);
src/memory_mid.o(.text);
asm/code_80035F0.o(.text);
src/other_random.o(.text);
src/util.o(.text);

View File

@ -34,6 +34,7 @@ void MemoryClear16(u16 *dest, s32 size)
*dest++ = 0;
}
}
void MemoryClear32(u32 *dest, s32 size)
{
CpuClear(dest, size);
@ -145,7 +146,7 @@ void InitSubHeap(struct HeapDescriptor *parentHeap, struct HeapMemoryBlock2 *blo
DoInitHeap(parentHeap, &settings, freeList, freeListMax);
}
u8 xxx_memory_attr_related(u32 r0)
u32 xxx_memory_attr_related(u32 r0)
{
u32 temp;
u32 return_var;
@ -177,3 +178,374 @@ u8 xxx_memory_attr_related(u32 r0)
}
return return_var;
}
s32 MemorySearchFromFront(struct HeapDescriptor *heap, s32 atb, s32 size)
{
s32 i;
struct HeapFreeListElement *curr;
if (atb & 4) {
i = 0;
curr = &heap->freeList[0];
for (; i < heap->freeCount; i++, curr++) {
if (!(curr->atb & 1)) {
if (curr->block.size >= size)
return i;
break;
}
}
for (; i < heap->freeCount; i++, curr++) {
if (!(curr->atb & 1)) {
if (curr->block.size >= size)
return i;
}
}
}
else {
s32 ret = -1;
s32 sizeMax = HEAP_SIZE + 1;
i = 0;
curr = &heap->freeList[0];
for (; i < heap->freeCount; i++, curr++) {
if (!(curr->atb & 1) && curr->block.size >= size && curr->block.size < sizeMax) {
ret = i;
sizeMax = curr->block.size;
}
}
return ret;
}
return -1;
}
s32 MemorySearchFromBack(struct HeapDescriptor *heap, s32 atb, s32 size)
{
s32 i;
struct HeapFreeListElement *curr;
if (atb & 4) {
i = heap->freeCount - 1;
curr = &heap->freeList[i];
for (; i >= 0; i--, curr--) {
if (!(curr->atb & 1)) {
if (curr->block.size >= size)
return i;
break;
}
}
for (; i >= 0; i--, curr--) {
if (!(curr->atb & 1)) {
if (curr->block.size >= size)
return i;
}
}
}
else {
s32 ret = -1;
s32 sizeMax = HEAP_SIZE + 1;
i = heap->freeCount - 1;
curr = &heap->freeList[i];
for (; i >= 0; i--, curr--) {
if (!(curr->atb & 1) && curr->block.size >= size && curr->block.size < sizeMax) {
ret = i;
sizeMax = curr->block.size;
}
}
return ret;
}
return -1;
}
// Todo: fix fatal error and struct unkMemoryStruct2 *
void FatalError(const void *, const char *, ...) __attribute__((noreturn));
extern const char *const gUnknown_80B7EB8;
extern const char *const gUnknown_80B7EFC;
extern const char gUnknown_80B7EC4[];
struct unkMemoryStruct2 * _LocateSetFront(struct HeapDescriptor *heap, s32 index, s32 atb, s32 size, s32 group)
{
s32 i;
struct HeapFreeListElement *curr;
struct HeapFreeListElement *block;
s32 sizeAligned;
sizeAligned = size + 3;
sizeAligned &= ~(3);
curr = &heap->freeList[index];
if (curr->block.size > sizeAligned) {
i = heap->freeCount;
block = &heap->freeList[heap->freeCount];
for (; i > index; i--, block--) {
block[0] = block[-1];
}
heap->freeCount++;
if (heap->freeCount > heap->freeListLength) {
// ../system/memory_locate.c
// Memory Locate sprit max over [%3d/%3d]
FatalError(&gUnknown_80B7EB8, gUnknown_80B7EC4, heap->freeCount, heap->freeListLength);
}
block = &heap->freeList[index + 1];
block->block.start += sizeAligned;
block->block.size -= sizeAligned;
curr->block.size = sizeAligned;
curr->block.allocatedSize = size;
}
curr->unk_atb = xxx_memory_attr_related(atb);
curr->atb = atb;
curr->grp = group;
return (void*) curr;
}
struct unkMemoryStruct2 * _LocateSetBack(struct HeapDescriptor *heap, s32 index, s32 atb, s32 size, s32 group)
{
s32 i;
struct HeapFreeListElement *curr;
struct HeapFreeListElement *block;
s32 sizeAligned;
u8 *newBlockStart;
sizeAligned = size + 3;
sizeAligned &= ~(3);
curr = &heap->freeList[index];
if (curr->block.size > sizeAligned) {
i = heap->freeCount;
block = &heap->freeList[heap->freeCount];
for (; i > index; i--, block--) {
block[0] = block[-1];
}
heap->freeCount++;
if (heap->freeCount > heap->freeListLength) {
// ../system/memory_locate.c
// Memory Locate sprit max over [%3d/%3d]
FatalError(&gUnknown_80B7EFC, gUnknown_80B7EC4, heap->freeCount, heap->freeListLength);
}
curr->block.size -= sizeAligned;
newBlockStart = curr->block.size + curr->block.start;
curr++;
curr->block.start = newBlockStart;
curr->block.size = sizeAligned;
curr->block.allocatedSize = size;
}
curr->unk_atb = xxx_memory_attr_related(atb);
curr->atb = atb;
curr->grp = group;
return (void*) curr;
}
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);
void DoFree(struct HeapDescriptor *, void *);
void *DoAlloc(struct HeapDescriptor *, s32, u32);
struct HeapDescriptor* _LocateSet(struct HeapDescriptor *heap, s32 size, s32 group)
{
s32 index;
struct unkMemoryStruct2 * 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->unkC;
}
else {
index = MemorySearchFromBack(heap,atb,size);
if (index < 0) goto error;
uVar2 = _LocateSetBack(heap,index,atb,size,group);
return uVar2->unkC;
}
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 group)
{
DoAlloc(&gMainHeapDescriptor, size, group);
}
void MemoryFree(void *a)
{
DoFree(&gMainHeapDescriptor, a);
}
struct HeapDescriptor *MemoryLocate_LocalCreate(struct HeapDescriptor *parentHeap,u32 size,u32 param_3,u32 group)
{
int index;
struct unkMemoryStruct2 *iVar2;
struct HeapDescriptor *iVar3;
struct unkMemoryStruct local_1c;
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.unk0 = iVar2->unkC;
local_1c.end = iVar2->end;
iVar3 = DoCreateSubHeap(&local_1c,param_3);
iVar3->parentHeap = parentHeap;
return iVar3;
}
struct HeapDescriptor *DoCreateSubHeap(struct unkMemoryStruct *a, u32 b)
{
struct HeapMemoryBlock2 s2;
struct HeapDescriptor *a1;
u32 end;
a1 = a->unk0;
s2.start = (struct HeapFreeListElement *)((u8*)a1 + sizeof(struct HeapDescriptor));
end = a->end;
s2.size = end - sizeof(struct HeapDescriptor);
InitSubHeap(a1, &s2, b);
return a1;
}
void xxx_unused_memory_free(struct HeapDescriptor *a1)
{
bool8 b;
s32 i;
bool8 temp;
if (a1 == NULL)
return;
b = FALSE;
if (a1->freeCount == 1 && a1->freeList->atb == 0)
b = TRUE;
if (b) {
temp = FALSE;
i = 0;
for (; i < gHeapCount; i++) {
if (gHeapDescriptorList[i] == a1) {
gHeapCount--;
for (; i < gHeapCount; i++) {
gHeapDescriptorList[i] = gHeapDescriptorList[i + 1];
}
temp = TRUE;
break;
}
}
if (temp && a1->parentHeap != NULL)
DoFree(a1->parentHeap, a1);
}
}
void *DoAlloc(struct HeapDescriptor *heap, s32 size, u32 a2)
{
return _LocateSet(heap, size, a2 | 0x100);
}
void DoFree(struct HeapDescriptor *heapDescriptior, void *ptrToFree)
{
struct HeapFreeListElement *curr;
struct HeapFreeListElement *next;
struct HeapFreeListElement *prev;
s32 i;
if (heapDescriptior == NULL)
heapDescriptior = &gMainHeapDescriptor;
if (ptrToFree == NULL)
return;
i = 0;
curr = &heapDescriptior->freeList[0];
for (; i < heapDescriptior->freeCount; i++, curr++) {
if (curr->block.start == (u8 *)ptrToFree) {
curr->unk_atb = 0;
curr->atb = 0;
curr->block.allocatedSize = 0;
curr->grp = 0;
if (i < heapDescriptior->freeCount - 1) {
s32 j;
next = curr + 1;
if (next->atb == 0) {
curr->block.size += next->block.size;
heapDescriptior->freeCount--;
for (j = i + 1; j < heapDescriptior->freeCount; j++, next++)
next[0] = next[1];
}
}
if (i >= 1) {
s32 j;
prev = curr - 1;
if (prev->atb == 0) {
prev->block.size += curr->block.size;
heapDescriptior->freeCount--;
prev = curr;
for (j = i; j < heapDescriptior->freeCount; j++, prev++)
prev[0] = prev[1];
}
}
break;
}
}
}
void nullsub_141(void)
{
}
void nullsub_142(void)
{
}

View File

@ -1,201 +0,0 @@
#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 unkMemoryStruct2 * _LocateSetBack(struct HeapDescriptor *, u32, u32, u32, u32);
extern struct unkMemoryStruct2 * _LocateSetFront(struct HeapDescriptor *, u32, u32, u32, u32);
void DoFree(struct HeapDescriptor *, void *);
void *DoAlloc(struct HeapDescriptor *, s32, u32);
void FatalError(u32 *, const char *, ...) __attribute__((noreturn));
struct HeapDescriptor* _LocateSet(struct HeapDescriptor *heap, s32 size, s32 group)
{
s32 index;
struct unkMemoryStruct2 * 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->unkC;
}
else {
index = MemorySearchFromBack(heap,atb,size);
if (index < 0) goto error;
uVar2 = _LocateSetBack(heap,index,atb,size,group);
return uVar2->unkC;
}
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 group)
{
DoAlloc(&gMainHeapDescriptor, size, group);
}
void MemoryFree(void *a)
{
DoFree(&gMainHeapDescriptor, a);
}
struct HeapDescriptor *MemoryLocate_LocalCreate(struct HeapDescriptor *parentHeap,u32 size,u32 param_3,u32 group)
{
int index;
struct unkMemoryStruct2 *iVar2;
struct HeapDescriptor *iVar3;
struct unkMemoryStruct local_1c;
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.unk0 = iVar2->unkC;
local_1c.end = iVar2->end;
iVar3 = DoCreateSubHeap(&local_1c,param_3);
iVar3->parentHeap = parentHeap;
return iVar3;
}
struct HeapDescriptor *DoCreateSubHeap(struct unkMemoryStruct *a, u32 b)
{
struct HeapMemoryBlock2 s2;
struct HeapDescriptor *a1;
u32 end;
a1 = a->unk0;
s2.start = (struct HeapFreeListElement *)((u8*)a1 + sizeof(struct HeapDescriptor));
end = a->end;
s2.size = end - sizeof(struct HeapDescriptor);
InitSubHeap(a1, &s2, b);
return a1;
}
void xxx_unused_memory_free(struct HeapDescriptor *a1)
{
bool8 b;
s32 i;
bool8 temp;
if (a1 == NULL)
return;
b = FALSE;
if (a1->freeCount == 1 && a1->freeList->atb == 0)
b = TRUE;
if (b) {
temp = FALSE;
i = 0;
for (; i < gHeapCount; i++) {
if (gHeapDescriptorList[i] == a1) {
gHeapCount--;
for (; i < gHeapCount; i++) {
gHeapDescriptorList[i] = gHeapDescriptorList[i + 1];
}
temp = TRUE;
break;
}
}
if (temp && a1->parentHeap != NULL)
DoFree(a1->parentHeap, a1);
}
}
void *DoAlloc(struct HeapDescriptor *heap, s32 size, u32 a2)
{
return _LocateSet(heap, size, a2 | 0x100);
}
void DoFree(struct HeapDescriptor *heapDescriptior, void *ptrToFree)
{
struct HeapFreeListElement *curr;
struct HeapFreeListElement *next;
struct HeapFreeListElement *prev;
s32 i;
if (heapDescriptior == NULL)
heapDescriptior = &gMainHeapDescriptor;
if (ptrToFree == NULL)
return;
i = 0;
curr = &heapDescriptior->freeList[0];
for (; i < heapDescriptior->freeCount; i++, curr++) {
if (curr->block.start == (u8 *)ptrToFree) {
curr->unk_atb = 0;
curr->atb = 0;
curr->block.allocatedSize = 0;
curr->grp = 0;
if (i < heapDescriptior->freeCount - 1) {
s32 j;
next = curr + 1;
if (next->atb == 0) {
curr->block.size += next->block.size;
heapDescriptior->freeCount--;
for (j = i + 1; j < heapDescriptior->freeCount; j++, next++)
next[0] = next[1];
}
}
if (i >= 1) {
s32 j;
prev = curr - 1;
if (prev->atb == 0) {
prev->block.size += curr->block.size;
heapDescriptior->freeCount--;
prev = curr;
for (j = i; j < heapDescriptior->freeCount; j++, prev++)
prev[0] = prev[1];
}
}
break;
}
}
}
void nullsub_141(void)
{
}
void nullsub_142(void)
{
}