comparison src/convert.asm @ 634:4050675965ea

3.10 stable release
author heinrichsweikamp
date Tue, 28 Apr 2020 17:34:31 +0200
parents cd58f7fc86db
children 75e90cd0c2c3
comparison
equal deleted inserted replaced
633:690c48db7b5b 634:4050675965ea
1 ;============================================================================= 1 ;=============================================================================
2 ; 2 ;
3 ; File convert.asm combined next generation V3.04.2 3 ; File convert.asm combined next generation V3.09.4l
4 ; 4 ;
5 ; Converts register values to string 5 ; Converts register values to string
6 ; 6 ;
7 ; Copyright (c) 2011, Matthias Heinrichs, HeinrichsWeikamp, all right reserved. 7 ; Copyright (c) 2011, Matthias Heinrichs, HeinrichsWeikamp, all right reserved.
8 ;============================================================================= 8 ;=============================================================================
9 ; HISTORY 9 ; HISTORY
10 ; 2007-10-07 : [MH] Creation for OSTC sources 10 ; 2007-10-07 : [MH] Creation for OSTC sources
11 ; 2010-12-10 : [jDG] Optimize macro size 11 ; 2010-12-10 : [jDG] Optimize macro size
12 ; 12 ;
13 13
14 #include "hwos.inc" ; Mandatory header 14 #include "hwos.inc"
15 15 #include "math.inc"
16 convert CODE 16 #include "strings.inc"
17 17
18 ;============================================================================= 18
19 19 ;=============================================================================
20 convert1 CODE
21 ;=============================================================================
22
23
24 ;-----------------------------------------------------------------------------
25 ; Print last two Digits or double-dots if zero - big Font
26 ;
20 global output99DD_call 27 global output99DD_call
21 output99DD_call: 28 output99DD_call:
22 tstfsz lo ; value = 0 ? 29 tstfsz lo ; value = 0 ?
23 bra output99_call ; NO - do normal output 30 bra output99_call ; NO - do normal output
24 movlw " " ; YES - print a space 31 movlw " " ; YES - print a space
25 movwf POSTINC2 ; - ... 32 movwf POSTINC2 ; - ...
26 bra output99dd_cont ; - continue with the double dots 33 bra print_doubledots ; - continue printing two dots
27 34
28 35
36 ;-----------------------------------------------------------------------------
37 ; Print last two Digits or double-dots if zero - small Font
38 ;
29 global output99dd_call 39 global output99dd_call
30 output99dd_call: 40 output99dd_call:
31 tstfsz lo ; value = 0 ? 41 tstfsz lo ; value = 0 ?
32 bra output99_call ; NO - do normal output 42 bra output99_call ; NO - do normal output
33 output99dd_cont: 43 bra print_doubledots ; YES - continue printing two dots
34 movlw "." ; YES - print double dots 44
35 movwf POSTINC2 ; - ... 45
46 ;-----------------------------------------------------------------------------
47 ; Helper Function - Print two Dots
48 ;
49 print_doubledots:
50 movlw "." ; load a '.'
51 movwf POSTINC2 ; print 1st dot
52 movwf POSTINC2 ; print 2nd dot
53 bra output_common_finish ; clean-up and return
54
55
56 ;-----------------------------------------------------------------------------
57 ; Print last Digit from a 8 bit Integer (0-9)
58 ;
59 global output9_call
60 output9_call:
61 bsf hide_digit2 ; do not print digit 5, 4, 3 and 2
62 bra output8_common ; continue with common part
63
64
65 ;-----------------------------------------------------------------------------
66 ; Print only last two Digits from a 8 bit Integer, with leading zero (00-99)
67 ;
68 global output99x_call
69 output99x_call:
70 bsf leading_zeros ; print leading zeros
71 ;bra output99_call ; continue with output99_call
72
73
74 ;-----------------------------------------------------------------------------
75 ; Print last two Digits from a 8 bit Integer (0-99)
76 ;
77 global output99_call
78 output99_call:
79 bsf hide_digit3 ; do not print digit 5, 4 and 3
80 ;bra output8_common ; continue with common part
81
82
83 ;-----------------------------------------------------------------------------
84 ; Print 8 bit Integer (0-255)
85 ;
86 global output256_call
87 output256_call:
88 ;bra output8_common ; continue with common part
89
90
91 ;-----------------------------------------------------------------------------
92 ; Helper Function - common Part for Printing 8 Bit Integers
93 ;
94 output8_common:
95 bcf output_overflow ; clear overflow flag
96 movff lo,bin_lo ; copy value to show
97 rcall convert_bin8bcd ; compute bcd_hi (1 digit) and bcd_lo (2 digits)
98 btfsc hide_digit2 ; shall hide digit 2 ?
99 bsf hide_digit3 ; YES - hide digit 3 then, too
100 bra output_common_d3 ; start printing with digit 3
101
102
103 ;-----------------------------------------------------------------------------
104 ; Print last four Digits from a 16 bit Value (0-9999)
105 ;
106 global output9999_call
107 output9999_call:
108 bsf hide_digit5 ; do not print digit 5
109 bra output16_common ; continue with common part
110
111
112 ;-----------------------------------------------------------------------------
113 ; Print last three Digits from a 16 bit Value (0-999)
114 ;
115 global output999_call
116 output999_call:
117 bsf hide_digit4 ; do not print digit 4 and 5
118 ;bra output16_common ; continue with common part
119
120
121 ;-----------------------------------------------------------------------------
122 ; Print a full 16 bit Value (0-65535)
123 ;
124 global output65535_call
125 output65535_call:
126 ;bra output16_common ; continue with common part
127
128
129 ;-----------------------------------------------------------------------------
130 ; Helper Function - common Part for Printing 16 Bit Integers
131 ;
132 output16_common:
133 bcf output_overflow ; clear overflow flag
134 movff lo,bin_lo ; copy value to show
135 movff hi,bin_hi ; ...
136 rcall convert_bin16bcd ; compute bcd_up (1 digit), bcd_hi (2 digits) and bcd_lo (2 digits)
137 btfsc hide_digit2 ; shall hide digit 2 ?
138 bsf hide_digit3 ; YES - hide digit 3 then, too
139 btfsc hide_digit3 ; shall hide digit 3 ?
140 bsf hide_digit4 ; YES - hide digit 4 then, too
141 btfsc hide_digit4 ; shall hide digit 4 ?
142 bsf hide_digit5 ; YES - hide digit 5 then, too
143 ;bra output_common_d5 ; start printing with digit 5
144
145
146 ;-----------------------------------------------------------------------------
147 ; Helper Function - common Part for Printing 8 and 16 Bit Integers
148 ;
149 output_common_d5:
150 ; digit 5
151 btfss hide_digit5 ; shall hide digit 5 ?
152 bra output_common_d5p ; NO - print digit 5
153 movf bcd_up,W ; YES - get lower nibble (digit 5) into WREG
154 andlw 0x0F ; - is it zero?
155 bnz print_9999 ; NO - print '9999'
156 bra output_common_d4 ; YES - continue with digit 4
157 output_common_d5p:
158 movf bcd_up,W ; copy 5th digit to lower nibble of WREG
159 rcall print_digit ; print the digit
160
161 output_common_d4:
162 ; between digit 5 and 4
163 btfsc decimal_digit3 ; shall print a decimal point in front of digit 3 ?
164 bsf leading_zeros ; YES - allow printing of zeros now
165
166 ; digit 4
167 btfss hide_digit4 ; shall hide digit 4 ?
168 bra output_common_d4p ; NO - print digit 4
169 swapf bcd_hi,W ; YES - get upper nibble (digit 4) into WREG
170 andlw 0x0F ; - is it zero?
171 bnz print_999 ; NO - print '999'
172 bra output_common_d3 ; YES - continue with digit 3
173 output_common_d4p:
174 swapf bcd_hi,W ; copy 4th digit to lower nibble of WREG
175 rcall print_digit ; print the digit
176
177 output_common_d3:
178 ; between digit 4 and 3
179 btfsc decimal_digit3 ; shall print a decimal point in front of digit 3 ?
180 rcall print_decimal ; YES - print a decimal pint now
181 btfsc decimal_digit2 ; shall print a decimal point in front of digit 2 ?
182 bsf leading_zeros ; YES - allow printing of zeros now
183 btfsc omit_digit_2 ; shall omit digits 2 and 1 ?
184 bsf leading_zeros ; YES - allow printing of zeros now
185
186 ; digit 3
187 btfss hide_digit3 ; shall hide digit 3 ?
188 bra output_common_d3p ; NO - print digit 3
189 movf bcd_hi,W ; YES - get lower nibble (digit 3) into WREG
190 andlw 0x0F ; - is it zero?
191 bnz print_99 ; NO - print '99'
192 bra output_common_d2 ; YES - continue with digit 2
193 output_common_d3p:
194 movf bcd_hi,W ; copy 3rd digit to lower nibble of WREG
195 rcall print_digit ; print the digit
196
197 output_common_d2:
198 ; between digit 3 and 2
199 btfsc decimal_digit2 ; shall print a decimal point in front of digit 2 ?
200 rcall print_decimal ; YES - print a decimal pint now
201 btfsc decimal_digit1 ; shall print a decimal point in front of digit 1 ?
202 bsf leading_zeros ; YES - allow printing of zeros now
203 btfsc omit_digit_1 ; shall omit digit 1 ?
204 bsf leading_zeros ; YES - allow printing of zeros now
205
206 ; digit 2
207 btfss hide_digit2 ; shall hide digit 2 ?
208 bra output_common_d2p ; NO - print digit 2
209 swapf bcd_lo,W ; YES - get upper nibble (digit 2) into WREG
210 andlw 0x0F ; - is it zero?
211 bnz print_9 ; NO - print '9'
212 bra output_common_d1 ; YES - continue with digit 2
213 output_common_d2p:
214 btfsc omit_digit_2 ; shall omit digit 2 ?
215 bra output_common_finish ; YES - finish output
216 swapf bcd_lo,W ; NO - copy 2nd digit to lower nibble of WREG
217 rcall print_digit ; - print the digit
218
219 output_common_d1:
220 ; between digit 2 and 1
221 btfsc decimal_digit1 ; shall print a decimal point in front of digit 1 ?
222 rcall print_decimal ; YES - print a decimal pint now
223 bsf leading_zeros ; allow printing of zeros now
224
225 ; digit 1
226 btfsc omit_digit_1 ; shall omit digit 1 ?
227 bra output_common_finish ; YES - finish output
228 movf bcd_lo,W ; NO - copy 1st digit to lower nibble of WREG
229 rcall print_digit ; - print the digit
230
231 output_common_finish:
232 clrf INDF2 ; place a terminator at the current buffer position
233 clrf CVT_flags1 ; clear output format command flags
234 clrf CVT_flags2 ; ...
235 return ; done
236
237
238 ;-----------------------------------------------------------------------------
239 ; Helper Function - print a Digit or a decimal Point
240 ;
241 ; Input: lower nibble of WREG BCD code of digit
242 ; leading_zeros =1: print (leading) zeros
243 ; leftbind =1: do not print leading spaces
244 ;
245 print_digit:
246 andlw 0x0F ; keep only the lower nibble, is it zero?
247 bnz print_digit_digit ; NO - print in any case
248 btfsc leading_zeros ; YES - printing of zeros allowed?
249 bra print_digit_digit ; YES - print a zero
250 btfsc leftbind ; NO - shall print left-aligned?
251 return ; YES - done
252 movlw ' ' ; NO - load ASCII code of a space char
253 bra print_digit_print ; - print it
254 print_digit_digit:
255 bsf leading_zeros ; allow printing of zeros now
256 addlw '0' ; add ASCII code of '0' to BCD code to get final ASCII code
257 print_digit_print:
258 movwf POSTINC2 ; print the digit or char
259 return ; done
260
261 print_decimal:
262 movlw '.' ; load ASCII code of a dot
263 bra print_digit_print ; print it
264
265
266 ;-----------------------------------------------------------------------------
267 ; Helper Function - print '9999' or '999' or '99' or '9'
268 ;
269 print_9999:
270 movlw '9' ; load a '9' digit
271 movwf POSTINC2 ; print digit 4
272 print_999:
273 movlw '9' ; load a '9' digit (for those embarked lately)
274 movwf POSTINC2 ; print digit 3
275 print_99:
276 movlw '9' ; load a '9' digit (for those embarked lately)
277 movwf POSTINC2 ; print digit 2
278 print_9:
279 movlw '9' ; load a '9' digit (for those embarked lately)
280 movwf POSTINC2 ; print digit 1
281 clrf INDF2 ; place a terminator at the current buffer position
282 clrf CVT_flags1 ; clear output format command flags
283 clrf CVT_flags2 ; ...
284 bsf output_overflow ; set overflow flag
285 return ; done
286
287
288 ;-----------------------------------------------------------------------------
289 ; Convert an 8 Bit Integer to BCD
290 ;
291 ; Input: bin_lo 8 bit integer
292 ; Output: bcd_hi,bcd_lo 3 BCD digits
293 ;
294 convert_bin8bcd:
295 clrf bcd_lo ; clear result variables
296 clrf bcd_hi ; ...
297 bsf bcd_hi,0 ; set loop counter to 8
298 convert_bin8bcd_loop:
299 ; get MSB bit from binary
300 rlcf bin_lo,F ; shift-out MSB to CARRY
301 ; lower two BCDs
302 movf bcd_lo,W ; get lower BCDs to WREG
303 addwfc bcd_lo,W ; WREG = 2 * WREG + CARRY
304 daw ; decimal-adjust BCDs in WREG
305 movwf bcd_lo ; copy back WREG to lower BCDs
306 ; higher one BCD
307 rlcf bcd_hi ; higher BCD = 2*(higher BCD) + CARRY (special version for 1 BCD only)
308 ; loop control
309 bnc convert_bin8bcd_loop ; all 8 bits done? NO -> loop
310 return ; YES -> done
311
312
313 ;-----------------------------------------------------------------------------
314 ; Convert a 16 Bit Integer to BCD
315 ;
316 ; Input: bin_hi,bin_lo 16 bit integer
317 ; Output: bcd_up,bcd_hi,bcd_lo 5 BCD digits
318 ;
319 convert_bin16bcd:
320 clrf bcd_lo ; clear result variables
321 clrf bcd_hi ; ...
322 clrf bcd_up ; ...
323 movlw .16 ; 16 bits to do
324 movwf math_loop ; load loop counter
325 convert_bin16bcd_loop:
326 ; get MSB bit from binary
327 rlcf bin_lo,F ; shift-out MSB to CARRY
328 rlcf bin_hi,F ; ...
329 ; lower two BCDs
330 movf bcd_lo,W ; get lower BCDs to WREG
331 addwfc bcd_lo,W ; WREG = 2 * WREG + CARRY
332 daw ; decimal-adjust BCDs in WREG
333 movwf bcd_lo ; copy back WREG to lower BCDs
334 ; higher two BCDs
335 movf bcd_hi,W ; repeat for higher BCDs
336 addwfc bcd_hi,W ; ...
337 daw ; ...
338 movwf bcd_hi ; ...
339 ; upper one BCD
340 ; movf bcd_up,W ; repeat for upper BCD
341 ; addwfc bcd_up,W ; ...
342 ; daw ; ...
343 ; movwf bcd_up ; ...
344 rlcf bcd_up ; upper BCD = 2*(upper BCD) + CARRY (special version for 1 BCD only)
345 ; loop control
346 decfsz math_loop ; decrement bit counter, all done?
347 bra convert_bin16bcd_loop ; NO - loop
348 return ; YES - done
349
350
351 ;=============================================================================
352 convert2 CODE
353 ;=============================================================================
354
355
356 ;-----------------------------------------------------------------------------
357 ; Print Value in WREG as hex Number (00-FF)
358 ;
359 global outputHEX_call
360 outputHEX_call:
361 movwf bin_lo ; make a backup
362 swapf WREG,W ; swap nibbles to process upper nibble first
363 rcall outputHEX_nibble ; print nibble as ASCII
364 movf bin_lo,W ; recall backup
365 outputHEX_nibble:
366 andlw 0x0F ; isolate lower nibble
367 addlw +0x36 ; add 0x36 so that numbers >= decimal 10 will become >= 0x40
368 btfss WREG,6 ; WREG >= 0x40 ?
369 addlw -0x07 ; NO - number is < 10, move back by offset between ASCII codes for 'A' and '9'
370 addlw +0x01 ; make final common move forward to align with ASCII code
371 movwf POSTINC2 ; write ASCII code to output buffer
372 clrf INDF2 ; place a terminator at the current buffer position
373 return ; done
374
375
376 ;=============================================================================
377 convert3 CODE
378 ;=============================================================================
379
380
381 ;-----------------------------------------------------------------------------
382 ; Convert signed 16 Bit to unsigned 16 Bit and put a '-' into the buffer if negative
383 ;
384 ; Input / Output: mpr:2
385 ;
386 global convert_signed_16bit
387 convert_signed_16bit:
388 bcf neg_flag ; clear flag for negative number by default
389 btfss hi,7 ; negative number?
390 return ; NO - done
391 bsf neg_flag ; YES - set flag for negative number
392 comf hi ; - complement hi:lo
393 negf lo ; - ...
394 btfsc STATUS,C ; - ...
395 incf hi ; - ...
396 movlw '-' ; - print a minus sign
36 movwf POSTINC2 ; - ... 397 movwf POSTINC2 ; - ...
37 return ; - done 398 return ; - done
38 399
39 400
40 global output99_call 401 ;=============================================================================
41 output99_call: 402 convert4 CODE
42 clrf ignore_digits 403 ;=============================================================================
43 incf ignore_digits,F 404
44 clrf cvt_temp4 405
45 ;bra output99 406 ;-----------------------------------------------------------------------------
46 407 ; Convert Pressure in [mbar] to Depth in [cm]
47 408 ;
48 global output99 409 ; Input: mpr:2 pressure [mbar]
49 output99: 410 ; Output: mpr:2 depth [cm]
50 movlw d'99' 411 ; Destroys: up
51 cpfslt lo 412 ;
52 movwf lo ; limit to 99 413 global convert_pres_to_depth
53 movff lo,cvt_temp_lo 414 convert_pres_to_depth:
54 clrf cvt_temp_hi 415 btfsc sensor_override_active ; in pressure sensor override (simulator) mode?
55 bcf pre_zero_flag ; do not display leading zeros 416 return ; YES - convert with factor 1.0, i.e. make [mbar] = [cm]
56 417
57 LCD_val99_2: 418 movff opt_salinity,WREG ; get salinity setting (0 - 4 %, see option_table.asm)
58 movlw .10 ; 10 419 addlw d'100' ; add density of fresh water (1.00 kg/l)
59 movwf cvt_temp2 420 movwf up ; store salinity factor in up
60 clrf cvt_temp3 421
61 rcall DEC2ASCII 422 movlw .101+salinity_max ; load (upper limit + 1)
62 423 cpfslt up ; current setting > upper limit?
63 movlw .1 ; 1 424 bra convert_fix_salinity ; YES - fix salinity setting
64 movwf cvt_temp2 425
65 clrf cvt_temp3 426 movlw .99+salinity_min ; load (lower limit - 1)
66 bsf pre_zero_flag ; last figure, display zero (0) 427 cpfsgt up ; current setting > lower limit?
67 rcall DEC2ASCII 428 bra convert_fix_salinity ; YES - fix salinity setting
429
430 convert_pres_to_depth_1:
431 MOVII mpr, xA ; get pressure in [mbar]
432 MOVLI .102,xB ; conversion factor x 100 for fresh water (1.02 cm per each 1 mbar)
433 call mult16x16 ; xC:4 = xA:2 * xB:2
434 movff up,xB+0 ; get salinity in [%]
435 clrf xB+1 ; ...
436 call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder
437 MOVII xC,mpr ; copy back result as depth in [cm]
68 return 438 return
69 439
70 global output99x_call 440 convert_fix_salinity:
71 output99x_call: 441 movlw .100 ; reset to 100%, i.e. set salinity to 0%
72 clrf ignore_digits 442 movwf up ; fix value in up
73 incf ignore_digits,F 443 bra convert_pres_to_depth_1 ; continue
74 clrf cvt_temp4 444
75 445
76 movlw d'99' 446 ;=============================================================================
77 cpfslt lo 447 convert5 CODE
78 movwf lo ; limit to 99 448 ;=============================================================================
79 movff lo,cvt_temp_lo 449
80 clrf cvt_temp_hi 450
81 bsf pre_zero_flag ; display leading zeros 451 ;-----------------------------------------------------------------------------
82 bra LCD_val99_2 452 ; Convert Depth in [cm] to Depth in [feet]
83 453 ;
84 454 ; Input: mpr:2 depth in [cm]
85 global output8_call 455 ; Output: mpr:2 depth in [ft]
86 output8_call: 456 ;
87 clrf ignore_digits 457 global convert_cm_to_feet
88 incf ignore_digits,F 458 convert_cm_to_feet:
89 clrf cvt_temp4 459 MOVII mpr, xA ; depth in [cm]
90 460 btfsc sensor_override_active ; in pressure sensor override (simulator) mode?
91 output8: 461 bra convert_meter_to_feet_1 ; YES - convert with 334feet/100m
92 movff lo,cvt_temp_lo 462 MOVLI .328,xB ; NO - convert with 328feet/100m
93 clrf cvt_temp_hi 463 bra convert_common_to_feet ; - continue with common part
94 bcf pre_zero_flag ; do not display leading zeros 464
95 movlw .100 ; 100 465
96 movwf cvt_temp2 466 ;-----------------------------------------------------------------------------
97 clrf cvt_temp3 467 ; Convert Depth in [m] to Depth in [feet]
98 rcall DEC2ASCII 468 ;
99 bra LCD_val99_2 469 ; Input: lo depth in [m]
100 470 ; Output: mpr:2 depth in [ft]
101 471 ;
102 global output16_4_call 472 global convert_meter_to_feet
103 output16_4_call: ; limit to 9999 473 convert_meter_to_feet:
104 bsf show_last4 474 movf lo,W ; depth in [m]
105 ; 9999 = 27 0F = [39][15] 475 mullw .100 ; factor to convert [m] to [cm]
106 movlw .40 476 MOVII PRODL,xA ; copy depth in [cm] to xA
107 cpfslt hi ; hi < 40 ? 477 convert_meter_to_feet_1:
108 bra output16_4_call_2 ; NO - hi >= 40, do limit 478 MOVLI .334, xB ; convert with 334feet/100m to have 10ft, 20ft, 30ft, ... for stop depths
109 ; YES - hi <= 39 479 ;bra convert_common_to_feet ; continue with common part
110 movlw .39 480
111 cpfseq hi ; hi = 39 ? 481
112 bra output16_4_call_3 ; NO - hi < 39, no limit needed 482 ;-----------------------------------------------------------------------------
113 ; YES - hi = 39 483 ; Helper Function to convert_cm_to_feet and convert_meter_to_feet
114 movlw .15 484 ;
115 cpfslt lo ; lo < 15 485 convert_common_to_feet:
116 movwf lo ; NO - lo >= 15, set lo = 15 486 call mult16x16 ; xC = xA * xB = depth in [cm] * 334 feet/100 m = depth in 0.0001 feet
117 ; YES - lo <= 14 or lo set to =15 487 MOVLI .10000,xB ; divide by 10000 to turn into full feet
118 bra output16_4_call_3 ; - done 488 call div32x16 ; xC = xC / xB with xA as remainder
119 489 MOVII xC,mpr ; store result
120 output16_4_call_2: ; set to 9999 490 return ; done
121 MOVLI .9999,mpr 491
122 output16_4_call_3: 492
123 bra output16_call 493 ;=============================================================================
124 494 convert6 CODE
125 495 ;=============================================================================
126 global output16_3_call 496
127 global output16_call 497
128 global output16 498 ;-----------------------------------------------------------------------------
129 output16_3_call: ; limit to 999 499 ; Convert Temperature in Celsius to Fahrenheit
130 bsf show_last3 500 ;
131 ; Limit to 3 501 ; Input: mpr:2 temperature in [0.1 °C]
132 movlw .4 502 ; Output: mpr:2 temperature in [0.1 °F]
133 cpfslt hi 503 ;
134 bra output16_3_call_2 504 global convert_celsius_to_fahrenheit
135 movlw .3 505 convert_celsius_to_fahrenheit:
136 cpfseq hi ; = 3 ? 506 MOVII mpr,xA ; temperature in 1/10 of °C
137 bra output16_3_call_3 ; NO - done 507 ADDLI .1000,xA ; add offset of 1000 to get out of any negative numbers
138 movlw .231 ; limit to 231(+768=999...) 508 ; adjust scaling: 1°C = 1.8°F:
139 cpfslt lo 509 MOVLI .18,xB ; multiply with 18:
140 movwf lo 510 call mult16x16 ; ...
141 bra output16_3_call_3 ; done 511 MOVLI .10,xB ; divide by 10
142 output16_3_call_2: ; set to .999 512 call div32x16 ; ...
143 MOVLI .999,mpr 513 SUBLI .1480,xC ; subtract above offset (1000 * 1.8 = 1800) and add Fahrenheit-Offset (32 * 10 = 320) => subtract 1480
144 output16_3_call_3: 514 MOVII xC,mpr ; store result in mpr:2
145 output16_call: 515 return ; done
146 clrf ignore_digits 516
147 incf ignore_digits,F 517
148 clrf WREG 518 ;=============================================================================
149 output16: 519 convert7 CODE
150 movwf cvt_temp4 ; passed from output16dp macro, cleared by others. 520 ;=============================================================================
151 bcf all_zeros_flag ; do not display any zero from here unless there was at least one figure /zero 521
152 bsf leading_zeros 522
153 tstfsz cvt_temp4 ; display leading zeros at all? 523 ;-----------------------------------------------------------------------------
154 bcf leading_zeros 524 ; Convert Minutes to Hours and Minutes / Seconds to Minutes and Seconds
155 bsf DP_done2 525 ;
156 tstfsz cvt_temp4 526 ; Input: hi:lo minutes / seconds
157 bcf DP_done2 ; decimal point not yet set 527 ; Output: up:hi hours / minutes
158 movff lo,cvt_temp_lo ; copy hi:lo to cvt_temp_hi:cvt_temp_lo 528 ; lo minutes / seconds
159 movff hi,cvt_temp_hi ; ... 529 ;
160 bcf pre_zero_flag ; do not display leading zeros 530 ; trashes xA, xB, xC
161 movlw b'00010000' ; 10000s 531 ;
162 movwf cvt_temp2 532 global convert_time
163 movlw b'00100111' 533 convert_time:
164 movwf cvt_temp3 534 movff lo,xA+0 ; copy hi:lo to xA
165 btfsc show_last3 ; display only last three figures? 535 movff hi,xA+1 ; ...
166 bra output16_sk5 536 movlw d'60' ; set divisor to 60
167 btfsc show_last4 ; display only last four figures? 537 movwf xB+0 ; write 60 to xB
168 bra output16_sk5 538 clrf xB+1 ; ...
169 rcall DEC2ASCII ; NO - show all, here: 5th order digit 539 call div16x16 ; xC = xA / xB with xA as remainder
170 540 movff xC+1,up ; result is hours / minutes, copy to up (high byte)
171 output16_sk5: 541 movff xC+0,hi ; result is hours / minutes, copy to hi (low byte)
172 bcf show_last4 542 movff xA+0,lo ; remainder is minutes / seconds, copy to lo
173 movlw b'11101000' ; 1000s 543 return ; done
174 movwf cvt_temp2 544
175 movlw b'00000011' 545
176 movwf cvt_temp3 546 ;=============================================================================
177 btfsc DP_done2 ; is there a decimal point at all? 547 convert8 CODE
178 bra output16_2 ; NO - use normal display mode 548 ;=============================================================================
179 549
180 btfsc all_zeros_flag ; display any zero from here 550
181 bra output16_1 ; there was a figure /zero already 551 ;-----------------------------------------------------------------------------
182 552 ; Print full Date
183 bsf pre_zero_flag ; display figure if zero? 553 ;
184 decfsz cvt_temp4,W 554 ; Input: lo year
185 bcf pre_zero_flag ; NO 555 ; hi month
186 556 ; up day
187 output16_1: 557 ;
188 btfsc DP_done ; decimal point set already? 558 ; Output format depends on value of option opt_dateformat:
189 bsf pre_zero_flag ; YES - so display the rest 559 ; 0: MM.DD.YY
190 output16_2: 560 ; 1: DD.MM.YY
191 btfss show_last3 ; display only last three figures? 561 ; 2: YY.MM.DD
192 rcall DEC2ASCII ; NO - show all. Here: 4th order digit 562 ;
193 bcf show_last3 ; YES - so display the rest 563 ; Destroyed: hy
194 movlw b'01100100' ; 100s 564 ;
195 movwf cvt_temp2 565 global output_date
196 clrf cvt_temp3 566 output_date:
197 btfsc ignore_digit3 ; ignore 3rd-5th digit? 567 movff opt_dateformat,EEDATA ; get format (EEDATA used as temp here)
198 bra output16_5 ; YES - skip the rest 568 tstfsz EEDATA ; shall use format 0 ?
199 btfsc DP_done2 ; is there a decimal point at all? 569 bra TFT_convert_date_1 ; NO - check for format 1 or 2
200 bra output16_3 ; NO - use normal display mode 570 ; YES - use format 0: MM.DD.YY
201 btfsc all_zeros_flag ; display any zero from here 571 movff lo,hy ; - backup year to hy
202 bra output16_2_1 ; there was a figure /zero already 572 movff hi,lo ; - copy month to lo
203 bsf pre_zero_flag ; display figure if zero? 573 movff up,hi ; - copy day to hi
204 decfsz cvt_temp4,W 574 movff hy,up ; - copy year to up
205 bcf pre_zero_flag ; NO 575 bra TFT_convert_date_common ; - start output
206 576 TFT_convert_date_1:
207 output16_2_1: 577 decfsz EEDATA,F ; shall use format 1 ?
208 btfsc DP_done ; decimal point set already? 578 bra TFT_convert_date_common ; NO - use format 2: YY.MM.DD - can print directly
209 bsf pre_zero_flag ; YES - so display the rest 579 ; YES - use format 1: DD.MM.YY
210 btfsc DP_done2 ; is there a decimal point at all? 580 movff lo,hy ; - backup year to hy
211 bsf pre_zero_flag ; NO - so display the rest 581 movff up,lo ; - copy day to lo
212 output16_3: 582 movff hy,up ; - copy year to up
213 rcall DEC2ASCII ; 3th order digit... 583
214 movlw b'00001010' ; 10s 584 TFT_convert_date_common:
215 movwf cvt_temp2 585 call output99x_call ; print lo (00-99)
216 clrf cvt_temp3 586 PUTC '.' ; print spacing dot
217 btfsc DP_done2 587 movff hi,lo ; print hi (00-99)
218 bra output16_4 588 call output99x_call ; ...
219 btfsc all_zeros_flag ; display any zero from here 589 PUTC '.' ; print spacing dot
220 bra output16_3_1 ; there was a figure /zero already 590 movff up,lo ; print up (00-99)
221 bsf pre_zero_flag 591 call output99x_call ; ...
222 decfsz cvt_temp4,W 592 return ; done
223 bcf pre_zero_flag 593
224 594
225 output16_3_1: 595 ;=============================================================================
226 btfsc DP_done 596 convert9 CODE
227 bsf pre_zero_flag 597 ;=============================================================================
228 btfsc DP_done2 598
229 bsf pre_zero_flag 599
230 output16_4: 600 ;-----------------------------------------------------------------------------
231 btfsc ignore_digit4 ; ignore 4-5th digit? 601 ; Print Date by Month & Day
232 bra output16_5 ; YES - skip the rest 602 ;
233 rcall DEC2ASCII ; 2nd order digit 603 ; Input: hi month
234 604 ; up day
235 movlw b'00000001' ; 1s 605 ;
236 movwf cvt_temp2 606 ; Output format depends on value of option opt_dateformat:
237 clrf cvt_temp3 607 ; 0: MM.DD
238 bsf pre_zero_flag 608 ; 1: DD.MM
239 btfss ignore_digit5 ; ignore 5th digit? 609 ; 2: MM.DD
240 rcall DEC2ASCII ; 1st order digit 610 ;
241 bcf ignore_digit5 ; YES - clear flag 611 ; Destroyed: lo
242 output16_5: 612 ;
243 bcf ignore_digit4 ; clear flag 613 global output_date_short
244 bcf ignore_digit3 ; clear flag 614 output_date_short:
245 clrf ignore_digits 615 movff opt_dateformat,EEDATA ; get format (EEDATA used as temp here)
246 incf ignore_digits,F 616 tstfsz EEDATA ; shall use format 0 ?
247 bcf DP_done 617 bra TFT_convert_date_short2 ; NO - check for format 1 or 2
248 return ; done with convert.asm... 618 TFT_convert_date_short1: ; YES - use format 0: MMDD
249 619 movff hi,lo ; - copy month to lo
250 620 movff up,hi ; - copy day to hi
251 DEC2ASCII: 621 bra TFT_convert_date_short3 ; - start output
252 clrf cvt_temp1 ; converts into ASCII code 622 TFT_convert_date_short2:
253 DEC2ASCII_2: 623 decfsz EEDATA,F ; format 1 ?
254 movf cvt_temp3,W 624 bra TFT_convert_date_short1 ; NO - use format 2: MMDD (here its like format 0)
255 subwf cvt_temp_hi,W 625 ; YES - use format 1: DDMM
256 btfss STATUS,C 626 movff up,lo ; - copy day to lo,
257 bra DEC2ASCII_4 627 ; - month is already in hi
258 bnz DEC2ASCII_3 628 TFT_convert_date_short3:
259 movf cvt_temp2,W 629 call output99x_call ; print lo (00-99)
260 subwf cvt_temp_lo,W 630 PUTC '.' ; print spacing dot
261 btfss STATUS,C 631 movff hi,lo ; print hi (00-99)
262 bra DEC2ASCII_4 632 call output99x_call ; ...
263 DEC2ASCII_3: 633 return ; done
264 movf cvt_temp3,W 634
265 subwf cvt_temp_hi,F 635
266 movf cvt_temp2,W 636 ;=============================================================================
267 subwf cvt_temp_lo,F 637 convert10 CODE
268 btfss STATUS,C 638 ;=============================================================================
269 decf cvt_temp_hi,F 639
270 incf cvt_temp1,F 640
271 bsf pre_zero_flag 641 global output_secs_as_days_hours
272 bra DEC2ASCII_2 642 output_secs_as_days_hours:
273 DEC2ASCII_4: 643 MOVLI .3600,xB ; one hour = 3600s
274 decfsz ignore_digits,F 644 call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder -> xC+1:xC+0 holds full hours
275 return 645 MOVII xC, xA ; transfer result to xA
276 incf ignore_digits,F ; so ignore_digits stays zero for the test above 646 MOVLI .24,xB ; one day = 24 hours
277 movlw '0' ; offset for ASCII-value 647 call div16x16 ; xC:2 = xA:2 / xB:2 with xA as remainder -> xC+1:xC+0 holds full days, xA holds full hours
278 addwf cvt_temp1,W 648 MOVII xC,mpr ; copy full days into hi:lo
279 btfsc pre_zero_flag ; is this a leading zero? 649 call output99_call ; print days (0-99)
280 bra DEC2ASCII_4_1 ; NO 650 PUTC "d" ; append unit
281 btfsc leftbind 651 movff xA+0,lo ; get full hours
282 bra DEC2ASCII_6 652 call output99x_call ; print full hours (00-99)
283 movlw ' ' ; instead of leading zeros a space! 653 PUTC "h" ; append unit
284 bra DEC2ASCII_5 654 return ; done
285 DEC2ASCII_4_1: 655
286 bsf all_zeros_flag ; display any zero from here 656
287 DEC2ASCII_5: 657 ;-----------------------------------------------------------------------------
288 movwf POSTINC2
289 DEC2ASCII_6:
290 decfsz cvt_temp4,F ; set decimal point?
291 RETURN ; NO
292 movlw "." ; YES
293 movwf POSTINC2
294 bsf DP_done
295 return
296
297
298 global outputHEX_call
299 outputHEX_call: ; coverts 8 Bit integer into two hex digits
300 movwf cvt_temp1 ; copy byte to process from WREG to local temp
301 swapf cvt_temp1,F ; swap nibbles to process upper nibble first
302 rcall outputHEX_nibble ; print nibble as ASCII
303 swapf cvt_temp1,F ; swap back to process lower nibble
304 outputHEX_nibble:
305 movff cvt_temp1,cvt_temp2 ; create a working copy
306 movlw 0x0F ; mask for lower nibble
307 andwf cvt_temp2,F ; isolate lower nibble
308 movlw 0x30 ; offset from binary 0 to ASCII code for "0"
309 addwf cvt_temp2,F ; add offset
310 movlw 0x39 ; ASCII code for "9"
311 cpfsgt cvt_temp2 ; character code in cvt_temp2 pointing to something after "9"?
312 bra outputHEX_1 ; NO - character code represents "0"..."9", can be printed
313 movlw 0x07 ; YES - offset from ASCII code for character after "9" to character "A"
314 addwf cvt_temp2,F ; - add offset, character code now represents "A"..."F", can be printed now
315 outputHEX_1:
316 movff cvt_temp2,POSTINC2 ; copy character code to output buffer
317 return
318
319 658
320 END 659 END