SX Microcontroller Radix Math Method

Unpacked BCD to 16 bit binary conversion

;*******************************************************************************
; Input: unpacked BCD in  tenk:thou:hund:tens:ones
;Output: 16 bit binary in hi:lo
;  Size: 35 instructions
;Timing: 3+34+3=40 instruction cycles
;
; Notes:
;1) if input is higher than 65535 output is meaningless
;2) algorithm synopsis:
;
;> dec2bin([1 10 100 1000 1e4], 16)
;ans =
;0000000000000001
;0000000000001010
;0000000001100100
;0000001111101000
;0010011100010000
;
;Or coded in three levels ('+' represents +1, '-' represents -1):
;000000000000000+ * ones +
;000000000000+0+0 * tens +
;000000000++00+00 * hund +
;00000+0000-0+000 * thou +
;00+0+00-000+0000 * tenk
;
;bin = (((tens+thou+tenk*256)*2+
;	hund+hund*16+thou*256)*2+
;	tens+hund*16-thou*16+tenk*16*256)*2+
;	ones+tenk*16-tenk*256
;
;January 22, 2001 by Nikolai Golovchenko
;*******************************************************************************

dec2bin16
	mov	W, tens
	add	W, thou
	mov	lo, W
        add     lo, W
	mov	W, <<tenk
	mov	hi, W

	mov	W, <>hund
	add	W, hund
	add	lo, W
	mov	W, thou
	add	hi, W
	rl	lo
	rl	hi

	mov	W, <>hund
	add	W, tens
	add	lo, W
	mov	W, <>tenk
	snc
	or	W, #$01
	add	hi, W
	mov	W, <>thou
	sub	lo, W
	sc
	dec	hi
	clc
	rl	lo
	rl	hi

	mov	W, <>tenk
	add	W, ones
	add	lo, W
	mov	W, tenk
	snc
	mov	W, --tenk
	sub	hi, W
	retp
;*******************************************************************************