Tracy Smith says
Here are a couple of ideas for getting 1<<TestBit
10 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