PIC Microcontroller Radix Math Method

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

by Nikolai Golovchenko

;Thanks Scott, your code is very instructive.
;Total execution time:
;worst case: 47 + 66 + 58 + 39 + 2 = 213 cycles(with known zero)
;worst case: 53 + 73 + 58 + 39 + 2 = 226 cycles(without known zero)

;Code size: 68

        clrf temp
sub30k
        movlw 3
        addwf temp, f
        movlw low(30000)
        subwf Lo, f

IFNDEF known_zero
        movlw high(30000)
        skpc
        movlw high(30000) + 1
        subwf Hi, f
ELSE
        rlf known_zero, w
        sublw high(30000) + 1
        subwf Hi, f
ENDIF
        skpnc
        goto sub30k

add10k
        decf temp, f
        movlw low(10000)
        addwf Lo, f

IFNDEF known_zero
        movlw high(10000)
        skpnc
        movlw high(10000) + 1
        addwf Hi, f
ELSE
        rlf known_zero, w
        addlw high(10000)
        addwf Hi, f
ENDIF
        skpc
        goto add10k
;       Output(temp)         ;output temp = TenK
;worst case: 10 * 3 + 9 * 3 - 1 = 47 (with known zero)
;worst case: 11 * 3 + 10 * 3 - 1 = 53 (without known zero)

        clrf temp
sub3k
        movlw 3
        addwf temp, f
        movlw low(3000)
        subwf Lo, f
IFNDEF known_zero
        movlw high(3000)
        skpc
        movlw high(3000) + 1
        subwf Hi, f
ELSE
        rlf known_zero, w
        sublw high(3000) + 1
        subwf Hi, f
ENDIF
        skpnc
        goto sub3k
add1k
        decf temp, f
        movlw low(1000)
        addwf Lo, f

IFNDEF known_zero
        movlw high(1000)
        skpnc
        movlw high(1000) + 1
        addwf Hi, f
ELSE
        rlf known_zero, w
        addlw high(1000)
        addwf Hi, f
ENDIF
        skpc
        goto add1k
;       Output(temp)         ;output temp = Thou
;worst case: 10 * 4 + 9 * 3 - 1 = 66 (with known zero)
;worst case: 11 * 4 + 10 * 3 - 1 = 73 (without known zero)

        clrf temp
sub300
        movlw 3
        addwf temp, f
        movlw low(300)
        subwf Lo, f
IFNDEF known_zero
        movlw high(300)
        skpc
        movlw high(300) + 1
        subwf Hi, f
ELSE
        rlf known_zero, w
        sublw high(300) + 1
        subwf Hi, f
ENDIF
        skpnc
        goto sub300
        movlw 100
add100
        decf temp, f
        addwf Lo, f
        skpc
        goto add100
        incf Hi, f
        btfsc Hi, 7
        goto add100
;       Output(temp)         ;output temp = Hund
;worst case: 10 * 4 + 5 * 3 + 3 = 59

        clrf temp
        movlw 30
sub30
        incf temp, f
        subwf Lo, f
        skpnc
        goto sub30
        movfw temp
        rlf temp, f
        addwf temp, f
        movlw 10
add10
        decf temp, f
        addwf Lo, f
        skpc
        goto add10
;       Output(temp)         ;output temp = Tens
;worst case: 5 * 4 + 5 * 3 + 4 = 39

;       Output(Lo)         ;output temp = Ones