mirror of
https://github.com/pret/pmd-red.git
synced 2026-04-26 00:15:48 -05:00
decompile memory.s
This commit is contained in:
parent
829585c787
commit
4b2f32bfd2
416
asm/memory.s
416
asm/memory.s
|
|
@ -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.
|
||||
|
|
@ -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;
|
||||
};
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
374
src/memory.c
374
src/memory.c
|
|
@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
|
|
|
|||
201
src/memory_mid.c
201
src/memory_mid.c
|
|
@ -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)
|
||||
{
|
||||
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user