diff options
Diffstat (limited to 'asm/memory_1.s')
-rw-r--r-- | asm/memory_1.s | 274 |
1 files changed, 274 insertions, 0 deletions
diff --git a/asm/memory_1.s b/asm/memory_1.s new file mode 100644 index 0000000..d9f1362 --- /dev/null +++ b/asm/memory_1.s @@ -0,0 +1,274 @@ + .include "constants/gba_constants.inc" + .include "asm/macros.inc" + + .syntax unified + + .text + + thumb_func_start MemoryLocate_LocalCreate +MemoryLocate_LocalCreate: + push {r4-r7,lr} + sub sp, 0xC + adds r4, r0, 0 + adds r5, r1, 0 + adds r7, r2, 0 + adds r6, r3, 0 + cmp r4, 0 + bne _08003412 + ldr r4, =gMainHeapDescriptor +_08003412: + adds r0, r4, 0 + movs r1, 0x9 + adds r2, r5, 0 + bl MemorySearchFromBack + adds r1, r0, 0 + cmp r1, 0 + bge _08003438 + ldr r0, =gUnknown_80B7F88 + ldr r1, =gUnknown_80B7F94 + adds r2, r5, 0 + bl FatalError + .align 2, 0 + .pool +_08003438: + str r6, [sp] + adds r0, r4, 0 + movs r2, 0x9 + adds r3, r5, 0 + bl _LocateSetBack + ldr r1, [r0, 0xC] + str r1, [sp, 0x4] + ldr r0, [r0, 0x10] + str r0, [sp, 0x8] + add r0, sp, 0x4 + adds r1, r7, 0 + bl DoCreateSubHeap + str r4, [r0, 0x4] + add sp, 0xC + pop {r4-r7} + pop {r1} + bx r1 + thumb_func_end MemoryLocate_LocalCreate + + thumb_func_start DoCreateSubHeap +DoCreateSubHeap: + push {r4,lr} + sub sp, 0x8 + adds r2, r1, 0 + ldr r4, [r0] + adds r1, r4, 0 + adds r1, 0x1C + str r1, [sp] + ldr r0, [r0, 0x4] + subs r0, 0x1C + str r0, [sp, 0x4] + adds r0, r4, 0 + mov r1, sp + bl InitSubHeap + adds r0, r4, 0 + add sp, 0x8 + pop {r4} + pop {r1} + bx r1 + thumb_func_end DoCreateSubHeap + + thumb_func_start xxx_unused_memory_free +xxx_unused_memory_free: + push {r4-r7,lr} + adds r4, r0, 0 + cmp r4, 0 + beq _08003504 + movs r1, 0 + ldr r0, [r4, 0xC] + cmp r0, 0x1 + bne _080034A2 + ldr r0, [r4, 0x8] + ldr r0, [r0, 0x4] + cmp r0, 0 + bne _080034A2 + movs r1, 0x1 +_080034A2: + cmp r1, 0 + beq _08003504 + movs r0, 0 + mov r12, r0 + movs r3, 0 + ldr r6, =gHeapCount + ldr r0, [r6] + cmp r12, r0 + bge _080034F2 + ldr r5, =gHeapDescriptorList + adds r1, r6, 0 + adds r7, r5, 0 + movs r2, 0 +_080034BC: + adds r0, r2, r5 + ldr r0, [r0] + cmp r0, r4 + bne _080034E8 + ldr r0, [r1] + subs r0, 0x1 + str r0, [r1] + cmp r3, r0 + bge _080034F8 + ldr r1, =gHeapCount + adds r2, r7 +_080034D2: + ldr r0, [r2, 0x4] + stm r2!, {r0} + adds r3, 0x1 + ldr r0, [r1] + cmp r3, r0 + blt _080034D2 + b _080034F8 + .align 2, 0 + .pool +_080034E8: + adds r2, 0x4 + adds r3, 0x1 + ldr r0, [r6] + cmp r3, r0 + blt _080034BC +_080034F2: + mov r0, r12 + cmp r0, 0 + beq _08003504 +_080034F8: + ldr r0, [r4, 0x4] + cmp r0, 0 + beq _08003504 + adds r1, r4, 0 + bl DoFree +_08003504: + pop {r4-r7} + pop {r0} + bx r0 + thumb_func_end xxx_unused_memory_free + + thumb_func_start DoAlloc +DoAlloc: + push {lr} + movs r3, 0x80 + lsls r3, 1 + orrs r3, r2 + adds r2, r3, 0 + bl _LocateSet + pop {r1} + bx r1 + thumb_func_end DoAlloc + + thumb_func_start DoFree +DoFree: + push {r4-r7,lr} + mov r7, r8 + push {r7} + adds r4, r0, 0 + cmp r4, 0 + bne _0800352E + ldr r4, =gMainHeapDescriptor +_0800352E: + cmp r1, 0 + beq _080035E4 + movs r0, 0 + mov r8, r0 + ldr r3, [r4, 0x8] + mov r12, r3 + ldr r3, [r4, 0xC] + cmp r8, r3 + bge _080035E4 + movs r2, 0 +_08003542: + mov r5, r12 + ldr r0, [r5, 0xC] + cmp r0, r1 + bne _080035D8 + str r2, [r5] + str r2, [r5, 0x4] + str r2, [r5, 0x14] + str r2, [r5, 0x8] + ldr r0, [r4, 0xC] + subs r0, 0x1 + cmp r8, r0 + bge _08003592 + mov r2, r12 + adds r2, 0x18 + ldr r0, [r2, 0x4] + cmp r0, 0 + bne _08003592 + ldr r0, [r5, 0x10] + ldr r1, [r2, 0x10] + adds r0, r1 + str r0, [r5, 0x10] + ldr r0, [r4, 0xC] + subs r0, 0x1 + str r0, [r4, 0xC] + mov r3, r8 + adds r3, 0x1 + cmp r3, r0 + bge _08003592 +_0800357A: + adds r0, r2, 0 + adds r1, r2, 0 + adds r1, 0x18 + ldm r1!, {r5-r7} + stm r0!, {r5-r7} + ldm r1!, {r5-r7} + stm r0!, {r5-r7} + adds r3, 0x1 + adds r2, 0x18 + ldr r0, [r4, 0xC] + cmp r3, r0 + blt _0800357A +_08003592: + mov r6, r8 + cmp r6, 0 + ble _080035E4 + mov r2, r12 + subs r2, 0x18 + ldr r0, [r2, 0x4] + cmp r0, 0 + bne _080035E4 + ldr r0, [r2, 0x10] + mov r7, r12 + ldr r1, [r7, 0x10] + adds r0, r1 + str r0, [r2, 0x10] + ldr r0, [r4, 0xC] + subs r0, 0x1 + str r0, [r4, 0xC] + mov r2, r12 + mov r3, r8 + cmp r3, r0 + bge _080035E4 +_080035BA: + adds r0, r2, 0 + adds r1, r2, 0 + adds r1, 0x18 + ldm r1!, {r5-r7} + stm r0!, {r5-r7} + ldm r1!, {r5-r7} + stm r0!, {r5-r7} + adds r3, 0x1 + adds r2, 0x18 + ldr r0, [r4, 0xC] + cmp r3, r0 + blt _080035BA + b _080035E4 + .align 2, 0 + .pool +_080035D8: + movs r0, 0x1 + add r8, r0 + movs r5, 0x18 + add r12, r5 + cmp r8, r3 + blt _08003542 +_080035E4: + pop {r3} + mov r8, r3 + pop {r4-r7} + pop {r0} + bx r0 + thumb_func_end DoFree + + .align 2,0 |