diff options
Diffstat (limited to 'asm/memory.s')
-rw-r--r-- | asm/memory.s | 1075 |
1 files changed, 1075 insertions, 0 deletions
diff --git a/asm/memory.s b/asm/memory.s new file mode 100644 index 0000000..88b3faa --- /dev/null +++ b/asm/memory.s @@ -0,0 +1,1075 @@ + .include "constants/gba_constants.inc" + .include "asm/macros.inc" + + .syntax unified + + .text + + thumb_func_start InitHeap +InitHeap: + push {lr} + bl InitHeapInternal + pop {r0} + bx r0 + thumb_func_end InitHeap + + thumb_func_start MemoryClear8 +MemoryClear8: + push {lr} + cmp r1, 0 + ble _08002EAA + movs r2, 0 +_08002EA0: + subs r1, 0x1 + strb r2, [r0] + adds r0, 0x1 + cmp r1, 0 + bgt _08002EA0 +_08002EAA: + pop {r0} + bx r0 + thumb_func_end MemoryClear8 + + thumb_func_start MemoryClear16 +MemoryClear16: + push {lr} + cmp r1, 0 + ble _08002EC2 + movs r2, 0 +_08002EB8: + subs r1, 0x2 + strh r2, [r0] + adds r0, 0x2 + cmp r1, 0 + bgt _08002EB8 +_08002EC2: + pop {r0} + bx r0 + thumb_func_end MemoryClear16 + + thumb_func_start MemoryClear32 +MemoryClear32: + push {lr} + bl CpuClear + pop {r0} + bx r0 + thumb_func_end MemoryClear32 + + thumb_func_start MemoryFill8 +MemoryFill8: + push {lr} + lsls r1, 24 + lsrs r1, 24 + cmp r2, 0 + ble _08002EE8 +_08002EDE: + subs r2, 0x1 + strb r1, [r0] + adds r0, 0x1 + cmp r2, 0 + bgt _08002EDE +_08002EE8: + pop {r0} + bx r0 + thumb_func_end MemoryFill8 + + thumb_func_start MemoryFill16 +MemoryFill16: + push {lr} + lsls r1, 16 + lsrs r1, 16 + cmp r2, 0 + ble _08002F00 +_08002EF6: + subs r2, 0x2 + strh r1, [r0] + adds r0, 0x2 + cmp r2, 0 + bgt _08002EF6 +_08002F00: + pop {r0} + bx r0 + thumb_func_end MemoryFill16 + + thumb_func_start MemoryFill32 +MemoryFill32: + push {lr} + cmp r2, 0 + ble _08002F12 +_08002F0A: + subs r2, 0x4 + stm r0!, {r1} + cmp r2, 0 + bgt _08002F0A +_08002F12: + pop {r0} + bx r0 + thumb_func_end MemoryFill32 + + thumb_func_start MemoryCopy8 +MemoryCopy8: + push {lr} + adds r3, r0, 0 + cmp r2, 0 + ble _08002F2E +_08002F20: + subs r2, 0x1 + ldrb r0, [r1] + strb r0, [r3] + adds r1, 0x1 + adds r3, 0x1 + cmp r2, 0 + bgt _08002F20 +_08002F2E: + pop {r0} + bx r0 + thumb_func_end MemoryCopy8 + + thumb_func_start MemoryCopy16 +MemoryCopy16: + push {lr} + adds r3, r0, 0 + cmp r2, 0 + ble _08002F4A +_08002F3C: + subs r2, 0x2 + ldrh r0, [r1] + strh r0, [r3] + adds r1, 0x2 + adds r3, 0x2 + cmp r2, 0 + bgt _08002F3C +_08002F4A: + pop {r0} + bx r0 + thumb_func_end MemoryCopy16 + + thumb_func_start MemoryCopy32 +MemoryCopy32: + push {lr} + adds r3, r0, 0 + cmp r2, 0 + ble _08002F62 +_08002F58: + subs r2, 0x4 + ldm r1!, {r0} + stm r3!, {r0} + cmp r2, 0 + bgt _08002F58 +_08002F62: + pop {r0} + bx r0 + thumb_func_end MemoryCopy32 + + thumb_func_start InitHeapInternal +InitHeapInternal: + push {lr} + sub sp, 0x8 + ldr r0, _08002F90 + str r0, [sp] + movs r0, 0x90 + lsls r0, 10 + str r0, [sp, 0x4] + ldr r1, _08002F94 + movs r0, 0 + str r0, [r1] + ldr r0, _08002F98 + ldr r2, _08002F9C + mov r1, sp + movs r3, 0x20 + bl DoInitHeap + add sp, 0x8 + pop {r0} + bx r0 + .align 2, 0 +_08002F90: .4byte gUnknown_20011D0 +_08002F94: .4byte gUnknown_2000EA8 +_08002F98: .4byte gUnknown_2000EB0 +_08002F9C: .4byte gUnknown_2000ED0 + thumb_func_end InitHeapInternal + + thumb_func_start DoInitHeap +DoInitHeap: + push {r4-r6,lr} + mov r6, r9 + mov r5, r8 + push {r5,r6} + ldr r4, [r1, 0x4] + mov r9, r4 + movs r4, 0x4 + negs r4, r4 + mov r5, r9 + ands r5, r4 + mov r9, r5 + ldr r6, _08002FFC + ldr r4, _08003000 + mov r8, r4 + ldr r5, [r4] + lsls r4, r5, 2 + adds r4, r6 + str r0, [r4] + adds r5, 0x1 + mov r4, r8 + str r5, [r4] + ldr r5, [r1] + str r5, [r0, 0x14] + mov r1, r9 + str r1, [r0, 0x18] + movs r1, 0x2 + str r1, [r0] + movs r4, 0 + str r4, [r0, 0x4] + str r2, [r0, 0x8] + movs r1, 0x1 + str r1, [r0, 0xC] + str r3, [r0, 0x10] + str r4, [r2] + str r4, [r2, 0x4] + str r5, [r2, 0xC] + mov r5, r9 + str r5, [r2, 0x10] + str r4, [r2, 0x14] + str r4, [r2, 0x8] + pop {r3,r4} + mov r8, r3 + mov r9, r4 + pop {r4-r6} + pop {r0} + bx r0 + .align 2, 0 +_08002FFC: .4byte gUnknown_2000E88 +_08003000: .4byte gUnknown_2000EA8 + thumb_func_end DoInitHeap + + thumb_func_start InitSubHeap +InitSubHeap: + push {r4,r5,lr} + sub sp, 0x8 + adds r3, r2, 0 + lsls r4, r3, 1 + adds r4, r3 + movs r2, 0x4 + negs r2, r2 + lsls r4, 3 + ldr r5, [r1, 0x4] + subs r5, r4 + ands r5, r2 + ldr r2, [r1] + adds r4, r2, r4 + str r4, [sp] + str r5, [sp, 0x4] + mov r1, sp + bl DoInitHeap + add sp, 0x8 + pop {r4,r5} + pop {r0} + bx r0 + thumb_func_end InitSubHeap + + thumb_func_start xxx_memory_attr_related +xxx_memory_attr_related: + push {lr} + adds r1, r0, 0 + cmp r1, 0 + bne _0800303C + movs r0, 0 + b _08003060 +_0800303C: + movs r0, 0x8 + ands r0, r1 + cmp r0, 0 + beq _08003048 + movs r0, 0x4 + b _08003060 +_08003048: + movs r2, 0x7 + ands r2, r1 + movs r0, 0x1 + cmp r2, 0x7 + beq _08003060 + movs r0, 0x2 + cmp r2, 0x1 + beq _08003060 + movs r0, 0x5 + cmp r2, 0x3 + bne _08003060 + movs r0, 0x3 +_08003060: + pop {r1} + bx r1 + thumb_func_end xxx_memory_attr_related + + 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, _080031A4 + 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 +_080031A4: .4byte 0x00024001 +_080031A8: + movs r0, 0x1 + negs r0, r0 +_080031AC: + pop {r4-r7} + pop {r1} + bx r1 + thumb_func_end MemorySearchFromBack + + thumb_func_start MemorySplitFront +MemorySplitFront: + 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, _08003238 + ldr r1, _0800323C + mov r3, r8 + bl FatalError + .align 2, 0 +_08003238: .4byte gUnknown_80B7EB8 +_0800323C: .4byte gUnknown_80B7EC4 +_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 MemorySplitFront + + thumb_func_start MemorySplitBack +MemorySplitBack: + 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, _0800330C + ldr r1, _08003310 + mov r3, r8 + bl FatalError + .align 2, 0 +_0800330C: .4byte gUnknown_80B7EFC +_08003310: .4byte gUnknown_80B7EC4 +_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 MemorySplitBack + + thumb_func_start MemoryLocateSet +MemoryLocateSet: + push {r4-r7,lr} + sub sp, 0x8 + adds r5, r0, 0 + adds r7, r1, 0 + adds r6, r2, 0 + cmp r5, 0 + bne _0800335C + ldr r5, _08003390 +_0800335C: + asrs r4, r6, 8 + movs r0, 0x1 + orrs r4, r0 + movs r0, 0xFF + ands r6, r0 + movs r0, 0x2 + ands r0, r4 + cmp r0, 0 + beq _08003394 + adds r0, r5, 0 + adds r1, r4, 0 + adds r2, r7, 0 + bl MemorySearchFromFront + adds r1, r0, 0 + cmp r1, 0 + blt _080033B4 + str r6, [sp] + adds r0, r5, 0 + adds r2, r4, 0 + adds r3, r7, 0 + bl MemorySplitFront + ldr r0, [r0, 0xC] + b _080033CC + .align 2, 0 +_08003390: .4byte gUnknown_2000EB0 +_08003394: + adds r0, r5, 0 + adds r1, r4, 0 + adds r2, r7, 0 + bl MemorySearchFromBack + adds r1, r0, 0 + cmp r1, 0 + blt _080033B4 + str r6, [sp] + adds r0, r5, 0 + adds r2, r4, 0 + adds r3, r7, 0 + bl MemorySplitBack + ldr r0, [r0, 0xC] + b _080033CC +_080033B4: + ldr r0, _080033C4 + ldr r1, _080033C8 + str r4, [sp] + str r6, [sp, 0x4] + adds r2, r5, 0 + adds r3, r7, 0 + bl FatalError + .align 2, 0 +_080033C4: .4byte gUnknown_80B7F14 +_080033C8: .4byte gUnknown_80B7F20 +_080033CC: + add sp, 0x8 + pop {r4-r7} + pop {r1} + bx r1 + thumb_func_end MemoryLocateSet + + thumb_func_start MemoryAlloc +MemoryAlloc: + push {lr} + adds r3, r0, 0 + adds r2, r1, 0 + ldr r0, _080033E8 + adds r1, r3, 0 + bl DoAlloc + pop {r1} + bx r1 + .align 2, 0 +_080033E8: .4byte gUnknown_2000EB0 + thumb_func_end MemoryAlloc + + thumb_func_start MemoryFree +MemoryFree: + push {lr} + adds r1, r0, 0 + ldr r0, _080033FC + bl DoFree + pop {r0} + bx r0 + .align 2, 0 +_080033FC: .4byte gUnknown_2000EB0 + thumb_func_end MemoryFree + + thumb_func_start CreateSubHeap +CreateSubHeap: + 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, _0800342C +_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, _08003430 + ldr r1, _08003434 + adds r2, r5, 0 + bl FatalError + .align 2, 0 +_0800342C: .4byte gUnknown_2000EB0 +_08003430: .4byte gUnknown_80B7F88 +_08003434: .4byte gUnknown_80B7F94 +_08003438: + str r6, [sp] + adds r0, r4, 0 + movs r2, 0x9 + adds r3, r5, 0 + bl MemorySplitBack + 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 CreateSubHeap + + 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, _080034E0 + ldr r0, [r6] + cmp r12, r0 + bge _080034F2 + ldr r5, _080034E4 + 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, _080034E0 + 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 +_080034E0: .4byte gUnknown_2000EA8 +_080034E4: .4byte gUnknown_2000E88 +_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 MemoryLocateSet + 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, _080035D4 +_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 +_080035D4: .4byte gUnknown_2000EB0 +_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 @ Don't pad with nop. |