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