; 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:
James Newton responds: "Thank you very, very much for finding and posting that correction. I have updated the listing."
Questions: