Přerušení procesoru Z80
Author
Albert FloresPřerušení procesoru Z80 je funkce zabudovaná v procesoru Z80, která umožňuje přerušit normální běh instrukcí a přepnout se na obsluhu přerušení. Procesor Z80 disponuje pěti typy přerušení - maskovatelnými RST 0-7 přerušeními, nepřerušitelnými NMI přerušeními a nejvyšší prioritou má nenávratné přerušení obsluhy chyb. Přerušení jsou vyvolána vnějšími událostmi, jako je stisknutí klávesy nebo dokončení přenosu dat. Při vyvolání přerušení procesor automaticky ukládá obsah registrů na zásobník a následně volá přerušovací rutinu. Ta obsahuje instrukce pro zpracování daného přerušení a může například uložit data, změnit obsah registrů nebo přepnout na jiný úkol. Po dokončení obsluhy přerušení se procesor vrátí k běhu programu přerušené instrukce. Přerušení procesoru Z80 jsou důležitou funkcí pro práci s periferiemi, které vyžadují okamžitou odezvu. Přerušovací funkce procesoru Z80 byla široce využívána ve výpočetní technice, zejména v osobních počítačích, herních konzolích nebo dalších systémech, které pracují s periferiemi. Díky přerušení je možné paralelně zpracovávat vstupní signály a vykonávat různé úkoly, což zvyšuje efektivitu a reakční dobu systému.
Procesor Z80 má dva druhy přerušení, maskovatelné a nemaskovatelné. Po příchodu požadavku na přerušení procesor nejdříve dokončí právě prováděnou instrukci (u instrukcí s prefixem REP dokončí pouze právě prováděnou dílčí instrukci) a pak vyvolá rutinu pro obsluhu přerušení. Pokud má program z nějakého důvodu čekat na přerušení, je k tomuto účelu možné využít instrukci HALT.
Nemaskovatelné přerušení
Nemaskovatelné přerušení, NMI, Non Mascable Interrupt má vyšší prioritu než maskovatelné přerušení. Toto přerušení nemůže být zakázáno a je určeno k obsluze velmi naléhavých událostí. +more Aktivuje se sestupnou hranou (změnou z logické jedničky na logickou nulu) na vstupu procesoru. Při požadavku na nemaskovatelné přerušení procesor uloží obsah čítače instrukcí na vrchol zásobníku a skočí na adresu 102 (šestnáctkově 66).
Maskovatelné přerušení
Maskovatelné přerušení se aktivuje přivedením logické nuly na vstup procesoru. Toto přerušení je možné programově zakázat instrukcí DI a povolit instrukcí EI. +more Tyto instrukce nastavují klopné obvody IFF1 a IFF2. Klopný obvod IFF1 určuje, zda požadavek na maskovatelné přerušení bude akceptován či nikoliv. Pokud je vyvoláno nemaskovatelné přerušení, je klopný obvod IFF1 je vynulován, čímž dojde k zakázání maskovatelných přerušení, po ukončení obsluhy nemaskovatelného přerušení je pomocí instrukce RETN je do IFF1 navrácena původní hodnota zkopírováním z IFF2. Stav klopného obvodu IFF2 se při vykonání instrukcí LD A,I a LD A,R kopíruje do příznaku P/V. Pokud je vyvoláno maskovatelné přerušení, jsou vynulovány oba klopné obvody IFF1 i IFF2. Kvůli vynulování i klopného obvodu IFF2 je nutné před ukončením obsluhy přerušení povolit další přerušení instrukcí EI, protože kopírování stavu IFF2 do IFF1 instrukcí RETI (příp. instrukcí RETN) nemá na opětné povolení přerušení žádný vliv.
Z80 má tři režimy maskovatelného přerušení označované Interrupt mode 0, 1 a 2. Pro výběr režimu přerušení se slouží instrukce IM 0, IM 1 a IM 2 trvající dva procesorové cykly a neovlivňující žádné příznaky.
IM0
Interrupt mode 0 je režim obsluhy maskovatelných přerušení fungující stejně jako u procesoru Intel 8080. V tomto režimu procesor po přijatém požadavku na přerušení očekává na datové sběrnici data, která interpretuje jako instrukci. +more Obvykle se používají jednobytové instrukce RST, ale procesor je schopen přijmout jakoukoli (i vícebytovou) instrukci.
IM1
Interrupt mode 1 je zjednodušený režim, ve kterém procesor při přijetí požadavku na přerušení uloží obsah čítače instrukcí na vrchol zásobníku a skočí na adresu 56 (šestnáctkově 38). Zjednodušeně je možné říci, že procesor vykoná instrukci RST 56 (RST 38h).
IM2
Interrupt mode 2 je režim přerušení vyvinutý pro procesor Z80. V tomto režimu musí periférie, která přerušení vyvolala, předat procesoru na datové sběrnici osmibitovou hodnotu. +more Procesor uloží obsah čítače instrukcí na vrchol zásobníku, k hodnotě načtené z periférie připojí jako horních osm bitů obsah registru I a z výsledné adresy načte dvoubytovou hodnotu, kterou použije jako adresu začátku obslužné rutiny přerušení. Tento režim umožňuje mít nezávislou obsluhu až 128 různých přerušení.
Režim přerušení IM2 je určen pro obvody z rodiny procesoru Z80, které obsahují registr pro uložení hodnoty vektoru přerušení a poskytují ho procesoru při požadavku na přerušení. Periferní obvody z rodiny procesoru Z80 dovolují řetězení obvodů propojením výstupu IEO (Interrupt Enable Output) jednoho obvodu na vstup (Interrupt Enable Input) jiného obvodu, čímž se stanoví priorita obsluhy přerušení jednotlivých obvodů. +more Nastavení vstupu IEI na logickou nulu signalizuje danému obvodu, že nesmí generovat přerušení. Pokud je na vstup IEI přivedena logická nula nebo pokud obvod sám generoval přerušení, signalizuje to dalšímu obvodu v řetězci nastavením svého výstupu IEO na logickou nulu. Propojením signálů IEI a IEO jednotlivých obvodů je určena priorita obsluhy přerušení těchto obvodů. Obvod s nejvyšší prioritou má na vstup IEI přivedenu trvale logickou jedničku.
Využití přerušení u počítačů Sinclair ZX Spectrum
Požadavek na maskovatelné přerušení generován v okamžiku, kdy je započato vykreslování nového snímku na obrazovku.
Při využití IM2 na ZX Spectru, které standardně žádný periferní obvod z rodiny procesoru Z80 neobsahuje, se používá postup, kdy se celá tabulka přerušení a jeden následující bajt (protože na ZX Spectru bez připojených periférií není zaručeno, jaká hodnota se při požadavku na přerušení bude nacházet na datové sběrnici, a že to bude hodnota sudá) vyplní stejnou stejnou hodnotou, aby se při požadavku na přerušení vždy skočilo na totožnou adresu s programem pro obsluhu přerušení. Aby se ušetřilo místo v paměti využívá se také toho, že část paměti ROM počítačů ZX Spectrum je nevyužitá a tedy obsahuje posloupnost bajtů s hodnotou 255 (šestnáctkově FF). +more Pokud registr I ukazuje na tuto posloupnost, obslužný program přerušení musí začínat na adrese 65535 (šestnáctkově FFFF), na kterou se umístí instrukce JR. Díky tomu, že adresa 65535 je poslední adresa v paměti, parametr instrukce JR je přečten z adresy 0, na které se v ROM ZX Spectra nachází instrukce DI s operačním kódem F3 (šestnáctkově). Instrukce JR tak skočí na adresu FFF4 (šestnáctkově), kde se nachází vlastní obslužný program přerušení.