pokeemerald/asm/malloc.s

340 lines
5.5 KiB
ArmAsm
Raw Normal View History

2016-09-02 23:11:29 -07:00
.include "asm/macros.s"
.syntax unified
.text
2015-11-29 23:17:50 -08:00
thumb_func_start PutMemBlockHeader
2016-09-02 19:51:16 -07:00
@ void PutMemBlockHeader(void *block, struct MemBlock *prev, struct MemBlock *next, u32 size)
PutMemBlockHeader: @ 8000988
2015-10-06 05:46:30 -07:00
push {r4,lr}
movs r4, 0
strh r4, [r0]
ldr r4, =0x0000a3a3
strh r4, [r0, 0x2]
str r3, [r0, 0x4]
str r1, [r0, 0x8]
str r2, [r0, 0xC]
pop {r4}
pop {r0}
bx r0
.pool
2015-11-29 23:17:50 -08:00
thumb_func_end PutMemBlockHeader
2015-10-06 05:46:30 -07:00
2015-11-29 23:17:50 -08:00
thumb_func_start PutFirstMemBlockHeader
2016-09-02 19:51:16 -07:00
@ void PutFirstMemBlockHeader(void *block, u32 size)
PutFirstMemBlockHeader: @ 80009A4
2015-10-06 05:46:30 -07:00
push {lr}
adds r2, r0, 0
adds r3, r1, 0
subs r3, 0x10
adds r1, r2, 0
2015-11-29 23:17:50 -08:00
bl PutMemBlockHeader
2015-10-06 05:46:30 -07:00
pop {r0}
bx r0
2015-11-29 23:17:50 -08:00
thumb_func_end PutFirstMemBlockHeader
2015-10-06 05:46:30 -07:00
2015-11-29 23:17:50 -08:00
thumb_func_start AllocInternal
2016-09-02 19:51:16 -07:00
@ void *AllocInternal(struct MemBlock *head, u32 size)
AllocInternal: @ 80009B8
2015-10-06 05:46:30 -07:00
push {r4-r6,lr}
adds r4, r0, 0
adds r6, r4, 0
movs r0, 0x3
ands r0, r1
cmp r0, 0
2016-01-06 20:23:20 -08:00
beq _080009CC
2015-10-06 05:46:30 -07:00
lsrs r0, r1, 2
adds r0, 0x1
lsls r1, r0, 2
2016-01-06 20:23:20 -08:00
_080009CC:
2015-10-06 05:46:30 -07:00
movs r2, 0x1
2016-01-06 20:23:20 -08:00
_080009CE:
2015-10-06 05:46:30 -07:00
ldrh r0, [r4]
cmp r0, 0
2016-01-06 20:23:20 -08:00
bne _08000A0C
2015-10-06 05:46:30 -07:00
ldr r3, [r4, 0x4]
cmp r3, r1
2016-01-06 20:23:20 -08:00
bcc _08000A0C
2015-10-06 05:46:30 -07:00
subs r0, r3, r1
cmp r0, 0x1F
2016-01-06 20:23:20 -08:00
bhi _080009E4
2015-10-06 05:46:30 -07:00
strh r2, [r4]
2016-01-06 20:23:20 -08:00
b _08000A06
_080009E4:
2015-10-06 05:46:30 -07:00
subs r3, 0x10
subs r3, r1
adds r0, r1, 0
adds r0, 0x10
adds r5, r4, r0
strh r2, [r4]
str r1, [r4, 0x4]
ldr r2, [r4, 0xC]
adds r0, r5, 0
adds r1, r4, 0
2015-11-29 23:17:50 -08:00
bl PutMemBlockHeader
2015-10-06 05:46:30 -07:00
str r5, [r4, 0xC]
ldr r0, [r5, 0xC]
cmp r0, r6
2016-01-06 20:23:20 -08:00
beq _08000A06
2015-10-06 05:46:30 -07:00
str r5, [r0, 0x8]
2016-01-06 20:23:20 -08:00
_08000A06:
2015-10-06 05:46:30 -07:00
adds r0, r4, 0
adds r0, 0x10
2016-01-06 20:23:20 -08:00
b _08000A18
_08000A0C:
2015-10-06 05:46:30 -07:00
ldr r0, [r4, 0xC]
cmp r0, r6
2016-01-06 20:23:20 -08:00
beq _08000A16
2015-10-06 05:46:30 -07:00
adds r4, r0, 0
2016-01-06 20:23:20 -08:00
b _080009CE
_08000A16:
2015-10-06 05:46:30 -07:00
movs r0, 0
2016-01-06 20:23:20 -08:00
_08000A18:
2015-10-06 05:46:30 -07:00
pop {r4-r6}
pop {r1}
bx r1
2015-11-29 23:17:50 -08:00
thumb_func_end AllocInternal
2015-10-06 05:46:30 -07:00
2015-11-29 23:17:50 -08:00
thumb_func_start FreeInternal
2016-09-02 19:51:16 -07:00
@ void FreeInternal(void *heapStart, void *pointer)
FreeInternal: @ 8000A20
2015-10-06 05:46:30 -07:00
push {r4,r5,lr}
cmp r1, 0
2016-01-06 20:23:20 -08:00
beq _08000A7C
2015-10-06 05:46:30 -07:00
adds r5, r0, 0
adds r2, r1, 0
subs r2, 0x10
movs r0, 0
strh r0, [r2]
ldr r3, [r2, 0xC]
cmp r3, r5
2016-01-06 20:23:20 -08:00
beq _08000A54
2015-10-06 05:46:30 -07:00
ldrh r4, [r3]
cmp r4, 0
2016-01-06 20:23:20 -08:00
bne _08000A54
2015-10-06 05:46:30 -07:00
ldr r0, [r2, 0x4]
adds r0, 0x10
ldr r1, [r3, 0x4]
adds r0, r1
str r0, [r2, 0x4]
strh r4, [r3, 0x2]
ldr r0, [r2, 0xC]
ldr r0, [r0, 0xC]
str r0, [r2, 0xC]
cmp r0, r5
2016-01-06 20:23:20 -08:00
beq _08000A54
2015-10-06 05:46:30 -07:00
str r2, [r0, 0x8]
2016-01-06 20:23:20 -08:00
_08000A54:
2015-10-06 05:46:30 -07:00
cmp r2, r5
2016-01-06 20:23:20 -08:00
beq _08000A7C
2015-10-06 05:46:30 -07:00
ldr r1, [r2, 0x8]
ldrh r3, [r1]
cmp r3, 0
2016-01-06 20:23:20 -08:00
bne _08000A7C
2015-10-06 05:46:30 -07:00
ldr r0, [r2, 0xC]
str r0, [r1, 0xC]
ldr r1, [r2, 0xC]
cmp r1, r5
2016-01-06 20:23:20 -08:00
beq _08000A6E
2015-10-06 05:46:30 -07:00
ldr r0, [r2, 0x8]
str r0, [r1, 0x8]
2016-01-06 20:23:20 -08:00
_08000A6E:
2015-10-06 05:46:30 -07:00
strh r3, [r2, 0x2]
ldr r0, [r2, 0x8]
ldr r1, [r0, 0x4]
adds r1, 0x10
ldr r2, [r2, 0x4]
adds r1, r2
str r1, [r0, 0x4]
2016-01-06 20:23:20 -08:00
_08000A7C:
2015-10-06 05:46:30 -07:00
pop {r4,r5}
pop {r0}
bx r0
2015-11-29 23:17:50 -08:00
thumb_func_end FreeInternal
2015-10-06 05:46:30 -07:00
2015-11-29 23:17:50 -08:00
thumb_func_start AllocZeroedInternal
2016-09-02 19:51:16 -07:00
@ void *AllocZeroedInternal(void *heapStart, u32 size)
AllocZeroedInternal: @ 8000A84
2015-10-06 05:46:30 -07:00
push {r4,r5,lr}
sub sp, 0x4
adds r4, r1, 0
2015-11-29 23:17:50 -08:00
bl AllocInternal
2015-10-06 05:46:30 -07:00
adds r5, r0, 0
cmp r5, 0
2016-01-06 20:23:20 -08:00
beq _08000AB8
2015-10-06 05:46:30 -07:00
movs r0, 0x3
ands r0, r4
cmp r0, 0
2016-01-06 20:23:20 -08:00
beq _08000AA2
2015-10-06 05:46:30 -07:00
lsrs r0, r4, 2
adds r0, 0x1
lsls r4, r0, 2
2016-01-06 20:23:20 -08:00
_08000AA2:
2015-10-06 05:46:30 -07:00
movs r0, 0
str r0, [sp]
lsls r2, r4, 9
lsrs r2, 11
movs r0, 0xA0
lsls r0, 19
orrs r2, r0
mov r0, sp
adds r1, r5, 0
bl CpuSet
2016-01-06 20:23:20 -08:00
_08000AB8:
2015-10-06 05:46:30 -07:00
adds r0, r5, 0
add sp, 0x4
pop {r4,r5}
pop {r1}
bx r1
2015-11-29 23:17:50 -08:00
thumb_func_end AllocZeroedInternal
2015-10-06 05:46:30 -07:00
2015-11-29 23:17:50 -08:00
thumb_func_start CheckMemBlockInternal
2016-09-02 19:51:16 -07:00
@ bool8 CheckMemBlockInternal(struct MemBlock *head, struct MemBlock *node)
CheckMemBlockInternal: @ 8000AC4
2015-10-06 05:46:30 -07:00
push {r4,r5,lr}
adds r5, r0, 0
adds r3, r1, 0
subs r3, 0x10
ldrh r2, [r3, 0x2]
ldr r0, =0x0000a3a3
cmp r2, r0
2016-01-06 20:23:20 -08:00
bne _08000B0A
2015-10-06 05:46:30 -07:00
ldr r0, [r3, 0xC]
ldrh r1, [r0, 0x2]
adds r4, r0, 0
cmp r1, r2
2016-01-06 20:23:20 -08:00
bne _08000B0A
2015-10-06 05:46:30 -07:00
cmp r4, r5
2016-01-06 20:23:20 -08:00
beq _08000AE8
2015-10-06 05:46:30 -07:00
ldr r0, [r4, 0x8]
cmp r0, r3
2016-01-06 20:23:20 -08:00
bne _08000B0A
_08000AE8:
2015-10-06 05:46:30 -07:00
ldr r2, [r3, 0x8]
ldrh r1, [r2, 0x2]
ldr r0, =0x0000a3a3
cmp r1, r0
2016-01-06 20:23:20 -08:00
bne _08000B0A
2015-10-06 05:46:30 -07:00
cmp r2, r5
2016-01-06 20:23:20 -08:00
beq _08000AFC
2015-10-06 05:46:30 -07:00
ldr r0, [r2, 0xC]
cmp r0, r3
2016-01-06 20:23:20 -08:00
bne _08000B0A
_08000AFC:
2015-10-06 05:46:30 -07:00
cmp r4, r5
2016-01-06 20:23:20 -08:00
beq _08000B14
2015-10-06 05:46:30 -07:00
ldr r0, [r3, 0x4]
adds r0, 0x10
adds r0, r3, r0
cmp r4, r0
2016-01-06 20:23:20 -08:00
beq _08000B14
_08000B0A:
2015-10-06 05:46:30 -07:00
movs r0, 0
2016-01-06 20:23:20 -08:00
b _08000B16
2015-10-06 05:46:30 -07:00
.pool
2016-01-06 20:23:20 -08:00
_08000B14:
2015-10-06 05:46:30 -07:00
movs r0, 0x1
2016-01-06 20:23:20 -08:00
_08000B16:
2015-10-06 05:46:30 -07:00
pop {r4,r5}
pop {r1}
bx r1
2015-11-29 23:17:50 -08:00
thumb_func_end CheckMemBlockInternal
2015-10-06 05:46:30 -07:00
2015-11-29 23:17:50 -08:00
thumb_func_start InitHeap
2016-09-02 19:51:16 -07:00
@ void InitHeap(void *heapStart, u32 heapSize)
InitHeap: @ 8000B1C
2015-10-06 05:46:30 -07:00
push {lr}
ldr r2, =0x03000004
str r0, [r2]
ldr r2, =0x03000008
str r1, [r2]
2015-11-29 23:17:50 -08:00
bl PutFirstMemBlockHeader
2015-10-06 05:46:30 -07:00
pop {r0}
bx r0
.pool
2015-11-29 23:17:50 -08:00
thumb_func_end InitHeap
2015-10-06 05:46:30 -07:00
2015-11-29 23:17:50 -08:00
thumb_func_start Alloc
2016-09-02 19:51:16 -07:00
@ void *Alloc(u32 size)
Alloc: @ 8000B38
2015-10-06 05:46:30 -07:00
push {lr}
adds r1, r0, 0
ldr r0, =0x03000004
ldr r0, [r0]
2015-11-29 23:17:50 -08:00
bl AllocInternal
2015-10-06 05:46:30 -07:00
pop {r1}
bx r1
.pool
2015-11-29 23:17:50 -08:00
thumb_func_end Alloc
2015-10-06 05:46:30 -07:00
2015-11-29 23:17:50 -08:00
thumb_func_start AllocZeroed
2016-09-02 19:51:16 -07:00
@ void *AllocZeroed(u32 size)
AllocZeroed: @ 8000B4C
2015-10-06 05:46:30 -07:00
push {lr}
adds r1, r0, 0
ldr r0, =0x03000004
ldr r0, [r0]
2015-11-29 23:17:50 -08:00
bl AllocZeroedInternal
2015-10-06 05:46:30 -07:00
pop {r1}
bx r1
.pool
2015-11-29 23:17:50 -08:00
thumb_func_end AllocZeroed
2015-10-06 05:46:30 -07:00
2015-11-29 23:17:50 -08:00
thumb_func_start Free
2016-09-02 19:51:16 -07:00
@ void Free(void *pointer)
Free: @ 8000B60
2015-10-06 05:46:30 -07:00
push {lr}
adds r1, r0, 0
ldr r0, =0x03000004
ldr r0, [r0]
2015-11-29 23:17:50 -08:00
bl FreeInternal
2015-10-06 05:46:30 -07:00
pop {r0}
bx r0
.pool
2015-11-29 23:17:50 -08:00
thumb_func_end Free
2015-10-06 05:46:30 -07:00
2015-11-29 23:17:50 -08:00
thumb_func_start CheckMemBlock
2016-09-02 19:51:16 -07:00
@ bool8 CheckMemBlock(void *pointer)
CheckMemBlock: @ 8000B74
2015-10-06 05:46:30 -07:00
push {lr}
adds r1, r0, 0
ldr r0, =0x03000004
ldr r0, [r0]
2015-11-29 23:17:50 -08:00
bl CheckMemBlockInternal
2015-10-06 05:46:30 -07:00
pop {r1}
bx r1
.pool
2015-11-29 23:17:50 -08:00
thumb_func_end CheckMemBlock
2015-10-06 05:46:30 -07:00
2015-11-29 23:17:50 -08:00
thumb_func_start CheckHeap
2016-09-02 19:51:16 -07:00
@ bool8 CheckHeap()
CheckHeap: @ 8000B88
2015-10-06 05:46:30 -07:00
push {r4,r5,lr}
ldr r0, =0x03000004
ldr r4, [r0]
adds r5, r0, 0
2016-01-06 20:23:20 -08:00
_08000B90:
2015-10-06 05:46:30 -07:00
ldr r0, [r5]
adds r1, r4, 0
adds r1, 0x10
2015-11-29 23:17:50 -08:00
bl CheckMemBlockInternal
2015-10-06 05:46:30 -07:00
cmp r0, 0
2016-01-06 20:23:20 -08:00
beq _08000BB0
2015-10-06 05:46:30 -07:00
ldr r4, [r4, 0xC]
ldr r0, [r5]
cmp r4, r0
2016-01-06 20:23:20 -08:00
bne _08000B90
2015-10-06 05:46:30 -07:00
movs r0, 0x1
2016-01-06 20:23:20 -08:00
b _08000BB2
2015-10-06 05:46:30 -07:00
.pool
2016-01-06 20:23:20 -08:00
_08000BB0:
2015-10-06 05:46:30 -07:00
movs r0, 0
2016-01-06 20:23:20 -08:00
_08000BB2:
2015-10-06 05:46:30 -07:00
pop {r4,r5}
pop {r1}
bx r1
2015-11-29 23:17:50 -08:00
thumb_func_end CheckHeap
2016-09-02 23:11:29 -07:00
.align 2, 0 @ Don't pad with nop.