PIC 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
; 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 269 (or 252 with known_zero) instructions executed
        clrf temp
        skp
sub10k  incf temp,f
        movlw 10000 & 255
        subwf LO,f

;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
        movlw 10000 >> 8
        skpc
        addlw 1         ; this sucks
        subwf HI,f
ELSE
	rlf     known_zero,W
	sublw   (10000>>8)+1	;bugfix by Dmitry Kiryashov and Nikolai Golovchenko
	subwf   Hi,F
ENDIF
        bc sub10k               ;9*7=63/8*7=56 inst in loop for 60900 (worst)
        output(temp);

        movlw 10
        movwf temp
add1K   decf temp,f
        movlw 1000 & 255
        addwf LO,f

;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
        movlw 1000 >> 8
        skpnc
        addlw 1
        addwf HI,f
ELSE
	rlf   known_zero,w
	addlw 1000 >> 8
	addwf HI,f
ENDIF
        bnc add1k               ;9*10=90/8*10=80 inst in loop for 60900
        output(temp);

;Scott takes over here
	clrf  temp
	movlw 100
	skp            ;is this a valid macro? I'd write goto $+2 ...
sub100
	incf  temp,f
	subwf LO,f
	skpc
	goto sub100

	decf  HI,f
	btfss HI,7	;Check msb instead of carry for underflow.
	goto 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)

        movlw 10
        movwf temp
add10   decf temp,f
        addwf LO,f
        bnc add10               ;40 inst in loop for worst case.
        output(temp);
        output(LO);
        return