; *************************************************************************** ; 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 font12x16MonoHandlerFn ; ; Handler for 12x16 Mono Fonts ; font12x16MonoHandlerFn: cpi r23, FONT_FN_RENDER breq font12x16MonoRenderCharacter rjmp FONT_GenericHandler ; @end ; --------------------------------------------------------------------------- ; @routine font12x16RenderCharacter ; @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 r17, r18, r23, r24, r25, x font12x16MonoRenderCharacter: push zl push zh rcall font12x16GetCharPosInFont ; (r17, r24, r25, z) ldi r25, 16 ; 16 bytes height font12x16MonoRenderCharacter_loop1: ldi r24, 12 ; 16 bits ldi r23, 8 lpm r17, Z+ font12x16MonoRenderCharacter_loop2: dec r23 brne font12x16MonoRenderCharacter_haveByte lpm r17, Z+ ldi r23, 8 font12x16MonoRenderCharacter_haveByte: lsr r17 brcs font12x16MonoRenderCharacter_writeForeground st X+, r0 st X+, r1 rjmp font12x16MonoRenderCharacter_loop2end font12x16MonoRenderCharacter_writeForeground: st X+, r2 st X+, r3 font12x16MonoRenderCharacter_loop2end: dec r24 brne font12x16MonoRenderCharacter_loop2 dec r25 brne font12x16MonoRenderCharacter_loop1 ldi r18, 12 ldi r19, 16 pop zh pop zl ret ; @end ; --------------------------------------------------------------------------- ; @routine font12x16GetCharPosInFont ; @param R16 character to write ; @param Z pointer to font ; @return Z pointer to begin of char data ; @clobbers r17, r24, r25, z font12x16GetCharPosInFont: 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 font12x16GetCharPosInFont_ret cp r16, r25 brcc font12x16GetCharPosInFont_ret mov r25, r16 ; x256 clr r24 lsr r25 ; x128 ror r24 lsr r25 ; x64 ror r24 lsr r25 ; x32 ror r24 add zl, r24 adc zh, r25 font12x16GetCharPosInFont_ret: ret ; @end