avr: added some unit tests for LIST and TREE.
This commit is contained in:
@@ -54,11 +54,26 @@ List_InitObject:
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine List_FiniObject @global
|
||||
;
|
||||
; @param Y pointer to object
|
||||
; @clobbers r16
|
||||
|
||||
List_FiniObject:
|
||||
clr r16 ; set this->NEXT to NULL
|
||||
std Y+LIST_OFFS_NEXT_LO, r16
|
||||
std Y+LIST_OFFS_NEXT_HI, r16
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine List_GetNextObject @global
|
||||
|
||||
; @param Y pointer to object
|
||||
; @return X pointer to parent object
|
||||
; @return X pointer to successor object
|
||||
; @clobbers none
|
||||
|
||||
List_GetNextObject:
|
||||
@@ -101,13 +116,13 @@ List_GetPredecessorFor:
|
||||
cp r16, yl
|
||||
brne List_GetPredecessorFor_next
|
||||
cp r17, yh
|
||||
breq List_GetLastObject_haveIt
|
||||
breq List_GetPredecessorFor_haveIt
|
||||
List_GetPredecessorFor_next:
|
||||
mov xl, r16
|
||||
mov xh, r17
|
||||
rjmp List_GetPredecessorFor
|
||||
List_GetPredecessorFor_haveIt:
|
||||
sbiw xh:xl, 1
|
||||
sbiw xh:xl, 2
|
||||
List_GetPredecessorFor_ret:
|
||||
ret
|
||||
; @end
|
||||
@@ -127,8 +142,14 @@ List_AddObject:
|
||||
rcall List_GetLastObject ; (r16, r17, X, Y)
|
||||
pop yh
|
||||
pop yl
|
||||
st X+, yl ; WID_OFFS_WNEXT_LO
|
||||
st X+, yh ; WID_OFFS_WNEXT_HI
|
||||
mov r16, xl
|
||||
or r16, xh
|
||||
clc
|
||||
breq List_AddObject_ret
|
||||
st X+, yl ; LIST_OFFS_NEXT_LO
|
||||
st X+, yh ; LIST_OFFS_NEXT_HI
|
||||
sec
|
||||
List_AddObject_ret:
|
||||
ret
|
||||
; @end
|
||||
|
||||
@@ -163,4 +184,68 @@ List_UnlinkObject_ret:
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine List_UnlinkAllObjects
|
||||
|
||||
; @param Y pointer to first object in a list
|
||||
; @clobbers r16, r17, r18, Y
|
||||
|
||||
List_UnlinkAllObjects:
|
||||
clr r18
|
||||
List_UnlinkAllObjects_loop:
|
||||
ldd r16, Y+LIST_OFFS_NEXT_LO
|
||||
ldd r17, Y+LIST_OFFS_NEXT_HI
|
||||
std Y+LIST_OFFS_NEXT_LO, r18
|
||||
std Y+LIST_OFFS_NEXT_HI, r18
|
||||
mov yl, r16
|
||||
mov yh, r17
|
||||
or r16, r17
|
||||
brne List_UnlinkAllObjects_loop
|
||||
ret
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
; ---------------------------------------------------------------------------
|
||||
; @routine List_ForEveryObject
|
||||
;
|
||||
; Calls the given function for every object until it
|
||||
; returns with a set carry flag or until the full list
|
||||
; is handled.
|
||||
; Registers that can be used by the given function are all
|
||||
; except R16, R18 and R19 (those are used by this routine).
|
||||
;
|
||||
; @param Y pointer to first object in a list
|
||||
; @param Z routine to call for every object
|
||||
; @clobbers r16, r17, r18, r19, X, Y (r24, r25)
|
||||
|
||||
List_ForEveryObject:
|
||||
List_ForEveryObject_loop:
|
||||
ldd r18, Y+LIST_OFFS_NEXT_LO ; next
|
||||
ldd r19, Y+LIST_OFFS_NEXT_HI ; next
|
||||
clr r16
|
||||
std Y+LIST_OFFS_NEXT_LO, r16
|
||||
std Y+LIST_OFFS_NEXT_HI, r16
|
||||
push r18 ; next
|
||||
push r19 ; next
|
||||
rcall List_ForEveryObject_callZ
|
||||
pop r19 ; next
|
||||
pop r18 ; next
|
||||
brcs List_ForEveryObject_ret
|
||||
mov yl, r18
|
||||
mov yh, r19
|
||||
or r18, r19
|
||||
brne List_ForEveryObject_loop
|
||||
List_ForEveryObject_ret:
|
||||
ret
|
||||
List_ForEveryObject_callZ:
|
||||
ijmp
|
||||
; @end
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
#endif ; AQH_AVR_COMMON_LIST_H
|
||||
|
||||
Reference in New Issue
Block a user