avr: simplify handling of object tree
- set CFLAG if pointer valid, cleared otherwise - check for inbound NULL pointer
This commit is contained in:
@@ -57,14 +57,30 @@
|
|||||||
; @routine OBJ_GetParent @global
|
; @routine OBJ_GetParent @global
|
||||||
;
|
;
|
||||||
; @param Z byte address of object (for LPM!)
|
; @param Z byte address of object (for LPM!)
|
||||||
|
; @return CFLAG set, if found, cleared otherwise
|
||||||
; @return r19:r18 resulting object (byte address for LPM!), NULL otherwise
|
; @return r19:r18 resulting object (byte address for LPM!), NULL otherwise
|
||||||
; @clobbers none
|
; @clobbers none
|
||||||
|
|
||||||
OBJ_GetParent:
|
OBJ_GetParent:
|
||||||
|
tst zh
|
||||||
|
brne OBJ_GetParent_get
|
||||||
|
tst zl
|
||||||
|
brne OBJ_GetParent_get
|
||||||
|
clc
|
||||||
|
rjmp OBJ_GetParent_ret
|
||||||
|
OBJ_GetParent_get:
|
||||||
adiw zh:zl, OBJECT_OFFS_PARENT_LO
|
adiw zh:zl, OBJECT_OFFS_PARENT_LO
|
||||||
lpm r18, Z+
|
lpm r18, Z+
|
||||||
lpm r19, Z
|
lpm r19, Z
|
||||||
sbiw zh:zl, (OBJECT_OFFS_PARENT_LO+1)
|
sbiw zh:zl, (OBJECT_OFFS_PARENT_LO+1)
|
||||||
|
tst r18
|
||||||
|
brne OBJ_GetParent_secRet
|
||||||
|
tst r19
|
||||||
|
clc
|
||||||
|
breq OBJ_GetParent_ret
|
||||||
|
OBJ_GetParent_secRet:
|
||||||
|
sec
|
||||||
|
OBJ_GetParent_ret:
|
||||||
ret
|
ret
|
||||||
; @end
|
; @end
|
||||||
|
|
||||||
@@ -74,14 +90,30 @@ OBJ_GetParent:
|
|||||||
; @routine OBJ_GetFirstChild @global
|
; @routine OBJ_GetFirstChild @global
|
||||||
;
|
;
|
||||||
; @param Z byte address of object (for LPM!)
|
; @param Z byte address of object (for LPM!)
|
||||||
|
; @return CFLAG set, if found, cleared otherwise
|
||||||
; @return r19:r18 resulting object (byte address for LPM!), NULL otherwise
|
; @return r19:r18 resulting object (byte address for LPM!), NULL otherwise
|
||||||
; @clobbers none
|
; @clobbers none
|
||||||
|
|
||||||
OBJ_GetFirstChild:
|
OBJ_GetFirstChild:
|
||||||
|
tst zh
|
||||||
|
brne OBJ_GetFirstChild_get
|
||||||
|
tst zl
|
||||||
|
brne OBJ_GetFirstChild_get
|
||||||
|
clc
|
||||||
|
rjmp OBJ_GetFirstChild_ret
|
||||||
|
OBJ_GetFirstChild_get:
|
||||||
adiw zh:zl, OBJECT_OFFS_CHILD_LO
|
adiw zh:zl, OBJECT_OFFS_CHILD_LO
|
||||||
lpm r18, Z+
|
lpm r18, Z+
|
||||||
lpm r19, Z
|
lpm r19, Z
|
||||||
sbiw zh:zl, OBJECT_OFFS_CHILD_LO+1
|
sbiw zh:zl, OBJECT_OFFS_CHILD_LO+1
|
||||||
|
tst r18
|
||||||
|
brne OBJ_GetFirstChild_secRet
|
||||||
|
tst r19
|
||||||
|
clc
|
||||||
|
breq OBJ_GetFirstChild_ret
|
||||||
|
OBJ_GetFirstChild_secRet:
|
||||||
|
sec
|
||||||
|
OBJ_GetFirstChild_ret:
|
||||||
ret
|
ret
|
||||||
; @end
|
; @end
|
||||||
|
|
||||||
@@ -91,14 +123,30 @@ OBJ_GetFirstChild:
|
|||||||
; @routine OBJ_GetNext @global
|
; @routine OBJ_GetNext @global
|
||||||
;
|
;
|
||||||
; @param Z byte address of object (for LPM!)
|
; @param Z byte address of object (for LPM!)
|
||||||
|
; @return CFLAG set, if found, cleared otherwise
|
||||||
; @return r19:r18 resulting object (byte address for LPM!), NULL otherwise
|
; @return r19:r18 resulting object (byte address for LPM!), NULL otherwise
|
||||||
; @clobbers none
|
; @clobbers none
|
||||||
|
|
||||||
OBJ_GetNext:
|
OBJ_GetNext:
|
||||||
|
tst zh
|
||||||
|
brne OBJ_GetNext_get
|
||||||
|
tst zl
|
||||||
|
brne OBJ_GetNext_get
|
||||||
|
clc
|
||||||
|
rjmp OBJ_GetNext_ret
|
||||||
|
OBJ_GetNext_get:
|
||||||
adiw zh:zl, OBJECT_OFFS_NEXT_LO
|
adiw zh:zl, OBJECT_OFFS_NEXT_LO
|
||||||
lpm r18, Z+
|
lpm r18, Z+
|
||||||
lpm r19, Z
|
lpm r19, Z
|
||||||
sbiw zh:zl, OBJECT_OFFS_NEXT_LO+1
|
sbiw zh:zl, OBJECT_OFFS_NEXT_LO+1
|
||||||
|
tst r18
|
||||||
|
brne OBJ_GetNext_secRet
|
||||||
|
tst r19
|
||||||
|
clc
|
||||||
|
breq OBJ_GetNext_ret
|
||||||
|
OBJ_GetNext_secRet:
|
||||||
|
sec
|
||||||
|
OBJ_GetNext_ret:
|
||||||
ret
|
ret
|
||||||
; @end
|
; @end
|
||||||
|
|
||||||
@@ -108,38 +156,30 @@ OBJ_GetNext:
|
|||||||
; @routine OBJ_GetBelow @global
|
; @routine OBJ_GetBelow @global
|
||||||
;
|
;
|
||||||
; @param Z byte address of object (for LPM!)
|
; @param Z byte address of object (for LPM!)
|
||||||
|
; @return CFLAG set, if found, cleared otherwise
|
||||||
; @return r19:r18 resulting object (byte address for LPM!), NULL otherwise
|
; @return r19:r18 resulting object (byte address for LPM!), NULL otherwise
|
||||||
; @clobbers r16
|
; @clobbers r16
|
||||||
|
|
||||||
OBJ_GetBelow:
|
OBJ_GetBelow:
|
||||||
; check first child
|
tst zh
|
||||||
|
brne OBJ_GetBelow_get
|
||||||
|
tst zl
|
||||||
|
breq OBJ_GetBelow_ret
|
||||||
|
OBJ_GetBelow_get:
|
||||||
rcall OBJ_GetFirstChild
|
rcall OBJ_GetFirstChild
|
||||||
mov r16, r18
|
brcs OBJ_GetBelow_ret ; jmp if found
|
||||||
or r16, r19
|
|
||||||
sec
|
|
||||||
brne OBJ_GetBelow_ret
|
|
||||||
; check neighbour
|
|
||||||
rcall OBJ_GetNext
|
rcall OBJ_GetNext
|
||||||
mov r16, r18
|
brcs OBJ_GetBelow_ret ; jmp if found
|
||||||
or r16, r19
|
|
||||||
sec
|
|
||||||
brne OBJ_GetBelow_ret
|
|
||||||
|
|
||||||
OBJ_GetBelow_loop:
|
OBJ_GetBelow_loop:
|
||||||
rcall OBJ_GetParent
|
rcall OBJ_GetParent
|
||||||
mov r16, r18
|
brcc OBJ_GetBelow_ret ; jmp if no parent
|
||||||
or r16, r19
|
|
||||||
clc
|
|
||||||
breq OBJ_GetBelow_ret
|
|
||||||
; use parent
|
; use parent
|
||||||
mov zl, r18
|
mov zl, r18
|
||||||
mov zh, r19
|
mov zh, r19
|
||||||
; don't check for first child here, we came from there!
|
; don't check for first child here, we came from there!
|
||||||
rcall OBJ_GetNext
|
rcall OBJ_GetNext
|
||||||
mov r16, r18
|
brcs OBJ_GetBelow_ret
|
||||||
or r16, r19
|
|
||||||
sec
|
|
||||||
brne OBJ_GetBelow_ret
|
|
||||||
rjmp OBJ_GetBelow_loop
|
rjmp OBJ_GetBelow_loop
|
||||||
OBJ_GetBelow_ret:
|
OBJ_GetBelow_ret:
|
||||||
ret
|
ret
|
||||||
|
|||||||
Reference in New Issue
Block a user