diff src/convert.asm @ 0:11d4fc797f74

init
author heinrichsweikamp
date Wed, 24 Apr 2013 19:22:45 +0200
parents
children 31088352ee32
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/convert.asm	Wed Apr 24 19:22:45 2013 +0200
@@ -0,0 +1,260 @@
+;=============================================================================
+;
+;   File convert.asm
+;
+;   Converts register values to string
+;
+;   Copyright (c) 2011, Matthias Heinrichs, HeinrichsWeikamp, all right reserved.
+;=============================================================================
+; HISTORY
+;   2007-10-07 : [MH]  Creation for OSTC sources
+;   2010-12-10 : [jDG] Optimize macro size
+;
+
+#include    "ostc3.inc"                  ; Mandatory header
+
+;=============================================================================
+
+        CBLOCK  tmp+0x08                ; space for aa_wordprocessor
+        	temp3
+        	temp4
+        	cvt_flags2
+            ; Reserved to tmp+0x10...
+        ENDC
+
+#define pre_zero_flag   cvt_flags2,0
+#define all_zeros_flag  cvt_flags2,1
+#define DP_done         cvt_flags2,2
+#define DP_done2        cvt_flags2,3
+#define show_last3      cvt_flags2,4
+#define leading_zeros   cvt_flags2,5
+
+basic   CODE
+
+;=============================================================================
+    global  output99_call
+output99_call:
+	clrf	ignore_digits
+	incf	ignore_digits,F
+	clrf	temp4
+
+    global  output99
+output99:
+	movlw	d'99'
+	cpfslt	lo
+	movwf	lo							; Limit to 99
+	movff	lo,lo_temp		
+	clrf	hi_temp
+	bcf		pre_zero_flag	; do not display leading zeros
+
+LCD_val99_2:	
+	movlw	b'00001010'	; 10
+	movwf	temp2		
+	clrf	temp3		
+	rcall	DEC2ASCII
+
+	movlw	b'00000001'	; 1
+	movwf	temp2		
+	clrf	temp3		
+	bsf		pre_zero_flag ; last figure, display zero (0)
+	rcall	DEC2ASCII
+	RETURN
+
+	global	output99x_call
+
+output99x_call:
+	clrf	ignore_digits
+	incf	ignore_digits,F
+	clrf	temp4
+
+	movlw	d'99'
+	cpfslt	lo
+	movwf	lo							; Limit to 99
+	movff	lo, lo_temp		
+	clrf	hi_temp
+	bsf		pre_zero_flag		; display leading zeros
+	bra		LCD_val99_2			
+	
+	global	output8_call
+
+output8_call:	
+    clrf	ignore_digits
+	incf	ignore_digits,F
+	clrf	temp4
+
+output8:
+	movff	lo, lo_temp		
+	clrf	hi_temp
+	bcf		pre_zero_flag	; do not display leading zeros
+	
+	movlw	b'01100100'	; 100
+	movwf	temp2		
+	clrf	temp3		
+	rcall	DEC2ASCII
+	bra		LCD_val99_2			
+
+	global	output16_3_call
+	global	output16_call
+	global	output16
+output16_3_call:
+	bsf		show_last3	
+output16_call:
+	clrf	ignore_digits
+	incf	ignore_digits,F
+	clrf	WREG
+output16:
+	movwf	temp4           ; Passed from output16dp macro, cleared by others.
+
+	bcf		all_zeros_flag	; do not display any zero from here unless there was at least one figure /zero
+
+	bsf		leading_zeros
+	tstfsz	temp4			; Display leading zeros at all?
+	bcf		leading_zeros
+
+	bsf		DP_done2		
+	tstfsz	temp4
+	bcf		DP_done2		; decimal point not yet set
+	
+	movff	lo, lo_temp		
+	movff	hi, hi_temp		
+	bcf		pre_zero_flag	; do not display leading zeros
+	
+	movlw	b'00010000'	; 10000s
+	movwf	temp2		 
+	movlw	b'00100111'
+	movwf	temp3		 
+	btfss	show_last3		; display only last three figures?
+	rcall	DEC2ASCII		; No, show all. Here: 5th order digit
+	
+	movlw	b'11101000'	; 1000s
+	movwf	temp2		 
+	movlw	b'00000011'
+	movwf	temp3		 
+	btfsc	DP_done2			; Is there a decimal point at all?
+	bra		output16_2			; no, use normal display mode
+
+	btfsc	all_zeros_flag		; display any zero from here
+	bra		output16_1			; there was a figure /zero already
+
+	bsf		pre_zero_flag		; display figure if zero?
+	decfsz	temp4,W		
+	bcf		pre_zero_flag		; No
+
+output16_1:
+	btfsc	DP_done				; Decimal point set already?
+	bsf		pre_zero_flag		; Yes, so display the rest
+output16_2:
+	btfss	show_last3			; display only last three figures?
+	rcall	DEC2ASCII			; No, show all. Here: 4th order digit
+	bcf		show_last3			; Yes, so display the rest
+
+	movlw	b'01100100'	; 100s
+	movwf	temp2		 
+	clrf	temp3		
+
+	btfsc	ignore_digit3		; Ignore 3rd-5th digit?
+	bra		output16_5			; Yes, skip the rest
+
+	btfsc	DP_done2			; Is there a decimal point at all?
+	bra		output16_3			; no, use normal display mode
+
+	btfsc	all_zeros_flag		; display any zero from here
+	bra		output16_2_1		; there was a figure /zero already
+
+	bsf		pre_zero_flag		; display figure if zero?
+	decfsz	temp4,W		
+	bcf		pre_zero_flag		; No
+
+output16_2_1:
+	btfsc	DP_done				; Decimal point set already?
+	bsf		pre_zero_flag		; Yes, so display the rest
+	btfsc	DP_done2			; Is there a decimal point at all?
+	bsf		pre_zero_flag		; No, so display the rest
+output16_3:
+	rcall	DEC2ASCII			;3th order digit...
+
+	movlw	b'00001010'	; 10s
+	movwf	temp2		
+	clrf	temp3		
+	btfsc	DP_done2	
+	bra		output16_4	
+
+	btfsc	all_zeros_flag		; display any zero from here
+	bra		output16_3_1		; there was a figure /zero already
+
+	bsf		pre_zero_flag
+	decfsz	temp4,W		
+	bcf		pre_zero_flag
+
+output16_3_1:
+	btfsc	DP_done		
+	bsf		pre_zero_flag
+	btfsc	DP_done2	
+	bsf		pre_zero_flag		
+output16_4:
+	btfsc	ignore_digit4		; Ignore 4-5th digit?
+	bra		output16_5			; Yes, skip the rest
+	rcall	DEC2ASCII			; 2nd order digit
+
+	movlw	b'00000001'	; 1s
+	movwf	temp2		
+	clrf	temp3		 
+	bsf		pre_zero_flag
+	btfss	ignore_digit5		; Ignore 5th digit?
+	rcall	DEC2ASCII			; 1st order digit
+	bcf		ignore_digit5		; yes, and clear flag
+output16_5:
+    bcf     ignore_digit4		; Clear flag
+	bcf		ignore_digit3		; Clear flag
+	clrf	ignore_digits
+	incf	ignore_digits,F
+	bcf		DP_done
+	RETURN						; Done with convert.asm...
+	
+DEC2ASCII	clrf	temp1		; converts into ASCII code
+DEC2ASCII_2	movf	temp3,W
+	subwf	hi_temp,W
+	btfss	STATUS,C	
+	bra		DEC2ASCII_4	
+	bnz		DEC2ASCII_3		
+
+	movf	temp2,W	
+	subwf	lo_temp,W
+	btfss	STATUS,C
+	bra		DEC2ASCII_4
+	
+DEC2ASCII_3	movf	temp3,W
+	subwf	hi_temp,F
+	movf	temp2,W
+	subwf	lo_temp,F
+	btfss	STATUS,C
+	decf	hi_temp,F
+	incf	temp1,F	
+	bsf		pre_zero_flag
+	bra		DEC2ASCII_2
+
+DEC2ASCII_4
+	decfsz	ignore_digits,F
+	return
+	incf	ignore_digits,F	; so ignore_digits stays zero for the test above
+	movlw	'0'				; Offset for Ascii-value
+	addwf	temp1,W
+	btfsc	pre_zero_flag	; is this a leading zero?
+	bra		DEC2ASCII_4_1	; no
+	btfsc	leftbind
+	bra		DEC2ASCII_6
+	movlw	' '				; instead of leading zeros a space!
+	bra		DEC2ASCII_5
+DEC2ASCII_4_1:
+	bsf		all_zeros_flag	; display any zero from here
+DEC2ASCII_5
+	movwf	POSTINC2
+DEC2ASCII_6	
+	decfsz	temp4,F			; Set decimal point?
+	RETURN					; No
+	movlw	"."				; Yes
+	movwf	POSTINC2
+	bsf		DP_done
+	RETURN
+	
+	END
\ No newline at end of file