diff --git a/avr/modules/lcd2/win/defs.asm b/avr/modules/lcd2/win/defs.asm index 2b7cf2b..467d19b 100644 --- a/avr/modules/lcd2/win/defs.asm +++ b/avr/modules/lcd2/win/defs.asm @@ -50,17 +50,18 @@ -.equ WID_OPTIONS1_BIT_DIRTY = 0 -.equ WID_OPTIONS1_BIT_LAYOUT = 1 +.equ WID_OPTIONS0_BIT_VISIBLE = 0 ; OBJ_OFFS_OPTIONS +.equ WID_OPTIONS0_BIT_DIRTY = 1 +.equ WID_OPTIONS0_BIT_LAYOUT = 2 -.equ WID_OPTIONS1_BIT_STRETCH_X = 2 -.equ WID_OPTIONS1_BIT_STRETCH_Y = 3 +.equ WID_OPTIONS1_BIT_STRETCH_X = 0 ; WID_OFFS_OPTIONS1 +.equ WID_OPTIONS1_BIT_STRETCH_Y = 1 -.equ WID_OPTIONS1_BIT_ALIGN_RIGHT = 4 -.equ WID_OPTIONS1_BIT_ALIGN_BOTTOM = 5 +.equ WID_OPTIONS1_BIT_ALIGN_RIGHT = 2 +.equ WID_OPTIONS1_BIT_ALIGN_BOTTOM = 3 -.equ WID_OPTIONS1_BIT_EQUAL_WIDTH = 6 -.equ WID_OPTIONS1_BIT_EQUAL_HEIGHT = 7 +.equ WID_OPTIONS1_BIT_EQUAL_WIDTH = 4 +.equ WID_OPTIONS1_BIT_EQUAL_HEIGHT = 5 ; Signals @@ -73,7 +74,7 @@ .equ WID_SIGNAL_SHOW = OBJ_SIGNAL_NEXTFREE .equ WID_SIGNAL_HIDE = OBJ_SIGNAL_NEXTFREE+1 -.equ WID_SIGNAL_UPDATE = OBJ_SIGNAL_NEXTFREE+2 +.equ WID_SIGNAL_DRAW = OBJ_SIGNAL_NEXTFREE+2 .equ WID_SIGNAL_LAYOUT = OBJ_SIGNAL_NEXTFREE+3 .equ WID_SIGNAL_TOUCH = OBJ_SIGNAL_NEXTFREE+4 .equ WID_SIGNAL_MOUSE = OBJ_SIGNAL_NEXTFREE+5 diff --git a/avr/modules/lcd2/win/object.asm b/avr/modules/lcd2/win/object.asm index 3b83ec9..2f5b57b 100644 --- a/avr/modules/lcd2/win/object.asm +++ b/avr/modules/lcd2/win/object.asm @@ -12,7 +12,6 @@ ; @routine OBJ_Init @global ; ; @param Y pointer to object SRAM -; @param Z pointer to handler function (word address) ; @param r17 options ; @clobbers X @@ -25,14 +24,54 @@ OBJ_Init: rcall Utils_FillSram ; (R17, X) rcall Tree_InitObject ; (R16) pop r17 - std Y+OBJ_OFFS_HANDLERFN_LO, zl - std Y+OBJ_OFFS_HANDLERFN_HI, zh std Y+OBJ_OFFS_OPTIONS, r17 + ldi r16, LOW(OBJ_DefaultHandler) + std Y+OBJ_OFFS_HANDLERFN_LO, r16 + ldi r16, HIGH(OBJ_DefaultHandler) + std Y+OBJ_OFFS_HANDLERFN_HI, r16 ret ; @end +; --------------------------------------------------------------------------- +; @routine OBJ_SetHandler @global +; +; @param Y pointer to object SRAM +; @param Z pointer to handler function (word address) +; @clobbers X + +OBJ_SetHandler: + std Y+OBJ_OFFS_HANDLERFN_LO, zl + std Y+OBJ_OFFS_HANDLERFN_HI, zh + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine OBJ_GetHandler @global +; +; @param Y pointer to object SRAM +; @return Z pointer to handler function (word address) +; @clobbers none + +OBJ_GetHandler: + ldd zl, Y+OBJ_OFFS_HANDLERFN_LO + ldd zh, Y+OBJ_OFFS_HANDLERFN_HI + ret +; @end + + + +OBJ_DefaultHandler: + ret +; @end + + + + + ; --------------------------------------------------------------------------- ; @routine OBJ_free @global ; @@ -43,14 +82,14 @@ OBJ_free: ; free children push yl push yh - rcall Tree_GetFirstChildObject + rcall Tree_GetFirstChildObject ; (none) OBJ_free_loop: mov r16, xl or r16, xh breq OBJ_free_loopEnd mov yl, xl mov yh, xh - rcall List_GetNextObject + rcall Tree_GetNextSibling push xl ; next push xh ; next rcall OBJ_free @@ -61,7 +100,7 @@ OBJ_free_loopEnd: pop yh pop yl - rcall Tree_UnlinkObject + rcall Tree_UnlinkObject ; (r16, r17, x) push yl push yh @@ -102,6 +141,55 @@ OBJ_Handler: +; --------------------------------------------------------------------------- +; @routine OBJ_ForwardSignalToChildren +; +; Signal handler for an object. A signal can have up to 3 parameters +; conveyed in registers R18, R19 and X. +; +; @param Y pointer to object SRAM +; @param r16 signal +; @param R18 1st param +; @param R19 2nd param +; @param X 3rd param +; @clobbers any, !r16, !r18, !r19, !Y + +OBJ_ForwardSignalToChildren: + push yl + push yh + rcall Tree_GetFirstChildObject ; (none) +OBJ_ForwardSignalToChildren_loop: + clc + mov r17, xl + or r17, xh + breq OBJ_ForwardSignalToChildren_loopEnd + mov yl, xl + mov yh, xh + push r16 + push r18 + push r19 + push xl + push xh + push yl + push yh + rcall OBJ_Handler + pop yh + pop yl + pop xh + pop xl + pop r19 + pop r18 + pop r16 + rcall Tree_GetNextSibling + rjmp OBJ_ForwardSignalToChildren_loop +OBJ_ForwardSignalToChildren_loopEnd: + pop yh + pop yl + ret +; @end + + + ; --------------------------------------------------------------------------- ; @routine OBJ_EmitSignal ; @@ -119,11 +207,11 @@ OBJ_EmitSignal: mov yl, r17 OBJ_EmitSignal_loop: push r16 - rcall objCheckEmitSignalForLink + rcall objCheckEmitSignalForLink ; (any, !X, !Y, !R18, !R19) pop r16 push xl push xh - rcall List_GetNextObject ; (any, !X, !Y, !R18, !R19) + rcall List_GetNextObject ; (none) mov yl, xl mov yh, xh pop xh diff --git a/avr/modules/lcd2/win/widget.asm b/avr/modules/lcd2/win/widget.asm index 198d950..4a17e05 100644 --- a/avr/modules/lcd2/win/widget.asm +++ b/avr/modules/lcd2/win/widget.asm @@ -8,14 +8,154 @@ ; *************************************************************************** +; *************************************************************************** +; defs + +.equ WID_WIDGET_INTER_BORDER = 1 + + + +; *************************************************************************** +; code + +.cseg + + ; --------------------------------------------------------------------------- ; @routine WID_Widget_new @global ; ; @param Y pointer to window SRAM +; @param X pointer to parent ; @param r18 WID_OFFS_OPTIONS1 ; @param r19 WID_OFFS_OPTIONS2 WID_Widget_Init: + push r18 + push r19 + push xl + push xh + ldi zl, LOW(WID_Widget_Handler) + ldi zh, HIGH(WID_Widget_Handler) + clr r17 + rcall OBJ_Init + pop xh + pop xl + pop r19 + pop r18 + std Y+WID_OFFS_OPTIONS1, r18 + std Y+WID_OFFS_OPTIONS2, r19 + mov r16, xl + or r16, xh + breq WID_Widget_noParent + ; copy defaults from parent + adiw xh:xl, WID_OFFS_BG_COL_LO + ld r16, X+ ; WID_OFFS_BG_COL_LO + std Y+WID_OFFS_BG_COL_LO, r16 + ld r16, X+ ; WID_OFFS_BG_COL_HI + std Y+WID_OFFS_BG_COL_HI, r16 + ld r16, X+ ; WID_OFFS_FG_COL_LO + std Y+WID_OFFS_FG_COL_LO, r16 + ld r16, X+ ; WID_OFFS_FG_COL_HI + std Y+WID_OFFS_FG_COL_HI, r16 + ld r16, X+ ; WID_OFFS_FONT_LO + std Y+WID_OFFS_FONT_LO, r16 + ld r16, X+ ; WID_OFFS_FONT_HI + std Y+WID_OFFS_FONT_HI, r16 + rjmp WID_Widget_end +WID_Widget_noParent: ; preset without parent + clr r16 + std Y+WID_OFFS_FONT_LO, r16 + std Y+WID_OFFS_FONT_HI, r16 + + std Y+WID_OFFS_FG_COL_LO, r16 ; foreground black + std Y+WID_OFFS_FG_COL_HI, r16 + dec r16 + std Y+WID_OFFS_BG_COL_LO, r16 ; background white + std Y+WID_OFFS_BG_COL_HI, r16 + + ldi r16, 2 ; default borders + std Y+WID_OFFS_BORDER_TOP, r16 + std Y+WID_OFFS_BORDER_BOT, r16 + std Y+WID_OFFS_BORDER_LEFT, r16 + std Y+WID_OFFS_BORDER_RIGHT, r16 +WID_Widget_end: + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine WID_Widget_Handler +; +; Signal handler for an object. A signal can have up to 3 parameters +; conveyed in registers R18, R19 and X. +; +; @param Y pointer to object SRAM +; @param r16 signal +; @param R18 1st param +; @param R19 2nd param +; @param X 3rd param +; @clobbers any, !Y + +WID_Widget_Handler: + cpi r16, WID_SIGNAL_GETMINSIZE + breq WID_Widget_Handler_getMinSize + ; for now just forward signal to all children +WID_Widget_Handler_forward: + rcall OBJ_ForwardSignalToChildren + ret +WID_Widget_Handler_getMinSize: + rjmp widgetGetMinSize +; @end + + + + +; --------------------------------------------------------------------------- +; @routine widgetGetMinSize +; +; @return r18 minimum width of widget +; @return r19 minimum height of widget +; @clobbers any, !Y + +widgetGetMinSize: + push yl + push yh + rcall Tree_GetFirstChildObject ; (none) + clr r20 + clr r21 +widgetGetMinSize_loop: + mov r17, xl + or r17, xh + breq widgetGetMinSize_loopEnd + mov yl, xl + mov yh, yl + push r20 + push r21 + ldi r16, WID_SIGNAL_GETMINSIZE + ldi r18, 1 ; default value for when the signal is not handled + ldi r19, 1 ; default value for when the signal is not handled + rcall OBJ_Handler ; ask child for its minimum size + pop r21 + pop r20 + add r20, r18 ; TODO: handle carry later + subi r20, -WID_WIDGET_INTER_BORDER + add r21, r19 ; TODO: handle carry later + subi r21, -WID_WIDGET_INTER_BORDER + rcall Tree_GetNextSibling ; (none) + rjmp widgetGetMinSize_loop +widgetGetMinSize_loopEnd: + mov r18, r20 + mov r19, r21 + pop yh + pop yl + ret +; @end + + + + +