Mercurial > public > mk2
changeset 86:b40a0a6284da
adding custom functions with limits (jeando)
author | heinrichsweikamp |
---|---|
date | Thu, 09 Dec 2010 20:41:56 +0100 |
parents | 8b813f67220f |
children | 8d3c1bef6551 |
files | code_part1/OSTC_code_asm_part1/menu_custom.asm code_part1/OSTC_code_asm_part1/menu_reset.asm code_part1/OSTC_code_asm_part1/surfmode.asm |
diffstat | 3 files changed, 427 insertions(+), 510 deletions(-) [+] |
line wrap: on
line diff
--- a/code_part1/OSTC_code_asm_part1/menu_custom.asm Wed Dec 08 08:37:03 2010 +0100 +++ b/code_part1/OSTC_code_asm_part1/menu_custom.asm Thu Dec 09 20:41:56 2010 +0100 @@ -48,15 +48,30 @@ ; define the display format: CF_INT8 EQU 0 ; Default display, 8 or 15 bits values. -CF_PERCENT EQU 1 ; Displays 110% -CF_DECI EQU 2 ; Displays 1.6 -CF_CENTI EQU 3 ; Displays 1.50 -CF_MILI EQU 4 ; Displays 1.015 -CF_BOOL EQU 5 ; Displays ON/OFF -CF_SEC EQU 6 ; Displays 4:00 -CF_COLOR EQU 7 ; Display 240 plus a color watch (inverse video space) +CF_PERCENT EQU 1 ; Displays 110% +CF_DECI EQU 2 ; Displays 1.6 +CF_CENTI EQU 3 ; Displays 1.50 +CF_MILI EQU 4 ; Displays 1.015 +CF_BOOL EQU 5 ; Displays ON/OFF +CF_SEC EQU 6 ; Displays 4:00 +CF_COLOR EQU 7 ; Display 240 plus a color watch (inverse video space) +; +CF_TYPES EQU 0x1F +CF_MAX_BIT EQU 6 ; Default is the highest safe value. +CF_MAX EQU (1<<CF_MAX_BIT) +CF_MIN_BIT EQU 5 ; Default is the lowest safe value. +CF_MIN EQU (1<<CF_MIN_BIT) +; CF_INT15 EQU 0x80; Default display. Flag for 15bit, typeless values. +; Overlay our tmp data with some unused variables. But use more +; meaningfull labels... +cf32_x4 EQU divemins+0 ; CF# modulus 32, time 4. +cf_type EQU divemins+1 ; Type of the edited CF +cf_value EQU divesecs +cf_min EQU apnoe_mins +cf_max EQU apnoe_secs + GETCUSTOM8 macro custom8 movlw custom8 call getcustom8_1 @@ -144,7 +159,7 @@ bcf cursor bcf sleepmode clrf decodata+0 ; here: # of CustomFunction - clrf divemins+0 ; here: # of CustomFunction*4 + clrf cf32_x4 ; here: # of CustomFunction*4 bcf first_FA ; here: =1: -, =0: + bcf second_FA ; here: =1: stepsize 1, =0: stepsize 10 @@ -176,14 +191,13 @@ WIN_LEFT .20 WIN_TOP .35 lfsr FSR2,letter - movff decodata+0,lo - + movff decodata+0,lo ; decodata == CF number % 32 + movlw d'0' - btfsc customfunction_page ; Add offset for display + btfsc customfunction_page ; Add offset for display in CF menu II movlw d'32' addwf lo,F - movff lo, apnoe_mins ; Copy use when NO_CF_TYPES - + output_99x movlw ':' movwf POSTINC2 @@ -195,53 +209,15 @@ addwf decodata+0,W ; add # of current custom function, place result in wreg call displaytext1 ; shows descriptor - ; Read defaults into hi:lo - movf divemins+0,W - addlw 0x80 - movwf EEADR - call read_eeprom ; Lowbyte - movff EEDATA,lo - movf divemins+0,W - addlw 0x81 - movwf EEADR - call read_eeprom ; Highbyte - movff EEDATA,hi - -#ifdef NO_CF_TYPES - movlw binary_cf1 - subwf apnoe_mins,W ; Binary cf? - bz menu_custom_functions10c ; Yes +; Read default, type and min/max from reset table. + rcall cf_read_default - movlw binary_cf2 - subwf apnoe_mins,W ; Binary cf? - bz menu_custom_functions10c ; Yes - - movlw binary_cf3 - subwf apnoe_mins,W ; Binary cf? - bz menu_custom_functions10c ; Yes - - movlw binary_cf4 - subwf apnoe_mins,W ; Binary cf? - bz menu_custom_functions10c ; Yes - - movlw binary_cf5 - subwf apnoe_mins,W ; Binary cf? - bz menu_custom_functions10c ; Yes - - movlw binary_cf6 - subwf apnoe_mins,W ; Binary cf? - bz menu_custom_functions10c ; Yes - - bra menu_custom_functions10a ; Not a binary CF... -#else - movf hi,W ; Is it a ON/OFF flag ? + movf cf_type,W ; Is it a ON/OFF flag ? xorlw CF_BOOL bnz menu_custom_functions10a ; Not a binary CF selected -#endif menu_custom_functions10c: - setf apnoe_mins ; Yes, set apnoe_mins to 0xFF - + ; Erase unused lines when editing boolean... WIN_LEFT .20 WIN_TOP .65 lfsr FSR2,letter ; Make a string of 8 spaces @@ -250,12 +226,10 @@ WIN_TOP .95 call word_processor ; Clear 1/10 line - + bra menu_custom_functions10b menu_custom_functions10a: - clrf apnoe_mins ; Yes, clear apnoe_mins - WIN_LEFT .20 WIN_TOP .65 lfsr FSR2,letter @@ -297,15 +271,13 @@ movwf POSTINC2 movlw ' ' movwf POSTINC2 - call word_processor + call word_processor menu_custom_functions10b: WIN_LEFT .20 WIN_TOP .125 lfsr FSR2,letter OUTPUTTEXT d'89' ;"Default:" - movlw ' ' - movwf POSTINC2 call display_customfunction ; Typed display. @@ -313,30 +285,24 @@ WIN_TOP .155 lfsr FSR2,letter OUTPUTTEXT d'97' ; "Current:" - movlw ' ' - movwf POSTINC2 - movf divemins+0,W + movf cf32_x4,W addlw 0x82 movwf EEADR call read_eeprom ; Lowbyte movff EEDATA,lo + movff EEDATA, cf_value ; Backup low 8bit value. - movf divemins+0,W + movf cf32_x4,W addlw 0x83 movwf EEADR call read_eeprom ; Highbyte - - btfss hi,7 ; A 15bit value ? - bra menu_custom_functions1b ; No : keep types there ! + movff EEDATA,hi - movff EEDATA,hi - bsf hi,7 ; Mark it a 15bit value. - -menu_custom_functions1b: call display_customfunction -menu_custom_functions1a: +; End of mask: min/max and the exit line... + rcall display_minmax DISPLAYTEXT .11 ; Exit call wait_switches ; Waits until switches are released, resets flag if button stays pressed! @@ -393,79 +359,212 @@ bra customfunctions_loop ;----------------------------------------------------------------------------- -; Input : hi:lo = data to display, with type embebed into hi +; Read default value (into hi:lo), cf_type, and cf_min/cf_max if any. +; +cf_read_default: + movlw LOW(cf_default_table0) ; Get 24bit PROM pointer. SKIP + movwf TBLPTRL + movlw HIGH(cf_default_table0) + movwf TBLPTRH + movlw UPPER(cf_default_table0) + movwf TBLPTRU + + movlw 0 + btfsc customfunction_page ; Page II CF# ? + movlw 0x80 ; YES: add 128 to ptr. + addwf cf32_x4,W ; Add 4 x (CF index modulus 32) + addwf TBLPTRL,F ; And to a 8+16 add into TBLPTR + movlw 0 ; (keep carry) + addwfc TBLPTRH,F ; Propagate to 16bit (but not 24bits). + + tblrd*+ + movff TABLAT,lo ; Low byte --> lo + tblrd*+ + movff TABLAT,hi ; High byte --> hi + btfss hi,7 ; 15bit ? + clrf hi ; NO: clear extra type flags + bcf hi,7 ; clear 15bit flag + + movff TABLAT,cf_type ; type (high byte) --> cf_type + movlw CF_MILI + btfsc cf_type,7 ; Display all 15bits as 1.234 floats. + movwf cf_type + + tblrd*+ + movff TABLAT,cf_min ; Then get optional min/max + tblrd*+ + movff TABLAT,cf_max + + return + +;----------------------------------------------------------------------------- +; Display a 8/15bit value, plus optional min and max bound. +; Input : hi:lo = data to display. +; cf_type = the type. +; cf_min, cf_max : the optional min/max. ; FSR2 = current string pointer. -; Trash : FSR1 (used to backup EEADRH and hi) +; Trash : hi:lo (when displaying min/max) display_customfunction: -#ifndef NO_CF_TYPES + movff EEADRH, FSR1H ; Backup... + + rcall display_formated + rcall cf_fill_line + call word_processor + + movff FSR1H, EEADRH + return + +;----------------------------------------------------------------------------- +; Display optional min/max values. +; Inputs: cf_value, cf_min, cf_max (and cf_type to display min/max). +; Trashed: hi:lo while display min and max values. +display_minmax: movff EEADRH, FSR1H ; Backup... - movff hi, FSR1L + +; Display min line + WIN_TOP .65 + WIN_LEFT .100 + lfsr FSR2, letter + + btfss cf_type, CF_MIN_BIT ; A min value exists ? + bra cf_no_min + + movf cf_min,W ; Retrieve current 8b value + subwf cf_value,W ; Compute (lo-min) + bc cf_min_passed ; Ok if CARRY, ie. min >= lo + call PLED_warnings_color + WIN_INVERT 1 +cf_min_passed: + + movlw '>' ; A min value follows + movwf POSTINC2 + movlw ' ' + movwf POSTINC2 + movff cf_min, lo + rcall display_formated + +cf_no_min: + rcall cf_fill_line ; Fill buffer + lfsr FSR2, letter+.7 ; Limit to 8 chars btw. + call word_processor + +; Display max line + WIN_TOP .95 + call PLED_standard_color + WIN_INVERT 0 + lfsr FSR2, letter + + btfss cf_type, CF_MAX_BIT ; A max value exists ? + bra cf_no_max + + movf cf_value,W ; Retrieve current max bound + subwf cf_max,W ; Compute (max-lo) + bc cf_max_passed ; Ok if no carry, ie. max <= lo + call PLED_warnings_color + WIN_INVERT 1 +cf_max_passed: + + movlw '<' ; A max value follows + movwf POSTINC2 + movlw ' ' + movwf POSTINC2 + movff cf_max, lo + rcall display_formated + +cf_no_max: + rcall cf_fill_line ; Fill buffer + lfsr FSR2, letter+.7 ; Limit to 8 chars btw. + call word_processor + +cf_minmax_done: + call PLED_standard_color + WIN_INVERT 0 + movff FSR1H, EEADRH + return + +;----------------------------------------------------------------------------- +; Display a single 8/15 bit value, according to cf_type. +; Input : hi:lo = data to display. +; cf_type = the type. +; cf_min, cf_max : the optional min/max. +; FSR2 = current string pointer. +display_formated: ;---- decode type -------------------------------------------------------- - movf hi,W ; Just set N/Z flags - bn cf_type_0 ; Keep 15bits value in old format. - bz cf_type_99 ; 8bit standard mode + movf cf_type,W ; Just set N/Z flags + bn cf_type_neg ; Keep 15bits value in old format. + andlw CF_TYPES ; Look just at types + bz cf_type_00 ; 8bit standard mode - ; Jump table: - dcfsnz hi + ; Jump table: ; test the value with cleared flags... + dcfsnz WREG bra cf_type_01 - dcfsnz hi + dcfsnz WREG bra cf_type_02 - dcfsnz hi + dcfsnz WREG bra cf_type_03 - dcfsnz hi + dcfsnz WREG bra cf_type_04 - dcfsnz hi + dcfsnz WREG bra cf_type_05 - dcfsnz hi + dcfsnz WREG bra cf_type_06 - dcfsnz hi + dcfsnz WREG bra cf_type_07 - bra cf_type_99 ; Default to 8bit mode... + bra cf_type_00 ; Default to 8bit mode... -cf_type_01: ; Type == 1 is percent mode - output_16dp 0 ; NOTE : hi is already reseted... +cf_type_01: ; Type == 1 is CF_PERCENT mode + bcf leftbind + output_8 movlw '%' movwf POSTINC2 - bra cf_do_wp + retlw 0 -cf_type_02: ; Type == 2 is deci mode. +cf_type_02: ; Type == 2 is CF_DECI mode. + clrf hi + bsf leftbind output_16dp 4 - bra cf_do_wp + retlw 0 -cf_type_03: ; Type == 3 is centi mode. +cf_type_03: ; Type == 3 is CF_CENTI mode. + clrf hi + bsf leftbind output_16dp 3 - bra cf_do_wp + retlw 0 -cf_type_04: ; Type == 4 is mili mode +cf_type_04: ; Type == 4 is CF_MILI mode output_16dp 2 - bra cf_do_wp + retlw 0 -cf_type_05: ; Type == 5 is on/off mode. +cf_type_05: ; Type == 5 is CF_BOOL mode. movf lo,W ; Get flag value... bz cf_type_off OUTPUTTEXT d'130' ; ON - bra cf_do_wp + retlw 0 + cf_type_off: OUTPUTTEXT d'131' ; OFF - bra cf_do_wp + retlw 0 -cf_type_06: ; Type == 6 is mm:ss mode (... or hh:mm) +cf_type_06: ; Type == 6 is CF_SECS mode (mm:ss or hh:mm) + clrf hi call convert_time ; Convert to min:sec into hi:low. movff lo,wp_temp ; Save seconds, movff hi,lo ; Get minutes + bsf leftbind ; Skip leading space(s). output_8 ; Print them movlw ':' ; Separator movwf POSTINC2 movff wp_temp,lo ; Get back seconds output_99x ; lo in 2 digits with trailing zeros. - bra cf_do_wp + retlw 0 -cf_type_07: ; Type == 7 is Color swatch. +cf_type_07: ; Type == 7 is CF_COLOR swatch. + bcf leftbind ; Keep leading space (better alignement) output_8 - - call cf_fill_line ; it does less flickering when editing colors... + movlw ' ' + movwf POSTINC2 call word_processor movf lo,W ; Get color. @@ -476,68 +575,31 @@ movff WREG,box_temp+2 ; row bottom (0-239) movlw .110 movff WREG,box_temp+3 ; column left (0-159) - movlw .140 + movlw .148 movff WREG,box_temp+4 ; column right (0-159) call PLED_box - bra cf_done ; wp already done. Skip it... + retlw -1 ; wp already done. Skip it... -cf_type_99: ; 8bit mode. Or unrecognized type... +cf_type_00: ; 8bit mode. Or unrecognized type... clrf hi + bsf leftbind -cf_type_0: ; 15bit mode. +cf_type_neg: ; 15bit mode. bcf hi,7 output_16 - -cf_do_wp: ; Process by calling wordprocessor - call cf_fill_line - call word_processor + retlw 0 -cf_done: - movff FSR1L, hi ; And restore saved registers before return. - movff FSR1H, EEADRH - return +;----------------------------------------------------------------------------- cf_fill_line: ; Mattias: No flicker if u clear just what you need... movf FSR2L,W ; How many chars lefts ? - sublw (LOW letter) + .17 ; Remaining chars to fill: (letter + 21) - PTR + sublw (LOW letter) + .18 ; Remaining chars to fill: (letter + 18) - PTR btfsc STATUS,N ; Add chars until none left... return movlw ' ' movwf POSTINC2 bra cf_fill_line - -#else - bcf hi,7 ; clear Bit 7 of value - output_16 - - movff win_top,WREG ; Get "Default:" line position (BANK0 !) - xorlw .125 ; This is the default value ? - bnz cf_no_bits ; NO: skip bits for current value - - movlw ',' - movwf POSTINC2 - - movlw '1' - btfss EEDATA,7 ; 15Bit? - movlw '8' ; 8Bit! - tstfsz apnoe_mins ; apnoe_mins=0? - movlw '1' ; No, 1Bit! - movwf POSTINC2 - - movlw '5' - btfsc EEDATA,7 ; 15Bit? - movwf POSTINC2 - movlw 'B' - movwf POSTINC2 - -cf_no_bits: - movlw ' ' - movwf POSTINC2 - movwf POSTINC2 - movwf POSTINC2 - goto word_processor -#endif ;----------------------------------------------------------------------------- @@ -558,6 +620,8 @@ dcfsnz menupos,F bra adjust_cfn_value +;----------------------------------------------------------------------------- + exit_customfunctions: movlw d'2' ; Return to correct list entry btfss customfunction_page @@ -566,6 +630,8 @@ clrf EEADRH ; Clear EEADRH ! goto setup_menu2 ; exit... +;----------------------------------------------------------------------------- + next_customfunction: incf decodata+0 btfsc decodata+0,5 ;>31? @@ -573,11 +639,13 @@ movf decodata+0,W mullw d'4' - movff PRODL, divemins+0 ;divemins+0 for correct addressing + movff PRODL, cf32_x4 ; 12bit address for correct addressing movlw d'1' movwf menupos - bra menu_custom_functions1 ; also debounces switches + bra menu_custom_functions1 ; also debounces switches + +;----------------------------------------------------------------------------- toggle_plusminus: btg first_FA @@ -585,31 +653,25 @@ movwf menupos bra menu_custom_functions1 ; also debounces switches +;----------------------------------------------------------------------------- + toggle_oneorten: btg second_FA movlw d'3' movwf menupos bra menu_custom_functions1 ; also debounces switches +;----------------------------------------------------------------------------- + restore_cfn_value: - movf divemins+0,W ; read default value - addlw 0x80 - movwf EEADR - call read_eeprom ; Lowbyte - movff EEDATA,lo - movf divemins+0,W - addlw 0x81 - movwf EEADR - call read_eeprom ; Highbyte - movff EEDATA,hi - bcf hi,7 ; clear bit 7 of value + rcall cf_read_default ; hi:lo is trashed by min/max display. - movf divemins+0,W ; store default value + movf cf32_x4,W ; store default value addlw 0x82 movwf EEADR movff lo,EEDATA call write_eeprom ; Lowbyte - movf divemins+0,W + movf cf32_x4,W addlw 0x83 movwf EEADR movff hi,EEDATA @@ -619,253 +681,66 @@ movwf menupos bra menu_custom_functions1 ; also debounces switches +;----------------------------------------------------------------------------- +; Adjust current value. adjust_cfn_value: - movf divemins+0,W ; get current value + movf cf32_x4,W ; get current value addlw 0x82 movwf EEADR call read_eeprom ; Lowbyte movff EEDATA,lo - movf divemins+0,W + movf cf32_x4,W addlw 0x83 movwf EEADR call read_eeprom ; Highbyte movff EEDATA,hi - movf divemins+0,W - addlw 0x81 - movwf EEADR - call read_eeprom ; Highbyte - movff EEDATA,divemins+1 ; Highbyte of default value + movf cf_type,W + xorlw CF_BOOL + bnz adjust_cfn_value1 - btfss apnoe_mins,0 ; If apnoe_mins=1 then CF is binary - bra adjust_cfn_value1 ; Not Binary - - tstfsz lo ; =0? - setf lo ; No, Set to 255 - incf lo,F ; Increase by one - clrf hi ; Delete hi byte (Not required but to make sure...) - bra adjust_cfn_value3 ; Store result + btg lo,0 ; Change lower bit. + bra adjust_cfn_value3 ; Store result adjust_cfn_value1: - btfss first_FA ; Minus? - bra adjust_cfn_value2 ; No, Plus - movlw d'1' - btfsc second_FA ; -10? + btfsc second_FA ; -10? movlw d'10' - subwf lo,F ; substract value + btfss first_FA ; Minus? + bra adjust_cfn_value2 ; No, Plus + + subwf lo,F ; substract value movlw d'0' - btfsc divemins+1,7 ; 8Bit value + btfsc cf_type,7 ; 8Bit value subwfb hi,F movlw b'01111111' - btfsc hi,7 ; >32768? + btfsc hi,7 ; >32768? movwf hi bra adjust_cfn_value3 adjust_cfn_value2: - movlw d'1' - btfsc second_FA ; +10? - movlw d'10' - - addwf lo,F ; add value + addwf lo,F ; add value movlw d'0' - btfsc divemins+1,7 ; 8Bit value? + btfsc cf_type,7 ; 8Bit value? addwfc hi,F - btfsc hi,7 ; >32768? + btfsc hi,7 ; >32768? clrf hi adjust_cfn_value3: - movf divemins+0,W ; Store current value + movf cf32_x4,W ; Store current value addlw 0x82 movwf EEADR movff lo,EEDATA - call write_eeprom ; Lowbyte - movf divemins+0,W + call write_eeprom ; Lowbyte + movf cf32_x4,W addlw 0x83 movwf EEADR movff hi,EEDATA - call write_eeprom ; Highbyte + call write_eeprom ; Highbyte movlw d'5' movwf menupos - bra menu_custom_functions1 ; also debounces switches - -getcustom15_default: - ; # number of requested custom function in wreg - movwf customfunction_temp2 - - movlw d'31' - cpfsgt customfunction_temp2 - bra getcustom15_d2 ; Lower bank - - movlw d'1' ; Upper Bank - movwf EEADRH - movlw d'32' - subwf customfunction_temp2,F - bra getcustom15_d3 -getcustom15_d2: - clrf EEADRH -getcustom15_d3: - movf customfunction_temp2,W - mullw d'4' - movf PRODL,W ; x4 for adress - addlw d'128' - movwf EEADR ; +130 for LOW Byte of value - call read_eeprom ; Lowbyte - movff EEDATA,lo - incf EEADR,F - call read_eeprom ; Highbyte - movff EEDATA,hi - clrf EEADRH -#ifndef NO_CF_TYPES - btfss hi,7 ; Is it a 15bit value ? - clrf hi ; NO: clear type flags. -#endif - bcf hi,7 ; Always clear 15bit flag. - return ; return - -custom_functions_check_divemode: ;displays warning if a critical custom function is not set to default - dcfsnz cf_checker_counter,F ; counts custom functions to check for warning symbol - bra check_cf11 - dcfsnz cf_checker_counter,F ; counts custom functions to check for warning symbol - bra check_cf12 - return - -custom_functions_check_surfmode: ;displays warning if a critical custom function is not set to default - dcfsnz cf_checker_counter,F ; counts custom functions to check for warning symbol - bra check_cf11 - dcfsnz cf_checker_counter,F ; counts custom functions to check for warning symbol - bra check_cf12 - dcfsnz cf_checker_counter,F ; counts custom functions to check for warning symbol - bra check_cf17 - dcfsnz cf_checker_counter,F ; counts custom functions to check for warning symbol - bra check_cf18 - dcfsnz cf_checker_counter,F ; counts custom functions to check for warning symbol - bra check_cf19 - dcfsnz cf_checker_counter,F ; counts custom functions to check for warning symbol - bra check_cf29 - dcfsnz cf_checker_counter,F ; counts custom functions to check for warning symbol - bra check_cf32 - dcfsnz cf_checker_counter,F ; counts custom functions to check for warning symbol - bra check_cf33 - return - -check_cf11: - movlw d'11' ; saturation factor - rcall custom_function_check_low ; compares current with default value - call test_and_display_warning ; displays the warning if the custom function is not correct - movlw d'2' ; next in testing row - movwf cf_checker_counter ; - return - -check_cf12: - movlw d'12' ; desaturation factor - rcall custom_function_check_high ; compares current with default value - call test_and_display_warning ; displays the warning if the custom function is not correct - movlw d'3' ; next in testing row - movwf cf_checker_counter ; - return - -check_cf17: - movlw d'17' ; lower threshold ppO2 - rcall custom_function_check_low ; compares current with default value - call test_and_display_warning ; displays the warning if the custom function is not correct - movlw d'4' ; next in testing row - movwf cf_checker_counter ; - return - -check_cf18: - movlw d'18' ; upper threshold ppO2 - rcall custom_function_check_high ; compares current with default value - call test_and_display_warning ; displays the warning if the custom function is not correct - movlw d'5' ; next in testing row - movwf cf_checker_counter ; - return - -check_cf19: - movlw d'19' ; upper threshold ppO2 display - rcall custom_function_check_high ; compares current with default value - call test_and_display_warning ; displays the warning if the custom function is not correct - movlw d'6' ; next in testing row - movwf cf_checker_counter ; - return - -check_cf29: - movlw d'6' - movwf cf_checker_counter ; upper limit for CF29, here: used as a temp variable - movlw d'29' ; last deco stop in [m] - rcall custom_function_check_high_limit ; compares current with default value - call test_and_display_warning ; displays the warning if the custom function is not correct - movlw d'7' ; next in testing row - movwf cf_checker_counter ; - return - -check_cf32: - movlw d'32' ; GF LOW - rcall custom_function_check_high ; compares current with default value - call test_and_display_warning ; displays the warning if the custom function is not correct - movlw d'8' ; next in testing row - movwf cf_checker_counter ; - return - -check_cf33: - movlw d'33' ; GF HIGH - rcall custom_function_check_high ; compares current with default value - call test_and_display_warning ; displays the warning if the custom function is not correct - movlw d'1' ; next in testing row - movwf cf_checker_counter ; - return - - -test_and_display_warning: - movwf lo ; copy result - tstfsz lo - return ; CF OK - goto custom_warn_surfmode - -custom_function_check_low: ; Checks CF (#WREG) - ; Returns WREG=0 if CF is lower then default - movwf temp1 ; save for custom value - call getcustom15_1 ; Get Current Value stored in hi and lo - movff lo,sub_a+0 - movff hi,sub_a+1 ; save value - - movf temp1,w - call getcustom15_default ; Get Default value stored in hi and lo - movff lo,sub_b+0 - movff hi,sub_b+1 ; save value - call sub16 ; sub_c = sub_a - sub_b with "neg_flag" bit set if sub_b > sub_a - btfss neg_flag ; negative? - retlw .255 ; no - retlw .0 ; yes - -custom_function_check_high: ; Checks CF (#WREG) - ; Returns WREG=0 if CF is higher then default - movwf temp1 ; save for custom value - call getcustom15_1 ; Get Current Value stored in hi and lo - movff lo,sub_b+0 - movff hi,sub_b+1 ; save value - - movf temp1,w - call getcustom15_default ; Get Default value stored in hi and lo - movff lo,sub_a+0 - movff hi,sub_a+1 ; save value - call sub16 ; sub_c = sub_a - sub_b with "neg_flag" bit set if sub_b > sub_a - btfss neg_flag ; negative? - retlw .255 ; no - retlw .0 ; yes - -custom_function_check_high_limit: ; Checks if CF (#WREG) is lower then limit (#cf_checker_counter) - movwf temp1 ; save for custom value - call getcustom15_1 ; Get Current Value stored in hi and lo - movff lo,sub_b+0 - movff hi,sub_b+1 ; save value - movff cf_checker_counter, sub_a+0 - clrf sub_a+1 - call sub16 ; sub_c = sub_a - sub_b with "neg_flag" bit set if sub_b > sub_a - btfss neg_flag ; negative? - retlw .255 ; no - retlw .0 ; yes \ No newline at end of file + bra menu_custom_functions1 ; also debounces switches
--- a/code_part1/OSTC_code_asm_part1/menu_reset.asm Wed Dec 08 08:37:03 2010 +0100 +++ b/code_part1/OSTC_code_asm_part1/menu_reset.asm Thu Dec 09 20:41:56 2010 +0100 @@ -19,7 +19,7 @@ ; Menu "Reset all" ; written by: Matthias Heinrichs, info@heinrichsweikamp.com ; written: 10/30/05 -; last updated: 08/08/31 +; last updated: 10/12/08 by JD Gascuel at free.fr ; known bugs: ; ToDo: @@ -33,110 +33,151 @@ ; Macro to check values, and construct PROM CF default table. ; If in types mode, set flags into hi. If not, clear it. -CF_DEFAULT macro type, value - if ( type == CF_INT15 ) - if (HIGH value) > .127 - error "15bit default too big:", value - endif - DB LOW value, 0x80 + (HIGH value) - else - ; Basic sanity check for 8bit values: - if ( HIGH value ) > 0 - error "8bit default too big:", value - endif - if (type==CF_BOOL) && (value > 1) - error "BOOL default too big:", value - endif - ifdef NO_CF_TYPES - DB LOW value, HIGH value - else - DB LOW value, type - endif - endif - endm +CF_DEFAULT macro type, default, min, max + noexpand + if (type) == CF_INT15 + if (HIGH (default)) > .127 + error "CF# 15bit default too big:", value + endif + if (min)>0 && (max>min) + error "CF# 15bit defaults cannot have both MIN & MAX flags" + endif + + ifdef NO_CF_TYPES + DB LOW (default), HIGH(default) + 0x80 + else + DB LOW (default), HIGH(default) + 0x80 + if (min) > 0 + DB LOW(min), HIGH(min) + else + DB LOW(min), HIGH(min) + 0x80 + endif + endif + else + ; Basic sanity check for 8bit values: + if HIGH(default) > 0 + error "CF# 8bit default too big:", (default) + endif + if HIGH(min) > 0 + error "CF# 8bit min too big:", (min) + endif + if HIGH(max) > 0 + error "CF# 8bit max too big:", (max) + endif + if ((type)==CF_BOOL) && ( (default)>1 ) + error "CF# BOOL default too big:", (default) + endif + if ((type)==CF_BOOL) && ( (min)>0 || (max)>0 ) + error "CF# BOOL cannot have min/max" + endif + + ifdef NO_CF_TYPES + DB LOW(default), 0 + else + local typeFlags +typeFlags set type + if (min)>0 +typeFlags set type + CF_MIN + endif + if (max)>(min) +typeFlags set typeFlags + CF_MAX + endif + DB LOW(default), (typeFlags), LOW(min), LOW(max) + endif + endif + expand + endm + +; Starting at CF0 +CF_NUMBER set -1 ; resets all customfunctions to the following default values -cf_default_table: +cf_default_table0: ;---- BANK0 custom function defaults ------------------------------------- - CF_DEFAULT CF_CENTI, d'100' ; dive_threshold 100cm - CF_DEFAULT CF_CENTI, d'30' ; surf_threshold 30cm - CF_DEFAULT CF_SEC, d'240' ; diveloop_timeout 240s - CF_DEFAULT CF_SEC, d'120' ; surfloop_timeout 120s - CF_DEFAULT CF_SEC, d'5' ; premenu_timeout 5s + ; DEFAULT MIN MAX + CF_DEFAULT CF_CENTI, d'100', d'50', d'250' ; dive_threshold 100cm + CF_DEFAULT CF_CENTI, d'30', d'10', d'100' ; surf_threshold 30cm + CF_DEFAULT CF_SEC, d'240', d'30', d'240' ; diveloop_timeout 240s + CF_DEFAULT CF_SEC, d'120', d'30', d'240' ; surfloop_timeout 120s + CF_DEFAULT CF_SEC, d'5', d'1', d'30' ; premenu_timeout 5s - CF_DEFAULT CF_INT8, d'7' ; minimum_velocity 7min/min - CF_DEFAULT CF_INT15, d'1160' ; pressure_offset_divemode 1160mBar - CF_DEFAULT CF_INT15, d'1100' ; max_surfpressure 1100mBar - CF_DEFAULT CF_PERCENT, d'20' ; min_gradient_factor 20% - CF_DEFAULT CF_PERCENT, d'20' ; oxygen_threshold 20% + CF_DEFAULT CF_INT8, d'7', d'3', d'18' ; minimum_velocity 7min/min + CF_DEFAULT CF_INT15, d'1160',d'950', 0 ; pressure_offset_divemode 1160mBar + CF_DEFAULT CF_INT15, d'1100',d'1100', 0 ; max_surfpressure 1100mBar + CF_DEFAULT CF_PERCENT, d'20', d'1', d'99' ; min_gradient_factor 20% + CF_DEFAULT CF_PERCENT, d'20', d'1', d'20' ; oxygen_threshold 20% - CF_DEFAULT CF_SEC, d'30' ; dive_menu_timeout 30s - CF_DEFAULT CF_PERCENT, d'110' ; saturation_multiplier x1.10 - CF_DEFAULT CF_PERCENT, d'90' ; desaturation_multiplier x0.90 - CF_DEFAULT CF_PERCENT, d'60' ; nofly_time_ratio 60% - CF_DEFAULT CF_PERCENT, d'100' ; gradient_factor_alarm1 100% + CF_DEFAULT CF_SEC, d'30', d'5', d'30' ; dive_menu_timeout 30s + CF_DEFAULT CF_PERCENT, d'110', d'110', d'200' ; saturation_multiplier x1.10 + CF_DEFAULT CF_PERCENT, d'90', d'50', d'90' ; desaturation_multiplier x0.90 + CF_DEFAULT CF_PERCENT, d'60', d'60', d'100' ; nofly_time_ratio 60% + CF_DEFAULT CF_PERCENT, d'100', d'50', d'100' ; gradient_factor_alarm1 100% - CF_DEFAULT CF_PERCENT, d'10' ; cns_display_surface 10% - CF_DEFAULT CF_INT8, d'10' ; deco_distance_for_sim 1m - CF_DEFAULT CF_CENTI, d'019' ; ppo2_warning_low 0.19 Bar - CF_DEFAULT CF_CENTI, d'160' ; ppo2_warning_high 1.60 Bar - CF_DEFAULT CF_CENTI, d'150' ; ppo2_display_high 1.50 Bar + CF_DEFAULT CF_PERCENT, d'10', d'01', d'100' ; cns_display_surface 10% + CF_DEFAULT CF_DECI, d'10', d'10', d'100' ; deco_distance_for_sim 1m + CF_DEFAULT CF_CENTI, d'019', d'019', d'021' ; ppo2_warning_low 0.19 Bar + CF_DEFAULT CF_CENTI, d'160', d'100', d'160' ; ppo2_warning_high 1.60 Bar + CF_DEFAULT CF_CENTI, d'150', d'100', d'150' ; ppo2_display_high 1.50 Bar - CF_DEFAULT CF_INT8, d'10' ; sampling_rate 10s - CF_DEFAULT CF_INT8, d'6' ; sampling_divisor_temp /6 - CF_DEFAULT CF_INT8, d'6' ; sampling_divisor_deco /6 - CF_DEFAULT CF_INT8, d'0' ; sampling_divisor_tank never - CF_DEFAULT CF_INT8, d'0' ; sampling_divisor_ppo2 never + CF_DEFAULT CF_INT8, d'10', d'1', d'120' ; sampling_rate 10s + CF_DEFAULT CF_INT8, d'6', d'0', d'15' ; sampling_divisor_temp /6 + CF_DEFAULT CF_INT8, d'6', d'0', d'15' ; sampling_divisor_deco /6 + CF_DEFAULT CF_INT8, d'0', d'0', d'15' ; sampling_divisor_tank never + CF_DEFAULT CF_INT8, d'0', d'0', d'15' ; sampling_divisor_ppo2 never - CF_DEFAULT CF_INT8, d'0' ; sampling_divisor_deco2 never - CF_DEFAULT CF_INT8, d'0' ; sampling_divisor_nyu2 never - CF_DEFAULT CF_PERCENT, d'20' ; cns_display_high 20% - CF_DEFAULT CF_INT8, d'0' ; logbook_offset No Offset, but 15Bit value - CF_DEFAULT CF_INT8, d'3' ; last_deco_depth 3m + CF_DEFAULT CF_INT8, d'0', d'0', d'15' ; sampling_divisor_deco2 never + CF_DEFAULT CF_INT8, d'0', d'0', d'15' ; sampling_divisor_nyu2 never + CF_DEFAULT CF_PERCENT, d'20', d'5', d'75' ; cns_display_high 20% + CF_DEFAULT CF_INT15, d'0', d'0', 0 ; logbook_offset No Offset, but 15Bit value + CF_DEFAULT CF_INT8, d'3', d'2', d'6' ; last_deco_depth 3m - CF_DEFAULT CF_SEC, d'10' ; timeout_apnoe_mode 10min - CF_DEFAULT CF_BOOL, d'0' ; show_voltage_value =1 Show value instead of symbol, =0 Show Symbol + CF_DEFAULT CF_SEC, d'10', d'1', d'15' ; timeout_apnoe_mode 10min + CF_DEFAULT CF_BOOL, d'0', 0, 0 ; show_voltage_value =1 Show value instead of symbol, =0 Show Symbol ;---- BANK1 custom function defaults ------------------------------------- - CF_DEFAULT CF_PERCENT, d'30' ; GF_low_default 30% - CF_DEFAULT CF_PERCENT, d'90' ; GF_high_default 90% - CF_DEFAULT CF_COLOR, d'199' ; color_battery_surface Color Battery sign: Deep blue - CF_DEFAULT CF_COLOR, d'255' ; color_standard1 Color Standard: White - CF_DEFAULT CF_COLOR, d'62' ; color_divemask Color Divemask: Light green - CF_DEFAULT CF_COLOR, d'224' ; color_warnings Color Warnings: Red +cf_default_table1: + ; DEFAULT MIN MAX + CF_DEFAULT CF_PERCENT, d'30', d'10', d'90' ; GF_low_default 30% + CF_DEFAULT CF_PERCENT, d'90', d'30', d'95' ; GF_high_default 90% + CF_DEFAULT CF_COLOR, d'199', 0, 0 ; color_battery_surface Color Battery sign: Deep blue + CF_DEFAULT CF_COLOR, d'255', 0, 0 ; color_standard1 Color Standard: White + CF_DEFAULT CF_COLOR, d'62', 0, 0 ; color_divemask Color Divemask: Light green + CF_DEFAULT CF_COLOR, d'224', 0, 0 ; color_warnings Color Warnings: Red - CF_DEFAULT CF_BOOL, d'0' ; show_seconds_divemode =1 Show the seconds in Divemode - CF_DEFAULT CF_BOOL, d'0' ; show_clock_divemode =1 Show the clock in Divemode - CF_DEFAULT CF_BOOL, d'1' ; warn_ceiling_divemode =1 Warn ceiling violation in divemode - CF_DEFAULT CF_BOOL, d'0' ; start_with_stopwatch =1 start with stopwatch - CF_DEFAULT CF_BOOL, d'0' ; blink_gas_divemode =1 Show (resetable) average Depth instead of temperature + CF_DEFAULT CF_BOOL, d'0', 0, 0 ; show_seconds_divemode =1 Show the seconds in Divemode + CF_DEFAULT CF_BOOL, d'0', 0, 0 ; show_clock_divemode =1 Show the clock in Divemode + CF_DEFAULT CF_BOOL, d'1', 0, 0 ; warn_ceiling_divemode =1 Warn ceiling violation in divemode + CF_DEFAULT CF_BOOL, d'0', 0, 0 ; start_with_stopwatch =1 start with stopwatch + CF_DEFAULT CF_BOOL, d'0', 0, 0 ; blink_gas_divemode =1 Show (resetable) average Depth instead of temperature - CF_DEFAULT CF_INT15, d'13000' ; color_warn_depth_mBar Warn depths - CF_DEFAULT CF_PERCENT, d'101' ; color_warn_cns_percent Warn-% - CF_DEFAULT CF_PERCENT, d'101' ; color_warn_gf_percent Warn-% - CF_DEFAULT CF_CENTI, d'161' ; color_warn_ppo2_cbar ppO2 warn - CF_DEFAULT CF_INT8, d'15' ; color_warn_celocity_mmin warn at xx m/min + CF_DEFAULT CF_INT15, d'13000', 0, d'13000'; color_warn_depth_mBar Warn depths + CF_DEFAULT CF_PERCENT, d'101', d'50', d'101' ; color_warn_cns_percent Warn-% + CF_DEFAULT CF_PERCENT, d'101', d'50', d'101' ; color_warn_gf_percent Warn-% + CF_DEFAULT CF_CENTI, d'161', d'100', d'161' ; color_warn_ppo2_cbar ppO2 warn + CF_DEFAULT CF_INT8, d'15', d'7', d'20' ; color_warn_celocity_mmin warn at xx m/min - CF_DEFAULT CF_SEC, d'42' ; time_correction_value_default Adds to Seconds on Midnight - CF_DEFAULT CF_INT15, 0 ; UNUSED - CF_DEFAULT CF_INT15, 0 ; UNUSED - CF_DEFAULT CF_INT15, 0 ; UNUSED - CF_DEFAULT CF_INT15, 0 ; UNUSED + CF_DEFAULT CF_SEC, d'42', d'0', d'240' ; time_correction_value_default Adds to Seconds on Midnight + CF_DEFAULT CF_INT15, 0, 0, 0 ; UNUSED + CF_DEFAULT CF_INT15, 0, 0, 0 ; UNUSED + CF_DEFAULT CF_INT15, 0, 0, 0 ; UNUSED + CF_DEFAULT CF_INT15, 0, 0, 0 ; UNUSED - CF_DEFAULT CF_INT15, 0 ; UNUSED - CF_DEFAULT CF_INT15, 0 ; UNUSED - CF_DEFAULT CF_INT15, 0 ; UNUSED - CF_DEFAULT CF_INT15, 0 ; UNUSED - CF_DEFAULT CF_INT15, 0 ; UNUSED + CF_DEFAULT CF_INT15, 0, 0, 0 ; UNUSED + CF_DEFAULT CF_INT15, 0, 0, 0 ; UNUSED + CF_DEFAULT CF_INT15, 0, 0, 0 ; UNUSED + CF_DEFAULT CF_INT15, 0, 0, 0 ; UNUSED + CF_DEFAULT CF_INT15, 0, 0, 0 ; UNUSED - CF_DEFAULT CF_INT15, 0 ; UNUSED - CF_DEFAULT CF_INT15, 0 ; UNUSED - CF_DEFAULT CF_INT15, 0 ; UNUSED - CF_DEFAULT CF_INT15, 0 ; UNUSED - CF_DEFAULT CF_INT15, 0 ; UNUSED + CF_DEFAULT CF_INT15, 0, 0, 0 ; UNUSED + CF_DEFAULT CF_INT15, 0, 0, 0 ; UNUSED + CF_DEFAULT CF_INT15, 0, 0, 0 ; UNUSED + CF_DEFAULT CF_INT15, 0, 0, 0 ; UNUSED + CF_DEFAULT CF_INT15, 0, 0, 0 ; UNUSED - CF_DEFAULT CF_INT15, 0 ; UNUSED - CF_DEFAULT CF_INT15, 0 ; UNUSED + CF_DEFAULT CF_INT15, 0, 0, 0 ; UNUSED + CF_DEFAULT CF_INT15, 0, 0, 0 ; UNUSED +cf_default_table2: + ;============================================================================= menu_reset: @@ -265,17 +306,17 @@ movwf EEADR clrf hi ; He part (default for all gases: 0%) movlw d'21' ; O2 part (21%) - rcall reset_customfunction ; saves default and current value for gas #1 + rcall reset_gas ; saves default and current value for gas #1 movlw d'21' ; O2 part (21%) - rcall reset_customfunction ; saves default and current value for gas #2 + rcall reset_gas ; saves default and current value for gas #2 movlw d'21' ; O2 part (21%) - rcall reset_customfunction ; saves default and current value for gas #3 + rcall reset_gas ; saves default and current value for gas #3 movlw d'21' ; O2 part (21%) - rcall reset_customfunction ; saves default and current value for gas #4 + rcall reset_gas ; saves default and current value for gas #4 movlw d'21' ; O2 part (21%) - rcall reset_customfunction ; saves default and current value for gas #5 + rcall reset_gas ; saves default and current value for gas #5 movlw d'21' ; O2 part (21%) - rcall reset_customfunction ; saves default and current value for gas #6 + rcall reset_gas ; saves default and current value for gas #6 reset_all_cf: movlw d'1' @@ -327,23 +368,19 @@ movlw d'127' ; address of low byte of first custom function movwf EEADR - movlw LOW cf_default_table ; Load PROM pointer. + movlw LOW cf_default_table0 ; Load PROM pointer. movwf TBLPTRL,A - movlw HIGH cf_default_table + movlw HIGH cf_default_table0 movwf TBLPTRH,A - movlw UPPER cf_default_table + movlw UPPER cf_default_table0 movwf TBLPTRU,A cf_bank0_loop: - ; Did we already read 32 (decimal) bytes ? + ; Did we already read 32 (decimal) words or double-words (with types) ? movf TBLPTRL,W - sublw LOW (cf_default_table+.64) + sublw LOW (cf_default_table1) bz reset_all_cf_bank1 - tblrd*+ - movf TABLAT, W ; Low byte in WREG, - tblrd*+ - movff TABLAT, hi ; High byte in hi rcall reset_customfunction ; saves default and current value bra cf_bank0_loop @@ -352,17 +389,13 @@ movwf EEADRH ; EEPROM BANK 1 !! movlw d'127' ; address of low byte of first custom function movwf EEADR - + cf_bank1_loop: - ; Did we already read another 32 (decimal) bytes ? + ; Did we already read another 32 (decimal) words or double-words ? movf TBLPTRL,W - sublw LOW (cf_default_table+.128) - bz cf_bank1_end + sublw LOW (cf_default_table2) + bz cf_bank1_end - tblrd*+ - movf TABLAT, W ; Low byte in WREG, - tblrd*+ - movff TABLAT, hi ; High byte in hi rcall reset_customfunction ; saves default and current value bra cf_bank1_loop @@ -372,30 +405,40 @@ ;call reset_external_eeprom ; delete profile memory goto restart ; all reset, quit to surfmode -; Write the four bytes lo:hi:lo:(hi w/o type flags) into EEPROM -; Don't change hi:lo values... +; Write WREG:lo twice, w/o any type clearing, pre-incrementing EEADR +reset_gas: + movwf lo + rcall reset_eeprom_value ; First pair + goto reset_eeprom_value ; Second pair. + reset_customfunction: - movwf lo - incf EEADR,F - movff lo, EEDATA ; Lowbyte Defaul value - call write_eeprom - incf EEADR,F - movff hi, EEDATA ; Highbyte default value - call write_eeprom + tblrd*+ + movff TABLAT, lo ; Low byte in lo, + tblrd*+ + movff TABLAT, hi ; High byte in hi + + ifndef NO_CF_TYPES + tblrd*+ ; Skip advanced min/max values. + tblrd*+ + btfss hi,7 ; In EEPROM, just clear all types, + clrf hi ; to keep external program compat (jdivelog etc.) + bcf hi,7 + endif + + ; Manage the default/value tuple + rcall reset_eeprom_value ; First pair, untouched. + bcf hi,7 ; Just clear type bit. + bra reset_eeprom_value ; Second pair, cleared + +; Write the two bytes lo:hi into EEPROM +reset_eeprom_value: incf EEADR,F - movff lo, EEDATA ; Lowbyte current value + movff lo, EEDATA ; Lowbyte Defaul value call write_eeprom + incf EEADR,F - movff hi, EEDATA ; Highbyte current value -#ifdef NO_CF_TYPES - bcf EEDATA,7 ; This bit will only be written for the default value -#else - btfss EEDATA,7 ; A 15bit value ? - clrf EEDATA ; Nope: clear type flag. -#endif - call write_eeprom - return - + movff hi, EEDATA ; Highbyte default value + goto write_eeprom reset_external_eeprom: ; deletes complete external eeprom! clrf eeprom_address+0
--- a/code_part1/OSTC_code_asm_part1/surfmode.asm Wed Dec 08 08:37:03 2010 +0100 +++ b/code_part1/OSTC_code_asm_part1/surfmode.asm Thu Dec 09 20:41:56 2010 +0100 @@ -133,10 +133,9 @@ call update_batt_voltage ; display battery voltage call timeout_premenu ; timeout premenu call set_leds_surfmode ; Sets Warning and No-Fly LEDs - call custom_functions_check_surfmode ; Checks CF functions and displays warning symbol if something critical is wrong call PLED_display_decotype_surface ; Show deco mode btfsc enter_error_sleep ; Enter Fatal Error Routine? - call fatal_error_sleep ; Yes (In Sleepmode_vxx.asm!) + call fatal_error_sleep ; Yes (In Sleepmode.asm!) bcf onesecupdate ; every second tasks done surfloop_loop2: