annotate src/tft.asm @ 27:a0fc5d6c207e

logo update
author heinrichsweikamp
date Wed, 17 Jul 2013 13:22:51 +0200
parents 11d4fc797f74
children eb72c8865f47
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
heinrichsweikamp
parents:
diff changeset
1 ;=============================================================================
heinrichsweikamp
parents:
diff changeset
2 ;
heinrichsweikamp
parents:
diff changeset
3 ; File tft.asm
heinrichsweikamp
parents:
diff changeset
4 ;
heinrichsweikamp
parents:
diff changeset
5 ; Managing the TFT screen
heinrichsweikamp
parents:
diff changeset
6 ;
heinrichsweikamp
parents:
diff changeset
7 ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved.
heinrichsweikamp
parents:
diff changeset
8 ;=============================================================================
heinrichsweikamp
parents:
diff changeset
9 ; HISTORY
heinrichsweikamp
parents:
diff changeset
10 ; 2011-05-24 : [jDG] Cleanups from initial Matthias code.
heinrichsweikamp
parents:
diff changeset
11
heinrichsweikamp
parents:
diff changeset
12 #include "ostc3.inc"
heinrichsweikamp
parents:
diff changeset
13 #include "wait.inc"
heinrichsweikamp
parents:
diff changeset
14 #include "varargs.inc"
heinrichsweikamp
parents:
diff changeset
15 #include "external_flash.inc"
heinrichsweikamp
parents:
diff changeset
16 #include "tft_outputs.inc"
heinrichsweikamp
parents:
diff changeset
17 #include "eeprom_rs232.inc"
heinrichsweikamp
parents:
diff changeset
18
heinrichsweikamp
parents:
diff changeset
19 ;=============================================================================
heinrichsweikamp
parents:
diff changeset
20 ; TFT_frame needs to backup coordinates.
heinrichsweikamp
parents:
diff changeset
21 CBLOCK tmp
heinrichsweikamp
parents:
diff changeset
22 save_top
heinrichsweikamp
parents:
diff changeset
23 save_height
heinrichsweikamp
parents:
diff changeset
24 save_left
heinrichsweikamp
parents:
diff changeset
25 save_width
heinrichsweikamp
parents:
diff changeset
26 ds_line ; Current line (0..239).
heinrichsweikamp
parents:
diff changeset
27 ds_column ; Current columnx2 (0..159)
heinrichsweikamp
parents:
diff changeset
28 ds_pixel:2 ; Current pixel color.
heinrichsweikamp
parents:
diff changeset
29 ds_count ; Repetition count.
heinrichsweikamp
parents:
diff changeset
30 ENDC
heinrichsweikamp
parents:
diff changeset
31
heinrichsweikamp
parents:
diff changeset
32 ;=============================================================================
heinrichsweikamp
parents:
diff changeset
33 ; Basic bit-level macros
heinrichsweikamp
parents:
diff changeset
34
heinrichsweikamp
parents:
diff changeset
35 RD_H macro
heinrichsweikamp
parents:
diff changeset
36 bsf tft_rd,0
heinrichsweikamp
parents:
diff changeset
37 endm
heinrichsweikamp
parents:
diff changeset
38
heinrichsweikamp
parents:
diff changeset
39 RD_L macro
heinrichsweikamp
parents:
diff changeset
40 bcf tft_rd,0
heinrichsweikamp
parents:
diff changeset
41 endm
heinrichsweikamp
parents:
diff changeset
42
heinrichsweikamp
parents:
diff changeset
43 RS_H macro
heinrichsweikamp
parents:
diff changeset
44 bsf tft_rs,0
heinrichsweikamp
parents:
diff changeset
45 endm
heinrichsweikamp
parents:
diff changeset
46
heinrichsweikamp
parents:
diff changeset
47 RS_L macro
heinrichsweikamp
parents:
diff changeset
48 bcf tft_rs,0
heinrichsweikamp
parents:
diff changeset
49 endm
heinrichsweikamp
parents:
diff changeset
50
heinrichsweikamp
parents:
diff changeset
51 NCS_H macro
heinrichsweikamp
parents:
diff changeset
52 bsf tft_cs,0
heinrichsweikamp
parents:
diff changeset
53 endm
heinrichsweikamp
parents:
diff changeset
54
heinrichsweikamp
parents:
diff changeset
55 NCS_L macro
heinrichsweikamp
parents:
diff changeset
56 bcf tft_cs,0
heinrichsweikamp
parents:
diff changeset
57 endm
heinrichsweikamp
parents:
diff changeset
58
heinrichsweikamp
parents:
diff changeset
59 WR_H macro
heinrichsweikamp
parents:
diff changeset
60 bsf tft_nwr,0
heinrichsweikamp
parents:
diff changeset
61 endm
heinrichsweikamp
parents:
diff changeset
62
heinrichsweikamp
parents:
diff changeset
63 WR_L macro
heinrichsweikamp
parents:
diff changeset
64 bcf tft_nwr,0
heinrichsweikamp
parents:
diff changeset
65 endm
heinrichsweikamp
parents:
diff changeset
66
heinrichsweikamp
parents:
diff changeset
67 ;=============================================================================
heinrichsweikamp
parents:
diff changeset
68 ; Byte-leve macros
heinrichsweikamp
parents:
diff changeset
69 ;
heinrichsweikamp
parents:
diff changeset
70 Index_out macro low_b
heinrichsweikamp
parents:
diff changeset
71 movlw low_b
heinrichsweikamp
parents:
diff changeset
72 rcall TFT_CmdWrite
heinrichsweikamp
parents:
diff changeset
73 endm
heinrichsweikamp
parents:
diff changeset
74
heinrichsweikamp
parents:
diff changeset
75 Parameter_out macro high_b, low_b
heinrichsweikamp
parents:
diff changeset
76 movlw high_b
heinrichsweikamp
parents:
diff changeset
77 movwf PORTA ; Upper
heinrichsweikamp
parents:
diff changeset
78 movlw low_b
heinrichsweikamp
parents:
diff changeset
79 rcall TFT_DataWrite
heinrichsweikamp
parents:
diff changeset
80 endm
heinrichsweikamp
parents:
diff changeset
81
heinrichsweikamp
parents:
diff changeset
82
heinrichsweikamp
parents:
diff changeset
83 basic CODE
heinrichsweikamp
parents:
diff changeset
84
heinrichsweikamp
parents:
diff changeset
85
heinrichsweikamp
parents:
diff changeset
86 ;=============================================================================
heinrichsweikamp
parents:
diff changeset
87 ; TFT_write_flash_image
heinrichsweikamp
parents:
diff changeset
88 ;
heinrichsweikamp
parents:
diff changeset
89 ; Inputs: FSR2 = EEPROM address / 256
heinrichsweikamp
parents:
diff changeset
90 ; win_left, win_top : imagte CENTER position
heinrichsweikamp
parents:
diff changeset
91 ; Outputs: win_height, win_width.
heinrichsweikamp
parents:
diff changeset
92 ; image copyed on screen.
heinrichsweikamp
parents:
diff changeset
93 ; Trashed: PROD, hi, lo
heinrichsweikamp
parents:
diff changeset
94 ;
heinrichsweikamp
parents:
diff changeset
95 global TFT_write_flash_image
heinrichsweikamp
parents:
diff changeset
96 TFT_write_flash_image:
heinrichsweikamp
parents:
diff changeset
97 ; Get back the full 24bit EEPROM address
heinrichsweikamp
parents:
diff changeset
98 clrf ext_flash_address+0
heinrichsweikamp
parents:
diff changeset
99 movff FSR2L,ext_flash_address+1
heinrichsweikamp
parents:
diff changeset
100 movf FSR2H,W
heinrichsweikamp
parents:
diff changeset
101 iorlw 0x30
heinrichsweikamp
parents:
diff changeset
102 movwf ext_flash_address+2
heinrichsweikamp
parents:
diff changeset
103
heinrichsweikamp
parents:
diff changeset
104 ; Read header: width and height
heinrichsweikamp
parents:
diff changeset
105 global TFT_write_flash_image_addr
heinrichsweikamp
parents:
diff changeset
106 TFT_write_flash_image_addr:
heinrichsweikamp
parents:
diff changeset
107 call ext_flash_read_block_start
heinrichsweikamp
parents:
diff changeset
108 movff SSP2BUF,win_width+0
heinrichsweikamp
parents:
diff changeset
109 movwf SSP2BUF ; Write to buffer to initiate new read
heinrichsweikamp
parents:
diff changeset
110 btfss SSP2STAT, BF ; Next byte ready ?
heinrichsweikamp
parents:
diff changeset
111 bra $-2 ; NO: wait...
heinrichsweikamp
parents:
diff changeset
112 movff SSP2BUF,win_width+1
heinrichsweikamp
parents:
diff changeset
113 movwf SSP2BUF ; Write to buffer to initiate new read
heinrichsweikamp
parents:
diff changeset
114 btfss SSP2STAT, BF ; Next byte ready ?
heinrichsweikamp
parents:
diff changeset
115 bra $-2 ; NO: wait...
heinrichsweikamp
parents:
diff changeset
116 movff SSP2BUF,win_height
heinrichsweikamp
parents:
diff changeset
117 movwf SSP2BUF ; Write to buffer to initiate new read
heinrichsweikamp
parents:
diff changeset
118 btfss SSP2STAT, BF ; Next byte ready ?
heinrichsweikamp
parents:
diff changeset
119 bra $-2 ; NO: wait...
heinrichsweikamp
parents:
diff changeset
120 movff SSP2BUF,WREG ; drop 4th byte.
heinrichsweikamp
parents:
diff changeset
121 movwf SSP2BUF ; Write to buffer to initiate new read
heinrichsweikamp
parents:
diff changeset
122 btfss SSP2STAT, BF ; Next byte ready ?
heinrichsweikamp
parents:
diff changeset
123 bra $-2 ; NO: wait...
heinrichsweikamp
parents:
diff changeset
124
heinrichsweikamp
parents:
diff changeset
125 ; Sanity check on header to avoid badly uploaded images.
heinrichsweikamp
parents:
diff changeset
126 iorwf WREG ; Check height < 256
heinrichsweikamp
parents:
diff changeset
127 bnz TFT_write_flash_image_failed
heinrichsweikamp
parents:
diff changeset
128 movf win_width+1,W ; Check width < 512
heinrichsweikamp
parents:
diff changeset
129 andlw 0xFE
heinrichsweikamp
parents:
diff changeset
130 bnz TFT_write_flash_image_failed
heinrichsweikamp
parents:
diff changeset
131
heinrichsweikamp
parents:
diff changeset
132 ; Center image on win_top, win_left values
heinrichsweikamp
parents:
diff changeset
133 bcf STATUS,C ; Clear carry
heinrichsweikamp
parents:
diff changeset
134 rrcf win_height,W ; And get height/2
heinrichsweikamp
parents:
diff changeset
135 subwf win_top,F ; top -= height/2
heinrichsweikamp
parents:
diff changeset
136 rrcf win_width+1,W ; Get 9th bit into carry
heinrichsweikamp
parents:
diff changeset
137 rrcf win_width+0,W ; Get width/2 (in 0..320 range)
heinrichsweikamp
parents:
diff changeset
138 bcf STATUS,C
heinrichsweikamp
parents:
diff changeset
139 rrcf WREG,W ; Get width/2 in 0..160 range
heinrichsweikamp
parents:
diff changeset
140 subwf win_leftx2,F ; left -= width/2
heinrichsweikamp
parents:
diff changeset
141
heinrichsweikamp
parents:
diff changeset
142 rcall TFT_box_write ; Inputs : win_top, win_leftx2, win_height, win_width(in 1..320 range)
heinrichsweikamp
parents:
diff changeset
143
heinrichsweikamp
parents:
diff changeset
144 ; Compute number of pixels to move (result on 17 bits !)
heinrichsweikamp
parents:
diff changeset
145 clrf TBLPTRU
heinrichsweikamp
parents:
diff changeset
146 movf win_width+0,W
heinrichsweikamp
parents:
diff changeset
147 mulwf win_height ; Result in PRODL:H
heinrichsweikamp
parents:
diff changeset
148 movf win_width+1,W
heinrichsweikamp
parents:
diff changeset
149 bz TFT_write_flash_image_1 ; width > 8bits ?
heinrichsweikamp
parents:
diff changeset
150 movf win_height,W ; YES: add extra
heinrichsweikamp
parents:
diff changeset
151 addwf PRODH,F
heinrichsweikamp
parents:
diff changeset
152 rlcf TBLPTRU ; And carry into upper register.
heinrichsweikamp
parents:
diff changeset
153 TFT_write_flash_image_1:
heinrichsweikamp
parents:
diff changeset
154 incf PRODH,F ; Pre-condition nested loops
heinrichsweikamp
parents:
diff changeset
155 incf TBLPTRU,F
heinrichsweikamp
parents:
diff changeset
156
heinrichsweikamp
parents:
diff changeset
157 ; Write pixels
heinrichsweikamp
parents:
diff changeset
158 Index_out 0x22 ; Frame Memory Data Write start
heinrichsweikamp
parents:
diff changeset
159 RS_H ; Data
heinrichsweikamp
parents:
diff changeset
160
heinrichsweikamp
parents:
diff changeset
161 TFT_write_flash_image_loop:
heinrichsweikamp
parents:
diff changeset
162 btfss SSP2STAT, BF ; Buffer full?
heinrichsweikamp
parents:
diff changeset
163 bra $-2 ; NO: wait...
heinrichsweikamp
parents:
diff changeset
164 movff SSP2BUF,PORTH ; Read lo
heinrichsweikamp
parents:
diff changeset
165 movwf SSP2BUF ; Write to buffer to initiate new read
heinrichsweikamp
parents:
diff changeset
166
heinrichsweikamp
parents:
diff changeset
167 btfss SSP2STAT, BF ; Buffer full?
heinrichsweikamp
parents:
diff changeset
168 bra $-2 ; NO: wait...
heinrichsweikamp
parents:
diff changeset
169 movff SSP2BUF,PORTA ; And read hi
heinrichsweikamp
parents:
diff changeset
170 movwf SSP2BUF ; Write to buffer to initiate new read
heinrichsweikamp
parents:
diff changeset
171 WR_L
heinrichsweikamp
parents:
diff changeset
172 WR_H ; Write 1 Pixel
heinrichsweikamp
parents:
diff changeset
173
heinrichsweikamp
parents:
diff changeset
174 decfsz PRODL,F
heinrichsweikamp
parents:
diff changeset
175 bra TFT_write_flash_image_loop
heinrichsweikamp
parents:
diff changeset
176 decfsz PRODH,F
heinrichsweikamp
parents:
diff changeset
177 bra TFT_write_flash_image_loop
heinrichsweikamp
parents:
diff changeset
178 decfsz TBLPTRU,F
heinrichsweikamp
parents:
diff changeset
179 bra TFT_write_flash_image_loop
heinrichsweikamp
parents:
diff changeset
180
heinrichsweikamp
parents:
diff changeset
181 btfss SSP2STAT, BF ; Buffer full?
heinrichsweikamp
parents:
diff changeset
182 bra $-2 ; No, wait
heinrichsweikamp
parents:
diff changeset
183 movf SSP2BUF,W ; Read dummy byte
heinrichsweikamp
parents:
diff changeset
184
heinrichsweikamp
parents:
diff changeset
185 bsf flash_ncs ; CS=1
heinrichsweikamp
parents:
diff changeset
186 movlw 0x00 ; NOP, to stop window mode
heinrichsweikamp
parents:
diff changeset
187 bra TFT_CmdWrite ; This routine "returns"
heinrichsweikamp
parents:
diff changeset
188
heinrichsweikamp
parents:
diff changeset
189 ;---- Draw a 4x4 red square in place of missing images...
heinrichsweikamp
parents:
diff changeset
190 TFT_write_flash_image_failed:
heinrichsweikamp
parents:
diff changeset
191 movlw -1
heinrichsweikamp
parents:
diff changeset
192 addwf win_leftx2,F
heinrichsweikamp
parents:
diff changeset
193 movlw -2
heinrichsweikamp
parents:
diff changeset
194 addwf win_top,F
heinrichsweikamp
parents:
diff changeset
195 movlw 2
heinrichsweikamp
parents:
diff changeset
196 movwf win_width+0
heinrichsweikamp
parents:
diff changeset
197 clrf win_width+1
heinrichsweikamp
parents:
diff changeset
198 movlw 4
heinrichsweikamp
parents:
diff changeset
199 movwf win_height
heinrichsweikamp
parents:
diff changeset
200 movlw color_red
heinrichsweikamp
parents:
diff changeset
201 rcall TFT_set_color
heinrichsweikamp
parents:
diff changeset
202 goto TFT_box
heinrichsweikamp
parents:
diff changeset
203
heinrichsweikamp
parents:
diff changeset
204 ;=============================================================================
heinrichsweikamp
parents:
diff changeset
205 ;
heinrichsweikamp
parents:
diff changeset
206
heinrichsweikamp
parents:
diff changeset
207 global TFT_CmdWrite
heinrichsweikamp
parents:
diff changeset
208 TFT_CmdWrite:
heinrichsweikamp
parents:
diff changeset
209 RS_L ; Command
heinrichsweikamp
parents:
diff changeset
210 clrf PORTA ; Upper
heinrichsweikamp
parents:
diff changeset
211 movwf PORTH ; Lower
heinrichsweikamp
parents:
diff changeset
212 WR_L
heinrichsweikamp
parents:
diff changeset
213 WR_H ; Tick
heinrichsweikamp
parents:
diff changeset
214 return;
heinrichsweikamp
parents:
diff changeset
215
heinrichsweikamp
parents:
diff changeset
216 global TFT_DataWrite
heinrichsweikamp
parents:
diff changeset
217 TFT_DataWrite:
heinrichsweikamp
parents:
diff changeset
218 RS_H ; Data
heinrichsweikamp
parents:
diff changeset
219 movwf PORTH ; Lower
heinrichsweikamp
parents:
diff changeset
220 WR_L
heinrichsweikamp
parents:
diff changeset
221 WR_H ; Tick
heinrichsweikamp
parents:
diff changeset
222 return
heinrichsweikamp
parents:
diff changeset
223
heinrichsweikamp
parents:
diff changeset
224 ;=============================================================================
heinrichsweikamp
parents:
diff changeset
225 ;
heinrichsweikamp
parents:
diff changeset
226 global TFT_ClearScreen
heinrichsweikamp
parents:
diff changeset
227 TFT_ClearScreen:
heinrichsweikamp
parents:
diff changeset
228 Index_out 0x50 ; Window Horizontal Start Address
heinrichsweikamp
parents:
diff changeset
229 Parameter_out 0x00, 0x00 ; 0-239
heinrichsweikamp
parents:
diff changeset
230 Index_out 0x51 ; Window Horizontal End Address
heinrichsweikamp
parents:
diff changeset
231 Parameter_out 0x00, 0xEF ; 0-239
heinrichsweikamp
parents:
diff changeset
232 Index_out 0x52 ; Window Vertical Start Address
heinrichsweikamp
parents:
diff changeset
233 Parameter_out 0x00, 0x00 ; 0-319
heinrichsweikamp
parents:
diff changeset
234 Index_out 0x53 ; Window Vertical End Address
heinrichsweikamp
parents:
diff changeset
235 Parameter_out 0x01, 0x3F ; 0-319
heinrichsweikamp
parents:
diff changeset
236 Index_out 0x20 ; Frame Memory Horizontal Address
heinrichsweikamp
parents:
diff changeset
237 Parameter_out 0x00, 0x00 ; 0-239
heinrichsweikamp
parents:
diff changeset
238 Index_out 0x21 ; Frame Memory Vertical Address
heinrichsweikamp
parents:
diff changeset
239 Parameter_out 0x01, 0x3F ; 0-319
heinrichsweikamp
parents:
diff changeset
240
heinrichsweikamp
parents:
diff changeset
241 Index_out 0x22 ; Frame Memory Data Write start
heinrichsweikamp
parents:
diff changeset
242
heinrichsweikamp
parents:
diff changeset
243 RD_H ; Not Read
heinrichsweikamp
parents:
diff changeset
244 RS_H ; Data
heinrichsweikamp
parents:
diff changeset
245 NCS_L ; Not CS
heinrichsweikamp
parents:
diff changeset
246 clrf PORTA ; Data Upper
heinrichsweikamp
parents:
diff changeset
247 clrf PORTH ; Data Lower
heinrichsweikamp
parents:
diff changeset
248
heinrichsweikamp
parents:
diff changeset
249 movlw d'10'
heinrichsweikamp
parents:
diff changeset
250 movwf tft_temp3
heinrichsweikamp
parents:
diff changeset
251 TFT_ClearScreen2:
heinrichsweikamp
parents:
diff changeset
252 movlw d'30'
heinrichsweikamp
parents:
diff changeset
253 movwf tft_temp2
heinrichsweikamp
parents:
diff changeset
254 TFT_ClearScreen3:
heinrichsweikamp
parents:
diff changeset
255 clrf tft_temp1 ; 30*10*256=76800 Pixels -> Clear complete 240*320
heinrichsweikamp
parents:
diff changeset
256 TFT_ClearScreen4:
heinrichsweikamp
parents:
diff changeset
257 WR_L
heinrichsweikamp
parents:
diff changeset
258 WR_H ; Tick
heinrichsweikamp
parents:
diff changeset
259 decfsz tft_temp1,F
heinrichsweikamp
parents:
diff changeset
260 bra TFT_ClearScreen4
heinrichsweikamp
parents:
diff changeset
261 decfsz tft_temp2,F
heinrichsweikamp
parents:
diff changeset
262 bra TFT_ClearScreen3
heinrichsweikamp
parents:
diff changeset
263 decfsz tft_temp3,F
heinrichsweikamp
parents:
diff changeset
264 bra TFT_ClearScreen2
heinrichsweikamp
parents:
diff changeset
265 return
heinrichsweikamp
parents:
diff changeset
266
heinrichsweikamp
parents:
diff changeset
267 ;=============================================================================
heinrichsweikamp
parents:
diff changeset
268 ;
heinrichsweikamp
parents:
diff changeset
269 global TFT_DisplayOff
heinrichsweikamp
parents:
diff changeset
270 TFT_DisplayOff:
heinrichsweikamp
parents:
diff changeset
271 clrf CCPR1L ; PWM OFF
heinrichsweikamp
parents:
diff changeset
272 clrf PORTA
heinrichsweikamp
parents:
diff changeset
273 clrf PORTH
heinrichsweikamp
parents:
diff changeset
274 RD_L ; LOW
heinrichsweikamp
parents:
diff changeset
275 nop
heinrichsweikamp
parents:
diff changeset
276 RS_L ; LOW
heinrichsweikamp
parents:
diff changeset
277 bcf tft_nwr
heinrichsweikamp
parents:
diff changeset
278 nop
heinrichsweikamp
parents:
diff changeset
279 bcf tft_cs
heinrichsweikamp
parents:
diff changeset
280 nop
heinrichsweikamp
parents:
diff changeset
281 bcf tft_nreset
heinrichsweikamp
parents:
diff changeset
282 WAITMS d'1'
heinrichsweikamp
parents:
diff changeset
283 bsf tft_power ; inverted...
heinrichsweikamp
parents:
diff changeset
284 bcf lightsen_power ; power-down light sensor
heinrichsweikamp
parents:
diff changeset
285 return
heinrichsweikamp
parents:
diff changeset
286
heinrichsweikamp
parents:
diff changeset
287 ; -----------------------------
heinrichsweikamp
parents:
diff changeset
288 ; TFT boot
heinrichsweikamp
parents:
diff changeset
289 ; -----------------------------
heinrichsweikamp
parents:
diff changeset
290 global TFT_boot
heinrichsweikamp
parents:
diff changeset
291 TFT_boot:
heinrichsweikamp
parents:
diff changeset
292 clrf PORTA
heinrichsweikamp
parents:
diff changeset
293 clrf PORTH
heinrichsweikamp
parents:
diff changeset
294 RD_L ; LOW
heinrichsweikamp
parents:
diff changeset
295 bcf tft_nwr
heinrichsweikamp
parents:
diff changeset
296 nop
heinrichsweikamp
parents:
diff changeset
297 bcf tft_cs
heinrichsweikamp
parents:
diff changeset
298 nop
heinrichsweikamp
parents:
diff changeset
299 bcf tft_nreset
heinrichsweikamp
parents:
diff changeset
300 WAITMS d'1'
heinrichsweikamp
parents:
diff changeset
301 bcf tft_power ; inverted...
heinrichsweikamp
parents:
diff changeset
302 WAITMS d'1'
heinrichsweikamp
parents:
diff changeset
303
heinrichsweikamp
parents:
diff changeset
304 RD_H ; Keep high
heinrichsweikamp
parents:
diff changeset
305 WR_H ;
heinrichsweikamp
parents:
diff changeset
306 NCS_L ; Not CS
heinrichsweikamp
parents:
diff changeset
307
heinrichsweikamp
parents:
diff changeset
308 WAITMS d'2'
heinrichsweikamp
parents:
diff changeset
309 bsf tft_nreset
heinrichsweikamp
parents:
diff changeset
310 WAITMS d'150'
heinrichsweikamp
parents:
diff changeset
311 bsf lightsen_power ; Supply power to light sensor
heinrichsweikamp
parents:
diff changeset
312
heinrichsweikamp
parents:
diff changeset
313 ; Data Transfer Synchronization
heinrichsweikamp
parents:
diff changeset
314 Parameter_out 0x00, 0x00
heinrichsweikamp
parents:
diff changeset
315 Parameter_out 0x00, 0x00
heinrichsweikamp
parents:
diff changeset
316
heinrichsweikamp
parents:
diff changeset
317 ; Init through config table...
heinrichsweikamp
parents:
diff changeset
318 movlw LOW display0_config_table
heinrichsweikamp
parents:
diff changeset
319 movwf TBLPTRL
heinrichsweikamp
parents:
diff changeset
320 movlw HIGH display0_config_table
heinrichsweikamp
parents:
diff changeset
321 movwf TBLPTRH
heinrichsweikamp
parents:
diff changeset
322 movlw UPPER display0_config_table
heinrichsweikamp
parents:
diff changeset
323 movwf TBLPTRU
heinrichsweikamp
parents:
diff changeset
324 rcall display0_init_loop
heinrichsweikamp
parents:
diff changeset
325
heinrichsweikamp
parents:
diff changeset
326 Index_out 0x22
heinrichsweikamp
parents:
diff changeset
327 ; WAITMS d'81' ; 46
heinrichsweikamp
parents:
diff changeset
328 call TFT_ClearScreen
heinrichsweikamp
parents:
diff changeset
329 Index_out 0x07
heinrichsweikamp
parents:
diff changeset
330 Parameter_out 0x01, 0x00
heinrichsweikamp
parents:
diff changeset
331 return
heinrichsweikamp
parents:
diff changeset
332
heinrichsweikamp
parents:
diff changeset
333
heinrichsweikamp
parents:
diff changeset
334 display0_config_table:
heinrichsweikamp
parents:
diff changeset
335 ; Reg, Dat0, Dat1 or 0xFF,0x00,0x00 for end
heinrichsweikamp
parents:
diff changeset
336 db 0xA4,0x00,0x01,0xFF,.002,0x00
heinrichsweikamp
parents:
diff changeset
337 db 0x09,0x00,0x01,0x92,0x04,0x00
heinrichsweikamp
parents:
diff changeset
338 db 0x93,0x04,0x02,0x94,0x00,0x02
heinrichsweikamp
parents:
diff changeset
339 db 0x07,0x00,0x00,0x10,0x04,0x30
heinrichsweikamp
parents:
diff changeset
340 db 0x11,0x02,0x37,0x12,0x11,0x8D
heinrichsweikamp
parents:
diff changeset
341 db 0x13,0x11,0x00,0x01,0x01,0x00
heinrichsweikamp
parents:
diff changeset
342 db 0x02,0x02,0x00,0x03,0x50,0x20
heinrichsweikamp
parents:
diff changeset
343 db 0x0A,0x00,0x08,0x0D,0x00,0x00
heinrichsweikamp
parents:
diff changeset
344 db 0x0E,0x00,0x30,0xFF,.151,0x00
heinrichsweikamp
parents:
diff changeset
345 db 0x12,0x11,0xBD,0x20,0x00,0x00
heinrichsweikamp
parents:
diff changeset
346 db 0x21,0x00,0x00,0x30,0x06,0x02
heinrichsweikamp
parents:
diff changeset
347 db 0x31,0x56,0x0D,0x32,0x05,0x07
heinrichsweikamp
parents:
diff changeset
348 db 0x33,0x06,0x09,0x34,0x00,0x00
heinrichsweikamp
parents:
diff changeset
349 db 0x35,0x09,0x06,0x36,0x57,0x05
heinrichsweikamp
parents:
diff changeset
350 db 0x37,0x0D,0x06,0x38,0x02,0x06
heinrichsweikamp
parents:
diff changeset
351 db 0x39,0x00,0x00,0xFF,0x00,0x00
heinrichsweikamp
parents:
diff changeset
352
heinrichsweikamp
parents:
diff changeset
353 display0_init_loop:
heinrichsweikamp
parents:
diff changeset
354 TBLRD*+
heinrichsweikamp
parents:
diff changeset
355 movlw 0xFF
heinrichsweikamp
parents:
diff changeset
356 cpfseq TABLAT
heinrichsweikamp
parents:
diff changeset
357 bra display0_config_write ; Write Config pair to Display
heinrichsweikamp
parents:
diff changeset
358 ; Delay ms or quit (return)
heinrichsweikamp
parents:
diff changeset
359 TBLRD*+
heinrichsweikamp
parents:
diff changeset
360 tstfsz TABLAT ; End of config?
heinrichsweikamp
parents:
diff changeset
361 bra $+4 ; No
heinrichsweikamp
parents:
diff changeset
362 return ; Done.
heinrichsweikamp
parents:
diff changeset
363 movf TABLAT,W
heinrichsweikamp
parents:
diff changeset
364 call WAITMSX ; Wait WREG milliseconds
heinrichsweikamp
parents:
diff changeset
365 TBLRD*+ ; Dummy read (Third byte of delay command)
heinrichsweikamp
parents:
diff changeset
366 bra display0_init_loop ; Loop
heinrichsweikamp
parents:
diff changeset
367
heinrichsweikamp
parents:
diff changeset
368 display0_config_write: ; With command in WREG
heinrichsweikamp
parents:
diff changeset
369 movf TABLAT,W
heinrichsweikamp
parents:
diff changeset
370 rcall TFT_CmdWrite ; Write command
heinrichsweikamp
parents:
diff changeset
371 TBLRD*+ ; Get config0
heinrichsweikamp
parents:
diff changeset
372 movff TABLAT,PORTA
heinrichsweikamp
parents:
diff changeset
373 TBLRD*+ ; Get config1
heinrichsweikamp
parents:
diff changeset
374 movf TABLAT,W
heinrichsweikamp
parents:
diff changeset
375 rcall TFT_DataWrite ; Write config
heinrichsweikamp
parents:
diff changeset
376 bra display0_init_loop ; Loop
heinrichsweikamp
parents:
diff changeset
377
heinrichsweikamp
parents:
diff changeset
378
heinrichsweikamp
parents:
diff changeset
379 ;=============================================================================
heinrichsweikamp
parents:
diff changeset
380 ; Smooth lighting-up of the display:
heinrichsweikamp
parents:
diff changeset
381 ;
heinrichsweikamp
parents:
diff changeset
382 ; Trashes: WREG, PRODL
heinrichsweikamp
parents:
diff changeset
383 ; Typical usage:
heinrichsweikamp
parents:
diff changeset
384 ; clrf CCPR1L ; Backlight off
heinrichsweikamp
parents:
diff changeset
385 ; [draw splash screen]
heinrichsweikamp
parents:
diff changeset
386 ; call TFT_DisplayFadeIn
heinrichsweikamp
parents:
diff changeset
387 ;
heinrichsweikamp
parents:
diff changeset
388 global TFT_Display_FadeIn
heinrichsweikamp
parents:
diff changeset
389 TFT_Display_FadeIn:
heinrichsweikamp
parents:
diff changeset
390 movlw CCP1CON_VALUE ; See ostc3.inc
heinrichsweikamp
parents:
diff changeset
391 movwf CCP1CON
heinrichsweikamp
parents:
diff changeset
392 bsf tft_is_dimming ; TFT is dimming, ignore ambient sensor!
heinrichsweikamp
parents:
diff changeset
393 clrf CCPR1L ; Backlight off - to be sure
heinrichsweikamp
parents:
diff changeset
394 movff max_CCPR1L,PRODL
heinrichsweikamp
parents:
diff changeset
395 TFT_Display_FadeIn_0:
heinrichsweikamp
parents:
diff changeset
396 incf CCPR1L,F ; Duty cycle
heinrichsweikamp
parents:
diff changeset
397 WAITMS d'2'
heinrichsweikamp
parents:
diff changeset
398 decfsz PRODL,F
heinrichsweikamp
parents:
diff changeset
399 bra TFT_Display_FadeIn_0
heinrichsweikamp
parents:
diff changeset
400 bcf tft_is_dimming ; dimming done.
heinrichsweikamp
parents:
diff changeset
401 return
heinrichsweikamp
parents:
diff changeset
402
heinrichsweikamp
parents:
diff changeset
403 ;=============================================================================
heinrichsweikamp
parents:
diff changeset
404 ; Smooth lighting-off of the display:
heinrichsweikamp
parents:
diff changeset
405 ; Trashes: WREG, PRODL
heinrichsweikamp
parents:
diff changeset
406 global TFT_Display_FadeOut
heinrichsweikamp
parents:
diff changeset
407 TFT_Display_FadeOut:
heinrichsweikamp
parents:
diff changeset
408 movff max_CCPR1L,PRODL
heinrichsweikamp
parents:
diff changeset
409 bsf tft_is_dimming ; TFT is dimming, ignore ambient sensor!
heinrichsweikamp
parents:
diff changeset
410 TFT_Display_FadeOut_0:
heinrichsweikamp
parents:
diff changeset
411 movff PRODL,CCPR1L ; Duty cycle
heinrichsweikamp
parents:
diff changeset
412 WAITMS d'1'
heinrichsweikamp
parents:
diff changeset
413 decfsz PRODL,F
heinrichsweikamp
parents:
diff changeset
414 bra TFT_Display_FadeOut_0
heinrichsweikamp
parents:
diff changeset
415 clrf CCPR1L
heinrichsweikamp
parents:
diff changeset
416 return
heinrichsweikamp
parents:
diff changeset
417
heinrichsweikamp
parents:
diff changeset
418 ;=============================================================================
heinrichsweikamp
parents:
diff changeset
419
heinrichsweikamp
parents:
diff changeset
420 start_common:
heinrichsweikamp
parents:
diff changeset
421 VARARGS_BEGIN
heinrichsweikamp
parents:
diff changeset
422 VARARGS_GET8 win_leftx2
heinrichsweikamp
parents:
diff changeset
423 VARARGS_GET8 win_top
heinrichsweikamp
parents:
diff changeset
424 VARARGS_END
heinrichsweikamp
parents:
diff changeset
425 return
heinrichsweikamp
parents:
diff changeset
426
heinrichsweikamp
parents:
diff changeset
427 ;=============================================================================
heinrichsweikamp
parents:
diff changeset
428
heinrichsweikamp
parents:
diff changeset
429 global box_std_block, box_black_block, box_color_block
heinrichsweikamp
parents:
diff changeset
430
heinrichsweikamp
parents:
diff changeset
431 box_std_block: ; Use white color
heinrichsweikamp
parents:
diff changeset
432 setf WREG
heinrichsweikamp
parents:
diff changeset
433 bra box_common
heinrichsweikamp
parents:
diff changeset
434 box_black_block: ; Use black color
heinrichsweikamp
parents:
diff changeset
435 clrf WREG
heinrichsweikamp
parents:
diff changeset
436 box_common:
heinrichsweikamp
parents:
diff changeset
437 box_color_block:
heinrichsweikamp
parents:
diff changeset
438 rcall TFT_set_color
heinrichsweikamp
parents:
diff changeset
439 VARARGS_BEGIN
heinrichsweikamp
parents:
diff changeset
440 VARARGS_GET8 win_top
heinrichsweikamp
parents:
diff changeset
441 VARARGS_GET8 win_height
heinrichsweikamp
parents:
diff changeset
442 VARARGS_GET8 win_leftx2
heinrichsweikamp
parents:
diff changeset
443 VARARGS_GET8 win_width
heinrichsweikamp
parents:
diff changeset
444 VARARGS_END
heinrichsweikamp
parents:
diff changeset
445 bra TFT_box
heinrichsweikamp
parents:
diff changeset
446
heinrichsweikamp
parents:
diff changeset
447 ;-----------------------------------------------------------------------------
heinrichsweikamp
parents:
diff changeset
448
heinrichsweikamp
parents:
diff changeset
449 global box_frame_std, box_frame_common, box_frame_color, box_frame_color16
heinrichsweikamp
parents:
diff changeset
450
heinrichsweikamp
parents:
diff changeset
451 box_frame_std:
heinrichsweikamp
parents:
diff changeset
452 setf WREG
heinrichsweikamp
parents:
diff changeset
453 rcall TFT_set_color
heinrichsweikamp
parents:
diff changeset
454
heinrichsweikamp
parents:
diff changeset
455 box_frame_common:
heinrichsweikamp
parents:
diff changeset
456 VARARGS_BEGIN
heinrichsweikamp
parents:
diff changeset
457 VARARGS_GET8 win_top
heinrichsweikamp
parents:
diff changeset
458 VARARGS_GET8 win_height
heinrichsweikamp
parents:
diff changeset
459 VARARGS_GET8 win_leftx2
heinrichsweikamp
parents:
diff changeset
460 VARARGS_GET8 win_width
heinrichsweikamp
parents:
diff changeset
461 VARARGS_END
heinrichsweikamp
parents:
diff changeset
462 bra TFT_frame
heinrichsweikamp
parents:
diff changeset
463
heinrichsweikamp
parents:
diff changeset
464 box_frame_color:
heinrichsweikamp
parents:
diff changeset
465 rcall TFT_set_color
heinrichsweikamp
parents:
diff changeset
466 box_frame_color16:
heinrichsweikamp
parents:
diff changeset
467 bra box_frame_common
heinrichsweikamp
parents:
diff changeset
468
heinrichsweikamp
parents:
diff changeset
469 ;=============================================================================
heinrichsweikamp
parents:
diff changeset
470 ; Init for half_pixel_write
heinrichsweikamp
parents:
diff changeset
471 ; Set column register on TFT device, and current color.
heinrichsweikamp
parents:
diff changeset
472 ; Inputs: win_leftx2
heinrichsweikamp
parents:
diff changeset
473 ; Outputs: win_color:2
heinrichsweikamp
parents:
diff changeset
474 ; Trashed: WREG, PROD
heinrichsweikamp
parents:
diff changeset
475 global init_pixel_write
heinrichsweikamp
parents:
diff changeset
476 init_pixel_write:
heinrichsweikamp
parents:
diff changeset
477 movff win_leftx2,WREG
heinrichsweikamp
parents:
diff changeset
478 mullw 2
heinrichsweikamp
parents:
diff changeset
479 rcall pixel_write_col320 ; Start Address Vertical (.0 - .319)
heinrichsweikamp
parents:
diff changeset
480 setf WREG
heinrichsweikamp
parents:
diff changeset
481 bra TFT_set_color
heinrichsweikamp
parents:
diff changeset
482
heinrichsweikamp
parents:
diff changeset
483 ;-----------------------------------------------------------------------------
heinrichsweikamp
parents:
diff changeset
484 ; Writes two half-pixels at position (win_top,win_leftx2)
heinrichsweikamp
parents:
diff changeset
485 ; Inputs: win_leftx2, win_top, win_color:2
heinrichsweikamp
parents:
diff changeset
486 ; Trashed: WREG, PROD
heinrichsweikamp
parents:
diff changeset
487 global pixel_write
heinrichsweikamp
parents:
diff changeset
488 pixel_write:
heinrichsweikamp
parents:
diff changeset
489 movff win_leftx2,WREG
heinrichsweikamp
parents:
diff changeset
490 mullw 2 ; win_leftx2 x 2 -> PRODH:PRODL
heinrichsweikamp
parents:
diff changeset
491 rcall pixel_write_col320 ; Start Address Vertical (.0 - .319)
heinrichsweikamp
parents:
diff changeset
492 rcall half_pixel_write ; Write this half-one.
heinrichsweikamp
parents:
diff changeset
493
heinrichsweikamp
parents:
diff changeset
494 movff win_leftx2,WREG ; Address of next one
heinrichsweikamp
parents:
diff changeset
495 mullw 2
heinrichsweikamp
parents:
diff changeset
496 infsnz PRODL ; +1
heinrichsweikamp
parents:
diff changeset
497 incf PRODH
heinrichsweikamp
parents:
diff changeset
498 rcall pixel_write_col320
heinrichsweikamp
parents:
diff changeset
499 bra half_pixel_write ; Note: Cmd 0x20 is mandatory, because
heinrichsweikamp
parents:
diff changeset
500 ; of the autoincrement going vertical
heinrichsweikamp
parents:
diff changeset
501
heinrichsweikamp
parents:
diff changeset
502 global pixel_write_col320
heinrichsweikamp
parents:
diff changeset
503 pixel_write_col320:
heinrichsweikamp
parents:
diff changeset
504 Index_out 0x21 ; Frame Memory Vertical Address
heinrichsweikamp
parents:
diff changeset
505 bra TFT_DataWrite_PROD
heinrichsweikamp
parents:
diff changeset
506
heinrichsweikamp
parents:
diff changeset
507 ;-----------------------------------------------------------------------------
heinrichsweikamp
parents:
diff changeset
508 ; Writes one half-pixel at position (win_top,win_leftx2).
heinrichsweikamp
parents:
diff changeset
509 ; Inputs: win_leftx2, win_top, win_color:2
heinrichsweikamp
parents:
diff changeset
510 ; Trashed: WREG, PROD
heinrichsweikamp
parents:
diff changeset
511 global half_pixel_write
heinrichsweikamp
parents:
diff changeset
512 half_pixel_write:
heinrichsweikamp
parents:
diff changeset
513 movff win_top,WREG ; d'0' ... d'239'
heinrichsweikamp
parents:
diff changeset
514 ; Variant with Y position in WREG.
heinrichsweikamp
parents:
diff changeset
515 half_pixel_write_1:
heinrichsweikamp
parents:
diff changeset
516 sublw .239 ; 239-Y --> Y
heinrichsweikamp
parents:
diff changeset
517
heinrichsweikamp
parents:
diff changeset
518 mullw 1 ; Copy row to PRODH:L
heinrichsweikamp
parents:
diff changeset
519 Index_out 0x20 ; Frame Memory Horizontal Address
heinrichsweikamp
parents:
diff changeset
520 rcall TFT_DataWrite_PROD
heinrichsweikamp
parents:
diff changeset
521
heinrichsweikamp
parents:
diff changeset
522 Index_out 0x22 ; Frame Memory Data Write start
heinrichsweikamp
parents:
diff changeset
523 RS_H ; Data
heinrichsweikamp
parents:
diff changeset
524 movff win_color1,PORTA ; Upper
heinrichsweikamp
parents:
diff changeset
525 movff win_color2,PORTH ; Lower
heinrichsweikamp
parents:
diff changeset
526 WR_L
heinrichsweikamp
parents:
diff changeset
527 WR_H ; Tick
heinrichsweikamp
parents:
diff changeset
528 return
heinrichsweikamp
parents:
diff changeset
529
heinrichsweikamp
parents:
diff changeset
530 ;-----------------------------------------------------------------------------
heinrichsweikamp
parents:
diff changeset
531 ; Writes a vertical line of half-pixel at position (win_top,win_leftx2,win_height).
heinrichsweikamp
parents:
diff changeset
532 ; Inputs: win_leftx2, win_top, win_height, win_color:2
heinrichsweikamp
parents:
diff changeset
533 ; Trashed: WREG, PROD, TABLAT, TBLPTRL
heinrichsweikamp
parents:
diff changeset
534 global half_vertical_line
heinrichsweikamp
parents:
diff changeset
535 half_vertical_line:
heinrichsweikamp
parents:
diff changeset
536 clrf TABLAT ; Loop index.
heinrichsweikamp
parents:
diff changeset
537
heinrichsweikamp
parents:
diff changeset
538 half_vertical_line_loop:
heinrichsweikamp
parents:
diff changeset
539 movff win_leftx2,WREG ; Init X position.
heinrichsweikamp
parents:
diff changeset
540 mullw 2
heinrichsweikamp
parents:
diff changeset
541 movf TABLAT,W ; Get loop index
heinrichsweikamp
parents:
diff changeset
542 andlw 1 ; Just low bit
heinrichsweikamp
parents:
diff changeset
543 xorwf PRODL,F ; And use it to jitter current X position
heinrichsweikamp
parents:
diff changeset
544 rcall pixel_write_col320 ; Start Address Vertical (.0 - .319)
heinrichsweikamp
parents:
diff changeset
545
heinrichsweikamp
parents:
diff changeset
546 movff win_height,WREG ; Index reached height (Bank0 read) ?
heinrichsweikamp
parents:
diff changeset
547 xorwf TABLAT,W
heinrichsweikamp
parents:
diff changeset
548 btfsc STATUS,Z ; Equals ?
heinrichsweikamp
parents:
diff changeset
549 return ; Yes: done.
heinrichsweikamp
parents:
diff changeset
550 movff win_top,WREG ; Y = top + index (Bank0 read)
heinrichsweikamp
parents:
diff changeset
551 addwf TABLAT,W
heinrichsweikamp
parents:
diff changeset
552 rcall half_pixel_write_1
heinrichsweikamp
parents:
diff changeset
553 incf TABLAT,F ; index++
heinrichsweikamp
parents:
diff changeset
554 bra half_vertical_line_loop
heinrichsweikamp
parents:
diff changeset
555
heinrichsweikamp
parents:
diff changeset
556 ;-----------------------------------------------------------------------------
heinrichsweikamp
parents:
diff changeset
557 ; Writes a horizontal line of half-pixel at position (win_top,win_leftx2,win_width).
heinrichsweikamp
parents:
diff changeset
558 ; Inputs: win_leftx2, win_top, win_width, win_color:2
heinrichsweikamp
parents:
diff changeset
559 ; Trashed: WREG, PROD, TABLAT, TBLPTRL
heinrichsweikamp
parents:
diff changeset
560 global half_horizontal_line
heinrichsweikamp
parents:
diff changeset
561 half_horizontal_line:
heinrichsweikamp
parents:
diff changeset
562 clrf TABLAT ; Loop index.
heinrichsweikamp
parents:
diff changeset
563
heinrichsweikamp
parents:
diff changeset
564 half_horizontal_line_loop:
heinrichsweikamp
parents:
diff changeset
565 movff win_leftx2,WREG ; Init X position.
heinrichsweikamp
parents:
diff changeset
566 mullw 2
heinrichsweikamp
parents:
diff changeset
567 rcall pixel_write_col320 ; Start Address Vertical (.0 - .319)
heinrichsweikamp
parents:
diff changeset
568 movff win_width,WREG ; Index reached height (Bank0 read) ?
heinrichsweikamp
parents:
diff changeset
569 xorwf TABLAT,W
heinrichsweikamp
parents:
diff changeset
570 btfsc STATUS,Z ; Equals ?
heinrichsweikamp
parents:
diff changeset
571 return ; Yes: done.
heinrichsweikamp
parents:
diff changeset
572 movff win_top,WREG ; Y = top + index (Bank0 read)
heinrichsweikamp
parents:
diff changeset
573 addwf TABLAT,W
heinrichsweikamp
parents:
diff changeset
574 rcall half_pixel_write_1
heinrichsweikamp
parents:
diff changeset
575 incf TABLAT,F ; index++
heinrichsweikamp
parents:
diff changeset
576 bra half_horizontal_line_loop
heinrichsweikamp
parents:
diff changeset
577
heinrichsweikamp
parents:
diff changeset
578
heinrichsweikamp
parents:
diff changeset
579 ;-----------------------------------------------------------------------------
heinrichsweikamp
parents:
diff changeset
580 ; TFT Data Cmd via W
heinrichsweikamp
parents:
diff changeset
581 ;
heinrichsweikamp
parents:
diff changeset
582 global TFT_DataWrite_PROD
heinrichsweikamp
parents:
diff changeset
583 TFT_DataWrite_PROD:
heinrichsweikamp
parents:
diff changeset
584 ; RD_H ; Keep high
heinrichsweikamp
parents:
diff changeset
585 RS_H ; Data
heinrichsweikamp
parents:
diff changeset
586 movff PRODH,PORTA ; Move high byte to PORTA
heinrichsweikamp
parents:
diff changeset
587 movff PRODL,PORTH ; Move low byte to PORTH
heinrichsweikamp
parents:
diff changeset
588 WR_L
heinrichsweikamp
parents:
diff changeset
589 WR_H ; Tick
heinrichsweikamp
parents:
diff changeset
590 return
heinrichsweikamp
parents:
diff changeset
591
heinrichsweikamp
parents:
diff changeset
592 TFT_DataRead_PROD:
heinrichsweikamp
parents:
diff changeset
593 Index_out 0x22 ; Frame Memory Data Read start
heinrichsweikamp
parents:
diff changeset
594 setf TRISA ; PortA as input.
heinrichsweikamp
parents:
diff changeset
595 setf TRISH ; PortH as input.
heinrichsweikamp
parents:
diff changeset
596 RS_H ; Data
heinrichsweikamp
parents:
diff changeset
597 WR_H ; Not write
heinrichsweikamp
parents:
diff changeset
598 RD_L ; Read!
heinrichsweikamp
parents:
diff changeset
599 nop
heinrichsweikamp
parents:
diff changeset
600 nop
heinrichsweikamp
parents:
diff changeset
601 nop
heinrichsweikamp
parents:
diff changeset
602 RD_H ; Tick
heinrichsweikamp
parents:
diff changeset
603 nop
heinrichsweikamp
parents:
diff changeset
604 RD_L ; Read!
heinrichsweikamp
parents:
diff changeset
605 nop
heinrichsweikamp
parents:
diff changeset
606 nop
heinrichsweikamp
parents:
diff changeset
607 nop
heinrichsweikamp
parents:
diff changeset
608 movff PORTA,PRODH
heinrichsweikamp
parents:
diff changeset
609 movff PORTH,PRODL
heinrichsweikamp
parents:
diff changeset
610 RD_H ; Tick
heinrichsweikamp
parents:
diff changeset
611 nop
heinrichsweikamp
parents:
diff changeset
612 clrf TRISA ; PortA as output
heinrichsweikamp
parents:
diff changeset
613 clrf TRISH ; PortH as output
heinrichsweikamp
parents:
diff changeset
614 return
heinrichsweikamp
parents:
diff changeset
615
heinrichsweikamp
parents:
diff changeset
616
heinrichsweikamp
parents:
diff changeset
617
heinrichsweikamp
parents:
diff changeset
618 ;=============================================================================
heinrichsweikamp
parents:
diff changeset
619 ; Output TFT Window Address commands.
heinrichsweikamp
parents:
diff changeset
620 ; Inputs : win_top, win_leftx2, win_height, win_width.
heinrichsweikamp
parents:
diff changeset
621 ; Output : PortA/PortH commands.
heinrichsweikamp
parents:
diff changeset
622 ; Trashed: PROD
heinrichsweikamp
parents:
diff changeset
623 ;
heinrichsweikamp
parents:
diff changeset
624 global TFT_box_write
heinrichsweikamp
parents:
diff changeset
625 TFT_box_write:
heinrichsweikamp
parents:
diff changeset
626 movff win_leftx2,WREG ; Compute left = 2*leftx2 --> PROD
heinrichsweikamp
parents:
diff changeset
627 mullw 2
heinrichsweikamp
parents:
diff changeset
628
heinrichsweikamp
parents:
diff changeset
629 ;---- Normal horizontal window ---------------------------------------
heinrichsweikamp
parents:
diff changeset
630 ; Output 0x35 left,
heinrichsweikamp
parents:
diff changeset
631 ; 0x36 right == left + width - 1.
heinrichsweikamp
parents:
diff changeset
632
heinrichsweikamp
parents:
diff changeset
633 Index_out 0x52 ; Window Vertical Start Address
heinrichsweikamp
parents:
diff changeset
634 rcall TFT_DataWrite_PROD ; Output left
heinrichsweikamp
parents:
diff changeset
635 Index_out 0x21 ; Frame Memory Vertical Address
heinrichsweikamp
parents:
diff changeset
636 rcall TFT_DataWrite_PROD ; Output left
heinrichsweikamp
parents:
diff changeset
637
heinrichsweikamp
parents:
diff changeset
638 movff win_width+0,WREG ; right = left + width - 1
heinrichsweikamp
parents:
diff changeset
639 addwf PRODL,F
heinrichsweikamp
parents:
diff changeset
640 movff win_width+1,WREG
heinrichsweikamp
parents:
diff changeset
641 addwfc PRODH,F
heinrichsweikamp
parents:
diff changeset
642 decf PRODL,F ; decrement result
heinrichsweikamp
parents:
diff changeset
643 btfss STATUS,C
heinrichsweikamp
parents:
diff changeset
644 decf PRODH,F
heinrichsweikamp
parents:
diff changeset
645
heinrichsweikamp
parents:
diff changeset
646 Index_out 0x53 ; Window Vertical End Address
heinrichsweikamp
parents:
diff changeset
647 rcall TFT_DataWrite_PROD
heinrichsweikamp
parents:
diff changeset
648
heinrichsweikamp
parents:
diff changeset
649 ;---- Flipped vertical window ----------------------------------------
heinrichsweikamp
parents:
diff changeset
650 ; Output 0x37 flipped(bottom) = 239-bottom = 240 - top - height
heinrichsweikamp
parents:
diff changeset
651 ; flipped(top) = 239-top
heinrichsweikamp
parents:
diff changeset
652 TFT_box_flip_V:
heinrichsweikamp
parents:
diff changeset
653 movff win_top,PRODL
heinrichsweikamp
parents:
diff changeset
654 movff win_height,WREG
heinrichsweikamp
parents:
diff changeset
655 addwf PRODL,W
heinrichsweikamp
parents:
diff changeset
656 sublw .240 ; 240 - top - height
heinrichsweikamp
parents:
diff changeset
657 movwf PRODH ; First byte
heinrichsweikamp
parents:
diff changeset
658
heinrichsweikamp
parents:
diff changeset
659 movf PRODL,W
heinrichsweikamp
parents:
diff changeset
660 sublw .239 ; 249-top
heinrichsweikamp
parents:
diff changeset
661 movwf PRODL ; --> second byte.
heinrichsweikamp
parents:
diff changeset
662
heinrichsweikamp
parents:
diff changeset
663 Index_out 0x50 ; Window Horizontal Start Address
heinrichsweikamp
parents:
diff changeset
664 clrf PORTA ; Upper
heinrichsweikamp
parents:
diff changeset
665 movf PRODH,W
heinrichsweikamp
parents:
diff changeset
666 rcall TFT_DataWrite ; Lower (and tick)
heinrichsweikamp
parents:
diff changeset
667
heinrichsweikamp
parents:
diff changeset
668 Index_out 0x51 ; Window Horizontal End Address
heinrichsweikamp
parents:
diff changeset
669 clrf PORTA ; Upper
heinrichsweikamp
parents:
diff changeset
670 movf PRODL,W
heinrichsweikamp
parents:
diff changeset
671 rcall TFT_DataWrite ; Lower (and tick)
heinrichsweikamp
parents:
diff changeset
672
heinrichsweikamp
parents:
diff changeset
673 Index_out 0x20 ; Frame Memory Horizontal Address
heinrichsweikamp
parents:
diff changeset
674 clrf PORTA ; Upper
heinrichsweikamp
parents:
diff changeset
675 movf PRODL,W
heinrichsweikamp
parents:
diff changeset
676 rcall TFT_DataWrite ; Lower (and tick)
heinrichsweikamp
parents:
diff changeset
677 return
heinrichsweikamp
parents:
diff changeset
678
heinrichsweikamp
parents:
diff changeset
679
heinrichsweikamp
parents:
diff changeset
680 ;=============================================================================
heinrichsweikamp
parents:
diff changeset
681 ; TFT_frame : draw a frame around current box with current color.
heinrichsweikamp
parents:
diff changeset
682 ; Inputs: win_top, win_leftx2, win_height, win_width, win_color1, win_color2
heinrichsweikamp
parents:
diff changeset
683 ; Outputs: (none)
heinrichsweikamp
parents:
diff changeset
684 ; Trashed: WREG, PROD, aa_start:2, aa_end:2
heinrichsweikamp
parents:
diff changeset
685 global TFT_frame
heinrichsweikamp
parents:
diff changeset
686 TFT_frame:
heinrichsweikamp
parents:
diff changeset
687 movff win_top,save_top ; Backup everything.
heinrichsweikamp
parents:
diff changeset
688 movff win_height,save_height
heinrichsweikamp
parents:
diff changeset
689 movff win_leftx2,save_left
heinrichsweikamp
parents:
diff changeset
690 movff win_width,save_width
heinrichsweikamp
parents:
diff changeset
691
heinrichsweikamp
parents:
diff changeset
692 ;---- TOP line -----------------------------------------------------------
heinrichsweikamp
parents:
diff changeset
693 movlw 1 ; row ~ height=1
heinrichsweikamp
parents:
diff changeset
694 movff WREG,win_height
heinrichsweikamp
parents:
diff changeset
695 rcall TFT_box
heinrichsweikamp
parents:
diff changeset
696
heinrichsweikamp
parents:
diff changeset
697 ;---- BOTTOM line --------------------------------------------------------
heinrichsweikamp
parents:
diff changeset
698 movff save_top,PRODL ; Get back top,
heinrichsweikamp
parents:
diff changeset
699 movff save_height,WREG ; and height
heinrichsweikamp
parents:
diff changeset
700 addwf PRODL,W ; top+height
heinrichsweikamp
parents:
diff changeset
701 decf WREG ; top+height-1
heinrichsweikamp
parents:
diff changeset
702 movff WREG,win_top ; top+height-1 --> top
heinrichsweikamp
parents:
diff changeset
703 rcall TFT_box
heinrichsweikamp
parents:
diff changeset
704
heinrichsweikamp
parents:
diff changeset
705 ;---- LEFT column --------------------------------------------------------
heinrichsweikamp
parents:
diff changeset
706 movff save_top,win_top ; Restore top/height.
heinrichsweikamp
parents:
diff changeset
707 movff save_height,win_height
heinrichsweikamp
parents:
diff changeset
708 movlw 1 ; column ~ width=1
heinrichsweikamp
parents:
diff changeset
709 movff WREG,win_width
heinrichsweikamp
parents:
diff changeset
710 rcall TFT_box
heinrichsweikamp
parents:
diff changeset
711
heinrichsweikamp
parents:
diff changeset
712 ;---- RIGHT column -------------------------------------------------------
heinrichsweikamp
parents:
diff changeset
713 movff save_left,WREG
heinrichsweikamp
parents:
diff changeset
714 movff save_width,PRODL
heinrichsweikamp
parents:
diff changeset
715 addwf PRODL,W
heinrichsweikamp
parents:
diff changeset
716 decf WREG
heinrichsweikamp
parents:
diff changeset
717 movff WREG,win_leftx2
heinrichsweikamp
parents:
diff changeset
718 rcall TFT_box
heinrichsweikamp
parents:
diff changeset
719
heinrichsweikamp
parents:
diff changeset
720 ;---- Restore everything -------------------------------------------------
heinrichsweikamp
parents:
diff changeset
721 movff save_left,win_leftx2
heinrichsweikamp
parents:
diff changeset
722 movff save_width,win_width
heinrichsweikamp
parents:
diff changeset
723 return
heinrichsweikamp
parents:
diff changeset
724
heinrichsweikamp
parents:
diff changeset
725 ;=============================================================================
heinrichsweikamp
parents:
diff changeset
726 ; TFT_box : fills current box with current color.
heinrichsweikamp
parents:
diff changeset
727 ; Inputs: win_top, win_leftx2, win_height, win_width, win_color1, win_color2
heinrichsweikamp
parents:
diff changeset
728 ; Outputs: (none)
heinrichsweikamp
parents:
diff changeset
729 ; Trashed: WREG, PROD
heinrichsweikamp
parents:
diff changeset
730 global TFT_box
heinrichsweikamp
parents:
diff changeset
731
heinrichsweikamp
parents:
diff changeset
732 TFT_box:
heinrichsweikamp
parents:
diff changeset
733 ;---- Define Window ------------------------------------------------------
heinrichsweikamp
parents:
diff changeset
734 movf win_width,W
heinrichsweikamp
parents:
diff changeset
735 bcf STATUS,C
heinrichsweikamp
parents:
diff changeset
736 rlcf WREG
heinrichsweikamp
parents:
diff changeset
737 movwf win_width+0
heinrichsweikamp
parents:
diff changeset
738 movlw 0
heinrichsweikamp
parents:
diff changeset
739 rlcf WREG
heinrichsweikamp
parents:
diff changeset
740 movwf win_width+1
heinrichsweikamp
parents:
diff changeset
741 rcall TFT_box_write
heinrichsweikamp
parents:
diff changeset
742
heinrichsweikamp
parents:
diff changeset
743 rrcf win_width+1,W ; width /= 2
heinrichsweikamp
parents:
diff changeset
744 rrcf win_width+0,W
heinrichsweikamp
parents:
diff changeset
745 movwf win_width
heinrichsweikamp
parents:
diff changeset
746
heinrichsweikamp
parents:
diff changeset
747 ;---- Fill Window --------------------------------------------------------
heinrichsweikamp
parents:
diff changeset
748 Index_out 0x22 ; Frame Memory Data Write start
heinrichsweikamp
parents:
diff changeset
749
heinrichsweikamp
parents:
diff changeset
750 clrf PRODH ; Column counter.
heinrichsweikamp
parents:
diff changeset
751 RS_H ; Data
heinrichsweikamp
parents:
diff changeset
752
heinrichsweikamp
parents:
diff changeset
753 TFT_box2: ; Loop height times
heinrichsweikamp
parents:
diff changeset
754 movff win_height,PRODL
heinrichsweikamp
parents:
diff changeset
755
heinrichsweikamp
parents:
diff changeset
756 TFT_box3: ; loop width times
heinrichsweikamp
parents:
diff changeset
757 movff win_color1,PORTA ; Upper
heinrichsweikamp
parents:
diff changeset
758 movff win_color2,PORTH ; Lower
heinrichsweikamp
parents:
diff changeset
759 WR_L
heinrichsweikamp
parents:
diff changeset
760 WR_H ; Tick
heinrichsweikamp
parents:
diff changeset
761
heinrichsweikamp
parents:
diff changeset
762 movff win_color1,PORTA ; Upper
heinrichsweikamp
parents:
diff changeset
763 movff win_color2,PORTH ; Lower
heinrichsweikamp
parents:
diff changeset
764 WR_L
heinrichsweikamp
parents:
diff changeset
765 WR_H ; Tick
heinrichsweikamp
parents:
diff changeset
766
heinrichsweikamp
parents:
diff changeset
767 decfsz PRODL,F ; row loop finished ?
heinrichsweikamp
parents:
diff changeset
768 bra TFT_box3 ; No: continue.
heinrichsweikamp
parents:
diff changeset
769
heinrichsweikamp
parents:
diff changeset
770 incf PRODH,F ; column count ++
heinrichsweikamp
parents:
diff changeset
771
heinrichsweikamp
parents:
diff changeset
772 movff win_bargraph,WREG ; current column == bargraph ?
heinrichsweikamp
parents:
diff changeset
773 cpfseq PRODH
heinrichsweikamp
parents:
diff changeset
774 bra TFT_box4 ; No: just loop.
heinrichsweikamp
parents:
diff changeset
775
heinrichsweikamp
parents:
diff changeset
776 clrf WREG ; Yes: switch to black
heinrichsweikamp
parents:
diff changeset
777 movff WREG,win_color1
heinrichsweikamp
parents:
diff changeset
778 movff WREG,win_color2
heinrichsweikamp
parents:
diff changeset
779 TFT_box4:
heinrichsweikamp
parents:
diff changeset
780
heinrichsweikamp
parents:
diff changeset
781 movff win_width+0,WREG ; compare ?
heinrichsweikamp
parents:
diff changeset
782 xorwf PRODH,W
heinrichsweikamp
parents:
diff changeset
783 bnz TFT_box2 ; Loop not finished.
heinrichsweikamp
parents:
diff changeset
784
heinrichsweikamp
parents:
diff changeset
785 movlw 0x00 ; NOP, to stop window mode
heinrichsweikamp
parents:
diff changeset
786 rcall TFT_CmdWrite
heinrichsweikamp
parents:
diff changeset
787
heinrichsweikamp
parents:
diff changeset
788 setf WREG ; Reset bargraph mode...
heinrichsweikamp
parents:
diff changeset
789 movff WREG,win_bargraph
heinrichsweikamp
parents:
diff changeset
790
heinrichsweikamp
parents:
diff changeset
791 return
heinrichsweikamp
parents:
diff changeset
792
heinrichsweikamp
parents:
diff changeset
793 ;=============================================================================
heinrichsweikamp
parents:
diff changeset
794 ;Converts 8Bit RGB b'RRRGGGBB' into 16Bit RGB b'RRRRRGGGGGGBBBBB'
heinrichsweikamp
parents:
diff changeset
795 global TFT_set_color
heinrichsweikamp
parents:
diff changeset
796
heinrichsweikamp
parents:
diff changeset
797 TFT_set_color:
heinrichsweikamp
parents:
diff changeset
798 movwf tft_temp1 ; Get 8Bit RGB b'RRRGGGBB'
heinrichsweikamp
parents:
diff changeset
799 movwf tft_temp2 ; Copy
heinrichsweikamp
parents:
diff changeset
800
heinrichsweikamp
parents:
diff changeset
801 ; Mask Bit 7,6,5,4,3,2
heinrichsweikamp
parents:
diff changeset
802 movlw b'00000011'
heinrichsweikamp
parents:
diff changeset
803 andwf tft_temp2,F
heinrichsweikamp
parents:
diff changeset
804
heinrichsweikamp
parents:
diff changeset
805 movlw b'00000000'
heinrichsweikamp
parents:
diff changeset
806 dcfsnz tft_temp2,F
heinrichsweikamp
parents:
diff changeset
807 movlw b'01010000'
heinrichsweikamp
parents:
diff changeset
808 dcfsnz tft_temp2,F
heinrichsweikamp
parents:
diff changeset
809 movlw b'10100000'
heinrichsweikamp
parents:
diff changeset
810 dcfsnz tft_temp2,F
heinrichsweikamp
parents:
diff changeset
811 movlw b'11111000'
heinrichsweikamp
parents:
diff changeset
812 movwf tft_temp3 ; Blue done.
heinrichsweikamp
parents:
diff changeset
813
heinrichsweikamp
parents:
diff changeset
814 movff tft_temp1, tft_temp2 ; Copy
heinrichsweikamp
parents:
diff changeset
815 ; Mask Bit 7,6,5,1,0
heinrichsweikamp
parents:
diff changeset
816 movlw b'00011100'
heinrichsweikamp
parents:
diff changeset
817 andwf tft_temp2,F
heinrichsweikamp
parents:
diff changeset
818 rrncf tft_temp2,F
heinrichsweikamp
parents:
diff changeset
819 rrncf tft_temp2,F
heinrichsweikamp
parents:
diff changeset
820
heinrichsweikamp
parents:
diff changeset
821 movlw b'00000000'
heinrichsweikamp
parents:
diff changeset
822 dcfsnz tft_temp2,F
heinrichsweikamp
parents:
diff changeset
823 movlw b'00000100'
heinrichsweikamp
parents:
diff changeset
824 dcfsnz tft_temp2,F
heinrichsweikamp
parents:
diff changeset
825 movlw b'00001000'
heinrichsweikamp
parents:
diff changeset
826 dcfsnz tft_temp2,F
heinrichsweikamp
parents:
diff changeset
827 movlw b'00001100'
heinrichsweikamp
parents:
diff changeset
828 dcfsnz tft_temp2,F
heinrichsweikamp
parents:
diff changeset
829 movlw b'00010000'
heinrichsweikamp
parents:
diff changeset
830 dcfsnz tft_temp2,F
heinrichsweikamp
parents:
diff changeset
831 movlw b'00010100'
heinrichsweikamp
parents:
diff changeset
832 dcfsnz tft_temp2,F
heinrichsweikamp
parents:
diff changeset
833 movlw b'00100000'
heinrichsweikamp
parents:
diff changeset
834 dcfsnz tft_temp2,F
heinrichsweikamp
parents:
diff changeset
835 movlw b'00111111'
heinrichsweikamp
parents:
diff changeset
836 movwf tft_temp4
heinrichsweikamp
parents:
diff changeset
837
heinrichsweikamp
parents:
diff changeset
838 rrcf tft_temp4,F
heinrichsweikamp
parents:
diff changeset
839 rrcf tft_temp3,F
heinrichsweikamp
parents:
diff changeset
840
heinrichsweikamp
parents:
diff changeset
841 rrcf tft_temp4,F
heinrichsweikamp
parents:
diff changeset
842 rrcf tft_temp3,F
heinrichsweikamp
parents:
diff changeset
843
heinrichsweikamp
parents:
diff changeset
844 rrcf tft_temp4,F
heinrichsweikamp
parents:
diff changeset
845 rrcf tft_temp3,F ; tft_temp3 (b'GGGBBBBB') done.
heinrichsweikamp
parents:
diff changeset
846
heinrichsweikamp
parents:
diff changeset
847 movff tft_temp1, tft_temp2 ; Copy
heinrichsweikamp
parents:
diff changeset
848 clrf tft_temp1
heinrichsweikamp
parents:
diff changeset
849
heinrichsweikamp
parents:
diff changeset
850 rrcf tft_temp4,F
heinrichsweikamp
parents:
diff changeset
851 rrcf tft_temp1,F
heinrichsweikamp
parents:
diff changeset
852
heinrichsweikamp
parents:
diff changeset
853 rrcf tft_temp4,F
heinrichsweikamp
parents:
diff changeset
854 rrcf tft_temp1,F
heinrichsweikamp
parents:
diff changeset
855
heinrichsweikamp
parents:
diff changeset
856 rrcf tft_temp4,F
heinrichsweikamp
parents:
diff changeset
857 rrcf tft_temp1,F ; Green done.
heinrichsweikamp
parents:
diff changeset
858
heinrichsweikamp
parents:
diff changeset
859 ; Mask Bit 4,3,2,1,0
heinrichsweikamp
parents:
diff changeset
860 movlw b'11100000'
heinrichsweikamp
parents:
diff changeset
861 andwf tft_temp2,F
heinrichsweikamp
parents:
diff changeset
862
heinrichsweikamp
parents:
diff changeset
863 rrncf tft_temp2,F
heinrichsweikamp
parents:
diff changeset
864 rrncf tft_temp2,F
heinrichsweikamp
parents:
diff changeset
865 rrncf tft_temp2,F
heinrichsweikamp
parents:
diff changeset
866 rrncf tft_temp2,F
heinrichsweikamp
parents:
diff changeset
867 rrncf tft_temp2,F
heinrichsweikamp
parents:
diff changeset
868
heinrichsweikamp
parents:
diff changeset
869 movlw b'00000000'
heinrichsweikamp
parents:
diff changeset
870 dcfsnz tft_temp2,F
heinrichsweikamp
parents:
diff changeset
871 movlw b'00000100'
heinrichsweikamp
parents:
diff changeset
872 dcfsnz tft_temp2,F
heinrichsweikamp
parents:
diff changeset
873 movlw b'00001000'
heinrichsweikamp
parents:
diff changeset
874 dcfsnz tft_temp2,F
heinrichsweikamp
parents:
diff changeset
875 movlw b'00001100'
heinrichsweikamp
parents:
diff changeset
876 dcfsnz tft_temp2,F
heinrichsweikamp
parents:
diff changeset
877 movlw b'00010000'
heinrichsweikamp
parents:
diff changeset
878 dcfsnz tft_temp2,F
heinrichsweikamp
parents:
diff changeset
879 movlw b'00010100'
heinrichsweikamp
parents:
diff changeset
880 dcfsnz tft_temp2,F
heinrichsweikamp
parents:
diff changeset
881 movlw b'00100000'
heinrichsweikamp
parents:
diff changeset
882 dcfsnz tft_temp2,F
heinrichsweikamp
parents:
diff changeset
883 movlw b'00111111'
heinrichsweikamp
parents:
diff changeset
884 movwf tft_temp4
heinrichsweikamp
parents:
diff changeset
885
heinrichsweikamp
parents:
diff changeset
886 rrcf tft_temp4,F
heinrichsweikamp
parents:
diff changeset
887 rrcf tft_temp1,F
heinrichsweikamp
parents:
diff changeset
888
heinrichsweikamp
parents:
diff changeset
889 rrcf tft_temp4,F
heinrichsweikamp
parents:
diff changeset
890 rrcf tft_temp1,F
heinrichsweikamp
parents:
diff changeset
891
heinrichsweikamp
parents:
diff changeset
892 rrcf tft_temp4,F
heinrichsweikamp
parents:
diff changeset
893 rrcf tft_temp1,F
heinrichsweikamp
parents:
diff changeset
894
heinrichsweikamp
parents:
diff changeset
895 rrcf tft_temp4,F
heinrichsweikamp
parents:
diff changeset
896 rrcf tft_temp1,F
heinrichsweikamp
parents:
diff changeset
897
heinrichsweikamp
parents:
diff changeset
898 rrcf tft_temp4,F
heinrichsweikamp
parents:
diff changeset
899 rrcf tft_temp1,F ; Red done.
heinrichsweikamp
parents:
diff changeset
900
heinrichsweikamp
parents:
diff changeset
901 movff tft_temp1,win_color1
heinrichsweikamp
parents:
diff changeset
902 movff tft_temp3,win_color2 ; Set Bank0 Color registers...
heinrichsweikamp
parents:
diff changeset
903 return
heinrichsweikamp
parents:
diff changeset
904
heinrichsweikamp
parents:
diff changeset
905 ;=============================================================================
heinrichsweikamp
parents:
diff changeset
906 ; Dump screen contents to the UART
heinrichsweikamp
parents:
diff changeset
907
heinrichsweikamp
parents:
diff changeset
908 global TFT_dump_screen
heinrichsweikamp
parents:
diff changeset
909 TFT_dump_screen:
heinrichsweikamp
parents:
diff changeset
910 bsf no_sensor_int
heinrichsweikamp
parents:
diff changeset
911 movlw 'l'
heinrichsweikamp
parents:
diff changeset
912 movwf TXREG ; Send command echo.
heinrichsweikamp
parents:
diff changeset
913 call rs232_wait_tx ; wait for UART
heinrichsweikamp
parents:
diff changeset
914 ;---- Send DISPLAY box command for the full screen window -------------------
heinrichsweikamp
parents:
diff changeset
915 Index_out 0x50 ; Window Horizontal Start Address
heinrichsweikamp
parents:
diff changeset
916 Parameter_out 0x00, 0x00 ; 0-239
heinrichsweikamp
parents:
diff changeset
917 Index_out 0x51 ; Window Horizontal End Address
heinrichsweikamp
parents:
diff changeset
918 Parameter_out 0x00, 0xEF ; 0-239
heinrichsweikamp
parents:
diff changeset
919 Index_out 0x52 ; Window Vertical Start Address
heinrichsweikamp
parents:
diff changeset
920 Parameter_out 0x00, 0x00 ; 0-319
heinrichsweikamp
parents:
diff changeset
921 Index_out 0x53 ; Window Vertical End Address
heinrichsweikamp
parents:
diff changeset
922 Parameter_out 0x01, 0x3F ; 0-319
heinrichsweikamp
parents:
diff changeset
923
heinrichsweikamp
parents:
diff changeset
924 clrf ds_column
heinrichsweikamp
parents:
diff changeset
925 rcall dump_screen_pixel_reset
heinrichsweikamp
parents:
diff changeset
926 dump_screen_1:
heinrichsweikamp
parents:
diff changeset
927 btg LEDr ; LED activity toggle
heinrichsweikamp
parents:
diff changeset
928 ; Dump even column
heinrichsweikamp
parents:
diff changeset
929 movlw .240 ; 240 lines, once.
heinrichsweikamp
parents:
diff changeset
930 movwf ds_line
heinrichsweikamp
parents:
diff changeset
931 dump_screen_2:
heinrichsweikamp
parents:
diff changeset
932 Index_out 0x20 ; Frame Memory Horizontal Address
heinrichsweikamp
parents:
diff changeset
933 movff ds_line,WREG ; d'0' ... d'239'
heinrichsweikamp
parents:
diff changeset
934 mullw 1 ; Copy row to PRODH:L
heinrichsweikamp
parents:
diff changeset
935 rcall TFT_DataWrite_PROD
heinrichsweikamp
parents:
diff changeset
936
heinrichsweikamp
parents:
diff changeset
937 movff ds_column,WREG ; Init X position.
heinrichsweikamp
parents:
diff changeset
938 mullw 2
heinrichsweikamp
parents:
diff changeset
939 rcall pixel_write_col320 ; Start Address Vertical (.0 - .319)
heinrichsweikamp
parents:
diff changeset
940
heinrichsweikamp
parents:
diff changeset
941 rcall TFT_DataRead_PROD ; read pixel
heinrichsweikamp
parents:
diff changeset
942 rcall dump_screen_pixel
heinrichsweikamp
parents:
diff changeset
943
heinrichsweikamp
parents:
diff changeset
944 decfsz ds_line,F
heinrichsweikamp
parents:
diff changeset
945 bra dump_screen_2
heinrichsweikamp
parents:
diff changeset
946 rcall dump_screen_pixel_flush
heinrichsweikamp
parents:
diff changeset
947
heinrichsweikamp
parents:
diff changeset
948 ; Dump odd column
heinrichsweikamp
parents:
diff changeset
949 movlw .240 ; 240 lines, twice.
heinrichsweikamp
parents:
diff changeset
950 movwf ds_line
heinrichsweikamp
parents:
diff changeset
951 dump_screen_3:
heinrichsweikamp
parents:
diff changeset
952 Index_out 0x20 ; Frame Memory Horizontal Address
heinrichsweikamp
parents:
diff changeset
953 movff ds_line,WREG ; d'0' ... d'239'
heinrichsweikamp
parents:
diff changeset
954 mullw 1 ; Copy row to PRODH:L
heinrichsweikamp
parents:
diff changeset
955 rcall TFT_DataWrite_PROD
heinrichsweikamp
parents:
diff changeset
956
heinrichsweikamp
parents:
diff changeset
957 movff ds_column,WREG ; Init X position.
heinrichsweikamp
parents:
diff changeset
958 mullw 2
heinrichsweikamp
parents:
diff changeset
959 movlw .1
heinrichsweikamp
parents:
diff changeset
960 addwf PRODL,F
heinrichsweikamp
parents:
diff changeset
961 movlw 0
heinrichsweikamp
parents:
diff changeset
962 addwfc PRODH,F ; +1
heinrichsweikamp
parents:
diff changeset
963 rcall pixel_write_col320 ; Start Address Vertical (.0 - .319)
heinrichsweikamp
parents:
diff changeset
964
heinrichsweikamp
parents:
diff changeset
965 rcall TFT_DataRead_PROD ; read pixel
heinrichsweikamp
parents:
diff changeset
966 rcall dump_screen_pixel
heinrichsweikamp
parents:
diff changeset
967
heinrichsweikamp
parents:
diff changeset
968 decfsz ds_line,F
heinrichsweikamp
parents:
diff changeset
969 bra dump_screen_3
heinrichsweikamp
parents:
diff changeset
970 rcall dump_screen_pixel_flush
heinrichsweikamp
parents:
diff changeset
971
heinrichsweikamp
parents:
diff changeset
972 incf ds_column,F
heinrichsweikamp
parents:
diff changeset
973 movlw .160
heinrichsweikamp
parents:
diff changeset
974 cpfseq ds_column
heinrichsweikamp
parents:
diff changeset
975 bra dump_screen_1
heinrichsweikamp
parents:
diff changeset
976
heinrichsweikamp
parents:
diff changeset
977 bcf no_sensor_int
heinrichsweikamp
parents:
diff changeset
978 clrf RCREG1 ; Clear receive buffer
heinrichsweikamp
parents:
diff changeset
979 bcf RCSTA1,CREN ; Clear receiver status
heinrichsweikamp
parents:
diff changeset
980 bsf RCSTA1,CREN
heinrichsweikamp
parents:
diff changeset
981 bsf enable_screen_dumps ; =1: Ignore vin_usb, wait for "l" command (Screen dump)
heinrichsweikamp
parents:
diff changeset
982 return
heinrichsweikamp
parents:
diff changeset
983
heinrichsweikamp
parents:
diff changeset
984
heinrichsweikamp
parents:
diff changeset
985 ;=============================================================================
heinrichsweikamp
parents:
diff changeset
986 ; Pixel compression
heinrichsweikamp
parents:
diff changeset
987 ;
heinrichsweikamp
parents:
diff changeset
988 ; Input: PRODH:L = pixel.
heinrichsweikamp
parents:
diff changeset
989 ; Output: Compressed stream on output.
heinrichsweikamp
parents:
diff changeset
990 ; Compressed format:
heinrichsweikamp
parents:
diff changeset
991 ; 0ccccccc : BLACK pixel, repeated ccccccc+1 times (1..128).
heinrichsweikamp
parents:
diff changeset
992 ; 11cccccc : WHITE pixel, repeated cccccc+1 times (1..64).
heinrichsweikamp
parents:
diff changeset
993 ; 10cccccc HIGH LOW : color pixel (H:L) repeated ccccc+1 times (1..64).
heinrichsweikamp
parents:
diff changeset
994 ;
heinrichsweikamp
parents:
diff changeset
995 dump_screen_pixel:
heinrichsweikamp
parents:
diff changeset
996 movf PRODH,W ; Compare pixel-high
heinrichsweikamp
parents:
diff changeset
997 xorwf ds_pixel+1,W
heinrichsweikamp
parents:
diff changeset
998 bnz dump_screen_pixel_1 ; Different -> dump.
heinrichsweikamp
parents:
diff changeset
999
heinrichsweikamp
parents:
diff changeset
1000 movf PRODL,W ; Compare pixel-low
heinrichsweikamp
parents:
diff changeset
1001 xorwf ds_pixel+0,W
heinrichsweikamp
parents:
diff changeset
1002 bnz dump_screen_pixel_1 ; Different -> dump.
heinrichsweikamp
parents:
diff changeset
1003
heinrichsweikamp
parents:
diff changeset
1004 incf ds_count,F ; Same color: just increment.
heinrichsweikamp
parents:
diff changeset
1005 return
heinrichsweikamp
parents:
diff changeset
1006
heinrichsweikamp
parents:
diff changeset
1007 dump_screen_pixel_1: ; Send (pixel,count) tuple
heinrichsweikamp
parents:
diff changeset
1008 movf ds_count,W ; Is count zero ?
heinrichsweikamp
parents:
diff changeset
1009 bz dump_screen_pixel_2 ; Yes: skip sending.
heinrichsweikamp
parents:
diff changeset
1010
heinrichsweikamp
parents:
diff changeset
1011 movf ds_pixel+1,W ; This is a BLACK pixel ?
heinrichsweikamp
parents:
diff changeset
1012 iorwf ds_pixel+0,W
heinrichsweikamp
parents:
diff changeset
1013 bz dump_screen_pix_black ; YES.
heinrichsweikamp
parents:
diff changeset
1014
heinrichsweikamp
parents:
diff changeset
1015 movf ds_pixel+1,W ; This is a white pixel ?
heinrichsweikamp
parents:
diff changeset
1016 andwf ds_pixel+0,W
heinrichsweikamp
parents:
diff changeset
1017 incf WREG
heinrichsweikamp
parents:
diff changeset
1018 bz dump_screen_pix_white ; YES.
heinrichsweikamp
parents:
diff changeset
1019
heinrichsweikamp
parents:
diff changeset
1020 ; No: write the pixel itself...
heinrichsweikamp
parents:
diff changeset
1021 movlw .64 ; Max color pixel on a single byte.
heinrichsweikamp
parents:
diff changeset
1022 cpfsgt ds_count ; Skip if count > 64
heinrichsweikamp
parents:
diff changeset
1023 movf ds_count,W ; W <- min(64,count)
heinrichsweikamp
parents:
diff changeset
1024 subwf ds_count,F ; ds_count <- ds_count-W
heinrichsweikamp
parents:
diff changeset
1025 decf WREG ; Save as 0..63
heinrichsweikamp
parents:
diff changeset
1026 iorlw b'10000000' ; MARK as a color pixel.
heinrichsweikamp
parents:
diff changeset
1027
heinrichsweikamp
parents:
diff changeset
1028 movwf TXREG
heinrichsweikamp
parents:
diff changeset
1029 call rs232_wait_tx ; wait for UART
heinrichsweikamp
parents:
diff changeset
1030 movff ds_pixel+1,TXREG
heinrichsweikamp
parents:
diff changeset
1031 call rs232_wait_tx ; wait for UART
heinrichsweikamp
parents:
diff changeset
1032 movff ds_pixel+0,TXREG
heinrichsweikamp
parents:
diff changeset
1033 call rs232_wait_tx ; wait for UART
heinrichsweikamp
parents:
diff changeset
1034 bra dump_screen_pixel_1
heinrichsweikamp
parents:
diff changeset
1035
heinrichsweikamp
parents:
diff changeset
1036 dump_screen_pixel_2:
heinrichsweikamp
parents:
diff changeset
1037 movff PRODH,ds_pixel+1 ; Save new pixel color
heinrichsweikamp
parents:
diff changeset
1038 movff PRODL,ds_pixel+0
heinrichsweikamp
parents:
diff changeset
1039 movlw 1
heinrichsweikamp
parents:
diff changeset
1040 movwf ds_count ; And set count=1.
heinrichsweikamp
parents:
diff changeset
1041 return
heinrichsweikamp
parents:
diff changeset
1042
heinrichsweikamp
parents:
diff changeset
1043 dump_screen_pix_black:
heinrichsweikamp
parents:
diff changeset
1044 movlw .128 ; Max black pixel on a single byte.
heinrichsweikamp
parents:
diff changeset
1045 cpfsgt ds_count ; Skip if count > 128
heinrichsweikamp
parents:
diff changeset
1046 movf ds_count,W ; W <- min(128,count)
heinrichsweikamp
parents:
diff changeset
1047 subwf ds_count,F ; ds_count <- ds_count-W
heinrichsweikamp
parents:
diff changeset
1048 decf WREG ; Save as 0..127
heinrichsweikamp
parents:
diff changeset
1049 dump_screen_pix_3:
heinrichsweikamp
parents:
diff changeset
1050 movwf TXREG
heinrichsweikamp
parents:
diff changeset
1051 call rs232_wait_tx
heinrichsweikamp
parents:
diff changeset
1052 bra dump_screen_pixel_1 ; More to dump ?
heinrichsweikamp
parents:
diff changeset
1053
heinrichsweikamp
parents:
diff changeset
1054 dump_screen_pix_white:
heinrichsweikamp
parents:
diff changeset
1055 movlw .64 ; Max white pixel on a single byte.
heinrichsweikamp
parents:
diff changeset
1056 cpfsgt ds_count ; Skip if count > 64
heinrichsweikamp
parents:
diff changeset
1057 movf ds_count,W ; W <- min(64,count)
heinrichsweikamp
parents:
diff changeset
1058 subwf ds_count,F ; ds_count <- ds_count-W
heinrichsweikamp
parents:
diff changeset
1059 decf WREG ; Save as 0..63
heinrichsweikamp
parents:
diff changeset
1060 iorlw b'11000000' ; MARK as a compressed white.
heinrichsweikamp
parents:
diff changeset
1061 bra dump_screen_pix_3
heinrichsweikamp
parents:
diff changeset
1062
heinrichsweikamp
parents:
diff changeset
1063 dump_screen_pixel_flush:
heinrichsweikamp
parents:
diff changeset
1064 clrf PRODH
heinrichsweikamp
parents:
diff changeset
1065 clrf PRODL
heinrichsweikamp
parents:
diff changeset
1066 rcall dump_screen_pixel_1 ; Send it
heinrichsweikamp
parents:
diff changeset
1067 dump_screen_pixel_reset:
heinrichsweikamp
parents:
diff changeset
1068 clrf ds_count ; But clear count.
heinrichsweikamp
parents:
diff changeset
1069 return
heinrichsweikamp
parents:
diff changeset
1070
heinrichsweikamp
parents:
diff changeset
1071 end