Přerušení procesoru Z80

From Wikipedia, the free encyclopedia

Remove ads

Procesor Z80 má dva druhy přerušení, maskovatelné a nemaskovatelné podle toho, zda jej lze zakázat. 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] Rutina se ukončí instrukcí RET a procesor pokračuje v programu na adrese, kde došlo k 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.[2]

Remove ads

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]

Remove ads

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.

Remove ads

Využití přerušení u počítačů Sinclair ZX Spectrum

Na počítači ZX Spectrum IM1 spouští rutinu ROM na obsluhu klávesnice a hodin. IM2 má různé využití, mj. pro synchronizaci animace, aby se obraz netrhal, protože požadavek na maskovatelné přerušení je generován v okamžiku, kdy je započato vykreslování nového snímku na obrazovku.[1]

Využití IM2 komplikuje fakt, že programátor může zadat jen horní bajt (registr I) adresy, na které se nachází adresa programu obsluhujícího přerušení. Dolní bajt načtený ze sběrnice může být libovolná hodnota – adresa může být libovolné číslo v rozsahu I × 256 až I × 256 + 255. Prakticky se to řešilo tak, že se program přerušení umístil na adresu, která měla stejný horní i dolní bajt, např. 65 278, šestnáctkově #FEFE. Horní byte adresy přerušení se nastavil na začátek části paměti (o velikosti 256+1 bajtů), která byla vyplněna tímto bytem, tedy např. bajtem #FE (254). Ať byla hodnota sběrnice jakákoli, z adresy se načetla hodnota #FEFE, na které se spustilo přerušení. Obvykle na této adrese nebyl přímo program, ale skok na něj.[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 obsahuje posloupnost bajtů s hodnotou 255 (#FF). Pokud registr I ukazuje na tuto posloupnost, obslužný program přerušení musí začínat na adrese 65535 (#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. Instrukce JR #F3 skočí na adresu #FFF4 (65524), kde se nachází obslužný program přerušení (jeho začátek).[9][5] Toto řešení však provázel problém s kompatibilitou (počítače s upravenou ROM, přepínání ROM disketovým řadičem).

Poznámky

  1. Instrukce RETI provádí stejnou operaci jako instrukce RETN. Rozdíl mezi instrukcemi RETN a RETI je pouze v tom, že periferní obvody z rodiny procesoru Z80 jsou schopné vyhodnotit vykonání instrukce RETI 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]
Remove ads

Reference

Literatura

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads