Tracy Smith says
Here are a couple of ideas for getting 1<<TestBit (10 cycles):2^n: clr W snb TestBit.2 mov W, #%11111100 add TestBit, W mov W, ++TestBit snb TestBit.1 or TestBit, W inc TestBit snb C swap TestBit ......... another way (7 cycles [including the call]) two_to_n: and W, #7 add PC, W retw #1 retw #2 retw #4 retw #8 retw #$10 retw #$20 retw #$40 retw #$80 ............ or probably more to the point mov W, Rb mov portb_shadow, W sb TestBit.2 swap portb_swadow sb TestBit.0 rl portb_shadow mov W, #%10000000 sb TestBit.1 mov W, #%00100000 and portb_shadow, W snb Z jmp _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 inc bit ; make it 1 to 8, so decfsz works nicely setb C ; set the carry flag. This will be rotated in 'bit' times :loop rl mask decsz bit ; skip out after 'bit' times. jmp 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