Code:
This will shift an array of values to the right by 4 bits, filling the leftmost nibble with zeros. Example: Before: Temp3 = 12h Temp2 = 34h Temp1 = 56h Temp0 = 78h After: Temp3 = 01h Temp2 = 23h Temp1 = 45h Temp0 = 67h It can be extended to any length and shifting to the left works on the same principle. SWAPF TEMP0,W ANDLW 0x0F MOVWF TEMP0 SWAPF TEMP1,W MOVWF TEMP1 ANDLW 0xF0 IORWF TEMP0,F MOVLW 0x0F ANDWF TEMP1,F SWAPF TEMP2,W MOVWF TEMP2 ANDLW 0xF0 IORWF TEMP1,F MOVLW 0x0F ANDWF TEMP2,F SWAPF TEMP3,W MOVWF TEMP3 ANDLW 0xF0 IORWF TEMP2,F MOVLW 0x0F ANDWF TEMP2,F ...
Alex Davies of Ace Electronics Engineering Says:
You can save 1 word per byte on the above by using XOR swaps with W as a carry register. ie, to shift to the left by a nibble:
(untested)
SWAPF TEMP0, W
MOVWF TEMP0
ANDLW 0x0F
XORWF TEMP0, F
SWAPF TEMP1, F
XORWF TEMP1, F
XORWF TEMP1, W
ANDLW 0x0F
XORWF TEMP1, F
SWAPF TEMP2, F
XORWF TEMP2, F
XORWF TEMP2, W
ANDLW 0x0F
XORWF TEMP2, F
...