diff code_part1/OSTC_code_asm_part1/valconv.asm @ 0:96a35aeda5f2

Initial setup
author heinrichsweikamp
date Tue, 12 Jan 2010 15:05:59 +0100
parents
children e8756eba54ee
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/code_part1/OSTC_code_asm_part1/valconv.asm	Tue Jan 12 15:05:59 2010 +0100
@@ -0,0 +1,262 @@
+; OSTC - diving computer code
+; Copyright (C) 2008 HeinrichsWeikamp GbR
+
+;    This program is free software: you can redistribute it and/or modify
+;    it under the terms of the GNU General Public License as published by
+;    the Free Software Foundation, either version 3 of the License, or
+;    (at your option) any later version.
+
+;    This program is distributed in the hope that it will be useful,
+;    but WITHOUT ANY WARRANTY; without even the implied warranty of
+;    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+;    GNU General Public License for more details.
+
+;    You should have received a copy of the GNU General Public License
+;    along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+
+; converts hex values to dez values
+; written by: Matthias Heinrichs, info@heinrichsweikamp.com
+; written: 13/10/07
+; last updated: 5/11/07
+; known bugs:
+; ToDo: clean up!!!
+
+
+output_16_3 macro			; displays only last three figures from a 16Bit value (0-999)
+	clrf	ignore_digits
+	incf	ignore_digits,F
+	clrf	temp4
+	bsf		show_last3	
+	movf	temp4,W			; Temp4 stores position for decimal point
+	call 	output16
+	endm
+
+output_16dp macro temp4		; 16Bit with decimal point
+	movlw	temp4			; Temp4 stores position for decimal point
+	call 	output16		
+	endm					
+
+output_16 macro				; 16Bit Normal
+	clrf	ignore_digits
+	incf	ignore_digits,F
+	clrf	temp4
+	movf	temp4,W			; Temp4 stores position for decimal point
+	call 	output16
+	endm
+
+output_8 macro				; 8 Bit Normal
+	clrf	ignore_digits
+	incf	ignore_digits,F
+	clrf	temp4
+	call output8
+	endm
+
+output_99 macro				; displays only last two figures from a 8Bit value (0-99)
+	clrf	ignore_digits
+	incf	ignore_digits,F
+	clrf	temp4
+	call 	output99
+	endm
+
+output_99x macro			; displays only last two figures from a 8Bit value with leading zero (00-99) 
+	clrf	ignore_digits
+	incf	ignore_digits,F
+	clrf	temp4
+	call 	output99x
+	endm
+
+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
+
+output99x:
+	movff	lo, lo_temp		
+	clrf	hi_temp
+	bsf		pre_zero_flag		; display leading zeros
+	bra		LCD_val99_2			
+	
+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			
+
+output16
+	bcf		all_zeros_flag	; do not display any zero from here unless there was at least one figure /zero
+
+	movwf	temp4
+	
+	bsf		leading_zeros
+	incf	temp4,1
+	decfsz	temp4,F
+	bcf		leading_zeros
+
+	bsf		DP_done2		
+	incf	temp4,1
+	decfsz	temp4,F
+	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
+	
+	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
+	bcf		show_last3			; No, 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
+
+	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
+
+	movlw	b'00000001'	; 1s
+	movwf	temp2		
+	clrf	temp3		 
+	bsf		pre_zero_flag
+	btfss	ignore_digit5		; Ignore 5th digit?
+	rcall	DEC2ASCII			; No!
+	bcf		ignore_digit5		; yes, and clear flag
+output16_5:
+	bcf		ignore_digit3		; Clear flag
+	clrf	ignore_digits
+	incf	ignore_digits,F
+	bcf		DP_done
+	RETURN
+	
+DEC2ASCII	clrf	temp1		; converts into ASCII code
+DEC2ASCII_2	movf	temp3,W
+	subwf	hi_temp,0
+	btfss	STATUS,C	
+	bra		DEC2ASCII_4	
+	bnz		DEC2ASCII_3		
+
+	movf	temp2,W	
+	subwf	lo_temp,0
+	btfss	STATUS,C
+	bra		DEC2ASCII_4
+	
+DEC2ASCII_3	movf	temp3,W
+	subwf	hi_temp,1
+	movf	temp2,W
+	subwf	lo_temp,1
+	btfss	STATUS,C
+	decf	hi_temp,1
+	incf	temp1,1	
+	bsf		pre_zero_flag
+	bra		DEC2ASCII_2
+
+DEC2ASCII_4
+	decfsz	ignore_digits,F
+	return
+	incf	ignore_digits,F
+	movlw	'0'				; Offset for Ascii-value
+	addwf	temp1,0	
+	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
\ No newline at end of file