diff --git a/asm/non_matching/common/zFree.inc b/asm/non_matching/common/zFree.inc deleted file mode 100644 index 7ff819a2..00000000 --- a/asm/non_matching/common/zFree.inc +++ /dev/null @@ -1,58 +0,0 @@ - .syntax unified - push {r4, r5, lr} - ldr r3, _0801DA44 @ =gzHeap - subs r1, r0, r3 - ldr r0, _0801DA48 @ =0x00000FFF - cmp r1, r0 - bhi _0801DA74 - adds r4, r3, #0 - ldrh r5, [r4] - adds r4, #2 - movs r2, #0 - cmp r2, r5 - bhs _0801DA74 - ldrh r0, [r4] - cmp r0, r1 - bne _0801DA4C - lsls r0, r5, #2 - subs r1, r3, #2 - adds r0, r0, r1 - ldrh r1, [r0] - strh r1, [r4] - strh r2, [r0] - adds r0, #2 - ldrh r1, [r0] - strh r1, [r4, #2] - strh r2, [r0] - subs r0, r5, #1 - strh r0, [r3] - b _0801DA74 - .align 2, 0 -_0801DA44: .4byte gzHeap -_0801DA48: .4byte 0x00000FFF -_0801DA4C: - adds r4, #4 - adds r2, #1 - cmp r2, r5 - bhs _0801DA74 - ldrh r0, [r4] - cmp r0, r1 - bne _0801DA4C - lsls r1, r5, #2 - ldr r3, _0801DA78 @ =gUnk_0203553E - adds r1, r1, r3 - ldrh r0, [r1] - strh r0, [r4] - movs r2, #0 - strh r2, [r1] - adds r1, #2 - ldrh r0, [r1] - strh r0, [r4, #2] - strh r2, [r1] - subs r0, r5, #1 - strh r0, [r3, #2] -_0801DA74: - pop {r4, r5, pc} - .align 2, 0 -_0801DA78: .4byte gUnk_0203553E - .syntax divided diff --git a/linker.ld b/linker.ld index b639a43c..6b46405f 100644 --- a/linker.ld +++ b/linker.ld @@ -127,7 +127,6 @@ SECTIONS { . = 0x000354B0; gUnk_020354B0 = .; . = 0x000354B4; gManagerCount = .; . = 0x000354C0; gUnk_020354C0 = .; - . = 0x0003553E; gUnk_0203553E = .; . = 0x00035540; gzHeap = .; . = 0x00035542; gUnk_02035542 = .; . = 0x00036540; gUnk_02036540 = .; diff --git a/src/common.c b/src/common.c index ee50370b..89220604 100644 --- a/src/common.c +++ b/src/common.c @@ -310,7 +310,31 @@ void sub_0801D898(void* dest, void* src, u32 word, u32 size) { ASM_FUNC("asm/non_matching/common/zMalloc.inc", void* zMalloc(u32 size)); -ASM_FUNC("asm/non_matching/common/zFree.inc", void zFree(void* ptr)); +void zFree(void* ptr) { + u32 uVar1; + u32 i; + u16* puVar3; + s32 uVar5; + u16* ptr2; + + uVar1 = (int)ptr - (int)gzHeap; + if (uVar1 < 0x1000) { + puVar3 = (u16*)gzHeap; + uVar5 = *puVar3++; + + for (i = 0; i < uVar5; puVar3 += 2, i++) { + if (*puVar3 == uVar1) { + ptr2 = &((u16*)(gzHeap - 2))[uVar5 * 2]; + *puVar3 = *ptr2; + *ptr2++ = 0; + *(puVar3 + 1) = *ptr2; + *ptr2 = 0; + *(u16*)(gzHeap) = uVar5 - 1; + break; + } + } + } +} void zMallocInit(void) { MemClear(gzHeap, sizeof(gzHeap));