From: Mike Keitz. There is a trick method that works for 4 bits. It replaces a 2-bit number in a variable with a 4-bit mask:
incf BitP, W ;W = 0001 0010 0011 0100
btfsc BitP, 1 ;If 0 or 1, result is almost correct now.
iorwf BitP, F ;BitP = [0000] [0001] 0011 0111
incf BitP, F ;BitP = 0001 0010 0100 1000
It could be the core of an 8-bit routine thus:
; Convert 3-bit number (0-7) in INDEX to a 8-bit mask (00000001 ...
; 10000000) in BitP.
movfw INDEX
andlw b'00000011' ;Start with half of the mask.
movwf BitP
incf BitP, W ;The 4-bit converter
btfsc BitP, 1
iorwf BitP, F
incf BitP, F
btfsc INDEX, 2 ;Is it high 4 bits?
swapf BitP, F
Code:
Still, a simple table lookup or 8-bits is less instruction cycles and doesn't need a temp register. And it can do a little math too (set bit 7-WREG instead of bit WREG) GET_BIT ADDWF PCL,F RETLW B'00000001' RETLW B'00000010' RETLW B'00000100' RETLW B'00001000' RETLW B'00010000' RETLW B'00100000' RETLW B'01000000' RETLW B'10000000' GET_BIT2 ADDWF PCL,F RETLW B'10000000' RETLW B'01000000' RETLW B'00100000' RETLW B'00010000' RETLW B'00001000' RETLW B'00000100' RETLW B'00000010' RETLW B'00000001'