PIC Microcontoller 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

	clr	temp
sub30k
	mov	W, #3
	add	temp, W
	mov	W, #low(30000)
	sub	Lo, W

IFNDEF known_zero
	mov	W, #high(30000)
	sb	C
	mov	W, #high(30000) + 1
	sub	Hi, W
ELSE
	mov	W, <<known_zero
;*** WARNING: Manual replacement required for "SUBLW k" instruction (w = k - w). Check if previous instruction is a skip instruction. 
        sublw high(30000) + 1
	sub	Hi, W
ENDIF
	snb	C
	jmp	sub30k

add10k
	dec	temp
	mov	W, #low(10000)
	add	Lo, W

IFNDEF known_zero
	mov	W, #high(10000)
	snb	C
	mov	W, #high(10000) + 1
	add	Hi, W
ELSE
	mov	W, <<known_zero
;*** WARNING: ADDLW was expanded in three instructions! Check if previous instruction is a skip instruction. 
;        addlw high(10000)
	mov	Hack, W
	mov	W, #high(10000)
	add	W, Hack
	add	Hi, W
ENDIF
	sb	C
	jmp	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)

	clr	temp
sub3k
	mov	W, #3
	add	temp, W
	mov	W, #low(3000)
	sub	Lo, W
IFNDEF known_zero
	mov	W, #high(3000)
	sb	C
	mov	W, #high(3000) + 1
	sub	Hi, W
ELSE
	mov	W, <<known_zero
;*** WARNING: Manual replacement required for "SUBLW k" instruction (w = k - w). Check if previous instruction is a skip instruction. 
        sublw high(3000) + 1
	sub	Hi, W
ENDIF
	snb	C
	jmp	sub3k
add1k
	dec	temp
	mov	W, #low(1000)
	add	Lo, W

IFNDEF known_zero
	mov	W, #high(1000)
	snb	C
	mov	W, #high(1000) + 1
	add	Hi, W
ELSE
	mov	W, <<known_zero
;*** WARNING: ADDLW was expanded in three instructions! Check if previous instruction is a skip instruction. 
;        addlw high(1000)
	mov	Hack, W
	mov	W, #high(1000)
	add	W, Hack
	add	Hi, W
ENDIF
	sb	C
	jmp	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)

	clr	temp
sub300
	mov	W, #3
	add	temp, W
	mov	W, #low(300)
	sub	Lo, W
IFNDEF known_zero
	mov	W, #high(300)
	sb	C
	mov	W, #high(300) + 1
	sub	Hi, W
ELSE
	mov	W, <<known_zero
;*** WARNING: Manual replacement required for "SUBLW k" instruction (w = k - w). Check if previous instruction is a skip instruction. 
        sublw high(300) + 1
	sub	Hi, W
ENDIF
	snb	C
	jmp	sub300
	mov	W, #100
add100
	dec	temp
	add	Lo, W
	sb	C
	jmp	add100
	inc	Hi
	snb	Hi.7
	jmp	add100
;       Output(temp)         ;output temp = Hund
;worst case: 10 * 4 + 5 * 3 + 3 = 59

	clr	temp
	mov	W, #30
sub30
	inc	temp
	sub	Lo, W
	snb	C
	jmp	sub30
	mov	W, temp
	rl	temp
	add	temp, W
	mov	W, #10
add10
	dec	temp
	add	Lo, W
	sb	C
	jmp	add10
;       Output(temp)         ;output temp = Tens
;worst case: 5 * 4 + 5 * 3 + 4 = 39

;       Output(Lo)         ;output temp = Ones