STM8 - STM8

STM8 jest 8-bitowy mikrokontroler rodziny przez STMicroelectronics . Mikrokontrolery STM8 wykorzystują rozszerzony wariant architektury mikrokontrolera ST7 . Mikrokontrolery STM8 są szczególnie tanie jak na w pełni funkcjonalny 8-bitowy mikrokontroler.

Architektura

STM8 jest bardzo podobny do wcześniejszego ST7, ale lepiej nadaje się jako cel dla C ze względu na jego 16-bitowe rejestry indeksowe i tryb adresowania zależny od wskaźnika stosu . Chociaż wewnętrznie architekturze Harvard to posiada zunifikowany 24-bitową przestrzeń adresową, umożliwiając kod do wykonania z pamięci RAM (przydatne przy programowaniu w-systemie z pamięci flash ROM ) i danych (takich jak stoły odnośników ), aby uzyskać dostęp z ROM. Dostęp do danych powyżej 64K jest ograniczony do specjalnych instrukcji „załaduj daleko”; większość operandów pamięci operandów ma dostęp do maksymalnie 128K (16-bitowy adres bazowy plus 16-bitowy offset).

Bardzo niewiele mikrokontrolerów STM8 ma więcej niż 64 KB pamięci danych.

Ma te same sześć rejestrów (A, X, Y, SP, PC, CC) co ST7, ale rejestry indeksowe X i Y zostały rozszerzone do 16 bitów, a licznik programu został rozszerzony do 24 bitów. Akumulatory A i wskaźnik stosu pozostają 8 i 16 bitów, odpowiednio.

Rejestr kod warunek ma dwa bity bardziej zdefiniowane, w sumie siedem. Istnieje flaga przepełnienia i drugi bit włączający przerwanie, umożliwiający cztery poziomy priorytetu przerwań .

Podrodziny

  • Samochód STM8AF
  • STM8AL samochód małej mocy
  • STM8L małej mocy
  • STM8S tani
  • Czujniki dotykowe STM8T
  • Sterowanie oświetleniem STLUX
  • STNRG Pulse-width modulacja -controllers

Wsparcie kompilatora

STM8 jest obsługiwany przez darmowy kompilator Small Device C Compiler , bezpłatny kompilator Cosmic C o zamkniętym kodzie źródłowym oraz niewolne kompilatory IAR C i Raisonance. Oprócz C istnieje STM8 eForth, port open source języka programowania Forth.

Zmiany w porównaniu do ST7

Zestaw instrukcji STM8 jest przeważnie nadzbiorem ST7, ale nie jest w pełni zgodny binarnie.

Operacje na rejestrach X i Y są rozszerzone do 16 bitów. W ten sposób ładuje i przechowuje dostęp do dwóch bajtów pamięci zamiast jednego. ( Zmieniono również flagę przeniesienia w połowie, aby odzwierciedlić przeniesienie z bitu 7 na bit 8 wyniku 16-bitowego, zamiast przeniesienia z bitu 3 do 4).

Przerwania przesuwają dziewięć bajtów stanu zamiast pięciu w ST7.

Instrukcja mnożenia przechowuje 16-bitowy produkt w określonym rejestrze indeksowym (np. X), zamiast dzielić go między X i A.

Pośrednich związanych z trybów pracy, które sprowadzić 8-bitowy adres z pamięci (rozkazy 92 2x , 92 3x , 92 Bx , 92 6x , 92 Ex , 91 6x , a 91 Ex ), zostały usunięte; wszystkie tryby adresowania pośredniego pobierają adresy 16-bitowe. Dodano nowy bajt prefiksu, 72 który jest używany do kodowania pośredniego, zaczynając od adresu 16-bitowego.

Instrukcje manipulacji bitami zostały zmienione tak, aby przyjmowały adres 16-bitowy i wymagały 72 bajtu prefiksu. Nieprefiksowane kody operacyjne 0x i 1x poprzednio zajmowane są zamiast tego używane do względnego adresowania wskaźnika stosu.

W przypadku niektórych rzadko używanych instrukcji rozgałęzień zmieniono kody rozkazów, aby wymagały 90 prefiksu, a kody rozkazów bez prefiksu zostały ponownie przypisane do gałęzi podpisanych, które zależą od flagi V.

Instrukcje ładowania i porównywania skierowane do rejestru X są mało przydatne w ST7 z trybami adresowania indeksowanymi przez rejestr X. W STM8, gdy takie operacje określają operand pamięci indeksowany przez rejestr X, operand rejestru jest zmieniany na Y. Z 90 prefiksem rejestry są odwrócone, więc rejestr indeksu ma wartość Y, a rejestr argumentu X.

Jedną z głównych różnic w wydajności jest to, że STM8 pobiera 32 bity z pamięci ROM na cykl, a wykonanie typowych instrukcji zajmuje jeden cykl plus jeden cykl na dostęp do pamięci RAM. Z kolei ST7 pobiera 8 bitów na cykl i pobiera jeden cykl na bajt instrukcji.

Zestaw instrukcji

Instrukcje STM8 składają się z przedrostka opcjonalnego bajt ( , , , lub ), bajt rozkazu, a kilka (do czterech, ale rzadko więcej niż dwie) bajtów argumentów. Bajty prefiksów w większości modyfikują tryb adresowania używany do określenia operandu pamięci, ale w niektórych przypadkach prefiksy i całkowicie wykonują inną operację. 72169016911692167290

Prefiks 90 zamienia X i Y w poniższej instrukcji. W poniższej tabeli warianty te są łączone w jednej linii poprzez zapis „X / Y”, co oznacza „X” lub „Y”. Prefiks 90 jest również używany w dwóch miejscach do wprowadzenia nowych rozkazów: instrukcje BCPL i BCCM oraz niektóre warunki rozgałęzienia.

Prefix 92 przekształca instrukcje z operandem przesunięcia ( addr16 , X) na adresowanie pośrednie ([ addr8 ], X). Przesunięcie jest zastępowane 8-bitowym adresem 16-bitowej wartości przesunięcia w pamięci. Służy tylko do tej funkcji.

Prefiks 91 ma oba poprzednie efekty, konwertując ( addr16 , X) tryby adresowania na ([ addr8 ], Y).

Prefiks 72 jest używany w wielu miejscach, w znacznie mniej regularnym układzie. W niektórych przypadkach wprowadza nowe tryby adresowania (szczególnie ([ addr16 ], X) 16-bitowy tryb pośredni), ale wprowadza również wiele zupełnie nowych operacji.

Zestaw instrukcji STM8
Prefiks 7 6 5 4 3 2 1 0 Operandy Mnemoniczny Opis
- 0 0 0 0 kod operacji addr8 OP ( addr8 , SP) Instrukcje jednoargumentowe (patrz poniżej)
- 0 0 0 1 kod operacji addr8 OP A, ( addr8 , SP) Instrukcje dwuargumentowe z operandem stosu
- 0 0 0 1 0 0 0 0 addr8 SUB A, ( addr8 , SP) A: = A - operand
- 0 0 0 1 0 0 0 1 addr8 CP A, ( addr8 , SP) Porównaj A - operand
- 0 0 0 1 0 0 1 0 addr8 SBC A, ( addr8 , SP) A: = A - operand - C odejmij z pożyczką
- / 90 0 0 0 1 0 0 1 1 addr8 CPW X / Y, ( addr8 , SP) Porównaj X / Y - operand (16-bitowy)
- 0 0 0 1 0 1 0 0 addr8 AND A, ( addr8 , SP) A: = A & operand, bitowe i
- 0 0 0 1 0 1 0 1 addr8 BCP A, ( addr8 , SP) Test bitowy A & operand
- 0 0 0 1 0 1 1 0 addr8 LDW Y, ( addr8 , SP) Y: = operand ( LD A, ( addr8 , SP) przypisany do kodu operacji 7B)
- 0 0 0 1 0 1 1 1 addr8 LDW ( addr8 , SP), Y Argument: = Y ( LD ( addr8 , SP), A przypisany do kodu operacji 6B)
- 0 0 0 1 1 0 0 0 addr8 XOR A, ( addr8 , SP) O: = A ^ operand, wyłączny-lub
- 0 0 0 1 1 0 0 1 addr8 ADC A, ( addr8 , SP) A: = A + operand + C, dodaj z przeniesieniem
- 0 0 0 1 1 0 1 0 addr8 LUB A, ( addr8 , SP) Odp .: = A | operand, włącznie lub
- 0 0 0 1 1 0 1 1 addr8 DODAJ A, ( addr8 , SP) A: = A + operand
- 0 0 0 1 1 1 0 0 imm16 DODAJ X, # imm16 X: = X + natychmiastowe (= JP ( addr8 , SP) )
- 0 0 0 1 1 1 0 1 imm16 SUBW X, # imm16 X: = X - natychmiastowe (= CALL ( addr8 , SP) )
- 0 0 0 1 1 1 1 0 addr8 LDW X, ( addr8 , SP) X: = operand
- 0 0 0 1 1 1 1 1 addr8 LDW ( addr8 , SP), X Argument: = X
72/90 0 0 0 do kawałek v operandy Operacje bitowe
72 0 0 0 0 kawałek 0 addr16 soff8 BTJT  addr16 , # bit , etykieta Przejdź do PC + soff8, jeśli bit źródłowy jest prawdziwy (ustawiony)
72 0 0 0 0 kawałek 1 addr16 soff8 BTJF  addr16 , # bit , etykieta Przejdź do PC + soff8, jeśli bit źródłowy jest fałszywy (wyczyść)
72 0 0 0 1 kawałek 0 addr16 BSET addr16 , # bit Ustaw określony bit na 1
72 0 0 0 1 kawałek 1 addr16 Adres BRES16 , # bit Zresetuj (wyczyść) określony bit do 0
90 0 0 0 1 kawałek 0 addr16 BCPL addr16 , # bit Uzupełnij (przełącz) wybrany bit
90 0 0 0 1 kawałek 1 addr16 BCCM addr16 , # bit Zapisz flagę przeniesienia do bitu pamięci
- / 90 0 0 1 0 stan: schorzenie soff8 Gałęzie warunkowe (8-bitowe przesunięcie ze znakiem)
- 0 0 1 0 0 0 0 0 soff8 Etykieta JRA Odgałęzienie zawsze (prawda)
- 0 0 1 0 0 0 0 1 soff8 Etykieta JRF Oddział nigdy (fałsz)
- 0 0 1 0 0 0 1 0 soff8 Etykieta JRUGT Rozgałęzienie, jeśli bez znaku większe niż (C = 0 i Z = 0)
- 0 0 1 0 0 0 1 1 soff8 Etykieta JRULE Rozgałęzienie, jeśli bez znaku mniejszy lub równy (C = 1 lub Z = 1)
- 0 0 1 0 0 1 0 0 soff8 Etykieta JRNC Oddział, jeśli nie ma przeniesienia (C = 0)
- 0 0 1 0 0 1 0 1 soff8 Etykieta JRC Branch if carry (C = 1)
- 0 0 1 0 0 1 1 0 soff8 Etykieta JRNE Rozgałęzienie, jeśli nie jest równe (Z = 0)
- 0 0 1 0 0 1 1 1 soff8 Etykieta JREQ Rozgałęzienie, jeśli równe (Z = 1)
- 0 0 1 0 1 0 0 0 soff8 Etykieta JRNV Odgałęzienie, jeśli nie przepełnienie (V = 0)
90 0 0 1 0 1 0 0 0 soff8 Etykieta JRNH Oddział, jeśli nie w połowie przeniesienia (H = 0)
- 0 0 1 0 1 0 0 1 soff8 Etykieta JRV Odgałęzienie w przypadku przepełnienia (V = 1)
90 0 0 1 0 1 0 0 1 soff8 Etykieta JRH Oddział, jeśli pół przeniesienia (H = 1)
- 0 0 1 0 1 0 1 0 soff8 Etykieta JRPL Rozgałęzienie, jeśli plus (N = 0)
- 0 0 1 0 1 0 1 1 soff8 Etykieta JRMI Rozgałęzienie jeśli minus (N = 1)
- 0 0 1 0 1 1 0 0 soff8 Etykieta JRSGT Rozgałęzienie, jeśli ze znakiem większym niż (S = 0 i N = V)
90 0 0 1 0 1 1 0 0 soff8 Etykieta JRNM Maska rozgałęzienia, jeśli nie przerwać (I = 0)
- 0 0 1 0 1 1 0 1 soff8 Etykieta JRSLE Odgałęzienie, jeśli podpisane mniejsze lub równe (S = 1 lub N ≠ V)
90 0 0 1 0 1 1 0 1 soff8 Etykieta JRM Rozgałęzienie w przypadku maskowania przerwań (I = 1)
- 0 0 1 0 1 1 1 0 soff8 Etykieta JRSGE Odgałęzienie, jeśli podpisane większe lub równe (N = V)
90 0 0 1 0 1 1 1 0 soff8 Etykieta JRIL Rozgałęzienie, jeśli linia przerwania jest niska
- 0 0 1 0 1 1 1 1 soff8 Etykieta JRSLT Oddział, jeśli podpisany mniej niż (N ≠ V)
90 0 0 1 0 1 1 1 1 soff8 Etykieta JRIH Rozgałęzienie, jeśli linia przerwania jest wysoka
prefiks 0 tryb kod operacji operand Instrukcje jednoargumentowe
- 0 0 0 0 kod operacji addr8 OP ( addr8 , SP) Względny wskaźnik stosu
- 0 0 1 1 kod operacji addr8 Adres OP 8 8-bitowy adres bezwzględny
72 0 0 1 1 kod operacji addr16 OP [ addr16 ] 16-bitowy adres pośredni
92 0 0 1 1 kod operacji addr8 OP [ addr8 ] 8-bitowy adres pośredni o 16-bitowym adresie
- 0 1 0 0 kod operacji - OP A Akumulator
72/90 0 1 0 0 kod operacji addr16 OP ( addr16 , X / Y) Indeksowane z 16-bitowym przesunięciem
- / 90 0 1 0 1 kod operacji - OPW X / Y Rejestr X / Y (operacja 16-bitowa)
72 0 1 0 1 kod operacji addr16 Adres OP 16 16-bitowy adres
- / 90 0 1 1 0 kod operacji addr8 OP ( addr8 , X / Y) 8-bitowy adres plus X / Y
72 0 1 1 0 kod operacji addr16 OP ([ addr16 ], X) 16-bitowy adres pośredni plus X
92/91 0 1 1 0 kod operacji addr8 OP ([ addr8 ], X / Y) 8-bitowy adres pośredni plus X / Y
- / 90 0 1 1 1 kod operacji - OP (X / Y) Indeksowane bez przesunięcia
prefiks 0 tryb 0 0 0 0 operand Operand NEG Negacja uzupełnienia do dwóch
0 tryb 0 0 0 1 (przeniesiony do operacji wymiany; patrz następna sekcja)
0 tryb 0 0 1 0 (przydzielony do innych operacji; patrz następna sekcja)
prefiks 0 tryb 0 0 1 1 operand Operand CPL Uzupełnienie jednych, logiczne nie
prefiks 0 tryb 0 1 0 0 operand SRL operand Shift w prawo logiczne, msbit wyczyszczony, lsbit do przeniesienia: (operand: C): = (0: operand)
0 tryb 0 1 0 1 (przydzielony do innych operacji; patrz następna sekcja)
prefiks 0 tryb 0 1 1 0 operand Operand RRC Obróć w prawo przez przeniesienie, (operand: C): = (C: operand)
prefiks 0 tryb 0 1 1 1 operand Operand SRA Przesunięcie arytmetyki w prawo, zachowane msbit, przeniesienie lsbit
prefiks 0 tryb 1 0 0 0 operand Operand SLL Przesuń w lewo, msbit do przeniesienia: (C: operand): = (operand: 0)
prefiks 0 tryb 1 0 0 1 operand Operand RLC Obróć w lewo przez przeniesienie, (C: operand): = (operand, C)
prefiks 0 tryb 1 0 1 0 operand Operand DEC Zmniejszenie; N i Z ustawione, przenoszenie nienaruszone
0 tryb 1 0 1 1 (przydzielony do innych operacji; patrz następna sekcja)
prefiks 0 tryb 1 1 0 0 operand Argument INC Przyrost; N i Z ustawione, przenoszenie nienaruszone
prefiks 0 tryb 1 1 0 1 operand Operand TNZ Test niezerowy: ustaw N i Z na podstawie wartości argumentu
prefiks 0 tryb 1 1 1 0 operand SWAP operand Zamiana połówek operandu (4-bitowy obrót; 8-bitowy dla SWAPW X i SWAPW Y)
prefiks 0 tryb 1 1 1 1 operand Argument CLR Ustaw operand na 0, N wyczyszczony, Z ustawiony
prefiks 0 tryb kod operacji operand Ponownie przypisane opodes [03-7] [125B] z zakresu jednego argumentu
- / 90 0 0 0 0 0 0 0 1 - RRWA X / Y Obróć słowo w prawo przez A: 8-bitowy obrót w prawo z 24-bitową konkatenacją X / Y i A; (X: A): = (A: X)
- 0 0 1 1 0 0 0 1 addr16 EXG A, adr16 Wymień A z pamięcią
- 0 1 0 0 0 0 0 1 - EXG A, XL Wymień A na X (dolna połowa)
- 0 1 0 1 0 0 0 1 - EXGW X, Y Zamień X na Y (16 bitów)
- 0 1 1 0 0 0 0 1 - EXG A, YL Zamień A na Y (dolna połowa)
- 0 1 1 1 0 0 0 1 - (zarezerwowany)
- / 90 0 0 0 0 0 0 1 0 - RLWA X / Y Obróć słowo w lewo do A: 8-bitowy obrót w lewo z 24-bitową konkatenacją X / Y i A; (A: X): = (X: A)
- 0 0 1 1 0 0 1 0 addr16 Adres POP 16 Wyskakuj ze stosu
- / 90 0 1 0 0 0 0 1 0 - MUL X / Y, A X / Y: = XL / YL × A
- 0 1 0 1 0 0 1 0 imm8 SUBW SP, # imm SP: = SP - imm8
- / 90 0 1 1 0 0 0 1 0 - DIV X / Y, A Podziel X / Y przez A; 16-bitowy iloraz w X / Y, reszta w A
- 0 1 1 1 0 0 1 0 - PREFIKS Prefiks instrukcji 72 : modyfikuj następujący kod operacji
0 0 0 0 0 1 0 1 - (zarezerwowany)
- 0 0 1 1 0 1 0 1 imm8 addr16 Adres MOV 16 , # imm8 Przenieś natychmiast do pamięci (flagi bez zmian)
- 0 1 0 0 0 1 0 1 addr8 addr8 MOV adr8 , adr8 Przenieś pamięć do pamięci (flagi bez zmian)
- 0 1 0 1 0 1 0 1 addr16 addr16 Adres MOV 16 , Adres 16 Przenieś pamięć do pamięci (flagi bez zmian)
- 0 1 1 0 0 1 0 1 - DIVW X, Y Podziel X przez Y (16 bitów); iloraz w X, reszta w Y
0 1 1 1 0 1 0 1 - (zarezerwowany)
0 0 0 0 1 0 1 1 - (zarezerwowany)
- 0 0 1 1 1 0 1 1 addr16 Adres PUSH 16 Wepchnij na stos
- 0 1 0 0 1 0 1 1 imm8 PUSH # imm8 Wepchnij na stos
- 0 1 0 1 1 0 1 1 imm8 ADDW SP, # imm8 SP: = SP + imm8
- 0 1 1 0 1 0 1 1 addr8 LD ( addr8 , SP), A. Przechowywać względem stosu
- 0 1 1 1 1 0 1 1 addr8 LD A, ( addr8 , SP) Załaduj względem stosu
- 1 0 0 kod operacji - Różne instrukcje. Brak niejawnie ustawia kody warunków.
- 1 0 0 0 0 0 0 0 - IRET Powrót z przerwania (pop CC, A, X, Y, PC)
- 1 0 0 0 0 0 0 1 - GNIĆ Prześlij 16-bitowy adres zwrotny ze stosu na komputer
- 1 0 0 0 0 0 1 0 addr24 INT Specjalny skok dla tablicy wektorów przerwań
- 1 0 0 0 0 0 1 1 - PUŁAPKA Przerwanie pułapki siłowej
- 1 0 0 0 0 1 0 0 - POP A Pop A ze stosu
- / 90 1 0 0 0 0 1 0 1 - POPW X / Y Zdejmij X / Y ze stosu (16 bitów)
- 1 0 0 0 0 1 1 0 - POP CC Zdejmij kody warunków ze stosu
- 1 0 0 0 0 1 1 1 - RETF Prześlij 24-bitowy adres zwrotny ze stosu na komputer
- 1 0 0 0 1 0 0 0 - PUSH A Wepchnij A na stos
- / 90 1 0 0 0 1 0 0 1 - PUSHW X / Y Wepchnij X / Y na stos (16 bitów)
- 1 0 0 0 1 0 1 0 - PUSH CC Wypchnij kody warunków na stos
- 1 0 0 0 1 0 1 1 - PRZERWA Zatrzymaj debugera, jeśli jest obecny, lub NOP
- 1 0 0 0 1 1 0 0 - CCF Uzupełnienie (przełączanie) flagi przenoszenia
- 1 0 0 0 1 1 0 1 addr24 CALLF addr24 Push 24-bitowy komputer; PC: = addr24
92 1 0 0 0 1 1 0 1 addr16 CALLF [ addr16 ] Pośrednie połączenie dalekie; adres ma 24-bitowy wskaźnik
- 1 0 0 0 1 1 1 0 - POSTÓJ Zatrzymaj procesor i zegary
- 1 0 0 0 1 1 1 1 - WFI Poczekaj na przerwanie, zatrzymanie procesora, ale nie zegary
72 1 0 0 0 1 1 1 1 - WFE Czekaj na zdarzenie (koprocesor), normalna obsługa przerwań podczas oczekiwania
- 1 0 0 1 0 0 0 0 - PDY Prefiks instrukcji 90 : zamień X i Y w następnej instrukcji
- 1 0 0 1 0 0 0 1 - PIY Prefiks instrukcji 91 : PDY plus PIX
- 1 0 0 1 0 0 1 0 - SZKATUŁKA Prefiks instrukcji 92 : użyj pośredniej pamięci 8-bitowej dla argumentu
- / 90 1 0 0 1 0 0 1 1 - LDW X / Y, Y / X X / Y: = Y / X
- / 90 1 0 0 1 0 1 0 0 - LDW SP, X / Y SP: = X / Y
- / 90 1 0 0 1 0 1 0 1 - LD XH / YH, A. XH / YH: = A
- / 90 1 0 0 1 0 1 1 0 - LDW X / Y, SP X / Y: = SP
- / 90 1 0 0 1 0 1 1 1 - LD XL / YL, A. XL / YL: = A
- 1 0 0 1 1 0 0 0 - RCF Zresetuj (wyczyść) flagę przenoszenia
- 1 0 0 1 1 0 0 1 - SCF Ustaw flagę nośną
- 1 0 0 1 1 0 1 0 - OBRĘCZ Zresetuj maskę przerwań (włącz przerwania)
- 1 0 0 1 1 0 1 1 - SIM Ustaw maskę przerwań (wyłącz przerwania)
- 1 0 0 1 1 1 0 0 - RVF Zresetuj (wyczyść) flagę przepełnienia
- 1 0 0 1 1 1 0 1 - NOP Bez operacji
- / 90 1 0 0 1 1 1 1 0 - LD A, XH / YH Odp .: = XH / YH
- / 90 1 0 0 1 1 1 1 1 - LD A, XL / YL Odp .: = XL / YL
Prefiks 1 tryb kod operacji operand Instrukcje dwuargumentowe A: = A operand op
- 0 0 0 1 kod operacji addr8 OP ( addr8 , SP) Operand względem stosu (patrz wyżej; kody rozkazowe 16, 17, 1C, 1D nie są zgodne z wzorcem)
- 1 0 1 0 kod operacji imm8 OP # imm8 8-bitowy natychmiastowy operand (zabroniony jako miejsce docelowe)
- 1 0 1 1 kod operacji addr8 Adres OP 8 8-bitowy adres bezwzględny (zabroniony dla skoku / połączenia)
- 1 1 0 0 kod operacji addr16 Adres OP 16 16-bitowy adres bezwzględny
72 1 1 0 0 kod operacji addr16 OP [ addr16 ] 16-bitowy adres pośredni
92 1 1 0 0 kod operacji addr8 OP [ addr8 ] 8-bitowy adres pośredni o 16-bitowym adresie
- / 90 1 1 0 1 kod operacji addr16 OP ( addr16 , X / Y) Indeksowane z 16-bitowym przesunięciem
72 1 1 0 1 kod operacji addr16 OP ([ addr16 ], X) 16-bitowy pośredni + X
92/91 1 1 0 1 kod operacji addr16 OP ([ addr8 ], X / Y) 8-bitowy pośredni + X / Y
- / 90 1 1 1 0 kod operacji addr8 OP ( addr8 , X / Y) Indeksowane z 8-bitowym przesunięciem
- / 90 1 1 1 1 kod operacji - OP (X / Y) Indeksowane bez przesunięcia
prefiks 1 tryb 0 0 0 0 operand SUB A, argument A: = A - operand
prefiks 1 tryb 0 0 0 1 operand CP A, operand Porównaj A - operand
prefiks 1 tryb 0 0 1 0 operand SBC A, operand A: = A - operand - C odejmij z pożyczką
prefiks 1 tryb 0 0 1 1 operand CPW X / Y, operand Porównaj X / Y - operand (16 bitów); porównaj Y / X, jeśli tryb operandu jest indeksowany przez X / Y (opkody D3, E3, F3)
prefiks 1 tryb 0 1 0 0 operand AND A, operand A: = A & operand, bitowe i
prefiks 1 tryb 0 1 0 1 operand BCP A, operand Test bitowy A & operand
prefiks 1 tryb 0 1 1 0 operand LD A, operand A: = operand
prefiks 1 tryb 0 1 1 1 operand Operand LD , A Argument: = A (tryb 2 LD # imm8, ponowne przypisanie A , patrz poniżej)
prefiks 1 tryb 1 0 0 0 operand XOR A, operand O: = A ^ operand, wyłączny-lub
prefiks 1 tryb 1 0 0 1 operand ADC A, operand A: = A + operand + C, dodaj z przeniesieniem
prefiks 1 tryb 1 0 1 0 operand OR A, operand Odp .: = A | operand, włącznie lub
prefiks 1 tryb 1 0 1 1 operand DODAJ A, operand A: = A + operand
prefiks 1 tryb 1 1 0 0 operand Argument JP Niskie 16 bitów PC: = operand, bezwarunkowy skok ( ponownie przypisane tryby 2 JP # imm8 i 3 JP addr8 , patrz poniżej)
prefiks 1 tryb 1 1 0 1 operand CALL operand Push 16-bitowy PC, niskie 16 bitów PC: = operand ( ponownie przypisane tryby 2 CALL # imm8 i 3 CALL addr8 , patrz poniżej)
prefiks 1 tryb 1 1 1 0 operand LDW X / Y, operand Załaduj X / Y: = operand; użyj 16 zamiast 90 1E dla LDW Y, ( addr8 , SP)
prefiks 1 tryb 1 1 1 1 operand Operand LDW , X / Y Argument: = X / Y (16-bitowy, tryb 2 LD # imm8, przypisany ponownie X , patrz poniżej); zapisz Y / X, jeśli tryb operandu jest indeksowany przez X / Y (opkody DF, EF, FF); użyj 17 zamiast 90 1F dla LDW ( addr8 , SP), Y
Prefiks 1 tryb kod operacji operand Ponownie przypisane rozkazy A7, AC, BC, AD, BD, AF z zakresu dwuargumentowego
- / 90 1 0 1 0 0 1 1 1 addr24 LDF ( adres24 , X / Y), A. Załaduj daleko (= LD # imm8, A )
92/91 1 0 1 0 0 1 1 1 addr16 LDF ([ adr16 ], X / Y), A 16-bitowy adres 24-bitowego wskaźnika
- 1 0 1 0 1 1 0 0 addr24 Adres JPF 24 PC: = addr24 (= JP # imm8 )
92 1 0 1 0 1 1 0 0 addr16 JPF [ addr16 ] Pośredni skok w dal; adres ma 24-bitowy wskaźnik
- 1 0 1 1 1 1 0 0 addr24 LDF A, adres 24 Wczytaj daleko (= JP addr8 )
92 1 0 1 1 1 1 0 0 addr16 LDF A, [ adres16 ] Załaduj daleko, 16-bitowy adres 24-bitowego wskaźnika
- 1 0 1 0 1 1 0 1 soff8 Etykieta CALLR Push 16-bitowy PC, PC: = PC + operand (= CALL # imm8 )
- 1 0 1 1 1 1 0 1 addr24 Adres LDF 24 , A. Argument: = A (= CALL adr8 )
92 1 0 1 1 1 1 0 1 addr16 LDF [ adr16 ], A Argument: = A, 16-bitowy adres 24-bitowego wskaźnika
- / 90 1 0 1 0 1 1 1 1 addr24 LDF A, ( addr24 , X / Y) Załaduj daleko (= LDW # imm8, X )
92/91 1 0 1 0 1 1 1 1 addr16 LDF A, ([ addr16 ], X / Y) 16-bitowy adres 24-bitowego wskaźnika
72 1 tryb kod operacji operand Arytmetyka rejestru indeksowego (16-bitowa) X / Y: = X / Y ± operand
72 1 0 1 0 kod operacji imm16 OPW X / Y, # imm16 16-bitowe natychmiastowe
72 1 0 1 1 kod operacji addr16 OPW X / Y, adres 16 16-bitowe absolutne
72 1 1 1 1 kod operacji addr8 OPW X / Y, ( addr8 , SP) Stosunek względny
72 1 tryb 0 0 0 0 operand SUBW X, argument X: = X - operand (preferowany kod operacji 1D dla SUBW X, # imm16 )
72 1 tryb 0 0 1 0 operand SUBW Y, argument Y: = Y - operand
72 1 tryb 1 0 0 1 operand ADDW Y, operand Y: = Y + operand
72 1 tryb 1 0 1 1 operand ADDW X, argument X: = X + operand (preferuj kod operacji 1C dla ADDW X, # imm16 )

W przypadku instrukcji CPW i LDW, w których tryb adresowania argumentów jest indeksowany przez X, STM8 domyślnie używa rejestru Y zamiast X. Zastosowanie 90 przedrostka powoduje wymianę X i Y, więc rejestr jest X, a tryb adresowania jest indeksowany przez Y.

Bibliografia

Linki zewnętrzne