====== PIC17 assembler mnemonics ======
===== Transfers =====
^ Traditional ^ Op code ^ as ^ Operation ^
| movwf f | 0000 0001 | atx | f = w |
| movfp f,wreg | 0110 1010 | xta | w = f |
| movlw k | 1011 0000 | cta | w = c |
| clrf wreg | 0010 1001 0000 1010 | az | w = 0 |
| setf wreg | 0010 1011 0000 1010 | as | w = 0xff |
| movfp f,p | 011 | xtr | p = f |
| movpf p,f | 010 | rtx | f = p |
| clrf f | 0010 1001 | xz | f = 0 |
| setf f | 0010 1011 | xs | f = 0xff |
| clrf f,w | 0010 1000 | xza | f = w = 0 |
| setf f,w | 0010 1010 | xsa | f = w = 0xff |
====== Conditional ops ======
^ Traditional ^ Op code ^ as ^ Operation ^
| tstfsz wreg | 0011 0011 0000 1010 | a? | if (w != 0) |
| decfsz wreg | 0001 0111 0000 1010 | a--? | w = w-1; if (w != 0) |
| dcfsnz wreg | 0010 0111 0000 1010 | a--z? | w = w-1; if (w == 0) |
| incfsz wreg | 0001 1111 0000 1010 | a++? | w = w+1; if (w != 0) |
| infsnz wreg | 0010 0101 0000 1010 | a++z? | w = w+1; if (w == 0) |
| tstfsz f | 0011 0011 | x? | if (f != 0) |
| btfsc f,b | 1001 1 | bs? | if (f.b != 0) |
| btfss f,b | 1001 0 | bz? | if (f.b == 0) |
| cpfseq f | 0011 0001 | a!=x? | if (a != x) |
| cpfsgt f | 0011 0010 | a<=x? | if (a <= x) |
| cpfslt f | 0011 0000 | a>=x? | if (a >= x) |
| decfsz f,w | 0001 0110 | x--a? | w = f-1; if (w != 0) |
| decfsz f | 0001 0111 | x--? | f = f-1; if (f != 0) |
| dcfsnz f,w | 0010 0110 | x--az? | w = f-1; if (w == 0) |
| dcfsnz f | 0010 0111 | x--z? | f = f-1; if (f == 0) |
| incfsz f,w | 0001 1110 | x++a? | w = f+1; if (w != 0) |
| incfsz f | 0001 1111 | x++? | f = f+1; if (f != 0) |
| infsnz f,w | 0010 0100 | x++az? | w = f+1; if (w == 0) |
| infsnz f | 0010 0101 | x++z? | f = f+1; if (f == 0) |
====== Arithmetic ops ======
^ Traditional ^ Op code ^ as ^ Operation ^
| addwf f,w | 0000 1110 | a+x | w += f |
| addwf f | 0000 1111 | x+a | f += w |
| addwfc f,w | 0001 0000 | a+cx | w += f + carry |
| addwfc f | 0001 0001 | x+ca | f += w + carry |
| mulwf f | 0011 0100 | a*x | prod = w*f |
| mullw k | 1011 1100 | a*c | prod = w * c |
| subwf f,w | 0000 0100 | a-x | w = f - w |
| subwf f | 0000 0101 | x-a | f -= w |
| subwfb f,w | 0000 0010 | a-bx | w = f - (w + ~carry) |
| subwfb f | 0000 0011 | x-ba | f -= w + ~carry |
| decf f,w | 0000 0110 | x--a | w = f-1 |
| decf f | 0000 0111 | x-- | f = f-1 |
| incf f,w | 0001 0100 | x++a | w = f+1 |
| incf f | 0001 0101 | x++ | f = f+1 |
| negw f,w | 0010 1100 | anax | f = w = ~w+1 |
| negw f | 0010 1101 | anx | f = ~w+1 |
| addlw k | 1011 0001 | a+c | w += c |
| sublw k | 1011 0010 | c-a | w = c - w |
| daw f,w | 0010 1110 | adax | f = w = adjust(w) |
| daw f | 0010 1111 | adx | f = adjust(w) |
====== Logical ops ======
^ Traditional ^ Op code ^ as ^ Operation ^
| andwf f,w | 0000 1010 | a&x | w &= f |
| andlw k | 1011 0101 | a&c | w &= c |
| andwf f | 0000 1011 | x&a | f &= w |
| iorwf f,w | 0000 1000 | a|x | w |= f |
| iorlw k | 1011 0011 | a|c | w |= c |
| iorwf f | 0000 1001 | x|a | f |= w |
| xorwf f,w | 0000 1100 | a^x | w ^= f |
| xorlw k | 1011 0100 | a^c | w ^= c |
| xorwf f | 0000 1101 | x^a | f ^= w |
| comf f,w | 0001 0010 | xca | w = ~f |
| comf f | 0001 0011 | xc | f = ~f |
| rlncf f,w | 0010 0010 | x<>a | w = f >> 1 |
| rrncf f | 0010 0001 | x>>x | f = f >> 1 |
| rlcf f,w | 0001 1010 | xc<>a | w = carry:f >> 1 |
| rrcf f | 0001 1001 | xc>>x | f = carry:f >> 1 |
| swapf wreg | 0001 1101 0000 1010 | aw | w = swap(w) |
| swapf f | 0001 1101 | xw | f = swap(f) |
| swapf f,w | 0001 1100 | xwa | w = swap(f) |
====== Bit ops ======
^ Traditional ^ Op code ^ as ^ Operation ^
| bcf f,b | 1000 1 | bz | f.b = 0 |
| bsf f,b | 1000 0 | bs | f.b = 1 |
| btg f,b | 0011 1 | bt | f.b ^= 1 |
====== Control flow ======
^ Traditional ^ Op code ^ as ^ Operation ^
| goto k | 110 | goto | goto c() |
| call k | 111 | call | call c() |
| lcall k | 1011 0111 | lcall | lcall c() |
| return | 0000 0000 0000 0010 | ret | return |
| retfie | 0000 0000 0000 0101 | reti | return; enable interrupts |
| retlw k | 1011 0110 | retc | w = c; return |
| nop | 0000 0000 | nop | -- |
====== Special ops ======
^ Traditional ^ Op code ^ as ^ Operation ^
| movlb k | 1011 1000 | reg | low(bsr) = c |
| movlr k | 1011 1010 | dat | high(bsr) = c |
| clrwdt | 0000 0000 0000 0100 | awake | clear watchdog timer |
| sleep | 0000 0000 0000 0011 | sleep | enter sleep mode |
====== Program memory access ======
^ Traditional ^ Op code ^ as ^ Operation ^
| tablrd 0,0,f | 1010 1000 | plx | f = low(latch); latch = *tptr |
| tablrd 0,1,f | 1010 1001 | pl++x | f = low(latch); latch = *tptr++ |
| tlrd 0,f | 1010 0000 | llx | f = low(latch) |
| tlrd 1,f | 1010 0010 | lhx | f = high(latch) |
| tablwt 1,0,f | 1010 1110 | xhp | high(latch) = f; *tptr = latch |
| tablwt 1,1,f | 1010 1111 | xhp++ | high(latch) = f; *tptr++ = latch |
| tlwt 0,f | 1010 0100 | xll | low(latch) = f |
| tlwt 1,f | 1010 0110 | xhl | high(latch) = f |