Files
aqhomecontrol/avr/modules/lcd2/gui2/base/layout.asm
2026-03-07 00:44:56 +01:00

256 lines
6.0 KiB
NASM

; ***************************************************************************
; copyright : (C) 2026 by Martin Preuss
; email : martin@libchipcard.de
;
; ***************************************************************************
; * This file is part of the project "AqHome". *
; * Please see toplevel file COPYING of that project for license details. *
; ***************************************************************************
#ifndef AQH_AVR_GUI2_LAYOUT_ASM
#define AQH_AVR_GUI2_LAYOUT_ASM
; ***************************************************************************
; defines
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine Layout_SetDefaultWidths
;
; Set defaultWidth in WIDGET_OFFS_TMP_LO/HI
;
; @param Y pointer to widget
; @clobbers any, !Y
Layout_SetDefaultWidths:
push yl
push yh
bigcall OBJ_GetFirstChild
Layout_SetDefaultWidths_loop:
brcc Layout_SetDefaultWidths_ret
mov yl, r18
mov yh, r19
bigcall Widget_GetDefaultWidth
std Y+WIDGET_OFFS_TMP_LO, r18
std Y+WIDGET_OFFS_TMP_HI, r19
rcall OBJ_GetNext
rjmp Layout_SetDefaultWidths_loop
Layout_SetDefaultWidths_ret:
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine Layout_SetDefaultHeights
;
; @param Y pointer to widget
; @clobbers any, !Y
Layout_SetDefaultHeights:
push yl
push yh
bigcall OBJ_GetFirstChild
Layout_SetDefaultHeights_loop:
brcc Layout_SetDefaultHeights_ret
mov yl, r18
mov yh, r19
bigcall Widget_GetDefaultHeight
std Y+WIDGET_OFFS_TMP_LO, r18
std Y+WIDGET_OFFS_TMP_HI, r19
rcall OBJ_GetNext
rjmp Layout_SetDefaultHeights_loop
Layout_SetDefaultHeights_ret:
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine Layout_SumTmpValues
;
; @param Y pointer to widget
; @return r19:r18 total width of all child widgets plus space between
; @clobbers r16, r17, r18, r19, r20, r21, r22, r23, Z
Layout_SumTmpValues:
ldd zl, Y+WIDGET_OFFS_STYLE_LO
ldd zh, Y+WIDGET_OFFS_STYLE_HI
; get spacing
adiw zh:zl, WIDGET_STYLE_OFFS_SPACING
lpm r22, Z
sbiw zh:zl, WIDGET_STYLE_OFFS_SPACING
; get outer border
adiw zh:zl, WIDGET_STYLE_OFFS_OUTERBORDERSIZE
lpm r23, Z
sbiw zh:zl, WIDGET_STYLE_OFFS_OUTERBORDERSIZE
; start adding
clr r20
clr r21
push yl
push yh
bigcall OBJ_GetFirstChild
Layout_SumTmpValues_loop:
brcc Layout_SumTmpValues_loopEnd
mov yl, r18
mov yh, r19
ldd r18, Y+WIDGET_OFFS_TMP_LO
ldd r19, Y+WIDGET_OFFS_TMP_HI
add r20, r18 ; add widget size
adc r21, r19
add r20, r22 ; add spacing
adc r20, r22
sub r20, r22
rcall OBJ_GetNext
rjmp Layout_SumTmpValues_loop
Layout_SumTmpValues_loopEnd:
mov r16, r20
or r16, r21
breq Layout_SumTmpValues_done
sub r20, r22 ; sub last spacing
sbc r21, r22
add r21, r22
add r20, r23 ; add outer border (begin)
adc r21, r23
sub r21, r23
add r20, r23 ; add outer border (end)
adc r21, r23
sub r21, r23
Layout_SumTmpValues_done:
mov r18, r20
mov r19, r21
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine Layout_GetMaxTmp
;
; @param Y pointer to widget
; @return r19:r18 maximum value in WIDGET_OFFS_TMP_LO/HI of children
; @clobbers any, !Y
Layout_GetMaxTmp:
clr r20
clr r21
push yl
push yh
bigcall OBJ_GetFirstChild
Layout_GetMaxTmp_loop:
brcc Layout_GetMaxTmp_ret
mov yl, r18
mov yh, r19
ldd r18, Y+WIDGET_OFFS_TMP_LO
ldd r19, Y+WIDGET_OFFS_TMP_HI
; max
cp r20, r18
cpc r21, r19
brcc Layout_GetMaxTmp_next
mov r20, r18
mov r21, r19
Layout_GetMaxTmp_next:
rcall OBJ_GetNext
rjmp Layout_GetMaxTmp_loop
Layout_GetMaxTmp_ret:
mov r18, r20
mov r19, r21
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine Layout_AddToTmpOfFillXChildren
;
; @param Y pointer to widget
; @param R21:R20 value to add to tmp value of expandable widgets
; @param r22 mask for OBJECT_OFFS_OPTS_LO (e.g. 1<<WIDGET_OPTSLO_FILLX_BIT)
Layout_AddToTmpOfFillXChildren:
clr r16
push yl
push yh
bigcall OBJ_GetFirstChild
Layout_AddToTmpOfFillXChildren_loop:
brcc Layout_AddToTmpOfFillXChildren_done
mov yl, r18
mov yh, r19
ldd r17, Y+OBJECT_OFFS_OPTS_LO
and r17, r22
breq Layout_AddToTmpOfFillXChildren_next
ldd r16, Y+WIDGET_OFFS_TMP_LO
ldd r17, Y+WIDGET_OFFS_TMP_HI
add r16, r20
adc r17, r21
std Y+WIDGET_OFFS_TMP_LO, r16
std Y+WIDGET_OFFS_TMP_HI, r17
Layout_AddToTmpOfFillXChildren_next:
rcall OBJ_GetNext
rjmp Layout_AddToTmpOfFillXChildren_loop
Layout_AddToTmpOfFillXChildren_done:
pop yh
pop yl
ret
; @end
; ---------------------------------------------------------------------------
; @routine LayoutCountExpandableChildren
;
; @param Y pointer to widget
; @param r22 mask for OBJECT_OFFS_OPTS_LO (e.g. 1<<WIDGET_OPTSLO_FILLX_BIT)
; @return r16 number of children with opt WIDGET_OPTSLO_FILLX_BIT
; @clobbers r17, r18, r19
LayoutCountExpandableChildren:
clr r16
push yl
push yh
bigcall OBJ_GetFirstChild
LayoutCountExpandableChildren_loop:
brcc LayoutCountExpandableChildren_done
mov yl, r18
mov yh, r19
ldd r17, Y+OBJECT_OFFS_OPTS_LO
and r17, r22
breq LayoutCountExpandableChildren_next
inc r16
LayoutCountExpandableChildren_next:
rcall OBJ_GetNext
rjmp LayoutCountExpandableChildren_loop
LayoutCountExpandableChildren_done:
pop yh
pop yl
ret
; @end
#endif