diff options
-rw-r--r-- | arm9/asm/NNS_FND_list.s | 169 | ||||
-rw-r--r-- | arm9/lib/libnns/src/NNS_FND_heapcommon.c | 4 | ||||
-rw-r--r-- | arm9/lib/libnns/src/NNS_FND_list.c | 128 |
3 files changed, 130 insertions, 171 deletions
diff --git a/arm9/asm/NNS_FND_list.s b/arm9/asm/NNS_FND_list.s deleted file mode 100644 index 21999c11..00000000 --- a/arm9/asm/NNS_FND_list.s +++ /dev/null @@ -1,169 +0,0 @@ - .include "asm/macros.inc" - .include "global.inc" - .text - - arm_func_start NNS_FndGetPrevListObject -NNS_FndGetPrevListObject: ; 0x020ADA84 - cmp r1, #0x0 - ldreq r0, [r0, #0x4] - ldrneh r0, [r0, #0xa] - ldrne r0, [r1, r0] - bx lr - arm_func_end NNS_FndGetPrevListObject - - arm_func_start NNS_FndGetNextListObject -NNS_FndGetNextListObject: ; 0x020ADA98 - cmp r1, #0x0 - ldreq r0, [r0, #0x0] - ldrneh r0, [r0, #0xa] - addne r0, r1, r0 - ldrne r0, [r0, #0x4] - bx lr - arm_func_end NNS_FndGetNextListObject - - arm_func_start NNS_FndRemoveListObject -NNS_FndRemoveListObject: ; 0x020ADAB0 - stmdb sp!, {lr} - sub sp, sp, #0x4 - ldrh r12, [r0, #0xa] - ldr r3, [r1, r12] - add lr, r1, r12 - cmp r3, #0x0 - ldreq r1, [lr, #0x4] - streq r1, [r0, #0x0] - ldrne r2, [lr, #0x4] - addne r1, r3, r12 - strne r2, [r1, #0x4] - ldr r3, [lr, #0x4] - cmp r3, #0x0 - ldreq r1, [lr, #0x0] - streq r1, [r0, #0x4] - ldrneh r1, [r0, #0xa] - ldrne r2, [lr, #0x0] - strne r2, [r3, r1] - mov r1, #0x0 - str r1, [lr, #0x0] - str r1, [lr, #0x4] - ldrh r1, [r0, #0x8] - sub r1, r1, #0x1 - strh r1, [r0, #0x8] - add sp, sp, #0x4 - ldmia sp!, {pc} - arm_func_end NNS_FndRemoveListObject - - arm_func_start NNS_FndInsertListObject -NNS_FndInsertListObject: ; 0x020ADB18 - stmdb sp!, {lr} - sub sp, sp, #0x4 - cmp r1, #0x0 - bne _020ADB38 - mov r1, r2 - bl NNS_FndAppendListObject - add sp, sp, #0x4 - ldmia sp!, {pc} -_020ADB38: - ldr r3, [r0, #0x0] - cmp r1, r3 - bne _020ADB54 - mov r1, r2 - bl NNS_FndPrependListObject - add sp, sp, #0x4 - ldmia sp!, {pc} -_020ADB54: - ldrh lr, [r0, #0xa] - ldr r3, [r1, lr] - add r12, r2, lr - str r3, [r2, lr] - str r1, [r12, #0x4] - add r3, r3, lr - str r2, [r3, #0x4] - ldrh r3, [r0, #0xa] - str r2, [r1, r3] - ldrh r1, [r0, #0x8] - add r1, r1, #0x1 - strh r1, [r0, #0x8] - add sp, sp, #0x4 - ldmia sp!, {pc} - arm_func_end NNS_FndInsertListObject - - arm_func_start NNS_FndPrependListObject -NNS_FndPrependListObject: ; 0x020ADB8C - stmdb sp!, {lr} - sub sp, sp, #0x4 - ldr r2, [r0, #0x0] - cmp r2, #0x0 - bne _020ADBAC - bl SetFirstObject - add sp, sp, #0x4 - ldmia sp!, {pc} -_020ADBAC: - ldrh r3, [r0, #0xa] - mov r2, #0x0 - str r2, [r1, r3] - ldr r2, [r0, #0x0] - add r3, r1, r3 - str r2, [r3, #0x4] - ldrh r2, [r0, #0xa] - ldr r3, [r0, #0x0] - str r1, [r3, r2] - str r1, [r0, #0x0] - ldrh r1, [r0, #0x8] - add r1, r1, #0x1 - strh r1, [r0, #0x8] - add sp, sp, #0x4 - ldmia sp!, {pc} - arm_func_end NNS_FndPrependListObject - - arm_func_start NNS_FndAppendListObject -NNS_FndAppendListObject: ; 0x020ADBE8 - stmdb sp!, {lr} - sub sp, sp, #0x4 - ldr r2, [r0, #0x0] - cmp r2, #0x0 - bne _020ADC08 - bl SetFirstObject - add sp, sp, #0x4 - ldmia sp!, {pc} -_020ADC08: - ldrh r12, [r0, #0xa] - ldr r3, [r0, #0x4] - mov r2, #0x0 - str r3, [r1, r12] - add r3, r1, r12 - str r2, [r3, #0x4] - ldrh r2, [r0, #0xa] - ldr r3, [r0, #0x4] - add r2, r3, r2 - str r1, [r2, #0x4] - str r1, [r0, #0x4] - ldrh r1, [r0, #0x8] - add r1, r1, #0x1 - strh r1, [r0, #0x8] - add sp, sp, #0x4 - ldmia sp!, {pc} - arm_func_end NNS_FndAppendListObject - - arm_func_start SetFirstObject -SetFirstObject: ; 0x020ADC48 - ldrh r3, [r0, #0xa] - mov r2, #0x0 - add r12, r1, r3 - str r2, [r12, #0x4] - str r2, [r1, r3] - str r1, [r0, #0x0] - str r1, [r0, #0x4] - ldrh r1, [r0, #0x8] - add r1, r1, #0x1 - strh r1, [r0, #0x8] - bx lr - arm_func_end SetFirstObject - - arm_func_start NNS_FndInitList -NNS_FndInitList: ; 0x020ADC74 - mov r2, #0x0 - str r2, [r0, #0x0] - str r2, [r0, #0x4] - strh r2, [r0, #0x8] - strh r1, [r0, #0xa] - bx lr - arm_func_end NNS_FndInitList diff --git a/arm9/lib/libnns/src/NNS_FND_heapcommon.c b/arm9/lib/libnns/src/NNS_FND_heapcommon.c index 2520aab2..664007f1 100644 --- a/arm9/lib/libnns/src/NNS_FND_heapcommon.c +++ b/arm9/lib/libnns/src/NNS_FND_heapcommon.c @@ -13,7 +13,7 @@ static inline void NNSi_FndHeapHeadSetOptionFlag(NNSiFndHeapHead *pHead, u8 opti void *NNS_FndGetNextListObject(NNSFndList *, void *);
-NNSiFndHeapHead* FindContainHeap(NNSFndList * pList, const void * memBlock)
+static NNSiFndHeapHead* FindContainHeap(NNSFndList * pList, const void * memBlock)
{
NNSiFndHeapHead * pHead = NULL;
@@ -30,7 +30,7 @@ NNSiFndHeapHead* FindContainHeap(NNSFndList * pList, const void * memBlock) return NULL;
}
-NNSFndList* FindListContainHeap(const void * memBlock)
+static NNSFndList* FindListContainHeap(const void * memBlock)
{
NNSFndList* ret = &sRootList;
NNSiFndHeapHead* pHead = FindContainHeap(&sRootList, memBlock);
diff --git a/arm9/lib/libnns/src/NNS_FND_list.c b/arm9/lib/libnns/src/NNS_FND_list.c new file mode 100644 index 00000000..d4dd7620 --- /dev/null +++ b/arm9/lib/libnns/src/NNS_FND_list.c @@ -0,0 +1,128 @@ +#include "nitro.h"
+#include "NNS_FND_list.h"
+
+#define OBJ_TO_LINK(list, obj) ((NNSFndLink*)((void*)(obj) + (list)->offset))
+
+void NNS_FndInitList(NNSFndList* list, s32 alignment)
+{
+ list->headObject = NULL;
+ list->tailObject = NULL;
+ list->numObjects = 0;
+ list->offset = (u16)alignment;
+}
+
+static void SetFirstObject(NNSFndList* list, void* object)
+{
+ NNSFndLink* tail = OBJ_TO_LINK(list, object);
+ tail->nextObject = NULL;
+ tail->prevObject = NULL;
+ list->headObject = object;
+ list->tailObject = object;
+ list->numObjects++;
+}
+
+void NNS_FndAppendListObject(NNSFndList* list, void* object)
+{
+ if (list->headObject == NULL)
+ {
+ SetFirstObject(list, object);
+ }
+ else
+ {
+ NNSFndLink *tail = OBJ_TO_LINK(list, object);
+ tail->prevObject = list->tailObject;
+ tail->nextObject = NULL;
+ OBJ_TO_LINK(list, list->tailObject)->nextObject = object;
+ list->tailObject = object;
+ list->numObjects++;
+ }
+}
+
+void NNS_FndPrependListObject(NNSFndList* list, void* object)
+{
+ if (list->headObject == NULL)
+ {
+ SetFirstObject(list, object);
+ }
+ else
+ {
+ NNSFndLink *tail = OBJ_TO_LINK(list, object);
+ tail->prevObject = NULL;
+ tail->nextObject = list->headObject;
+ OBJ_TO_LINK(list, list->headObject)->prevObject = object;
+ list->headObject = object;
+ list->numObjects++;
+ }
+}
+
+void NNS_FndInsertListObject(NNSFndList* list, void* where, void* object)
+{
+ if (where == NULL)
+ {
+ NNS_FndAppendListObject(list, object);
+ }
+
+ else if (where == list->headObject)
+ {
+ NNS_FndPrependListObject(list, object);
+ }
+ else
+ {
+ NNSFndLink* tail = OBJ_TO_LINK(list, object);
+ void* prevObject = OBJ_TO_LINK(list, where)->prevObject;
+ NNSFndLink* head = OBJ_TO_LINK(list, prevObject);
+ tail->prevObject = prevObject;
+ tail->nextObject = where;
+ head->nextObject = object;
+ OBJ_TO_LINK(list, where)->prevObject = object;
+ list->numObjects++;
+ }
+}
+
+void NNS_FndRemoveListObject(NNSFndList* list, void* object)
+{
+ NNSFndLink* node = OBJ_TO_LINK(list, object);
+ if (node->prevObject == NULL)
+ {
+ list->headObject = node->nextObject;
+ }
+ else
+ {
+ OBJ_TO_LINK(list, node->prevObject)->nextObject = node->nextObject;
+ }
+ if (node->nextObject == NULL)
+ {
+ list->tailObject = node->prevObject;
+ }
+ else
+ {
+ OBJ_TO_LINK(list, node->nextObject)->prevObject = node->prevObject;
+ }
+ node->prevObject = NULL;
+ node->nextObject = NULL;
+ list->numObjects--;
+}
+
+void * NNS_FndGetNextListObject(NNSFndList* list, void* object)
+{
+ if (object == NULL)
+ {
+ return list->headObject;
+ }
+ else
+ {
+ return OBJ_TO_LINK(list, object)->nextObject;
+ }
+}
+
+void * NNS_FndGetPrevListObject(NNSFndList* list, void* object)
+{
+ if (object == NULL)
+ {
+ return list->tailObject;
+ }
+ else
+ {
+ return OBJ_TO_LINK(list, object)->prevObject;
+ }
+}
|