diff src/convert.asm @ 604:ca4556fb60b9

bump to 2.99beta, work on 3.00 stable
author heinrichsweikamp
date Thu, 22 Nov 2018 19:47:26 +0100
parents b455b31ce022
children c40025d8e750
line wrap: on
line diff
--- a/src/convert.asm	Thu Oct 11 21:06:29 2018 +0200
+++ b/src/convert.asm	Thu Nov 22 19:47:26 2018 +0100
@@ -1,6 +1,6 @@
 ;=============================================================================
 ;
-;   File convert.asm												## V2.98
+;   File convert.asm												## V2.98c
 ;
 ;   Converts register values to string
 ;
@@ -13,7 +13,7 @@
 
 #include "hwos.inc"						; Mandatory header
 
-basic	CODE
+convert		CODE
 
 ;=============================================================================
 
@@ -28,7 +28,7 @@
 output99:
 	movlw	d'99'
 	cpfslt	lo
-	movwf	lo							; Limit to 99
+	movwf	lo							; limit to 99
 	movff	lo,lo_temp
 	clrf	hi_temp
 	bcf		pre_zero_flag				; do not display leading zeros
@@ -54,7 +54,7 @@
 
 	movlw	d'99'
 	cpfslt	lo
-	movwf	lo							; Limit to 99
+	movwf	lo							; limit to 99
 	movff	lo, lo_temp
 	clrf	hi_temp
 	bsf		pre_zero_flag				; display leading zeros
@@ -84,18 +84,18 @@
 	; 9999 = 27 0F = [39][15]
 	movlw	.40
 	cpfslt	hi							; hi < 40 ?
-	bra		output16_4_call_2			; No, hi >= 40, do limit
+	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
+	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.
+	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
+	bra		output16_4_call_3			; done
+output16_4_call_2:						; set to 9999
 	movlw	LOW  .9999
 	movwf	lo
 	movlw	HIGH .9999
@@ -113,13 +113,13 @@
 	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...)
+	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
+	bra		output16_3_call_3			; done
+output16_3_call_2:						; set to .999
 	movlw	LOW  .999
 	movwf	lo
 	movlw	HIGH .999
@@ -130,10 +130,10 @@
 	incf	ignore_digits,F
 	clrf	WREG
 output16:
-	movwf	cvt_temp4						; Passed from output16dp macro, cleared by others.
+	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?
+	tstfsz	cvt_temp4					; display leading zeros at all?
 	bcf		leading_zeros
 	bsf		DP_done2
 	tstfsz	cvt_temp4
@@ -149,7 +149,7 @@
 	bra		output16_sk5
 	btfsc	show_last4					; display only last four figures?
 	bra		output16_sk5
-	rcall	DEC2ASCII					; No, show all. Here: 5th order digit
+	rcall	DEC2ASCII					; NO - show all, here: 5th order digit
 
 output16_sk5:
 	bcf		show_last4
@@ -157,41 +157,41 @@
 	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	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
+	bcf		pre_zero_flag				; NO
 
 output16_1:
-	btfsc	DP_done						; Decimal point set already?
-	bsf		pre_zero_flag				; Yes, so display the rest
+	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
+	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	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
+	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
+	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
@@ -211,28 +211,28 @@
 	btfsc	DP_done2
 	bsf		pre_zero_flag
 output16_4:
-	btfsc	ignore_digit4				; Ignore 4-5th digit?
-	bra		output16_5					; Yes, skip the rest
+	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?
+	btfss	ignore_digit5				; ignore 5th digit?
 	rcall	DEC2ASCII					; 1st order digit
-	bcf		ignore_digit5				; yes, and clear flag
+	bcf		ignore_digit5				; YES - clear flag
 output16_5:
-	bcf		ignore_digit4				; Clear flag
-	bcf		ignore_digit3				; Clear flag
+	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...
+	return								; done with convert.asm...
 
 
 DEC2ASCII:
-	clrf	cvt_temp1						; converts into ASCII code
+	clrf	cvt_temp1					; converts into ASCII code
 DEC2ASCII_2:
 	movf	cvt_temp3,W
 	subwf	hi_temp,W
@@ -257,10 +257,10 @@
 	decfsz	ignore_digits,F
 	return
 	incf	ignore_digits,F				; so ignore_digits stays zero for the test above
-	movlw	'0'							; Offset for ASCII-value
+	movlw	'0'							; offset for ASCII-value
 	addwf	cvt_temp1,W
 	btfsc	pre_zero_flag				; is this a leading zero?
-	bra		DEC2ASCII_4_1				; no
+	bra		DEC2ASCII_4_1				; NO
 	btfsc	leftbind
 	bra		DEC2ASCII_6
 	movlw	' '							; instead of leading zeros a space!
@@ -270,11 +270,34 @@
 DEC2ASCII_5:
 	movwf	POSTINC2
 DEC2ASCII_6:
-	decfsz	cvt_temp4,F						; Set decimal point?
-	RETURN								; No
-	movlw	"."							; Yes
+	decfsz	cvt_temp4,F					; set decimal point?
+	RETURN								; NO
+	movlw	"."							; YES
 	movwf	POSTINC2
 	bsf		DP_done
 	return
 
+
+	global	outputHEX_call
+outputHEX_call:							; coverts 8 Bit integer into two hex digits
+	movwf	cvt_temp1					; copy byte to process from WREG to local temp
+	swapf	cvt_temp1,F					; swap nibbles to process upper nibble first
+	rcall	outputHEX_nibble			; print nibble as ASCII
+	swapf	cvt_temp1,F					; swap back to process lower nibble
+outputHEX_nibble:
+	movff	cvt_temp1,cvt_temp2			; create a working copy
+	movlw	0x0F						; mask for lower nibble
+	andwf	cvt_temp2,F					; isolate lower nibble
+	movlw	0x30						; offset from binary 0 to ASCII code for "0"
+	addwf	cvt_temp2,F					; add offset
+	movlw	0x39						; ASCII code for "9"
+	cpfsgt	cvt_temp2					; character code in cvt_temp2 pointing to something after "9"?
+	bra		outputHEX_1					; NO  - character code represents "0"..."9", can be printed
+	movlw	0x07						; YES - offset from ASCII code for character after "9" to character "A"
+	addwf	cvt_temp2,F					;     - add offset, character code now represents "A"..."F", can be printed now
+outputHEX_1:
+	movff	cvt_temp2,POSTINC2			; copy character code to output buffer
+	return
+
+
 	END