Hi Rich. incf FSR,F will destroy zero flag. Let's try to use incfsz FSR,F instead. WBR Dmitry. PS. modified variant of your code: ; given address of 32 bit little-endian counter in W, ; decrement the counter and return Z set if zero ; 99.2% of the time, this takes 10 cycles w/call dec32: movwf FSR decfsz INDF,F goto dec32nz incf FSR,F movfw INDF incf FSR,F iorwf INDF,W incf FSR,F iorwf INDF,W ;get _Z finally return dec32nz: clrz ;set _Z=0 incfsz INDF,W return incfsz FSR,F ;doesn't corrupt _Z decfsz INDF,F incfsz INDF,W return incfsz FSR,F ;... decfsz INDF,F incfsz INDF,W return incfsz FSR,F ;... decfsz INDF,F return return