diff examples/bin2dec.asm @ 57:2088fd998865

sbc09 directry clean up
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Mon, 23 Jul 2018 16:07:12 +0900
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/examples/bin2dec.asm	Mon Jul 23 16:07:12 2018 +0900
@@ -0,0 +1,85 @@
+* Convert 32-bits binary number to decimal.
+	org $400
+	
+main	lds #$8000
+	ldx #num1
+	jsr prtdec
+	ldx #num2
+	jsr prtdec
+	ldx #num3
+	jsr prtdec
+	ldx #num4
+	jsr prtdec
+	ldx #num5
+	jsr prtdec
+	ldx #num6
+	jsr prtdec
+	swi
+
+
+* Print double number (including leading zeros)  pointed to by X. 
+* Number at that location is destroyed by the process.
+prtdec	jsr bin2bcd	;Convert to bcd
+        ldx #bcdbuf	;Traverse 5-byte buffer.
+	ldb #5
+	stb temp
+pdloop	lda ,x+	        
+        tfr a,b		
+	lsrb
+	lsrb
+	lsrb
+	lsrb		;Extract higher digit from bcd byte.
+ 	addb #'0
+	jsr outch
+	tfr a,b
+	andb #15	;Extract lower digit.
+	addb #'0
+	jsr outch
+	dec temp
+	bne pdloop
+	ldb #13		;output newline.
+	jsr outch
+	ldb #10
+	jsr outch
+	rts
+
+* Convert 4-byte number pointed to by X to 5-byte (10 digit) bcd.
+bin2bcd ldu #bcdbuf
+	ldb #5
+bbclr	clr ,u+		;Clear the 5-byte bcd buffer.
+	decb
+	bne bbclr
+        ldb #4		;traverse 4 bytes of bin number 
+	stb temp
+bbloop	ldb #8		;and 8 bits of each byte. (msb to lsb)
+	stb temp2
+bbl1	rol ,x		;Extract next bit from binary number.
+	ldb #5
+        ldu #bcdbuf+5
+bbl2	lda ,-u		;multiply bcd number by 2 and add extracted bit
+	adca ,u		;into it. 
+	daa
+	sta ,u
+	decb
+	bne bbl2
+	dec temp2
+	bne bbl1
+	leax 1,x
+	dec temp
+	bne bbloop
+	rts
+
+* Output character B 
+outch	jsr 3
+	rts
+
+bcdbuf	rmb 5
+temp	rmb 1
+temp2 	rmb 1
+
+num1	fdb -1,-1       ; should be 4294967295
+num2	fdb 0,0         ; should be 0000000000
+num3	fdb 32768,0     ; should be 2147483648
+num4	fdb $3b9A,$c9ff ; should be 0999999999
+num5    fdb $3b9a,$ca00 ; should be 1000000000
+num6	fdb 0,5501	; should be 0000005501
\ No newline at end of file