SX Microcontroller Radix Math Method

Binary to ASCII, 16 bit to 5 digits (1 at a time) no temp register (!)

; by Rich Leggitt with tweaks by Scott Dattalo and bugfix by Dmitry Kiryashov and Nikolai Golovchenko and Ted Inoue.
; given 16 bit data in HI and LO, extract decimal digits
; requires one Output register called temp, HI and LO are destroyed.
; 42 instructions and less than 290 instructions executed
        clr     temp
        skip
sub10k  inc     temp
        mov     W, #10000 & 255
        sub     LO, W

;Scott Dattalo says:
;If you have a ram location that's known to be zero, then
;the following [the IF] can be replaced with [the ELSE]

IFNDEF known_zero
        mov     W, #10000 >> 8
        sb      C
        mov     W, #(10000 >> 8)+1
ELSE
	mov	W, << known_zero
        add     W, #(1000 >> 8) + 1
ENDIF
        sub     HI, W
        jc sub10k               ;11*7=77 inst in loop for 60900 (worst)
        output(temp);

        mov     W, #10
        mov     temp, W
add1K   dec     temp
        mov     W, #1000 & 255
        add     LO, W

;Scott Dattalo says:
;If you have a ram location that's known to be zero, then
;the following [the IF] can be replaced with [the ELSE]

IFNDEF known_zero
        mov     W, #1000 >> 8
        snb      C
        mov     W, #(1000 >> 8)+1
ELSE
	mov	W, << known_zero
        add     W, #1000 > > 8
ENDIF
        add     HI, W
        jnc add1k               ;10*10=100 inst in loop for 60900
        output(temp);

;Scott takes over here
        clr     temp
        mov     W, #100
        skip
sub100
        inc     temp
        sub     LO, W
        snb      C
        jmp     sub100

        dec     HI
        sb      HI.7    ;Check msb instead of carry for underflow.
        jmp     sub100  ;4 inst per loop to 200 then 7 per loop to 900.
                        ;Total 64(?) in loop for worst case

;at this point, HI = 0xff, and  0 <= LO <= 99

        output(temp)

        mov     W, #10
        mov     temp, W
add10   dec     temp
        add     LO, W
        jnc add10               ;40 inst in loop for worst case.
        output(temp);
        output(LO);
        ret


Comments:

Questions: