; *************************************************************************** ; 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 ili9341_WriteCharacterX1At ; @param R16 character to write ; @param r5:r4 X ; @param r7:r6 Y ; @param r1:r0 background color ; @param r3:r2 foreground color ; @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 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 adc r5, r9 ret ; @end ; --------------------------------------------------------------------------- ; @routine ili9341_WriteCharacterX2At ; @param R16 character to write ; @param r5:r4 X ; @param r7:r6 Y ; @param r1:r0 background color ; @param r3:r2 foreground color ; @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 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 rol r9 add r4, r8 ; add to X adc r5, r9 ret ; @end ; --------------------------------------------------------------------------- ; @routine ili9341_WriteCharacterX4At ; @param R16 character to write ; @param r5:r4 X ; @param r7:r6 Y ; @param r1:r0 background color ; @param r3:r2 foreground color ; @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 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 rol r9 lsl r8 ; Wx4 rol r9 add r4, r8 ; add to X adc r5, r9 ret ; @end ; --------------------------------------------------------------------------- ; @routine ili9341FontRenderChar ; @param R16 character to write ; @param Z pointer to font ; @param X pointer to RAM to store data to ; @return r9:r8 character width in points ; @return r11:r10 character height in points ; @clobbers r16 (r17, r24, r25, z) ili9341FontRenderChar: ; render character push xl push xh ; call render function of the selected font (first word of font is jmp to render function) rcall ili9341JumpToFontRenderFn ; (r17, r24, r25, x, z) pop xh pop xl ; set src width and height mov r8, r18 clr r9 mov r10, r19 clr r11 ret ; @end ; --------------------------------------------------------------------------- ; @routine ili9341JumpToFontRenderFn ; ; helper function to call function at the beginning of the given font ; @clobbers r17 ili9341JumpToFontRenderFn: lpm r17, Z+ push r17 lpm r17, Z push r17 sbiw zh:zl, 1 ret ; @end