Sigh . . . Its been one of those days. I screwed up on my last post of the 16 bit fast counter. Change the 'goto $+2' jumps in the normalise routine to 'goto $+3'. Sorry. I think that I'll go get some sleep. ;measure puse width on a 12c508 with 5 uSec resolution. ;Times out after about 327 mSec. clrf c_low clrf c_high s1: BTFSC IOPORT,IOBIT ;5 cycles goto went_high INCFSZ c_low,F goto s1 clrwdt ; BTFSC IOPORT,IOBIT ;5 cycles goto went_high INCFSZ c_high,F goto s1 ;note: each time HI byte increments, LO byte to misses a count ;final count == LoByte + HiByte time_out: ;do time out stuff here went_high ;fix up the mod 257 counter movfw c_high ; addwf c_low,F skpnc ;no carry - leave Hi byte alone incfsz c_high,F ;carry - does Hi byte contain ff? goto $+3 ;either no carry or did not wrap movwf c_low ;wrapped past ffff - hold at ff movwf c_high ;ditto The logic is simple - if the high byte contained ff and a carry was generated when the 2 bytes were added together (which would wrap the high byte to 00), the value in W (which could only be ff) is written to both bytes. My thanks to all who contributed ideas and suggestions. Scott - Thank you again for taking time out of your very busy day. dwayne