# HG changeset patch # User JeanDo # Date 1307411730 -7200 # Node ID f49d6f0fc87045a2e578ba1eb2ee4f503e367ef5 # Parent cec312042b94f85439aff113f9a3ea549a0d7a84 Allow negatif CF: * CF reset table encodes signed -128/+127 values. Upates CF48. * Display & check signed min/max bounds in cf menu. * Adapt CF alarm for signed values. diff -r cec312042b94 -r f49d6f0fc870 code_part1/OSTC_code_asm_part1/menu_custom.asm --- a/code_part1/OSTC_code_asm_part1/menu_custom.asm Tue Jun 07 03:55:27 2011 +0200 +++ b/code_part1/OSTC_code_asm_part1/menu_custom.asm Tue Jun 07 03:55:30 2011 +0200 @@ -56,11 +56,13 @@ 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_TYPES EQU 0x0F CF_MAX_BIT EQU 6 ; Default is the highest safe value. CF_MAX EQU (1<= lo + subwf cf_value,W ; Compute (value-min) + bc cf_min_passed ; Ok if CARRY, ie. min >= lo + +cf_min_failed: call PLED_warnings_color WIN_INVERT 1 -cf_min_passed: - + +cf_min_passed: STRCAT "> " ; A min value follows movff cf_min, lo rcall display_formated @@ -439,13 +461,33 @@ btfss cf_type, CF_MAX_BIT ; A max value exists ? bra cf_no_max + btfss cf_type,CF_NEG_BIT + bra cf_max_unsigned + + ; Uses 16bit sub for checking signed min value. + movff cf_max,sub_a+0 ; A <- max (with signed extend) + clrf sub_a+1 ; max have to be positiv. + + movff cf_value,sub_b+0 ; B <- value + clrf sub_b+1 + btfsc cf_value,7 ; extend sign if value < 0 + setf sub_b+1 + call sub16 ; Compute (A-B) + + btfss neg_flag ; Result < 0 ? + bra cf_max_passed ; NO + bra cf_max_failed ; YES + +cf_max_unsigned: 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 + +cf_max_failed: call PLED_warnings_color WIN_INVERT 1 -cf_max_passed: - + +cf_max_passed: STRCAT "< " ; A max value follows movff cf_max, lo rcall display_formated @@ -468,14 +510,31 @@ ; cf_min, cf_max : the optional min/max. ; FSR2 = current string pointer. display_formated: + movf cf_type,W ; Just set N flags + bn cf_type_80 ; Keep 15bits value in old format. + + ;---- handle signed values ----------------------------------------------- + ; NOTE: only 8bit values can have a negativ flag right now. + btfss cf_type,CF_NEG_BIT ; Signed value ? + bra cf_type_unsigned ; NO: display unsigned as-is + + btfss lo,7 ; Negativ value ? + bra cf_type_pos ; NO: display positives with a + sign. + + PUTC '-' ; YES: display with a - sign. + negf lo ; and correct the said value. + bra cf_type_unsigned + +cf_type_pos: + PUTC '+' ;---- decode type -------------------------------------------------------- - 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 +cf_type_unsigned: + ; Jump table: ; test the value with cleared flags... + movf cf_type,W + andlw CF_TYPES ; Look just at types bz cf_type_00 ; 8bit standard mode - ; Jump table: ; test the value with cleared flags... dcfsnz WREG bra cf_type_01 dcfsnz WREG @@ -557,7 +616,7 @@ clrf hi bsf leftbind -cf_type_neg: ; 15bit mode. +cf_type_80: ; 15bit mode. bcf hi,7 output_16 retlw 0 @@ -821,7 +880,25 @@ btfss cf_type,CF_MIN_BIT bra check_no_min - + + btfss cf_type,CF_NEG_BIT + bra check_min_unsigned + + ; Uses 16bit sub for checking signed min value. + movff lo,sub_a+0 ; A <- value + clrf sub_a+1 + btfsc cf_value,7 ; extend sign if value < 0 + setf sub_a+1 + + movff cf_min,sub_b+0 ; B <- min (with signed extend) + setf sub_b+1 ; min have to be negativ. + call sub16 ; Compute (A-B) + + btfss neg_flag ; Result < 0 ? + bra check_no_min ; NO + retlw 0 ; YES = FAILED + +check_min_unsigned: cpfsgt cf_min ; Compare to cf_min bra check_no_min ; PASSED: continue. retlw 0 ; NO: return failed. @@ -829,7 +906,25 @@ check_no_min: btfss cf_type,CF_MAX_BIT ; Is there a MAX bound ? retlw -1 ; No check: return OK. - + + btfss cf_type,CF_NEG_BIT + bra check_max_unsigned + + ; Uses 16bit sub for checking signed min value. + movff cf_max,sub_a+0 ; A <- max (with signed extend) + clrf sub_a+1 ; max have to be positiv. + + movff lo,sub_b+0 ; B <- value + clrf sub_b+1 + btfsc cf_value,7 ; extend sign if value < 0 + setf sub_b+1 + call sub16 ; Compute (A-B) + + btfss neg_flag ; Result < 0 ? + retlw -1 ; NO + retlw 0 ; YES + +check_max_unsigned: movf lo,W ; Compute value-max cpfslt cf_max retlw -1 ; Bound met: return OK. diff -r cec312042b94 -r f49d6f0fc870 code_part1/OSTC_code_asm_part1/menu_reset.asm --- a/code_part1/OSTC_code_asm_part1/menu_reset.asm Tue Jun 07 03:55:27 2011 +0200 +++ b/code_part1/OSTC_code_asm_part1/menu_reset.asm Tue Jun 07 03:55:30 2011 +0200 @@ -65,10 +65,16 @@ if HIGH(default) > 0 error CF#v(CFn) "8bit default too big: ", default endif - if HIGH(min) > 0 - error CF#v(CFn) "8bit min too big: ", min - endif - if HIGH(max) > 0 + if type & CF_NEG + if HIGH(-min) != 0 + error CF#v(CFn) "8bit negativ min too big: ", min + endif + else + if HIGH(min) != 0 + error CF#v(CFn) "8bit min too big: ", min + endif + endif + if HIGH(max) != 0 error CF#v(CFn) "8bit max too big: ", max endif if ((type)==CF_BOOL) && ( (default)>1 ) @@ -83,7 +89,7 @@ else local typeFlags typeFlags set type - if (min)>0 + if (min)!=0 typeFlags set type + CF_MIN endif if (max)>(min) @@ -163,7 +169,7 @@ 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', d'0', d'240' ; time_correction_value_default Adds to Seconds on Midnight + CF_DEFAULT CF_SEC+CF_NEG,d'42', -d'120',d'120' ; time_correction_value_default Adds to Seconds on Midnight CF_DEFAULT CF_BOOL, d'0', 0, 0 ; CF#49 Show Altimeter in surface mode CF_DEFAULT CF_BOOL, d'0', 0, 0 ; CF50 Show Log-Marker CF_DEFAULT CF_BOOL, d'1', 0, 0 ; CF51 Show Stopwatch