Tracy Smith says
Here are a couple of ideas for getting 1<<TestBit10 cycles: 2^n: clrw btfsc TestBit,2 movlw b'11111100' addwf TestBit,f incf TestBit,w btfsc TestBit,1 iorwf TestBit,f incf TestBit,f skpnc swapf TestBit,f ......... another way (7 cycles [including the call]) two_to_n: andlw 7 addwf pcl,f retlw 1 retlw 2 retlw 4 retlw 8 retlw 0x10 retlw 0x20 retlw 0x40 retlw 0x80 ............ or probably more to the point movf portb,w movwf portb_shadow btfss TestBit,2 swapf portb_swadow,f btfss TestBit,0 rlf portb_shadow,f movlw b'10000000' btfss TestBit,1 movlw b'00100000' andwf portb_shadow,f skpnz goto _the_bit_is_set .lo
Kevin Blain says:
clrf mask ; empty the mask ; a file called bit contains the 0 to 7 value of the bit position incf bit ; make it 1 to 8, so decfsz works nicely bsf STATUS, C ; set the carry flag. This will be rotated in 'bit' times loop: rlf mask, f decfsz bit, f ; skip out after 'bit' times. goto loop ..... ; rest of code... Of course, it would be good to ensure that bit is not greater than 7 when entering the routine.
see: http://www.infosite.com/%7Ejkeyzer/piclist/1999/Nov/0018.html