; 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: