equal
deleted
inserted
replaced
|
1 ;; Basic LED matrix fonts |
|
2 ;; vim: set ft=avr: |
|
3 |
|
4 .cseg |
|
5 |
|
6 ;; Font definition |
|
7 ; Defines FONT_8x6 symbol |
|
8 .include "font.def" |
|
9 |
|
10 ; Font to use |
|
11 .set FONT_TABLE = FONT_8x6 |
|
12 .set FONT_START = FONT_8x6_START |
|
13 .set FONT_END = FONT_8x6_END |
|
14 .set FONT_COLS = FONT_8x6_COLS |
|
15 .set FONT_ROWS = FONT_8x6_ROWS ; XXX: fixed to 8 |
|
16 |
|
17 ;; Render the given ASCII char into the given buffer |
|
18 ; Input: r16 - ASCII char code |
|
19 ; Y - dest buf (Wx8 column data) |
|
20 Font_Render: |
|
21 ; Test char index |
|
22 |
|
23 ; test under-range |
|
24 ldi r17, FONT_START |
|
25 cp r16, r17 |
|
26 brlt f_render_invalid |
|
27 |
|
28 ; test over-range |
|
29 ldi r17, FONT_END |
|
30 cp r17, r16 |
|
31 brlt f_render_invalid |
|
32 |
|
33 ; Locate font char |
|
34 ; compute offset in chars (r16) |
|
35 subi r16, FONT_START |
|
36 |
|
37 ; compute offset in bytes (r1:r0) |
|
38 ldi r17, FONT_COLS |
|
39 mul r16, r17 |
|
40 |
|
41 ; font table start offset from words |
|
42 ldi ZL, low(FONT_TABLE * 2) |
|
43 ldi ZH, high(FONT_TABLE * 2) |
|
44 |
|
45 ; apply offset |
|
46 add ZL, r0 |
|
47 adc ZH, r1 |
|
48 |
|
49 ; Copy column pixel data |
|
50 ; count columns |
|
51 ldi r16, FONT_COLS |
|
52 f_render_cpy: |
|
53 |
|
54 ; copy via r17 |
|
55 lpm r17, Z+ |
|
56 st Y+, r17 |
|
57 |
|
58 dec r16 |
|
59 brne f_render_cpy |
|
60 |
|
61 f_render_invalid: |
|
62 |
|
63 ; Done |
|
64 ret |
|
65 |