more work on c02 and lcd drivers.

This commit is contained in:
Martin Preuss
2025-11-07 17:04:08 +01:00
parent 660f2502c1
commit 9300e515e7
7 changed files with 279 additions and 72 deletions

View File

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

View File

@@ -17,7 +17,7 @@
.equ STYLE_WIN_FOREGROUND = DISPLAY_COLOR_BLACK
.equ STYLE_WIN_TITLE_HEIGHT = 20
.equ STYLE_WIN_TITLE_HEIGHT = 24
#endif

View File

@@ -7,17 +7,17 @@
; * Please see toplevel file COPYING of that project for license details. *
; ***************************************************************************
#ifndef AQH_AVR_GUI_TITLEDWINDOW_ASM
#define AQH_AVR_GUI_TITLEDWINDOW_ASM
#ifndef AQH_AVR_GUI_TITLEWINDOW_ASM
#define AQH_AVR_GUI_TITLEWINDOW_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
.equ TITLEWINDOW_OFFS_SELF = 0
.equ TITLEWINDOW_OFFS_TITLEPTR_LO = WIN_SIZE
.equ TITLEWINDOW_OFFS_TITLEPTR_HI = WIN_SIZE+1
.equ TITLEWINDOW_OFFS_TITLEWIN = TITLEWINDOW_OFFS_TITLEPTR_HI+1
.equ TITLEWINDOW_OFFS_CONTENTWIN = TITLEWINDOW_OFFS_TITLEWIN+WIN_SIZE
.equ TITLEWINDOW_SIZE = TITLEWINDOW_OFFS_CONTENTWIN+WIN_SIZE
@@ -27,19 +27,19 @@
; ---------------------------------------------------------------------------
; @routine TitleWindow_Init @global
;
; @param Y pointer to titledwindow data (size=TITLEDWINDOW_SIZE)
; @param Y pointer to titledwindow data (size=TITLEWINDOW_SIZE)
TitleWindow_Init:
mov xl, yl
mov xh, yh
ldi r17, TITLEDWINDOW_SIZE
ldi r17, TITLEWINDOW_SIZE
clr r16
bigcall Utils_FillSram ; (R17, X)
ldi r16, LOW(TitleWindow_Handler)
std Y+(TITLEDWINDOW_OFFS_SELF+WIN_OFFS_HANDLER_LO), r16
std Y+(TITLEWINDOW_OFFS_SELF+WIN_OFFS_HANDLER_LO), r16
ldi r16, HIGH(TitleWindow_Handler)
std Y+(TITLEDWINDOW_OFFS_SELF+WIN_OFFS_HANDLER_HI), r16
std Y+(TITLEWINDOW_OFFS_SELF+WIN_OFFS_HANDLER_HI), r16
ret
; @end
@@ -57,16 +57,16 @@ TitleWindow_SetFont:
std Y+WIN_OFFS_FONT_HI, zh
; setup title window
adiw yh:yl, TITLEDWINDOW_OFFS_TITLEWIN
adiw yh:yl, TITLEWINDOW_OFFS_TITLEWIN
std Y+WIN_OFFS_FONT_LO, zl
std Y+WIN_OFFS_FONT_HI, zh
sbiw yh:yl, TITLEDWINDOW_OFFS_TITLEWIN
sbiw yh:yl, TITLEWINDOW_OFFS_TITLEWIN
; setup content window
adiw yh:yl, TITLEDWINDOW_OFFS_CONTENTWIN
adiw yh:yl, TITLEWINDOW_OFFS_CONTENTWIN
std Y+WIN_OFFS_FONT_LO, zl
std Y+WIN_OFFS_FONT_HI, zh
sbiw yh:yl, TITLEDWINDOW_OFFS_CONTENTWIN
sbiw yh:yl, TITLEWINDOW_OFFS_CONTENTWIN
ret
; @end
@@ -94,7 +94,7 @@ TitleWindow_SetPosAndSize:
std Y+WIN_OFFS_HEIGHT_HI, r11
; setup title window
adiw yh:yl, TITLEDWINDOW_OFFS_TITLEWIN
adiw yh:yl, TITLEWINDOW_OFFS_TITLEWIN
std Y+WIN_OFFS_X_LO, r4
std Y+WIN_OFFS_X_HI, r5
std Y+WIN_OFFS_Y_LO, r6
@@ -105,10 +105,10 @@ TitleWindow_SetPosAndSize:
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
sbiw yh:yl, TITLEWINDOW_OFFS_TITLEWIN
; setup content window
adiw yh:yl, TITLEDWINDOW_OFFS_CONTENTWIN
adiw yh:yl, TITLEWINDOW_OFFS_CONTENTWIN
std Y+WIN_OFFS_X_LO, r4
std Y+WIN_OFFS_X_HI, r5
ldi r16, LOW(STYLE_WIN_TITLE_HEIGHT)
@@ -125,13 +125,44 @@ TitleWindow_SetPosAndSize:
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
sbiw yh:yl, TITLEWINDOW_OFFS_CONTENTWIN
ret
; @end
; ---------------------------------------------------------------------------
; @routine TitleWindow_SetFullSize @global
;
; @param Y pointer to screen object in SDRAM
; @clobbers any, !Y
TitleWindow_SetFullSize:
clr r4
clr r5
clr r6
clr r7
ldi r16, LOW(DISPLAY_WIDTH)
mov r8, r16
ldi r16, HIGH(DISPLAY_WIDTH)
mov r9, r16
ldi r16, LOW(DISPLAY_HEIGHT)
mov r10, r16
ldi r16, HIGH(DISPLAY_HEIGHT)
mov r11, r16
rcall TitleWindow_SetPosAndSize
ret
; @enb
; ---------------------------------------------------------------------------
; @routine TitleWindow_SetStyleColors @global
;
; @param Y pointer to screen object in SDRAM
; @clobbers any, !Y
TitleWindow_SetStyleColors:
ldi r16, LOW(STYLE_WIN_BACKGROUND)
ldi r17, HIGH(STYLE_WIN_BACKGROUND)
@@ -143,7 +174,7 @@ TitleWindow_SetStyleColors:
std Y+WIN_OFFS_FG_COL_HI, r17
; setup title window
adiw yh:yl, TITLEDWINDOW_OFFS_TITLEWIN
adiw yh:yl, TITLEWINDOW_OFFS_TITLEWIN
ldi r16, LOW(STYLE_WIN_TITLE_BACKGROUND)
ldi r17, HIGH(STYLE_WIN_TITLE_BACKGROUND)
std Y+WIN_OFFS_BG_COL_LO, r16
@@ -152,10 +183,10 @@ TitleWindow_SetStyleColors:
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
sbiw yh:yl, TITLEWINDOW_OFFS_TITLEWIN
; setup content window
adiw yh:yl, TITLEDWINDOW_OFFS_CONTENTWIN
adiw yh:yl, TITLEWINDOW_OFFS_CONTENTWIN
ldi r16, LOW(STYLE_WIN_BACKGROUND)
ldi r17, HIGH(STYLE_WIN_BACKGROUND)
std Y+WIN_OFFS_BG_COL_LO, r16
@@ -164,7 +195,7 @@ TitleWindow_SetStyleColors:
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
sbiw yh:yl, TITLEWINDOW_OFFS_CONTENTWIN
ret
; @end
@@ -174,31 +205,31 @@ TitleWindow_SetStyleColors:
; ---------------------------------------------------------------------------
; @routine TitleWindow_Draw @global
;
; @param Y pointer to titledwindow data (size=TITLEDWINDOW_SIZE)
; @param Y pointer to titledwindow data (size=TITLEWINDOW_SIZE)
TitleWindow_Draw:
; draw title window
adiw yh:yl, TITLEDWINDOW_OFFS_TITLEWIN
adiw yh:yl, TITLEWINDOW_OFFS_TITLEWIN
rcall Window_Clear
sbiw yh:yl, TITLEDWINDOW_OFFS_TITLEWIN
sbiw yh:yl, TITLEWINDOW_OFFS_TITLEWIN
; write header
ldd zl, Y+TITLEDWINDOW_OFFS_TITLEPTR_LO
ldd zh, Y+TITLEDWINDOW_OFFS_TITLEPTR_HI
adiw yh:yl, TITLEDWINDOW_OFFS_TITLEWIN
ldd zl, Y+TITLEWINDOW_OFFS_TITLEPTR_LO
ldd zh, Y+TITLEWINDOW_OFFS_TITLEPTR_HI
adiw yh:yl, TITLEWINDOW_OFFS_TITLEWIN
ldi r16, 5
mov r4, r16
clr r5
ldi r16, 5
ldi r16, 2
mov r6, r16
clr r7
rcall Window_DrawTextFlash
sbiw yh:yl, TITLEDWINDOW_OFFS_TITLEWIN
sbiw yh:yl, TITLEWINDOW_OFFS_TITLEWIN
; clear content window
adiw yh:yl, TITLEDWINDOW_OFFS_CONTENTWIN
adiw yh:yl, TITLEWINDOW_OFFS_CONTENTWIN
rcall Window_Clear
sbiw yh:yl, TITLEDWINDOW_OFFS_CONTENTWIN
sbiw yh:yl, TITLEWINDOW_OFFS_CONTENTWIN
ret
; @end

View File

@@ -41,8 +41,7 @@ Window_Clear:
; @param R5:R4 X (dest)
; @param R7:R6 Y (dest)
; @return R5:R4 X pos behind string
; @return R7:R6 Y pos behind string
; @clobbers any, !Y
; @clobbers any, !Y, !R6, !R7
Window_DrawTextFlash:
rcall winCalcAbsPosAndBorders ; (R18, R19)
@@ -74,7 +73,7 @@ Window_DrawTextFlash_loopEnd:
; @param R5:R4 X (dest)
; @param R7:R6 Y (dest)
; @return R5:R4 X pos behind char
; @clobbers any, !Y, !R6, !R7
; @clobbers any, !Y
Window_DrawCharAt:
rcall winCalcAbsPosAndBorders
@@ -182,6 +181,89 @@ winDrawChar_ret:
; ---------------------------------------------------------------------------
; @routine Window_WriteHexWordAt @global
;
; @param Y pointer to screen object in SDRAM
; @param R17:R16 word to write
; @param R5:R4 X (dest)
; @param R7:R6 Y (dest)
; @return R5:R4 X pos behind string
; @clobbers any, !Y
Window_WriteHexWordAt:
push r16
mov r16, r17
rcall Window_WriteHexByteAt
pop r16
rcall Window_WriteHexByteAt
ret
; @end
; ---------------------------------------------------------------------------
; @routine Window_WriteHexByteAt @global
;
; @param Y pointer to screen object in SDRAM
; @param R16 byte to write
; @param R5:R4 X (dest)
; @param R7:R6 Y (dest)
; @return R5:R4 X pos behind string
; @clobbers any, !Y
Window_WriteHexByteAt:
push r16
swap r16
rcall winWriteNibble
pop r16
rcall winWriteNibble
ret
; @end
winWriteNibble:
push r4
push r5
push r6
push r7
rcall winNibbleToAscii ; write high nibble (r16, r17)
rcall Window_DrawCharAt ; draw
pop r7
pop r6
pop r5
pop r4
clr r17
add r4, r18
adc r5, r17
ret
; @end
; ---------------------------------------------------------------------------
; @routine winNibbleToAscii
;
; Convert a nibble to an ASCII char.
; @return R16 ASCII representation of that nibble (e.g. '0' for 0)
; @param R16 byte (in bits 0-3)
; @clobbers r16, r17
winNibbleToAscii:
andi r16, 0xf
cpi r16, 10
brcs winNibbleToAscii_l1
ldi r17, 7
add r16, r17
winNibbleToAscii_l1:
ldi r17, '0'
add r16, r17
ret
; @end