ZILOG
Mikroprocesszor Családok

Tartalom

Bevezetés
A mikroprocesszorról röviden (kezdőknek)

1.1. A Z-80-as mikroprocesszor család bemutatása
1.1.1. A Z-80 és az i8080-as mikroprocesszor család összehasonlítása
1.1.2. A Z-80 mikroprocesszor család elemei
1.2. Z-80-as rendszer ismertetése
1.2.1. Az órajel
1.2.2. A periféria illesztők prioritás lánca (daisy-chain)
1.2.3. A megszakítások kezelése
1.2.4. A Z80 család statikus elektromos adatai
1.3. A Z-80 központi egység (CPU) felépítése
1.3.1. A regiszterek
1.3.2. Az aritmetikai és logikai egység
1.3.3. A központi egység vezérlése
1.3.4. Az áramkör kivezetéseinek értelmezése
1.3.5. A CPU idődiagramjai
1.4. A Z-80 központi egység programozása
1.4.1. Címzési módok
1.4.2. Utasítás típusok
1.4.3. Utasítások ismertetése

1.5. Párhuzamos adatátvitel illesztő (PIO)
1.5.1. Általános ismertetés
1.5.2. Az áramkör kivezetéseinek értelmezése
1.5.3. Az üzemmódok részletes ismertetése
1.5.4. Programozás
1.5.5. Alkalmazási példák
1.5.6. A PIO idődiagrammjai

1.6. Számláló-időmérő áramkör (CTC)
1.6.1. Általános ismertetés
1.6.2. Az áramkör kivezetéseinek értelmezése
1.6.3. Az üzemmódok részletes ismertetése
1.6.4. Programozás
1.6.5. A CTC idődiagramjai

1.7. Soros adatátviteli illesztő (SIO)
1.7.1. Általános ismertetés
1.7.2. Az áramkör kivezetéseinek értelmezése
1.7.3. Az illesztő és a központi egység kapcsolata
1.7.4. Az illesztő egység és a környezet kapcsolata
1.7.5. Programozás
1.7.6. A SIO idődiagramjai

1.8. Aszinkron adatátviteli egység (DART)
1.8.1. A DART idődiagramjai

1.9. Közvetlen memória-hozzáférést biztosító egység (DMA)
1.9.1. Általános ismertetés
1.9.2. Az áramkör kivezetéseinek értelmezése
1.9.3. A közvetlen hozzáférés adatátviteli folyamatai
1.9.4. Programozás
1.9.5. Alkalmazási példák
1.9.6. A DMA idődiagramjai


Bevezetés
Hazánkban már régóta használják a Z-80 mikroprocesszor család elemeit, de részletes magyar nyelvű ismertetés nem jelent meg róluk. A Z-80 mikroprocesszorról csak a mikroprocesszorokat átfogóan ismertető művekben találhatunk pár oldalas ismertetést. A korábban megjelent i8080-as irodalma sokkal bővebb, hiszen ezt a típust sokkal nagyobb számban alkalmazzák. Nem ilyen bő, de még megfelelő szakirodalma van a Motorola 6800 típusú processzornak. Az i8080 elterjedését az egyéb processzorokkal szemben az is segítette, hogy a típuscsaládhoz bőséges angol nyelvű szakirodalom is érkezett, beszerzése is egyszerűbb volt, mint más típusoké. Ennek ellenére számos mikroprocesszor alkalmazó más típust próbált meghonosítani. Aránylag sokan választották ezek közül az i8080 utódaként kifejlesztett, korszerűbb Z-80-as típust. Igaz, hogy a Z-80-ast sok intézményünkben alkalmazzák, de gyakran az i8080 periféria- és megszakításkezelés szintjére "visszabutítva". Ennek két fő oka: a már meglevő periféria modulok használata és a megfelelő szakirodalom hiánya.
Ez a kiadvány úgy segít a Z-80-as CPU-t alkalmazni, hogy annak előnyeit valójában ki lehessen használni. Igaz, hogy a Z-80-as központi egység önmagában csak több utasításból álló utasításkészletet nyújt, viszont a család elemválasztékával együtt alkalmazva egy gyorsabb, korszerűbb és könnyen kezelhető mikroprocesszoros rendszert építhetünk.
Kiadványunk célja, hogy a Z-80-as családot alkalmazók egy jól kezelhető magyar nyelvű segédletet kapjanak. Várható, hogy a hazai processzor alkalmazók érdeklődése a Z-80-as család felé fordul, mert az NDK-beli VEB FUNKWERK ERFURT is gyártja és a Heim Electric exportálja a CPU-t, a PIO-t, a SIO-t és a CTC-t. Így a típuscsalád legfontosabb elemei KGST országból beszerezhetők.
Az ismertető foglalkozik a Z8-as MCU-val (egy chippes mikroszámítógéppe)/ és a Z8000-es családdal is. A Z8-as típus számíthat a magyar szakemberek érdeklődésére, mert az NDK-ban várhatóan a közeljövőben megkezdik a gyártását. A Z8000 egy 16 bites mikroprocesszor hasonlóan az i8086-hoz és a 68000 CPU-hoz.A Z8000-es azoknak előnyős, akik Z-80-as mikroprocesszor alkalmazási tapasztalatokkal és programokkal rendelkeznek, mivel a programok egyszerűen konvertálhatók Z8000-re.
Jelölés: Z-80 = Z80 = Z 80 a külföldi katalógusok jelölése alapján.

A mikroprocesszorról röviden (kezdőknek)
Kérjük, hogy akik járatosak a számítástechnikában, azok lapozzanak!
A mikroprocesszor nem boszorkányság, hanem egy olyan "fekete doboz", amely a vele való ismerkedés során előbb-utóbb átlátszóvá válik, majd segítőtársunk lesz. Például az automata mosógép mechanikus programkapcsolója a beépített mosóprogramot kényszeríti a mosógépre, miközben kattog-csattog. Ugyanezt a feladatot a mikroprocesszor is képes ellátni - igaz kattogás és csattogás nélkül: azaz egy feladatot elvégeztet egy berendezéssel. A feladat lehet egyszerű, de lehet bonyolult, sőt változó is, a berendezés bonyolultsága is tág határok között mozoghat.
A vezérlőegység (processzor, CPU) hajtja végre a feladat elemeit, az utasításokat. Az utasítások igen sokfélék lehetnek, pl. két információ összehasonlítása, vagy két szám összeadása, avagy egy információ elővétele a tárolóból vagy eltétele oda. Egyszerű elemi lépésekből állnak össze az egészen bonyolult programok.
A memória tárolja a végrehajtandó utasításokat és az adatokat. Hasonlatos egy hatalmas fiókos szekrényhez, melynek minden egyes fiókjában egy információ fér el, és minden egyes fiókjának van neve. A központi egység nem csak megnézni tudja az egyes fiókok tartalmát, hanem a fiókba bele is tud tenni valamilyen információt, melyet később felhasználhat.
A külvilággal való kapcsolatot úgynevezett perifériákon keresztül tartja a CPU. A periféria lehet a mosógép hőfokérzékelője, de lehet egy képernyős írógép (display), melyen az ember "beszélgetni" tud a CPU-val, ha a memóriában erre megfelelő program van.
A fentieket összefoglalva a mikroprocesszoros berendezés három alapvető elemből, funkcionális egységből áll (B.1. ábra).


Mikroprocesszoros rendszer elemei
(Tömbvázlat)

A CPU a B.1. ábrán látható módon kapcsolatot tart a memóriával és a perifériákkal. A perifériákon keresztül valósul meg a környezettel való kapcsolat. Az egyes egységek közötti kapcsolat egy ún. buszrendszer segítségével jön létre, amelyre az egyes elemek csatlakoznak:


A rendszer elemek és a busz
(Tömbvázlat)

A busz nem egy külön elem, hanem az egyes elemek, egységek között biztosítja a CPU által vezérelt összeköttetést. A buszrendszer három részből áll: címbusz, amelyen az egyes memória rekeszek címei, avagy az egyes periféria egységek címei áramlanak; adatbusz, amelyen a címbusz által címzett memóriarekesz avagy a periféria és a CPU között áramlik az adat (információ); vezérlőbusz, amely időzíti és vezérli az adatáramlást.
Egyszerű berendezések esetén a busz csupán az egységek közötti vezetékekből áll. Az egyes egységek tartalmazzák a busz meghajtását, illetve a jelek fogadását biztosító áramköröket (mint azt a későbbiekben láthatjuk, a Z-80-as család ilyen). Bonyolultabb berendezések esetén a buszrendszerhez kiegészítő áramkörök szükségesek. Például amikor több CPU működik egy buszon, összetett feladatok elvégzését is megoldhatjuk a mikroprocesszoros rendszerekkel.
Sok esetben fogjuk az i8080-nal összehasonlítani a Z-80-at, ez főleg azok számára lehet előnyös, akik az i8080-nal már dolgoztak.
Ezt az ismertetőt annak is ajánljuk, aki most ismerkedik a mikroprocesszorral és a Z-80-as családot választotta. A megismeréshez és megértéshez ez az ismertető nem elég, ezért célszerű, ha kísérletezései során egy, a témában már járatos szakember segítségére tud támaszkodni.
Felkészüléshez ajánljuk a következő kiadványokat:

Csákány - dr. Vajda: Mikroszámítógépek
Budapest, Műszaki Könyvkiadó, 1976. második kiadás 1978.

dr. Kovács Magda: Mikroprocesszoros rendszerek
Esztergom, NIMTK, 1982.

Marschik Iván: Mikroprocesszorok, Mikrogépek
Budapest SZÁMOK, 1979.

Saufert János: Mikroprogramozás, mikroprocesszorok
udapest, KG Informatik, 1977.

Vancsó Gyula: Tervezés mikroszámítógép elemekkel
Budapest, Műszaki Könyvkiadó, 1981.

A kiadványban alkalmazott fogalmak és rövidítések magyarázata:

ABORT
Adatátvitel leállítása soros, szinkron adatátvitel esetén.

Adatbusz
A processzor rendszer funkcionális egységei közötti adatátvitelt biztosítja, általában 8 (Z-80, Z8) vagy 16 (Z8000) bites adat kétirányú átvitele lehetséges.

Akkumulátor
A processzor megkülönböztetett regisztere, mellyel az aritmetikai és logikai műveleteket tudja elvégezni.

ALU
Aritmetic Logic Unit - Aritmetikai és logikai műveleteket végző egység.

BCD
Binary Coded Decimal - Binárisan kódolt decimális szám, itt egy byte-ban két digit tárolható.

BIT
Binary Digit - Az információ alapegysége, két értéke lehet: 0 és 1.

BREAK
Adatátvitel leállítása soros, aszinkron adatátvitel esetén.

Byte
1 byte általában 8 bit. Célszerben használható csoportja a biteknek.

CIO
Counter/timer and parallel I/O unit - Számláló-időzítő és párhuzamos adatátvitel vezérlő.

CPU
Central Processing Unit - Központi egység, mely az utasítások memóriából való beolvasását, értelmezését és végrehajtatását vezérli. A vezérlőbusz segítségével vezérli a hozzá kapcsolódó egységeket.

CRC
Cyclic Redundancy Check - Ciklikus redundáns ellenőrző karakter. Soros adatátvitel esetén az adatátvitel ellenőrzésére használják.

CTC
Counter Timer Circuit - Számláló-időzítő áramkör.

DART
Dual Asynchronous Receiver / Transmitter - Kettős aszinkron adatátviteli adó-vevő.

DIL
Dual In Line - Két párhuzamos sorban elhelyezett kivezetésekkel rendelkező (...tokozás).

Dinamikus memória
A tároló elemei csak rövid ideig őrzik meg a beírt adatot, megadott időn belül frissíteni kell az adatokat.

DMA
Direct Memory Access - Közvetlen memória hozzáférés. A központi egység igénybevétele nélküli memória írás, illetve olvasás. A buszok vezérlését ilyenkor az ún. DMA vezérlő végzi.

EPU
Extended Processing Unit - Külső műveletvégző egység, amely a CPU-ban nem értelmezett speciális utasítások végrehajtását végzi.

FIFO
First-In First-Out - Olyan átmeneti tároló egység, melyből a beleírással megegyező sorrendben kapjuk meg az adatokat.

Handshake
Két egymással összeköttetésben álló egység között az adatáramlást segítő vezérlő jelek.

Hardware
Egy komplex berendezés (számítógép) kézzel fogható elemei (alkatrészek, integrált áramkörök, huzalozás).

Hexadecimális szám
16-os szárrendszerben felírt szám. A számrendszer jelkészlete: 1 2 3 4 5 6 7 8 9 A E C D E F. Szokásos leírása a szám után elhelyezett "H"-val történik pl.: 1F5AH

Inicializálás
Kezdeti (alap) értékekre való beállítás.

IT
Interrupt - Megszakítás. A program futásának megszakítását jelenti. Hatására a megszakítást kezelő szubrutin futása indul.

I/O
Input / Output - Bemenet / Kimenet.

Jelzőbit
Valamely állapot meglétéről informál. Például a művelet eredménye nulla.

Logikai "0"; logikai "1"
A kétállapotú logikák állapotainak (értékeinek) jelzése.

LSB
Least Significant Bit - Legkisebb helyi értékű bit.

Maker
Jelző.

MCU
Mmicroprogram Control Unit - Mikroprogramvezérlő egység.

MMU
Memory Management Unit - Memória felügyelő egység.

MODEM
Modulátor / Demodulátor - Olyan berendezés, amely átviendő adatokat modulálással az adatátviteli rendszerhez illeszti, az adatátviteli rendszeren érkező jelekből demodulálással az adatokat előállítja.

MSB
Most Significant Bit - Legnagyobb helyértékű bit.

Multiprocesszoros üzem
A rendszerben több processzor (CPU, MCU, EPU) kapcsolódik egy közös buszra. Az egyes processzorok a műveletek nagy részét egymástól függetlenül, egyidejűleg hajtják végre.

PC
Program Counter - Program számláló regiszter. A soron következő utasítás címét tárolja.

PIO
Parallel Input / Output controller - párhuzamos I/O adatátviteli vezérlőegység.

Pointer
Mutató.

PORT
Egység, mely a külvilág felé adja, vagy onnan veszi az adatokat.

PREFIX
Előkód, itt: az utasítás kódot megelőző kód, amely az IX, IY regiszterpárok elérését kapcsolja a HL regiszterpár elérése helyett, vagy az utasítás kódot dekódoló áramkört váltja át.

PROM
Programmable Read Only Memory - Csak olvasható memória, melybe a felhasználó egy alkalommal írhatja be az adatokat.

RAM
Random Access Memory - Írható-olvasható memória.

ROM
Read Only Memory - Csak olvasható memória.

SCC
Serial Communications Controller - Soros adatátvitel vezérlő.

SDLC
Synchronous Data Link Control - Szinkron adatátviteli vonal vezérlés- IBM adatátviteli szabvány.

SIO
Serial Input / Output Controller - Soros adatátviteli vezérlőegység.

Software
A hardware által végrehajtandó cselekvéseket leíró program.

Stack
Memória-hozzáférés olyan szervezése, amikor az utolsó beírt adatot kapjuk meg legelőször.

Strobe
Kapuzójel.

TTL
Transistor Transistor Logic - Tranzisztor tranzisztor logika. Szabványosított jelszintekkel és tápfeszültséggel rendelkezik.

UPC
Unversal Peripheral Controller - Univerzális perifériavezérlő.

1.1. A Z-80-AS Mikroprocesszor család bemutatása

1.1.1. A Z-80 és az i8080-as mikroprocesszor család összehasonlítása
Amikor a Z-80-as család megjelent a piacon, akkor a központi egységet úgy reklámozták, hogy az i8080-nal programozás tekintetében felülről kompatibilis. E szempontok alapján, valamint azért, mert az i8080-at nagyon sokan ismerik, indokolt a vele való összehasonlítás.
Az összehasonlítást a tápfeszültség igénynél kezdjük: míg az i8080 három tápfeszültséget igényel, addig a Z-80 csak egyet: +5 V-ot, 5 százalékos tűréssel, így jól illeszkedik a TTL áramkörökhöz. Sok fejlesztő csupán ezért tért át a Z-80-as alkalmazására.
Az i8080 kétfázisú órajelet igényel, a Z-80 egyfázisút használ, amelyet bár nem TTL szintű, hanem 0 és 5 V a két jelszintje, TTL kapuval is elő lehet állítani, míg a kétfázisú órajel előállítása külön logikát igényel.
A központi egység az i8080-nál 3 LSI IC-ből áll (8080, i8224, i8228) ezzel szemben a Z-80 egy chipen valósítja meg ugyanezt.
A dinamikus memóriák alkalmazását megkönnyíti a Z-80-nál alkalmazott frissítő ciklus és frissítő számláló, amely az i8080-nál csak külön vezérlőegységgel oldható meg (i8202). A dinamikus RAM-ok és a Z-80-as CPU kedvezően tud együttműködni, célszerű lenne a hazai berendezésekben is elterjeszteni a dinamikus RAM-ok alkalmazását. Olcsóbbak és kisebb helyet igényelnek, Z-80-as CPU esetén pedig nincs szükség frissítő logikára. Illesztésre példa az 1.1.1. ábra.

1.1.1. ábra: Dinamikus RAM-ok illesztése a Z80-hoz

Periféria és megszakítás kezelő rendszere eltér az i8080-nál megszokott IT gyűjtős periféria és megszakítás szervezéstől. A Z-80 alkalmas az i8080-as típusú IT kezelésre is (Mode 0), de kiépítették az IT vektoros periféria kezelést is, amelyet az egyes periféria illesztők (CTC, PIO, SIO, SMA), alkalmaznak. Az ún. daisy-chain prioritásrendszerrel fix prioritás valósítható meg. A prioritás lánchoz 5-nél kevesebb periféria esetén nem kell semmiféle külső logika.
A megszakítás rendszerben, kiépítettek egy nem maszkolható megszakításkérést (NMI) is, amely igen kedvezően használható veszély, illetve tápfeszültség kimaradás esetén megszakítások kivitelezésére, avagy ahol ez nem szükséges ott idő IT -t köthetünk rá, ha nem akarjuk a CTC-t használni. i8080 esetében a "vész" megszakítás csak bonyolult külső logika alkalmazásával oldható meg.
A megszakítás elfogadásának jelzése az i8080-nál egyszerűen történik, míg a Z-80 esetében ez külön logikát igényel, ha nem alkalmazzuk a Z-80-as családbéli periféria-illesztőket. (ITACK = M1 * IORQ). A Z-80-as család periféria illesztői és egyéb kiegészítő áramkörei a megszakítás elfogadását érzékelik, valamint a megszakítást kiszolgáló rutin végét is képesek érzékelni. (RETI)

Különbségek a belső felépítésben:
A Z-80 CPU-ban több regiszter található, mint az i8080 CPU-ban. Az új regiszterek: AF'; BC'; DE'; HL'; IX; IY; I; R. A felső vesszővel jelzett regiszterek az alapregiszterek háttérregiszterei, melyek tartalma gyorsan cserélhető az alapregiszterekével, így megszakításkezeléskor a regiszterek tartalmának mentését és visszaállítását gyorsítják. Az IX és IY regiszterpárok az indexelt címzési mód indexregiszterei. Az I regiszter az IT vektor felső byte-ját tartalmazza, az R regiszter pedig a memória frissítéshez szükséges számláló.
A Z-80 CPU-ban a jelző biteket tartalmazó regiszter mind a nyolc bitje realizált, szemben az i8080-as CPU 6 jelző bitjével.
Az utasításkészlet az i8080-nál 78 utasítás, a Z-80-nál 158. Általánosságban elmondható, hogy a Z-80 utasításkészlete felülről kompatibilis az i8080 utasításkészletével.
A jelzőbitek kezelése némiképp eltér az i8080 jelzőbit kezelésétől. Így a jelzőbiteket kezelő i8080-ra irt programok Z-80-ra való átültetése előtt át kell nézni ezeket. Módosult a DAA utasítás is. Míg az i8080 esetében kivonás után a DAA helytelen eredményt adott, a Z-80-ban az "N" flag kezelésével a DAA minden esetben helyes eredményt ad.
A memória kezelő utasítások tekintetében nagy jelentőségű előrelépés az i8080-hoz képest az indexelt címzés és a bit operáció. Az indexelt címzésnél az IX, illetve az IY indexregiszter tartalmához az utasításban adott előjeles szám hozzáadásával áll elő a konkrét memóriacím. A processzorban adott bármely címzési móddal leírt byte (direkt, HL segítségével és indexelt) tetszőleges bitje tesztelhető (BIT), beállítható "1"-be (SET), és törölhető (RES). A nyolc bites aritmetikai utasításokat bitenkénti léptető és fél byte-os, memóriát is érintő eltolással egészítette ki. (Ez utóbbi a tömörített BCD műveletek esetén jelentős.) Igen kedvező, hogy a bites shift és rotate utasítások minden címzési módban érvényesek, nem csupán az akkumulátorra írhatók elő.
Az i8080-hoz képest a 16 bites aritmetikai műveletek is bővültek az átvitelt is tartalmazó kivonással. Az Intel 8080-nál meglevő DAD utasítás csak a HL-t tekintette akkumulátornak, míg az ezt helyettesítő ADD a Z-80-nál nem csupán a HL és egy regiszter-pár közötti műveletet ismer, hanem IX-et, IY-t is tudja akkumulátorként kezelni.
Az ugrásoknál bevezették a relatív ugrást, igaz, korlátozott feltétel esetre (paritásra és előjelre nem értelmezett). Ezen kívül a ciklust záró relatív ugrás használható kedvezően, amely a B regisztert tekinti ciklusszámlálónak.
Az i8080 esetében az I/O utasítás csak direkt címzésű lehetett, így PROM-ban futó program nem volt képes kiszámított I/O utasításra. Ezért alkalmaztak előszeretettel memóriába ágyazott I/O-t, avagy program-generálással lehetett ezt áthidalni. Z-80 esetén a C regisztert lehet felhasználni az I/O egységek címzésére. Az i8080 az I/O címzésekor az alsó és felső címbuszra ugyanazt az értéket, az I/O egység címét küldi ki. A Z-80 ettől eltérően, csak az alsó címbuszra küldi ki az I/O címet, a felsőre az utasítás típusától függően vagy az akkumulátor vagy a B regiszter tartalmát. Közvetett úton (lapozós eljáráshoz hasonlóan) így 65535 I/O egység csatlakoztatására van lehetőség. Ezt a specialitást másra is használhatjuk ciklikus I/O műveletek esetében.
Van olyan utasítás (IN A,F), amikor az adatot nem veszi be a CPU, csak a jelzőbiteket állítja be az adat tartalmának megfelelően.
Új utasítástípus a blokk utasítás. Ide sorolják a háttér regiszter blokk két részletben való cseréjét és a blokkos memóriamozgatást, mellyel mind a 64K memória területet egy utasítással át lehet mozgatni máshová. Létezik mozgatás felfelé és lefelé, így elkerülhető az átmásolandó rész felülírása.

1.1.2. A Z-80 mikroprocesszor család elemei
A Z-80 CPU mellett a családhoz tartozó intelligens periféria vezérlők és kiegészítő áramkörök is megjelentek:

PIO - Parallel Input / Output Controller
- Párhuzamos adatátviteli illesztő
CTC - Counter / Timer Circuit
- Számláló-időmérő áramkör
SIO - Serial Input/Output Controller
- Soros adatátviteli illesztő
DART - Dual Asynchronous Receiver / Transmitter
- Aszinkron adatátviteli egység
DMA - Direct Memory Access Controller
- Közvetlen memória-hozzáférést biztosító egység
UPC - Universal Peripheral Controller
- Általános periféria illesztő
CIO - Counter / Timer and Parallel I/O Unit
- Számláló-időzítő és párhuzamos I/O
FIO - FIFO Input/Output Interface Unit
- Adatátvitel illesztő

Az utolsó három áramkör nem a CPU-val egyidőben jelent meg a piacon, hanem később, így ezek nem csak a Z-80 család elemei, hanem a Z8000 és Z8 központi egységekhez is illeszkednek. Ezért adjuk a Z8 családnál ismertetésüket.
Megjelent a piacon a Z800 CPU, amely a Z-80 CPU utasításkészletével kompatibilis, kiegészítve egy-két utasítással, mint például osztás és szorzás. Ezen kívül a Z8000 rendszer memória felügyelő áramkörének szűkített szolgáltatásaival egészítették ki a központi egységet. Bővebb információt könyvünk II. kötete tartalmaz.
A ZILOG cég áramköreinek legjelentősebb másodgyártója a MOSTEK a fentieken kívül kifejlesztett egy ún. "COMBO" áramkört, mely az UPC-hez hasonló periféria illesztő (MK 3886). Ismertetését a 3.7. fejezet tartalmazza.
A Z-80-as családot több cég gyártja a ZILOG-on kívül. Az alábbiakban egy összehasonlító táblázatot adunk közre, mellyel az egyes gyártök áramkörei a számozás alapján azonosíthatók.

A Z-80-as elemek különböző gyártók szerinti
típusszámainak összehasonlító táblázata

ZILOG és SGS-ATES
MOSTEK
RFT
SHARP
CPU Z8400
PIO Z8420
CTC Z8430
DMA Z8410
SIO Z8440
SIO Z8441
SIO Z8442
SIO Z8449/9
DART Z8470
SCC Z8530
UPC Z8590, 1, 2, 3, 4
CIO Z8536
FIO Z85538
COMBO
MK 3880
MK 3881
MK 3882
MK 3883
MK 3884
MK 3885
MK 3886






MK 3886

U 880 D
U 855 D
U 857 D

U 856 D

LH-0080
LH-0081
LH-0082
LH-0083
LH-0084

1.2. Z-80-as rendszer ismertetése
A Z-80 CPU és a Z-80 periféria illesztők úgy alkotnak egy családot, hogy az együttesen igen kedvező adottságaikat külön-külön nem tudják nyújtani. Azaz Z-80-as periféria illesztőket nem célszerű i8080 CPU-val házasítani. Ennek az az oka, hogy az egyes elemek egymást szolgálják ki, és olyan célszerű megoldásokat alkalmaztak a tervezők, amelyeket ezen család elemei együtt tudnak megvalósítani. Ilyen például a megszakítás vektoros kezelése, a daisy-chain, a RETI dekódolás és a közös órajelű busz.
Az egyes egységek ki- és bemeneti pontjai TTL kompatibilisek, a kimenetek legalább 1,1 szabványos TTL meghajtására képesek (IOL min = 1,8 mA).

1.2.1. Az órajel
A közös buszon az órajel fontos szerepet játszik, ez szinkronizálja az egyes jeleket. Az i8080 buszán nincs ilyen órajel, így a Z-80 periféria illesztők egyszerűen nem kapcsolhatók közvetlenül az i8080-hoz, de az Intel periféria illesztői közvetlenül kapcsolhatók a Z-80-hoz. Az Intel cég áramköreinek alkalmazásakor természetesen a Z-80 periféria illesztők adta többlet-szolgáltatásokról le kell mondanunk, vagy kiegészítő logikai áramkörök segítségével tudjuk azokat megvalósítani.
Az órajel különleges jelszinteket igényel:

-0,3 < VIL < 0,45
VCC -0,6 < VIH < VCC + 0,3
C < 20 - 40pF

Az órajelhez TTL kapuval is elő lehet állítani a szükséges jelszintet. Lásd 1.2.1-1. ábra.


1.2.1-1. ábra: Órajel kiválasztása TTL kapuval

Általában egy Z-80 rendszerben több órajel-bemenet található, így célszerű egy tranzisztoros órajel-meghajtót alkalmazni. Lásd 1.2.1.-2. ábra. A kapcsolásban a tranzisztort úgy kell megválasztani, hogy a kollektorbázis kapacitása lehetőleg kicsi legyen, ellenkező esetben nem tud elég gyorsan kapcsolni. Az órajel fel- és lefutásának maximális ideje 30 ns (Z8000-nél 20 ns). Az így előállított órajel megfelel a ZILOG cég által gyártott mikroprocesszor családok órajel követelményeinek.


1.2.1-2. ábra: Tranzisztoros órajel-meghajtó

1.2.2. A periféria illesztők prioritás lánca (daisy-chain)
A periféria illesztő áramkörök célszerven I/O-ként kötendők be. Az áramkörök a megszakításkérés elfogadását a vezérlő jelekből olvassák, kódolják ki, mivel a vezérlőbuszon nincs ún. ITACK jel, ami jelezné a megszakítást kérő egység felé a megszakításkérés elfogadását. (ITACK = M1 = IORQ)
Ha a memóriába ágyazott I/O bekötést akarjuk realizálni, le kell mondanunk a vektoros megszakításkezelés szolgáltatásról, vagy kisegítő áramköröket kell alkalmazni. Az utóbbi sokkal nagyobb hátrány, mint ami kevés előnyt nyújt a memóriába ágyazás, figyelembe véve az új Z-80 I/O utasításokat (blokkos I/O, kiszámított I/O címzés).
A periféria illesztők és kiegészítő áramkörök számára egy prioritás láncot alkottak a tervezők, melyet daisy-chain-ak hívnak. A daisy-chain segítségével egyszerűen valósítható meg egy felfűzött-fix prioritás lánc. A legelső elem a legmagasabb prioritású, a legutolsó pedig a legalacsonyabb. Az egyes elemek az IEI és IEO pontokban kapcsolódnak egymáshoz úgy, hogy a legelső elem IEI pontja logikai "1" szintet kap. Ha ide logikai "0"-át adunk, az egész lánc IT tiltást nap. Az utolsó elem IEO pontja nem csatlakozik sehova. Ezen a ponton logikai "0" szintet érzékelhetünk, ha a láncban valahol megszakításkezelés történik. Ha valamely periféria illesztő egység megszakítást akar kérni, és az IEI bemenete logikai "1" szinten van, az -INT vezetéket logikai "0"-ba húzhatja. Ezzel egyidőben az IEO kimenetén logikai "0" szint jelenik meg. Ez jelzi az alacsonyabb prioritású perifériák felé, hogy a megszakításkérésük tiltott.
Minden egyes utasítás utolsó T ciklusában az órajel felfutó élével szinkronizálva a CPU mintát vesz az -INT bemenetről. Ha ez logikai "0", akkor a következő M1 ciklusban nem ad ki -MREQ és -RD jelet, hanem két várakozó ciklust végez, és az első várakozó ciklusban kiadja az -IORQ jelet. A második várakozó ciklus után a - WAIT jel hatására újabb várakozó ciklusokat tud beiktatni. A várakozó ciklusok után az adatvonalról az IT vektor alsó byte - ját beolvassa ( természetesen a CPU-nak IT MODE = 2-ben kell lennie ) . Ez idő alatt az I E jelnek végig kell futnia a láncon, nehogy két egység adja be egyszerre az IT vektort. Az 1 .2.2-l. ábra idődiagramján látható, hogy az IE jel terjedésére milyen idő áll rendelkezésre.


1.2.2-1 ábra: IE jel terjedése IT kéréskor

Az egyes egységek késleltetése: tDL(IO). Ennek maximális értéke normál áramköröknél 130-170 ns közötti. Az -M1 lefutása és az -IORQ lefutása közötti idő normál CPU-nál: tmv = 2tc+tw(0H)+tf-80. Ennek minimális értéke: 900 ns. Az "A" változatnál a képlet: tmv = 2tc+tw(0H)+tf-65. Ehhez a minimális idő 545 ns. Normál CPU és normál periféria illesztő esetén 4 I/O egység csatlakoztatható a daisy-chain-re.
RETI kiadásakor a daisy-chain-en az IE jel ellenkező irányban terjed, de ennek nem kritikus az ideje, mert a RETI utasítás 14 T ciklus hosszú és az "0EDH" hatására már indítja az IE-t az éppen kiszolgált periféria illesztő. Az IE jel terjedése RETI esetén az 1.2.2-2. ábrán látható.


1.2.2-2 ábra: IE jel terjedése RETI esetén

 

Több periféria illesztő esetén az IE jel terjedésének sebességét átvitel gyorsító logikával növelhetjük. Erre példát az 1.2.2-3. ábrán mutatunk be.


1.2.2-3. ábra: IE jel terjedését gyorsító áramkör

A megszakítás kiszolgálását egy RETI utasítással kell lezárni. Ennek utasításkódját a perifériák dekódolják és ennek megfelelően a kiszolgált megszakításkérő az IEO kimenet logikai "1"-be emelésével engedélyezi az alacsonyabb szintű megszakításkérők érvényesülését.
Magasabb prioritású periféria az alacsonyabb prioritású periféria kiszolgálását megszakíthatja. Ebben az esetben érkező RETI hatására csak a magasabb prioritású, éppen kiszolgálás alatt levő periféria tekinti majd úgy, hogy az ő kiszolgálása befejeződött, az alacsonyabb prioritású kiszolgálása pedig folytatódik, majd egy következő RETI-vel zárul.
Erre példát a 1.2.2-4. ábrán láthatunk.


1.2.2-4 ábra: A DAISY-CHAIN működése

Az ábrán bemutatott események leírása:

a. alaphelyzet
b. a 3. egység a környezetből olyan jelet kap, mely hatására megszakítást kér a CPU-tól,
c. az 1. egység is jelet kap, melyre megszakítást kér, a 3. egység kiszolgálása megszakad,
d. az első egység kiszolgálása közben a 2. egységbe érkezik megszakítási kérelmet igénylő külső jel, de nem érvényesül,
e. az 1. e g ység kiszolgálása befejeződött ( RETI ) , ezután a 2. egység megszakításkérése érvényre jut, a 3. egység kiszolgálása még mindig függőben van.
f. a 2. egység kiszolgálása folyik.
e. a 2. egység kiszolgálása befejeződött (RETI), a 3. egység kiszolgálása folytatódik.
h. a 3. egység kiszolgálása folyik.
i. a 3. egység kiszolgálása is befejeződött (RETI).

Az egyes periféria illesztő áramkörökben több megszakításkérő található (pl. PIO:2, CTC:4, SIO:6, DMA:4), amelyek belül hasonlóan vannak felfűzve, mint a daisy-chain-ben az egységek.

1.2.3. A megszakítások kezelése
A Z-80 rendszerben kétféle külső megszakításkérés létezik, a maszkolható (-INT) és a nem maszkolható (-NMI) megszakításkérés.
A nem maszkolható megszakításkérés egy fix című (66H) szubrutinhívást eredményez. Ezt a megszakításkérést programból nem tilthatjuk, ezért a CPU minden állapotában kivéve a BUSACK állapotot, amikor a busz vezérlését átadta - érvényesülhet az -NMI. Kedvezően használható veszély jelzésére, vagy multiprogramozott üzemben ütemezésre.
A maszkolható megszakításkérés (-INT) háromféle üzemmódban működik, amely üzemmódokat a programban állíthatjuk be. A "0" IT üzemmód megfelel az i8080 megszakításkezelési módszerének, azaz az adatbuszról érkező utasítást hajtja végre a CPU. Az i8080-tól annyiban eltér, hogy több byte-os utasítás esetén is csak az elsőnél ad a központi egység az -ITACK-nak megfelelő vezérlőjel kombinációt. Az "1"-es IT üzemmód egy fix című (38H) szubrutinhívás. A "2" IT üzemmód az ún. vektoros megszakításkérés kezelés.
A vektoros megszakítás kezelése: A megszakításkérés elfogadása után a beolvasott IT vektorból, mint alsó byte-ból és az I regiszter tartalmából mint felső byte-ból alakul ki egy 16 bites cím. Az így kicímzett memóriahelytől kezdve két byte-ot olvas be a CPU. A beolvasott két byte szintén 16 bites címként értelmezett. Ez a cím a megszakítást kezelő szubrutin kezdőcíme. A CPU a megszakításkérés hatására ezt a szubrutint hívja meg.
A cím kialakítását és az IT rutin hívását lásd az 1.2.3-1. ábrán.


1.2.3-1. ábra: Címkiszámítás vektoros IT esetén

1.2.4. A Z80 család statikus elektromos adatai

1.2.4-1. ábra: A Z80 család statikus elektromos adatai

1.3. A Z-80 központi egység (CPU) felépítése
A 1.3-1. ábrán látható a Z-80 CPU felépítésének blokkvázlata. Ez tartalmazza azokat a fő elemeket, amelyekre a következőkben hivatkozni fogunk.

1.3-1 ábra: a Z-80 CPU blokkvázlata

1.3.1. A regiszterek
A Z-80-as CPU tartalmaz egy 208 bites memóriát, amelyet a programozó elérhet. A z 1 .3.1-1 . ábrán látható ennek a memóriának a felosztása 18 darab 8 bites és 4 darab 16 bites regiszterre.

Akkumulátor
A
Jelző bitek
F
Akkumulátor
A'
Jelző bitek
F'
B
C
B'
C'
D
E
D'
E'
H
L
H'
L'
I
R
XH
XL
YH
YL
SP
PC

A hat általános célú regiszterből két készlet áll rendelkezésünkre és ezeket mind 8 bitesként, mind 16 bitesként használhatjuk. Az akkumulátor és jelzőbit regiszterekből is két készlet van. Meghatározott célú regiszterként programszámlálót (16 bit), stack mutatót (16 bit), két indexregisztert (16 vagy 2*8 bites regiszterenként), megszakítás lapcím regisztert (8 bit) és memória frissítő számláló-regiszter (7 bit) találunk. Az R regiszter 8 bites; a legnagyobb helyértékű bitje szabadon átírható. Az alsó 7 bit tartalma nő eggyel (mod 128) minden befejezett M1 ciklus után. Frissítés ideje alatt az R regiszter mind a 7 bitje kerül az A0...A6-ra, az A7=0 és az I regiszter tartalma kerül az A8-A15-re.

Az akkumulátor és a jelzőbitek
A központi egység két egymástól független 8 bites akkumulátort és a velük kapcsolatos 8-8 jelzőbitet tartalmaz. Az akkumulátorban található a 8 bites aritmetikai vagy logikai művelet eredménye és a jelzőbitek meghatározott állapotával mutatja a 8 vagy 16 bites műveletek eredményének jellegét, mint például az eredmény nulla, túlcsordulás volt, paritás, előjel, előző aritmetikai művelet jellege és fél byte közötti átvitel. A programozó egy egyszerű csereutasítással bármelyik akkumulátort, illetve hozzá tartozó jelzőbiteket kiválaszthatja.
Az F regiszter felépítése:

S
Z
X
H
X
P/V
N
C

Általános regiszterek
Az általános regiszterekből két készlet áll rendelkezésre, ezek mindegyike hat darab 8 bites regisztert tartalmaz, melyek 8 bitesként és 16 bitesként is felhasználhatók. Az egyik készlet jelzése: BC, DE, HL; a másiké BC', DE', HL' regiszterpárok. A programozó az éppen üzemelő regiszterkészletet egy egyszerű csereutasítással választja ki. Ha a rendszerben nagyon gyors megszakításkezelésre van szükség, az általános regiszterek és az akkumulátorok egyik készletét fenntarthatjuk a gyors kezelő rutin számára. A csereutasítás után már futhat is a rutin. Ezzel a megszakítás kezelésének ideje erősen lecsökken, nincs szükség külső stackbe való mentésre. Ezek a regiszterek széleskörűen felhasználhatók a programozásban. A programozás használatukkal egyszerűsödik, sok esetben a szubrutinok közötti paraméterátadás regiszterekben megoldható.

1.3.2. Az aritmetikai és logikai egység
A 8 bites aritmetikai és logikai utasításokat a központi egység az aritmetikai és logikai egység (ALU) segítségével hajtja végre. Az ALU a regiszterekkel és a külső adatbusszal egy belső adatbuszon át csatlakozik. Az ALU funkciói:

Az egyes utasításokat a programozásról szóló részben ismertetjük.

1.3.3. A központi egység vezérlése
A központi egység a mikroprocesszoros rendszer vezérlő egysége. A központi egységen belül is vannak vezérlési feladatok, ezeket a CPU vezérlő egysége és az utasítás-dekódoló regisztere látja el. A vezérlőegység huzalozott logika segítségével állítja elő a megfelelő vezérlő jeleket, amelyek a belső egységek működéséhez szükségesek, valamint a központi egység kivezetésein megjelenő vezérlő jeleket, amelyek a CPU-hoz kapcsolódó áramköröket vezérlik.
A vezérlőegység működését az utasítások határozzák meg.

A központi egység ciklusai:
A központi egységben kétféle ciklust különböztethetünk meg. A rendszer órajel ciklusa ( T ) és az ezekből felépülő gépi ciklus. Egy utasítás végrehajtása egy vagy több ( max. 6 ) gépi ciklusból áll. Az utasítás-ciklus felépítését az 1.3.3-1. ábra mutatja be.


1.3.3-1. ábra: Utasítás ciklus felépítése

Minden utasítás az utasításkód beolvasásával kezdődik. Egy és két byte-os utasításkódú utasításokat tud a központi egység értelmezni, ennek megfelelően M1 ciklusból egy vagy kettő lehet egy utasításban. Ha az utasítás memóriarekeszbe történő beírást, vagy kiolvasást igényel, azok az M1 ciklus után következnek az utasításból adódó sorrendben. Minden gépi ciklus nyújtható várakozó (Tw) ciklusok beszúrásával. Ez a -WAIT bemenet aktivizálásával érhető el. A központi egység a perifériaillesztőkkel kapcsolatos gépi ciklusokba automatikusan beszúr egy várakozó ciklust. Ha ez nem elégséges, természetesen ezen ciklusok tovább nyújthatók.
A különböző gépi ciklusok idődiagramját az 1.3.3-2.-11. ábrák mutatják be.


1.3.3-2. ábra: Utasításkód olvasás


1.3.3-1. ábra: Utasításkód olvasás várakozással


1.3.3-4. ábra: Mamória-hozzáférés


1.3.3-5. ábra: Memória hozzáférés várakozással


1.3.3-6. ábra: I/O hozzáférés


1.3.3-7. ábra: I/O hozzáférés várakozással


1.3.3-8. ábra: Buszkérés és elfogadás


1.3.3-9 ábra: Maszkolható megszakításkérés és elfogadás


1.3.3-10. ábra: Nem maszkolható megszakításkérés


1.3.3-11 ábra.: Megállás

A központi egység indítása
A -RESET bemenetre adott jelre a 0000 memória címen levő byte-ot olvassa be a központi egység. Ezt értelmezi legelső utasításként. Amint az utasítás a memóriából megérkezik, az utasítás regiszterbe kerül, az dekódolja. Az utasítás dekódolt formája a vezérlőrész számára ad információt, a vezérlőrész ettől függő kapcsolási és jelelőállítási tevékenységet folytat, azaz végrehajtja, illetve végrehajtatja az utasítást.

Vezérlés busz- és megszakításkérés esetén
A vezérlőegység, a gépi ciklus utolsó T ciklusában figyeli a -BUSRQ, -NMI és - I NT bemeneteket. Az 1.3.3-12. ábrán látható ennek folyamata.


1.3.3-12 ábra: Busz- és megszakításkérés folyamatábrája

A figyelés a rendszer órajel felfutásakor indul. Legelőször a -BUSRQ bemenetet vizsgálja a vezérlőegység. Ha buszkérést érzékel, akkor bebillenti a BUSRQ flip-flopot (BUSRQ F/F). Ha az utasítás végrehajtás utolsó gépi ciklusában van a központi egység, akkor vizsgálja a -NMI bemenetet. Ha van maszkolatlan megszakításkérés, akkor ennek flip-flopját (NMI F/F) beállítja. Ja nincs, vizsgálja az -INT bemenetet. Megszakításkérés esetén a hozzá tartozó INT F/F flip-flopot állítja be. A bemenetek vizsgálata után a flip-flopok állapota alapján dönt az egyes gépi funkciók végrehajtásáról. Ha a buszkérés flip-flop állapota logikai "1", akkor a buszt a központi egység elengedi, csak a -BUSRQ bemenetet figyeli. Csak akkor veszi vissza a buszvezérlést, ha a -BUSRQ bemenet állapota ezt lehetővé teszi. A folyamatábrából kiderül, hogy az idő alatt, míg a buszt nem vezérli a központi egység a megszakításkérések sem érkezhetnek be. A buszkérés előtt érkezett megszakításkérések juthatnak csak érvényre a busz vezérlésének visszavételekor. Itt hívjuk fel újra a figyelmet, hogy a busz elengedett állapotában a dinamikus memóriák frissítése természetesen nem történik meg a központi egység által. Erről a buszt éppen vezérlő egységnek kell gondoskodnia.
Az M1 és RFSH vonal logikai "1" állapotba kerül a busz elengedett állapotában.

Nem maszkolható megszakításkérések
A nem maszkolható megszakításkérés esetén a CPU a futó utasítás után következő utasítást a memóriától kapja, de hatása már nem érvényesül, azaz az utasításdekódoló logika a kapott utasítás helyett a következő lépéseket vezérli: a PC tartalmának mentése a stackbe, maszkolható megszakításkérési állapot (IFF1) mentése és a maszkolható megszakításkérés tiltása (DI), majd ugrás a 66H címre:

(SP):=PC
SP:=SP-2
IFF2:=IFF1
IFF1:=0
PC:=66H

A 66H címen levő szubrutin a mentett maszkolható megszakításkérési állapotot (IFF2) lekérdezheti az alábbi két utasítással: LD A,I és LD A,R. Mindkét esetben IFF2 értéke a paritás jelzőbit helyére kerül. A szubrutin lezárására a RETN utasítás szolgál, mely a szubrutinból való visszatérésen kívül az IFF visszaállítását is elvégzi:

PC:=(SP)
SP:=SP+2
IFF1:=IFF2

Az IFF jelzőbit beállítását, vizsgálatát, mentését és visszaállítását az alábbiakban foglaljuk össze:

Utasítás vagy esemény
IFF1
IFF2
P/V
CPU RESET
DI
EI *
LD A,I
LD A,R
-NMI
RETN
RETI
-INT
0
0
1
x
x
0
IFF2
x
0
0
0
1
x
x
IFF1
x
x
0
x
x
x
IFF2
IFF2
x
x
x
x

* A megszakítás engedélyezése csal: az EI utasítást követő utasítás (általában RET) végrehajtása után történik!
Megjegyzés: x = változatlan.

Maszkolható megszakításkérések
Az i8080 típusú megszakításkezelési üzemmódban (IT mód = 0) a CPU a megszakításkérés elfogadása után az adatbuszról olvasott utasítást hajtja végre, melyet külön logikának kell a buszra kapuznia.


1.3.3-13. ábra: IT mód=0 folyamatábrája

Ha a központi egység IT mód = 1 állapotban van, akkor az 1.3.3-14. ábrán látható folyamatábra szerint működik a vezérlés megszakításkéréskor.


1.3.3-14. ábra: IT mód=1 folyamatábrája

A folyamat igen egyszerű: a megszakítás tiltása után az aktuális programszámláló tartalmat a stackbe menti, majd a 38H címet tölti a programszámlálóba. Ez megfelel a 38H címre való szubrutinhívásnak.

A megszakításkezelések közül a legdinamikusabb a vektoros megszakításkérés kezelése (IT mód = 2). Ekkor van szükség a periféria illesztők intelligens viselkedésére is. A folyamatot az 1.3.3-15. és 1.2.3-1. ábrákon tanulmányozhatjuk.


1.3.3-15 ábra: IT mód=2 folyamatábrája

A központi egység először tiltja a megszakításkérést, majd az ITACK ciklusban az IT vektort olvassa be (1). A periféria illesztőknek érzékelniük kell az ITACK ciklust és az adatbuszra kell kapuznia a megszakítást kérő egységnek a rá jellemző IT vektort. A központi egység menti az aktuális programszámláló tartalmát (2), majd az I regisztert, mint felső címbyte-ot használva és a beolvasott IT vektort mint alsó címbyte-ot használva előállít egy címet. Ezen a címen kell elhelyezkednie a memóriában a megszakítást lekezelő rutin kezdőcímének.
Az ugrótábla ilyen felépítése 128 különböző IT vektort enged meg egy időben, mivel egy IT vektorhoz két címbyte tartozik és az I regiszter módosítása nélkül 256 memóriahelyet érhetünk el. Az ugrótáblából beolvasott címet tölti a központi egység vezérlőegysége a programszámlálóba, azaz a megadott címre ugrik.

1.3.4. Az áramkör kivezetéseinek értelmezése
A Z-80 központi egység 40 kivezetéses DIL tokozásban kerül forgalomba. A kivezetéseket az 1.3.4-1. ábra mutatja. Az NDK-ban gyártott áramkörök kivezetés-kiosztása metrikus: 2,5 mm. Újabban visszatértek a coll-os osztásra (2,54 mm). (ld. még 1 .2.3-1. ábra.)


1.3.4-1. ábra: A Z-80 CPU kivezetései

Az egyes kivezetések funkciója a következő:

A0-A15
Címbusz (ADDRESS BUS)
Három állapotú kimenet, az aktív szint a logikai "1". A címbuszon keresztül történik a memóriarekeszek (16 bites cím), valamint az I/O egységek címzése (8 bites cím) az alsó 8 bithelyen (sok esetben jól definiált 16 bites I/O címet ad ki a CPU; ezt lásd részletesen a programozásról szóló részben: az I/O-nál). Így 64 kbyte memória címezhető (utasítás és adat-terület), illetve 256 (64k) I/O érhető el. A frissítő ciklusban az alsó 7 bithelyen kerül ki a frissítő cím.
D0-D7 Adatbusz (DATA BUS)
Három állapotú, kétirányú busz, az aktív szint a logikai "1". Az adatbuszon áramlanak az adatok a memória, az I/O egységek és a CPU között.
-M1 Utasításkód olvasás (MACHINE CYCLE)
Kimenet, az aktív szint a logikai "0". Jelzi, ha a CPU az utasítást olvassa. Két byte-os utasításkódok esetében kétszer adja ki a CPU. Az -IORQ jellel együtt jelentkezve a megszakítás elfogadást jelzi.
-MREQ Memória hozzáférés igény (MEMORY REQUEST)
Három állapotú kimenet, az aktív állapot a logikai "0". Ez a jel mutatja, hogy a gép a címbuszon a memória számára érvényes címet adott ki.
-IORQ
I/O hozzáférés igény (I/O REQUEST)
Három állapotú kimenet, az aktív állapot a logikai "0". Jelzi, hogy a CPU a címbusz alsó felén érvényes I/O címet küldött ki. Ha ez az -M1 jellel együtt érkezik, akkor az IT vektort az adatbuszra lehet kapuzni.
-RD
Olvasás (READ)
Három állapotú kimenet, az aktív állapot a logikai "0". Jelzi, hogy a központi egység adatot kíván olvasni a memóriából, vagy az I/O egységből. A címzett I/O egység vagy a memória ezt a jelet használhatja arra, hogy adatát a CPU adatbuszára kapuzza.
-WR Írás (WRITE)
Három állapotú kimenet, az aktív állapot a logikai "0". Jelzi, hogy az adatbuszon a központi egység adatot ad a memória vagy az I/O egység számára.
-RFSH Frissítés (REFRESH)
Kimenet, az aktív állapot a logikai "0". Jelzi, hogy a címbusz alsó 7 bitje a frissítő címet tartalmazza a dinamikus memóriák számára, és a -MREQ a frissítő olvasás jele.
-HALT
Megállás (HALT)
Kimenet, az aktív állapot a logikai "0". Jelzi, hogy a CPU egy HALT software utasítást hajtott végre, és vár egy nem maszkolt vagy egy maszkolt (ha engedélyezett) megszakításra. Míg a gép áll, a központi egység NOP utasításokat hajt végre, hogy a memória frissítés folyhasson.
-WAIT
Várakozás (WAIT)
Bemenet, az aktív állapot a logikai "0". Jelzi, hogy a CPU által címzett memória vagy I/O egység még nem kész az adatátvitelre. A CPU addig vár, ameddig ez a jel aktív, így tetszőleges sebességű memória vagy I/O egység szinkronizálható a CPU-val.
-INT
Megszakításkérés (IT REQUEST)
Bemenet, az aktív állapot a logikai "0". Megszakításkérés jelet az I/O egység ad. Egy kérés akkor kerül elfogadásra, ha az éppen futó utasítás befejeződött, és a belső, megszakítás engedélyező flip-flop (IFF) engedélyezi, de a -BUSRQ jel nem aktív. Ha a CPU elfogadta a megszakításkérést azt a következő utasítás ciklusban jelzi (-IORQ és -M1 egyidőben).
-NMI
Maszkolatlan megszakításkérés (NON MASKABLE INTERRUPT)
Bemenet, negatív élre triggerelt. A maszkolatlan megszakításkérés nagyobb prioritású, mint az -INT és a futó utasítás befejezése után függetlenül a belső megszakítás engedélyező flip-flop állásától mindig végrehajtásra kerül. Az -NMI automatikusan szubrutinhívást hajt végre a 0066H címre. A programszámláló tartartalma automatikusan mentésre kerül a külső stackbe, ami biztosítja a visszatérést a megszakított programba. Megjegyzendő, hogy a folyamatos WAIT ciklus megakadályozza a futó utasítás befejezését, valamint a -BUSRQ magasabb rendű, mint az -NMI.
-RESET
Törlés (RESET)
Bemenet, az aktív állapot a logikai "0". A programszámlálót nulláza és a CPU-t a következőképpen állítja alaphelyzetbe:
1. Tiltja a megszakítást engedélyező flip-flop-ot.
2. I = 0
3. R = 0
4. IT mód = 0
A -RESET ideje alatt (legalább 3 óraciklus) a címbusz és az adatbusz nagy-impedanciás állapotba kerül, és mindegyik vezérlőjel-kimenet inaktív állapotba kerül. Nincs frissítés.
-BUSRQ
Buszkérés (BUS REQUEST)
Bemenet, az aktív állapot a logikai "0". A buszkérés hatására a központi egység címbusza, adatbusza és a három állapotú kimenő vezérlőjel-vonalak nagy-impedanciás állapotba kerülnek, így egy külső egység ezeket vezérelni tudja. Amikor a -BUSRQ aktív, a CPU az említett buszokat nagy-impedanciás állapotba viszi rögtőn azután, ahogy az aktuális T ciklust befejezte. Az M1 és az RFSH nem három állapotú kimenet.
-BUSAK Buszkérés elfogadása (BUS ACKNOWLEDGE)
Kimenet, az aktív állapot a logikai "0". Jelzi a buszt kérő egységnek, hogy a CPU buszai nagy-impedanciás állapotba kerültek, és vezérlésük átvehető.
Rendszer órajel (SYSTEM CLOCK)
Egyfázisú, nem TTL szintű órajel.

Megjegyzés: Ha a Z-80 CPU WAIT vagy BUSAK állapotban van, a dinamikus memóriafrissítés nem működik!
Végül ismertetjük a CPU idődiagramjait.

1.3.5. A CPU idődiagramjai

1.3.4-2. ábra: A CPU idődiagramjai

Az idődiagramban szereplő számok jelentése (az adatok nsec-ben értendők):

szám értelmezés
Z-80 CPU
Z-80A CPU
Z-80B CPU
min
max
nin
max
min
max
1
2
3
4
5
6
7
8
9

10
11
12
13

14

15

16

17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44

45
46
47

48
49
órajel periódusidő
órajel logikai "1" szint
órajel logikai "0" szint
órajel fel-, és lefutás
cím késleltetés
címbusz elengedési idő
címbusz érvényes -MREQ előtt
címbusz érvényes I/O ciklusban
címbusz érvényes a
     vezérlőjelek után
címbusz elengedés
adatbusz késleltetés
adatbusz elengedés írás után
adat előkészületi idő M1
      ciklusban
adat előkészületi idő
     M2...M5 ciklusban
adatbusz érvényes -WR
     előtt (mem.c)
adatbusz érvényes -WR
     előtt (I/O c.)
adatbusz érvényes -WR után
jel-tartási idő
-MREQ "0" késleltetés (clk le)
-MREQ "1" késleltetés (clk fel)
-MREQ "1" késleltetés (clk le)
-MREQ logikai "0" szint
-MREQ logikai "1" szint
-IORQ "0" késleltetés (clk fel)
-IORQ "0" késleltetés (clk le)
-IORQ "1" késleltetés (clk fel)
-IORQ "1" késleltetés (clk le)
-RD "0" késleltetés (clk fel)
-RD "0" késleltetés (clk le)
-RD "1" késleltetés (clk fel)
-RD "1" késleltetés (clk le)
-WR "0" késleltetés (clk fel)
-WR "0" késleltetés (clk le)
-WR "1" késleltetés (clk le)
-WR logikai "0" szint
M1 "0" késleltetés (clk fel)
M1 "1" késleltetés (clk fel)
-RFSH "0" késleltetés (clk fel)
-RFSH "1" késleltetés (clk fel)
-WAIT előkészületi idő (clk fel)
-HALT késleltetés (clk le)
-INT előkészületi idő (clk fel)
-NMI logikai "0" szint
-BUSREQ előkészületi idő
     (clk fel)
-BUSAK "0" késleltetés (clk fel)
-BUSAK "1" késleltetés (clk le)
-RESET előkészületi idő
     (clk fel)
vezérlő jelek elengedése
-M1 érvényes -IORQ előtt
     (ITACK)
400
180
180



(2)+(4)-75
(1)-80
(3)+(4)-40

(3)+(4)-60


50

60

(1)-210

(3)+(4)-210

(3)+(4)-80




(1)-40
(2)+(4)-30











(1)-40




70

80
80
80



90


2(1)+(2)
+(4)-80
4000
2000
2000
30
145
110





230
90









0
100
100
100


90
110
100
110
100
130
100
110
80
90
100

130
130
180
150

300




120
110


100
250
110
110



(2)+(4)-65
(1)-70
(3)+(4)-50

(3)+(4)-45


35

50

(1)-170

(3)+(4)-170

(3)+(4)-70




(1)-30
(2)+(4)-20











(1)-30




70

80
80
50



60


2(1)+(2)
+(4)-65
4000
2000
2000
20
1120
90





150
90









0
85
85
85


75
85
85
85
85
95
85
85
65
80
80

100
100
130
120

300




100
100


80
165
65
65



(2)+(4)-30










(1)-140

(3)+(4)-140

(3)+(4)-55




(1)-30
(2)+(4)-20











(1)-30




60

70
70
50



60


2(1)+(2)
+(4)-50


2000
20
90






130
80
30

40






0
70
70
70


65
70
70
70
70
80
70
70
60
70
70

80
80
110
100

260




90
90


70

1.4. A Z-80 központi egység programozása

Aki i8080-at sokat programozott, és azt megszokta, az általában először nem is lelkesedik a kibővített utasításkészletért. A relatív ugrás igaz, hogy egy byte-tal rövidebb, de ez nem jelenti azt, hogy gyorsabb. A bit utasítások a logikai utasításokkal elvégezhetők, báziscímzést eddig nem használt, a címet ki lehet számolni, a blokkos átvitelt is be lehet programozni néhány utasítással, talán a kiszámított I/O utasítások jelentenek könnyebbséget, mert ehhez az i8080-nál programgenerálásra van szükség, nem lehet egyszerűen megoldani. Ezek a kijelentések általában a Z-80 programozásában való járatlanságról tanúskodnak. Ha Z-80-ról kell az i8080-ra visszatérni valamely okból, akkor veszi észre az ember a különbséget, vagyis hogy a Z-80-nál megszokott fogásokat nem alkalmazhatja, mert az i8080 nem ismeri azokat. Természetesen az i8080-nal is megoldható minden, legfeljebb körülményesebben.
Az i8080-ról a Z-80-ra átnyergelve és annak programozásában beletanulva jön meg az ember étvágya, de jó lenne, ha a bit műveletek is kiszámíthatók lennének, igazán tehettek volna bele többszörös (paraméterezhető) eltolást, vagy a báziscímzésnél a regiszterben is meg lehetne adni az eltolás mértékét, nem csak közvetlenül. Ezek azonban nincsenek benne az amúgy tekintélyes utasításkészletben. Ugyanúgy hiányzik az egyes processzoroknál már alkalmazott skip (egy utasítás feltételes kihagyása) utasítás, illetve az osztás és a szorzás.
A Z-80-al rendelkezésünkre áll egy olyan utasításkészlet, amely az i8080-nál többet tud, de még nincs kimerítve vele minden lehetőség. Sőt a CPU rendelkezésre álló utasításai közül nem is mindegyiket közli a gyártó. Az IX és IY regiszterpár 8 bites felhasználási lehetőségeit, melyeket a CPU ismer, a gyártó nem ismerteti. Így az akkumulátoron kívül nem hat, hanem tíz darab 8 bites regisztert használhatunk. Ha nem használjuk az indexregisztereket, akkor az a belső regiszterek számának növelésére ad lehetőséget, vagyis gyorsabb programokat írhatunk, mivel kevesebb memóriába való mentésre van szükségünk. A gyártók által nem ismertetett, de a Z-80 CPU-n futó utasításokat külön ismertetjük. Van már olyan Z-80 assembler program, amely ezeket is felismeri és fordítja.
Az i8080-al való kompatibilitás érdekében van olyan utasítás, amelyből kétfélét találunk: i8080 típusút és Z-80 típusút. Ezek az eltoló utasítások. A különbség csupán a jelzőbitek beállításában van, alapvető funkciójuk megegyezik. Így van RLC és RLC A; RRCA és RRC A; RLA és RL A; RRA és RR A.

1.4.1. Címzési módok
A Z-80 központi egység az alábbi operaadus címzéseket ismeri, ha az operaadus egy byte:

közvetlen  

utasításkódban
utasításban

LD A, B
LD A,2F

közvetett

 

utasításban
regiszterpárban

LD A,(OP)
LD A,(HL)

indexelt  

utasításban + regiszterpárban

LD A,(IX+d)

A Z-80 központi egység az alábbi operaadus címzéseket ismeri, ha az operaadus két byte:

közvetlen  

utasításkódban
utasításban

ADD HL,BC
LD HL,3B78H

közvetett  

stack mutatóban

PUSH HL

A Z-80 központi egység az alábbi operandus címzéseket ismeri, ha az operandus egy bit:

közvetlen  

utasításban

BIT 7,A

közvetett  

regiszterpárban

BIT 7,(HL)

indexelt  

utasításban + regiszterpárban

BIT 7,(IX+d)

A Z-80 központi egység szubrutinhíváskor az alábbi címzéseket ismeri:

közvetlen  

utasításkódban
utasításban

RST 0
CALL 95A7H

A Z-80 központi egység vezérlés átadáskor az alábbi címzéseket ismeri:

közvetlen  

utasításban

JP 9B3FH

közvetett  

regiszterpárban

JP (HL)

relatív  

utasításban

JR -6DH

A lehetséges operaadusokat egy és két byte-os adatmozgatások esetén és egy és két byte-os aritmetikai műveleteknél ábrákon (1.4.1-1. - 4.) is bemutatjuk. Az ábrákon alkalmazott jelölések megegyeznek az utasítások ismertetésénél (1.4.3.) használt jelölésekkel.


1.4.1-1. ábra: Operandusok egy byte-os adatmozgatásnál
* csak r, adat, (HL) lehet a másik operandus


1.4.1-2 ábra: Operandusok egy byte-os aritmetikai és logikai műveleteknél


1.4.1-3. ábra: Operandusok két byte-os adatmozgatásnál


1.4.1-4. ábra: Operandusok két byte-os aritmetikai műveleteknél

Az indexelt címzés folyamatát az 1.4.1-5. ábrán mutatjuk be. A relatív ugrásoknál alkalmazott címkiszámítást az 1.4.1-6. ábra ismerteti.


1.4.1-5. ábra: Indexelt címzés


1.4.1-6. ábra: Relatív címzés

1.4.2. Utasítás típusok
A Z-80 központi egység utasításkészlete egy, két, három és négy byte-os utasításokból áll. Az egyes utasítások egy vagy két utasításkóddal rendelkeznek, a négy byte-os utasításokban mindig két utasításkód áll. Az utasítás mindig az utasításkód(ok)kal kezdődik. Ha van az utasításban számkonstans, akkor az mindig az utasítás utolsó egy vagy két byte-ját tölti ki. Ha van az utasításban eltolási (relatív) szám, akkor az az utasításkód(ok) után áll.
Az i8080-nal való kompatibilitás érdekében a Z-80 utasításkészlet tartalmazza az i8080 utasításokat. Az i8080 utasítások gépi kód szinten azonosak a Z-80-nal. Mnemonikus szinten nem felelnek meg egymásnak, mivel az i8080 mnemonik rendszerébe nehéz, illetve lehetetlen lett volna beleilleszteni az új utasításokat. Az Intel mnemonik készleténél logikusabb az új mnemonik készlet, könnyebben megjegyezhetők az utasítások, illetve az operandusok leírása tisztább. Alapvető adatmozgatásra az "LD" mnemonikot alkalmazzák. A regiszterpárral való közvetlen címzés esetén ezt a regiszterpár zárójelbe tevésével jelzik: LD A,(HL) -jelentése: töltsd a HL-lel címzett memória tartalmát az akkumulátorba.

1.4.3. Utasítások ismertetése
Az utasításokat alfabetikus rendben ismertetjük. Az ismertetésben alkalmazott rövidítések:

b:
cc:
d:
dd:
e:
m:
n:
nn:
pp:
qq:
rr:
s:
ss:
(X)
r:
i:
ii:
bit cím (0-7)
állapot jelzők ( NZ, Z, NC, C, PO , PE, P, M)
címzési eltolás (-128 - +127)
regiszterpárok (BC, DE, HL, SP)
a relatív ugrás mértéke (-126 - +129)
r, (HL) , (IX+d) , (IY+d)
egy byte-os konstans (0 - 255)
két byte-os konstans (0 - 65535)
regiszterpárok (BC, DE, IX, SP)
regiszterpárok (BC, DE, HL, AF)
regiszterpárok (BC, DE, IY, SP)
m és n
regiszterpárok (BC, DE, HL, SP)
X-el címzett memória
regiszterek (A , B, C, D, E , H , L)
XH, XL, YH, YL
indexregiszterek (IX, IY)

ADC A,s
A := A+s+CY
Az akkumulátor tartalmához hozzáadja az "s" operandust és hozzáadja a "CY" jelzőbit értékét, majd az eredményt az akkumulátorban helyezi el.

S
S
Z
Z
H
H
P/V
P/V
N
C
C
= 1, ha az eredmény negatív
= 0, ha az eredmény nem negatív
= 1, ha az eredmény nulla
= 0, ha az eredmény nem nulla
= 1, ha átvitel van a harmadik és negyedik bit között
= 0, ha nincs átvitel a harmadik és negyedik bit között
= 1, ha túlcsordulás van
= 0, ha nincs túlcsordulás
= 0
= 1, ha átvitel van
= 0, ha nincs átvitel

ADC HL,ss
HL := HL+ss+CY
A HL regiszterpár tartalmához hozzáadja az "ss" regiszterpác tartalmát és hozzáadja a "CY" jelzőbit értékét, majd az eredményt a HL regiszterpárban tárolja.

S
S
Z
Z
H
P/V
P/V
N
C
C
= 1, ha az eredmény negatív
= 0, ha az eredmény nem negatív
= 1, ha az eredmény nulla
= 0, ha az eredmény nem nulla
= ismeretlen
= 1, ha túlcsordulás van
= 0, ha nincs túlcsordulás
= 0
= 1, ha átvitel van
= 0, ha nincs átvitel

ADD A,s
A : =A+s
Az akkumulátor tartalmához hozzáadja az "s"-sel definiált byte tartalmát, az eredményt az akkumulátorban helyezi el.

S
S
Z
Z
H
H
P/V
P/V
N
C
C
= 1, ha az eredmény negatív
= 0, ha az eredmény nem negatív
= 1, ha az eredmény nulla
= 0, ha az eredmény nem nulla
= 1, ha átvitel van a harmadik és negyedik bit között
= 0, ha nincs átvitel a harmadik és negyedik bit között
= 1, ha túlcsordulás van
= 0, ha nincs túlcsordulás
= 0
= 1, ha átvitel van
= 0, ha nincs átvitel

ADD HL,ss
HL := HL+ss
A HL regiszterpár tartalmához hozzáadja az "ss" regiszterpát tartalmát, majd az eredményt a HL regiszterpárban tárólja.

S
Z
H
P/V
N
C
C

= nem változik
= nem változik
= ismeretlen
= nem változik
= 0
= 1, ha átvitel van
= 0, ha nincs átvitel

ADD IX,pp
IX := IX+pp
Az IX regiszterpár tartalmához hozzáadja az "pp" regiszterpár tartalmát, majd az eredményt a IX regiszterpárban tárolja.

S
Z
H
P/V
N
C
C
= nem változik
= nem változik
= ismeretlen
= nem változik
= 0
= 1, ha átvitel van
= 0, ha nincs átvitel

ADD IY,rr
IY := IY+rr
Az IY regiszterpár tartalmához hozzáadja az "rr" regiszterpár tartalmát, majd az eredményt a IY regiszterpárban tárolja.

S
Z
H
P/V
N
C
C
= nem változik
= nem változik
= ismeretlen
= nem változik
= 0
= 1, ha átvitel van
= 0, ha nincs átvitel

AND s
A := A logikai ÉS s
Az akkumulátor és az "s" között logikai ÉS kapcsolatot hoz létre. Az eredményt az akkumulátorban tárolja.

S
S
Z
Z
H
P/V
P/V
N
C
= 1, ha az eredmény negatív
= 0, ha az eredmény nem negatív
= 1, ha az eredmény nulla
= 0, ha az eredmény nem nulla
= 1
= 1, ha a paritás páros
= 1, ha a paritás páratlan
= 0
= 0

BIT b,m
Z := -mb
Az "m"-mel definiált byte "b"-edik bitjének tartalmát invertálva a Z jelzőbit helyre írja be.

S
Z
Z
H
P/V
N
C

= ismeretlen
= 1, ha "m" "b"-dik bitje = 0
= 0, ha "m" "b"-dik bitje = 1
= 1
= ismeretlen
= 0
= változatlan

CALL cc,nn
Ha a cc igaz:
   (SP-1) := PCH
   (SP-2) := PCL
   SP := SP-2
   PC := nn
A feltétel teljesülése esetén szubrutinhívást hajt végre a CPU. Ez úgy történik, hogy a következő utasításra mutató PC tartalmát a stack-be helyezi el, majd az "nn"-t tölti a PC-be.
A jelzőbitek nem változnak.

CALL nn
(SP-l) := PCH
(SP-2) := PCL
SP:=SP-2
PC: = nn
Feltétel nélküli szubrutinhívást hajt végre a CPU. Ez úgy történik, hogy a következő utasításra mutató PC tartalmát a stack-be helyezi el, majd az "nn"-t tölti a PC-be.
A jelzőbitek nem változnak.

CCF
CY := -CY
A CY jelzőbitet invertálja.

S
Z
H
P/V
N
C
C
= nem változik
= nem változik
= ismeretlen
= nem változik
= 0
= 1, ha az utasítás előtt a CY értéke 0 volt
= 0, ha az utasítás előtt a CY értéke 1 volt

CP s
A-s
Az akkumulátor tartalmából kivonja az "s" operandust. Az akkumulátor tartalma változatlan marad.

S
S
Z
Z
H
H
P/V
P/V
N
C
C
= 1, ha az eredmény negatív
= 0, ha az eredmény nem negatív
= 1, ha az eredmény nulla
= 0, ha az eredmény nem nulla
= 1, ha átvitel van a harmadik és negyedik bit között
= 0, ha nincs átvitel a harmadik és negyedik bit között
= 1, ha túlcsordulás van
= 0, ha nincs túlcsordulás
= 1
= 1, ha átvitel van
= 0, ha nincs átvitel

CPD
A-(HL)
BC := BC-1
HL :=HL-1
A (HL)-lel címzett memóriarekesz tartalmát kivonja az akkumulátor tartalmából és ennek megfelelően állítja be az állapot biteket. Az akkumulátor tartalma változatlan marad. A BC és HL regiszterpárok tartalmát eggyel csökkenti.

S
S
Z
Z
H
H
P/V
P/V
N
C
= 1, ha az eredmény negatív
= 0, ha az eredmény nem negatív
= 1, ha A = (HL)
= 0, ha A <> (HL)
= 1, ha átvitel van a harmadik és negyedik bit között
= 0, ha nincs átvitel a harmadik és negyedik bit között
= 1, ha BC-1 <> 0
= 0, ha BC-1 = 0
= 1
= nem változik

CPDR
A - (HL)
HL := HL-1
BC := BC-1
A (HL)-lel címzett memóriarekesz tartalmát kivonja az akkumulátor tartalmából és ennek megfelelően állítja be az állapot biteket. Az akkumulátor tartalma változatlan marad. A BC és HL regiszterpárok tartalmát eggyel csökkenti. Ha a BC tartalma nullára csökken, vagy A = (HL), akkor a következő utasításra lép a CPU, ellenkező esetben a PC tartalmát csökkenti kettővel és ismétli az utasítást. Minden utasításismétlés utasítás beolvasást is jelent, vagyis ekkor van
frissítő ciklus, valamint, ha ez engedélyezett, a megszakításkérés is érvényesülhet.

S
S
Z
Z
H
H
P/V
P/V
N
C
= 1, ha az eredmény negatív
= 0, ha az eredmény nem negatív
= 1, ha A = (HL)
= 0, ha A <> (HL)
= 1, ha átvitel van a harmadik és negyedik bit között
= 0, ha nincs átvitel a harmadik és negyedik bit között
= 1, ha BC-1 <> 0
= 0, ha BC-1 = 0
= 1
= nem változik

CPI
A - (HL)
HL := HL+1
BC := BC-1
A (HL)-lel címzett memóriarekesz tartalmát kivonja az akkumulátor tartalmából, és ennek megfelelően állítja be az állapot biteket. Az akkumulátor tartalma változatlan marad. A BC regiszterpór tartalmát eggyel csökkenti, a HL regiszterpár tartalmát eggyel növeli.

S
S
Z
Z
H
H
P/V
P/V
N
C
= 1, ha az eredmény negatív
= 0, ha az eredmény nem negatív
= 1, ha A = (HL)
= 0, ha A <> (HL)
= 1, ha átvitel van a harmadik és negyedik bit között
= 0, ha nincs átvitel a harmadik és negyedik bit között
= 1, ha BC-1 <> 0
= 0, ha BC-1 = 0
= 1
= nem változik

CPIR
A - (HL)
HL := HL+1
BC := BC-1
A (HL)-lel címzett memóriarekesz tartalmát kivonja az akkumulátor tartalmából és ennek megfelelően állítja be az állapot biteket. Az akkumulátor tartalma változatlan marad. A BC regiszterpár tartalmát eggyel csökkenti, a HL regiszterpár tartalmát eggyel növeli.
Ha a BC tartalma nullára csökken, vagy A = (HL), akkor a következő utasításra lép a CPU, ellenkező esetben a PC tartalmát csökkenti kettővel és ismétli az utasítást. Minden utasításismétlés utasítás beolvasást is jelent, vagyis ekkor van frissítő ciklus, valamint, ha az engedélyezett, megszakításkérés is érvényesülhet.

S
S
Z
Z
H
H
P/V
P/V
N
C
= 1, ha az eredmény negatív
= 0, ha az eredmény nem negatív
= 1, ha A = (HL)
= 0, ha A <> (HL)
= 1, ha átvitel van a harmadik és negyedik bit között
= 0, ha nincs átvitel a harmadik és negyedik bit között
= 1, ha BC-1 <> 0
= 0, ha BC-1 = 0
= 1
= nem változik

CPL
A := -A
Az akkumulátor tartalmát invertálja.

S
Z
H
P/V
N
C
= nem változik
= nem változik
= 1
= nem változik
= 1
= nem változik

DAA
A bináris egy byte-os aritmetikai műveletek után nem helyes az eredmény, ha BCD számokkal végzett műveleteket a CPU. Ez az utasítás az eredményt helyes BCD eredménnyé alakítja, a megfelelő szám hozzáadásával. Az alábbi táblázat mutatja az eredmény korrigálásának paramétereit:

Utasítás
DAA
előtt a CY
A felső fél
byte értéke
H bit értéke
DAA előtt
Az alsó fél
byte értéke
A byte-hoz
hozzáadott szám
CY a DAA
után
ADD
ADC
INC
0
0
0
0
0
0
1
1
1
0-9
0-8
0-6
A-F
9-F
A-F
0-2
0-2
0-3
0
0
1
0
0
1
0
0
1
0-9
A-F
0-3
0-9
A-F
0-3
0-9
A-F
0-3
00
06
06
60
66
66
60
66
66
0
0
0
1
1
1
1
1
1
SUB
SBC
DEG
NEG
0
0
1
1
0-9
0-8
7-F
6-F

0
1
0
1

0-9
6-F
0-9
6-F
00
FA
A0
9A
0
0
1
1
S
S
Z
Z
H
H
P/V
P/V
N
C
= 1, ha az akkumulátor legnagyobb helyértékű bitje 1
= 0, ha az akkumulátor legnagyobb helyértékű bitje 0
= 1, ha az eredmény 0
= 0, ha az eredmény nem nulla
= 1, ha van átvitel a harmadik és negyedik bit között
= 0, ha nincs átvitel a harmadik és negyedik bit között
= 1 , ha az eredmény paritása páros
= 0, ha az eredmény paritása páratlan
= nem változik
= a fenti táblázat szerint

DEC IX
IX := IX-1
Az IX regiszterpár tartalmát csökkenti eggyel. A jelzőbitek változatlanok.

DEC IY
IY := IY-1
Az IY regiszterpár tartalmát csökkenti eggyel. A jelzőbitek változatlanok.

DEC m
M := m-1
Az "m"-mel definiált byte tartalmát csökkenti eggyel.

S
S
Z
Z
H
H
N
C
= 1, ha az eredmény negatív
= 0, ha az eredmény nem negatív
= 1, ha az eredmény nulla
= 0, ha az eredmény nem nulla
= 1, ha átvitel van a harmadik és negyedik bit között
= 0, ha nincs átvitel a harmadik és negyedik bit között
= 1
= nem változik

DEC ss
ss := ss-1
Az ss regiszterpár tartalmát csökkenti eggyel. A jelzőbitek változatlanok.

DI
IFF := 0
Az utasítás tiltja a maszkolható megszakításkérés érvényesülését.
A jelzőbitek nem változnak.

DJNZ e
B := B-1
ha B nem 0, akkor PC := PC+e
A B regiszter tartalmát csökkenti eggyel. Ha a tartalom nem nulla, akkor PC-hez "e"-t hozzáadja, azaz PC+e címre ugrik. Ha a B regiszter 0-ra csökken, a következő utasításra lép. Tipikus ciklusszervező utasítás.
A jelzőbitek nem változnak.

EI
IFF := 1
Az utasítás a maszkolható megszakításkérés érvényesülését engedélyezi, az EI utasítást követő utasítás végrehajtása után. Megjegyzendő, hogy ezt az utasítást még engedélyezett maszkolható megszakításkérés sem szakíthatja meg.
A jelzőbitek nem változnak.

EX AF, AF'
AF csere AF'
Az AF regiszterpár tartalmát cseréli az AF' regiszterpár (háttér AF) tartalmával.
A jelzőbitek az F' tartalmának megfelelően állítódnak be.

EX DE, HL
DE csere HL
A DE regiszterpár tartalmát cseréli a HL regiszterpár tartalmával.
A jelzőbitek nem változnak.

EX (SP), HL
H csere (SP+1)
L csere (SP)
A HL regiszterpár tartalmát kicseréli a STACK legfelső rekeszeiben levő két byte tartalmával. A stack pointer (SP) értéke nem változik.
A jelzőbitek nem változnak.

EX (SP), IX
XH csere (SP+1)
XL csere (SP)
Az IX regiszterpár tartalmát kicseréli a STACK legfelső rekeszeiben levő két byte tartalmával. A stack pointer (SP) értéke nem változik.
A jelzőbitek változatlanok.

EX (SP), IY
YH csere (SP+1)
YL csere (SP)
Az IY regiszterpár tartalmát kicseréli a STACK legfelső rekeszeiben levő két byte tartalmával. A stack pointer (SP) értéke nem változik.
A jelzőbitek nem változnak.

EXX
(BC) csere (BC')
(DE) csere (DE')
(HL) csere (HL')
Az általános célú regiszterek (BC, DE, HL) tartalmát a megfelelő háttér regiszterek (BC', DE', HL') tartalmával cseréli ki.
A jelzőbitek nem változnak.

HALT
Megállás.
Az utasítás hatására a CPU nem növeli az utasítás számlálóját, a címről beolvasott utasítást figyelmen kívül hagyva "NOP" utasítást hajt végre, amíg megszakításkérés vagy RESET nem érkezik.
A jelzőbitek nem változnak.

IM 0
Megszakításmód nulla beállítása.
Az utasítás a CPU-t a megszakításmód 0-ba (i8080 megszakítási mód) állítja.
A jelzőbitek nem változnak.

IM 1
Megszakításmód 1 beállítása
Az utasítás a CPU-t a megszakításmód l-be állítja. Megszakításkéréskor a CPU egy szubrutint hív a 38H címről. A jelzőbitek nem változnak.

IM 2
Megszakításmód 2 beállítása
Az utasítás a CPU-t a megszakításmód 2-be állítja. Ez a vektoros megszakításkérési üzemmód. A jelzőbitek nem változnak.

IN A,(n)
A := (An)
A CPU az A0-A7 jelű címsínekre az "n" operaadust, az A8-A15-re az akkumulátor tartalmát helyezi. Az így megcímzett perifériáról olvassa be az adatot az akkumulátorba.
A jelzőbitek nem változnak.

IN r,(c)
r := (C)
A BC regiszterpárral címzett perifériáról olvassa be az adatot az "r" regiszterbe. Ha r=F, akkor nem az adatot olvassa, hanem csak a jelzőbiteket állítja be (az utasítás kódja: ED 70).

S
S
Z
Z
H
P/V
P/V
N
C
= 1, ha az eredmény negatív
= 0, ha az eredmény nem negatív
= 1, ha az eredmény nulla
= 0, ha az eredmény nem nulla
= 1
= 1, ha az adat paritása páros
= 0, ha az adat paritása páratlan
= 0
= nem változik

INC IX
IX := IX+1
Az IX regiszterpár tartalmát növeli eggyel.
A jelzőbitek nem változnak.

INC IY
IY := IY+1
Az IY regiszterpár tartalmát növeli eggyel.
A jelzőbitek nem változnak.

INC m
m: =m+1
Az "m"-mel definiált byte tartalmát növeli eggyel.

S
S
Z
Z
H
H
N
C
= 1, ha az eredmény negatív
= 0, ha az eredmény nem negatív
= 1, ha az eredmény nulla
= 0, ha az eredmény nem nulla
= 1, ha átvitel van a harmadik és negyedik bit között
= 0, ha nincs átvitel a harmadik és negyedik bit között
= 0
= nem változik

INC ss
ss:=ss+1
Az "ss" regiszterpár tartalmát növeli eggyel.
A jelzőbitek nem változnak.

IND
(HL) := (c)
B: = B-1
HL: =HL-1
A BC regiszterpárral címzett perifériáról tölt adatot HL-lel címzett memóriarekeszbe, majd a B regiszter tartalmát csökkenti eggyel. A HL regiszterpár tartalmát is csökkenti eggyel.

S
Z
Z
H
P/V
N
C
= ismeretlen
= 1, ha B-1 = 0
= 0, ha B-1 <> 0
= ismeretlen
= ismeretlen
= 1
= változatlan

INDR
(HL) := (C)
B := B-1
HL := HL-1
Az IND utasítást ismétli mindaddig, mígnem a B regiszter tartalma nullára nem csökken.

S
Z
H
P/V
N
C
= ismeretlen
= 1
= ismeretlen
= ismeretlen
= 1
= változatlan

INI
(HL) := (C)
B := B-1
HL := HL+1
A BC regiszterpárral címzett perifériáról tölt adatot a HL-lel címzett memóriarekeszbe, majd a B regiszter tartalmát csökkenti eggyel. A HL regiszterpár tartalmát is növeli eggyel.

S
Z
Z
H
P/V
N
C
= ismeretlen
= 1, ha B-1 = 0
= 0, ha B-1 <> 0
= ismeretlen
= ismeretlen
= 1
= változatlan

INIR
(HL) := (C)
B := B-1
HL := HL-1
Az INI utasítást ismétli mindaddig, míg a B regiszter tartalma nullára nem csökken.

S
Z Z
H
P/V
N
C
= ismeretlen
= 1
= ismeretlen
= ismeretlen
= 1
= változatlan

JP cc,nn
ha cc igaz, PC:=nn
Feltétel (cc) teljesülése esetén kerül megvalósításra az ugrás.
Az állapot bitek nem változnak.

JP (HL)
PC:=HL
A HL regiszterpár tartalma címzi ki a következő programutasítást.
A jelzőbitek nem változnak.

JP (IX)
PC := IX
Az IX regiszterpár tartalma címzi ki a következő programutasítást.
A jelzőbitek nem változnak.

JP (IY)
PC := IY
Az IY regiszterpár tartalma címzi ki a következő programutasítást.
A jelzőbitek nem változnak.

JP nn
PC := nn
Feltétel nélküli ugrás az "nn" címre.
A jelzőbitek nem változnak.

JR e
PC := PC+e
Feltétel nélküli relatív ugrás a PC+e címre.
A jelzőbitek nem változnak.

JR C,e
Ha C=1, PC := PC+e
Feltételes relatív ugrás a PC+e címre: ugrik, ha C=1, egyébként a következő utasításra lép.
A jelzőbitek nem változnak.

JR NC,e
Ha C=0, PC := PC+e
Feltételes relatív ugrás a PC+e címre: ugrik, ha C=0, egyébként a következő utasításra lép.
A jelzőbitek nem változnak.

JR NZ,e
Ha Z=0, PC:=PC+e
Feltételes relatív ugrás a PC+e címre: ugrik, ha Z=0, egyébként a következő utasításra lép.
A jelzőbitek nem változnak.

JR Z, e
Ha Z=1, PC := PC+e
Feltételes relatív ugrás a PC+e címre: ugrik, ha Z=1, egyébként a következő utasításra lép.
A jelzőbitek nem változnak.

LD A,(BC)
A := (BC)
A BC regiszterpárral címzett memóriarekesz tartalmát "A"-ba tölti.
A jelzőbitek nem változnak.

LD A,(DE)
A := (DE)
A DE regiszterpárral címzett memóriarekesz tartalmát "A"-ba tölti.
A jelzőbitek nem változnak.

LD A,(nn)
A := (nn)
Az "nn" operandussal címzett memóriarekesz tartalmát "A"-ba tölti.
A jelzőbitek nem változnak.

LD A,I
A := I
Az "A"-ba tölti az "I" regiszter tartalmát

S
S
Z
Z
H
P/V
N
C
= 1, ha az I negatív
= 0, ha az I nem negatív
= 1, ha az I tartalma nulla
= 0, ha az I tartalma nullától különböző
= 0
= másolja IFF2-t
= 0
= nem változik

LD A,R
A := R
Az "A"-ba tölti az "R" regiszter tartalmát.

S
S
Z
Z
H
P/V
N
C
= 1, ha az R negatív
= 0, ha az R nem negatív
= 1, ha az R tartalma nulla
= 0, ha az R tartalma nullától különböző
= 0
= másolja IFF2-t
= 0
= nem változik

Megjegyzés: az LD A, I és az LD A, R utasítás hibásan tárolja a megszakítás engedélyezését a P/V biten, ha véletlenül pont ilyen utasításnál történik megszakítás. Ez nem minden Z80 változatnál fordul elő, csak az NMOS hibás.

LD (BC),A
(BC) := A
BC-vel címzett memóriarekeszbe tölti az "A" tartalmát.
Jelzőbitek nem változnak.

LD dd,nn
dd := nn
A dd regiszterpárt "nn"-nel feltölti.
A jelzőbitek nem változnak.

LD dd,(nn)
ddH := (nn+1)
ddL := (nn)
A dd regiszterpárt az nn és az nn+1-gyel címzett memóriarekeszek tartalmával tölti fel.
A jelzőbitek nem változnak.

LD (DE),A
(DE) := A
A DE regiszterpárral címzett memóriarekeszbe tölti az "A" tartalmát.
A jelzőbitek nem változnak.

LD HL,(nn)
H := (nn+1)
L := (nn)
A HL regiszterpácba tölti az "nn"-nel címzett memóriarekeszek két egymásután következő byte-ját.
A jelzőbitek nem változnak.

LD I,A
I:=A
Az I (megszakítás vektor) Felöltése "A" tartalmával.
A jelzőbitek nem változnak.

LD IX,(nn)
XH := (nn+1)
XL := (nn)
Az IX regiszterpárt az "nn" és az "nn+1"-gyel címzett memóriarekeszek tartalmával tölti fel.
A jelzőbitek nem változnak.

LD IX,nn
IX:=nn
Az IX regiszterpárba az "nn"-t tölti be.
A jelzőbitek nem változnak.

LD IY,(nn)
YH := (nn+1)
YL := (nn)
Az IY regiszterpárt az "nn" és az "nn+1"-gyel címzett memóriarekeszek tartalmával tölti fel.
A jelzőbitek nem változnak.

LD IY,nn
IY := nn
Az IY regiszterpácba tölti be az "nn"-t.
A jelzőbitek nem változnak.

LD m, s
Az utasítás hatására az "s"-sel definiált byte tartalmát az "m"-mel definiált helyre tölti. Csak az egyik operaadus lehet (HL), (IX+d), (IY+d).
A jelzőbitek nem változnak.

LD (nn),A
(nn) := A
Az utasítás hatására az "nn"-nel címzett memóriarekeszt feltölti az "A" tartalmával.
A jelzőbitek nem változnak.

LD (nn),dd
(nn+1) := ddH
(nn) := ddL
A "dd" regiszterpár tartalmával tölti fel az "nn" és az "nn+1" című memóriarekeszeket.
A jelzőbitek nem változnak.

LD (nn),IX
(nn+1) := XH
(nn) := XL
Az IX regiszterpár tartalmával tölti az "nn" és az "nn+1" című memóriarekeszeket.
A jelzőbitek nem változnak.

LD (nn),IY
(nn+1) := YH
(nn) := YL
Az IY regiszterpár tartalmával tölti az "nn" és az "nn+1" című memóriarekeszeket.
A jelzőbitek nem változnak.

LD R,A
R := A
A memória frissítő regisztert tölti fel az "A" tartalmával.
A jelzőbitek nem változnak.

LD SP,HL
SP := HL
A stack pointerbe tölti be a HL regiszterpár tartalmát.
A jelzőbitek nem változnak.

LD SP,IX
SP := IX
A stack pointerbe tölti az IX regiszterpát tartalmát.
A jelzőbitek nem változnak.

LD SP,IY
SP := IY
A stack pointerbe tölti az IY regiszterpár tartalmát.
A jelzőbitek nem változnak.

LDD
(DE) := (HL)
DE := DE-1
HL := HL-1
BC := BC-1
A HL regiszterpárral megcímzett memóriarekesz tartalmát tölti a DE regiszterpár által címzett memóriarekeszbe. A HL, DE és BC regiszterpárok tartalmát eggyel csökkenti.

S
Z
H
P/V
P/V
N
C
= nem változik
= nem változik
= 0
= 1, ha BC-1 <> 0
= 0, ha BC-1 = 0
= 0
= nem változik

LDDR
(DE) := (HL)
DE: = DE-1
HL := HL-1
BC := BC-1
A HL regiszterpárral megcímzett memóriarekesz tartalmát tölti a DE regiszterpár által címzett memóriarekeszbe. A HL, DE és BC regiszterpárok tartalmát eggyel csökkenti. Az utasítást mindaddig ismétli, amíg a BC tartalma nullára nem csökken.

S
Z
H
P/V
N
C
= nem változik
= nem változik
= 0
= 0
= 0
= nem változik

LDI
(DE) := (HL)
DE := DE+1
HL := HL+1
BC := BC-1
A HL regiszterpárral megcímzett memóriarekesz tartalmát tölti a DE regiszterpár által címzett memóriarekeszbe. AHL és DE regiszterpárok tartalmát eggyel növeli, a BC tartalmát eggyel csökkenti.

S
Z
H
P/V
P/V
N
C
= nem változik
= nem változik
= 0
= 1, ha BC-1 <> 0
= 0, ha BC-1 = 0
= 0
= nem változik

LDIR
(DE) := (HL)
DE := DE+1
HL :=HL+1
BC := BC-1
A HZ regiszterpárral megcímzett memóriarekesz tartalmát tölti a DE regiszterpár által címzett memóriarekeszbe. A HL és DE regiszterpácok tartalmát eggyel növeli. A BC blokkszámláló regiszterpár tartalmát eggyel csökkenti. Az utasítást mindaddig ismétli, amíg a BC tartalma nullára nem csökken.

S
Z
H
P/V
N
C
= nem változik
= nem változik
= 0
= 0
= 0
= nem változik

NEG
A := 0-A
Az akkumulátor tartalmát negálja (kettes komplemenssel) , azaz kivonja nullából.

S
S
Z
Z
H
H
P/V
P/V
N
C
C
= 1, ha az eredmény negatív
= 0, ha az eredmény nem negatív
= 1, ha az eredmény nulla
= 0, ha az eredmény nem nulla
= 1, ha átvitel van a harmadik és negyedik bit között
= 0, ha nincs átvitel a harmadik és negyedik bit között
= 1, ha az akkumulátor tartalma az utasítás előtt 80H volt
= 0, ha az akkumulátor tartalma nem 80H volt az utasítás előtt
= 1
= 1, ha az utasítás előtt az akkumulátor tartalma nem 0 volt
= 0, ha az utasítás előtt az akkumulátor tartalma 0 volt

NOP
Nincs műveletvégzés.

OR s
A := A logikai vagy s
Az akkumulátor és az "s" között logikai vagy kapcsolatot hoz létre. Az eredményt az akkumulátorban tárolja.

S
S
Z
Z
H
P/V
P/V
N
C
= 1, ha az eredmény negatív
= 0, ha az eredmény nem negatív
= 1, ha az eredmény nulla
= 0, ha az eredmény nem nulla
= 0
= 1, ha a paritás páros
= 0, ha a paritás páratlan
= 0
= 0

OTDR
(C) := (HL)
B := B-1
HL := HL-1
A HL regiszterpárral címzett memóriarekesz tartalmát a "C" regiszterrel (BC regiszterpárral) címzett perifériába juttatja. A HL regiszterpár tartalmát eggyel csökkenti, a B regiszter tartalmát eggyel csökkenti. Az utasítást addig ismétli, amíg a BC tartalma nullára nem csökken.

S
Z
H
P/V
N
C
= ismeretlen
= 1
= ismeretlen
= ismeretlen
= 1
= nem változik

OTIR
(C) := (HL)
B := B-1
HL := HL+1
A HL regiszterpárral címzett memóriarekesz tartalmát a "C" regiszterrel (BC regiszterpárral) címzett perifériába juttatja. A HL regiszterpár tartalmát eggyel növeli, a B regiszter tartalmát eggyel csökkenti. Az utasítást addig ismétli, amíg a BC tartalma nullára nem csökken.

S
Z
H
P/V
N
C
= ismeretlen
= 1
= ismeretlen
= ismeretlen
= 1
= nem változik

OUT (C),r
(C) := r
Az "r" regiszter tartalmát a "C" regiszterrel (BC regiszterpárral) címzett perifériának kiküldi.
A jelzőbitek nem változnak.

OUT (n),A
(n) := A
Az "A" regiszter tartalmát az "n"-nel címzett perifériának kiküldi.
A jelzőbitek nem változnak.

OUTD
(C) := (HL)
B := B-1
HL := HL-1
A "C" regiszterrel (BC regiszterpárral) címzett perifériának kiviszi a HL regiszterpárral címzett memóriarekesz tartalmát. A HL regiszterpár tartalmát eggyel csökkenti. A "B" regiszter tartalmát eggyel csökkenti.

S
Z
Z
H
P/V
N
C
= ismeretlen
= 1, ha B-1 = 0
= 0, ha B-1 <> 0
= ismeretlen
= ismeretlen
= 1
= változatlan

OUTI
(C) := (HL)
B := B-1
HL := HL+1
A "C" regiszterrel (BC regiszterpárral) címzett perifériának kiviszi a HL regiszterpárral címzett memóriarekesz tartalmát. A HL regiszterpár tartalmát eggyel növeli. A "B" regiszter tartalmát eggyel csökkenti.

S
Z
Z
H
P/V
N
C
= ismeretlen
= 1, ha B-1 = 0
= 0, ha B-1 <> 0
= ismeretlen
= ismeretlen
= 1
= változatlan

POP IX
XH := (SP+1)
XL := (SP)
SP := SP+2
Az IX regiszterpárba betölti a stack legfelső rekeszeiben levő két byte-ot. Az SP tartalmát növeli kettővel.
A jelzőbitek változatlanok.

POP IY
YH := (SP+1)
YL := (SP)
SP := SP+2
Az IY regiszterpárba betölti a stack legfelső rekeszeiben levő két byte-ot. Az SP tartalmát kettővel növeli.
A jelzőbitek változatlanok.

POP qq
qqH := (SP+1)
ggL := (SP)
SP:=SP+2
A qq regiszterpárba betölti a stack legfelső rekeszeiben levő két byte-ot. Az SP tartalmát kettővel növeli.
A jelzőbitek változatlanok.

PUSH IX
(SP-2) := XL
(SP-1) := XH
SP := SP-2
A stack-be betölti az IX regiszterpár tartalmát, a stackmutató által címzett rekeszbe. A stackmutató tartalmát kettővel csökkenti.
A jelzőbitek nem változnak.

PUSH IY
(SP-2) := YL
(SP-1) := YH
SP := SP-2
A stack-be betölti az IY regiszterpár tartalmát, a stackmutató által címzett rekeszbe. A stackmutató tartalmát kettővel csökkenti.
A jelzőbitek nem változnak.

PUSH qq
(SP-2) := qqL
(SP-1) := qqH
SP := SP-2
A stackbe betölti a qq regiszterpár tartalmát a stackmutató által címzett rekeszbe. A stackmutató tartalmát kettővel csökkenti.
A jelzőbitek nem változnak.

RES b,m
mb := 0
Az "m"-mel definiált byte "b"-edik bitjét törli.
A jelzőbitek változatlanok.

RET
PCL := (SP)
PCH := (SP+1)
SP := SP+2
Visszatérés szubrutinból. A stackmutató által kijelölt két byte tartalmát betölti a programszámlálóba. A stackmutató tartalmát kettővel növeli.
A jelzőbitek változatlanak.

RET cc
Ha cc igaz:
   PCL := (SP)
   PCH := (SP+1)
   SP := SP+2
Feltételes visszatérés szubrutinból. Ha feltétel igaz, a stackmutató által kijelölt két byte tartalmát betölti a programszámlálóba. A stackmutató tartalmát kettővel növeli.
A jelzőbitek változatlanok.

RETI
PCL := (SP)
PCH := (SP+1)
SP := SP+2
Visszatérés megszakításból. A stackmutató által kijelölt két byte tartalmát betölti a programszámlálóba. A stackmutató tartalmát kettővel növeli.
A jelzőbitek változatlanok.

RETN
PCL := (SP)
PCH := (SP+1)
SP := SP+2
Visszatérés nem maszkolható megszakításból. A stackmutató által kijelölt két byte tartalmát betölti a programszámlálóba. A stackmutató tartalmát kettővel növeli. A CPU IFF2 flip-flopjának tartamát áttölti az IFF1 flip-flopba.
A jelzőbitek változatlanok.

RL m
A CPU az "m"-mel definiált byte balra történő eltolását úgy végzi el, hogy a 7-es bithely tartalma a C jelzőbithelyre kerül, és annak megelőző tartalma a 0-ás bithelyre. A többi bithely tartalma eggyel balra tolódik.

S
S
Z
Z
H
P/V
P/V
N
C
= 1, ha az eredmény negatív
= 0, ha az eredmény nem negatív
= 1, ha az eredmény nulla
= 0, ha az eredmény nem nulla
= 0
= 1, ha az eredmény paritása páros
= 0, ha az eredmény paritása páratlan
= 0
= a művelet előtti m(7)

RLA
A CPU az akkumulátor tartalmának balra történő eltolását úgy végzi el, hogy a 7-es bithely tartalma a C jelzőbithelyre kerül, és annak megelőző tartalma a 0-ás bithelyre. A többi bithely tartalma eggyel balra tolódik.

S
Z
H
P/V
N
C
= változatlan
= változatlan
= 0
= változatlan
= 0
= a művelet előtti akkumulátor 7. bitjének tartalma.

RLCA
A CPU az akkumulátor tartalmának balra történő eltolását úgy végzi el, hogy a 7-es bithely tartalma a C jelzőbithelyre, valamint a 0-ás bithelyre kerül. A többi bithely tartalma eggyel balra tolódik.

S
Z
H
P/V
N
C
= változatlan
= változatlan
= 0
= változatlan
= 0
= a művelet előtti m(7)

RLC m
A CPU az "m"-mel definiált byte balra történő eltolását úgy végzi el, hogy a 7-es bithely tartalma a C jelzőbithelyre, valamint a 0-ás bithelyre kerül. A többi bithely tartalma eggyel balra tolódik.

S
S
Z
Z
H
P/V
P/V
N
C
= 1, ha az eredmény negatív
= 0, ha az eredmény nem negatív
= 1, ha az eredmény nulla
= 0, ha az eredmény nullától különböző
= 0
= 1, ha az eredmény paritása páros
= 0, ha az eredmény paritása páratlan
= 0
= a művelet előtti m(7)

RLD
A HL regiszterpárral címzett memóriarekesz alsó fél byte-ját átmásolja a felső fél byte-ba. Annak megelőző tartalma az akkumulátor alsó fél byte-jába kerül. Az akkumulátor megelőző tartalma a címzett memóriarekesz alsó fél byte-jába kerül.

S
S
Z
Z
H
P/V
P/V
N
C
= 1, ha az eredmény negatív
= 0, ha az eredmény nem negatív
= 1, ha az eredmény nulla
= 0, ha az eredmény nullától különböző
= 0
= 1, ha az eredmény paritása páros
= 0, ha az eredmény paritása páratlan
= 0
= nem változik

RR m
A CPU az "m"-mel definiált byte jobbra történő eltolását úgy végzi el, hogy a 0-ás bithely tartalma a C jelzőbithelyre kerül, annak megelőző tartalma pedig a 7-es bithelyre, A többi bithely tartalma eggyel jobbra tolódik.

S
S
Z
Z
H
P/V
P/V
N
C
= 1, ha az eredmény negatív
= 0, ha az eredmény nem negatív
= 1, ha az eredmény nulla
= 0, ha az eredmény nullától különböző
= 0
= 1, ha az eredmény paritása páros
= 0, ha az eredmény paritása páratlan
= 0
= a művelet előtti m(0)

RRA
A CPU az akkumulátor tartalmának jobbra történő eltolásét úgy végzi el, hogy a 0-ás bithely tartalma a C jelzőbithelyre kerül, annak megelőző tartalma pedig a 7-es bithelyre. A többi bithely tartalma eggyel jobbra tolódik.

S
Z
H
P/V
N
C
= változatlan
= változatlan
= 0
= változatlan
= 0
= a művelet előtti akkumulátor 0-ás bithelye

RRCA
A CPU az akkumulátor tartalmának jobbra történő eltolását úgy végzi el, hogy a 0-ás bithely tartalma a C jelzőbithelyre és a 7-es bithelyre kerül. A többi bithely tartalma eggyel jobbra tolódik.

S
Z
H
P/V
N
C
= változatlan
= változatlan
= 0
= változatlan
= 0
= a művelet előtti akkumulátor 0-ás bithelye

RRC m
A CPU az "m"-mel definiált byte jobbra történő eltolását úgy végzi el, hogy a 0-ás bithely tartalma a C jelzőbithelyre és a 7-es bithelyre kerül. A többi bithely tartalma eggyel jobbra tolódik.

S
S
Z
Z
H
P/V
P/V
N
C
= 1, ha az eredmény negatív
= 0, ha az eredmény nem negatív
= 1, ha az eredmény nulla
= 0, ha az eredmény nullától különböző
= 0
= 1, ha az eredmény paritása páros
= 0, ha az eredmény paritása páratlan
= 0
= a művelet előtti m(0)

RRD
A HL regiszterpárral címzett memóriarekesz alsó fél byte-jának tartalmát az akkumulátor alsó fél byte-jába tölti, annak megelőző tartalmát a címzett memóriarekesz felső fél byte-jába, ennek megelőző tartalmát az alsó fél byte-ba tölti át.

S
S
Z
Z
H
P/V
P/V
N
C
= 1, ha az eredmény negatív
= 0, ha az eredmény nem negatív
= 1, ha az eredmény nulla
= 0, ha az eredmény nullától különböző
= 0
= 1, ha az eredmény paritása páros
= 0, ha az eredmény paritása páratlan
= 0
= nem változik

RST p
(SP-1) := PCH
(SP-2) := PCL
SP := SP-2
PCH := 0
PCL := P
Szubrutinhívás az első lapon levő fix címekre. A futó program utasításszámlálójának tartalmát a stackbe tölti. Az utasításszámlálóba (PC) "p"-nek megfelelő értéket tölti be, a lehetséges "p" értékek: 0, 8, 10H, 18H, 20H, 28H, 30H, 38H.
A jelzőbitek nem változnak.

SBC A,s
A := A-s-CY
Az akkumulátor tartalmából kivonja az "s" operandust és kivonja a "CY" jelzőbit értékét, majd az eredményt az akkumulátorba tölti be.

S
S
Z
Z
H
H
P/V
P/V
N
C
C
= 1, ha az eredmény negatív
= 0, ha az eredmény nem negatív
= 1, ha az eredmény nulla
= 0, ha az eredmény nem nulla
= 1, ha átvitel van a harmadik és negyedik bit között
= 0, ha nincs átvitel a harmadik és negyedik bit között
= 1, ha túlcsordulás van
= 0, ha nincs túlcsordulás
= 1
= 1, ha átvitel van
= 0, ha nincs átvitel

SBC HL,ss
HL := HL-ss-CY
HL regiszterpár tartalmából kivonja az "ss"-sel jelzett regiszterpár tartalmát, majd kivonja az átvitel jelzőbit tartalmát. Az eredményt a HL-be tölti be.

S
S
Z
Z
H
P/V
P/V
N
C
C
= 1, ha az eredmény negatív
= 0, ha az eredmény nem negatív
= 1, ha az eredmény nulla
= 0, ha az eredmény nem nulla
= ismeretlen
= 1, ha túlcsordulás van
= 0, ha nincs túlcsordulás
= 1
= 1, ha átvitel van
= 0, ha nincs átvitel

SCF
CY := 1
Az átvitel jelzőbit helyre 1-et ír be.

S
Z
H
P/V
N
C
= változatlan
= változatlan
= 0
= változatlan
= 0
= 1

SET b,m
mb := 1
Az "m"-mel definiált byte "b"-edik bitjét "1"-re állítja be.
A jelzőbitek tartalma változatlan.

SLA m
A CPU az "m"-mel definiált byte balra történő eltolását úgy végzi el, hogy a 0-ás bithely tartalma 0 lesz. A többi bithely tartalma eggyel balra tolódik.

S
S
Z
Z
H
P/V
P/V
N
C
= 1, ha az eredmény negatív
= 0, ha az eredmény nem negatív
= 1, ha az eredmény nulla
= 0, ha az eredmény nullától különböző
= 0
= 1, ha az eredmény paritása páros
= 0, ha az eredmény paritása páratlan
= 0
= a művelet előtti m(7)

SRA m
A CPU az "m"-mel definiált byte jobbra történő eltolását úgy végzi el, hogy a 7-es bithely tartalma nem változik, a 0-ás bithely a C jelzőbitbe kerül. A többi bithely tartalma eggyel jobbra tolódik.

S
S
Z
Z
H
P/V
P/V
N
C
= 1, ha az eredmény negatív
= 0, ha az eredmény nem negatív
= 1, ha az eredmény nulla
= 0, ha az eredmény nullától különböző
= 0
= 1, ha az eredmény paritása páros
= 0, ha az eredmény paritása páratlan
= 0
= a művelet előtti m(0)

SRL m
A CPU az "m"-mel definiált byte jobbra történő eltolását úgy végzi el, hogy a 0-ás bithely tartalma a C jelzőbitbe kerül, a 7-es bithely tartalma 0 lesz. A többi bithely tartalma eggyel jobbra tolódik.

S
S
Z
Z
H
P/V
P/V
N
C
= 1, ha az eredmény negatív
= 0, ha az eredmény nem negatív
= 1, ha az eredmény nulla
= 0, ha az eredmény nullától különböző
= 0
= 1, ha az eredmény paritása páros
= 0, ha az eredmény paritása páratlan
= 0
= a művelet előtti m(0)

SUB s
A := A-s
Az akkumulátor tartalmából kivonja az "s" operandust és az eredményt az akkumulátorba írja be.

S
S
Z
Z
H
H
P/V
P/V
N
C
C
= 1, ha az eredmény negatív
= 0, ha az eredmény nem negatív
= 1, ha az eredmény nulla
= 0, ha az eredmény nem nulla
= 1, ha átvitel van a harmadik és negyedik bit között
= 0, ha nincs átvitel a harmadik és negyedik bit között
= 1, ha túlcsordulás van
= 0, ha nincs túlcsordulás
= 1
= 1, ha átvitel van
= 0, ha nincs átvitel

XOR s
A := A logikai kizáró VAGY s
Az akkumulátor és az "s" között kizáró VAGY kapcsolatot hoz létre. Az eredményt az akkumulátorba írja be.

S
S
Z
Z
H
P/V
P/V
N
C
= 1, ha az eredmény negatív
= 0, ha az eredmény nem negatív
= 1, ha az eredmény nulla
= 0, ha az eredmény nullától különböző
= 0
= 1, ha a paritás páros
= 0, ha a paritás páratlan
= 0
= 0

Az alábbiakban ismertetjük a Z-80 központi egység által értelmezett, de a gyártók által nem ismertetett utasításokat. A dekódolási táblázat alapján látható, hogy a CB prefix (előkód) esetén a 30-37-ig terjedő kód funkciója nincs ismertetve. Ez a csoport szintén egy shiftelést valósít meg: a byte-ot balra shifteli úgy, hogy a 0-ás bithely tartalma 1 lesz, a 7-es bithely a túlcsordulás jelzőbit (C) helyére kerül, a többi bithely tartalma eggyel balra tolódik. Az utasítást SLL-nek neveztük el. Értelmezett az utasítás az "m"-mel definiált byte-okon:

SLL B = CB 30 SLL H = CB 34 SLL (IX+d)
SLL C = CB 31 SLL L = CB 35
DDCBd36
SLL D = CB 32 SLL (HL) = CB 36 SLL (IY+d)
SLL E = CB 33 SLL A = CB 37
FDCBd36

A DD és FD prefix (előkód) hatására a HL regiszterpár címzése helyett az IX/IY regiszterpár címzésre vált át a CPU. Ez nemcsak a (HL) hivatkozások esetén működik, hanem H és L hivatkozások esetén is. Ekkor ezek a speciális utasítások az IX és IY regiszterpár byte-onkénti elérését teszik lehetővé. A byte-oknak önkényesen adtunk nevet, mivel nem szerepelnek a gyártók leírásaiban. Így az IX regiszterpár két byte-ja az XH és XL nevet kapta, az IY regiszterpár két byte-ja pedig az YH és YL elnevezést. A "H" és "L" utal arra, hogy a felső vagy az alsó byte-ról van-e szó.
Az utasítások megegyeznek jelzőbit kezelésben a hasonló típusú leírt utasítások jelzőbit kezelésével, így itt ezt nem ismertetjük újra. Az utasítások mnemonikus neve után szerepel hexadecimálisan az utasítás kódja, majd új sorban az utasítás funkciója.
Az itt megadottakon kívül a Z-80 CPU egyéb utasításokat is elvégez, de ezeknek nincs gyakorlati jelentőségük, mivel nincs értelmes funkciójuk.

ADC A,XH DD 8C   ADD A,XH DD 84

A := A+XH+CY

 

A := A+XH

ADC A,XL DD 8D   ADC A,XL DD 85

A := A+XL+CY

 

A := A+XL

ADC A,YH DD 8C   ADD A,YH FD 84
A := A+YH+CY
 
A := A+YH
ADC A,YL FD 8D   ADD A,YL FD 85
A := A+YL+CY
 
A := A+YL
AND XH DD A4   LD A,XH DD 7C
A := A logikai ÉS XH
 
A := XH
AND XL DD A5   LD A,XL DD 7D

A := A logikai ÉS XL

 

A := XL

AND YH DD A4   LD A,YH FD 7C

A := A logikai ÉS YH

 
A := YH
AND YL FD A5   LD A,YL FD 7D

A := A logikai ÉS YL

 

A := YL

CP XH DD BC   LD B,XH DD 44
A-XH
 
B := XH
CP XL DD BD   LD B,XL DD 45
A-XL
 

B := XL

CP YH FD BC   LD B,YH FD 44
A-YH
 
B := YH
CP YL FD BD   LD B,YL FD 45
A+YL
 
B := YL
DEC XH DD 25   LD C,XH DD 4C
XH := XH-1
 

C := XH

DEC XL DD 2D   LD C,XL DD 4D
XL := XL-1
 

C := XL

DEC YH FD 25   LD C,YH FD 4C
YH := YH-1
 

C := YH

DEC YL FD 2D   LD C,YL FD 4D
YL := YL-1
 
C := YL
INC XH DD 24   LD D,XH DD 54
XH := XH+1
 
D := XH
INC XL DD 2C   LD D,XL DD 55
XL := XL+1
 
D := XL
INC YH FD 24   LD D,YH FD 54
YH := YH+1
 

D := YH

INC YL FD 2C   LD D,YL FD 55
YL := YL+1
 
D := YL
LD E,XH DD 5C   LD YH,A FD 67

E := XH

 
YH := A
LD E,XL DD 5D   LD YH,B FD 60
E := XL
 
YH := B
LD E,YH FD 5C   LD YH,C FD 61
E := YH
 

YH := C

LD E,YL FD 5D   LD YH,D FD 62
E := YL
 
YH := D
LD XH,A DD 67   LD YH,E FD 63
XH := A
 
YH := E
LD XH,B DD 60   LD YH,YH FD 64
XH := B
 

YH := YH

LD XH,C DD 61   LD YH,YL FD 64
XH := C
 
YH := YL
LD XH,D DD 62   LD YL,A FD 6F
XH := D
 
YL := A
LD XH,E DD 63   LD YL,B FD 68
XH := E
 
YL := B
LD XH,XH DD 64   LD YL,C FD 69

XH := XH

 
YL := C
LD XH,XL DD 65   LD YL,D FD 6A
XH := XL
 
YL := D
LD XL,A DD 6F   LD YL,E FD 6B
XL := A
 
YL := E
LD XL,B DD 68   LD YL,YH FD 6C
XL := B
 

YL := YH

LD XL,C DD 69   LD YL,YL FD 6D
XL := C
 
YL := YL
LD XL,D DD 6A   LD XH,n DD 26 n

XL := D

 
XH := n
LD XL,E DD 6B   LD XL,n DD 2E n
XL := E
 
XL := n
LD XL,XH DD 6C   LD YH,n FD 26 n

XL := XH

 

YH := n

LD XL,XL DD 6D   LD YL,n FD 2E n

XL := XL

 

YL := n

OR XH DD B4   SBC A,YH FD 9C
A := A logikai VAGY XH
 
A := A-YH-CY
OR XL DD B5   SBC A,YL FD 9D

A := A logikai VAGY XL

 
A := A-YL-CY
OR YH FD B4   SUB XH DD 94
A := A logikai VAGY YH
 
A := A-XH
OR YL FD B5   SUB XL DD 95
A := A logikai VAGY YL
 
A := A-XL
SBC A,XH DD 9C   SUB YH FD 94
A := A-YH-CY
 
A := A-YH
SBC A,XL DD 9D   SUB YL FD 95

A := A-XL-CY

 
A := A-YL
XOR XH DD AC      
A := A logikai kizáró VAGY XH
 
XOR XL DD AD      
A := A logikai kizáró VAGY XL
 
XOR YH FD AC      
A := A logikai kizáró VAGY YH
 
XOR YL FD AD      
A := A logikai kizáró VAGY YL
 

A következőkben bemutatjuk a Z80 CPU kódolási tábláit. A táblákban a nem definiált utasítások is szerepelnek.
Megjegyzés:

° - a prefix ismétlés csak váltást okoz
- a DD/FD prefix hatástalan
* - a DD/FD prefix után a CB d kód hatása:
kód szerinti utasítás (i+d)-re értelmezve és az eredményt a kód szerinti regiszterbe is betölti.
pl.: DD CB 01 02 = RLC(IX+d) és LD D, eredmény.

Z80 CPU kódolási tábla I.
Z80 CPU kódolási tábla II. (DD/FD)
Z80 CPU kódolási tábla III. (ED)
Z80 CPU kódolási tábla IV. (CB)

1.5. Párhuzamos adatátvitel illesztő (PIO)

1.5.1. Általános ismertetés
A Z-80-as rendszerek legnagyobb számban felhasznált eleme a Z-80 PIO, amely két párhuzamos portot tartalmaz. Az Intel 8255-ös párhuzamos porttal összehasonlítva a Z-80-as PIO kevesebb I/O vonalat tud kezelni, de szolgáltatásai magasabb szintűek. Ahol ezekre a szolgáltatásokra nincs szükség, de sok I/O vonal kezelése a feladat, ott az i8255-ös alkalmazása gazdaságosabb. Ha az i8255 portjait "handshake" jelekkel alkalmazzuk, akkor szintén csak két port ellátására alkalmas, mivel a "handshake" jelek a "C" port 4 bitjét elhasználják. Így ezenfelül már csak négy bit áll rendelkezésünkre. Amikor az I/O kezelése IT-s, akkor a Z-80 PIO alkalmazása kedvezőbb.
A 40 lábú DIL tokozású PIO áramkör két egymástól független és "handshake" vonalakkal ellátott 8 bites I/O portot tartalmaz. Megszakításkérés a "handshake" vonalakon, illetve a bitenként programozott üzemmódban a port vonalainak megváltozása következtében mehet végbe. A PIO a megszakításkéréshez kapcsolódó logika segítségével alkalmas a daisy-chain-ben való részvételre. A portok be- és kimenetei a TTL jelszintekkel kompatibilisek, ezen kívül a "B" port darlington tranzisztorok meghajtására is képes. Az "A" port kétirányú adatátvitelt tesz lehetővé. A PIO üzemmódjai a következők: byte-os input/output;- kétirányú üzemmód és - bitenként programozott. Az áramkört a Z-80 rendszer órajele szinkronizálja. A PIO +5 V-os tápfeszültséget igényel.
A Z-80 PIO egyrészt a Z-80 CPU buszához csatlakozik, másrészt a környezettel tartja a kapcsolatot. A buszra csatlakozó kivezetések a
, -M1, -IORQ, -RD, -INT, D0-D7,
ezen kívül a CPU felől kapja a vezérlést a -CE, C/-D Sel, B/-A Sel pontokon. A daisy-chain-re az IEI és IEO kivezetésekkel csatlakozik. A külvilág felé az "A" port jelei: AO-A7, -ASTB, ARDY. A "B" port jelei: B0-B7, -BSTB, BRDY.
A PIO blokkdiagramját az 1.5.1-1. ábra, az egyes portok blokkdiagramját pedig az 1.5.1-2. ábra mutatja. Az I/O port 6 regiszterből áll, melyet a handshake logika egészít ki. A port ilyen felépítése teszi lehetővé a bitenkénti programozást, melynek használata sok esetben leegyszerűsíti hardware-ünket.


1.5.1-1. ábra: PIO blokkvázlata


1.5.1-2. ábra: PIO portjának blokkvázlata

A bitenként programozott üzemmód a Z-80 PIO-nál nem egyszerűen az egyes bitek kötetlen I/O üzembe való állítását jelenti, mint az i8255-ös esetében. Ez is elvégezhető a kiválasztó regiszterbe való beírással, de ezenfelül Z-80 PIO a maszk és maszkvezérlő regiszterek segítségével megszakítást is tud kérni. A maszkregiszter tartalmazza azokat a biteket, melyeket figyelni kell, a maszkvezérlő regiszter pedig azt az információt tartalmazza, hogy bármelyik figyelt bitnél kell-e a megfelelő irányú jelváltozás létrejötte esetén megszakítást kérni, avagy csak akkor, ha mindegyik figyelt bitnél megtörtént a megfelelő irányú jelváltozás.
Bitenként programozott üzemmódban a kimenetként beállított bitek kimenő tartalma is visszaolvasható, ami a blokkvázlat alapján könnyen követhető. Ugyanígy lehet a maszkolásba egy kimenő bithelyet is belevenni, így a tervező számára sok lehetőség kínálkozik egy periféria kommunikáció, illetve a környezetből érkező jelek megszakításkéréses kezelésére. Például: az IT rendszer csak egy, a környezetbe is kijutó jel hatására aktivizálódik.
Ebben az üzemmódban, ha az érzékelt jel, mely a megszakításkérést kiváltja túl rövid, akkor nem tudjuk, hogy melyik bemenet váltotta ki. Ehhez a szolgáltatáshoz egy újabb regiszter alkalmazására lett volna szükség, de ezt a tervezők nem építették be a PIO-ba. Amennyiben több bemenetről érkezhet megszakításkérés és ezeket el akarjuk különíteni egymástól, akkor gondoskodnunk kell arról, hogy az egyes jelek legalább olyan hosszúak legyenek, hogy azok beolvasására az IT kezelésekor legyen lehetőség. Ha a jelek hosszát nem ismerjük, akkor tárolók közbeiktatásával oldhatjuk meg a feladatot. Abban az esetben, ha a több helyről érkező megszakításkérési ok azonos reakciót kell hogy eredményezzen, akkor a feladatot a PIO-val egyszerűen meg tudjuk oldani. A PIO bitenként programozott logikája olyan esetben is tökéletesen megfelel, amikor egy időben csak egy helyről várjuk valamilyen jel megérkezését.
A Z-80 PIO áramkör nem csupán a bitenként programozott üzemmódban tud megszakítást kérni, hanem egyéb üzemmódokban is, minden adat átvitelekor - feltéve, ha engedélyezzük. A vektoros megszakításkérés rendszerre alkalmas PIO és a CPU természetesen csak akkor tud együttműködni, ha a CPU az IT MODE=2 üzemben dolgozik. A PIO alkalmas daisy-chain-ben való részvételre is. Ahhoz, hogy a PIO megszakítást kérjen, az IEI bemenetének logikai "1" szinten kell lennie. Természetesen az IEO kimenetet a PIO a rendszer általános ismertetésénél elmondottak szerint vezérli, valamint dekódolja a RETI utasítást.
A PIO szolgáltatásaihoz tartozik a reset logika, amely a blokkvázlaton a belső vezérlő logikában található. A reset logika két esetben lép működésbe: bekapcsoláskor és akkor, ha a vezérlőbuszon -M1 jel érkezik, ha -IORQ és -RD nem érkezik. A CPU ismertetéséből kiderül, hogy ilyen állapot nem fordulhat elő, mert a RESET ideje alatt a CPU vezérlő kimenetei inaktívak, M1 ciklusban pedig vagy memória olvasásnak (RD * MREQ = utasítás beolvasás) vagy periféria-hozzáférésnek (IORQ * RD = megszakításkérés nyugtázás) kell lennie. Így az -M1 jelvezeték logikai "0"-ba vezérlését külső logikával kell előállítanunk, ha üzem közben RESET-et óhajtunk. Ezt azért oldották meg ily módon, hogy kivezetést tudjanak megtakarítani. A külső reset logikát lásd az 1.5.1-3. ábrán.


1.5.1-3. ábra: RESET logika PIO-hoz

A PIO reset ciklusa az alábbi feladatokat látja el:

  1. A port kimenetek nagy impedanciás állapotba kerülnek, és az ARDY, BRDY kimenetek logikai "0"-ba,
  2. Port output regisztereket törli,
  3. Port maszkregisztereket törli,
  4. Port IT engedélyező flip-flopokat törli.

A PIO nem rendelkezik lekérdezhető állapot regiszterrel, így egyszerűen csak a megszakításkérés jelzi számunkra az adat érkezését, illetve elvételét. Ha megszakításkérés nélkül akarjuk a PI0-t alkalmazni, akkor a lekérdezést úgy tudjuk megvalósítani, hogy a vezérlő jelekből (RDY, -STB) a szükségest egy porton keresztül beolvassuk.

1.5.2. Az áramkör kivezetéseinek értelmezése
Az áramkör kivezetéseit az 1.5.2-1. ábra mutatja be.


1.5.2-1. ábra: PIO kivezetései

Az egyes kivezetések értelmezése:

Rendszer órajel (SYSTEM CLOCK)
A PIO a Z-80 CPU-hoz hasonló szintű egyfázisú órajelet igényel. Ismertetését lásd az 1.2.1. fejezetben.
-M1
Utasításkód beolvasás (MACHINE CYCLE)
Ez jelzi a PIO szmára, hogy a CPU M1 ciklust hajt végre. Ez azért lényeges, mert a megszakításkérési ciklus számára nincs külön ITACK jel, hanem az -M1 és az -IORQ együttes megléte jelzi a megszakításkérés elfogadását.
A PIO figyeli az M1 ciklusban a memóriából érkező utasításokat és dekódolja a megszakításkérés logika számára a RETI utasítást. Ha M1 ciklus aktív -RD avagy -IORQ jel nélkül jön létre, akkor a PIO reset állapotba kerül. Így sikerült a tervezőknek egy külön kivezetést, a reset kivezetést megtakarítaniuk. (/Természetesen bekapcsoláskor automatikusan reset-et hajt végre a PIO).
-IORQ
I/O hozzáférési igény (I/O REQUEST)
Az -M1-el együtt a megszakításkérés az ITACK ciklust jelzi. Egyébként a B/-A Sel, C/-D Sel, -RD jelekkel együtt, ha a -CE jel aktív a PIO és a CPU adatátvitelét vezérli.
-RD Olvasás (READ)
Jelzi, hogy a CPU olvasást hajt végre. Az egyéb vezérlő jelekkel meghatározott portról adja az információt a PIO a CPU részére - feltéve, ha a -CE aktív.
-CE Áramkör kiválasztás (CHIP ENABLE)
Ez a bemenet jelzi, hogy a CPU az áramkörrel kíván adatforgalmat létesíteni.
B/-A SEL
Port kiválasztás (PORT SELECT)
Ez a bemenet jelzi a PIO-nak, hogy a CPU melyik portot kívánja elérni. Ha a bemeneten logikai "0" van, ez az A port megcímzését jelenti, ha logikai "1" szint van, akkor a B portot éri el a CPU. Célszerű ide az A0 címbusz vezetéket bekötni.
C/-D SEL
Utasítás / adat kiválasztás (COMMAND / DATA SELECT)
Ez a bemenet az utasítást, illetve az adatátvitelt választja ki. A logikai "0" jelenti, hogy a CPU és a PIO között adatforgalom van, a logikai "1" pedig azt jelenti, hogy a CPU parancsot kíván adni a PIO-nak. Célszerű ide az A1 címbusz vezetéket bekötni.
D0-D7
Adatbusz (DATA BUS)
A D0-D7 kivezetések a 8 bites adatbuszhoz csatlakoznak, amin egyrészt az utasítások érkeznek, másrészt ezen zajlik le az adatforgalom a CPU és a PIO között.
-INT Megszakításkérés (IT REQUEST)
A PIO ennek a nyitott kollektoros kivezetésnek a logikai "0" szintre vitelével jelzi a CPU felé, hogy megszakítást kér.
IEI, IEO IT engedélyezés be, IT engedélyezés ki (IT ENABLE IN, IT ENABLE OUT)
Ezzel a két kivezetéssel csatlakozik a PIO a daisychain-hez chain-hez a rendszerleírásban elmondottak szerint. Lásd 1.2.2. fejezet.
A0-A7

"A" port ("A" PORT)
Kétirányú adatforgalomra alkalmas, 8 bites, háromállapotú port kivezetései.

-ASTB "A" port kapuzójel ("A" PORT STROBE)
Az -ASTB a külvilág felől érkező jel, mely a következőket jelenti a PIO számára:
  1. Kimenet üzemmódban az -ASTB jel felfutó éle jelzi, a PIO számára, hogy az adatot a porthoz csatlakozó logika átvette.
  2. Bemenet üzemmódban az -ASTB jel aktív állapotában veszi be a PIO az adatot a külvilágból.
  3. Kétirányú adatátvitel üzemmódban az -ASTB jel aktív állapotakor a PIO az A port kimenetét a kétirányú adatbuszra helyezi. A jel felfutó éle jelzi, hogy az adatot a porthoz csatlakozó logika átvette.
  4. Bitenként programozott üzemmódban az -ASTB jelnek nincs hatása.
ARDY

"A" port kész ("A" PORT READY)
A PIO ezen kivezetés segítségével tájékoztatja a külvilágot az adatforgalomról.

  1. Kimenet üzemmód: A jel aktív állapota jelzi, hogy a kimeneti regiszter új adatot tartalmaz és az elvehető.
  2. Bemenet üzemmód: A bemenő regiszter kész az adat fogadására. A jel lefutó éle jelzi, hogy a PIO az adatot átvette.
  3. Kétirányú adatátvitel üzemmód: A jel aktív állapota jelzi, hogy adat kiadására kész a PIO, de az adat csak az -ASTB jel aktív állapotában kerül ki a buszra.
  4. Bitenként programozott üzemmód: A kimenet logikai "0" szintű.
B0-B7 "B" port ("B" PORT)
Kétirányú adatforgalomra alkalmas háromállapotú port kivezetései. A 8 bites busz képes darlington tranzisztorok meghajtására.
-BSTB "B" port kapuzójel ("B" PORT STROBE)
A -BSTB jel jelentése azonos az -ASTB-vel, kivéve a 3-as esetet, amikor is ez a jel mutatja azt, hogy az "A" port a buszról beveheti az adatot.

-BRDY "B" port kész ("B" PORT READY)
A -BRDY jel jelentése azonos az -ARDY-vel, kivéve a 3-as esetet, amikor azt jelenti, hogy az "A" port bemeneti regisztere adat fogadására kész.

1.5.3. Az üzemmódok részletes ismertetése

0. Kimenet üzemmód
A CPU által a PIO-nak küldött adat a port kimeneti regiszterébe kerül, majd mivel ez ebben az üzemmódban összeköttetésben van a port kivezetésekkel, a kiküldött adat a port kivezetéseken is megjelenik. Az adat megérkezésekor a port READY jele aktívvá válik, jelezve a külvilág felé, hogy érvényes adat van a kimeneteken. A kívülről érkező -STROBE jel inaktívvá válása jelzi, hogy a porthoz csatlakozó logika az adat átvételét végzi. (Minimális ideje 250 ns!) Amikor a -STROBE jel inaktívvá válik, ez jelzi, hogy az adat átvétele befejeződött. Ennek hatására a PIO a READY jelet visszaveszi, és ha a megszakításkérés engedélyezett, megszakítást kér a CPU-tól. Az adatátvitel folyamatábráját az 1.5.3-1. ábrán mutatjuk be. Az ábrán jól látható, hogy a READY jelet az órajel lefutó éle is időzíti. Ez eredményezheti szélső esetben, hogy a -STROBE felfutó élétől számítva egy órajel cikluson át még "él" a READY jel. (tDL/RY/MAX = tc+200 nsec). A perifériának tehát célszerű a READY felfutó élét figyelni.


1.5.3-1. ábra: PIO kimenet üzemmód folyamatábrája

1. Bemenet üzemmód
A bemenet üzemmódnál a kívülről érkező -STROBE jel aktív állapota tudatja a PIO-val, hogy az adatvonalon érvényes adat van. (A -STROBE jel minimális ideje 150 ns.) A PIO ez idő alatt átveszi az adatot, majd a -STROBE jel inaktívvá válásakor (felfutó élére), ha engedélyezett a megszakításkérés, megszakítást kér, és a READY vonalat inaktívvá teszi, jelezve ezzel, hogy a bemeneti buffer foglalt. Amennyiben a CPU kiolvassa a PIO-ból az adott csatorna bemeneti bufferét, akkor a READY jel ismét aktívvá válik. A READY jel ebben az üzemmódban is az órajel lefutó élével vezérelt, így a csatlakozó logikának célszerű a READY jel felfutását figyelni. Reset hatására a READY logikai "0" szintű és csak bemenetre programozáskor válik logikai "1" szintűvé. A bemenet üzemmód adatátvitelének folyamatábrája az 1.5.3-2. ábrán látható.


1.5.3-2. ábra: PIO bemenet üzemmód folyamatábrája

2. Kétirányú adatátviteli üzemmód
A kétirányú üzemhez 4 vezérlő jel szükséges, ezt úgy oldották meg, hogy az "A" port "handshake" vonalai vezérlik a kimenetet és a "B" port "handshake" vonalai a bemenetet. A "B" port ily módon elvesztve a vezérlő jeleit, csak a bitenként programozott üzemmódban működhet. Mivel a kétirányú üzemben nem engedhető meg egyszerre a kimenet és a bemenet - bár maga a PIO áramköri kialakítása lehetővé tenné - mert a kívülről érkező jel és a PIO-ból kimenő jel két meghajtó áramkör egymásra dolgozását jelentené, ezért a kimeneti jelfolyamat ez esetben eltér a korábban leirt kimeneti jelfolyamtól. Az eltérés az, hogy a kimenő adat a kimeneti regiszterből a kimenő vonalakra csak akkor kerül ki, ha a -STROBE jel (-ASTB) aktív. A külső logikának kell arról gondoskodnia, hogy ez idő alatt - míg az -ASTB bemenetet aktívan tartja - ne akarjon adatot kiadni, csak fogadni. Az 1.5.3-3. ábrán látható jelfolyamatból kiderül, hogy az adat bevétel hasonló a bemenet üzemmódnál bemutatottal.


1.5.3-3. ábra: PIO kétirányú adatátvitel üzemmód folyamatábrája

3. Bitenként programozott üzemmód
A PIO-nak kivitt byte a kimeneti regiszterbe kerül, és azon bitjei, melyeket kimenetnek definiáltunk, kikerülnek a megfelelő port kivezetésekre. A PIO-ból beolvasni pedig a port kivezetések pillanatnyi állapotát lehet, így a kimenetként kivitt bitek is visszaolvasásra kerülnek. Bitenként nem tudunk adatot kivinni a kimenetre csak byte-onként. Hogy a többi bit értéke ne változzon tárolni kellene a bitmintát, de erre nincs szükség, mert a korábban kivitt bitminta visszaolvasható. Ezt beolvasva, majd a módosítandó bitre SET avagy RES utasítást végrehajtva újból kivihetjük a byte-ot. Ez három utasítással végrehajtható.
A bitenként programozott üzemmódnak van ezen kívül egy kiemelkedő szolgáltatása: egyes bithelyek állapotának figyelése, azaz megváltozásukkor IT kérése. A bitmaszkkal beállítható, hogy mely bithelyet figyelje a PIO. Figyelt bithely nemcsak bemenetre beállított lehet, hanem tetszőlegesen bármelyik. Ezen kívül beállítható, hogy a logikai "1" szint vagy a logikai "0" szint megjelenése váltson ki megszakításkérést. Ha több bithelyet állítunk be, megszabhatjuk, hogy bármelyik a megfelelő állapotba billenésekor IT-t kérjen, vagy csak akkor jöjjön létre IT, ha az összes kiválasztott bithely megfelelő szinten áll.

1.5.4. Programozás
Mint láttuk a PIO-nak négyféle üzemmódja van:

0. üzemmód = KIMENET
1. üzemmód = BEMENET
2. üzemmód = KÉTIRANYU ADATÁTVITEL
3. üzemmód = BITENKÉNT PROGRAMOZOTT

A "B" port a 2. üzemmódban nem működhet, és amikor az "A" port 2. üzemmódban dolgozik a "handahake" vonalai az "A" port "handahake" vonalaival együtt segítik a kétirányú adatátvitelt, a "B" portnak 3. üzemmódban kell lennie.
Az üzemmód beállítást az adott port részére a vezérlő regiszterbe való írással (C/-D Sel=1) végezhetjük el. A beírt byte formátuma az 1.5.4-1. ábrán látható.


1.5.4-1. ábra: Üzemmód beállítása

Az M1 és M0 jelzésű üzemmód beállító bitek jelentése:

M1
M0
beállítótt üzmmód
példa
0
0
1
1
0
1
0
1
0 = kimenet
1 = bemenet
2 = kétirányú adatátvitel
3 = bitenként programozott
0FH
4FH
8FH
00FH

Ha a 3. üzemmódot állítjuk be, akkor a vezérlő regiszterbe még egy byte-ot kell küldenünk, amely az egyes bitek irányát jelzi: ha a bithely értéke logikai "0", kimenet, ha logikai "1" bemenet az adott port bithelye.
Az üzemmód beállításán kívül a megszakításkérést is engedélyezhetjük egy IT vezérlő byte kiküldésével, melynek formátuma az 1.5.4-2. ábrán látható.


1.5.4-2. ábra: IT vezérlő-byte beállítása

Ahol az ábrán bemutatott beállító bithelyek jelentése:

EI
DI

ha = 1, akkor engedélyezi az IT kérést,
ha = 0, akkor tiltja.

Az alábbi bitek csak a 3. üzemmód esetén érvényesek:

AND
OR


ha = 1, akkor a maszkban adott bithelyek mindegyikének a megfelelő állapotban kell lenniük ahhoz, hogy EI=1 esetén a PIO megszakítást kérjen a CPU-tól. Ha a bithely értéke 0, akkor bármelyik figyelt bithely megfelelő szintje és EI=1 esetén kéri a megszakítást a PIO.

HIGH
LOW

ha = 1, akkor a figyelt bithelyeknek az 1-be billenése okozhat megszakításkérést, ha pedig 0, akkor a bithelyek 0-ba billenését detektálja a figyelő logika.
MASK

ha = 1, akkor a vezérlő regiszterbe egy maszk byte-ot kell az IT vezérlő byte-ot követően kiküldenünk, amely kijelöli a figyelendő bithelyeket. A logika azt a bithelyet figyeli, ahol 0 van.

Az IT engedélyezésére és tiltására van egy külön IT engedélyező / tiltó byte is. A 3. üzemmód esetén nem kell újra programozni a beállítást a megszakítás engedélyezésekor avagy tiltásakor lásd 1.5.4-3. ábra.


1.5.4-3. ábra: IT engedélyező / tiltó byte

Ha engedélyezzük a megszakításkérést, és a CPU IT 2 üzemmódban dolgozik - amely a vektoros IT kezelésre alkalmas, akkor az IT vektort is ki kell küldenünk a PIO-nak. A kiküldés a vezérlő regiszterbe való írással történik meg, úgy, hogy a byte legkisebb helyértékű bitje kötelezően 0. Amikor érvényes megszakításkérés elfogadást kapott a PIO, akkor ezt az IT vektort küldi vissza a CPU-nak. Lásd 1.2.3. fejezet.

1.5.5. Alkalmazási példák
Az 1.5.5-1. ábrán látható a DZB-180-as lengyel gyártmányú mátrixnyomtató illesztése. Az adatbuszt TTL meghajtással láttuk el, zavarvédelem céljából. A fel- és lehúzó ellenállások közötti vonal kvázi árammeghajtású. Az RDY jelet az -STB jel késleltetéssel törli. Az ábrán adott számozás a DZM-180 megfelelő csatlakozópontjait jelöli.

1.5.5-1. ábra: DZM-180-as mátrixnyomtató illesztése PIO-val

A nyomtató vezérlését ellátó programra egy lehet séges megoldást mutatunk be az 1.5.5-2. ábrán:



PIOAD:
PIOAC:
URES:

ITVECT:

PIOINI:














PIOIT:






KARKI:

VAR:

ORG 1000H

EQU 80H
EQU 81H

DEFS 1

DEFW PIOIT

PUSH AF
PUSH BC
LD C,PIOAC
LD A,00001111B
OUT (C),A
LD A,ITVECT
OUT (C),A
LD A,10000011B
OUT (C),A
XOR A
LD (URES),A
POP BC
POP AF
RET

EI
PUSH AF
XOR A
LD (URES),A
POP AF
RETI

PUSH AF

LD A,(URES)
AND A
JR NZ,VAR
POP AF
OUT (PIOAD),A
LD (URES),A
RET

END



; PIO A adat byte
; PIO A parancs byte

; jeézi, hogy a PIO üres


; PIO alaphelyzetbe állítása



; kimenet üzemmód



; IT engedélyezés













; karaktert visz ki

A program három részből áll: az első az alaphelyzet beállítására szolgál (inicializálás), a második a karakter kivitelét készíti elő, a harmadik pedig a port bejelentkezésekor a tényleges karaktert viszi ki. A program ilyen felépítésével biztosítható, hogy a nyomtató foglaltsága esetén nem köti le a CPU időt, mert kihasználja a PIO vektoros megszakításkérési lehetőségét.

A kimenet üzemmód bemutatása után a bemenet üzemmód bemutatására a magyar MOM ER 300-as lyukszalagolvasó illesztését mutatjuk be az 1.5.5-3. ábrán. A kétirányú adatátvitel üzemmód bemutatására legcélszerűbb a két PIO-val megvalósított két rendszer közötti adatátvitel. Ez az 1.5.5-4. ábrán látható.


1.5.5-3. ábra: MOM ER-300-as lyukszalagolvasó illesztése PIO-val


1.5.5-4. ábra: két rendszer közötti (8 bit) adatátvitel PIO-val

A READY és a -STROBE vonalak nem köthetők össze egyszerűen, mert az adatbuszra egy időben csak az egyik PIO tehet adatot. Ha a bemeneti regiszter mindkét oldalon üres, mindkét READY nyitná mindkét kimenetet. Ezért az -ASTB jelek meghajtását nem a BRDY jelek végzik, hanem a bitenként programozott üzemmódban működő "B" port egyik bithelye (adás). Ez a jel vezérli a saját port engedélyezését is. A másik port RDY jelének fogadását egy "B" portban levő bithely végzi (vétel).

1.5.6. A PIO idődiagrammjai
Végül ismertetjük a PIO áramkör idődiagramjait az 1.5.6-1. ábrán.

1.5.6-1. ábra: a PIO idődiagramjai

Az idődiagramban lévő számok jelentése (az adatok msec-ben értendők):

szám értelmezés
Z-80 PIO
Z-80A PIO
Z-80B PIO
min
max
nin
max
min
max
1
2
3
4
5
6
7
8

9
10

11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
órajel periódusidő
órajel logikai "1" szint
órajel logikai "0" szint
órajel fel-, és lefutás
vezérlőjel előkészültségi idő
adatátvitel késleltetése
adat előkészületi idő
adatkivitel késleltetése
     ITACK-nál
adatbusz elengedési idő
IEI előkészületi idő
     ITACK-nál
IEO késleltetése IEI felfutáskor
IEO késleltetése IEI lefutáskor
IEO késleltetése -M1 lefutásakor
-IORQ előkészületi idő
-M1 előkészületi idő
-RD előkészületi idő
port adat előkészületi idő
pot adat késleltetés
port adatbusz elengedés
port adatkiviteli idő
-STB impulzus idő
-INT késleltetése -STB után
-INT késleltetése bitminta után
RDY átviteli idő
RDY késleltetése -STB után
400
170
170

280

50



140




250
210
240
260



150
4000
2000
2000
30

430

340

160


210
190
300




230
200
200

490
540
tc+460
tc+400
250
105
105

145

50



140




115
90
115
230



150
4000
2000
2000
30

380

160

110


160
130
190




210
180
180

440
490
tc+410
tc+360
165
65
65

50

50



100





70

190



120

2000
2000
20

300

120

70


160
120
100




180
160
160

350
430

1.6. Számláló-időmérő áramkör (CTC)

1.6.1. Általános ismertetés
A Z-80 család CTC (Counter Timer Circuit) eleme számlálási és időmérési célra készült.
A CTC négy független csatornát tartalmaz ebből három egyforma felépítésű, a negyedik nem rendelkezik kimenettel a környezet felé. Bármelyik csatorna lehet számláló, vagy időzítő. A csatornák lefele számlálóként működnek, pillanatnyi értékük bármikor kiolvasható. Amikor a tartalom nullára csökken, akkor ezt a csatornakimeneten (3 csatornánál) jelzik, megszakításkérést adhatnak, illetve időzítő üzemben automatikusan betöltik az időállandót.
A CTC illeszkedik a Z-80-as CPU periféria koncepcióhoz, azaz alkalmas a daisy-chain-ben való részvételre, vektoros megszakítást tud kérni a CPU-tól.
A CTC csatorda blokkvázlata az 1.6.1-1. ábrán látható.


1.6.1-1. ábra: CTC csatorna blokkvázlata

Az ábráról kiderül, hogy a CPU tud beírni az egyes csatorna vezérlő és időállandó regiszterekbe, valamint ki tudja olvasni a számlálóregiszter tartalmát. A számlálóregiszter a számlálandó impulzusokat a rendszer órajelből egy előosztón át vagy a környezettől a csatorna bemeneten kapja. Ennek kiválasztása és az előosztó osztásarányának a beállítása a csatornavezérlő regiszteren keresztül történik. A számláló feltöltése az időállandó regiszteren keresztül történik. Ezzel a módszerrel biztosítható az automatikus feltöltés, minden egyes számlálási ciklus után.
A számlálóregiszter lefelé képes számolni. Ha a csatorna üzeme engedélyezett, akkor a számlálási üzemmódban minden egyes impulzus után csökken eggyel a számláló tartalma, illetve az időzítési üzemmódban az előosztó által adott órajel hatására. A CPU bármikor kiolvashatja a számláló pillanatnyi értékét. Amikor a számláló tartalma a nullára csökken a ZC/T0 kivezetésen megjelenik a logikai "1" szint. A 3-as csatornának nincs ilyen kimenete, mert 28 kivezetésű tokozást választottak a tervezők, és így ezt már nem tudták kivezetni. Ha a RESET kivezetést a PIO-hoz hasonlóan belső logikával oldják meg, a 3-as számláló is kaphatott volna ZC/T0 kivezetést. Így azonban ez a csatorna csak rendszeren belüli számlálást, illetve időzítést tud végezni, azaz megszakításkéréssel jelzi a számlálóregiszter tartalmának nullára való csökkenését.

1.6.2. Az áramkör kivezetéseinek értelmezése
A bekötési vázlat az 1.6.2-1. ábrán látható.

D0-D7 Adatbusz (DATA BUS)
A Z-80 CPU adatbusz csatlakozása.
Rendszer órajel (SYSTEM CLOCK)
Az egyfázisú rendszer órajel bemenete. Specifikációját és előállítását lásd a rendszerleírásnál (1.2.1. fejezet).
-M1
Utasításkód olvasás (MACHINE CYCLE)
Ha a bemenet aktív és vele egyidőben az -IORQ bemenet inaktív, akkor a CPU utasításkódot olvas. Ha a bemenet aktív és vele egyidőben az -IORQ bemenet is aktív, akkor a CPU megszakításkérést nyugtáz, azaz ITACK ciklust hajt végre. Ha a CTC áramkör kért megszakítást és az IEI bemenet logikai "1"-ben van, akkor ez neki szól és ezért az IT vektort kell válaszolnia az adatbuszon.
-IORQ
I/O hozzáférés igény (I/0 REQUEST)
Ha a bemenet aktív és vele egyidejűleg a -CE bemenet is aktív és nincs -M1, akkor normális adatátvitel zajlik a CPU és a CTC közt. Ha az -M1 jel is aktív, akkor ITACK ciklus zajlik. Amennyiben az IEI kivezetés logikai "1" állapotban van és az áramkör kért megszakítást, az előre betöltött IT vektort adja be az adatbuszon.
-RD Olvasás (READ)
Az adatátvitel iránya az adatbuszon: a CPU olvas.
-INT
Megszakításkérés (INTERRUPT REQUEST)
Ha a CTC IEI bemenete logikai "1" szinten van és valamelyik csatornája megszakításkérelemmel jelentkezett, akkor ezen a nyitott kollektoros kimeneten át kér megszakítást.
-RESET
Törlés (RESET)
Hatására a CTC áramkör minden csatornájának számlálója megáll. Minden csatorna IT kérése tiltódik, ha volt folyamatban IT kérés, az megszakad, az INT kivezetés inaktív állapotba kerül, az IEO másolja az IEI bemenetet. A csatornák ZC/T0 kimenetei inaktívvá válnak, a D0-D7 vonalak nagy-impedanciás állapotba kerülnek. A CTC-be bekapcsolási (power-on) törlést nem építettek be! A -RESET bemenetnek 3 órajel periódusban aktívnak kell lennie!
IEI, IEO IT engedélyezés be / ki (IT ENABLE IN, IT ENABLE OUT)
A daisy-chain-hez való csatlakozásra szolgálnak. Lásd 1.2.2. fejezet.
-CE Áramkör kiválasztás (CHIP ENABLE)
Ha ez a bemenet aktív, akkor a CPU és a CTC között adatforgalom létesülhet. A CTC-t I/O egységként kell csatlakoztatni a CPU-hoz.
CS0 - CS1
Csatorna kiválasztás (CHANNEL SELECT)
Csatorna címző bemenetek, melyek a 4 CTC csatorna kiválasztására szolgálnak. Célszerű az A0, A1 címbusz vezetékre kötni ezeket. Az alábbi táblázat mutatja a címzést:
Csatorna szám
CS1
CS0
0
1
2
3
0
0
1
1
0
1
0
1
CLK / TRG 0-3 Külső órajel / időzítő engedélyezés (EXTERNAL CLOCK / TIMER TRIGGER INPUT)
Az egyes csatornák jelbemenete. Számlálási üzemmódba (CLK) az aktív él hatására történik egy lefelé számlálás. Időzítési üzemmódban (TRG) az aktív él indítja az időzítést. Az "aktív él" iránya (felfutás / lefutás) beállítható a csatorna-vezérlő regiszterben.
ZC / T0 0-2

Számlálás / időzítés vége (ZERO COUNT/TIMEOUT)
A három magasabb prioritású csatorna jelkimenete. Aktívvá válik (logikai "1"), ha a csatorna számlálója eléri a nullát.

A kivezetésszám korlátozottság (28) miatt -WR jelet nem kér az áramkör, ez megfelel az RD-nek, abban az esetben, ha -IORQ és -CE aktív, valamint az -M1 inaktív. (WR = -RD * IORQ * CE * -M1)

1.6.3. Az üzemmódok részletes ismertetése
A CTC állapota bekapcsoláskor definiálatlan, mivel nem építettek bele bekapcsolási törlést. Célszerű ezért külső logikával biztosítani a bekapcsolási törlést (ha egyébként nem lenne a rendszerben). Legelőször a csatorna-vezérlő, majd az időállandó regisztert kell feltölteni. Abban az esetben, ha bármelyik csatornát megszakításkérésre programozzuk, akkor csatorna indítása előtt az IT vektort is fel kell töltenünk.
A CTC-nek két alapvető üzemmódja van, a számlálási és az időzítési üzemmód.

Számlálási üzemmód
Ebben az üzemmódban a számláló a CLK bemeneten érkező impulzusokat számolja. Az impulzusokat a rendszer órajel felfutó élével mintavételezi az áramkör.

Ha a csatorna számlálója eléri a nullát a ZC kimenet aktívvá válik (kivéve a 3. csatornát). Amennyiben a megszakításkérés engedélyezve van, akkor a csatorna IT-t kér. Természetesen a daisy-chain logikának megfelelően, ha magasabb prioritású periféria megszakításának kezelése folyik, a megszakításkérés csak ennek befejeződése után történik meg. A 3. csatornánál csak a megszakításkéréses üzemmód alkalmazása értelemszerű, nem lévén ZC kimenete. A nulla elérése után az időállandó automatikusan betöltésre kerül a számlálóregiszterbe. Ha számlálás közben a CPU átírja az időállandót, az a következő nullázódás alkalmával kerül a számlálóregiszterbe, azaz a futó számlálási ciklust nem befolyásolja. Az idődiagram a 1.6.3-1. ábrán látható.


1.6.3-1. ábra: Számlálási üzemmód idődiagramja

Időzítési üzemmód
Ebben az üzemmádban a rendszer órajel az ütemadó, ezt osztja le az előosztó és a számláló. Az előosztón kétféle osztásarányt állíthatunk be, 16-os vagy 256-os osztást, a számlálón pedig 1-256-ig terjedő osztásarányt tudunk beállítani. Így a rendszer órajel osztása 16-4096-ig terjed 16-os lépcsőkben, illetve 256-65536-ig 256-os lépésközzel. Ha ez az osztás nem lenne kielégítő, két vagy több csatorna egymás után kapcsolásával tetszőlegesen hosszú időzítést is be tudunk állítani.
2,5 MHz órajel esetén egy csatorna minimális időzítése 6,4 ms és maximális időzítése 26214,4 ms.
Az egyes időzítéseket a T = Tc*p*TC képlettel számíthatjuk, ahol a "Tc" a rendszer órajel periódusideje, a "p" az előosztó faktora (16 vagy 256), a TC pedig a számláló részére beállított időállandó (1-256).
Az időzítést indíthatja a CPU, de lehet külső jellel (TRG) is indítani. Ha a CPU indítást programozzuk, akkor az időállandó beírását követő gépi ciklus második rendszer órajel felfutó élére indul az időzítés. Ha külső indítást állítunk be, akkor a fent leírt idő után érkező trigger jel hatására a trigger jel utáni 2. órajelre indul az időzítés. Ha a trigger jel külsőleg nincs a rendszer órajelhez szinkronizálva, akkor előfordulhat, hogy a rendszer órajel felfutó éle előtt ts(TR) setup idő nincs meg, így csak a következő rendszer órajel felfutó éle utáni 2. órajelre indul az időzítés.
Az időzítés lejártakor a TO kimeneten (kivéve a 3. csatornát) logikai "1" jelenik meg. Az időállandó automatikusan áttöltődik a számlálóregiszterbe és a ciklus újra indul. Amennyiben az IT engedélyezett a csatorna számára, akkor a megszakításkérést továbbítja az IT logika felé, amely megszakítást kér a CPU-tól, ha nincs folyamatban magasabb prioritású megszakításkezelés, ha van, akkor ennek kezelése után kéri a megszakítást. (Lásd bővebben az 1.2.2. fejezetben). Az időzítési üzemmód idődiagramja a 1.6.3-2. ábrán látható.


1.6.3-2. ábra: Az időzítési üzemmód idődiagramjai

1.6.4. Programozás
A RESET jel után először a csatornavezérlő regisztereket kell feltölteni. Az egyes regiszterek megcímzése a CS0-CS1 vezetékekkel történik (lásd áramkör kivezetéseinek leírása). A parancsot mind a négy csatornára azonos módon kell kiadni.

A. Számlálási üzemmód


1.6.4-1. ábra: Számlálási üzemmód parancs byte-ja

Az egyes bitek jelentése:

bit 0 = "1" parancs írás
bit 1 =
stop: ha értéke 1, akkor a számlálás megáll, de nem törli a többi bithelyet, így a feltételek megléte esetén a számlálás tovább indulhat. Ha a bit2 is "1", akkor az új időállandó betöltése után új értékkel folytatódik a számlálás. Ha értéke 0, akkor a számlálás menetére nincs hatással.
bit 2 =
új időállandó. Ha a bithely értéke 1, akkor a csatornának küldött következő byte az időállandó regiszterbe kerül. Ha értéke 0, akkor a parancs byte-ot nem követi időállandó. A csatorna indítása előtt az időállandó regisztert fel kell tölteni, különben a csatorna nem indul be.
bit 3 = közömbös
bit 4 = aktív él beállítás: ha a bithely értéke 1, akkor a felfutó, ha a bithely értéke 0, akkor a lefutó él aktív.
bit 5 = közömbös
bit 6 = "1" - számlálási üzemnőd
bit 7 = megszakításkérés engedélyezés: ha a bithely értéke 1, akkor a megszakításkérés engedélyezett, ha a bithely értéke 0, akkor a csatorna nem kérhet megszakítást.

B. Időzítési üzemmód
A parancs byte értelmezése a 1.6.4-2. ábrán látható.


1.6.4-2. ábra: Időzítési üzemmód parancs byte-ja

Az egyes bithelyek jelentése:

bit 0 = "1" parancs írás
bit 1 =
stop: ha értéke 1, akkor a számlálás megáll, de nem törli a többi bithelyeket, így a feltételek megléte esetén a számlálás tovább indulhat. Ha a bit2 is "1", akkor az új időállandó betöltése után új értékkel folytatódik a számlálás. Ha értéke 0, akkor a számlálás menetére nincs hatással.
bit 2 =
új időállandó. Ha a bithely értéke 1, akkor a csatornának küldött következő byte az időállandó regiszterbe kerül. Ha értéke 0, akkor a parancs byte-ot nem követi időállandó. A csatorna indítása előtt az időállandó regisztert fel kell tölteni, különben a csatorna nem indul be.
bit 3 =
engedélyezés beállítás: ha a bithely értéke 1, akkor a TRG bemenetről indítható az időzítés. Ha a bithely értéke 0, akkor automatikusan indul az időzítés az időállandó regiszter feltöltése után.
bit 4 = aktív él beállítás: ha a bithely értéke 1, akkor a felfutó, ha a bithely értéke 0, akkor a lefutó él aktív.
bit 5 = előosztó beállítás: ha a bithely értéke 1, akkor az előosztó osztásaránya 256, ha a bithely értéke 0, akkor 16.
bit 6 = "0" - időzítési üzemmód
bit 7 =
megszakításkérés engedélyezés: ha a bithely értéke 1, akkor a megszakításkérés engedélyezett, ha a bithely értéke 0, akkor a csatorna nem kérhet megszakítást.

A parancs byte kiküldése után, ha a bit2=1, akkor az időállandót kell kiküldeni. Értéke 1-256-ig terjedhet, úgy, hogy a kiküldött 0 jelenti a 256-ot. Ha a csatornát már feltöltöttük időállandóval és a parancs byte-ban IT engedélyezést kívánunk módosítani, vagy aktív él beállítást végezni, akkor nem kell új időállandót kiküldeni. Bekapcsolás után a beállított funkció nem indul el, amíg nem küldünk időállandót a csatornának.
Ha valamely csatornáról engedélyezzük a megszakításkérést, akkor az IT vektort is fel kell tölteni. A CTC egy 5 bites IT vektort tárol, a 2-es és 1-es bithely tartalma a megszakítást kérő csatorna számából származik, a bit 0 pedig minden esetben 0. Az IT vektort a 0-ás csatornára való írással tudjuk a CTC-be írni, úgy, hogy a legutolsó bit értéke 0.
Kiküldéskor az egyes bitek jelentése a 1.6.4-3. ábrán látható.


1.6.4-3. ábra: IT vektor bitjeinek jelentése

A megszakítás után beküldött IT vektor bitek az 1.6.4-4. ábrán láthatók.


1.6.4-4. ábra: Módosított IT vektor jelentése

A CPU-nak természetesen a 2-es megszakításkérési állapotban kell lennie, és a daisy-chain-be is be kell kötni a megfelelő módon az áramkört. A csatornák közül a 0-ás a legmagasabb prioritású- A megszakításkérés menetéről bővebbet lásd a rendszer ismertetésénél (1.2.2. és 1.2.3. fejezet).

Programozási példa
A CTC programozására egy példát a 1.6.4-5. ábrán levő listán mutatunk be:


CTCCH3:
RENTRY:
WRITE:


EQU 5BH
DEFL 0
DEFL 0

; Futási időmérés CTC-vel
; CTC 3. csatornája
; visszatérés a rendszerbe
; kiíró rutin
; A CTC 3. csatornáján a legnagyobb
; periódusidőt állítja be.
CTCINI: ; a CTC alaphelyzetbe állítását végzi el
; betöltés után 20 Tc-t igényel
PUSH AF
LD A,27
OUT (CTCCH3),A
XOR A
OUT (CTCCH3),A
POP AF
RET





; 10
; 10
CTCIN: ; a CTC-ben lévő adatot olvassa be
; a beolvasás 22 Tc-t igényel
PUSH AF
IN A,(CTCCH3)
CALL WRITE
POP AF
RET
; 11
; 11
; mért adat kiírása
 
; tipikus hívás
  CALL CTCINI
;
; mérendő
; program
; utasításai
;
 
CALL CTCIN
JP RENTRY
; 17
; a kijelzett időnél 59 Tc-vel kevesebb a futási idő
END

A program alkalmas hosszabb programok futásidejének meghatározására. Az első rész az inicializálás, mely a CTC-t beállítja. Ez után kezd futni a mérendő program, majd lefutása után a záró rész olvassa ki a CTC-ből a mérési értékeket. A lista utolsó harmadában egy tipikus meghívást mutatunk be. A mérőprogram 59 T ciklus hosszú, ezt az eredményből le kell vonni.

1.6.5. A CTC idődiagramjai

Az áramkör idődiagramjait az 1.6.5-1. ábrán mutatjuk be.

1.6.5-1. ábra: a CTC idődiagramjai

Az ábrán levő számok jelentését az alábbi táblázatban adjuk meg. Az időértékek ns-ban szerepelnek.

szám értelmezés
Z-80 CTC
Z-80A CTC
Z-80B CTC
min
max
nin
max
min
max

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

16

17
18
19
20





21
22
23
24
25
26
27
28
29

órajel periódusidő
órajel logikai "1" szint
órajel logikai "0" szint
órajel lefutás
órajel felfutás
minden jelmegtartási idő
CS előkészületi idő
-CE előkészületi idő
-IORQ előkészületi idő
-RD előkészületi idő
adatkivitel késleltetése
adatbusz elengedési idő
adat előkészületi idő
-M1 előkészületi idő
IEO késleltetése -M1
       lefutásakor
adatkivitel késleltetése
     ITACK-nál
IEO késleltetése IEI lefutásakor
IEO késleltetése IEI felfutásakor
-INT késleltetése
-INT késleltetése CLK/TRG
     felfutásakor
     CLK/TRG előkészületi idő
                letelt
     CLK/TRG előkészületi idő
                nem telt le
CLK/TRG periódusidő
CLK/TRG felfutás
CLK/TRG lefutás
CLK/TRG logikai "0" szint
CLK/TRG logikai "1" szint
CLK/TRG előkészületi idő (száml.)
CLK/TRG előkészületi idő (időm.)
ZC/T0 felfutás késleltetése
ZC/T0 lefutás késleltetése

4000
2000
2000
30
30







60
210













2tc


200
200
300
210

400
170
170


0
250
200
250
240
240
230


300

340

190
220
tc+200


tc+230

2tc+530


50
50




260
190

4000
2000
2000
30
30







50
90













2tc


200
200
210
210

250
105
105


0
160
150
115
115
200
110


190

160

130
160
tc+140


tc+160

2tc+370


50
50




190
190

165
65



0
100
100
70
70


40
70













2tc


120
120
150


2000

20
20





130
90


130

110

100
110
tc+120


tc+130

2tc+280


40
40




140
140

1.7. Soros adatátviteli illesztő (SIO)

1.7.1. Általános ismertetés
A Z-80 család SIO áramköre soros adatátvitelre alkalmas. Két csatornán, különböző adatátviteli szabványnak megfelelő adatátvitelt képes megvalósítani, így aszinkron és szinkron adatátvitelt, ezen belül háromféle szinkronizálási üzemmódot ismer. Szinkron adatátvitel az SDLC (Synchronous Data Link Control) szabvány szerint is történhet, melyet az IBM cég vezetett be.
A SIO illeszkedik a Z-80 buszrendszerhez, illetve részt tud venni a daisy-chain IT rendszerben. Kimenetei TTL kompatibilisek. A SIO áramkör egy 40 kivezetéses DIL tokban van elhelyezve. Az áramkör adatátviteli sebessége 0-500 kbit/sec normál változatnál (2,5 MHz-es órajellel), 0-800 kbit/sec az "A" változatnál (4 MHz-es órajellel) és 0-1200 kbit/sec a "B" változat esetén (6 MHz-es órajellel).
A vevő adatregisztere négyszeresen bufferelt, az adóé kétszeresen, üzemmódjai: aszinkron és szinkron. Az egység tartalmaz CRC ellenőrző áramkört. Képes a szokásos modemjeleket fogadni és kiadni. A SIO-t használhatjuk az egyszerű soros adatátviteli egységek (pl. display) illesztésére, két gép közötti adatátvitelre, vagy soros adathordozó (pl. mágnesszalag) illesztésére.
A SIO blokkvázlata a 1.7.1-1. ábrán látható, egy csatorna blokkvázlata pedig a 1.7.1-2. ábrán.

1.7.1-1. ábra: SIO blokkvázlata
1.7.1-2. ábra: SIO csatorna blokkvázlata

A SIO csatorna blokkvázlata alapján látható, hogy az áramkör nem csupán egy egyszerű soros átviteli egység, hanem ennél sokkal többet tud. Ha az Intel alkatrészekkel akarjuk összehasonlítani, akkor az i8251A és az i8273 keverékének felel meg.
Az áramkör részletes bemutatását két részre bontjuk, az első rész a SIO és a CPU kapcsolata, a második a SIO és a környezet közötti adatátvitel. Ez utóbbi két fő üzemmódra bontható, az aszinkron és a szinkron üzemre. Az egyes SIO csatornák egymástól teljesen függetlenül programozhatók.

1.7.2. Az áramkör kivezetéseinek értelmezése
A SIO áramkört többféle kivezetés variációval gyártják, így létezik SI0/0; SI0/1; SI0/2 és SI0/9. Ez utóbbi csak egycsatornás adatátvitelre képes. A bekötések az 1.7.2-1., -2., -3. és -4. ábrákon láthatók az egyes változatoknak megfelelően. A 40 kivezetéses tokozás miatt nincs lehetőség minden modem vezérlő jelre, így a SI0/0 esetén a -TXCB és -RXCB együtt van kivezetve, azaz a "B" csatorna adó- és vevő része azonos órajellel üzemel. A SI0/1-nél a -DTRB jel, a SIO/2-nél a -SYNCB jel hiányzik. A SI0/9 esetében - mivel ez egycsatornás - a "B" csatorna hiányzik.


1.7.2-1. ábra: SIO/0 kivezetései


1.7.2-2. ábra: SIO/1 kivezetései


1.7.2-3. ábra: SIO/2 kivezetései


1.7.2-4. ábra: SIO/9 kivezetései

Rendszer órajel (SYSTEM CLOCK)
A Z-80 rendszer egyfázisú órajelét (nem TTL!)/ fogadó bemenet.
-CE Áramkör kiválasztás (CHIP ENABLE)
Az áramkör engedélyezésére szolgáló jel.
D/-A
Csatorna kiválasztás (CHANNEL SELECT)
A csatorna kiválasztásra szolgáló jel. Ha logikai "0", akkor az "A" csatorna, ha logikai "1" szintet kap, akkor a "B" csatorna működőképes. Célszerű az AO címbusz vezetékkel összekötni.
C/-D
Utasítás / adat kiválasztás (CONTROL/DATA SELECT)
A vezérlő információk és az adatinformációk szétválasztására szolgáló bemenet. Logikai "0" esetén az adatbuszon adatok, logikai "1" esetén utasítások, illetve állapot információk áramlanak. Célszerű az A1 címbusz vezetékkel összekötni.
D0-D7 Adatbusz (DATA BUS)
A Z-80 adatbusz csatlakozási pontjai.
IEI, IEO, -INT IT engedélyezés be / ki, IT kérelem (IT ENABLE IN / OUT, IT REQUEST)
A daisy-chain IT lánc megfelelő jelei. Ismertetésüket lásd 1.2.2.
-IORQ I/O hozzáférési igény (I/O REQUEST)
A Z-80 CPU -IORQ jelének fogadására szolgál.
-M1 Utasításkód olvasás (MACHINE CYCLE)
A Z-80 CPU -M1 jelének fogadására szolgál. Ha -M1 és -IORQ egyidőben aktív ez a megszakításkérés elfogadását jelzi az áramkörnek.
-RD Olvasás (READ)
A Z-80 CPU -RD jelének fogadására szolgál.
-RESET
Törlés (RESET)
Az áramkör alaphelyzetbe állítására szolgál. Hatására mindkét csatorna adatátvitele letiltódik (-TXDA és -TXDB marker jelet ad). A modemjelek inaktív állapotba kerülnek, mindennemű IT tiltva van és törlődnek a vezérlő regiszterek.
-TXCA, -TXCB
Adó órajel (TRANSMITTER CLOCK)
Az adók órajelét fogadja ezen a két bemeneten. Aszinkron üzem esetében az órajelet a belső osztó 1, 16, 32, illetve 64-es osztásaránnyal osztja le. Az osztásarány az adó és a vevő órajelnél azonos. A bemeneteken Schmitt trigger van. Az órajel előállításához legcélszerűbben á CTC-t lehet felhasználni. Ez az órajel-bemenet TTL szintű. Adatátvitel az órajel lefutó élére történik.
-TXDA, -TXDB Adatkimenet (TRANSMIT DATA)
Az egyes csatornák adatkimenete.
-RXCA, -RXCB
Vevő órajel (RECEIVER CLOCK)
Az órajelet az előosztó aszinkron üzemmódban 1, 16, 32 és 64-es arányban osztja le az adó órajelének előosztójával megegyező módon. A bemeneteken Schmitt trigger van. A SI0/0 változat esetén az -RXCB a -TXCB-vel megegyezik, nincs külön kivezetve. Az órajelek előállítására a Z-80 CTC-t használhatjuk fel előnyösen. Ezek az órajelek TTL kompatibilisek. Az órajel felfutó élének hatására történik az adat mintavételezése.
-RXDA, RXDB Adatbemenet (RECEIVE DATA)
Soros adatbemenet.
-CTSA, -CTSB
Adás engedélyezés (CLEAR TO SEND)
Schmitt triggerrel kialakított bemenet. "Automatikus engedélyezés" üzemmód esetén a jel az adót engedélyezi. Ellenkező esetben általános célú bemenet, mely megszakítást kér bármely irányú megváltozása esetén.
-DCDA, -DCDB
Adat érkezik (DATA CARRIER DETECT)
Schmitt triggerrel kialakított bemenet. "Automatikus engedélyezés" üzemmódban a vevő engedélyezését kéri. Egyébként általános célú bemenet. Bármelyik irányú logikai szint változáskor megszakítást kér a SIO a CPU-tól.
-DTRA, -DTRB
Adatvégállomás üzemkész (DATA TERMINAL READY)
Kimenet. Programvezérelhető (WR5/7), így általános célú kimenetként is felhasználható. A SI0/1 változata esetében a -DTRB nincs kivezetve.
-RTSA, -RTSB
Adás kérelem (REQUEST TO SEND)
Kimenet. Szinkron üzemmód esetén az RTS bitet követi (WR5/7). Aszinkron üzemmódban, ha az RTS bit értéke logikai "1" a kimenet logikai "0"-ba billen. Ha az RTS bit értéke logikai "0", akkor az RTS csak az adó üres állapota esetén billen logikai "1"-be.
-SYNCA, -SYNCB
Szinkronizálás (SYNCHRONIZATION)
A kivezetés funkciója az üzemmódok függvényében más és más, lehet bemenet és lehet kimenet. Aszinkron üzemmód esetén bemenet és a SYNC/HUNT bitet vezérli (RRO/4). Ekkor más funkciója nincs, általános célú, lekérdezhető bemenet.
Külső szinkron üzemmód esetén szintén bemenet, melyet logikai "0"-ba kell vezérelni az -RXC második felfutó élével együtt, amikor a vett jel a szinkron karakter utolsó bitje. A szinkron minta utáni egyéb szavak esetében a külső logikának gondoskodnia kell arról, hogy két teljes órajel ciklus után váljék aktívvá a -SYNC jel. Amikor a -SYNC jel aktívvá válik, azt addig kell logikai "0"-ban tartani, míg a CPU a külső szinkronizáló logikának nem jelzi, hogy az adatot elvette, vagy egy új üzenet nem következik. A karakter feldolgozás az -RXC felfutó élének hatására kezdődik, ha a -SYNC jel aktívvá válik.
Belső szinkronizációs üzemmódban (MONOSYNC és BISYNC) ez a kivezetés kimenet és az -RXC ciklusban akkor aktív, amikor szinkron karaktert érzékelt a logika. A SYNC kimenet nem bufferelt, így csak a szinkron jelsorozat felismerésének idejéig aktív a kimenet. A SIO/2 változat esetében a -SYNCB nincs kivezetve.
-W/RDYA, -W/RDYB
Várakozás / kész (WAIT / READY)
A kimenet programozható -WAIT-ként és READY-ként (WR1/5,6,7) attól függően, hogy a CPU-hoz szinkronizáljuk a SI0-t, vagy DMA-hoz a READY jellel.

1.7.3. Az illesztő és a központi egység kapcsolata
A Z-80 SIO áramkört a tervezők úgy alakították ki, hogy ne csak a Z-80 CPU-val tudjon együttműködni, hanem más CPU-khoz is alkalmazható legyen. Ezt a nem vektoros megszakításkérési lehetőség teszi lehetővé, mivel azt a Z-80-on kívül más mikroprocesszor nem alkalmazza ilyen formában. Az i8080-as CPU-hoz való illesztését a 1.7.3-1. ábrán mutatjuk be.


1.7.3-1. ábra SIO illesztése i8080-hoz

Az eddigieken túlmenően a SI0-t lekérdezéses üzemmódban is lehet használni, ami (idővesztés árán) egy esetleges IT vezérlő megépítését teszi feleslegessé. A SIO a Z-80 CPU-val, illetve Z-80 DMA-val egyaránt alkalmas blokkos adatátvitelre, mely pl. a regiszterek feltöltését is egyszerűsíti.

A. Lekérdezéses üzemmód
A CPU le tudja kérdezni mindkét csatorna állapotregiszterét és ennek alapján a SIO állapotáról egyértelmű információt kaphatunk. (Pl. adásra kész, CRC hiba stb.) Az állapot ismeretében a CPU eldöntheti, hogy ír a SIO-ba, olvassa a beérkezett adatot, parancsot ad, vagy vár egy állapot bekövetkezésére. Az adatátvitelre vonatkozó információk az RRO-ban találhatók (RRO/0 és 2.). Ezen két bit kiértékelése után eldönthető, hogy kiírási művelet következzen-e, vagy beolvasás. Az adatátvitel során felmerülő hibák egy másik regiszterből olvashatók ki (RR1/4-7). Ebben az üzemmódban a megszakításkérést tiltani kell a SIO-ban (WR l/l és 3-4).

B. Megszakításkéréses üzemmód
A SIO igen előnyösen alkalmazható gyors vektoros megszakításkérési rendszerben. A "B" csatorna tárolja az IT vektort (WR2; RD2), mely visszaolvasható. Ha a SI0-t "IT vektor módosítás" üzemmódba állítjuk (WR1/2), akkor az IT vektort a megszakítást kérőknek megfelelően módosítja, azaz 8 különböző IT vektort tud adni a SIO. Ezzel a technológiával nem szükséges a SIO állapotát lekérdezni az IT rutin elején, hanem az rögtön a megfelelő kiszolgálást végző IT rutint tudja aktivizálni. Természetesen a megszakításkérést engedélyezni kell (WR1/1-4).
A megszakításkérési okok a SI0-n belül prioritási sorba vannak állítva: Nagyobb prioritású az "A" csatorna, ezen belül legnagyobb prioritása a vevőnek van, majd az adó következik és végül a külső jelek, illetve a belső állapotváltozás okozta megszakításkérés. A "B" csatorna megszakításkérői hasonlóan vannak felfűzve.
Az egyes megszakításkérők a SIO-n belül a daisy-chain elv szerint vannak rendezve. Így az ott leírtak a SIO megszakításkérési rendszerére is vonatkoznak. Előfordulhat, hogy a SIO egység által kért megszakítást a SIO egység egy másik, magasabb prioritású megszakításkérése megszakítja. A SIO belső daisy-chain-jét az 1.7.3-2. ábra mutatja.


1.7.3-2. ábra: IT prioritás a SIO-n belül

Az egyes megszakításkérők ismertetése: (összefoglalásuk a 1.7.3-3. ábrán látható):

1.7.3-3. ábra: megszakításkérők a SIO-ban

Vevő IT

Kétféle üzemmódot kérhetünk a SIO-tól:

Blokkátvitel esetén célszerű csak az első karakternél megszakítást kérni. Minden vett karakternél érkező megszakításkérés esetén kérhetjük a SIO-tól, hogy az IT vektort paritáshiba esetén módosítsa. Ezzel a kezelés jelentősen egyszerűsödik.

Adó IT

Az adó akkor kér megszakítást, (abban az esetben, ha a megszakításkérés engedélyezett (WR1/1), ha az adó buffere kiürült. Ezután rögtön küldheti a CPU a SIO-nak az újabb adatot.

Külső jelek / Állapot IT

A külső jelek (-SYNC, -CTS és -DCD) állapotváltozása (mindkét irányú) okozhat megszakítást, ha a megszakításkérés engedélyezett. Az így figyelt jelek okozta megszakítások hatására lehet különböző reakciókat indítani, így pl. karakter adását, illetve vételét, de ettől eltérően egyedi célra is felhasználhatjuk, mint pl. ellenállomás-hibát jelez, vagy speciális üzenetet kér. A belső állapotjelek is kérhetnek megszakítást. Ezek: paritáshiba, vevő túlcsordulási hiba, CRC hiba, "break" érzékelés (aszinkron üzemmódban), illetve "abort" szekvencia érzékelése (SDLC üzemmód esetén). Így a hibák felismerése a programban igen gyorsan megtörténhet és azonnal megtehető az intézkedés pl. ismétléskérés. A "break" illetve az "abort" érzékelésével adott megszakítás hatására a program az üzenet végét egyszerűen tudja figyelni és felkészülhet a következő üzenet adására, illetve vételére.

A megszakításkéréssel kapcsolatosan a SIO és a CPU között a megszakításkérés jelzésekor (-INT), annak elfogadásakor, illetve a megszakítást kiszolgáló rutin befejeztekor történik adatátvitel. A rendszer ismertetésben leírtaknak megfelelően történik a SIO esetében is a SIO-CPU adatátvitel. Ez a kijelentés igaz a SIO írására és olvasására is. A SIO a Z-80-as rendszerben való alkalmazásakor célszerű perifériaként bekötni az -IORQ jellel, valamint a daisy-chain-be az IEI és IEO jellel. Ez azonban nem feltétlenül szükséges (mint pl. a PIO esetében), mert a SI0 a belső daisy-chain-jét nemcsak a buszon érkező RETI-vel tudja vezérelni, hanem parancsként is adhatunk a SIO-nak RETI-t (WR0/3-5). Z-80 CPU esetében célszerűbb az automatikus RETI használata, ennek a lehetőségnek a nem Z-80-as alkalmazása esetén van jelentősége. (Más módon nem lehetne a belső daisy-chain-t vezérelni, illetve külső logikával kellene a buszra RETI-t generálni. Ha nem érkezik egy megszakítás végrehajtása után RETI a SI0-ba, akkor újabb megszakításkérést nem tud adni, kivéve, ha az magasabb szintű megszakításkérés) . Lásd pl. az i8080 illesztést (1.7.3-1. ábra). Ekkor a megszakítás hatására nem történik sem ITACK, sem később RETI. A megszakításkérés megérkezésekor a megszakítás vektort vagy a megfelelő belső regisztereket lehet lekérdezni, majd a RETI parancs alkalmazásával állítható vissza a SIO daisy-chain-je.

1.7.4. Az illesztő egység és a környezet kapcsolata
A SIO két csatornája egymástól függetlenül programozható aszinkron és szinkron üzemre. Ez utóbbi esetében pedig az alábbi üzemmódok lehetségesek: monoszinkron, biszinkron, külső szinkron és SDLC/HDLC/CCITT-X.25 adatátvitel.
Az egyes üzemmódokban érvényes adatátviteleket összefoglalva az 1.7.4-1. ábrán láthatjuk.


1.7.4-1. ábra: SIO adatátviteli formátumai

A. ASZINKRON üzemmód

Az aszinkron üzemmód adatátvitelének jelformája a 1.7.4-2. ábrán látható.


1.7.4-2. ábra: aszinkron adatátvitel

ADÁS üzemmódban, ha nincs kiadandó karakter, a kimenet (TXD) magas szinten van, ez az úgynevezett marker jel. Ezt a jelet karakter átvitel hiányában csak a SIO törlése, illetve a "break" kiküldésére adott utasítás (WR5/4) szakítja meg.
Karakter kivitelhez legelőször is az szükséges, hogy a CPU a SI0-nak adjon karaktert. Ezen kívül az adást engedélyezni kell (WR5/3). Amennyiben "Automatikus engedélyezés" üzemmódot állítottunk be (WR3/5), akkor a -CTS bemenet is vezérli az adó bemenetét, azaz logikai "0"-ba kell billennie az adás engedélyezéséhez.
Ha az adathossznál 5 bit/karaktert állítottunk be, a felső biteknek (5-7) 0-nak kell lenniük a SI0-nak küldött adatokban, egyébként 5 bitnél kevesebbet ad ki a SIO (lásd WR5 programozása).
Az adás mindig a start bit kiküldésével kezdődik, majd ezt követik az adatbitek, melyek száma 1 és 8 között programozható (WR5/5,6). Az adatbitek után a paritásbit következik, ha a paritásbit kiadását engedélyeztük (WR4/0), mely páros és páratlan paritásra állítható be (WR4/1). Az adat- vagy paritásbit után a stop bit következik, melynek hossza állítható egy, másfél és két bit hosszúságúra (WR4/2,3). Ha az adó bufferben (kétszeresen bufferelt adó) nincs újabb adat, akkor marker jelet ad a SIO a következő karakter kiadásáig, de ha a bufferben van adat, az rögtön adja a start bitet és a következő karaktert. A buffer kiürülését egy lekérdezhető bit jelzi (RR02), illetve engedélyezése esetén (WR1/1) megszakítást kér. Ha ez előtt adunk ki karaktert a SIO-nak, az az utolsó karakter felülírását eredményezi.

VÉTEL esetén a vétel-engedélyező bitnek logikai "1"-ben lell lennie (WR3/0), valamint, ha "Automatikus engedélyezés" üzemmódot állítottunk be (WR3/5), akkor a -DCD bemenetnek aktívnak kell lennie a vétel megkezdéséhez.
Az RXD bemenet logikai "0" szintre váltása jelenti a vevő számára a start bitet, feltéve, ha ez legalább fél bit ideig tart. Így elkerülhető, hogy a vonalon érkező rövid zavarimpulzusok is elindítsák a vételt. Az adatok bevételezése mindig a bit idő közepén vett minta alapján indul meg. Így a felfutási és időzítési zavarok hatása csökkenthető. Abban az esetben, ha nem kérjük az órajel osztását (X1 osztás), akkor biztosítanunk kell a karakterek pontos szinkronizálását, illetve a start bit pontos kiadását.
A vevő négyszeresen bufferelt, hogy az adat vételekor adódó torlódások ne okozzanak túlcsordulást. Ha ennek ellenére túlcsordulás fordul elő, akkor azt egy lekérdezhető bit jelzi (RRl/5), illetve megszakítást kér a csatorna. A hibabitek szintén négyszeresen buffereltek és a karakterrel egyidőben jelentkeznek. A vevő túlcsordulás és paritás hibabitek nem törlődnek a hibatörlő utasítás kiadása nélkül (WR0/3-5). Célszerű tehát a túlcsordulás és a paritáshiba után kiadni a hibatörlő utasítást. Lekérdező üzemmódban egy újabb túlcsordulást nem is tudunk észrevenni. A hibabitek az éppen a bufferben levő karakterre vonatkoznak, így a karakter kiolvasása előtt kell ellenőrizni őket, mert a karakter kiolvasása után a következő adathiba bitjeit olvashatjuk az RR1-ben, ha a következő adat beolvasása már megtörtént. Ha nincs új adat, akkor a hibabitek az előző adat hibabitjeit tartalmazzák, kivéve, ha közben egy hibatörlő utasítást adunk ki. Egy új karakter érkezését "Érvényes vett karakter van" bit jelzi (RR0/0).

B. SZINKRON üzemmód

Szinkron üzemmódok esetén mind az adó, mind a vevő leosztatlanul (X1 osztásarány) kéri az órajelet. Az RXD mintavételezése az -RXC felfutó élével történik, a TXD változásai a -TXC órajel lefutó élével szinkronban történnek. Így két SIO összekapcsolásakor, ha közös órajellel üzemelnek (-TXC = -RXC) szükségtelen az órajelek invertálása.
Szinkron adatátvitelnél az üzemmód beállításánál kezdjük a csatorna programozását (WR4/2-5) és csak ezután töltjük be a szinkron mintát (WR6, WR7), mert ezek értelmezése az egyes üzemmódokban eltérő. A monoszinkron, a biszinkron és a külső szinkron üzemmódok épp a szinkronizálás módjában térnek el egymástól (lásd 1.7.4-1. ábra). A monoszinkron üzemmódban egy szinkron byte van, amely az adatátvitelt bevezeti (WR7). A biszinkron üzemmódban (IBM Bisync) a szinkronizáló minta két-byte-os (WR6, WR7), és az adatátvitel csak mindkét szinkron byte-nak a mintával való megegyezése esetén indul. A monoszinkron és biszinkron üzemmódban a SYNC kimenet is csak akkor aktív, amikor a szinkron figyelő azonosítani tudja a szinkron karakter(eke)t a mintával.

VÉTELK0R a vevő figyelő állapotban van, és a vétel engedélyezésekor (WR3/0) azonnal elkezdődik a figyelés. "Automatikus engedélyezés" üzemmódban a -DCD-nek is aktívnak kell lennie, egyébként a figyelő üzemmódba állítást egy utasítás (WR3/4) végzi.
Külső szinkronizálás esetén a -SYNC bemeneten jelezzük az adatátvitel kezdetét. Az adat mintavételezése a -SYNC aktívvá válása utáni első felfutó élre kezdődik. A -SYNC bemenetnek legalább három órajel cikluson keresztül aktívnak kell lennie.
Az adatátvitelt a törlés állapot szünteti meg, (21-es bemenetre adott logikai "0" vagy a CPU által adott törlés parancs (WR0/3-5)), vagy a figyelő módba való belépésre adott parancs (WR3/4).
Szinkronizálás után a monoszinkron, a biszinkron és a külső szinkron adatátvitel megegyezik, így azokat együtt tárgyaljuk. Az SDLC üzemmód ettől eltér, így azt külön részletezzük.

ADÁS törlés után, illetve az adás tiltása esetén a marker jel jelenik meg a TXD kimeneten. "Break" parancs hatására a marker jel megszűnik. A "break" az adatátvitel megszakítását jelzi. Ha az üzemmód be van állítva és az adás engedélyezett, az üzemmódnak megfelelő szinkronizálással indul az adás. Az adó CRC generátorát egy utasítással törölni kell, azaz 0-ra állítani (WR0/6,7). Amíg a CPU a karaktereket adja, addig folyik az adatok átvitele. Ha a CPU nem ad új adatot, a SIO kiadja a CRC karaktereket, akkor, ha a CRC engedélyezett (WR5/0) és kiadja a szinkron karakter(eke)t. Ha a SIO a CRC karaktert adja ki akkor az "adó buffer üres" bit foglaltat jelez és a CRC/SYNC adását jelző bit logikai "1" állapotba kerül. Ha a megszakításkérés engedélyezett, a SIO IT-t kér a CPU-tól. Ha a CRC tiltva van és a CPU nem ad új karaktert, a SIO automatikusan kiadja a szinkron karakter(eke)t és az első szinkron karakter adása után megszakítást kér a CPU-tól (ha engedélyezett az IT kérés). Ha a CRC/SYNC adását jelző bit logikai "1" állapotban van, a SI0 nem adja ki a CRC-t, hanem szinkron karaktereket küld ki.
Ha a CRC kiadását engedélyezni akarjuk és már adtunk ki adatot, akkor a CRC/SYNC adását jelző bitet törölnünk kell (WR0/6,7).
Amennyiben adás közben letiltjuk az adást (WR5/3), akkor az éppen folyamatban levő adat vagy szinkron karakter kiadása szabályosan megy végbe, majd a CRC és szinkron karakter helyett a marker jelet adja ki a csatorna. Ha CRC adása közben érkezik a tiltás, a CRC szabályos kiadása nem történik meg.
Az adatok adása során a legkisebb helyértékű bit kiadására kerül sor legelőször, majd ezt követik az egyre magasabb értékű bitek. Az adatok hossza 1 és 8 bit között programozható. (Lásd WR5 programozása).

VÉTELK0R legelőször az üzemmódot kell beállítani, majd a szinkron mintát kell betölteni (a külső szinkronizációs üzemmódot kivéve). A vevő a figyelő üzemmódba kerül és a szinkron karakter(ek) azonosítása után, illetve külső szinkron esetében a -SYNC bemenet hatására kezdi az adatokat venni.
Az adatok érkezését a "van érvényes vett karakter" figyelésével (RRO/0), vagy megszakítás hatására észleli a program. Ha a központi egység időbeni terhelése megengedi, hogy a beérkező adatok fogadását várja, lehet csupán az első karakter beérkezésekor megszakítást kérni, és utána blokkos I/0 utasítással olvassa be a CPU a karaktereket. Ekkor a -WAIT segítségével szinkronizálható a CPU és a SIO. Hasonlóan lehet eljárni DMA átvitel esetén is, azaz az első vett karakter érkezésekor a CPU indítja a DMA-t. A SIO és a DMA a READY segítségével szinkronizálható. Hiba esetén a CPU megszakításkérést kap és a blokkos beolvasást befejezheti.
A CRC ellenőrző áramkör beállítása független az üzemmódtól, így lehet CRC-16-ot (x^16+x^15+x^2+1) vagy SDLC-t /x^16+x^12+x5+1/ beállítani (WR5/2). A CRC az ellenőrző törlést követően 0-ra áll (WR0/6,7). A CRC ellenőrzést bármikor lehet tiltani vagy engedélyezni (WR3/3). A CRC ellenőrzés nem megy végbe a karakter beérkezésével egyidőben, hanem két karakter érkezéssel eltolva, így a tiltás a tiltás előtt beérkezett utolsó karaktertől érvényes, vagyis az -RXC bemeneten a CRC jel beérkezése után még legalább 16 órajel ciklusnak kell érkeznie.

SDLC ADÁSK0R a CRC generátort alaphelyzetbe kell állítani (WR0/6,7), ha a CRC jelet kiadta a csatorna. Ekkor a CRC generátor csupa 1-gyessel töltődik.
Ha az adás nincs engedélyezve, akkor a TXD kimeneten marker jel jelenik meg, ha pedig engedélyezett az adás, akkor megkezdődik a jelzőbit sorozat adása 01111110 01111110 011...
Ha "abort" üzenet kiküldését kérjük a csatornától, akkor 9-13 db 1-gyes bitet küld ki a TXD vonalon, majd következik a jelzőbit sorozat. A jelző-byte-ot cím-byte követi (WR6). Adatként 1-8 bites karaktereket lehet küldeni. A karakter számot menet közben is lehet változtatni.
Ha a vevő maradék kódjával (residue code) együttesen alkalmazzuk ezt a technológiát, akkor az üzenet adatait egzakt módon tudjuk visszaalakítani, és nem szükséges kiegészítő információ adása.
A karakterhossz változtatás az éppen adásban levő karaktert nem befolyásolja, az átállítás csak az azután érkező karakterekre érvényes.
A korábban tárgyalt szinkron adatátviteli üzemunódhoz hasonlóan történik a CRC kiadása vagy a jelzőkarakter sorozat beszúrása a szövegbe.
Az üzenet adatbitjei közé a SIO automatikusan 0-ás biteket szúr be, ha az adatban öt egyes következik egymás után.
A CRC generátor használata a korábbiakban elmondottakkal megegyezik, azzal a kikötéssel, hogy CRC kódként az SDZC CRC-t kell beállítanunk.

SDLC VÉTELKOR a vétel (ha engedélyezve van (WR3/0, illetve "Automatikus engedélyezés" állapotban a -DCD bemenet is aktív) az első nem jelző-byte-tal kezdődik. Ha címfigyelő módban programoztuk a csatornát (WR3/2), akkor az első adat címként értelmezett, így annak vagy a beprogramozott címmel (WR6) kell megegyeznie, vagy általános címnek kell lennie (11111111).
A vevő az adatok között érkező jelző-byte-okat elnyomja és ugyanígy törli az adó által beszúrt 0 biteket.
Ha hétnél több l-est érzékel a vevő, ezt "abort"-ként értékeli és "break/abort" bitet hoz létre (RR0/7), valamint IT engedélyezése esetén megszakítást kér. A külső állapot IT törlése után (WR0/3-5) a csatorma egy újabb megszakítást kér, amint a csupa 1-es állapot megszűnik ("abort" vége). Az "abort" a "break"-hoz hasonlóan az adatátvitel megszakítását jelzi.
Ha az adatok beolvasása blokk utasítással, vagy DMA-n keresztül történik, csak az első karakter érkezésekor kérünk megszakítást. Ha nem ismerjük az üzenet hosszát, az üzenet végét az "üzenet vége" megszakításkérés jelzi.
A CRC ellenőrző automatikusan működik. Az üzenet vétele után a CRC hibabit jelzi a hibás vagy helyes adatátvitelt. A karakterhossz menet közben beállítható. Célszerű a cím és vezérlő byte-ot 8 bitesre választani, és vételük után azonnal átállítani a vevőt a kívánt bit/karakter értékre.
Ha nem az automatikus címfelismeréssel dolgozunk, mert pl. hosszabb a cím, mint 1 byte, akkor a CPU értékeli ki a címet. Hibás cím esetén az üzenet vétele felesleges, ezt a "figyelő" állapotba való állítással érhetjük el (WR3/4), így csak a következő jelzőbit sorozat észlelésekor történik vétel.
Ha az üzenetet záró jelzőbit sorozatot észleli az áramkör és a megszakításkérés engedélyezett, a csatorna megszakítást kér. Ezután a maradék kódban adja az üzenetben érvénytelen biteket, amennyiben az üzenet bitszámában nincs meg maradék nélkül a karakter/bit szám (RRl/1,2,3)
A karakterek paritásvizsgálata csak 8 bitnél rövidebb karaktereknél történhet, mivel az adó és a vevő paritásellenőrzése SDLC üzemben nem működik.

1.7.5. Programozás
A SIO csatornái 8 "írható" és 3 "olvasható" regisztert tartalmaznak. Ebből a 2-es regiszter csak a "B" csatornánál értelmezett. Az írható regiszterek elérése parancs üzemmódban úgy történik, hogy első alkalommal mindig a WRO-t lehet elérni, és ennek alsó 3 bithelyén lehet címezni a következő írható regisztert. Így egy adott regiszter eléréséhez két byte kiküldése szükséges.

Csak írható regiszter olyan regiszter, amelybe az adatokat csak beírni lehet programutasítással, kiolvasni nem. A regiszterbe beírt adatot kiolvasni csak a hardware környezet tudja.
Csak olvasható regiszter olyan regiszter, amelybe adatot beírni csak a környező hardware-rel lehet, programutasítással az adatokat csak kiolvasni lehet.
Mindkét regiszter a hardware és a software közötti interface-ként szolgál.
Olvasáskor a WRO regiszterben beállított mutató (pointer) által címzett regiszter olvasható. A beállított regiszter többször is kiolvasható.


1.7.5-1. ábra: SIO írható regiszterei


1.7.5-2. ábra: SIO olvasható regiszterei

Az egyes regiszterek funkciói:

WR0 - regiszter pointer, speciális vezérlő funkciók, CRC inicializálás
WR1 - adatátviteli mód beállítás, IT vezérlés
WR2 - IT vektor (csak B csatornánál)
WR3 - vevő vezérlés
WR4 - osztásarány, szinkronizálási mód és paritás beállítás, stop bit definiálás
WR5 - adó vezérlés
WR6 - SYNC minta alsó byte-ja , illetve SDLC címbeállítás
WR7 - SYNC minta felső byte-ja, illetve SDLC jelző-byte beállítás
WR8 - buffer-, IT- és külső-állapotjelzők
RR1 - hibajelzések, maradék kód
RR2 - módosított IT vektor (csak a B csatornáról)

Az egyes regiszterek részletes ismertetése:

A. írható regiszterek (WR)

 
WR0:
7
6
5
4
3
2
1
0
 
CRC1
CRC0
CMD2
CMD1
CMD0
PNT2
PNT1
PNT0
PNT0,1,2 Címzi az egyes regisztereket. Binárisan értelmezett a regiszterek száma.
CMD0,1,2 Az egyes speciális funkciók kérése. Binárisan értelmezett a funkciók száma.
CMD0 Üres parancs. Ezt akkor célszerű használni, ha csupán a pointert akarjuk beállítani.
CMD1 "Abort" jelsorozat kiküldése SDLC üzemmód esetén.
CMD2 A külső jelek által előidézett megszakításkérés az RR0-ban beállítja a megfelelő biteket. Ez a parancs töröl és engedélyezi az újabb megszakítást.
CMD3
Csatorna törlés. Hasonlít a külső törlésre, de csak egy csatornára hatásos. A parancs kiadása utáni 4 órajel ciklus alatt történik meg a csatorna törlése, azaz az összes regiszter törlése, az adás és vétel leállítása és a TXD-n a marker jel kiadása.
CMD4
Ezzel a paranccsal az első vett karakter által létrehozott megszakításkérést az üzenet végén újra engedélyezni kell. Természetesen ez csak abban az üzemmódban szükséges, amikor csak az első vett karakter után kéri a CPU a megszakítást a SIO-tól.
CMD5
Ez a parancs felfüggeszti az adó megszakításkérését, így akkor célszerű alkalmazni, amikor már nem akarunk több adatot adni. A következő kiadott karakter tiltja az adó megszakításkérését.
CMD6
A CMD6 parancs a hibakódokat törli. A paritás és a vevő túlcsordulás hibajelet ezzel a paranccsal törlik.
CMD7 RETI. Ha a SI0-t nem Z-80-as CPU-val használjuk, ez a parancs helyettesíti a RETI utasítást. Csak az "A" csatornára érvényes.
CRC0,1 A CRC logika vezérlésére szolgál.
CRC0 nincs hatása (mint a CMD0)
CRC1 Törli a vevő CRC ellenőrző logikáját.
CRC2 Törli az adó CRC generátorát.
CRC3 Törli a CRC/SYNC adását jelző bitet.

 

WR1  
WR1/0
Külső megszakításkérés engedélyezése. Engedélyezi a -DCD, -CTS, SYNC/HUNT vonalak megváltozása esetén, "break" érzékelése esetén, illetve a -CRC/-SYNC karakter adása esetén a megszakításkérést.
WR1/1 Adó megszakításkérés engedélyezése.
WR1/2 IT vektor módosítás engedélyezése. Ha engedélyezve van, akkor a különböző megszakításkérési okok módosítják az IT vektort az alábbiak szerint:
V3 V2 V1 CS ok
0 0 0 B adó üres
0 0 1 B külső állapotváltozás
0 1 0 B van vett karakter
0 1 1 B hiba
1 0 0 A adó üres
1 0 1 A külső állapotváltozás
1 1 0 A van vett karakter
1 1 1 A hiba
WR1/3 Vevő megszakításkérés beállítás.
D4 D3  
0 0 megszakításkésés tiltva
0 1 megszakításkérés csak az első vett karakternél
1 0

megszakításkérés minden karakternél, IT vektor módosítással

1 1 megszakításkérés minden karakternél, IT vektor állandó
WR1/5
W/R kivezetés beállítása: ha engedélyezett és a bithely értéke 1, akkor a vevő vezérli (aktív, ha a vevő üres); ha a bit értéke 0, akkor az adó vezérli (aktív, ha az adó buffer foglalt).
WR1/6
>W/R kivezetés funkciójának beállítása. Ha a bithely értéke 1, akkor a kivezetés READY-ként értelmezett (DMA); ha a bithely értéke 0, akkor a kivezetés WAIT-ként értelmezett (CPU). A READY aktív állapotában logikai "1" szintet ad és az órajel felfutó élének hatására változik. A WAIT nyitott kollektoros, az órajel lefutó élére változik.
WR1/7
W/R kivezetés engedélyezése. Ha a bit értéke 1, akkor engedélyezett, ha a bit értéke 0, akkor a kivezetés tiltott, azaz READY esetben logikai "1", WAIT esetben szakadást mutat a kivezetés.

 

WR2 A "B" csatornánál ez a regiszter tárolja az IT vektort.

 

WR3  
WR3/0 Vevő engedélyezése. Ha a bit értéke 1, akkor a vevő engedélyezett.
WR3/1
SYNC karakter bufferba töltése tiltott, ha a bit értéke 1. Ha a bit értéke 0, akkor az üzenet közben érkező SYNC karakterek is bekerülnek a bufferba.
WR3/2
Címfigyelő üzemmád beállítása. Ha SDLC üzemmód programozott és ennek a bitnek az értéke 1, akkor a SIO figyeli az üzenetben érkező címet és az adatok vétele csak abban az esetben indul meg, ha a cím megfelel a beállítottnak, vagy általános hívás érkezett (0FFH).
WR3/3 Vevő CRC ellenőrzés engedélyezett, ha a bit értéke 1.
WR3/4
Ha a bithely értéke 1, akkor a vevő figyelő üzemmódba lép, a folyamatban levő vétel megszakad. Ezzel a felesleges üzenetek vételét úgy lehet törölni, hogy a következő érvényes üzenetnél a vevő azonnal vételkész.
WR3/5 Ha bithely értéke 1, akkor az automatikus engedélyezés üzemmódot állítjuk be, azaz a -DCD bemenet engedélyezi a vevőt, a -CTS bemenet pedig az adót.
WR3/6,7 Vett karakter bitszámának beállítása:
D6 D7 bit / karakter
0 0 5
0 1 6
1 0 7
1 1 8

 

WR4  
WR4/0 Ha a bithely értéke 1, akkor a paritásbit kiadása engedélyezett és a vevő várja a paritásbitet.
WR4/1 Paritás beállítása. Ha a bithely értéke 1, akkor a paritás páros, ha a bithely értéke 0, akkor páratlan.
WR4/2,3 Üzemmód és stop bithossz beállítás:
D3 D2  
0 0

Szinkron üzemmód
Aszinkron üzemmód:

0 1 1 stop bit
1 0 1,5 stop bit
1 1 2 stop bit

A vevő mindig 1 stop bitet vár.

WR4/4,5 Ha a szinkron üzemet állítottuk be, a szinkronizálás
módját az alábbiak szerint definiálhatjuk:
D5 D4 szinkronizálás módja
0 0 monoszinkron (8 bites)
0 1 1 biszinkron (16 bites)
1 0 SDLC (07EH)
1 1 külső (SYNC)
WR4/6,7 órajel osztásarányának beállítása:
D6 D7 osztásarány
0 0 1
0 1 16
1 0 32
1 1 64

Az adatfrekvenciánál 4,5-ször nagyobbnak kell lennie az órajel frekvenciájának minden esetben. Az osztásarány az adóra és a vevőre egyaránt vonatkozik.

 

WR5  
WR5,0 Az adó CRC generátorának engedélyezése:
  • ha a bit=1, akkor az adó bufferébe kerülő karakterek részt vesznek a CRC generálásában, valamint, ha az adó buffere kiürül, a CRC automatikusan kiadásra kerül,
  • ha a bit=0, akkor az adó befferébe kerülő karaktereket a CRC generátor nem veszi figyelembe, a CRC értékét az adó kiürülésekor nem küldi ki a SIO, csupán a szinkron karaktereket adja ki.
WR5,1 RTS vezérlése:
  • ha a bit=1, az RTS aktív (0)
  • ha a bit=0, akkor a vevő kiürülése után válik inaktívvá az RTS.
WR5,2 CRC polinom kiválasztása:
  • ha a bit=1, akkor a CRC 16 polinom alapján (x^16+x^15+x^2+1) számol a CRC logika
  • ha a bit=0, akkor az SDLC polinom alapján (x^16+x3^12+x3^5+1) számítja ki a CRC-t a logika.
WR5,3 Adó engedélyezése:
  • ha a bit=1, az adás engedélyezett
  • ha a bit=0, az adás letiltott, a csatorna TXD kimenetén marker jel jelenik meg. Ha adás közben váltunk tiltásra, az éppen adásban levő karakter - ha az adat, vagy szinkron karakter kiadásra kerül, és ezt követi a marker jel. Ha tiltáskor a CRC karakter volt adásban, annak kiadása nem garantált.
WR5,4
"Break" kiküldése. Amíg a bithely értéke 1, addig a TXD kimenet inaktív, logikai "0" állapotba megy, függetlenül attól, hogy adás volt-e folyamatban, vagy sem.
WR5,5,6 Adásra kerülő karakter bitszámának megadása:
D6 D5 bit/ch
0 0 5, vagy kevesebb
0 1 7
1 0 6
1 1 8

Ha az "5 bit vagy kevesebb" állapotot programoztuk, a bitek számát a csatornának küldött adat magasabb helyi értékű bitjei határozzák meg az alábbi módon:

D7
D6
D5
D4
D3
D2
D1
D0
bit/ch
1
1
1
1
0
1
1
1
0
0
1
1
0
0
0
1
0
0
0
D4
0
0
0
D3
D3
0
0
D2
D2
D2
0
D0
D1
D1
D1
D0
D0
D0
D0
D0
1
2
3
4
5
WR5,7 A DTR vezérlése:
  • ha a bit=1, a DTR aktív (0)
  • ha a bit=0, a DTR inaktív (1)

 

WR6
Szinkron minta alsó byte-ja / SDLC cím.
A regiszter biszinkron üzemmódban a legelőször kiküldött szinkron byte-ot tartalmazza. SDLC üzemmód esetén az azonosító címet tartalmazza ez a regiszter. Külső szinkron üzemmódnál az adó bufferének üressé válása esetén ezt a byte-ot adja ki a SIO.

 

WR7
Szinkron minta felső byteja / SDLC jelző-byte.
A regiszter a monoszinkron mintát tartalmazza, vagy biszinkron üzemben a másodikként kiküldött byte-ot. SDLC üzemmódnál a regisztert az SDLC jelző-byte-tal kell feltölteni (01111110=07EH).

B. Beolvasható állapot regiszterek

RR0  
RR0/0 Van érvényes vett karakter, ha a bit=1.
RR0/1 Megszakításkérési ok van. Az "A" csatornánál jelzi a megszakításkérést a bit beállítása. A "B" csatornánál, ez a bit mindig 0.
RR0/2 Az adó buffere kiürült, ha ez a bit logikai "1", kivéve azt az esetet, amikor szinkron üzemben a CRC kód adása történik.
RR0/3 DCD kivezetés jelzője:
  • ha a bit=1, a DCD aktív (0)
  • ha a bit=0, a DCD inaktív (1)
RR0/4
SYNC / figyelés
Külső szinkron és aszinkron üzemmódban a SYNC bemenet inverzét adja (mint DCD-nél). Egyéb üzemmód esetén a figyelő állapot állítja be a bitet, és a szinkronizálás megtörténte törli.
RR0/5 CTS kivezetés jelzője:
  • ha a bit=1, a CTS aktív (0)
  • ha a bit=0, a CTS inaktív (1)
RR0/6
CRC / SYNC kiküldése megtörtént.
Az adó kiürülésekor, ha a CRC engedélyezett, a csatorna automatikusan kiküldi a CRC-t és a szinkron karakter(eke)t. Ennek a bitnek a beállítása jelzi, hogy a kiküldés megkezdődött.
Ha az RRO/2 bit 0, akkor a CRC kiküldése folyamatban van. Ha logikai "1" értékű, akkor az jelzi, hogy az adó buffere üres és a szinkron karakter kiküldése folyamatban van-e.
RR0/7 "Break" / "Abort"
Aszinkron üzem esetén logikai "1", ami jelzi, hogy a vevő "break"-ot észlelt. Ha a megszakításkérést töröljük, (WR0/3-5) a bit törlődik. SDLC üzemmód esetén az "abort" állapotot jelzi ez a bit.

 

RR1  
RR1/0 Aszinkron üzemben minden bit kiadása megtörtént. Szinkron üzem esetén a bit mindig 1.
RR1/1-3 Maradék (residue) kód.
Ez a három bit jelzi az információs mező hosszát az SDLC üzemmódban, ha az nem a karakterhossz egész számú többszöröse. Az "üzenet vége" bit beállítása után érvényes ez a kód.
8 bit/karakter esetén az alábbi táblázat érvényes:
 
az információs mező érvényes bitjei:
D3

D2
D1
1
0
1
0
1
0
1
0
0
1
1
0
0
1
1
0
0
0
0
1
1
1
1
0
az utolsó
byte-ban
0
0
0
0
0
0
1
2
az utolsó előtti
byte-ban
3
4
5
6
7
8
8
8

Más karakterhosszak esetén a táblázat a fentihez hasonlóan megalkotható. Ha nincs maradék, a bitek értéke 1 0 1.

RR1/4 Paritáshiba
A bit beállítódik, ha az engedélyezett paritásfigyelés hibát észlel. A bitet csak a hibatörlő utasítással lehet törölni (WR0/3-5)
RR1/5 Vevő túlcsordulás.
A bit beállítódik, ha a vevő buffere megtelt és újabb karakter érkezik. Törölni csak a hibatörlő paranccsal lehet (WR0/3-5).
RR1/6 CRC / üzenethiba.
Aszinkron üzem esetén, ha üzenethibát észlel a vevő beállítja ezt a bitet. Szinkron üzem esetén a bit a CRC hiba esetén logikai "1".
RR1/7 Üzenet vége (END OF FRAME)
SDLC üzemmód esetén az üzenet végét jelzi. Ha a bit értéke 1, akkor a CRC bit és a maradék kód tartalma érvényes.

 

RR2 Az IT vektort tartalmazza a regiszter. Ha IT vektor módosítás engedélyezett és történt módosítás, akkor a módosított IT vektor olvasható be.

A SIO beállítására adunk példát az 1.7.5-3. ábrán látható programrészletekkel.

SIOAD:
SIOBD:
SIOAC:
SIOBC:
ADOURES:
VETTKAR:

EQU 70H
EQU 71H
EQU 72H
EQU 74H
DEFS 1
DEFS

; SIO A adat byte
; SIO B adat byte
; SIO A parancs byte
; SIO B parancs byte
; jezi, hogy az adó kiürült
; a vett karaktert tartalmazza
ITVECT: DEFW ADOIT
DEFW ERROR
DEFW VEVOIT
DEFW ERROR
ADOIT: PUSH AF
XOR A
LD (ADOURES),A
  LD A,00101000B ; adó IT törlés
ITVEG:

OUT (SIOBC),A
POP AF
EI
RETI

VEVOIT: PUSH AF
IN A,(SIOBD)
AND 7FH
LD (VETTKAR),A
LD A,00100000B



; vevő IT törlés
ERROR: PUSH AF
LD A,00110000B
JR ITVEG
; hibaüzenet
; hibatörlés
SIOINI: ; Beállítja a B csatornát aszinkron átvitelre
PUSH AF
PUSH BC
PUSH HL
LD HL,SIOTBL
LD BC,(SIOTVG-SIOTBL)*100H+SIOBC
OTIR
XOR A
LD (ADOURES),A
DEC A
LD (VETTKAR),A
POP HL
POP BC
POP AF
RET
KARKI:

AVAR:
; karaktereket visz ki
PUSH AF
LD A,(ADOURES)
AND A
JR NZ,AVAR
POP AF
LD (ADOURES),A
OUT (SIOBD),A
RET
KARBE:


VVAR:
; karaktert vesz be
PUSH HL
LD HL,VETTKAR
LD A,(HL)
JP M,VVAR
SET 7,(HL)
POP HL
RET
SIOTBL: DEFB 00000010B
DEFB ITVECT
DEFB 00000100B
DEFB 01000111B

DEFB 00000101B
DEFB 00101010B
DEFB 00000011B
DEFB 01100001B


DEFB 00000001B
DEFB 00010111B

; pointer beállítása a 2. regiszterre

; pointer beállítása a 4. regiszterre
; 16-szoros órajel, aszinkron üzem
; 1 stop bittel, páros paritás
; pointer beállítása az 5. regiszterre
; 7 bit / karakter, adó eng., rts=1
; pointer beállítása a 3. regiszterre
; 7 bit / karakter, aut. eng.
; vevő engedélyezése
; pointer beállítása az 1. regiszterre
; IT minden karakternél, paritás
; módosítsa az IT vektort
; adó IT engedélyezés,
; külső IT engedélyezés

SIOTVG:
END
 

1.7.6. A SIO idődiagramjai

Végül az áramkör idődiagramjait adjuk meg két ábrán. Az első (1.7-1) a SIO és a CPU közötti jelátviteleket tartalmazza, a második a SIO és a környezet közötti információcsere idődiagramja (1.7-2).

1.7-1. ábra: SIO idődiagramja I.

Az ábrán lévő számok jelentése (a táblázat időadatai ns-ben értendők):

szám értelmezés
Z-80 SIO
Z-80A SIO
Z-80B SIO
min
max
nin
max
min
max

1
2
3
4
5
6

7
8
9
10
11
12
13
14
15
16
17
18

19
20

órajel ciklusideje
órajel logikai "1" állapota
órajel felfutása
órajel lefutása
órajel logikai "0" állapota
kiválasztó jelek
     előkészületi ideje
vezérlő jelek előkészületi ideje
adat késleltetés idő
adat előkészületi idő
adatbusz elengedés
adat késleltetési idő ITACK-nál
-M1 előkészületi idő
IEI előkészületi idő ITACK-nál
IEO késleltetése -M1-től
IEO késleltetése RETI-nél
IEO késleltetése IEI-től
-INT késleltetési idő
-W/RDY késleltetése
     -CE, -IORQ-tól
-W/RDY késleltetési idő (RDY)
-W/RDY elengedési idő (WAIT)

400
170


170
160

240

50


210
200
300

4000
2000
30
30
2000



240

230
340



150
150
200
300

120
150

250
105


105
145

115

50


90
140
190

4000
2000
30
30
2000



220

110
160



100
100
200
210

120
130

165
70


70
60

60

30


75
120
160
4000
2000
15
15
2000



150

90
100



70
70
150
175

100
110

1.7-2. ábra: SIO idődiagramja II.

A táblázatban a "p" órajel periódust, a "~" végtelen hosszú időt jelent.

szám értelmezés
Z-80 SIO
Z-80A SIO
Z-80B SIO
min
max
nin
max
min
max

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18

impulzus logikai "1" szint
impulzus logikai "0" szint
-TXC periódusidő
-TXC logikai "0" szint
-TXC logikai "1" szint
TXD késleltetése ( * 1 üzem)
-W/RDY késleltetése (READY üzem)
-INT késleltetése
-RXC periódusidő
-RXC logikai "0" szint
-RXC logikai "1" szint
-RXC előkészületi idő
-RXD megtartási idő
-W/RDY késleltetése (READY üzem)
-INT késleltetése
-INT késleltetése
-SYNC késleltetése
-RXC előkészületi idő

200
200
400
180
180

5p
5p
400
180
180
0
140
10p
10p
5p
4p
-100



~
~
~
400
9p
9p
~
~
~


13p
13p
9p
7p
200
200
400
180
180

5p
5p
400
180
180
0
140
10p
10p
5p
4p
-100


~
~
~
300
9p
9p
~
~
~


13p
13p
9p
7p
200
200
330
100
100

5p
5p
330
100
100
0
100
10p
10p
5p
4p
-100


~
~
~
220
9p
9p
~
~
~


13p
13p
9p
7p

* Az adatátviteli frekvencia minden üzemmódban maximálisan a rendszer órajel frekvenciájának az ötöde lehet!

1.8. Aszinkron adatátviteli egység (DART)
A Z-80 SIO áramkör egyszerűsített változata. Az egyszerűsítés abból áll, hogy a soros átvitel üzemmódjai közül csak az aszinkron üzemmódra képes. A két áramkör csatornáit (1.7.1-2. ábra és 1.8-1. ábra) összehasonlítva rögtön előtűnilt a különbség.

1.8-1. ábra: DART csatorna blokkvázlata

A kivezetések funkciói majdnem megfelelnek a Z-80 SIO kivezetések funkcióinak, az eltérés az alábbi:

RIA RIB

Adatátviteli lánc üzemképes (SYNC helyett) (RING INDICATOR)
A kivezetésen lévő logikai szint megváltozása IT-t generál a CTS és DCD kivezetésekhez hasonlóan. (A SYNC kivezetés funkciója aszinkron üzemben hasonló, azaz csak az elnevezés változott.)


1.8-2. ábra: DART kivezetései

A DART áramkör minden funkciója megegyezik a CPU-DART kapcsolatban a CPU-SIO kapcsolattal, így ezt itt nem ismertetjük. A környezet-DART kapcsolatnál a SIO-nál leírtak aszinkron része a DART-ra vonatkoztatható.
A regiszterek száma csökkent a DART-nál a SIO-hoz képest a szinkron üzemmód elmaradásával, és a megmaradt regiszterekben és egyes bitek, illetve bitkombinációk értelmüket vesztették. A DART-ban csak 6 irható regiszter van, (WR0-WR5) az olvasható regiszterek száma változatlan (RR0-RR2). A regiszterek alapértelmezése is megegyezik a SIO regisztereinek értelmezéseivel, azaz az egyes bithelyek, illetve bitkombinációk jelentése is megegyezik, kivéve a szinkron üzem elmaradásával értelmüket vesztett biteket. Az egyes bitek jelentését felesleges újra ismertetni, az a SIO ismertetésénél fellelhető. A regisztereket összefoglaló ábrából (1.8-3. ábra) kiderül, hogy mely bitek vesztették értelmüket.

A fentiekből kiderül, hogy a SIO helyett a DART áramkör alkalmazható, ha csupán az aszinkron üzemmódot kívánjuk használni, és csak azt programoztuk. Ha rendszerünkben DART található, az teljes egészében helyettesíthető a SIO-val.

1.8.1. A DART idődiagramjai
Végül az áramkör idődiagramjait adjuk meg két ábrán. Az első (1.8-4.) a DART és a CPU közötti jelátviteleket tartalmazza, a második a DART és a környezet közötti információcsere idődiagramja (1-8-5.).

1.8-4. ábra: A DART idődiagramjai I.

Az ábrán lévő számok jelentése (a táblázat időadatai ms-ban értendők):

szám értelmezés
Z-80 DART
Z-80A DART
Z-80B DART
min
max
nin
max
min
max

1
2
3
4
5
6

7
8
9
10
11
12
13
14
15
16
17
18

19
20

órajel ciklusideje
órajel logikai "1" állapota
órajel felfutása
órajel lefutása
órajel logikai "0" állapota
kiválasztó jelek
     előkészületi ideje
vezérlő jelek előkészületi ideje
adat késleltetés idő
adat előkészületi idő
adatbusz elengedés
adat késleltetési idő ITACK-nál
-M1 előkészületi idő
IEI előkészületi idő ITACK-nál
IEO késleltetése -M1-től
IEO késleltetése RETI-nél
IEO késleltetése IEI-től
-INT késleltetési idő
-W/RDY késleltetése
     -CE, -IORQ-tól
-W/RDY késleltetési idő (RDY)
-W/RDY elengedési idő (WAIT)

400
170


170
160

240

50


210
200
300

4000
2000
30
30
2000



240

230
340



150
150
200
300

120
150

250
105


105
145

115

50


90
140
190

4000
2000
30
30
2000



220

110
160



100
100
200
210

120
130

165
70


70
60

60

30


75
120
160

4000
2000
15
15
2000



150

90
100



70
70
150
175

100
110

1.8-5. ábra: A DART idődiagramjai

A táblázatban a "p" órajel periódust, a "~" végtelen hosszú időt jelent.

szám értelmezés
Z-80 SIO
Z-80A SIO
Z-80B SIO
min
max
nin
max
min
max

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

impulzus logikai "1" szint
impulzus logikai "0" szint
-TXC periódusidő
-TXC logikai "0" szint
-TXC logikai "1" szint
TXD késleltetése ( * 1 üzem)
-W/RDY késleltetése (READY üzem)
-INT késleltetése
-RXC periódusidő
-RXC logikai "0" szint
-RXC logikai "1" szint
-RXC előkészületi idő
-RXD megtartási idő
-W/RDY késleltetése (READY üzem)
-INT késleltetése

200
200
400
180
180

5p
5p
400
180
180
0
140
10p
10p



~
~
~
400
9p
9p
~
~
~


13p
13p

200
200
400
180
180

5p
5p
400
180
180
0
140
10p
10p



~
~
~
300
9p
9p
~
~
~


13p
13p

200
200
330
100
100

5p
5p
330
100
100
0
100
10p
10p



~
~
~
220
9p
9p
~
~
~


13p
13p

* Az adatátviteli frekvencia minden üzemmódban maximálisan a rendszer órajel frekvenciájának az ötöde lehet!

1.9. Közvetlen memória-hozzáférést biztosító egység (DMA)

1.9.1. Általános ismertetés
A Z-80 család DMA (Direct Memory Access Controller) egysége a CPU-tól független, memória és I/O hozzáférést tesz lehetővé. A Zilog cég DMA egységét az Intel cég DMA egységével nehéz összehasonlítani, mert merőben más koncepciójú. Az Intel DMA vezérlő a memória és négy periféria között tud CPU-tól független adatáramlást biztosítani. Így ez az eszköz négycsatornás. A Z-80 DMA vezérlő nem csak I/O egységek és memóriák közötti adatforgalmat biztosít, hanem tetszőleges két végpont közti adatátvitelt. Igaz, hogy egyszerre csak két funkcionális egység közötti adatforgalom vezérlésére képes, azaz egycsatornásként fogható fel, ennek ellenére állítható, hogy sokkal intelligensebb, mint az i8257 DMA vezérlő, mivel az I/O egység nem kötött, így egymás után több I/O között is jöhet létre adatforgalom. A Z-80 DMA memória és memória között, valamint I/O és I/O között is tud adatforgalmat lebonyolítani, erre az i8257 nem képes. Nem szükséges címtároló a Z-80 DMA vezérlőhöz, mint ahogy az i8257 esetén egy i8212-es áramkört kell beépíteni.

A Z-80 DMA egység az átvitelt önmagán keresztül biztosítja, azaz az egyik végponttól veszi az adatot, majd a következő ciklusban a másik végpont felé továbbítja. Tulajdonképpen ebben rejlik a két DMA között a koncepcióbeli eltérés, mivel az Intel DMA a két végpontot egyidőben vezérli, azaz összeköti őket. (ld. 1.9.1-0. ábra)


1.9.1-0. ábra: DMA üzemmódjai

Több Z-80 DMA egység felfűzése igen egyszerűen valósítható meg a buszkérés daisy-chain-jével (-BAI, -BAO). Ez az i8257 esetében külön logikát igényel.
A Z-80 DMA képes az adatátvitel mellett - de anélkül is az adatok figyelésére, és az előre adott mintával megegyező adat esetén megszakítást tud kérni.
A DMA egység funkciói:

az alábbi végpontok között:

és főbb szolgáltatása:


1.9.1-1. ábra: DMA blokkdiagramja

Az 1.9.1-1. ábrán látható a Z-80 DMA blokkdiagramja. Az eszköz belső felépítése az alábbi elemekből áll:

1.9.2. Az áramkör kivezetéseinek értelmezése
Az áramkör kivezetéseit az 1.9.2-1. ábrán mutatjuk be.


1.9.2-1. ábra: DMA kivezetései

A0-A15 Címbusz (ADDRESS BUS)
A memória és az I/O címzésére szolgál, megegyezik a CPU címbuszával.
D0-D7 Adatbusz (DATA BUS)
A CPU és a DMA közötti információcsere zajlik az adatbuszon, illetve az egyes végpontok közötti adatátvitel.
Rendszer órajel (CLOCK)
Z-80 típusú (nem TTL) egyfázisú órajel bemenete.
-M1 Utasításkód olvasás (M1 CYCLE)
Megfelel a Z-80 -M1 jelének.
-IORQ I/O hozzáférési igény (I/0 REQUEST)
A DMA egység periféria elérési műveletet kíván végezni.
-MREQ Memória hozzáférési igény (MEMORY REQUEST)
A DMA egység memória hozzáférési műveletet kíván végezni.
-RD Olvasás (READ)
Jelzi, hogy olvasás történik.
-WR Írás (WRITE)
Jelzi, hogy írás történik.
-CE/-WAIT
Áramkör kiválasztás / várakozás (CHIP ENBLE / WAIT)
Ha a -BAI inaktív, akkor a DMA és a CPU közötti forgalom engedélyezett. Ha a -BAI aktív, akkor a DMA ciklus WAIT jeleként értelmezett, azaz a végpont jelzi, hogy az adatátvitel még nem történt meg.
-BUSRQ Buszkérés (BUS REQUEST)
A DMA jelzi a CPU felé, hogy a cím-, adat-és vezérlőbusz felügyeletét kéri a CPU-tól.
-BAI Buszkérés elfogadva - bemenet (BUS ACKNOWLEDGE IN)
Jelzi a DMA áramkörnek, hogy átveheti a busz vezérlését.
-BAO Buszkérés elfogadva - kimenet (BUS ACKNOWLEDGE OUT)
Buszkérés daisy-chain csatlakoztatására.
-INT Megszakításkérés (INTERRUPT)
A DMA megszakításkérési igényét jelzi a CPU felé, illetve a perifériák felé, hogy egy, az impulzus regiszterben adott hosszúságú blokk átvitele megtörtént.
IEI, IEO IT engedély be / ki (IT ENABLE IN, IT ENABLE OUT)
Megszakításkérés daisy-chainbe való illesztésre.
RDY Kész (READY)
A periféria illesztő jelzi a DMA-nak, hogy az adatátvitel megtörtént, )illetve ha még nincs kész adat: WAIT).

1.9.3. A közvetlen hozzáférés adatátviteli folyamatai
A DMA és a CPU közötti információcsere I/O utasításokkal történik. A DMA megszakításkérést küldhet a CPU felé, ami a daisy-chain ismertetésénél adott módon történik. A DLA egység által vezérelt két végpont közötti információcsere az előzőknél bonyolultabb. A végpont lehet memória és lehet I/O egység. A DMA-nak így különböző buszvezérlési módokat kell alkalmaznia:
A lehetséges átvitelek:

Ezen kívül lehet csak keresést kérni, így lehetséges:

Ha a végpont memória:
Miután a DMA a CPU által is használt memória közvetlen elérését biztosítja, a CPU memória elérési technológiájához hasonló memóriaciklust valósítottak meg a tervezők.
A memória-hozzáférés 3 gépi ciklusból (3 T) áll, melynek középső (T2) ciklusát lehet a -WAIT jellel megnyújtani. A memóriából olvasott adatot a következő olvasásig a DMA tárolja, így oldható meg memóriából memóriába való átvitel.

Ha a végpont I/0 egység:
Az I/0 hozzáférési ciklus a CPU I/0 ciklusához hasonló, itt is megtaláljuk az automatikusan beszúrt várakozó ciklust, melyet a -WAIT jellel lehet megnyújtani. A memória-hozzáféréshez hasonlóan itt is tárolja a DMA a beolvasott adatot.

A fent vázolt hozzáférési ciklusoktól el lehet térni a DMA időzítő regiszterének programozásával (WR1,2). A ciklushossz 1-től 4 T ciklusig állítható. Ezen felül az egység vezérlő jelek befejezési ideje is módosítható 1/2 T ciklussal. Amennyiben 4 T ciklus is kevés, akkor a -WAIT jelet kell igénybe venni, amely memória elérés esetén a T 2 ciklust nyújtja, I/O elérés esetén a T 3-as ciklust (1.9.3-1. ábra).


1.9.3-1. ábra: DMA ciklusok módosítása

A hozzáférések idődiagramjai közül két igen gyakran használtat mutatunk be, ezekből a többi igen egyszerűen származtatható. Az 1.9.3-2. ábrán látható a memória és az I/O közötti átvitel, az 1.9.3-3. ábrán ennek az ellentétes iránya az I/0 és a memória közötti átvitel látható


1.9.3-2. ábra: Memória és I/O közötti átvitel


1.9.3-3. ábra: I/O és memória közötti átvitel

A végpontok átviteli lehetőségeinek figyelembevételével a DMA különböző átviteli üzemmódokba állítható: byte-onkénti, csomagonkénti és folyamatos adatátvitel


1.9.3-4. ábra: Buszkérés és elfogadása


1.9.3-5. ábra: Buszkérés byte-onkénti átvitelnél


1.9.3-6. ábra: Csomagonkénti átvitel megszakítása


1.9.3-7. ábra: Csomagonkénti és folyamatos átvitel kereséssel


1.9.3-8. ábra: Csomagonkénti és folyamatos átvitel befejezése

1.9.4. Programozás
A DMA egység funkciójából következően képes a rendszerbusz vezérlésére. Bekapcsoláskor az egység tiltott állapotba kerül, nehogy programozása előtt a rendszer helyes üzemelését megzavarja egy esetleges nem kívánt DMA akcióval. Akkor is tiltott állapotba kerül a DMA, ha programozzuk, paranccsal törlési állapotba hozzuk, vagy valamely részegységnek adunk törlő parancsot. Az egység engedélyezése paranccsal történik (WR3/6).
Az egyes regiszterek funkciói:

Olvasható regiszterek:

RR0 - állapotregiszter
RR1 - byte számláló (alsó byte)
RR2 - byte számláló (felső byte)
RR3 - "A" port címszámláló (alsó byte)
RR4 - "A" port címszámláló (felső byte)
RR5 - "B" port címszámláló (alsó byte)
RR6 - "B" port címszámláló (felső byte)

Írható regiszter csoportok (zárójelben a csoportban levő regiszterek száma):

WR0(5) - üzemnőd és irány
- "A" port kezdőcím
- blokkhossz
WR1(2) - port "A" definíciók
WR2(2) - port "B" definíciók
WR3(3) - maszk és minta
WR4(6) - port "B" kezdőcím
- IT vektor
- átviteli mód
WR5(1) - READY és -CE definiálása
WR6(2) - parancsok
- kiolvasási maszk


1.9.4-1. ábra: DMA írható regiszterei


1.9.4-2. ábra: DMA olvasható regiszterei

Az olvasható regiszterek részletes ismertetése:

RR0 a DMA állapotára utaló információkat tartalmaz
RR0/0 ha a bit=1, akkor DMA művelet van
RR0/1 ha a bit=0, akkor a READY aktív
RR0/2 nem definiált
RR0/3 ha a bit=0, akkor megszakítás érkezett
RR0/4 ha a bit=0, akkor a mintával megegyezőt talált
RR0/5 ha a bit=0, akkor a blokk átvitele befejeződött
RR0/6,7 nem definiált

A többi olvasható regiszter párba rendezett, a páratlan számúak tartalmazzák az alsó byte-ot, a páros számúak a felső byte-ot:

RR1, RR2 Az átviendő blokk byte számlálója érhető el a két regiszter beolvasásával.
RR3, RR4 Az "A" port címszámlálóját tartalmazza a regiszterpár.
RR5, RR6 A "B" port címszámlálóját lehet visszaolvasni.

Az olvasható regiszterek kiolvasása nem közvetlen címzéssel történik, hanem egymás után sorban az RR0-tól az RR6-ig.
Az olvasó számlálót alaphelyzetbe kell állítani bekapcsolás után. Erre két parancs szolgál, mindkettő a WR6 írásával adható meg:

Ha nem akarjuk az összes regisztert olvasni, akkor az olvasási maszk beállításával (WR6-ra B8 írása, majd kiadandó az olvasási maszk) lehetőség van egyes regiszterek olvasásának tiltására, illetve engedélyezésére. A regiszterek számának megfelelő bit "1"-esbe állításával a regiszter olvasása engedélyezett. A maszkregiszter módosítása a maszkregiszter felülírása után adott "olvasási számláló alaphelyzetbe állítása" paranccsal (WR6:=A7) érvényesíthető.

Az írható regiszterek részletes ismertetése:

WR0  
WR0/0,1 Az üzemmód beállítására két bit szolgál:
D1 D0  
0 0 nem megengedett (WR1 kiválasztása)
0 1 átvitel
1 0 keresés
1 1 átvitel és keresés
WR0/2 Az átvitel irányának meghatározására szolgál: ha a bit=0, akkor a "B" portról visz adatot az "A" port felé,
ha a bit=1, akkor az "A" portról veszi be az adatot és továbbítja a "B" port felé.

A további bitek jelzik, hogy a WR0 programozását követő byte-ok mely regiszterbe kerüljenek. Ha a bit=1, akkor a DMA a következő byte-ot a jelzett regiszterbe tölti. Ha több regisztert választunk ki, ennek megfelelően több byte-ot kell küldenünk a WR0-ba való írás után, a byte-ok sorrendje az azokat engedélyező bitek növekvő sorrendjével egyezik meg:

WR0/3 Az "A" port kezdőcímének alsó byte-ja.
WR0/4 Az "A" port kezdőcímének felső byte-ja.
WR0/5 Az átviendő blokk hosszának alsó byte-ja.
WR0/6 Az átviendő blokk hosszának felső byte-ja.
WR0/7 Mindig = 0.

 

WR1  
WR1/0 = 0
WR1/1 = 0
WR1/2 = 1
WR1/3
  • ha a bit=0, akkor az "A" port memóriát kezel,
  • ha a bit=1, akkor az "A" port I/O-t kezel
WR1/4,5
D5 D4  
0 0 Az "A" portcím csökkenő
0 1 Az "A" portcím növekvő
1 0 Az "A" portcím állandó
1 1 Az "A" portcím állandó
WR1/6 ha a bit értéke 1, az időzítést programozó byte követi a WR1 írását.
WR1/7 = 0

Az időzítést programozó byte jelentése:

0,1
D1 D0 Ciklushossz
0 0 4
0 1 3
1 0 2
1 1 nem használt kombináció
2 -IORQ vezérlő jel 1/2 gépi ciklussal rövidebb
3 -MREQ vezérlő jel 1/2 gépi ciklussal rövidebb
4 = 0
5 = 0
6 -RD vezérlő jel 1/2 gépi ciklussal rövidebb
7 -WD vezérlő jel 1/2 gépi ciklussal rövidebb

 

WR2  
WR2/0 = 0
WR2/1 = 0
WR2/2 = 0
WR2/3
  • ha a bit=0, akkor az "B" port memóriát kezel,
  • ha a bit=1, akkor az "B" port I/O-t kezel
WR2/4,5
D5 D4  
0 0

Az "B" portcím csökkenő

0 1

Az "B" portcím növekvő

1 0

Az "B" portcím állandó

1 1

Az "B" portcím állandó

WR1/6 ha a bit értéke 1, az időzítést programozó byte követi a WR2 írását.
WR1/7 = 0

Az időzítést programozó byte jelentése:
Az alsó két bit a ciklus hosszát állítja be:

0,1
D1 D0 Ciklushossz
0 0 4
0 1 3
1 0 2
1 1 nem használt kombináció
2 -IORQ vezérlő jel 1/2 gépi ciklussal rövidebb
3 -MREQ vezérlő jel 1/2 gépi ciklussal rövidebb
4 = 0
5 = 0
6 -RD vezérlő jel 1/2 gépi ciklussal rövidebb
7 -WD vezérlő jel 1/2 gépi ciklussal rövidebb

 

WR3  
WR3/0 = 0
WR3/1 = 0
WR3/2 ha a bit=1, akkor a mintával megegyező byte észlelése esetén az átvitel és/vagy a keresés megszakad.
WR3/3
ha a bit=1, akkor maszk byte követi a wr3 programozását. A maszk byte-ban levő 0 tartalmú bitek jelzik azokat a bit helyi értékeket, melyeket a DMA-nak figyelnie kell.
WR3/4 ha a bit=1, akkor a programozásban a figyelt minta kiadása következik.
WR3/5 ha a bit=1, akkor a megszakításkérés engedélyezett.
WR3/6 ha a bit=1, akkor a DMA üzeme engedélyezett.
WR3/7 = 1

 

WR4  
WR4/0 = 1
WR4/1 = 0

A következő három bit jelzi, hogy a WR4 írását követően olyan byte érkezik, melyet a megadott regiszterbe kell betölteni. A sorrend a bitek növekvő sorrendjével megegyezik.

WR4/2 "B" port kezdőcím, alsó byte
WR4/3 "B" port kezdőcím, felső byte
WR4/4 Megszakításkérést vezérlő byte

A következő két bit az átvitel módját állítja be:

WR4/5,7
D5 D6  
0 0 byte-onkénti
0 1 folyamatos
1 0 csomagonként
1 1 nem definiált
WR3/7 = 1

A megszakítást vezérlő byte bitjeinek jelentése:

0 ha a bit=1, és, ha talál a mintával megegyező byte-ot, kérjen megszakítást
1 ha a bit=1, akkor a blokk végén kérjen megszakítást
2 ha a bit=1, akkor adjon jelzést a periféria illesztő számára
3
ha a bit=1, akkor az impulzus regiszter töltése következik a megszakítást vezérlő byte írása után. Az impulzus regiszterben adhatjuk meg, hogy hány átvitt byte után adjon az -INT kivezetésen jelzést a periféria illesztőnek
4 ha a bit=1, az IT vektor írása következik
5 ha a bit=1, akkor az IT vektort a DMA állapota módosítja. A módosítás a 2,1 bithelyeket érinti:
D2 D1  
0 0 RDY miatt kért megszakítást
0 1 mintával való megegyezés miatt kért megszakítást
1 0 blokkvég miatti megszakításkérés
1 1 minta egyezés és blokkvég együttesen a megszakításkérési ok
6 ha a bit=1, az RDY kivezetés változása esetén megszakítást kér
7 = 0

 

WR5  
WR5/0 = 0
WR5/1 = 1
WR5/2 = 0
WR5/3 az RDY kivezetés aktív szintjét állítja be, ha a bit=0, akkor az aktív szint a logikai "0" (-RDY) ha a bit=1, akkor az aktív szint a logikai "1" (RDY).
WR5/4
  • ha a bit=0, akkor a -CE kivezetés csak az áramkör kiválasztását jelenti,
  • ha a bit=1, akkor a kivezetés felváltva jelent -CE-t és -WAIT-ot.
WR5/5
  • ha a bit=0, akkor a DMA művelet a blokk átvitele után befejeződik,
  • ha a bit=1, akkor a blokk végén a DMA automatikusan újratölti a kezdő értékeket és újbóli DMA műveletet kezd (auto restart).
WR5/6 = 0
WR5/7 = 1

 

WR6  
WR6/0 = 1
WR6/1 = 1
WR5
2, 3, 4, 5, 6
A 2, 3, 4, 5, 6 bithelyeken megadható 32 kombináció közül az alábbiakban ismertetésre kerülő 16 az egyes DMA parancsokat jelenti. (A többi nem definiált.) Az alábbiakban a WR6 regiszter teljes tartalmával (hexadecimális) adjuk meg az egyes bitkombinációkat.
C3 A megszakításkérést vezérlő áramkör alapállapotba hozása:
  • megszakításkérés tiltás
  • buszkérés tiltás
  • belső RDY törlése
  • -CE/-WAIT tiltása (csak -CE)
  • automatikus újratöltés tiltása.
C7 Az "A" port időzítését a Z-80 időzítésnek megfelelően állítja be.
CB A "B" port időzítését a Z-80 időzítésnek megfelelően állítja be.
CF
Mindkét port kezdőcímét betölti, törli a blokkhossz számlálót. A parancs kiadása előtt a kezdőcím értékét a kezdőcím regiszterbe be kell tölteni (WR0, illetve WR4). A parancs csak a forrásport kezdőcímét tudja fix címűre tölteni, így ha a fogadó port esetében fix címet akarunk beállítani, először azt kell forrásként meghatározni egy betöltő utasítás előtt, majd a másik portot forrásnak kell átalakítani és egy újabb betöltő utasítást kell adnunk (lásd programozási példa).
D3 Törli a blokkhossz számlálót, a cím értéke nem változik.
AB Megszakításkérés engedélyezése.
AF Megszakításkérés tiltása.
A3 Törli a megszakításkérő áramkört és tiltja a megszakításkérést (paranccsal adott RETI) és a belső RDY állapotot törli.
87 DMA művelet engedélyezése.
83 DMA művelet tiltása.
A7
Az olvasó számláló alaphelyzetbe állítása. A beolvasási maszkregisztert érvényesíti, az olvasó számlálót a legelső olvasásra engedélyezett regiszterre állítja.
BF Az olvasó számlálót beállítja az állapot regiszterre.
B3
A belső RDY állapotát függetleníti az RDY kivezetéstől. (Ez a parancs byte-onkénti átvitel esetén nem alkalmazható, de memória-memória folyamatos átvitel esetén, amikor nincs szükség RDY jelzésre, jól használható.)
8B Törli a "blokk vég" és a "minta volt" állapot biteket (RR0/5, RR0/4).
B7 DMA művelet engedélyezése RETI után. Az utasítást egy DMA engedélyező utasításnak kell követnie.
BB WR6 írása után az olvasási maszkregisztert írjuk, melynél a bit helyértékek megegyeznek az olvasható regiszterek számjelével. Ahova egyest írunk be, az a regiszter olvasható lesz a kiolvasási sorban.

Az alábbiakban a DMA programozására mutatunk be két példát. Az első esetben az "A" port felől a 'B" port felé történik az adat csomagonkénti DMA átvitele. A példában látható a DMA szükségszerű "becsapása", mivel a "B" végpont periféria illesztő és címe fix, valamint a DMA a fogadó. Az "A" port memóriacíme eggyel növekszik minden átvitel után

ACIM:
BCIM:
BLOKKH:
DMACOM:

DMAINI:

EQU 4500
0BDH
2047
60H

LD HL,DMATBL
LD C,DMACOM
LD B,DMATVG-DMATBL
OTIR
RET

; átvivendő blokk kezdőcíme
; fogadó portcím
; 2048 byte átvitelét programozzuk
; DMA parancs-byte

DMATBL: DEFB 01111001B
  ; B -> A átvitel, blokkhossz, port A cím következik
; a B -> programozás a "becsapás" miatt kell
  DEFW ACIM
DEFW BLOKKH
DEFB 00010100B
DEFB 00101000B
DEFB 11000101B

DEFB BCIM
DEFB 10001010B
DEFB 11001111B

DEFB 00000101B
DEFB 11001111B
DEFB 10000111B


; port A memória, címe növekvő
; port B I/O, címe fix
; csomagonkémti átvitel,
; port B alsó cím következik

; RDY aktív: logikai "1" szint
; port B címének betöltése,
; számláló törlése
; A -> B (forrás átállítás)
; port A címének betöltése

; DMA művelet engedélyezése
DMATVG: END  

A második példán memóriában végzendő keresést állítunk be.

ACIM:
BLOKKH:
MASZK:
MINTA:
DMACOM:

DMAINI:

EQU 5000H
EQU 999
0FH
50H
60H

LD HL,DMATBL
LD C,DMACOM
LD B,DMATCG-DMATBL
OTIR
RET

; keresés kezdőcíme
; 1000 byte átvizsgálása
; felső félbyte-ot vizsgálja
; 5X-et keres
; DMA parancs byte


ITVEKTOR:

DEFW DMARDY
DEFW DMAMINTA
DEFW DMABLOKKVEG
DEFW DMABV
 

DMARDY:
DMAMINTA:
DMABLOKKVEG:
DMABV:


; DMA RDY IT lekezelése
; DMA mintaegyezés lekezelése
; mintával egyezőt nem talált
; mintaegyezés lekezelése


DMATBL:

DEFB 01111110B


DEFW ACIM
DEFW BLOKKH
DEFB 00010100B
DEFB 10110001B

DEFB 00010011B

DEFB ITVEKTOR
DEFB 10000010B
DEFB 11111100B



DEFB MASZK
DEFB MINTA
DEFB 0CFH
DEFB 8BH
DEFB 87H

; port A-ból keresés, port A
; kezdőcím és blokkhossz
; következik

; port A cím növekvő,
; port A memória
; folyamatos üzem,
; IT vezérlő-byte következik
; IT vektor következik,
; IT kérés mintaegyezéskor


; DMA, IT engedélyezés,
; minta és maszk byte
; következik.
; minta esetén megállás


; kezdőcím, blokkszámláló töltés
; minta állapot bitek törlése
; DMA engedélyezés
DMATVG END  

1.9.5. Alkalmazási példák
Az 1.9.5-1. ábrán bemutatunk egy Z-80 rendszert, mely DMA-val támogatott adatátvitelre képes. Az adatátvitelt SIO áramkör végzi. Az adatátvitelhez szükséges órajeleket egy CTC áramkör állítja elő. Mindkét csatorna adatátvitelét egy-egy DMA áramkör támogatja. Erre akkor van szükség, ha agyidőben mindkét adatátviteli úton nagysebességű adatátvitelt akarunk megvalósítani. A bemutatott rendszer, példa két DMA áramkör felfűzésére. A DMA egységek együttműködését a BA lánc valósítja meg.
Indításkor a SIO áramkör mindkét csatornáját úgy programozzuk, hogy -W/RDY kivezetésük a DMA-nak megfelelően legyen beállítva.
Az adatátvitel módjától függően programozzuk a DMA egységeket. Az RDY bemenet kihasználásával lehet folyamatos vagy csomagonkénti átvitelt is megvalósítani. Ha a két adatátviteli csatornán nincs egyidejű adatforgalom, akkor a RDY bemenet átkapcsolásával egy DMA áramkörrel is megoldható a feladat.

1.9.5-1. ábra: DMA alkalmazása

1.9.6. A DMA idődiagramjai
Az áramkör idődiagramjait az 1.9-1. és 1.9-2. ábrán mutatjuk be. Az előbbin a DMA inaktív állapotában érvényes jelalakok, láthatók, a másodikon az aktív állapot jelalakjai:

1.9-1. ábra: DMA inaktív állapotbeli idődiagramjai

Az ábrán lévő számok jelentését az alábbi táblázatban adjuk meg. Az időértékek ns-ban szerepelnek.

szám
értelmezés
Z-80
min
DMA
max
Z80A
min
DMA
max

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

órajel periódusidő
órajel logikai "1" szint
órajel logikai "0" szint
órajel felfutás
órajel lefutás
minden jelmegtartási idő
vezérlő jel előkészületi idő
adatkivitel késleltetése
adat előkészületi idő
adatkivitel késleltetése ITACK-nál
adatbusz elengedési idő
-IORQ előkészületi idő ITACK-nál
IEO késleltetése IEI felfutásakor
IEO késleltetése IEI lefutásakor
IEO késleltetése -M1 lefutásakor
-M1 lefutás előkészületi idő
-M1 felfutás előkészületi idő
-RD lefutás előkészületi idő (M1)
-INT késleltetése
-BAO késleltetése -BAI felfutásakor
-BAO késleltetése -BAI lefutásakor
RDY előkészületi idő

400
170
170


0
280

50


140



210
20
240



150

4000
2000
2000
30
30


500

340
160

210
190
300



500
200
200

250
105
105


0
145

50


140



90
-10
115



100

4000
2000
2000
30
30


380

160
110

160
130
190



500
150
150

1.9-2. ábra: DMA aktív állapotbeli idődiagramjai

Az ábrán levő számok jelentését az alábbi táblázatban adjuk meg. Az időértékek ns-ban szerepelnek. A táblázatban feltüntettünk olyan adatokat is, melyek az ábrán nincsenek jelölve. Ezeknél a szám után * áll.

szám
értelmezés
Z-80
min
DMA
max
Z80A
min
DMA
max

1
2
3
4
5
6
7
8
9
10 *
11 *
12
13 *
14
15
16 *

17

18 *
19
21
22
23
24
25 *
28
30
31
32
33
34
35
36
37
38
39
40
41

órajel periódusidő
órajel logikai "1" szint
órajel logikai "0" szint
órajel felfutás
órajel lefutás
címbusz késleltetése
címbusz elengedési idő
-MREQ előkészületi idő
-IORQ előkészületi idő
cím késleltetése -RD, -WR-hez
cím elengedése -RD, -WR után
adatkivitel késleltetése
adatbusz elengedési idő
adat előkészületi idő (órajel fel)
adat előkészületi idő (órajel le)
adatkivitel előkészületi idő
memória ciklusban -WR lefutásakor
adatkivitel előkészületi ideje
I/O ciklusban -WR lefutásakor
adatkivitel késleltetése -WR felfutásakor
megtartási idő (mindegyik)
-MREQ késleltetése
-MREQ késleltetése
-MREQ késleltetése
-MREQ logikai "0" szint
-MREQ logikai "1" szint
-IORQ késleltetése
-RD késleltetése
-RD késleltetése
-RD késleltetése
-RD késleltetése
-WR késleltetése
-WR késleltetése
-WR késleltetése
-WR késleltetése
-WR késleltetése
-WAIT előkészületi idő
-BUSRQ késleltetése
vezérlő jelek elengedése

400
180
180




(2)+(5)-75
(1)-80
(3)+(4)-40
(3)+(4)+60


50
60
(1)-210

100

(3)+(4)-80
0



(1)-40
(2)+(5)-30









(1)-40
70

4000
2000
2000
30
30
145
110




230
90








100
100
100


100
100
130
100
110
80
90
100
100


100
100

250
110
110



(2)+(5)-75
(1)-70
(3)+(4)-50
(3)+(4)+45


35
5 0
(1)-170

100

(3)+(4)-70
0



(1)-30
(2)+(5)-20









(1)-30
70

4000
2000
2000
30
30
110
90




150
90








85
85
85


85
85
95
85
85
65
80
80
80


100
80

Vissza a Spectrum könyvekhez

Vissza az Enterprise könyvekhez