From db7cbefcdf746fbc34179f33c0930ebd07ee6f0a Mon Sep 17 00:00:00 2001 From: PikalaxALT Date: Thu, 19 Aug 2021 19:51:52 -0400 Subject: NNS_FND_expheap, 1 --- arm9/arm9.lsf | 1 + arm9/asm/NNS_FND_expheap.s | 583 --------------------------- arm9/asm/NNS_FND_expheap_s.s | 526 ++++++++++++++++++++++++ arm9/lib/libnns/include/NNS_FND_heapcommon.h | 64 +++ arm9/lib/libnns/src/NNS_FND_expheap.c | 92 +++++ arm9/lib/libnns/src/NNS_FND_heapcommon.c | 8 +- 6 files changed, 684 insertions(+), 590 deletions(-) delete mode 100644 arm9/asm/NNS_FND_expheap.s create mode 100644 arm9/asm/NNS_FND_expheap_s.s create mode 100644 arm9/lib/libnns/src/NNS_FND_expheap.c (limited to 'arm9') diff --git a/arm9/arm9.lsf b/arm9/arm9.lsf index 8287f133..74e31f79 100644 --- a/arm9/arm9.lsf +++ b/arm9/arm9.lsf @@ -358,6 +358,7 @@ Static arm9 ### Nitro System SDK ### Object NNS_FND_list.o Object NNS_FND_heapcommon.o + Object NNS_FND_expheap_s.o Object NNS_FND_expheap.o Object NNS_FND_frameheap.o Object NNS_FND_allocator.o diff --git a/arm9/asm/NNS_FND_expheap.s b/arm9/asm/NNS_FND_expheap.s deleted file mode 100644 index e94dba38..00000000 --- a/arm9/asm/NNS_FND_expheap.s +++ /dev/null @@ -1,583 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - .extern NNSi_FndInitHeapHead - .extern NNSi_FndFinalizeHeap - .text - - arm_func_start NNS_FndGetSizeForMBlockExpHeap -NNS_FndGetSizeForMBlockExpHeap: ; 0x020ADDC0 - ldr r0, [r0, #-0xc] - bx lr - arm_func_end NNS_FndGetSizeForMBlockExpHeap - - arm_func_start NNS_FndGetTotalFreeSizeForExpHeap -NNS_FndGetTotalFreeSizeForExpHeap: ; 0x020ADDC8 - ldr r2, [r0, #0x24] - mov r0, #0x0 - cmp r2, #0x0 - bxeq lr -_020ADDD8: - ldr r1, [r2, #0x4] - ldr r2, [r2, #0xc] - add r0, r0, r1 - cmp r2, #0x0 - bne _020ADDD8 - bx lr - arm_func_end NNS_FndGetTotalFreeSizeForExpHeap - - arm_func_start NNS_FndFreeToExpHeap -NNS_FndFreeToExpHeap: ; 0x020ADDF0 - stmdb sp!, {r4-r5,lr} - sub sp, sp, #0xc - sub r4, r1, #0x10 - add r5, r0, #0x24 - add r0, sp, #0x0 - mov r1, r4 - bl GetRegionOfMBlock - mov r1, r4 - add r0, r5, #0x8 - bl RemoveMBlock - add r1, sp, #0x0 - mov r0, r5 - bl RecycleRegion - add sp, sp, #0xc - ldmia sp!, {r4-r5,pc} - arm_func_end NNS_FndFreeToExpHeap - - arm_func_start NNS_FndResizeForMBlockExpHeap -NNS_FndResizeForMBlockExpHeap: ; 0x020ADE2C - stmdb sp!, {r4-r10,lr} - sub sp, sp, #0x10 - mov r4, r1 - mov r10, r2 - sub r6, r4, #0x10 - add r1, r10, #0x3 - mov r5, r0 - ldr r8, [r6, #0x4] - bic r10, r1, #0x3 - cmp r10, r8 - add r7, r5, #0x24 - addeq sp, sp, #0x10 - moveq r0, r10 - ldmeqia sp!, {r4-r10,pc} - cmp r10, r8 - bls _020ADF60 - ldr r9, [r7, #0x0] - add r0, r6, #0x10 - cmp r9, #0x0 - add r0, r8, r0 - beq _020ADE94 -_020ADE80: - cmp r9, r0 - beq _020ADE94 - ldr r9, [r9, #0xc] - cmp r9, #0x0 - bne _020ADE80 -_020ADE94: - cmp r9, #0x0 - beq _020ADEB0 - ldr r0, [r9, #0x4] - add r1, r8, #0x10 - add r0, r1, r0 - cmp r10, r0 - bls _020ADEBC -_020ADEB0: - add sp, sp, #0x10 - mov r0, #0x0 - ldmia sp!, {r4-r10,pc} -_020ADEBC: - add r0, sp, #0x0 - mov r1, r9 - bl GetRegionOfMBlock - mov r0, r7 - mov r1, r9 - bl RemoveMBlock - ldr r2, [sp, #0x4] - add r3, r10, r4 - ldr r9, [sp, #0x0] - sub r1, r2, r3 - str r3, [sp, #0x0] - cmp r1, #0x10 - strcc r2, [sp, #0x0] - mov r8, r0 - ldr r0, [sp, #0x0] - sub r0, r0, r4 - str r0, [r6, #0x4] - ldr r1, [sp, #0x4] - ldr r0, [sp, #0x0] - sub r0, r1, r0 - cmp r0, #0x10 - blo _020ADF30 - ldr r1, _020ADF9C ; =0x00004652 - add r0, sp, #0x0 - bl InitMBlock - mov r1, r0 - mov r0, r7 - mov r2, r8 - bl InsertMBlock -_020ADF30: - ldr r0, [r5, #0x20] - ldr r1, [sp, #0x0] - and r0, r0, #0xff - mov r0, r0, lsl #0x10 - mov r0, r0, lsr #0x10 - sub r2, r1, r9 - ands r0, r0, #0x1 - beq _020ADF90 - mov r1, r9 - mov r0, #0x0 - bl MIi_CpuClear32 - b _020ADF90 -_020ADF60: - add r0, r10, r4 - str r0, [sp, #0x8] - ldr r1, [r6, #0x4] - add r0, r6, #0x10 - add r0, r1, r0 - str r0, [sp, #0xc] - add r1, sp, #0x8 - mov r0, r7 - str r10, [r6, #0x4] - bl RecycleRegion - cmp r0, #0x0 - streq r8, [r6, #0x4] -_020ADF90: - ldr r0, [r6, #0x4] - add sp, sp, #0x10 - ldmia sp!, {r4-r10,pc} - .balign 4 -_020ADF9C: .word 0x00004652 - arm_func_end NNS_FndResizeForMBlockExpHeap - - arm_func_start NNS_FndAllocFromExpHeapEx -NNS_FndAllocFromExpHeapEx: ; 0x020ADFA0 - stmdb sp!, {lr} - sub sp, sp, #0x4 - cmp r1, #0x0 - moveq r1, #0x1 - add r1, r1, #0x3 - cmp r2, #0x0 - bic r1, r1, #0x3 - blt _020ADFCC - bl AllocFromHead - add sp, sp, #0x4 - ldmia sp!, {pc} -_020ADFCC: - rsb r2, r2, #0x0 - bl AllocFromTail - add sp, sp, #0x4 - ldmia sp!, {pc} - arm_func_end NNS_FndAllocFromExpHeapEx - - arm_func_start NNS_FndDestroyExpHeap -NNS_FndDestroyExpHeap: ; 0x020ADFDC - ldr ip, _020ADFE4 ; =NNSi_FndFinalizeHeap - bx r12 - .balign 4 -_020ADFE4: .word NNSi_FndFinalizeHeap - arm_func_end NNS_FndDestroyExpHeap - - arm_func_start NNS_FndCreateExpHeapEx -NNS_FndCreateExpHeapEx: ; 0x020ADFE8 - stmdb sp!, {lr} - sub sp, sp, #0x4 - add r1, r1, r0 - add r0, r0, #0x3 - bic r1, r1, #0x3 - bic r0, r0, #0x3 - cmp r0, r1 - bhi _020AE014 - sub r3, r1, r0 - cmp r3, #0x4c - bhs _020AE020 -_020AE014: - add sp, sp, #0x4 - mov r0, #0x0 - ldmia sp!, {pc} -_020AE020: - bl InitExpHeap - add sp, sp, #0x4 - ldmia sp!, {pc} - arm_func_end NNS_FndCreateExpHeapEx - - arm_func_start RecycleRegion -RecycleRegion: - stmdb sp!, {r4-r6,lr} - sub sp, sp, #0x8 - mov r5, r1 - ldr r2, [r5, #0x0] - ldr r1, [r5, #0x4] - mov r6, r0 - str r2, [sp, #0x0] - str r1, [sp, #0x4] - ldr r1, [r6, #0x0] - mov r4, #0x0 - cmp r1, #0x0 - beq _020AE0A0 - ldr r0, [r5, #0x0] -_020AE060: - cmp r1, r0 - movcc r4, r1 - blo _020AE094 - ldr r0, [r5, #0x4] - cmp r1, r0 - bne _020AE0A0 - ldr r2, [r1, #0x4] - add r0, r1, #0x10 - add r2, r2, r0 - mov r0, r6 - str r2, [sp, #0x4] - bl RemoveMBlock - b _020AE0A0 -_020AE094: - ldr r1, [r1, #0xc] - cmp r1, #0x0 - bne _020AE060 -_020AE0A0: - cmp r4, #0x0 - beq _020AE0D4 - ldr r2, [r4, #0x4] - add r1, r4, #0x10 - ldr r0, [r5, #0x0] - add r1, r2, r1 - cmp r1, r0 - bne _020AE0D4 - mov r0, r6 - mov r1, r4 - str r4, [sp, #0x0] - bl RemoveMBlock - mov r4, r0 -_020AE0D4: - ldr r1, [sp, #0x4] - ldr r0, [sp, #0x0] - sub r0, r1, r0 - cmp r0, #0x10 - addcc sp, sp, #0x8 - movcc r0, #0x0 - ldmccia sp!, {r4-r6,pc} - ldr r1, _020AE118 ; =0x00004652 - add r0, sp, #0x0 - bl InitMBlock - mov r1, r0 - mov r0, r6 - mov r2, r4 - bl InsertMBlock - mov r0, #0x1 - add sp, sp, #0x8 - ldmia sp!, {r4-r6,pc} - .balign 4 -_020AE118: .word 0x00004652 - arm_func_end RecycleRegion - - local_arm_func_start AllocFromTail -AllocFromTail: ; 0x020AE11C - stmdb sp!, {r4-r9,lr} - sub sp, sp, #0x4 - add r0, r0, #0x24 - ldrh r4, [r0, #0x12] - mov r3, r1 - mvn lr, #0x0 - and r1, r4, #0x1 - mov r1, r1, lsl #0x10 - movs r1, r1, lsr #0x10 - moveq r5, #0x1 - mov r1, #0x0 - ldr r4, [r0, #0x4] - movne r5, #0x0 - mov r12, r1 - cmp r4, #0x0 - beq _020AE1B0 - sub r2, r2, #0x1 - mvn r2, r2 -_020AE164: - ldr r8, [r4, #0x4] - add r9, r4, #0x10 - add r6, r8, r9 - sub r6, r6, r3 - and r7, r2, r6 - subs r6, r7, r9 - bmi _020AE1A4 - cmp lr, r8 - bls _020AE1A4 - mov r1, r4 - mov lr, r8 - mov r12, r7 - cmp r5, #0x0 - bne _020AE1B0 - cmp r8, r3 - beq _020AE1B0 -_020AE1A4: - ldr r4, [r4, #0x8] - cmp r4, #0x0 - bne _020AE164 -_020AE1B0: - cmp r1, #0x0 - addeq sp, sp, #0x4 - moveq r0, #0x0 - ldmeqia sp!, {r4-r9,pc} - mov r4, #0x1 - mov r2, r12 - str r4, [sp, #0x0] - bl AllocUsedBlockFromFreeBlock - add sp, sp, #0x4 - ldmia sp!, {r4-r9,pc} - arm_func_end AllocFromTail - - local_arm_func_start AllocFromHead -AllocFromHead: ; 0x020AE1D8 - stmdb sp!, {r4-r9,lr} - sub sp, sp, #0x4 - add r0, r0, #0x24 - ldrh r4, [r0, #0x12] - mov r3, r1 - ldr r5, [r0, #0x0] - and r1, r4, #0x1 - mov r1, r1, lsl #0x10 - movs r1, r1, lsr #0x10 - moveq r6, #0x1 - mov r1, #0x0 - movne r6, #0x0 - mov lr, r1 - cmp r5, #0x0 - mvn r4, #0x0 - beq _020AE270 - sub r12, r2, #0x1 - mvn r2, r12 -_020AE220: - add r8, r5, #0x10 - add r7, r12, r8 - and r9, r2, r7 - sub r7, r9, r8 - ldr r8, [r5, #0x4] - add r7, r3, r7 - cmp r8, r7 - blo _020AE264 - cmp r4, r8 - bls _020AE264 - mov r1, r5 - mov r4, r8 - mov lr, r9 - cmp r6, #0x0 - bne _020AE270 - cmp r8, r3 - beq _020AE270 -_020AE264: - ldr r5, [r5, #0xc] - cmp r5, #0x0 - bne _020AE220 -_020AE270: - cmp r1, #0x0 - addeq sp, sp, #0x4 - moveq r0, #0x0 - ldmeqia sp!, {r4-r9,pc} - mov r4, #0x0 - mov r2, lr - str r4, [sp, #0x0] - bl AllocUsedBlockFromFreeBlock - add sp, sp, #0x4 - ldmia sp!, {r4-r9,pc} - arm_func_end AllocFromHead - - arm_func_start AllocUsedBlockFromFreeBlock -AllocUsedBlockFromFreeBlock: ; 0x020AE298 - stmdb sp!, {r4-r8,lr} - sub sp, sp, #0x18 - mov r7, r0 - add r0, sp, #0x0 - mov r8, r1 - mov r6, r2 - mov r5, r3 - bl GetRegionOfMBlock - ldr r3, [sp, #0x4] - sub r4, r6, #0x10 - add r2, r5, r6 - mov r0, r7 - mov r1, r8 - str r4, [sp, #0x4] - str r3, [sp, #0xc] - str r2, [sp, #0x8] - bl RemoveMBlock - ldr r2, [sp, #0x0] - ldr r1, [sp, #0x4] - mov r5, r0 - sub r0, r1, r2 - cmp r0, #0x10 - strcc r2, [sp, #0x4] - blo _020AE318 - ldr r1, _020AE418 ; =0x00004652 - add r0, sp, #0x0 - bl InitMBlock - mov r1, r0 - mov r0, r7 - mov r2, r5 - bl InsertMBlock - mov r5, r0 -_020AE318: - ldr r1, [sp, #0xc] - ldr r0, [sp, #0x8] - sub r0, r1, r0 - cmp r0, #0x10 - strcc r1, [sp, #0x8] - blo _020AE34C - ldr r1, _020AE418 ; =0x00004652 - add r0, sp, #0x8 - bl InitMBlock - mov r1, r0 - mov r0, r7 - mov r2, r5 - bl InsertMBlock -_020AE34C: - ldr r0, [r7, #-0x4] - ldr r1, [sp, #0x4] - and r0, r0, #0xff - mov r0, r0, lsl #0x10 - ldr r2, [sp, #0x8] - mov r0, r0, lsr #0x10 - sub r2, r2, r1 - ands r0, r0, #0x1 - beq _020AE378 - mov r0, #0x0 - bl MIi_CpuClear32 -_020AE378: - ldr r2, [sp, #0x8] - ldr r1, _020AE41C ; =0x00005544 - add r0, sp, #0x10 - str r4, [sp, #0x10] - str r2, [sp, #0x14] - bl InitMBlock - mov r1, r0 - ldrh r3, [r1, #0x2] - ldrh r2, [sp, #0x30] - add r0, r7, #0x8 - bic r3, r3, #0x8000 - strh r3, [r1, #0x2] - ldrh r3, [r1, #0x2] - and r2, r2, #0x1 - orr r2, r3, r2, lsl #0xf - strh r2, [r1, #0x2] - ldrh r2, [r1, #0x2] - ldr r3, [sp, #0x4] - bic r2, r2, #0x7f00 - strh r2, [r1, #0x2] - sub r2, r1, r3 - mov r2, r2, lsl #0x10 - mov r2, r2, lsr #0x10 - ldrh r3, [r1, #0x2] - and r2, r2, #0x7f - orr r2, r3, r2, lsl #0x8 - strh r2, [r1, #0x2] - ldrh r2, [r1, #0x2] - ldrh r3, [r7, #0x10] - bic r2, r2, #0xff - strh r2, [r1, #0x2] - ldrh r2, [r1, #0x2] - and r3, r3, #0xff - orr r2, r2, r3 - strh r2, [r1, #0x2] - ldr r2, [r7, #0xc] - bl InsertMBlock - mov r0, r6 - add sp, sp, #0x18 - ldmia sp!, {r4-r8,pc} - .balign 4 -_020AE418: .word 0x00004652 -_020AE41C: .word 0x00005544 - arm_func_end AllocUsedBlockFromFreeBlock - - arm_func_start InitExpHeap -InitExpHeap: ; 0x020AE420 - stmdb sp!, {r4-r5,lr} - sub sp, sp, #0xc - mov r5, r0 - mov r3, r1 - add r4, r5, #0x24 - str r2, [sp, #0x0] - ldr r1, _020AE498 ; =0x45585048 - add r2, r4, #0x14 - bl NNSi_FndInitHeapHead - mov r0, #0x0 - strh r0, [r4, #0x10] - strh r0, [r4, #0x12] - ldrh r2, [r4, #0x12] - ldr r1, _020AE49C ; =0x00004652 - add r0, sp, #0x4 - bic r2, r2, #0x1 - strh r2, [r4, #0x12] - ldr r2, [r5, #0x18] - str r2, [sp, #0x4] - ldr r2, [r5, #0x1c] - str r2, [sp, #0x8] - bl InitMBlock - str r0, [r5, #0x24] - str r0, [r4, #0x4] - mov r1, #0x0 - str r1, [r4, #0x8] - mov r0, r5 - str r1, [r4, #0xc] - add sp, sp, #0xc - ldmia sp!, {r4-r5,pc} - .balign 4 -_020AE498: .word 0x45585048 -_020AE49C: .word 0x00004652 - arm_func_end InitExpHeap - - arm_func_start InitMBlock -InitMBlock: ; 0x020AE4A0 - ldr r3, [r0, #0x0] - mov r2, #0x0 - strh r1, [r3, #0x0] - strh r2, [r3, #0x2] - ldr r1, [r0, #0x4] - add r0, r3, #0x10 - sub r0, r1, r0 - str r0, [r3, #0x4] - str r2, [r3, #0x8] - mov r0, r3 - str r2, [r3, #0xc] - bx lr - arm_func_end InitMBlock - - arm_func_start InsertMBlock -InsertMBlock: ; 0x020AE4D0 - str r2, [r1, #0x8] - cmp r2, #0x0 - ldrne r3, [r2, #0xc] - strne r1, [r2, #0xc] - ldreq r3, [r0, #0x0] - streq r1, [r0, #0x0] - str r3, [r1, #0xc] - cmp r3, #0x0 - strne r1, [r3, #0x8] - streq r1, [r0, #0x4] - mov r0, r1 - bx lr - arm_func_end InsertMBlock - - arm_func_start RemoveMBlock -RemoveMBlock: ; 0x020AE500 - ldr r2, [r1, #0x8] - ldr r1, [r1, #0xc] - cmp r2, #0x0 - strne r1, [r2, #0xc] - streq r1, [r0, #0x0] - cmp r1, #0x0 - strne r2, [r1, #0x8] - streq r2, [r0, #0x4] - mov r0, r2 - bx lr - arm_func_end RemoveMBlock - - arm_func_start GetRegionOfMBlock -GetRegionOfMBlock: ; 0x020AE528 - ldrh r2, [r1, #0x2] - add r3, r1, #0x10 - mov r2, r2, asr #0x8 - and r2, r2, #0x7f - mov r2, r2, lsl #0x10 - sub r2, r1, r2, lsr #0x10 - str r2, [r0, #0x0] - ldr r1, [r1, #0x4] - add r1, r1, r3 - str r1, [r0, #0x4] - bx lr - arm_func_end GetRegionOfMBlock diff --git a/arm9/asm/NNS_FND_expheap_s.s b/arm9/asm/NNS_FND_expheap_s.s new file mode 100644 index 00000000..54a26a2f --- /dev/null +++ b/arm9/asm/NNS_FND_expheap_s.s @@ -0,0 +1,526 @@ + .include "asm/macros.inc" + .include "global.inc" + .extern NNSi_FndInitHeapHead + .extern NNSi_FndFinalizeHeap + .extern GetRegionOfMBlock + .extern RemoveMBlock + .extern InsertMBlock + .extern InitMBlock + .text + + arm_func_start NNS_FndGetSizeForMBlockExpHeap +NNS_FndGetSizeForMBlockExpHeap: ; 0x020ADDC0 + ldr r0, [r0, #-0xc] + bx lr + arm_func_end NNS_FndGetSizeForMBlockExpHeap + + arm_func_start NNS_FndGetTotalFreeSizeForExpHeap +NNS_FndGetTotalFreeSizeForExpHeap: ; 0x020ADDC8 + ldr r2, [r0, #0x24] + mov r0, #0x0 + cmp r2, #0x0 + bxeq lr +_020ADDD8: + ldr r1, [r2, #0x4] + ldr r2, [r2, #0xc] + add r0, r0, r1 + cmp r2, #0x0 + bne _020ADDD8 + bx lr + arm_func_end NNS_FndGetTotalFreeSizeForExpHeap + + arm_func_start NNS_FndFreeToExpHeap +NNS_FndFreeToExpHeap: ; 0x020ADDF0 + stmdb sp!, {r4-r5,lr} + sub sp, sp, #0xc + sub r4, r1, #0x10 + add r5, r0, #0x24 + add r0, sp, #0x0 + mov r1, r4 + bl GetRegionOfMBlock + mov r1, r4 + add r0, r5, #0x8 + bl RemoveMBlock + add r1, sp, #0x0 + mov r0, r5 + bl RecycleRegion + add sp, sp, #0xc + ldmia sp!, {r4-r5,pc} + arm_func_end NNS_FndFreeToExpHeap + + arm_func_start NNS_FndResizeForMBlockExpHeap +NNS_FndResizeForMBlockExpHeap: ; 0x020ADE2C + stmdb sp!, {r4-r10,lr} + sub sp, sp, #0x10 + mov r4, r1 + mov r10, r2 + sub r6, r4, #0x10 + add r1, r10, #0x3 + mov r5, r0 + ldr r8, [r6, #0x4] + bic r10, r1, #0x3 + cmp r10, r8 + add r7, r5, #0x24 + addeq sp, sp, #0x10 + moveq r0, r10 + ldmeqia sp!, {r4-r10,pc} + cmp r10, r8 + bls _020ADF60 + ldr r9, [r7, #0x0] + add r0, r6, #0x10 + cmp r9, #0x0 + add r0, r8, r0 + beq _020ADE94 +_020ADE80: + cmp r9, r0 + beq _020ADE94 + ldr r9, [r9, #0xc] + cmp r9, #0x0 + bne _020ADE80 +_020ADE94: + cmp r9, #0x0 + beq _020ADEB0 + ldr r0, [r9, #0x4] + add r1, r8, #0x10 + add r0, r1, r0 + cmp r10, r0 + bls _020ADEBC +_020ADEB0: + add sp, sp, #0x10 + mov r0, #0x0 + ldmia sp!, {r4-r10,pc} +_020ADEBC: + add r0, sp, #0x0 + mov r1, r9 + bl GetRegionOfMBlock + mov r0, r7 + mov r1, r9 + bl RemoveMBlock + ldr r2, [sp, #0x4] + add r3, r10, r4 + ldr r9, [sp, #0x0] + sub r1, r2, r3 + str r3, [sp, #0x0] + cmp r1, #0x10 + strcc r2, [sp, #0x0] + mov r8, r0 + ldr r0, [sp, #0x0] + sub r0, r0, r4 + str r0, [r6, #0x4] + ldr r1, [sp, #0x4] + ldr r0, [sp, #0x0] + sub r0, r1, r0 + cmp r0, #0x10 + blo _020ADF30 + ldr r1, _020ADF9C ; =0x00004652 + add r0, sp, #0x0 + bl InitMBlock + mov r1, r0 + mov r0, r7 + mov r2, r8 + bl InsertMBlock +_020ADF30: + ldr r0, [r5, #0x20] + ldr r1, [sp, #0x0] + and r0, r0, #0xff + mov r0, r0, lsl #0x10 + mov r0, r0, lsr #0x10 + sub r2, r1, r9 + ands r0, r0, #0x1 + beq _020ADF90 + mov r1, r9 + mov r0, #0x0 + bl MIi_CpuClear32 + b _020ADF90 +_020ADF60: + add r0, r10, r4 + str r0, [sp, #0x8] + ldr r1, [r6, #0x4] + add r0, r6, #0x10 + add r0, r1, r0 + str r0, [sp, #0xc] + add r1, sp, #0x8 + mov r0, r7 + str r10, [r6, #0x4] + bl RecycleRegion + cmp r0, #0x0 + streq r8, [r6, #0x4] +_020ADF90: + ldr r0, [r6, #0x4] + add sp, sp, #0x10 + ldmia sp!, {r4-r10,pc} + .balign 4 +_020ADF9C: .word 0x00004652 + arm_func_end NNS_FndResizeForMBlockExpHeap + + arm_func_start NNS_FndAllocFromExpHeapEx +NNS_FndAllocFromExpHeapEx: ; 0x020ADFA0 + stmdb sp!, {lr} + sub sp, sp, #0x4 + cmp r1, #0x0 + moveq r1, #0x1 + add r1, r1, #0x3 + cmp r2, #0x0 + bic r1, r1, #0x3 + blt _020ADFCC + bl AllocFromHead + add sp, sp, #0x4 + ldmia sp!, {pc} +_020ADFCC: + rsb r2, r2, #0x0 + bl AllocFromTail + add sp, sp, #0x4 + ldmia sp!, {pc} + arm_func_end NNS_FndAllocFromExpHeapEx + + arm_func_start NNS_FndDestroyExpHeap +NNS_FndDestroyExpHeap: ; 0x020ADFDC + ldr ip, _020ADFE4 ; =NNSi_FndFinalizeHeap + bx r12 + .balign 4 +_020ADFE4: .word NNSi_FndFinalizeHeap + arm_func_end NNS_FndDestroyExpHeap + + arm_func_start NNS_FndCreateExpHeapEx +NNS_FndCreateExpHeapEx: ; 0x020ADFE8 + stmdb sp!, {lr} + sub sp, sp, #0x4 + add r1, r1, r0 + add r0, r0, #0x3 + bic r1, r1, #0x3 + bic r0, r0, #0x3 + cmp r0, r1 + bhi _020AE014 + sub r3, r1, r0 + cmp r3, #0x4c + bhs _020AE020 +_020AE014: + add sp, sp, #0x4 + mov r0, #0x0 + ldmia sp!, {pc} +_020AE020: + bl InitExpHeap + add sp, sp, #0x4 + ldmia sp!, {pc} + arm_func_end NNS_FndCreateExpHeapEx + + arm_func_start RecycleRegion +RecycleRegion: + stmdb sp!, {r4-r6,lr} + sub sp, sp, #0x8 + mov r5, r1 + ldr r2, [r5, #0x0] + ldr r1, [r5, #0x4] + mov r6, r0 + str r2, [sp, #0x0] + str r1, [sp, #0x4] + ldr r1, [r6, #0x0] + mov r4, #0x0 + cmp r1, #0x0 + beq _020AE0A0 + ldr r0, [r5, #0x0] +_020AE060: + cmp r1, r0 + movcc r4, r1 + blo _020AE094 + ldr r0, [r5, #0x4] + cmp r1, r0 + bne _020AE0A0 + ldr r2, [r1, #0x4] + add r0, r1, #0x10 + add r2, r2, r0 + mov r0, r6 + str r2, [sp, #0x4] + bl RemoveMBlock + b _020AE0A0 +_020AE094: + ldr r1, [r1, #0xc] + cmp r1, #0x0 + bne _020AE060 +_020AE0A0: + cmp r4, #0x0 + beq _020AE0D4 + ldr r2, [r4, #0x4] + add r1, r4, #0x10 + ldr r0, [r5, #0x0] + add r1, r2, r1 + cmp r1, r0 + bne _020AE0D4 + mov r0, r6 + mov r1, r4 + str r4, [sp, #0x0] + bl RemoveMBlock + mov r4, r0 +_020AE0D4: + ldr r1, [sp, #0x4] + ldr r0, [sp, #0x0] + sub r0, r1, r0 + cmp r0, #0x10 + addcc sp, sp, #0x8 + movcc r0, #0x0 + ldmccia sp!, {r4-r6,pc} + ldr r1, _020AE118 ; =0x00004652 + add r0, sp, #0x0 + bl InitMBlock + mov r1, r0 + mov r0, r6 + mov r2, r4 + bl InsertMBlock + mov r0, #0x1 + add sp, sp, #0x8 + ldmia sp!, {r4-r6,pc} + .balign 4 +_020AE118: .word 0x00004652 + arm_func_end RecycleRegion + + local_arm_func_start AllocFromTail +AllocFromTail: ; 0x020AE11C + stmdb sp!, {r4-r9,lr} + sub sp, sp, #0x4 + add r0, r0, #0x24 + ldrh r4, [r0, #0x12] + mov r3, r1 + mvn lr, #0x0 + and r1, r4, #0x1 + mov r1, r1, lsl #0x10 + movs r1, r1, lsr #0x10 + moveq r5, #0x1 + mov r1, #0x0 + ldr r4, [r0, #0x4] + movne r5, #0x0 + mov r12, r1 + cmp r4, #0x0 + beq _020AE1B0 + sub r2, r2, #0x1 + mvn r2, r2 +_020AE164: + ldr r8, [r4, #0x4] + add r9, r4, #0x10 + add r6, r8, r9 + sub r6, r6, r3 + and r7, r2, r6 + subs r6, r7, r9 + bmi _020AE1A4 + cmp lr, r8 + bls _020AE1A4 + mov r1, r4 + mov lr, r8 + mov r12, r7 + cmp r5, #0x0 + bne _020AE1B0 + cmp r8, r3 + beq _020AE1B0 +_020AE1A4: + ldr r4, [r4, #0x8] + cmp r4, #0x0 + bne _020AE164 +_020AE1B0: + cmp r1, #0x0 + addeq sp, sp, #0x4 + moveq r0, #0x0 + ldmeqia sp!, {r4-r9,pc} + mov r4, #0x1 + mov r2, r12 + str r4, [sp, #0x0] + bl AllocUsedBlockFromFreeBlock + add sp, sp, #0x4 + ldmia sp!, {r4-r9,pc} + arm_func_end AllocFromTail + + local_arm_func_start AllocFromHead +AllocFromHead: ; 0x020AE1D8 + stmdb sp!, {r4-r9,lr} + sub sp, sp, #0x4 + add r0, r0, #0x24 + ldrh r4, [r0, #0x12] + mov r3, r1 + ldr r5, [r0, #0x0] + and r1, r4, #0x1 + mov r1, r1, lsl #0x10 + movs r1, r1, lsr #0x10 + moveq r6, #0x1 + mov r1, #0x0 + movne r6, #0x0 + mov lr, r1 + cmp r5, #0x0 + mvn r4, #0x0 + beq _020AE270 + sub r12, r2, #0x1 + mvn r2, r12 +_020AE220: + add r8, r5, #0x10 + add r7, r12, r8 + and r9, r2, r7 + sub r7, r9, r8 + ldr r8, [r5, #0x4] + add r7, r3, r7 + cmp r8, r7 + blo _020AE264 + cmp r4, r8 + bls _020AE264 + mov r1, r5 + mov r4, r8 + mov lr, r9 + cmp r6, #0x0 + bne _020AE270 + cmp r8, r3 + beq _020AE270 +_020AE264: + ldr r5, [r5, #0xc] + cmp r5, #0x0 + bne _020AE220 +_020AE270: + cmp r1, #0x0 + addeq sp, sp, #0x4 + moveq r0, #0x0 + ldmeqia sp!, {r4-r9,pc} + mov r4, #0x0 + mov r2, lr + str r4, [sp, #0x0] + bl AllocUsedBlockFromFreeBlock + add sp, sp, #0x4 + ldmia sp!, {r4-r9,pc} + arm_func_end AllocFromHead + + arm_func_start AllocUsedBlockFromFreeBlock +AllocUsedBlockFromFreeBlock: ; 0x020AE298 + stmdb sp!, {r4-r8,lr} + sub sp, sp, #0x18 + mov r7, r0 + add r0, sp, #0x0 + mov r8, r1 + mov r6, r2 + mov r5, r3 + bl GetRegionOfMBlock + ldr r3, [sp, #0x4] + sub r4, r6, #0x10 + add r2, r5, r6 + mov r0, r7 + mov r1, r8 + str r4, [sp, #0x4] + str r3, [sp, #0xc] + str r2, [sp, #0x8] + bl RemoveMBlock + ldr r2, [sp, #0x0] + ldr r1, [sp, #0x4] + mov r5, r0 + sub r0, r1, r2 + cmp r0, #0x10 + strcc r2, [sp, #0x4] + blo _020AE318 + ldr r1, _020AE418 ; =0x00004652 + add r0, sp, #0x0 + bl InitMBlock + mov r1, r0 + mov r0, r7 + mov r2, r5 + bl InsertMBlock + mov r5, r0 +_020AE318: + ldr r1, [sp, #0xc] + ldr r0, [sp, #0x8] + sub r0, r1, r0 + cmp r0, #0x10 + strcc r1, [sp, #0x8] + blo _020AE34C + ldr r1, _020AE418 ; =0x00004652 + add r0, sp, #0x8 + bl InitMBlock + mov r1, r0 + mov r0, r7 + mov r2, r5 + bl InsertMBlock +_020AE34C: + ldr r0, [r7, #-0x4] + ldr r1, [sp, #0x4] + and r0, r0, #0xff + mov r0, r0, lsl #0x10 + ldr r2, [sp, #0x8] + mov r0, r0, lsr #0x10 + sub r2, r2, r1 + ands r0, r0, #0x1 + beq _020AE378 + mov r0, #0x0 + bl MIi_CpuClear32 +_020AE378: + ldr r2, [sp, #0x8] + ldr r1, _020AE41C ; =0x00005544 + add r0, sp, #0x10 + str r4, [sp, #0x10] + str r2, [sp, #0x14] + bl InitMBlock + mov r1, r0 + ldrh r3, [r1, #0x2] + ldrh r2, [sp, #0x30] + add r0, r7, #0x8 + bic r3, r3, #0x8000 + strh r3, [r1, #0x2] + ldrh r3, [r1, #0x2] + and r2, r2, #0x1 + orr r2, r3, r2, lsl #0xf + strh r2, [r1, #0x2] + ldrh r2, [r1, #0x2] + ldr r3, [sp, #0x4] + bic r2, r2, #0x7f00 + strh r2, [r1, #0x2] + sub r2, r1, r3 + mov r2, r2, lsl #0x10 + mov r2, r2, lsr #0x10 + ldrh r3, [r1, #0x2] + and r2, r2, #0x7f + orr r2, r3, r2, lsl #0x8 + strh r2, [r1, #0x2] + ldrh r2, [r1, #0x2] + ldrh r3, [r7, #0x10] + bic r2, r2, #0xff + strh r2, [r1, #0x2] + ldrh r2, [r1, #0x2] + and r3, r3, #0xff + orr r2, r2, r3 + strh r2, [r1, #0x2] + ldr r2, [r7, #0xc] + bl InsertMBlock + mov r0, r6 + add sp, sp, #0x18 + ldmia sp!, {r4-r8,pc} + .balign 4 +_020AE418: .word 0x00004652 +_020AE41C: .word 0x00005544 + arm_func_end AllocUsedBlockFromFreeBlock + + arm_func_start InitExpHeap +InitExpHeap: ; 0x020AE420 + stmdb sp!, {r4-r5,lr} + sub sp, sp, #0xc + mov r5, r0 + mov r3, r1 + add r4, r5, #0x24 + str r2, [sp, #0x0] + ldr r1, _020AE498 ; =0x45585048 + add r2, r4, #0x14 + bl NNSi_FndInitHeapHead + mov r0, #0x0 + strh r0, [r4, #0x10] + strh r0, [r4, #0x12] + ldrh r2, [r4, #0x12] + ldr r1, _020AE49C ; =0x00004652 + add r0, sp, #0x4 + bic r2, r2, #0x1 + strh r2, [r4, #0x12] + ldr r2, [r5, #0x18] + str r2, [sp, #0x4] + ldr r2, [r5, #0x1c] + str r2, [sp, #0x8] + bl InitMBlock + str r0, [r5, #0x24] + str r0, [r4, #0x4] + mov r1, #0x0 + str r1, [r4, #0x8] + mov r0, r5 + str r1, [r4, #0xc] + add sp, sp, #0xc + ldmia sp!, {r4-r5,pc} + .balign 4 +_020AE498: .word 0x45585048 +_020AE49C: .word 0x00004652 + arm_func_end InitExpHeap diff --git a/arm9/lib/libnns/include/NNS_FND_heapcommon.h b/arm9/lib/libnns/include/NNS_FND_heapcommon.h index e6fab69c..8128e74b 100644 --- a/arm9/lib/libnns/include/NNS_FND_heapcommon.h +++ b/arm9/lib/libnns/include/NNS_FND_heapcommon.h @@ -7,6 +7,18 @@ typedef struct NNSiFndHeapHead NNSiFndHeapHead; +typedef s32 NNSiIntPtr; +typedef u32 NNSiUIntPtr; + +#define NNSi_FndGetBitValue(data, st, bits) (((data) >>(st)) & ((1 <<(bits)) -1)) +#define NNSi_FndSetBitValue(data, st, bits, val) do { \ + u32 maskBits = (u32)((1 << (bits)) - 1); \ + u32 newVal = (val) & maskBits; \ + (void)(maskBits <<= st); \ + (data) &= ~maskBits; \ + (data) |= newVal << (st); \ +} while (FALSE); + struct NNSiFndHeapHead { u32 signature; @@ -23,4 +35,56 @@ struct NNSiFndHeapHead typedef NNSiFndHeapHead* NNSFndHeapHandle; // Type to represent heap handle +static inline NNSiUIntPtr NNSiGetUIntPtr(const void* ptr) +{ + return (NNSiUIntPtr)ptr; +} + +static inline u32 GetOffsetFromPtr(const void* start, const void* end) +{ + return NNSiGetUIntPtr(end) - NNSiGetUIntPtr(start); +} + +static inline void* AddU32ToPtr(void* ptr, u32 val) +{ + return (void*)( NNSiGetUIntPtr(ptr) + val ); +} + +static inline const void* AddU32ToCPtr(const void* ptr, u32 val) +{ + return (const void*)( NNSiGetUIntPtr(ptr) + val ); +} + +static inline void* SubU32ToPtr(void* ptr, u32 val) +{ + return (void*)(NNSiGetUIntPtr(ptr) - val); +} + +static inline const void* SubU32ToCPtr(const void* ptr, u32 val) +{ + return (const void*)(NNSiGetUIntPtr(ptr) - val); +} + +static inline int ComparePtr(const void* a, const void* b) +{ + const u8* wa = a; + const u8* wb = b; + + return wa - wb; +} + + +static inline u16 GetOptForHeap(const NNSiFndHeapHead* pHeapHd) +{ + return (u16)NNSi_FndGetBitValue(pHeapHd->attribute, 0, 8); +} + +static inline void SetOptForHeap( + NNSiFndHeapHead* pHeapHd, + u16 optFlag + ) +{ + NNSi_FndSetBitValue(pHeapHd->attribute, 0, 8, optFlag); +} + #endif //GUARD_NNS_FND_HEAPCOMMON_H diff --git a/arm9/lib/libnns/src/NNS_FND_expheap.c b/arm9/lib/libnns/src/NNS_FND_expheap.c new file mode 100644 index 00000000..70e3886a --- /dev/null +++ b/arm9/lib/libnns/src/NNS_FND_expheap.c @@ -0,0 +1,92 @@ +#include "global.h" +#include "NNS_FND_expheap.h" + +typedef struct NNSiMemRegion { + void* start; + void* end; +} NNSiMemRegion; + +static inline u16 GetAlignmentForMBlock(NNSiFndExpHeapMBlockHead* block) +{ + return NNSi_FndGetBitValue(block->attribute, 8, 7); +} + +static inline void* GetMemPtrForMBlock(NNSiFndExpHeapMBlockHead* block) +{ + return AddU32ToPtr(block, sizeof(NNSiFndExpHeapMBlockHead)); +} + +static inline void* GetMBlockEndAddr(NNSiFndExpHeapMBlockHead* block) +{ + return AddU32ToPtr(GetMemPtrForMBlock(block), block->blockSize); +} + +void GetRegionOfMBlock(NNSiMemRegion* region, NNSiFndExpHeapMBlockHead* block) +{ + region->start = SubU32ToPtr(block, GetAlignmentForMBlock(block)); + region->end = GetMBlockEndAddr(block); +} + +NNSiFndExpHeapMBlockHead* RemoveMBlock(NNSiFndExpMBlockList* list, NNSiFndExpHeapMBlockHead* block) +{ + NNSiFndExpHeapMBlockHead* const prev = block->pMBHeadPrev; + NNSiFndExpHeapMBlockHead* const next = block->pMBHeadNext; + + if (prev != NULL) + { + prev->pMBHeadNext = next; + } + else + { + list->head = next; + } + + if (next != NULL) + { + next->pMBHeadPrev = prev; + } + else + { + list->tail = prev; + } + + return prev; +} + +NNSiFndExpHeapMBlockHead* InsertMBlock(NNSiFndExpMBlockList* list, NNSiFndExpHeapMBlockHead* target, NNSiFndExpHeapMBlockHead* prev) +{ + NNSiFndExpHeapMBlockHead* next; + target->pMBHeadPrev = prev; + if (prev != NULL) + { + next = prev->pMBHeadNext; + prev->pMBHeadNext = target; + } + else + { + next = list->head; + list->head = target; + } + target->pMBHeadNext = next; + if (next != NULL) + { + next->pMBHeadPrev = target; + } + else + { + list->tail = target; + } + + return target; +} + +NNSiFndExpHeapMBlockHead* InitMBlock(const NNSiMemRegion* pRegion, u16 signature) +{ + NNSiFndExpHeapMBlockHead* block = pRegion->start; + block->signature = signature; + block->attribute = 0; + block->blockSize = GetOffsetFromPtr(GetMemPtrForMBlock(block), pRegion->end); + block->pMBHeadPrev = NULL; + block->pMBHeadNext = NULL; + return block; +} diff --git a/arm9/lib/libnns/src/NNS_FND_heapcommon.c b/arm9/lib/libnns/src/NNS_FND_heapcommon.c index 664007f1..07b8e9cf 100644 --- a/arm9/lib/libnns/src/NNS_FND_heapcommon.c +++ b/arm9/lib/libnns/src/NNS_FND_heapcommon.c @@ -5,12 +5,6 @@ BOOL sRootListInitialized; NNSFndList sRootList; -static inline void NNSi_FndHeapHeadSetOptionFlag(NNSiFndHeapHead *pHead, u8 option_flag) -{ - pHead->attribute &= ~0xFF; - pHead->attribute |= option_flag; -} - void *NNS_FndGetNextListObject(NNSFndList *, void *); static NNSiFndHeapHead* FindContainHeap(NNSFndList * pList, const void * memBlock) @@ -45,7 +39,7 @@ void NNSi_FndInitHeapHead(NNSiFndHeapHead *pHead, u32 signature, void* heapStart pHead->heapStart = heapStart; pHead->heapEnd = heapEnd; pHead->attribute = 0; - NNSi_FndHeapHeadSetOptionFlag(pHead, optionFlag); + SetOptForHeap(pHead, optionFlag); NNS_FndInitList(&pHead->childList, 4); if (!sRootListInitialized) { -- cgit v1.2.3