The corrected version is attached below. There was really just
one bug - skpc instead of skpnc in sub100 section, and some
syntax violations. Now it works with and without the known_zero reg.
Nikolai
;-------------------------------------------------------------------
#include <p16f84.inc>
;define something for output(x), or replace it with other code
#define output(x) movfw x
cblock 0x0C
temp
LO, HI
known_zero
endc
;0x2700 = 9984
movlw 0x27
movwf HI
movlw 0x00
movwf LO
#IFDEF known_zero
clrf known_zero
#ENDIF
; 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
goto $+2 ;[NG] was: skip
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
movlw (10000>>8)+1 ;[NG] was: 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
movlw (1000>>8)+1 ;[NG] was: 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
goto $+2 ;[NG] was: skip
sub100
incf temp,f
subwf LO,f
skpnc ;[NG] was: 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
;-------------------------------------------------------------------
---- Original Message ----
From: Drew Vassallo <spam_OUTsnurpleTakeThisOuT
HOTMAIL.COM>
Sent: Friday, January 12, 2001 19:01:07
To: .....PICLISTKILLspam
@spam@MITVMA.MIT.EDU
Subj: [PIC]: hex2dec
{Quote hidden}> No, I'm sure it doesn't work. I tried everything, including having a
> non-zero defined number and a known_zero - both. Also, I used the original
> decimal numbers and converted numbers - neither worked.
> As for an example, try a number of 0x2700 (should be 9984d) put into HI and
> LO.
> I get outputs of 00, 09, 05, FD, and ?? (don't recall)
> instead of 00, 09, 09, 08, and 04.
> --Andrew
--
http://www.piclist.com hint: The list server can filter out subtopics
(like ads or off topics) for you. See http://www.piclist.com/#topics