Mercurial > public > hwos_code
annotate src/tft.asm @ 631:185ba2f91f59
3.09 beta 1 release
author | heinrichsweikamp |
---|---|
date | Fri, 28 Feb 2020 15:45:07 +0100 |
parents | cd58f7fc86db |
children | 4050675965ea |
rev | line source |
---|---|
0 | 1 ;============================================================================= |
2 ; | |
631 | 3 ; File tft.asm combined next generation V3.08.8 |
0 | 4 ; |
623 | 5 ; low-level Display Outputs |
0 | 6 ; |
7 ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. | |
8 ;============================================================================= | |
9 ; HISTORY | |
10 ; 2011-05-24 : [jDG] Cleanups from initial Matthias code. | |
11 | |
275 | 12 #include "hwos.inc" |
0 | 13 #include "wait.inc" |
14 #include "varargs.inc" | |
15 #include "external_flash.inc" | |
16 #include "tft_outputs.inc" | |
17 #include "eeprom_rs232.inc" | |
18 | |
19 ;============================================================================= | |
20 ; Basic bit-level macros | |
21 | |
582 | 22 RD_H macro |
23 bsf tft_rd,0 | |
24 endm | |
0 | 25 |
582 | 26 RD_L macro |
27 bcf tft_rd,0 | |
28 endm | |
0 | 29 |
582 | 30 RS_H macro |
31 bsf tft_rs,0 | |
32 endm | |
0 | 33 |
582 | 34 RS_L macro |
35 bcf tft_rs,0 | |
36 endm | |
0 | 37 |
582 | 38 NCS_H macro |
39 bsf tft_cs,0 | |
40 endm | |
0 | 41 |
582 | 42 NCS_L macro |
43 bcf tft_cs,0 | |
44 endm | |
0 | 45 |
582 | 46 WR_H macro |
47 bsf tft_nwr,0 | |
48 endm | |
0 | 49 |
582 | 50 WR_L macro |
51 bcf tft_nwr,0 | |
52 endm | |
0 | 53 |
54 ;============================================================================= | |
582 | 55 ; Byte-level macros |
56 | |
0 | 57 Index_out macro low_b |
58 movlw low_b | |
59 rcall TFT_CmdWrite | |
60 endm | |
61 | |
62 Parameter_out macro high_b, low_b | |
63 movlw high_b | |
604 | 64 movwf PORTA ; upper |
0 | 65 movlw low_b |
66 rcall TFT_DataWrite | |
67 endm | |
68 | |
69 | |
604 | 70 tft CODE |
582 | 71 |
151 | 72 ;;============================================================================= |
582 | 73 |
74 global TFT_ClearScreen | |
0 | 75 TFT_ClearScreen: |
628 | 76 btfsc screen_type2 ; screen type 2? |
623 | 77 bra TFT_ClearScreen_display2; YES |
628 | 78 btfsc screen_type3 ; screen type 3? |
79 bra TFT_ClearScreen_display3; YES | |
623 | 80 |
604 | 81 Index_out 0x50 ; window horizontal start address |
582 | 82 Parameter_out 0x00, 0x00 ; 0-239 |
604 | 83 Index_out 0x51 ; window horizontal end address |
582 | 84 Parameter_out 0x00, 0xEF ; 0-239 |
604 | 85 Index_out 0x52 ; window vertical start address |
582 | 86 Parameter_out 0x00, 0x00 ; 0-319 |
604 | 87 Index_out 0x53 ; window vertical end address |
582 | 88 Parameter_out 0x01, 0x3F ; 0-319 |
604 | 89 Index_out 0x20 ; frame memory horizontal address |
582 | 90 Parameter_out 0x00, 0x00 ; 0-239 |
604 | 91 Index_out 0x21 ; frame memory vertical address |
582 | 92 Parameter_out 0x01, 0x3F ; 0-319 |
0 | 93 |
604 | 94 Index_out 0x22 ; frame memory data write start |
0 | 95 |
604 | 96 RD_H ; not read |
97 RS_H ; data | |
98 NCS_L ; not CS | |
99 clrf PORTH ; data lower | |
0 | 100 |
101 movlw d'10' | |
102 movwf tft_temp3 | |
103 TFT_ClearScreen2: | |
104 movlw d'30' | |
105 movwf tft_temp2 | |
106 TFT_ClearScreen3: | |
604 | 107 clrf tft_temp1 ; 30*10*256=76800 pixels -> clear complete 240*320 |
582 | 108 bcf INTCON,GIE |
0 | 109 TFT_ClearScreen4: |
110 WR_L | |
604 | 111 WR_H ; tick |
0 | 112 decfsz tft_temp1,F |
113 bra TFT_ClearScreen4 | |
582 | 114 bsf INTCON,GIE |
0 | 115 decfsz tft_temp2,F |
116 bra TFT_ClearScreen3 | |
117 decfsz tft_temp3,F | |
118 bra TFT_ClearScreen2 | |
582 | 119 |
120 movlw 0x00 ; NOP, to stop window mode | |
604 | 121 bra TFT_CmdWrite ; and return |
582 | 122 |
623 | 123 TFT_ClearScreen_display2: |
124 movlw 0x02 ; column address start | |
608 | 125 rcall TFT_CmdWrite |
126 movlw 0x00 | |
127 rcall TFT_DataWrite | |
128 movlw 0x03 | |
129 rcall TFT_CmdWrite | |
130 movlw 0x00 | |
131 rcall TFT_DataWrite | |
132 | |
623 | 133 movlw 0x04 ; column address end |
608 | 134 rcall TFT_CmdWrite |
135 movlw 0x00 | |
136 rcall TFT_DataWrite | |
137 movlw 0x05 | |
138 rcall TFT_CmdWrite | |
139 movlw 0xEF | |
140 rcall TFT_DataWrite | |
141 | |
623 | 142 movlw 0x06 ; row address start |
608 | 143 rcall TFT_CmdWrite |
144 movlw 0x00 | |
145 rcall TFT_DataWrite | |
146 movlw 0x07 | |
147 rcall TFT_CmdWrite | |
148 movlw 0x00 | |
149 rcall TFT_DataWrite | |
150 | |
623 | 151 movlw 0x08 ; row address end |
608 | 152 rcall TFT_CmdWrite |
153 movlw 0x01 | |
154 rcall TFT_DataWrite | |
155 movlw 0x09 | |
156 rcall TFT_CmdWrite | |
157 movlw 0x3F | |
158 rcall TFT_DataWrite | |
159 | |
623 | 160 movlw 0x22 ; start writing data to GRAM |
608 | 161 rcall TFT_CmdWrite |
162 | |
628 | 163 movlw .160 ; 160 x 240 x 6 = 230400 ticks |
164 TFT_ClearScreen_display2_loop0: | |
623 | 165 bsf tft_rs ; data! |
608 | 166 movwf PRODH |
167 clrf PORTH | |
623 | 168 TFT_ClearScreen_display2_loop1: |
608 | 169 movlw .240 |
170 movwf PRODL | |
623 | 171 TFT_ClearScreen_display2_loop2: |
608 | 172 bcf tft_nwr |
623 | 173 bsf tft_nwr ; upper |
608 | 174 bcf tft_nwr |
623 | 175 bsf tft_nwr ; high |
608 | 176 bcf tft_nwr |
623 | 177 bsf tft_nwr ; lower |
608 | 178 bcf tft_nwr |
623 | 179 bsf tft_nwr ; upper |
608 | 180 bcf tft_nwr |
623 | 181 bsf tft_nwr ; high |
608 | 182 bcf tft_nwr |
623 | 183 bsf tft_nwr ; lower |
608 | 184 decfsz PRODL,F |
623 | 185 bra TFT_ClearScreen_display2_loop2 |
608 | 186 decfsz PRODH,F |
623 | 187 bra TFT_ClearScreen_display2_loop1 |
188 return | |
0 | 189 |
628 | 190 TFT_ClearScreen_display3: |
191 movlw 0x35 ; vertical start address HIGH:LOW | |
192 rcall TFT_CmdWrite | |
631 | 193 mullw 0 |
628 | 194 rcall TFT_DataWrite_PROD |
195 | |
196 movlw 0x36 ; vertical end address HIGH:LOW | |
197 rcall TFT_CmdWrite | |
198 movlw 0x01 | |
199 rcall TFT_DataWrite | |
200 movlw 0x3F | |
201 rcall TFT_DataWrite | |
202 | |
203 movlw 0x37 ; horizontal address START:END | |
204 rcall TFT_CmdWrite | |
205 movlw 0x00 | |
206 rcall TFT_DataWrite | |
207 movlw 0xEF | |
208 rcall TFT_DataWrite | |
209 | |
210 movlw 0x20 ; start address horizontal (.0 - .239) | |
211 rcall TFT_CmdWrite | |
212 rcall TFT_DataWrite_PROD | |
213 | |
214 movlw 0x21 ; start address vertical (.0 - .319) | |
215 rcall TFT_CmdWrite | |
216 rcall TFT_DataWrite_PROD | |
217 | |
218 movlw 0x22 ; start writing data to GRAM | |
219 rcall TFT_CmdWrite | |
220 | |
221 movlw .107 ; 107 x 240 x 6 = 154080 ticks (153600 would be enough) | |
222 bra TFT_ClearScreen_display2_loop0 | |
223 | |
224 | |
0 | 225 ;============================================================================= |
582 | 226 |
227 global TFT_DisplayOff | |
0 | 228 TFT_DisplayOff: |
628 | 229 bcf lightsen_power ; power-down light sensor |
631 | 230 btfsc screen_type3 ; screen type 3 ? |
231 bra TFT_DisplayOff_display3 ; YES - screen needs special power-down sequence | |
232 clrf CCP1CON ; NO - stop PWM | |
233 bcf PORTC,2 ; - pull PWM out to GND | |
0 | 234 clrf PORTA |
582 | 235 clrf PORTH |
623 | 236 RD_L ; LOW |
237 RS_L ; LOW | |
238 bcf tft_nwr | |
239 bcf tft_cs | |
240 bcf tft_nreset | |
241 bsf tft_power ; inverted... | |
628 | 242 return |
243 | |
244 TFT_DisplayOff_display3: | |
245 movlw 0x05 | |
246 rcall TFT_CmdWrite | |
247 movlw 0x00 | |
248 rcall TFT_DataWrite | |
249 movlw 0x00 | |
250 rcall TFT_DataWrite | |
251 WAITMS d'32' | |
252 clrf CCP1CON ; stop PWM | |
253 bcf PORTC,2 ; pull PWM out to GND | |
254 WAITMS d'32' | |
255 movlw 0x10 | |
256 rcall TFT_CmdWrite | |
257 movlw 0x00 | |
258 rcall TFT_DataWrite | |
259 movlw 0x01 | |
260 rcall TFT_DataWrite | |
261 WAITMS d'100' | |
262 clrf PORTH | |
263 bcf tft_nwr | |
264 bcf tft_cs | |
265 bcf tft_nreset | |
266 WAITMS d'10' | |
267 bsf tft_power ; inverted... | |
0 | 268 return |
269 | |
270 ; ----------------------------- | |
271 ; TFT boot | |
272 ; ----------------------------- | |
582 | 273 |
274 global TFT_boot | |
0 | 275 TFT_boot: |
623 | 276 ; switch off backlight |
277 clrf CCP1CON ; stop PWM | |
278 bcf PORTC,2 ; pull PWM out to GND | |
279 | |
0 | 280 clrf PORTA |
281 clrf PORTH | |
628 | 282 |
0 | 283 RD_L ; LOW |
284 nop | |
628 | 285 WR_L |
286 nop | |
287 NCS_L ; Not CS | |
0 | 288 nop |
289 bcf tft_nreset | |
290 WAITMS d'1' | |
291 bcf tft_power ; inverted... | |
292 WAITMS d'1' | |
293 RD_H ; Keep high | |
628 | 294 nop |
0 | 295 WAITMS d'2' |
296 bsf tft_nreset | |
461 | 297 WAITMS d'5' |
298 bcf tft_nreset | |
299 WAITMS d'5' | |
300 bsf tft_nreset | |
0 | 301 WAITMS d'150' |
628 | 302 WR_H ; release bus |
604 | 303 bsf lightsen_power ; supply power to light sensor |
0 | 304 |
628 | 305 btfsc screen_type3 ; display type 3 ? |
306 bra TFT_boot_screen3 ; YES | |
307 | |
582 | 308 ; Data Transfer Synchronization |
0 | 309 Parameter_out 0x00, 0x00 |
310 Parameter_out 0x00, 0x00 | |
582 | 311 |
623 | 312 btfsc screen_type2 ; display type 2 ? |
313 bra TFT_boot_screen2 ; YES | |
608 | 314 |
623 | 315 ; Get screen type from Bootloader-Info |
582 | 316 movlw 0x7B |
317 movwf TBLPTRL | |
318 movlw 0xF7 | |
319 movwf TBLPTRH | |
320 movlw 0x01 | |
321 movwf TBLPTRU | |
623 | 322 TBLRD*+ ; reads 0x6E for cR and USB OSTC3, 0x00 for BLE (2 and 3), and 0x02 for display 1 OSTC |
323 movlw 0x02 ; coding for display 1 | |
324 cpfseq TABLAT ; display 1 ? | |
325 bra TFT_boot_0 ; NO - display 0 | |
360 | 326 |
327 TFT_boot_1: | |
582 | 328 ; Init through config table... |
329 movlw 0x74 | |
330 movwf TBLPTRL | |
331 movlw 0xF7 | |
332 movwf TBLPTRH | |
333 movlw 0x01 | |
334 movwf TBLPTRU | |
628 | 335 bsf screen_type1 |
582 | 336 bra TFT_boot_com |
360 | 337 |
441
360acdcda0d7
+BUGFIX: Compatibility with "hwOS Config" fixed
heinrichsweikamp
parents:
436
diff
changeset
|
338 TFT_boot_0: |
582 | 339 ; Init through config table... |
340 movlw LOW display0_config_table | |
341 movwf TBLPTRL | |
342 movlw HIGH display0_config_table | |
343 movwf TBLPTRH | |
344 movlw UPPER display0_config_table | |
345 movwf TBLPTRU | |
628 | 346 bcf screen_type1 |
582 | 347 |
360 | 348 TFT_boot_com: |
582 | 349 rcall display0_init_loop |
0 | 350 |
582 | 351 Index_out 0x03 |
352 btfsc flip_screen ; 180° rotation ? | |
604 | 353 bra TFT_boot2 ; YES |
360 | 354 |
628 | 355 btfss screen_type1 ; display1? |
604 | 356 bra TFT_boot1a ; NO |
582 | 357 Parameter_out 0x10, 0x00 ; display1 |
358 bra TFT_boot3 | |
360 | 359 TFT_boot1a: |
582 | 360 Parameter_out 0x50, 0x20 ; display0 |
361 bra TFT_boot3 | |
152
19ad15f04f60
BUGFIX: Clear Setpoint-Fallback warning when in bailout
heinrichsweikamp
parents:
151
diff
changeset
|
362 TFT_boot2: |
628 | 363 btfss screen_type1 ; display1? |
604 | 364 bra TFT_boot2a ; NO |
582 | 365 Parameter_out 0x10, 0x30 ; display1 |
366 bra TFT_boot3 | |
360 | 367 TFT_boot2a: |
582 | 368 Parameter_out 0x50, 0x10 ; display0 |
152
19ad15f04f60
BUGFIX: Clear Setpoint-Fallback warning when in bailout
heinrichsweikamp
parents:
151
diff
changeset
|
369 TFT_boot3: |
0 | 370 Index_out 0x22 |
225
31088352ee32
BUGFIX: Show dives with >999mins divetime correctly
heinrichsweikamp
parents:
152
diff
changeset
|
371 rcall TFT_ClearScreen |
0 | 372 Index_out 0x07 |
312 | 373 Parameter_out 0x01, 0x33 |
0 | 374 return |
375 | |
376 display0_config_table: | |
582 | 377 ; Reg, Dat0, Dat1 or 0xFF,0x00,0x00 for end |
378 db 0xA4,0x00,0x01,0xFF,.002,0x00 | |
379 db 0x09,0x00,0x01,0x92,0x04,0x00 | |
380 db 0x93,0x04,0x02,0x94,0x00,0x02 | |
381 db 0x07,0x00,0x00,0x10,0x04,0x30 | |
382 db 0x11,0x02,0x37,0x12,0x11,0x8D | |
383 db 0x13,0x11,0x00,0x01,0x01,0x00 | |
384 db 0x02,0x02,0x00,0x03,0x50,0x20 | |
385 db 0x0A,0x00,0x08,0x0D,0x00,0x00 | |
386 db 0x0E,0x00,0x30,0xFF,.151,0x00 | |
387 db 0x12,0x11,0xBD,0x20,0x00,0x00 | |
388 db 0x21,0x00,0x00,0x30,0x06,0x02 | |
389 db 0x31,0x56,0x0D,0x32,0x05,0x07 | |
390 db 0x33,0x06,0x09,0x34,0x00,0x00 | |
391 db 0x35,0x09,0x06,0x36,0x57,0x05 | |
392 db 0x37,0x0D,0x06,0x38,0x02,0x06 | |
393 db 0x39,0x00,0x00,0xFF,0x00,0x00 | |
0 | 394 |
395 display0_init_loop: | |
582 | 396 TBLRD*+ |
397 movlw 0xFF | |
398 cpfseq TABLAT | |
623 | 399 bra display0_config_write ; write configuration data pair to display |
582 | 400 ; Delay ms or quit (return) |
401 TBLRD*+ | |
623 | 402 tstfsz TABLAT ; end of configuration data? |
604 | 403 bra $+4 ; NO |
404 return ; YES - done | |
582 | 405 movf TABLAT,W |
604 | 406 call WAITMSX ; wait WREG milliseconds |
407 TBLRD*+ ; dummy read (Third byte of delay command) | |
408 bra display0_init_loop ; loop | |
0 | 409 |
604 | 410 display0_config_write: ; with command in WREG |
582 | 411 movf TABLAT,W |
604 | 412 rcall TFT_CmdWrite ; write command |
413 TBLRD*+ ; get config0 | |
582 | 414 movff TABLAT,PORTA |
604 | 415 TBLRD*+ ; get config1 |
582 | 416 movf TABLAT,W |
623 | 417 rcall TFT_DataWrite ; write configuration |
604 | 418 bra display0_init_loop ; loop |
0 | 419 |
623 | 420 |
608 | 421 TFT_boot_screen2: |
623 | 422 rcall display1_init ; initialization sequence |
608 | 423 |
623 | 424 btfss flip_screen ; 180° rotation? |
425 bra TFT_ClearScreen ; NO - done: clear screen and return | |
426 ; flip the GRAM | |
427 Index_out 0x16 | |
428 movlw 0x48 ; flip image in the GRAM (very elegant with display 2...) | |
429 rcall TFT_DataWrite ; Write configuration | |
430 bra TFT_ClearScreen ; clear screen and return | |
608 | 431 |
628 | 432 TFT_boot_screen3: |
433 rcall display1_init ; init sequence | |
434 rcall TFT_ClearScreen | |
435 setf CCPR1L ; duty cycle, 255 is required for OLED | |
436 ; Set brightness | |
437 movff opt_brightness,PRODL ; =0: Eco, =1:Medium, =2:Full | |
438 incf PRODL,F ; +1 | |
439 dcfsnz PRODL,F | |
440 rcall TFT_display3_low | |
441 dcfsnz PRODL,F | |
442 rcall TFT_display3_med | |
443 dcfsnz PRODL,F | |
444 rcall TFT_display3_high | |
445 ; ToDo: Flip.... | |
446 return | |
447 | |
608 | 448 display1_init: |
623 | 449 movlw LOW (0x1F8BC ) |
450 movwf TBLPTRL | |
451 movlw HIGH (0x1F8BC & 0xFFFF) | |
452 movwf TBLPTRH | |
453 movlw UPPER (0x1F8BC ) | |
454 movwf TBLPTRU | |
608 | 455 display1_init_loop: |
623 | 456 TBLRD*+ |
457 movlw 0xFF ; coding for end of configuration or wait step | |
458 cpfseq TABLAT | |
459 bra display1_config_write ; write configuration pair to display | |
460 ; Delay ms or quit (return) | |
461 TBLRD*+ | |
462 tstfsz TABLAT ; end of configuration? | |
463 bra $+4 ; NO - skip return | |
464 return ; YES - done | |
465 movf TABLAT,W ; read waiting time | |
466 call WAITMSX ; wait WREG milliseconds | |
467 bra display1_init_loop ; loop | |
468 display1_config_write: ; with command in WREG | |
469 movf TABLAT,W | |
470 rcall TFT_CmdWrite ; write command | |
471 TBLRD*+ ; get configuration | |
472 movf TABLAT,W | |
473 rcall TFT_DataWrite ; write configuration | |
628 | 474 btfss screen_type3 ; screen 3 ? |
475 bra display1_init_loop ; NO - loop | |
476 ; Screen 3 gets another byte from the table | |
477 TBLRD*+ ; get configuration | |
478 movf TABLAT,W | |
479 rcall TFT_DataWrite ; write configuration | |
623 | 480 bra display1_init_loop ; loop |
608 | 481 |
0 | 482 ;============================================================================= |
623 | 483 |
484 global TFT_CmdWrite | |
608 | 485 TFT_CmdWrite: |
486 RS_L ; command | |
628 | 487 ; btfsc screen_type2 |
488 ; bra TFT_CmdWrite_screen2 | |
608 | 489 clrf PORTA ; upper |
490 bcf INTCON,GIE | |
491 movwf PORTH ; lower | |
492 WR_L | |
493 WR_H ; tick | |
494 bsf INTCON,GIE | |
495 return | |
628 | 496 ;TFT_CmdWrite_screen2: |
497 ; movwf PORTH ; lower | |
498 ; WR_L | |
499 ; WR_H ; tick | |
500 ; return; | |
608 | 501 |
502 global TFT_DataWrite | |
503 TFT_DataWrite: | |
504 RS_H ; data | |
628 | 505 ; btfsc screen_type2 |
506 ; bra TFT_DataWrite_screen2 | |
608 | 507 bcf INTCON,GIE |
623 | 508 movwf PORTH ; lower |
608 | 509 WR_L |
510 WR_H ; tick | |
511 bsf INTCON,GIE | |
512 return | |
628 | 513 ;TFT_DataWrite_screen2: |
514 ; movwf PORTH ; lower | |
515 ; WR_L | |
516 ; WR_H ; tick | |
517 ; return | |
608 | 518 |
623 | 519 |
608 | 520 ;============================================================================= |
0 | 521 ; Smooth lighting-up of the display: |
522 ; | |
523 ; Trashes: WREG, PRODL | |
524 ; Typical usage: | |
604 | 525 ; clrf CCPR1L ; backlight off |
582 | 526 ; [draw splash screen] |
527 ; call TFT_DisplayFadeIn | |
528 | |
529 global TFT_Display_FadeIn | |
0 | 530 TFT_Display_FadeIn: |
623 | 531 movlw CCP1CON_VALUE ; get configuration |
532 movwf CCP1CON ; set configuration | |
604 | 533 bsf tft_is_dimming ; TFT is dimming, ignore ambient sensor |
628 | 534 btfsc screen_type3 |
535 bra TFT_Display_FadeIn_1 | |
604 | 536 clrf CCPR1L ; backlight off - to be sure |
582 | 537 movff max_CCPR1L,PRODL |
0 | 538 TFT_Display_FadeIn_0: |
604 | 539 incf CCPR1L,F ; duty cycle |
582 | 540 WAITMS d'2' |
541 decfsz PRODL,F | |
623 | 542 bra TFT_Display_FadeIn_0 |
604 | 543 bcf tft_is_dimming ; dimming done |
582 | 544 return |
628 | 545 TFT_Display_FadeIn_1: |
546 setf CCPR1L | |
547 return | |
0 | 548 |
549 ;============================================================================= | |
550 ; Smooth lighting-off of the display: | |
551 ; Trashes: WREG, PRODL | |
582 | 552 |
553 global TFT_Display_FadeOut | |
0 | 554 TFT_Display_FadeOut: |
582 | 555 movff max_CCPR1L,PRODL |
604 | 556 bsf tft_is_dimming ; TFT is dimming, ignore ambient sensor |
628 | 557 btfsc screen_type3 |
558 bra TFT_Display_FadeOut_1 | |
0 | 559 TFT_Display_FadeOut_0: |
604 | 560 movff PRODL,CCPR1L ; duty cycle |
582 | 561 WAITMS d'1' |
562 decfsz PRODL,F | |
563 bra TFT_Display_FadeOut_0 | |
628 | 564 TFT_Display_FadeOut_1: |
582 | 565 clrf CCPR1L |
566 return | |
0 | 567 |
568 ;============================================================================= | |
628 | 569 ; OLED brightness control |
570 TFT_display3_high: ; 0x01F8F8 | |
571 movlw LOW (0x01F8F8 ) | |
572 movwf TBLPTRL | |
573 movlw HIGH (0x01F8F8 & 0xFFFF) | |
574 movwf TBLPTRH | |
575 movlw UPPER (0x01F8F8 ) | |
576 movwf TBLPTRU | |
577 bra display1_init_loop ; and return | |
578 | |
579 TFT_display3_med: ; 0x01F91C | |
580 movlw LOW (0x01F91C ) | |
581 movwf TBLPTRL | |
582 movlw HIGH (0x01F91C & 0xFFFF) | |
583 movwf TBLPTRH | |
584 movlw UPPER (0x01F91C ) | |
585 movwf TBLPTRU | |
586 bra display1_init_loop ; and return | |
587 | |
588 TFT_display3_low: ; 0x01F8D4 | |
589 movlw LOW (0x01F8D4 ) | |
590 movwf TBLPTRL | |
591 movlw HIGH (0x01F8D4 & 0xFFFF) | |
592 movwf TBLPTRH | |
593 movlw UPPER (0x01F8D4 ) | |
594 movwf TBLPTRU | |
595 bra display1_init_loop ; and return | |
596 | |
597 ;============================================================================= | |
0 | 598 |
604 | 599 global box_std_block, box_black_block, box_color_block |
0 | 600 |
604 | 601 box_std_block: ; use white color |
582 | 602 setf WREG |
623 | 603 bra box_common |
604 | 604 box_black_block: ; use black color |
582 | 605 clrf WREG |
0 | 606 box_common: |
607 box_color_block: | |
582 | 608 rcall TFT_set_color |
609 VARARGS_BEGIN | |
610 VARARGS_GET8 win_top | |
611 VARARGS_GET8 win_height | |
612 VARARGS_GET8 win_leftx2 | |
613 VARARGS_GET8 win_width | |
614 VARARGS_END | |
615 bra TFT_box | |
0 | 616 |
617 ;----------------------------------------------------------------------------- | |
618 | |
582 | 619 global box_frame_std, box_frame_common, box_frame_color, box_frame_color16 |
0 | 620 |
621 box_frame_std: | |
582 | 622 setf WREG |
623 rcall TFT_set_color | |
0 | 624 box_frame_common: |
582 | 625 VARARGS_BEGIN |
626 VARARGS_GET8 win_top | |
627 VARARGS_GET8 win_height | |
628 VARARGS_GET8 win_leftx2 | |
629 VARARGS_GET8 win_width | |
630 VARARGS_END | |
631 bra TFT_frame | |
0 | 632 box_frame_color: |
582 | 633 rcall TFT_set_color |
0 | 634 box_frame_color16: |
582 | 635 bra box_frame_common |
0 | 636 |
434 | 637 ;;============================================================================= |
638 ;; Init for half_pixel_write | |
639 ;; Set column register on TFT device, and current color. | |
640 ;; Inputs: win_leftx2 | |
641 ;; Outputs: win_color:2 | |
642 ;; Trashed: WREG, PROD | |
582 | 643 ; |
644 ; global init_pixel_write | |
434 | 645 ;init_pixel_write: |
582 | 646 ; movf win_leftx2,W |
647 ; mullw 2 | |
604 | 648 ; rcall pixel_write_col320 ; start address vertical (.0 - .319) |
582 | 649 ; setf WREG |
650 ; bra TFT_set_color | |
0 | 651 |
652 ;----------------------------------------------------------------------------- | |
653 ; Writes two half-pixels at position (win_top,win_leftx2) | |
654 ; Inputs: win_leftx2, win_top, win_color:2 | |
655 ; Trashed: WREG, PROD | |
582 | 656 |
657 global pixel_write | |
0 | 658 pixel_write: |
582 | 659 movf win_leftx2,W |
623 | 660 mullw .2 ; win_leftx2 x 2 -> PRODH:PRODL |
604 | 661 rcall pixel_write_col320 ; start address vertical (.0 - .319) |
662 rcall half_pixel_write ; write this half-one | |
628 | 663 |
604 | 664 movf win_leftx2,W ; address of next one |
623 | 665 mullw .2 ; win_leftx2 x 2 -> PRODH:PRODL |
666 INCI PROD ; PROD++ | |
582 | 667 rcall pixel_write_col320 |
628 | 668 bra half_pixel_write ; and return... note: cmd 0x20 is mandatory, because |
582 | 669 ; of the auto-increment going vertical |
0 | 670 |
671 global pixel_write_col320 | |
672 pixel_write_col320: | |
628 | 673 btfsc screen_type2 ; display type 2 ? |
674 bra pixel_write_col320_d2 ; YES | |
675 btfsc screen_type1 ; display type 1 ? | |
676 bra pixel_write_col320_d1 ; YES | |
677 btfsc screen_type3 ; display type 3 ? | |
678 bra pixel_write_col320_d3 ; YES | |
679 ; NO to all - display type 0 | |
582 | 680 btfss flip_screen ; 180° rotation? |
604 | 681 bra pixel_write_noflip_H ; NO |
682 bra pixel_write_flip_H ; YES | |
623 | 683 pixel_write_col320_d1: ; display type 1 |
582 | 684 btfsc flip_screen ; 180° rotation? |
623 | 685 bra pixel_write_noflip_H ; YES |
604 | 686 pixel_write_flip_H: ; flip d0 |
687 movf PRODL,W ; 16 bits 319 - PROD --> PROD | |
623 | 688 sublw LOW .319 ; 319-W --> W |
582 | 689 movwf PRODL |
690 movf PRODH,W | |
604 | 691 btfss STATUS,C ; borrow = /CARRY |
582 | 692 incf WREG |
623 | 693 sublw HIGH .319 |
582 | 694 movwf PRODH |
151 | 695 |
696 pixel_write_noflip_H: | |
604 | 697 Index_out 0x21 ; frame memory vertical address |
582 | 698 bra TFT_DataWrite_PROD ; and return... |
0 | 699 |
608 | 700 pixel_write_col320_d2: |
623 | 701 movlw 0x06 |
702 rcall TFT_CmdWrite | |
703 movf PRODH,W | |
704 rcall TFT_DataWrite | |
705 movlw 0x07 | |
706 rcall TFT_CmdWrite | |
707 movf PRODL,W | |
708 rcall TFT_DataWrite | |
608 | 709 |
623 | 710 incf PRODL,F |
711 movlw .0 | |
712 addwfc PRODH,F ; +1 | |
608 | 713 |
623 | 714 movlw 0x08 |
715 rcall TFT_CmdWrite | |
716 movf PRODH,W | |
717 rcall TFT_DataWrite | |
718 movlw 0x09 | |
719 rcall TFT_CmdWrite | |
720 movf PRODL,W | |
721 bra TFT_DataWrite ; ... and return | |
608 | 722 |
628 | 723 pixel_write_col320_d3: |
724 movlw 0x21 ; start address vertical (.0 - .319) | |
725 rcall TFT_CmdWrite | |
726 bra TFT_DataWrite_PROD ; and return... | |
727 | |
0 | 728 ;----------------------------------------------------------------------------- |
729 ; Writes one half-pixel at position (win_top,win_leftx2). | |
730 ; Inputs: win_leftx2, win_top, win_color:2 | |
731 ; Trashed: WREG, PROD | |
582 | 732 |
733 global half_pixel_write | |
0 | 734 half_pixel_write: |
628 | 735 movf win_top,W ; d'0' ... d'239' |
736 ; Variant with Y position in WREG | |
0 | 737 half_pixel_write_1: |
628 | 738 btfsc screen_type2 ; display type 2 ? |
739 bra half_pixel_write_1_display2 ; YES | |
740 btfsc screen_type3 ; display type 3 ? | |
741 bra half_pixel_write_1_display3 ; YES | |
608 | 742 |
628 | 743 half_pixel_write_1_display1: |
582 | 744 btfss flip_screen ; 180° rotation? |
745 sublw .239 ; 239-Y --> Y | |
604 | 746 mullw .1 ; copy row to PRODL (PRODH=0) |
747 Index_out 0x20 ; frame memory horizontal address | |
582 | 748 rcall TFT_DataWrite_PROD |
0 | 749 |
604 | 750 Index_out 0x22 ; frame memory data write start |
751 RS_H ; data | |
582 | 752 bcf INTCON,GIE |
604 | 753 movff win_color1,PORTA ; upper |
754 movff win_color2,PORTH ; lower | |
582 | 755 WR_L |
604 | 756 WR_H ; tick |
582 | 757 bsf INTCON,GIE |
758 return | |
0 | 759 |
628 | 760 half_pixel_write_1_display2: |
623 | 761 mullw 1 ; copy row to PRODL (PRODH=0) |
762 ; Row address start | |
763 movlw 0x02 | |
764 rcall TFT_CmdWrite | |
765 movlw .0 | |
766 rcall TFT_DataWrite | |
767 movlw 0x03 | |
768 rcall TFT_CmdWrite | |
769 movf PRODL,W | |
770 rcall TFT_DataWrite | |
608 | 771 |
623 | 772 incf PRODL,F |
608 | 773 |
623 | 774 movlw 0x04 |
775 rcall TFT_CmdWrite | |
776 movlw .0 | |
777 rcall TFT_DataWrite | |
778 movlw 0x05 | |
779 rcall TFT_CmdWrite | |
780 movf PRODL,W | |
781 rcall TFT_DataWrite | |
608 | 782 |
783 movff win_color1,PRODH | |
784 movff win_color2,PRODL | |
785 rcall convert_for_display2 | |
786 | |
623 | 787 movlw 0x22 ; start writing data to GRAM |
788 rcall TFT_CmdWrite | |
789 RS_H ; data | |
790 movff win_color5, PORTH | |
608 | 791 WR_L |
623 | 792 WR_H ; tick |
793 movff win_color4, PORTH | |
608 | 794 WR_L |
623 | 795 WR_H ; tick |
796 movff win_color3, PORTH | |
608 | 797 WR_L |
623 | 798 WR_H ; tick |
799 return | |
608 | 800 |
628 | 801 half_pixel_write_1_display3: |
802 mullw 1 ; copy row to PRODL (PRODH=0) | |
803 | |
804 movlw 0x20 ; horizontal address START:END | |
805 rcall TFT_CmdWrite | |
806 rcall TFT_DataWrite_PROD | |
807 | |
808 movlw 0x22 ; start writing data to GRAM | |
809 rcall TFT_CmdWrite | |
810 RS_H ; data | |
811 movff win_color1, PORTH | |
812 WR_L | |
813 WR_H ; tick | |
814 movff win_color2, PORTH | |
815 WR_L | |
816 WR_H ; tick | |
817 return ; done | |
818 | |
0 | 819 ;----------------------------------------------------------------------------- |
820 ; Writes a vertical line of half-pixel at position (win_top,win_leftx2,win_height). | |
821 ; Inputs: win_leftx2, win_top, win_height, win_color:2 | |
822 ; Trashed: WREG, PROD, TABLAT, TBLPTRL | |
582 | 823 |
0 | 824 global half_vertical_line |
825 half_vertical_line: | |
604 | 826 clrf TABLAT ; loop index |
0 | 827 |
828 half_vertical_line_loop: | |
604 | 829 movf win_leftx2,W ; init X position |
623 | 830 mullw .2 ; win_leftx2 x 2 -> PRODH:PRODL |
604 | 831 movf TABLAT,W ; get loop index |
832 andlw .1 ; just low bit | |
833 xorwf PRODL,F ; and use it to jitter current X position | |
834 rcall pixel_write_col320 ; start address vertical (.0 - .319) | |
0 | 835 |
604 | 836 movf win_height,W ; index reached height (bank0 read) ? |
582 | 837 xorwf TABLAT,W |
604 | 838 btfsc STATUS,Z ; Equal ? |
839 return ; YES - done | |
840 movf win_top,W ; Y = top + index (bank0 read) | |
582 | 841 addwf TABLAT,W |
842 rcall half_pixel_write_1 | |
843 incf TABLAT,F ; index++ | |
844 bra half_vertical_line_loop | |
0 | 845 |
846 ;----------------------------------------------------------------------------- | |
847 ; Writes a horizontal line of half-pixel at position (win_top,win_leftx2,win_width). | |
848 ; Inputs: win_leftx2, win_top, win_width, win_color:2 | |
849 ; Trashed: WREG, PROD, TABLAT, TBLPTRL | |
582 | 850 |
0 | 851 global half_horizontal_line |
852 half_horizontal_line: | |
604 | 853 clrf TABLAT ; loop index |
0 | 854 |
855 half_horizontal_line_loop: | |
604 | 856 movf win_leftx2,W ; init X position |
623 | 857 mullw .2 ; win_leftx2 x 2 -> PRODH:PRODL |
604 | 858 rcall pixel_write_col320 ; start address vertical (.0 - .319) |
859 movf win_width,W ; index reached height (bank0 read) ? | |
582 | 860 xorwf TABLAT,W |
604 | 861 btfsc STATUS,Z ; equal ? |
862 return ; YES - done | |
863 movf win_top,W ; Y = top + index (bank0 read) | |
582 | 864 addwf TABLAT,W |
865 rcall half_pixel_write_1 | |
866 incf TABLAT,F ; index++ | |
867 bra half_horizontal_line_loop | |
0 | 868 |
869 | |
870 ;----------------------------------------------------------------------------- | |
623 | 871 ; TFT Data Command via W |
582 | 872 |
873 global TFT_DataWrite_PROD | |
0 | 874 TFT_DataWrite_PROD: |
623 | 875 ; RD_H ; keep high |
876 RS_H ; data | |
877 btfsc screen_type2 ; screen type 2 ? | |
878 bra TFT_DataWrite_PROD_display2 ; YES | |
628 | 879 btfsc screen_type3 ; screen type 3 ? |
880 bra TFT_DataWrite_PROD_display2 ; YES | |
623 | 881 bcf INTCON,GIE ; NO - |
882 movff PRODH,PORTA ; - move high byte to PORTA | |
883 movff PRODL,PORTH ; - move low byte to PORTH | |
884 WR_L ; - tick | |
885 WR_H ; - tack | |
886 bsf INTCON,GIE ; - | |
887 return ; - done | |
0 | 888 |
608 | 889 TFT_DataWrite_PROD_display2: |
623 | 890 movff PRODH,PORTH ; move high byte to PORTH (display 2 is big endian) |
891 WR_L ; tick | |
892 WR_H ; tack | |
893 movff PRODL,PORTH ; move low byte to PORTH | |
894 WR_L ; tick | |
895 WR_H ; tack | |
628 | 896 btfsc screen_type3 ; screen type 3 ? |
897 return ; YES - done | |
898 movff win_color3,PORTH ; NO - move low(est) byte to PORTH | |
899 WR_L ; - tick | |
900 WR_H ; - tack | |
901 return ; - done | |
623 | 902 |
608 | 903 |
0 | 904 TFT_DataRead_PROD: |
604 | 905 Index_out 0x22 ; frame memory data read start |
360 | 906 TFT_CmdRead_PROD: |
604 | 907 setf TRISA ; port A as input |
908 setf TRISH ; port H as input | |
909 RS_H ; data | |
910 WR_H ; not write | |
911 RD_L ; read | |
582 | 912 nop |
913 nop | |
914 nop | |
604 | 915 RD_H ; tick |
582 | 916 nop |
917 nop | |
918 nop | |
604 | 919 RD_L ; read |
582 | 920 nop |
921 ;nop | |
922 ;nop | |
923 movff PORTA,PRODH | |
924 movff PORTH,PRODL | |
604 | 925 RD_H ; tick |
582 | 926 nop |
604 | 927 clrf TRISA ; port A as output |
928 clrf TRISH ; port H as output | |
0 | 929 return |
930 | |
931 ;============================================================================= | |
604 | 932 ; Output TFT Window Address commands |
933 ; Inputs : win_top, win_leftx2, win_height, win_width | |
934 ; Output : PortA/PortH commands | |
0 | 935 ; Trashed: PROD |
582 | 936 |
937 global TFT_box_write | |
0 | 938 TFT_box_write: |
623 | 939 movf win_leftx2,W ; compute left = 2 * leftx2 --> PROD |
940 mullw .2 ; win_leftx2 x 2 -> PRODH:PRODL | |
0 | 941 |
623 | 942 btfsc screen_type2 ; screen type 2 ? |
943 bra TFT_box_write_display2 ; YES | |
628 | 944 btfsc screen_type3 ; screen type 3 ? |
945 bra TFT_box_write_display3 ; YES | |
608 | 946 |
582 | 947 global TFT_box_write_16bit_win_left |
623 | 948 TFT_box_write_16bit_win_left: ; with column in PRODL:PRODH |
628 | 949 btfsc screen_type1 ; screen type 1 ? |
604 | 950 bra TFT_box_write_16bit_win_left_d1 ; YES |
623 | 951 ; screen type 0 |
582 | 952 btfsc flip_screen ; 180° rotation? |
628 | 953 bra TFT_box_flip_H ; YES |
604 | 954 bra TFT_box_write_16bit_win_left_com ; NO |
582 | 955 TFT_box_write_16bit_win_left_d1: ; Display1 |
956 btfss flip_screen ; 180° rotation? | |
628 | 957 bra TFT_box_flip_H ; NO |
623 | 958 TFT_box_write_16bit_win_left_com: ; YES for screen type 1, NO for type 0 |
582 | 959 ;---- Normal horizontal window --------------------------------------- |
604 | 960 Index_out 0x52 ; window vertical start address |
961 rcall TFT_DataWrite_PROD ; output left | |
962 Index_out 0x21 ; frame memory vertical address | |
963 rcall TFT_DataWrite_PROD ; output left | |
0 | 964 |
582 | 965 movf win_width+0,W ; right = left + width - 1 |
432 | 966 addwf PRODL,F |
967 movf win_width+1,W | |
968 addwfc PRODH,F | |
623 | 969 decf PRODL,F ; right-- |
582 | 970 btfss STATUS,C |
432 | 971 decf PRODH,F |
0 | 972 |
604 | 973 Index_out 0x53 ; window vertical end address |
582 | 974 rcall TFT_DataWrite_PROD |
628 | 975 bra TFT_box_noflip_H |
0 | 976 |
582 | 977 ;---- Flipped horizontal window -------------------------------------- |
628 | 978 TFT_box_flip_H: |
623 | 979 ; calculate new coordinate |
604 | 980 movf PRODL,W ; 16 bits 319 - PROD --> PROD |
623 | 981 sublw LOW .319 ; 319 - WREG --> WREG |
582 | 982 movwf PRODL |
983 movf PRODH,W | |
604 | 984 btfss STATUS,C ; borrow = /CARRY |
582 | 985 incf WREG |
623 | 986 sublw HIGH .319 |
582 | 987 movwf PRODH |
152
19ad15f04f60
BUGFIX: Clear Setpoint-Fallback warning when in bailout
heinrichsweikamp
parents:
151
diff
changeset
|
988 |
604 | 989 Index_out 0x53 ; window vertical start address |
990 rcall TFT_DataWrite_PROD ; output left | |
991 Index_out 0x21 ; frame memory vertical address | |
992 rcall TFT_DataWrite_PROD ; output left | |
151 | 993 |
623 | 994 ; calculate new coordinate |
604 | 995 movf win_width+0,W ; 16 bits PROD - width --> PROD |
582 | 996 subwf PRODL,F ; PRODL - WREG --> PRODL |
997 movf win_width+1,W | |
998 subwfb PRODH,F | |
623 | 999 INCI PROD ; PROD++ |
151 | 1000 |
604 | 1001 Index_out 0x52 ; window vertical end address |
582 | 1002 rcall TFT_DataWrite_PROD |
151 | 1003 |
628 | 1004 TFT_box_noflip_H: |
582 | 1005 btfss flip_screen ; 180° rotation ? |
604 | 1006 bra TFT_box_noflip_V ; NO |
151 | 1007 |
582 | 1008 ;---- Flipped vertical window ----------------------------------------- |
623 | 1009 ; calculate new coordinate |
582 | 1010 movff win_top,PRODH ; top --> PRODH (first byte) |
1011 movf win_height,W | |
1012 addwf PRODH,W | |
432 | 1013 decf WREG |
604 | 1014 movwf PRODL ; top + height - 1 --> PRODL (second byte) |
151 | 1015 |
604 | 1016 Index_out 0x50 ; window horizontal start address |
432 | 1017 movf PRODH,W |
604 | 1018 rcall TFT_DataWrite ; lower (and tick) |
151 | 1019 |
604 | 1020 Index_out 0x51 ; window horizontal end address |
582 | 1021 movf PRODL,W |
604 | 1022 rcall TFT_DataWrite ; lower (and tick) |
582 | 1023 |
604 | 1024 Index_out 0x20 ; frame memory horizontal address |
432 | 1025 movf PRODH,W |
604 | 1026 bra TFT_DataWrite ; lower (and tick) and return |
151 | 1027 |
152
19ad15f04f60
BUGFIX: Clear Setpoint-Fallback warning when in bailout
heinrichsweikamp
parents:
151
diff
changeset
|
1028 TFT_box_noflip_V: |
582 | 1029 ;---- Normal vertical window ---------------------------------------- |
1030 movff win_top,PRODL | |
1031 movf win_height,W | |
1032 addwf PRODL,W | |
1033 sublw .240 ; 240 - top - height | |
604 | 1034 movwf PRODH ; first byte |
0 | 1035 |
432 | 1036 movf PRODL,W |
604 | 1037 sublw .239 ; 239 - top |
1038 movwf PRODL ; --> second byte | |
0 | 1039 |
604 | 1040 Index_out 0x50 ; window horizontal start address |
432 | 1041 movf PRODH,W |
604 | 1042 rcall TFT_DataWrite ; lower (and tick) |
0 | 1043 |
604 | 1044 Index_out 0x51 ; window horizontal end address |
432 | 1045 movf PRODL,W |
604 | 1046 rcall TFT_DataWrite ; lower (and tick) |
0 | 1047 |
604 | 1048 Index_out 0x20 ; frame memory horizontal address |
432 | 1049 movf PRODL,W |
604 | 1050 bra TFT_DataWrite ; lower (and tick) and return |
582 | 1051 |
608 | 1052 |
623 | 1053 TFT_box_write_display2: |
631 | 1054 ; setup left border |
623 | 1055 movlw 0x06 |
1056 rcall TFT_CmdWrite | |
1057 movf PRODH,W | |
1058 rcall TFT_DataWrite | |
1059 movlw 0x07 | |
1060 rcall TFT_CmdWrite | |
1061 movf PRODL,W | |
1062 rcall TFT_DataWrite | |
608 | 1063 |
623 | 1064 movf win_width+0,W ; right = left + width - 1 |
1065 addwf PRODL,F | |
1066 movf win_width+1,W | |
1067 addwfc PRODH,F | |
631 | 1068 decf PRODL,F ; decrement result |
623 | 1069 btfss STATUS,C |
631 | 1070 decf PRODH,F |
608 | 1071 |
631 | 1072 ; setup right border |
623 | 1073 movlw 0x08 |
1074 rcall TFT_CmdWrite | |
1075 movf PRODH,W | |
1076 rcall TFT_DataWrite | |
1077 movlw 0x09 | |
1078 rcall TFT_CmdWrite | |
1079 movf PRODL,W | |
1080 rcall TFT_DataWrite | |
1081 | |
1082 ;---- Normal vertical window ----------------------------------------- | |
1083 ; Output (top) (bottom) | |
1084 movff win_top,PRODH ; top --> PRODH (first byte) | |
1085 movf win_height,W | |
1086 addwf PRODH,W | |
1087 decf WREG | |
1088 movwf PRODL ; top+height-1 --> PRODL (second byte) | |
608 | 1089 |
623 | 1090 movlw 0x02 |
1091 rcall TFT_CmdWrite | |
1092 movlw 0x00 | |
1093 rcall TFT_DataWrite | |
1094 movlw 0x03 | |
1095 rcall TFT_CmdWrite | |
1096 movf PRODH,W | |
1097 rcall TFT_DataWrite | |
608 | 1098 |
623 | 1099 movlw 0x04 |
1100 rcall TFT_CmdWrite | |
1101 movlw 0x00 | |
1102 rcall TFT_DataWrite | |
1103 movlw 0x05 | |
1104 rcall TFT_CmdWrite | |
1105 movf PRODL,W | |
1106 bra TFT_DataWrite ; ... and return | |
0 | 1107 |
628 | 1108 TFT_box_write_display3: |
1109 ;---- Normal horizontal window --------------------------------------- | |
1110 ; Output 0x35 left, | |
631 | 1111 ; 0x36 right == left + width - 1. |
628 | 1112 |
1113 Index_out 0x35 ; window vertical start address | |
1114 rcall TFT_DataWrite_PROD ; output left | |
1115 Index_out 0x21 ; also the horizontal first pix coordinate | |
1116 rcall TFT_DataWrite_PROD ; output left | |
1117 | |
631 | 1118 movf win_width+0,W ; right = left + width - 1 |
628 | 1119 addwf PRODL,F |
631 | 1120 movf win_width+1,W |
628 | 1121 addwfc PRODH,F |
631 | 1122 decf PRODL,F ; decrement result |
628 | 1123 btfss STATUS,C |
631 | 1124 decf PRODH,F |
628 | 1125 |
631 | 1126 Index_out 0x36 ; write and the right border |
628 | 1127 rcall TFT_DataWrite_PROD |
1128 | |
1129 ;---- Normal vertical window ----------------------------------------- | |
1130 ; Output 0x37 (top) (bottom) | |
1131 movff win_top,PRODH ; top --> PRODH (first byte) | |
1132 movff win_height,WREG | |
1133 addwf PRODH,W | |
1134 decf WREG | |
1135 movwf PRODL ; top + height - 1 --> PRODL (second byte) | |
1136 | |
1137 Index_out 0x37 | |
1138 rcall TFT_DataWrite_PROD | |
1139 | |
1140 movff PRODH,PRODL | |
1141 clrf PRODH ; start pixel V coord == top. | |
1142 Index_out 0x20 | |
1143 bra TFT_DataWrite_PROD ; and return... | |
1144 | |
1145 | |
0 | 1146 ;============================================================================= |
604 | 1147 ; TFT_frame : draw a frame around current box with current color |
0 | 1148 ; Inputs: win_top, win_leftx2, win_height, win_width, win_color1, win_color2 |
1149 ; Outputs: (none) | |
1150 ; Trashed: WREG, PROD, aa_start:2, aa_end:2 | |
1151 | |
582 | 1152 global TFT_frame |
1153 TFT_frame: | |
623 | 1154 movff win_top,tft_save_top ; backup everything |
1155 movff win_height,tft_save_height | |
1156 movff win_leftx2,tft_save_left | |
631 | 1157 movff win_width+0,tft_save_width |
0 | 1158 |
582 | 1159 ;---- TOP line ----------------------------------------------------------- |
623 | 1160 movlw .1 ; row ~ height = 1 |
582 | 1161 movwf win_height |
1162 rcall TFT_box | |
0 | 1163 |
582 | 1164 ;---- BOTTOM line -------------------------------------------------------- |
623 | 1165 movff tft_save_top,PRODL ; get back top |
1166 movff tft_save_height,WREG ; get back height | |
1167 addwf PRODL,W ; top + height | |
1168 decf WREG ; top + height - 1 | |
1169 movwf win_top ; top + height - 1 --> top | |
582 | 1170 rcall TFT_box |
0 | 1171 |
582 | 1172 ;---- LEFT column -------------------------------------------------------- |
623 | 1173 movff tft_save_top,win_top ; restore top/height |
1174 movff tft_save_height,win_height | |
1175 movlw .1 ; column ~ width = 1 | |
582 | 1176 movwf win_width+0 |
1177 rcall TFT_box | |
1178 | |
1179 ;---- RIGHT column ------------------------------------------------------- | |
623 | 1180 movff tft_save_left,WREG |
1181 movff tft_save_width,PRODL | |
582 | 1182 addwf PRODL,W |
1183 decf WREG | |
1184 movwf win_leftx2 | |
1185 rcall TFT_box | |
1186 | |
1187 ;---- Restore everything ------------------------------------------------- | |
623 | 1188 movff tft_save_left,win_leftx2 |
631 | 1189 movff tft_save_width,win_width+0 |
582 | 1190 return |
0 | 1191 |
1192 ;============================================================================= | |
604 | 1193 ; TFT_box: fills current box with current color |
1194 ; Inputs : win_top, win_leftx2, win_height, win_width, win_color1, win_color2 | |
0 | 1195 ; Outputs: (none) |
1196 ; Trashed: WREG, PROD | |
1197 | |
582 | 1198 global TFT_box |
0 | 1199 TFT_box: |
582 | 1200 ;---- Define Window ------------------------------------------------------ |
1201 bcf STATUS,C | |
1202 rlcf win_width+0,F | |
1203 rlcf win_width+1,F ; x2 | |
604 | 1204 rcall TFT_box_write ; setup box |
0 | 1205 |
582 | 1206 bcf STATUS,C |
1207 rrcf win_width+1,F ; width /= 2 | |
1208 rrcf win_width+0,F | |
0 | 1209 |
582 | 1210 ;---- Fill Window -------------------------------------------------------- |
604 | 1211 Index_out 0x22 ; frame memory data write start |
1212 clrf PRODH ; column counter | |
1213 RS_H ; data | |
0 | 1214 |
628 | 1215 btfsc screen_type2 ; display type 2 ? |
1216 bra TFT_box_display2 ; YES | |
1217 btfsc screen_type3 ; display type 3 ? | |
1218 bra TFT_box_display3 ; YES | |
1219 | |
604 | 1220 TFT_box2: ; loop height times |
0 | 1221 movff win_height,PRODL |
1222 | |
582 | 1223 TFT_box3: ; loop width times |
623 | 1224 bcf INTCON,GIE |
604 | 1225 movff win_color1,PORTA ; upper |
1226 movff win_color2,PORTH ; lower | |
0 | 1227 WR_L |
604 | 1228 WR_H ; tick |
0 | 1229 WR_L |
604 | 1230 WR_H ; tick |
582 | 1231 bsf INTCON,GIE |
1232 decfsz PRODL,F ; row loop finished ? | |
604 | 1233 bra TFT_box3 ; NO - continue |
0 | 1234 |
582 | 1235 incf PRODH,F ; column count ++ |
628 | 1236 movf win_bargraph,W ; get width of active bargraph part |
1237 cpfseq PRODH ; current column == end of active bargraph ? | |
604 | 1238 bra TFT_box4 ; NO - just loop |
628 | 1239 clrf win_color1 ; YES - switch to black |
604 | 1240 clrf win_color2 ; - ... |
0 | 1241 TFT_box4: |
628 | 1242 movf win_width+0,W ; get total bargraph width |
1243 xorwf PRODH,W ; all columns done? | |
1244 bnz TFT_box2 ; NO - loop | |
0 | 1245 |
582 | 1246 movlw 0x00 ; NOP, to stop window mode |
1247 rcall TFT_CmdWrite | |
0 | 1248 |
604 | 1249 ; reset bargraph mode... |
582 | 1250 setf win_bargraph |
1251 return | |
623 | 1252 |
608 | 1253 TFT_box_display2: |
628 | 1254 ; Screen 2 |
608 | 1255 movff win_color1,PRODH |
1256 movff win_color2,PRODL | |
1257 rcall convert_for_display2 | |
631 | 1258 clrf PRODH ; column counter |
623 | 1259 TFT_box2_display2: ; loop height times |
608 | 1260 movff win_height,PRODL |
623 | 1261 TFT_box3_display2: ; loop width times |
608 | 1262 movff win_color5,PORTH |
623 | 1263 bcf tft_nwr |
1264 bsf tft_nwr ; upper | |
608 | 1265 movff win_color4,PORTH |
1266 bcf tft_nwr | |
623 | 1267 bsf tft_nwr ; high |
608 | 1268 movff win_color3,PORTH |
1269 bcf tft_nwr | |
623 | 1270 bsf tft_nwr ; low |
608 | 1271 |
1272 movff win_color5,PORTH | |
1273 bcf tft_nwr | |
623 | 1274 bsf tft_nwr ; upper |
608 | 1275 movff win_color4,PORTH |
1276 bcf tft_nwr | |
623 | 1277 bsf tft_nwr ; high |
608 | 1278 movff win_color3,PORTH |
1279 bcf tft_nwr | |
623 | 1280 bsf tft_nwr ; low |
1281 decfsz PRODL,F ; row loop finished? | |
1282 bra TFT_box3_display2 ; NO - loop | |
1283 incf PRODH,F ; YES - column count ++ | |
1284 movf win_bargraph,W ; - get bargraph width | |
1285 cpfseq PRODH ; - current column = bargraph ? | |
1286 bra TFT_box4_display2 ; NO | |
1287 clrf win_color5 ; YES - switch to black | |
1288 clrf win_color4 ; - ... | |
1289 clrf win_color3 ; - ... | |
608 | 1290 TFT_box4_display2: |
623 | 1291 movf win_width+0,W ; get width |
1292 cpfseq PRODH ; width loop finished ? | |
1293 bra TFT_box2_display2 ; NO - loop | |
1294 setf win_bargraph ; YES - reset bargraph mode | |
1295 return ; - done | |
0 | 1296 |
628 | 1297 TFT_box_display3: |
1298 ; Screen 3 | |
1299 TFT_box2_display3: ; loop height times | |
1300 movff win_height,PRODL | |
1301 TFT_box3_display3: ; loop width times | |
1302 movff win_color1,PORTH | |
1303 bcf tft_nwr | |
1304 bsf tft_nwr ; upper | |
1305 movff win_color2,PORTH | |
1306 bcf tft_nwr | |
1307 bsf tft_nwr ; high | |
1308 movff win_color1,PORTH | |
1309 bcf tft_nwr | |
1310 bsf tft_nwr ; low | |
1311 movff win_color2,PORTH | |
1312 bcf tft_nwr | |
1313 bsf tft_nwr ; upper | |
1314 decfsz PRODL,F ; row loop finished? | |
1315 bra TFT_box3_display3 ; NO - loop | |
1316 incf PRODH,F ; YES - column count ++ | |
1317 movf win_bargraph,W ; - get bargraph width | |
1318 cpfseq PRODH ; - current column = bargraph ? | |
1319 bra TFT_box4_display3 ; NO | |
1320 clrf win_color1 ; Yes - switch to black | |
1321 clrf win_color2 ; - ... | |
1322 TFT_box4_display3: | |
1323 movf win_width+0,W ; get width | |
1324 cpfseq PRODH ; width loop finished ? | |
1325 bra TFT_box2_display3 ; NO - loop | |
1326 setf win_bargraph ; YES - reset bargraph mode | |
1327 return | |
1328 | |
0 | 1329 ;============================================================================= |
623 | 1330 ; Convert 8 bit RGB b'RRRGGGBB' into 16 bit RGB b'RRRRRGGGGGGBBBBB' |
0 | 1331 |
582 | 1332 global TFT_set_color |
0 | 1333 TFT_set_color: |
631 | 1334 movwf tft_temp1 ; get 8 bit RGB b'RRRGGGBB' into tft_temp1... |
1335 movwf tft_temp2 ; ... and tft_temp2 | |
0 | 1336 |
604 | 1337 ; mask bit 7,6,5,4,3,2 |
0 | 1338 movlw b'00000011' |
1339 andwf tft_temp2,F | |
1340 | |
1341 movlw b'00000000' | |
1342 dcfsnz tft_temp2,F | |
1343 movlw b'01010000' | |
1344 dcfsnz tft_temp2,F | |
1345 movlw b'10100000' | |
1346 dcfsnz tft_temp2,F | |
1347 movlw b'11111000' | |
604 | 1348 movwf tft_temp3 ; blue done |
0 | 1349 |
604 | 1350 movff tft_temp1,tft_temp2 ; copy |
1351 ; mask bit 7,6,5,1,0 | |
0 | 1352 movlw b'00011100' |
1353 andwf tft_temp2,F | |
1354 rrncf tft_temp2,F | |
1355 rrncf tft_temp2,F | |
1356 | |
1357 movlw b'00000000' | |
1358 dcfsnz tft_temp2,F | |
1359 movlw b'00000100' | |
1360 dcfsnz tft_temp2,F | |
1361 movlw b'00001000' | |
1362 dcfsnz tft_temp2,F | |
1363 movlw b'00001100' | |
1364 dcfsnz tft_temp2,F | |
1365 movlw b'00010000' | |
1366 dcfsnz tft_temp2,F | |
1367 movlw b'00010100' | |
1368 dcfsnz tft_temp2,F | |
1369 movlw b'00100000' | |
1370 dcfsnz tft_temp2,F | |
1371 movlw b'00111111' | |
582 | 1372 movwf tft_temp4 |
0 | 1373 |
1374 rrcf tft_temp4,F | |
1375 rrcf tft_temp3,F | |
1376 | |
1377 rrcf tft_temp4,F | |
1378 rrcf tft_temp3,F | |
1379 | |
1380 rrcf tft_temp4,F | |
604 | 1381 rrcf tft_temp3,W ; tft_temp3 (b'GGGBBBBB') done |
1382 movwf win_color2 ; set color registers... | |
0 | 1383 |
604 | 1384 movff tft_temp1,tft_temp2 ; copy |
0 | 1385 clrf tft_temp1 |
1386 | |
1387 rrcf tft_temp4,F | |
1388 rrcf tft_temp1,F | |
1389 | |
1390 rrcf tft_temp4,F | |
1391 rrcf tft_temp1,F | |
1392 | |
1393 rrcf tft_temp4,F | |
604 | 1394 rrcf tft_temp1,F ; green done |
0 | 1395 |
604 | 1396 ; mask bit 4,3,2,1,0 |
0 | 1397 movlw b'11100000' |
1398 andwf tft_temp2,F | |
1399 | |
1400 rrncf tft_temp2,F | |
1401 rrncf tft_temp2,F | |
1402 rrncf tft_temp2,F | |
1403 rrncf tft_temp2,F | |
1404 rrncf tft_temp2,F | |
1405 | |
1406 movlw b'00000000' | |
1407 dcfsnz tft_temp2,F | |
1408 movlw b'00000100' | |
1409 dcfsnz tft_temp2,F | |
1410 movlw b'00001000' | |
1411 dcfsnz tft_temp2,F | |
1412 movlw b'00001100' | |
1413 dcfsnz tft_temp2,F | |
1414 movlw b'00010000' | |
1415 dcfsnz tft_temp2,F | |
1416 movlw b'00010100' | |
1417 dcfsnz tft_temp2,F | |
1418 movlw b'00100000' | |
1419 dcfsnz tft_temp2,F | |
1420 movlw b'00111111' | |
582 | 1421 movwf tft_temp4 |
0 | 1422 |
1423 rrcf tft_temp4,F | |
1424 rrcf tft_temp1,F | |
1425 | |
1426 rrcf tft_temp4,F | |
604 | 1427 rrcf tft_temp1,F |
0 | 1428 |
1429 rrcf tft_temp4,F | |
1430 rrcf tft_temp1,F | |
1431 | |
1432 rrcf tft_temp4,F | |
1433 rrcf tft_temp1,F | |
1434 | |
1435 rrcf tft_temp4,F | |
604 | 1436 rrcf tft_temp1,W ; red done |
1437 movwf win_color1 ; set color registers | |
0 | 1438 return |
623 | 1439 |
1440 | |
608 | 1441 global convert_for_display2 |
623 | 1442 convert_for_display2: ; convert 16 bit RGB b'RRRRRGGG GGGBBBBB' into 24 bit RGB b'RRRRRR00 GGGGGG00 BBBBBB00' |
1443 ; PRODH PRODL win_color5 win_color4 win_color3 | |
1444 ; Red | |
1445 movff PRODH,win_color5 ; = RRRRRGGG | |
1446 bcf win_color5,2 ; = RRRRR0GG | |
1447 btfsc win_color5,7 | |
1448 bsf win_color5,2 ; = RRRRR1GG the lower two bits are ignored by the screen | |
1449 ; Blue | |
1450 movff PRODL,win_color3 | |
1451 rrcf win_color3,F ; = UGGGBBBB and the LSB-blue into carry | |
1452 swapf win_color3,F ; = BBBBUGGG | |
1453 bcf win_color3,3 ; = BBBB0GGG | |
608 | 1454 btfsc STATUS,C |
623 | 1455 bsf win_color3,3 ; = BBBB1GGG |
1456 bcf win_color3,2 ; = BBBBB0GG | |
1457 btfsc win_color3,7 | |
1458 bsf win_color3,2 ; = BBBBB1GG | |
1459 ; Green | |
1460 rrcf PRODH,F | |
1461 rrcf PRODL,F | |
1462 rrcf PRODH,F | |
1463 rrcf PRODL,F | |
1464 rrcf PRODH,F | |
1465 rrcf PRODL,F ; = GGGGGGBB the lower two bits are ignored by the screen | |
1466 movff PRODL,win_color4 | |
608 | 1467 return |
623 | 1468 |
0 | 1469 |
1470 ;============================================================================= | |
1471 | |
604 | 1472 IFDEF _screendump |
1473 | |
623 | 1474 ;----------------------------------------------------------------------------- |
1475 ; Dump screen contents to the UART | |
1476 ; | |
604 | 1477 global TFT_dump_screen_check |
1478 TFT_dump_screen_check: | |
631 | 1479 return |
604 | 1480 btfss vusb_in ; USB (still) plugged in? |
623 | 1481 bcf screen_dump_avail ; NO - disable screen dump function |
631 | 1482 |
1483 SERIAL_CC_RECEIVE WREG ; try to read a byte from RS232 | |
623 | 1484 btfsc rs232_rx_timeout ; anything received? |
631 | 1485 return ; NO - done |
1486 xorlw "l" ; YES - exclusive-or with coding of screen dump command | |
1487 tstfsz WREG ; - screen dump command received? | |
604 | 1488 return ; NO - return |
631 | 1489 ;bra TFT_dump_screen ; YES - serve screen dump request |
623 | 1490 |
631 | 1491 global TFT_dump_screen |
623 | 1492 TFT_dump_screen: |
1493 btfsc screen_type2 ; is this an OSTC with a screen of type 2? | |
631 | 1494 return ; YES - not supported, abort |
623 | 1495 bsf block_sensor_interrupt ; NO - disable sensor interrupts |
631 | 1496 SERIAL_LC_SEND 'l' ; - send command acknowledge |
1497 | |
604 | 1498 |
582 | 1499 ;---- Send DISPLAY box command for the full screen window ------------------- |
604 | 1500 Index_out 0x50 ; window horizontal start address |
582 | 1501 Parameter_out 0x00, 0x00 ; 0-239 |
604 | 1502 Index_out 0x51 ; window horizontal end address |
582 | 1503 Parameter_out 0x00, 0xEF ; 0-239 |
604 | 1504 Index_out 0x52 ; window vertical start address |
582 | 1505 Parameter_out 0x00, 0x00 ; 0-319 |
604 | 1506 Index_out 0x53 ; window vertical end address |
582 | 1507 Parameter_out 0x01, 0x3F ; 0-319 |
0 | 1508 |
582 | 1509 clrf ds_column |
1510 rcall dump_screen_pixel_reset | |
0 | 1511 dump_screen_1: |
582 | 1512 btg LEDr ; LED activity toggle |
631 | 1513 ; dump even column |
604 | 1514 movlw .240 ; 240 lines, once |
582 | 1515 movwf ds_line |
0 | 1516 dump_screen_2: |
604 | 1517 Index_out 0x20 ; frame memory horizontal address |
582 | 1518 movff ds_line,WREG ; d'0' ... d'239' |
604 | 1519 mullw .1 ; copy row to PRODH:L |
582 | 1520 rcall TFT_DataWrite_PROD |
0 | 1521 |
623 | 1522 movff ds_column,WREG ; initialize X position |
1523 mullw .2 ; ds_column x 2 -> PRODH:PRODL | |
604 | 1524 rcall pixel_write_col320 ; start address vertical (.0 - .319) |
0 | 1525 |
582 | 1526 rcall TFT_DataRead_PROD ; read pixel |
1527 rcall dump_screen_pixel | |
0 | 1528 |
582 | 1529 decfsz ds_line,F |
1530 bra dump_screen_2 | |
1531 rcall dump_screen_pixel_flush | |
0 | 1532 |
631 | 1533 ; dump odd column |
604 | 1534 movlw .240 ; 240 lines, twice |
582 | 1535 movwf ds_line |
0 | 1536 dump_screen_3: |
604 | 1537 Index_out 0x20 ; frame memory horizontal address |
582 | 1538 movff ds_line,WREG ; d'0' ... d'239' |
623 | 1539 mullw .1 ; copy row to PRODH:L |
582 | 1540 rcall TFT_DataWrite_PROD |
0 | 1541 |
623 | 1542 movff ds_column,WREG ; initialize X position |
1543 mullw .2 ; ds_column x 2 -> PRODH:PRODL | |
1544 INCI PROD ; PROD++ | |
604 | 1545 rcall pixel_write_col320 ; start address vertical (.0 - .319) |
0 | 1546 |
582 | 1547 rcall TFT_DataRead_PROD ; read pixel |
631 | 1548 rcall dump_screen_pixel ; compress and send pixel |
0 | 1549 |
582 | 1550 decfsz ds_line,F |
1551 bra dump_screen_3 | |
1552 rcall dump_screen_pixel_flush | |
0 | 1553 |
582 | 1554 incf ds_column,F |
1555 movlw .160 | |
1556 cpfseq ds_column | |
1557 bra dump_screen_1 | |
0 | 1558 |
623 | 1559 bcf block_sensor_interrupt ; re-enable sensor interrupts |
604 | 1560 clrf RCREG1 ; clear receive buffer |
1561 bcf RCSTA1,CREN ; clear receiver status | |
631 | 1562 bsf RCSTA1,CREN ; ... |
623 | 1563 bsf screen_dump_avail ; enable screen dump function |
582 | 1564 return |
0 | 1565 |
623 | 1566 ;----------------------------------------------------------------------------- |
0 | 1567 ; Pixel compression |
1568 ; | |
604 | 1569 ; Input : PRODH:L = pixel |
0 | 1570 ; Output: Compressed stream on output. |
1571 ; Compressed format: | |
604 | 1572 ; 0ccccccc : BLACK pixel, repeated ccccccc+1 times (1..128) |
1573 ; 11cccccc : WHITE pixel, repeated cccccc+1 times (1.. 64) | |
1574 ; 10cccccc HIGH LOW : color pixel (H:L) repeated ccccc+1 times (1.. 64) | |
623 | 1575 ; |
0 | 1576 dump_screen_pixel: |
604 | 1577 movf PRODH,W ; compare pixel-high |
582 | 1578 xorwf ds_pixel+1,W |
604 | 1579 bnz dump_screen_pixel_1 ; different -> dump |
0 | 1580 |
604 | 1581 movf PRODL,W ; compare pixel-low |
582 | 1582 xorwf ds_pixel+0,W |
604 | 1583 bnz dump_screen_pixel_1 ; different -> dump |
0 | 1584 |
604 | 1585 incf ds_count,F ; same color: just increment |
582 | 1586 return |
0 | 1587 |
604 | 1588 dump_screen_pixel_1: ; send (pixel,count) tuple |
1589 movf ds_count,W ; is count zero ? | |
1590 bz dump_screen_pixel_2 ; YES - skip sending | |
0 | 1591 |
604 | 1592 movf ds_pixel+1,W ; is this a BLACK pixel ? |
582 | 1593 iorwf ds_pixel+0,W |
604 | 1594 bz dump_screen_pix_black ; YES |
0 | 1595 |
604 | 1596 movf ds_pixel+1,W ; is this a white pixel ? |
582 | 1597 andwf ds_pixel+0,W |
1598 incf WREG | |
604 | 1599 bz dump_screen_pix_white ; YES |
0 | 1600 |
582 | 1601 ; No: write the pixel itself... |
604 | 1602 movlw .64 ; max color pixel on a single byte |
1603 cpfsgt ds_count ; skip if count > 64 | |
582 | 1604 movf ds_count,W ; W <- min(64,count) |
1605 subwf ds_count,F ; ds_count <- ds_count-W | |
604 | 1606 decf WREG ; save as 0..63 |
1607 iorlw b'10000000' ; mark as a color pixel | |
0 | 1608 |
631 | 1609 SERIAL_CC_SEND WREG ; send byte in WREG |
1610 SERIAL_CC_SEND ds_pixel+1 ; send bytes in ds_pixel, high byte first | |
1611 SERIAL_CC_SEND ds_pixel+0 ; low byte last | |
1612 | |
582 | 1613 bra dump_screen_pixel_1 |
0 | 1614 |
1615 dump_screen_pixel_2: | |
604 | 1616 movff PRODH,ds_pixel+1 ; save new pixel color |
582 | 1617 movff PRODL,ds_pixel+0 |
1618 movlw 1 | |
604 | 1619 movwf ds_count ; and set count=1 |
582 | 1620 return |
0 | 1621 |
1622 dump_screen_pix_black: | |
604 | 1623 movlw .128 ; max black pixel on a single byte |
1624 cpfsgt ds_count ; skip if count > 128 | |
582 | 1625 movf ds_count,W ; W <- min(128,count) |
1626 subwf ds_count,F ; ds_count <- ds_count-W | |
604 | 1627 decf WREG ; save as 0..127 |
623 | 1628 |
0 | 1629 dump_screen_pix_3: |
631 | 1630 SERIAL_CC_SEND WREG ; send byte in WREG |
604 | 1631 bra dump_screen_pixel_1 ; more to dump ? |
0 | 1632 |
1633 dump_screen_pix_white: | |
604 | 1634 movlw .64 ; max white pixel on a single byte |
1635 cpfsgt ds_count ; skip if count > 64 | |
582 | 1636 movf ds_count,W ; W <- min(64,count) |
1637 subwf ds_count,F ; ds_count <- ds_count-W | |
631 | 1638 decf WREG ; save as 0..63 |
604 | 1639 iorlw b'11000000' ; mark as a compressed white |
631 | 1640 bra dump_screen_pix_3 ; send pixel |
0 | 1641 |
1642 dump_screen_pixel_flush: | |
582 | 1643 clrf PRODH |
1644 clrf PRODL | |
604 | 1645 rcall dump_screen_pixel_1 ; send it |
0 | 1646 dump_screen_pixel_reset: |
604 | 1647 clrf ds_count ; clear count |
582 | 1648 return |
0 | 1649 |
623 | 1650 ENDIF ; _screendump |
1651 | |
1652 ;============================================================================= | |
604 | 1653 |
582 | 1654 END |