diff --git a/avr/devices/all/includes.asm b/avr/devices/all/includes.asm index 05c8aa6..48c95e0 100644 --- a/avr/devices/all/includes.asm +++ b/avr/devices/all/includes.asm @@ -156,6 +156,7 @@ .include "modules/lcd2/ili9341/defs.asm" .include "modules/lcd2/ili9341/main.asm" .include "modules/lcd2/ili9341/io_spi.asm" +.include "modules/lcd2/ili9341/graphops.asm" .include "modules/lcd2/ili9341/text.asm" #endif diff --git a/avr/modules/lcd2/font/font1.asm b/avr/modules/lcd2/font/font1.asm index 4fdac2c..25a04de 100644 --- a/avr/modules/lcd2/font/font1.asm +++ b/avr/modules/lcd2/font/font1.asm @@ -26,7 +26,7 @@ font1_8x8: ; header - rjmp font8x8MonoRenderCharacter ; renderFn + .dw font8x8MonoRenderCharacter ; renderFn .db 128, 0 ; needed buffer size .db 8, 8 ; width, height of chars .db 32, 64 ; first char, num of chars in font diff --git a/avr/modules/lcd2/font/font8x8.asm b/avr/modules/lcd2/font/font8x8.asm index 8f1bae2..f33a2dc 100644 --- a/avr/modules/lcd2/font/font8x8.asm +++ b/avr/modules/lcd2/font/font8x8.asm @@ -31,9 +31,6 @@ font8x8MonoRenderCharacter: push zl push zh - lsl zl - rol zh - rcall font8x8GetCharPosInFont8x8 ; (r17, r24, r25, z) ldi r25, 8 ; 8 bytes font8x8MonoRenderCharacter_loop1: diff --git a/avr/modules/lcd2/ili9341/graphops.asm b/avr/modules/lcd2/ili9341/graphops.asm new file mode 100644 index 0000000..f280508 --- /dev/null +++ b/avr/modules/lcd2/ili9341/graphops.asm @@ -0,0 +1,337 @@ +; *************************************************************************** +; 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 ili9341SetAddressWindow +; +; @param r5:r4 X0 +; @param r7:r6 Y0 +; @param r9:r8 W +; @param r11:r10 H +; @clobbers R16, r20, r21 + +ili9341SetAddressWindow: + ; calc XEnd (=X+W-1) + mov r20, r8 + mov r21, r9 + add r20, r4 + adc r21, r5 + subi r20, 1 + sbci r21, 0 + + ; send column address + ldi r16, ILI9341_CMD_CASET + rcall ili9341SendCommand + ; X0 + mov r16, r5 + rcall ili9341SendData + mov r16, r4 + rcall ili9341SendData + ; X1 + mov r16, r21 + rcall ili9341SendData + mov r16, r20 + rcall ili9341SendData + + ; calc YEnd (=Y+H-1) + mov r20, r10 + mov r21, r11 + add r20, r6 + adc r21, r7 + subi r20, 1 + sbci r21, 0 + + ; send row address + ldi r16, ILI9341_CMD_PASET + rcall ili9341SendCommand + ; Y0 + mov r16, r7 + rcall ili9341SendData + mov r16, r6 + rcall ili9341SendData + ; Y1 + mov r16, r21 + rcall ili9341SendData + mov r16, r20 + rcall ili9341SendData + + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine ILI9341_FillRect +; @param r3:r2 color +; @param r5:r4 X0 +; @param r7:r6 Y0 +; @param r9:r8 X1/W +; @param r11:r10 Y1/H + +ILI9341_FillRect: + push r15 + in r15, SREG + cli + + rcall ili9341BeginSpi ; (R16, R17) + rcall ili9341SetAddressWindow ; (R16, r20, r21) + + mov r18, r2 ; color + mov r19, r3 + mov r22, r10 ; H low + mov r23, r11 ; H high + ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM + rcall ili9341SendCommand + + cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low + sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high (DATA) +ILI9341_FillRect_loopH: + mov r24, r8 ; W low + mov r25, r9 ; W high +ILI9341_FillRect_loopW: + mov r16, r19 + rcall SPIHW_MasterTransfer + mov r16, r18 + rcall SPIHW_MasterTransfer + sbiw r25:r24, 1 + brne ILI9341_FillRect_loopW + mov r24, r22 ; H low + mov r25, r23 ; H high + sbiw r25:r24, 1 ; dec + mov r22, r24 ; save in r23:r22 + mov r23, r25 + brne ILI9341_FillRect_loopH + sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS high + rcall ili9341EndSpi + out SREG, r15 + pop r15 + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine ili9341BitBlit + +; @param r5:r4 X (dest) +; @param r7:r6 Y (dest) +; @param r9:r8 W +; @param r11:r10 H +; @param X source data pointer (RAM) +; @clobbers r16, r22, r23, r24, r25, X (r17, r20, r21) + +ili9341BitBlit: + push r15 + in r15, SREG + cli + + rcall ili9341BeginSpi ; (r16, r17) + rcall ili9341SetAddressWindow ; (R16, R20, R21) + + ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM + rcall ili9341SendCommand + + mov r22, r10 + mov r23, r11 + cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low + sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high (DATA) +ili9341BitBlit_loopH: + mov r24, r8 + mov r25, r9 +ili9341BitBlit_loopW: + ld r18, X+ + ld r19, X+ + mov r16, r19 + rcall SPIHW_MasterTransfer ; (R16) + mov r16, r18 + rcall SPIHW_MasterTransfer ; (R16) + sbiw r25:r24, 1 + brne ili9341BitBlit_loopW + mov r24, r22 + mov r25, r23 + sbiw r25:r24, 1 + mov r22, r24 + mov r23, r25 + brne ili9341BitBlit_loopH + sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS high + rcall ili9341EndSpi ; (R16) + out SREG, r15 + pop r15 + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine ili9341BitBlitStretch2 + +; @param r5:r4 X (dest) +; @param r7:r6 Y (dest) +; @param r9:r8 W +; @param r11:r10 H +; @param X source data pointer (RAM) +; @clobbers r16, r22, r23, r24, r25, X (r17, r18, r19, r20, r21) + +ili9341BitBlitStretch2: + push r15 + in r15, SREG + cli + + push r8 + push r9 + push r10 + push r11 + ; width + lsl r8 ; x2 + rol r9 + ; height + lsl r10 ; x2 + rol r11 + + rcall ili9341BeginSpi ; (r16, r17) + rcall ili9341SetAddressWindow ; (R16, R20, R21) + pop r11 + pop r10 + pop r9 + pop r8 + ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM + rcall ili9341SendCommand + + mov r22, r10 + mov r23, r11 + cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low + sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high (DATA) + ldi r17, 2 +ili9341BitBlitStretch2_loopH: + mov r20, xl ; preserve for next run + mov r21, xh + rcall ili9341BitBlitStretchNWriteLine ; (r16, r17, r18, r19, r24, r25, X) + mov xl, r20 + mov xh, r21 + rcall ili9341BitBlitStretchNWriteLine ; (r16, r17, r18, r19, r24, r25, X) + mov r24, r22 + mov r25, r23 + sbiw r25:r24, 1 + mov r22, r24 + mov r23, r25 + brne ili9341BitBlitStretch2_loopH + sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS high + rcall ili9341EndSpi ; (R16) + out SREG, r15 + pop r15 + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine ili9341BitBlitStretch4 + +; @param r5:r4 X (dest) +; @param r7:r6 Y (dest) +; @param r9:r8 W +; @param r11:r10 H +; @param X source data pointer (RAM) +; @clobbers r16, r22, r23, r24, r25, X (r17, r20, r21) + +ili9341BitBlitStretch4: + push r15 + in r15, SREG + cli + + push r8 + push r9 + push r10 + push r11 + ; width + lsl r8 ; x2 + rol r9 + lsl r8 ; x4 + rol r9 + ; height + lsl r10 ; x2 + rol r11 + lsl r10 ; x4 + rol r11 + + rcall ili9341BeginSpi ; (r16, r17) + rcall ili9341SetAddressWindow ; (R16, R20, R21) + pop r11 + pop r10 + pop r9 + pop r8 + ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM + rcall ili9341SendCommand + + mov r22, r10 + mov r23, r11 + ldi r17, 4 + cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low + sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high (DATA) +ili9341BitBlitStretch4_loopH: + mov r20, xl ; preserve for next run + mov r21, xh + rcall ili9341BitBlitStretchNWriteLine ; (r16, r17, r18, r19, r24, r25, X) + mov xl, r20 + mov xh, r21 + rcall ili9341BitBlitStretchNWriteLine ; (r16, r17, r18, r19, r24, r25, X) + mov xl, r20 + mov xh, r21 + rcall ili9341BitBlitStretchNWriteLine ; (r16, r17, r18, r19, r24, r25, X) + mov xl, r20 + mov xh, r21 + rcall ili9341BitBlitStretchNWriteLine ; (r16, r17, r18, r19, r24, r25, X) + mov r24, r22 + mov r25, r23 + sbiw r25:r24, 1 + mov r22, r24 + mov r23, r25 + brne ili9341BitBlitStretch4_loopH + sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS high + rcall ili9341EndSpi ; (R16) + out SREG, r15 + pop r15 + ret +; @end + + + +; --------------------------------------------------------------------------- +; @routine ili9341BitBlitStretchNWriteLine + +; @param r9:r8 width +; @param r17 repeat factor +; @param X source position of line +; @clobbers r16, r17, r18, r19, r24, r25, X + +ili9341BitBlitStretchNWriteLine: + mov r24, r8 + mov r25, r9 +ili9341BitBlitStretchNWriteLine_loop1: + ld r18, X+ + ld r19, X+ + push r17 +ili9341BitBlitStretchNWriteLine_loop2: + mov r16, r19 + rcall SPIHW_MasterTransfer ; (R16) + mov r16, r18 + rcall SPIHW_MasterTransfer ; (R16) + dec r17 + brne ili9341BitBlitStretchNWriteLine_loop2 + pop r17 + sbiw r25:r24, 1 + brne ili9341BitBlitStretchNWriteLine_loop1 + ret +; @end + + + + + diff --git a/avr/modules/lcd2/ili9341/main.asm b/avr/modules/lcd2/ili9341/main.asm index 04a746f..933e1ba 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) - ldi zh, HIGH(font1_8x8) + ldi zl, LOW(font1_8x8*2) + ldi zh, HIGH(font1_8x8*2) ; set buffer pos ; ldi xl, LOW(ILI9341_buffer) @@ -279,328 +279,12 @@ ILI9341_FillScreen: -; --------------------------------------------------------------------------- -; @routine ili9341SetAddressWindow -; -; @param r5:r4 X0 -; @param r7:r6 Y0 -; @param r9:r8 W -; @param r11:r10 H -; @clobbers R16, r20, r21 - -ili9341SetAddressWindow: - ; calc XEnd (=X+W-1) - mov r20, r8 - mov r21, r9 - add r20, r4 - adc r21, r5 - subi r20, 1 - sbci r21, 0 - - ; send column address - ldi r16, ILI9341_CMD_CASET - rcall ili9341SendCommand - ; X0 - mov r16, r5 - rcall ili9341SendData - mov r16, r4 - rcall ili9341SendData - ; X1 - mov r16, r21 - rcall ili9341SendData - mov r16, r20 - rcall ili9341SendData - - ; calc YEnd (=Y+H-1) - mov r20, r10 - mov r21, r11 - add r20, r6 - adc r21, r7 - subi r20, 1 - sbci r21, 0 - - ; send row address - ldi r16, ILI9341_CMD_PASET - rcall ili9341SendCommand - ; Y0 - mov r16, r7 - rcall ili9341SendData - mov r16, r6 - rcall ili9341SendData - ; Y1 - mov r16, r21 - rcall ili9341SendData - mov r16, r20 - rcall ili9341SendData - - ret -; @end -; --------------------------------------------------------------------------- -; @routine ILI9341_FillRect -; @param r3:r2 color -; @param r5:r4 X0 -; @param r7:r6 Y0 -; @param r9:r8 X1/W -; @param r11:r10 Y1/H - -ILI9341_FillRect: - push r15 - in r15, SREG - cli - - rcall ili9341BeginSpi ; (R16, R17) - rcall ili9341SetAddressWindow ; (R16, r20, r21) - - mov r18, r2 ; color - mov r19, r3 - mov r22, r10 ; H low - mov r23, r11 ; H high - ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM - rcall ili9341SendCommand - - cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low - sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high (DATA) -ILI9341_FillRect_loopH: - mov r24, r8 ; W low - mov r25, r9 ; W high -ILI9341_FillRect_loopW: - mov r16, r19 - rcall SPIHW_MasterTransfer - mov r16, r18 - rcall SPIHW_MasterTransfer - sbiw r25:r24, 1 - brne ILI9341_FillRect_loopW - mov r24, r22 ; H low - mov r25, r23 ; H high - sbiw r25:r24, 1 ; dec - mov r22, r24 ; save in r23:r22 - mov r23, r25 - brne ILI9341_FillRect_loopH - sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS high - rcall ili9341EndSpi - out SREG, r15 - pop r15 - ret -; @end -; --------------------------------------------------------------------------- -; @routine ili9341BitBlit - -; @param r5:r4 X (dest) -; @param r7:r6 Y (dest) -; @param r9:r8 W -; @param r11:r10 H -; @param X source data pointer (RAM) -; @clobbers r16, r22, r23, r24, r25, X (r17, r20, r21) - -ili9341BitBlit: - push r15 - in r15, SREG - cli - - rcall ili9341BeginSpi ; (r16, r17) - rcall ili9341SetAddressWindow ; (R16, R20, R21) - - ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM - rcall ili9341SendCommand - - mov r22, r10 - mov r23, r11 - cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low - sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high (DATA) -ili9341BitBlit_loopH: - mov r24, r8 - mov r25, r9 -ili9341BitBlit_loopW: - ld r18, X+ - ld r19, X+ - mov r16, r19 - rcall SPIHW_MasterTransfer ; (R16) - mov r16, r18 - rcall SPIHW_MasterTransfer ; (R16) - sbiw r25:r24, 1 - brne ili9341BitBlit_loopW - mov r24, r22 - mov r25, r23 - sbiw r25:r24, 1 - mov r22, r24 - mov r23, r25 - brne ili9341BitBlit_loopH - sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS high - rcall ili9341EndSpi ; (R16) - out SREG, r15 - pop r15 - ret -; @end - - - -; --------------------------------------------------------------------------- -; @routine ili9341BitBlitStretch2 - -; @param r5:r4 X (dest) -; @param r7:r6 Y (dest) -; @param r9:r8 W -; @param r11:r10 H -; @param X source data pointer (RAM) -; @clobbers r16, r22, r23, r24, r25, X (r17, r18, r19, r20, r21) - -ili9341BitBlitStretch2: - push r15 - in r15, SREG - cli - - push r8 - push r9 - push r10 - push r11 - ; width - lsl r8 ; x2 - rol r9 - ; height - lsl r10 ; x2 - rol r11 - - rcall ili9341BeginSpi ; (r16, r17) - rcall ili9341SetAddressWindow ; (R16, R20, R21) - pop r11 - pop r10 - pop r9 - pop r8 - ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM - rcall ili9341SendCommand - - mov r22, r10 - mov r23, r11 - cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low - sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high (DATA) - ldi r17, 2 -ili9341BitBlitStretch2_loopH: - mov r20, xl ; preserve for next run - mov r21, xh - rcall ili9341BitBlitStretchNWriteLine ; (r16, r17, r18, r19, r24, r25, X) - mov xl, r20 - mov xh, r21 - rcall ili9341BitBlitStretchNWriteLine ; (r16, r17, r18, r19, r24, r25, X) - mov r24, r22 - mov r25, r23 - sbiw r25:r24, 1 - mov r22, r24 - mov r23, r25 - brne ili9341BitBlitStretch2_loopH - sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS high - rcall ili9341EndSpi ; (R16) - out SREG, r15 - pop r15 - ret -; @end - - - -; --------------------------------------------------------------------------- -; @routine ili9341BitBlitStretch4 - -; @param r5:r4 X (dest) -; @param r7:r6 Y (dest) -; @param r9:r8 W -; @param r11:r10 H -; @param X source data pointer (RAM) -; @clobbers r16, r22, r23, r24, r25, X (r17, r20, r21) - -ili9341BitBlitStretch4: - push r15 - in r15, SREG - cli - - push r8 - push r9 - push r10 - push r11 - ; width - lsl r8 ; x2 - rol r9 - lsl r8 ; x4 - rol r9 - ; height - lsl r10 ; x2 - rol r11 - lsl r10 ; x4 - rol r11 - - rcall ili9341BeginSpi ; (r16, r17) - rcall ili9341SetAddressWindow ; (R16, R20, R21) - pop r11 - pop r10 - pop r9 - pop r8 - ldi r16, ILI9341_CMD_RAMWR ; start writing ro RAM - rcall ili9341SendCommand - - mov r22, r10 - mov r23, r11 - ldi r17, 4 - cbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS low - sbi ILI9341_DC_OUTPUT, ILI9341_DC_PIN ; D high (DATA) -ili9341BitBlitStretch4_loopH: - mov r20, xl ; preserve for next run - mov r21, xh - rcall ili9341BitBlitStretchNWriteLine ; (r16, r17, r18, r19, r24, r25, X) - mov xl, r20 - mov xh, r21 - rcall ili9341BitBlitStretchNWriteLine ; (r16, r17, r18, r19, r24, r25, X) - mov xl, r20 - mov xh, r21 - rcall ili9341BitBlitStretchNWriteLine ; (r16, r17, r18, r19, r24, r25, X) - mov xl, r20 - mov xh, r21 - rcall ili9341BitBlitStretchNWriteLine ; (r16, r17, r18, r19, r24, r25, X) - mov r24, r22 - mov r25, r23 - sbiw r25:r24, 1 - mov r22, r24 - mov r23, r25 - brne ili9341BitBlitStretch4_loopH - sbi SPIHW_SS_OUTPUT, SPIHW_SS_PIN ; SS high - rcall ili9341EndSpi ; (R16) - out SREG, r15 - pop r15 - ret -; @end - - - -; --------------------------------------------------------------------------- -; @routine ili9341BitBlitStretchNWriteLine - -; @param r9:r8 width -; @param r17 repeat factor -; @param X source position of line -; @clobbers r16, r17, r18, r19, r24, r25, X - -ili9341BitBlitStretchNWriteLine: - mov r24, r8 - mov r25, r9 -ili9341BitBlitStretchNWriteLine_loop1: - ld r18, X+ - ld r19, X+ - push r17 -ili9341BitBlitStretchNWriteLine_loop2: - mov r16, r19 - rcall SPIHW_MasterTransfer ; (R16) - mov r16, r18 - rcall SPIHW_MasterTransfer ; (R16) - dec r17 - brne ili9341BitBlitStretchNWriteLine_loop2 - pop r17 - sbiw r25:r24, 1 - brne ili9341BitBlitStretchNWriteLine_loop1 - ret -; @end diff --git a/avr/modules/lcd2/ili9341/text.asm b/avr/modules/lcd2/ili9341/text.asm index 4d5ef7e..bc8b8ee 100644 --- a/avr/modules/lcd2/ili9341/text.asm +++ b/avr/modules/lcd2/ili9341/text.asm @@ -23,13 +23,13 @@ ; @param r7:r6 Y ; @param r1:r0 background color ; @param r3:r2 foreground color -; @param Z pointer to font (word address!) +; @param Z pointer to font (byte address for LPM!) ; @param X pointer to RAM to store data to ; @return r5:r4 new X (advanced by character width) ; @clobbers r16 (r17, r20, r21, r22, r23, r24, r25, X) ili9341_WriteCharacterX1At: - rcall ili9341PrepareCharFromFont ; (r16, r17, r24, r25, z) + rcall ili9341FontRenderChar ; (r16, r17, r24, r25, z) rcall ili9341BitBlit ; (r16, r17, r20, r21, r22, r23, r24, r25, X) ; advance X (add char width to X) add r4, r8 @@ -48,13 +48,13 @@ ili9341_WriteCharacterX1At: ; @param r7:r6 Y ; @param r1:r0 background color ; @param r3:r2 foreground color -; @param Z pointer to font (word address!) +; @param Z pointer to font (byte address for LPM!) ; @param X pointer to RAM to store data to ; @return r5:r4 new X (advanced by character width) ; @clobbers r16 (r17, r18, r19, r20, r21, r22, r23, r24, r25, X) ili9341_WriteCharacterX2At: - rcall ili9341PrepareCharFromFont ; (r16, r17, r24, r25, z) + rcall ili9341FontRenderChar ; (r16, r17, r24, r25, z) rcall ili9341BitBlitStretch2 ; (r16, r17, r18, r19, r20, r21, r22, r23, r24, r25, X) ; advance X (add double char width to X) lsl r8 ; Wx2 @@ -74,13 +74,13 @@ ili9341_WriteCharacterX2At: ; @param r7:r6 Y ; @param r1:r0 background color ; @param r3:r2 foreground color -; @param Z pointer to font (word address!) +; @param Z pointer to font (byte address for LPM!) ; @param X pointer to RAM to store data to ; @return r5:r4 new X (advanced by character width) ; @clobbers r16, r17, r18, r19, r24, r25, x, z ili9341_WriteCharacterX4At: - rcall ili9341PrepareCharFromFont ; (r16, r17, r24, r25, z) + rcall ili9341FontRenderChar ; (r16, r17, r24, r25, z) rcall ili9341BitBlitStretch4 ; (r16, r17, r20, r21, r22, r23, r24, r25, X) ; advance X (add quad char width to X) lsl r8 ; Wx2 @@ -97,7 +97,7 @@ ili9341_WriteCharacterX4At: ; --------------------------------------------------------------------------- -; @routine ili9341PrepareCharFromFont +; @routine ili9341FontRenderChar ; @param R16 character to write ; @param Z pointer to font @@ -106,7 +106,7 @@ ili9341_WriteCharacterX4At: ; @return r11:r10 character height in points ; @clobbers r16 (r17, r24, r25, z) -ili9341PrepareCharFromFont: +ili9341FontRenderChar: ; render character push xl push xh @@ -129,9 +129,15 @@ ili9341PrepareCharFromFont: ; @routine ili9341JumpToFontRenderFn ; ; helper function to call function at the beginning of the given font +; @clobbers r17 ili9341JumpToFontRenderFn: - ijmp + lpm r17, Z+ + push r17 + lpm r17, Z + push r17 + sbiw zh:zl, 1 + ret ; @end