.global lcd_writechar // X: r24 lcd_writechar: // Y: r22 cpi r24, (XSIZEV/16) // C: r20 brsh exitchar // TC: r18 cpi r22, lo8(YSIZE) // BC: r16 brsh exitchar mov ZL, r20 ldi ZH, 26*2 // Fonthöhe * 2 mul ZL, ZH // Offset addieren movw ZL, r0 subi ZL, lo8(-(font)) sbci ZH, hi8(-(font)) ldi r21, 26 // Fonthöhe lsl r24 mov XH, r22 subi XH, (-(YMin)) mov r25, r16 and r25, r18 // Bits die auf jedenfall gesetzt werden or r18, r16 // Bits die auf nie gesetzt werden wchar1: ldi r17,2 // Fontbreite = 2 Byte wchar: lpm r20, Z+ mov r22, r20 mov XL, r24 sbrc r17,0 // beim 1.Durchlauf XL nicht erhöhen Adiw XL,2 // XL um 2 Byte erhöhen sbrc r16, 7 // Wenn Hintergrund an: Bits invertieren (eventuell unnötig, aber auf keinen Fall verkehrt) com r20 sbrs r18, 7 // Wenn nichts an: Bits löschen clr r20 sbrc r25, 7 // Wenn beides an: Bits setzen ser r20 st X,r20 #ifdef GRAYSCALE #ifdef GRAY8 mov r20, r22 subi XL, -80 sbrc r16, 6 // Wenn Hintergrund an: Bits invertieren (eventuell unnötig, aber auf keinen Fall verkehrt) com r22 sbrs r18, 6 // Wenn nichts an: Bits löschen clr r22 sbrc r25, 6 // Wenn beides an: Bits setzen ser r22 st X,r22 subi XL, -80 sbrc r16, 5 // Wenn Hintergrund an: Bits invertieren (eventuell unnötig, aber auf keinen Fall verkehrt) com r20 sbrs r18, 5 // Wenn nichts an: Bits löschen clr r20 sbrc r25, 5 // Wenn beides an: Bits setzen ser r20 st X,r20 #else ori XL, 128 sbrc r16, 6 // Wenn Hintergrund an: Bits invertieren (eventuell unnötig, aber auf keinen Fall verkehrt) com r22 sbrs r18, 6 // Wenn nichts an: Bits löschen clr r22 sbrc r25, 6 // Wenn beides an: Bits setzen ser r22 st X,r22 #endif #endif dec r17 brne wchar // 2.Byte lesen inc XH // Zeilen Adresse ++ dec r21 brne wchar1 clr r1 exitchar: ret