Serwis Edukacyjny
w I-LO w Tarnowie
obrazek

Materiały dla uczniów liceum

  Wyjście       Spis treści       Wstecz  

obrazek

Autor artykułu: mgr Jerzy Wałaszek
Konsultacje: Wojciech Grodowski, mgr inż. Janusz Wałaszek

©2023 mgr Jerzy Wałaszek
I LO w Tarnowie

obrazek

Instrukcje maszynowe PIC

Rodzina zaawansowana
(ang. high-end PIC family)

obrazek

Educational and Non-Profit Use of Copyrighted Material:

If you use Microchip copyrighted material solely for educational (non-profit) purposes falling under the “fair use” exception of the U.S. Copyright Act of 1976 then you do not need Microchip’s written permission. For example, Microchip’s permission is not required when using copyrighted material in: (1) an academic report, thesis, or dissertation; (2) classroom handouts or textbook; or (3) a presentation or article that is solely educational in nature (e.g., technical article published in a magazine).

https://www.microchip.com/about-us/legal-information/copyright-usage-guidelines

SPIS TREŚCI
Podrozdziały

obrazek

Wprowadzenie

Rodzina zaawansowana (ang. high-end family) mikrokontrolerów PIC obejmuje układy PIC18 w obudowach 18...80-końcówkowych, które są kompatybilne z rodziną PIC16 co do wyprowadzeń. Rodzina PIC18 zawiera wszystkie popularne układy peryferyjne, takie jak moduły MSSP, ESCI, CCP, elastyczne 8- i 16-bitowe timery, PSP, 10-bitowy przetwornik A/C, POR i CAN 2.0B Active. Większość mikrokontrolerów PIC18 udostępnia pamięć FLASH na program o wielkości 8...128 KB oraz pamięć danych RAM od 256 B do 4 KB; mikrokontrolery te pracują pod napięciem od 2,0 do 5,5V przy prędkości od statycznej DC do 40 MHz. Są one zoptymalizowane dla języków wysokiego poziomu takich jak ANSI C, rodzina PIC18 oferuje wysoko elastyczne rozwiązanie dla złożonych aplikacji.

Podstawowe własności rodziny PIC18

Wysoko wydajny procesor RISC

Cechy modułów cyfrowych:

Cechy modułów analogowych:

Specjalne funkcje mikrokontrolera:

Technologia CMOS:

Funkcje zarządzania zasilaniem:

Rodzina mikrokontrolerów PIC18

Model Pamięć programu Pamięć danych Porty
we/wy
Przetwornik
A/C
10 bitów
MSPP USART Inne CPP/
PWM
Timery
8/16-bitowe
Obudowy Końcówki
Typ Rozmiar RAM EEPROM
PIC18F1220 FLASH 4K 256B 256 B 16 7 1 6x PMM 1 1/3 DIP, SOIC, SSOP, QFN 18
PIC18F1320 FLASH 8K 256B 256B 16 7 1 6x PMM 1 1/3 DIP, SOIC, SSOP, QFN 18
PIC18F2220 FLASH 4K 512B 256B 23 10 I2C/SPI 1 6x PMM 2 1/3 DIP, SOIC 28
PIC18F2320 FLASH 8K 512B 256B 23 10 I2C/SPI 1 6x PMM 2 1/3 DIP, SOIC 28
PIC18C242 OTP 16K 512B 23 5 I2C/SPI 1 2 1/3 DIP, SOIC 28
PIC18C252 OTP 32K 1536 23 5 I2C/SPI 1 2 1/3 DIP, SOIC 28
PIC18F242 FLASH 16K 512B 256B 23 5 I2C/SPI 1 2 1/3 DIP, SOIC, SSOP 28
PIC18F252 FLASH 32K 1536B 256B 23 5 I2C/SPI 1 2 1/3 DIP, SOIC, SSOP 28
PIC18F258 FLASH 32K 1536B 256B 22 5 I2C/SPI 1 CAN 2.0B 1 1/3 DIP, SOIC 28
PIC18F4220 FLASH 4K 512B 256B 34 13 I2C/SPI 1 6xPMM 2 1/3 DIP, TQFP, QFN 40/44
PIC18F4320 FLASH 8K 512B 256B 34 13 I2C/SPI 1 6x PMM 2 1/3 DIP, TQFP, QFN 40/44
PIC18C442 OTP 16K 512B 34 8 I2C/SPI 1 2 1/3 DIP, PLCC, TQFP 40/44
PIC18C452 OTP 32K 1536B 34 8 I2C/SPI 1 2 1/3 DIP, PLCC, TQFP 40/44
PIC18F442 FLASH 16K 512B 256B 34 8 I2C/SPI 1 2 1/3 DIP, PLCC, TQFP 40/44
PIC18F452 FLASH 32K 1536B 256B 34 8 I2C/SPI 1 2 1/3 DIP, PLCC, TQFP 40/44
PIC18F458 FLASH 32K 1536B 256B 33 5 I2C/SPI 1 CAN 2.0B 1 1/3 DIP, PLCC, TQFP 40/44
PIC18C601 bez ROM 1536B 31 8 I2C/SPI 1 2 1/3 PLCC, TQFP 64/68
PIC18C658 OTP 32K 1536B 52 12 I2C/SPI 1 CAN 2.0B 2 1/3 PLCC, TQFP 64/68
PIC18F6520 FLASH 32K 2048B 1024B 52 12 I2C/SPI 2 5 2/3 TQFP 64
PIC18F6620 FLASH 64K 3840B 1024B 52 12 I2C/SPI 2 5 2/3 TQFP 64
PIC18F6720 FLASH 128K 3840B 1024B 52 12 I2C/SPI 2 5 2/3 TQFP 64
PIC18C801 bez ROM 1536B 42 12 I2C/SPI 1 2 1/3 PLCC, TQFP 80/84
PIC18C858 OTP 32K 1536B 68 16 I2C/SPI 1 CAN 2.0B 2 1/3 PLCC, TQFP 80/84
PIC18F8520 FLASH 32K 2048B 1024B 68 16 I2C/SPI 2 EMA 5 2/3 TQFP 80
PIC18F8620 FLASH 64K 3840B 1024B 68 16 I2C/SPI 2 EMA 5 2/3 TQFP 80
PIC18F8720 FLASH 128K 3840B 1024B 68 16 I2C/SPI 2 EMA 5 2/3 TQFP 80
Na początek:  podrozdziału   strony 

Budowa instrukcji PIC

Mikrokontroler PIC18 posiada 77 instrukcji głównie 16-bitowych (tylko 4 z nich są 32-bitowe). Z tego powodu pamięć programu zorganizowana jest w słowa 16 bitowe, jednakże dostęp do niej możliwy jest również bajtowo. Organizacja pamięci programu i danych w PIC18 jest następująca:

Z powyższego rysunku wynika, iż magistrala adresowa pamięci programu ma szerokość 21 bitów, co pozwala zaadresować 221 bajtów, czyli 2MB. Ponieważ prawie wszystkie instrukcje mikrokontrolera PIC18 mają długość 16 bitów, to w celu zapewnienia ich pobrania w jednym takcie zegarowym magistrala instrukcji ma szerokość 16 bitów.

W przypadku pamięci danych magistrala adresowa ma szerokość 12 bitów, co umożliwia zaadresowanie 212 = 4096 komórek, zwanych tutaj rejestrami. Magistrala danych jest 8-bitowa, zatem mikrokontroler PIC18 jest układem 8-bitowym.

Komórki pamięci danych nazywane są rejestrami, rejestrami pliku (ang. file registers), lub rejestrami ogólnego przeznaczenia (ang. General Purpose Registers, GPR). W obszarze pliku rejestrów umieszczone są również rejestry o specjalnych funkcjach (ang. Special Function Registers, SFR). Rejestry te umożliwiają mikrokontrolerowi sterowanie modułami peryferyjnymi. Z powodu ograniczeń nałożonych na rozmiar instrukcji, adresy rejestrów są zwykle 8-bitowe, co umożliwia zaadresowanie 256 rejestrów (00h...FFh). Aby zatem zaadresować całą pamięć RAM, została ona podzielona na 16 banków, po 256 rejestrów w każdym. Wybór banku dokonywany jest przy pomocy rejestru BSR (ang. Bank Select Register). Jest to rejestr 4 bitowy i może on przechowywać numery banków od 0h do Fh. Wszystkie rejestry funkcji specjalnych SFR są obecne na końcu obszaru pamięci w banku 15, co umożliwia równoległy dostęp również do rejestrów ogólnych GPR. Poniższy rysunek przedstawia typową organizację obszaru pamięci danych w PIC18:

Bank dostępowy (ang. Access Bank)  jest zawsze dostępny dla procesora i zawiera 128 rejestrów GPR z samego początku pamięci oraz 128 rejestrów SFR z końca pamięci danych.

Więcej informacji na ten temat znajdziesz w instrukcjach konkretnych mikrokontrolerów PIC.

Instrukcje PIC18 dzielą się na pięć głównych typów:

Operacje bajtowe

15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
kod operacji d a 8-bitowy adres rejestru

Instrukcja ma długość 16 bitów, z których 8 bitów przeznaczone jest na adres argumentu w pamięci danych, jeden bit określający bank pamięci oraz jeden bit określający miejsce docelowe wyniku operacji. Pozostałe sześć bitów określa rodzaj operacji do wykonania.

d = 0: wynik będzie umieszczony w rejestrze roboczym WREG (akumulator)
d = 1: wynik zostanie umieszczony w rejestrze w pamięci danych
a = 0: będzie wymuszony bank dostępowy (ang. access bank)
a = 1: do wyboru banku zostanie użyty rejestr BSR (ang. Bank Select Register)

Operacje na dwóch bajtach

Tylko jedna instrukcja wykorzystuje ten format (MOVFF f1, f2). Instrukcja ma długość 32 bitów, w których zawarte są dwa pełne 12 bitowe adresy rejestrów w pamięci danych oraz 4-bitowy kod operacji:

15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
kod op. 12-bitowy adres rejestru źródłowego
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
1 1 1 1 12-bitowy adres rejestru docelowego

Operacje bitowe na rejestrach

Instrukcja używa 8 bitów na adres rejestru, jeden bit do określenia używanego banku, 3 bity do określenia numeru bitu, którego dotyczy operacja oraz pozostałych 4 bitów na kod operacji.

15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
kod op. b a 8-bitowy adres rejestru

b = 0...7: numer bitu w rejestrze
a = 0: będzie wymuszony bank dostępowy (ang. access bank)
a = 1: do wyboru banku zostanie użyty rejestr BSR (ang. Bank Select Register)

Operacje ze stałymi

W tych instrukcjach argument określony jest bezpośrednio jako stała 8-bitowa.

15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
kod operacji 8-bitowa stała

Operacje sterujące

W tej grupie znajdują się instrukcje skoków oraz pozostałe instrukcje, których nie da się zaliczyć do powyższych grup.

Instrukcja GOTO

15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
kod operacji 20-bitowa stała adresu
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
1 1 1 1 20-bitowa stała adresu

Instrukcja CALL

15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
kod operacji S 20-bitowa stała adresu
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16
1 1 1 1 20-bitowa stała adresu

S = 1: zostają zapamiętane w rejestrach pomocniczych rejestry: WREG, STATUS i BSR, co pozwala przywrócić ich zawartość przy powrocie z podprogramu.
S = 0: żadne rejestry nie są zapamiętywane.

Instrukcja bezwarunkowego skoku względnego

15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
kod operacji 11-bitowa stała ze znakiem

Instrukcja warunkowego skoku względnego

15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
kod operacji 8-bitowa stała ze znakiem

Pozostałe operacje sterujące

15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
kod operacji

Lista rozkazów PIC18

Mikrokontroler PIC18 posiada 77 instrukcji, z których 4 jest 32-bitowe, a wszystkie pozostałe są 16-bitowe. W poniższej tabelce umieszczone są wszystkie instrukcje maszynowe PIC18.

Mnemonik arg Opis Cykle
roz.
16-bitowe słowo instrukcji Znaczniki Uwagi
Operacje bajtowe na rejestrach
ADDWF f,d,a Dodanie WREG do f 1 0010 01da ffff ffff C, DC, Z, OV, N 1, 2
ADDWFC f,d,a Dodanie WREG i C do f 1 0010 00da ffff ffff C, DC, Z, OV, N 1, 2
ANDWF f,d,a Koniunkcja WREG z f 1 0001 01da ffff ffff Z, N 1, 2
CLRF f,a Zerowanie f 1 0110 101a ffff ffff Z 2
COMF f,d,a Zanegowanie f 1 0001 11da ffff ffff Z, N 1, 2
CPFSEQ f,a Porównanie f z WREG, pominięcie przy = 1 (2 lub 3) 0110 001a ffff ffff Żaden 4
CPFSGT f,a Porównanie f z WREG, pominięcie przy > 1 (2 lub 3) 0110 010a ffff ffff Żaden 4
CPFSLT f,a Porównanie f z WREG, pominięcie przy < 1 (2 lub 3) 0110 000a ffff ffff Żaden 1, 2
DECF f,d,a Zmniejszenie f o 1 1 0000 01da ffff ffff C, DC, Z, OV, N 1, 2, 3, 4
DECFSZ f,d,a Zmniejszenie f o 1, pominięcie przy zerze 1 (2 lub 3) 0010 11da ffff ffff Żaden 1, 2, 3, 4
DECSNZ f,d,a Zmniejszenie f o 1, pominięcie przy nie zerze 1 (2 lub 3) 0100 11da ffff ffff Żaden 1, 2
INCF f,d,a Zwiększenie f o 1 1 0010 10da ffff ffff C, DC, Z, OV, N 1, 2, 3, 4
INCFSZ f,d,a Zwiększenie f o 1, pominięcie przy 0 1 (2 lub 3) 0011 11da ffff ffff Żaden 4
INFSNZ f,d,a Zwiększenie f o 1, pominięcie przy ≠ 0 1 (2 lub 3) 0100 10da ffff ffff Żaden 1, 2
IORWF f,d,a Alternatywa WREG z f 1 0001 00da ffff ffff Z, N 1, 2
MOVF f,d,a Skopiowanie f 1 0101 00da ffff ffff Z, N 1
MOVFF fs,fd Skopiowanie fs do fd Słowo 1 (fs) 2 1100 ffff ffff ffff Żaden  
Słowo 2 (fd) 1111 ffff ffff ffff
MOVWF f,a Skopiowanie WREG do f 1 0110 111a ffff ffff Żaden  
MULWF f,a Mnożenie WREG przez f 1 0000 001a ffff ffff Żaden  
NEGF f,a Negacja f 1 0110 110a ffff ffff C, DC, Z, OV, N 1, 2
RLCF f,d,a Obrót w lewo f poprzez przeniesienie C 1 0011 01da ffff ffff C, Z, N  
RLNCF f,d,a Obrót w lewo f bez przeniesienia C 1 0100 01da ffff ffff Z, N 1, 2
RRCF f,d,a Obrót w prawo f poprzez przeniesienie C 1 0011 00da ffff ffff C, Z, N  
RRNCF f,d,a Obrót w prawo f bez przeniesienia C 1 0100 00da ffff ffff Z, N  
SETF f,a Ustawienie f na FFh 1 0110 100a ffff ffff Żaden  
SUBFWB f,d,a Odjęcie f od WREG z pożyczką 1 0101 01da ffff ffff C, DC, Z, OV, N 1, 2
SUBWF f,d,a Odjęcie WREG od f 1 0101 11da ffff ffff C, DC, Z, OV, N  
SUBWFB f,d,a Odjęcie WREG od f z pożyczką 1 0101 10da ffff ffff C, DC, Z, OV, N 1, 2
SWAPF f,d,a Zamiana miejscami połówek f 1 0011 10da ffff ffff Żaden 4
TSTFSZ f,a Testowanie f, pominięcie przy zerze 1 (2 lub 3) 0110 011a ffff ffff Żaden 1, 2
XORWF f,d,a Różnica symetryczna WREG z f 1 0001 10da ffff ffff Z, N  
Operacje bitowe na rejestrach
BCF f,b,a Zerowanie bitu b w f 1 1001 bbba ffff ffff Żaden 1, 2
BSF f,b,a Ustawianie bitu b w f 1 1000 bbba ffff ffff Żaden 1, 2
BTFSC f,b,a Testowanie bitu b w f, pominięcie przy 0 1 (2 lub 3) 1011 bbba ffff ffff Żaden 3, 4
BTFSS f,b,a Testowanie bitu b w f, pominięcie przy 1 1 (2 lub 3) 1010 bbba ffff ffff Żaden 3, 4
BTG f,b,a Zmiana bitu b w f na przeciwny 1 0111 bbba ffff ffff Żaden 1, 2
Operacje sterujące
BC n Odgałęzienie przy przeniesieniu 1 (2) 1110 0010 nnnn nnnn Żaden  
BN n Odgałęzienie przy minusie 1 (2) 1110 0110 nnnn nnnn Żaden  
BNC n Odgałęzienie przy braku przeniesienia 1 (2) 1110 0011 nnnn nnnn Żaden  
BNN n Odgałęzienie przy nieujemnym 1 (2) 1110 0111 nnnn nnnn Żaden  
BNOV n Odgałęzienie przy braku nadmiaru 1 (2) 1110 0101 nnnn nnnn Żaden  
BNZ n Odgałęzienie przy braku zera 2 1110 0001 nnnn nnnn Żaden  
BOV n Odgałęzienie przy nadmiarze 1 (2) 1110 0100 nnnn nnnn Żaden  
BRA n Odgałęzienie bezwarunkowe 1 (2) 1101 0nnn nnnn nnnn Żaden  
BZ n Odgałęzienie przy zerze 1 (2) 1110 0000 nnnn nnnn Żaden  
CALL k, s Wywołanie podprogramu Słowo 1 2 1110 110s kkkk kkkk Żaden  
Słowo 2 1111 kkkk kkkk kkkk
CLRWDT Zerowanie licznika zegarowego 1 0000 0000 0000 0100 TO, PD  
DAW Poprawka dziesiętna WREG 1 0000 0000 0000 0111 C  
GOTO k Skok do adresu k Słowo 1 2 1110 1111 kkkk kkkk Żaden  
Słowo 2 1111 kkkk kkkk kkkk
NOP Operacja pusta 1 0000 0000 0000 0000 Żaden  
NOP Operacja pusta 1 1111 xxxx xxxx xxxx Żaden  
POP Usunięcie ze szczytu stosu (TOS) 1 0000 0000 0000 0110 Żaden  
PUSH Przesłanie PC+2 na szczyt stosu (TOS) 1 0000 0000 0000 0101 Żaden  
RCALL n Względne wywołanie podprogramu 2 1101 1nnn nnnn nnnn Żaden  
RESET   Reset programowy 1 0000 0000 1111 1111 Wszystkie  
RETFIE s Powrót z przerwania z włączeniem przerwań 2 0000 0000 0001 000s GIE/GIEH, PEIE/GIEL  
RETLW k Powrót z podprogramu z k w WREG 2 0000 1100 kkkk kkkk Żaden  
RETURN s Powrót z podprogramu 2 0000 0000 0001 001s Żaden  
SLEEP Wejście w tryb uśpienia 1 0000 0000 0000 0011 TO, PD  
Operacje ze stałymi
ADDLW k Dodanie stałej k i WREG 1 0000 1111 kkkk kkkk C, DC, Z, OV, N  
ANDLW k Koniunkcja stałej k i WREG 1 0000 1011 kkkk kkkk Z, N  
IORLW k Alternatywa stałej k i WREG 1 0000 1001 kkkk kkkk Z, N  
LFSR f,k Przesłanie stałej k do FSRf Słowo 1 2 1110 1110 00ff kkkk Żaden  
Słowo 2 1111 0000 kkkk kkkk
MOVLB k Przesłanie stałej k do BSR[3:0] 1 0000 0001 kkkk kkkk Żaden  
MOVLW k Przesłanie stałej k do WREG 1 0000 0111 kkkk kkkk Żaden  
MULLW k Iloczyn stałej k z WREG 1 0000 1101 kkkk kkkk Żaden  
RETLW k Powrót z podprogramu ze stałą k w WREG 2 0000 1100 kkkk kkkk Żaden  
SUBLW k Odjęcie WREG od stałej k 1 0000 1000 kkkk kkkk C, DC, Z, OV, N  
XORLW k Różnica symetryczna stałej k i WREG 1 0000 1010 kkkk kkkk Z, N  
Operacje pomiędzy pamięcią danych a pamięcią programu
TBLRD * Odczyt tablicy 2 0000 0000 0000 1000 Żaden  
TBLRD *+ Odczyt tablicy z postinkrementacją 2 0000 0000 0000 1001 Żaden  
TBLRD *- Odczyt tablicy z postdekrementacją 2 0000 0000 0000 1010 Żaden  
TBLRD +* Odczyt tablicy z preinkrementacją 2 0000 0000 0000 1011 Żaden  
TBLWT * Zapis tablicy 2 0000 0000 0000 1100 Żaden 5
TBLWT *+ Zapis tablicy z postinkrementacją 2 0000 0000 0000 1101 Żaden 5
TBLWT *- Zapis tablicy z postdekrementacją 2 0000 0000 0000 1110 Żaden 5
TBLWT +* Zapis tablicy z preinkrementacją 2 0000 0000 0000 1111 Żaden 5
Uwagi: 1. Gdy rejestr portu zostaje zmodyfikowany jako jako funkcja jego samego (np. MOVF PORTB, 1, 0), to użyta wartość będzie wartością odczytaną z samych końcówek. Na przykład jeśli zatrzask danych ma wartość 1 dla końcówki skonfigurowanej jako wejście i zostanie wysterowana stanem 0 przez zewnętrzne urządzenie, to dane zostaną zapisane z powrotem z wartością 0.
  2. Jeśli ta instrukcja zostanie wykonana na rejestrze TMR0 (i gdzie można użyć d = 1), to preskaler zostanie również wyzerowany, jeśli został przydzielony.
  3. Jeśli jest modyfikowany licznik programu (ang. Program Counter, PC) lub test warunkowy jest prawdziwy, to ta instrukcja wymaga dwóch cykli, w drugim cyklu jest wykonywana instrukcja pusta NOP.
  4. Niektóre instrukcje mają długość dwóch słów. Drugie słowo tych instrukcji będzie wykonane jako NOP, o ile instrukcja z pierwszego słowa nie pobierze informacji osadzonej w tych 16 bitach. Zapewnia to, iż każda komórka programu zawiera poprawną instrukcję.
  5. Jeśli zapis tablicy rozpocznie cykl zapisu do pamięci wewnętrznej, to zapis ten będzie wykonywany aż do zakończenia.
Na początek:  podrozdziału   strony 

Opis instrukcji

Opis używanych symboli

Symbol Opis
a Bit dostępu do pamięci RAM:
a = 0: rejestr w banku dostępowym RAM (rejestr wyboru banku BSR jest ignorowany)
a = 1: rejestr w banku RAM określanym przez rejestr BSR.
bbb Adrees bitu w 8-bitowym rejestrze pliku (0...7).
BSR Rejestr wyboru banku RAM (ang. Bank Select Register), używany do wyboru bieżącego banku w RAM.
d Bit wyboru rejestru docelowego operacji (ang. Destination select bit):
d = 0: wynik trafi do rejestru roboczego WREG
d = 1: wynik trafi do rejestru pliku f.
dest Miejsce docelowe jest albo rejestrem WREG, albo określonym rejestrem pliku w pamięci RAM.
f Adres 8-bitowego rejestru pliku w RAM (0x00...0xFF).
fs 12-bitowy adres rejestru źródłowego w RAM (0x000...0xFFF).
fd 12-bitowy adres rejestru docelowego w RAM (0x000...0xFFF).
k Pole stałej (może być wartością 8-bitową, 12-bitową lub 20-bitową).
mm Tryb pracy rejestru wskaźnika TBLPTR używany przy operacjach odczytu lub zapisu do pamięci:
*  Wskaźnik pozostaje niezmieniony
*+ Po operacji wskaźnik jest zwiększany o 1 i wskazuje następną komórkę (postinkrementacja)
*- Po operacji wskaźnik jest zmniejszany o 1 i wskazuje poprzednią komórkę (postdekrementacja)
+
* Przed operacją wskaźnik jest zwiększany o 1 i operacja zostanie wykonana na następnej komórce (preinkrementacja)
n Adres względny (liczba całkowita ze znakiem w kodzie U2) używany w instrukcjach skoków względnych lub adres bezpośredni dla instrukcji CALL/ BRA i RETURN.
PRODH Górny bajt wyniku mnożenia.
PRODL Dolny bajt wyniku mnożenia.
s Bit wyboru trybu szybkiego w instrukcjach CALL/RETURN:
s = 0; bez zapamiętywania/odtwarzania rejestrów roboczych (WREG, STATUS i BSR) z rejestrów pomocniczych
s = 1: z zapamiętaniem/odtwarzaniem rejestrów roboczych (ang. Fast mode – tryb szybki).
u Bit nieużywany lub niezmieniany.
WREG Rejestr roboczy (akumulator) (ang. Working register).
x Wartość nieistotna (0 lub 1).
Asembler generuje w takim przypadku kod z ustawieniem x = 0. Jest to zalecana forma użycia dla zachowania kompatybilności ze wszystkimi programami narzędziowymi firmy Microchip.
TBLPTR 21-bitowy wskaźnik tablicy (ang. Table Pointer) ( wskazuje komórkę w pamięci programu).
TABLAT 8-bitowy rejestr zatrzaskowy tablicy (ang. Table Latch).
TOS Szczyt stosu (ang Top of Stack).
PC Licznik programu (ang. Program Counter).
PCL Dolny bajt licznika programu.
PCH Górny bajt licznika programu.
PCLATH Zatrzask górnego bajtu licznika programu.
PCLATU Zatrzask najwyższego bajtu licznika programu.
GIE Bit globalnego uaktywniania obsługi przerwań (ang. Global Interrupt Enable bit).
WDT Timer licznika zegarowego (ang. Watchdog Timer).
TO Bit przekroczenia czasu (ang. Time-out bit). Aktywny w stanie 0.
PD Bit wyłączenia zasilania (ang. Power-Down bit). Aktywny w stanie 0.
C Znacznik przeniesienia (ang. Carry).
DC Znacznik przeniesienia z drugiej cyfry (z bitu 4 na 5) używany w poprawkach dziesiętnych liczb BCD (ang. Digit Carry).
Z Znacznik zera.
OV Znacznik nadmiaru (ang. Overflow).
N Znacznik liczby ujemnej (ang. Negative). Jest to kopia bitu nr 7 wyniku operacji.
{ } Argument opcjonalny. Przy pominięciu zostaje przyjęta wartość domyślna.
[ ] Pole bitowe rejestru:
r[4:2] – bity 4,3,2.
Przesłanie.

Operacje w czasie taktów

Każdy cykl rozkazowy (Tcy) złożony jest z czterech taktów Q (Q1-Q4). Takt Q jest taki sam jak takt oscylatora mikrokontrolera (TOSC). Takty Q wyznaczają w każdym cyklu rozkazowym okresy dekodowania, odczytu, przetwarzania danych, zapisu, itp. Poniższy wykres pokazuje związek taktów Q z cyklem rozkazowym.

Kolejny rysunek wyjaśnia ideę nakładkowania:

Wszystkie instrukcje są wykonywane w pojedynczym cyklu rozkazowym z wyjątkiem instrukcji rozgałęzień w programie, które wykonują się w dwóch cyklach, ponieważ pobrana instrukcja zostaje usunięta z kolejki nakładkowania, a w tym jest pobierana instrukcja spod nowego adresu, a później jest wykonywana.

Ogólnie cztery takty Q w cyklu rozkazowym można podzielić na:

Q1: Takt dekodowania instrukcji lub wymuszona operacja pusta
Q2: Takt odczytu danych lub operacja pusta
Q3: Przetwarzanie danych
Q4: Takt zapisu danych lub operacja pusta

W opisie każdej instrukcji pokazano szczegóły operacji w taktach Q.


ADDLW (ang. Add Literal and WREG – Dodanie stałej k i WREG)

Składnia: ADDLW k

Argumenty: k = 0...255

Operacja: WREG ← WREG + k

Modyfikowane znaczniki stanu: N, OV, C, DC, Z

Kod: 0000 1111 kkkk kkkk

Opis: Zawartość akumulatora WREG zostaje dodana do 8-bitowej stałej k. Wynik jest umieszczany w akumulatorze WREG.

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:

Q1 Q2 Q3 Q4
Dekodowanie Odczyt
stałej k
Przetwarzanie
danych
Zapis do
rejestru WREG

Przykład:

ADDLW 0x15

Przed wykonaniem instrukcji:
  WREG = 0x10
Po wykonaniu instrukcji:
  WREG = 0x25


ADDWF (ang. Add WREG and f – Dodanie WREG i f)

Składnia: ADDWF f{,d{,a}}

Argumenty: f = 0...255, d = 0...1, a = 0...1

Operacja: dest ← WREG + f

Modyfikowane znaczniki stanu: N, OV, C, DC, Z

Kod: 0010 01da ffff ffff

Opis: Dodanie zawartości rejestru roboczego WREG (akumulatora) i rejestru f. Jeśli d = 0, to wynik zostanie umieszczony w akumulatorze WREG. Jeśli d = 1 (domyślnie), to wynik zostanie z powrotem umieszczony w rejestrze f.  Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis do
rejestru dest

Przykład:

ADDWF REG, W

Przed wykonaniem instrukcji:
  WREG = 0x17
  REG = 0xC2
Po wykonaniu instrukcji:
  WREG = 0xD9
  REG = 0xC2


ADDWFC (ang. Add WREG and Carry bit to f – Dodanie WREG z bitem przeniesienia do f)

Składnia: ADDWFC f{,d{,a}}

Argumenty: f = 0...255, d = 0...1, a = 0...1

Operacja: dest ← WREG + f + C

Modyfikowane znaczniki stanu: N, OV, C, DC, Z

Kod: 0010 00da ffff ffff

Opis: Dodanie zawartości rejestru roboczego WREG (akumulatora), znacznika przeniesienia C i rejestru f z pamięci RAM. Jeśli d = 0, to wynik zostanie umieszczony w akumulatorze WREG. Jeśli d = 1 (domyślnie), to wynik zostanie z powrotem umieszczony w rejestrze f.  Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis do
rejestru dest

Przykład:

ADDWFC REG, W

Przed operacją
  bit C = 1
  WREG = 0x4D
  REG = 0x02
Po wykonaniu instrukcji:
  bit C = 0
  WREG = 0x50
  REG = 0x02


ANDLW (ang. AND Literal and WREG – Koniunkcja stałej k i WREG)

Składnia: ANDLW k

Argumenty: k = 0...255

Operacja: WREG ← WREG & k

Modyfikowane znaczniki stanu: N, Z

Kod: 0000 1011 kkkk kkkk

Opis: Zawartość akumulatora WREG zostaje poddana operacji koniunkcji (iloczynu logicznego) z 8-bitową stałą k. Wynik jest umieszczany w akumulatorze WREG.

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:

Q1 Q2 Q3 Q4
Dekodowanie Odczyt
stałej k
Przetwarzanie
danych
Zapis do
rejestru WREG

Przykład:

ANDLW 0x5F

Przed wykonaniem instrukcji:
  WREG = 0xA3
Po wykonaniu instrukcji:
  WREG = 0x03


ANDWF (ang. AND WREG with f – Koniunkcja WREG z f)

Składnia: ANDWFC f{,d{,a}}

Argumenty: f = 0...255, d = 0...1, a = 0...1

Operacja: dest ← WREG & f

Modyfikowane znaczniki stanu: N, Z

Kod: 0001 01da ffff ffff

Opis: Koniunkcja zawartości rejestru roboczego WREG (akumulatora) i rejestru f z pamięci RAM. Jeśli d = 0, to wynik zostanie umieszczony w akumulatorze WREG. Jeśli d = 1 (domyślnie), to wynik zostanie z powrotem umieszczony w rejestrze f.  Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis do
rejestru dest

Przykład:

ANDWFC REG, W

Przed operacją
  WREG = 0x17
  REG = 0xC2
Po wykonaniu instrukcji:
  WREG = 0x02
  REG = 0xC2


BC (ang. Branch if Carry – Skok względny przy przeniesieniu)

Składnia: BC n

Argumenty: n = -128...127

Operacja:

Jeśli C = 1, to PC ← PC + 2 + 2n

Modyfikowane znaczniki stanu: żaden

Kod: 1110 0010 nnnn nnnn

Opis: Jeśli bit przeniesienia C (ang. Carry bit) jest ustawiony na 1, to zostanie wykonany skok względny w programie. Do adresu następnej instrukcji w rejestrze licznika programu PC zostaje dodane podwojone przesunięcie 2n traktowane jako liczba całkowita ze znakiem w kodzie U2. W efekcie mikroprocesor PIC rozpocznie wykonywanie instrukcji spod nowego adresu w programie PC + 2 + 2n. W takim przypadku instrukcja BC staje się dwucyklowa w celu usunięcia z kolejki pobranej wcześniej kolejnej instrukcji i pobranie instrukcji spod nowego adresu.

Jeśli bit przeniesienia C jest wyzerowany, to skok nie będzie wykonany i mikroprocesor PIC rozpocznie wykonywanie następnej instrukcji w programie. W tym przypadku instrukcja BC jest wykonywana w jednym cyklu rozkazowym.

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1/2

Operacje w taktach zegarowych przy skoku:
Pierwszy cykl
rozkazowy
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
stałej n
Przetwarzanie
danych
Zapis
do PC
Drugi cykl
rozkazowy
Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Operacje w taktach zegarowych przy braku skoku:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
stałej n
Przetwarzanie
danych
Brak
działania

Przykład:

HERE BC JUMP

Przed operacją
  PC = adres (HERE)
Po wykonaniu instrukcji:
  Jeśli C = 1;
    PC = adres (JUMP)
  Jeśli C = 0;
    PC = adres (HERE + 2)


BCF (ang. Bit Clear f – Zerowanie bitu w f)

Składnia: BCF f,b{,a}

Argumenty: f = 0...255, b = 0...7, a = 0...1

Operacja: f[b] ← 0

Modyfikowane znaczniki stanu: żaden

Kod: 1001 bbba ffff ffff

Opis: Bit b rejestru f zostaje wyzerowany. Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis do
rejestru f

Przykład:

BCF FLAG_REG, 7

Przed wykonaniem instrukcji:
  FLAG_REG = 0xC7
Po wykonaniu instrukcji:
  FLAG_REG = 0x47


BN (ang. Branch if Negative – Skok względny przy minusie)

Składnia: BN n

Argumenty: n = -128...127

Operacja:

Jeśli N = 1, to PC ← PC + 2 + 2n

Modyfikowane znaczniki stanu: żaden

Kod: 1110 0110 nnnn nnnn

Opis: Jeśli bit znaku N (ang. Negative bit) jest ustawiony na 1, to zostanie wykonany skok względny w programie. Do adresu następnej instrukcji w rejestrze licznika programu PC zostaje dodane podwojone przesunięcie 2n traktowane jako liczba całkowita ze znakiem w kodzie U2. W efekcie mikroprocesor PIC rozpocznie wykonywanie instrukcji spod nowego adresu w programie PC + 2 + 2n. W takim przypadku instrukcja BN staje się dwucyklowa w celu usunięcia z kolejki pobranej wcześniej kolejnej instrukcji i pobranie instrukcji spod nowego adresu.

Jeśli bit minusa N jest wyzerowany, to skok nie będzie wykonany i mikroprocesor PIC rozpocznie wykonywanie następnej instrukcji w programie. W tym przypadku instrukcja BN jest wykonywana w jednym cyklu.

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1/2

Operacje w taktach zegarowych przy skoku:
Pierwszy cykl
rozkazowy
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
stałej n
Przetwarzanie
danych
Zapis
do PC
Drugi cykl
rozkazowy
Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Operacje w taktach zegarowych przy braku skoku:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
stałej n
Przetwarzanie
danych
Brak
działania

Przykład:

HERE BN JUMP

Przed operacją
  PC = adres (HERE)
Po wykonaniu instrukcji:
  Jeśli N = 1:
    PC = adres (JUMP)
  Jeśli N = 0:
    PC = adres (HERE + 2)


BNC (ang. Branch if Not Carry – Skok względny przy braku przeniesienia)

Składnia: BNC n

Argumenty: n = -128...127

Operacja:

Jeśli C = 0, to PC ← PC + 2 + 2n

Modyfikowane znaczniki stanu: żaden

Kod: 1110 0011 nnnn nnnn

Opis: Jeśli bit przeniesienia C (ang. Carry bit) jest wyzerowany, to zostanie wykonany skok względny w programie. Do adresu następnej instrukcji w rejestrze licznika programu PC zostaje dodane podwojone przesunięcie 2n traktowane jako liczba całkowita ze znakiem w kodzie U2. W efekcie mikroprocesor PIC rozpocznie wykonywanie instrukcji spod nowego adresu w programie PC + 2 + 2n. W takim przypadku instrukcja BNC staje się dwucyklowa w celu usunięcia z kolejki pobranej wcześniej kolejnej instrukcji i pobranie instrukcji spod nowego adresu.

Jeśli bit przeniesienia C jest ustawiony na 1, to skok nie będzie wykonany i mikroprocesor PIC rozpocznie wykonywanie następnej instrukcji w programie. W tym przypadku instrukcja BNC jest wykonywana w jednym cyklu rozkazowym.

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1/2

Operacje w taktach zegarowych przy skoku:
Pierwszy cykl
rozkazowy
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
stałej n
Przetwarzanie
danych
Zapis
do PC
Drugi cykl
rozkazowy
Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Operacje w taktach zegarowych przy braku skoku:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
stałej n
Przetwarzanie
danych
Brak
działania

Przykład:

HERE BNC JUMP

Przed operacją
  PC = adres (HERE)
Po wykonaniu instrukcji:
  Jeśli C = 0;
    PC = adres (JUMP)
  Jeśli C = 1;
    PC = adres (HERE + 2)


BNN (ang. Branch if Not Negative – Skok względny przy plusie)

Składnia: BNN n

Argumenty: n = -128...127

Operacja:

Jeśli N = 0, to PC ← PC + 2 + 2n

Modyfikowane znaczniki stanu: żaden

Kod: 1110 0111 nnnn nnnn

Opis: Jeśli bit znaku ujemnego N (ang. Negative bit) jest wyzerowany, to zostanie wykonany skok względny w programie. Do adresu następnej instrukcji w rejestrze licznika programu PC zostaje dodane podwojone przesunięcie 2n traktowane jako liczba całkowita ze znakiem w kodzie U2. W efekcie mikroprocesor PIC rozpocznie wykonywanie instrukcji spod nowego adresu w programie PC + 2 + 2n. W takim przypadku instrukcja BNN staje się dwucyklowa w celu usunięcia z kolejki pobranej wcześniej kolejnej instrukcji i pobranie instrukcji spod nowego adresu.

Jeśli bit N jest ustawiony na 1, to skok nie będzie wykonany i mikroprocesor PIC rozpocznie wykonywanie następnej instrukcji w programie. W tym przypadku instrukcja BNN jest wykonywana w jednym cyklu.

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1/2

Operacje w taktach zegarowych przy skoku:
Pierwszy cykl
rozkazowy
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
stałej n
Przetwarzanie
danych
Zapis
do PC
Drugi cykl
rozkazowy
Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Operacje w taktach zegarowych przy braku skoku:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
stałej n
Przetwarzanie
danych
Brak
działania

Przykład:

HERE BNN JUMP

Przed operacją
  PC = adres (HERE)
Po wykonaniu instrukcji:
  Jeśli N = 0;
    PC = adres (JUMP)
  Jeśli N = 1;
    PC = adres (HERE + 2)


BNOV (ang. Branch if Not Overflow – Skok względny przy braku nadmiaru)

Składnia: BNOV n

Argumenty: n = -128...127

Operacja:

Jeśli OV = 0, to PC ← PC + 2 + 2n

Modyfikowane znaczniki stanu: żaden

Kod: 1110 0101 nnnn nnnn

Opis: Jeśli bit nadmiaru OV (ang. Overflow bit) jest wyzerowany, to zostanie wykonany skok względny w programie. Do adresu następnej instrukcji w rejestrze licznika programu PC zostaje dodane podwojone przesunięcie 2n traktowane jako liczba całkowita ze znakiem w kodzie U2. W efekcie mikroprocesor PIC rozpocznie wykonywanie instrukcji spod nowego adresu w programie PC + 2 + 2n. W takim przypadku instrukcja BNOV staje się dwucyklowa w celu usunięcia z kolejki pobranej wcześniej kolejnej instrukcji i pobranie instrukcji spod nowego adresu.

Jeśli bit OV jest ustawiony na 1, to skok nie będzie wykonany i mikroprocesor PIC rozpocznie wykonywanie następnej instrukcji w programie. W tym przypadku instrukcja BNOV jest wykonywana w jednym cyklu.

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1/2

Operacje w taktach zegarowych przy skoku:
Pierwszy cykl
rozkazowy
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
stałej n
Przetwarzanie
danych
Zapis
do PC
Drugi cykl
rozkazowy
Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Operacje w taktach zegarowych przy braku skoku:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
stałej n
Przetwarzanie
danych
Brak
działania

Przykład:

HERE BNOV JUMP

Przed operacją
  PC = adres (HERE)
Po wykonaniu instrukcji:
  Jeśli OV = 0;
    PC = adres (JUMP)
  Jeśli OV = 1;
    PC = adres (HERE + 2)


BNZ (ang. Branch if Not Zero – Skok względny przy braku zera)

Składnia: BNZ n

Argumenty: n = -128...127

Operacja:

Jeśli Z = 0, to PC ← PC + 2 + 2n

Modyfikowane znaczniki stanu: żaden

Kod: 1110 0001 nnnn nnnn

Opis: Jeśli bit zera Z (ang. Zero bit) jest wyzerowany, to zostanie wykonany skok względny w programie. Do adresu następnej instrukcji w rejestrze licznika programu PC zostaje dodane podwojone przesunięcie 2n traktowane jako liczba całkowita ze znakiem w kodzie U2. W efekcie mikroprocesor PIC rozpocznie wykonywanie instrukcji spod nowego adresu w programie PC + 2 + 2n. W takim przypadku instrukcja BNZ staje się dwucyklowa w celu usunięcia z kolejki pobranej wcześniej kolejnej instrukcji i pobranie instrukcji spod nowego adresu.

Jeśli bit Z jest ustawiony na 1, to skok nie będzie wykonany i mikroprocesor PIC rozpocznie wykonywanie następnej instrukcji w programie. W tym przypadku instrukcja BNZ jest wykonywana w jednym cyklu.

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1/2

Operacje w taktach zegarowych przy skoku:
Pierwszy cykl
rozkazowy
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
stałej n
Przetwarzanie
danych
Zapis
do PC
Drugi cykl
rozkazowy
Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Operacje w taktach zegarowych przy braku skoku:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
stałej n
Przetwarzanie
danych
Brak
działania

Przykład:

HERE BNZ JUMP

Przed operacją
  PC = adres (HERE)
Po wykonaniu instrukcji:
  Jeśli Z = 0;
    PC = adres (JUMP)
  Jeśli Z = 1;
    PC = adres (HERE + 2)


BOV (ang. Branch if Overflow – Skok względny przy nadmiarze)

Składnia: BOV n

Argumenty: n = -128...127

Operacja:

Jeśli OV = 1, to PC ← PC + 2 + 2n

Modyfikowane znaczniki stanu: żaden

Kod: 1110 0100 nnnn nnnn

Opis: Jeśli bit nadmiaru OV (ang. Overflow bit) jest ustawiony na 1, to zostanie wykonany skok względny w programie. Do adresu następnej instrukcji w rejestrze licznika programu PC zostaje dodane podwojone przesunięcie 2n traktowane jako liczba całkowita ze znakiem w kodzie U2. W efekcie mikroprocesor PIC rozpocznie wykonywanie instrukcji spod nowego adresu w programie PC + 2 + 2n. W takim przypadku instrukcja BOV staje się dwucyklowa w celu usunięcia z kolejki pobranej wcześniej kolejnej instrukcji i pobranie instrukcji spod nowego adresu.

Jeśli bit OV jest wyzerowany, to skok nie będzie wykonany i mikroprocesor PIC rozpocznie wykonywanie następnej instrukcji w programie. W tym przypadku instrukcja BOV jest wykonywana w jednym cyklu.

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1/2

Operacje w taktach zegarowych przy skoku:
Pierwszy cykl
rozkazowy
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
stałej n
Przetwarzanie
danych
Zapis
do PC
Drugi cykl
rozkazowy
Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Operacje w taktach zegarowych przy braku skoku:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
stałej n
Przetwarzanie
danych
Brak
działania

Przykład:

HERE BOV JUMP

Przed operacją
  PC = adres (HERE)
Po wykonaniu instrukcji:
  Jeśli OV = 1;
    PC = adres (JUMP)
  Jeśli OV = 0;
    PC = adres (HERE + 2)


BRA (ang. Unconditional Branch – Bezwarunkowy skok względny)

Składnia: BRA n

Argumenty: n = -1024...1023

Operacja: PC ← PC + 2 + 2n

Modyfikowane znaczniki stanu: żaden

Kod: 1101 0nnn nnnn nnnn

Opis: Wykonywany jest skok względny w programie. Do adresu następnej instrukcji w rejestrze licznika programu PC zostaje dodane podwojone przesunięcie 2n traktowane jako liczba całkowita ze znakiem w kodzie U2. W efekcie mikroprocesor PIC rozpocznie wykonywanie instrukcji spod nowego adresu w programie PC + 2 + 2n. Instrukcja BRA wykonywana jest w dwóch cyklach.

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 2

Operacje w taktach zegarowych:
Pierwszy cykl
rozkazowy
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
stałej n
Przetwarzanie
danych
Zapis
do PC
Drugi cykl
rozkazowy
Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Przykład:

HERE BRA JUMP

Przed operacją
  PC = adres (HERE)
Po wykonaniu instrukcji:
  PC = adres (JUMP)


BSF (ang. Bit Set f – Ustawienie bitu w f)

Składnia: BSF f,b{,a}

Argumenty: f = 0...255, b = 0...7, a = 0...1

Operacja: f[b] ← 1

Modyfikowane znaczniki stanu: żaden

Kod: 1000 bbba ffff ffff

Opis: Bit b rejestru f zostaje ustawiony na 1. Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis do
rejestru f

Przykład:

BSF FLAG_REG, 7

Przed wykonaniem instrukcji:
  FLAG_REG = 0x0A
Po wykonaniu instrukcji:
  FLAG_REG = 0x8A


BTFSC (ang. Bit Test f, Skip if Clear – Testowanie bitu w f, pominięcie przy wyzerowanym)

Składnia: BTFSC f,b{,a}

Argumenty: f = 0...255, b = 0...7, a = 0...1

Operacja: Pominięcie następnej instrukcji, jeśli f[b] = 0

Modyfikowane znaczniki stanu: żaden

Kod: 1011 bbba ffff ffff

Opis: Jeśli bit b w rejestrze f ma stan 0, to zostaje pominięta następna instrukcja. Jeśli bit ten ma stan 0, to następna instrukcja pobrana w czasie wykonywania instrukcji bieżącej (nakładkowanie) zostaje usunięta z kolejki i zamiast niej mikroprocesor wykonuje instrukcję pustą NOP, co powoduje, iż instrukcja BTFSC wykonuje się w tym przypadku przez 2 cykle rozkazowe. Jeśli pomijana instrukcja jest instrukcją 32-bitową (2 słowa w pamięci programu), to mikroprocesor wykonuje 2 instrukcje puste NOP. Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1/2/3

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Brak
działania

Przy pominięciu instrukcji 16-bitowej (drugi cykl rozkazowy):

Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Przy pominięciu instrukcji 32-bitowej (drugi i trzeci cykl rozkazowy):

Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania
Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Przykład:
HERE BTFSC FLAG, 1
FALSE :  
TRUE :  

Przed wykonaniem instrukcji:
  PC = adres (HERE)
Po wykonaniu instrukcji:
  Jeśli FLAG[1] = 0;
    PC = adres (TRUE)
Jeśli FLAG[1] = 1;
    PC = adres (FALSE)


BTFSS (ang. Bit Test f, Skip if Set – Testowanie bitu w f, pominięcie przy ustawionym na 1)

Składnia: BTFSS f,b{,a}

Argumenty: f = 0...255, b = 0...7, a = 0...1

Operacja: Pominięcie następnej instrukcji, jeśli f[b] = 1

Modyfikowane znaczniki stanu: żaden

Kod: 1010 bbba ffff ffff

Opis: Jeśli bit b w rejestrze f ma stan 1, to zostaje pominięta następna instrukcja. Jeśli bit ten ma stan 1, to następna instrukcja pobrana w czasie wykonywania instrukcji bieżącej (nakładkowanie) zostaje usunięta z kolejki i zamiast niej mikroprocesor wykonuje instrukcję pustą NOP, co powoduje, iż instrukcja BTFSC wykonuje się w tym przypadku przez 2 cykle rozkazowe. Jeśli pomijana instrukcja jest instrukcją 32-bitową (2 słowa w pamięci programu), to mikroprocesor wykonuje 2 instrukcje puste NOP. Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1/2/3

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Brak
działania

Przy pominięciu instrukcji 16-bitowej (drugi cykl rozkazowy):

Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Przy pominięciu instrukcji 32-bitowej (drugi i trzeci cykl rozkazowy):

Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania
Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Przykład:
HERE BTFSS FLAG, 1
FALSE :  
TRUE :  

Przed wykonaniem instrukcji:
  PC = adres (HERE)
Po wykonaniu instrukcji:
  Jeśli FLAG[1] = 0;
    PC = adres (FALSE)
Jeśli FLAG[1] = 1;
    PC = adres (TRUE)


BTG (ang. Bit Toggle f – Zmiana bitu w f na przeciwny)

Składnia: BTG f,b{,a}

Argumenty: f = 0...255, b = 0...7, a = 0...1

Operacja: f[b] ← f[b]

Modyfikowane znaczniki stanu: żaden

Kod: 0111 bbba ffff ffff

Opis: Bit b rejestru f zostaje ustawiony na stan przeciwny (0 → 1;1 → 0). Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis do
rejestru f

Przykład:

BSF FLAG_REG, 7

Przed wykonaniem instrukcji:
  FLAG_REG = 0x0A
Po wykonaniu instrukcji:
  FLAG_REG = 0x8A


BZ (ang. Branch if Zero – Skok względny przy zerze)

Składnia: BZ n

Argumenty: n = -128...127

Operacja:

Jeśli Z = 1, to PC ← PC + 2 + 2n

Modyfikowane znaczniki stanu: żaden

Kod: 1110 0000 nnnn nnnn

Opis: Jeśli bit zera Z (ang. Zero bit) jest ustawiony na 1, to zostanie wykonany skok względny w programie. Do adresu następnej instrukcji w rejestrze licznika programu PC zostaje dodane podwojone przesunięcie 2n traktowane jako liczba całkowita ze znakiem w kodzie U2. W efekcie mikroprocesor PIC rozpocznie wykonywanie instrukcji spod nowego adresu w programie PC + 2 + 2n. W takim przypadku instrukcja BZ staje się dwucyklowa w celu usunięcia z kolejki pobranej wcześniej kolejnej instrukcji i pobranie instrukcji spod nowego adresu.

Jeśli bit Z jest wyzerowany, to skok nie będzie wykonany i mikroprocesor PIC rozpocznie wykonywanie następnej instrukcji w programie. W tym przypadku instrukcja BZ jest wykonywana w jednym cyklu.

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1/2

Operacje w taktach zegarowych przy skoku:
Pierwszy cykl
rozkazowy
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
stałej n
Przetwarzanie
danych
Zapis
do PC
Drugi cykl
rozkazowy
Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Operacje w taktach zegarowych przy braku skoku:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
stałej n
Przetwarzanie
danych
Brak
działania

Przykład:

HERE BZ JUMP

Przed operacją
  PC = adres (HERE)
Po wykonaniu instrukcji:
  Jeśli Z = 1;
    PC = adres (JUMP)
  Jeśli Z = 0;
    PC = adres (HERE + 2)


CALL (ang. Call Subroutine – Wywołanie podprogramu)

Składnia: CALL k{,s}

Argumenty: k = 0...1048575, s = 0...1

Operacja:

TOS ← PC + 4
PC[20:1] ← k
Jeśli s = 1, to:
WS ← WREG
STATUSS ← STATUS
BSRS ← BSR

Modyfikowane znaczniki stanu: żaden

Kod:

Pierwsze słowo: 1110 110s k7kkk kkkk0
Drugie słowo: 1111 k19kkk kkkk kkkk8

Opis: Wywołanie podprogramu w całej 2MB przestrzeni adresowej pamięci programu. Najpierw adres powrotny (PC + 4) zostaje umieszczony na szczycie stosu. Jeśli bit s = 1, to rejestry WREG, STATUS i BSR zostają zapamiętane odpowiednio w rejestrach pomocniczych WS, STATUSS i BSRS. Jeśli bit s = 0, to rejestry te nie są zachowywane (domyślnie). Następnie 20-bitowa wartość adresu k jest ładowana do rejestru PC[20:1]. Instrukcja CALL wykonywana jest w dwóch cyklach rozkazowych.

Liczba słów instrukcji: 2

Liczba cykli rozkazowych: 2

Operacje w taktach zegarowych:
Pierwszy cykl
rozkazowy
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
stałej k[7:0]
Przesłanie PC
na stos
Odczyt
stałej k[19:8]
Zapis do PC
Drugi cykl
rozkazowy
Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Przykład:

HERE CALL THERE,FAST

Przed wykonaniem instrukcji:
  PC = adres (HERE)
Po wykonaniu instrukcji:
  PC = adres (THERE)
  TOS = adres (HERE + 4)
  WS = WREG
  BSRS = BSR
  STATUSS= STATUS


CLRF (ang. Clear f – Zerowanie f)

Składnia: CLRF f{,a}

Argumenty: f = 0...255, a = 0...1

Operacja:

f ← 00h
Z ← 1

Modyfikowane znaczniki stanu: Z

Kod: 0110 101a ffff ffff

Opis: Zawartość rejestru f jest zerowana a znacznik zera Z jest ustawiany. Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis do
rejestru f

Przykład:

CLRF FLAG_REG

Przed wykonaniem instrukcji:
  FLAG_REG = 0x5A
Po wykonaniu instrukcji:
  FLAG_REG = 0x00


CLRWDT (ang. Clear Watchdog Timer – Zerowanie timera licznika zegarowego)

Składnia: CLRWDT

Argumenty: brak

Operacja:

WDT ← 00h
preskaler WDT ← 00h
TO ← 1
PD ← 1

Modyfikowane znaczniki stanu: TO, PD

Kod: 0000 0000 0000 0100

Opis: Instrukcja CLRWDT zeruje timer licznika zegarowego oraz licznik jego preskalera. Ustawiane są bity stanu TO i PD.

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Brak
działania
Przetwarzanie
danych
Zerowanie
licznika WDT

Przykład:

CLRWDT

Przed wykonaniem instrukcji:
  Licznik WDT = ?
Po wykonaniu instrukcji:
  Licznik WDT = 0x00
  Preskaler WDT = 0
  TO = 1
  PD = 1


COMF (ang. Compliment f – Negacja f)

Składnia: COMF f{,d{,a}}

Argumenty: f = 0...255, d = 0...1, a = 0...1

Operacja: dest ← f

Modyfikowane znaczniki stanu: N, Z

Kod: 0001 11da ffff ffff

Opis: Wszystkie bity rejestru f zostają zanegowane i wynik jest umieszczany w rejestrze docelowym dest. Jeśli d jest równe 0, to wynik negacji zostanie umieszczony w akumulatorze W. Jeśli d jest równe 1, to wynik zostanie z powrotem umieszczony w rejestrze f. Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis do
rejestru dest

Przykład:

COMF REG, W

Przed wykonaniem instrukcji:
  REG = 0x13
Po wykonaniu instrukcji:
  REG = 0x13
  WREG = 0xEC


CPFSEQ (ang. Compare f with WREG, Skip if f = WREG – Porównanie f z WREG, pominięcie przy f = WREG)

Składnia: CPFSEQ f{,a}

Argumenty: f = 0...255, a = 0...1

Operacja:

f - WREG
Pominięcie przy f = WREQ (porównanie bez znaku)

Modyfikowane znaczniki stanu: żaden

Kod: 0110 001a ffff ffff

Opis: Porównanie zawartości rejestru f w pamięci danych z zawartością WREG przez wykonanie odejmowania bez znaku. Jeśli f = WREG, to następna instrukcja pobrana w czasie wykonywania instrukcji bieżącej (nakładkowanie) zostaje usunięta z kolejki i zamiast niej mikroprocesor wykonuje instrukcję pustą NOP, co powoduje, iż instrukcja CPFSEQ wykonuje się w tym przypadku przez 2 cykle rozkazowe. Jeśli pomijana instrukcja jest instrukcją 32-bitową (2 słowa w pamięci programu), to mikroprocesor wykonuje 2 instrukcje puste NOP. Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1/2/3

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Brak
działania

Przy pominięciu instrukcji 16-bitowej (drugi cykl rozkazowy):

Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Przy pominięciu instrukcji 32-bitowej (drugi i trzeci cykl rozkazowy):

Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania
Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Przykład:
HERE CPFSEQ REG
NEQUAL :  
EQUAL :  

Przed wykonaniem instrukcji:
  PC = adres (HERE)
  WREG = ?
  REG = ?
Po wykonaniu instrukcji:
  Jeśli WREG = REG;
     PC = adres (EQUAL)
  Jeśli WREG ≠ REG;
     PC = adres (NEQUAL)


CPFSGT (ang. Compare f with WREG, Skip if f > WREG – Porównanie f z WREG, pominięcie przy f > WREG)

Składnia: CPFSGT f{,a}

Argumenty: f = 0...255, a = 0...1

Operacja:

f - WREG
Pominięcie przy f > WREQ (porównanie bez znaku)

Modyfikowane znaczniki stanu: żaden

Kod: 0110 010a ffff ffff

Opis: Porównanie zawartości rejestru f w pamięci danych z zawartością WREG przez wykonanie odejmowania bez znaku. Jeśli f > WREG, to następna instrukcja pobrana w czasie wykonywania instrukcji bieżącej (nakładkowanie) zostaje usunięta z kolejki i zamiast niej mikroprocesor wykonuje instrukcję pustą NOP, co powoduje, iż instrukcja CPFSGT wykonuje się w tym przypadku przez 2 cykle rozkazowe. Jeśli pomijana instrukcja jest instrukcją 32-bitową (2 słowa w pamięci programu), to mikroprocesor wykonuje 2 instrukcje puste NOP. Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1/2/3

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Brak
działania

Przy pominięciu instrukcji 16-bitowej (drugi cykl rozkazowy):

Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Przy pominięciu instrukcji 32-bitowej (drugi i trzeci cykl rozkazowy):

Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania
Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Przykład:
HERE CPFSGT REG
NGREATER :  
GREATER :  

Przed wykonaniem instrukcji:
  PC = adres (HERE)
  WREG = ?
  REG = ?
Po wykonaniu instrukcji:
  Jeśli REG > WREG;
     PC = adres (GREATER)
  Jeśli REG ≤ WREG;
     PC = adres (NGREATER)


CPFSLT (ang. Compare f with WREG, Skip if f < WREG – Porównanie f z WREG, pominięcie przy f < WREG)

Składnia: CPFSLT f{,a}

Argumenty: f = 0...255, a = 0...1

Operacja:

f - WREG
Pominięcie przy f < WREQ (porównanie bez znaku)

Modyfikowane znaczniki stanu: żaden

Kod: 0110 000a ffff ffff

Opis: Porównanie zawartości rejestru f w pamięci danych z zawartością WREG przez wykonanie odejmowania bez znaku. Jeśli f < WREG, to następna instrukcja pobrana w czasie wykonywania instrukcji bieżącej (nakładkowanie) zostaje usunięta z kolejki i zamiast niej mikroprocesor wykonuje instrukcję pustą NOP, co powoduje, iż instrukcja CPFSLT wykonuje się w tym przypadku przez 2 cykle rozkazowe. Jeśli pomijana instrukcja jest instrukcją 32-bitową (2 słowa w pamięci programu), to mikroprocesor wykonuje 2 instrukcje puste NOP. Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1/2/3

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Brak
działania

Przy pominięciu instrukcji 16-bitowej (drugi cykl rozkazowy):

Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Przy pominięciu instrukcji 32-bitowej (drugi i trzeci cykl rozkazowy):

Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania
Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Przykład:
HERE CPFSLT REG
NLESS :  
LESS :  

Przed wykonaniem instrukcji:
  PC = adres (HERE)
  WREG = ?
  REG = ?
Po wykonaniu instrukcji:
  Jeśli REG < WREG;
     PC = adres (LESS)
  Jeśli REG ≥ WREG;
     PC = adres (NLESS)


DAW (ang. Decimal Adjust WREG – Poprawka dziesiętna rejestru WREG)

Składnia: DAW

Argumenty: brak

Operacja:

Jeśli WREG[3:0] > 9 lub DC = 1, to
  WREG[3:0] ← WREG[3:0] + 6
inaczej
  WREG[3:0] ← WREG[3:0] (bez zmian)

Jeśli WREG<7:4> > 9 lub C = 1, to
  WREG[7:4] ← WREG[7:4] + 6
inaczej
  WREG[7:4] ← WREG[7:4] (bez zmian)

Modyfikowane znaczniki stanu: C

Kod: 0000 0000 0000 0111

Opis: Instrukcja DAW dokonuje poprawki dziesiętnej wartości 8-bitowej w rejestrze WREG, która powstała z poprzedniego dodawania dwóch liczb w spakowanym formacie BCD (po dwie cyfry BCD na bajt). Poprawka tworzy poprawny wynik w spakowanym formacie BCD w rejestrze WREG.

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru WREG
Przetwarzanie
danych
Zapis do
rejestru WREG

Przykład 1:

DAW

Przed wykonaniem instrukcji:
  WREG = 0xA5
  C = 0
  DC = 0
Po wykonaniu instrukcji:
  WREG = 0x05
  C = 1
  DC = 0

Przykład 2:

DAW

Przed wykonaniem instrukcji:
  WREG = 0xCE
  C = 0
  DC = 0
Po wykonaniu instrukcji:
  WREG = 0x34
  C = 1
  DC = 0


DECF (ang. Decrement f – Dekrementacja f)

Składnia: DECF f{,d{,a}}

Argumenty: f = 0...255, d = 0...1, a = 0...1

Operacja: dest ← f - 1

Modyfikowane znaczniki stanu: C, DC, N, OV, Z

Kod: 0000 01da ffff ffff

Opis: Zawartość rejestru f zostaje zmniejszona o 1. Jeśli d = 0, to wynik zostanie umieszczony w akumulatorze WREG. Jeśli d = 1 (domyślnie), to wynik zostanie z powrotem umieszczony w rejestrze f.  Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis do
rejestru dest

Przykład:

DECF CNT

Przed operacją
  CNT = 0x01
  Z = 0
Po wykonaniu instrukcji:
  CNT = 0x00
  Z = 1


DECFSZ (ang. Decrenment f, Skip if Zero – Dekrementacja f, pominięcie przy zerze)

Składnia: DECFSZ f{,d{,a}}

Argumenty: f = 0...255, d = 0...1, a = 0...1

Operacja:

dest ← f - 1
Pominięcie przy wyniku = 0

Modyfikowane znaczniki stanu: żaden

Kod: 0010 11da ffff ffff

Opis: Zawartość rejestru f zostaje zmniejszona o 1. Jeśli d = 0, to wynik jest wpisywany do rejestru akumulatora WREG. Jeśli d = 1, to wynik trafia z powrotem do rejestru f (domyślnie). Jeśli wynik = 0, to następna instrukcja pobrana w czasie wykonywania instrukcji bieżącej (nakładkowanie) zostaje usunięta z kolejki i zamiast niej mikroprocesor wykonuje instrukcję pustą NOP, co powoduje, iż instrukcja DECFSZ wykonuje się w tym przypadku przez 2 cykle rozkazowe. Jeśli pomijana instrukcja jest instrukcją 32-bitową (2 słowa w pamięci programu), to mikroprocesor wykonuje 2 instrukcje puste NOP. Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1/2/3

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis wyniku
do dest

Przy pominięciu instrukcji 16-bitowej (drugi cykl rozkazowy):

Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Przy pominięciu instrukcji 32-bitowej (drugi i trzeci cykl rozkazowy):

Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania
Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Przykład:
HERE DECFSZ CNT
  GOTO LOOP
CONTINUE :  

Przed wykonaniem instrukcji:
  CNT = ?
  PC = adres (HERE)
Po wykonaniu instrukcji:
  CNT = CNT - 1
  Jeśli CNT = 0;
     PC = adres (CONTINUE)
  Jeśli CNT ≠ 0;
     PC = adres (HERE + 2)


DECFSNZ (ang. Decrenment f, Skip if Not Zero – Dekrementacja f, pominięcie przy nie zerze)

Składnia: DECFSNZ f{,d{,a}}

Argumenty: f = 0...255, d = 0...1, a = 0...1

Operacja:

dest ← f - 1
Pominięcie przy wyniku ≠ 0

Modyfikowane znaczniki stanu: żaden

Kod: 0100 11da ffff ffff

Opis: Zawartość rejestru f zostaje zmniejszona o 1. Jeśli d = 0, to wynik jest wpisywany do rejestru akumulatora WREG. Jeśli d = 1, to wynik trafia z powrotem do rejestru f (domyślnie). Jeśli wynik ≠ 0, to następna instrukcja pobrana w czasie wykonywania instrukcji bieżącej (nakładkowanie) zostaje usunięta z kolejki i zamiast niej mikroprocesor wykonuje instrukcję pustą NOP, co powoduje, iż instrukcja DECFSNZ wykonuje się w tym przypadku przez 2 cykle rozkazowe. Jeśli pomijana instrukcja jest instrukcją 32-bitową (2 słowa w pamięci programu), to mikroprocesor wykonuje 2 instrukcje puste NOP. Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1/2/3

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis wyniku
do dest

Przy pominięciu instrukcji 16-bitowej (drugi cykl rozkazowy):

Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Przy pominięciu instrukcji 32-bitowej (drugi i trzeci cykl rozkazowy):

Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania
Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Przykład:
HERE DECFSNZ TEMP
ZERO :  
NZERO :  

Przed wykonaniem instrukcji:
  TEMP = ?
  PC = adres (HERE)
Po wykonaniu instrukcji:
  TEMP = TEMP - 1
  Jeśli TEMP = 0;
     PC = adres (ZERO)
  Jeśli TEMP ≠ 0;
     PC = adres (NZERO)


GOTO (ang. Unconditional Jump – Skok bezwarunkowy)

Składnia: GOTO k

Argumenty: k = 0...1048575

Operacja: PC[20:1] ← k

Modyfikowane znaczniki stanu: żaden

Kod:

Pierwsze słowo: 1110 1111 k7kkk kkkk0
Drugie słowo: 1111 k19kkk kkkk kkkk8

Opis: Wykonanie skoku bezwarunkowego pod adres k w całej 2MB przestrzeni adresowej pamięci programu. 20-bitowa wartość adresu k jest ładowana do rejestru PC[20:1]. Instrukcja GOTO wykonywana jest zawsze w dwóch cyklach rozkazowych.

Liczba słów instrukcji: 2

Liczba cykli rozkazowych: 2

Operacje w taktach zegarowych:
Pierwszy cykl
rozkazowy
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
stałej k[7:0]
Przesłanie PC
na stos
Odczyt
stałej k[19:8]
Zapis do PC
Drugi cykl
rozkazowy
Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Przykład:

GOTO THERE

Po wykonaniu instrukcji:
  PC = adres (THERE)


INCF (ang. Increment f – Inkrementacja f)

Składnia: INCF f{,d{,a}}

Argumenty: f = 0...255, d = 0...1, a = 0...1

Operacja: dest ← f + 1

Modyfikowane znaczniki stanu: C, DC, N, OV, Z

Kod: 0010 10da ffff ffff

Opis: Zawartość rejestru f zostaje zwiększona o 1. Jeśli d = 0, to wynik zostanie umieszczony w akumulatorze WREG. Jeśli d = 1 (domyślnie), to wynik zostanie z powrotem umieszczony w rejestrze f.  Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis do
rejestru dest

Przykład:

INCF CNT

Przed operacją
  CNT = 0xFF
  Z = 0
  C = ?
  DC = ?
Po wykonaniu instrukcji:
  CNT = 0x00
  Z = 1
  C = 1
  DC = 1


INCFSZ (ang. Increnment f, Skip if Zero – Inkrementacja f, pominięcie przy zerze)

Składnia: INCFSZ f{,d{,a}}

Argumenty: f = 0...255, d = 0...1, a = 0...1

Operacja:

dest ← f + 1
Pominięcie przy wyniku = 0

Modyfikowane znaczniki stanu: żaden

Kod: 0011 11da ffff ffff

Opis: Zawartość rejestru f zostaje zwiększona o 1. Jeśli d = 0, to wynik jest wpisywany do rejestru akumulatora WREG. Jeśli d = 1, to wynik trafia z powrotem do rejestru f (domyślnie). Jeśli wynik = 0, to następna instrukcja pobrana w czasie wykonywania instrukcji bieżącej (nakładkowanie) zostaje usunięta z kolejki i zamiast niej mikroprocesor wykonuje instrukcję pustą NOP, co powoduje, iż instrukcja INCFSZ wykonuje się w tym przypadku przez 2 cykle rozkazowe. Jeśli pomijana instrukcja jest instrukcją 32-bitową (2 słowa w pamięci programu), to mikroprocesor wykonuje 2 instrukcje puste NOP. Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1/2/3

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis wyniku
do dest

Przy pominięciu instrukcji 16-bitowej (drugi cykl rozkazowy):

Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Przy pominięciu instrukcji 32-bitowej (drugi i trzeci cykl rozkazowy):

Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania
Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Przykład:
HERE INCFSZ CNT
NZERO :  
ZERO :  

Przed wykonaniem instrukcji:
  CNT = ?
  PC = adres (HERE)
Po wykonaniu instrukcji:
  CNT = CNT + 1
  Jeśli CNT = 0;
     PC = adres (ZERO)
  Jeśli CNT ≠ 0;
     PC = adres (NZERO)


INFSNZ (ang. Increnment f, Skip if Not Zero – Inkrementacja f, pominięcie przy nie zerze)

Składnia: INFSNZ f{,d{,a}}

Argumenty: f = 0...255, d = 0...1, a = 0...1

Operacja:

dest ← f + 1
Pominięcie przy wyniku ≠ 0

Modyfikowane znaczniki stanu: żaden

Kod: 0100 10da ffff ffff

Opis: Zawartość rejestru f zostaje zmniejszona o 1. Jeśli d = 0, to wynik jest wpisywany do rejestru akumulatora WREG. Jeśli d = 1, to wynik trafia z powrotem do rejestru f (domyślnie). Jeśli wynik ≠ 0, to następna instrukcja pobrana w czasie wykonywania instrukcji bieżącej (nakładkowanie) zostaje usunięta z kolejki i zamiast niej mikroprocesor wykonuje instrukcję pustą NOP, co powoduje, iż instrukcja INFSNZ wykonuje się w tym przypadku prze 2 cykle rozkazowe. Jeśli pomijana instrukcja jest instrukcją 32-bitową (2 słowa w pamięci programu), to mikroprocesor wykonuje 2 instrukcje puste NOP. Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1/2/3

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis wyniku
do dest

Przy pominięciu instrukcji 16-bitowej (drugi cykl rozkazowy):

Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Przy pominięciu instrukcji 32-bitowej (drugi i trzeci cykl rozkazowy):

Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania
Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Przykład:
HERE INFSNZ REG
ZERO :  
NZERO :  

Przed wykonaniem instrukcji:
  REG = ?
  PC = adres (HERE)
Po wykonaniu instrukcji:
  REG = REG - 1
  Jeśli REG ≠ 0:
     PC = adres (NZERO)
  Jeśli REG = 0:
     PC = adres (ZERO)


IORLW (ang. Inclusive OR Literal with WREG – Alternatywa stałej k i WREG)

Składnia: IORLW k

Argumenty: k = 0...255

Operacja: WREG ← WREG | k

Modyfikowane znaczniki stanu: N, Z

Kod: 0000 1001 kkkk kkkk

Opis: Zawartość akumulatora WREG zostaje poddana operacji alternatywy logicznej z 8-bitową stałą k. Wynik jest umieszczany w akumulatorze WREG.

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:

Q1 Q2 Q3 Q4
Dekodowanie Odczyt
stałej k
Przetwarzanie
danych
Zapis do
rejestru WREG

Przykład:

IORLW 0x35

Przed wykonaniem instrukcji:
  WREG = 0x9A
Po wykonaniu instrukcji:
  WREG = 0xBF


IORWF (ang. Inclusive OR WREG with f – Alternatywa WREG i f)

Składnia: IORWF f{,d{,a}}

Argumenty: f = 0...255, d = 0...1, a = 0...1

Operacja: dest ← WREG | f

Modyfikowane znaczniki stanu: N, Z

Kod: 0001 00da ffff ffff

Opis: Wykonanie operacji alternatywy logicznej nad rejestrami WREG (akumulator) i f. Jeśli d = 0, to wynik zostanie umieszczony w akumulatorze WREG. Jeśli d = 1 (domyślnie), to wynik zostanie z powrotem umieszczony w rejestrze f.  Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis do
rejestru dest

Przykład:

IORWF RESULT, W

Przed wykonaniem instrukcji:
  WREG = 0x91
  RESULT = 0x13
Po wykonaniu instrukcji:
  WREG = 0x93
  RESULT = 0x13


LFSR (ang. Load FSR – Załadowanie rejestru FSR)

Składnia: LFSR f,k

Argumenty: f = 0...2, k = 0...4095

Operacja: FSRf ← k

Modyfikowane znaczniki stanu: Żaden

Kod:

Pierwsze słowo: 1110 1110 00ff k11kkk
Drugie słowo: 1111 0000 k7kkk kkkk

Opis: 12-bitowa stała k jest ładowana do rejestru wskaźnikowego komórki w pamięci RAM (ang. File Select Register, FSR) o numerze f.

Liczba słów instrukcji: 2

Liczba cykli rozkazowych: 2

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt górnych
bitów stałej k
Przetwarzanie
danych
Zapis tych bitów
do FSR
Q1 Q2 Q3 Q4
Dekodowanie Odczyt dolnych
bitów stałej k
Przetwarzanie
danych
Zapis tych bitów
do FSR

Przykład:

LFSR 2, 0x3AB

Po wykonaniu instrukcji:
  FSR2H = 0x03
  FSR2L = 0xAB


MOVF (ang. Move f – Kopiowanie f)

Składnia: MOVF f{,d{,a}}

Argumenty: f = 0...255, d = 0...1, a = 0...1

Operacja: dest ← f

Modyfikowane znaczniki stanu: N, Z

Kod: 0101 00da ffff ffff

Opis: Zawartość rejestru f zostaje skopiowana (załadowana) do rejestru wynikowego zależnie od stanu bitu d. Jeśli d = 0, to rejestr f zostanie umieszczony w akumulatorze WREG. Jeśli d = 1 (domyślnie), to f zostanie z powrotem umieszczony w rejestrze f.  Jest to przydatne, ponieważ instrukcja ustawia znaczniki N i Z. Rejestr f może znajdować się w dowolnym miejscu banku pamięci RAM. Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis do
rejestru dest

Przykład:

MOVF REG, W

Przed wykonaniem instrukcji:
  WREG = 0xFF
  REG = 0x22
Po wykonaniu instrukcji:
  WREG = 0x22
  REG = 0x22


MOVFF (ang. Move f to f – Przesłanie f do f)

Składnia: MOVFF fs,fd

Argumenty: fs = 0...4095, fd = 0...4095

Operacja: fd ← fs

Modyfikowane znaczniki stanu: Żaden

Kod:

Pierwsze słowo (źródło): 1100 ffff ffff ffffs
Drugie słowo (przeznaczenie): 1111 ffff ffff ffffd

Opis: Zawartość rejestru źródłowego fs zostaje skopiowana do rejestru docelowego fd. Oba rejestry mogą zajmować dowolne miejsce wewnątrz 4096 bajtowej przestrzeni danych. Oba rejestry fs i fd mogą być rejestrem akumulatora WREG (użyteczna sytuacja specjalna). Instrukcja MOVFF jest szczególnie użyteczna przy przesyle danych z komórki pamięci do rejestru peryferyjnego (takiego jak bufor nadawczy lub port we/wy).

W instrukcji MOVFF nie można używać jako rejestru przeznaczenia rejestrów PCL, TOSU, TOSH lub TOSL.

Instrukcji MOVFF nie powinno się używać do modyfikacji ustawień przerwań, gdy jest aktywna obsługa dowolnego przerwania.

Liczba słów instrukcji: 2

Liczba cykli rozkazowych: 2/3

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
fs
Przetwarzanie
danych
Brak
operacji
Q1 Q2 Q3 Q4
Dekodowanie Brak operacji
(bez pustego odczytu)
Brak
operacji
Zapis
fd

Przykład:

MOVFF REG1, REG2

Przed wykonaniem instrukcji:
  REG1 = 0x33
  REG2 = 0x11
Po wykonaniu instrukcji:
  REG1 = 0x33
  REG2 = 0x33


MOVLB (ang. Move Literal to Low Nibble in BSR – Załadowanie stałej k do dolnej połówki rejestru BSR)

Składnia: MOVLB k

Argumenty: k = 0...255

Operacja: BSR ← k

Modyfikowane znaczniki stanu: Żaden

Kod: 0000 0001 kkkk kkkk

Opis: 8-bitowa stała jest ładowana do rejestru wyboru banku pamięci RAM (tylko 4 najmłodsze bity są istotne) BSR[3:0].

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:

Q1 Q2 Q3 Q4
Dekodowanie Odczyt
stałej k
Przetwarzanie
danych
Zapis k do
rejestru BSR

Przykład:

MOVLB 5

Przed wykonaniem instrukcji:
  BSR = 0x02
Po wykonaniu instrukcji:
  BSR = 0x05


MOVLW (ang. Move Literal to WREG – Załadowanie stałej k do WREG)

Składnia: MOVLW k

Argumenty: k = 0...255

Operacja: WREG ← k

Modyfikowane znaczniki stanu: Żaden

Kod: 0000 0111 kkkk kkkk

Opis: 8-bitowa stała jest ładowana do rejestru akumulatora WREG.

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:

Q1 Q2 Q3 Q4
Dekodowanie Odczyt
stałej k
Przetwarzanie
danych
Zapis k do
WREG

Przykład:

MOVLW 0x5A

Po wykonaniu instrukcji:
  WREG = 0x5A


MOVWF (ang. Move WREG to f – Skopiowanie WREG do f)

Składnia: MOVWF f{,a}

Argumenty: f = 0...255, a = 0...1

Operacja: f ← WREG

Modyfikowane znaczniki stanu: żaden

Kod: 0110 111a ffff ffff

Opis: Skopiowanie danych z akumulatora WREG do rejestru f, który może znajdować się w dowolnym miejscu 256-bajtowego banku pamięci danych RAM. Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis
rejestru f

Przykład:

MOVWF REG

Przed wykonaniem instrukcji:
  WREG = 0x4F
  REG = 0xFF
Po wykonaniu instrukcji:
  WREG = 0x4F
  REG = 0x4F


MULLW (ang. Multiply Literal with WREG – Mnożenie stałej przez WREG)

Składnia: MOVLW k

Argumenty: k = 0...255

Operacja: PRODH:PRODL ← WREG × k

Modyfikowane znaczniki stanu: Żaden

Kod: 0000 1101 kkkk kkkk

Opis: Zostaje wykonane mnożenie bezznakowe zawartości akumulatora WREG i 8-bitowej stałej k. 16-bitowy wynik mnożenia trafia do pary rejestrów PRODH:PRODL. Rejestr PRODH zawiera górny bajt wyniku, PRODL dolny. Rejestr WREG nie jest zmieniany. Nie zmieniane są również żadne znaczniki stanu. Zauważ, iż w tej operacji nie jest możliwe powstanie nadmiaru, ani wystąpienie przeniesienia. Wynik zero jest możliwy, jednak nie jest wykrywany.

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:

Q1 Q2 Q3 Q4
Dekodowanie Odczyt
stałej k
Przetwarzanie
danych
Zapis do rejestrów
PRODH:PRODL

Przykład:

MULLW 0xC4

Przed wykonaniem instrukcji:
  WREG = 0xE2
  PRODH = ?
  PRODL = ?
Po wykonaniu instrukcji:
  WREG = 0xE2
  PRODH = 0xAD
  PRODL = 0x08


MULWF (ang. Multiply W with f – Mnożenie WREG przez f)

Składnia: MULWF f{,a}

Argumenty: f = 0...255, a = 0...1

Operacja: PRODH:PRODL ← WREG × f

Modyfikowane znaczniki stanu: żaden

Kod: 0000 001a ffff ffff

Opis: Zostaje wykonane mnożenie bezznakowe zawartości akumulatora WREG i rejestru f. 16-bitowy wynik mnożenia trafia do pary rejestrów PRODH:PRODL. Rejestr PRODH zawiera górny bajt wyniku, PRODL dolny. Rejestry WREG i f nie są zmieniane. Nie zmieniane są również żadne znaczniki stanu. Zauważ, iż w tej operacji nie jest możliwe powstanie nadmiaru, ani wystąpienie przeniesienia. Wynik zero jest możliwy, jednak nie jest wykrywany. Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis do rejestrów
PRODH:PRODL

Przykład:

MULWF REG

Przed wykonaniem instrukcji:
  WREG = 0xC4
  REG = 0xB5
  PRODH = ?
  PRODL = ?
Po wykonaniu instrukcji:
  WREG = 0xC4
  REG = 0xB5
  PRODH = 0x8A
  PRODL = 0x94


NEGF (ang. Negate f – Negowanie f)

Składnia: NEGF f{,a}

Argumenty: f = 0...255, a = 0...1

Operacja: f ←  f  + 1

Modyfikowane znaczniki stanu: N, OV, C, DC, Z

Kod: 0110 110a ffff ffff

Opis: Zawartość rejestru f zostaje zanegowana przy pomocy uzupełnienia do 2. Wynik umieszczany jest z powrotem w rejestrze f. Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis
rejestru f

Przykład:

NEGF REG, 1

Przed wykonaniem instrukcji:
  REG = 0011 1010 (0x3A)
Po wykonaniu instrukcji:
  REG = 1100 0110 (0xC6)


NOP (ang. No operation – Brak działania)

Składnia: NOP

Argumenty: brak

Operacja: brak działania

Modyfikowane znaczniki stanu: żaden
Kod: 0000 0000 0000 0000
  1111 xxxx xxxx xxxx

Opis: Instrukcja pusta, nie wykonuje żadnego zadania.

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Brak
operacji
Brak
operacji
Brak
operacji


POP (ang. Pop Top of Return Stack – Usunięcie adresu ze szczytu stosu)

Składnia: POP

Argumenty: brak

Operacja: Usunięcie danych z TOS

Modyfikowane znaczniki stanu: żaden

Kod: 0000 0000 0000 0110

Wartość adresu powrotnego ze szczytu stosu zostaje pobrana i usunięta. W następstwie tego na szczycie stosu pojawia się poprzedni adres powrotny umieszczony na stosie. Instrukcja ta służy do umożliwienia użytkownikowi poprawnego zarządzania stosem adresów powrotnych i dołączenia stosu programowego.

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Brak
operacji
Usunięcie
wartości z TOS
Brak
operacji

Przykład:

POP
GOTO NEW

Przed wykonaniem instrukcji:
  TOS = 0x0031A2
 Jeden poziom niżej na stosie = 0x014332
Po wykonaniu instrukcji:
  TOS = 0x014332
  PC = NEW


PUSH (ang. Push Top of Return Stack – Przesłanie na szczyt stosu)

Składnia: PUSH

Argumenty: brak

Operacja: TOS ← PC + 2

Modyfikowane znaczniki stanu: żaden

Kod: 0000 0000 0000 0101

Adres PC + 2 jest przesyłany na szczyt stosu adresów powrotnych. Poprzedni adres na szczycie stosu zostaje przesunięty o jeden poziom stosu niżej. Instrukcja ta pozwala użytkownikowi zaimplementować stos programowy przez zmodyfikowanie TOS i umieszczenie go na stosie powrotnym.

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Przesłanie na stos
PC + 2
Brak
operacji
Brak
operacji

Przykład:

PUSH

Przed wykonaniem instrukcji:
  TOS = 0x00345A
  PC = 0x000124
Po wykonaniu instrukcji:
  PC = 0x000126
  TOS = 0x000126
  Jeden poziom niżej na stosie = 0x00345A


RCALL (ang. Relative Call – Względne wywołanie podprogramu)

Składnia: RCALL n

Argumenty: n = -1024...1023

Operacja:

TOS ← PC + 2
PC ← PC + 2 + 2n

Modyfikowane znaczniki stanu: żaden

Kod: 1101 1nnn nnnn nnnn

Opis: Wywołanie podprogramu znajdującego się w odległości 1K słów od bieżącej pozycji. Najpierw na stos trafia dres powrotny PC + 2. Następnie do PC dodawane jest przesunięcie 2n jako liczba całkowita ze znakiem w kodzie U2. Ponieważ licznik programu PC został zwiększony o 2 w celu pobrania następnej instrukcji, nowym adresem będzie PC + 2 + 2n. Instrukcja wykonywana jest w dwóch cyklach.

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 2

Operacje w taktach zegarowych:
Pierwszy cykl
rozkazowy
Q1 Q2 Q3 Q4
Dekodowanie Odczyt stałej n,
przesłanie PC
na stos
Przetwarzanie
danych
Zapis
do PC
Drugi cykl
rozkazowy
Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Przykład:

HERE RCALL JUMP

Przed wykonaniem instrukcji:
  PC = adres (HERE)
Po wykonaniu instrukcji:
  PC = adres (JUMP)
  TOS = adres (HERE + 2)


RESET (ang. Reset)

Składnia: RESET

Argumenty: brak

Operacja: Resetuje wszystkie rejestry i znaczniki, na które wpływa reset z końcówki MCLR.

Modyfikowane znaczniki stanu: wszystkie

Kod: 0000 0000 1111 1111

Opis: Instrukcja ta dostarcza sposobu wykonania programowego resetu.

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Rozpoczęcie
resetu
Brak
operacji
Brak
operacji

Przykład:

RESET

Po wykonaniu instrukcji:
  Rejestry = wartość po resecie
  Znaczniki = wartość po resecie


RETFIE (ang. Return from Interrupt – Powrót z przerwania)

Składnia: RETFIE s

Argumenty: s = 0...1

Operacja:

PC ← TOS
GIE/GIEH lub PEIE/GIEL ← 1
Jeśli s = 1, to
  WREG ← WS
  STATUS ← STATUSS
  BSR ← BSRS
PCLATU, PCLATH nie są zmieniane

Modyfikowane znaczniki stanu: GIE/GIEH, PEIE/GIEL

Kod: 0000 0000 0001 000s

Opis: Powrót z przerwania. Adres ze szczytu stosu zostaje załadowany do rejestru licznika programu PC. Jest włączana obsługa przerwań przez ustawienie albo bitu przerwań niskopriorytetowych, albo bitu przerwań wysokopriorytetowych. Jeśli bit s = 1, to z rejestrów zapasowych WS, STATUSS i BSRS zostaje załadowana zawartość do odpowiednich rejestrów WREG, STATUS i BSR. Jeśli s = 0, to nie nastąpi odtworzenie stanu tych rejestrów (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 2

Operacje w taktach zegarowych:
Pierwszy cykl
rozkazowy
Q1 Q2 Q3 Q4
Dekodowanie Brak
działania
Brak
działania
Pobranie PC
ze stosu,
ustawienie
GIEH lub GIEL
Drugi cykl
rozkazowy
Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Przykład:

RETFIE 1

Po wykonaniu instrukcji:
  PC = TOS
  WREG = WS
  BSR = BSRS
  STATUS = STATUSS
  GIE/GIEH, PEIE/GIEL = 1


RETLW (ang. Return Literal to WREG – Powrót z podprogramu ze stałą k w WREG)

Składnia: RETLW k

Argumenty: k = 0...255

Operacja:

WREG ← k
PC ← TOS
PCLATU, PCLATH nie są zmieniane

Modyfikowane znaczniki stanu: Żaden

Kod: 0000 1100 kkkk kkkk

Opis: Do akumulatora WREG zostaje załadowana 8-bitowa stała, następnie ze szczytu stosu TOS pobierany jest adres powrotny i umieszczany w rejestrze licznika programu PC. Zatrzaski górnych bitów adresu PCLATH i PCLATU nie są zmieniane.

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 2

Operacje w taktach zegarowych:

Pierwszy cykl
rozkazowy
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
stałej k
Przetwarzanie
danych
Pobranie PC
ze stosu,
zapis k
do WREG
Drugi cykl
rozkazowy
Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Przykład:

    CALL TABLE ; WREG zawiera wartość indeksu w tablicy
    ; Tutaj WREG zawiera wartość komórki tablicy
    :
TABLE
    ADDWF PCL ; WREG = indeks
    RETLW k0 ; Początek tablicy
    RETLW k1 ;
    :
    :
    RETLW kn ; Koniec tablicy

Przed wykonaniem instrukcji:
  WREG = 0x07
Po wykonaniu instrukcji:
  WREG = wartość k7


RETURN (ang. Return from Subroutine – Powrót z podprogramu)

Składnia: RETURN s

Argumenty: s = 0...1

Operacja:

PC ← TOS
Jeśli s = 1, to
  WREG ← WS
  STATUS ← STATUSS
  BSR ← BSRS
PCLATU, PCLATH nie są zmieniane

Modyfikowane znaczniki stanu: żaden

Kod: 0000 0000 0001 001s

Opis: Powrót z podprogramu. Adres ze szczytu stosu zostaje załadowany do rejestru licznika programu PC. Jeśli bit s = 1, to z rejestrów zapasowych WS, STATUSS i BSRS zostaje załadowana zawartość do odpowiednich rejestrów WREG, STATUS i BSR. Jeśli s = 0, to nie nastąpi odtworzenie stanu tych rejestrów (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 2

Operacje w taktach zegarowych:
Pierwszy cykl
rozkazowy
Q1 Q2 Q3 Q4
Dekodowanie Brak
działania
Brak
działania
Pobranie PC
ze stosu,
Drugi cykl
rozkazowy
Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Przykład:

RETURN

Po wykonaniu instrukcji:
  PC = TOS


RLCF (ang. Rotate Left f through Carry – Obrót w lewo f poprzez przeniesienie)

Składnia: RLCF f{,d{,a}}

Argumenty: f = 0...255, d = 0...1, a = 0...1

Operacja:

dest[7:1] ← f[6:0]
dest[0] ← C
C ← f[7]

Modyfikowane znaczniki stanu: C, N, Z

Kod: 0011 01da ffff ffff

Opis: Zawartość rejestru f jest obracana w lewo o jeden bit poprzez znacznik przeniesienia C. Wynik tego obrotu jest zapisywany do rejestru docelowego zależnie od stanu bitu d. Jeśli d = 0, to wynik zostanie umieszczony w akumulatorze WREG. Jeśli d = 1 (domyślnie), to wynik zostanie z powrotem umieszczony w rejestrze f. Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis do
rejestru dest

Przykład:

RLCF REG, W

Przed wykonaniem instrukcji:
  REG = 1110 0110
  C = 0
Po wykonaniu instrukcji:
  REG = 1110 0110
  WREG = 1100 1100
  C = 1


RLNCF (ang. Rotate Left f with no Carry – Obrót w lewo f bez przeniesienia)

Składnia: RLNCF f{,d{,a}}

Argumenty: f = 0...255, d = 0...1, a = 0...1

Operacja:

dest[7:1] ← f[6:0]
dest[0] ← f[7]

Modyfikowane znaczniki stanu: N, Z

Kod: 0100 01da ffff ffff

Opis: Zawartość rejestru f jest obracana w lewo o jeden bit. Wynik tego obrotu jest zapisywany do rejestru docelowego zależnie od stanu bitu d. Jeśli d = 0, to wynik zostanie umieszczony w akumulatorze WREG. Jeśli d = 1 (domyślnie), to wynik zostanie z powrotem umieszczony w rejestrze f. Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis do
rejestru dest

Przykład:

RLNCF REG

Przed wykonaniem instrukcji:
  REG = 1010 1011
Po wykonaniu instrukcji:
  REG = 0101 0111


RRCF (ang. Rotate Right f through Carry – Obrót w prawo f poprzez przeniesienie)

Składnia: RRCF f{,d{,a}}

Argumenty: f = 0...255, d = 0...1, a = 0...1

Operacja:

dest[6:0] ← f[7:1]
dest[7] ← C
C ← f[0]

Modyfikowane znaczniki stanu: C, N, Z

Kod: 0011 00da ffff ffff

Opis: Zawartość rejestru f jest obracana w prawo o jeden bit poprzez znacznik przeniesienia C. Wynik tego obrotu jest zapisywany do rejestru docelowego zależnie od stanu bitu d. Jeśli d = 0, to wynik zostanie umieszczony w akumulatorze WREG. Jeśli d = 1 (domyślnie), to wynik zostanie z powrotem umieszczony w rejestrze f. Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis do
rejestru dest

Przykład:

RRCF REG, W

Przed wykonaniem instrukcji:
  REG = 1110 0111
  C = 0
Po wykonaniu instrukcji:
  REG = 1110 0111
  WREG = 0111 0011
  C = 1


RRNCF (ang. Rotate Right f with no Carry – Obrót w prawo f bez przeniesienia)

Składnia: RRNCF f{,d{,a}}

Argumenty: f = 0...255, d = 0...1, a = 0...1

Operacja:

dest[6:0] ← f[7:1]
dest[7] ← f[0]

Modyfikowane znaczniki stanu: N, Z

Kod: 0100 00da ffff ffff

Opis: Zawartość rejestru f jest obracana w prawo o jeden bit. Wynik tego obrotu jest zapisywany do rejestru docelowego zależnie od stanu bitu d. Jeśli d = 0, to wynik zostanie umieszczony w akumulatorze WREG. Jeśli d = 1 (domyślnie), to wynik zostanie z powrotem umieszczony w rejestrze f. Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis do
rejestru dest

Przykład 1:

RRNCF REG, 1, 0

Przed wykonaniem instrukcji:
  REG = 1101 0111
Po wykonaniu instrukcji:
  REG = 1110 1011

Przykład 2:

RRNCF REG, W

Przed wykonaniem instrukcji:
  WREG = ?
  REG = 1101 0111
Po wykonaniu instrukcji:
  WREG = 1110 1011
  REG = 1101 0111


SETF (ang. Set f – Ustawianie bitów w f na 1)

Składnia: SETF f{,a}

Argumenty: f = 0...255, a = 0...1

Operacja: f ← 0xFF

Modyfikowane znaczniki stanu: Żaden

Kod: 0110 100a ffff ffff

Opis: Wszystkie bity w rejestrze f zostają ustawione na 1. Wynik umieszczany jest z powrotem w rejestrze f. Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis
rejestru f

Przykład:

SETF REG

Przed wykonaniem instrukcji:
  REG = 0x5A
Po wykonaniu instrukcji:
  REG = 0xFF


SLEEP (ang. Enter Sleep Mode – Wejście w tryb uśpienia)

Składnia: SLEEP

Argumenty: brak

Operacja:

WDT ← 00h
preskaler WDT  ← 0
TO ← 1
PD ← 0

Modyfikowane znaczniki stanu: TO, PD

Kod: 0000 0000 0000 0011

Opis: Znacznik stanu wyłączenia zasilania (ang. The Power-Down status bit, PD) jest zerowany, a znacznik zakończenia okresu czasu (ang. Time-out status bit, TO). Jest zerowany licznik czasu wraz ze swoim preskalerem. Mikroprocesor zostaje wprowadzony w stan uśpienia z zatrzymanym oscylatorem.

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Brak
operacji
Przetwarzanie
danych
Wejście
w stan uśpienia

Przykład:

SLEEP

Przed wykonaniem instrukcji:
  TO = ?
  PD = ?
Po wykonaniu instrukcji:
  TO = 1*
  PD = 0

* Jeśli licznik zegarowy WDT spowoduje wybudzenie ze stanu uśpienia, to bit ten zostanie wyzerowany


SUBFWB (ang. Subtract f from WREG with Borrow – Odejmowanie f od WREG z pożyczką)

Składnia: SUBFWB f{,d{,a}}

Argumenty: f = 0...255, d = 0...1, a = 0...1

Operacja: dest ← WREG - f - C

Modyfikowane znaczniki stanu: N, OV, C, DC, Z

Kod: 0101 01da ffff ffff

Opis: Odjęcie od akumulatora WREG zawartości rejestru f oraz bitu przeniesienia C metodą uzupełnień do 2. Jeśli d = 0, to wynik zostanie umieszczony w akumulatorze WREG. Jeśli d = 1 (domyślnie), to wynik zostanie z powrotem umieszczony w rejestrze f. Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis do
rejestru dest

Przykład 1:

SUBFWB REG

Przed wykonaniem instrukcji:
  REG = 0x03
  WREG = 0x02
  C = 1
Po wykonaniu instrukcji:
  REG = 0xFF
  WREG = 0x02
  C = 0
  Z = 0
  N = 1 ; wynik jest ujemny

Przykład 2:

SUBFWB REG, 0, 0

Przed wykonaniem instrukcji:
  REG = 0x02
  WREG = 0x05
  C = 1
Po wykonaniu instrukcji:
  REG = 0x02
  WREG = 0x03
  C = 1
  Z = 0
  N = 0 ; wynik jest dodatni

Przykład 3:

SUBFWB REG, 1, 0

Przed wykonaniem instrukcji:
  REG = 0x01
  WREG = 0x02
  C = 0
Po wykonaniu instrukcji:
  REG = 0x00
  WREG = 0x02
  C = 1
  Z = 1 ; wynikiem jest zero
  N = 0


SUBLW (ang. Subtract WREG from Literal – Odejmowanie WREG od stałej k)

Składnia: SUBLW k

Argumenty: k = 0...255

Operacja: WREG ← k - WREG

Modyfikowane znaczniki stanu: N, OV, C, DC, Z

Kod: 0000 1000 kkkk kkkk

Opis: Zawartość akumulatora WREG jest odejmowana od 8-bitowej stałej k. Wynik trafia do WREG.

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:

Q1 Q2 Q3 Q4
Dekodowanie Odczyt
stałej k
Przetwarzanie
danych
Zapis do
WREG

Przykład 1:

SUBLW 0x02

Przed wykonaniem instrukcji:
  WREG = 0x01
  C = ?
Po wykonaniu instrukcji:
  WREG = 0x1
  C = 1 ; wynik jest dodatni
  Z = 0
  N = 0

Przykład 2:

SUBLW 0x02

Przed wykonaniem instrukcji:
  WREG = 0x02
  C = ?
Po wykonaniu instrukcji:
  WREG = 0x0
  C = 1 ; wynikiem jest zero
  Z = 1
  N = 0

Przykład 3:

SUBLW 0x02

Przed wykonaniem instrukcji:
  WREG = 0x03
  C = ?
Po wykonaniu instrukcji:
  WREG = 0xFF ; -1 w kodzie U2
  C = 0 ; wynik jest ujemny
  Z = 0
  N = 1


SUBWF (ang. Subtract WREG from f – Odejmowanie WREG od f)

Składnia: SUBWF f{,d{,a}}

Argumenty: f = 0...255, d = 0...1, a = 0...1

Operacja: dest ← f - WREG

Modyfikowane znaczniki stanu: N, OV, C, DC, Z

Kod: 0101 11da ffff ffff

Opis: Odjęcie od rejestru f zawartości akumulatora WREG metodą uzupełnień do 2. Jeśli d = 0, to wynik zostanie umieszczony w akumulatorze WREG. Jeśli d = 1 (domyślnie), to wynik zostanie z powrotem umieszczony w rejestrze f. Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis do
rejestru dest

Przykład 1:

SUBWF REG

Przed wykonaniem instrukcji:
  REG = 0x03
  WREG = 0x02
  C = ?
Po wykonaniu instrukcji:
  REG = 0x01
  WREG = 0x02
  C = 1 ; wynik jest dodatni
  Z = 0
  N = 0

Przykład 2:

SUBWF REG, W

Przed wykonaniem instrukcji:
  REG = 0x02
  WREG = 0x02
  C = ?
Po wykonaniu instrukcji:
  REG = 0x02
  WREG = 0x00
  C = 1 ; wynikiem jest zero
  Z = 1
  N = 0

Przykład 3:

SUBWF REG

Przed wykonaniem instrukcji:
  REG = 0x01
  WREG = 0x02
  C = ?
Po wykonaniu instrukcji:
  REG = 0xFF ; -1 w kodzie U2
  WREG = 0x02
  C = 0 ; wynik jest ujemny
  Z = 0
  N = 1


SUBWFB (ang. Subtract WREG from f with borrow – Odejmowanie WREG od f z pożyczką)

Składnia: SUBWFB f{,d{,a}}

Argumenty: f = 0...255, d = 0...1, a = 0...1

Operacja: dest ← f - WREG - C

Modyfikowane znaczniki stanu: N, OV, C, DC, Z

Kod: 0101 10da ffff ffff

Opis: Odjęcie od rejestru f zawartości akumulatora WREG i znacznika przeniesienia (tutaj pożyczki) C metodą uzupełnień do 2. Jeśli d = 0, to wynik zostanie umieszczony w akumulatorze WREG. Jeśli d = 1 (domyślnie), to wynik zostanie z powrotem umieszczony w rejestrze f. Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis do
rejestru dest

Przykład 1:

SUBWFB REG, 1, 0

Przed wykonaniem instrukcji:
  REG = 0x19 (0001 1001)
  WREG = 0x0D (0000 1101)
  C = 1
Po wykonaniu instrukcji:
  REG = 0x0C (0000 1011)
  WREG = 0x0D (0000 1101)
  C = 1
  Z = 0
  N = 0 ; wynik jest dodatni

Przykład 2:

SUBWFB REG, 0, 0

Przed wykonaniem instrukcji:
  REG = 0x1B (0001 1011)
  WREG = 0x1A (0001 1010)
  C = 0
Po wykonaniu instrukcji:
  REG = 0x1B (0001 1011)
  WREG = 0x00
  C = 1
  Z = 1 ; wynikiem jest zero
  N = 0

Przykład 3:

SUBWFB REG, 1, 0

Przed wykonaniem instrukcji:
  REG = 0x03 (0000 0011)
  WREG = 0x0E (0000 1101)
  C = 1
Po wykonaniu instrukcji:
  REG = 0xF5 (1111 0100) ; metoda uzupełnień do 2
  WREG = 0x0E (0000 1101)
  C = 0
  Z = 0
  N = 1 ; wynik jest ujemny


SWAPF (ang. Swap f – Zamiana miejscami połówek f)

Składnia: SWAPF f{,d{,a}}

Argumenty: f = 0...255, d = 0...1, a = 0...1

Operacja:

dest[7:4] ← f[3:0]
dest[3:0] ← f[7:4]

Modyfikowane znaczniki stanu: Żaden

Kod: 0011 10da ffff ffff

Opis: Górna i dolna połówka rejestru f zostają zamienione miejscami. Jeśli d = 0, to wynik zostanie umieszczony w akumulatorze WREG. Jeśli d = 1 (domyślnie), to wynik zostanie z powrotem umieszczony w rejestrze f. Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis do
rejestru dest

Przykład:

SWAPF REG

Przed wykonaniem instrukcji:
  REG = 0x53
Po wykonaniu instrukcji:
  REG = 0x35


TBLRD (ang. Table Read – Odczyt tablicy)

Składnia:

TBLRD *
TBLRD *+
TBLRD *-
TBLRD +*

Argumenty: żadne

Operacja:

TBLRD *:
  TABLAT ← Pamięć programu (TBLPTR)
  Wskaźnik TBLPTR nie jest zmieniany

TBLRD *+:
  TABLAT ← Pamięć programu (TBLPTR)
  TBLPTR ← TBLPTR + 1

TBLRD *-:
  TABLAT ← Pamięć programu (TBLPTR)
  TBLPTR ← TBLPTR - 1

TBLRD +*:
  TBLPTR ← TBLPTR + 1
  TABLAT ← Pamięć programu (TBLPTR)

Modyfikowane znaczniki stanu: żaden

Kod:

0000 0000 0000 11nn
nn = 00: *
nn = 01: *+
nn = 10: *-
nn = 11: +*

Opis: Instrukcja ta jest używana do odczytu zawartości pamięci programu. Jest potrzebna, ponieważ w architekturze harwardzkiej procesora PIC przestrzeń pamięci danych i przestrzeń pamięci programu są rozdzielone. Do adresowania pamięci programu używany jest tzw. wskaźnik tablicy (ang. Table Pointer, TBLPTR). Ma on rozmiar 21 bitów i może wskazywać na każdy bajt w pamięci programu, co daje mu zakres adresowy 2MB (221). Najmłodszy bit wskaźnika określa bajt adresowanego słowa pamięci programu (pamięć programu zorganizowana jest w słowa 16-bitowe, ponieważ taki jest format instrukcji mikrokontrolera PIC18):

TBLPTR[0] = 0: Dolny bajt słowa pamięci programu
TBLPTR[0] = 1: Górny bajt słowa pamięci programu

Instrukcja TBLWT może modyfikować wskaźnik TBLPTR w następujący sposób:

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 2

Operacje w taktach zegarowych:
Pierwszy cykl
rozkazowy
Q1 Q2 Q3 Q4
Dekodowanie Brak
działania
Brak
działania
Brak
działania
Drugi cykl
rozkazowy
Q1 Q2 Q3 Q4
Brak
działania
Odczyt
pamięci programu
Brak
działania
Zapis
TABLAT

Przykład 1:

TBLRD *+ ;

Przed wykonaniem instrukcji:
  TABLAT = ?
  TBLPTR = 0x00A356
  PAMIĘĆ(0x00A356) = 0x34
Po wykonaniu instrukcji:
  TABLAT = 0x34
  TBLPTR = 0x00A357

Przykład 2:

TBLRD +* ;

Przed wykonaniem instrukcji:
  TABLAT = ?
  TBLPTR = 0x01A357
  PAMIĘĆ(0x01A357) = 0x12
  PAMIĘĆ(0x01A358) = 0x34
Po wykonaniu instrukcji:
  TABLAT = 0x34
  TBLPTR = 0x01A358


TBLWT (ang. Table Write – Zapis tablicy)

Składnia:

TBLWT *
TBLWT *+
TBLWT *-
TBLWT +*

Argumenty: żadne

Operacja:

TBLWT *:
  Rejestr przechowujący ← TABLAT
  Wskaźnik TBLPTR nie jest zmieniany

TBLWT *+:
  Rejestr przechowujący ← TABLAT
  TBLPTR ← TBLPTR + 1

TBLWT *-:
  Rejestr przechowujący ← TABLAT
  TBLPTR ← TBLPTR - 1

TBLWT +*:
  TBLPTR ← TBLPTR + 1
  Rejestr przechowujący ← TABLAT

Modyfikowane znaczniki stanu: żaden

Kod:

0000 0000 0000 11nn
nn = 00: *
nn = 01: *+
nn = 10: *-
nn = 11: +*

Opis: Instrukcja używa trzy najmłodsze bity rejestru wskaźnika TBLPTR do określenia, do którego z ośmiu rejestrów przechowujących zostanie zapisana zawartość rejestru TABLAT. Rejestry przechowujące (ang. holding registers) używane są przy programowaniu zawartości pamięci programu. Szczegóły tego procesu znajdziesz w danych technicznych mikrokontrolera PIC18. Do adresowania pamięci programu używany jest tzw. wskaźnik tablicy (ang. Table Pointer, TBLPTR). Ma on rozmiar 21 bitów i może wskazywać na każdy bajt w pamięci programu, co daje mu zakres adresowy 2MB (221). Najmłodszy bit wskaźnika określa bajt adresowanego słowa pamięci programu (pamięć programu zorganizowana jest w słowa 16-bitowe, ponieważ taki jest format instrukcji mikrokontrolera PIC18):

TBLPTR[0] = 0: Dolny bajt słowa pamięci programu
TBLPTR[0] = 1: Górny bajt słowa pamięci programu

Instrukcja TBLWR może modyfikować wskaźnik TBLPTR w następujący sposób:

Odczytany z pamięci programu bajt zapisywany jest do rejestru TABLAT.

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 2

Operacje w taktach zegarowych:
Pierwszy cykl
rozkazowy
Q1 Q2 Q3 Q4
Dekodowanie Brak
działania
Brak
działania
Brak
działania
Drugi cykl
rozkazowy
Q1 Q2 Q3 Q4
Brak
działania
Odczyt
TABLAT
Brak
działania
Zapis do
rejestru
przechowującego

Przykład 1:

TBLWT *+;

Przed wykonaniem instrukcji:
  TABLAT = 0x55
  TBLPTR = 0x00A356
  Rejestr przechowujący
  (0x00A356) = 0xFF
Po wykonaniu instrukcji: (zakończenie zapisu tablicy)
  TABLAT = 0x55
  TBLPTR = 0x00A357
  Rejestr przechowujący
  (0x00A356) = 0x55

Przykład 2:

TBLWT +*;

Przed wykonaniem instrukcji:
  TABLAT = 0x34
  TBLPTR = 0x01389A
  Rejestr przechowujący
  (0x01389A) = 0xFF
  Rejestr przechowujący
  (0x01389B) = 0xFF
Po wykonaniu instrukcji: (zakończenie zapisu tablicy)
  TABLAT = 0x34
  TBLPTR = 0x01389B
  Rejestr przechowujący
  (0x01389A) = 0xFF
  Rejestr przechowujący
  (0x01389B) = 0x34


TSTFSZ (ang. Test f, Skip if 0 – Testowanie f, pominięcie przy zerze)

Składnia: TSTFSZ f{,a}

Argumenty: f = 0...255, a = 0...1

Operacja: Pominięcie następnej instrukcji, jeśli f = 0

Modyfikowane znaczniki stanu: żaden

Kod: 0110 011a ffff ffff

Opis: Jeśli f = 0, następna instrukcja pobrana w czasie wykonywania instrukcji bieżącej (nakładkowanie) zostaje usunięta z kolejki i zamiast niej mikroprocesor wykonuje instrukcję pustą NOP, co powoduje, iż instrukcja TSTFSZ wykonuje się w tym przypadku przez 2 cykle rozkazowe. Jeśli pomijana instrukcja jest instrukcją 32-bitową (2 słowa w pamięci programu), to mikroprocesor wykonuje 2 instrukcje puste NOP. Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1/2/3

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Brak
działania

Przy pominięciu instrukcji 16-bitowej (drugi cykl rozkazowy):

Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Przy pominięciu instrukcji 32-bitowej (drugi i trzeci cykl rozkazowy):

Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania
Q1 Q2 Q3 Q4
Brak
działania
Brak
działania
Brak
działania
Brak
działania

Przykład:
HERE TSTFSZ CNT
NZERO :  
ZERO :  

Przed wykonaniem instrukcji:
  PC = adres (HERE)
Po wykonaniu instrukcji:
  Jeśli CNT = 0;
    PC = adres (ZERO)
Jeśli CNT ≠ 0;
    PC = adres (NZERO)


XORLW (ang. Exclusive OR Literal with WREG – Różnica symetryczna stałej k z WREG)

Składnia: XORLW k

Argumenty: k = 0...255

Operacja: WREG ← WREG ^ k

Modyfikowane znaczniki stanu: N, Z

Kod: 0000 1010 kkkk kkkk

Opis: Zawartość akumulatora WREG zostaje poddana operacji różnicy symetrycznej z 8-bitową stałą k. Wynik jest umieszczany w akumulatorze WREG.

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:

Q1 Q2 Q3 Q4
Dekodowanie Odczyt
stałej k
Przetwarzanie
danych
Zapis do
rejestru WREG

Przykład:

XORLW 0xAF

Przed wykonaniem instrukcji:
  WREG = 0xB5
Po wykonaniu instrukcji:
  WREG = 0x1A


XORWF (ang. Exclusive OR WREG with f – Różnica symetryczna WREG z f)

Składnia: XORWF f{,d{,a}}

Argumenty: f = 0...255, d = 0...1, a = 0...1

Operacja: dest ← WREG ^ f

Modyfikowane znaczniki stanu: N, Z

Kod: 0001 10da ffff ffff

Opis: Różnica symetryczna akumulatora WREG i rejestru f. Jeśli d = 0, to wynik zostanie umieszczony w akumulatorze WREG. Jeśli d = 1 (domyślnie), to wynik zostanie z powrotem umieszczony w rejestrze f.  Jeśli a = 0, to zostanie użyty rejestr f w banku dostępowym, przy zignorowanej wartości rejestru BSR. Jeśli a = 1, to zostanie użyty rejestr f z banku RAM o numerze w rejestrze BSR (domyślnie).

Liczba słów instrukcji: 1

Liczba cykli rozkazowych: 1

Operacje w taktach zegarowych:
Q1 Q2 Q3 Q4
Dekodowanie Odczyt
rejestru f
Przetwarzanie
danych
Zapis do
rejestru dest

Przykład:

XORWF REG

Przed wykonaniem instrukcji:
  REG = 0xAF
  WREG = 0xB5
Po wykonaniu instrukcji:
  REG = 0x1A
  WREG = 0xB5

Na początek:  podrozdziału   strony 

Zespół Przedmiotowy
Chemii-Fizyki-Informatyki

w I Liceum Ogólnokształcącym
im. Kazimierza Brodzińskiego
w Tarnowie
ul. Piłsudskiego 4
©2023 mgr Jerzy Wałaszek

Materiały tylko do użytku dydaktycznego. Ich kopiowanie i powielanie jest dozwolone
pod warunkiem podania źródła oraz niepobierania za to pieniędzy.

Pytania proszę przesyłać na adres email: i-lo@eduinf.waw.pl

Serwis wykorzystuje pliki cookies. Jeśli nie chcesz ich otrzymywać, zablokuj je w swojej przeglądarce.

Informacje dodatkowe.