avr: added titled windows

This commit is contained in:
Martin Preuss
2025-11-03 21:02:25 +01:00
parent e58e9b846c
commit 5b72686904
9 changed files with 352 additions and 89 deletions

View File

@@ -5,6 +5,8 @@
<extradist>
defs.asm
main.asm
style.asm
titledwindow.asm
window.asm
</extradist>

View File

@@ -32,6 +32,12 @@
.equ WIN_EVENT_DESTROY = 1
.equ WIN_EVENT_SHOW = 2
.equ WIN_EVENT_HIDE = 3
.equ WIN_EVENT_DRAW = 4
.equ WIN_EVENT_TIMER = 5
#endif

View File

@@ -0,0 +1,24 @@
; ***************************************************************************
; copyright : (C) 2025 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_GUI_STYLE_ASM
#define AQH_AVR_GUI_STYLE_ASM
.equ STYLE_WIN_TITLE_BACKGROUND = DISPLAY_COLOR_NAVY
.equ STYLE_WIN_TITLE_FOREGROUND = DISPLAY_COLOR_WHITE
.equ STYLE_WIN_BACKGROUND = DISPLAY_COLOR_LIGHTGREY
.equ STYLE_WIN_FOREGROUND = DISPLAY_COLOR_BLACK
.equ STYLE_WIN_TITLE_HEIGHT = 20
#endif

View File

@@ -0,0 +1,214 @@
; ***************************************************************************
; copyright : (C) 2025 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_GUI_TITLEDWINDOW_ASM
#define AQH_AVR_GUI_TITLEDWINDOW_ASM
.equ TITLEDWINDOW_OFFS_SELF = 0
.equ TITLEDWINDOW_OFFS_TITLEPTR_LO = WIN_SIZE
.equ TITLEDWINDOW_OFFS_TITLEPTR_HI = WIN_SIZE+1
.equ TITLEDWINDOW_OFFS_TITLEWIN = TITLEDWINDOW_OFFS_TITLEPTR_HI+1
.equ TITLEDWINDOW_OFFS_CONTENTWIN = TITLEDWINDOW_OFFS_TITLEWIN+WIN_SIZE
.equ TITLEDWINDOW_SIZE = TITLEDWINDOW_OFFS_CONTENTWIN+WIN_SIZE
.cseg
; ---------------------------------------------------------------------------
; @routine TitleWindow_Init @global
;
; @param Y pointer to titledwindow data (size=TITLEDWINDOW_SIZE)
TitleWindow_Init:
mov xl, yl
mov xh, yh
ldi r17, TITLEDWINDOW_SIZE
clr r16
bigcall Utils_FillSram ; (R17, X)
ldi r16, LOW(TitleWindow_Handler)
std Y+(TITLEDWINDOW_OFFS_SELF+WIN_OFFS_HANDLER_LO), r16
ldi r16, HIGH(TitleWindow_Handler)
std Y+(TITLEDWINDOW_OFFS_SELF+WIN_OFFS_HANDLER_HI), r16
ret
; @end
; ---------------------------------------------------------------------------
; @routine TitleWindow_SetFont @global
;
; @param Y pointer to screen object in SDRAM
; @param Z pointer to font
; @clobbers any, !Y
TitleWindow_SetFont:
std Y+WIN_OFFS_FONT_LO, zl
std Y+WIN_OFFS_FONT_HI, zh
; setup title window
adiw yh:yl, TITLEDWINDOW_OFFS_TITLEWIN
std Y+WIN_OFFS_FONT_LO, zl
std Y+WIN_OFFS_FONT_HI, zh
sbiw yh:yl, TITLEDWINDOW_OFFS_TITLEWIN
; setup content window
adiw yh:yl, TITLEDWINDOW_OFFS_CONTENTWIN
std Y+WIN_OFFS_FONT_LO, zl
std Y+WIN_OFFS_FONT_HI, zh
sbiw yh:yl, TITLEDWINDOW_OFFS_CONTENTWIN
ret
; @end
; ---------------------------------------------------------------------------
; @routine TitleWindow_SetPosAndSize @global
;
; @param Y pointer to screen object in SDRAM
; @param R5:R4 X (abs)
; @param R7:R6 Y (abs)
; @param R9:R8 W
; @param R11:R10 H
; @clobbers any, !Y
TitleWindow_SetPosAndSize:
std Y+WIN_OFFS_X_LO, r4
std Y+WIN_OFFS_X_HI, r5
std Y+WIN_OFFS_Y_LO, r6
std Y+WIN_OFFS_Y_HI, r7
std Y+WIN_OFFS_WIDTH_LO, r8
std Y+WIN_OFFS_WIDTH_HI, r9
std Y+WIN_OFFS_HEIGHT_LO, r10
std Y+WIN_OFFS_HEIGHT_HI, r11
; setup title window
adiw yh:yl, TITLEDWINDOW_OFFS_TITLEWIN
std Y+WIN_OFFS_X_LO, r4
std Y+WIN_OFFS_X_HI, r5
std Y+WIN_OFFS_Y_LO, r6
std Y+WIN_OFFS_Y_HI, r7
std Y+WIN_OFFS_WIDTH_LO, r8
std Y+WIN_OFFS_WIDTH_HI, r9
ldi r16, LOW(STYLE_WIN_TITLE_HEIGHT)
ldi r17, HIGH(STYLE_WIN_TITLE_HEIGHT)
std Y+WIN_OFFS_HEIGHT_LO, r16
std Y+WIN_OFFS_HEIGHT_HI, r17
sbiw yh:yl, TITLEDWINDOW_OFFS_TITLEWIN
; setup content window
adiw yh:yl, TITLEDWINDOW_OFFS_CONTENTWIN
std Y+WIN_OFFS_X_LO, r4
std Y+WIN_OFFS_X_HI, r5
ldi r16, LOW(STYLE_WIN_TITLE_HEIGHT)
ldi r17, HIGH(STYLE_WIN_TITLE_HEIGHT)
add r16, r6
adc r16, r7
std Y+WIN_OFFS_Y_LO, r16
std Y+WIN_OFFS_Y_HI, r17
std Y+WIN_OFFS_WIDTH_LO, r8
std Y+WIN_OFFS_WIDTH_HI, r9
mov r16, r10
mov r17, r11
subi r16, LOW(STYLE_WIN_TITLE_HEIGHT)
sbci r17, HIGH(STYLE_WIN_TITLE_HEIGHT)
std Y+WIN_OFFS_HEIGHT_LO, r16
std Y+WIN_OFFS_HEIGHT_HI, r17
sbiw yh:yl, TITLEDWINDOW_OFFS_CONTENTWIN
ret
; @end
TitleWindow_SetStyleColors:
ldi r16, LOW(STYLE_WIN_BACKGROUND)
ldi r17, HIGH(STYLE_WIN_BACKGROUND)
std Y+WIN_OFFS_BG_COL_LO, r16
std Y+WIN_OFFS_BG_COL_HI, r17
ldi r16, LOW(STYLE_WIN_FOREGROUND)
ldi r17, HIGH(STYLE_WIN_FOREGROUND)
std Y+WIN_OFFS_FG_COL_LO, r16
std Y+WIN_OFFS_FG_COL_HI, r17
; setup title window
adiw yh:yl, TITLEDWINDOW_OFFS_TITLEWIN
ldi r16, LOW(STYLE_WIN_TITLE_BACKGROUND)
ldi r17, HIGH(STYLE_WIN_TITLE_BACKGROUND)
std Y+WIN_OFFS_BG_COL_LO, r16
std Y+WIN_OFFS_BG_COL_HI, r17
ldi r16, LOW(STYLE_WIN_TITLE_FOREGROUND)
ldi r17, HIGH(STYLE_WIN_TITLE_FOREGROUND)
std Y+WIN_OFFS_FG_COL_LO, r16
std Y+WIN_OFFS_FG_COL_HI, r17
sbiw yh:yl, TITLEDWINDOW_OFFS_TITLEWIN
; setup content window
adiw yh:yl, TITLEDWINDOW_OFFS_CONTENTWIN
ldi r16, LOW(STYLE_WIN_BACKGROUND)
ldi r17, HIGH(STYLE_WIN_BACKGROUND)
std Y+WIN_OFFS_BG_COL_LO, r16
std Y+WIN_OFFS_BG_COL_HI, r17
ldi r16, LOW(STYLE_WIN_FOREGROUND)
ldi r17, HIGH(STYLE_WIN_FOREGROUND)
std Y+WIN_OFFS_FG_COL_LO, r16
std Y+WIN_OFFS_FG_COL_HI, r17
sbiw yh:yl, TITLEDWINDOW_OFFS_CONTENTWIN
ret
; @end
; ---------------------------------------------------------------------------
; @routine TitleWindow_Draw @global
;
; @param Y pointer to titledwindow data (size=TITLEDWINDOW_SIZE)
TitleWindow_Draw:
; draw title window
adiw yh:yl, TITLEDWINDOW_OFFS_TITLEWIN
rcall Window_Clear
sbiw yh:yl, TITLEDWINDOW_OFFS_TITLEWIN
; write header
ldd zl, Y+TITLEDWINDOW_OFFS_TITLEPTR_LO
ldd zh, Y+TITLEDWINDOW_OFFS_TITLEPTR_HI
adiw yh:yl, TITLEDWINDOW_OFFS_TITLEWIN
ldi r16, 5
mov r4, r16
clr r5
ldi r16, 5
mov r6, r16
clr r7
rcall Window_DrawTextFlash
sbiw yh:yl, TITLEDWINDOW_OFFS_TITLEWIN
; clear content window
adiw yh:yl, TITLEDWINDOW_OFFS_CONTENTWIN
rcall Window_Clear
sbiw yh:yl, TITLEDWINDOW_OFFS_CONTENTWIN
ret
; @end
TitleWindow_Handler:
ret
#endif

View File

@@ -15,9 +15,30 @@
; FEDCBA9876543210
; 0bRRRRRGGGGGGBBBBB
#define DISPLAY_COLOR_FROM_RGB(r, g, b) ((r<<11) | (g<<5) | (b & 0x1f))
;#define DISPLAY_COLOR_FROM_RGB(r, g, b) ((r<<11) | (g<<5) | (b & 0x1f))
.equ DISPLAY_COLOR_BLACK = 0x0000 ; 0, 0, 0
.equ DISPLAY_COLOR_NAVY = 0x000F ; 0, 0, 128
.equ DISPLAY_COLOR_DARKGREEN = 0x03E0 ; 0, 128, 0
.equ DISPLAY_COLOR_DARKCYAN = 0x03EF ; 0, 128, 128
.equ DISPLAY_COLOR_MAROON = 0x7800 ; 128, 0, 0
.equ DISPLAY_COLOR_PURPLE = 0x780F ; 128, 0, 128
.equ DISPLAY_COLOR_OLIVE = 0x7BE0 ; 128, 128, 0
.equ DISPLAY_COLOR_LIGHTGREY = 0xC618 ; 192, 192, 192
.equ DISPLAY_COLOR_DARKGREY = 0x7BEF ; 128, 128, 128
.equ DISPLAY_COLOR_BLUE = 0x001F ; 0, 0, 255
.equ DISPLAY_COLOR_GREEN = 0x07E0 ; 0, 255, 0
.equ DISPLAY_COLOR_CYAN = 0x07FF ; 0, 255, 255
.equ DISPLAY_COLOR_RED = 0xF800 ; 255, 0, 0
.equ DISPLAY_COLOR_MAGENTA = 0xF81F ; 255, 0, 255
.equ DISPLAY_COLOR_YELLOW = 0xFFE0 ; 255, 255, 0
.equ DISPLAY_COLOR_WHITE = 0xFFFF ; 255, 255, 255
.equ DISPLAY_COLOR_ORANGE = 0xFD20 ; 255, 165, 0
.equ DISPLAY_COLOR_GREENYELLOW = 0xAFE5 ; 173, 255, 47
.equ DISPLAY_COLOR_PINK = 0xF81F
#endif

View File

@@ -47,7 +47,7 @@ ili9341Font12x20MonoHandlerFn:
ili9341Font12x20MonoRenderChar:
push zl
push zh
rcall ili9341Font12x20GetCharPosInFont ; (r17, r24, r25, z)
rcall ili9341Font12x20GetCharPosInFont ; (r24, r25, z)
ldi r25, 20 ; 20 bytes height
ili9341Font12x20MonoRenderChar_loop1:
ldi r24, 12 ; 16 bits
@@ -68,10 +68,10 @@ ili9341Font12x20MonoRenderChar_writeForeground:
mov r18, r2
mov r19, r3
ili9341Font12x20MonoRenderChar_sendToDisplay:
mov r16, r18
rcall SPIHW_MasterTransfer ; (R16)
mov r16, r19
rcall SPIHW_MasterTransfer ; (R16)
mov r16, r18
rcall SPIHW_MasterTransfer ; (R16)
ili9341Font12x20MonoRenderChar_loop2end:
dec r24
brne ili9341Font12x20MonoRenderChar_loop2
@@ -92,7 +92,7 @@ ili9341Font12x20MonoRenderChar_loop2end:
; @param R16 character to write
; @param Z pointer to font
; @return Z pointer to begin of char data
; @clobbers r17, r24, r25, z
; @clobbers r24, r25, z
ili9341Font12x20GetCharPosInFont:
mov r24, r16