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í.[1] Pokud má program z nějakého důvodu čekat na přerušení, je k tomuto účelu možné využít instrukci HALT
.[2]
U počítačů ZX Spectrum je požadavek na přerušení generován v okamžiku, kdy je započato vykreslování nového snímku na obrazovku.[1]
Nemaskovatelné přerušení
Nemaskovatelné přerušení, NMI, Non Mascable Interrupt má vyšší prioritu než maskovatelné přerušení.[3] 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 NMI 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).[1]
Maskovatelné přerušení
Maskovatelné přerušení se aktivuje přivedením logické nuly na vstup INT procesoru. Toto přerušení je možné programově zakázat instrukcí DI
a povolit instrukcí EI
.[3] Tyto instrukce nastavují klopné obvody IFF1 a IFF2.[4] 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.[3] 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.[5] 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
)[pozn. 1] nemá na opětné povolení přerušení žádný vliv.[4]
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.[6]
IM0
Interrupt mode 0 je režim obsluhy maskovatelných přerušení fungující stejně jako u procesoru Intel 8080.[7] 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.[3][6]
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).[3] Zjednodušeně je možné říci, že procesor vykoná instrukci RST 56
(RST 38h
).[5]
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í.[3][7]
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í.[7] 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.[8] 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.
U ZX Spectra, které standardně žádný periferní obvod z rodiny procesoru Z80 neobsahuje, se při využití IM2 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í.[9] 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
.[9][5] 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í.[9][5]
Poznámky
- Instrukce
RETI
provádí stejnou operaci jako instrukceRETN
. Rozdíl mezi instrukcemiRETN
aRETI
je pouze v tom, že periferní obvody z rodiny procesoru Z80 jsou schopné vyhodnotit vykonání instrukceRETI
jako ukončení obsluhy přerušení, což umožňuje ostatním obvodům požádat o přerušení. Pokud hardware zařízení žádný periferní obvod z rodiny procesoru Z80 neobsahuje, je možné přerušení ukončit jak instrukcíRETI
, tak instrukcíRETN
, tak instrukcíRET
.[4]
Reference
- 5.díl: Módy přerušení (česky) na ci5.speccy.cz, vyd. 2005-02-03, cit. 2014-04-15
- WAŁASZEK, Jerzy. Instrukcja użytkownika mikroprocesora Z80 [online]. 2011-12-15. Kapitola Instrukcje sterujące mikroprocesorem. Dostupné v archivu pořízeném dne 2014-04-19. ((polsky))
- VRABEC, Jiří. Rozrušení z přerušení. ZX Magazín. 1994, čís. 1/94, s. 17. ISSN 1210-4833. ((česky))
- YOUNG, Sean. Z80 Undocumented Features (in software behaviour) [online]. October 1998 [cit. 2014-05-19]. Kapitola 3) Interrupts and I register. Version 0.3. Dostupné online. ((anglicky))
- FUENZALIDA, Denis. CC51B - Arquitectura de Computadores : Tarea #4 - El ZX Spectrum 48K [online]. [cit. 2014-04-15]. Kapitola El Z80 y las interrupciones. Dostupné online. ((španělsky))
- CIARCIA, Steve. Build Your Own Z80 Computer: Design Guidelines and Application Notes. [s.l.]: [s.n.], 1981. Dostupné online. ISBN 0-07-010962-1. Kapitola IM0, IM1, IM2, s. 62–63. ((anglicky))
- GAŠPAROVIČ, Peter. Prerušenie alebo Tajná inštrukcia programátora. ZX Magazín. 1994, čís. 1/94, s. 18–19. ISSN 1210-4833. ((slovensky))
- MATHUR, Aditya P. Introduction to Microprocessors. third edition. vyd. [s.l.]: Tata McGraw-Hill, 1989. Dostupné online. ISBN 0-07-460222-5. Kapitola 6.5.4 Multiple Interrupts, s. 231–239. ((anglicky))
- Interrupts (anglicky) na scratchpad.wikia.com
Literatura
- Zilog Application Note; Z80-CPU System Designs Series; The Z80 Family Program Interrup Structure [online]. Zilog, květen 1978 [cit. 2017-09-28]. Dostupné online. ((anglicky))
- VILÍM, Tomáš. Assembler a ZX Spectrum, 2. díl. Ústí nad Labem: Proxima - Software, 1992. Kapitola Přerušení. ((česky))
- DALGLISH, Robert Louis. An Introduction to Control and Measurement with Microcomputers. [s.l.]: Cambridge University Press, 1987. Dostupné online. ISBN 0-521-30175-0 (hardcover), ISBN 0-521-31771-1 (paperback). Kapitola 7.7.1 Z80 interrupt schemes, s. 245–246. ((anglicky))