Zilog Z80 - Zilog Z80

Zilog Z80
Zilog Z80.jpg
Ein Z80, hergestellt im Juni 1976 laut Datumsstempel
Allgemeine Information
Gestartet März 1976
Entworfen von Federico Faggin, Masatoshi Shima
Gängige Hersteller
Leistung
max. CPU- Taktrate 2,5, 4, 6, 8 MHz bis 10 MHz mit CMOS-Variante bis 20 MHz und binärkompatiblen Derivaten (von Zilog) bis 33 und 50 MHz.
Datenbreite 8 Bit
Adressbreite 16 Bit
Physikalische Spezifikationen
Transistoren
Pakete)
Steckdosen)
Die Pinbelegung des originalen DIP40-Chippakets des Z80

Der Z80 ist ein 8-Bit- Mikroprozessor , der von Zilog als erstes Produkt des Startup-Unternehmens eingeführt wurde . Der Z80 wurde Ende 1974 von Federico Faggin konzipiert und ab Anfang 1975 von ihm und seinen 11 Mitarbeitern entwickelt. Die ersten Arbeitsmuster wurden im März 1976 ausgeliefert und im Juli 1976 offiziell auf den Markt gebracht Z80 baute das Unternehmen eigene Chipfabriken auf und wuchs in den folgenden zwei Jahren auf über tausend Mitarbeiter an.

Der Zilog Z80 ist eine softwarekompatible Erweiterung und Weiterentwicklung des Intel 8080 und richtete sich wie dieser hauptsächlich an eingebettete Systeme . Obwohl die Z80 in dieser Funktion verwendet wurde, wurde sie von den 1970er bis Mitte der 1980er Jahre auch zu einer der am häufigsten verwendeten CPUs in Desktop-Computern und Heimcomputern . Es war auch bei militärischen Anwendungen, Musikgeräten wie Synthesizern (wie dem Roland Jupiter-8 ) und münzbetriebenen Arcade-Spielen der späten 1970er und frühen 1980er Jahre einschließlich Pac-Man üblich .

Zilog lizenzierte den Z80 an die US-amerikanischen Synertek und Mostek , die ihnen bei der Erstproduktion geholfen hatten, sowie an einen europäischen Second-Source- Hersteller, SGS . Das Design wurde auch von mehreren japanischen, osteuropäischen und sowjetischen Herstellern kopiert. Dies gewann die Akzeptanz des Z80 auf dem Weltmarkt, da große Unternehmen wie NEC , Toshiba , Sharp und Hitachi mit der Herstellung des Geräts (oder ihrer eigenen Z80-kompatiblen Klone oder Designs) begannen.

In der letzten Jahrzehnten Zilog auf dem stetig wachsenden Markt für Embedded - Systeme und die neueste Z80-kompatible neu ausgerichtet hat Mikrocontroller - Familie, die vollständig pipeline 24-Bit eZ80 mit einem linearen 16  MB Adressbereich wurde neben der einfacheren Z80 und erfolgreich eingeführt Z180 Produkte.

Geschichte

Eine Werbung vom Mai 1976 für den Zilog Z-80 8-Bit-Mikroprozessor
Foto des ursprünglichen Zilog Z80- Mikroprozessordesigns in Depletion-Load- nMOS. Insgesamt sterben Größe ist 3545 × 3350 & mgr; m. (Dieser tatsächliche Chip wurde 1990 hergestellt.)
Ein CMOS Z80 in einem Quad-Flat-Paket

Das Z80 entstand, als der Physiker und Ingenieur Federico Faggin Ende 1974 Intel verließ , um mit Ralph Ungermann  [ it ] Zilog zu gründen . Bei Fairchild Semiconductor und später bei Intel arbeitete Faggin an grundlegenden Technologien zur Herstellung von Transistoren und Halbleitern . Er entwickelte auch die grundlegende Designmethodik für Speicher und Mikroprozessoren bei Intel und leitete die Arbeit am Intel 4004 , dem 8080 und mehreren anderen ICs. Masatoshi Shima , der hauptsächliche Logik- und Transistor-Level-Designer des 4004 und des 8080 unter der Leitung von Faggin, trat dem Zilog-Team bei.

Laut den Designern waren die Hauptziele der Z80-CPU (und ihrer optionalen Unterstützungs- und Peripherie-ICs) Produkte wie intelligente Terminals , High-End-Drucker und fortschrittliche Registrierkassen sowie Telekommunikationsgeräte , Industrieroboter und andere Arten von Automatisierungsgeräten .

Bis März 1976 hatte Zilog für seine Kunden den Z80 sowie ein dazugehöriges Assembler- basiertes Entwicklungssystem entwickelt und im Juli 1976 offiziell auf den Markt gebracht. Einige der Z80-Unterstützungs- und Peripherie-ICs befanden sich zu diesem Zeitpunkt in der Entwicklung, und viele davon wurden im folgenden Jahr eingeführt.

Frühe Z80s wurden von Synertek und Mostek hergestellt, bevor Zilog Ende 1976 eine eigene Fertigungsfabrik fertigstellte. Diese Unternehmen wurden ausgewählt, weil sie die Ionenimplantation durchführen konnten, die für die Herstellung der Verarmungs- MOSFETs erforderlich war, die das Z80-Design als Lasttransistoren verwendete um mit einer einzigen 5-Volt-Stromversorgung zurechtzukommen.

Faggin entwickelt , um den Befehlssatz sein binärkompatibel mit dem Intel 8080 so , dass die meist 8080 - Code, insbesondere der CP / M - Betriebssystem und Intel PL / M - Compiler für 8080 (sowie die generierten Code), auf dem neuen Z80 unmodifizierten laufen würden ZENTRALPROZESSOR. Masatoshi Shima entwarf den Großteil der Mikroarchitektur sowie die Gate- und Transistorebenen der Z80-CPU, unterstützt von einer kleinen Anzahl von Ingenieuren und Layoutern . CEO Federico Faggin war zusammen mit zwei engagierten Layoutern tatsächlich stark an der Chip-Layout-Arbeit beteiligt. Laut Faggin habe er 80 Stunden pro Woche gearbeitet, um den engen Zeitplan der Finanzinvestoren einzuhalten.

Der Z80 bot viele Verbesserungen gegenüber dem 8080:

  • Ein erweiterter Befehlssatz, einschließlich:
    • Ein logischeres, verständlicheres und lesbareres System von Assembler- Befehlsmnemoniken
    • flexiblere 16-Bit-Datenbewegungsbefehle (Laden oder LD), insbesondere einschließlich des Stapelzeigers SP
    • flexiblere Adressierungsmodi für Ein-/Ausgabe an externe Peripherieanschlüsse
    • Einzelbit-Adressierung aller Register und Speicher, einschließlich Bit-Tests
    • verschiebt/rotiert auf Speicher und Registern außer dem Akkumulator
    • verbesserte und genauere (als die vorherige 8080) BCD- Arithmetik
    • Rotieren Sie Anweisungen für BCD-Zahlenketten im Speicher
    • 16-Bit-Subtraktion und 8-Bit-Negation
    • Programmschleifen
    • Relative Sprünge des Programmzählers
    • Blockkopie , Blockeingabe /-ausgabe (E/A) und Bytesuchanweisungen.
  • Ein Überlauf-Flag mit besserer Unterstützung für vorzeichenbehaftete 8- und 16-Bit-Arithmetik.
  • Neue IX- und IY- Indexregister mit Anweisungen für die direkte Adressierung von base+ Offset
  • Ein besseres Interrupt- System:
    • Ein automatischeres und allgemeineres vektorisiertes Interrupt-System , Modus 2 , das hauptsächlich für die Reihe von Zählern/Timern, DMA- und Kommunikationscontrollern von Zilog gedacht ist, sowie ein festes Vektor-Interrupt-System, Modus 1 , für einfache Systeme mit minimaler Hardware (wobei Modus 0 als den 8080-kompatiblen Modus).
    • Ein nicht maskierbarer Interrupt (NMI), der verwendet werden kann, um auf Abschaltsituationen oder andere Ereignisse mit hoher Priorität zu reagieren (und einem minimalistischen Z80-System die einfache Implementierung eines zweistufigen Interrupt-Schemas im Modus 1 ermöglicht ).
  • Eine vollständige doppelte Registerdatei , die schnell umgeschaltet werden kann, um die Reaktion auf Interrupts wie schnelle asynchrone Ereignishandler oder einen Multitasking- Dispatcher zu beschleunigen . Obwohl sie nicht als zusätzliche Register für allgemeinen Code gedacht waren, wurden sie dennoch in einigen Anwendungen so verwendet.
  • Weniger Hardwarebedarf für Stromversorgung , Takterzeugung und Schnittstelle zu Speicher und I/O
  • Einzelnes 5-Volt-Netzteil ( der 8080 benötigt -5 V/+5 V/+12 V ).
  • Einphasiger 5-Volt-Takt ( der 8080 benötigte einen nicht überlappenden Zwei-Phasen-Takt mit hoher Amplitude (9 bis 12 Volt ).
  • Eingebaute DRAM- Auffrischung , die ansonsten externe Schaltungen erfordern würde, es sei denn, SRAM, teurer und weniger dicht (aber schneller), wurde verwendet.
  • Nicht gemultiplexte Busse (der 8080 hatte Zustandssignale, die auf den Datenbus gemultiplext wurden).
  • Eine spezielle Rücksetzfunktion, die nur den Programmzähler löscht, sodass eine einzelne Z80-CPU in einem Entwicklungssystem wie einem In-Circuit-Emulator verwendet werden kann .

Der Z80 löste den 8080 und seinen Nachfolger, den 8085 , auf dem Prozessormarkt ab und wurde zu einer der beliebtesten 8-Bit-CPUs. Einige Unternehmen, wie British Telecom , blieben dem 8085 für eingebettete Anwendungen aufgrund ihrer Vertrautheit mit ihm und seiner seriellen On-Chip-Schnittstellen- und Interrupt-Architektur treu. Intel produzierte einen stromsparenden CMOS 8085 (80C85), der in batteriebetriebenen tragbaren Computern auftauchte, wie dem von Kyocera entworfenen Laptop vom April 1983, der auch von Tandy (als TRS-80 Model 100 ), Olivetti und NEC in verschiedenen Variationen verkauft wird. In den folgenden Jahren würden jedoch auch CMOS-Versionen der Z80 (sowohl von Zilog als auch von japanischen Herstellern) diesen Markt dominieren.

Ein Schlüssel zum anfänglichen Erfolg des Z80 war vielleicht die eingebaute DRAM-Aktualisierung, zumindest in Märkten wie CP/M und anderen Büro- und Heimcomputern. (Die meisten eingebetteten Z80- Systeme verwenden statischen RAM , der keine Auffrischung benötigt.) Es kann auch sein minimalistisches zweistufiges Interrupt-System gewesen sein oder umgekehrt sein allgemeines mehrstufiges Daisy-Chain-Interrupt-System, das für die Wartung mehrerer Z80-IO-Chips nützlich ist. Alle Funktionen, die es ermöglichten, Systeme mit weniger unterstützender Hardware und einfacherem Leiterplattenlayout zu bauen. Andere behaupten jedoch, seine Popularität sei auf die duplizierten Register zurückzuführen, die im Vergleich zu 8-Bit-CPUs mit weniger Registern schnelle Kontextwechsel oder eine effizientere Verarbeitung von Dingen wie Gleitkomma-Mathematik ermöglichten. (Der Z80 kann mehrere solcher Nummern intern speichern, indem er HL'HL, DE'DE und BC'BC als 32-Bit-Register verwendet, um zu vermeiden, dass sie während der Berechnung von einem langsameren RAM aus darauf zugreifen müssen.)

Für das ursprüngliche NMOS- Design wurde die angegebene obere Taktfrequenzgrenze sukzessive von den einleitenden 2,5  MHz über die bekannten 4 MHz (Z80A) bis hin zu 6 (Z80B) und 8 MHz (Z80H) erhöht. Die NMOS-Version wird seit Ende der 1980er Jahre als 10-MHz-Bauteil produziert. CMOS- Versionen wurden mit spezifizierten oberen Frequenzgrenzen im Bereich von 4 MHz bis 20 MHz für die heute verkaufte Version entwickelt. Die CMOS-Versionen ermöglichten einen Standby-Modus mit niedrigem Stromverbrauch, wobei der interne Zustand beibehalten wurde, und es gab keine untere Frequenzgrenze. Die vollkompatiblen Derivate HD64180 / Z180 und eZ80 sind derzeit für bis zu 33 bzw. 50 MHz spezifiziert.

Entwurf

Programmiermodell und Registersatz

Ein ungefähres Blockdiagramm des Z80. Es gibt keinen dedizierten Addierer für Offsets oder einen separaten Inkrementierer für R, und es wird nicht mehr als ein einzelnes 16-Bit-Temporärregister WZ benötigt (obwohl die Inkrementierer-Latches in anderen Zusammenhängen auch als 16-Bit-Temporärregister verwendet werden). Es sind die PC- und IR-Register, die in einer separaten Gruppe mit einem abnehmbaren Bussegment angeordnet sind, um Aktualisierungen dieser Register parallel zur Hauptregisterbank zu ermöglichen.

Das Programmiermodell und der Registersatz des Z80 sind ziemlich konventionell und basieren letztendlich auf der Registerstruktur des Datapoint 2200 . Der Z80 wurde als Erweiterung des Intel 8080 entwickelt, der von denselben Ingenieuren entwickelt wurde, der wiederum eine Erweiterung des 8008 war . Der 8008 war im Grunde eine PMOS- Implementierung der TTL-basierten CPU des Datapoint 2200.

Das 2200-Design ermöglichte die Paarung der 8-Bit-Register H und L (High und Low) zu einem 16-Bit-Adressregister HL. Im 8080 wurde diese Paarung auch zu den BC- und DE-Paaren hinzugefügt, während HL verallgemeinert wurde, um die Verwendung als 16-Bit-Akkumulator zu ermöglichen, nicht nur als Adressregister. Der 8080 führte auch den wichtigen 8-Bit-Direktdatenmodus für Akkumulatoroperationen und sofortige 16-Bit-Daten für HL-, BC- und DE-Ladevorgänge ein. Außerdem war jetzt ein direktes 16-Bit-Kopieren zwischen HL und Speicher unter Verwendung einer direkten Adresse möglich.

Der Z80 hat dies weiter orthogonalisiert, indem er alle 16-Bit-Registerpaare, einschließlich IX und IY, allgemeiner macht und das 16-Bit-Kopieren für alle diese Paare direkt in und aus dem Speicher ermöglicht. Die 16-Bit-IX- und IY-Register im Z80 sind in erster Linie als Basisadressregister gedacht, bei denen ein bestimmter Befehl einen konstanten Offset liefert, der zu den vorherigen Werten addiert wird, aber sie sind unter anderem auch als 16-Bit-Akkumulatoren verwendbar . Eine Einschränkung besteht darin, dass alle Operandenreferenzen, die IX oder IY beinhalten, ein zusätzliches Befehlspräfixbyte erfordern, wodurch mindestens vier Taktzyklen über die Zeitsteuerung eines Befehls hinzugefügt werden, der stattdessen HL verwendet; dies macht die Verwendung von IX oder IY manchmal weniger effizient als eine Methode, die nur die 8080-Modellregister verwendet. Der Z80 führte auch ein neues vorzeichenbehaftetes Überlaufflag ein und ergänzte die recht einfache 16-Bit-Arithmetik des 8080 mit speziellen Anweisungen für vorzeichenbehaftete 16-Bit-Arithmetik.

Die 8080-kompatiblen Register AF, BC, DE, HL sind in der Z80 als separate Registerdatei dupliziert, wo der Prozessor schnell (vier
t-States, geringstmögliche Ausführungszeit für jeden Z80-Befehl) von einer Bank in die Sonstiges; eine Funktion, die nützlich ist, um Antworten auf einstufige Interrupts mit hoher Priorität zu beschleunigen. Ein ähnliches Feature war im 2200 vorhanden, wurde aber bei Intel nie implementiert. Der duale Registersatz ist in der eingebetteten Rolle sehr nützlich, da er die Interrupt-Handhabungsleistung verbessert, aber in der Personalcomputer-Rolle als zusätzlicher Satz allgemeiner Register für komplexen Code wie Gleitkomma- Arithmetik oder Heimcomputerspiele weit verbreitete Verwendung gefunden hat .

Die doppelte Registerdatei wird oft als "alternativer Registersatz" bezeichnet (von manchen die "geprimte" Registerdatei, da das Apostrophzeichen verwendet wird, um sie im Assembler-Quellcode und der Zilog-Dokumentation zu bezeichnen). Dies unterstreicht, dass immer nur ein Set adressierbar ist. Der 8-Bit-Akkumulator A mit seinem Flag-Register F ist jedoch von den "Allzweck"-Registerpaaren HL, DE und BC gegabelt. Dies wird mit zwei separaten Befehlen erreicht, die verwendet werden, um ihre Zugriffsmöglichkeiten zu tauschen: EX AF,AF'tauscht nur das Registerpaar AF mit AF' aus, während der EXXBefehl die drei Universalregisterpaare HL, DE und BC mit ihren Alternativen HL', DE' und BC' tauscht. Somit kann der Akkumulator A unabhängig mit jedem der Allzweck-8-Bit-Register in der alternativen (oder grundierten) Registerdatei interagieren, oder, wenn HL' einen Zeiger auf den Speicher enthält, dort einige Bytes (DE' und BC' können auch übertragen) 8-Bit-Daten zwischen Speicher und Akkumulator A).

Dies kann für Programmierer verwirrend werden, da nach dem Ausführen EX AF,AF'oder EXXwas zuvor die alternativen (geprimten) Register waren, jetzt die Hauptregister sind und umgekehrt. Die einzige Möglichkeit für den Programmierer zu erkennen, welche Sets im Kontext stehen (während er "Computer spielt", während er den Assembler-Quelltext untersucht, oder schlimmer noch, Code mit einem Debugger durchforstet) besteht darin, zu verfolgen, wo jeder Registertausch bei jedem durchgeführt wird Punkt im Programm. Wenn innerhalb dieser Codesegmente viele Sprünge und Aufrufe durchgeführt werden, kann es offensichtlich schnell schwierig werden, zu erkennen, welche Registerdatei im Kontext steht, es sei denn, sie werden sorgfältig kommentiert. Daher ist es ratsam, Austauschbefehle direkt und in kurzen diskreten Codesegmenten zu verwenden. Der Zilog Z280-Befehlssatz enthält JAFund JARBefehle, die zu einer Zieladresse springen, wenn die alternativen Register im Kontext sind (wodurch diese Programmierkomplikation offiziell anerkannt wird).

Register

Zilog Z80 registriert
1 5 1 4 1 3 1 2 1 1 1 0 0 9 0 8 0 7 0 6 0 5 0 4 0 3 0 2 0 1 0 0 (Bitposition)
Hauptregister
EIN Flaggen AF (8 Bit Akkumulator und Flags)
B C BC (Daten- und Adressregister)
D E DE (Daten- und Adressregister)
h L HL (16 Bit Akkumulator und Adressregister)
Alternative Register
EIN' Flaggen' AF ' (8 Bit Akkumulator und Flags)
B' C' BC ' (Daten- und Adressregister)
D' E' DE ' (Daten- und Adressregister)
H' L' HL ' (16 Bit Akkumulator und Adressregister)
Indexregister
IX I ndex X
IY I ndex Y
SP S tack P ointer
Andere Register
  ich Ich unterbreche den Vektor
  R R efresh Zähler
Programm zähler
PC P rogram C ounter
Statusregister
  S Z - h - P / V n C F lags

Wie beim 8080 werden 8-Bit-Register normalerweise gepaart, um 16-Bit-Versionen bereitzustellen. Die 8080-kompatiblen Register sind:

  • AF: 8-Bit- Akkumulator (A) und Flag-Bits (F) Übertrag, Null, Minus, Parität/Überlauf, Halbübertrag (verwendet für BCD ) und ein Add/Subtract-Flag (normalerweise als N bezeichnet) auch für BCD
  • BC: 16-Bit-Daten-/Adressregister oder zwei 8-Bit-Register
  • DE: 16-Bit-Daten-/Adressregister oder zwei 8-Bit-Register
  • HL: 16-Bit-Akkumulator/Adressregister oder zwei 8-Bit-Register
  • SP: Stapelzeiger , 16 Bit
  • PC: Programmzähler, 16 Bit

Die mit dem Z80 eingeführten neuen Register sind:

  • IX: 16-Bit-Index oder Basisregister für 8-Bit-Sofort-Offsets
  • IY: 16-Bit-Index oder Basisregister für 8-Bit-Sofort-Offsets
  • I: Interrupt-Vektor-Basisregister, 8 Bit
  • R: DRAM-Refresh-Zähler, 8 Bit ( msb zählt nicht)
  • AF': alternativer (oder Schatten-) Akkumulator und Flags ( ein- und ausgeblendet mit EX AF,AF' )
  • BC', DE'und HL': alternative (oder Schatten-) Register ( mit EXX ein- und ausgeblendet )
  • Vier Bits des Interrupt-Status und des Interrupt-Modus-Status

Das Auffrischregister , R, erhöht sich jedes Mal, wenn die CPU einen Opcode (oder ein Opcode-Präfix, das intern wie ein 1-Byte-Befehl ausgeführt wird) abruft und hat keine einfache Beziehung zur Programmausführung. Dies wurde manchmal verwendet, um Pseudozufallszahlen in Spielen und auch in Softwareschutzschemata zu generieren . Es wurde in einigen Designs auch als "Hardware"-Zähler verwendet; ein Beispiel dafür ist der ZX81 , der es ermöglicht, die Zeichenpositionen auf dem Fernsehbildschirm zu verfolgen, indem ein Interrupt beim Umlauf ausgelöst wird (durch Verbinden von INT mit A6).

Das Interrupt-Vektorregister , I, wird für die Z80-spezifischen Modus-2-Interrupts (durch den IM 2Befehl ausgewählt) verwendet. Sie liefert das High-Byte der Basisadresse für eine 128-Eintragstabelle von Serviceroutinenadressen , die über einen Index ausgewählt werden, der während eines Unterbrechungsbestätigungszyklus an die CPU gesendet wird; dieser Index ist einfach der niederwertige Teil des Zeigers auf die tabellarische indirekte Adresse, die auf die Dienstroutine zeigt. Der Zeiger identifiziert einen bestimmten Peripheriechip oder eine Peripheriefunktion oder ein Ereignis, wobei die Chips normalerweise in einer sogenannten Daisy Chain zur Prioritätsauflösung verbunden sind. Wie das Refresh-Register wurde auch dieses Register manchmal kreativ verwendet; in den Interrupt-Modi 0 und 1 (oder in einem System, das keine Interrupts verwendet) kann es einfach als weiteres 8-Bit-Datenregister verwendet werden.

Die Befehle LD A,Rund LD A,Ibeeinflussen die Z80-Flags-Register im Gegensatz zu allen anderen LD(Lade-)Befehlen. Die Flags Vorzeichen (Bit 7) und Null (Bit 6) werden entsprechend den aus den Auffrisch- oder Unterbrechungsquellenregistern geladenen Daten gesetzt. Für beide Befehle wird das Paritäts-/Überlauf-Flag (Bit 2) entsprechend dem aktuellen Zustand des IFF2-Flip-Flops gesetzt.

Z80 Assemblersprache

Datenpunkt 2200 und Intel 8008

Die erste Intel 8008- Assemblersprache basierte auf einer sehr einfachen (aber systematischen) Syntax, die vom Datapoint 2200-Design übernommen wurde. Diese ursprüngliche Syntax wurde später für denselben ursprünglichen 8008-Chip in eine neue, etwas traditionellere Assemblersprache umgewandelt. Ungefähr zur gleichen Zeit wurde die neue Assemblersprache auch erweitert, um die zusätzlichen Adressierungsmodi des fortschrittlicheren Intel 8080-Chips zu berücksichtigen (der 8008 und der 8080 teilten sich eine Sprachuntermenge, ohne binärkompatibel zu sein ; der 8008 war jedoch binärkompatibel mit dem Datapoint 2200).

Dabei wurde die Mnemonik L, für LOAD , durch verschiedene Abkürzungen der Wörter LOAD , STORE und MOVE , vermischt mit anderen symbolischen Buchstaben, ersetzt. Der mnemonische Buchstabe M, für das Gedächtnis (von HL referenziert), wurde aus dem Befehl mnemonik herausgehoben, um ein syntaktisch freistehender Operand zu werden , während Register und Kombinationen von Registern sehr inkonsistent bezeichnet wurden; entweder durch abgekürzte Operanden (MVI D, LXI H usw.), innerhalb der Befehlsmnemonik selbst (LDA, LHLD usw.) oder beides gleichzeitig (LDAX B, STAX D usw.).

Intel 8008
Datenpunkt 2200
Intel 8080
Intel 8085
Zilog Z80 Intel 8086/
Intel 8088
vor ca. 1973 ca. 1974 1976 1978
LBC MOV B,C LD B,C MOV BL,CL
-- LDAX B LD A,(BC) MOV AL,[BX]
LAM MOV A,M LD A,(HL) MOV AL,[BP]
LBM MOV B,M LD B,(HL) MOV BL,[BP]
-- STAX D LD (DE),A MOV [DX],AL
LMA MOV M,A LD (HL),A MOV [BP],AL
LMC MOV M,C LD (HL),C MOV [BP],CL
LDI 56 MVI D,56 LD D,56 MOV DL,56
LMI 56 MVI M,56 LD (HL),56 MOV byte ptr [BP],56
-- LDA 1234 LD A,(1234) MOV AL,[1234]
-- STA 1234 LD (1234),A MOV [1234],AL
-- -- LD B,(IX+56) MOV BL,[SI+56]
-- -- LD (IX+56),C MOV [SI+56],CL
-- -- LD (IY+56),78 MOV byte ptr [DI+56],78
-- LXI B,1234 LD BC,1234 MOV BX,1234
-- LXI H,1234 LD HL,1234 MOV BP,1234
-- SHLD 1234 LD (1234),HL MOV [1234],BP
-- LHLD 1234 LD HL,(1234) MOV BP,[1234]
-- -- LD BC,(1234) MOV BX,[1234]
-- -- LD IX,(1234) MOV SI,[1234]

Veranschaulichung von vier Syntaxen unter Verwendung von Beispielen äquivalenter oder (für 8086) sehr ähnlicher Lade- und Speicheranweisungen. Die Z80-Syntax verwendet Klammern um einen Ausdruck, um anzugeben, dass der Wert als Speicheradresse verwendet werden soll (wie unten erwähnt), während die 8086-Syntax zu diesem Zweck Klammern anstelle von gewöhnlichen Klammern verwendet. Sowohl Z80 als auch 8086 verwenden das +-Zeichen, um anzuzeigen, dass eine Konstante zu einem Basisregister hinzugefügt wird, um eine Adresse zu bilden

Neue Syntax

Da Intel ein Copyright auf seine Assembler-Mnemonik beansprucht, musste für den Z80 eine neue Assembler-Syntax entwickelt werden. Diesmal wurde ein systematischerer Ansatz verwendet:

  • Alle Register und Registerpaare werden explizit mit ihren vollständigen Namen bezeichnet
  • Klammern werden durchweg verwendet, um "Speicherinhalt bei" (konstante Adresse oder variable Zeiger-Dereferenzierung) anzugeben, mit Ausnahme eines Sprungbefehls JP (HL). JP (XY) ist lediglich eine Variante von JP (HL), die die neue PC-Adresse lädt.
  • Alle Lade- und Speicherbefehle verwenden denselben mnemonischen Namen LD für LOAD (eine Rückkehr zum vereinfachten Datapoint 2200-Vokabular); andere übliche Befehle, wie ADD und INC, verwenden unabhängig vom Adressierungsmodus oder der Operandengröße dieselbe mnemonische Bezeichnung. Dies ist möglich, weil die Operanden selbst genügend Informationen tragen.

Diese Prinzipien machten es einfach, Namen und Formen für alle neuen Z80-Befehle sowie Orthogonalisierungen von alten zu finden, wie z LD BC,(1234).

Abgesehen von Namensunterschieden und trotz einer gewissen Diskrepanz in der grundlegenden Registerstruktur ist die Syntax von Z80 und 8086 für einen Großteil der Befehle praktisch isomorph . Nur ganz oberflächliche Ähnlichkeiten (wie das Wort MOV oder der Buchstabe X für erweitertes Register) bestehen zwischen den 8080- und 8086-Assemblersprachen, obwohl 8080-Programme von Übersetzerprogrammen in die 8086-Assemblersprache übersetzt werden können .

Befehlssatz und Kodierung

Der Z80 verwendet 252 der verfügbaren 256 Codes als Einzelbyte-Opcodes ("Root-Befehl", die alle vom 8080 geerbt werden); die vier verbleibenden Codes werden ausgiebig als Opcode-Präfixe verwendet : CB und ED ermöglichen zusätzliche Befehle, und DD oder FD wählen IX+d bzw. IY+d (in einigen Fällen ohne Verschiebung d) anstelle von HL. Dieses Schema verleiht dem Z80 eine große Anzahl von Permutationen von Befehlen und Registern; Zilog kategorisiert diese in 158 verschiedene "Befehlstypen", von denen 78 denen des Intel 8080 entsprechen (ermöglichen den Betrieb aller 8080-Programme auf einem Z80). Die Zilog-Dokumentation gruppiert Befehle weiter in die folgenden Kategorien (die meisten aus dem 8080, andere völlig neu wie die Block- und Bit-Befehle und andere 8080-Befehle mit vielseitigeren Adressierungsmodi, wie 16-Bit-Laden, E/A, Drehungen/Verschiebungen und relative Sprünge):

  • Laden und austauschen
  • Übertragung und Suche blockieren
  • Arithmetik und Logik
  • Drehen und verschieben
  • Bitmanipulation (setzen, rücksetzen, testen)
  • Springen, anrufen und zurückkehren
  • Input-Output
  • Grundlegende CPU-Steuerung

Im ursprünglichen Z80 sind keine expliziten Multiplikationsbefehle verfügbar, obwohl die Register A und HL mit den Befehlen ADD A,A und ADD HL,HL mit Zweierpotenzen multipliziert werden können (ähnlich auch IX und IY). Shift-Anweisungen können auch mit Zweierpotenzen multipliziert oder dividiert werden.

Unterschiedliche Größen und Varianten von Hinzufügungen, Verschiebungen und Drehungen haben etwas unterschiedliche Auswirkungen auf Flaggen, da die meisten Flaggenwechseleigenschaften des 8080 kopiert wurden. Das Paritätsflag-Bit P des 8080 (Bit 2) wird jedoch beim Z80 als P/V (Parität/Überlauf) bezeichnet, da es dem zusätzlichen Zweck eines Zweierkomplement-Überlaufindikators dient, eine Funktion, die beim 8080 fehlt der Z80 hat es so eingestellt, dass es Überlauf statt Parität anzeigt, während bitweise Befehle es immer noch als Paritätsflag verwenden. (Dies führt zu einer subtilen Inkompatibilität des Z80 mit Code, der für den 8080 geschrieben wurde, da der Z80 manchmal einen Vorzeichenüberlauf anzeigt, wo der 8080 Parität anzeigen würde, was möglicherweise dazu führt, dass die Logik einiger praktischer 8080-Software auf dem Z80 fehlschlägt.) Dieses neue Überlauf-Flag wird für alle neuen Z80-spezifischen 16-Bit-Operationen ( ADC, SBC) sowie für 8-Bit-Rechenoperationen verwendet, während die vom 8080 geerbten 16-Bit-Operationen ( ADD, INC, DEC) keinen Einfluss darauf haben. Außerdem wird Bit 1 des Flags-Registers (ein Reservebit beim 8080) als Flag N verwendet, das anzeigt, ob der zuletzt ausgeführte arithmetische Befehl eine Subtraktion oder Addition war. Die Z80-Version der DAAAnweisung (Decimal Adjust Accumulator for BCD Arithmetic) überprüft das N-Flag und verhält sich entsprechend, so dass eine spätere (hypothetische) Subtraktion DAAauf einem alten 8080 ein anderes Ergebnis liefert als auf dem Z80. Dies wäre jedoch wahrscheinlich ein fehlerhafter Code auf dem 8080, da er DAAnur für diesen Prozessor definiert wurde.

Der Z80 verfügt über sechs neue LDBefehle, die die Registerpaare DE, BC und SP aus dem Speicher laden und den Speicher aus diesen drei Registerpaaren laden können – im Gegensatz zum 8080. Wie beim 8080 wirken sich Ladebefehle nicht auf die Flags aus (mit Ausnahme der I- und R-Registerladevorgänge für besondere Zwecke). Ein Ergebnis einer regulären Codierung (üblich beim 8080) ist, dass jedes der 8-Bit-Register von sich selbst geladen werden kann (zB LD A,A). Dies ist effektiv eine NOP.

Neue Blocktransferbefehle können bis zu 64 Kilobyte von Speicher zu Speicher oder zwischen Speicher und E/A-Peripherieports verschieben. Block Anweisungen LDIRund LDDR(Last, Increment / Decrement, Repeat) Verwendung HL zu Punkt zu der Quelladresse, DE an der Zieladresse, und BC als ein Bytezähler. Bytes werden von der Quelle zum Ziel kopiert, die Zeiger werden inkrementiert oder dekrementiert und der Bytezähler wird dekrementiert, bis BC Null erreicht. Nicht sich wiederholende Versionen LDIund LDDverschieben ein einzelnes Byte und stoßen die Zeiger und den Bytezähler an, was, wenn er Null wird, das P/V-Flag zurücksetzt. Entsprechende Speicher-zu-E/A-Befehle INIR, INDR, OTIR, OTDR, INI, IND, OUTIund OUTDarbeiten ähnlich. Der Z80 kann jedes Register an einen I/O-Port eingeben und ausgeben, indem Register C verwendet wird, um den Port zu bestimmen. (Der 8080 führt nur E/A über den Akkumulator A durch, wobei eine im Befehl angegebene direkte Portadresse verwendet wird; eine selbstmodifizierende Codetechnik ist erforderlich, um eine variable 8080-Portadresse zu verwenden.)

Die letzte Gruppe von Blockbefehlen führt eine CPVergleichsoperation zwischen dem Byte at (HL) und dem Akkumulator A durch. Das Registerpaar DE wird nicht verwendet. Die sich wiederholenden Versionen CPIRund CPDRenden nur, wenn BC auf Null geht oder eine Übereinstimmung gefunden wird. HL zeigt links auf das Byte nach ( CPIR) oder vor ( CPDR) dem passenden Byte. Wenn keine Übereinstimmung gefunden wird, wird das Z-Flag zurückgesetzt. Es gibt sich nicht wiederholende Versionen CPIund CPD.

Im Gegensatz zum 8080 kann der Z80 mit einer vorzeichenbehafteten 8-Bit-Verschiebung zu einer relativen Adresse ( JRanstelle von JP) springen . Für diese neuen Zwei-Byte- JRBefehle können nur die Null- und Übertrags-Flags getestet werden . (Alle 8080-Sprünge und -Aufrufe, DJNZob bedingt oder nicht, sind Drei-Byte-Befehle.) Ein auf Programmschleifen spezialisierter Zwei-Byte-Befehl ist ebenfalls neu für den Z80: (Sprung vermindern, wenn Nicht-Null) nimmt eine vorzeichenbehaftete 8-Bit-Verschiebung wie ein unmittelbarer Operand. Das B-Register wird dekrementiert, und wenn das Ergebnis ungleich Null ist, springt die Programmausführung relativ zum PC; die Flaggen bleiben unverändert. Um eine äquivalente Schleife auf einem 8080 DECauszuführen, sind separate Rement- und bedingte Sprungbefehle (zu einer 2-Byte-Absolutadresse) erforderlich (insgesamt vier Bytes), und das DECändert das Flag-Register.

Die Anweisungen des Indexregisters (IX/IY, oft abgekürzt XY) können für den Zugriff auf Daten nützlich sein, die in festen heterogenen Strukturen (wie Records ) oder an festen Offsets relativ zu einer variablen Basisadresse (wie in rekursiven Stapelrahmen ) organisiert sind, und können auch Code reduzieren Größe, indem die Notwendigkeit mehrerer kurzer Befehle mit nicht indizierten Registern beseitigt wird. Doch obwohl sie Geschwindigkeit in manchen Kontexten sparen kann , wenn im Vergleich zu lang / Komplex „gleichwertig“ Sequenzen von einfachen Operationen, sie viele zusätzlichen CPU - Zeit (entstehen zB , 19 T - Staaten für den Zugriff eines indexierten Speicherplatz vs. so wenig wie 11 um mit HL INCauf denselben Speicher zuzugreifen und auf den nächsten zu zeigen). Somit neigt die Verwendung von IX und IY für einfache oder lineare Datenzugriffe dazu, langsamer zu sein und mehr Speicher zu belegen. Dennoch können sie in Fällen nützlich sein, in denen die 'Haupt'-Register alle belegt sind, indem die Notwendigkeit zum Speichern/Wiederherstellen von Registern entfällt. Ihre offiziell undokumentierten 8-Bit-Hälften (siehe unten) können in diesem Zusammenhang besonders nützlich sein, da sie weniger langsam sind als ihre 16-Bit-Eltern. In ähnlicher Weise sind Befehle für 16-Bit-Additionen in der ursprünglichen Z80 nicht besonders schnell (11 Takte) (sie sind 1 Takt langsamer als in der 8080/8085); Trotzdem sind sie etwa doppelt so schnell wie die Ausführung derselben Berechnungen mit 8-Bit-Operationen, und ebenso wichtig ist, dass sie die Registerauslastung reduzieren. Es war für Programmierer nicht ungewöhnlich, verschiedene Offset-Displacement-Bytes (die normalerweise dynamisch berechnet wurden) in indizierte Befehle zu "stecken". Dies ist ein Beispiel für selbstmodifizierenden Code, der auf fast allen frühen 8-Bit-Prozessoren mit nicht- pipelined ausgeführten Ausführungseinheiten gängige Praxis war .

Die Indexregister haben einen parallelen Befehl zu JP (HL), der JP (XY). Dies wird oft in stapelorientierten Sprachen wie Forth beobachtet, die am Ende jedes Forth-Wortes (atomare Unterroutinen, die die Sprache umfassen) bedingungslos zu ihren Thread-Interpreter-Routinen zurückspringen müssen. Normalerweise erscheint dieser Sprungbefehl viele hundert Male in einer Anwendung und die Verwendung JP (XY)anstatt JP THREADspeichert ein Byte und zwei T - Staaten für jedes Auftreten. Dies macht das Indexregister natürlich für jede andere Verwendung unzugänglich, oder die Notwendigkeit, es ständig neu zu laden, würde seine Effizienz zunichte machen.

Das um 10 Jahre neuere mikrocodierte Z180- Design könnte anfänglich mehr "Chipfläche" bieten, was eine etwas effizientere Implementierung ermöglicht ( unter anderem unter Verwendung einer breiteren ALU ); Ähnliches gilt für die Z800 , Z280 und Z380 . Doch erst mit der Einführung des voll gepipelineten eZ80 im Jahr 2001 wurden diese Befehle endlich annähernd so zykluseffizient, wie es technisch möglich ist, sie zu realisieren, dh angesichts der Z80-Kodierungen in Kombination mit der Fähigkeit, 8-Bit-Lese- oder schreibe jeden Taktzyklus.

Undokumentierte Anweisungen

Die Indexregister IX und IY waren als flexible 16-Bit-Zeiger gedacht, die die Fähigkeit verbessern, Speicher, Stapelrahmen und Datenstrukturen zu manipulieren. Offiziell wurden sie nur als 16-Bit behandelt. In Wirklichkeit wurden sie als ein Paar von 8-Bit - Registern, in der gleichen Weise wie das HL - Register implementiert, die entweder als 16 Bits zugänglich ist oder getrennt als H igh und L ow - Register. Die binären Opcodes (Maschinensprache) waren identisch, aber mit einem neuen Opcode-Präfix vorangestellt. Zilog veröffentlichte die Opcodes und zugehörige Mnemonik für die beabsichtigten Funktionen, dokumentierte jedoch nicht die Tatsache, dass jeder Opcode, der eine Manipulation der H- und L-Register erlaubte, für die 8-Bit-Teile der IX- und IY-Register gleichermaßen gültig war. Beispielsweise lädt der Opcode 26h gefolgt von einem unmittelbaren Bytewert (LD H,n)diesen Wert in das H-Register. Ein Voranstellen dieses Zwei-Byte-Befehls mit dem Opcode-Präfix des IX-Registers, DD, würde stattdessen dazu führen, dass die höchstwertigen 8 Bits des IX-Registers mit demselben Wert geladen werden. Eine bemerkenswerte Ausnahme hiervon wären Befehle ähnlich LD H,(IX+d)denen, die sowohl das HL- als auch das IX- oder IY-Register in demselben Befehl verwenden; in diesem Fall wird das DD-Präfix nur auf den (IX+d)-Teil des Befehls angewendet. Die Hälften der XY-Register könnten auch Operanden für 8-Bit-Arithmetik-, Logik- und Vergleichsbefehle enthalten, wodurch die regulären 8-Bit-Register für andere Zwecke ausgespart werden. Die undokumentierte Möglichkeit, die obere Hälfte eines Indexregisters zu inkrementieren und zu dekrementieren, machte es einfach, den Bereich der normalen indizierten Befehle zu erweitern, ohne auf die dokumentierten ADD/SBC XY,DEoder zurückgreifen zu müssen ADD/SBC XY,BC.

Es gibt noch einige andere undokumentierte Anweisungen. Undokumentierte oder illegale Opcodes werden vom Z80 nicht erkannt und haben verschiedene Auswirkungen, von denen einige nützlich sind. Da sie jedoch nicht Teil der formalen Definition des Befehlssatzes sind, ist es nicht garantiert (oder besonders wahrscheinlich), dass verschiedene Implementierungen des Z80 für jeden undokumentierten Opcode gleich funktionieren.

Fehler

Die OTDRAnleitung entspricht nicht der Z80-Dokumentation. Sowohl die OTDRals auch die OTIRAnweisungen sollen das Übertrags-(C)-Flag unverändert lassen. Die OTIRAnweisung funktioniert korrekt; während der Ausführung des OTDRBefehls nimmt das Übertragsflag jedoch die Ergebnisse eines falschen Vergleichs zwischen dem Akkumulator (A) und der letzten Ausgabe des OTDRBefehls.

Beispielcode

BEISPIEL 1: Der folgende Z80-Assembler-Quellcode ist für eine Subroutine namens HELLO_WORLD. Wie allgemein bekannt, ist dies ein Einführungsprogramm, das eine Nachricht auf dem Videodisplay ausgibt und dann beendet. Obwohl einfach, demonstriert es, wie ein Assembler-Quellcode formatiert wird und über ein Computerbetriebssystem mit der Anzeigehardware interagiert. Dies ist notwendigerweise spezifisch für eine bestimmte Computerhardware, ein bestimmtes Betriebssystem und eine Assemblersoftware. Das verwendete Beispiel ist das
TRS-80 Model 4 mit TRSDOS/LS-DOS 6.x, hergestellt von Tandy/Radio Shack and Logical Systems, wobei die meisten Assembler von Radio Shack oder Misosys Inc. (Serien I/EDTASM, ALDS, EDAS oder MRAS mit -GC-Schalter). Die Hauptmerkmale dieser Konfiguration sind universell für Z80-Assembler, sogar unter CP/M.

            
            
            
            
            
            
            
            
            
    
  
  
  
  
  
3000 3E 69
3002 EF 
3003 21 14 30
3006 3E 0A
3008 EF
3009 0E 0D
300B 3E 02
300D EF
300E 21 00 00
3011 3E 16
3013 EF
3014 48 65 6C 6C
3018 6F 2C 20 77
301C 6F 72 6C 64
3020 21 0D 0D
3023
 ; hello_world_TRS-80 Model 4
 ; Print "Hello, world!" then exit to TRSDOS Ready
 ;
 ; Entry registers: none
 ; Return registers: none
 ;
 ; values below are decimal unless suffixed by H
 ; the term "pseudo-op" means same as "assembler directive", is not Z80 code
 ;
 @CLS         EQU     105                 ; EQU pseudo-op sets @CLS text label = TRSDOS Supervisor Code
 @DSP         EQU     2                   ; set @DSP text label = TRSDOS SVC to send char to display
 @DSPLY       EQU     10                  ; set @DSPLY text label = SVC for text string display
 @EXIT        EQU     22                  ; set @EXIT text label = SVC for returning to TRSDOS Ready
;
              ORG     3000H               ; ORG pseudo-op sets standard start address under TRSDOS 6.x
START         LD      A,@CLS              ; CLS = Clear Screen, erase display and home cursor
              RST     40                  ; Z80 Restart instruction for system SVC processor, execute @CLS
              LD      HL,MSG              ; point to message string with HL (required by @DSPLY SVC)
              LD      A,@DSPLY            ; send text string to *DO Display Output device (video screen)
              RST     40                  ; execute @DSPLY SVC (13d byte needed to terminate string)
              LD      C,13                ; now send another carriage return, needed in reg C 
              LD      A,@DSP              ; to set off Hello message from TRSDOS Ready prompt
              RST     40                  ; once we exit to system
              LD      HL,0                ; indicate no error condition to Command Interpreter
              LD      A,@EXIT             ; return to TRSDOS Ready
              RST     40                  ; (stack integrity maintained, could as well have used a RET!)
 MSG          DB      'Hello, world!',13  ; DB = Define Byte pseudo-op assembles ASCII string to Z80 memory
 CR           DB      13                  ; 13d byte is ASCII carriage return char, moves cursor down
              END     START               ; END pseudo-op required by assembler 
                                          ; to produce transfer record to program entry point

BEISPIEL 2: Der folgende Z80-Assembly-Quellcode ist für eine Subroutine namens memcpy, die einen Block von Datenbytes einer bestimmten Größe von einem Ort zum anderen kopiert. Wichtig: Der Beispielcode behandelt nicht den Fall, dass der Zielblock die Quelle überlappt; eine ernsthafte Einschränkung, die jedoch für einige Anwendungen irrelevant ist – insbesondere wenn sich die Quelle im ROM und das Ziel im RAM befinden, sodass sie sich niemals überschneiden können. Der Beispielcode ist äußerst ineffizient und soll verschiedene Anweisungstypen veranschaulichen, anstatt Best Practices für die Geschwindigkeit. Der Datenblock wird Byte für Byte kopiert, und die Datenbewegungs- und Schleifenlogik verwendet 16-Bit-Operationen. Darüber hinaus verfügt der Z80 über einen einzigen Befehl, der die gesamte Schleife ( LDIR) ausführt . Beachten Sie, dass der zusammengestellte Code mit den Intel 8080- und 8085-CPUs binärkompatibel ist.

                     
                     
                     
                     
        
             
                     
             
                     
                     
                     
 1000            
 1000            
 1000 78         
 1001 B1         
 1002 C8         
 1003 1A         
 1004 77         
 1005 13         
 1006 23         
 1007 0B         
 1008 C3 00 10   
 100B
 ; memcpy --
 ; Copy a block of memory from one location to another.
 ;
 ; Entry registers
 ;      BC - Number of bytes to copy
 ;      DE - Address of source data block
 ;      HL - Address of target data block
 ;
 ; Return registers
 ;      BC - Zero

             org     1000h       ;Origin at 1000h
 memcpy      public
 loop        ld      a,b         ;Test BC,
             or      c           ;If BC = 0,
             ret     z           ;Return
             ld      a,(de)      ;Load A from (DE)
             ld      (hl),a      ;Store A into (HL)
             inc     de          ;Increment DE
             inc     hl          ;Increment HL
             dec     bc          ;Decrement BC
             jp      loop        ;Repeat the loop
             end

Befehlsausführung

Jeder Befehl wird in Schritten ausgeführt, die üblicherweise als Maschinenzyklen (M-Zyklen) bezeichnet werden, von denen jeder zwischen drei und sechs Taktperioden (T-Zyklen) dauern kann. Jeder M-Zyklus entspricht ungefähr einem Speicherzugriff oder einer internen Operation. Viele Befehle enden tatsächlich während der M1 des nächsten Befehls, was als Abruf-/Ausführungsüberlappung bekannt ist .

Beispiele für typische Anweisungen (R=read, W=write)
Gesamt

M-Zyklen

Anweisung M1 M2 M3 M4 M5 M6
1 INC BC Opcode
2 ADD A,n Opcode n
3 ADD HL,DE Opcode intern intern
4 SET b,(HL) Präfix Opcode R(HL), Satz W(HL)
5 LD (IX+d),n Präfix Opcode D n, füge hinzu W(IX+d)
6 INC (IY+d) Präfix Opcode D hinzufügen R(IY+d),inc W(IY+d)

Die Z80-Maschinenzyklen werden von einer internen Zustandsmaschine sequenziert , die jeden M-Zyklus je nach Kontext aus 3, 4, 5 oder 6 T-Zyklen aufbaut. Dies vermeidet eine umständliche asynchrone Logik und bewirkt, dass sich die Steuersignale bei einem weiten Bereich von Taktfrequenzen konsistent verhalten. Dies bedeutet auch, dass ein Quarz mit höherer Frequenz verwendet werden muss als ohne diese Unterteilung der Maschinenzyklen (ca. 2–3 mal höher). Es stellt keine strengeren Anforderungen an die Speicherzugriffszeiten , da ein hochauflösender Takt eine genauere Steuerung der Speicherzeiten ermöglicht und so der Speicher in größerem Umfang parallel zur CPU aktiv sein kann, was eine effizientere Nutzung der verfügbaren Speicherbandbreite ermöglicht.

Ein zentrales Beispiel hierfür ist, dass der Z80 für den Opcode-Abruf zwei volle Taktzyklen zu einer Speicherzugriffsperiode (dem M1-Signal) kombiniert. Im Z80 dauert dieses Signal einen relativ größeren Teil der typischen Befehlsausführungszeit als in einem Design wie dem 6800 , 6502 oder ähnlichem, wo dieser Zeitraum typischerweise typischerweise 30-40% eines Taktzyklus dauern würde. Da die Erschwinglichkeit von Speicherchips (dh Zugriffszeiten von etwa 450-250 ns in den 1980er Jahren) typischerweise die schnellstmögliche Zugriffszeit bestimmt, bedeutete dies, dass solche Designs auf einen deutlich längeren Taktzyklus (dh niedrigere interne Taktgeschwindigkeit) als der Z80 festgelegt waren.

Der Speicher war im Allgemeinen langsam im Vergleich zu den Subzyklen (Taktzyklen) der Zustandsmaschinen, die in modernen Mikroprozessoren verwendet werden. Der kürzeste Maschinenzyklus, der in eingebetteten Designs sicher verwendet werden könnte, wurde daher oft durch Speicherzugriffszeiten begrenzt, nicht durch die maximale CPU-Frequenz (insbesondere während der Heimcomputer-Ära). Diese Beziehung hat sich jedoch in den letzten Jahrzehnten langsam geändert, insbesondere im Hinblick auf SRAM ; Cachelose Single-Cycle-Designs wie das eZ80 haben daher in letzter Zeit deutlich an Bedeutung gewonnen.

Der Inhalt des Auffrischregisters R wird auf der unteren Hälfte des Adreßbusses zusammen mit einem Auffrischsteuersignal ausgesendet, während die CPU den abgerufenen Befehl decodiert und ausführt. Während des Auffrischens wird der Inhalt des Interrupt-Registers I auf die obere Hälfte des Adressbusses ausgesendet.

Kompatible Peripheriegeräte

Zilog hat eine Reihe von Peripheriekomponenten für den Z80 eingeführt, die alle das Interrupt-Handling-System und den E/A-Adressraum des Z80 unterstützen. Dazu gehören der Counter/Timer Channel (CTC), der SIO (Serial Input Output), der DMA (Direct Memory Access), der PIO (Parallel Input-Output) und der DART (Dual Asynchronous Receiver Transmitter). Im Zuge der Entwicklung der Produktlinie wurden Low-Power-, Hochgeschwindigkeits- und CMOS- Versionen dieser Chips eingeführt.

Wie die Prozessoren 8080, 8085 und 8086, aber im Gegensatz zu Prozessoren wie dem Motorola 6800 und MOS Technology 6502 verfügen die Z80 und 8080 über eine separate Steuerleitung und einen separaten Adressraum für E/A-Befehle. Während einige Z80-basierte Computer wie der Osborne 1 speicherabgebildete Ein-/Ausgabegeräte im "Motorola-Stil" verwendeten, wurde der E/A-Raum normalerweise verwendet, um einen der vielen Zilog-Peripheriechips zu adressieren, die mit dem Z80 kompatibel sind. Zilog I/O-Chips unterstützten die neuen Mode-2-Interrupts des Z80, was die Interrupt-Behandlung für eine große Anzahl von Peripheriegeräten vereinfachte.

Der Z80 wurde offiziell so beschrieben, dass er 16-Bit (64 KB) Speicheradressierung und 8-Bit (256 Ports) I/O-Adressierung unterstützt. Alle I/O-Befehle aktivieren tatsächlich den gesamten 16-Bit-Adressbus. OUT (C),reg und IN reg,(C) legen den Inhalt des gesamten 16-Bit-BC-Registers auf den Adressbus; OUT (n),A und IN A,(n) legt den Inhalt des A-Registers auf b8-b15 des Adressbusses und n auf b0-b7 des Adressbusses. Ein Designer könnte wählen, den gesamten 16-Bit-Adressbus bei E/A-Operationen zu decodieren, um dieses Merkmal zu nutzen, oder die obere Hälfte des Adressbusses verwenden, um Untermerkmale des E/A-Geräts auszuwählen. Diese Funktion wurde auch verwendet, um die Anforderungen an die Decodierungshardware zu minimieren, wie z. B. bei Amstrad CPC / PCW und ZX81 .

Zweitquellen und Derivate

Zweite Quellen

Mostek, der den ersten Z80 für Zilog produzierte, bot ihn als Second-Source als MK3880 an. Auch SGS-Thomson (jetzt STMicroelectronics ) war mit ihrem Z8400 eine zweite Quelle. Sharp und NEC entwickelten zweite Quellen für den NMOS Z80, den LH0080 bzw. μPD780C . Der LH0080 wurde in verschiedenen Heimcomputern und Personalcomputern von Sharp und anderen japanischen Herstellern verwendet, einschließlich Sony MSX-Computern und einer Reihe von Computern der Sharp MZ- Serie.

Toshiba hat eine CMOS-Version, den TMPZ84C00, entwickelt, von der angenommen (aber nicht verifiziert) wird, dass sie das gleiche Design ist, das auch von Zilog für seinen eigenen CMOS Z84C00 verwendet wird. Es gab auch Z80-Chips von GoldStar (jetzt LG ) und die BU18400-Serie von Z80-Klonen (einschließlich DMA, PIO, CTC, DART und SIO) in NMOS und CMOS von ROHM Electronics .

In Ostdeutschland wurde ein nicht lizenzierter Klon des Z80, bekannt als U880 , hergestellt. Es war sehr beliebt und wurde in den Computersystemen von Robotron und VEB Mikroelektronik Mühlhausen (wie der KC85-Serie ) und auch in vielen selbstgebauten Computersystemen verwendet. In Rumänien konnte ein weiterer nicht lizenzierter Klon namens MMN80CPU gefunden werden, der von Microelectronica produziert und in Heimcomputern wie TIM-S, HC, COBRA verwendet wird.

Außerdem wurden in der Sowjetunion mehrere Klone von Z80 hergestellt , darunter der T34BM1 , auch КР1858ВМ1 genannt (parallel zum sowjetischen 8080-Klon KR580VM80A ). Die erste Markierung wurde in Vorserien verwendet, während die zweite für eine größere Produktion verwendet werden musste. Aufgrund des Zusammenbruchs der sowjetischen Mikroelektronik in den späten 1980er Jahren gibt es jedoch viel mehr T34BM1 als КР1858ВМ1.

Derivate

Kompatibel mit dem Original Z80
  • Hitachi entwickelte den HD64180 , einen mikrocodierten und teildynamischen Z80 in CMOS, mit On-Chip-Peripherie und einer einfachen MMU, die 1  MB Adressraum bietet. Es wurde später von Zilog als Zweitquelle beschafft, zunächst als Z64180 und dann in Form des leicht modifizierten Z180, dessen Busprotokoll und Timing besser an Z80-Peripheriechips angepasst sind. Z180 wurde unter dem Namen von Zilog gepflegt und weiterentwickelt, wobei die neuesten Versionen auf dem vollständig statischen S180/L180-Kern mit sehr geringem Stromverbrauch und EMI (Rauschen) basieren.
  • Toshiba entwickelte die 84-poligen Z84013 / Z84C13- und die 100-poligen Z84015 / Z84C15-Serien von "intelligenten Peripheriecontrollern", im Grunde gewöhnliche NMOS- und CMOS-Z80-Kerne mit Z80-Peripherie, Watchdog-Timer , Power-On-Reset und Wartezustandsgenerator auf demselben Chip. Hergestellt von Sharp sowie Toshiba. Diese Produkte werden heute von Zilog aus zweiter Hand bezogen.
  • Der 32-Bit-Z80-kompatible Zilog Z380 , eingeführt 1994, wird hauptsächlich in Telekommunikationsgeräten verwendet.
  • Zilogs vollständig Pipeline-Z80-kompatibler eZ80 mit einer Wortlänge von 8/16/24 Bit und einem linearen 16 MB-Adressraum wurde 2001 eingeführt. Es gibt ihn in Versionen mit On-Chip- SRAM oder Flash-Speicher sowie mit integrierter Peripherie. Eine Variante hat einen On-Chip- MAC (Media Access Controller) und die verfügbare Software umfasst einen TCP/IP-Stack . Im Gegensatz zu Z800 und Z280 gibt es nur wenige zusätzliche Befehle (hauptsächlich LEAs , PEAs und 16/24-Bit-Ladevorgänge mit variabler Adresse), aber Befehle werden stattdessen zwischen 2 und 11 Mal so taktzykluseffizient wie beim original Z80 (mit einem Mittelwert ca. 3-5 mal). Er ist derzeit für Taktfrequenzen bis 50 MHz spezifiziert.
  • Kawasaki hat den binär kompatiblen KL5C8400 entwickelt, der etwa 1,2-1,3-mal so effizient wie der ursprüngliche Z80 ist und mit bis zu 33 MHz getaktet werden kann. Kawasaki produziert auch die KL5C80A1x-Familie, die sowohl über Peripherie als auch über einen kleinen RAM-On-Chip verfügt; er ist ungefähr so ​​taktzykluseffizient wie der eZ80 und kann mit bis zu 10 MHz (2006) getaktet werden.
  • Der NEC μPD9002 war eine Hybrid-CPU, die sowohl mit der Z80- als auch der x86- Familie kompatibel war .
  • Die Audioprozessor-Chipfamilie von Chinese Actions Semiconductor (ATJ2085 und andere) enthält Z80-kompatible MCUs zusammen mit einem dedizierten 24-Bit-DSP-Prozessor. Diese Chips werden in vielen MP3- und Mediaplayer-Produkten verwendet.
  • Die synthetisierbaren Softcores T80 (VHDL) und TV80 (Verilog) sind bei OpenCores.org erhältlich.
  • Der 1980 angekündigte NSC800 von National Semiconductor wird in vielen elektronischen Verschlüsselungsgeräten von TeleSecurity Timmann (TST) und dem Canon X-07 verwendet . Der NSC 800 ist voll kompatibel mit dem Z-80-Befehlssatz. Der NSC800 verwendet einen Multiplex-Bus wie der 8085, hat aber eine andere Pinbelegung als der Z80.
Nicht kompatibel
  • Die Toshiba TLCS 900-Serie von hochvolumigen (meist OTP ) Mikrocontrollern basiert auf dem Z80; sie teilen sich die gleiche grundlegende BC-, DE-, HL-, IX-, IY-Registerstruktur und weitgehend die gleichen Befehle, sind jedoch nicht binärkompatibel, während der vorherige TLCS 90 Z80-kompatibel ist.
  • Die Mikrocontroller der NEC 78K- Serie basieren auf dem Z80; sie teilen sich dieselbe grundlegende BC-, DE-, HL-Registerstruktur und haben ähnliche (aber anders benannte) Befehle; nicht binär kompatibel.
Teilweise kompatibel
Nicht mehr produziert
  • Der ASCII Corporation R800 war ein schneller 16-Bit-Prozessor, der in MSX TurboR- Computern verwendet wurde; es war Software-, aber nicht Hardware-kompatibel mit dem Z80 (Signaltiming, Pinbelegung und Funktion der Pins unterscheiden sich vom Z80).
  • Zilogs NMOS Z800 und CMOS Z280 waren 16-Bit-Z80-Implementierungen (vor HD64180 / Z180 ) mit einem 16 MB ausgelagerten MMU-Adressraum; sie fügten dem Z80-Befehlssatz viele Orthogonalisierungen und Adressierungsmodi hinzu. Minicomputer-Features – wie Benutzer- und Systemmodi, Multiprozessor-Unterstützung, On-Chip-MMU, On-Chip-Befehle und Daten-Cache usw. – wurden eher als komplexer denn als Funktionalität und Unterstützung für den (normalerweise elektronikorientierten) Embedded-System-Designer angesehen. es machte es auch sehr schwierig, die Ausführungszeiten von Befehlen vorherzusagen.
  • Bestimmte Arcade-Spiele wie Pang / Buster Bros verwenden eine verschlüsselte "Kabuki" Z80-CPU von VLSI Technology , bei der die Entschlüsselungsschlüssel in ihrem internen batteriegestützten Speicher gespeichert werden , um Piraterie und illegale Bootleg-Spiele zu vermeiden.

Bemerkenswerte Verwendungen

Desktop-Computer

Der Z80A wurde als CPU in einer Reihe von Spielekonsolen verwendet, wie beispielsweise dieser ColecoVision .

In den späten 1970er und frühen 1980er Jahren wurde die Z80 in einer Vielzahl von relativ anonymen, geschäftsorientierten Maschinen mit dem zu dieser Zeit marktbeherrschenden CP/M- Betriebssystem eingesetzt. Vier bekannte Beispiele für Z80-Business-Computer mit CP/M sind der Heathkit H89 , der tragbare Osborne 1 , die Kaypro- Serie und der Epson QX-10 . Weniger bekannt war der teure High-End- Otrona Attache. Einige Systeme verwendeten Multitasking-Betriebssystemsoftware (wie MP/M oder Micronix von Morrow ), um einen Prozessor von mehreren gleichzeitigen Benutzern gemeinsam zu nutzen .

Ein Sinclair ZX Spectrum , das einen Z80 verwendet, der mit 3,5 MHz getaktet ist

Es wurden mehrere Heimcomputer eingeführt, die den Z80 als Hauptprozessor oder als Plug-in-Option verwendeten, um den Zugriff auf Software zu ermöglichen, die für den Z80 geschrieben wurde. Bemerkenswert sind die TRS-80- Serie, darunter das Originalmodell (später retronymisiert "Model I"), Model II , Model III und Model 4 , die mit einem Z80 als Hauptprozessor ausgestattet waren, und einige (aber nicht alle) andere TRS-80-Modelle, die den Z80 entweder als Haupt- oder Sekundärprozessor verwendet haben. Andere bemerkenswerte Maschinen waren der DEC Rainbow 100 und der Seequa Chameleon , die beide sowohl mit einer Intel 8088 als auch einer Z80 CPU ausgestattet waren, um entweder 8-Bit CP/M-80 Anwendungen, die auf dem Z80 laufen, oder ein benutzerdefiniertes MS-DOS zu unterstützen die nicht vollständig kompatibel mit PC-DOS- Anwendungen war, die auf dem 8088 ausgeführt wurden.

1981 stellte Multitech (später Acer ) den Microprofessor I vor , ein einfaches und kostengünstiges Trainingssystem für den Z80-Mikroprozessor. Derzeit wird es noch von Flite Electronics International Limited in Southampton, England, hergestellt und vertrieben .

Tragbare und tragbare Computer

Die Verwendung des Z80 in leichteren, batteriebetriebenen Geräten wurde mit der Verfügbarkeit von CMOS-Versionen des Prozessors weiter verbreitet. Es inspirierte auch die Entwicklung anderer CMOS-basierter Prozessoren, wie beispielsweise des LH5801 von Sharp. Der Sharp PC-1500 , ein BASIC- programmierbarer Taschencomputer, wurde 1981 auf den Markt gebracht , gefolgt vom verbesserten Sharp PC-1600 im Jahr 1986 und dem Sharp PC-E220 im Jahr 1991. Spätere Modelle der Sharp Wizard- Serie von Personal Organizern basierten ebenfalls auf Z80 . Mit dem Epson PX-8 Geneva folgten 1984 Laptops, auf denen das CP/M-Betriebssystem ebenso wie die Desktop-Rechner laufen konnte , und 1985 der Epson PX-4 und Bondwell-2 . Während sich der Laptop-Markt in den Folgejahren auf leistungsstärkere Intel 8086- Prozessoren und das MS-DOS-Betriebssystem verlagerte, wurden immer noch leichte Z80-basierte Systeme mit längerer Akkulaufzeit eingeführt, wie das Cambridge Z88 1988 und das Amstrad NC100 im Jahre 1992-Z80 abgeleitet Z8S180 seinen Weg in einem frühen auch gefunden Stift betriebene Personal Digital assistant , die Amstrad PenPad PDA600 1993 in Hongkong ansässige VTech produziert genannt ‚Lasern‘ mit einer Reihe von kleinen Laptop - Computer basierend auf einem Z80. Die letzten beiden waren der Laser PC5 und PC6. Die Cidco MailStation Mivo 100, die erstmals 1999 auf den Markt kam, war ein eigenständiges tragbares E-Mail-Gerät mit einem Z80-basierten Mikrocontroller. Texas Instruments produzierte eine Reihe von Pocket-Organizern (Ende im Jahr 2000) mit Toshiba-Prozessoren, die um einen Z80-Kern herum gebaut wurden; der erste davon war der TI PS-6200 und gipfelte nach einer langen Produktion von einigen Dutzend Modellen in der PocketMate-Serie.

Eingebettete Systeme und Unterhaltungselektronik

Z80-basierte TK - Anlage . Der Z80 ist der dritte Chip von links, rechts neben dem Chip mit dem handgeschriebenen weißen Etikett.

Der Zilog Z80 ist seit langem ein beliebter Mikroprozessor in eingebetteten Systemen und Mikrocontroller- Kernen, wo er auch heute noch weit verbreitet ist. Zu den Anwendungen des Z80 gehören Anwendungen in der Unterhaltungselektronik , Industrieprodukten und elektronischen Musikinstrumenten. Z80 wurde beispielsweise im bahnbrechenden Musiksynthesizer Prophet-5 sowie im ersten MIDI-Synthesizer Prophet 600 verwendet . Casio hat das Z80A in seiner Videospielkonsole PV-1000 verwendet.

Eine gute Anzahl von Arcade-Videospielen der frühen 1980er Jahre, einschließlich des Arcade-Spiels Pac-Man , enthalten Z80-CPUs.

Der Z80 wurde in den Konsolen Sega Master System und Sega Game Gear verwendet . Der Sega Genesis enthält einen Z80 mit eigenen 8 KB RAM, der parallel zur Haupt-CPU des MC68000 läuft, direkten Zugriff auf die Soundchips und I/O-Ports (Controller) des Systems hat und einen geschalteten Datenpfad zum Hauptspeicherbus des 68000 (ermöglicht den Zugriff auf den 64 KB Haupt-RAM, die Software-Cartridge und den gesamten Videochip); Zusätzlich zur Abwärtskompatibilität mit Master System-Spielen wird der Z80 häufig zur Audiosteuerung in der Genesis-Software verwendet.

Z80-CPUs wurden auch in der bahnbrechenden und beliebten TI-8x-Serie von Grafikrechnern von Texas Instruments verwendet , beginnend im Jahr 1990 mit dem TI-81 , der über einen mit 2 MHz getakteten Z80 verfügt. Die meisten High-Line-Rechner der Serie, beginnend mit dem TI-82 und TI-85 , takten ihre Z80-CPUs mit 6 MHz oder höher. (Einige Modelle mit TI-8x-Namen verwenden andere CPUs, wie z. ) Die 2004 eingeführte TI-84 Plus-Serie ist ab 2020 noch in Produktion. Die 2015 eingeführte TI-84 Plus CE-Serie verwendet den von Z80 abgeleiteten Zilog eZ80- Prozessor und wird ebenfalls ab 2020 noch produziert.

In den späten 1980er Jahren war das Z80 in einer Reihe sowjetischer Festnetztelefone namens "AON" enthalten; diese Telefone erweiterten den Funktionsumfang des Festnetzes um Anrufer-ID , verschiedene Klingeltöne basierend auf dem Anrufer, Kurzwahl und so weiter. In der zweiten Hälfte der neunziger Jahre stellten die Hersteller dieser Telefone auf 8051-kompatible MCUs um, um den Stromverbrauch zu reduzieren und eine Überhitzung der kompakten Wandwarzen zu verhindern.

Siehe auch

Fußnoten

Verweise

Weiterlesen

Datenblätter und Handbücher
Hardware-Bücher
Softwarebücher
  • Programmierung des Z80 ; 3. Aufl.; Rodnay Zaks; Sybex; 630 Seiten; 1980; ISBN  978-0895880949 . (Archiv)
  • Z80 Assemblerprogrammierung ; 1. Aufl.; Lance Leventhal; Osborne/McGraw-Hügel; 642 Seiten; 1979; ISBN  978-0931988219 . (Archiv)
  • 8080/Z80 Assemblersprache - Techniken zur verbesserten Programmierung ; 1. Aufl.; Alan Miller; John Wiley & Söhne; 332 Seiten; 1981; ISBN  978-0471081241 . (Archiv)
  • Z80 und 8080 Assemblerprogrammierung ; 1. Aufl.; Käthe Spracklen; Hayden; 180 Seiten; 1979; ISBN  978-0810451674 . (Archiv)
  • Praktische Mikrocomputerprogrammierung - Der Z80 - einschließlich Source für Resident Assembler und Debug Monitor ; 1. Aufl.; Walter Weller; Nord-Technologie; 501 Seiten; 1978; ISBN  978-0930594053 . (Archiv)
  • Z80 Unterprogramme in der Assemblersprache ; 1. Aufl.; Lance Leventhal und Winthrop Saville; Osborne/McGraw-Hügel; 512 Seiten; 1983; ISBN  978-0931988912 . (Archiv)
  • Undokumentiert Z80 Dokumentiert ; Sean Young; v0.91; 52 Seiten; 2005. (Archiv)
Referenzkarten
  • Referenzkarte für den Z80-Mikroprozessor ; Shirley & Nanos; Nanosysteme; 16 Seiten; 1981. (Archiv)
  • Z80 Mikroprozessor-Sofort-Referenzkarte ; James Lewis; Mikrologik; 2 Seiten; 1981. (Archiv)

Externe Links