;; Basic LED matrix fonts
;; vim: set ft=avr:
.cseg
;; Font definition
; Defines FONT_8x6 symbol
.include "font.def"
; Font to use
.set FONT_TABLE = FONT_8x6
.set FONT_START = FONT_8x6_START
.set FONT_END = FONT_8x6_END
.set FONT_COLS = FONT_8x6_COLS
.set FONT_ROWS = FONT_8x6_ROWS ; XXX: fixed to 8
;; Render the given ASCII char into the given buffer
; Input: r16 - ASCII char code
; Y - dest buf (Wx8 column data)
Font_Render:
; Test char index
; test under-range
ldi r17, FONT_START
cp r16, r17
brlt font_r_invalid
; test over-range
ldi r17, FONT_END
cp r17, r16
brlt font_r_invalid
; compute offset in chars (r16)
subi r16, FONT_START
; ok
rjmp font_r_render
font_r_invalid:
; use first sym
ldi r16, 0
cbi PORTD, PIND7
font_r_render:
; compute offset in bytes (r1:r0)
ldi r17, FONT_COLS
mul r16, r17
; font table start offset from words
ldi ZL, low(FONT_TABLE * 2)
ldi ZH, high(FONT_TABLE * 2)
; apply offset
add ZL, r0
adc ZH, r1
; Copy column pixel data
; count columns
ldi r16, FONT_COLS
font_r_cpy:
; copy via r17
lpm r17, Z+
st Y+, r17
dec r16
brne font_r_cpy
; Done
ret