0
|
1 ;=============================================================================
|
|
2 ;
|
628
|
3 ; File aa_wordprocessor.asm combined next generation V3.03.7
|
0
|
4 ;
|
|
5 ; Anti-aliased word processor
|
|
6 ;
|
|
7 ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
|
|
8 ;=============================================================================
|
|
9 ; HISTORY
|
604
|
10 ; 2010-11-22 : [jDG] Creation
|
|
11 ; 2010-12-01 : [jDG] Adding 3bits anti-aliased fonts
|
0
|
12 ; 2010-12-30 : [jDG] Revised to put temp into ACCESSRAM0
|
|
13 ; 2012-08-12 : [mH] Moved font28 into bootloader section 0x1C000
|
|
14 ;
|
|
15 ; BUGS :
|
|
16 ; * If the three fonts are not in the same half of the PROM memory, TBLPTRU
|
582
|
17 ; will be badly set, and font48 or font90 will display gibberish...
|
0
|
18 ;=============================================================================
|
|
19 ;
|
|
20 ; MEMORY FOOTPRINT:
|
|
21 ;------------------
|
|
22 ;
|
582
|
23 ; wp_wordprocessor : 8 KB, including fonts
|
|
24 ; aa_wordprocessor : 0.5 KB code
|
|
25 ; + 3.5 KB aa_font28 (reduced to 99 chars)
|
|
26 ; + 1.6 KB aa_font48
|
|
27 ; + 2.2 KB aa_font90
|
|
28 ; = 7.9 KB including fonts
|
0
|
29 ;
|
|
30 ; Input registers:
|
582
|
31 ; buffer:26 String to print
|
623
|
32 ; win_font Font size (0=tiny, 1=small, 2=std, 3=medium, 4=large, 5=XL)
|
582
|
33 ; win_color1:2 16bits unpacked color
|
|
34 ; win_top, win_leftx2 Position on screen
|
|
35 ; win_inverse Inverse video mode
|
0
|
36 ;
|
|
37 ; Available general purpose registers:
|
623
|
38 ; PRODH, PRODL needed for array indexing
|
|
39 ; FSRx 12bits, used for indirect addressing
|
0
|
40 ;=============================================================================
|
|
41
|
275
|
42 #include "hwos.inc"
|
0
|
43 #include "tft.inc"
|
|
44
|
582
|
45 extern aa_font16_block
|
|
46 extern aa_font28_block
|
623
|
47 extern aa_font34_block
|
582
|
48 extern aa_font48_block
|
|
49 extern aa_font90_block
|
623
|
50 extern aa_font92_block
|
|
51
|
608
|
52 extern convert_for_display2
|
623
|
53
|
|
54
|
604
|
55 aa_word CODE
|
|
56
|
623
|
57 ;=============================================================================
|
|
58
|
0
|
59 ;------------------------------------------------------------------------------
|
|
60 ; Setup pointers for a char:
|
582
|
61 ; Inputs WREG = char to draw, win_font
|
623
|
62 ; Output aa_start, aa_end, win_height, AA_flags
|
582
|
63 ; Trashed PRODH, PRODL, TBLPTR, TABLAT
|
0
|
64 ;
|
|
65 aa_char_setup:
|
582
|
66 movwf PRODL ; save char into PROD for now
|
604
|
67 movf win_font,W ; get font number (updates Z flag)
|
623
|
68 bnz aa_char_1 ; requested tiny font? (bra of no)
|
0
|
69
|
623
|
70 ; 0: TINY font -------------------------------------------------------
|
582
|
71 ; Font TINY character folding...
|
0
|
72 aa_char_0:
|
623
|
73 movlw LOW aa_font16_block
|
582
|
74 movwf TBLPTRL
|
623
|
75 movlw HIGH aa_font16_block
|
582
|
76 movwf TBLPTRH
|
|
77 movlw UPPER aa_font16_block
|
|
78 movwf TBLPTRU
|
|
79 bra aa_char_99
|
0
|
80
|
623
|
81 ; 1: SMALL font ------------------------------------------------------
|
582
|
82 ; Font SMALL character folding...
|
|
83 aa_char_1:
|
604
|
84 decfsz WREG ; requested small font?
|
|
85 bra aa_char_2 ; NO
|
623
|
86 movlw LOW aa_font28_block
|
582
|
87 movwf TBLPTRL
|
623
|
88 movlw HIGH aa_font28_block
|
582
|
89 movwf TBLPTRH
|
|
90 movlw UPPER aa_font28_block
|
|
91 movwf TBLPTRU
|
|
92 bra aa_char_99
|
0
|
93
|
623
|
94 ; 2: STD font --------------------------------------------------------
|
|
95 ; Font STANDARD character folding...
|
582
|
96 aa_char_2:
|
604
|
97 decfsz WREG ; requested std font?
|
|
98 bra aa_char_3 ; NO
|
623
|
99 movlw LOW aa_font34_block
|
582
|
100 movwf TBLPTRL
|
623
|
101 movlw HIGH aa_font34_block
|
582
|
102 movwf TBLPTRH
|
623
|
103 movlw UPPER aa_font34_block
|
582
|
104 movwf TBLPTRU
|
|
105 bra aa_char_99
|
0
|
106
|
623
|
107 ; 3: MEDIUM font -----------------------------------------------------
|
0
|
108 aa_char_3:
|
604
|
109 decfsz WREG ; requested medium font?
|
|
110 bra aa_char_4 ; NO
|
623
|
111 movlw LOW aa_font48_block
|
582
|
112 movwf TBLPTRL
|
623
|
113 movlw HIGH aa_font48_block
|
582
|
114 movwf TBLPTRH
|
|
115 movlw UPPER aa_font48_block
|
|
116 movwf TBLPTRU
|
|
117 bra aa_char_99
|
0
|
118
|
623
|
119 ; 4: LARGE font ------------------------------------------------------
|
0
|
120 aa_char_4:
|
623
|
121 decfsz WREG ; requested large font?
|
|
122 bra aa_char_5 ; NO
|
|
123 movlw LOW aa_font90_block
|
582
|
124 movwf TBLPTRL
|
623
|
125 movlw HIGH aa_font90_block
|
582
|
126 movwf TBLPTRH
|
|
127 movlw UPPER aa_font90_block
|
|
128 movwf TBLPTRU
|
623
|
129 bra aa_char_99
|
|
130
|
|
131 ; 5: XTRA LARGE font -------------------------------------------------
|
|
132 aa_char_5:
|
|
133 movlw LOW aa_font92_block
|
|
134 movwf TBLPTRL
|
|
135 movlw HIGH aa_font92_block
|
|
136 movwf TBLPTRH
|
|
137 movlw UPPER aa_font92_block
|
|
138 movwf TBLPTRU
|
628
|
139
|
0
|
140
|
582
|
141 ; Execute font block -------------------------------------------------
|
|
142 aa_char_99:
|
623
|
143 ; This is safe if all fonts are in the same code segment
|
|
144 ; (and that segment does not span the 64K edge...)
|
582
|
145 movlw UPPER aa_font16_block
|
|
146 movwf TBLPTRU
|
|
147
|
|
148 ; Proceed to character substitutions
|
0
|
149 aa_char_30:
|
604
|
150 tblrd*+ ; read FROM char
|
|
151 movf TABLAT,W ; get it, and set Z,N
|
628
|
152 bz aa_char_32 ; break at end of translations
|
0
|
153
|
604
|
154 tblrd*+ ; read TO char
|
|
155 cpfseq PRODL ; FROM == current char ?
|
|
156 bra aa_char_30 ; different -> loop
|
582
|
157 movff TABLAT, PRODL ; make substitution
|
604
|
158 bra aa_char_30 ; loop
|
0
|
159
|
582
|
160 ; Make sure char is in the available range
|
|
161 aa_char_32:
|
604
|
162 tblrd*+ ; read first char
|
582
|
163 movf TABLAT,W ; get it
|
|
164 subwf PRODL,F ; (char - first) --> PRODL
|
604
|
165 tblrd*+ ; read nb chars
|
582
|
166 movf TABLAT,W ; nbchars --> WREG
|
604
|
167 tblrd*+ ; read default char
|
|
168 cpfslt PRODL ; char > WREG ?
|
582
|
169 movff TABLAT,PRODL ; replace PRODL
|
0
|
170
|
582
|
171 ; Decode font height and anti-aliasing mode
|
623
|
172 bcf aa_antialias ; default to no AA
|
604
|
173 tblrd*+ ; read font height + AA flag
|
582
|
174 movf TABLAT,W ; into WREG
|
604
|
175 bnn aa_char_34 ; high bit set ?
|
|
176 bsf aa_antialias ; YES - then the font is AA
|
0
|
177 aa_char_34:
|
604
|
178 andlw 0x7F ; keep just font height,
|
|
179 movwf win_height ; then save it (its a register)
|
0
|
180
|
582
|
181 ; Set PROM pointer to the char index
|
604
|
182 movf PRODL,W ; read back char
|
582
|
183 mullw 2 ; PROD = 2*(char - base), TBLPTR=idx
|
|
184 movf PRODL,W
|
604
|
185 addwf TBLPTRL,F ; add into TBLPTR (low byte)
|
582
|
186 movf PRODH,W
|
|
187 addwfc TBLPTRH,F ; and high byte
|
0
|
188
|
582
|
189 ; Read start and stop pointers
|
|
190 tblrd*+ ; aa_start = PROM16(*tblptr++)
|
604
|
191 movff TABLAT,aa_start+0 ; read low byte
|
582
|
192 tblrd*+
|
|
193 movff TABLAT,aa_start+1 ; and high byte
|
0
|
194
|
582
|
195 tblrd*+ ; aa_end = PROM16(*tblptr++)
|
604
|
196 movff TABLAT,aa_end+0 ; read low byte
|
582
|
197 tblrd*+
|
|
198 movff TABLAT,aa_end+1 ; and high byte
|
0
|
199
|
582
|
200 return
|
0
|
201
|
623
|
202
|
0
|
203 ;------------------------------------------------------------------------------
|
|
204 ; Character width
|
623
|
205 ; Input aa_start, aa_end, win_width, win_height, AA_flags
|
|
206 ; Output width added to win_width
|
|
207 ; Trashed aa_bitlen, TBLPTR, TABLAT
|
0
|
208 ;
|
|
209 aa_char_width:
|
582
|
210 movff aa_start+0, TBLPTRL ; TBLPTR = aa_start
|
|
211 movff aa_start+1, TBLPTRH
|
|
212 clrf aa_bitlen ; clear reminders...
|
0
|
213
|
604
|
214 ; Read bitmap byte, and decode length:
|
0
|
215 aa_char_width_1:
|
582
|
216
|
|
217 ifdef AA_BYTE_SWAP
|
604
|
218 btg TBLPTRL ; toggle low ptr bit
|
0
|
219 tblrd*
|
604
|
220 movf TABLAT,W ; store to WREG
|
|
221 btg TBLPTRL ; get is back
|
582
|
222 tblrd*+ ; then increment (but trash TABLAT)
|
604
|
223 movwf TABLAT ; then restore copy to TABLAT
|
582
|
224 else
|
604
|
225 tblrd*+ ; normal read...
|
|
226 movf TABLAT,W ; store copy to WREG
|
582
|
227 endif
|
|
228
|
604
|
229 btfss aa_antialias ; anti-aliased font ?
|
|
230 bra aa_char_width_10 ; NO - always 7 bit count
|
0
|
231
|
604
|
232 bn aa_char_width_10 ; none-white pixels?
|
|
233 andlw 0x1F ; YES - 5 bit count
|
0
|
234 aa_char_width_10:
|
604
|
235 andlw 0x7F ; NO - 7 bit count
|
582
|
236 incf WREG ; WREG = repetition count
|
604
|
237 addwf aa_bitlen,F ; add remaining pixels from last code
|
582
|
238
|
604
|
239 movf win_height,W ; WREG -= height
|
582
|
240 negf WREG
|
0
|
241
|
582
|
242 ; This is a hand-made division by successive subtraction of height
|
0
|
243 aa_char_width_2:
|
604
|
244 addwf aa_bitlen,F ; try to subtract win_height
|
|
245 bn aa_char_width_3 ; if neg it was a bad idea...
|
0
|
246
|
604
|
247 infsnz win_width+0,F ; succeeded: do a 16 bit increment
|
582
|
248 incf win_width+1,F ; on the win_width counter
|
|
249 bra aa_char_width_2 ; and loop
|
0
|
250
|
|
251 aa_char_width_3:
|
582
|
252 negf WREG ; WREG = +height
|
604
|
253 addwf aa_bitlen,F ; restore true reminder
|
0
|
254
|
582
|
255 ; Are we done ?
|
604
|
256 movf TBLPTRL,W ; compare TBLPTR to aa_end
|
582
|
257 cpfseq aa_end+0
|
604
|
258 bra aa_char_width_1 ; loop if LOW is different
|
582
|
259 movf TBLPTRH,W
|
604
|
260 cpfseq aa_end+1 ; loop to if HIGH is different
|
582
|
261 bra aa_char_width_1
|
|
262 return
|
0
|
263
|
623
|
264
|
0
|
265 ;------------------------------------------------------------------------------
|
|
266 ; String width
|
623
|
267 ; Input buffer (SHOULD BE NULL TERMINATED)
|
582
|
268 ; Output win_width, win_height
|
623
|
269 ; Trashed PROD, TBLPTR, FSR2, aa_bitlen, aa_start, aa_end, AA_flags
|
0
|
270 ;
|
|
271 aa_string_width:
|
582
|
272 lfsr FSR2, buffer ; FSR2 pointer to start of string
|
604
|
273 clrf win_width+0 ; clear width sum
|
582
|
274 clrf win_width+1 ; (16 bit counter)
|
0
|
275
|
|
276 aa_string_width_1:
|
582
|
277 movf POSTINC2,W ; WREG = *FSR2++
|
604
|
278 bz aa_string_width99 ; exit if null byte encountered
|
0
|
279
|
582
|
280 rcall aa_char_setup ; setup aa_start / aa_end
|
|
281 rcall aa_char_width ; sum-up width into win_width
|
|
282 bra aa_string_width_1 ; and loop
|
0
|
283
|
|
284 aa_string_width99:
|
582
|
285 return
|
0
|
286
|
623
|
287
|
0
|
288 ;------------------------------------------------------------------------------
|
623
|
289 ; Decode a compressed char
|
|
290 ; Input aa_start, aa_end, win_height, win_invert, win_color1, win_color2
|
582
|
291 ; Output none
|
623
|
292 ; Trashed TBLPTR, TABLAT, PROD, aa_bitlen, AA_flags, aa_colorDir:2
|
0
|
293 ;
|
|
294 aa_decode_char:
|
582
|
295 movff aa_start+0, TBLPTRL ; TBLPTR = aa_start
|
|
296 movff aa_start+1, TBLPTRH
|
0
|
297
|
582
|
298 ; Read bitmap byte, and decode color & length
|
0
|
299 aa_decode_1:
|
582
|
300
|
|
301 ifdef AA_BYTE_SWAP
|
604
|
302 btg TBLPTRL ; toggle low ptr bit
|
0
|
303 tblrd*
|
604
|
304 movf TABLAT,W ; store to WREG
|
|
305 btg TBLPTRL ; get is back
|
582
|
306 tblrd*+ ; then increment (but trash TABLAT)
|
604
|
307 movwf TABLAT ; then restore copy to TABLAT
|
582
|
308 else
|
604
|
309 tblrd*+ ; normal read...
|
|
310 movf TABLAT,W ; store copy to WREG
|
582
|
311 endif
|
0
|
312
|
604
|
313 btfss aa_antialias ; anti-aliased font?
|
|
314 bra aa_decode_10 ; NO - always 7 bit count
|
|
315 bn aa_decode_10 ; none-white pixels?
|
|
316 andlw 0x1F ; Yes - 5 bit count
|
582
|
317 aa_decode_10:
|
604
|
318 andlw 0x7F ; NO - 7 bit count
|
582
|
319 incf WREG
|
|
320 movwf aa_bitlen ; repetition count --> aa_bitlen
|
0
|
321
|
582
|
322 ;---- COLOR DECODING -------------------------------------------------
|
|
323 ;
|
|
324 ; Code Normal Inverse
|
604
|
325 ; 1xx 0% 100% : Managed by aa_decode_13
|
582
|
326 ; 011 25% 75%
|
|
327 ; 010 50% 50%
|
|
328 ; 001 75% 25%
|
604
|
329 ; 000 100% 0% : Managed by aa_decode_13, too
|
582
|
330 ;
|
604
|
331 movf TABLAT,W ; get back code
|
|
332 btfss aa_antialias ; anti-aliased font?
|
|
333 bra aa_decode_13 ; NO - 1 bit case
|
0
|
334
|
582
|
335 ; Asymmetry test: 1xx code is another case for 1bit color.
|
|
336 ; This have to be done before inverse video, because
|
604
|
337 ; of the asymmetric processing!
|
|
338 bn aa_decode_13 ; decode as none-aa
|
0
|
339
|
582
|
340 ; Manage 000 special case too:
|
623
|
341 andlw 0xE0 ; select color bits, is it a 000 ?
|
|
342 bz aa_decode_13 ; YES
|
582
|
343
|
|
344 ; Apply reverse video, in a reversed way
|
604
|
345 btfss win_invert ; inverse video mode?
|
|
346 sublw 0x80 ; NO
|
0
|
347
|
623
|
348 ; Extract color quarter and color half information
|
|
349 bsf aa_antialias ; set AA mode
|
|
350 bcf aa_color_quarter ; default to no color quarter
|
|
351 btfsc WREG,5 ; color quarter encoded?
|
|
352 bsf aa_color_quarter ; YES - set flag
|
|
353 bcf aa_color_half ; default to no color half
|
|
354 btfsc WREG,6 ; color half encoded?
|
|
355 bsf aa_color_half ; YES - set flag
|
0
|
356
|
582
|
357 ;---- 2 bit x RGB(16bits) computation --------------------------------
|
604
|
358 clrf PRODL ; we will accumulate result here...
|
582
|
359 clrf PRODH
|
0
|
360
|
582
|
361 ; Take color div 2 into aa_temp. Max red = 15/31
|
604
|
362 rrcf win_color1,W ; xRRRRxGG
|
582
|
363 andlw b'01111011' ; 0RRRR0GG (don't change C)
|
|
364 movwf aa_temp+0
|
604
|
365 rrcf win_color2,W ; GGGxBBBB
|
582
|
366 andlw b'11101111' ; GGG0BBBB
|
|
367 movwf aa_temp+1
|
0
|
368
|
582
|
369 btfss aa_color_half
|
|
370 bra aa_decode_12
|
0
|
371
|
604
|
372 movff aa_temp+0,PRODH ; add color/2 if bit set
|
582
|
373 movff aa_temp+1,PRODL ; TFT is big endian, so swap here
|
0
|
374 aa_decode_12:
|
623
|
375 btfss aa_color_quarter
|
582
|
376 bra aa_decode_3
|
0
|
377
|
582
|
378 ; Divide it once again by 2. Max red = 7/31.
|
|
379 rrcf aa_temp+0,W ; xxRRRxxG
|
|
380 andlw b'00111001' ; 00RRR00G (don't change C)
|
|
381 movwf aa_temp+0
|
|
382 rrcf aa_temp+1,W ; GGGxxBBB
|
|
383 andlw b'11100111' ; GGG00BBB
|
|
384 movwf aa_temp+1
|
0
|
385
|
604
|
386 movf aa_temp+1,W ; add color/4
|
582
|
387 addwf PRODL,F ; NOTE: 7/31+15/31=22/31,
|
|
388 movf aa_temp+0,W ; hence components won't overlap
|
604
|
389 addwfc PRODH,F ; in right order, to propagate carry
|
0
|
390
|
623
|
391 aa_decode_12b:
|
|
392 btfss screen_type2 ; display 2?
|
|
393 bra aa_decode_3 ; NO - done
|
608
|
394
|
623
|
395 call convert_for_display2 ; convert 16 bit RGB b'RRRRRGGG GGGBBBBB' into 24 bit RGB b'RRRRRR00 GGGGGG00 BBBBBB00'
|
608
|
396
|
623
|
397 bra aa_decode_3 ; done
|
0
|
398
|
623
|
399 ; ---- Simple BLACK and WHITE cases ------------------------------
|
|
400 aa_decode_13: ; got a 1xx or a 000 code...
|
|
401 btfsc win_invert ; inverse video mode ?
|
|
402 xorlw 0x80 ; YES - invert levels
|
|
403 bn aa_decode_2 ; then test high bit
|
0
|
404
|
623
|
405 ; WHITE pixel (i.e. full color)
|
|
406 movff win_color1,PRODH ; current draw color
|
|
407 movff win_color2,PRODL ; remark: DISPLAY is big endian
|
|
408 bra aa_decode_12b
|
0
|
409
|
|
410 aa_decode_2:
|
623
|
411 clrf PRODH ; BLACK pixel
|
|
412 clrf PRODL
|
|
413 clrf win_color5
|
|
414 clrf win_color4
|
|
415 clrf win_color3
|
0
|
416
|
|
417 aa_decode_3:
|
623
|
418 ;---- PIXEL WRITE LOOP -----------------------------------------------
|
|
419 bsf tft_rs ; Data!
|
608
|
420
|
623
|
421 btfsc screen_type2 ; display 2 ?
|
|
422 bra aa_decode_3_display2 ; YES
|
628
|
423 btfsc screen_type3 ; display 3 ?
|
|
424 bra aa_decode_3_display3 ; YES
|
582
|
425
|
623
|
426 movff PRODH,PORTA ; move high byte to PORTA
|
|
427 movff PRODL,PORTH ; move low byte to PORTH
|
608
|
428 aa_decode_3_display0and1:
|
623
|
429 bcf tft_nwr
|
|
430 bsf tft_nwr ; tick
|
582
|
431 decf aa_bitlen,F
|
623
|
432 bnz aa_decode_3_display0and1
|
|
433 bra aa_decode_3_done
|
0
|
434
|
608
|
435 aa_decode_3_display2:
|
623
|
436 movff win_color5,PORTH ; move high byte to PORTH (DISPLAY is big endian)
|
|
437 bcf tft_nwr
|
|
438 bsf tft_nwr ; tick
|
|
439 movff win_color4,PORTH ; move low byte to PORTH
|
|
440 bcf tft_nwr
|
|
441 bsf tft_nwr ; tick
|
|
442 movff win_color3,PORTH ; move low(est) byte to PORTH
|
|
443 bcf tft_nwr
|
|
444 bsf tft_nwr ; tick
|
608
|
445 decf aa_bitlen,F
|
623
|
446 bnz aa_decode_3_display2
|
628
|
447 bra aa_decode_3_done
|
|
448
|
|
449 aa_decode_3_display3:
|
|
450 movff PRODH,PORTH ; move high byte to PORTH (DISPLAY is big endian)
|
|
451 bcf tft_nwr
|
|
452 bsf tft_nwr ; tick
|
|
453 movff PRODL,PORTH ; move low byte to PORTH
|
|
454 bcf tft_nwr
|
|
455 bsf tft_nwr ; tick
|
|
456 decf aa_bitlen,F
|
|
457 bnz aa_decode_3_display3
|
623
|
458
|
608
|
459 aa_decode_3_done:
|
623
|
460 ;---- BYTE-CODE LOOP -------------------------------------------------
|
|
461 ; are we done ?
|
|
462 movf TBLPTRL,W ; compare TBLPTR with aa_end
|
|
463 cpfseq aa_end+0
|
|
464 bra aa_decode_1 ; loop if LOW is different
|
|
465 movf TBLPTRH,W
|
|
466 cpfseq aa_end+1 ; loop to if HIGH is different
|
|
467 bra aa_decode_1
|
|
468 return
|
|
469
|
0
|
470
|
|
471 ;------------------------------------------------------------------------------
|
|
472 ; Setup pointers for a char:
|
623
|
473 ; Inputs : buffer : string to print (NULL TERMINATED)
|
628
|
474 ; Output : TFT commands on PORTH (Upper) and PORTA (lower) + clocks
|
623
|
475 ;
|
604
|
476 global aa_wordprocessor ; callable from C-code
|
0
|
477 aa_wordprocessor:
|
604
|
478 rcall aa_string_width ; set win_height, compute win_width:2
|
|
479 call TFT_box_write ; use that for the box
|
0
|
480
|
582
|
481 ; Restart the loop for each char to print
|
623
|
482 lfsr FSR2, buffer ; FSR2 points to the start of the string
|
0
|
483
|
582
|
484 ; DATA block command
|
604
|
485 Index_out 0x22 ; index_out is a macro defined in tft.inc
|
0
|
486
|
|
487 aa_wordprocessor_1:
|
623
|
488 movf POSTINC2,W ; WREG = *FSR2++
|
604
|
489 bz aa_wordprocessor_99 ; exit if null byte encountered
|
0
|
490
|
582
|
491 rcall aa_char_setup ; setup aa_start / aa_end
|
|
492 rcall aa_decode_char ; write pixels to screen
|
|
493 bra aa_wordprocessor_1 ; and loop
|
0
|
494
|
|
495 aa_wordprocessor_99:
|
582
|
496 ; END of bloc command
|
|
497 Index_out 0x00
|
|
498 return
|
0
|
499
|
582
|
500 END
|