diff options
-rw-r--r-- | arm9/asm/NNS_FND_heapcommon.s | 112 | ||||
-rw-r--r-- | arm9/lib/libnns/include/NNS_FND_list.h | 15 | ||||
-rw-r--r-- | arm9/lib/libnns/src/NNS_FND_heapcommon.c | 61 |
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);
+}
|