324 lines
7.9 KiB
NASM
324 lines
7.9 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 default width in WIDGET_OFFS_TMP_LO/HI of child widgets
|
|
; Ignores invisible widgets.
|
|
;
|
|
; @param Y pointer to widget
|
|
; @clobbers any, !Y
|
|
|
|
Layout_SetDefaultWidths:
|
|
push yl
|
|
push yh
|
|
bigcall OBJ_GetFirstChild
|
|
brcc Layout_SetDefaultWidths_ret
|
|
Layout_SetDefaultWidths_loop:
|
|
mov yl, r18
|
|
mov yh, r19
|
|
ldd r18, Y+OBJECT_OFFS_FLAGS
|
|
sbrs r18, WIDGET_FLAGS_VISIBLE_BIT
|
|
rjmp Layout_SetDefaultWidths_next
|
|
bigcall Widget_GetDefaultWidth
|
|
std Y+WIDGET_OFFS_TMP_LO, r18
|
|
std Y+WIDGET_OFFS_TMP_HI, r19
|
|
Layout_SetDefaultWidths_next:
|
|
rcall OBJ_GetNext
|
|
brcs Layout_SetDefaultWidths_loop
|
|
Layout_SetDefaultWidths_ret:
|
|
pop yh
|
|
pop yl
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine Layout_SetDefaultHeights
|
|
;
|
|
; Set default height in WIDGET_OFFS_TMP_LO/HI of child widgets
|
|
; Ignores invisible widgets.
|
|
;
|
|
; @param Y pointer to widget
|
|
; @clobbers any, !Y
|
|
|
|
Layout_SetDefaultHeights:
|
|
push yl
|
|
push yh
|
|
bigcall OBJ_GetFirstChild
|
|
brcc Layout_SetDefaultHeights_ret
|
|
Layout_SetDefaultHeights_loop:
|
|
mov yl, r18
|
|
mov yh, r19
|
|
ldd r18, Y+OBJECT_OFFS_FLAGS
|
|
sbrs r18, WIDGET_FLAGS_VISIBLE_BIT
|
|
rjmp Layout_SetDefaultHeights_next
|
|
bigcall Widget_GetDefaultHeight
|
|
std Y+WIDGET_OFFS_TMP_LO, r18
|
|
std Y+WIDGET_OFFS_TMP_HI, r19
|
|
Layout_SetDefaultHeights_next:
|
|
rcall OBJ_GetNext
|
|
brcs Layout_SetDefaultHeights_loop
|
|
Layout_SetDefaultHeights_ret:
|
|
pop yh
|
|
pop yl
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine Layout_SumTmpValues
|
|
;
|
|
; Ignores invisible widgets.
|
|
;
|
|
; @param Y pointer to widget
|
|
; @return r19:r18 total size 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
|
|
brcc Layout_SumTmpValues_finish
|
|
Layout_SumTmpValues_loop:
|
|
mov yl, r18
|
|
mov yh, r19
|
|
ldd r18, Y+OBJECT_OFFS_FLAGS
|
|
sbrs r18, WIDGET_FLAGS_VISIBLE_BIT
|
|
rjmp Layout_SumTmpValues_next
|
|
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 r21, r22
|
|
sub r21, r22
|
|
Layout_SumTmpValues_next:
|
|
rcall OBJ_GetNext
|
|
brcs Layout_SumTmpValues_loop
|
|
Layout_SumTmpValues_loopEnd:
|
|
mov r16, r20
|
|
or r16, r21
|
|
breq Layout_SumTmpValues_finish
|
|
sub r20, r22 ; sub last spacing
|
|
sbc r21, r22
|
|
add r21, r22
|
|
Layout_SumTmpValues_finish:
|
|
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
|
|
;
|
|
; Ignores invisible widgets.
|
|
;
|
|
; @param Y pointer to widget
|
|
; @return r19:r18 maximum value in WIDGET_OFFS_TMP_LO/HI of children
|
|
; @clobbers r20, r21
|
|
|
|
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+OBJECT_OFFS_FLAGS
|
|
sbrs r18, WIDGET_FLAGS_VISIBLE_BIT
|
|
rjmp Layout_GetMaxTmp_next
|
|
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 LayoutCountChildrenWithPackMode
|
|
;
|
|
; @param Y pointer to widget
|
|
; @param r22 mask for WIDGET_OFFS_PACK
|
|
; @param r23 value for WIDGET_OFFS_PACK
|
|
; @return r16 number of matching children
|
|
; @clobbers r17, r18, r19
|
|
|
|
LayoutCountChildrenWithPackMode:
|
|
clr r16
|
|
push yl
|
|
push yh
|
|
bigcall OBJ_GetFirstChild
|
|
LayoutCountChildrenWithPackMode_loop:
|
|
brcc LayoutCountChildrenWithPackMode_done
|
|
mov yl, r18
|
|
mov yh, r19
|
|
ldd r17, Y+OBJECT_OFFS_FLAGS
|
|
sbrs r17, WIDGET_FLAGS_VISIBLE_BIT ; skip invisible widgets
|
|
rjmp LayoutCountChildrenWithPackMode_next
|
|
ldd r17, Y+WIDGET_OFFS_PACK
|
|
eor r17, r23
|
|
and r17, r22
|
|
brne LayoutCountChildrenWithPackMode_next
|
|
inc r16
|
|
LayoutCountChildrenWithPackMode_next:
|
|
rcall OBJ_GetNext
|
|
rjmp LayoutCountChildrenWithPackMode_loop
|
|
LayoutCountChildrenWithPackMode_done:
|
|
pop yh
|
|
pop yl
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine LayoutCountVisibleChildren
|
|
;
|
|
; @param Y pointer to widget
|
|
; @return r16 number of matching children
|
|
; @clobbers r17, r18, r19
|
|
|
|
LayoutCountVisibleChildren:
|
|
clr r16
|
|
push yl
|
|
push yh
|
|
bigcall OBJ_GetFirstChild
|
|
brcc LayoutCountVisibleChildren_done
|
|
LayoutCountVisibleChildren_loop:
|
|
mov yl, r18
|
|
mov yh, r19
|
|
ldd r17, Y+OBJECT_OFFS_FLAGS
|
|
sbrc r17, WIDGET_FLAGS_VISIBLE_BIT ; skip invisible widgets
|
|
inc r16
|
|
LayoutCountVisibleChildren_next:
|
|
rcall OBJ_GetNext
|
|
brcs LayoutCountVisibleChildren_loop
|
|
LayoutCountVisibleChildren_done:
|
|
pop yh
|
|
pop yl
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
; ---------------------------------------------------------------------------
|
|
; @routine LayoutIncTmpOnMatchingPack
|
|
;
|
|
; Ignores invisible widgets.
|
|
;
|
|
; @param Y pointer to widget
|
|
; @param R21:R20 value to add to tmp value of expandable widgets
|
|
; @param r22 mask for WIDGET_OFFS_PACK
|
|
; @param r23 value for WIDGET_OFFS_PACK
|
|
; @clobbers r16, r18, r19
|
|
|
|
LayoutIncTmpOnMatchingPack:
|
|
push yl
|
|
push yh
|
|
bigcall OBJ_GetFirstChild
|
|
brcc LayoutIncTmpOnMatchingPack_done
|
|
LayoutIncTmpOnMatchingPack_loop:
|
|
mov yl, r18
|
|
mov yh, r19
|
|
ldd r16, Y+OBJECT_OFFS_FLAGS
|
|
sbrs r16, WIDGET_FLAGS_VISIBLE_BIT ; skip invisible widgets
|
|
rjmp LayoutIncTmpOnMatchingPack_next
|
|
ldd r16, Y+WIDGET_OFFS_PACK
|
|
eor r16, r23
|
|
and r16, r22
|
|
brne LayoutIncTmpOnMatchingPack_next
|
|
ldd r18, Y+WIDGET_OFFS_TMP_LO
|
|
ldd r19, Y+WIDGET_OFFS_TMP_HI
|
|
add r18, r20
|
|
adc r19, r21
|
|
std Y+WIDGET_OFFS_TMP_LO, r18
|
|
std Y+WIDGET_OFFS_TMP_HI, r19
|
|
LayoutIncTmpOnMatchingPack_next:
|
|
rcall OBJ_GetNext
|
|
brcs LayoutIncTmpOnMatchingPack_loop
|
|
LayoutIncTmpOnMatchingPack_done:
|
|
pop yh
|
|
pop yl
|
|
ret
|
|
; @end
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#endif
|
|
|