view src/convert.asm @ 582:b455b31ce022

work on 2.97 stable
author heinrichsweikamp
date Mon, 26 Feb 2018 16:40:28 +0100
parents a5fc007634c5
children ca4556fb60b9
line wrap: on
line source

;=============================================================================
;
;   File convert.asm												## V2.98
;
;   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 "hwos.inc"						; Mandatory header

basic	CODE

;=============================================================================

	global	output99_call
output99_call:
	clrf	ignore_digits
	incf	ignore_digits,F
	clrf	cvt_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	.10							; 10
	movwf	cvt_temp2
	clrf	cvt_temp3
	rcall	DEC2ASCII

	movlw	.1							; 1
	movwf	cvt_temp2
	clrf	cvt_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	cvt_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	cvt_temp4

output8:
	movff	lo, lo_temp
	clrf	hi_temp
	bcf		pre_zero_flag				; do not display leading zeros
	movlw	.100						; 100
	movwf	cvt_temp2
	clrf	cvt_temp3
	rcall	DEC2ASCII
	bra		LCD_val99_2


	global	output16_4_call
output16_4_call:						; limit to 9999
	bsf		show_last4
	; 9999 = 27 0F = [39][15]
	movlw	.40
	cpfslt	hi							; hi < 40 ?
	bra		output16_4_call_2			; No, hi >= 40, do limit
	; Yes, hi <= 39
	movlw	.39
	cpfseq	hi							; hi = 39 ?
	bra		output16_4_call_3			; No, hi < 39, no limit needed
	; Yes, hi = 39
	movlw	.15
	cpfslt	lo							; lo < 15
	movwf	lo							; No, lo >= 15, set lo = 15.
	; Yes, lo <= 14 or lo set to =15
	bra		output16_4_call_3			; done.
output16_4_call_2:						; Set to 9999
	movlw	LOW  .9999
	movwf	lo
	movlw	HIGH .9999
	movwf	hi
output16_4_call_3:
	bra		output16_call

	global	output16_3_call
	global	output16_call
	global	output16
output16_3_call:						; limit to 999
	bsf		show_last3
	; Limit to 3
	movlw	.4
	cpfslt	hi
	bra	output16_3_call_2
	movlw	.3
	cpfseq	hi							; =3?
	bra		output16_3_call_3			; No, done.
	movlw	.231						; Limit to 231(+768=999...)
	cpfslt	lo
	movwf	lo
	bra		output16_3_call_3			; done.
output16_3_call_2:						; Set to .999
	movlw	LOW  .999
	movwf	lo
	movlw	HIGH .999
	movwf	hi
output16_3_call_3:
output16_call:
	clrf	ignore_digits
	incf	ignore_digits,F
	clrf	WREG
output16:
	movwf	cvt_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	cvt_temp4						; Display leading zeros at all?
	bcf		leading_zeros
	bsf		DP_done2
	tstfsz	cvt_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	cvt_temp2
	movlw	b'00100111'
	movwf	cvt_temp3
	btfsc	show_last3					; display only last three figures?
	bra		output16_sk5
	btfsc	show_last4					; display only last four figures?
	bra		output16_sk5
	rcall	DEC2ASCII					; No, show all. Here: 5th order digit

output16_sk5:
	bcf		show_last4
	movlw	b'11101000'					; 1000s
	movwf	cvt_temp2
	movlw	b'00000011'
	movwf	cvt_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	cvt_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	cvt_temp2
	clrf	cvt_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	cvt_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	cvt_temp2
	clrf	cvt_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	cvt_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	cvt_temp2
	clrf	cvt_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	cvt_temp1						; converts into ASCII code
DEC2ASCII_2:
	movf	cvt_temp3,W
	subwf	hi_temp,W
	btfss	STATUS,C
	bra		DEC2ASCII_4
	bnz		DEC2ASCII_3
	movf	cvt_temp2,W
	subwf	lo_temp,W
	btfss	STATUS,C
	bra		DEC2ASCII_4
DEC2ASCII_3:
	movf	cvt_temp3,W
	subwf	hi_temp,F
	movf	cvt_temp2,W
	subwf	lo_temp,F
	btfss	STATUS,C
	decf	hi_temp,F
	incf	cvt_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	cvt_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	cvt_temp4,F						; Set decimal point?
	RETURN								; No
	movlw	"."							; Yes
	movwf	POSTINC2
	bsf		DP_done
	return

	END