diff --git a/avr/common/debug.asm b/avr/common/debug.asm index 1fe774f..c770e03 100644 --- a/avr/common/debug.asm +++ b/avr/common/debug.asm @@ -31,6 +31,14 @@ DEBUG2: rjmp DEBUG2 +DEBUG3: + ldi r19, 50 + ldi r20, 18 + ldi r21, 2 + rcall blinkLed + rjmp DEBUG3 + + ; @param r19 loop count ; @param r20 on time diff --git a/avr/devices/c03/test/main.asm b/avr/devices/c03/test/main.asm index 8bf0436..fef415e 100644 --- a/avr/devices/c03/test/main.asm +++ b/avr/devices/c03/test/main.asm @@ -250,16 +250,44 @@ test: ldi r16, 0 ldi r17, 0 bigcall GuiApp_new - brcs test_ok -bigjmp DEBUG1 - -test_ok: + brcc DEBUG_STOP sts guiApp, yl sts guiApp+1, yh + + bigcall GuiApp_GetRootWindow + brcc DEBUG_STOP + sts rootWindow, r18 + sts rootWindow+1, r19 + mov xl, r18 + mov xh, r19 + ldi r16, 0 ; OPTS + ldi r17, (WIDGET_PACK_FILLED< shift 2 times right + lsr r17 + andi r17, 3 + rcall widgetPack ; r21:r20=new pos (r17, r18, r19) + mov r6, r20 + mov r7, r21 ret ; @end ; --------------------------------------------------------------------------- -; @routine Widget_AlignPos1D +; @routine Widget_PackContentX @global ; -; one-dimensional routine. +; Calc pos according to WIDGET_PACK_HCONTENT in WIDGET_OFFS_PACK. ; -; @param R19:R18 size of target -; @param R13:R12 size of object to align -; @param -; @param R17 opts (bit 0: align end, bit 1: align center, bit 2: account for border) -; @return R23:R22 pos -; @clobbers r16, r18, r19 +; @param Y address of widget +; @param R13:R12 width of object to align +; @return R5:R4 X +; @clobbers r17, r18, r19, r20, r21 -Widget_AlignPos1D: - clr r22 - clr r23 +Widget_PackContentX: + ldd r18, Y+WIDGET_OFFS_WIDTH_LO + ldd r19, Y+WIDGET_OFFS_WIDTH_HI + ldd r17, Y+WIDGET_OFFS_PACK + swap r17 ; WIDGET_PACK_HCONTENT0_BIT = 4 -> shift 4 times right + andi r17, 3 + rcall widgetPack ; r21:r20=new pos (r17, r18, r19) + mov r4, r20 + mov r5, r21 + ret +; @end - sbrc r17, WIDGET_1DALIGN_BORDER_BIT - rcall Widget_AlignPos1D_subBordersFromSize - - sbrc r17, WIDGET_1DALIGN_END_BIT - rcall Widget_AlignPos1D_alignEnd - sbrc r17, WIDGET_1DALIGN_CENTER_BIT - rcall Widget_AlignPos1D_alignCenter - sbrc r17, WIDGET_1DALIGN_BORDER_BIT - rcall Widget_AlignPos1D_addBordersToPos -Widget_AlignPos1D_ret: - ret -Widget_AlignPos1D_alignEnd: - mov r22, r18 - mov r23, r19 - sub r22, r12 - sbc r23, r13 - brcc Widget_AlignPos1D_ret - clr r22 - clr r23 - ret -Widget_AlignPos1D_alignCenter: - rcall Widget_AlignPos1D_alignEnd - lsr r23 - ror r22 - ret -Widget_AlignPos1D_subBordersFromSize: - subi r18, 4 - sbci r19, 0 - ret -Widget_AlignPos1D_addBordersToPos: - ldi r16, 2 - add r22, r16 - adc r23, r16 - sub r23, r16 + +; --------------------------------------------------------------------------- +; @routine Widget_PackContentY @global +; +; Calc pos according to WIDGET_PACK_VCONTENT in WIDGET_OFFS_PACK. +; +; @param Y address of widget +; @param R13:R12 height of object to align +; @return R7:R6 Y +; @clobbers r17, r18, r19, r20, r21 + +Widget_PackContentY: + ldd r18, Y+WIDGET_OFFS_HEIGHT_LO + ldd r19, Y+WIDGET_OFFS_HEIGHT_HI + ldd r17, Y+WIDGET_OFFS_PACK + swap r17 ; WIDGET_PACK_VCONTENT0_BIT = 6 -> shift 6 times right + lsr r17 + lsr r17 + andi r17, 3 + rcall widgetPack ; r21:r20=new pos (r17, r18, r19) + mov r6, r20 + mov r7, r21 ret ; @end @@ -1044,6 +996,57 @@ widgetCalcAbsPosAndBorders: +; --------------------------------------------------------------------------- +; @routine widgetPack +; +; @param Y address of widget +; @param r19:r18 size of target widget (i.e. width or height) +; @param r17 pack mode (see @ref WIDGET_PACK_BEGIN) +; @param R13:R12 size of object to pack (i.e. width or height) +; @return R21:R20 pos +; @clobbers r17, r18, r19 + +widgetPack: + ; subtract borders + push zl + push zh + ldd zl, Y+WIDGET_OFFS_STYLE_LO + ldd zh, Y+WIDGET_OFFS_STYLE_HI + adiw zh:zl, WIDGET_STYLE_OFFS_OUTERBORDERSIZE + lpm r20, Z + pop zh + pop zl + clr r21 + sub r18, r20 ; subtract border at begin + sbc r19, r21 + sub r18, r20 ; subtract border at end + sbc r19, r21 + + andi r17, 3 ; only 2 bits pack mode + cpi r17, WIDGET_PACK_END + breq widgetPack_end + cpi r17, WIDGET_PACK_CENTER + breq widgetPack_center + rjmp widgetPack_ret ; begin/filled, align at begin +widgetPack_end: + sub r18, r12 + sbc r19, r13 + add r20, r18 + adc r21, r19 + rjmp widgetPack_ret +widgetPack_center: + sub r18, r12 + sbc r19, r13 + lsr r19 + ror r18 + add r20, r18 + adc r21, r19 + rjmp widgetPack_ret +widgetPack_ret: + ret +; @end + + @@ -1052,7 +1055,7 @@ widgetCalcAbsPosAndBorders: Widget_DefaultSignalmap: ; header - .dw Object_DefaultSignalmap ; next table to use + .dw Object_DefaultSignalmap*2 ; next table to use ; entries .db 0, WIDGET_SIGNAL_DRAW, LOW(Widget_OnDraw), HIGH(Widget_OnDraw) .db 0, WIDGET_SIGNAL_LAYOUT, LOW(Widget_OnLayout), HIGH(Widget_OnLayout)