Přerušení procesoru Z80
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í. 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. 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. 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. 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ů. 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). 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í.

Poznámky

Reference

Literatura 
 
 
 

Procesory
Programování na ZX Spectru