Hlavní navigace

Osmibitové mikrořadiče Rabbit: praví dědicové mikroprocesoru Zilog Z80

Pavel Tišnovský

Minule jsme si popsali osmibitové mikrořadiče řady Z8 a eZ8 navržené společností Zilog. Ty navázaly na legendární Zilog Z80, ovšem jen nepřímo. Skutečný základ Z80 nalezneme v konkurenčních mikrořadičích Rabbit.

Obsah

1. Osmibitové mikrořadiče Rabbit: praví dědicové mikroprocesoru Zilog Z80

2. Zilog Z80 versus procesory Rabbit

3. Registry mikrořadičů Rabbit

4. Registry používané pro adresování instrukcí a operandů

5. Mapa paměti

6. Použití registrů XPC a PC u programů delších než 64 kB

7. Registry určené pro určení tabulky vektorů interních a externích přerušení i pro nastavení priority přerušení

8. Příznakový registr

9. Subsystém pro obsluhu přerušení

10. Instrukční soubor mikrořadičů Rabbit

11. Užitečná rozšíření instrukční sady

12. Šestnáctibitové operace

13. Instrukce, které byly odstraněny

14. Odkazy na Internetu

1. Osmibitové mikrořadiče Rabbit: praví dědicové mikroprocesoru Zilog Z80

Osmibitové mikrořadiče s jádry Z8 a eZ8, s nimiž jsme se seznámili v předchozí části seriálu o architekturách počítačů a procesorů, byly navrženy ve společnosti Zilog, tedy ve stejné firmě, v níž dříve vznikl legendární osmibitový mikroprocesor Zilog Z80 (ten byl posléze vyráběn i dalšími firmami, ať již s platnou licencí, tak i neoficiálně, což je případ U880 z DDR či КР1858ВМ1 ze SSSR). Ovšem jádra Z8 a eZ8 se od původní „zet osmdesátky“ v mnoha ohledech odlišují, což bylo způsobeno odlišnými požadavky na jednoduchý a málo výkonný mikrořadič s omezenou kapacitou RAM (do 4kB včetně řídicích registrů). To ale neznamená, že by dnes neexistovaly žádné nové čipy, které přímo navazují na Z80. Model Z80 i jeho do jisté míry upravená instrukční sada jsou totiž použity v osmibitových mikrořadičích, které navrhla společnost Rabbit a nabízí je na svých deskách určených především pro použití v průmyslu a pro zajištění komunikace mezi různými systémy (proto jsou mnohé desky Rabbit osazeny Ethernetem a/nebo Wifi modulem).

Mikrořadiče Rabbit jsou poměrně dobře podporovány; existuje pro ně dokonce i zajímavý překladač Dynamic C, o němž se ještě zmíním v souvislosti s vývojovými prostředky pro mikrořadiče.

Poznámka: ještě se naposledy zmiňme o současných aktivitách čipů vyráběných pod značkou Zilog společností IXYS. Kromě řady Z8 a eZ8 se firma orientuje i na výrobu osmibitových mikrořadičů s jádry S3 a taktéž mikrořadičů odvozených od známé architektury Intel 8051. Tato jádra nesou jméno Z8051 a od původní řady 8051 se v mnoha ohledech odlišují, především pak tím, že většina instrukcí je provedena ve dvou hodinových cyklech a instrukce se mohou překrývat (podobně jako na prakticky všech moderních CPU). Samozřejmě se zcela odlišuje výrobní technologie, protože Z8051 je vyráběna 0,18µm technologií, napájecí napětí může být v rozsahu 1,8V až 5,5V, maximální frekvence hodinového signálu 16MHz a kapacity paměti se zvýšily na 64 kB Flash a až 3250 bajtů paměti RAM. Počet čítačů/časovačů se zvýšil na max. 6 a kromě klasických čtyř portů s GPIO se nově objevuje pátý port a rozhraní pro řízení LCD, modul pro PWM (jinými slovy: parametry jsou velmi podobné dalším mikroprocesorům, které jsou od 8051 taktéž odvozeny).

2. Zilog Z80 versus procesory Rabbit

Jak jsme si již řekli v perexu tohoto článku, jsou osmibitové mikrořadiče Rabbit nepřímo založeny na architektuře známých a v minulosti velmi populárních osmibitových mikroprocesorů Zilog Z80. Ovšem od dob Z80 se poněkud pozměnila situace na trhu s osmibitovými mikrořadiči, protože dnes se mj. vyžaduje, aby i osmibitové mikrořadiče dokázaly více či méně efektivně spouštět aplikace naprogramované v jazyku C (v minulosti také EC++). Z tohoto důvodu byla částečně pozměněna instrukční sada – některé instrukce byly přidány a některé nadbytečné instrukce naopak odebrány (díky tomu se uvolnilo několik instrukčních kódů, které mohly být následně použity pro jiné instrukce).

Kvůli změně instrukční sady nejsou procesory Rabbit zpětně binárně kompatibilní se Z80, ovšem většina aplikací je přenositelná na úrovni zdrojových (assemblerovských) kódů s případnou náhradou chybějících instrukcí za volání podprogramů (BCD apod.). Výjimku tvoří ty aplikace, které intenzivně používají samomodifikující se kód a také aplikace používající I/O instrukce, protože I/O systém byl kompletně pozměněn.

Mikrořadiče Rabbit jsou v některých ohledech výkonnější, než původní Z80, a to jak díky použití vyšší hodinové frekvence (od 6 MHz do 30 MHz), tak i díky tomu, že se samotné instrukce vykonávají v menším počtu cyklů. V dalších kapitolách se zmíníme i o některých nových adresovacích režimech, například LD HL,(SP+offset) či LD (IY+offset),HL, které mohou být generovány překladačem céčka, v němž je obvyklé ve funkcích vytvářet zásobníkové rámce, popř. adresovat prvky struktury předané ukazatelem.

Další změna souvisí se zavedením stránkování, které umožňuje rozšíření adresového rozsahu z 64 kB na jeden megabajt.

3. Pracovní registry mikrořadičů Rabbit

Vzhledem k tomu, že mikrořadiče Rabbit jsou na úrovni zdrojového kódu zpětně kompatibilní se Z80, nepřekvapí nás, že se u obou čipů používá stejná sada pracovních registrů. Jedná se o sedm registrů nazvaných A, B, C, D, H a L. Každý z těchto registrů má šířku osm bitů, ovšem pro některé operace je možné vždy dva registry spojit do šestnáctibitového páru. Takto vznikají páry BC, DE a HL. První registr A (akumulátor) se spojuje s příznakovým registrem F a tvoří tak registrový pár AF:

# Registr 1 Registr 2 16bitový pár
1 A F AF
2 B C BC
3 D E DE
4 H L HL

Všech sedm pracovních registrů i registr příznaků jsou ve skutečnosti zdvojeny, protože existuje ještě druhá banka s těmito registry. Původní mikroprocesor Z80 byl totiž určen pro řízení tiskáren, chytrých terminálů (dobové jméno) apod., kde se mnohdy vyžadovaly rychlé přerušovací rutiny, které mohly využívat právě druhou banku registrů (banku lze přepnout jednou či dvěma instrukcemi, což je rychlejší, než snaha o uložení všech registrů na zásobník popř. obnova registrů na konci rutiny). Ovšem po vzniku domácích osmibitových mikropočítačů se začala druhá banka využívat i v běžných programech, což je samozřejmě možné i u mikrořadičů Rabbit:

# Registr 1 Registr 2 16bitový pár
1 A' F' AF'
2 B' C' BC'
3 D' E' DE'
4 H' L' HL'

4. Registry používané pro adresování instrukcí a operandů

Další skupina registrů slouží pro adresování instrukcí a operandů. Programátoři mají k dispozici dva šestnáctibitové index registry nazvané IX a IY, ovšem i registrový pár HL může sloužit jako další indexový registr. Při ukládání operandů a návratových adres na zásobník je využíván šestnáctibitový ukazatel na vrchol zásobníku SP. Pro adresování instrukcí se používá taktéž šestnáctibitový registr PC, který je navíc doplněn registrem XPC, jehož přesný význam si vysvětlíme v následujících dvou kapitolách:

# Jméno registru Šířka Význam
1 IX 16 bitů index registr
2 IY 16 bitů index registr
3 HL 16 bitů registrový pár použitelný jako index registr (viz předchozí kapitolu)
4 SP 16 bitů ukazatel na vrchol zásobníku
5 PC 16 bitů programový čítač
6 XPC 8 bitů rozšíření programového čítače (viz následující kapitolu)

5. Mapa paměti

Registr XPC umožňuje zvětšení paměti s programovým kódem z 64 kB až na jeden megabajt. V tomto případě je ovšem nutné používat adresy o šířce 20 bitů a nikoli pouze 16 bitů. Právě k tomuto účelu je používán XPC, protože ten určuje právě aktivní stránku v paměti programu. Pro vysvětlení, jak aktivní stránky fungují, se nejdříve podívejme, jak vypadá mapa paměti z pohledu programátora (jedná se o logický adresový prostor):

FFFF +----------------+
     |                | 4kB
F000 |..XPC segment...|
     |                | 4kB
E000 +----------------+
     |                |
     |  stack segment | 4kB
     |                |
D000 +----------------+
     |                |
     |                |
     |  data segment  | 24 kB
     |                |
     |                |
     |                |
7000 +----------------+
     |                |
     |                |
     |                |
     |  root segment  | 28 kB
     |                |
     |                |
     |                |
0000 +----------------+

Vidíme, že adresovatelná oblast 64 kB je rozdělena do čtyř takzvaných segmentů s následujícím významem:

  1. root segmentu, který je nejrozsáhlejší, je uložen programový kód. Pokud je celý program (a konstanty) menší než 28 kB, je vhodné ho uložit právě do root segmentu, protože načítání z této oblasti paměti je rychlejší, než při použití XPC segmentu. Tato oblast je většinou fyzicky mapována do FLASH EEPROM, ovšem program lze spouštět i z RAM, například při ladění apod.
  2. Data segment má velikost maximálně 24 kB a jedná se pochopitelně o oblast fyzicky mapovanou do RAM. Teoreticky je možné, aby byla kapacita RAM ještě větší, v tomto případě se používá stránkování (u většiny čipů je však kapacita RAM spíše menší).
  3. Stack segment je opět představován RAM a právě do této oblasti ukazuje registr SP.
  4. XPC segment o velikosti 8 kB je rozdělena do dvou menších oblastí (oken), kde každé okno má velikost 4 kB. Tato logická paměťová oblast je mapována do fyzické paměti FLASH EEPROM o maximální kapacitě 1 MB.

Poznámka: u některých čipů jsou hranice mezi datovým a root segmentem konfigurovatelné. Můžeme nalézt i čipy, kde je hranice nastavena na adrese 0×6000, tj. root segment je o 4kB menší a datový segment naopak o 4kB větší.

6. Použití registrů XPC a PC u programů delších než 64 kB

Jak jsme si řekli v předchozí kapitole, představuje nejvyšších osm kilobajtů adresovatelné logické paměti takzvané okno (window) do paměti fyzické. Granularita je přitom nastavena na čtyři kilobajty, tj. okno se po fyzické paměti o maximální kapacitě 1 MB posunuje po skocích o velikosti 4096 adres. Lze snadno spočítat, že existuje přesně 256 těchto oken a index právě aktivního okna (mapovaného na logické adresy 0×E000 až 0×EFFF) je uložen do registru XPC. Okno s indexem n+1 je mapováno na adresy 0×F000 až 0×FFFF.

Všechny běžné instrukce skoků, volání subrutin i návratů ze subrutin pracují v rámci logického šestnáctibitového prostoru a tudíž nijak nemění XPC. Ovšem existují takzvané „dlouhé“ skoky a volání (LJP, LCALL a LRET), které již XPC dokážou měnit resp. obnovit. Typické chování procesoru je takové, že při skoku nad adresu 0×F000 dojde ke zvýšení indexu okna o jedničku („sliding window“).

Poznámka: povšimněte si, že se jedná o jiný způsob adresování, než je způsob (nechvalně) známý z procesorů Intel 8086. U 8086 se totiž používalo adresování typu segment+offset pro všechny instrukce a pro celý adresový rozsah. U mikrořadičů Rabbit se okno do fyzické paměti uplatňuje pouze v případě použití horních osmi kilobajtů.

7. Registry určené pro určení tabulky vektorů interních a externích přerušení i pro nastavení priority přerušení

Další tři registry mají speciální význam, protože slouží pro ovládání subsystému určeného pro práci s interními i externími přerušeními. Zatímco původní mikroprocesor Z80 obsahoval jen jediný registr nazvaný I (do něj se zapisovalo horních osm bitů adresy, na níž se nacházely vektory – šestnáctibitové cílové adresy – přerušovacích rutin), jsou mikrořadiče v tomto ohledu nepatrně složitější, což souvisí s větším množstvím interních a externích periferií. Z registru I byly vytvořeny dva samostatné registry nazvané EIR a IIR s podobnou funkcí, ovšem EIR je určen pro specifikaci tabulky vektorů obsluhy externích přerušení (až 128 vstupů), kdežto IIR pro interní přerušení (taktéž 128 vstupů resp. přesněji řečeno zdrojů). Interně se tato změna projevila tak, že se EIR v instrukcích adresuje stejně jako původní registr I, zatímco IIR se adresuje podobně jako již neexistující registr R.

Poslední (nový) registr, který se jmenuje IP, je taktéž osmibitový. Tento registr je rozdělen do čtyř bitových polí, každé má tedy šířku dva bity. Hodnoty zapsané do těchto bitových polí zaznamenávají historii priorit přerušení, což je téma, které si vysvětlíme v dalším textu.

Jméno registru Šířka Význam
IIR 8 bitů Internal Interrupt Register
EIR 8 bitů External Interrupt Register
IP 8 bitů (4×2 bity) Interrupt Priority Register

8. Příznakový registr

Příznakový registr F je osmibitový, ovšem pouze čtyři bity jsou nastavovány (vybranými) instrukcemi. Další bity lze modifikovat nepřímo instrukcí POP AF:

Bit Označení Jméno Význam
0 C carry příznak přenosu
1 × nepoužit nepoužit
2 V overflow příznak přetečení
3 × nepoužit nepoužit
4 × nepoužit nepoužit
5 × nepoužit nepoužit
6 Z zero příznak nulovosti
7 S sign příznak znaménka

Povšimněte si, že není použit ani příznak N ani příznak H. Absence příznaku H vlastně znamená, že nelze použít instrukci DAA, která skutečně byla z instrukčního souboru odstraněna, o čemž se zmiňujeme v kapitole 13.

Poznámka: pamětníci, kteří znají assembler původního mikroprocesoru Z80, si pravděpodobně povšimli, že nebyl popsán registr R. Tento registr skutečně není v mikrořadičích Rabbit použit, protože se zcela změnil způsob práce s paměťovými čipy. Opět se jedná o jednu z několika nekompatibilit, která může ovlivnit ten software, který používal registr R jako generátor pseudonáhodných čísel atd. (v praxi to však pravděpodobně nebude tak časté, protože takový software by byl stejně pevně svázán s dalším hardware a navíc i s původní hodinovou frekvencí; příkladem může být „čítač“ implementovaný v ZX 81).

9. Subsystém pro obsluhu přerušení

Subsystém, který se stará o obsluhu přerušení, prošel poměrně velkým redesignem, protože původní přerušovací subsystém procesorů Z80 podporoval pouze dvě priority přerušení – nemaskovatelná přerušení a přerušení maskovatelná. U procesorů Rabbit existují celkem tři priority přerušení (1, 2 a 3) a samotný procesor se může nacházet v jedné ze čtyř úrovní (0, 1, 2 a 3). V případě, že dojde ke vzniku externího či interního přerušení (resp. přesněji řečeno k požadavku na reakci na přerušení), obvody v CPU porovnají prioritu tohoto přerušení a aktuální úrovně, v níž se procesor nachází. Pokud je priorita přerušení (ostře) větší, než aktuální úroveň, v níž se procesor nachází, začne se v další instrukci vykonávat přerušovací rutina s touto vyšší prioritou, jak je to ostatně naznačeno v následující tabulce. Běžný programový kód je prováděn v úrovni 0, což znamená, že jakékoli přerušení vyvolá přerušovací rutinu:

Úroveň procesoru Chování při příchodu přerušení
0 všechna přerušení s prioritami 1, 2 a 3 jsou zpracována
1 přednostně zpracována jsou přerušení s prioritami 2 a 3
2 přednostně zpracována jsou přerušení s prioritou 3
3 žádná přerušení kromě instrukcí RST nemají přednost

V praxi má většina přerušení prioritu 1, pouze u těch zařízení, které vyžadují velmi rychlou odezvu, se úroveň nastavuje na 2 či dokonce na 3 (rychlou odezvou se v kontextu mikrořadičů Rabbit myslí reakce do 20 hodinových cyklů).

S úrovněmi, na kterých se může nacházet procesor, úzce souvisí obsah registru IP. Ten můžeme považovat za zásobník s maximálně čtyřmi prvky (každý má dva bity), do něhož se ukládají a z něhož se obnovují úrovně, ve kterých se procesor nacházel. Pro obnovu předchozího stavu se používá instrukce IPRES a vzhledem k tomu, že pouhé čtyři prvky nemusí dostačovat, obsahuje instrukční sada nové instrukce PUSH IP a POP IP, které použijí skutečný zásobník. Nová priorita se do IP uloží instrukcí IPSET [0..3].

10. Instrukční soubor mikrořadičů Rabbit

Jak již víme z předchozího textu, je instrukční soubor osmibitových mikrořadičů Rabbit odvozen od instrukčního souboru procesorů Zilog Z80 a jeho vylepšené (přesněji řečeno upravené) varianty Zilog Z180. Většina běžných instrukcí zůstala zachována, ovšem 25 instrukcí bylo odstraněno, což je téma, kterému se věnujeme ve třinácté kapitole. Naproti tomu byly některé instrukce přidány a – co je v praxi důležitější – se další instrukce rozšířily o nové adresovací režimy a/nebo o možnost používat šestnáctibitové operandy uložené v registrovém páru.

Pro připomenutí si ukažme všechny původní instrukce procesoru Z80, a to v abecedním pořadí:

Instrukce Původní název
ADC A,s Add with Carry
ADC HL,ss Add with Carry
ADD A,s Add
ADD HL,ss Add
ADD IX,pp Add
ADD IY,rr Add
AND s Logical AND
BIT b,m Test Bit
CALL cc,nn Conditional Call
CALL nn Unconditional Call
CCF Complement Carry Flag
CP s Compare
CPD Compare and Decrement
CPDR Compare, Decrement, Repeat
CPI Compare and Increment
CPIR Compare, Decrement, Repeat
CPL Complement
DAA Decimal Adjust Accumulator
DEC s Decrement
DEC xx Decrement
DEC ss Decrement
DI Disable Interrupts
DJNZ e Decrement, Jump Non-Zero
EI Enable Interrupts
EX [SP],HL Exchange
EX [SP],xx Exchange
EX AF,AF' Exchange
EX DE,HL Exchange
EXX Exchange
HALT Halt
IM n Interrupt Mode
IN A,[n] Input
IN r,[C] Input
INC r Increment
INC [HL] Increment
INC xx Increment
INC [xx+d] Increment
INC ss Increment
IND Input and Decrement
INDR Input, Decrement, Repeat
INI Input and Increment
INIR Input, Decrement, Repeat
JP [HL] Unconditional Jump
JP [xx] Unconditional Jump
JP nn Unconditional Jump
JP cc,nn Conditional Jump
JR e Unconditional Jump
JR cc,e Conditional Jump
LD dst,src Load
LD A,i Load
LDD Load and Decrement
LDDR Load, Decrement, Repeat
LDI Load and Increment
LDIR Load, Increment, Repeat
NEG Negate
NOP No Operation
OR s Logical inclusive OR
OTDR Output, Decrement, Repeat
OTIR Output, Increment, Repeat
OUT [C],r Output
OUT [n],A Output
OUTD Output and Decrement
OUTI Output and Increment
POP xx Pop
POP qq Pop
PUSH xx Push
PUSH qq Push
RES b,m Reset bit
RET Return
RET cc Conditional Return
RETI Return from Interrupt
RETN Return from NMI
RL m Rotate Left
RLA Rotate Left Accumulator
RLC m Rotate Left Circular
RLCA Rotate Left Circular
RLD Rotate Left 4 bits
RR m Rotate Right
RRA Rotate Right Accumulator
RRC m Rotate Right Circular
RRCA Rotate Right Circular
RRD Rotate Right 4 bits
RST p Restart
SBC A,s Subtract with Carry
SBC HL,ss Subtract with Carry
SCF Set Carry Flag
SET b,m Set bit
SLA m Shift Left Arithmetic
SRA m Shift Right Arithmetic
SRL m Shift Right Logical
SUB s Subtract
XOR s Logical Exclusive OR

Význam malých písmen u operandů:

Zkratka Význam
b index bitu 0..7
cc kód podmínky u skoků
m pracovní registr r, [HL] nebo [xx+d]
pp registrový pár BC, DE, IX nebo SP
qq registrový pár AF, BC, DE nebo HL
qq' registrový pár AF, BC, DE nebo HL z druhé banky
r pracovní registr A, B, C, D, E, H nebo L
rr registrový pár BC, DE, IY nebo SP
s pracovní registr r, hodnota n, [HL] nebo [xx+d]
ss registrový pár BC, DE, HL nebo SP
xx index registr IX nebo IY

11. Užitečná rozšíření instrukční sady

Pro efektivní běh programů napsaných v céčku jsou užitečné adresovací režimy používající offset přičtený k SP, IX, IY či k HL; tyto režimy nově podporují i práci se šestnáctibitovými operandy (cílem či zdrojem je vždycky dvojice HL či HL'):

LD HL, (SP+offset)
LD (SP+offset), HL
LD HL, (IX+offset)
LD HL', (IY+offset)
LD HL, (HL+offset)

Taktéž došlo k rozšíření možností instrukcí určených pro přenos dat mezi základní sadou registrů a druhou bankou A', B' … L' (kupodivu však neexistují všechny kombinace přenosu zdroj→cíl u registrových párů):

LD A, B    ; každý z registrů A..L může být zdrojem
LD A', B
LD B', B

Některé kombinace však nejsou povoleny:

LD B', C'  ; možnosti specifikace cílového registru jsou více omezeny
LD A, B'

Taktéž došlo k rozšíření sémantiky instrukce EX (prohození obsahu registrových párů):

EX DE', HL
EX DE, HL'
EX DE', HL'
EX (SP), HL
EX (SP), IX
EX (SP), IY

Načtení konstanty je nyní možné do všech pracovních registrů a do většiny registrových párů, včetně druhé banky:

LD L',  42
LD BC', 1234
LD HL', (1234)   ; použití adresy

Poznámka: u některých dalších instrukcí lze použít prefix ALTD pro výběr registru či registrového páru z druhé banky.

O některých dalších nových instrukcích jsme se již zmínili: „dlouhé“ skoky a volání subrutin, práce s prioritami přerušení a registrem IP apod.

12. Šestnáctibitové operace

Již původní mikroprocesory Z80 podporovaly provádění některých operací se šestnáctibitovými operandy (ADD HL, xx, ADD IX, xx, DEC IX atd.) což je samozřejmě v mnoha ohledech užitečné. U procesorů Rabbit se tyto možnosti ještě rozšířily, například o následující kombinace instrukcí a operandů:

RR  HL       ; rotace registrového páru HL přes příznak carry
ADD HL, HL   ; rotace doleva, bez carry na vstupu (náhrada za RL)
ADC HL, HL   ; taktéž rotace doleva, s carry na vstupu (náhrada za RL)
RL  DE       ; rotace registrového páru DE doleva
AND IX, DE   ; logické operace
AND IY, DE
AND HL, DE
OR  IX, DE
OR  IY, DE
OR  HL, DE

Pro použití v přeložených céčkových programech byla navržena instrukce BOOL, která nastavuje hodnotu registrového páru HL či zvoleného index registru IX/IY na jedničku či nulu (0×0001 resp. 0×0000) na základě toho, zda je původně v registrovém páru/index registru nulová či nenulová hodnota:

BOOL HL
BOOL IX
BOOL IY

Přidána byla také instrukce MUL určená pro vynásobení obsahu registrového páru BC s registrovým párem DE. Výsledek je uložen do „čtyřregistru“HL:BC a celá instrukce je dokončena ve dvanácti hodinových cyklech (tato instrukce nemá žádné operandy, zdrojové registry i registry cílové jsou pevně určeny).

13. Instrukce, které byly odstraněny

Následující instrukce, které pravděpodobně znají pamětníci mikroprocesorů Z80 (a taktéž Z180), již nejsou na mikrořadičích Rabbit podporovány:

DAA IN OTIR
HALT OUT0 INDR
DI IN0 OTDR
EI SLP RRD
IM 0 OUTI RLD
IM 1 IND CPI
IM 2 OUTD CPIR
OUT INIR CPD
    CPDR

Tyto nepodporované instrukce lze rozdělit do několika skupin:

  1. Některé (vlastně většina) z odstraněných instrukcí souvisí s I/O systémem Z80, který byl zcela přepracován, takže tyto instrukce již nejsou zapotřebí. To ovšem znamená, že některé starší aplikace je zapotřebí přepsat (otázkou je, kolik aplikací pro původní Z80 má smysl reálně provozovat na deskách s procesory Rabbit).
  2. Další tři instrukce DAA, RRD a RLD lze v případě potřeby nahradit vhodným podprogramem, což bude nejvíce problematické u instrukce DAA kvůli nutnosti simulace příznaku H (absence BCD aritmetiky je u mikrořadičů orientovaných na použití jazyka C vcelku pochopitelná).
  3. Čtyři instrukce CPI, CPIR, CPD a CPDR bylo možné na původním mikroprocesoru Z80 použít pro porovnání obsahu bloku paměti (maximálně však BC bajtů) s registrem A. Podle designérů procesorů Rabbit nejsou tyto instrukce příliš užitečné, protože koncovou podmínkou je rovnost dvou prvků (při rovnosti A=(HL) se porovnávání u instrukcí CPIR/CPDR zastaví), nikoli nerovnost. S tímto tvrzením by se dalo úspěšně polemizovat (hledání adresy konce céčkového řetězce, výpočet délky řetězce apod.), ovšem faktem je, že i tyto instrukce je nutné nahradit vhodným (delším) programovým kódem.

Poznámka: blokové přenosy, tj. instrukce LDIR a LDDR, jsou na mikrořadičích Rabbit podporovány.

14. Odkazy na Internetu

  1. Rabbit 2000 Microprocessor
    https://www.digi.com/suppor­t/productdetail?pid=4667&ty­pe=documentation
  2. Rabbit selection guide
    https://www.digi.com/pdf/rabbit-selection-guide.pdf
  3. Rabbit Processor Embedded Systems
    https://www.digi.com/products/embedded-systems/rabbitprocessor
  4. Rabbit Products
    https://www.digi.com/products/rabbit
  5. Rabbit 2000 (Wikipedia)
    https://en.wikipedia.org/wi­ki/Rabbit_2000
  6. SDCC – Small Device C Compiler (homepage)
    http://sdcc.sourceforge.net/
  7. Small Device C Compiler (Wikipedia)
    https://en.wikipedia.org/wi­ki/Small_Device_C_Compiler
  8. Dynamic C
    https://en.wikipedia.org/wi­ki/Rabbit_Semiconductor#Dy­namic_C
  9. Z80 info
    http://www.z80.info/
  10. Zilog (stránka firmy)
    http://www.zilog.com/
  11. Řada Z8 Encore
    http://www.zilog.com/index­.php?option=com_product&tas­k=product&businessLine=1&id=2&pa­rent_id=2&Itemid=56
  12. New Zilog Z8051 Microcontrollers (už ne „new“, článek je z roku 2012)
    http://microcontroller.com/new­s/Zilog_Z8051.asp
  13. Zilog: The First Decade: Z80, Z8 and the Z8000
    http://www.cpushack.com/2010/10/15/zi­log-the-first-decade-z80-z8-and-the-z8000/
  14. Docs for: Z8 Microcontroller (archivní stránka)
    http://www.oocities.org/si­liconvalley/peaks/3938/z8_ho­me.htm
  15. 8-BIT MCU Relevancy in 2011
    http://www.eeweb.com/blog/ste­ve_darrough/8-bit-mcu-relevancy-in-2011
  16. Zilog Z8 (Wikipedia)
    https://en.wikipedia.org/wi­ki/Zilog_Z8
  17. 8-bit S08
    http://www.nxp.com/produc­ts/microcontrollers-and-processors/more-processors/8–16-bit-mcus/8-bit-s08:HCS08
  18. 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
  19. 8-bit RS08
    http://www.nxp.com/produc­ts/microcontrollers-and-processors/more-processors/8–16-bit-mcus/8-bit-rs08:RS08FAMILY
  20. Wikipedia: Motorola 68HC05
    http://en.wikipedia.org/wi­ki/Motorola_68HC05
  21. Wikipedia: Freescale 68HC08
    http://en.wikipedia.org/wiki/68HC08
  22. Wikipedia: Freescale 68HC11
    http://en.wikipedia.org/wiki/68HC11
  23. Wikipedia: Freescale 68HC12
    http://en.wikipedia.org/wi­ki/Freescale_68HC12
  24. HC05 Processor Families
    http://www.freescale.com/we­bapp/sps/site/overview.jsp?no­deId=01624684498633
  25. HC08 Processor Families
    http://www.freescale.com/we­bapp/sps/site/overview.jsp?no­deId=01624684497663
  26. Digital Core Design 68HC08 – HDL IP Core
    http://www.dcd.pl/acore.php?idcore=82
  27. Freescale 68HC11
    http://www.freescale.com/we­bapp/sps/site/taxonomy.jsp?no­deId=01624684498635
  28. Lifecycle of a CPU:
    http://www.cpushack.net/life-cycle-of-cpu.html
  29. Great Microprocessors of the Past and Present (V 13.4.0)
    http://jbayko.sasktelwebsi­te.net/cpu.html
  30. SPI interface tutorial
    http://www.best-microcontroller-projects.com/spi-interface.html
  31. Serial Peripheral Interface Bus
    http://en.wikipedia.org/wi­ki/Serial_Peripheral_Inter­face_Bus
  32. What is SPI?
    http://www.fpga4fun.com/SPI1.html
  33. SPI – A simple implementation
    http://www.fpga4fun.com/SPI2.html
  34. Bit-banging
    http://en.wikipedia.org/wiki/Bit-banging
  35. Joint Test Action Group
    http://en.wikipedia.org/wiki/JTAG
  36. I2C
    http://en.wikipedia.org/wiki/I2C
  37. I2 Background
    http://www.microport.tw/blog­new.php?blog_no=7#theory
  38. 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
  39. Addressing mode (Wikipedia)
    https://en.wikipedia.org/wi­ki/Addressing_mode
  40. Renesas SH Instruction Set Summary
    http://shared-ptr.com/sh_insns.html
  41. SH-4 RISC Processor by HITACHI
    http://www.cs.umd.edu/~me­esh/cmsc411/website/projec­ts/risc/risc.htm
  42. SH-4 RISC Processor
    http://www.cs.umd.edu/~me­esh/cmsc411/website/projec­ts/risc/sh-4.htm
  43. SuperH RISC engine Family Features
    https://www.renesas.com/en-us/products/microcontrollers-microprocessors/superh/superh-features.html
  44. Orthogonal instruction set
    https://en.wikipedia.org/wi­ki/Orthogonal_instruction_set
  45. An introduction to the TI MSP430 low-power microcontrollers
    http://mspgcc.sourceforge­.net/manual/c68.html
  46. MSP430 LaunchPad Tutorials
    http://processors.wiki.ti­.com/index.php/MSP430_Lau­nchPad_Tutorials
  47. LaunchPad MSP430 Assembly Language Tutorial
    http://robotics.hobbizine­.com/asmlau.html
  48. TI 16-bit and 32-bit microcontrollers
    http://www.ti.com/lsds/ti/mi­crocontrollers16-bit32-bit/overview.page
  49. Z86E04 Tutorial
    https://tiktakx.wordpress­.com/2010/05/04/z86e04-tutorial/
  50. Z80 Instruction Set
    http://clrhome.org/table/
  51. 8080/Z80 Instruction Set
    http://nemesis.lonestar.or­g/computers/tandy/software/ap­ps/m4/qd/opcodes.html
  52. CPDR
    http://z80-heaven.wikidot.com/instructions-set:cpdr
  53. Z80 MICROPROCESSOR Instruction Set Summary
    http://www.z80.info/z80-op.txt
Našli jste v článku chybu?
13. 12. 2016 11:34

diky za pripomenuti, tenhle processor znam a zazil jsem s nim mnoho bezesnych noci. Predevsim diky "skvelemu", taktez zminenemu, kompilatoru Dynamic C. To bylo naproste nestesti.

Historie byla priblizne takova - delali jsme prenosne terminaly se Z180. Ale byly hardwarove prilis slozite, byla zapotrebi 4 vrstva deska, bylo tam moc soucastek. Tak jsme se rozhodli, ze to predelame pro Rabbita. Zdalo se, ze vsechno bude velmi jednoduche, Rabbit ma spoustu nozicek, vetsina IO bude primo na nem. Skut…

13. 12. 2016 14:02
mhi (neregistrovaný)

:-))) Nektere vzpominky jsou na opravdu desive nocni mury.

Pamatuji, ze jeden prekladac delal nekonecne cykly tak, ze nekonecne uplne nebyly. Stacilo udelat while(1) { konkretni kod bez jakehokoliv break ci return nebo chyb } a ukoncilo se to (obcas). Pritom stacilo udelat drobnou zmenu a kod se sam "opravil" :-).

Nebo prekladac C pro Microchip PIC18 umel udelat kod, kdy pridanim jedne naprosto bezne radky typy "intpromenna++;" se nejak domrsila cela fce, ze prestala fungovat (cele telo funkce…