Files
aqhomecontrol/avr/modules/lcd2/gui2/eepromdump.asm

317 lines
7.4 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_EEPROMDUMP_ASM
#define AQH_AVR_GUI2_EEPROMDUMP_ASM
; ***************************************************************************
; defines
.equ EEPROMDUMP_FONT = ili9341Font6x8_1
.equ EEPROMDUMP_FONT_WIDTH = 6
.equ EEPROMDUMP_FONT_HEIGHT = 8
.equ EEPROMDUMP_BYTESPERLINE = 8
.equ EEPROMDUMP_LINESPERPAGE = 14
; SDRAM data for EepromDump
.equ EEPROMDUMP_SD_OFFS_BEGIN = WIDGET_SD_SIZE
.equ EEPROMDUMP_SD_OFFS_STARTADDR_LO = EEPROMDUMP_SD_OFFS_BEGIN+0
.equ EEPROMDUMP_SD_OFFS_STARTADDR_HI = EEPROMDUMP_SD_OFFS_BEGIN+1
.equ EEPROMDUMP_SD_SIZE = EEPROMDUMP_SD_OFFS_BEGIN+2
; ***************************************************************************
; code
.cseg
; ---------------------------------------------------------------------------
; @routine SensorWatch_OnCreate @global
;
; @param Z byte address of widget object (for LPM!)
; @param XL node addr
; @param XH value id
; @return CFLAG set if signal handled
; @clobbers any, !Z
EepromDump_OnCreate:
bigcall OBJ_IsObject ; (none)
brcc EepromDump_OnCreate_ret
; preset SDRAM
bigcall Widget_GetSdramPtr ; (none)
clr r16
ldi r17, EEPROMDUMP_SD_SIZE
push yl
push yh
EepromDump_OnCreate_loop:
st Y+, r16
dec r17
brne EepromDump_OnCreate_loop
pop yh
pop yl
bigcall Widget_OnCreate
EepromDump_OnCreate_ret:
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine EepromDump_OnUp @global
;
; @param Z byte address of object (for LPM!)
EepromDump_OnUp:
bigcall Widget_GetSdramPtr ; (none)
ldd xl, Y+EEPROMDUMP_SD_OFFS_STARTADDR_LO
ldd xh, Y+EEPROMDUMP_SD_OFFS_STARTADDR_HI
ldi r16, LOW(EEPROMDUMP_BYTESPERLINE*EEPROMDUMP_LINESPERPAGE)
ldi r17, HIGH(EEPROMDUMP_BYTESPERLINE*EEPROMDUMP_LINESPERPAGE)
sub xl, r16
sbc xh, r17
brcc EepromDump_OnUp_set
clr xl
clr xh
EepromDump_OnUp_set:
std Y+EEPROMDUMP_SD_OFFS_STARTADDR_LO, xl
std Y+EEPROMDUMP_SD_OFFS_STARTADDR_HI, xh
ldd r17, Y+WIDGET_SD_OFFS_FLAGS
ori r17, (1<<WIDGET_FLAGS_DIRTY_BIT)
std Y+WIDGET_SD_OFFS_FLAGS, r17
sec
ret
; @end
EepromDump_OnDown:
bigcall Widget_GetSdramPtr ; (none)
ldd xl, Y+EEPROMDUMP_SD_OFFS_STARTADDR_LO
ldd xh, Y+EEPROMDUMP_SD_OFFS_STARTADDR_HI
ldi r16, LOW(EEPROMDUMP_BYTESPERLINE*EEPROMDUMP_LINESPERPAGE)
ldi r17, HIGH(EEPROMDUMP_BYTESPERLINE*EEPROMDUMP_LINESPERPAGE)
add xl, r16
adc xh, r17
brcs EepromDump_OnDown_tooHigh
ldi r16, LOW(EEPROMEND)
ldi r17, HIGH(EEPROMEND)
cp xl, r16
cpc xh, r17
brcs EepromDump_OnDown_set
EepromDump_OnDown_tooHigh:
ldi xl, LOW(EEPROMEND-EEPROMDUMP_BYTESPERLINE)
ldi xh, HIGH(EEPROMEND-EEPROMDUMP_BYTESPERLINE)
EepromDump_OnDown_set:
std Y+EEPROMDUMP_SD_OFFS_STARTADDR_LO, xl
std Y+EEPROMDUMP_SD_OFFS_STARTADDR_HI, xh
ldd r17, Y+WIDGET_SD_OFFS_FLAGS
ori r17, (1<<WIDGET_FLAGS_DIRTY_BIT)
std Y+WIDGET_SD_OFFS_FLAGS, r17
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine EepromDump_OnDraw @global
;
; @param Z byte address of object (for LPM!)
; @param xl param1
; @param xh param2
; @clobbers any, !Z
EepromDump_OnDraw:
bigcall Widget_GetSdramPtr ; (none)
ldd r16, Y+WIDGET_SD_OFFS_FLAGS
andi r16, (1<<WIDGET_FLAGS_DIRTY_BIT)
breq EepromDump_OnDraw_ret
rcall Widget_Clear
bigcall Widget_GetSdramPtr ; (none)
ldd xl, Y+EEPROMDUMP_SD_OFFS_STARTADDR_LO
ldd xh, Y+EEPROMDUMP_SD_OFFS_STARTADDR_HI
ldi r16, 2
mov r4, r16
clr r5
mov r6, r16
clr r7
rcall eepromDumpDrawBlock
bigcall Widget_GetSdramPtr ; (none)
ldd r16, Y+WIDGET_SD_OFFS_FLAGS
cbr r16, (1<<WIDGET_FLAGS_DIRTY_BIT)
std Y+WIDGET_SD_OFFS_FLAGS, r16
EepromDump_OnDraw_ret:
sec
ret
; @end
; ---------------------------------------------------------------------------
; @routine eepromDumpDrawBlock
;
; @param Z byte address of widget object (for LPM!)
; @param R5:R4 X relative to widget
; @param R7:R6 Y relative to widget
; @param X current start address
; @param R18 number of bytes to print as hex bytes
eepromDumpDrawBlock:
ldi r18, EEPROMDUMP_LINESPERPAGE
eepromDumpDrawBlock_loop:
push r18
push r4
push r5
rcall eepromDumpDrawLine
pop r5
pop r4
ldi r16, LOW(EEPROMDUMP_FONT_HEIGHT)
ldi r17, HIGH(EEPROMDUMP_FONT_HEIGHT)
add r6, r16
adc r7, r17
pop r18
dec r18
brne eepromDumpDrawBlock_loop
ret
; @end
; ---------------------------------------------------------------------------
; @routine eepromDumpDrawLine
;
; @param Z byte address of widget object (for LPM!)
; @param R5:R4 X relative to widget
; @param R7:R6 Y relative to widget
; @param X current start address
; @param R18 number of bytes to print as hex bytes
; @return X pointer to next byte to write
; @clobbers any, !Z, !R6, !R7
eepromDumpDrawLine:
push xl
push xh
mov r20, xl
mov r21, xh
bigcall HexWordToAscii ; X=ptr to addr (R16, R17)
rcall eepromDumpDrawText
ldi r16, LOW(EEPROMDUMP_FONT_WIDTH*4)
ldi r17, HIGH(EEPROMDUMP_FONT_WIDTH*4)
add r4, r16
adc r5, r17
ldi r16, ':'
rcall eepromDumpDrawChar
ldi r16, ' '
rcall eepromDumpDrawChar
pop xh
pop xl
ldi r18, EEPROMDUMP_BYTESPERLINE
eepromDumpDrawLine_loop:
push r18
bigcall Eeprom_ReadByte ; R16=byte read
brcc eepromDumpDrawLine_ret
adiw xh:xl, 1
push xl
push xh
bigcall HexByteToAscii ; X=ptr to addr (R16, R17)
rcall eepromDumpDrawText
ldi r16, LOW(EEPROMDUMP_FONT_WIDTH*2)
ldi r17, HIGH(EEPROMDUMP_FONT_WIDTH*2)
add r4, r16
adc r5, r17
ldi r16, ' '
rcall eepromDumpDrawChar
pop xh
pop xl
pop r18
dec r18
brne eepromDumpDrawLine_loop
eepromDumpDrawLine_ret:
ret
; @end
; ---------------------------------------------------------------------------
; @routine eepromDumpDrawLine
;
; @param Z byte address of widget object (for LPM!)
; @param R5:R4 X relative to widget
; @param R7:R6 Y relative to widget
; @param X address of text to write
; @clobbers any, !Z, !(r4-r7)
eepromDumpDrawText:
push r4
push r5
push r6
push r7
bigcall Widget_DrawTextSDRAM ; (any, !Z)
pop r7
pop r6
pop r5
pop r4
ret
; @end
; ---------------------------------------------------------------------------
; @routine eepromDumpDrawChar
;
; @param Z byte address of widget object (for LPM!)
; @param R5:R4 X relative to widget
; @param R7:R6 Y relative to widget
; @param R16 byte to write
; @clobbers any, !Z, !(r4-r7)
eepromDumpDrawChar:
push r4
push r5
push r6
push r7
bigcall Widget_DrawCharAt ; (any, !Z)
pop r7
pop r6
pop r5
pop r4
ldi r16, LOW(EEPROMDUMP_FONT_WIDTH)
ldi r17, HIGH(EEPROMDUMP_FONT_WIDTH)
add r4, r16
adc r5, r17
ret
; @end
#endif