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