avr: more work on gui2

- decreased complexitiy by removing guicntl
- changed fonts to allow for storing bitmaps in ressource segment
- add fonts to ressources for display node c03
- added some safety features (check pointers, add magic field to objects etc)
- moved style.asm to device folder
This commit is contained in:
Martin Preuss
2026-01-17 15:23:17 +01:00
parent 20189eb1eb
commit c2489e1866
16 changed files with 1399 additions and 1070 deletions

View File

@@ -41,9 +41,10 @@
.equ WIDGET_SD_SIZE = 1
; widget opts_lo
.equ WIDGETS_OPTSLO_BORDER_BIT = 7
.equ WIDGETS_OPTSLO_INPUT_BIT = 6 ; TOUCH, KEY
.equ WIDGETS_OPTSLO_TIMER_BIT = 5
.equ WIDGETS_OPTSLO_BORDER_BIT = 7
.equ WIDGETS_OPTSLO_INPUT_BIT = 6 ; TOUCH, KEY
.equ WIDGETS_OPTSLO_TIMER_BIT = 5
.equ WIDGETS_OPTSLO_MSGRECV_BIT = 4
; widget flags
.equ WIDGET_FLAGS_ACTIVE_BIT = 7
@@ -319,24 +320,18 @@ Widget_GetSdramPtr:
;
; @param Z byte address of widget object (for LPM!)
; @param R16 flags to add
; @clobbers R17, R18, R19, Y
; @clobbers R17, R18, R19, R22, R23, Y
Widget_AddFlagsDown:
mov r17, zl
or r17, zh
breq Widget_AddFlagsDown_ret
rcall OBJ_IsObject
brcc Widget_AddFlagsDown_ret
rcall Widget_GetSdramPtr
ldd r17, Y+WIDGET_SD_OFFS_FLAGS
or r17, r16
std Y+WIDGET_SD_OFFS_FLAGS, r17
rcall Widget_AddFlags ; (R17, R22, R23)
push zl
push zh
bigcall OBJ_GetFirstChild ; R19:R18=next object
Widget_AddFlagsDown_loop:
mov r17, r18
or r17, r19
breq Widget_AddFlagsDown_loopEnd
brcc Widget_AddFlagsDown_loopEnd
mov zl, r18
mov zh, r19
rcall Widget_AddFlagsDown
@@ -352,35 +347,27 @@ Widget_AddFlagsDown_ret:
; ---------------------------------------------------------------------------
; @routine Widget_SubFlagsDown @global
;
; @param Z byte address of widget object (for LPM!)
; @param R16 flags to add
; @clobbers R17, R18, R19, Y
; @clobbers R17, R18, R19, R22, R23
Widget_SubFlagsDown:
mov r17, zl
or r17, zh
breq Widget_SubFlagsDown_ret
rcall Widget_GetSdramPtr
ldd r17, Y+WIDGET_SD_OFFS_FLAGS
com r16 ; one's-complement
and r17, r16
com r16
std Y+WIDGET_SD_OFFS_FLAGS, r17
rcall OBJ_IsObject ; (none)
brcc Widget_SubFlagsDown_ret
rcall Widget_SubFlags ; (R17)
push zl
push zh
bigcall OBJ_GetFirstChild ; R19:R18=next object
Widget_SubFlagsDown_loop:
mov r17, r18
or r17, r19
breq Widget_SubFlagsDown_loopEnd
brcc Widget_SubFlagsDown_loopEnd
mov zl, r18
mov zh, r19
rcall Widget_SubFlagsDown
bigcall OBJ_GetNext
rcall OBJ_GetNext
rjmp Widget_SubFlagsDown_loop
Widget_SubFlagsDown_loopEnd:
@@ -392,6 +379,59 @@ Widget_SubFlagsDown_ret:
; ---------------------------------------------------------------------------
; @routine Widget_AddFlags @global
;
; @param Z byte address of widget object (for LPM!)
; @param R16 flags to add
; @clobbers R17, R22, R23
Widget_AddFlags:
rcall OBJ_IsObject
brcc Widget_AddFlags_ret
push yl
push yh
rcall Widget_GetSdramPtr ; (none)
ldd r17, Y+WIDGET_SD_OFFS_FLAGS
or r17, r16
std Y+WIDGET_SD_OFFS_FLAGS, r17
pop yh
pop yl
Widget_AddFlags_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine Widget_SubFlags @global
;
; @param Z byte address of widget object (for LPM!)
; @param R16 flags to clear
; @clobbers R17
Widget_SubFlags:
mov r17, zl
or r17, zh
breq Widget_SubFlags_ret
push yl
push yh
rcall Widget_GetSdramPtr ; (none)
ldd r17, Y+WIDGET_SD_OFFS_FLAGS
com r16 ; one's-complement
and r17, r16
com r16
std Y+WIDGET_SD_OFFS_FLAGS, r17
pop yh
pop yl
Widget_SubFlags_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine Widget_Clear @global
;
@@ -727,14 +767,242 @@ Widget_Tree_Init_loopEnd:
; ---------------------------------------------------------------------------
; @routine Widget_Tree_Draw @global
; @routine Widget_Tree_SendDrawSignal @global
;
; @param Z byte address of root widget object (for LPM!)
Widget_Tree_Draw:
Widget_Tree_SendDrawSignal:
ldi r16, WIDGET_SIGNAL_DRAW
clr r17
bigcall OBJ_TreeAllHandleSignal
; only let active and dirty widgets draw
ldi r20, (1<<WIDGET_FLAGS_DIRTY_BIT)
ldi r21, (1<<WIDGET_FLAGS_DIRTY_BIT)
rcall Widget_TreeMatchFlagsAndSendSignalToActive
ret
; @end
; ---------------------------------------------------------------------------
; @routine Widget_Tree_SendTouchSignal @global
;
; @param Z byte address of root widget object (for LPM!)
; @param X pointer to touch event datain SDRAM
Widget_Tree_SendTouchSignal:
ldi r16, WIDGET_SIGNAL_TOUCH
clr r17
; only check active widgets
ldi r20, (1<<WIDGETS_OPTSLO_INPUT_BIT)
ldi r21, (1<<WIDGETS_OPTSLO_INPUT_BIT)
rcall Widget_TreeMatchOptsAndSendSignal
ret
; @end
; ---------------------------------------------------------------------------
; @routine Widget_Tree_SendTimerSignal @global
;
; @param Z byte address of root widget object (for LPM!)
Widget_Tree_SendTimerSignal:
ldi r16, OBJECT_SIGNAL_TIMER
clr r17
; only check active widgets
ldi r20, (1<<WIDGETS_OPTSLO_TIMER_BIT)
ldi r21, (1<<WIDGETS_OPTSLO_TIMER_BIT)
rcall Widget_TreeMatchOptsAndSendSignal
ret
; @end
; ---------------------------------------------------------------------------
; @routine Widget_Tree_SendMsgRecvSignal @global
;
; @param Z byte address of root widget object (for LPM!)
; @param X pointer to received message in SDRAM
Widget_Tree_SendMsgRecvSignal:
ldi r16, OBJECT_SIGNAL_RECVMSG
clr r17
; only check active widgets
ldi r20, (1<<WIDGETS_OPTSLO_MSGRECV_BIT)
ldi r21, (1<<WIDGETS_OPTSLO_MSGRECV_BIT)
rcall Widget_TreeMatchOptsAndSendSignal
ret
; @end
; ---------------------------------------------------------------------------
; @routine Widget_TreeMatchOptsAndSendSignal @global
;
; Send signal to all widgets whose WIDGET_OFFS_OPTS_LO matches the given mask/value.
; Widgets which don't match will not be called, but there children will still be checked
; (as opposed to Widget_TreeMatchingHandleSignal which would also skip the children).
;
; @param Z byte address of object (for LPM!)
; @param R16 signal number
; @param R17 selector
; @param R20 mask for WIDGET_OFFS_OPTS_LO to match
; @param R21 value for WIDGET_OFFS_OPTS_LO to match
; @param xl param1
; @param xh param2
; @clobbers any, !R16, !R17, !X, !Z
Widget_TreeMatchOptsAndSendSignal:
push zl
push zh
Widget_TreeMatchOptsAndSendSignal_loop:
mov r18, zl
or r18, zh
breq Widget_TreeMatchOptsAndSendSignal_done
adiw zh:zl, WIDGET_OFFS_OPTS_LO
lpm r18, Z
sbiw zh:zl, WIDGET_OFFS_OPTS_LO
eor r18, r21 ; XOR with value (1 if different)
and r18, r20 ; AND with mask
brne Widget_TreeMatchOptsAndSendSignal_next
push r20
push r21
rcall OBJ_HandleSignalSaveInRegs
pop r21
pop r20
Widget_TreeMatchOptsAndSendSignal_next:
push r16
rcall OBJ_GetBelow ; (R16)
pop r16
brcc Widget_TreeMatchOptsAndSendSignal_done
mov zl, r18
mov zh, r19
rjmp Widget_TreeMatchOptsAndSendSignal_loop
Widget_TreeMatchOptsAndSendSignal_done:
pop zh
pop zl
ret
; @end
; ---------------------------------------------------------------------------
; @routine Widget_TreeMatchOptsAndSendSignalToActive @global
;
; Send signal to all widgets whose WIDGET_OFFS_OPTS_LO matches the given mask/value.
; Inactive branches are skipped.
;
; @param Z byte address of object (for LPM!)
; @param R16 signal number
; @param R17 selector
; @param R20 mask for WIDGET_OFFS_OPTS_LO to match
; @param R21 value for WIDGET_OFFS_OPTS_LO to match
; @param xl param1
; @param xh param2
; @clobbers any, !R16, !R17, !X, !Z
Widget_TreeMatchOptsAndSendSignalToActive:
push zl
push zh
Widget_TreeMatchOptsAndSendSignalToActive_loop:
mov r18, zl
or r18, zh
breq Widget_TreeMatchOptsAndSendSignalToActive_done
; check flags
rcall Widget_GetSdramPtr ; (none)
ldd r18, Y+WIDGET_SD_OFFS_FLAGS
sbrc r18, WIDGET_FLAGS_ACTIVE_BIT
rjmp Widget_TreeMatchOptsAndSendSignalToActive_checkOpts
push r16
rcall OBJ_GetBelowSkipChildren ; (R16)
pop r16
rjmp Widget_TreeMatchOptsAndSendSignalToActive_next
Widget_TreeMatchOptsAndSendSignalToActive_checkOpts:
adiw zh:zl, WIDGET_OFFS_OPTS_LO
lpm r18, Z
sbiw zh:zl, WIDGET_OFFS_OPTS_LO
eor r18, r21 ; XOR with value (1 if different)
and r18, r20 ; AND with mask
brne Widget_TreeMatchOptsAndSendSignalToActive_below
push r20
push r21
rcall OBJ_HandleSignalSaveInRegs
pop r21
pop r20
Widget_TreeMatchOptsAndSendSignalToActive_below:
push r16
rcall OBJ_GetBelow ; (R16)
pop r16
Widget_TreeMatchOptsAndSendSignalToActive_next:
brcc Widget_TreeMatchOptsAndSendSignalToActive_done
mov zl, r18
mov zh, r19
rjmp Widget_TreeMatchOptsAndSendSignalToActive_loop
Widget_TreeMatchOptsAndSendSignalToActive_done:
pop zh
pop zl
ret
; @end
; ---------------------------------------------------------------------------
; @routine Widget_TreeMatchFlagsAndSendSignalToActive @global
;
; Send signal to all widgets whose WIDGET_SD_OFFS_FLAGS matches the given mask/value.
; Inactive branches are skipped.
;
; @param Z byte address of object (for LPM!)
; @param R16 signal number
; @param R17 selector
; @param R20 mask for WIDGET_SD_OFFS_FLAGS to match
; @param R21 value for WIDGET_SD_OFFS_FLAGS to match
; @param xl param1
; @param xh param2
; @clobbers any, !R16, !R17, !X, !Z
Widget_TreeMatchFlagsAndSendSignalToActive:
push zl
push zh
Widget_TreeMatchFlagsAndSendSignalToActive_loop:
mov r18, zl
or r18, zh
breq Widget_TreeMatchFlagsAndSendSignalToActive_done
; check flags
rcall Widget_GetSdramPtr ; (none)
ldd r18, Y+WIDGET_SD_OFFS_FLAGS
sbrc r18, WIDGET_FLAGS_ACTIVE_BIT
rjmp Widget_TreeMatchFlagsAndSendSignalToActive_checkFlags
push r16
rcall OBJ_GetBelowSkipChildren ; (R16)
pop r16
rjmp Widget_TreeMatchFlagsAndSendSignalToActive_next
Widget_TreeMatchFlagsAndSendSignalToActive_checkFlags:
ldd r18, Y+WIDGET_SD_OFFS_FLAGS
eor r18, r21 ; XOR with value (1 if different)
and r18, r20 ; AND with mask
brne Widget_TreeMatchFlagsAndSendSignalToActive_below
push r20
push r21
rcall OBJ_HandleSignalSaveInRegs
pop r21
pop r20
Widget_TreeMatchFlagsAndSendSignalToActive_below:
push r16
rcall OBJ_GetBelow ; (R16)
pop r16
Widget_TreeMatchFlagsAndSendSignalToActive_next:
brcc Widget_TreeMatchFlagsAndSendSignalToActive_done
mov zl, r18
mov zh, r19
rjmp Widget_TreeMatchFlagsAndSendSignalToActive_loop
Widget_TreeMatchFlagsAndSendSignalToActive_done:
pop zh
pop zl
ret
; @end