summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arm9/asm/NNS_FND_heapcommon.s112
-rw-r--r--arm9/lib/libnns/include/NNS_FND_list.h15
-rw-r--r--arm9/lib/libnns/src/NNS_FND_heapcommon.c61
3 files changed, 76 insertions, 112 deletions
diff --git a/arm9/asm/NNS_FND_heapcommon.s b/arm9/asm/NNS_FND_heapcommon.s
deleted file mode 100644
index ca3108d2..00000000
--- a/arm9/asm/NNS_FND_heapcommon.s
+++ /dev/null
@@ -1,112 +0,0 @@
- .include "asm/macros.inc"
- .include "global.inc"
-
- .section .bss
-
- .global sRootListInitialized
-sRootListInitialized: ; 0x021CCD38
- .space 0x4
-
- .global sRootList
-sRootList: ; 0x021CCD3C
- .space 0xc
- .text
-
- arm_func_start NNSi_FndFinalizeHeap
-NNSi_FndFinalizeHeap: ; 0x020ADC8C
- stmdb sp!, {r4,lr}
- mov r4, r0
- bl FindListContainHeap
- mov r1, r4
- bl NNS_FndRemoveListObject
- ldmia sp!, {r4,pc}
- arm_func_end NNSi_FndFinalizeHeap
-
- arm_func_start NNSi_FndInitHeapHead
-NNSi_FndInitHeapHead:
- stmdb sp!, {r4,lr}
- mov r4, r0
- str r1, [r4, #0x0]
- str r2, [r4, #0x18]
- str r3, [r4, #0x1c]
- mov r0, #0x0
- str r0, [r4, #0x20]
- ldr r1, [r4, #0x20]
- ldrh r0, [sp, #0x8]
- bic r1, r1, #0xff
- str r1, [r4, #0x20]
- ldr r1, [r4, #0x20]
- and r0, r0, #0xff
- orr r2, r1, r0
- add r0, r4, #0xc
- mov r1, #0x4
- str r2, [r4, #0x20]
- bl NNS_FndInitList
- ldr r0, _020ADD28 ; =sRootListInitialized
- ldr r0, [r0, #0x0]
- cmp r0, #0x0
- bne _020ADD14
- ldr r0, _020ADD2C ; =sRootList
- mov r1, #0x4
- bl NNS_FndInitList
- ldr r0, _020ADD28 ; =sRootListInitialized
- mov r1, #0x1
- str r1, [r0, #0x0]
-_020ADD14:
- mov r0, r4
- bl FindListContainHeap
- mov r1, r4
- bl NNS_FndAppendListObject
- ldmia sp!, {r4,pc}
- .balign 4
-_020ADD28: .word sRootListInitialized
-_020ADD2C: .word sRootList
- arm_func_end NNSi_FndInitHeapHead
-
- arm_func_start FindListContainHeap
-FindListContainHeap: ; 0x020ADD30
- stmdb sp!, {r4,lr}
- ldr r4, _020ADD54 ; =sRootList
- mov r1, r0
- mov r0, r4
- bl FindContainHeap
- cmp r0, #0x0
- addne r4, r0, #0xc
- mov r0, r4
- ldmia sp!, {r4,pc}
- .balign 4
-_020ADD54: .word sRootList
- arm_func_end FindListContainHeap
-
- arm_func_start FindContainHeap
-FindContainHeap:
- stmdb sp!, {r4-r6,lr}
- mov r5, r1
- mov r1, #0x0
- mov r6, r0
- bl NNS_FndGetNextListObject
- movs r4, r0
- beq _020ADDB8
-_020ADD74:
- ldr r0, [r4, #0x18]
- cmp r0, r5
- bhi _020ADDA4
- ldr r0, [r4, #0x1c]
- cmp r5, r0
- bhs _020ADDA4
- mov r1, r5
- add r0, r4, #0xc
- bl FindContainHeap
- cmp r0, #0x0
- moveq r0, r4
- ldmia sp!, {r4-r6,pc}
-_020ADDA4:
- mov r0, r6
- mov r1, r4
- bl NNS_FndGetNextListObject
- movs r4, r0
- bne _020ADD74
-_020ADDB8:
- mov r0, #0x0
- ldmia sp!, {r4-r6,pc}
- arm_func_end FindContainHeap
diff --git a/arm9/lib/libnns/include/NNS_FND_list.h b/arm9/lib/libnns/include/NNS_FND_list.h
index 5fec2fdf..4bba7882 100644
--- a/arm9/lib/libnns/include/NNS_FND_list.h
+++ b/arm9/lib/libnns/include/NNS_FND_list.h
@@ -17,4 +17,19 @@ typedef struct
} NNSFndList;
+void NNS_FndInitList(
+ NNSFndList *pList,
+ s32 alignment
+);
+
+void NNS_FndAppendListObject(
+ NNSFndList *pList,
+ void* object
+);
+
+void NNS_FndRemoveListObject(
+ NNSFndList *pList,
+ void* object
+);
+
#endif //GUARD_NNS_FND_LIST_H
diff --git a/arm9/lib/libnns/src/NNS_FND_heapcommon.c b/arm9/lib/libnns/src/NNS_FND_heapcommon.c
new file mode 100644
index 00000000..2520aab2
--- /dev/null
+++ b/arm9/lib/libnns/src/NNS_FND_heapcommon.c
@@ -0,0 +1,61 @@
+#include "nitro.h"
+#include "NNS_FND_heapcommon.h"
+#include "NNS_FND_list.h"
+
+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 *);
+
+NNSiFndHeapHead* FindContainHeap(NNSFndList * pList, const void * memBlock)
+{
+ NNSiFndHeapHead * pHead = NULL;
+
+ while ((pHead = NNS_FndGetNextListObject(pList, pHead)) != NULL)
+ {
+ if (pHead->heapStart <= memBlock && memBlock < pHead->heapEnd)
+ {
+ NNSiFndHeapHead * ret = FindContainHeap(&pHead->childList, memBlock);
+ if (ret == NULL)
+ ret = pHead;
+ return ret;
+ }
+ }
+ return NULL;
+}
+
+NNSFndList* FindListContainHeap(const void * memBlock)
+{
+ NNSFndList* ret = &sRootList;
+ NNSiFndHeapHead* pHead = FindContainHeap(&sRootList, memBlock);
+ if (pHead != NULL)
+ ret = &pHead->childList;
+ return ret;
+}
+
+void NNSi_FndInitHeapHead(NNSiFndHeapHead *pHead, u32 signature, void* heapStart, void* heapEnd, u16 optionFlag)
+{
+ pHead->signature = signature;
+ pHead->heapStart = heapStart;
+ pHead->heapEnd = heapEnd;
+ pHead->attribute = 0;
+ NNSi_FndHeapHeadSetOptionFlag(pHead, optionFlag);
+ NNS_FndInitList(&pHead->childList, 4);
+ if (!sRootListInitialized)
+ {
+ NNS_FndInitList(&sRootList, 4);
+ sRootListInitialized = TRUE;
+ }
+ NNS_FndAppendListObject(FindListContainHeap(pHead), pHead);
+}
+
+void NNSi_FndFinalizeHeap(NNSiFndHeapHead *pHead)
+{
+ NNS_FndRemoveListObject(FindListContainHeap(pHead), pHead);
+}