gui2: more work (vlayout doesn't work, yet).

This commit is contained in:
Martin Preuss
2026-03-09 02:08:33 +01:00
parent 92efebccf1
commit 0758579b43
11 changed files with 657 additions and 523 deletions

View File

@@ -51,15 +51,14 @@
.equ OBJECT_OFFS_SELECTOR = 7
.equ OBJECT_OFFS_TARGET_LO = 8
.equ OBJECT_OFFS_TARGET_HI = 9
.equ OBJECT_OFFS_OPTS_LO = 10
.equ OBJECT_OFFS_OPTS_HI = 11
.equ OBJECT_OFFS_SIGNALMAP_LO = 12 ; byte address (for LPM!)
.equ OBJECT_OFFS_SIGNALMAP_HI = 13
.equ OBJECT_SIZE = 14
.equ OBJECT_OFFS_SIGNALMAP_LO = 10 ; byte address (for LPM!)
.equ OBJECT_OFFS_SIGNALMAP_HI = 11
.equ OBJECT_OFFS_OPTS = 12
.equ OBJECT_SIZE = 13
; object opts_lo
.equ OBJECT_OPTSLO_TIMER_BIT = 7
.equ OBJECT_OPTSLO_MSGRECV_BIT = 6
.equ OBJECT_OPTS_TIMER_BIT = 7
.equ OBJECT_OPTS_MSGRECV_BIT = 6
; SignalMap entries
.equ OBJECT_SIGNALMAP_OFFS_HEADER = 0
@@ -99,12 +98,21 @@ Object_Alloc:
push xh
push r16
push r17
bigcall Heap_Alloc ; X=mem allocated (r16, r17, r18, r19, r24, r25, X)
push r24
push r25
bigcall Heap_Alloc ; X=mem allocated (r16, r17, r18, r19, r24, r25, X)
pop r25
pop r24
pop r17
pop r16
brcc Object_Alloc_ret
mov yl, xl
mov yh, xh
clr r18
Object_Alloc_loop:
st X+, r18
sbiw r25:r24, 1
brne Object_Alloc_loop
sec
Object_Alloc_ret:
pop xh
@@ -118,24 +126,12 @@ Object_Alloc_ret:
; @routine OBJ_Init @global
;
; @param Y address of object in SDRAM
; @param r16 value for OBJECT_OFFS_OPTS_LO
; @param r17 value for OBJECT_OFFS_OPTS_HI
; @param r16 value for OBJECT_OFFS_OPTS
; @clobbers r16, r17, X
OBJ_Init:
push r16
push r17
mov xl, yl
mov xh, yh
clr r16
ldi r17, OBJECT_SIZE
bigcall Utils_FillSram ; (r17, X)
pop r17
pop r16
; set opts
std Y+OBJECT_OFFS_OPTS_LO, r16
std Y+OBJECT_OFFS_OPTS_HI, r17
std Y+OBJECT_OFFS_OPTS, r16
; set default signal map
ldi r16, LOW(Object_DefaultSignalmap*2)
@@ -287,8 +283,8 @@ OBJ_GetFirstChild:
brne OBJ_GetFirstChild_notNull
rjmp OBJ_GetFirstChild_clcRet
OBJ_GetFirstChild_notNull:
ldd r18, Y+OBJECT_OFFS_PARENT_LO
ldd r19, Y+OBJECT_OFFS_PARENT_HI
ldd r18, Y+OBJECT_OFFS_CHILD_LO
ldd r19, Y+OBJECT_OFFS_CHILD_HI
tst r18
brne OBJ_GetFirstChild_secRet
tst r19
@@ -394,7 +390,7 @@ OBJ_AddChild:
; ---------------------------------------------------------------------------
; @routine objAddObjXAsChildToY
;
; @param Y object to add to
; @param Y designated parent
; @param X object to add
; @clobbers r18, r19
@@ -551,7 +547,15 @@ OBJ_HandleSignal_loop:
; try this table
push zl
push zh
rcall objHandleSignalWithMap ; (any, !Y)
push r16
push r17
push xl
push xh
rcall objHandleSignalWithMap ; (any, !Y)
pop xh
pop xl
pop r17
pop r16
pop zh
pop zl
brcs OBJ_HandleSignal_ret
@@ -608,18 +612,18 @@ OBJ_TreeHandleSignal_done:
; ---------------------------------------------------------------------------
; @routine OBJ_TreeHandleSignalIfMatchingOptsLo @global @recursive
; @routine OBJ_TreeHandleSignalIfMatchingOpts @global @recursive
;
; @param Y address of object
; @param R16 signal number
; @param R17 selector
; @param xl param1
; @param xh param2
; @param r20 mask for OBJECT_OFFS_OPTS_LO
; @param r21 value for OBJECT_OFFS_OPTS_LO to match
; @param r20 mask for OBJECT_OFFS_OPTS
; @param r21 value for OBJECT_OFFS_OPTS to match
; @clobbers any, !R16, !R17, !X, !Y
OBJ_TreeHandleSignalIfMatchingOptsLo:
OBJ_TreeHandleSignalIfMatchingOpts:
push yl
push yh
; call signal handler
@@ -627,30 +631,30 @@ OBJ_TreeHandleSignalIfMatchingOptsLo:
push r17
push xl
push xh
ldd r18, Y+OBJECT_OFFS_OPTS_LO
ldd r18, Y+OBJECT_OFFS_OPTS
eor r18, r21
and r18, r20
brne OBJ_TreeHandleSignalIfMatchingOptsLo_l1
brne OBJ_TreeHandleSignalIfMatchingOpts_l1
push r20
push r21
rcall OBJ_HandleSignal ; (any, !Y)
pop r21
pop r20
OBJ_TreeHandleSignalIfMatchingOptsLo_l1:
OBJ_TreeHandleSignalIfMatchingOpts_l1:
pop xh
pop xl
pop r17
pop r16
; handle children
rcall OBJ_GetFirstChild ; r19:r18=object (none)
OBJ_TreeHandleSignalIfMatchingOptsLo_loop:
brcc OBJ_TreeHandleSignalIfMatchingOptsLo_done
OBJ_TreeHandleSignalIfMatchingOpts_loop:
brcc OBJ_TreeHandleSignalIfMatchingOpts_done
mov yl, r18
mov yh, r19
rcall OBJ_TreeHandleSignalIfMatchingOptsLo ; recursion!
rcall OBJ_TreeHandleSignalIfMatchingOpts ; recursion!
rcall OBJ_GetNext ; r19:r18=object (none)
rjmp OBJ_TreeHandleSignalIfMatchingOptsLo_loop
OBJ_TreeHandleSignalIfMatchingOptsLo_done:
rjmp OBJ_TreeHandleSignalIfMatchingOpts_loop
OBJ_TreeHandleSignalIfMatchingOpts_done:
pop yh
pop yl
ret
@@ -678,8 +682,8 @@ OBJ_TreeHandleSignalIfFlagsSet:
push xl
push xh
ldd r18, Y+OBJECT_OFFS_FLAGS
and r18, r20
eor r18, r20
and r18, r20
brne OBJ_TreeHandleSignalIfFlagsSet_l1
push r20
rcall OBJ_HandleSignal ; (any, !Y)