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:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user