changeset 355:f49d6f0fc870

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.
author JeanDo
date Tue, 07 Jun 2011 03:55:30 +0200
parents cec312042b94
children 9ef9b681f38f
files code_part1/OSTC_code_asm_part1/menu_custom.asm code_part1/OSTC_code_asm_part1/menu_reset.asm
diffstat 2 files changed, 122 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- 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<<CF_MAX_BIT)
 CF_MIN_BIT  EQU 5       ; Default is the lowest safe value.
 CF_MIN      EQU (1<<CF_MIN_BIT)
+CF_NEG_BIT  EQU 4       ; Allow negativ values.
+CF_NEG      EQU (1<<CF_NEG_BIT)
 ;
 CF_INT15	EQU	0x80; Default display. Flag for 15bit, typeless values.
 
@@ -408,16 +410,36 @@
     btfsc   cf_type,7           ; A 15bit value ?
     bra     cf_no_min           ; Don't display, hence clear line...
 
-    btfss   cf_type, CF_MIN_BIT ; A min value exists ?
+    btfss   cf_type,CF_MIN_BIT  ; A min value exists ?
     bra     cf_no_min
 
+    btfss   cf_type,CF_NEG_BIT
+    bra     cf_min_unsigned
+
+    ; Uses 16bit sub for checking signed min value.
+    movff   cf_value,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     cf_min_passed       ; NO
+    bra     cf_min_failed       ; YES
+
+cf_min_unsigned:
     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
+    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.
--- 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