=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- Date: Sat, 11 Mar 2000 20:25:36 From: Nikolai GolovchenkoTo: pic microcontroller discussion list Subject: Re: How to write code that no one will laugh at [OT] -------------------------------------------------------------------------------- How about this one? Saves 18 cycles for the first digit, 25 for the second, and 12 for the fourth. Same(?) for the third. For the case without known_zero it saves even more. The cost is bigger code. Conditional compiling directives tested in MPLAB :) James, I can't figure how you counted executed instructions? 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 Nikolai On Friday, March 10, 2000 James Newton wrote: > Nice. Thanks Scott. > The 8 bit to BCD routine is 28 instructions by my count. I have it at > http://techref.massmind.org/microchip/math/radix/b2bhp-8b3d > and I think it would require another temp... well... no I guess you could > reuse HI. It would also need extra (trivial) code to separate tens and ones. > Summary: > As I don't know the MChip syntax for conditional compilation, I have: > ; by Rich Leggitt with tweaks by Scott Dattalo > ; given 16 bit data in HI and LO, extract decimal digits > ; requires one Output register called temp, HI and LO are destroyed. > ; 42? instructions less than 217 (or 199 with known_zero) instructions > executed > clrf temp > skp > 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 > addlw 1 ; this sucks > subwf HI,f > ELSE > rlf known_zero,w > addlw 10000 >> 8 > subwf HI,f > ENDIF > bc sub10k ;48/39 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 > addlw 1 > addwf HI,f > ELSE > rlf known_zero,w > addlw 1000 >> 8 > addwf HI,f > ENDIF > bnc add1k ;72/63 inst in loop for 60900 > output(temp); > ;Scott takes over here > clrf temp > movlw 100 > skp ;is this a valid macro? I'd write goto $+2 ... > sub100 > incf temp,f > subwf LO,f > 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 57(?) 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 ;27 inst in loop for worst case. > output(temp); > output(LO); > return > --- > James Newton mailto:jamesnewton@geocities.com 1-619-652-0593 > http://techref.massmind.org NEW! FINALLY A REAL NAME! > Members can add private/public comments/pages ($0 TANSTAAFL web hosting) > -----Original Message----- > From: Scott Dattalo [mailto:scott@dattalo.com] > Sent: Friday, March 10, 2000 10:27 > To: James Newton > Cc: PICLIST@MITVMA.MIT.EDU > Subject: Re: How to write code that no one will laugh at [OT] > Importance: Low > I added a few things that'll speed it up...