diff --git a/avr/devices/all/includes.asm b/avr/devices/all/includes.asm
index 48c95e0..eea0d35 100644
--- a/avr/devices/all/includes.asm
+++ b/avr/devices/all/includes.asm
@@ -28,6 +28,10 @@
.include "modules/xram/main.asm"
#endif
+#ifdef MODULES_HEAP
+ .include "modules/heap/main.asm"
+#endif
+
#ifdef MODULES_NETWORK
.include "common/crc8.asm"
.include "common/m_fixedbuffers.asm"
@@ -166,6 +170,12 @@
#endif
+#ifdef MODULES_FONT_6X8
+.include "modules/lcd2/font/defs.asm"
+.include "modules/lcd2/font/font6x8.asm"
+#endif
+
+
#ifdef APPS_MOTION
.include "modules/f_keepup/main.asm"
.include "modules/valsched/main.asm"
diff --git a/avr/devices/all/modules.asm b/avr/devices/all/modules.asm
index 75ce833..c45ba91 100644
--- a/avr/devices/all/modules.asm
+++ b/avr/devices/all/modules.asm
@@ -24,6 +24,10 @@
initModules:
rcall BaseTimer_Init ; unconditionally call this
+#ifdef MODULES_HEAP
+ rcall Heap_Init
+#endif
+
#ifdef MODULES_CLOCK
rcall Clock_Init
#endif
diff --git a/avr/devices/c01/main/main.asm b/avr/devices/c01/main/main.asm
index c04c61e..ba8eb22 100644
--- a/avr/devices/c01/main/main.asm
+++ b/avr/devices/c01/main/main.asm
@@ -36,6 +36,14 @@
+; ---------------------------------------------------------------------------
+; heap
+
+.equ HEAP_START = 0x260
+.equ HEAP_SIZE = 32768-0x260
+
+
+
; ---------------------------------------------------------------------------
; firmware settings including list of modules used
@@ -48,13 +56,15 @@
; #define MODULES_TIMER
#define MODULES_CLOCK
#define MODULES_XRAM
+#define MODULES_HEAP
#define MODULES_LED_SIMPLE
#define MODULES_NETWORK
;#define MODULES_COMONUART0
#define MODULES_UART_HW
#define MODULES_SPI_HW
#define MODULES_ILI9341
-#define MODULES_FONT_8X8
+;#define MODULES_FONT_8X8
+#define MODULES_FONT_6X8
;#define MODULES_UART_BITBANG
;#define MODULES_TWI_MASTER
;#define MODULES_LCD
diff --git a/avr/modules/0BUILD b/avr/modules/0BUILD
index dc51511..d2ca36a 100644
--- a/avr/modules/0BUILD
+++ b/avr/modules/0BUILD
@@ -36,6 +36,7 @@
f_keepup
valsched
xram
+ heap
diff --git a/avr/modules/heap/0BUILD b/avr/modules/heap/0BUILD
new file mode 100644
index 0000000..febd367
--- /dev/null
+++ b/avr/modules/heap/0BUILD
@@ -0,0 +1,11 @@
+
+
+
+
+
+ main.asm
+
+
+
+
+
diff --git a/avr/modules/heap/main.asm b/avr/modules/heap/main.asm
new file mode 100644
index 0000000..177ddbb
--- /dev/null
+++ b/avr/modules/heap/main.asm
@@ -0,0 +1,317 @@
+; ***************************************************************************
+; 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. *
+; ***************************************************************************
+
+; Needed vars:
+; - HEAP_START
+; - HEAP_SIZE
+
+
+.equ HEAP_HEADER_BIT_USED = 1
+
+
+.dseg
+
+heapPtr: .byte 2
+heapUsed: .byte 2
+heapFree: .byte 2
+heapDblFree: .byte 1
+
+
+
+
+.cseg
+
+
+
+; ---------------------------------------------------------------------------
+; @routine Heap_Init
+
+Heap_Init:
+ ldi xl, LOW(HEAP_START)
+ ldi xh, HIGH(HEAP_START)
+ ldi r24, LOW((HEAP_SIZE-6) & 0xfffc) ; size minus chunk header, chunk footer, start, end
+ ldi r25, HIGH((HEAP_SIZE-6) & 0xfffc) ; we allocate multiples of 4 bytes
+ clr r16
+ sts heapUsed, r16
+ sts heapUsed+1, r16
+ st X+, r16 ; write start header
+ st X+, r16
+ sts heapPtr, xl ; store global vars
+ sts heapPtr+1, xl
+ sts heapFree, r24
+ sts heapFree+1, r25
+ st X+, r24 ; store header of first chunk
+ st X+, r25
+ add xl, r24
+ adc xh, r25
+ st X+, r24 ; store footer of first chunk
+ st X+, r25
+ st X+, r16 ; write end footer
+ sec
+ ret
+; @end
+
+
+
+
+; ---------------------------------------------------------------------------
+; @routine heapAllocFirstFit
+;
+; @param r25:r24 number of bytes to alloc
+; @return CFLAG set of okay, cleared otherwise
+; @return X start of allocated memory
+
+heapAllocFirstFit:
+ adiw r25:r24, 3 ; align size to next multiple of 4
+ andi r24, 0xfc ; mask lower two bits
+
+ lds xl, heapPtr
+ lds xh, heapPtr+1
+
+heapAllocFirstFit_loop:
+ ld r18, X+ ; read chunk header
+ ld r19, X+
+ mov r16, r18 ; heap end reached?
+ or r16, r19
+ breq heapAllocFirstFit_memFull
+ sbrc r17, HEAP_HEADER_BIT_USED
+ rjmp heapAllocFirstFit_next ; jump if used
+ ; current chunk free, check size
+ mov r16, r18
+ mov r17, r19
+ sub r16, r24
+ sbc r17, r25 ; r17:r16=remainder
+ brcs heapAllocFirstFit_next ; too small
+ rcall heapUseChunk
+ sec
+ ret
+heapAllocFirstFit_next:
+ add xl, r18
+ adc xh, r19
+ adiw xh:xl, 2 ; skip footer
+ rjmp heapAllocFirstFit_loop
+
+heapAllocFirstFit_memFull:
+ clc
+ ret
+; @end
+
+
+
+; ---------------------------------------------------------------------------
+; @routine heapAdjustStatsAlloc
+;
+; @param r25:r24 size of allocated chunk
+; @clobbers r16, r17
+
+heapAdjustStatsAlloc:
+ ; adjust heapUsed
+ lds r16, heapUsed
+ lds r17, heapUsed+1
+ add r16, r24
+ adc r17, r25
+ sts heapUsed, r16
+ sts heapUsed+1, r17
+
+ ; adjust heapFree
+ lds r16, heapFree
+ lds r17, heapFree+1
+ sub r16, r24
+ sbc r17, r25
+ sts heapFree, r16
+ sts heapFree+1, r17
+ ret
+; @end
+
+
+
+; ---------------------------------------------------------------------------
+; @routine heapAdjustStatsFree
+;
+; @param r25:r24 size of released chunk
+; @clobbers r16, r17
+
+heapAdjustStatsFree:
+ ; adjust heapUsed
+ lds r16, heapUsed
+ lds r17, heapUsed+1
+ sub r16, r24
+ sbc r17, r25
+ sts heapUsed, r16
+ sts heapUsed+1, r17
+
+ ; adjust heapFree
+ lds r16, heapFree
+ lds r17, heapFree+1
+ add r16, r24
+ adc r17, r25
+ sts heapFree, r16
+ sts heapFree+1, r17
+ ret
+; @end
+
+
+
+; ---------------------------------------------------------------------------
+; @routine Heap_Free
+;
+; @param X pointer to previously allocated data
+; @clobbers r16, r17, r24, r25, X
+
+Heap_Free:
+ sbiw xh:xl, 2 ; go back to chunk header
+ ld r24, X+ ; read allocated size (and USED bit)
+ ld r25, X+
+ sbrs r24, HEAP_HEADER_BIT_USED
+ rjmp Heap_Free_dblFree ; not in use (double free!!)
+ cbr r24, (1<
defs.asm
font8x8.asm
+ font6x8.asm
font1.asm
+ font2.asm
diff --git a/avr/modules/lcd2/font/defs.asm b/avr/modules/lcd2/font/defs.asm
index 4f86f91..d2908c3 100644
--- a/avr/modules/lcd2/font/defs.asm
+++ b/avr/modules/lcd2/font/defs.asm
@@ -7,6 +7,8 @@
; * Please see toplevel file COPYING of that project for license details. *
; ***************************************************************************
+#ifndef AVR_MODULES_FONT_DEFS
+#define AVR_MODULES_FONT_DEFS
.equ FONT_OFFS_RENDERFN_LOW = 0
@@ -18,3 +20,7 @@
.equ FONT_OFFS_NUMCHARS = 7
+
+#endif
+
+
diff --git a/avr/modules/lcd2/font/font1.asm b/avr/modules/lcd2/font/font1.asm
index 25a04de..7fd4710 100644
--- a/avr/modules/lcd2/font/font1.asm
+++ b/avr/modules/lcd2/font/font1.asm
@@ -30,7 +30,7 @@ font1_8x8:
.db 128, 0 ; needed buffer size
.db 8, 8 ; width, height of chars
.db 32, 64 ; first char, num of chars in font
-; data
+; data (8x8_horizontal_LSB_2)
.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x20
.db 0x0C,0x1E,0x1E,0x0C,0x0C,0x00,0x0C,0x00, ; 0x21
.db 0x36,0x36,0x36,0x00,0x00,0x00,0x00,0x00, ; 0x22
diff --git a/avr/modules/lcd2/font/font2.asm b/avr/modules/lcd2/font/font2.asm
new file mode 100644
index 0000000..6c6ec79
--- /dev/null
+++ b/avr/modules/lcd2/font/font2.asm
@@ -0,0 +1,179 @@
+; ***************************************************************************
+; 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. *
+; ***************************************************************************
+
+
+; ***************************************************************************
+; This is a font from the project LCD_fonts at
+; https://github.com/basti79/LCD-fonts.git
+; which in turn is based on a post by Benedikt K. in a forum post on
+; https://www.mikrocontroller.net/topic/54860
+; ***************************************************************************
+
+
+
+; ***************************************************************************
+; code
+
+.cseg
+
+
+
+font2_6x8:
+; header
+ .dw font6x8MonoRenderCharacter ; renderFn
+ .db 96, 0 ; needed buffer size
+ .db 6, 8 ; width, height of chars
+ .db 32, 65 ; first char, num of chars in font
+; data (6x8_horizontal_LSB_2)
+font:
+.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x20
+.db 0x08,0x1C,0x1C,0x08,0x08,0x00,0x08,0x00, ; 0x21
+.db 0x36,0x36,0x12,0x00,0x00,0x00,0x00,0x00, ; 0x22
+.db 0x00,0x14,0x3E,0x14,0x14,0x3E,0x14,0x00, ; 0x23
+.db 0x04,0x1C,0x02,0x0C,0x10,0x0E,0x08,0x00, ; 0x24
+.db 0x26,0x26,0x10,0x08,0x04,0x32,0x32,0x00, ; 0x25
+.db 0x04,0x0A,0x0A,0x04,0x2A,0x12,0x2C,0x00, ; 0x26
+.db 0x0C,0x0C,0x04,0x00,0x00,0x00,0x00,0x00, ; 0x27
+.db 0x08,0x04,0x04,0x04,0x04,0x04,0x08,0x00, ; 0x28
+.db 0x04,0x08,0x08,0x08,0x08,0x08,0x04,0x00, ; 0x29
+.db 0x00,0x14,0x1C,0x3E,0x1C,0x14,0x00,0x00, ; 0x2A
+.db 0x00,0x08,0x08,0x3E,0x08,0x08,0x00,0x00, ; 0x2B
+.db 0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x04, ; 0x2C
+.db 0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x00, ; 0x2D
+.db 0x00,0x00,0x00,0x00,0x00,0x0C,0x0C,0x00, ; 0x2E
+.db 0x00,0x20,0x10,0x08,0x04,0x02,0x00,0x00, ; 0x2F
+.db 0x1C,0x22,0x32,0x2A,0x26,0x22,0x1C,0x00, ; 0x30
+.db 0x08,0x0C,0x08,0x08,0x08,0x08,0x1C,0x00, ; 0x31
+.db 0x1C,0x22,0x20,0x18,0x04,0x02,0x3E,0x00, ; 0x32
+.db 0x1C,0x22,0x20,0x1C,0x20,0x22,0x1C,0x00, ; 0x33
+.db 0x10,0x18,0x14,0x12,0x3E,0x10,0x10,0x00, ; 0x34
+.db 0x3E,0x02,0x02,0x1E,0x20,0x22,0x1C,0x00, ; 0x35
+.db 0x18,0x04,0x02,0x1E,0x22,0x22,0x1C,0x00, ; 0x36
+.db 0x3E,0x20,0x10,0x08,0x04,0x04,0x04,0x00, ; 0x37
+.db 0x1C,0x22,0x22,0x1C,0x22,0x22,0x1C,0x00, ; 0x38
+.db 0x1C,0x22,0x22,0x3C,0x20,0x10,0x0C,0x00, ; 0x39
+.db 0x00,0x00,0x0C,0x0C,0x00,0x0C,0x0C,0x00, ; 0x3A
+.db 0x00,0x00,0x0C,0x0C,0x00,0x0C,0x0C,0x04, ; 0x3B
+.db 0x10,0x08,0x04,0x02,0x04,0x08,0x10,0x00, ; 0x3C
+.db 0x00,0x00,0x3E,0x00,0x00,0x3E,0x00,0x00, ; 0x3D
+.db 0x04,0x08,0x10,0x20,0x10,0x08,0x04,0x00, ; 0x3E
+.db 0x1C,0x22,0x20,0x18,0x08,0x00,0x08,0x00, ; 0x3F
+.db 0x1C,0x22,0x3A,0x2A,0x3A,0x02,0x1C,0x00, ; 0x40
+.db 0x1C,0x22,0x22,0x22,0x3E,0x22,0x22,0x00, ; 0x41
+.db 0x1E,0x22,0x22,0x1E,0x22,0x22,0x1E,0x00, ; 0x42
+.db 0x1C,0x22,0x02,0x02,0x02,0x22,0x1C,0x00, ; 0x43
+.db 0x1E,0x22,0x22,0x22,0x22,0x22,0x1E,0x00, ; 0x44
+.db 0x3E,0x02,0x02,0x1E,0x02,0x02,0x3E,0x00, ; 0x45
+.db 0x3E,0x02,0x02,0x1E,0x02,0x02,0x02,0x00, ; 0x46
+.db 0x1C,0x22,0x02,0x3A,0x22,0x22,0x3C,0x00, ; 0x47
+.db 0x22,0x22,0x22,0x3E,0x22,0x22,0x22,0x00, ; 0x48
+.db 0x1C,0x08,0x08,0x08,0x08,0x08,0x1C,0x00, ; 0x49
+.db 0x20,0x20,0x20,0x20,0x22,0x22,0x1C,0x00, ; 0x4A
+.db 0x22,0x12,0x0A,0x06,0x0A,0x12,0x22,0x00, ; 0x4B
+.db 0x02,0x02,0x02,0x02,0x02,0x02,0x3E,0x00, ; 0x4C
+.db 0x22,0x36,0x2A,0x22,0x22,0x22,0x22,0x00, ; 0x4D
+.db 0x22,0x26,0x2A,0x32,0x22,0x22,0x22,0x00, ; 0x4E
+.db 0x1C,0x22,0x22,0x22,0x22,0x22,0x1C,0x00, ; 0x4F
+.db 0x1E,0x22,0x22,0x1E,0x02,0x02,0x02,0x00, ; 0x50
+.db 0x1C,0x22,0x22,0x22,0x2A,0x12,0x2C,0x00, ; 0x51
+.db 0x1E,0x22,0x22,0x1E,0x12,0x22,0x22,0x00, ; 0x52
+.db 0x1C,0x22,0x02,0x1C,0x20,0x22,0x1C,0x00, ; 0x53
+.db 0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x00, ; 0x54
+.db 0x22,0x22,0x22,0x22,0x22,0x22,0x1C,0x00, ; 0x55
+.db 0x22,0x22,0x22,0x22,0x22,0x14,0x08,0x00, ; 0x56
+.db 0x22,0x22,0x2A,0x2A,0x2A,0x2A,0x14,0x00, ; 0x57
+.db 0x22,0x22,0x14,0x08,0x14,0x22,0x22,0x00, ; 0x58
+.db 0x22,0x22,0x22,0x14,0x08,0x08,0x08,0x00, ; 0x59
+.db 0x1E,0x10,0x08,0x04,0x02,0x02,0x1E,0x00, ; 0x5A
+.db 0x1C,0x04,0x04,0x04,0x04,0x04,0x1C,0x00, ; 0x5B
+.db 0x00,0x02,0x04,0x08,0x10,0x20,0x00,0x00, ; 0x5C
+.db 0x1C,0x10,0x10,0x10,0x10,0x10,0x1C,0x00, ; 0x5D
+.db 0x08,0x14,0x22,0x00,0x00,0x00,0x00,0x00, ; 0x5E
+.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F, ; 0x5F
+.db 0x0C,0x0C,0x08,0x00,0x00,0x00,0x00,0x00, ; 0x60
+
+
+
+
+
+
+
+
+
+
+
+#if 0
+.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, ; 0x20
+.db 0x20,0x70,0x70,0x20,0x20,0x00,0x20,0x00, ; 0x21
+.db 0xD8,0xD8,0x48,0x00,0x00,0x00,0x00,0x00, ; 0x22
+.db 0x00,0x50,0xF8,0x50,0x50,0xF8,0x50,0x00, ; 0x23
+.db 0x10,0x70,0x08,0x30,0x40,0x38,0x20,0x00, ; 0x24
+.db 0x98,0x98,0x40,0x20,0x10,0xC8,0xC8,0x00, ; 0x25
+.db 0x10,0x28,0x28,0x10,0xA8,0x48,0xB0,0x00, ; 0x26
+.db 0x30,0x30,0x10,0x00,0x00,0x00,0x00,0x00, ; 0x27
+.db 0x20,0x10,0x10,0x10,0x10,0x10,0x20,0x00, ; 0x28
+.db 0x10,0x20,0x20,0x20,0x20,0x20,0x10,0x00, ; 0x29
+.db 0x00,0x50,0x70,0xF8,0x70,0x50,0x00,0x00, ; 0x2A
+.db 0x00,0x20,0x20,0xF8,0x20,0x20,0x00,0x00, ; 0x2B
+.db 0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x10, ; 0x2C
+.db 0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00, ; 0x2D
+.db 0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00, ; 0x2E
+.db 0x00,0x80,0x40,0x20,0x10,0x08,0x00,0x00, ; 0x2F
+.db 0x70,0x88,0xC8,0xA8,0x98,0x88,0x70,0x00, ; 0x30
+.db 0x20,0x30,0x20,0x20,0x20,0x20,0x70,0x00, ; 0x31
+.db 0x70,0x88,0x80,0x60,0x10,0x08,0xF8,0x00, ; 0x32
+.db 0x70,0x88,0x80,0x70,0x80,0x88,0x70,0x00, ; 0x33
+.db 0x40,0x60,0x50,0x48,0xF8,0x40,0x40,0x00, ; 0x34
+.db 0xF8,0x08,0x08,0x78,0x80,0x88,0x70,0x00, ; 0x35
+.db 0x60,0x10,0x08,0x78,0x88,0x88,0x70,0x00, ; 0x36
+.db 0xF8,0x80,0x40,0x20,0x10,0x10,0x10,0x00, ; 0x37
+.db 0x70,0x88,0x88,0x70,0x88,0x88,0x70,0x00, ; 0x38
+.db 0x70,0x88,0x88,0xF0,0x80,0x40,0x30,0x00, ; 0x39
+.db 0x00,0x00,0x30,0x30,0x00,0x30,0x30,0x00, ; 0x3A
+.db 0x00,0x00,0x30,0x30,0x00,0x30,0x30,0x10, ; 0x3B
+.db 0x40,0x20,0x10,0x08,0x10,0x20,0x40,0x00, ; 0x3C
+.db 0x00,0x00,0xF8,0x00,0x00,0xF8,0x00,0x00, ; 0x3D
+.db 0x10,0x20,0x40,0x80,0x40,0x20,0x10,0x00, ; 0x3E
+.db 0x70,0x88,0x80,0x60,0x20,0x00,0x20,0x00, ; 0x3F
+.db 0x70,0x88,0xE8,0xA8,0xE8,0x08,0x70,0x00, ; 0x40
+.db 0x70,0x88,0x88,0x88,0xF8,0x88,0x88,0x00, ; 0x41
+.db 0x78,0x88,0x88,0x78,0x88,0x88,0x78,0x00, ; 0x42
+.db 0x70,0x88,0x08,0x08,0x08,0x88,0x70,0x00, ; 0x43
+.db 0x78,0x88,0x88,0x88,0x88,0x88,0x78,0x00, ; 0x44
+.db 0xF8,0x08,0x08,0x78,0x08,0x08,0xF8,0x00, ; 0x45
+.db 0xF8,0x08,0x08,0x78,0x08,0x08,0x08,0x00, ; 0x46
+.db 0x70,0x88,0x08,0xE8,0x88,0x88,0xF0,0x00, ; 0x47
+.db 0x88,0x88,0x88,0xF8,0x88,0x88,0x88,0x00, ; 0x48
+.db 0x70,0x20,0x20,0x20,0x20,0x20,0x70,0x00, ; 0x49
+.db 0x80,0x80,0x80,0x80,0x88,0x88,0x70,0x00, ; 0x4A
+.db 0x88,0x48,0x28,0x18,0x28,0x48,0x88,0x00, ; 0x4B
+.db 0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x00, ; 0x4C
+.db 0x88,0xD8,0xA8,0x88,0x88,0x88,0x88,0x00, ; 0x4D
+.db 0x88,0x98,0xA8,0xC8,0x88,0x88,0x88,0x00, ; 0x4E
+.db 0x70,0x88,0x88,0x88,0x88,0x88,0x70,0x00, ; 0x4F
+.db 0x78,0x88,0x88,0x78,0x08,0x08,0x08,0x00, ; 0x50
+.db 0x70,0x88,0x88,0x88,0xA8,0x48,0xB0,0x00, ; 0x51
+.db 0x78,0x88,0x88,0x78,0x48,0x88,0x88,0x00, ; 0x52
+.db 0x70,0x88,0x08,0x70,0x80,0x88,0x70,0x00, ; 0x53
+.db 0xF8,0x20,0x20,0x20,0x20,0x20,0x20,0x00, ; 0x54
+.db 0x88,0x88,0x88,0x88,0x88,0x88,0x70,0x00, ; 0x55
+.db 0x88,0x88,0x88,0x88,0x88,0x50,0x20,0x00, ; 0x56
+.db 0x88,0x88,0xA8,0xA8,0xA8,0xA8,0x50,0x00, ; 0x57
+.db 0x88,0x88,0x50,0x20,0x50,0x88,0x88,0x00, ; 0x58
+.db 0x88,0x88,0x88,0x50,0x20,0x20,0x20,0x00, ; 0x59
+.db 0x78,0x40,0x20,0x10,0x08,0x08,0x78,0x00, ; 0x5A
+.db 0x70,0x10,0x10,0x10,0x10,0x10,0x70,0x00, ; 0x5B
+.db 0x00,0x08,0x10,0x20,0x40,0x80,0x00,0x00, ; 0x5C
+.db 0x70,0x40,0x40,0x40,0x40,0x40,0x70,0x00, ; 0x5D
+.db 0x20,0x50,0x88,0x00,0x00,0x00,0x00,0x00, ; 0x5E
+.db 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFC, ; 0x5F
+.db 0x30,0x30,0x20,0x00,0x00,0x00,0x00,0x00, ; 0x60
+#endif
+
+
diff --git a/avr/modules/lcd2/font/font6x8.asm b/avr/modules/lcd2/font/font6x8.asm
new file mode 100644
index 0000000..50b5696
--- /dev/null
+++ b/avr/modules/lcd2/font/font6x8.asm
@@ -0,0 +1,96 @@
+; ***************************************************************************
+; 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. *
+; ***************************************************************************
+
+
+; ***************************************************************************
+; code
+
+.cseg
+
+
+
+
+; ---------------------------------------------------------------------------
+; @routine font6x8RenderCharacter
+
+; @param R16 character to write
+; @param R1:R0 background color
+; @param R3:R2 foreground color
+; @param Z pointer to font
+; @param X pointer to RAM to store data to
+; @param r18 char width in pixel
+; @param r19 char height in pixel
+; @clobbers r16, r17, r24, r25, x
+
+font6x8MonoRenderCharacter:
+ push zl
+ push zh
+ adiw zh:zl, FONT_OFFS_WIDTH
+ lpm r18, Z+ ; char width in pixels
+ lpm r19, Z ; char height in pixels
+ sbiw zh:zl, FONT_OFFS_WIDTH+1
+ rcall font6x8GetCharPosInFont ; (r16, r17, r24, r25, z)
+ mov r25, r19 ; height in pixels
+font6x8MonoRenderCharacter_loop1:
+ mov r24, r18 ; width in pixels
+ lpm r17, Z+
+font6x8MonoRenderCharacter_loop2:
+ lsr r17
+ brcs font6x8MonoRenderCharacter_writeForeground
+ st X+, r0
+ st X+, r1
+ rjmp font6x8MonoRenderCharacter_loop2end
+font6x8MonoRenderCharacter_writeForeground:
+ st X+, r2
+ st X+, r3
+font6x8MonoRenderCharacter_loop2end:
+ dec r24
+ brne font6x8MonoRenderCharacter_loop2
+ dec r25
+ brne font6x8MonoRenderCharacter_loop1
+ pop zh
+ pop zl
+ ret
+; @end
+
+
+
+; ---------------------------------------------------------------------------
+; @routine font6x8GetCharPosInFont (same as font8x8GetCharPosInFont!)
+
+; @param R16 character to write
+; @param Z pointer to font
+; @return Z pointer to begin of char data
+; @clobbers r16, r17, r24, r25, z
+
+font6x8GetCharPosInFont:
+ mov r24, r16
+ adiw zh:zl, FONT_OFFS_FIRSTCHAR
+ lpm r24, Z+ ; first char num
+ lpm r25, Z+ ; num of chars
+ sub r16, r24
+ brcs font6x8GetCharPosInFont_ret
+ cp r16, r25
+ brcc font6x8GetCharPosInFont_ret
+ mov r24, r16
+ clr r25
+ lsl r24 ; x2
+ rol r25
+ lsl r24 ; x4
+ rol r25
+ lsl r24 ; x8
+ rol r25
+ add zl, r24
+ adc zh, r25
+font6x8GetCharPosInFont_ret:
+ ret
+; @end
+
+
+
diff --git a/avr/modules/lcd2/ili9341/defs.asm b/avr/modules/lcd2/ili9341/defs.asm
index aa3aa70..aa37ed7 100644
--- a/avr/modules/lcd2/ili9341/defs.asm
+++ b/avr/modules/lcd2/ili9341/defs.asm
@@ -57,3 +57,5 @@
.equ WIN_OFFS_REL_X_HIGH = 11
+
+
diff --git a/avr/modules/lcd2/ili9341/main.asm b/avr/modules/lcd2/ili9341/main.asm
index 933e1ba..9ec3266 100644
--- a/avr/modules/lcd2/ili9341/main.asm
+++ b/avr/modules/lcd2/ili9341/main.asm
@@ -97,8 +97,8 @@ ILI9341_Init:
mov r7, r16
; set font pos
- ldi zl, LOW(font1_8x8*2)
- ldi zh, HIGH(font1_8x8*2)
+ ldi zl, LOW(font2_6x8*2)
+ ldi zh, HIGH(font2_6x8*2)
; set buffer pos
; ldi xl, LOW(ILI9341_buffer)
@@ -423,6 +423,6 @@ helloWorld: .db "Hello World", 0
-.include "modules/lcd2/font/font1.asm"
+.include "modules/lcd2/font/font2.asm"
diff --git a/avr/modules/lcd2/win/widget.asm b/avr/modules/lcd2/win/widget.asm
new file mode 100644
index 0000000..4a070d6
--- /dev/null
+++ b/avr/modules/lcd2/win/widget.asm
@@ -0,0 +1,18 @@
+; ***************************************************************************
+; 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. *
+; ***************************************************************************
+
+
+
+; ---------------------------------------------------------------------------
+; @routine WID_Widget_new @global
+
+
+WID_Widget_new:
+
+