Mercurial > public > hwos_code
comparison src/options.asm @ 623:c40025d8e750
3.03 beta released
author | heinrichsweikamp |
---|---|
date | Mon, 03 Jun 2019 14:01:48 +0200 |
parents | d866684249bd |
children | cd58f7fc86db |
comparison
equal
deleted
inserted
replaced
622:02d1386429a6 | 623:c40025d8e750 |
---|---|
1 ;============================================================================= | 1 ;============================================================================= |
2 ; | 2 ; |
3 ; File options.asm REFACTORED VERSION V2.99g | 3 ; File options.asm next combined generation V3.03-1 |
4 ; | 4 ; |
5 ; Manage all options data. | 5 ; Manage all options data. |
6 ; | 6 ; |
7 ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. | 7 ; Copyright (c) 2011, JD Gascuel, HeinrichsWeikamp, all right reserved. |
8 ;============================================================================= | 8 ;============================================================================= |
22 | 22 |
23 extern write_eeprom | 23 extern write_eeprom |
24 extern read_eeprom | 24 extern read_eeprom |
25 extern eeprom_serial_save,eeprom_opt_backup | 25 extern eeprom_serial_save,eeprom_opt_backup |
26 extern option_table_begin,option_table_end | 26 extern option_table_begin,option_table_end |
27 extern convert_meter_to_feet | |
27 | 28 |
28 options CODE | 29 options CODE |
29 | 30 |
30 ;============================================================================= | 31 ;============================================================================= |
31 ; Reset all options to factory defaults | 32 ; Reset all options to factory defaults |
77 ; | 78 ; |
78 ; INPUT: none | 79 ; INPUT: none |
79 ; OUTPUT: none | 80 ; OUTPUT: none |
80 ; TRASH: TBLPTR, TABLAT, WREG, FSR0, FSR1, FSR2 | 81 ; TRASH: TBLPTR, TABLAT, WREG, FSR0, FSR1, FSR2 |
81 ; | 82 ; |
82 global option_check_all ; check all options and reset options if out of min/max boundary | 83 global option_check_all ; check all option and reset option if out of min/max boundary |
83 option_check_all: | 84 option_check_all: |
85 bcf option_repaired ; no option needed repair up to now | |
84 movlw LOW(option_table_begin) ; point to option table begin | 86 movlw LOW(option_table_begin) ; point to option table begin |
85 movwf FSR0L | 87 movwf FSR0L |
86 movlw HIGH(option_table_begin) | 88 movlw HIGH(option_table_begin) |
87 movwf FSR0H | 89 movwf FSR0H |
88 | |
89 option_check_all_1: | 90 option_check_all_1: |
90 movlw LOW(option_table_end) ; get low byte of end of table address | 91 movlw LOW(option_table_end) ; get low byte of end of table address |
91 cpfseq FSR0L ; does it equal the current pointer position? | 92 cpfseq FSR0L ; does it equal the current pointer position? |
92 bra option_check_all_2 ; NO - more options to process | 93 bra option_check_all_2 ; NO - more options to process |
93 movlw HIGH(option_table_end) ; get high byte of end of table address | 94 movlw HIGH(option_table_end) ; get high byte of end of table address |
95 bra option_check_all_2 ; NO - more options to process | 96 bra option_check_all_2 ; NO - more options to process |
96 bra option_check_all_3 ; YES to both - end of option table reached | 97 bra option_check_all_3 ; YES to both - end of option table reached |
97 option_check_all_2: | 98 option_check_all_2: |
98 rcall option_check ; check one option... | 99 rcall option_check ; check one option... |
99 bra option_check_all_1 ; ... and loop | 100 bra option_check_all_1 ; ... and loop |
100 | |
101 option_check_all_3: | 101 option_check_all_3: |
102 bsf FLAG_diluent_setup ; setup checking diluents | 102 bsf is_diluent_menu ; setup checking diluents |
103 call gaslist_cleanup_list ; check and correct multiple or none First diluent | 103 call gaslist_cleanup_list ; check and correct multiple or none First diluent |
104 bcf FLAG_diluent_setup ; setup checking gases | 104 bcf is_diluent_menu ; setup checking gases |
105 call gaslist_cleanup_list ; check and correct multiple or none First gas | 105 call gaslist_cleanup_list ; check and correct multiple or none First gas |
106 call option_cleanup_oCCRMode ; check and correct sensor mode | 106 IFDEF _ccr_pscr |
107 call option_cleanup_oCCRMode ; check and correct CCR / pSCR mode | |
108 ENDIF | |
107 call option_cleanup_GF ; check and correct GFlow <= GFhigh | 109 call option_cleanup_GF ; check and correct GFlow <= GFhigh |
108 return ; all done | 110 return ; all done |
111 | |
112 | |
109 | 113 |
110 ;============================================================================= | 114 ;============================================================================= |
111 ; Read option handle | 115 ; Read option handle |
112 ; INPUT: FSR0 = option handle | 116 ; INPUT: FSR0 = option handle |
113 ; OUTPUT: FSR1 = address of variable. | 117 ; OUTPUT: FSR1 = address of variable. |
114 ; TRASH: TBLPTR, TABLAT, WREG, FSR0, FSR1 | 118 ; TRASH: TBLPTR, TABLAT, WREG, FSR0, FSR1 |
115 ; | 119 ; |
116 option_read: | 120 option_read: |
117 movff FSR0L,TBLPTRL | 121 movff FSR0L,TBLPTRL ; set memory address of option data set, low byte |
118 movlw HIGH(option_table_begin) ; get 8 high bits. | 122 movlw HIGH(option_table_begin) ; get table begin address, high byte |
119 andlw 0xF0 ; keep only the 4 highest ones | 123 andlw 0xF0 ; keep only the upper nibble |
120 iorwf FSR0H,W ; cat with the known 4 lower ones | 124 iorwf FSR0H,W ; add the memory address of the option data set, high byte |
121 movwf TBLPTRH ; we have the high byte | 125 movwf TBLPTRH ; set the resulting memory address, high byte |
122 movlw UPPER(option_table_begin) | 126 movlw UPPER(option_table_begin) ; get table begin address, upper byte |
123 movwf TBLPTRU | 127 movwf TBLPTRU ; set memory address of option data set, upper byte |
124 | 128 |
125 ; Read type, default and register from table | 129 ; Read type, default and register from table |
126 tblrd*+ | 130 tblrd*+ |
127 movff TABLAT,opt_type | 131 movff TABLAT,opt_type |
128 tblrd*+ | 132 tblrd*+ |
141 movff TABLAT,opt_unit+1 | 145 movff TABLAT,opt_unit+1 |
142 tblrd*+ | 146 tblrd*+ |
143 movff TABLAT,FSR1L | 147 movff TABLAT,FSR1L |
144 tblrd*+ | 148 tblrd*+ |
145 movff TABLAT,FSR1H | 149 movff TABLAT,FSR1H |
146 movff TBLPTRL,FSR0L ; advance handle, too, for reset_all | 150 movff TBLPTRL,FSR0L ; advance handle to next option data set (used for reset_all) |
147 movff TBLPTRH,FSR0H | 151 movff TBLPTRH,FSR0H |
148 return | 152 return |
149 | 153 |
150 ;============================================================================= | 154 ;============================================================================= |
151 ; Check one option and reset if it's out of it's min/max boundaries | 155 ; Check one option and reset if it's out of it's min/max boundaries |
157 ; Read type, default and register from table | 161 ; Read type, default and register from table |
158 rcall option_read | 162 rcall option_read |
159 | 163 |
160 ; Switch on type | 164 ; Switch on type |
161 movf opt_type,W ; get option type | 165 movf opt_type,W ; get option type |
162 xorlw 2 ; type == STRING ? | 166 xorlw .2 ; type == STRING ? |
163 bz option_check_string ; YES | 167 bz option_check_string ; YES |
164 movf opt_type,W ; get option type (again) | 168 movf opt_type,W ; get option type (again) |
165 xorlw 1 ; type == ENUM8 ? | 169 xorlw .1 ; type == ENUM8 ? |
166 bz option_check_enum8 ; YES - check if lower then max. value only | 170 bz option_check_enum8 ; YES - check if lower then max. value only |
167 ; NO to all - must be integer then | 171 ; NO to all - must be integer then |
168 tstfsz opt_min ; opt_min = 0 ? | 172 tstfsz opt_min ; opt_min = 0 ? |
169 bra option_check_both ; NO - check it | 173 bra option_check_both ; NO - check it |
170 bra option_check_enum8 ; check max only | 174 bra option_check_enum8 ; check max only |
171 | 175 |
172 option_check_both: | 176 option_check_both: |
173 decf opt_min,W ; check against minimum value | 177 decf opt_min,W ; check against minimum value |
174 cpfsgt INDF1 ; bigger then opt_min - 1 ? | 178 cpfsgt INDF1 ; bigger than opt_min - 1 ? |
175 bra option_check_reset ; NO - reset option | 179 bra option_check_reset ; NO - reset option |
176 option_check_enum8: ; check against maximum value | 180 option_check_enum8: ; check against maximum value |
177 infsnz opt_max,W ; max = 255? | 181 infsnz opt_max,W ; max = 255? |
178 return ; YES - ignore the max. test | 182 return ; YES - ignore the max. test |
179 cpfslt INDF1 ; NO - smaller then opt_max + 1 ? | 183 cpfslt INDF1 ; NO - smaller then opt_max + 1 ? |
180 bra option_check_reset ; NO - reset option | 184 bra option_check_reset ; NO - reset option |
181 return ; YES - in range, return | 185 return ; YES - within range, return |
182 | 186 |
183 option_check_reset: | 187 option_check_reset: |
184 movff opt_default,INDF1 ; reset option to default | 188 movff opt_default,INDF1 ; reset option to default |
189 bsf option_repaired ; flag that an option was repaired | |
185 return ; done | 190 return ; done |
186 | 191 |
187 option_check_string: | 192 option_check_string: |
188 return | 193 return |
189 | 194 |
268 addlw .1 ; YES - +1 | 273 addlw .1 ; YES - +1 |
269 movwf EEADRH | 274 movwf EEADRH |
270 movf opt_type,W ; get option type | 275 movf opt_type,W ; get option type |
271 xorlw 2 ; option type is string ? | 276 xorlw 2 ; option type is string ? |
272 bz option_save_string ; YES | 277 bz option_save_string ; YES |
273 movff INDF1,EEDATA ; one byte to be saved to EEPROM | 278 movff INDF1,EEDATA ; NO - one byte to be saved to EEPROM |
274 btfss EEADRH,1 ; EEADR:EEADRH < 512 ? | 279 btfss EEADRH,1 ; - EEADR:EEADRH < 512 ? |
275 call write_eeprom ; YES - write | 280 call write_eeprom ; YES - write |
276 return | 281 return ; (NO) - done |
277 option_save_string: | 282 option_save_string: |
278 movff POSTINC1,EEDATA ; write one byte | 283 movff POSTINC1,EEDATA ; write one byte |
279 btfss EEADRH,1 ; EEADR:EEADRH < 512 ? | 284 btfss EEADRH,1 ; EEADR:EEADRH < 512 ? |
280 call write_eeprom ; Yes - write | 285 call write_eeprom ; YES - write |
281 infsnz EEADR,F | 286 infsnz EEADR,F ; (NO) - increment EEPROM address |
282 incf EEADRH,F | 287 incf EEADRH,F ; - ... |
283 decfsz opt_max ; decrement string length | 288 decfsz opt_max ; - decrement string length, done? |
284 bra option_save_string ; loop while not finished | 289 bra option_save_string ; NO - loop |
285 return | 290 return ; YES |
286 | 291 |
287 ;============================================================================= | 292 ;============================================================================= |
288 | 293 |
289 global option_restore_all ; restore options from EEPROM | 294 global option_restore_all ; restore options from EEPROM |
290 option_restore_all: | 295 option_restore_all: |
438 incf INDF1,W | 443 incf INDF1,W |
439 cpfsgt opt_max | 444 cpfsgt opt_max |
440 clrf WREG | 445 clrf WREG |
441 movwf INDF1 | 446 movwf INDF1 |
442 option_inc_enum8_1: | 447 option_inc_enum8_1: |
448 IFDEF _ccr_pscr | |
443 ; Now some rather crude hack into this routine to unify CCR & pSCR mode setting | 449 ; Now some rather crude hack into this routine to unify CCR & pSCR mode setting |
444 movlw .25 ; EEPROM address of option oCCRMode | 450 movlw .25 ; EEPROM address of option oCCRMode |
445 cpfseq opt_eeprom ; editing oCCRMode right now? | 451 cpfseq opt_eeprom ; editing oCCRMode right now? |
446 bra option_inc_enum8_2 ; NO - check next option | 452 bra option_inc_enum8_2 ; NO - check next option |
453 IFDEF _external_sensor | |
447 btfsc analog_o2_input ; YES - does hosting OSTC have an analog interface? | 454 btfsc analog_o2_input ; YES - does hosting OSTC have an analog interface? |
448 bra option_inc_enum8_1a ; YES - setting 'sensor' allowed | 455 bra option_inc_enum8_1a ; YES - setting 'sensor' allowed |
449 btfsc optical_input ; does hosting OSTC have an optical interface? | 456 btfsc optical_input ; does hosting OSTC have an optical interface? |
450 bra option_inc_enum8_1a ; YES - setting 'sensor' allowed | 457 bra option_inc_enum8_1a ; YES - setting 'sensor' allowed |
458 ENDIF ; _external_sensor | |
451 movf INDF1,W ; NO to both - get mode (=0: fixed SP, =1: Sensor, =2: AutoSP) | 459 movf INDF1,W ; NO to both - get mode (=0: fixed SP, =1: Sensor, =2: AutoSP) |
452 xorlw .1 ; - in sensor mode? | 460 xorlw .1 ; - in sensor mode? |
453 bnz option_inc_enum8_1a ; NO - continue with next check | 461 bnz option_inc_enum8_1a ; NO - continue with next check |
454 incf INDF1,F ; YES - advance option value to AutoSP | 462 incf INDF1,F ; YES - advance option value to AutoSP |
455 option_inc_enum8_1a: | 463 option_inc_enum8_1a: |
457 xorlw .4 ; in pSCR mode? | 465 xorlw .4 ; in pSCR mode? |
458 bnz option_inc_enum8_1_exit ; NO - done | 466 bnz option_inc_enum8_1_exit ; NO - done |
459 bcf INDF1,1 ; YES - clear bit 1 because opt_ccr_mode may only be 0 or 1 (reverts AutoSP to calculated SP) | 467 bcf INDF1,1 ; YES - clear bit 1 because opt_ccr_mode may only be 0 or 1 (reverts AutoSP to calculated SP) |
460 option_inc_enum8_1_exit: | 468 option_inc_enum8_1_exit: |
461 return ; done | 469 return ; done |
470 ENDIF ; _ccr_pscr | |
462 option_inc_enum8_2: | 471 option_inc_enum8_2: |
463 ; (unused) | 472 ; (unused) |
464 option_inc_enum8_3: | 473 option_inc_enum8_3: |
465 | |
466 IFDEF _rx_functions | |
467 global option_cleanup_oTrMode_CCR ; embedded clean-up entry-point | |
468 global option_cleanup_oTrMode_no_CCR ; embedded clean-up entry-point | |
469 ; Now some rather crude hack to correct opt_TR_mode in dependency of opt_dive_mode | 474 ; Now some rather crude hack to correct opt_TR_mode in dependency of opt_dive_mode |
470 movlw .8 ; EEPROM address of option opt_dive_mode | 475 movlw .8 ; EEPROM address of option opt_dive_mode |
471 cpfseq opt_eeprom ; editing opt_dive_mode right now? | 476 cpfseq opt_eeprom ; editing opt_dive_mode right now? |
472 bra option_inc_enum8_4 ; NO - check next option | 477 bra option_inc_enum8_4 ; NO - check next option |
473 movff opt_dive_mode,WREG ; YES - get dive mode: 0=OC, 1=CCR, 2=Gauge, 3=Apnea, 4=pSCR | 478 movf INDF1,W ; YES - get option value: 0=OC, 1=CCR, 2=Gauge, 3=Apnea, 4=pSCR |
474 decfsz WREG,W ; dive mode = 1 CCR? | 479 xorlw .1 ; in CCR mode? |
475 bra option_inc_enum8_3a ; NO - in any other mode | 480 bnz option_inc_enum8_3a ; NO - in some other mode |
481 IFNDEF _ccr_pscr | |
482 incf INDF1,f ; YES - no CCR mode compiled in, advance to gauge mode | |
483 bra option_inc_enum8_3_exit ; - done | |
484 ENDIF ; _ccr_pscr | |
485 IFDEF _rx_functions | |
486 global option_cleanup_oTrMode_CCR ; embedded clean-up entry-point | |
476 option_cleanup_oTrMode_CCR: ; entry point from cleanup during restart | 487 option_cleanup_oTrMode_CCR: ; entry point from cleanup during restart |
477 movff opt_TR_mode,WREG ; YES - get TR mode | 488 movff opt_TR_mode,WREG ; get TR mode |
478 xorlw .2 ; - mode = 2 (ind.double)? | 489 xorlw .2 ; mode = 2 (ind.double)? |
479 bnz option_inc_enum8_3_exit ; NO - done | 490 bnz option_inc_enum8_3_exit ; NO - done |
480 bra option_inc_enum8_3_reset ; YES - revert mode to 1 (on) | 491 bra option_inc_enum8_3_reset ; YES - revert mode to 1 (on) |
492 ENDIF ; _rx_functions | |
481 option_inc_enum8_3a: ; any mode other than CCR | 493 option_inc_enum8_3a: ; any mode other than CCR |
494 IFNDEF _ccr_pscr | |
495 movf INDF1,W ; get option value: 0=OC, 1=CCR, 2=Gauge, 3=Apnea, 4=pSCR | |
496 xorlw .4 ; in pSCR mode? | |
497 bnz option_inc_enum8_3b ; NO - in some other mode | |
498 clrf INDF1 ; YES - no pSCR mode compiled in, advance to 0 "OC" | |
499 bra option_inc_enum8_3_exit ; - done | |
500 ENDIF ; _ccr_pscr | |
501 option_inc_enum8_3b: | |
502 global option_cleanup_oTrMode_no_CCR ; embedded clean-up entry-point | |
482 option_cleanup_oTrMode_no_CCR: ; entry point from cleanup during restart | 503 option_cleanup_oTrMode_no_CCR: ; entry point from cleanup during restart |
483 movff opt_TR_mode,WREG ; get TR mode | 504 movff opt_TR_mode,WREG ; get TR mode |
484 xorlw .3 ; mode = 3 (CCR Dil+O2)? | 505 xorlw .3 ; mode = 3 (CCR Dil+O2)? |
485 bnz option_inc_enum8_3_exit ; NO - done | 506 bnz option_inc_enum8_3_exit ; NO - done |
486 option_inc_enum8_3_reset: ; YES - revert to mode 1 (on) | 507 option_inc_enum8_3_reset: ; YES - revert to mode 1 (on) |
487 movlw .1 ; load coding of mode "on" | 508 movlw .1 ; load coding of mode "on" |
488 movff WREG,opt_TR_mode ; write to option | 509 movff WREG,opt_TR_mode ; write to option |
489 option_inc_enum8_3_exit: | 510 option_inc_enum8_3_exit: |
490 return ; done | 511 return ; done |
491 option_inc_enum8_4: | 512 option_inc_enum8_4: |
513 IFDEF _rx_functions | |
492 ; Now some rather crude hack to advance opt_TR_mode in dependency of opt_dive_mode | 514 ; Now some rather crude hack to advance opt_TR_mode in dependency of opt_dive_mode |
493 movlw .222 ; EEPROM address of option opt_TR_mode | 515 movlw .222 ; EEPROM address of option opt_TR_mode |
494 cpfseq opt_eeprom ; editing opt_TR_mode right now? | 516 cpfseq opt_eeprom ; editing opt_TR_mode right now? |
495 bra option_inc_enum8_5 ; NO - check next option | 517 bra option_inc_enum8_5 ; NO - check next option |
496 movff opt_dive_mode,WREG ; YES - get dive mode: 0=OC, 1=CCR, 2=Gauge, 3=Apnea, 4=pSCR | 518 movff opt_dive_mode,WREG ; YES - get dive mode: 0=OC, 1=CCR, 2=Gauge, 3=Apnea, 4=pSCR |
506 xorlw .3 ; mode = 3 (CCR Dil+O2)? | 528 xorlw .3 ; mode = 3 (CCR Dil+O2)? |
507 bnz option_inc_enum8_4_exit ; NO - done | 529 bnz option_inc_enum8_4_exit ; NO - done |
508 clrf INDF1 ; YES - advance option value to 0 "off" | 530 clrf INDF1 ; YES - advance option value to 0 "off" |
509 option_inc_enum8_4_exit: | 531 option_inc_enum8_4_exit: |
510 return ; done | 532 return ; done |
511 ENDIF | 533 ENDIF ; _rx_functions |
512 | |
513 option_inc_enum8_5: | 534 option_inc_enum8_5: |
514 return | 535 return |
515 | 536 |
516 | 537 |
517 option_inc_string: ; no editing available | 538 option_inc_string: ; no editing available |
518 return | 539 return |
519 | 540 |
520 | 541 |
542 IFDEF _ccr_pscr | |
521 global option_cleanup_oCCRMode | 543 global option_cleanup_oCCRMode |
522 global option_cleanup_oCCRMode_pSCR | 544 global option_cleanup_oCCRMode_pSCR |
523 global option_cleanup_oCCRMode_CCR | 545 global option_cleanup_oCCRMode_CCR |
524 option_cleanup_oCCRMode: ; in pSCR mode, revert AutoSP (2) to calculated SP (0), in pSCR and CCR revert Sensor to fixed SP if no sensor interface available | 546 option_cleanup_oCCRMode: ; in pSCR mode, revert AutoSP (2) to calculated SP (0), in pSCR and CCR revert Sensor to fixed SP if no sensor interface available |
525 banksel opt_dive_mode ; select options bank | 547 movff opt_dive_mode,WREG ; get dive mode into WREG (0=OC, 1=CCR, 2=Gauge, 3=Apnea, 4=pSCR) |
526 movf opt_dive_mode,W ; get dive mode: 0=OC, 1=CCR, 2=Gauge, 3=Apnea, 4=pSCR | |
527 xorlw .4 ; in pSCR mode? | 548 xorlw .4 ; in pSCR mode? |
528 bnz option_cleanup_oCCRMode_CCR ; NO - check if sensor is available on hosting OSTC | 549 bnz option_cleanup_oCCRMode_CCR ; NO - check if sensor is available on hosting OSTC |
529 option_cleanup_oCCRMode_pSCR: ; jump-in from start.asm if known to be in pSCR mode | 550 option_cleanup_oCCRMode_pSCR: ; jump-in from start.asm if known to be in pSCR mode |
530 banksel opt_ccr_mode ; select options bank | 551 banksel opt_ccr_mode ; YES - select options bank |
531 bcf opt_ccr_mode,1 ; YES - clear bit 1 because opt_ccr_mode may only be 0 or 1 (reverts AutoSP to calculated SP) | 552 bcf opt_ccr_mode,1 ; - clear bit 1 because opt_ccr_mode may only be 0 or 1 (reverts AutoSP to calculated SP, keeps sensor) |
553 banksel common ; - back to bank common | |
554 bsf option_repaired ; - flag that an option was repaired | |
532 option_cleanup_oCCRMode_CCR: ; continue from above & jump-in from start.asm if known to be in CCR mode | 555 option_cleanup_oCCRMode_CCR: ; continue from above & jump-in from start.asm if known to be in CCR mode |
533 banksel common ; flags are located in bank common | 556 IFDEF _external_sensor |
534 btfsc analog_o2_input ; does hosting OSTC have an analog interface? | 557 btfsc analog_o2_input ; analog interface available? |
535 bra option_cleanup_oCCRMode_exit ; YES - setting 'sensor' allowed | 558 return ; YES - setting 'sensor' allowed |
536 btfsc optical_input ; does hosting OSTC have an optical interface? | 559 btfsc optical_input ; does hosting OSTC have an optical interface? |
537 bra option_cleanup_oCCRMode_exit ; YES - setting 'sensor' allowed | 560 return ; YES - setting 'sensor' allowed |
538 banksel opt_ccr_mode ; NO to both - select options bank | 561 ENDIF |
539 movf opt_ccr_mode,W ; - get CCR mode | 562 movff opt_ccr_mode,WREG ; NO to both - get CCR mode |
540 xorlw .1 ; - CCR mode = sensor? | 563 xorlw .1 ; - coding for sensor |
541 bnz option_cleanup_oCCRMode_exit ; NO - ok | 564 tstfsz WREG ; - CCR mode = sensor? |
542 clrf opt_ccr_mode ; - YES - set CCR mode to fixed SP (0) | 565 return ; NO - setting allowed |
543 option_cleanup_oCCRMode_exit: | 566 banksel opt_ccr_mode ; YES - setting not allowed, select options bank |
544 banksel common ; back to bank common | 567 clrf opt_ccr_mode ; - revert setting to 0 (fixed or calculated SP) |
545 return ; done | 568 banksel common ; - back to bank common |
569 bsf option_repaired ; - flag that an option was repaired | |
570 return ; - done | |
571 ENDIF ; _ccr_pscr | |
572 | |
546 | 573 |
547 option_cleanup_GF: | 574 option_cleanup_GF: |
548 ; cleanup normal GF | 575 ; cleanup normal GF |
549 movff opt_GF_high,WREG ; copy normal GF high to WREG | 576 movff opt_GF_high,WREG ; copy normal GF high to WREG |
550 movff opt_GF_low,lo ; copy normal GF low to lo | 577 movff opt_GF_low,mpr ; copy normal GF low to mpr |
551 cpfsgt lo ; GF low > GF high ? | 578 cpfsgt mpr ; GF low > GF high ? |
552 bra option_cleanup_GF_2 ; NO - option ok, check next option | 579 bra option_cleanup_GF_2 ; NO - option ok, check next option |
553 movwf lo ; YES - copy GF high to lo | 580 movwf mpr ; YES - copy GF high to mpr |
554 movlw .100 ; - load GF low limit of 100% into WREG | 581 movlw .100 ; - load GF low limit of 100% into WREG |
555 cpfsgt lo ; - lo > 100 ? | 582 cpfsgt mpr ; - mpr > 100 ? |
556 bra option_cleanup_GF_1 ; NO - correct GF low to GF high | 583 bra option_cleanup_GF_1 ; NO - correct GF low to GF high |
557 movwf lo ; YES - correct GF low to 100% | 584 movwf mpr ; YES - correct GF low to 100% |
558 option_cleanup_GF_1: | 585 option_cleanup_GF_1: |
559 movff lo,opt_GF_low ; store corrected GF low | 586 movff mpr,opt_GF_low ; store corrected GF low |
587 bsf option_repaired ; flag that an option was repaired | |
560 option_cleanup_GF_2: | 588 option_cleanup_GF_2: |
561 ; cleanup alternative GF | 589 ; cleanup alternative GF |
562 movff opt_aGF_high,WREG ; copy alternative GF high to WREG | 590 movff opt_aGF_high,WREG ; copy alternative GF high to WREG |
563 movff opt_aGF_low,lo ; copy alternative GF low to lo | 591 movff opt_aGF_low,mpr ; copy alternative GF low to mpr |
564 cpfsgt lo ; GF low > GF high ? | 592 cpfsgt mpr ; GF low > GF high ? |
565 bra option_cleanup_GF_4 ; NO - option ok, check next option | 593 bra option_cleanup_GF_4 ; NO - option ok, check next option |
566 movwf lo ; YES - copy GF high to lo | 594 movwf mpr ; YES - copy GF high to mpr |
567 movlw .100 ; - load GF low limit of 100% into WREG | 595 movlw .100 ; - load GF low limit of 100% into WREG |
568 cpfsgt lo ; - lo > 100 ? | 596 cpfsgt mpr ; - mpr > 100 ? |
569 bra option_cleanup_GF_3 ; NO - correct GF low to GF high | 597 bra option_cleanup_GF_3 ; NO - correct GF low to GF high |
570 movwf lo ; YES - correct GF low to 100% | 598 movwf mpr ; YES - correct GF low to 100% |
571 option_cleanup_GF_3: | 599 option_cleanup_GF_3: |
572 movff lo,opt_aGF_low ; store corrected GF low | 600 movff mpr,opt_aGF_low ; store corrected GF low |
601 bsf option_repaired ; flag that an option was repaired | |
573 option_cleanup_GF_4: | 602 option_cleanup_GF_4: |
574 return ; done | 603 return ; done |
575 | 604 |
576 | 605 |
577 ;============================================================================= | 606 ;============================================================================= |
582 ; Read type, default and register from table | 611 ; Read type, default and register from table |
583 rcall option_read | 612 rcall option_read |
584 | 613 |
585 ; Switch on type | 614 ; Switch on type |
586 movf opt_type,W | 615 movf opt_type,W |
587 bz option_draw_uint8 | 616 bz option_draw_uint8 ; type0 = INT8 |
588 dcfsnz WREG | 617 dcfsnz WREG |
589 bra option_draw_enum8 | 618 bra option_draw_enum8 ; type1 = ENUM |
590 dcfsnz WREG | 619 dcfsnz WREG |
591 bra option_draw_string | 620 bra option_draw_string ; type2 = string |
621 dcfsnz WREG | |
622 bra option_draw_uint8_depth ; type3 = INT8 with automatic display in meters or feet | |
592 return ; unknown, return | 623 return ; unknown, return |
624 | |
593 option_draw_string: | 625 option_draw_string: |
594 movff POSTINC1,POSTINC2 | 626 movff POSTINC1,POSTINC2 |
595 decfsz opt_max | 627 decfsz opt_max |
596 bra option_draw_string | 628 bra option_draw_string |
597 return | 629 return |
598 | 630 |
631 option_draw_uint8_depth: | |
632 TSTOSS opt_units ; using metric units (0=m, 1=ft)? | |
633 bra option_draw_uint8 ; YES - handle with standard output | |
634 movff INDF1,lo ; NO - imperial, get value to lo | |
635 call convert_meter_to_feet ; - convert value in lo from meter to feet | |
636 bsf leftbind ; - print with left alignment | |
637 output_16_3 ; - display only last three digits from a 16 bit value (0-999) | |
638 bcf leftbind ; - back to normal alignment | |
639 STRCAT_TEXT tFeets ; - print unit | |
640 bra option_draw_uint8_common ; - continue with common part | |
599 | 641 |
600 option_draw_uint8: | 642 option_draw_uint8: |
601 movff INDF1,lo ; draw value | 643 movff INDF1,lo ; draw value |
602 bsf leftbind | 644 bsf leftbind |
603 output_8 | 645 output_8 |
604 bcf leftbind | 646 bcf leftbind |
605 clrf INDF2 ; make sure to close string | 647 clrf INDF2 ; make sure to close string |
606 movf opt_unit+0,W ; is there a unit to append? | 648 movf opt_unit+0,W ; is there a unit to append? |
607 iorwf opt_unit+1,W | 649 iorwf opt_unit+1,W |
608 rcall option_draw_unit ; YES | 650 rcall option_draw_unit ; YES |
651 option_draw_uint8_common: | |
609 movf opt_default,W ; get default value | 652 movf opt_default,W ; get default value |
610 cpfseq lo ; compare with current value, equal? | 653 cpfseq lo ; compare with current value, equal? |
611 bra option_draw_uint8_2 ; NO - not default, add * | 654 bra option_draw_uint8_2 ; NO - not default, add * |
612 return ; YES - default, done | 655 return ; YES - default, done |
613 option_draw_uint8_2: | 656 option_draw_uint8_2: |
614 PUTC "*" ; print "*" | 657 PUTC "*" ; print "*" |
615 return ; done | 658 return ; done |
659 | |
616 option_draw_unit: | 660 option_draw_unit: |
617 movff opt_unit+0,FSR1L | 661 movff opt_unit+0,FSR1L |
618 movff opt_unit+1,FSR1H | 662 movff opt_unit+1,FSR1H |
619 goto strcat_text | 663 goto strcat_text |
620 | 664 |
630 movlw .0 | 674 movlw .0 |
631 addwfc opt_min,W ; propagate carry... | 675 addwfc opt_min,W ; propagate carry... |
632 movwf FSR1H ; ...into FSR1 | 676 movwf FSR1H ; ...into FSR1 |
633 goto strcat_text | 677 goto strcat_text |
634 | 678 |
679 ;----------------------------------------------------------------------------- | |
635 | 680 |
636 END | 681 END |