Mercurial > public > hwos_code
annotate src/convert.asm @ 653:8bcd138ab744
add tools/o3pack.bat and the required tools/libs
author | heinrichsweikamp |
---|---|
date | Fri, 11 Aug 2023 15:53:49 +0200 |
parents | 4050675965ea |
children | 75e90cd0c2c3 |
rev | line source |
---|---|
0 | 1 ;============================================================================= |
2 ; | |
634 | 3 ; File convert.asm combined next generation V3.09.4l |
0 | 4 ; |
5 ; Converts register values to string | |
6 ; | |
7 ; Copyright (c) 2011, Matthias Heinrichs, HeinrichsWeikamp, all right reserved. | |
8 ;============================================================================= | |
9 ; HISTORY | |
10 ; 2007-10-07 : [MH] Creation for OSTC sources | |
11 ; 2010-12-10 : [jDG] Optimize macro size | |
12 ; | |
13 | |
634 | 14 #include "hwos.inc" |
15 #include "math.inc" | |
16 #include "strings.inc" | |
582 | 17 |
0 | 18 |
19 ;============================================================================= | |
634 | 20 convert1 CODE |
21 ;============================================================================= | |
0 | 22 |
634 | 23 |
24 ;----------------------------------------------------------------------------- | |
25 ; Print last two Digits or double-dots if zero - big Font | |
26 ; | |
628 | 27 global output99DD_call |
28 output99DD_call: | |
29 tstfsz lo ; value = 0 ? | |
30 bra output99_call ; NO - do normal output | |
31 movlw " " ; YES - print a space | |
32 movwf POSTINC2 ; - ... | |
634 | 33 bra print_doubledots ; - continue printing two dots |
628 | 34 |
35 | |
634 | 36 ;----------------------------------------------------------------------------- |
37 ; Print last two Digits or double-dots if zero - small Font | |
38 ; | |
628 | 39 global output99dd_call |
40 output99dd_call: | |
41 tstfsz lo ; value = 0 ? | |
42 bra output99_call ; NO - do normal output | |
634 | 43 bra print_doubledots ; YES - continue printing two dots |
44 | |
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 | |
628 | 397 movwf POSTINC2 ; - ... |
398 return ; - done | |
399 | |
400 | |
634 | 401 ;============================================================================= |
402 convert4 CODE | |
403 ;============================================================================= | |
0 | 404 |
582 | 405 |
634 | 406 ;----------------------------------------------------------------------------- |
407 ; Convert Pressure in [mbar] to Depth in [cm] | |
408 ; | |
409 ; Input: mpr:2 pressure [mbar] | |
410 ; Output: mpr:2 depth [cm] | |
411 ; Destroys: up | |
412 ; | |
413 global convert_pres_to_depth | |
414 convert_pres_to_depth: | |
415 btfsc sensor_override_active ; in pressure sensor override (simulator) mode? | |
416 return ; YES - convert with factor 1.0, i.e. make [mbar] = [cm] | |
417 | |
418 movff opt_salinity,WREG ; get salinity setting (0 - 4 %, see option_table.asm) | |
419 addlw d'100' ; add density of fresh water (1.00 kg/l) | |
420 movwf up ; store salinity factor in up | |
0 | 421 |
634 | 422 movlw .101+salinity_max ; load (upper limit + 1) |
423 cpfslt up ; current setting > upper limit? | |
424 bra convert_fix_salinity ; YES - fix salinity setting | |
425 | |
426 movlw .99+salinity_min ; load (lower limit - 1) | |
427 cpfsgt up ; current setting > lower limit? | |
428 bra convert_fix_salinity ; YES - fix salinity setting | |
0 | 429 |
634 | 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] | |
582 | 438 return |
0 | 439 |
634 | 440 convert_fix_salinity: |
441 movlw .100 ; reset to 100%, i.e. set salinity to 0% | |
442 movwf up ; fix value in up | |
443 bra convert_pres_to_depth_1 ; continue | |
444 | |
445 | |
446 ;============================================================================= | |
447 convert5 CODE | |
448 ;============================================================================= | |
449 | |
0 | 450 |
634 | 451 ;----------------------------------------------------------------------------- |
452 ; Convert Depth in [cm] to Depth in [feet] | |
453 ; | |
454 ; Input: mpr:2 depth in [cm] | |
455 ; Output: mpr:2 depth in [ft] | |
456 ; | |
457 global convert_cm_to_feet | |
458 convert_cm_to_feet: | |
459 MOVII mpr, xA ; depth in [cm] | |
460 btfsc sensor_override_active ; in pressure sensor override (simulator) mode? | |
461 bra convert_meter_to_feet_1 ; YES - convert with 334feet/100m | |
462 MOVLI .328,xB ; NO - convert with 328feet/100m | |
463 bra convert_common_to_feet ; - continue with common part | |
582 | 464 |
465 | |
634 | 466 ;----------------------------------------------------------------------------- |
467 ; Convert Depth in [m] to Depth in [feet] | |
468 ; | |
469 ; Input: lo depth in [m] | |
470 ; Output: mpr:2 depth in [ft] | |
471 ; | |
472 global convert_meter_to_feet | |
473 convert_meter_to_feet: | |
474 movf lo,W ; depth in [m] | |
475 mullw .100 ; factor to convert [m] to [cm] | |
476 MOVII PRODL,xA ; copy depth in [cm] to xA | |
477 convert_meter_to_feet_1: | |
478 MOVLI .334, xB ; convert with 334feet/100m to have 10ft, 20ft, 30ft, ... for stop depths | |
479 ;bra convert_common_to_feet ; continue with common part | |
0 | 480 |
634 | 481 |
482 ;----------------------------------------------------------------------------- | |
483 ; Helper Function to convert_cm_to_feet and convert_meter_to_feet | |
484 ; | |
485 convert_common_to_feet: | |
486 call mult16x16 ; xC = xA * xB = depth in [cm] * 334 feet/100 m = depth in 0.0001 feet | |
487 MOVLI .10000,xB ; divide by 10000 to turn into full feet | |
488 call div32x16 ; xC = xC / xB with xA as remainder | |
489 MOVII xC,mpr ; store result | |
490 return ; done | |
582 | 491 |
0 | 492 |
634 | 493 ;============================================================================= |
494 convert6 CODE | |
495 ;============================================================================= | |
496 | |
623 | 497 |
634 | 498 ;----------------------------------------------------------------------------- |
499 ; Convert Temperature in Celsius to Fahrenheit | |
500 ; | |
501 ; Input: mpr:2 temperature in [0.1 °C] | |
502 ; Output: mpr:2 temperature in [0.1 °F] | |
503 ; | |
504 global convert_celsius_to_fahrenheit | |
505 convert_celsius_to_fahrenheit: | |
506 MOVII mpr,xA ; temperature in 1/10 of °C | |
507 ADDLI .1000,xA ; add offset of 1000 to get out of any negative numbers | |
508 ; adjust scaling: 1°C = 1.8°F: | |
509 MOVLI .18,xB ; multiply with 18: | |
510 call mult16x16 ; ... | |
511 MOVLI .10,xB ; divide by 10 | |
512 call div32x16 ; ... | |
513 SUBLI .1480,xC ; subtract above offset (1000 * 1.8 = 1800) and add Fahrenheit-Offset (32 * 10 = 320) => subtract 1480 | |
514 MOVII xC,mpr ; store result in mpr:2 | |
515 return ; done | |
516 | |
517 | |
518 ;============================================================================= | |
519 convert7 CODE | |
520 ;============================================================================= | |
300
5ad479f2a868
Merged Screen layout mod #1 into Screen layout work #3
Janos Kovacs <kovjanos@gmail.com>
parents:
275
diff
changeset
|
521 |
623 | 522 |
634 | 523 ;----------------------------------------------------------------------------- |
524 ; Convert Minutes to Hours and Minutes / Seconds to Minutes and Seconds | |
525 ; | |
526 ; Input: hi:lo minutes / seconds | |
527 ; Output: up:hi hours / minutes | |
528 ; lo minutes / seconds | |
529 ; | |
530 ; trashes xA, xB, xC | |
531 ; | |
532 global convert_time | |
533 convert_time: | |
534 movff lo,xA+0 ; copy hi:lo to xA | |
535 movff hi,xA+1 ; ... | |
536 movlw d'60' ; set divisor to 60 | |
537 movwf xB+0 ; write 60 to xB | |
538 clrf xB+1 ; ... | |
539 call div16x16 ; xC = xA / xB with xA as remainder | |
540 movff xC+1,up ; result is hours / minutes, copy to up (high byte) | |
541 movff xC+0,hi ; result is hours / minutes, copy to hi (low byte) | |
542 movff xA+0,lo ; remainder is minutes / seconds, copy to lo | |
543 return ; done | |
0 | 544 |
545 | |
634 | 546 ;============================================================================= |
547 convert8 CODE | |
548 ;============================================================================= | |
582 | 549 |
550 | |
634 | 551 ;----------------------------------------------------------------------------- |
552 ; Print full Date | |
553 ; | |
554 ; Input: lo year | |
555 ; hi month | |
556 ; up day | |
557 ; | |
558 ; Output format depends on value of option opt_dateformat: | |
559 ; 0: MM.DD.YY | |
560 ; 1: DD.MM.YY | |
561 ; 2: YY.MM.DD | |
562 ; | |
563 ; Destroyed: hy | |
564 ; | |
565 global output_date | |
566 output_date: | |
567 movff opt_dateformat,EEDATA ; get format (EEDATA used as temp here) | |
568 tstfsz EEDATA ; shall use format 0 ? | |
569 bra TFT_convert_date_1 ; NO - check for format 1 or 2 | |
570 ; YES - use format 0: MM.DD.YY | |
571 movff lo,hy ; - backup year to hy | |
572 movff hi,lo ; - copy month to lo | |
573 movff up,hi ; - copy day to hi | |
574 movff hy,up ; - copy year to up | |
575 bra TFT_convert_date_common ; - start output | |
576 TFT_convert_date_1: | |
577 decfsz EEDATA,F ; shall use format 1 ? | |
578 bra TFT_convert_date_common ; NO - use format 2: YY.MM.DD - can print directly | |
579 ; YES - use format 1: DD.MM.YY | |
580 movff lo,hy ; - backup year to hy | |
581 movff up,lo ; - copy day to lo | |
582 movff hy,up ; - copy year to up | |
583 | |
584 TFT_convert_date_common: | |
585 call output99x_call ; print lo (00-99) | |
586 PUTC '.' ; print spacing dot | |
587 movff hi,lo ; print hi (00-99) | |
588 call output99x_call ; ... | |
589 PUTC '.' ; print spacing dot | |
590 movff up,lo ; print up (00-99) | |
591 call output99x_call ; ... | |
592 return ; done | |
593 | |
594 | |
595 ;============================================================================= | |
596 convert9 CODE | |
597 ;============================================================================= | |
582 | 598 |
604 | 599 |
634 | 600 ;----------------------------------------------------------------------------- |
601 ; Print Date by Month & Day | |
602 ; | |
603 ; Input: hi month | |
604 ; up day | |
605 ; | |
606 ; Output format depends on value of option opt_dateformat: | |
607 ; 0: MM.DD | |
608 ; 1: DD.MM | |
609 ; 2: MM.DD | |
610 ; | |
611 ; Destroyed: lo | |
612 ; | |
613 global output_date_short | |
614 output_date_short: | |
615 movff opt_dateformat,EEDATA ; get format (EEDATA used as temp here) | |
616 tstfsz EEDATA ; shall use format 0 ? | |
617 bra TFT_convert_date_short2 ; NO - check for format 1 or 2 | |
618 TFT_convert_date_short1: ; YES - use format 0: MMDD | |
619 movff hi,lo ; - copy month to lo | |
620 movff up,hi ; - copy day to hi | |
621 bra TFT_convert_date_short3 ; - start output | |
622 TFT_convert_date_short2: | |
623 decfsz EEDATA,F ; format 1 ? | |
624 bra TFT_convert_date_short1 ; NO - use format 2: MMDD (here its like format 0) | |
625 ; YES - use format 1: DDMM | |
626 movff up,lo ; - copy day to lo, | |
627 ; - month is already in hi | |
628 TFT_convert_date_short3: | |
629 call output99x_call ; print lo (00-99) | |
630 PUTC '.' ; print spacing dot | |
631 movff hi,lo ; print hi (00-99) | |
632 call output99x_call ; ... | |
633 return ; done | |
604 | 634 |
635 | |
634 | 636 ;============================================================================= |
637 convert10 CODE | |
638 ;============================================================================= | |
639 | |
640 | |
641 global output_secs_as_days_hours | |
642 output_secs_as_days_hours: | |
643 MOVLI .3600,xB ; one hour = 3600s | |
644 call div32x16 ; xC:4 = xC:4 / xB:2 with xA as remainder -> xC+1:xC+0 holds full hours | |
645 MOVII xC, xA ; transfer result to xA | |
646 MOVLI .24,xB ; one day = 24 hours | |
647 call div16x16 ; xC:2 = xA:2 / xB:2 with xA as remainder -> xC+1:xC+0 holds full days, xA holds full hours | |
648 MOVII xC,mpr ; copy full days into hi:lo | |
649 call output99_call ; print days (0-99) | |
650 PUTC "d" ; append unit | |
651 movff xA+0,lo ; get full hours | |
652 call output99x_call ; print full hours (00-99) | |
653 PUTC "h" ; append unit | |
654 return ; done | |
655 | |
656 | |
657 ;----------------------------------------------------------------------------- | |
658 | |
582 | 659 END |