# Utiliser les PIC 16F et 18F/Annexe/Les instructions du 18FXXX

Opérandes :
* f : register file address (adresse mémoire + registres) de 00 à 7F
* W : registre de travail
* d : sélection de destination : d=0 vers W, d=1 vers f
* a : a=0 Access RAM sélectionnée sans tenir compte de BSR, a=1 BSR est utilisé (banked)
* bbb : adresse de bit dans un registre 8 bits (sur 3 bits)
* k : champ littéral (8, 12 ou 20 bits)
* s : sélection du mode rapide : s=0 pas de restauration des registres W, STATUS et BSR
* PC compteur programme
* TO Time Out bit
* PD Power Down bit

## Opérations orientées octets entre registre et mémoire

Opérations orientées octets entre registre et mémoire (File en anglais) :
| Mnémonique Opérande | Description | Cycles | 16 bits Opcode | status affected | notes |
| ADDWF f[,d[,a]] | Additionne W et f | 1 | 0010 01da ffff ffff | N,OV,C,DC,Z | 1,2 |
| ADDWFC f[,d[,a]] | Additionne W et f et retenue | | 0010 00da ffff ffff | N,OV,C,DC,Z | 1,2 |
| ANDWF f[,d[,a]] | ET bit à bit W et f | 1 | 0001 01da ffff ffff | N,Z | 1,2 |
| CLRF f[,a] | mise à 0 de f | 1 | 0110 101a ffff ffff | Z | 2 |
| COMF f,[d[,a]] | Complément de f | 1 | 0001 11da ffff ffff | N,Z | 1,2 |
| CPFSEQ f[,a] | compare f avec W, saute si = | 1,(2 ou3) | 0110 001a ffff ffff | | 4 |
| CPFSGT f[,a] | compare f avec W, saute si > | 1, (2 ou3) | 0110 010a ffff ffff | | 4 |
| CPFSLT f[,a] | compare f avec W, saute si < | 1, (2 ou3) | 0110 000a ffff ffff | | 1,2 |
| DECF f[,d[,a]] | Décrémente f | 1 | 0000 01da ffff ffff | C,DC,N,OV,Z | 1,2,3,4 |
| DECFSZ f[,d[,a]] | Décrémente f (saute si 0) | 1,(2) | 0010 11da ffff ffff | | 1,2,3,4 |
| DECFSNZ f[,d[,a]] | Décrémente f (saute si non 0) | 1,(2) | 0100 11da ffff ffff | | 1,2,3,4 |
| INCF f[,d[,a]] | Incrémente f | 1 | 0010 10da ffff ffff | C,DC,N,OV,Z | 1,2,3,4 |
| INCFSZ f[,d[,a]] | Incrémente f (saute si 0) | 1,(2 ou 3) | 0011 11da ffff ffff | | 1,2,3 |
| INFSNZ f[,d[,a]] | Incrémente f (saute si non 0) | 1,(2 ou 3) | 0100 10da ffff ffff | | 1,2,3 |
| IORWF f[,d[,a]] | Ou inclusif de f | 1 | 0001 00da ffff ffff | Z,N | 1,2 |
| MOVF f[,d[,a]] | déplacement de f (adressage direct) | 1 | 1001 00da ffff ffff | Z,N | 1,2 |
| MOVFF fs,fd | déplacement de fs (source) en fd (destination) | 2 | 1100 ffff ffff ffff (s) 1111 ffff ffff ffff (d) | | |
| MOVWF f[,a] | déplacement de W vers f | 1 | 0110 111a ffff ffff | | |
| MULWF f[,a] | multiplication de W par f | 1 | 0000 001a ffff ffff | | |
| NEGF f[,a] | négation de f | 1 | 0110 110a ffff ffff | C,DC,N,OV,Z | 1,2 |
| RLCF f[,d[,a]] | Rotation gauche avec la retenue | 1 | 0011 01da ffff ffff | C,Z,N | |
| RLNCF f[,d[,a]] | Rotation gauche sans la retenue | 1 | 0100 01da ffff ffff | Z,N | 1,2 |
| RRCF f[,d[,a]] | Rotation droite avec la retenue | 1 | 0011 00da ffff ffff | C,Z,N | |
| RRNCF f[,d[,a]] | Rotation droite avec la retenue | 1 | 0100 00da ffff ffff | Z,N | 1,2 |
| SETF f[,a] | positionne f à 0xFF (tout le monde à 1) | 1 | 0110 100a ffff ffff | | |
| SUBFWB f[,d[,a]] | soustrait f de W | 1 | 0101 01da ffff ffff | C,DC,N,OV,Z | 1,2 |
| SUBWF f[,d[,a]] | soustrait W de f | 1 | 0101 11da ffff ffff | C,DC,N,OV,Z | 1,2 |
| SUBWFB f[,d[,a]] | soustrait W de f avec retenue | 1 | 0101 10da ffff ffff | C,DC,N,OV,Z | |
| SWAPW f[,d[,a]] | inverser les quartets dans f | 1 | 0011 10da ffff ffff | | 4 |
| TSTFSZ f[,a] | teste f saute si 0 | 1 | 0110 011a ffff ffff | | 1,2 |
| XORWF f[,d[,a]] | Ou exclusif de f | 1 | 0001 010da ffff ffff | Z | |

## Opérations orientées bits sur les registres

Opérations orientées bits sur les registres :
| Mnémonique Opérande | Description | Cycles | 16 bits Opcode | notes |
| BCF f,b[,a] | mise à 0 du bit b dans f | 1 | 1001 bbba ffff ffff | 1,2 |
| BSF f,b[,a] | mise à 1 du bit b dans f | 1 | 1000 bbba ffff ffff | 1,2 |
| BTFSC f,b[,a] | test du bit b 0 de f saute si 0 | 1,(2) | 1011 bbba ffff ffff | 3,4 |
| BTFSS f,b[,a] | test du bit b 0 de f saute si 1 | 1,(2) | 1010 bbba ffff ffff | 3,4 |
| BTG f,b[,a] | inverser le bit du registre | 1 | 0111 bbba ffff ffff | 1,2 |

## Opérations de contrôles

Opérations de contrôles :
| Mnémonique Opérande | Description | Cycles | 16 bits Opcode | status affected | notes |
| BC n | saut relatif court si retenue est positionnée | 1,(2) | 1110 0010 nnnn nnnn | | |
| BN n | brancher si résultat négatif | 1,(2) | 1110 0110 nnnn nnnn | | |
| BNC n | brancher si retenue non positionnée | 1,(2) | 1110 0011 nnnn nnnn | | |
| BNN n | brancher si résultat non négatif | 1,(2) | 1110 0111 nnnn nnnn | | |
| BNOV n | brancher si pas dépassement (overflow) | 1,(2) | 1110 0101 nnnn nnnn | | |
| BOV n | brancher si dépassement (overflow) | 1,(2) | 1110 0100 nnnn nnnn | | |
| BNZ n | brancher si résultat non nul | 1,(2) | 1110 0001 nnnn nnnn | | |
| BZ n | brancher si résultat nul | 1,(2) | 1110 0000 nnnn nnnn | | |
| BRA n | brancher toujours | 1,(2) | 1101 0nnn nnnn nnnn | | |
| CALL n [,s] | appel du sous programme n (sur 20 bits) (s fast bit) | 2 | 1110 110s kkkk kkkk 1111 kkkk kkkk kkkk | | |
| CLRWDT - | mise à 0 du timer watchdog | 1 | 0000 0000 0000 0100 | /TO,/PD | |
| DAW | ajustement décimal dans W | 1 | 0000 0000 0000 0111 | | |
| GOTO n | aller à l'adresse n (sur 20 bits) | 2 | 1110 1111 kkkk kkkk 1111 kkkk kkkk kkkk | | |
| NOP - | pas d'opération | 1 | 0000 0000 0000 0000 | | |
| NOP - | pas d'opération | 1 | 1111 xxxx xxxx xxxx | | 4 |
| POP | dépile le sommet de la pile dans PC | 1 | 0000 0000 0000 0110 | | |
| PUSH | empile PC sur le sommet de la pile | 1 | 0000 0000 0000 0101 | | |
| RCALL n | appel en relatif | 2 | 1101 1nnn nnnn nnnn | | |
| RESET | reset en programmation | 1 | 0000 0000 1111 1111 | | |
| RETFIE s | Retour d'interruption | 2 | 0000 0000 0001 000s | | |
| RETLW k | retour avec le littéral dans W | 2 | 000 1100 kkkk kkkk | | |
| RETURN s | retour de sous-programme | 2 | 0000 0000 0001 001s | | |
| SLEEP | aller au mode standby | 1 | 0000 0000 0000 0011 | /TO,/PD | |

## Opérations littérales (adressage immédiat)

Opérations littérales (adressage immédiat) :
| Mnémonique Opérande | Description | Cycles | 16 bits Opcode | status affected |
| ADDLW k | Addition de W et k | 1 | 0000 1111 kkkk kkkk | N,OV,C,DC,Z |
| ANDLW k | Et logique de W et k | 1 | 0000 1011 kkkk kkkk | N,Z |
| IORLW k | OU inclusif logique de W et k | | 0000 1001 kkkk kkkk | N,Z |
| LFSR f,k | chargement de l'adresse 12 bits dans FSR (ff numéro de registre FSR concerné) | 2 | 1110 1110 00ff kkkk 1111 kkkk kkkk kkkk | |
| MOVLB k | copier la valeur dans BSR | 1 | 0000 0001 0000 kkkk | |
| MOVLW k | chargement du littéral dans W | 1 | 0000 1110 kkkk kkkk | |
| MULLW k | multiplication du littéral par W | 1 | 0000 1101 kkkk kkkk | |
| RETLW k | retour avec littéral dans W | 2 | 0000 1100 kkkk kkkk | |
| SUBLW k | soustraction de W du littéral | 1 | 0000 1000 kkkk kkkk | N,OV,C,DC,Z |
| XORLW k | ou exclusif du littéral avec W | 1 | 0000 1010 kkkk kkkk | N,Z |

## Opérations de programmation de la mémoire

Opérations de programmation de la mémoire :
| Mnémonique Opérande | Description | Cycles | 16 bits Opcode |
| TBLRD* | lecture octet Flash pointé par TBLPTR et le copie dans TABLAT | 2 | 0000 0000 0000 1000 |
| TBLRD*+ | ... avec post increment | 2 | 0000 0000 0000 1001 |
| TBLRD*- | ... avec post decrement | 2 | 0000 0000 0000 1010 |
| TBLRD+* | ... avec pre increment | 2 | 0000 0000 0000 1011 |
| TBLWT* | écriture octet Flash pointé par TBLPTR avec ce qu’il y a dans TABLAT | 2 | 0000 0000 0000 1100 |
| TBLWT*+ | ... avec post increment | 2 | 0000 0000 0000 1101 |
| TBLWT*- | ... avec post decrement | 2 | 0000 0000 0000 1110 |
| TBLWT+* | ... avec pre increment | 2 | 0000 0000 0000 1111 |