avr: added some unit tests for LIST and TREE.
This commit is contained in:
@@ -17,10 +17,10 @@
|
||||
; defs
|
||||
|
||||
.equ TREE_OFFS_LIST = 0
|
||||
.equ TREE_OFFS_WPARENT_LO = TREE_OFFS_LIST+LIST_SIZE
|
||||
.equ TREE_OFFS_WPARENT_HI = TREE_OFFS_LIST+LIST_SIZE+1
|
||||
.equ TREE_OFFS_WCHILD_LO = TREE_OFFS_LIST+LIST_SIZE+2
|
||||
.equ TREE_OFFS_WCHILD_HI = TREE_OFFS_LIST+LIST_SIZE+3
|
||||
.equ TREE_OFFS_PARENT_LO = TREE_OFFS_LIST+LIST_SIZE
|
||||
.equ TREE_OFFS_PARENT_HI = TREE_OFFS_LIST+LIST_SIZE+1
|
||||
.equ TREE_OFFS_CHILD_LO = TREE_OFFS_LIST+LIST_SIZE+2
|
||||
.equ TREE_OFFS_CHILD_HI = TREE_OFFS_LIST+LIST_SIZE+3
|
||||
.equ TREE_SIZE = TREE_OFFS_LIST+LIST_SIZE+4
|
||||
|
||||
|
||||
@@ -42,10 +42,10 @@
|
||||
Tree_InitObject:
|
||||
rcall List_InitObject ; (R16)
|
||||
clr r16 ; clear this->TREE data
|
||||
std Y+TREE_OFFS_LIST+TREE_OFFS_WPARENT_LO, r16
|
||||
std Y+TREE_OFFS_LIST+TREE_OFFS_WPARENT_HI, r16
|
||||
std Y+TREE_OFFS_LIST+TREE_OFFS_WCHILD_LO, r16
|
||||
std Y+TREE_OFFS_LIST+TREE_OFFS_WCHILD_HI, r16
|
||||
std Y+TREE_OFFS_LIST+TREE_OFFS_PARENT_LO, r16
|
||||
std Y+TREE_OFFS_LIST+TREE_OFFS_PARENT_HI, r16
|
||||
std Y+TREE_OFFS_LIST+TREE_OFFS_CHILD_LO, r16
|
||||
std Y+TREE_OFFS_LIST+TREE_OFFS_CHILD_HI, r16
|
||||
ret
|
||||
; @end
|
||||
|
||||
@@ -59,8 +59,8 @@ Tree_InitObject:
|
||||
; @clobbers none
|
||||
|
||||
Tree_GetParentObject:
|
||||
ldd xl, Y+TREE_OFFS_WPARENT_LO
|
||||
ldd xh, Y+TREE_OFFS_WPARENT_HI
|
||||
ldd xl, Y+TREE_OFFS_PARENT_LO
|
||||
ldd xh, Y+TREE_OFFS_PARENT_HI
|
||||
ret
|
||||
; @end
|
||||
|
||||
@@ -74,13 +74,46 @@ Tree_GetParentObject:
|
||||
; @clobbers none
|
||||
|
||||
Tree_GetFirstChildObject:
|
||||
ldd xl, Y+TREE_OFFS_WCHILD_LO
|
||||
ldd xh, Y+TREE_OFFS_WCHILD_HI
|
||||
ldd xl, Y+TREE_OFFS_CHILD_LO
|
||||
ldd xh, Y+TREE_OFFS_CHILD_HI
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine Tree_GetLastChildObject @global
|
||||
|
||||
; @param Y pointer to object
|
||||
; @return X pointer to last child object
|
||||
; @clobbers none
|
||||
|
||||
Tree_GetLastChildObject:
|
||||
ldd xl, Y+TREE_OFFS_CHILD_LO
|
||||
ldd xh, Y+TREE_OFFS_CHILD_HI
|
||||
mov r16, xl
|
||||
or r16, xh
|
||||
breq Tree_GetLastChildObject_ret
|
||||
rcall List_GetLastObject
|
||||
Tree_GetLastChildObject_ret:
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine Tree_GetNextSibling @global
|
||||
|
||||
; @param Y pointer to object
|
||||
; @return X pointer to successor object
|
||||
; @clobbers none
|
||||
|
||||
Tree_GetNextSibling:
|
||||
rjmp List_GetNextObject
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine Tree_GetObjectBelow @global
|
||||
|
||||
@@ -101,7 +134,7 @@ treeGetObjectBelow:
|
||||
mov r16, xl
|
||||
or r16, xh
|
||||
brne treeGetObjectBelow_ret ; got one
|
||||
rcall List_GetNextObject
|
||||
rcall Tree_GetNextSibling
|
||||
mov r16, xl
|
||||
or r16, xh
|
||||
brne treeGetObjectBelow_ret ; got one
|
||||
@@ -122,27 +155,27 @@ treeGetObjectBelow_ret:
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine Tree_AddChildObject @global
|
||||
|
||||
; @param X pointer to parent to add to
|
||||
; @param Y pointer to object to add
|
||||
; @param X pointer to parent to add to
|
||||
; @clobbers r16, r17, r18, x
|
||||
|
||||
Tree_AddChildObject:
|
||||
std Y+TREE_OFFS_WPARENT_LO, xl ; immediately store parent pointer
|
||||
std Y+TREE_OFFS_WPARENT_HI, xh
|
||||
adiw xh:xl, TREE_OFFS_WCHILD_LO
|
||||
std Y+TREE_OFFS_PARENT_LO, xl ; immediately store parent pointer
|
||||
std Y+TREE_OFFS_PARENT_HI, xh
|
||||
adiw xh:xl, TREE_OFFS_CHILD_LO ; read pointer to first child
|
||||
ld r16, X+
|
||||
ld r17, X
|
||||
mov r18, r16
|
||||
or r18, r17
|
||||
brne Tree_AddChildObject_addToChildList
|
||||
st X, yh ; no child, set THIS as first
|
||||
st X, yh ; no child, set THIS as first
|
||||
st -X, yl
|
||||
sbiw xh:xl, WID_OFFS_TREE+TREE_OFFS_WCHILD_LO
|
||||
sbiw xh:xl, TREE_OFFS_CHILD_LO
|
||||
ret
|
||||
Tree_AddChildObject_addToChildList:
|
||||
mov xl, r16
|
||||
mov xl, r16 ; X=first child
|
||||
mov xh, r17
|
||||
rjmp List_AddObject
|
||||
rjmp List_AddObject ; add Y as new object
|
||||
; @end
|
||||
|
||||
|
||||
@@ -154,17 +187,17 @@ Tree_AddChildObject_addToChildList:
|
||||
; @clobbers r16, r17, x
|
||||
|
||||
Tree_UnlinkObject:
|
||||
ldd xl, Y+TREE_OFFS_WPARENT_LO
|
||||
ldd xh, Y+TREE_OFFS_WPARENT_HI
|
||||
ldd xl, Y+TREE_OFFS_PARENT_LO
|
||||
ldd xh, Y+TREE_OFFS_PARENT_HI
|
||||
mov r16, xl
|
||||
or r16, xh
|
||||
breq Tree_UnlinkObject_ret ; not part of a tree
|
||||
adiw xh:xl, TREE_OFFS_WCHILD_LO ; get parent's first child to R17:R16
|
||||
adiw xh:xl, TREE_OFFS_CHILD_LO ; get parent's first child to R17:R16
|
||||
ld r16, X+
|
||||
ld r17, X
|
||||
cp r16, yl ; same as THIS?
|
||||
brne Tree_UnlinkObject_inList ; nope, need to check childList
|
||||
cp r17, yh
|
||||
cp r17, yh ; same as THIS?
|
||||
brne Tree_UnlinkObject_inList ; nope, need to check childList
|
||||
ldd r16, Y+TREE_OFFS_LIST+LIST_OFFS_NEXT_HI ; is first child, set this->NEXT as new first child
|
||||
st X, r16
|
||||
@@ -177,8 +210,8 @@ Tree_UnlinkObject_inList:
|
||||
rcall List_UnlinkObject ; (R16, R17, X)
|
||||
Tree_UnlinkObject_clrParentAndSibling:
|
||||
clr r16 ; clear this->PARENT
|
||||
std Y+TREE_OFFS_LIST+TREE_OFFS_WPARENT_LO, r16
|
||||
std Y+TREE_OFFS_LIST+TREE_OFFS_WPARENT_HI, r16
|
||||
std Y+TREE_OFFS_PARENT_LO, r16
|
||||
std Y+TREE_OFFS_PARENT_HI, r16
|
||||
std Y+LIST_OFFS_NEXT_LO, r16
|
||||
std Y+LIST_OFFS_NEXT_HI, r16 ; clear this->NEXT
|
||||
Tree_UnlinkObject_ret:
|
||||
@@ -188,5 +221,6 @@ Tree_UnlinkObject_ret:
|
||||
|
||||
|
||||
|
||||
|
||||
#endif ; AQH_AVR_COMMON_TREE_H
|
||||
|
||||
|
||||
Reference in New Issue
Block a user