Tervezési segédlet a Z80 (MK3880) típusú mikroprocesszor alkalmazásához

I. rész: CPU


Tartalom

1. Bevezetés
2. A Z80-CPU architekturája
    2.1. A CPU regiszterei
    2.2. Aritmetikai és logikai egység (ALU)
    2.3. Utasítás regiszter és CPU vezérlő
3. A Z80-CPU lábkiosztása
4. A Z80-CPU időzítése
5. A Z80-CPU utasításkészlete
    5.1. Bevezetés az utasítástípusokba
    5.2. Címzési módok
    5.3 Az utasítások kódjai
6. Flag készlet
7. Az utasításkódok és az utasításvégrehajtási idők összefoglalása
8. Megszakításos működés
9. Hardware tervezési példák
10. Software példák
    10.1 A Software implementálás módjai
    10.2. A Z80 CPU által biztosított software jellemzők
    10.3. Példák a speciális Z80-as utasítások használatára
    10.4. Programozási példák
11. Elektromos specifikációk
12. A Z80 utasításainak felbontása gépi ciklusokra


1. Bevezetés

A Z80 mikroprocesszor elemcsalád megjelenése jelentős lépés volt a mikroszámítógépek fejlődésében. A család-elemek, valamint standard memóriák felhasználásával különböző teljesítőképességű mikroszámítógépek építhetők. Például két LSI és három standard TTL MSI tokkal már építhető egyszerű vezérlő, míg további memória chipek és I/O elemek felhasználásával korábban csak miniszámítógéppel elérhető adatfeldolgozási teljesítmény valósítható meg.
A Z80 család-elemekből felépített mikroszámítógép rendszer három részből áll:

  1. CPU
  2. Memória
  3. Periféria illesztő áramkörök

2. A Z80-CPU architekturája

A Z80-CPU belső architekturája a 2.0-1 ábrán látható. A blokkdiagram bemutatja a CPU fontosabb funkcionális elemeit és ezek kapcsolatait.


2.0-1 ábra

A Z80-CPU blokkdiagramja
Ábraszöveg:

  1. CPU és rendszervezérlő jelek
  2. Utasítás dekódoló és CPU vezérlő egység
  3. Utasítás regiszter
  4. Belső adatbusz
  5. Adatbusz vezérlő
  6. Aritmetikai és logikai egység
  7. 8 bites adatbusz
  8. CPU regiszterek
  9. Címbusz vezérlő
  10. 16 bites cím busz

2.1. A CPU regiszterei
A Z80-CPU a programozó számára hozzáférhető irható és olvashatóregiszterekbe szervezett belső memóriát tartalmaz. A Z80-CPU az alábbi regiszterekkel rendelkezik:

Speciális célú regiszterek:

  1. Program számláló (PC): 16 bites regiszter, a végrehajtandó utasítás memória címét tartalmazza. A PC automatikusan inkrementálódik, miután tartalma a címvonalakra továbbítódott. Ugró utasítás végrehajtásakor az ugrás cím automatikusan felülírja a PC inkrementált tartalmát.
  2. Stack-Pointer (SP): 16 bites regiszter, a külső memóriában bárhol elhelyezhető stack címzésére szolgál. A programozó egy utasítással két byte-nyi adatot tud a stack tetején elhelyezni (PUSH), illetve onnan a CPU regisztereibe tölteni (POP). A stack használata lehetővé teszi a többszintű megszakítás kezelés egyszerű megvalósítását, a korlátlan mélységű szubrutin hívást és egyszerűsíti sokféle adatkezelési feladat megoldását.
  3. Két index regiszter (IX, IY): két független 16 bites regiszter, melyek az indexelt címzési mód használata során a bázis-címet tartalmazzák.
    Az indexelt címzési módot használó utasításoknak tartalmazniuk kell még egy-egy byte-os információt, az un. eltolási címet, melyet kettes komplemensben ábrázolt előjeles egész számként értelmez a processzor. A bázis-cím és az eltolási cím összege adja meg a keresett adat memória címét.
  4. Interrupt regiszter (I): a Z80 CPU képes olyan üzemmódban működni, melyben interrupt (megszakítás) kérés után "indirekt call" utasítással bármely memóriahely elérhető. Az I regiszter az indirekt cím felső 8 bitjét tartalmazza, míg a megszakítást kérő eszköz pedig az indirekt cím alsó 8 bitjét szolgáltatja.
  5. Memória frissítő regiszter ®: a dinamikus memóriák felfrissítésére használható 7 bites regiszter. Tartalma minden utasításkód beolvasás után automatikusan inkrementálódik. A frissítő regiszter tartalmát akkor teszi a címbusz alsó felére a processzor, mikor a CPU a beolvasott utasítás dekódolását és végrehajtását végzi. A dinamikus memória frissítése a programozó számára láthatatlan és nem lassítja le a CPU működését. Bár az R regiszter programból tölthető és olvasható, általában csak nagyon speciális esetekben alkalmazzák a programozók (pl. ellenőrzés).

Az akkumulátor és a flag-regiszterek
A CPU két független 8 bites akkumulátort és az ezekhez tartozó 8 bites flag-regisztereket tartalmaz. Az akkumulátor tartalmazza a 8 bites aritmetikai vagy logikai műveletek egyik operandusát, illetve az akkumulátorban keletkezik a művelet eredménye.
A flag-regiszter bitjei a 8 vagy 16 bites műveletek eredményére vonatkozó jellemzőket tárolják. Például jelzik, hogy a művelet eredménye egyenlő-e zérussal. A programozó az általa használni kívánt akkumulátor és flag párt egyetlen utasítással ki tudja választani.

Általános célú regiszterek
A processzorban két általános célú regiszter készlet van. Mindkét regiszterkészletben hat 8 bites regiszter található, melyek 8 bites regiszterként, illetve 16 bites regiszterpárként is használhatók. Az egyik készlet regisztereit BC, DE, HL, a másik készlet regisztereit BC', DE', valamint HL' regisztereknek nevezzük. A programozó egyetlen utasítással választhatja ki, mely regiszter készlettel kivár dolgozni. Olyan rendszerekben, melyekben a megszakítás gyors kiszolgálása szükséges, az egyik általános célú regiszter készlet, valamint az egyik akkumulátor-flag pár fenntartható a megszakítás kérést gyorsan kiszolgáló rutin céljaira. A kiszolgáló rutin paramétereinek átadása egyszerűen, a regiszter csoportokat felcserélő utasítások végrehajtásával elvégezhető. Ez a megoldás nagymértékben csökkenti az interrupt kiszolgálásához szükséges időt, mivel a regiszter tartalmak külső stack területre történő menése és visszatöltése elkerülhető.

2.2. Aritmetikai és logikai egység (ALU)
A 8 bites aritmetikai és logikai műveleteket a CPU az ALU-ban hajtja végre. Az ALU a CPU belső adatbuszán keresztül kommunikál a regiszterekkel és a külső busszal.
Az ALU funkciói:

Összeadás Inkrementálás
Kivonás Dekrementálás
Logikai AND Aritmetikai és logikai shiftelés, rotálás
Logikai OR Bit állítás
Logikai EXOR Bit törlés
Komparálás Bit tesztelés

2.3. Utasítás regiszter és CPU vezérlő
A CPU a memóriából beolvasott utasítást az utasítás regiszterbe helyezi és dekódolja. A CPU vezérlő végzi az utasítás dekódolási funkciót és előállítja az egyes műveletek elvégzéséhez szükséges belső-és külső vezérlő jeleket.

A Z80 CPU regiszterkészlete:

Általános célú regiszterek

Akkumulátor
A
Flag
F
Akkumulátor
A'
Flag
F'
B
C
B'
C'
D
E
D'
E'
H
L
H'
L'

Speciális célú regiszterek:

Interrupt regiszter
I
Memória frissítő regiszter
R
Index regiszter IX
Index regiszter IY
Stack-Ponter SP
Program számláló PC

3. A Z80 CPU bemeneti és kimeneti vonalainak leírása
A 4o kivezetésű ipari standard tokban elhelyezett Z80 processzor lábkiosztása a 3.0-1 ábrán látható.


3.0-1 ábra

Az egyes bemeneti-kimeneti vonalak funkciója:

A0-A15
(Adress Bus)
16 bites címbusz, háromállapotú kimeneti jelek. Memória olvasás vagy írás esetén a memóriacím, periféria művelet esetén az alsó 8 biten a perifériacím, memória frissítésnél az alsó 7 biten a frissítési cím jelenik meg rajta. A0 a legkisebb helyértékű bit.
D0-D7
(Data Bus)
8 bites háromállapotú, kétirányú busz. A processzor és a külső eszközök közötti adatforgalom zajlik le rajta.
M1
(Machine Cycle One)
Az utasítás lehívás (FETCH) gépi ciklus jelzésére szolgál. A "megszakítás elfogadás" gépi ciklusban aktív.
MREQ
(Memory Request)
Háromállapotú kimenet, azt jelzi, hogy a címbuszon érvényes memória cím van.
IORQ
(Input / Output Request)
Háromállapotú kimenet, azt jelzi, hogy a címbusz alsó felén érvényes I/O cím van. A megszakítás elfogadás ciklusban szintén aktivizálódik az M1 jellel együtt.
RD
(Memory Read)
Háromállapotú kimenet, azt jelzi, hogy a processzor kész adat fogadására periféria vagy memória felől.
INT
(Interrupt Request)
A maszkolható megszakítás-kérés bemenő vonala. A megszakítás-kérés jelet az I/O eszközök generálják. A processzor az utasítás ciklus végén megvizsgálja a vonal állapotát és ha a software-rel állítható belső megszakítás engedélyező flip-flop (IFF) engedélyezett, valamint a BUSRQ jel nem aktív, elfogadja a megszakítás kérést. A megszakítás kérés elfogadását a processzor nyugtázó jellel jelzi (IORQ és M1 egyszerre) a következő gépi ciklus elején. A processzor három különböző üzemmódban kezelheti a megszakítás kérést (lásd 8. fejezet).
NMI
(Non Maskable Interrupt)
Negatív éltriggerelt bemenet. A nem maszkolhatzó megszakítás kérés vonal magasabb prioritású, mint az INT. Hatására a processzor az utasítás ciklus végén a belső megszakítást engedélyező flip-flop állapotától függetlenül egy RESTART utasítást hajt végre a 0066H címre. A programszámláló tartalma automatikusan elmentődik a stack tetejére, így a megszakított programba vissza lehet térni. Ha folyamatosan WAIT kérés áll fenn az utasítás ciklus nem fejeződik be és a BUSRQ jel hatálytalanítja az NMI kérést.
RESET

A vonalon megjelenő alacsony szint hatására a processzor alaphelyzetbe kerül, azaz:

  1. a megszakitás engedélyező flip-flop letiltja a megszakítás kérés elfogadását,
  2. Az I regiszterbe 00H-t,
  3. az R regiszterbe 00 H- t tölt,
  4. A 0-ás megszakítási üzemmódot állítja be,
  5. Nullázza a Program Számláló (PC) regisztert.

A reset ideje alatt a cím- és adatbusz lebegő állapotba, a vezérlő vonalak pedig inaktív állapotba kerülnek. Memória frissítő jelet nem ad a processzor.

BUSREQ
(Bus Request)
Alacsony aktív szintű bemenőjel hatására az adatbusz, a címbusz és a háromállapotú vezérlőjelek a futó gépi ciklus végén lebegő állapotba kerülnek, tehát más eszköz veheti át a buszok vezérlését (például DMA).
BUSAK
(Bus Acknowledge)
Kimenőjel, melynek aktivizálásával jelzi a processzor, hogy a háromállapotú kimenőjelei lebegő állapotba kerültek, tehát más eszköz átveheti a buszok vezérlését.
Egyfázisú rendszer órajel.
WR
(Memory Write)
Háromállapotú kimeneti jel, azt jelzi, hogy az adatbusz érvényes kimeneti adatot tartalmaz.
RFSH
(Refresh)
Aktív állapota azt jelzi, hogy a címbusz alsó 7 bitje frissítési címet tartalmaz és a MREQ jel frissítő olvasásra használható.
HALT
(HALT state)
Aktív állapota azt jelzi, hogy a processzor végrehajtott egy HALT utasítást de maszkolható vagy nem maszkolható megszakításra vár. HALT alatt a processzor NOP utasításokat hajt végre és memória frissítést végez.
WAIT
(Wait)
A WAIT bemenetre adott alacsony szinttel kell jelezni a processzor számára, hogy a memória vagy a megcímzett periféria nem kész az adatátvitelre.
A processzor WAIT állapotban marad mindaddig, amíg a bemenet aktív. WAIT állapot alatt nincs dinamikus frissítő jel.

Megjegyzés: Az ábrán felülhúzással jelölt jeleknél a feszültség alacsony szintje az aktív, a többinél a magas szint.

4. A CPU időzítése
A Z80 CPU utasításciklusai a következő gépi ciklusokból épülnek fel:

Az egyes gépi ciklusok 3-6 órajel-periódusig tartanak, illetve, ha a CPU és a külső egység szinkronizálását meg kell oldani, WAIT állapotok beiktatásával tetszőleges számú periódussal megnyújthatók. Az alap órajel-periódust ütemnek (T) nevezzük. A 4.0-0 ábrán látható, hogyan épül fel egy utasításciklus gépi ciklusokból (M) és ütemekből (T). A példában bemutatott utasítás három gépi ciklusból áll (M1, M2 és M3). Minden utasításciklus első gépi ciklusa (M1) az utasítás lehívási gépi ciklus (FETCH/) mely 4-6 ütem hosszú. A FETCH (M1) gépi ciklus a következő végrehajtandó utasítás műveleti kódjának elérésére szolgál. A következő gépi ciklusokban (M2, M3 ...) általában adatmozgatás történik. Az adatmozgatásban résztvevő elemek a regiszterek, a memória és a külső I/O eszközök. A ciklusok hossza 3-5 ütem, amely tetszőleges számú várakozási ütemmel (WAIT ütem) meghosszabbítható.
A CPU működésének időbeli folyamata néhány alapműködésre bontható. A következőkben ezen alapműködések funkcionális idődiagramjait adjuk meg WAIT állapotok közbeiktatása nélkül, illetve WAIT állapotokkal.


4.0-0 ábra: a CPU időzítése

Utasítás elérés (FETCH)
A 4.0-1 ábrán az M1 ciklus időviszonyai láthatók.


4.0-1 ábra: Utasítás elérési ciklus

A ciklus elején a programszámláló (PC) tartalma a címbuszra kerül. Fél órajellel később az MREQ jel aktív lesz. Ekkorra a memória cimek már stabilizálódtak, tehát a MREQ jel lefutó éle közvetlenül felhasználható dinamikus memóriák, chip enable' jelének. A RD (READ) vezérlőjel szintén itt lesz aktív, jelezve, hogy a memóriából kiolvasott byte a CPU adatvonalaira adható. A CPU az adatvonalakat a T3 ütem felfutó órajel élénél mintavételezi, majd megszünteti a MREQ és RD vezérlőjeleket. A vezérlőjelek tehát már akkor szűnnek meg, mikor a CPU mintát vett az adatvonalakból. A T3 és T4 ütemek dinamikus memóriák frissítésére használhatók. (A CPU ezt az időt használja fel az utasítás dekódolására és végrehajtására.) A T3 és T4 ütemben a címbusz alsó 7 bitje a memória frissítési címet tartalmazza, miközben a jel aktív szintje jelzi, hogy a dinamikus memóriákon frissítő olvasás hajtható végre. Figyeljük meg, hogy a memória frissítési ütemekben RD jel nem generálódik, ezzel küszöbölhető ki az, hogy a különböző memória szegmensekből származó adatok egyszerre az adatbuszra kapuzódjanak. A felfrissítési idő alatt megjelenő MREQ jel használható a memória elemek frissítő olvasásához. A jel ehhez önmagában nem használható, mivel a címek stabil fennállása csak MREQ jel alatt garantált.
A 4.0-1A ábra azt mutatja be, hogyan nyújtható meg az M1 ciklus WAIT állapotok közbeiktatásával.


4.01-A ábra: Utasítás kód elérési ciklus WAIT ütemmel

T2 és minden további Tw ütem alatt az Egyfázisú rendszer órajel lefutó élére a CPU mintát vesz a WAIT vonal állapotából, s ha a vonal aktív, a következő ütembe újabb WAIT állapotot iktat be. Ilyen módon az olvasási ciklus bármely memória eszköz hozzáférési idejéhez illeszthető.

Memória olvasás vagy írás
Az utasításkód elérési ciklustól különböző memória olvasási és írási ciklusok időzítését a 4.0-2 ábra mutatja be.


4.0-2 ábra: Memória olvasás vagy írás ciklusok

Ezek a ciklusok általában három órajel periódusig tartanak, hacsak WAIT ütemeket közbe nem iktatunk. Olvasásnál a MREQ és RD jelek a FETCH ciklushoz hasonló módon és időben indulnak. Memória írási ciklusnál a MREQ jel szintén akkor válik aktívvá, mikor a címbuszon az adat már stabilizálódott, tehát ez a jel közvetlenül felhasználható dinamikus memóriák, chip enable' jelének. Írásnál a WR jel akkor aktív, ha már stabil adat található az adatvonalakon. A WR jel megszűnését követően még egy fél órajel-periódus ideig stabil marad a címvonalak és adatvonalak állapota.
A 4.0-2A ábrán mutatjuk be, hogyan hosszabbítható meg WAIT kérés jellel a memória iráni vagy olvasási művelet. (Az ábrán a független READ és WRITE ciklusokat együtt tüntettük fel, bár írási és olvasási ciklusok sohasem történhetnek egyszerre.)


4.0-2A ábra: Memória olvasás vagy írás ciklus WAIT ütemekkel

Input/output ciklusok
A 4.0-3 ábra mutatja be az I/O írási vagy I/O olvasási műveletet.


4.0-3 ábra: Periféria olvasási vagy írási ciklusok

Az I/O műveletek során egy WAIT állapot automatikusan a gépi ciklusba iktatódik. Ennek az az oka, hogy az IORQ jel lefutó éle és a WAIT vonal vizsgálata közötti idő nagyon rövid lenne a beiktatott WAIT ütem nélkül az I/O port címének dekódolására és a WAIT vonal aktivizálására. Periféria olvasáskor a RD jel a megcímzett port adatának a processzor adatbuszára való kapuzását végzi. Periféria íráskor a WR jel felfutó éle használható a CPU-tól érkező adat kapuzására az adatregiszterbe.
A 4.0-3A ábrán mutatjuk be a periféria írási vagy olvasási ciklusok WAIT ütemekkel való bővítését.


4.0-3A ábra: Periféria olvasási vagy írási ciklusok
WAIT ütemekkel

BUSZ kérés / elfogadás ciklus
A 4.0-4 ábra a busz kérés/elfogadás ciklus időzítését mutatja be.


4.0-4 ábra: Busz kérés / elfogadás ciklus

A BUSRQ jelet a CPU minden gépi ciklus utolsó periódusának felfutó órajelénél mintavételezi. Ha a BUSRQ vonal aktív, a CPU a következő órajel felfutó élénél harmadik állapotba kapcsolja a cím, adat és három állapotú vezérlő vonalait. Ettől az időtől kezdve külső egység (DMA vezérlő) vezérelheti a buszt. A CPU legkésőbb egy gépi cikluson belül válaszol a busz kérés jelre, s a külső vezérlő határozatlan időre átveheti a busz vezérlését. Hosszú DMA ciklusok esetén a dinamikus memóriák frissítését a DMA vezérlőnek kell elvégeznie. A busz kérés (DMA) ciklus folyamán a CPU nem figyeli a megszakítás kérő vonalakat (NMI és INT).

Megszakítás kérés / elfogadás ciklus (interrupt)
A 4.0-5 ábrán mutatjuk be a megszakítás kérés / elfogadás ciklus időzítését.


4.0-5 ábra: Megszakítás kérés / elfogadás ciklus

A megszakítás kérő jelet (INT) a CPU minden utasításciklus utolsó ütemének (T) felfutó órajel élénél vizsgálja. A megszakítás kérést a CPU nem fogadja el, ha a processzor belső software-vezérelt megszakítás engedélyező flip-flopja (interrupt mark bit) nincs bebillentve, vagy ha a BUSRQ jel aktív. Ha a CPU elfogadja a megszakítást, speciális M1 ciklust generál. Ez alatt az M1 alatt az IORQ jel is aktív lesz, jelezve, hogy a megszakító eszköz egy 8-bites vektort adhat az adatbuszra. A megszakítás ciklus automatikusan meg van nyújtva két WAIT ütemmel. Természetesen szükség esetén további WAIT ütemek itt is beiktathatóak (4.0-5A ábra).


4.0-5A ábra: Megszakítás kérés / elfogadás ciklus
WAIT ütemekkel

Nem maszkolható interrupt
A 4.0-6 ábra a nem maszkolható megszakitás kérés/elfogadás ciklust mutatja be.


4.0-6 ábra: Nem maszkolható megszakítás kérés működés

Az NMI jel bebillenti a CPU belső NMI latch-ét, melynek tartalmát a processzor minden utasítás végrehajtásának végén megvizsgálja. A nem maszkolható interrupt nagyobb prioritású a normál megszakítás kérésnél és software vezérléssel sem tiltható le.
Az NMI elfogadása után a processzor egy normál memória olvasás ciklust hajt végre, azzal a különbséggel, hogy az adatbusz tartalmát nem veszi figyelembe, a processzor a PC tartalmát automatikusan elmenti a stack-be és a 0066H címre ugrik.

Kilépés a HALT állapotból
HALT utasítás végrehajtása során a CPU NOP utasításokat hajt végre mindaddig, míg egy megszakítás kérés nem érkezik. (Nem maszkolható, vagy maszkolható, de engedélyezett interrupt.) A két interrupt vonalat a T4 ütem felfutó órajelére mintavételezi a processzor (4.0-7 ábra). A következő ciklus az interrupt típusának megfelelő interrupt elfogadási ciklus. HALT állapotban a processzor azért hajt végre NOP utasításokat, hogy folytathassa a memória frissítést. HALT állapotban a processzor HALT nyugtázó jele aktív.


4.0-7 ábra: Kilépés a HALT utasításból

5. A Z80 processzor urasításkészlete

A Z80 processzor 158 különböző utasítás végrehajtására képes, melyek magukban foglalják a 8080A processzor 78 utasítását is. Az utasítások a következőképpen csoportosíthatók:

5.1. Bevezetés az utasítástípusokba
Az adatmozgató utasítások a CPU regiszterek egymás közötti, valamint a CPU regiszterek és a külső memória közötti adatmozgatásokat végzik. Minden adatmozgató utasítás esetén meg kell adni a forrás és a cél operandust. A forráshely tartalmát az adatmozgató utasítások nem változtatják meg. Belső regiszterek közötti adatmozgató utasításra példa LD B,C, mely a C regiszter tartalmát a B regiszterbe viszi. Ebbe az utasításcsoportba tartoznak a közvetlen operandusú regiszter ill. memória töltő utasítások. Más típusú adatmozgató utasítások a CPU regiszterek és a külső memória közötti adatmozgatást végzik. Az adatcserélő (exchange) utasítások két regiszter tartalmának felcserélését végzik.
A Z80 rendelkezik egy egyedi blokkmozgató utasításcsoporttal is. Ezek az utasítások lehetővé teszik, hogy egy tetszőleges méretű memóriablokkot a memórián belül áthelyezhessünk egyetlen utasítással. A blokkmozgató utasítások elsősorban nagyméretű adat-stringek feldolgozásához használhatók előnyösen. A Z80 blokk kereső utasításai szintén hasonló feladatokhoz használhatók. Egyetlen utasítással a memória tetszőleges blokkjában megkereshető egy 8 bites karakter. A karakter megtalálása után az utasítás automatikusan végetér. A blokk mozgató és kereső utasítások végrehajtásuk során megszakíthatóak, így nem foglalják le hosszú időre a CPU-t.
Az aritmetikai és logikai utasítások az akkumulátorban, más általános célú CPU regiszterekben vagy külső memóriában tárolt adatokon végeznek műveleteket. A műveletek eredménye az akkumulátorban keletkezik és a megfelelő flag-ek a művelet eredményétől függően állítódnak be. Aritmetikai műveletre példa az akkumulátor tartalmának hozzáadása külső memóriahely tartalmához. Az összeadás eredménye az akkumulátorban keletkezik. Ebbe a csoportba tartoznak a CPU 16 bites regiszterei között végezhető 16 bites összeadások és kivonások.
A bit kezelő utasítások lehetővé teszik, hogy az akkumulátor, bármely általános célú regiszter vagy külső memória hely bármely bitjét egyetlen utasítással beirni (set), törölni (reset) vagy tesztelni lehessen. Például a H regiszter legmagasabb helyértékű bitje resetelhető (0-ba állítható). Ezek az utasítások elsősorban vezérlők software-ében, illetve általános célú programozásnál szoftver flag-ek kezelésére használhatók.
A vezérlésátadó utasítások csoportjába tartozó utasítások többféle technikát alkalmaznak a programszámláló új értékének előállításához. Egyedi szubrutin hívó utasítások az un. restart utasítások. Ezekben az utasításokban a szubrutin kezdőcíme a 8 bites műveleti kód része. Ez azért lehetséges, mert a szubrutinok csak a nullás memórialap 8 meghatározott címén kezdődhetnek. A programban ugrások hajthatók végre HL, IX vagy IY regiszterek tartalmának PC-be töltésével, ez lehetővé teszi, hogy az ugráscím a végrehajtott rutin komplex függvénye legyen.
Az input / output utasításcsoport sokféle adattranszfert tesz lehetségessé a memóriahelyek ill. a CPU regiszterek, valamint az I/O eszközök között. Minden periféria kezelő utasításnál a port címe a címbusz alsó 8 bitjén jelenik meg. Az egyik utasításnál a port címe az utasításkód második byte-jában található, míg más Z80 utasítások a C regiszterben feltételezik a port címét. A C regiszterrel történő periféria címzésnek nagy előnye, hogy különböző címen lévő perifériák osztozkodhatnak bizonyos szoftver periféria kezelő rutinokon. Ezek az adatbeolvasási utasítások automatikusan állítják be a flageket. Így közvetlenül meghatározható a bemeneti adat állapota (például paritása). A Z80-nak vannak olyan utasításai, melyek lehetővé teszik 256 byte-nyi adatblokk mozgatását a perifériák és a memória között. A két regiszter készlettel együtt ezek az utasítások gyors I/O adatátviteli sebesség megvalósítását teszik lehetővé.
Végül, a CPU vezérlő utasítások különböző opciók és üzemmódok beállítására szolgálnak. Ezek között találhatók a megszakítás engedélyező flip-flop beállítására, illetve az interrupt mód beállítására szolgáló utasítások.

5.2. Címzési módok
A legtöbb Z80 utasítás a CPU belső regisztereiben, a memóriában, illetve a portokon lévő adatokon végez műveleteket. A címzési mód azt mondja meg, hogy az operandus címét hogyan állítja elő a processzor.
Ebben a fejezetben röviden áttekintjük a Z80 címzési módjait.

Közvetlen címzési mód
Ebben a címzési módban a műveleti (operációs) kódot követő byte tartalmazza az utasítás operandusát.

OP kód
- egy vagy két byte
Opernandus
 
d7
d0
 

Példa: az akkumulátor konstanssal való feltöltése, ahol a konstans a műveleti kód utáni byte-ban található.

Kiterjesztett közvetlen címzési mód
Azonos a közvetlen móddal, de 16 bites operandus helyezkedik el az utasítás kódja után.

OP kód
egy vagy 2 byte
Opernandus
alsó byte
Opernandus
felső byte

Példa: a HL regiszterpár 16 bites konstanssal való feltöltése.

Módosított címzés a memórialapon
A Z80-nal van egy olyan egy byte-os szubrutin hívó utasítása, mellyel a nullás lapon meghatározott címeken elhelyezett 8 szubrutin hívható. (Ezeket az utasításokat, restart' utasításoknak nevezik.)

OP kód
egy byte
b7
b0
az effektív cím (00 b5 b4 b3 000)

Relatív címzési mód
A relatív címzési módban a műveleti kódot követő byte a PC értékét módosító 2-es komplemens ábrázolású, előjeles számként értelmeződik. Csak vezérlésátadó utasításokban alkalmazható.

OP kód
"Jump relative" / egy byte-os OP kód)
Opernandus
8 bites 2-es komplemens eltolás, mely a PC-hez adódik

A relatív címzés azért hasznos, mert lehetővé teszi a közeli memória helyekre az ugrást két byte-os utasítással. Ezáltal jelentős memória-hely megtakarítás érhető el.
Az átfogható címtartomány (PC'):

PC - 126 <= PC' <= PC + 129

ahol PC az utasítás első byte-jának címe.

Kiterjesztett címzési mód
Kiterjesztett címzési mód esetén az utasítás 2 byte (16 bit) címet tartalmaz. Ez lehet az ugrás címe vagy a memóriában lévő operandus címe. Kiterjesztett címzéssel bármely memóriahely megcímezhető.
Ha kiterjesztett címzési módot használunk a cél- vagy forrás operaadus elérésére az (nn) jelölésmódot használjuk annak jelzésére, hogy az utasításban levő két byte címet jelöl. A zárójel mindig azt jelöli, hogy a zárójelben lévő érték memória pointerként szolgál (címként értelmezendő).

OP kód
(egy vagy két byte)
Cím alsó byte vagy operandus alsó byte.
Cím felső byte vagy operandus felső byte.

Indexelt címzési mód
A Z80 CPU két indexregisztert tartalmaz: ezek IX illetve IY. Mindkét indexregiszter 16 bites. Az aktuális módosítást az utasítás kódját követően, konstansként kell megadni.
A konstans 8 bites 2-es komplemens ábrázolású előjeles számként értelmeződik. A cím kiszámítása során az aktuálisan kijelölt indexregiszter tartalmához hozzáadódik a módosító érték (eltolási cím) és ezt tekinti a processzor memóriacímnek.
A művelet során az indexregiszter tartalma változatlan marad. A fenti algoritmusból következik, hogy az átfogható tartomány az indexregiszter módosítása nélkül:

X - 128 <= memóriacím <= X + 127

ahol x valamelyik indexregiszter tartalma.
Az indexelt címzési módot a következőképpen jelöljük:

IX+D vagy IY+D

ahol a d az eltolási címet jelenti, a zárójel azt mutatja, hogy a benne lévő érték memória címként szolgál. Az indexelt címzési mód lehetővé teszi relokálható kód írását.

OP kód
két byte-os OP kód
OP kód
Displacement
eltolási cím

Regiszter címzési mód
Regiszter címzési móddal elérhető a processzor 6 általános célú regisztere, valamint az akkumulátor. A regiszter azonosító információt a műveleti kód tartalmazza. Példa: a B regiszterben lévő adatot a C regiszterbe töltjük.

Beleértett címzési mód
Olyan utasításokra vonatkozik ez a címzési mód, melyben az OP kód egy vagy több operandust tartalmazó regiszterre utal. Példa: aritmetikai műveletek, ahol mindig az akkumulátorban keletkezik az eredmény.

Regiszter indirekt címzési mód
Ez a címzési mód egy 16 bites CPU regiszter párt (például HL) jelöl ki memória pointernek a memóriában található operandus eléréséhez. Ez a címzési mód széleskörűen alkalmazható.

OP kód
egy vagy két byte

Példa: az akkumulátor feltöltése a memória HL regiszterpár által címzett helyéről. Az indexelt címzés az eltolási címtől eltekintve lényegében regiszter indirekt címzés. A Z80 blokk mozgató és kereső utasításai ezen címzési mód kiterjesztéseként tekinthetők, mikoris automatikus regiszter inkrementálás, dekrementálás és komparálás történik. A regiszter indirekt címzés jelölése a pointerként használt regiszterpár zárójelbe tételével történik.
A (HL) jelölés azt jelenti, hogy a HL regiszterpár tartalmát a memória címzésére használjuk. A regiszter indirekt címzési módot gyakran 16 bites operandus megadására használjuk. Ebben az esetben a regiszter tartalom az operandus alsó helyértékű byte-jára mutat. Az operandus felső helyértékű byte-ját a regiszter automatikus inkrementálása után éri el a processzor.

Bit címzési mód
A Z80 processzor lehetőséget ad arra, hogy közvetlenül megcímezzük egy byte egy bitjét is. A bit kijelölésére 3 bites bináris kód szolgál. A byte kijelölését (melyen belül az előző kód címezni fog) regiszter, indirekt HL regiszter ill. indexelt címzési módokkal végezhetjük.

Címzési mód kombinációk
Sok utasítás egynél több operandust használ (aritmetikai utasítások, adatmozgató utasítások). Ezekben az esetekben két különböző címzési mód alkalmazható a forrás-és a cél operandus címzésére.

5.3 Az utasítások kódjai
A fejezetben megadjuk a Z80 összes utasításának leírását és táblázatokba foglalva megadjuk az utasítások műveleti kódjait. A táblázatokban a szürke alapú négyzetekben szereplő műveleti kódok azonosak a 8080A CPU utasításaival ill. műveleti kódjaival. Bemutatjuk az egyes utasítások assembly nyelvű mnemonikjait is. Az utasítás kódokat hexadecimális ábrázolásban adjuk meg. Az egy byte-os utasítás kód leírásához két hexadecimális karakterre van szükség, míg a két byte-os műveleti kódot négy hexadecimális karakterrel tudjuk leírni.
Az alábbiakban emlékeztetőül megadjuk a hexadecimális - bináris konverziót.

Hex
Bináris
Decimális
 
Hex
Bináris
Decimális
0
0000
0
 
8
1000
8
1
0001
1
 
9
1001
9
2
0010
2
 
A
1010
10
3
0011
3
 
B
1011
11
4
0100
4
 
C
1100
12
5
0101
5
 
D
1101
13
6
0110
6
 
E
1110
14
7
0111
7
 
F
1111
15

A Z80 utasításainak mnemonikjai az utasításkódból és nulla, egy vagy két operandusból állnak. A beleértett operandusú utasítások mnemonikjaiban nem szerepel operandus. A logikusan egy operandusú utasítások, illetve azon utasítások esetén, melyeknek egyik operaadusa invariáns egy operandusú mnemonik használatos. A két operandusú utasításokat két opernadusú mnemonik írja le.

Adatmozgató és cserélő utasítások (Load és Exchange)
Az 5.3-1 táblázat összefoglalja a Z80 CPU 8 bites adatmozgató utasításainak utasítás kódjait. A táblázat az egyes utasításokhoz használható címzési módokat is feltünteti. Az utasítások forrás operandusa a legfelső vízszintes sorban, a cél operandus a baloldali függőleges oszlopban található. Például a C regiszter B regiszterből való feltöltésének utasításkódja 48H (= 0100 1000). Az M1 gépi ciklus alatt ezt az utasítás kódot olvassa be a CPU a külső memóriából, s dekódolás után automatikusan végrehajtja a regiszter transzfert.

Destination  
Source
Implied
REGISTER
REG INDIRECT
INDEXED
EXT
ADDR.
IMME.
I
R
A
B
C
D
E
H
L
(HL)
(BC)
(DE)
(IX+d)
(IY+d)
(nn)
n
REGISTER A
ED
57
ED
5F
7F
78
79
7A
7B
7C
7D
7E
0A
1A
DD
7E
d
FD
7E
d
3A
n
n
3E
n
B    
47
40
41
42
43
44
45
46
   
DD
46
d
FD
46
d
 
06
n
C    
4F
48
49
4A
4B
4C
4D
4E
   
DD
4E
d
FD
4E
d
 
0E
n
D    
57
50
51
52
53
54
55
56
   
DD
56
d
FD
56
d
 
16
n
E    
5f
58
59
5A
5B
5C
5D
5E
   
DD
5E
d
FD
5E
d
 
1E
n
H    
67
60
61
62
63
64
65
66
   
EE
66
d
FD
66
d
 
26
n
L    
6F
68
69
6A
6B
6C
6D
6E
   
DD
6E
d
FD
6E
d
 
2E
n
REG
INDIRECT
(HL)    
77
70
71
72
73
74
75
           
36
n
(BC)    
02
                         
(DE)    
12
                         
INDEXED (IX+d)    
DD
77
d
DD
70
d
DD
71
d
DD
72
d
DD
73
d
DD
74
d
DD
75
d
           
DD
36
d
n
(IY+d)    
FD
77
d
FD
70
d
FD
71
d
FD
72
d
FD
73
d
FD
75
d
FD
75
d
           
FD
36
d
n
EXT. ADDR (nn)    
32
n
n
                         
IMPLIED I    
ED
47
                         
R    
ED
4F
                         

5.3-1 táblázat

 

Az utasításcsoport assembly nyelvű mnemonikja LD, melyet a cél és a forrás regiszter követ. (LD DEST., SOURCE)
Számos címzési mód kombináció lehetséges. Például a forrás címezhető regiszteresen és a cél operandus regiszter indirekt címzési móddal. Példa: D regiszter tartalmával töltsük fel a memória HL regiszterpárral címzett helyét. Az utasítás kódja 72, mnemonikja LD (HL),D.
A HL körüli zárójel azt jelenti, hogy a regiszterpár tartalmát címként értelmezzük (memória pointerként használjuk).
A Z80 assembly nyelvet a programozás könnyítésének figyelembevételével definiálták. Az utasítások öndokumentálók, ezért a Z80 nyelven irt programok könnyen javíthatók.
Az indexelt címzési módot használó adatmozgató utasítások három byte-osak, a harmadik byte adja a cím eltolást, d.
Példa: IX indexregiszterrel, +8 eltolási címmel megadott memóriahelyről adat átvitele az E regiszterbe - LD E, (IX + 8).
Ez az utasítás a memóriában a következőképpen helyezkedik el:

Adress A
DD
utasítás kód
A+1
5F
A+2
08
eltolási cím

Az utasításcsoporthoz tartozó két kiterjesztett című utasítás szintén 3 byte-os. Példa: az akkumulátor feltöltése a 6F32H memóriahely tartalmával - LD A,(6F32H)
Az utasítás elhelyezkedése a memóriában:

Adress A
3A
utasítás kód
A+1
32
cím alsó byte
A+2
6F
cím felső byte

A 8 bites általános célu regiszterek közvetlen töltő utasításai két byte-ot foglalnak el. A H regisztert 36H konstanssal feltöltő utasítás mnemonikja a következő: LD H, 36H.
Elhelyezkedése a memóriában:

Adress A
26
utasítás kód
A+1
36
operandus

Memóriahely feltöltése a cél operandushoz indexelt, a forrás operaadushoz közvetlen címzési módot használva 4 byte memóriát igényel.
Példa: LD (IX-15),21H
Az utasítás elhelyezkedése a memóriában:

Adress A
DD
utasítás kód
A+1
36
A+2
F1
eltolási cím (-15 2-es komplemens ábrázolásban
A+3
21

Az indexelt címzési módot használó utasításoknál az eltolási cím mindig közvetlenül az utasításkódot követi.

Az 5.3-2 táblázat a 16 bites adatmozgató utasításokat tartalmazza. A táblázat nagyon hasonló az előzőhöz. A 16 bites adatmozgató csoportban minden regiszterpárnát használható a kiterjesztett címzési mód. A stack pointerre vonatkozó regiszter műveletek a PUSH és a POP utasítások. Ezek abban különböznek a többi 16 bites adatmozgató utasítástól, hogy a stack pointer automatikusan inkrementálódik vagy dekrementálódik a POP ill. PUSH műveleteknek megfelelően.

Destination  
Source
REGISTER
IMM.
EXT.
EXT.
ADDR.
REG.
INDIR.
AF
BC
DE
HL
SP
IX
IY
nn
(nn)
(SP)
REGISTER AF                  
F1
BC              

D1
n
n

ED
48
n
n
C1
DE              
11
n
n
ED
56
n
n
D1
HL              
21
n
n
2A
n
n
E1
SP      
F9
 
DD
F9
FD
F9
31
n
n
ED
78
n
n
 
IX              
DD
21
n
n
DD
2A
n
n
DD
E1
IY              
FD
21
n
n
FD
2A
n
n
FD
E1
EXT.
ADDR.
(nn)  
ED
43
n
n
ED
53
n
n
22
n
n
ED
73
n
n
DD
22
n
n
FD
22
n
n
     
REG.
IND.
(SP)
F5
C6
D6
E5
 
DD
E5
DD
E5
     

5.3-2 táblázat

Példa: PUSH AP - egy byte-os utasítás, utasításkódja F5H.
Az utasítás végrehajtása során a következő lépések történnek:

SP dekrementálása
LD (SP),A
SP dekrementálása
LD (SP),F

Ezek után a külső stack a következőképpen néz ki:

(SP)
(SP+1)
.
.

F (A stack eleje)
A
.
.

A POP utasítás a PUSH utasításnak pontosan az ellentéte. A POP és PUSH- utasítások mindig 16 bites operandus mozgatását végzik. Mindig a magasabb helyértékű byte töltődik be először a stack-be és olvasódik ki utoljára. Azaz

PUSH BC
PUSH DE
PUSH HL
POP HL
= PUSH B
= PUSH D
= PUSH H
= POP L
azután PUSH C
azután PUSH E
azután PUSH L
azután POP H

A kiterjesztett közvetlen címzési módot használó utasítások az utasításkódot követően két adatbyte-ot is tartalmaznak. Példa:

LD DE,0659H

Az utasítás elhelyezkedése a memóriában:

Address A
A+1
A+2
11
59
06
utasítás kód
az E regiszterbe töltendő
a D regiszterbe töltendő operandus

Az 5.3-3 táblázat a Z80 mikroprocesszorban megvalósított 16 bites
regiszter cserélő utasításokat tartalmazza. A 08H utasításkódú utasítással a programozó a két akkumulátor-flag regiszter készletet cserélheti, a D9H utasításkód pedig az általános célú regiszterkészletek cseréjét teszi lehetővé. A fenti utasításkódok egy byte-ot foglalnak el, ezáltal a lehető legjobban csökkentik a regiszterkészletek cseréjéhez szükséges időt. Ezért a két regiszter készletet hatásosan lehet gyors kiszolgálást igénylő megszakításkérések kiszolgálásánál használni.

 
Implied Addressing
AF'
BC', DE' & HL'
HL
IX
IY
IMPLIED
AF
         
BC,
DE
&
HL
 
D9
     
DE
   
EB
   
REG
INDIR.
(SP)
   
E3
DD
E3
FD
E3

5.3-3 táblázat

Blokk transzfer és keresés
Az 5.3-4 ábra sorolja fel a nagyon hatékony blokk mozgató utasításokat.

 
REG
INDIR.
Reg HL - points to source
Reg DE - points to destination
Reg BC - is byte counter
(HL)
Destination
REG.
INDIR
(DE)
ED
A0
'LDI' - Load (DE) (HL)
Inc HL & DE, Dec BC
ED
B0
'LDIR' - Load (DE) (HL)
Inc HL & DE, Dec BC Repeat Until BC = 0
ED
AB
'LDD' - Load (DE) (HL)
Dec HL & DE, Dec BC
ED
88
'LDDR' - Load (DE) (HL)
Dec HL & DE, Dec BC, Repeat Until BC = 0

5.3-4 táblázat

Valamennyi utasítás három regisztert használ.

A blokk mozgató és kereső utasítások a fenti három regiszter betöltése után használhatók. Az LDI (Load and Increment) utasítás a HL regiszterrel címzett memóriahelyről a DE regiszterrel címzett memóriahelyre visz át egy byte-ot. HL és DE regiszterek tartalmai automatikusan inkrementálódnak, ezáltal a következő memóriacímekre mutatnak. Az utasítás végrehajtása során a byte számláló (BC regiszterpár) tartalma dekrementálódik. A fenti utasítás különösen akkor hasznos, ha adatmozgatáson kívül más műveleteket is kívánunk az adattal végezni. Az LDIR utasitás (Load increment and repeat) az LDI utasítás kiterjesztése. Az LDIR utasítás hatására a CPU addig végzi az adatmozgatást, míg a byte számláló nem nullázódik. Tehát egyetlen utasítással tetszőleges méretű és kezdőcímű adatblokkot mozgathatunk a memória teljes területén. Az LDD és LDDR utasítások hasonlóak az LDI és LDIR utasításokhoz, azzal a különbséggel, hogy egy byte átvitele után HL és DE regiszterek dekrementálódnak, azaz a blokk mozgatás a legmagasabb címen kezdődik.

Az 5.3-5 táblázat a blokk kereső utasítások utasításkódjait tartalmazza. A CPI (compare and increment) utasítás a HL regiszterrel címzett memóriahely tartalmát hasonlítja össze az akkumulátor tartalmával. Az összehasonlítás eredményét az egyik flag bit tárolja, majd HL tartalma inkrementálódik, BC tartalma dekrementálódik (BC a byte számláló). A CPIR utasítás a CPI utasítás kiterjesztése, melynek végrehajtása során az összehasonlítás addig ismétlődik, míg a CPU egyezést nem talál, vagy a byte számláló nem nullázódik. Ezzel az utasítással a memória teljes területén bármely 8 bites karaktert megkereshetünk.
A CPD (compare and decrement) és CPDR (compare decrement and repeat) hasonló utasítások azzal a különbséggel, hogy HL minden egyes összehasonlítás után dekrementálódik, a karakter keresés tehát fordított irányba történik.
A keresés a legmagasabb címen kezdődik.

SEARCH
LOCATION
HL points to location in memory to be compared with accumulator contents,
BC is byte counter
REG INDIR.
(HL)
ED
A1
'CPI'
Inc HL, Dec BC
ED
B1
'CPIR'
Inc HL, Dec BC repeat until BC=0 or find match
ED
A9
'CPD'
Dec HL & BC
ED
B9
'CPDR'
Dec HL & BC repeat until BC=0 or find match

5.3-5 táblázat

Aritmetikai és logikai utasítások
Az 5.3-6 táblázatban felsoroltuk a 8 bites aritmetikai műveleteket, valamint az inkrementáló és dekrementáló utasításokat.

 
Source
REGISTER ADDRESSING
REG.
INDIR.
INDEXES
IMMED.
A
B
C
D
E
H
L
(HL)
(IX+d)
(IY+D)
n
'ADD'
87
80
81
82
83
84
85
86
DD
86
d
FD
86
d
C6
n
ADD w CARRY
'ADC'
BF
88
89
8A
BB
BC
8D
8E
DD
8E
d
FD
8E
d
CE
n
SUBTRACT
'SUB'
97
90
91
92
93
94
95
96
DD
96
d
FD
96
d
D6
n
SUW w CARRY
'SBC'
97
98
99
9A
9B
9C
9D
9E
DD
9E
d
FD
9E
d
DE
n
'AND'
A7
A0
A1
A2
A3
A4
A5
A6
DD
A6
d
FD
A6
d
E6
n
'XOR'
AF
A8
A9
AA
AB
AC
AD
AE
DD
AE
d
FD
AE
d
EE
n
'OR'
B7
B0
B1
B2
B3
B4
B5
B6
DD
B6
d
FD
B6
d
F5
n
COMPARE
'CP'
BF
B8
B9
BA
BB
BC
BD
BE
DD
BE
d
FD
BE
d
FE
n
INCREMENT
'INC'
3C
04
0C
14
1C
24
2C
34
DD
34
d
FD
34
d
 
DECREMENT
'DEC'
3D
06
0D
1B
1D
25
2D
35
DD
35
d
FD
35
d
 

5.3-6 táblázat

Az INC és DEC utasítások kivételével az utasítások egyik operandusa az akkumulátorban, a másik a táblázatban megadott forrás helyen található. A műveletek eredménye általában az akkumulátorba kerül, kivétel a CP utasítás, mely változatlanul hagyja az akkumulátor tartalmát. Valamennyi felsorolt művelet hatással van a flag regiszter bitjeire. (A 6. fejezetben adjuk meg a különböző utasítások hatásait a flag-ekre.) Ha a forrás operandust indexelt címzési móddal választjuk ki, az eltolási címnek a műveleti kód után kell közvetlenül következnie.

Közvetlen címzési mód használata esetén az utasításkódot közvetlenül követi az operandus. Példa:

AND 07H

Elhelyezkedése a memóriában:

Adress A E6 utasítás kód
  A+1 07 operandus

Ha az akkumulátor F3H-t tartalmazna, a művelet eredményeképpen 03H kerülne az akkumulátorba.

Az akkumulátor tartalma a művelet előtt 1111 0011 = F3H
Az operandus 0000 0111 = 07H
Az akkumulátorba kerülő eredmény 0000 0011 = 03H

Az összeadó utasítás (ADD) bináris összeadást végez a forráshely és az akkumulátor tartalma között. A kivonó utasítás (SUB) hatására bináris kivonás történik. Az összeadás átvitellel ill. kivonás áthozattal (ADC ill. SBC) utasítások elején a carry flag értéke is hozzáadódik ill. kivonódik az akkumulátor tartalmából. A flagek és a decimális korrekciós utasítás (DAA) lehetővé teszi aritmetikai műveletek végzését

A csoport további utasításai a logikai és (AND), logikai vagy (OR), kizáró vagy (XOR) és az összehasonlító utasítás (CP).
Az 5.3-7 ábrán felsorolt 5 utasítás az akkumulátorra és a carry flag-re vonatkozik. A decimális korrekciós utasítás összeadás és kivonás korrigálására is használható. Ez a művelet az "N flag-et" használja. Ez a flag akkor áll egybe, ha az utolsó aritmetikai művelet kivonás volt. Az akkumulátor negáló utasítás (NEG) az akkumulátor tartalmának kettes komplemensét képezi. Végezetül meg kell jegyeznünk, hogy a "carry bit" nullába állítására nincs Z80-as utasítás, más utasítások felhasználásával a művelet könnyen elvégezhető (pl. AND A).

Decimal Adjust Acc. 'DAA'
27
Complement Acc. 'CPL'
2F
Negate Acc. 'NEG'
(2's complement)
ED
44
Complement Carry Flag, 'CCF'
3F
Set Carry Flag, 'SCF'
37

5.3-7 táblázat

Az 5.3-8 táblázatban a 16 bites regiszterek között végezhető 16 bites aritmetikai utasításokat soroltuk fel. Az ADC és SBC utasítások állítják be a flag-eket. Felhasználhatók cím számításra és egyéb 16 bites aritmetikai műveletekhez.

 
Source
BC
DE
HL
SP
IX
IY
'ADD'
HL
D9
19
29
30
   
IX
DD
09
DD
19
 
DD
39
DD
29
 
IY
FD
09
FD
19
 
FD
39
 
FD
29
ADD WIDTH CARRY AND SET FLAGS 'ADC'
HL
ED
4A
ED
5A
ED
6A
ED
7A
   
SUB WITH CARRY AND SET FLAGS 'SBC'
HL
ED
42
ED
52
ED
62
ED
72
   
INCREMENT 'INC'
03
13
23
33
DD
23
FD
23
DECREMENT 'DEC'
08
18
28
38

DD
2B

FD
2B

5.3-8 táblázat

Rotáló és léptető utasítások
A Z80 képes az akkumulátorban, bármely általános célú regiszterben ill. memóriahelyen lévő adat rotálására vagy léptetésére. Az utasításcsoport utasításkódjait az 5.3-9 táblázat tartalmazza. Vannak
aritmetikai és logikai léptető műveletek. Ez az utasításcsoport széles alkalmazási területen bizonyul hasznosnak (pl. egész számok szorzása, osztása). Két BCD számjegy rotáló utasítás (RRD és RLD) lehetővé teszi az akkumulátorban lévő egy BCD digit és a HL-el címzett memóriahelyen lévő két BCD digit közötti rotálási művelet végzését.
Az utasítások hatásos BCD aritmetika megvalósítását teszik lehetővé.

 
A
B
C
D
E
H
L
(HL)
(IX+d)
(IY+d)
TYPE OF
ROTATE
OR SHIFT
'RLC'
C8
07
C8
00
C8
01
C8
02
C8
03
C8
04
C8
05
C8
06
DD
C8
d
06
FD
C8
d
06
'RRC'
C8
0F
C8
08
C8
09
C8
0A
C8
0B
C8
0C
C8
0D
C8
0E
DD
C8
d
0E
FD
C8
d
0E
'RL'
C8
17
C8
10
C8
11
C8
12
C8
13
C8
14
C8
15
C8
16
DD
C8
d
16
FD
C8
d
16
'RR'
C8
1F
C8
18
C8
19
C8
1A
C8
1B
C8
1C
C8
1D
C8
1E
DD
C8
d
1E
FD
C8
d
1E
'SLA'
C8
27
C8
20
C8
21
C8
22
C8
23
C8
24
C8
25
C8
26
DD
C8
d
26
FD
C8
d
26
'SRA'
C8
2F
C8
28
C8
29
C8
2A
C8
2B
C8
2C
C8
2D
C8
2E
DD
C8
d
2E
FD
C8
d
2E
'SRL'
C8
3F
C8
38
C8
39
C8
3A
C8
3B
C8
3C
C8
3D
C8
3E
DD
C8
d
3E
FD
C8
d
3E
'RLD'              

ED
0F

   
'RRD'              
ED
67
   

 

 
A
RLCA
07
RRCA
0F
RLA
17
RRA
1F

5.3-9 táblázat

Bit kezelő utasítások
Szinte minden programban szükség van bitek 1-be, ill. 0-ba állítására és tesztelésre. A bitek lehetnek általános célú software rutinok flag-jei, külső vezérlési feltétel jelzők, vagy helytakarékosság miatt a memóriában kötegelt formában elhelyezkedő adatok.
A Z80 processzor utasításkészlete lehetővé teszi az akkumulátor, bármely általános célú regiszter vagy bármely memóriahely tetszőleges bitjének 1-be (set) ill. 0-ba (reset) állítását vagy tesztelését. A fenti célokra szolgáló 240 utasítást az 5.3-10 táblázatban soroltuk fel. A regiszteres címzési módban a cél operandus lehet az akkumulátor vagy bármely általános célú regiszter. Regiszter indirekt és indexelt címzési módon érhető el a külső memóriában lévő bitek. A bit teszt művelet a zérus flag-et állítja egybe, ha a tesztelt bit zérus.

BIT
REGISTER ADDRESSING
REG
INDIR.
INDEXED
A
B
C
D
E
H
L
(HL)
(IX+d)
(IY+D)
TEST
'BIT'
0
CB
47
CB
40
CB
41
CB
42
CB
43
CB
44
CB
45
CB
46
DD
CB
d
46
FD
CB
d
46
1
CB
4F
CB
48
CB
49
CB
4A
CB
4B
CB
4C
CB
4D
CB
4E
DD
CB
d
4E
FD
CB
d
4E
2
CB
57
CB
50
CB
51
CB
52
CB
53
CB
54
CB
55
CB
56
DD
CB
d
56
FD
CB
d
56
3
CB
5F
CB
58
CB
59
CB
5A
CB
5B
CB
4C
CB
5D
CB
5E
DD
CB
d
5E
FD
CB
d
5E
4
CB
67
CB
60
CB
61
CB
62
CB
63
CB
64
CB
65
CB
66
DD
CB
d
66
FD
CB
d
66
5
CB
6F
CB
68
CB
69
CB
6A
CB
6B
CB
6C
CB
6D
CB
6E
DD
CB
d
6E
FD
CB
d
6E
6
CB
77
CB
70
CB
71
CB
72
CB
73
CB
74
CB
75
CB
76
DD
CB
d
76
FD
CB
d
76
7
CB
7F
CB
78
CB
79
CB
7A
CB
7B
CB
7C
CB
7D
CB
7E
DD
CB
d
7E
FD
CB
d
7E
RESET
BIT
'RES'
0
CB
87
CB
80
CB
81
CB
82
CB
83
CB
84
CB
85
CB
86
DD
CB
d
86
FD
CB
d
86
1
CB
8F
CB
88
CB
89
CB
8A
CB
8B
CB
8C
CB
8D
CB
8E
DD
CB
d
8E
FD
CB
d
8E
2
CB
97
CB
90
CB
91
CB
92
CB
93
CB
94
CB
95
CB
96
DD
CB
d
96
FD
CB
d
96
3
CB
9F
CB
98
CB
99
CB
9A
CB
9B
CB
9C
CB
9D
CB
9E
DD
CB
d
9E
FD
CB
d
9E
4
CB
A7
CB
A0
CB
A1
CB
A2
CB
A3
CB
A4
CB
A5
CB
A6
DD
CB
d
A6
FD
CB
d
A6
5
CB
AF
CB
A8
CB
A9
CB
AA
CB
AB
CB
AC
CB
AD
CB
AE
DD
CB
d
AE
FD
CB
d
AE
6
CB
B7
CB
B0
CB
B1
CB
B2
CB
B3
CB
B4
CB
B5
CB
B6
DD
CB
d
B6
FD
CB
d
B6
7
CB
B7
CB
B8
CB
B9
CB
BA
CB
BB
CB
BC
CB
BD
CB
BE
DD
CB
d
BE
FD
CB
d
BE
SET
BIT
'SET'
0
CB
C7
CB
C0
CB
C1
CB
C2
CB
C3
CB
C4
CB
C5
CB
C6
DD
CB
d
C6
FD
CB
d
C6
1
CB
CF
CB
C8
CB
C9
CB
CA
CB
CB
CB
CC
CB
CD
CB
CE
DD
CB
d
CE
FD
CB
d
CE
2
CB
D7
CB
D0
CB
D1
CB
D2
CB
D3
CB
D4
CB
D5
CB
D6
DD
CB
d
D6
FD
CB
d
D6
3
CB
DF
CB
D8
CB
D9
CB
DA
CB
DB
CB
DC
CB
DD
CB
DE
DD
CB
d
DE
FD
CB
d
DE
4
CB
E7
CB
E0
CB
E1
CB
E2
CB
E3
CB
E4
CB
E5
CB
E6
DD
CB
d
E6
FD
CB
d
E6
5
CB
EF
CB
E8
CB
E9
CB
EA
CB
EB
CB
EC
CB
ED
CB
EE
DD
CB
d
EE
FD
CB
d
EE
6
CB
F7
CB
F0
CB
F1
CB
F2
CB
F3
CB
F4
CB
F5
CB
F6
DD
CB
d
F6
FD
CB
d
F6
7
CB
FF
CB
F8
CB
F9
CB
FA
CB
FB
CB
FC
CB
FD
CB
FE
DD
CB
d
FE
FD
CB
d
FE

5.3-10 táblázat

A JUMP CALL és RETURN utasítások
A Z80 CPU-ban megva1ósitott JUMP, CALL és RETURN utasítások felsorolását az 5.3-11 táblázatban adtuk meg. A JUMP utasítás program elágazásra használható, mikoris a címszámlálót a három lehetséges címzési mód egyikével (közvetlen kiterjesztett, relatív vagy relatív indirekt) egy 16 bites adattal töltjük fel.

 
CONDITION
UN.
COND.
CARRY NON
CARRY
ZERO NON
ZERO
PARITY
EVEN
PARITY
OOD

SIGN
NEG

SIGN
POS
REG
JUMP 'JP' IMMED
EXT.
nn
C3
n
n
DA
n
n
D2
n
n
CA
n
n
C2
n
n
EA
n
n
E2
n
n
FA
n
n
F2
n
n
 
JUMP 'JR' RELATIVE PC+c
18
e-2
38
e-2
30
e-2
28
e-2
20
e-2
         
JUMP 'JP' REG
INDIR.
(HL)
E9
                 
JUMP 'JP' (IX)
DD
E9
                 
JUMP 'JP' (IY)
FD
E9
                 
'CALL' IMMED
EXT.
nn
CD
n
n
DC
n
n
D4
n
n
CC
n
n
C4
n
n
EC
n
n
E4
n
n
FC
n
n
F4
n
n
 
DECREMENT B JUMP IF NON ZERO 'DJNZ' RELATIVE PC+c                  
10
e-2
RETURN 'RET' REGISTER
INDIR.
(SP)
(SP+1)
C9
D8
D0
C8
C0
E8
E0
F8
F0
 
RETURN FROM INT 'RETI' REG.
INDIR.
(SP)
(SP+1)
ED
4D
                 
RETURN FROM NON MASKABLE INT 'RETN' REG.
INDIR.
(SP)
(SP+1)
ED
45
                 

5.3-11 táblázat

Léteznek feltétel nélküli és feltételes ugró utasítások. A feltételes ugró utasítások a feltétel fennállása esetén hajtódnak végre. Ha a feltétel nem áll fenn, a program a következő utasítással folytatódik. A feltételek teljesülését a flag regiszter bitjei jelzik. Közvetlen kiterjesztett címzéssel a memória bármely helyére el lehet ugrani. Ez az utasítás három byte-ot foglal el, melyből egy az utasításkód, kettő pedig a 16 bites ugrás cím (az ut.kód után először a cím alsó byte-ja, majd a felső byte-ja jön).
Példa: feltétel nélküli ugrás a 3E22H memóriahelyre JP 3E22H

Adress A C3 utasítás kód
  A+1 22 cím alsó byte
  A+2 3E cím felső byte

A relatív ugró utasítás két byte-ot foglal el, melyből a második byte előjeles kettes komplemensben ábrázolt szám, a fennálló PC-hez képesti relatív ugrás távolsága. Relatív ugrással max. a műveleti kód előtti 126 és az azutáni 129 byte érhető el.

A Z80 CPU-ban három különböző regiszter indirekt JUMP utasítást is implementáltak. Ezek az utasítások a HL vagy valamelyik index regiszter (IX vagy IY) tartalmát töltik a PC-be. Ez lehetővé teszi, hogy az ugrás helyét az előző számítások függvényeként adhassuk meg.
A CALL utasítás az ugró utasítás egy speciális fajtájának tekinthető. A CALL utasítás végrehajtása során az ugrás végrehajtása előtt a processzor a stack tetejére teszi a CALL-t követő utasítás címét. A RETURN utasítás a CALL ellentéte. A RETURN utasítás végrehajtásakor a stack tetejének tartalma a PC-be töltődik, ez adja az ugráscímet. A CALL és RETURN utasítások egyszerű szubrutin és interrupt kezelést tesznek lehetővé. A Z80 CPU-nak két speciális RETURN utasítása van a RETI (megszakításból való visszatérés) és a RETN (nem maszkolható megszakításból való visszatérés).
A CPU ezeket az utasításkódokat a C9H ut.kódú utasításhoz hasonlóan feltétel nélküli visszatérő (RETURN) utasításnak értelmezi. A kettő között azonban van különbség. A RETI utasítást megszakítást kiszolgáló rutinok végén használjuk. Ezt az utasítást felismerik a Z80 periféria elemek és felhasználják a többszörös mélységű megszakítás kérések helyes kezelésére. Ha nem lenne a RETI utasítás a következő programlépéseket kellene felhasználni arra, hogy a megszakítást kiszolgáló rutin végén a megszakítást kért eszközt értesítsük a megszakítás kiszolgálásának befejezéséről.

DI
LA A,n
OUT n,A
EI
RET
- megszakítás kérés elfogadásának letiltása
- a periféria eszköz értesítése a kiszolgáló rutin befejezéséről

- megszakítás kérés elfogadásának engedélyezése

A fenti hét byte-ot foglaló programot a három byte-ot foglaló EI RETI utasítások helyettesítik.

Programhurkok képzésére előnyösen használható a DJNZ utasítás. Ez a két byte-os relatív ugró utasítás dekrementálja a B regiszter tartalmát és csak akkor történik ugrás, ha a B regiszter tartalma nullázódott. A relatív ugráscímet kettes komplemens előjeles számként adjuk meg. Használatát a következő példán mutatjuk be:

Cím Utasítás Megjegyzés
N, N+1
N+2-től N+9-ig


N+10, N+11
N+12
LD B,7
.
.
.
DJNZ -10
.
.
B regiszterbe 7-et töltünk
A ciklus magja


Ugrás az N+2 címre
A következő utasítások

Az 5.3-12 táblázat a nyolc RST utasítás műveleti kódjait tartalmazza. Ezek az egy byte-os call utasítások gazdaságosan használhatók gyakran hívott rutinok aktivizálására.

  OP
CODE
 
C
A
L
L

A
D
R
E
S
S
0000h
C2
'RST '0'
0008h
CF
'RST '8'
0010h
D7
'RST '16'
0018h
DF
'RST '24'
0020h
E7
'RST '32'
0028h
EF
'RST '40'
0030h
F7
'RST '48'
0038h
FF
'RST '56'

5.3-12 táblázat

Input/Output utasítások
A Z80 számos input és output utasítással rendelkezik, melyeket az 5.3-13 és 5.3-14 táblázatokban soroltunk fel.
A bemeneti vagy kimeneti periféria címzése történhet közvetlen, vagy a C regisztert használó regiszter indirekt címzési móddal. A regiszter indirekt címzési módot használva bármely általános célú belső regiszter és külső periféria között megvalósítható adatátvitel.

  PORT ADRESS
n
(C)
INPUT
DEST.
INPUT 'IN'
R
E
G

A
D
D
R
E
S
S
I
N
G
A  
ED
78
B  
ED
40
C  
ED
48
D  
ED
50
E  
ED
58
H  
ED
60
L  
ED
68
'INI' - INPUT & Inc HL, Dec B REG.
INDIR
(HL)  
ED
A2
'INIR' - INP, Inc HL, Dec B,
REPEAT IF B<>0
 
ED
B2
'IND' - INPUT, & Dec HL, Dec B  
ED
AA
'INDIR' - INPUT, Dec HL, Dec B, REPEAT IF B<>0  
ED
BA

5.3-13 táblázat

Továbbá van 8 blokk mozgató utasítás is, melyek a memória blokk mozgató utasításaihoz hasonlóak. Ezek az utasítások a HL regiszterrel címzik a memóriát, a B regisztert pedig byte számlálónak használják. A C regiszter tartalmazza a port címét. Mivel a B regiszter 8 bites, 256 byte hosszúságú adatblokkok mozgatása valósítható meg egyetlen utasítással.

Az IN A,n és OUT n,A utasítások végrehajtásakor az "n" periféria-cím a címbusz alsó felén jelenik meg (A0-A7), miközben az akkumulátor tartalma megjelenik a címbusz felső felén. Minden regiszter indirekt címzéssel végzett input/output utasításnál, beleértve a blokkmozgató utasításokat is, a C regiszter tartalma a címbusz alsó felén, a B regiszter tartalma a címbusz felső felén jelenik meg.

 
PORT
DESTINATION
ADRESS
SOURCE
REGISTER
REG
IND.
A
B
C
D
E
H
L
(HL)
  'OUT' IMMED. n
D3
n
             
REG.
IND.
(C)
ED
79
ED
41
ED
49
ED
51
ED
59
ED
61
ED
69
 
BLOCK
OUTPUT
COMMANDS
'OUTI'
OUTPUTm Inc HL, Dec B
REG.
IND.
(C)              
ED
A3
'OTIR'
OUTPUT, Inc HL, Dec B, REPEAT IF B<>0
REG.
IND.
(C)              
ED
AB
'OTD'
OUTPUT,Dec HL & B
REG.
IND.
(C)              
ED
79
'OTDR'
OUTPUT, Dec HL & REPEAT IF B<>0
REG.
IND.
(C)              
ED
BB

5.3-14 táblázat

CPU vezérlő utasítások
Az 5.3-15 táblázatban a hat CPU vezérlő utasítást soroltuk fel. A NOP üres utasítás. A HALT utasítás megszakítás kérés érkezéséig felfüggeszti a CPU működését. A DI és EI a megszakítás kérés kiszolgálás tiltására, illetve engedélyezésére szolgálnak.
A megszakításos működés üzemmódjainak beállítására három utasítás szolgál a három üzemmódnak megfelelően:

'NOP'
00
 
'HALT'
76
 
'DISABLE INT 'DI'
F3
 
ENABLE INT 'EI'
FB
 
SET INT MODE 0
'IM0'
ED
46
8080A MODE
SET INT MODE 1
'IM1'
ED
56
CALL TO LOCATION 0038H
SET INT MODE 2
'IM2'
ED
5E
INDIRECT CALL USING REGISTER I AND 8 BITS FROM INTERRUPTING DEVICE AS A POINTER.

5.3-15 táblázat

6. A FLAG-ek

A Z80 mindkét flag regisztere egyenként 6 bit információt tartalmaz, melyek állapotát a művelet eredménye állítja be. A 6 flag bit közül 4 tesztelhető, azaz a feltételes ugró, szubrutin hívó és return utasítások feltételét szolgáltatják, például akkor történik ugrás, ha a flag regiszter bizonyos bitje 1-ben áll. A négy tesztelhető flag bit a következő:

  1. Átvitel flag (Carry Flag - C). Ez a flag az akkumulátor legmagasabb helyértékű bitjéről történő átvitel képzést jelzi. Például az átvitel flag-et 1-be állítja egy összeadó utasítás, ha az akkumulátor legfelső helyértékű bitjéről átvitel történik. Ugyancsak ezt a flag-et állítja be a kivonó utasítás végrehajtásakor keletkező áthozatal. A léptető és rotáló utasítások szintén hatnak a flag-re.
  2. A zérus flag (Zero - Z) - Ez a flag regiszter akkor áll 1-be, ha a művelet eredményeképpen az akkumulátor tartalma nullázódott.
  3. Előjel flag (Sign Flag - S). A flag-nek előjeles számokkal való műveleteknél van jelentősége, és akkor áll 1-be, ha művelet eredménye negatív. Mivel a legmagasabb helyértékű bit, a 7-es bit jelzi a szám előjelét, ez a flag az akkumulátor 7-es bitjének tartalmát tárolja.
  4. Paritás / túlcsordulás flag (Parity / Overflow-P/V). Ez a kettős feladatú flag logikai műveletek után az akkumulátor tartalmának paritását, kettes komplemens előjeles számmal végzett aritmetikai műveletek esetén pedig túlcsordulást jelez. A túlcsordulás azt jelenti, hogy az akkumulátorban lévő 2-es komplemensben ábrázolt szám hibás, mert az aritmetikai művelet eredményeképpen a számábrázolási tartománybál kieső eredmény keletkezett. (A számábrázolási tartományba a -128-nél nagyobb és a +127 kisebb számok férnek bele.) Például tekintsük a következő összeadást:
+120 =
0111 1000  
+105 =
0110 1001  
C=0
1110 0001 = -31 rossz eredmény (túlcsordulás keletkezik)

A fenti példában carry bit nincs, a hibát a P/V flag jelzi, ami ebben az esetben 1-be állítódik.
Tekintsük a következő két negatív szám összeadását:

-5 =
1111 1011  
-16 =
1111 0000  
C=1
1110 1011 = -21 helyes eredmény

Az eredmény helyes, az átvitel flag 1-ben van, így tehát nem használható túlcsordulás jelzőként.
Logikai műveletek végzésekor (AND, OR, XOR) a flag 1-be áll, ha az eredmény páros és 0-ba, ha az eredmény páratlan. A flag regiszter tartalmaz két nem tesztelhető bitet is. Ezek:

  1. Fél átvitel (Half Carry - H). BCD számokon végzett műveleteknél a 3. bitről a 4. bitre történő átvitel keletkezését jelzi. A DAA (Decimal Adjust Instruction) ezt a flag-et használja pakolt decimális számokon végzett összeadás, illetve kivonás eredményének korrigálására.
  2. Összeadás /kivonás flag (N) - Mivel a decimális korrekció más algoritmus szerint történik összeadásra, illetve kivonásra, ez a flag jelzi, hogy a DAA utasítás előtt végrehajtott művelet összeadás vagy kivonás volt-e.

A programozó számára hozzáférhető flag regiszter a következő formátumú:

D7
           
D0
S
Z
X
H
X
P/V
N
C

X határozatlan állapotot jelöl.

A 6.0-1 ábrán felsoroljuk, hogyan hatnak az egyes CPU utasítások a flag-ekre. A táblázatban használt rövidítések magyarázata:

-
- az utasítás nem változtatja meg a flag-et
X
- a flag határozatlan állapotba kerül
0
- a flag 0-ba áll (reset)
1
- a flag 1-be áll (set)
!
- azt jelöli, hogy az utasítás milyen állapotba állítja a flag-et az utasítás eredményétől függően.

A táblázatban nem szereplő utasítások nincsenek hatással a flagekre.

 
D7
           
D0
 
Instructtion
S
Z
 
H
 
V
N
C
Comments
ADD A,s; ADC A,s
!
!
X
!
X
V
0
!
8-bit add or add with cary
SUB,s; SBCA,s; CP,s; NEG
!
!
X
!
X
V
1
!
8 bit subtract, subtract with carry, compare and negate accumulator
AND s
!
!
X
1
X
P
0
0
Logical operations
OR s; XOR s
!
!
X
0
X
P
0
0
INC s
!
!
X
!
X
V
0
-
8-bit increment
DEC s
!
!
X
!
X
V
1
-
8-bit decrement
ADD DD,SS
-
-
X
X
X
-
0
!
16-bit add
ADC HL,SS
!
!
X
X
X
V
0
!
16-bit add with carry
SBC HL,SS
!
!
X
X
X
V
1
!
16-bit subtract with carry
RLA; RLCA; RRA; RRCA
-
-
X
0
X
-
0
!
Rotate accumulator
RL s; RLC s; RR s; RRC s;
SLA s; SRA s; SRL s
!
!
X
0
X
P
0
!
Rotate and shift locations
RLD; RRD
!
!
X
0
X
P
0
-
Rotate digit left and right
DAA
!
!
X
!
X
P
-
!
Decimal adjust accumulator
CPL
-
-
X
1
X
-
1
-
Complement accumulator
SCF
-
-
X
0
X
-
0
1
Set carry
CCF
0
0
X
X
X
0
1
!
Complement carry
IN r,(C)
!
!
X
0
X
P
0
-
Input register indirect
INI; IND; OUTI; OUTD
X
!
X
X
X
X
1
X
Block input and output
Z=0 if B<> otherwise Z=1
INIR; INDR; OTIR; OTDR
X
1
X
X
X
X
1
X
LDI; LDD
X
X
X
0
X
!
0
-
Block transfer instructions
P/V=1 if B<>0 otherwise P/V=0
LDIR; LDDR
X
X
X
0
X
0
0
-
CPI; CPIR; CPD; CPDR
!
!
X
!
X
!
1
-
Block search instructions
  Z=1 if A=(HL), otherwise Z=0
  P/V=1 if BC<>0, otherwise P/V=0
LD A,I; LD A,R
!
!
X
0
X
IFF
0
-
The content of the interrupt enable flip-flop (IFF) is copied into the P/V flag
BIT b,s
X
!
X
1
X
X
0
-
The state of bit b of location s, is copied into the Z flag
C Carry / link flag. C=1 if the operation produces a carry from the MSB of the operand to result.
Z Zero flag. Z=1 if the result of the operation is zero.
S Sign flag. S=1 if the MSB of the result is one.
P/V Parity or owerflow flag. Parity (P) and overflow (V) share the same flag. Logical operations affect this flag with the parity of the result while arithmetic operations affect this flag with the overflow of the result. If P/V holds parity, P/V=1 the result of the operation is even. P/V=0 if result is odd. If P/V holds overflow, P/V=1 if the result of the operations produced an overflow.
H Half-carry flag. H=1 if the add or subtract operation produced a carry into or borrow from bit 4 of the accumulator.
N Add / subbtract flag. N=1 if the previous subtract.
H and N flags are used in conjunction with the decimal adjust instruction (DAA) to property correct the result into packed BCD format folowing addition or subtraction using operands with packed BCD format. The flag is affected according to the result of the operation.
- The flag is unchanged by the operation
0 The flag is reset by the operation
1 The flag is set by the operation
X The flag is a "don't care".
V P/V flag affected according to the overflow result of the operation
P P/V flag affected according to the parity result of the operation.
r Any one of the CPU registers A, B, C, D, E, H, L
s Any 8-bit location for all the addressing modes allowed for the particular instruction.
ss Any 16-bit location for all the addressing modes allowed for that instruction.
ii Any one of the two index registers IX or IY
R Refresh counter
n 8-bit range (0, 255)
nn 16-bit value in range (0, 65535)

6.0-1 táblázat

A 6.0-l táblázatban szereplő néhány speciális eset az érthetőség kedvéért magyarázatra szorul. A blokk kereső utasítások 1-be állitják a Z flag-et, ha az utolsó összehasonlításban az akkumulátor tartalma megegyezett a cél operandussal. Ha a byte számláló (BC regiszterpár) nem nullázódott, a paritás flag is 1-be állítódik. A paritás flag a blokk mozgató utasitásoknál ugyanígy viselkedik. Egy másik speciális eset a blokkos periféria iró vagy olvasó utasításoknál áll fenn, melyeknél a Z flag a byte számlálónak használt B regiszter állapotát jelzi. Felhívjuk a figyelmet arra, hogy az I/O blokk transzfer befejezését a Z flag 0 állapota, míg a blokk mozgató utasítás befejezését a paritás flag 0 állapota jelzi. Az utolsó speciális eset akkor áll elő, mikor a "refresh'' vagy I regiszter tartalmát az akkumulátorba töltjük. Ekkor a megszakitás engedélyező flip-flop tartalma a paritás flag-be töltődik, tehát a CPU teljes állapota tetszőleges időpontban elmenthető.

7. Az utasításkódok és utasítás végrehajtási idők összefoglalása

Ebben a fejezetben megadjuk a Z80 utasításkészletének összefoglalását. A 7.0-1-től 7.0-11-ig terjedő táblázatokban az utasításokat logikailag csoportosítottuk. A táblázatok megadják az assembly nyelvű mnemonikot, az aktuális utasításkódot, a művelet szimbolikus leírását, az utasítás végrehajtása után a regiszterek tartalmait, az utasítás, valamint az egyes utasítások lehívásához és végrehajtásához szükséges órajel ütemek és memória ciklusok számát.

7.0-1 táblázat: 8-bit load group
7.0-2 táblázat: 16-bit load group
7.0-3 táblázat: Exchange group and block transfer and search group
7.0-4 táblázat: 8-bit arithmetic and logical group
7.0-5 táblázat: General purpose arithmetic and CPU control groups
7.0-6 táblázat: 16-bit arithmetic group
7.0-7 táblázat: Rotate and shift group
7.0-8 táblázat: Bit set, reset and test group
7.0-9 táblázat: Jump group
7.0-10 táblázat: Call and return group
7.0-11 táblázat: Input and output group

8. Programmegszakításos működés (interrupt)

Az interrupt lehetővé teszi periféria eszközök számára a CPU rendes működésének felfüggesztését és a periféria kiszolgáló rutin elindítását. Ez a kiszolgáló rutin rendszerint adat vagy statusz és kontrol információ cseréjét végzi a CPU és a periféria között. A kiszolgáló rutin lefutása után a CPU ott folytatja a működését, ahol azt a megszakításkor abbahagyta.

Megszakítás engedélyezés - tiltás
A Z80-nak két interrupt bemenete van: egy software-rel maszkolható és egy nem maszkolható interrupt bemenete.
A nem maszkolható interrupt bemeneten érkező megszakítás kérést (NMI) mindig elfogadja a processzor. Ez a megszakítási mód rendszerint nagyon fontos események számára van fenntartva, pl. tápfeszültség kimaradás. A maszkolható interrupt elfogadása software-ből engedélyezhető vagy tiltható. Ez lehetővé teszi a programozó számára, hogy letiltsa a megszakítás kérés elfogadását, ha egy bizonyos programrész megszakítása - pl. időtényező miatt- nem kívánatos.
A Z80 CPU-ban ténylegesen két megazakítás engedélyező flip-flop van: IFF1 és IFF2.

IFF1
Ténylegesen tiltja a megszakítás kérés elfogadását
IFF2
Az IFF1 tartalmának átmeneti tárolására szolgál

IFF2 szerepét a soron következő részben magyarázzuk meg.
A CPU reset-elésekor IFF1 és IFF2 is alapállapotba kerül, azaz a megszakítás kérés elfogadása tiltott. A megszakítás kérés elfogadását egy EI utasítással bármikor engedélyezheti a programozó. Az EI utasítás végrehajtása után a megszakítás kérés elfogadása előtt végrehajtódik az EI-t követő utasítás. Ez az egy utasításnyi késleltetés azok miatt az esetek miatt szükséges, mikor az EI-t követő utasítás RETURN utasítás és megszakítás kérés nem fogadható el a visszatérés befejezéséig. Az EI utasítás mindkét megszakítás engedélyező flip-flop-ot 1-be állítja, azaz engedélyezett állapotba hozza. Egy megszakítás kérés elfogadása után a CPU automatikusan nullázza mindkét flip-flopot. Ezzel további megszakítás kérések elfogadását megtiltja, míg a programozó ezt egy újabb EI utasítás kiadásával nem engedélyezi. Az előző esetekben IFF1 és IFF2 tartalma azonos volt.
IFF2 feladata IFF1 státuszának elmentése nem maszkolható megszakítás kérés érkezése esetén. Nem maszkolható megszakítás kérés elfogadásakor IFF1 reset-elődik, ezáltal megakadályozza további megszakítás kérések elfogadását, míg azt a programozó újból nem engedélyezi. Tehát nem maszkolható megszakítás kérés elfogadása után maszkolható interruptok elfogadása tiltott, de IFF1 előző állapota elmentődik úgy, hogy a CPU nem maszkolható megszakítás kérés előtti állapota bármikor visszaállítható. A LD A,I vagy a LD A,R utasítások végrehajtásakor IFF2 állapota a paritás flag-be másolódik, ezáltal tesztelhetővé válik.
IFF1 státuszának visszaállítására másik módszer a RETN (nem maszkolható interrupt-ból való visszatérés) utasítás végrehajtása. Mivel ezen utasítás végrehajtása azt jelzi, hogy a nem maszkolható megszakítás kérést kiszolgáló rutin lefutott, IFF2 tartalma visszamásolódik IFF1-be, tehát IFF1 állapota automatikusan visszaáll a nem maszkolható megszakítás kérés előtti állapotba.
A 8.0-l táblázatban a különböző utasítások IFF1 és IFF2 flip-flop-okra való hatásait foglaltuk össze.

Művelet
IFF1
IFF2
 
CPU reset
0
0
 
DI
0
0
 
EI
1
1
 
LD A,I
-
-
IFF2 P/V
LD A,R
-
-
IFF2 P/V
NMI elfogadás
0
-
 
RETN
IFF2
-
IFF2 IFF1
INT elfogadás
0
0
 
RETI
-
-
 

8.0-1 táblázat

A "-" azt jelöli, hogy nem történik állapot-változás.

A CPU megszakításos működése
Nem maszkolható megszakítás kérés

A CPU mindenkor elfogad nem maszkolható megszakítást. Ennek hatására a következő beolvasott utasítást figyelmen kívül hagyja és a 0066H cimre "restart" utasítást hajt végre. Pontosan úgy viselkedik, mintha "restart" utasítást hajtott volna végre, azzal a különbséggel, hogy nem a 8 software"restart" utasítás által elérhető címek egyikére ugrik.

Maszkolható megszakítás kérés
A CPU a következő programozható üzemmódokban képes maszkolható megszakítás kérések kiszolgálására.

A Z80 család periféria elemeiben megszakítási lánccal (Daisy chain) valósították meg a prioritás kezelést. Ezek a periféria elemek a CPU számára automatikusan szolgáltatják a beprogramozott vektort a megszakítás kérést nyugtázó ciklusban. (A Z80-PIO, Z80-CTC és Z80-SIO leírásában megtalálhatók a szükséges részletek.)

A programmegzsakítás kérés / elfogadás ciklus

A Z80 megszakítás interrupt elfogadásának összefoglalása:

  1. A periféria eszköz megszakítást kér. Az eszköz alacsony szintre húzza az INT bemenet huzalozott vagy logikával kialakított vonalát.
  2. A CPU válaszol az interrupt kérésre.
    Az interrupt elfogadási ciklusban M1 jel lefutó élére a prioritási státusz befagy. Az IEI / IEO megszakítási láncon a jel stabilizálódik mikorra IORQ lefutó éle megjelenik. Ha IEI = 1 egy aktív periféria megszakítás vektorát IORQ lefutó élére az adatbuszra helyezi. Majd a periféria elengedi az INT vonalat, ezáltal lehetővé teszi, hogy magasabb prioritású eszközök megszakítást kérhessenek. Az alacsonyabb prioritású eszközök azért nem helyezhetik megszakítás vektorukat az adatbuszra, mert IEO = 0.
  3. Az interrupt törlése.
    Az aktív periféria eszköz (IEI=1, IEO=0) figyeli a RETI utasítás kódjának beolvasását (ED 4D). Ennek megjelenése jelzi a periféria felé, hogy a megszakítást kiszolgáló rutin lefutott. A periféria eszköz ekkor újra aktivizálja a belső megszakítást kezelő hardware struktúrát és az IEO jel magas szintjével engedélyezi az alacsonyabb prioritású eszközök számára a megszakítás kérést.

Az INT, NMI és BUSRQ jelek kapcsolata
A következő folyamatábra a Z80 fenti három vezérlőjelének kapcsolatát részletezi:

  1. INT és NMI az utasítás végén hat mindig
  2. A BUSRQ jel egy gépi ciklus végén hat
  3. Ha a CPU DMA üzemmódban van, nem veszi figyelembe az INT és NMI jeleket
  4. A jelek prioritási sorrendje a következő: a. BUSRQ; b. NMI; c. INT.

9. Hardware tervezési példák

Jelen fejezet a Z80 CPU-val való tervezéshez kíván alapokat adni.

A minimális rendszer
A 9.0-1 ábrán egy nagyon egyszerű Z80-as rendszer látható. Minden Z80-as rendszernek tartalmaznia kell a következő öt elemet:

  1. 5V-os tápegység
  2. Oszcillátor
  3. Memória
  4. I/O eszközök
  5. CPU


9.0-1 ábra

Mivel a Z80 CPU csak egyetlen 5 V-os tápfeszültséget igényel, a legtöbb kis rendszer egyetlen tápegységgel realizálható. Az oszcillátor nagyon egyszerű felépítésű lehet, mivel az egyetlen követelmény amit teljesíteni kell az, hogy 5 V-os négyszögjelet szolgáltasson. Nem teljes sebességgel működő rendszerekben egyszerű RC oszcillátor használható. Ha a CPU működési sebességének felső határa közelében dolgozik, akkor kristály oszcillátort kell használni, mert a rendszer időzítések nem viselik el egy RC oszcillátor driftjét és jitterét. Kristály oszcillátor készíthető inverterek és néhány diszkrét komponens, vagy általánosan használt monolitikus oszcillátor áramkörök felhasználásával.
A külső memória tetszőlegesen felépíthető RAM, ROM vagy PROM áramkörökből. A bemutatott kis rendszer teljes memóriája 16 kbit ROM-ból áll. Feltételeztük, hogy a CPU belső regiszterei elegendő irható és olvasható tároló mezőt biztosítanak.
Minden számítógép rendszert a külső világhoz I/O egységek illesztenek. Példánkban feltételeztük, hogy a kimenet egy 8 bites vezérlő vektor és a bemenet egy 8 bites statusz szó. A példában a Z80 PIO áramkört használtuk. Ezzel valósítottunk meg 16 bites TTL kompatibilis I/O vonalat.

A rendszer bővítése RAM-mal
A legtöbb számítógép rendszerben adat és stack terület megvalósítására több- kevesebb külső RAM memóriára van szükség. A 9.0-2 ábrán bemutatjuk, hogyan bővíthető az előző példában bemutatott rendszer 256 byte RAM-mal.
Az ábrában a memória címeket hexadecimális számokkal adtuk meg. A bemutatott példában az A11-es cím bit választ a ROM ill. RAM mező között, azaz az A11-es címvonal "chip select" funkciót tölt be. Nagyobb ROM vagy RAM használata esetén egyszerű TTL dekóderekkel lehet ezt a funkciót megvalósítani.


9.0-2 ábra

A memória sebesség figyelembevétele
Számos területen a költségek csökkentése érdekében előnyös lenne lassú memóriák alkalmazása. A CPU WAIT vonala lehetővé teszi, hogy a Z80 bármilyen sebességű memóriával működhessen. A memória hozzáférési idejével szemben az Ml ciklus támaszt a legnagyobb követelményeket. Ezért bizonyos alkalmazásoknál azért, hogy lassú memóriákat lehessen használni, érdemes az M1 ciklusba egy WAIT állapotot beiktatni. A 9.0-3 ábrán ennek a feladatnak a megoldására mutatunk be egy áramkört. Kis változtatással az áramkör átalakítható úgy, hogy minden memória ciklusba beiktasson egy WAIT állapotot (9.0-4 ábra).


9.0-3 ábra


9.0-4 ábra

Dinamikus memóriák illesztése
Ebben a részben csak egészen röviden utalunk a dinamikus RAM memóriákkal kapcsolatos illesztési problémákra. Mivel a különböző RAM típusok specifikációi különböznek, ezért az alábbiakban közölteket adaptálni kell a megfelelő RAM típusra.
A 9.0-5 ábrán bemutatjuk a 16 kivezetéses 4 kbites dinamikus RAM tokokból felépített 8 kbyte RAM memória megvalósításához szükséges logikát.
Feltételeztük, hogy a rendszerben a RAM-on kívül nincs memória, tehát az A12 címvonal felhasználható a két memória lap közötti váltásra. A felfrissítési idő alatt a rendszerben lévő összes memóriát ki kell olvasni. A CPU az A0- A6 címvonalakon szolgáltatja a megfelelő frissítési címet. A memória bővítéséhez csupán az A12 vonalra csatlakozó két kapuáramkört kell a megfelelő bitekről meghajtott dekóderrel felcserélni. Nagyobb rendszerekben rendszerint szükséges a cím és adatvonalak pufferelése.

Tervezési szempontok: az órajel előállítása
A határsebességénél kisebb sebességgel működtetett CPU órajel bemenete meghajtható egy 7400 kapu TTL kimenetről, ha azt egy felhúzó ellenállással (tipikusan 330 ohm) a +5 V tápfeszültségre kötjük. A CLOCK bemenetbe befolyó dinamikus áram miatt a jel felfutási ideje 6o-8o ns lesz. Az ellenállás gyakorlatilag a tápfeszültségre felhúzza a kimenetet, csak a felfutási idő lesz lassú. A 9.0-6 ábrán látható órajel bemenetet meghajtó áramkör aktív felhúzó elemet tartalmaz, mely lehetővé teszi a maximális frekvenciájú működést. Az áramkör használatát minden Z80-as rendszerben ajánljuk.


9.0-6 ábra

"RESET" (nullázó) áramkör
A Z80 CPU-nak van egy olyan tulajdonsága, hogy ha RESET jel T2 vagy T4 órajel ciklusokban válik aktívvá, akkor az MREQ jel körülbelül három órajel periódussal később egy órajel periódusnyi időre határozatlan állapotba kerül. Ha a rendszerben dinamikus RAM-ok vannak a fenti jelenség adatvesztésre vezethet. Ha a RAM tartalom megóvás RESET után lényeges, a RESET bemenetet az M1 jel lefutó élével kell szinkronizálni.
A 9.0-7 ábrán látható áramkör megvalósítja ezt a szinkronizálást, valamint egy monoflop segítségével korlátozza a RESET pulzus idejét, ezáltal elkerülhető a dinamikus RAM adatvesztése a RESET alatt kimaradó frissítés miatt.


9.0-7 ábra

Cím átmeneti tárolása (Address latching)
A Z80 CPU-nak dinamikus memóriákkal való megfelelő működéséhez a címvonalak legfelső 4 bitjét tárolni kell (9.0-8 ábra). Erre azért van szükség, mert a Z80 CPU nem garantálja, hogy a cím buszon lévő érték utasításkód beolvasásakor MREQ jel felfutó éle előtt érvényes lesz.
Ez a hatás a dinamikus memóriákat nem közvetlenül érinti, mivel belső regiszterrel rendelkeznek. A problémát a RAS jelet generáló címdekóder okozza. Ha a dekódert meghajtó címvonalak MREQ alacsony szintje alatt megváltoznak, a RAS vonalon vagy vonalakon tüske jelenik meg, mely egy memória sor adatvesztésére vezethet.


9.0-8 ábra


9.0-9 ábra

10. Software példák

10.1 A Software implementálás módjai
A Z80 számára különböző módszerekkel lehet software-t fejleszteni (10.1 ábra). Forrásnyelvként assembly vagy magasszíntű nyelv használható. A gépi kóddá fordítás történhet kereszt assembler ill. kereszt kompiler felhasználásával, de elvégezhető a Z80-as fejlesztő rendszeren is rezidens assemblerrel. A gépi kódú program hibakeresésére és javítására time-sharing rendszeren futó Z80 szimulátor vagy a Z80 CPU-t használó Z80 fejlesztő rendszer segítségével történhet.


10.1 ábra

10.2. A Z80 CPU által biztosított software jellemzők
A Z80 sok utasításból álló flexibilis utasításrendszerrel rendelkezik. Az elsődleges, a kisegítő és az index regiszterek felhasználhatók aritmetikai vagy logikai műveletek argumentumainak tárolására, memória cím képzésre vagy gyakran használt adatok átmeneti tárolására.
Az információt közvetlenül lehet mozgatni regiszterből regiszterbe; memóriából memóriába; memóriából regiszterbe, vagy regiszterből memóriába. Továbbá lehetséges regiszter tartalmának felcserélése regiszter / memória tartalommal. Elsősorban az elsődleges és másodlagos regiszter készlet cserélhető fel teljesen az EX és EXX utasításokkal. Ezek a cserék a munkaregiszter csoportok megkülönböztetésére, valamint a hozzáférhető regiszterek bővítésére használhatók.
Regiszter párok és memória közötti adattranszfer LIFO alapon történik a PUSH és POP utasítások felhasználásával, melyek a speciális stack pointer regisztert használják. A stack használható adat tárolásra, valamint szubrutinok csatoló címének tárolására.
Az utasítások sorrendje hat különböző flag állapota alapján változtatható, melyek az aritmetikai, logikai és léptető, valamint komparáló utasítások eredményeképpen kapnak értékeket. A flag-et állító utasítás végrehajtása után feltételes JUMP vagy RETURN utasítás hajtható végre.
A CPU teljes logikai művelethalmazzal rendelkezik (AND, OR, XOR, CPL (NOR) és NEG - kettes komplemens). A Boole műveletek végrehajthatók az akkumulátor és 1 - a többi 8 bites regiszter, 2 - a memóriahelyek vagy 3 - közvetlen operandusok között.
Továbbá aritmetikai és logikai léptetés - mindkét irányba - alkalmazható bármely 8 bites regiszterre vagy bármely memória helyre. A "carry flag" résztvehet a műveletben vagy egyszerűen 1-be kerül a léptető utasítások által. Így lehetővé válik a léptetett eredmény tesztelése és egymáshoz kapcsolhatók a regiszter / regiszter vagy regiszter / memória.

10.3. Példák a speciális Z80-as utasítások használatára

A.
Tételezzük fel, hogy a memória "DATA" nevű helyén 737 byte hosszú string található és ezt át kívánjuk vinni a "BUFFER" névvel kezdődő memória területre. A program 11 byte-ot foglal és egy byte adat mozgatásához 21 órajel ciklus szükséges.

LD HL,DATA
LD DE,BUFFER
LD BC,737
LDIR
;start adress of data string
;start adress of target buffer
;lenght if data string
;move string - transfer memory
;pointed to by HL into memory
;location pointed to by DE increment
;HL abd DE, decrement BC process
;until BC=0

B.
Tételezzük fel, hogy a "DATA" helyen kezdődő stringet addig kell a "BUFFER" helyen kezdődő memóriaterületre áttölteni, amíg egy ASCII karaktert nem találunk. Tételezzük fel, hogy a string maximális hossza 132 karakter. A művelet a következőképpen hajtható végre. A program 19 byte hosszú.






LOOP:


END:
LD HL,DATA
LD DE,BUFFER
LD BC,132
LD a,'$'
CP (HL)
JR Z,END-$
LDI

JP DE,LOOP
;starting adress of data string
;starting adress of target buffer
;maximum string lenght
;string delimiter code
;compare memory contents with delimiter
;go to end if characters equal
;move character (HL) to (DE)
;increment HL and DE, decrement BC
;go to "LOOP" if more characters
;otherwise, fall through
;note: P/V flag is used
;to indicate that register BC was
;decremented to zero.

 

C.
Tételezzük fel, hogy egy 16 digites pakolt BCD formátumú decimális számot kell a 10.3 ábrán látható módon léptetni BCD szorzás vagy osztás megvalósításához. A művelet a következőképpen valósítható meg:

10.3 ábra




ROTAT:
LD HL,DATA
LD B,COUNT
XOR A
RLD

INC HL
DJNZ ROTAT-$
;adress of first byte
;shift count
;clear accumulator
;rotate left low order digit in ACC
;with digits in (HL)
;advance memory pointer
;decrement B and go to ROTAT if
;B is not zero, otherwise fall through

D.
Tételezzük fel, hogy egy számot kivonunk egy másikból és
a - mindkettő pakolt BCD formátumú, b - mindkettő azonos, de változó hosszúságúak és c - hogy az eredményt a kisebbítendő helyén kívánjuk tárolni. A művelet a következőképpen valósítható meg:





SUBDEC:
LD HL,ARG1
LD DE,ARG2
LD B,LENGHT
AND A
LD A,(DE)
SBC A,(HL)
DAA
LD (HL),A
INC HL
INC DE
DJNZ SUBDEC-$
;address of minuend
;address of subtrahend
;lenght of two arguments
;clear carry flag
;subtrahend to ACC
;subtrahend (HL) from ACC
;adjust result to decimal coded value
;store result
;advance memory pointers

;decrement B and go to "SUBDEC" if B
;not zero, otherwise fall through

10.4. Programozási példák

A.
A következő program egy számsort rendez növekvő sorrendbe a standard felcseréléssel rendező algoritmus felhasználásával.

LOC OBJ CODE STMT SOURCE STATEMENT  
    1
2
3
4
5
...
;Standard exchange (bubble sort routine)
;HL contains address of data
;C contains number of elements to be sorted
; (1 < C < 256)
;At exit: data sorted in ascending order
0000
0003
0005
0006
0007
000B
000E
000F
0012
0013
0015
0018
001B
001D
001F

0021
0023
0025

0026
0028

222600
CB84
41
05
DD2A2600
DD7E00
57
DD5E01
93
3008
DD7300
DD7201
CBC4
DD23
10EA

CB44
20DE
C9

23
24
25
26
27
28
29
30
31
32
33
34
35
36
37

39
40
41
42
43
44
45
SORT:
LOOP:



NEXT:







NOEX:





;
FLAG:
DATA:
LD (DATA),HL
RES FLAG,H
LD B,C
DEC B
LD IX,(DATA)
LD A,(IX+0)
LD D,A
LD E,(IX+1)
SUB E
JR NC,NOEX-$
LD (IX),E
LD (IX+1),D
SET FLAG H
INC IX
DJNZ NEXT-$

BIT FLAG,H
JR NZ,LOOP-$
RET

EQU 0
DEFS 2
END
;save data adress
;initialize exchange flag
;initialize lenght counter
;adjust for testing
;initialize array pointer
;first element in comparison
;temporary storage for element
;second element in comparsion
;comparsion first to second
;if first > sacond, no jump
;exchange array elements

;record exchange occurred
;point to next data element
;count number of comparisons
;repeat if more data pairs
;determine if exchange occurred
;continue if data unsorted
;otherwise exit

;designation of flag bit
;storage for data address

B.
A következő program összeszoroz két előjel nélküli egész számot és az eredményt a HL regiszterpárban hagyja.

LOC OBJ CODE STMT SOURCE STATEMENT  
    1
2
3
4
5
...

;unsigned sixteen bit integer multiply.
;on entrance:
; multiplier in HL
; multiplicand in DE.
;on exit: result in HL

0000
0002
0003
0004
0005
0008
000A

000B
000D

000E
000F
0010
0011
0013

0610
4A
7B
EB
210000
CB39
1F

3001
19

EB
29
EB
10F5
C9

18
19
20
21
22
23
24

26
27

29
30
31
32
33
34





MLOOP:





NOADD:
LD B,16
LD C,D
LD A,E
EX DE,HL
LF HL,0
SRL C
RR A

JR NC ,NOADD-$
ADD HL,DE

EX DE,HL
ADD HL,HL
EX DE,HL
DJNZ MLOOP-$
RET
END
;number if bits-initialize
;move muliplier
;
;move multiplicand
;clear parital result
;shift multiplier right
;least significant bit is
;in carry
;if no carry skip the ADD
;else add multiplicand to
;parital result.
;shift multiplicant left
;by multiplying it by two

;repeat until no more bits

11. Elektromos specifikációk

Abszolút igénybevételi határok:
(Az abszolút igénybevételi határok túllépése az eszköz maradandó meghibásodását okozhatja.)

Működési hőmérséklet: 0 C - 70 C
Tárolási hőmérséklet: -65 C - +150 C-ig
A kivezetésekre adható feszültség a földhöz képest: -0,3V - 7V-ig

Teljesítmény disszipáció:

1,5 W

11.0-1 táblázat: D.C. Characterics
11.0-2 táblázat: A.C. Characterics 1/1.
11.0-3 táblázat: A.C. Characterics 1/2.
11.0-4 táblázat: A.C. Characterics 2/1.
11.0-5 táblázat: A.C. Characterics 1/2.
11.0-6 táblázat: A.C. Timing diagram

12. A Z80 utasításainak felbontása gépi ciklusokra

Ebben a fejezetben bemutatjuk a Z80 valamennyi utasításának gépi ciklusokra és a megfelelő órajel ciklusokra való felbontását. A különböző standard gépi ciklusok leírását a 4. fejezet tartalmazza. A táblázat lehetővé teszi, hogy a tervező megjósolhassa, mit fog csinálni a Z80 az utasítások végrehajtása során az egyes gépi ciklusokban és órajel ciklusokban.
Az utasítások ugyanabban a sorrendben vannak felsorolva, mint a 7. fejezet táblázataiban.

Rövidítések:
IO - Internal CPU Operation belső CPU működés
MR - Memory Read memória olvasás
MRH - Memory Read of High Byte memória olvasás felső byte-ból
MRL - Memory Read of Low Byte memória olvasás alsó byte-ból
MW - Memory Write memória írás
MWH - Memory Write of High Byte memória írás felső byte-ba
MWL - Memory Write of Low Byte memória írás alsó byte-ba
OCF - Op Code Fetch utasítás kód lehívás
ODH - Operand Data of High Byte operandus felső byte-jának olvasása
ODL - Operand Data Read of Low Byte operandus alsó byte-jának olvasása
PR - Port Read port olvasás
PW - Port Write port írás
SRH - Stack Read of High Byte felső byte olvasása stack-ből
SRL - Stack Read of Low Byte alsó byte olvasása stack-ből
SWH - Stack Write of High Byte felső byte írása stack-be
SWL - Stack Write of Low Byte alsó byte írása stack-be
( ) - Number of T-states in that Machine Cycle a gépi cikluson belüli T állapotok száma
OD - Operand Data Read egy byte-os operandus olvasás
INTA - Interrupt Acknowledge megszakítás nyugtázás

12.0-1 táblázat
12.0-2 táblázat
12.0-3 táblázat
12.0-4 táblázat
12.0-5 táblázat

Ordering information

Part NO.
Package Type
Max Clock
Frequency
Temperature range
MK3880N Z80-CPU
Plastic
2,5 MHz
0C to +70C
MK3880P Z80-CPU
Ceramic
2,5 MHz
MK3880J Z80-CPU
Cerdip
2,5 MHz
MK3880N-4 Z80-CPU
Plastic
4,0 MHz
MK3880P-4 Z80-CPU
Ceramic
4,0 MHz
MK3880J-4 Z80-CPU
Cerdip
4,0 MHz
MK3880P-10 Z80-CPU
Ceramic
2,5 MHz
-40C to +85C

Vissza a Spectrum könyvekhez

Vissza az Enterprise könyvekhez