Osmibitové mikrořadiče s jádry S08 a RS08

24. 11. 2016
Doba čtení: 21 minut

Sdílet

I přes velký úspěch 32bitových mikrořadičů postavených na architektuře ARM Cortex-M se v praxi často setkáme i s různými osmibitovými mikrořadiči. Mezi rozšířené čipy patří i mikrořadiče s jádry S08 a RS08.

Obsah

1. Osmibitové mikrořadiče s jádry S08 a RS08

2. Předchůdci jader S08 a RS08

3. Motorola 68HC05

4. Motorola 68HC08

5. Odlišná větev vývoje – Motorola 68HC11

6. Programátorský pohled na jádra S08

7. Adresovací režimy jader S08

8. Instrukční sada mikrořadičových jader S08

9. Aritmetické instrukce

10. Logické instrukce

11. Aritmetické posuny, bitové posuny a rotace

12. Podmíněné i nepodmíněné skoky

13. Instrukce Booleovského procesoru

14. Přesuny dat a další operace

15. Odkazy na Internetu

1. Osmibitové mikrořadiče s jádry S08 a RS08

V seriálu o architekturách počítačů a mikroprocesorů jsme si již popsali hned několik typů osmibitových mikrořadičů. Mj. se jednalo i o mikrořadiče s jádrem H8/300 a H8/300L, které byly navrženy ve společnosti Hitachi. Dnes se budeme zabývat taktéž osmibitovými mikrořadiči, které však budou od zmíněné H8/300 v mnoha ohledech odlišné (řada H8 má mnoho charakteristik RISCové architektury, což se o dnes popisovaných čipech říci nedá). Jedná se o mikrořadiče s jádry S08 popř. RS08. Tato jádra jsou odvozena od „prastarého“ mikroprocesoru Motorola 6800 (1974), na jehož základě vznikly první mikrořadiče nabízené společností Motorola. Později se celý segment výroby polovodičových čipů od Motoroly oddělil do samostatné firmy Freescale Semiconductor, která je dnes vlastněna společností NXP. Proto všechny v současnosti vyráběné osmibitové mikrořadiče s jádry S08 a RS08 nalezneme právě na stránkách této společnosti.

Obrázek 1: V současnosti mají nejmenší čipy s jádry RS08 pouze osm pinů a jsou tedy v tomto ohledu (a to i cenově) srovnatelné s řadou PIC10F popř. s nepatrně výkonnější řadou PIC12.

Mikrořadiče, které jsou založeny na jádrech S08 a především pak na jádrech RS08, dnes obsazují zejména tu oblast trhu, kde se požadují jednoduché mikrořadiče s malým výkonem, malými rozměry a především pak nízkým příkonem (zařízení napájená monočlánkem apod.). Těmto požadavkům odpovídá i cena čipů, která začíná na 37 centech, což znamená, že tyto čipy mohou konkurovat řadě PIC10F (což jsou vlastně „programovatelné součástky“). Podívejme se na dvě typické konfigurace:

  • Jádro RS08, čip s šesti až 20 piny, frekvence CPU 10MHz, kapacita FLASH ROM 1 až 8 kB, kapacita RAM 64, 128 nebo 256 bajtů, 2–18 GPIO, komparátor, volitelný ADC, volitelný I2C, volitelný časovač a interní hodiny. Cena od 37 centů.
  • Jádro S08, frekvence CPU 20 MHz až 40 MHz, počet GPIO zvýšen až na 20, přidán PWM, volitelně další časovač, SPI, SCI atd. Cena cca 68 centů a výše (podle konkrétního vybavení).
.

Obrázek 2: Největší čipy s jádry S08 vlastně již částečně zasahují do segmentu, v němž se setkáme se 16bitovými mikrořadiči a taktéž se slavnými RISCovými jádry ARM Cortex M (32bitové čipy).
Zdroj: Freescale Semiconductor, Data Sheet, Document Number: MC9S08LC60

2. Předchůdci jader S08 a RS08

Mikrořadičová jádra S08 a RS08 jsou odvozena od mikrořadičových jader 68HC08 navržených a vyráběných ještě ve společnosti Motorola. Samotná řada 68HC08 je odvozena od starších a dnes již nevyráběných mikrořadičů s jádry 68HC05, které vznikly zjednodušením slavných osmibitových mikroprocesorů Motorola 6800. Nesmíme zapomenout ani na čip 68HC11 (taktéž již nevyvíjený), který však není s řadou S08 plně kompatibilní a je zde uveden jen pro úplnost. V následující tabulce jsou uvedeny rozdíly mezi „programátorskými modely“ jednotlivých mikrořadičů a mikroprocesorů:

Čip Typ Akumulátor(y) D=A+B (16b) Index registr(y) Čítač instrukcí Zásobníkové registry Spec. registry
MC6800 CPU A (8b), B (8b) ne X (16b) PC (16b) SP (16b) CCR (6b)
68HC05 MCU A (8b) ne X (8b) PC (13b) SP (13b) CCR (5b)
68HC08 MCU A (8b) ne H:X (16b) PC (16b) SP (16b) CCR (6b)
68HC11 MCU A (8b), B (8b) ano X (16b), Y (16b) PC (16b) SP (16b) CCR (8b)
S08 MCU A (8b) ne H:X (16b) PC (16b) SP (16b) CCR (6b)
RS08 MCU A (8b) ne X (8b) PC (14b) + SPS (14bit) × CCR (2b)

Můžeme zde vidět, že sada registrů je pojata minimalisticky, na rozdíl od již zmíněných čipů H8/300. I z tohoto důvodu nemusí být binární kód generovaný překladači céčka pro procesory S08/RS08 příliš efektivní (ostatně totéž platí i pro MCS-51 a mnohé další osmibitové mikrořadiče, které vznikly na základě architektur navržených před třiceti či dokonce čtyřiceti lety).

Poznámka: instrukční sady jsou částečně kompatibilní, ale především na úrovni zdrojových kódů (psaných v assembleru). Instrukční sady se totiž postupně vyvíjely. Největší změny se týkají použití různých adresovacích režimů, podpory pro instrukce Booleovského procesoru, rozšíření sady registrů (asi nejznámější jsou prefixy instrukcí u 68HC11 při použití index registru Y) apod.

Obrázek 3: Vývoj osmibitových a později i šestnáctibitových mikroprocesorů a mikrořadičů společnosti Motorola (později Freescale, nyní NXP).

3. Motorola 68HC05

Po vzniku osmibitového mikroprocesoru (nikoli mikrořadiče!) MC6800 firma Motorola navrhla a posléze i realizovala dvě další varianty tohoto čipu, které se některými svými vlastnostmi blížily plnohodnotným mikrořadičům. Prvním z těchto čipů byl MC6802 z roku 1977 (pozor, neplést s MOS 6502), který obsahoval kromě vlastního řadiče a CPU i 128 bajtů paměti RAM, interní oscilátor (nemusel se tedy připojovat externí zdroj hodinových signálů, postačoval pouze 4 MHz krystal pro synchronizaci) a spolu s čipem označeným MC6846 (2kB paměti ROM, osmibitový obousměrný port a časovač) bylo možné vytvořit jednoduchý dvoučipový mikropočítač, což se již v mnoha ohledech blížilo ke klasickému mikrořadiči.

Následoval čip MC6801 (číslování je, pravda, poněkud neobvyklé), který obsahoval taktéž 128 bajtů paměti RAM, navíc však na tomto čipu byla přítomna i paměť ROM s kapacitou 2 kB (zpočátku jen PROM programovatelná jedenkrát), šestnáctibitový časovač, sériový port a 31 programovatelných I/O linek (dnes by se označovaly GPIO). Jednalo se o jeden z prvních mikroprocesorů (nebo vlastně už mikrořadičů), u nichž bylo možné oba osmibitové akumulátory A a B spojit do jednoho šestnáctibitového akumulátoru označovaného písmenem D (double accumulator).

Ovšem tento čip (s cca 35000 tranzistory) byl poměrně drahý a proto se používal pouze v automobilovém průmyslu a nikoli ve spotřební elektronice. Společnost Motorola proto posléze tento čip poměrně podstatným způsobem zjednodušila a začala ho nabízet pod novým označením MC6805. Od tohoto mikrořadiče je již malý krůček k 68HC05, jímž se budeme zabývat v následujícím textu. Jak jsme si již řekli, jedná se o zjednodušenou variantu čipu MC6801, což mj. znamená, že se počet pracovních registrů zmenšil na pět (je použit jen jeden osmibitový akumulátor), indexový registr má šířku pouze osm bitů a taktéž čítač instrukcí má sníženou šířku na 13 bitů, protože paměť nainstalovaná na mikrořadiči má menší kapacitu než teoreticky dosažitelných 64 kB (podobné umělé zmenšení adresových registrů nebylo nijak neobvyklé):

Označení Šířka Název registru Význam registru
A 8 b accumulator A jediný universální pracovní registr
X 8 b index register používán při adresování operandů
PC 16 b (13 použito) program counter používán při adresování instrukcí
SP 16 b stack pointer použit při operacích se zásobníkem
CCR 5 b condition code register obsahuje příznakové bity

Obrázek 4: Interní struktura mikrořadičů M68HC05 popisovaných v této kapitole.
(Zdroj: Freescale Semiconductor, Ltd. MC68HC05B6/D Rev. 4.1 08/2005)

Instrukční soubor se u čipů 68HC05 taktéž v některých ohledech odlišoval od původní MC6800. Zejména byla přidána instrukce pro celočíselné násobení (X:A = A×X) trvající 11 cyklů a navíc se objevily instrukce (podobné instrukcím známým z MCS-51), které umožňovaly přímou manipulaci s jednotlivými bity uloženými v prvních 256 bajtech paměti: BSET (bit set), BCLR (bit clear), BRSET (branch if bit is set) a BRCLR (branch if bit is clear). Taktéž možnosti adresování byly poněkud odlišné: bylo možné provádět přímé adresování prvních 256 bajtů, rozšířené adresování (16 bitů adresy), adresování přes index registr a adresování přes index registr a osmibitový či šestnáctibitový posun (offset).

Obrázek 5: Základní zapojení mikrořadiče M68HC05.
(Zdroj: Freescale Semiconductor, Ltd. MC68HC05B6/D Rev. 4.1 08/2005)

Základní model procesoru 68HC05 měl na jediném čipu 176 bajtů RAM, 5936 bajtů ROM, 256 bajtů EEPROM, tři osmibitové I/O porty, šestnáctibitový čítač/časovač, sériové rozhraní SCI, jeden osmibitový A/D převodník a konečně modul pro PWM (pulsní šířkovou modulaci). Existovaly však i další varianty tohoto procesoru, z nichž některé měly až 32 kB ROM či EPROM, větší kapacitu paměti RAM, nainstalovanou rutinu ve firmware, která umožňovala komunikaci s PC přes sériový port (později se tato rutina vyvinula ve známé BUFFALO) atd.

Obrázek 6: Instrukční sada mikrořadiče M68HC05.
(Zdroj: Freescale Semiconductor, Ltd. MC68HC05B6/D Rev. 4.1 08/2005)

4. Motorola 68HC08

Dalším osmibitovým mikrořadičem, který byl navržen firmou Motorola a který je kupodivu nabízen dodnes (i když s celkem logickým dovětkem „Not Recommended for New Design“) je mikrořadič nesoucí označení 68HC08. Jedná se o v mnoha směrech vylepšenou variantu původního mikrořadiče 68HC05, který svým uživatelům nabízel jak větší množství vstupně-výstupních portů, více časovačů a osmikanálový analogově-digitální převodník, tak i rozšířenou kapacitu pamětí ROM a RAM.

Obrázek 7: Zapojení pinů osmibitového mikrořadiče 68HC08 popsaného v této kapitole.
(Zdroj: Technical Data – MC68HC08AB16A, Freescale Semiconductor)

Došlo i ke změně v konfiguraci registrů a rozšíření instrukční sady tohoto mikrořadiče – zejména byly přidány nové adresní režimy, které umožňovaly lépe využít zvětšenou kapacitu pamětí ROM a RAM. V následující tabulce jsou vypsány všechny registry centrální procesorové jednotky, které mohly být využity při programování v assembleru. Povšimněte si především toho, že došlo k rozšíření původně osmibitového indexového registru X na šestnáctibitový registr H:X, jehož obě osmibitové části lze v případě potřeby zpracovávat odděleně. Taktéž se rozšířila bitová šířka registrů PC a SP na plných šestnáct bitů:

Označení Šířka (b) Využito bitů Název registru Význam registru
A 8 8 accumulator A jediný universální pracovní registr
H:X 16 16 index register používán při adresování operandů
PC 16 16 program counter používán při adresování instrukcí
SP 16 16 stack pointer použit při operacích se zásobníkem
CCR 8 6 condition code register obsahuje příznakové bity

Obrázek 8: Interní struktura mikrořadiče 68HC08.
(Zdroj: Technical Data – MC68HC08AB16A, Freescale Semiconductor)

Došlo i k rozšíření počtu příznaků uložených v registru CCR – nyní již bylo možné používat příznak V (overflow) nastavovaný mnoha aritmetickými operacemi.

Obrázek 9: Instrukční sada mikrořadiče 68HC08.
(Zdroj: Technical Data – MC68HC08AB16A, Freescale Semiconductor)

5. Odlišná větev vývoje – Motorola 68HC11

Částečně paralelně s větví 68HC05 → 68HC08 → S08 se vyvíjely mikrořadiče s označením 68HC11, které patřily mezi nejpoužívanější mikrořadiče vůbec. Jádra 68HC11 jsou sice interně, podobně jako jejich předchůdci, postavena na osmibitovém jádru (aritmeticko-logická jednotka + řadič zpracovávající instrukce s osmibitovými operačními kódy), ovšem z programátorského hlediska se jedná o čip umožňující provádění některých výpočtů i adresování se šestnáctibitovými operandy. Z tohoto hlediska se jedná o přechod mezi čistě osmibitovým a 16bitovým mikrořadičem, což může být výhodné, protože programátor není (například při adresování) omezován nutností používat osmibitové adresy či osmibitové indexové registry, ale celková cena čipu (a taktéž jeho příkon!) je díky převážně osmibitové aritmeticko-logické jednotce stále velmi příznivá, v čemž lze spatřovat jeden z důvodů, proč se osmibitové mikrořadiče stále používají.

Obrázek 10: Mikrořadič 68HC11 řady E v 64pinovém pouzdru typu QFP.

Programátoři vytvářející programy pro mikrořadič 68HC11 mohou používat dvojici osmibitových pracovních registrů A a B, které se však u některých instrukcí spojují do jediného šestnáctibitového registru nazvaného D (double accumulator). Kromě těchto registrů, které jsou převážně používány jako operandy aritmetických, logických a bitových instrukcí, je možné využít i indexové registry IX a IY (někdy jsou tyto registry pojmenované pouze X a Y), jež se používají především při adresování operandů ležících v paměti, popř. jako čítače programových smyček.

Obrázek 11: Mikrořadič 68HC11 řady E v 48pinovém pouzdru typu DIP.

V množině registrů použitelných vývojáři samozřejmě najdeme i šestnáctibitový programový čítač PC (program counter), taktéž šestnáctibitový ukazatel na vrchol zásobníku SP (stack pointer) a osmibitový registr CCR (condition codes register), který v sobě sdružuje osmici jednobitových příznaků vyžívaných například při konstrukci podmínek (což je obvykle nějaký test následovaný podmíněným skokem). Na tomto místě možná stojí za připomenutí, že mikrořadič 68HC11 je založen na původním osmibitovém mikroprocesoru MC6800; nikoli tedy na mikroprocesoru MC6809. To je trošku škoda, protože mikroprocesor MC6809 byl kvůli své téměř ortogonální instrukční sadě, existenci rozmanitých adresních režimů i přítomnosti druhého ukazatele na vrchol zásobníku U z programátorského hlediska mnohem flexibilnějším čipem (traduje se, že se jednalo o jeden z posledních mikroprocesorů s ručně optimalizovaným a „zadrátovaným“ mikrořadičem).

6. Programátorský pohled na jádra S08

Důležitá poznámka: nyní se budeme zabývat především jádry S08, protože jádra RS08 mají odlišné vlastnosti, jejichž popisu bude věnován samostatný článek.

Programátorský model mikrořadičových jader S08 se nijak zásadně neliší od 68HC08. To mj. znamená, že k dispozici je šest registrů (z toho pouze jeden akumulátor), přičemž indexové registry H a X je možné spojit a vytvořit tak šestnáctibitový indexový registr, s nímž je možné adresovat jakoukoli paměťovou buňku v rozsahu 0..64kB. Totéž platí o čítači instrukcí (PC) i ukazateli na vrchol zásobníku (SP):

Označení Šířka (b) Využito bitů Název registru Význam registru
A 8 8 accumulator A jediný universální pracovní registr
H:X 16 16 index register používán při adresování operandů
PC 16 16 program counter používán při adresování instrukcí
SP 16 16 stack pointer použit při operacích se zásobníkem
CCR 8 6 condition code register obsahuje příznakové bity

V registru CCR jsou uloženy příznakové bity. Tento registr má sice šířku osmi bitů, ovšem jen šest bitů je skutečně využito pro uložení příznaků. Zbylé dva bity jsou nastaveny na jedničku:

Bit# Označení příznaku Jméno příznaku Význam
7 V Overflow tento příznak je nastavený při přenosu ze šestého do sedmého bitu, což v případě znaménkové aritmetiky značí přetečení hodnoty čísla do bitu vyhrazeného pro znaménko
6 × × neobsazeno, trvale nastaveno na 1
5 × × neobsazeno, trvale nastaveno na 1
4 H Half-Carry Flag nastavený při přenosu ze třetího do čtvrtého bitu; tento příznak je použit při BCD aritmetice
3 I Interrupt Mask příznak, pomocí něhož lze povolit či naopak zakázat maskovatelné přerušení (IRQ)
2 N Negative Flag tento příznak je nastaven, pokud poslední aritmetická či logická operace vygenerovala záporný výsledek, tj. bajt s nejvyšším bitem rovným jedničce (0×80 až 0×FF)
1 Z Zero Flag tento příznak se nastaví, pokud poslední aritmetická či logická operace vygenerovala osmibitovou hodnotu 0×00, spolu s předchozím příznakem lze zjišťovat relace typu: <0 ≤0 =0 ≥0 >0 ≠0
0 C Carry Flag přetečení ze sedmého do (neexistujícího) osmého bitu při mnoha operacích (rotace, aritmetické operace); tento příznak je taktéž nastavovaný nebo nulovaný při bitových operacích v prvních 256 bajtech paměti

Poznámka: u jader RS08 je registr CCR omezen na pouhé dva bity – Carry flag a Zero flag. Navíc zde nenalezneme registr H a i adresovací režimy jsou odlišné.

7. Adresovací režimy jader S08

V předchozí kapitole jsme mohli vidět, že počet použitelných pracovních registrů je skutečně minimální. To mj. znamená, že se registry používají poněkud odlišným způsobem, než například na klasických RISCových procesorech či na mikrořadičích, které se RISCovým procesorům alespoň částečně podobají (H8/300, MSP430 atd.). Zásadní rozdíl spočívá v tom, že jeden z operandů je typicky uložen v akumulátoru, zatímco operand druhý je umístěn v operační paměti či v ROM (to je přesný opak RISCové architektury typu load & store). Tento druhý operand musí být efektivně dosažitelný; z tohoto důvodu podporují mikrořadičová jádra S08 a RS08 velké množství adresovacích režimů. Všechny podporované adresovací režimy jsou vypsány v následující tabulce:

# Název Zkratka Stručný popis
1 Inherent INH operand je umístěn v registru
2 Relative REL za instrukcí je osmibitový offset připočtený k PC
3 Immediate IMM za instrukcí je umístěna 8bit/16bit konstanta
4 Direct DIR za instrukcí je umístěna osmibitová adresa do nulté stránky
5 Extended EXT za instrukcí je umístěna 16bitová absolutní adresa
6 Indexed IX operand je adresován dvojicí H:X
7 Indexed with Post Increment IX+ dtto, ale dvojice H:X je zvýšena o jedničku
8 Indexed, 8-Bit Offset IX1 k hodnotě H:X je připočten osmibitový offset
9 Indexed, 16-Bit Offset IX2 k hodnotě H:X je připočten 16bitový offset
10 Indexed, 8-Bit Offset with Post Increment IX1+ kombinace (IX+) a (IX1)
11 SP-Relative, 8-Bit Offset SP1 podobné (REL), ovšem offset je přičten k SP
12 SP-Relative, 16-Bit Offset SP2 podobné (REL), ovšem offset je přičten k SP

Z předchozí tabulky nepřímo vyplývá, že instrukce mají proměnlivou délku, a to z toho důvodu, že za kód instrukce je nutné uložit i konstantu, osmibitový offset či šestnáctibitový offset.

8. Instrukční sada mikrořadičových jader S08

Instrukční soubor mikrořadičových jader S08 je sice relativně malý, ovšem celkový počet instrukčních kódů narůstá kvůli použití většího množství adresovacích režimů. To je ostatně jeden z důvodů, proč některé instrukce (není jich ovšem mnoho) používají jednobajtový prefix. Podobný koncept, i když pro jiné instrukce, bylo nutné použít i u výše zmiňovaných mikrořadičů 68HC11, u nichž se prefix používal u většiny instrukcí pracujících s indexovým registrem IY. U S08 naprostá většina instrukcí používá pro zakódování instrukce jediný bajt, který je v případě některých adresovacích režimů doplněn o osmibitový či šestnáctibitový offset.

V následující tabulce jsou instrukce jader S08 rozděleny podle své funkce do různých kategorií:

Z dále uvedeného seznamu instrukcí je patrné, jak zásadně je instrukční sada ovlivněna tím, že namísto sady pracovních registrů je k dispozici jen jediný akumulátor. Výhodou jsou kratší instrukční kódy, zásadní nevýhodou pak nutnost použití většího množství instrukcí při implementaci algoritmů (v porovnání s RISCovými sadami).

9. Aritmetické instrukce

Aritmetické instrukce obsahují základní operace pro součet a rozdíl, přičemž u instrukcí se dvěma operandy je jedním operandem vždy akumulátor a výsledek je taktéž uložen do akumulátoru. Poněkud netypické instrukce pro součin a podíl používají registry H a X, které jsou jinak použité především pro indexování. Další dvě instrukce pak zajišťují operace s ukazatelem na vrchol zásobníku a s indexovým „dvojregistrem“:

# Instrukce Stručný popis
1 ADD součet A = A + mem
2 ADC součet A = A + mem + carry
3 SUB rozdíl A = A – mem
4 SBC rozdíl A = A – mem – carry
     
5 MUL součin X:A = X × A
6 DIV podíl A = H:A / X, H = zbytek
     
7 AIS SP = SP + konstanta
8 AIX H:X = H:X + mem
     
9 INC inkrementace A, X, nebo mem
10 DEC dekrementace A, X, nebo mem
11 CLR vynulování A, X, nebo mem
12 NEG změna znaménka A, X, nebo mem
13 TST porovnání A, X nebo mem s nulou
     
14 CMP jako SUB, ale bez změny A
15 CPX porovnání X s mem
16 CPHX porovnání H:X s mem
     
17 DAA korekce výsledku pro součet v kódu BCD

Poznámka: mem je obsah paměti adresované některým z adresovacích režimů.

10. Logické instrukce

Kromě trojice klasických instrukcí AND, ORA a EOR (někde XOR) nalezneme v této skupině i instrukci pro negaci všech bitů v akumulátoru či v buňce operační paměti. Taktéž zde nalezneme instrukci BIT, která provádí tutéž operaci jako AND, ovšem změní pouze příznaky a nikoli již obsah akumulátoru:

# Instrukce Stručný popis
1 AND logický součin bit po bitu: A = A & mem
2 ORA logické součet bit po bitu: A = A | mem
3 EOR logická nonekvivalence: A = A ⊕ memm
     
4 COM negace A, X nebo mem
5 BIT jako AND ovšem beze změny A

11. Aritmetické posuny, bitové posuny a rotace

Všechny instrukce pro aritmetické i bitové posuny a rotace dokážou operand posunout o jediný bit, což mj. znamená, že tyto instrukce vyžadují pouze jediný operand. U aritmetických a logických posunů se přebytečný bit přesouvá do příznaku carry, u obou instrukcí pro rotaci je carry naopak devátým bitem v „posuvném registru“:

# Instrukce Stručný popis
1 LSL logický posun doleva (lze posouvat A, X či mem)
2 LSR logický posun doprava (-//-)
     
3 ASL pouze alias k instrukci LSL
4 ASR aritmetický posun doprava
     
5 ROL rotace doleva přes příznak carry
6 ROR rotace doprava přes příznak carry

12. Podmíněné i nepodmíněné skoky

Jediná instrukce nepodmíněného skoku JMP je zvláštní tím, že podporuje hned pět adresovacích režimů, včetně použití indexového registru. To mj. znamená, že tuto instrukci lze použít pro implementaci rozhodovacích tabulek apod. U instrukcí podmíněného skoku se používá vždy jen relativní adresování s osmibitovým offsetem. Instrukce BRA je vlastně jen variantou instrukce JMP, ovšem s jiným adresovacím režimem:

# Instrukce Stručný popis
1 JMP nepodmíněný skok
     
2 BRA nepodmíněný skok
3 BRN v podstatě instrukce NOP
4 BEQ skok za podmínky Z = 1
5 BNE skok za podmínky Z = 0
6 BCC skok za podmínky C = 0
7 BCS skok za podmínky C = 1
8 BPL skok za podmínky N = 0
9 BMI skok za podmínky N = 1
10 BIL skok za podmínky IRQ pin = 0
11 BIH skok za podmínky IRQ pin = 1
12 BMC skok za podmínky I = 0
13 BMS skok za podmínky I = 1
14 BHCC skok za podmínky H = 0
15 BHCS skok za podmínky H = 1
16 BLT skok za podmínky N ⊕ V = 1
17 BLE skok za podmínky Z | (N ⊕ V) = 1
18 BGE skok za podmínky N ⊕ V = 0
19 BGT skok za podmínky Z | (N ⊕ V) = )
20 BLS C | Z = 1
21 BHI C | Z = 0
     
22 CBEQ skok pokud A = mem
23 DBNZ dekrementace A, X nebo M se skokem, pokud je výsledek nenulový
     
24 JSR skok do podprogramu
25 BSR relativní skok do podprogramu
26 RTS návrat z podprogramu
27 RTI návrat z přerušovací rutiny

Užitečné jsou instrukce CBEQ (compare and branch if equal), což je instrukce odpovídající (až na negaci podmínky) instrukci CJNE známé z mikrořadičů MCS-51. Taktéž užitečná je instrukce DBNZ (decrement and branch if not zero), kterou lze použít pro implementaci počítaných programových smyček.

bitcoin školení listopad 24

13. Instrukce Booleovského procesoru

Čtveřice instrukce je určena pro manipulaci s prvními 256 bajty paměti na úrovni jednotlivých bitů. Jedná se o instrukci BCLR sloužící pro vynulování vybraného bitu, dále o instrukci BSET pro nastavení bitu do stavu logické jedničky. Hodnotu libovolného bitu lze testovat instrukcemi BRCLR (branch if clear) a BRSET (branch if set) – na základě hodnoty příslušného bitu je proveden relativní skok v rámci ± 127 bajtů a navíc je nastaven příznak carry. Každá ze zmíněných instrukcí je v sadě instrukcí použita osmkrát, protože součástí operačního kódu je i index nastavovaného, nulovaného či testovaného bitu. Tyto instrukce jsou, jako podobně navržené instrukce u mikrořadičů MCS-51, velmi užitečné, protože do prvních 256 adres paměti jsou adresovány řídicí registry (jejichž jednotlivé bity mají různý význam) i část uživatelské RAM.

# Instrukce Stručný popis
1 BCLR vynulování bitu v paměti
2 BSET nastavení bitu v paměti
     
3 BRCLR skok, pokud je bit v paměti nulový
4 BRSET skok, pokud je bit v paměti nastavený na 1

14. Přesuny dat a další operace

Zbylé instrukce slouží většinou pro přesuny dat mezi registry a pamětí, popř. pro jiné operace:

# Instrukce Stručný popis
1 LDA načtení bajtu do akumulátoru A
2 LDX načtení bajtu do index registru X
3 LDHX načtení dvou bajtů do H:X
     
4 STA uložení akumulátoru do mem
5 STX uložení index registru X do mem
6 STHX uložení dvojice H:X do mem
     
7 TAX přesun X=A
8 TXA přesun A=X
9 TAP přesun CCR=A
10 TPA přesun A=CCR
11 TXS přesun SP=H:X
12 TSX přesun H:X=SP
     
13 NSA prohození horních a spodních čtyř bitů v A
     
14 PSHA uložení akumulátoru A na zásobník
15 PSHX uložení index registru X na zásobník
16 PSHH uložení index registru H na zásobník
17 PULA obnovení akumulátoru A ze zásobníku
18 PULX obnovení index registru X ze zásobníku
19 PULH obnovení index registru H ze zásobníku
     
20 NOP NOP (na rozdíl od BRN má jen jeden bajt)
     
21 SEC nastavení C=1
22 CLC vynulování C=0
23 SEI nastavení I=1
24 CLI vynulování I=0
     
25 BGND pozastavení běhu programu
26 WAIT čekání na přerušení
27 STOP ukončení běhu programu a čekání na přerušení

15. Odkazy na Internetu

  1. 8-bit S08
    http://www.nxp.com/produc­ts/microcontrollers-and-processors/more-processors/8–16-bit-mcus/8-bit-s08:HCS08
  2. S08QB: 8-bit QB MCUs
    http://www.nxp.com/produc­ts/microcontrollers-and-processors/more-processors/8–16-bit-mcus/8-bit-s08/8-bit-s08–3.6v-mcus/8-bit-qb-mcus:S08QB
  3. 8-bit RS08
    http://www.nxp.com/produc­ts/microcontrollers-and-processors/more-processors/8–16-bit-mcus/8-bit-rs08:RS08FAMILY
  4. Wikipedia: Motorola 68HC05
    http://en.wikipedia.org/wi­ki/Motorola_68HC05
  5. Wikipedia: Freescale 68HC08
    http://en.wikipedia.org/wiki/68HC08
  6. Wikipedia: Freescale 68HC11
    http://en.wikipedia.org/wiki/68HC11
  7. Wikipedia: Freescale 68HC12
    http://en.wikipedia.org/wi­ki/Freescale_68HC12
  8. HC05 Processor Families
    http://www.freescale.com/we­bapp/sps/site/overview.jsp?no­deId=01624684498633
  9. HC08 Processor Families
    http://www.freescale.com/we­bapp/sps/site/overview.jsp?no­deId=01624684497663
  10. Digital Core Design 68HC08 – HDL IP Core
    http://www.dcd.pl/acore.php?idcore=82
  11. Freescale 68HC11
    http://www.freescale.com/we­bapp/sps/site/taxonomy.jsp?no­deId=01624684498635
  12. Lifecycle of a CPU:
    http://www.cpushack.net/life-cycle-of-cpu.html
  13. Great Microprocessors of the Past and Present (V 13.4.0)
    http://jbayko.sasktelwebsi­te.net/cpu.html
  14. SPI interface tutorial
    http://www.best-microcontroller-projects.com/spi-interface.html
  15. Serial Peripheral Interface Bus
    http://en.wikipedia.org/wi­ki/Serial_Peripheral_Inter­face_Bus
  16. What is SPI?
    http://www.fpga4fun.com/SPI1.html
  17. SPI – A simple implementation
    http://www.fpga4fun.com/SPI2.html
  18. Bit-banging
    http://en.wikipedia.org/wiki/Bit-banging
  19. Joint Test Action Group
    http://en.wikipedia.org/wiki/JTAG
  20. I2C
    http://en.wikipedia.org/wiki/I2C
  21. I2 Background
    http://www.microport.tw/blog­new.php?blog_no=7#theory
  22. H8/3802, 38002S, 38004, 38104 (manuály k čipům)
    https://www.renesas.com/en-us/document/hw-manual?hwLayerShowFlg=tru­e&prdLayerId=184&layerName=H8%252F3802%252C%2B38­002S%252C%2B38004%252C%2B38104&co­ronrService=document-prd-search&hwDocUrl=%2Fen-us%2Fdoc%2Fproducts%2Fmpum­cu%2F001%2Frej09b0024_h83802­.pdf&hashKey=c5e1fa0a18c01e6c789bc7­b5c0184ed9
  23. Addressing mode (Wikipedia)
    https://en.wikipedia.org/wi­ki/Addressing_mode
  24. Renesas SH Instruction Set Summary
    http://shared-ptr.com/sh_insns.html
  25. SH-4 RISC Processor by HITACHI
    http://www.cs.umd.edu/~me­esh/cmsc411/website/projec­ts/risc/risc.htm
  26. SH-4 RISC Processor
    http://www.cs.umd.edu/~me­esh/cmsc411/website/projec­ts/risc/sh-4.htm
  27. SuperH RISC engine Family Features
    https://www.renesas.com/en-us/products/microcontrollers-microprocessors/superh/superh-features.html
  28. Orthogonal instruction set
    https://en.wikipedia.org/wi­ki/Orthogonal_instruction_set
  29. An introduction to the TI MSP430 low-power microcontrollers
    http://mspgcc.sourceforge­.net/manual/c68.html
  30. MSP430 LaunchPad Tutorials
    http://processors.wiki.ti­.com/index.php/MSP430_Lau­nchPad_Tutorials
  31. LaunchPad MSP430 Assembly Language Tutorial
    http://robotics.hobbizine­.com/asmlau.html
  32. TI 16-bit and 32-bit microcontrollers
    http://www.ti.com/lsds/ti/mi­crocontrollers16-bit32-bit/overview.page

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.