R O B O T R O N
Mikrorechnerbausatz Z 1 0 1 3
Handbuch Teil 1
Inhaltsverzeichnis
2.Grundbegiffe der Mikrorechentechnik
2.1.Hardware oder Software
2.2.Bestandteile eines Mikrorechners
2.2.1.Zentrale Verarbeitungseinheit
2.2.2.Speicher
2.2.2.1.Programmspeicher (Nur-Lese-Speicher)
2.2.2.2.Datenspeicher (Schreib-Lese-Speicher)
2.2.3.Ein-/Ausgabe-Einheiten
2.2.4.Verbindung der Funktionseinheiten
2.3.Programmabarbeitung
2.3.1.Ablauf in der CPU
2.3.2.Holen der Befehle
2.3.3.Darstellung von Informationen im Speicher
2.4. Grundbegiffe der Software
2.4.1.Darstellung von Zahlen
2.4.2.Logische Operationen
2.4.3.Arithmetische Operationen
3.Hardware des Z1013
3.1.Blockschaltbild
3.2.Steuerung des Mikroprozessors
3.2.1.Beschreibung der Steuersignale
3.2.2.Takterzeugung
3.2.3.Resetlogik
3.3.Speichereinheiten
3.3.1.Anschluss
3.3.2.Zusammenarbeit mit der CPU
3.4.Ein-/Ausgabe-Baugruppen
3.4.1.Parallel Ein-/Ausgabe-Baustein U855-Pio
3.4.1.1.Beschreibung der Steuersignale
3.4.1.2.Programmierung
3.4.2.Tastaturanschluss
3.4.3.Magnetbandanschluss
3.4.4.Bildschirmsteuerung
3.5.Stromversorgung
3.6.Bussystem
4.Der Befehlssatz des Mikroprozessors U880
4.1.Befehlsschluessel
4.1.1.1-Byte Befehle
4.1.2.2-Byte Befehle
4.1.3.3-Byte Befehle
4.1.4.4-Byte Befehle
4.2.Adressierung
4.2.1.Registeradressierung
4.2.2.Direktwertadressierung
4.2.3.Registerindirektadressierung
4.2.4.Indexierte Adressierung
4.3.Maschinenbefehle und ihre Bedeutung
4.3.1.Ladebefehle
4.3.2.Byte- und Doppelbyte-Zaehl-Befehle
4.3.3.Arithmetische Befehle
4.3.4.Vergleichsbefehle
4.3.5.Logische Befehle
4.3.6.Spezielle arithmetische Hilfsoperationen
4.3.7.Befehle zur Bitmanipulation
4.3.8.Verschiebebefehle
4.3.9.Sprungbefehle
4.3.10.Kelleroperationen
4.3.11.Unterprogrammoperationen
4.3.12.Ein- und Ausgabebefehle
4.3.13.Gruppenoperationen fuer Lade-, Vergleichs- und Ein-/ Ausgabe-Befehle
4.3.14.Austauschbefehle
4.3.15.CPU-Steuerbefehle
4.3.16.Bedeutung der Flags
4.4.Unterbrechungsorganisation
Bestandteile des Handbuches:
Handbuch Teil I Handbuch Teil II Anlagenteil
Dieses Kapitel ist vor allem fuer den Leser gedacht, der in der Mikrorechentechnik nicht bewandert ist. Es werden hier einige Grundbegiffe erlaeutert, die das Verstaendnis der nachfolgenden Kapitel erleichtern sollen.
Der erste Begiff, der zu klaeren waere, ist der des Mikrorechners. Ein Mikrorechner ist ein komplexes System verschiedener Funktionseinheiten auf der Basis mikroelektronischer Schalt- kreise, die auf bestimmte Art miteinander in Verbindung treten und durch ihr Gesamtverhalten eine vorgegebene Aufgabe (Programm) loesen. Ein Programm stellt dabei eine Folge von Anweisungen (Befehlen) dar.
Gekennzeichnet wird ein Mikrorechner im wesentlichen durch seine Hard- und Software. Unter Hardware wird dabei sowohl die Gesamtheit der mechanischen und elektronischen Bauelemente, wie integrierte Schaltkreise, Transistoren, Widerstaende usw., als auch die Art und Weise der Verschaltung dieser Bauelemente verstanden.
Als Software eines Rechners werden seine Programme, z. B. Betriebsprogramm und BASIC-Interpreter, bezeichnet. Das Betriebsprogramm (oder auch Betriebssystem) enthaelt die Pro- gramme, die die Zusammenarbeit der einzelnen Systemkomponenten organisieren bzw. ueberhaupt ermeeglichen. Worin unter- scheidet sich aber nun ein Mikrorechner von einer herkoemlichen Schaltung?
Um eine bestimmte Steuerungsaufgabe loesen zu koennen oder immer wiederkehrende Berechnungen zu realisieren, muss nicht immer ein Mikroprozessor verwendet werden. Vielfach ist es einfacher, eine Schaltung mit einfachen Logikschaltkreisen aufzubauen. Eine solche Schaltung haette ueberdies den Vorteil, schneller als ein Mikroprozessor zu arbeiten. Aber be- reits einfache Aenderungen der Aufgabenstellung wuerden einen neuen Schaltungsentwurf erfordern, der mit einem bestimmten Arbeitsaufwand realisiert werden musste. Komplexere Aufgabenstellungen liessen sich auf diese Art ueberhaupt nicht realisieren, da der Aufwand zu hoch werden koennte. Die Loesung einer Aufgabe mit Hilfe eines Mikrorechners ist weitaus einfacher. Der Mikroprozessor ist in der Lage, alle Verknuep- fungsmoeglichkeiten der Logikschaltkreise nachzubilden und damit jedes gewuenschte Verhalten zu realisieren. Die uebrigen Funktionseinheiten des Mikrorechnere enthalten dann in den Speichereinheiten den Loesungsablauf der Aufgabe in Form von Anweisungen fuer den Mikroprozessor, die Ausgangsdaten sowie konstante Werte. Ueber andere Funktionseinheiten werden Signale aufgenommen sowie Steuersignale wieder abgegeben. Die erreichbare Arbeitsgeschwindigkeit ist kleiner als bei reinen Logikschaltungen. Da aber nicht die maximal erreichbare Arbeitsgeschwindigkeit, sondern die fuer den jeweiligen Prozess oder die Steuerung benoetigte Geschwindigkeit entscheidend ist, ist dieser Nachteil nur in wenigen Faellen von Bedeutung.
Eine Aenderung der Aufgabenstellung fuehrt meist nur zu einer Aenderung der Anweisungen fuer den Mikroprozessor. Diese Aenderung ist schnell realisierbar. Mit dem Mikroprozessor lassen sich ohne technische Veraenderungen vielerlei Aufgabenstellungen besen, es ist meist nur erforderlich, andere Anwei- sungen zu erarbeiten.
Die Zentrale Verarbeitungseinheit, im Englischen als „Central process unit“ (CPU) bezeichnet, ist der wichtigste Bestandteil eines Mikrorechners. Eine solche CPU liesse sich aus dis- kreten Elementen, d. h. Transistoren, Widerstaenden und Kondensatoren aufbauen, wuerde aber einen sehr grossen Aufwand erfordern. Mit der Entwicklung der Mikroelektronik konnte diese Funktionseinheit in Form einer integrierten Schaltung als sogenannter Mikroprozessor bereitgestellt werden und damit zu einer wesentlichen Vereinfachung im Schaltungsentwurf beitragen. Am Beispiel des Mikroprozessors U880, der im MRB Z1013 Verwendung findet, sollen einige wichtige Bestandteile erlaeutert werden.
Dazu gehoeren:
Die Arbeit der CPU wird durch eine Reihe von Systemsignalen gekennzeichnet, die als Anschluesse herausgefuehrt wurden und das Zusammenwirken mit den angeschlossenen Funktionseinheiten steuern.
In der Mikrorechentechnik haben sich zur Speicherung von Informationen Halbleiterspeicher weitgehend durchgesetzt. Es sind integrierte Schaltungen in unterschiedlichen Gehaeusegroessen, je nach Kapazitaet des Speichers. Speicher werden zu verschiedenen Zwecken benoetigt, z. B. um der CPU die abzuarbeitenden Befehle zur Verfuegung zu stellen. Da die Register der CPU meist nicht ausreichen, alle Zwischenergebnisse aufzubewahren, muessen diese ebenfalls in den Speicher gebracht werden.
Als Modell eines Speichers mag ein langer Schrank mit vielen Faechern dienen. Diese Faecher sind einzeln numeriert. Diese Numerierung soll bei Null beginnen und lueckenlos bis zu einem Endwert erfolgen. Jedes Fach entspricht einem Speicherplatz und kann eine Information enthalten. Die maximale Anzahlnder Faecher bestimmt die Kapazitaet dieses Speichers.
Die Zeit, die vom Anlegen einer Speicherplatzadresse bis zur Bereitstellung der gespeicherten Daten beneetigt wird, wird Zugriffszeit genannt.
Zwischen der Speicherung von Daten und Programmen bestehen einige Unterschiede. Programme werden meist in Speichern aufbewahrt, die auch nach Abschalten der Versorgungsspannung ihren Inhalt behalten. Allerdings koennen diese Speicher nur gelesen werden, zum Beschreiben dieser Speicher sind spezielle Einrichtungen notwendig.
In einem Programmspeicher sind die Anweisungen fuer einen Mikroprozessor enthalten. Diese Anweisungen gehen auch nach Ausschalten des Rechners nicht verloren, sie sind nicht fluechtig. Diese Speicher bezeichnet man als Nur-Lese-Speicher (Read only memory - ROM), die Informationen werden einmal eingegeben und stehen staendig zur Verfuegung. Je nach Eingabe der Information unterscheidet man: ROM's, die bereits waehrend der Herstellung ihre Informationen erhalten und ROM's, die nachtraeglich elektrisch programmiert werden koennen (ein einmaliger Vorgang, da die Struktur des Speichers veraendert wird). Diese letztgenannten Speicher heissen PROM (Prograinmable ROM). Eine weitere Speicherart kann sowohl programmiert als auch wieder geleescht werden. Das Loeschen erfolgt mit ultraviolettem Licht (UV-Licht) und loescht immer den gesamten Speicher. Diese Speicherart nennt man EPROM (Erasable PROM). Das Einschreiben der Programme in den EPROM geschieht mit speziellen Funktionseinheiten, sogenannten EPROM- Programmiergeraeten. In den EPROM wird die zu speichernde Information mittels einer Programmierspannung als Ladungsmenge eingegeben. Nach Erreichen einer vorgegebenen Ladung ist der Baustein programmiert. Die Bestrahlung mit UV-Licht hat zur Folge, dass die gespeicherte Ladungemenge wieder abgebaut wird. Nach dem Loeschen ist der EPROM wieder programmierbar.
Zur Aufbewahrung von Zwischenergebnissen oder anderen veraenderbaren Informationen werden Schreib-Lese-Speicher verwendet. Da diese Speicher wahlweise gelesen oder beschrieben werden koennen, nennt man sie Speicher mit wahlfreiem Zugriff (Random access memory - RAM). Mit Abschalten der Stromversorgung verlieren RAM's ihren Inhalt, sie sind also nicht zur Aufbewah- rung von Informationen verwendbar, die immer verfuegbar sein muessen. Es werden zwei grundsaetzliche Typen unterschieden: statische und dynamische RAM's.
In den statischen RAM's werden Transistorkombinationen zur Aufbewahrung der Informationen verwendet. Eine solche Transistorkombination kann zwei verschiedene Zustaende annehmen und behaelt eine somit eingetragene Information bis zum Abschalten oder Ueberschreiben mit einer neuen Information.
Dynamische RAM's speichern die, Information als Ladung eines kleinen Kondensators ab. Diese Ladung muss, auf Grund der Selbstentladung, periodisch erneuert werden, dieser Vorgang wird mit REFRESH (Auffrischen) bezeichnet. Das Auffrischen wird bereits erreicht, wenn der Speicher gelesen wird. Die CPU U880 unterstuetzt diesen Vorgang durch Aussenden einer REFRESH-Information, um die zeitlichen Bedingungen zum Auffrischen unter allen Umstaenden zu gewaehrleisten. Werden die Zellen der dynamischen RAM's nicht spaetestens nach 2 Millisekunden aufgefrischt, geht ihre gespeicherte Information verloren.
Trotz des nicht unerheblichen Mehraufwandes werden dynamische RAM's verwendet, da sie bei gleichen Abmessunngen der Bausteine eine groessere Speicherkapazitaet und kleinere Leistungsaufnahme gegenueber statischen RAM's aufweisen.
Unter externen Geraeten sollen im folgenden alle Geraete verstanden werden, mit denen Informationen in den Mikrorechner eingegeben oder vom Mikrorechner ausgegeben werden. Damit ist es moeglich, sowohl Daten als auch Programme in den Mikrorechner zu bringen und die Ergebnisse fuer den Nutzer sichtbar zu machen. Solche Geraete sind Lochbandleser und -stanzer, Magnetbandtechnik, Tastaturen, Bildschirm usw.
Die Verbindung dieser Geraete mit dem Mikroprozessor erfolgt ueber sogenannte E/A-Funktionseinheit en, in denen spezielle integrierte Schaltungen enthalten sind. Diese Funktionseinheiten steuern selbstaendig die Arbeit der Geraete und treten mit der CPU nur zur Informationsuebermittlung in Kontakt. Damit wird die CPU entlastet und die Programmabarbeitung wesentlich effektiver.
Weiterhin koennen auch Funktionseinheiten angeschlossen werden, die beliebig zur Verfuegung gestellte Meldesignale aus zu ueberwachenden Prozessen aufnehmen und sie fuer den Mikroprozessor aufbereiten. Gleichermassen ist die Abgabe von Steuersignalen zur Beeinflussung bestimmter zu steuernder Prozesse moeglich. Als integrierte Schaltkreise werden dazu im MRB Z1013 parallele E/A-Schaltkreise (Parallel Input OutputPIO) vom Typ U855 verwendet.
Der Mikroprozessor (CPU) sendet Signale ab und wertet bestimmte empfangene Signale aus. Diese Signale werden i. a. in allen angeschlossenen Funktionseinheiten benoetigt.
Die Leitungen zur Uebermittlung von Daten, Adressen und Systemsignalen, wie z. B. LESEN, SCHREIBEN, werden entsprechend ihrer Funktion zu Leitungsbuendeln zusammengefasst.
Da diese Leitungen die Daten und Informationen zwischen den einzelnen Funktionseinheiten transportieren, wurde der Begriff „Bus“ fuer ein solches Leitungsbuendel gepraegt.
Demzufolge bezeichnet man die Datenleitungen als DATENBUS, die Adressleitungen werden als ADRESSBUS und die Systemleitungen als STEUERBUS bezeichnet. Gelegentlich steht der Begiff „SYSTEMBUS“ auch fuer alle Leitungen innerhalb des Mikrorechnersystems.
Durch Verwendung eines einheitlichen Systembusses ist es moeglich, beliebige Funktionseinheiten einem bestehenden System hinzuzufuegen, d. h. das System staendig zu erweitern. Voraussetzung ist die Uebereinstimmung der elektrischen Anschluesse der jeweiligen Einheiten.
Wie bereits gesagt, beneetigt die CPU zur Lossung ihrer Aufgaben Anweisungen, die den gesamten Ablauf des Mikrorechners steuern. Diese Anweisungen oder Befehle findet die CPU in den angescohlossenen Speichereinheiten in einer ganz bestimmten, fuer sie verstaendlichen Form, die als Maschinenkode bzw. MC bezeichnet wird. Alle Anweisungen an die CPU muessen also in Form dieses MC vorliegen bzw. sind in diese Form zu bringen. Im Anhang befindet sich eine Uebersicht, in der die Befehle des U880 sowie deren Darstellung im Maschinenkode enthalten sind.
Um eine bestimmte Anweisungsfolge abzuarbeiten, ist es notwendig, der CPU mitzuteilen, in welchem Speicherbereich diese Befehle zu finden sind. Die CPU liest in diesem Bereich den Speicher und versucht die gelesenen Informationen als Befehl auszufuehren. Dazu werden die gelesenen Informationen ins Befehlsregister transportiert und steuern von hier den Ablauf in der CPU. In Abhaengigkeit vom konkreten Befehl werden entweder zusaetzliche Informationen aus dem Speicher gelesen, werden Daten zum oder vom Speicher transportiert oder bestimmte logische Verknuepfungen in der ALU vorgenommen. Alle diese Aktivitaeten der CPU sind mit dem Aussenden bestimmter Steuersignale verbunden, die die jeweilige Art der Operation anzeigen.
Einen Ueberblick ueber die Steuersignale bei einigen ausgeaehlten Operationen gibt Anlage 10. Zwischenzeitlich waehrend der Befehlsverarbeitung sendet die CPU mit Hilfe des REFRESH-Registers eine Information zum Auffrischen des Speicherinhaltes eventuell angeschlossener dynamischer Speicher aus. Waehrend des Refresh-Zyklus wird der Befehl ausgefuehrt.
War der eben abgearbeitete Befehl ein Verarbeitungs- oder Transportbefehl, dann wird die Verarbeitung mit dem im Speicher folgenden Befehl fortgesetzt. Einige Befehle veraendern aber diese Abarbeitungsreihenfolge, sie teilen der CPU mit, in welchem Speicherbereich der naechste Befehl zu finden ist.
Nach erfolgter Programmabarbeitung kann die CPU anhalten oder ein Steuerprogramm bearbeiten, mit dem z. B. die naechste Aufgabe ausgewaehlt werden kann.
Fuer die Organisation der Befehlsabarbeitung besitzt die CPU ein besonderes Register, den Befehlszaehler (PC). Der Befehlszaehler besitzt 16 Bitstellen entsprechend der Anzahl der Adressleitungen. Beim Betaetigen der RESET-Taste wird dieses Register auf Null gesetzt. Damit liest die CPU den ersten abzuarbeitenden Befehl auf dem Platz Null.
Aus diesem Grund muss ein Programm ab dieser Stelle beginnen. Um ein solches Programm ab Null nach dem Einschalten zur Verfuegung zu stellen, ist ein nicht fluechtiger Speicher, z. B. ein EPROM notwendig. Befindet sich in diesem Speicherbereich kein Programmspeicher, so findet die CPU zufaellige Bitkombinationen, die als Befehl aufgefasst und abgearbeitet werden.
Es kann also immer nur ein Programm nach dem Einschalten gestartet werden. Das wird im Normalfall ein Steuerprogramm sein, mit dem andere Programme aktiviert werden koennen. Soll ein anderes Steuerprogramm verwendet werden, ist der entsprechende Programmspeicher auszuwechseln. Da Programme auch in den Schreib-Lese-Speicher (RAM) geladen werden koennen, kann der Speicherbereich ab Null als RAM ausgelegt werden. Dann muss aber durch die Hardwareschaltung das Erreichen eines Steuerprogramms sichergestellt werden, welches in einem beliebigen Speicherbereich stehen kann. Es koennen nun beliebige Betriebsprogramme in den Bereich ab Null geladen und verwendet werden, ohne jedesmal den Speicher auswechseln zu muessen. Damit ist ein solches System jeder Aufgabenstellung anpassbar.
Der Bereich ab Null ist noch aus einem anderen Grunde besonders fuer Betriebsprogramme geeignet. Er enthaelt einige ausgewaehlte Adressen, die sowohl von Programmen (sogenannte RESTART-Befehle) als auch im Resultat von externen Ereignissen (sogenannten Programmunterbrechungen) benoetigt werden.
Das Lesen der Befehle oder auch anderer Informationen geschieht durch Aussenden einer Adresse, begleitet von bestimmten Steuersignalen.
Durch eine Speicherverwaltung werden aus bestimmten Stellen dieser Adresse die Auswahl der entsprechenden Speichereinheit sowie eines Speicherbereiches vorgenommen. Der niederwertige Teil der Adresse wird verwendet, um in dem betreffenden Speicherbereich den konkreten Platz zu adressieren.
War die dort vorgefundene Information ein Befehl fuer die CPU so wird automatisch der Befehlszaehler entsprechend der Befehlslaenge erhoeht (inkrementiert) und damit die neue Befehls- adresse bereitgestellt. Wurde der Befehl als ein Verzweigungsbefehl erkannt, wird im Befehlszaehler die neue Adresse bereitgestellt und dann erneut durch Aussenden dieser Adresse ein bestimmter Speicherplatz ausgewaehlt.
Bisher wurde immer nur allgemein von „Informationen“ gesprochen, die in einem „Speicher“ zu finden sind. Diese Informa- tionen waren sowohl Daten als auch Befehle, die in unterschiedlichen Speichertypen aufbewahrt wurden (ROM bzw. EPROM oder RAM).
Hinsichtlich ihrer Darstellung im Speicher unterscheiden sich diese Informationen auch nicht; es waere auch meeglich, Daten als Befehle zu betrachten und umgekehrt. Bei einer Abarbeitung durch die CPU kommen dabei selten sinnvolle Ergebnisse zustande.
Es wurde bereits der Speicher mit einer endlichen Anzahl Faecher eines Schranken verglichen, in denen Informationen abgelegt werden koennen. Durch eine Adresse wird die Nummer eines konkreten Faecher bereitgestellt.
Wenn Informationen sowohl gelesen als auch abgelegt werden koennen, entspricht das dem Prinzip des Schreib-Lese-Speichers. Als Information kann das Vorhandensein eines Zeichens, einer Markierung oder dergleichen gedeutet werden. Ist diese Markierung dauerhaft (eingraviert), so handelt es sich um einen Nur-Lese-Speicher. In einem Kanten koennen auch mehrere Informationen enthalten sein. Analog dazu sind die Speicher im Mikrorechner aufzufassen.
Eine Funktionseinheit „Speicher“ besteht aus einer bestimmten Anzahl adressierbarer Plaetze, wobei jeder Platz zwei verschiedene Zustaende annehmen kann. Diese beiden Zustaende werden durch die Dualziffern „0“ und „1“ repraesentiert. Die Auswahl dieser Plaetze erfolgt ueber sogenannte Adressleitungen, die Anzahl der Leitungen richtet sich nach der Kapazitaet des Speichers. Der einfachste Aufwand ergibt sich bei der Festlegung der Speicherkapazitaet, d. h. der Anzahl der adressierbaren Speicherplaetze, als ein Vielfaches einer Potenz zur Basis 2.
Eine Adressleitung kann zwei Zustaende annehmen, entweder hohen Spannungspegel, sogenannten „H-Pegel“ (logisch „1“), als auch niedrigen Spannungspegel, sogenannten „L-Pegel“ (logisch „0“). Damit waeren zwei verschiedene Speicherplaetze adressierbar. Zwei Adressleitungen koennen zusammen bereits 4 Zustaende annehmen, damit sind 4 verschiedene Speicherplaetze (mit den Adressen 00, 01, 10 und 11) adressierbar. Demzufolge werden bei 10 Adressleitungen 2 hoch 10=1024=1K Speicherplaetze adressiert.
Damit ergibt sich:
Kapazitaet = 2 hoch n (n = Anzahl der Adressleitungen)
Die CPU U880 hat 16 Leitungen fuer die Bildung von Adressen zur Verfuegung, d. h. sie kann maximal 2 hoch 16 = 65536 ^= 64K Speicherplaetze adressieren.
Eine weitere Eigenschaft einer Speichereinheit ist die Aufrufbreite. Hierunter wird verstanden, wieviel Speicherplaetze gleichzeitig mit einer Adresse angesprochen werden koennen, um die Information parallel zu verarbeiten. Diese Aufrufbreite ist verschieden: bei ROM's und EPROM's betraegt sie 8 Stellen, bei statischen RAM's 1, 4 oder 8 Stellen und bei dynamischen RAM's im allgemeinen eine Stelle. Um die moegliche Verarbeitungsbreite des Mikroprozessors U880 mit 8 Datenleitungen zu nutzen, muessen in einer Speichereinheit mehrere Speicherschaltkreise kombiniert werden, um damit die gewuenschte Aufrufbreite zu realisieren. Das geschieht, indem die Adressanschluesse von acht Speicherschaltkreisen mit den jeweiligen Adressleitungen der CPU verbunden werden. Jeder der Speicherschaltkreise wird an einer Datenleitung angeschlossen, die Auswahl erfolgt fuer alle acht Schaltkreise mit einem gemeinsamen Auswahlsignal.
Das Wesentliche bei der Programmabarbeitang besteht in der Veraenderung der eingegebenen Zahlen, um die gewuenschten Ergebnisse zu erhalten. Das gewohnte Dezimalsystem ist fuer die Zahlendarstellung im Mikrorechner nicht geeignet; die zwei moeglichen Zustaende fuehren auf ein anderes Zahlensystem, das sogenannte Dualsystem. Dieses kennt nur die Ziffern 0 und 1, welche mit dem „L“- und „H“-Pegel der Informationsspeicherung identisch sind.
Da aber die Bildung von Zahlen sowohl im Dezimalsystem als auch im Dualsystem nach gleichen Gesetzmaessigkeiten verlaeuft, ist eine Umrechnung unproblematisch und kann durch entsprechende Programme vom Mikroprozessor vorgenommen werden.
Diese Zahlenbildung kann mit folgender Gleichung beschrieben werden:
n n-1 1 0 Z = d * x + d * x +...+ d * x + d * x
wobei bedeuten:
Im Dezimalsystem kann d die Ziffern 0 … 9 annehmen, x ist dann gleich 10. Im Dualsystem ist d entweder 0 oder 1, die Basis ist gleich 2.
Ein Beispiel soll das verdeutlichen.
2 1 0 123 = 1 x 10 + 2 x 10 + 3 x 10 (dezimal) 6 5 4 3 2 = 1 x 2 + 1 x 2 + 1 x 2 + 1 x 2 + 0 x 2 + 1 0 1 x 2 + 1 x 2 = 11111011B (dual)
Das „B“ hinter der Dualzahl soll zur Unterscheidung zur Dezimalzahl, die ohne Kennzeichnung geschrieben wird, dienen. „B“ bedeutet „binaer“, abgeleitet von den zwei Zustaenden. Nun waere eine solche Umrechnung per Hand kompliziert. Es gibt jedoch ein einfaches Umrechnungsverfahren, das am deutlichsten durch ein Beispiel wird.
123 : 2 = 61 Rest: 1--------------------- -------| | | | V | 61 : 2 = 30 1------------------- | -------| | | | | | V | | 30 : 2 = 15 1----------------- | | -------| | | | | | | | V | | | 15 : 2 = 7 1--------------- | | | -------| | | | | | | | | | V | | | | 7 : 2 = 3 1------------- | | | | -------| | | | | | | | | | | | V | | | | | 3 : 2 = 1 1----------- | | | | | -------| | | | | | | | | | | | | | V | | | | | | 1 : 2 = 0 1--------- | | | | | | | | | | | | | V V V V V V V Binaer: 1 1 1 1 0 1 1 B ==============
Die Speichereinheiten in U880 Systemen, wie dem Z1013, besitzen in der Regel eine Aufrufbreite von 8 Bit. Das heisst, auf einem Speicherplatz sind gleichzeitig 8 Bit, die zu einem Byte zusammengefasst werden, gespeichert. Ein Byte kann demzufolge 2 hoch 8 = 256 verschiedene Werte annehmen.
Fuer ein Byte ergeben sich die folgenden Wertigkeiten fuer die einzelnen Bits:
Byte:
Wertigkeit oder +-----------------------------------------+ Exponent zur | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | Basis 2 +-----------------------------------------+ | 128 | 64 | 32 | 16 | 8 | 4 | 2 | 1 | Zahlenwert +-----------------------------------------+ | hoeherwertiges | niederwertiges | Halbbyte +-----------------------------------------+ (BCD-Ziffer)
Die in der Bytedarstellung eingetragenen Ziffern geben die Numerierung der einzelnen Bit's an. Das Bit 0 besitzt die niedrigste Wertigkeit, das Bit 7 die hoechste.
Eine vorzeichenlose ganze Zahl mit der Bitfolge 01001010B kann auch in der Form:
Z = 0*128 + 1*64 + 0*32 + 0*16 + 1*8 + 0*4 + 1*2 + 0*1 = 74
geschrieben werden.
Sollen auch negative Zahlen dargestellt werden, besitzt das Bit 7 die Funktion des Vorzeichens.
Eine Dualzahl 10110110B kann als
Z = -1*128 + 0*64 +1*32 + 1*16 + 0*8 + 1*4 + 1*2 + 0*1 = - 74
aufgefasst werden, diese Art bezeichnet man als Zweierkomplement. Damit ergibt sich ein Zahlenbereich fuer ganze vorzeichenlose Zahlen von 0 bis 255 und fuer vorzeichenbehaftete Zahlen von -128 ueber 0 bis +127.
Sollen greessere Zahlen dargestellt werden, muessen 2 und mehr Byte dafuer genutzt werden. Die Zusammenfassung von 2 Byte wird als Wort bezeichnet, analog dazu 4 Byte als Doppelwort.
Die einzelnen Byte des Maschinenkodes werden als Dualzahlen, d. h. als Ziffemfolgen von „0“ oder „1“ dargestellt. Insbesondere bei grossen Programmen ergibt sich damit ein sehr grosser Schreibaufwand, um diese Dualzahlen zu notieren. Deshalb hat sich ein anderes Zahlensysten, das sogenannte Hexadezimalsystem fuer die Darstellung von Zahlen und Programmen bei Mikrorechnern durchgesetzt. (Die Bezeichnung Hexadezimalsystem ist umgangssprachlich, exakt heisst es Sedezimalsystem.) Im Hexadezimalsystem werden 4 benachbarte Dualziffern zusammengefasst und durch eine Hexadezimalziffer dargestellt. Mit vier Dualziffern koennen 16 verschiedene Zustaende dargestellt werden. Die Zahlen „0“ bis „9“ sind gleich den Dezimalzahlen, groesser als „9“ werden die ersten Buchstaben des Alphabets verwendet. Die folgende Tabelle enthaelt eine Gegenueberstellung von Dual-, Dezimal- und Hexadezimalziffern.
DUAL DEZ HEX | DUAL DEZ HEX ------------------------------+--------------------------- | 0 0 0 0 0 0 | 1 0 0 0 8 8 0 0 0 1 1 1 | 1 0 0 1 9 9 0 0 1 0 2 2 | 1 0 1 0 10 A 0 0 1 1 3 3 | 1 0 1 1 11 B 0 1 0 0 4 4 | 1 1 0 0 12 C 0 1 0 1 5 5 | 1 1 0 1 13 D 0 1 1 0 6 6 | 1 1 1 0 14 E 0 1 1 1 7 7 | 1 1 1 1 15 F
Da in einem Byte (mit 8 Bit) zwei sogenannte Halbbyte zu je 4 Bit enthalten sind, kann ein Byte mit 2 Hexadezimalziffern dargestellt werden. Die binaere Darstellung der Dezimaizahlen von 0 bis 9 nennt man auch BCD-Zahlen, Auch mit dieser Zahlendarstellung kann gerechnet werden. Dabei muss aber eine Dezimalkorrektur vorgenommen werden. Warum und wie, wird bei der Erlaeuterung des DAA-Befehls im Befehlssatz genauer erklaert. Zur besseren Unterscheidung zu den Dezimalzahlen verden die Hexadezimalzahlen in Protokollen oder Drucklisten durch ein nachgestelltes Zeichen „H“ gekennzeichnet.
Nehmen wir z. B. ein Byte in Binaerdarstellung:
0111 1011B = 7BH = 123 1. 2. Halbbyte
Dabei sind die Wertigkeiten der einzelnen Bits in einem Halbbyte:
3 2 1 0 Wertigkeit ------- 8 4 2 1 Zahlenwert
Die Umwandlung einer Hexadezimalzahl in die entsprechende Dezimalzahl geschieht am einfachsten auf folgende Weise:
1 0 7BH = 7x16 + Bx16 1 0 = 7x16 + 11x16 = 123
Die Umrechnung Dezimal- in Hexadezimalzahl erfolgt nach einem analogen Schema wie die Umrechnung Dezimal- in Dualzahl, z. B.
Dez. Hex. 45 346 : 16 = 2 834 Rest 2 2 ----------- 2 834 : 16 = 177 2 2 --------- | 177 : 16 = 11 1 1 ------- | | 11 : 16 = 11 11 B ----- | | | | | | | V V V V Hex.-Zahl: B 1 2 2 H =======
Um den Vorteil dieser Schreibweise deutlich werden zu lassen, hier zum Vergleich diese Zahl in Binaerdarstellung:
1011 0001 0010 OO1OB.
Mit den Dualzahlen lassen sich verschiedene logische Operationen durchfuehren. Bei den logischen Verknuepfungen werden die Dualzahlen als vorzeichenlose, ganze Zahlen aufgefasst.
Die wichtigsten dieser Operationen sind:
Zahl: 0 1 0 0 1 0 1 0 --------------------------------- Ergebnis: 1 0 1 1 0 1 0 1
Diese Operation wird nur mit einer Dualzahl durchgefuehrt.
In Stromlaufplaenen finden Sie dafuer das folgende Sinnbild:
1. Zahl: 0 1 0 0 1 0 1 0 2. Zahl: 0 0 0 1 1 1 1 1 ------------------------------- Ergebnis: 0 0 0 0 1 0 1 0
Sinnbild:
Zur besseren Darstellung der logischen Operationen ist es ueblich, sich eine beliebige Bitposition auszuwaehlen und in einer Wertetabelle alle moeglichen Kombinationen und deren Ergebnisse zu erfassen. Die Wertetabelle der Konjunktion besitzt danach folgendes Aussehen (gleiche Bitposition vorausgesetzt):
1. Zahl | 2. Zahl | Ergebnis ----------------------------------------- 0 | 0 | 0 0 | 1 | 0 1 | 0 | 0 1 | l | 1
Besonders bei komplizierten Verknuepfungen stellt die Wertetabelle ein sehr einfaches Hilfsmittel dar.
1. Zahl | 2. Zahl | Ergebnis ------------------------------------ 0 | 0 | 1 0 | 1 | 1 1 | 0 | 1 1 | 1 | 0
Sinnbild:
1. Zahl | 2. Zahl | Ergebnis ------------------------------------ 0 | 0 | 0 0 | 1 | 1 1 | 0 | 1 1 | 1 | 1
Sinnbild:
1. Zahl | 2. Zahl | Ergebnis ------------------------------------ 0 | 0 | 1 0 | 1 | 0 1 | 0 | 0 1 | 1 | 0
Sinnbild:
1. Zahl | 2. Zahl | Ergebnis ------------------------------------ 0 | 0 | 0 0 | 1 | 1 1 | 0 | 1 1 | 1 | 0
Sind beide Dualzahlen gleich, wird das Ergebnis auf Null gesetzt. Das wird besonders verwendet, um einen bestimmten Zwischenspeicher, z. B. das A-Register der CPU, zu loeschen, indem der Inhalt des A-Registers mit sich selbst durch einen XOR-Befehl verknuepft wird (X0R A).
Zu den arithmetischen Operationen gehoeren Addition und Subtraktion. Die Multiplikation zweier Dualzahlen kann durch fortlaufende Addition einer Dualzahl bei gleichzeitiger Verringerung der anderen Dualzahl, bis diese Null ist, vorgenommen werden. Auch eine teilweise Addition, kombiniert mit Verschiebung von Ergebnis und Operand ist ueb]ich. Die Division kann analog dazu als eine fortlaufende Subtraktion einer Dualzahl von einer anderen durchgefuehrt werden. Dabei wird der Dividend solange vom Divisor subtrahiert und der Quotient jeweils um 1 erhoeht, bis der Divisor kleiner als der Dividend geworden ist. Der Quotient als Ergebnis enthaelt damit die Anzahl der benoetigten Subtraktionsschritte, im Divisor ist der Rest enthalten.
Nachfolgend die arithmetischen Operationen im einzelnen:
Es empfiehlt sich, die Beispiele mit anderen Zahlen selbst noch einmal nachzuvollziehen.
0 + 0 = 0 0 + 1 = 1 1 + 0 = 1 1 + 1 = 0 Uebertrag 1
Sollen z. B. die Zahlen 26 und 43 miteinander addiert werden, ergibt das folgende Rechnung:
26: 0 0 0 1 1 0 1 0 43: 0 0 1 0 1 0 1 1 Uebertraege: 1 1 1 1 ---------------------------------- Ergebnis: 0 1 0 0 0 1 0 1 = 69
Werden zwei Zahlen addiert, deren Ergebnis den Zahlenbereich ueberschreitet, kommt es zum Üeberlauf, d. h. das ermittelte Ergebnis ist falsch. An der Addition der Zahlen 69 und 73 soll das im Rechenschema gezeigt werden.
69: 0 1 0 0 0 1 0 1 Zahlenbereich: 73: 0 1 0 0 1 0 0 1 -128 <= x <= 127 Uebertraege: 1 1 ----------------------------------- Ergebnis: 1 0 0 0 1 1 1 0 = -114
Im Ergebnis entsteht die Zahl -114, obwohl die Addition dieser Zahlen zu dem Ergebnis 132 fuehren muesste. Dieser Ueberlauf ist dadurch charakterisiert, dass ein Uebertrag in die Vorzeichenstelle ein-, aber kein Uebertrag aus der Vorzeichenstelle herauslaeuft.
1. Zahl 2. Zahl Ergebnis 0 - 0 = 0 0 - 1 = 1 (0-1 => 10-1 => 1+Uebertrag) 1 - 0 = 1 | 1 - 1 = 0 '->geborgte 1'
Subtrahiert man die Dualzahl 26 von der 43, so ergibt sich folgendes Rechenschema:
43: 0 0 1 0 1 0 1 1 26: 0 0 0 1 1 0 1 0 Uebertraege: 1 ---------------------------------- Ergebnis: 0 0 0 1 0 0 0 1 = 17
Subtrahiert man die Zahlen in anderer Weise, d. h. die Dualzahl 43 von der 26, so kann man auch einen Vorzeichenwechsel beobachten.
26: 0 0 0 1 1 0 1 0 43: 0 0 1 0 1 0 1 1 Uebertraege: 1<= 1 1 1 1 1 1 ---------------------------------- Ergebnis: 1 1 1 0 1 1 1 1 = -17
Da hier aber ein Uebertrag sowohl in die Vorzeichenstelle hinein als auch ein Uebertrag aus der Vorzeichenstelle heraus erfolgt, handelt es sich um keinen Ueberlauf und das Ergebnis ist korrekt. Dieser herauslaufende Uebertrag wird bei Zahlen im Wort- oder Doppelwortformat weiterverwendet.
-17: 1 1 1 0 1 1 1 1 Negation: 0 0 0 1 0 0 0 0 Addition: 1 ---------------------------------- Ergebnis: 0 0 0 1 0 0 0 1 = 17
Das Zweierkomplement wird verwendet, um eine Subtraktion auf eine Addition zurueckzufuehren.
Die Addition einer Zahl und ihres Zweierkomplements liefert als Ergebnis immer eine Null.
Abschliessend noch ein Beispiel zur Multiplikation, die hier als eine fortlaufende Addition betrachtet werden soll.
Es werden die Dualzahlen 9 und 5 miteinander multipliziert:
Ausgangawerte: 5: 0 0 0 0 0 1 0 1 9: 0 0 0 0 1 0 0 1 Multiplika- tor 5 9: 0 0 0 0 1 0 0 1 5 +9: 0 0 0 0 1 0 0 1 4 ------------------- = 0 0 0 1 0 0 1 0 3 +9: 0 0 0 0 1 0 0 1 ------------------- = 0 0 0 1 1 0 1 1 2 +9: 0 0 0 0 1 0 0 1 ------------------- = 0 0 1 0 0 1 0 0 1 +9: 0 0 0 0 1 0 0 1 ------------------- Ergebnis: = 0 0 1 0 1 1 0 1 = 45
Die Multiplikation mit teilweiser Addition und Verschiebung kann analog zur Multiplikation von Dezimalzahlen dargestellt werden:
Ausgangswerte: 0 0 0 0 1 0 0 1 * 0 1 0 1 ---------------------------------------------- 0 0 0 0 1 0 0 1 | 1 0 0 0 0 0 0 0 0 | 0 = 5 0 0 0 0 1 0 0 1 | 1 0 0 0 0 0 0 0 0 | 0 ---------------------------------------------- Ergebnis: 0 0 0 0 0 1 0 1 1 0 1 = 45
Bei der teilweisen Addition kann ebenfalls ein Uebertrag auftreten, d. h. der Zahlenbereich ueberschritten werden. Wenn die Kontrolle nicht in jedem Zwischensohritt vorgenommen wird, ist mit fehlerhaften Ergebnissen zu rechnen.
Am konkreten Beispiel des MRB Z1013 soll in diesem Kapitel die Arbeitsweise eines Mikrorechners erlaeutert werden. Grundlage dafuer bilden Stromlaufplaene des Z 1013, die Sie in der, Anlage 16 finden.
_____ ___________ __________ ___________ | | | Betriebs- | | Arbeits- | | | | | | system | | RAM | | | | | | ROM | | | | | <-> MBG | | ----|-|---- ---|-|---- | | | | | | | | | | | |------- ---------- ------| Parallel- | 8-bit | CPU | Systembus | E/A |---- E/A | |-------| |-----| |----| |----| |---- Schnitt --|-- | | | | | | ----| |---- stelle | | | | | | | |^| ----- ---------- | | ------- ----------- | | | | | | | | | | |Takt-| | Bild- | | | | Aus- |-| Tastatur | |gene-| | schirm- | | | | gabe- |>| | |rator| | steuerg. | | | | tor |-| | | | | | | | | | | | ----- ---------- | | ------- ----------- | | | BAS | | | |------| | | | ____|__ | | | | HF- | | | | | Modu- | | | | | lator | | | | ------- | | | | | | TV-Geraet Systemsteckverbinder
Um den ordnungsgemaessen Betrieb der CPU zu gewaehrleisten, sind bestimmte Steuersignale notwendig. Andere Signale werden von der CPU gebildet und kennzeichnen bestimmte Zustaende waehrend der Abarbeitung von Befehlen. Im folgenden werden alle Steuersignale der CPU und des Systembusses beschrieben.
Signale, die mit einem Schraegstrich beginnen, sind sogenannte LOW-aktive Signale, die normalerweise H-Pegel fuehren und bei ihrer Aktivierung L-Pegel zeigen.
Nach dem Signal steht in Klammern ein „A“ fuer von der CPU ausgesandte, ein „E“ fuer von der CPU empfangene und ein „B“ fuer Signale, die sowohl von der CPU empfangen als auch ausgesandt werden koennen.
(A-Ausgabe, E-Eingabe, B-bidirektional, d. h. sowohl Ein- als auch Ausgabe)
Weiterhin umfasst der Systembus folgende Signale, die nichtvon der CPU ausgesandt oder empfangen werden:
Der Taktgenerator wird durch drei Gatter von A6, dem Kondensator C7.1 und den Widerstaenden R38 und R39 gebildet. Stabilisiert wird die Taktfrequenz durch den Schwingquarz Q1. Dieser schwingt mit einer Frequenz von 8 MHz. Der Takt wird dem Binaerteiler A3 zugefuehrt, an dessen Ausgaengen die Taktfrequenzen von 4 MHz, 2 MHz und 1 MHz anliegen. Der Z 1013.01 arbeitet standardmaessig mit 1 MHz Systemtakt, der Z 1013.12 mit 2 MHz.
Hinweis: Das Umruesten des Z 1013.01 auf 2 MHz fuehrt zum Erloeschen der Garantie. Die Taktfrequenz 4 MHz ist nicht zugelassen!
Je nach Lage von El erhaelt die CPU den Takt mit der Frequenz entsprechend folgender Zuordnung:
Lage | Systemtakt |
---|---|
E1.1 | 1 MHz |
E1.2 | 2 MHz |
Mittels des Widerstandes R52 erfolgt noch die erforderliche Pegelanpassung zur Speisung der CPU (A7) und des E/A-Schaltkreises A45.
Dieser Takt realisiert die Synchronitaet aller Zeitablaeufe.
Um einen definierten Anfangszustand der CPU zu erreichen, ist die RESET-Steuerung erforderlich. RESET kann von 3 Stellen ausgeloest werden:
Eine spezielle Schaltung sorgt dafuer, dass der Datenbustreiber A1 inaktiv wird, d. h. er wird vom Prozessor getrennt. Unmittelbar an der CPU werden die Datenleitungen ueber die Widerstaende R44 … R51 auf Masse, d. h. L-Pegel gelegt.
Da die CPU nach aktiven RESET den Befehlszaehler auf die 0000H einstellt, werden nun auf dieser Adresse die Daten 00H gelesen. Das bedeutet fuer den Prozessor die Ausfuehrung eines sogenannten Leerbefehls (NOP, s. 4.3.15). Bei dessen Ausfuehrung wird der Befehlszaehler um eins erhoeht. Auf diese Art und Weise zaehlen die Adressen hoch, bis die Adresse des Betriebssystems erreicht wird und das Signal /CS aktiviert wird, das den Datenbus mit Hilfe der Logik wieder frei gibt. Als naechstes wird jetzt der erste Befehl des Betriebssystemprogrammes gelesen und dieses wird abgearbeiet.
Damit die Laenge des Reset-Impulses ven der Laenge der Betaetigung unabhaengig wird, wurde ein Monoflop verwendet. Damit wird eine zeitgerechte Aufffrischung der dynamischen Speicher gewaehrleistet. Einige periphere Schaltkreise besitzen keinen Reset-Anschluss. Sie werten das alleinige Auftreten des Signale /M1 als Resetimpuls. Damit auch diese Schaltkreise in einen definierten Anfangszuetand versetzt werden koennen, wurden die Signale /RESET und /M1 zum Signal /PM1 verknuepft, welches die Ruecksetzfunktion ausfuehrt.
Der Anschluss der Speicherschaltkreise ist abhaengig vom Typ. Im MRB Z1013 werden drei Arten verwendet
In einem PROM U 2616 bzw. ROM U 2316 (A14) ist das Monitorprogramm enthalten. Dieser Schaltkreis besitzt eine Kapazitaet von 2048 (=2K) Speicherplaetzen, wobei bei jedem Zugriff acht Bit parallel gelesen werden. Um diese 2 KByte zu adressieren, sind 11 Adressleitungen (A0 … A9) notwendig.
Die verwendeten statischen Schreib-Lese-Speicher besitzen eine Kapazitaet von 1024 (=1K) Plaetzen, wobei jeweils 4 Bit gleichzeitig angesprochen werden. Erst zwei dieser Schaltkreise besitzen deshalb eine Kapazitaet von 1 KByte, wobei 10 Adressleitungen (A0 bis A9) ausreichen.
Mit Hilfe dieser 11 bzw. 10 Adressbits wird jeweils nur ein Byte ausgewaehlt. Die verbleibenden Adressleitungen werden nun dazu verwendet, um einen oder mehrere Speichereschaltkreise auszuwaehlen, damit nur eine Information, und zwar die richtige, bearbeitet werden kann. Die Auswahl des betreffenden Speicherschaltkreisee erfolgt mit dem Adressdekoder A23, der aus einem Bereich von 8 KByte fuer jeden einzelnen 1 KByte-Bereich eine Auswahlleitung bereitstellt. Mit dem Gatter A 24/25 wird dieser Bereich auf den oberen Adressraum eingestellt. Dazu werden mit A25 die betreffenden Adressleitungen mit dem Speicherauswahlsignal MREQ verknuepft und damit der Adressdekoder frei gegeben, d. h. konkret
MREQ ADR 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 1 1 1 Diese Leitungen werden an alle Speicherschaltkreise gelegt 0 0 0 --->/DK10 = E000H = RAM 0 0 1 --->/DK11 = E400H ... 0 1 1 --->/DK13 = EC00H = Bildwieder- holspeicher 1 0 0 --->/DK14 = F000H = Mit Dioden D9 1 0 1 --->/DK15 ODER verknuepft fuer 2K-Monitor
Die so gebildeten Leitungen zur Bausteinauswahl (chip-select, CS) werden an den CS-Eingang der Speicherschaltkreise gefuehrt und geben diese frei.
Die Bildung der Auswahlsignale kann ueber das Signal MEMDI am Steckverbinder X1 von ausserhalb verhindert werden. Das wird dann sinnvoll sein, wenn der MRB Z1013 als Bestandteil eines Mikrorechnersysteme betrieben wird und in diesen Adressbe- reichen bereits Speichereinheiten angeschlossen sind.
Bei der Verwendung der dynamischen 16 KByte Speicher U 256 bzw. K 565 RU3 oder K 565 RU6 (A33 bis A40) ergibt sich folgende Adressauswertung:
ADR: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 0 0 Diese Adressbits werden intern zur Auswahl des Speicherplatzes ausgewertet Legt den Bereich ab Adresse 0000H fest.
Da diese Speicher pro Platz nur 1 Bit speichern, muessen hier 8 Schaltkreise parallel an den Datenbus angeschlossen werden. Der Anschluss ist ausserdem komplizierter, weil diese Schaltkreise nur 6 Adresseingaenge haben. Die Uebernahme der 14-stelligen Adresse erfolgt deshalb zeitlich gestaffelt.
Zuerst werden bei Auswahl dieses Speicherbereiches die sieben niederwertigen Adressbits in den Speicherschaltkeis uebernommen. Dazu wird das Signal RAS (ROW ADRESS STROBE, Reihenadressuebernahmeimpuls) am Schaltkreis aktiviert. Anschliessend werden die sieben hoeherwertigen Adressbits auf die Schaltkreisanschluesse geschalten und mit dem Signal CAS (COLUMN ADRESS STROBE, Spaltenadressuebernahmeimpuls) diese in die Schaltkreise eingetragen.
Die Erzeugung des Signals /RAS ist durch das Speicheranforderungssignal /MREQ gegeben. Das negierte Signal MREQ gibt ein FlipFlop (A17) frei. Mit der naechsten steigenden Flanke des Systemtaktes wird das FlipFlop umgeschalten steuert den Adressleitungsumschalter A28/41 (Multiplexer) und gibt ein zweites Flip-Flop frei, das mit der absteigenden Flanke des Systemtaktes das Signal CAS erzeugt und, sofern ein Zugriff in diesen Adressbereich (A14=A15=0) erfolgt, das Signal /CAS an den Schaltkreisanschluessen aktiviert. War der Zugriff zum Speicher nicht in dem Bereich der dynamischen RAM's oder wurde das Signal /REFRESH als Zeichen der Speicherauffrischungszeit aktiv, so wird zwar das Signal /RAS gebildet, aber kein Signal /CAS. Damit werden in den dynamischen RAM's nur Auffrischungsaktivitaeten ausgeloest.
In Verbindung mit den Signalen /RD oder /WR, die ebenfalls an die Speicherbausteine gefuehrt werden, werden entweder Daten oder Befehle gelesen und auf den Datenbus geschaltet oder die auf dem Datenbus vorhandenen Daten im Speicher eingetragen.
Im Anhang ist ein Schema der Speicherverteilung innerhalb des gesamten Adressraumes zu finden (Anlage 2).
Wenn die CPU auf den Speicher zugreifen moechte, sei es, um Befehle oder Daten zu holen oder um etwas abzuspeichern, ist das durch folgende Signale gekennzeichnet:
Die detaillierten Zeitablaeufe koennen der Anlage 10 entnom- men werden, wo die Taktdiagramme fuer den Speicher-Schreib- und Speichen-Lese-Zyklus angegeben werden.
Aus der Bezeichnung des Bausteins geht eigentlich seine Verwendung bereits hervor. Er dient bevorzugt zur parallelen Ein- bzw. Ausgabe, d. h. zum Beispiel, dass alle acht Bit des Datenbusses gleichzeitig ausgegeben werden koennen.
Man kann natuerlich auch Daten seriell, d. h. bitweise nacheinander aus- oder eingeben. Dazu ist aber ein gesondertes Programm notwendig.
Im MRB Z1013 kommt ein Baustein U 855 zum Einsatz. Ein Teil davon wird von den E/A-Baugruppen des Z1013 selbst genutzt (s. 3.4.2., 3.4.3.). Ueber den anderen Teil koennen Sie frei verfuegen. Dazu muessen Sie allerdings die Anschluss- und Funktionsweise einer PIO kennen. Das soll Inhalt dieses Abschnittes sein.
Die Anschlussbelegung des U 855 finden Sie in der Anlage 9. Es ist zu erkennen, dass die PIO rechnerseitig an den Datenbus angeschlossen wird und prozesseitig zwei Kanaele A und B, auch Tore oder Ports genannt, besitzt. Ausserdem verfuegt er ueber eine Reihe von Steuersignalen, deren Bedeutung hier kurz erlaeutert werden soll:
Es gelten die gleichen Vereinbarungen wie im Abschnitt 3.2.1.
_______________ _______________ | E/A-Baugruppe | | E/A-Baugruppe | | 1 | | 2 | 5P -----| IEI IEO |-------| IEI IEO |----> --------------- ---------------
Die in einer solchen Kaskade am weitesten links stehende Baugruppe hat den groessten Vorrang. Wird an dieser E/A-Einheit eine Unterbrechung angemeldet, dann wird diese Kette unterbrochen (der Schalter oeffnet), so dass fuer die nachfolgenden Einheiten ein Interrupt gesperrt ist.
Intern besitzt das Tor A gegenueber Tor B hoehere Prioritaet.
Am Beispiel der im MRB Z1013 verwendeten E/A-Tore soll die Bildung der Auswahladresse erlaeutert werden. Fuer die Ergaenzung der Chip-select Signale wird ein Dekoder A27 eingesetzt, der mit dem E/A-Anforderungssignal die ersten acht Ausgaenge freigibt. Die Festlegung der jeweiligen aktiven IOSEL-Leitung erfolgt dann mit den Adressen A2, A3 und A4. Mit dem im vorigen Abschnitt zu den 0/13 SEL- ;4nd B/ASEL- Signalen gesagten ergibt sich folgende Adreseverteilung:
ADR: 7 6 5 4 3 2 1 0 C/D SEL 0, wenn Information Daten 1, wenn Information Steuerworte B/A SEL 0 , wenn Tor A beliebig, z.B. 1 , wenn Tor B 0 0 0 0 0 0 ==>IOSELO, PIO 0 1 0 ==>IOSEL2, Tastaturspaltentreiber
Damit ergeben sich die Adressen:
Tor A (Anwenderport) - Daten: 00H - Steuerwort: 01H Tor B (Systemport) - Daten: 02H - Steuerwort: 03H
Im Z1013 sind diese Adressen nicht eindeutig, da die Adressbits A7, A6, A5 auch 111 sein koennten. Da diese nicht ausgewertet werden, spielt das aber keine Rolle.
Die Arbeitsweise der PIO wird durch die Steuerworte festgelegt, die im folgenden erlaeutert werden sollen.
Bit: 7 6 5 4 3 2 1 0 Belegung: 1 1 1 1 Kennzeichen beliebig 0 0 Betriebsart 0 : Byteausgabe 0 1 1 : Byteeingabe 1 0 2 : Byteein/ausgabe 1 1 3 : Bitein/ausgabe
Betriebsart 0:
Die durch die CPU bereitgestellten Daten werden waehrend des durch sie veranlassten Ausgabezyklus in das angesprochene Ausgaberegister geschrieben. Mit RDY zeigt die PIO dem Prozess an, dass Daten zur Uebernahme in PIO bereitstehen. Dieses RDY wertet das periphere Geraet aus, uebernimmt daraufhin die Daten und teilt mit STB der PIO die Datenuebernahme mit. Anschliessend loest die PIO ein Interrupt aus, um der CPU das Ende der Datenausgabe zu melden.
Betriebsart 1:
Die PIO teilt mit H-Pegel an RDY dem externen Geraet die Bereitschaft zur Datenuebernahne mit. Mit STB=L schreibt das Geraet die Daten in das entsprechende Eingaberegister. RDY=L sperrt eine weitere Eingabe bis die Daten durch eine Interruptbehandlung von der CPU uebernommen werden.
Betriebsart 2:
Diese bidirektionale Betriebsart ist nur mit dem Kanal A moeglich. Mit Kanal B ist dann nur noch Betriebsart 3 moeglich, da fuer die Abwicklung des Datentransfers alle vier Quittungssignare ARDY, ASTB, BRDY und BSTB benoetigt werden. ARDY und ASTB steuern die Ausgabe, die beiden anderen die Eingabe.
Betriebsart 3:
In dieser Betriebsart kann innerhalb eines Tores jedem Bit eine beliebige Datenflussrichtung zugeordnet werden. Auf diese Weise koennen Stellsignale und Statusmeldungen fuer Prozess-Steuerungen aus- bzw. eingegeben werden.
Bit: 7 6 5 4 3 2 1 0 Belegung: 0 Kennzeichen niederwertiger Teil des Interruptvektors
(s. 4.4.)
Bit: 7 6 5 4 3 2 1 0 Belegung: 0 1 1 1 Kennzeichen 0 , naechstes Steuerwort ist kein Maskenwort 1 , naechstes Steuerwort wird als Maskenwort erkannt 0 , Interrupt bei H -> L Flanke 1 , Interrupt bei L -> H Flanke 0 , die im folgenden Steuerwort festgelegten Interrupt ausloesenden Bit sind ODER- verknuepft, d. h. eine dieser Leitungen kann bereits Interrupt ausloesen 1 , UND verknuepft, d. h. alle festgelegten Stellen muessen gleichzeitig die mit Bit 5 festgelegte Interruptbedingung erfuel- len 0 , Interrupt freigeben 1 , Interrupt gesperrt
Bit: 7 6 5 4 3 21 0 Belegung: beliebig 0 01 1 Kennzeichen 0 ,Interrupt gesperrt 1 ,Interrupt freigegeben
Elektrisch stellt die Tastatur nichts anderes als eine Matrix von Schaltern in folgender Anordnung dar:
Die Zeilen dieser Anordnung sind mit den Widerstaenden R11 bis R14 auf „H“-Pegel gelegt. Diese Leitungen sind mit dem Tor B, Bit 0 bis 3, des PIO verbunden, welche fuer Eingabe programmiert sind. Wird keine Taste gedrueckt, liest die PIO auf allen vier Leitungen eine 1.
Die acht Spaltenleitungen der Tastatur sind an ein separates Ausgabetor, das durch die Bausteine A47 (Speicher fuer Spaltennummer) und A46 (1 aus 8 Spaltenleitungen) gebildet wird, angeschlossen. Die Adresse dieses Tores ist 08H. Die Spatennummer steht im niederwertigen Halbbyte des Datenbusses binaer verschluesselt. Bei einer Ausgabe werden diese vier Bit entschluesselt und legt so eine Spalte auf „L“-Potential. Wird in dieser aktivierten Spalte nun eine Taste betaetigt, wird der L-Pegel auf die entsprechende Zeilenleitung durchgereicht. Der Rechner liest jetzt eine 0 in der entsprechenden Bit stelle.
Aus der ausgegebenen Spaltennunmer und der eingelesenen Zeilennummer ermittelt das Tastaturbedienprogramm des Betriebssystems den rechnerinternen Kode der gerade betaetigten Taste. Der Z1013 benutzt den sogenannten ASCII-Kode (s. Anlage 7).
Von der auf der Leiterplatte installierten PIO wird eine Bitleitung (PB 7) zur Ausgabe eines seriellen Datenstromes ge- nutzt. Die erforderliche Parallel/Serienwandlung wird softwarenaessig realisiert. Das ausgegebene Signal wird ueber einen Spannungsteiler R27/28 zur Pegelanpassung abgeschwaecht; mit einem Kondensator C1.9 werden die Flanken verrundet, damit ein etwa sinusfoerniges Signal in Magnetbandgeraet aufgezeichnet werden kann.
Das Ausgangssignal eines Magnetbandgeraetes wird gleichspannutigsfrei einem Operationsverstärker A48 zugefuehrt. Das auf TTL-Pegel verstaerkte Signal wird an einen Anschluss der PIO (PB 6) geleitet, Durch entsprechende Software wird dieser Anschluss staendig abgefragt und aus dem ankommenden seriellen Datenstrom durch Serien/Parallelwandlung die urspruengliche Information wieder zurueckgewonnen.
Die Bildschirmsteuerung wandelt die vom Rechner auszugebende Information in ein CCIR-kopatibles Fernsehsignal, indem sie zusaetzlich die notwendigen Synchron- und Dunkeltastimpulse erzeugt. Um diesen Vorgang prinzipiell zu verstehen, sind einige Bemerkungen ueber den Aufbau des Fernsehsignals notwendig.
Beim Schreiben eines Fernsehbildes laeuft ein Elektronenstrahl, auf den die Bildinformation aufmoduliert wurde, ueber einen fluereszierenden Schirm. Fuer eine Zeile benoetigt er eine Zeit von 64 µs. Das entspricht einer Zeilenfrequenz von 15,625 kHz. Ein Zeilensynchronimpuls veranlasst den Strahlruecklauf, wobei der Strahl dunkelgesteuert wird. Um ein Flimmern der Anzeige zu vermeiden, muss das ganze Bild mit einer Frequenz von mindestens 25 Hz wechseln.
Da beim Fernsehen in dieser Zeit zwei Halbbilder geschrieben werden, im Z1013 aber ein Bild zweimal, ergibt sich hier eine Bildwechselfrequenz von 50 Hz.
Ein sogenannter Bildsynchronimpuls loest dann jeweils einen Strahlruecklauf zum oberen Bildrand aus. Die Bildschirmsteuerung des MRB Z1013 arbeitet nach folgendem Prinzip:
Die gesamte Erzeugung des fernsehgerechten Signals, des sogenannten BAS-Signals, wird durch die Zaehlkaskade ohne Mitarbeit der CPU gesteuert. Die Kaskade A3, A4, A5 und A12 wird mit dem 8 MHz-Takt des Taktgenerators gespeist. Eine Teilung durch 2 hoch 9 liefert z. B. die Zeilenfrequenz.
Aus dem Bildaufbau wissen wir bereits, dass eine Zeile aus 32 (=2 hoch 5) Zeichen besteht. Um diese abzuzaehlen, werden die 5 niederwertigen Adressen des Bildwiederholspeichers (BWS) A30/31 genutzt. Die hoeherwertigen Adresseingaenge zaehlen die Zeichenzeilen eines Bildes. Da die Zaehlkaskade immer zyklisch durchzaehlt, wird auch der BWS zyklisch ausgelesen.
Das aus dem BWS gelesene Byte, das den ASCII-Kode entsprechend Anlage 7 des darzustellenden Zeichens enthaelt, steht als hoeherwertiger Adressteil am Zeichengemerator A44. Mit den drei Ausgaengen des Linien pro Zeichenzaehlers, die an die niederwertigen Adresseingaenge von A44 gehen, werden nacheinander die Bildpunktzeilen an den nachfolgenden Parallel/Serien-Wandler A21/22 uebergeben. Hier wird das uebernommene Bitmuster mit dem 8 MHz-Takt seriell herausgeschoben. Dieser seriell Datenstrom bildet die Bildinformation des Bild-, Austast- und Synchronsignals (BAS-Signal).
Mit den Gattern der Schaltkreise A9, A10, A13 und A20 werden aus dem Zaehlfolgen entsprechend der Fernsehnorm die Synchronimpulse dekodiert.
Ausserdem wird durch diese Schaltung gesichert, dass fuer der Strahlruecklauf das Signal dunkelgesteuert wird, da dieser sonst auf dem Bildschirm sichtbar waere. Diese Impulse werden mit der Bildinformation gemischt und ergeben so das BAS-Signal.
In einem HF-Modulator wird das BAS-Signal auf eine HF-Traegerfrequenz, die auf den Fernsehkanal 3 abgestimmt ist, aufmoduliert. Der Ausgang dieses Modulators kann nun direkt mit dem Antenneneingang des Fernsehgeraetes verbunden werden.
Wie gelangen aber nun in diese selbstaendig arbeitende Einheit die darzustellenden Daten? Ueber die Adroesmultiplexer (A29, A42, AlS) kann die CPU einen Platz im BWS adressieren. Dazu wird mit einem Speicherbereichauswahlsignal der Multiplexer umgeschaltet. Ueber den Datentreiber A43 kann die CPU den BWS beschreiben oder lesen.
Damit ist auch deutlich gemacht, dass der BWS wie ein normaler Speicher behandelt werden kann. Die Anfangsadresse ergibt sich analog zu dem ROM-Auswahlsignal zu EC00H. Welche Position die einzelnen Speicherplaetze auf dem Bildschirm einnehmen, ist in der Anlage 8 schematisch dargestellt.
Fuer den Betrieb des MRB Z1013 sind drei verschiedene Versorgungsspannungen noetig.
Zur Versorgung aller Logikschaltkreise wird eine Spannung von + 5 V, die im folgenden mit 5P bezeichnet wird und etwa mit 1 A belastbar ist, verwendet. Die beiden anderen Span- nungen von + 12 (12P) und - 5 V (5N) werden fuer die Speichereinheiten sowie einige Spezialfaelle benoetigt. Sie werden nicht so stark belastet.
Um diese Spannungen zu erzeugen, besitzt der MRB Z1013 ein eigenes Netzteil. Eine zugefuehrte Wechselspannung von ca. 12 V wird mittels Dioden in Einweggleichrichtung gleichgerichtet. An den Ladekondensatoren C2.1, C3.1 und C5.1 sind jeweile Rohspannungen verfuegbar. Eine Ausnahme bildet die Erzeugung der Rohspannung fuer die 12P. Hier wird mit einer Spannungsverdopplerschaltung gearbeitet.
Die Erzeugung der 5P wird mit einem integrierten Festspanmungsregler A2 vorgenommen, der auf einem Chip alle benoetig- ten Bauteile enthaelt und kaum eine Aussenbeschaltung benoetigt. Lediglich ein Kondensator am Ausgang ist erforderlich. Da eine starke Belastung dieses Bauelementes erfolgt, wird eine angemessene Kuehlung benoetigt.
Die Spannung 5N wird mittels einer Z-Diode D4 stabilisiert. Diese einfache Widerstands/Z-Dioden-Kombination ist bei dem geringen Leistungsbedarf ausreichend.
Um die Spannung 12P zu erzeugen, wird eine verdoppelte und anschliessend mit einer Widerstands/Z-Dioden-Kombination stabilisierte Spannung der Basis eines Transistors V2 zugefuehrt. Dadurch ist am Emitter dieses Transistors eine stabilisierte Spannung verfuegbar, die staerker belastet werden kann.
Die wichtigsten Signale des Mikrorechners Z1013 sind an den Rand der Leiterplatte gefuehrt und dort fuer den Anschluss von Steckverbindern vorbereitet. Dabei haben diese Anschluesse folgende Bedeutung:
X1: | Systembus (Steckverbinder: StL 304-58 TGL 29331/03) Enthaelt alle Signale des Systembusses und ist elektrisch kompatibel zum K1520-Systembus. (Anlage 6) |
X2: | Pruefkamm und Tastaturanschlusspunkte (hier wird entsprechend den Hinweisen von Pkt.1.2.4.1. und 1.4. der Bedienungsanleitung das Tastaturbandkabel oder die Buchsenleiste BuL 202-26 TGL 29331/04 angeloetet) |
X3: | Wechselspannungszufuehrung (Flachsteckverbinder) |
X4: | PIO Kanal A (Steckverbinder: BuL 402-15 TGL 29331/04) Hier werden die Anschluesse des Kanals A der PIO herausgefuehrt. Ausser den Steuerleitungen ARDY und /ASTB des Kanals A wurden auch die des Kanals B (BRDY und /BSTB) auf den Steckverbinder gelegt, um die Betriebsart bidirektionale E/A realisieren zu koennen. |
X5: | Anschluss Magnetbandgeraet (Diodenbuchse) |
X6: | HP-Ausgang des Modulators (Koaxialbuchse) |
Die genaue Zuordnung der einzelnen Signale zu den jeweiligen Anschluessen ist der Anlage 6 zu entnehmen.
Dieser Abschnitt soll das Verstaendnis der Arbeitsweise und der Programmierung des Mikrorechnerbausatzes Z1013 erleichtern. Anhand von Beispielen erfolgt eine Erlaeuterung der verschiedenen Mikroprozessor-Befehle und deren Wirkungsweise und Anwendungsmoeglichkeiten. Der folgende Ueberblick soll prinzipielle Eigenschaften und Besonderheiten des Mikroprozessors U 880 aufzeigen:
Bit 76543210 76543210 76543210 76543210 ------------------- ------------------- AF | A | F | AF' | A' | F' | ------------------- ------------------- BC | B | C | BC' | B' | C' | ------------------- ------------------- DE | D | E | DE' | D' | B' | ------------------- ------------------- HL | H | L | HL' | H' | L' | ------------------- ------------------- Hauptregistersatz Alternativregistersatz 15 ... 8 7 ... 0 ----------------------- | Stackpointer SP | ----------------------- | Befehlszaehler PC | ----------------------- | Indexregister IX | ----------------------- | Indexregister IY | ----------------------- | I |0| R | ----------------------- Speicheradressen: Flagregister F: ________ --------------------------- 0000H |________| | S Z X H X P/V N C | 0001H |________| maximal --------------------------- . | . | 64 K Byte . | . | = 65 536 S Signum (Vorzeichen) . | . | Speicher- Z Zero . |_.______| plätze H Half-Carry 0FFFEH |________| P/V Parity/Overflow 0FFFFH |________| (Paritaet,Ueberlauf) C Carry X nicht verwendet 36 Kanaladressen: 0...255 256 Eingaenge oder 0.. .255 256 Ausgaenge Befehlsvorrat: 158 Grundbefehle
Der Mikroprozessor erhaelt seine Befehle vom Speicher ueber den 8 Bit-Datenbus binaer verschluesselt zugefuehrt. Fuer den Programmierer ist diese Darstellung im Binaercode meistens zu detailliert und erschwert die Programmierung; es werden deshalb Hexadezimalkodes mit entsprechend zugehoeriger Mnemonik des Maschinenbefehls verwendet. Als Mnemonik bezeichnet man Pseudonamen der Befehle. Diese Pseudonamen bzw. Abkuerzungen geben gleichzeitig Auskunft ueber die Funktion der Befehle und erleichtern damit die Programmierung. Die Uebersetzung in den Maschinenkode erfolgt dann anhand der Tabelle der Befehlsliste oder durch ein Programm, genannt Assembler.
<note tip> Bemerkung: Bei hexadezimaler Verschluesselung muss der fuehrenden Ziffer, falls diese ein Buchstabenzeichen ist, eine Null vorangestellt werden. Dadurch wird eine Verwechselung mit Bezeichnern vermieden. Bei der Programmierung des U 880 werden die Maschinenbefehle im allgemeinen hexadezimal verschluesselt, wobei das 'H' und die fuehrende '0' vor Buchstabenzeichen innerhalb des Maschinenkodes weggelassen werden.</note>
z.B. 00 = NOP 40 = LD C,H FF = RST 38H
Wie bereits erwaehnt, koennen Maschinenbefehle aus einem oder mehreren Bytes bestehen. Man spricht dann von 1-Byte-, 2-Byte-Befehlen und so weiter. Jedem Byte ist in Abhaengigkeit seines Platzes im Befehl und seiner Kodierung eine bestimmte Bedeutung zugeordnet worden.
Diese Befehle bestehen nur aus dem Operationskode (im weiteren als OPC bezeichnet). Da es sich fast ausschliesslich um Registeroperationen, also Operationen innerhalb der Prozessorregister handelt, ist in diesem Byte auch die notwendige Registeradresse enthalten. Bei der Behandlung der Adressierung wird noch einmal naeher darauf eingegangen.
1. Byte OPC
Beispiel:
Befehls- Maschinen- Quellkode Kommentar zaehler kode --------------------------------------------- 1000 47 LD B,A ;Lade B mit A 1001 23 INC HL ;HL:=HL+1 1002 40 LD B,B 1003 81 ADD C
Die Form des Beispiels soll als Normativ eines Programmprotokolls dienen. Es empfiehlt sich, diese uebersichtliche Darstellung bei der Erstellung von Programmen zu nutzen, da sich in dieser tabellenartigen Zusammenstellung alle Angaben widerspiegeln, die zu einem Programm gehoeren. Die letzte Spalte bietet die Moeglichkeit, einen Kommentar unterzubringen, um noch nach laengerer Zeit den Inhalt eines Programms nachvollziehen zu koennen. Kommentarzeilen werden mit einem Semikolon gekennzeichnet. Der Inhalt sollte kurz, aber eindeutig sein.
Wird nur ein Byte als Operationskode verwendet, wuerden sich 256 Moeglichkeiten ergeben. Man nutzt davon aber nur 252. Die verbleibenden vier Kombinationen sind fuer folgende Aufgaben reserviert worden: Beim U 880 werden zwecks Erweiterung und Ausbau des Befehlsumfangs vier Hexadezimalkodes (0CBH, 0DDH, 0EDH, 0FDH) der Befehlsliste als sogenannte „Signalbytes“ festgelegt. Diese Signalbytes stehen grundsaetzlich an erster Stelle des Befehls (1.Byte). Sie kennzeichnen aber keinen konkreten Befehl, sondern kuendigen eine spezielle Gruppe von Befehlen an. Die Konkretisierung des Befehle erfolgt durch zusaetzlich ein oder mehrere Bytes. Auf diese Art ist es moeglich, durch ein Signalbyte weitere 256 Befehle zu kennzeichnen und somit den Befehlsumfang stark zu erweitern. Der U 880 bietet folgende Erweiterungen des Befehlsschluessels mit den Signalbytes:
Signalbyte CB: Bitmanipulationen, Verschiebebefehle Signalbyte DD: Umschaltung von HL nach IX Signalbyte ED: Blocktransport- und Suchbefehle Signalbyte FD: Umschaltung von HL nach IY
Diese Befehle koennen jetzt einen zweiten OPC, einen Direktwert oder eine Sprungweite (s. auch Sprungbefehle) im 2. Byte des Befehle enthalten.
1. Byte 2. Byte OPC OPC OPC n n=Direktwert OPC c c=Sprungweite
Ist das 2. Byte ein OPC, so stellt das 1. Byte das Signalbytedar.
Beispiele:
Befehls- Maschinen- Quellkode Kommentar --------------------------------------------- 1000 DD 23 INC IX ;IX:=IX+1 1002 FD 23 INC IY ;IY:=IY+1 1004 CB 40 BIT 0,B 1006 3E 10 LD A,10H ;Lade A mit 16 1008 36 FF LD(HL),0FFH ;Lade den von HL adres- ;sierten Speicherplatz mit 255 100A 28 04 JRZ 06 ;Springe, wenn Z=1 ist, ;um 6 Byte nach vorn, PC: PC + 6 - 2
Bei der Berechnung der Sprungweite wird die aktuelle Position des Befehlszaehlers (PC), der ja bereits auf den naechsten Befehl zeigt, durch Subtraktion einer 2 beruecksichtigt. Im Quellkode beziehen sich die Sprungweiten immer auf den Befehlsanfang, also den PC-Stand, der zum betreffenden Befehl gehoert. Es empfiehlt sich, bei der Programmerstellung im Quellkode symbolische Sprungmarken zu verwenden, denen bei der Uebersetzung in Maschinenkode ein konkreter Wert zugewiesen wird. Wie das gemacht wird, zeigen spaetere Beispiele.
Diese Befehle enthalten einen Operationskode und einen 16-Bit- Direktwert (nn). Dieser Direktwert stellt einen normalen Datenwert oder eine Adresse dar, wie er z.B. in Lade- oder Sprungbefehlen benoetigt wird. Ebenfalls ist eine Kombination von Signalbyte und OPC sowie von Signalbyte und 8-Bit-Direktwert (n) fuer einige Befehle moeglich.
1. Byte 2. Byte 3. Byte OPC N(nn) H(nn) (bei Ladebefehlen) OPC N(nn) H(nn) (Sprungadresse) OPC OPC n (wobei der 1. OPC ein Sig- nalbyte DD oder FD sein kann)
Die Angabe „N(nn)“ bezeichnet den niederwertigen Teil, d.h. die letzten 8 Bit des 16-Bit-Direktwertes, „H(nn)“ demgemaess den hoeherwertigen Teil, d.h. die ersten 8 Bit.
Wert: | H | N | 15...8 7...1
Beispiele:
Befehls- Maschinen- Quellkode Kommentar zaehler kode ------------------------------------------ 1000 21 00 F7 LD HL,0F700H ;Lade HL mit 0F7OCH 1003 C3 2D F0 JMP 0F02DH ;Springe zur Adresse ;0F02DH 1006 CD B7 E1 CALL OF1B7H ;Sprung ins Unterprogr. 1009 DD 46 3F LD B,(IX+3FH) 100C FD 72 00 LD (IY+0),D
In den 4-Byte-Befehlen sind im wesentlichen Kombinationen bereits bekannter Befehle mit einem oder zwei Signalbyte enthalten. Eine Uebersicht ueber diese Befehle ist der Anlage zu entnehmen. Zwei Beispiele sollen hier genuegen.
Beispiele:
Befehls- Maschinen- Quellkode Kommentar zaehler kode ------------------------------------------ 1000 DD 21 00 00 LD IX,0 ;Lade IX mit 0 1004 DD CB 0F 1E RR (IX+0FH)
Die im Anhang enthaltene Befehlsliste fuer den Mikroprozessor U 880 enthaelt uebersichtlich alle Befehlsschluessel hexadezimal kodiert mit Hinweisen fuer die Verwendung des Signalbytes bzw. der Verschiebung 'd' (siehe auch 'Indexierte Adressierung'). Diese Befehlsliste dient bei der manuellen Programmie- rung im Maschinenkode als rationelles Hilfsmittel.
Die Angabe von Registeroperanden (also von Registern des Notizblockspeichers im U 880) erfolgt implizit im Operations- Byte durch sogenannte Kurzadressen. Fuer die Adressierung von maximal acht allgemeinen Registern sind im OPC-Byte zweimal 3-Bit-Stellen (sowohl fuer das Quellregister als auch fuer das Zielregister) notwendig. Bei der Angabe der Kurzadressen fuer U880-Register gilt also:
Register A B C D E H L (HL) Kurz- adresse 7 0 1 2 3 4 5 6 (binaer) 111 000 001 010 011 100 101 110
Doppelregister BC DE HL AF oder SP (binaer) 00 01 10 11
Die Angabe von Operanden, die sich im Hauptspeicher befinden, kann auf verschiedene Weise erfolgen. Der Zugriff auf eine bestimmte Speicherstelle (beim U 880 ist eine 16-Bit-Adresse erforderlich) erfolgt durch Bereit stellen der entsprechenden Adresse zu dem Zeitpunkt, wo der Maschinenbefehl diese benoetigt.
Der Zugriff zum Speicher erfolgt mittels der im Befehl komplett angegebenen Speicheradressen. Diese steht im mnemonischen Befehl immer in Klammern.
z. B.: Der unbekannte 8-Bit-Wert K soll mittels direkter Adressierung vom Speicherplatz mit der Adresse 3000H in das A-Register geholt werden. Danach soll diese Konstante auf den Speicherplatz mit der Adresse 3010H gebracht werden.
Befehls- Maschinen- Quellkode Kommentar zaehler kode ------------------------------------------ 1000 3A 00 30 LD A,(3000H) ;A:=(3000) 1003 32 10 30 LD (3010H),A ;(3010H):=A=K
Bei der indirekten Adressierung erfolgt der Speicherzugriff durch Angabe eines Doppelregisters im Maschinenbefehl, wobei im Doppelregister die Adresse fuer den Speicherzugriff geladen sein muss (Registerpaare HL, BC, DE sind moeglich).
z. B.: Der unbekannte 8-Bit-Wert K soll wie im oben genannten Beispiel mittels indirekter Adressierung von Speicherplatz 3000H in den Speicherplatz 3010H umgespeichert werden. Zunaechst laedt man die Adresse des Speicherplatzes, von der der Wert K geholt werden soll, in das Registerpaar BC und die Zieladresse in das Registerpaar HL.
Befehls- Maschinen- Quellkode Kommentar zaehler kode ------------------------------------------ 1000 01 00 30 LD BC,3000H ;Quelladresse 1003 21 10 30 LD HL,3010H ;Zieladresse 1006 OA LD A,(BC) ;A:=(3000H) 1007 77 LD (HL),A ;(3010H):=A=K
Anmerkung: Zur indirekten Adressierung wird gern das Doppel- register HL zur Adressenbereitstellung eingesetzt; man schreibt auch:
(HL)= M (englisch: Memory = Gedaechtnis, Speicher)
Dann wuerde die letzte Zeile des obigen Beispiels lauten:
1007 77 LD M,A ;= LD (HL),A
Soll der Speicherzugriff mittels indexierter Adressierung erfolgen, so wird im Maschinenbefehl ein sogenanntes Indexregister (IX, IY) und eine Verschiebung 'd' als vorzeichenbehaftete Konstante angegeben. Die Adressenbildung fuer den Speicherzugriff erfolgt durch Summierung der im jeweiligen Indexregister enthaltenen Grundadresse und der Verschiebung 'd'. Die Verschiebung 'd' kann Werte von -128 bis +127 annehmen. Bei Verwendung einer negativen Verschiebung wird diese von der Grundadresse subtrahiert.
z. B.: Der 8-Bit-Wert K soll wie im oben genannten Beispiel mittels indexierter Adressierung umgeladen werden. Ins Indexregister IX wird die Adresse 3000H geladen.
Befehls- Maschinen- Quellkode Kommentar zaehler kode ------------------------------------------ 1000 DD 21 00 30 LD IX,3000H 1004 DD 7E 00 LD A,(IX+0) ;A:=(3000H),d=0 1007 DD 77 10 LD (IX+16),A ;(3010H):=A, ;da IX=3000H und d=10h=16
Die indexierte Adressierung wird verwendet, um einen einfachen Zugriff zu in Tabellenform gespeicherten Daten zu er- halten. Dazu wird der Anfangspunkt der Tabelle in das Indexregister geladen, die Verschiebung 'd' entspricht dann der konkreten Tabellenposition.
Im folgenden Abschnitt werden die entsprechenden Befehlsgruppen naeher erlaeutert und an Beispielen die Funktionsweise untermauert.
Bei den Ladebefehlen werden prinzipiell die Byte- und Doppelbyte-Ladebefehle unterschieden. Die Datenbewegung erfolgt stets nur zwischen Speicher und Prozessor bzw. innerhalb des Prozessors zwischen den Registern. Die Flage werden nicht beeinflusst (Ausnahmen bilden nur die Befehle LD A,I und LD A,R).
Allgemeiner Aufbau der Ladebefehle:
[MARKE:] LD Ziel , Quelle [;KOMMENTAR]
Die eingeklammerten Angaben sind wahlfrei, sie koennen vorhanden sein, muessen aber nicht.
Beispiele fuer Byte-Ladebefehle: (d.h. die transportierten Daten umfassen ein Byte)
Befehls- Maschinen- Quellkode Kommentar zaehler kode ------------------------------------------ 1000 3E 3A LD A,3AH ;A: =3AH 1002 57 LD D,A ;D: =3AH 1003 46 LD B,(HL) 1004 1A LD A,(DE) 1005 02 LD (BC),A 1006 DD 70 00 LD (IX+0),B ;B wird auf ;IX+d adressierten Speicherplatz gela- ;den 1009 DD 4E 7F LD C,(IX+127) 100C ED 57 LD A,I ;das Interruptre- ;gister I wird in A geladen, Stand ;von IFF 2 in das Flag P/V 100E ED 5F LD A,R ;das Refreshre- ;gister wird in das A-Register geladen
Beispiele fuer Doppelbyte-Ladebefehle (d. h. die transportierten Daten umfassen 2 Byte):
Befehls- Maschinen- Quellkode Kommentar zaehler kode ------------------------------------------ 1000 01 34 12 LD BC,1234H ;B:=12H, C:=34H 1003 2A 34 12 LD HL,(1234H) 1006 ED 43 34 12 LD (1234H),BC 100A DD F9 LD SP,IX
Es ist verstaendlich, dass Doppelbyte-Ladebefehle auf Grund des 8-Bit-Batenbusses nur byteweise abgearbeitet werden, wobei zunaechst das niederwertige und danach das hoeherwertige Byte geladen wird.
Einen Sonderfall der Boppelbyte-Ladebefehle bilden die sogenannten Kelleroperationen, diese werden aber spaeter beschrieben.
Diese Befehlsgruppe dient dem Erniedrigen bzw. Erhoehen von Registerinhalten oder Speicherinhalten um jeweils den Wert 1.
Beispiele fuer Zaehlbefehle:
Befehls- Maschinen- Quellkode Kommentar zaehler kode ------------------------------------------ 1000 3C INC A ;A:=A+1 1001 34 INC (HL) ;(HL):=(HL)+1 1002 03 INC BC ;BC:=BC+1 1003 DD 23 INC IX 1005 0D DEC C ;C:=C-1 1006 DD 35 00 DEC (IX+0) ;(Ix+0):=(1X+0)-1 1009 DD 2B DEC IX ;IX:=IX-1
Die Byte-Zaehlbefehle beeinflussen das Z-Flag. Ist das Resultat des Befehls im behandelten Byte identisch 0, so wird das Z-Flag auf „1“ gesetzt, sonst bleibt es „0“. Die Doppelbytezaehlbefehle boeinflussen keine Flags.
Beispiel: Laden von 3 Speicherstellen mit 00,01,02 ab Adresse 3000H
Befehls- Maschinen- Quellkode Kommentar zaehler kode ------------------------------------------ 1000 3E 03 LB A,3 ;Anzahl Speicherpl. 1002 21 00 30 LD HL,3000H ;1. Adresse laden 1005 75 Ml: LD (HL),L ;Speicherpl. laden 1006 23 INC HL ;Adresse und Wert ;um 1 erhoehen 1007 BD CMP L ;Vergleich L mit A 1008 20 FB JRNZ M1-# ;Ruecksprung zu Ml, ;wenn L noch nicht 3
Beim U 880 ist nur die Addition und die Subtraktion von Bytes und Doppelbytes (16-Bit-Worte) moeglich.
Beispiele fuer arithmetische Befehle:
Befehls- Maschinen- Quellkode Kommentar zaehler kode ------------------------------------------ 1000 80 ADD B ;A:=A+B 1001 66 3E ADD 3EH ;A:=A+3EH 1003 86 ADD (HL) ;A:=A+(HL) 1004 88 ADC B ;A:=A+B+CY 1005 CE 0F ADC OFH ;A:=A+0FH+CY 1007 92 SUB B ;A:=A-D 1008 DD 9E 04 SBC (IX+4) ;A:=A-(IX+4)-CY
Die arithmetischen Operationen laufen prinzipiell in folgender Form ab:
A := A + Operand s
Hierbei ist die Konstruktion „:=“ als „ergibt sich aus“ zu interpretieren: A ergibt sich aus A plus Operand s. Diese Befehlsgruppe beeinflusst das Flagregister vollstaendig. Die Wirkungsweise der Flag-Bits laesst sich guenstig bei Zahlenbereichsueberschreitungen nach Ausfuehrung der Operationen zeigen:
Beispiel: A:= -128 ADD B ;(B=127,-128,-127) B = 127 B = -128 B = -129 A alt = 1000 0000 1000 0000 1000 0000 +s = 0111 1111 1000 0000 1000 0001 ------------------------------------------- A alt+s = 1111 1111 10000 0000 10000 0001 CY-F lag neu = 0 1 1 Z neu = 0 1 0 -------------------------------------------- A neu = 1111 1111 0000 0000 0000 0001
Beim Ueberlauf wird das CY-Flag=1, d. h. das Ergebnis der Addition ist falsch.
Fuer die Doppelbytearithmetik gilt mit gewissen Besonderheiten das oben genannte.
Befehls- Maschinen- Quellkode Kommentar zaehler kode ------------------------------------------ 1000 09 ADD HL,BC ;HL:=HL+BC 1001 ED 7A ADC HL,SP ;HL:=HL+SP+CY 1003 19 SBC HL,DE 1004 DD 09 ADD IX,BC
Falls bei der ADD-Operation ein Ueberlauf entsteht, wird das Carry-Flag gesetzt (auf „1“). Bei ADC und SBC wird das Flagregister vollstaendig neu bestimmt. Anwendungsgebiet dieser Befehlsgruppe ist insbesondere die sogenannte Adressarithmetik, d. h. wenn mit Adressen gerechnet wird.
Einen Sonderfall der Arithmetik-Befehle bilden die Vergleichsbefehle. Es wird eine Subtraktion des A-Registerinhaltes mit dem jeweiligen Operanden ausgefuehrt, allerdings werden im Ergebnis der Operation nur die Flags geaendert, der A-Register inhalt bleibt unveraendert.
Beispiele fuer Vergleichsbefehle:
Befehls- Maschinen- Quellkode Kommentar zaehler kode ------------------------------------------ 1000 B8 CMP B ;A-B=? 1001 FE 38 CMP 38H ;A-38H=? 1003 FD BE 05 CMP (IX+5) ;A-(IX+5)=?
Die Flagbeeinflussung funktioniert nach folgender Tabelle:
Z CY ist A>s, dann ist A-s>0 : 0 0 ist A=s, dann ist A-s=0 : 1 0 ist A<s, dann ist A-s<O : 0 1
(s ist der entsprechende Operand)
In der Praxis schliessen sich i.a. an Vergleichsbefehle entsprechende Verzweigungsoperationen oder bedingte Unterprogrammaufrufe in Abhaengigkeit vom Z- oder/und vom CY- Flag an (siehe unter 'Bedingte Sprungbefehle').
Die logischen Befehle des U 880 umfassen das UND, das ODER und das EXKLUSIV-ODER. Die Wirkungsweise wurde im Punkt 2.4 ausfuehrlich erlaeutert. Die logische Verknuepfung erfolgt stets mit dem A-Register und kann mit B, C, D, E, H, L, (HL), A, n, (IX+d) und (IY+d) erfolgen. Das Ergebnis der logischen Operation steht nach deren Ausfuehrung immer im A-Register. Nachfolgend einige Beispiele:
Befehls- Maschinen- Quellkode Kommentar zaehler kode ------------------------------------------ 1000 A0 AND B ;A:=A UND B 1001 AE XOR (HL) ;A:=A XOR (HL) 1002 F6 55 OR 55H ;A:=A OR 55H Spezialfall: 1004 AF XOR A ;CY:=O, Z:=O, ;P:=1, A:=00H!!! 46
Das Flag-Register wird bei diesen Operationen neu bestimt:
DAA ; Dezimalkorrektur bei BCD-Verarbeitung CPL ; Komplementieren des A-Registers (Einerkomplement) A:=/A entspricht einer bitweisen Negation NEG ; Negieren des A-Registers (Zweierkomplement> A:=-A entspricht A:=/A+1 CCF ; Komplementieren des Carry-Flags, CY:=/CY SCF ; Setzen des Carry-Flags, CY:=1
Fuer eine effektive Verarbeitung von Dezimalzahlen koennen diese direkt durch Addition und Subtraktion verarbeitet werden. Dabei koennen, wie dem nachfolgenden Beispiel zu entnehmen ist, unkorrekte Ergebnisse auftreten (Pseudoergebnisse). Deshalb wurde der DAA-Befehl zur Erkennung von Pseudoergebnissen und zur anschliessenden Korrektur nach arithmetischen Operationen bereitgestellt. Der DAA- Befehl kann naoh folgenden Befehlen verwendet werden:
ADD, ADC, INC, SUB, SBC, DEC, NEG
Fuer die Funktion des DAA-Befehls uebernimmt das Carry-Flag CY fuer das hoeherwertige Halbbyte des A-Registers {H(A)} und das Half-Carry-Flag H fuer das niederwertige Halbbyte des A-Registers {N(A)} die Ueberwachungsfunktion, d. h. ein Uebertrag aus dem niederwertigen Halbbyte steht im H-Flag, der aus dem hoeherwertigen im CY-Flag. Ein Beispiel soll die Wirkungsweise des DAA-Befehls verdeutlichen: In jedem Halbbyte steht eine Dezimalzahl im zugelassenen Wertebereich von 0.. .9.
Die Korrektur nach Additionen erfolgt in der Form:
N(A) > 9 oder H = 1 ===> A:=A+06H H(A) > 9 oder CY= 1 ===> A:=A+60H
Bei Subtraktionen erfolgt die Korrektur in folgender Form:(N-Flag = 1)
N(A) > 9 oder H = 1 ===> A:=A-06H H(A) > 9 oder CY= 1 ===> A:=A-60H
Zahlenbeispiel: Addition zweier zweistelliger Dezimalzahlen
>>> A:=99, B:=39, A:=A+B ? A: 1001 1001 = 99 99 B: 0011 1001 = 39 +39 ---------------------------------- A:=A+B: 1101 0010 = D2 falsch !! CY=0 H=1! DAA: +06H 0000 0110 = 38 +60H 0110 0000 = 60 ---------------------------------- A: 0011 1000 = 38 CY=1 H=0 = 138
Ergebnis: Es entsteht eine dreistellige BCD-Zahl, die sich zu zwei Stellen aus dem A-Registerinhalt und als dritte Stelle aus dem Carry-Bit (CY=1) ergibt: ( CY, H(A), N(A) ) = (138)
Auf die anderen Hilfsoperationen soll hier nicht weiter eingegangen werden. Ihre Bezeichnung erlaeutert die Funktion genuegend.
Diese Befehlsgruppe erlaubt den Einzelbit-Test, das definierte Setzen bzw. Ruecksetzen ausgewaehlter Bits von Registern des Prozessors oder der durch den Inhalt der Register HL, IX und IY adressierten Speicherplaetze.
Der Aufbau und die Funktion eines Bit-Test-Befehls laesst sich wie folgt allgemein beschreiben:
BIT i,s; Bit-Test-Operation, Testergebnis ist ueber Z-Flag auswertbar; Z:=1, wenn das Bit i des Registers 's' = 0 ist, Z:=0, wenn das Bit i = 1 ist 0 <= i <= 7 Operanden 's' = A, B, C, D, E H, L, (HL), (IX+d), (IY+d)
Befehle zum Ruecksetzen einzelner Bits haben den Aufbau 'RES i,s' und Befehle zum Setzen 'SET i,s' . Sie beeinflussen keine Flags. Mit dem Befehl 'RES 7,A' wird das Bit 7 des A-Regiter auf den Wert 0 gesetzt, mit 'SET 4,B' das Bit 4 auf den Wert 1.
Mit den Verschiebebefehlen erfolgt im entsprechenden Register entweder eine Rechts- oder eine Linksverschiebung um eine Dualstelle, d. h. um ein Bit. Die Besonderheiten der verschiedenen Verschiebebefehle gehen aus den Darstellungen der einzelnen Befehle hervor.
Fuer alle Operanden 's' gilt:
s = A, B, C, D, E, H, L, (HL), (IX+d), (IY+d)
Linksverschieben um eine Dualstelle
RLC s ; Linksverschieben mit Setzen des Carry-Flag's |---------------------| __ | _________ | |CY| <-+-----|7 0|<----| -- --------- RL s ; Linksverschieben ueber das Carry-Flag |----------------------------------| | __ _________ | |<----|CY| <-------|7 0|<----| -- --------- SLA s ; Linksverschieben durch Carry-Flag __ _________ |CY| <-------|7 0|<----0 -- --------- RLCA ; wie RLC A, aber ausser dem Carry-Flag wird das Flagregister nicht beeinflusst. RLA; ; wie RL A, aber ausser dem Carry-Flag wird das Flagregister nicht beeinflusst. Rechtsverschiebung um eine flualstelle RRC s ; Rechtsverschiebung mit Setzen des Carry-Flags |----------------------| | _________ | __ |----->|7 0|-----+-----|CY| --------- -- RR s ; Rechtsverschiebung ueber das Carry-Flag |------------------------------------| | _________ __ | |----->|7 0|---------->|CY|--->| --------- -- SRA s ; Rechtsverschieben mit Setzen des Carry-Flags (arithmetische Rechtsverschiebung) _________ __ ----->|7 0|---------->|CY| | |-------- -- ------- SRL s ; Rechtsverschieben mit Setzen des Carry-Flags (logische Rechtsverschiebung) _________ __ 0----->|7 0|---------->|CY| --------- -- RRCA ; wie RRC A, ausser Carry wird aber das Flag- register nicht beeinflusst. RRA ; wie RR A, ausser Carry wird aber das Flag- register nicht beeinflusst.
Beispiel: Ein beliebiger Inhalt des A-Registers soll nach rechts verschoben werden, bis Bit 0 des A-Registers = 1 ist. Wenn das A-Register geloescht war, sollen keine Verschiebungen stattfinden.
Befehls- Maschinen- Quellkode Kommentar zaehler kode ----------------------------------------------------- 1000 B0 OR A ;Z = 1, wenn A = 0 ;ist 1001 28 0D JRZ END-# ;Abbruch des ;Programms, wenn A = 0 1003 CB 3F Ml: SRL A ;Rechtsverschiebung ;durch CY 1005 30 FC JRNC M1-# ;Ruecksprung zu Ml ;wenn CY=0 ist, also das herausge- ;schobene Bit eine 0 enthielt 1007 CB 17 RL A ;wenn Bit 1, ;muss es aus CY wieder in das A-Regi- ;ster zurueck ... 1010 76 END: HALT
Mit einer Verschiebung laesst sich z. B. ein Steuerbit aus dem Bit 0 oder Bit 7 ins CY-Flag schieben und abtesten, ohne die anderen Bits zu zerstoeren. Weitere Anwendungsmoeglichkeiten ergeben sich fuer die Arithmetik. Beispielsweise laesst sich der SRA-Befehl als Division durch 2 oder der SLA-Befehl als Multiplikation mit 2 einsetzen.
Ein Sonderfall der Verschiebungsoperationen ist die Verschiebung um vier Dualstellen. Linksverschiebung um vier Dualstellen
RLD ; Der Befehl wirkt zwischen A-Register und dem durch HL indirekt adressierten Speicheroperanden. __________________ | | ________|__ ________v__ A:|7 4|3 0| (HL):|7 4|3 0| --------^-- --|-^---|-- | | | | ------------ ---
Zahlenbeispiel:
A: 3F A: 33 ==> RLD ==> (HL): 3C (HL): CF
Rechtsverschiebung um vier Dualstellen
RRD ; der Befehl wirkt ebenfalls nur zwischen A und (HL) ____________ ___ | | | | ________|__ __v_|___v__ A:|7 4|3 0| (HL):|7 4|3 0| --------^-- --------|-- | | ------------------
Grundsaetzlich werden bedingte und unbedingte Spruenge unterschieden.
JMP sadr ; Befehlszaehler PC nimmt den Wert 'sadr' an. JR e ; Befehlszaehler PC wird um den Wert e veraendert. PC:=PC+e (Vorwaerts- und Rueckwaertsspruenge sind moeglich) JMP (xx) ; Befehlszaehler PC nimmt den Wert an, der im Registerpaar xx enthalten ist. Registerpaare 'xx' = HL, IX, IY
DieBerechnung der Sprungweite ist mit entsprechender Sorgfalt durchzufuehren.
Die Sprungweite ist eine Differenz von Adressen: Zieladresse minus die Adresse des Befehls, der dem Sprungbefehl folgt. Dabei ist zu beachten, dass ein Relativsprungbefehl immer 2 Byte lang ist. Von der CPU wird prinzipiell nach dem Lesen des Befehls der PC auf den Beginn des physisch naechsten, abzuarbeitenden Befehls gestellt, es sei denn, bei der Abarbeitung des eben gelesenen Befehls stellt sich heraus, dass der PC geaendert werden muss (bedingter Sprung). Relativspruenge beziehen sich dann dabei auf die Adresse des nachfolgenden Befehls. Dieser Umstand ist bei der Sprungweitenberechnung unbedingt zu beachten.
Befehls- Maschinen- Quellkode Kommentar zaehler kode ----------------------------------------------------- 1000 21 00 10 LD HL,1000H ;Zaehler laden 1003 75 M1: LD M,L 1004 2C INC L 1005 20 FC JRNZ M1-# 1007 24 INC H ... ;Programmfort- ... ;setzung
Sprungweitenberechnung fuer den Sprungbefehl auf PC = 1005H:
Zieladresse: 1003H Absprungadresse: - 1007H ------------------------ Differenz: 0FFFCH
Es wird nur das niederwertige Byte der Differenz verwendet, also in diesem Falle 0FCH. Man erkennt ausserdem noch folgendes:
Der Betrag der Sprungweite ist groesser 7FH (Bit 7 = 1), das heisst, dass rueckwaerts gesprungen werden muss. Rueckwaerts in dem Sinne, dass der PC um den Absolutbetrag der Sprungweite 's' vermindert wird. Die Sprungweite 's' ist eine vorzeichenbehaftete Konstante.
JPcc adr ; wenn die Bedigung 'cc'erfuellt ist, nimmt der PC den Wert 'adr'an, PC:=adr cc kann sein: C wenn Carry gesetzt C=1 ==> JPC adr NC wenn No Carry " C=0 ==> JPNZ adr Z wenn Zero " Z=1 ==> JPZ adr NZ wenn No Zero " Z=0 ==> JPNZ adr P wenn Plus " S=0 ==> JPP adr M wenn Minus " S=1 ==> JPM adr PO wenn No Parity " P=0 ==> JPPO adr PE wenn Parity " P=1 ==> JPPE adr JRcc ; wenn die Bedingung 'cc' erfuellt ist, wird der PC um den Wert 'e' veraendert (PC:=PC+e) cc = C , ==> JRC e NC, ==> JRNC e Z , ==> JRZ e NZ, ==> JRNZ e
Ein Sonderbefehl ist der Zyklusbefehl mit relativer Adressierung.
DJNZ e ;Das B-Register wird dekrementiert (um 1 vermindert). Solange dessen Inhalt groesser Null ist, erfolgt der relative Sprung (PC:=PC+e), sonst wird der diesem Befehl folgende aufgerufen.
Befehls- Maschinen- Quellkode Kommentar zaehler kode ----------------------------------------------------- 1000 AF TIME: XOR A ;A:=00H 1001 47 LD B,A ;B:=00H 1002 10 FE DJNZ 2 ;B:=B-1,B=0 ? ;Ruecksprung zum Befehl DJNZ, ;also um 2 Byte zurueck 1004 C9 RET ;B:=0, Zeit- ;schleife abgelaufen
Die Kelleroperationen sind eine spezielle Gruppe von Transportoperationen. Die Inhalte der Doppelregister werden in einen Speicherbereich gebracht oder von dort geholt, der durch ein spezielles Register (Stackpointer) indirekt adressiert wird. Beim U 880 ist der Kellerspeicherbereich im gesamten Adresebereich sowohl von der Lage als auch von der Groesse frei waehlbar. Allerdings kann nur ein RAM verwendet werden. Zu Beginn eines Programmes muss der Stackpointer (SP) festgelegt werden. Das geschieht mit dem Ladebefehl 'LD SP,nn'. Dieser Zeiger ist also eine Adresse und damit maximal 16 Bit lang. Sie stellt die Anfangsadresse (den Kontrollboden) des gewuenschten Kellerspeicherbereiches dar.
Kellern---+ +-------> Entkellern | | V | +-------------------+ nn-6 -> | 4. : 1. | nn-4 -> | 3. : 2. | nn-2 -> | 2. : 3. | nn -> | 1. : 4. | +-------------------+
Die Anwendung der Kelleroperationen liegt vor allem im Retten von Doppelregistern und anschliessendem „Zurueckholen“ aus dem Keller zwecks Weiterverwendung in anderen Programmteilen. Das heisst, die geretteten Register koennen bei der Abarbeitung eines Programmteiles anders verwendet werden, denn ihre Inhalte wurden im Keller „sichergestellt“.
Auf Grund des 8-Bit-Datenbusses wird deutlich, dass eine Kelleroperation immer in zwei Schritten ablaeuft. Beim Kellern wird zuerst der Stackpointer dekrementiert, das hoeher wertige Byte gekellert, der SP wieder dekrementiert und dann das niederwertige Byte in den Keller gebracht. Das Entkellern erfolgt derart, dass zuerst das niederwertige Byte gelesen und der SP inkrementiert wird. Anschliessend wird das hoeherwertige Byte gelesen und der SP erneut inkrementiert. Nach Kellern und anschliessendem Entkellern zeigt der Stackpointer wieder auf den gleichen Speicherplatz.
Der Kellerbereich wird auch noch von Unterprogrammspruengen und der Interruptorganisation benoetigt, um die erforderlichen Rueckkehradressen aufzubewahren und bereitzustellen.
Kellern: PUSH ss ;ss= BC, DE, AF, HL, IX, IY Entkellern: POP ss ;ss= BC, DE, AF, HL, IX, IY
Beispiel:
Retten der Register BC, DB, AF und HL in einem Unterprogramm, da diese Register im Unterprogramm benoetigt werden und danach ihre alten Inhalte wieder erhalten sollen.
Befehls- Maschinen- Quellkode Kommentar zaehler kode ----------------------------------------------------- 1000 31 00 00 LD SP,0 ;Kellerzeiger ;laden 1003 CD F1 10 CALL UP1 ;Unterprogr.-ruf ;PC wird gekellert: (FFFFH):=H(PC)=10h ; (FFFBH):=N(PC)=06H ;SP: =FFFEH 1006 ... ;Programmfortsetzung nach der Rueckkehr ;aus dem Unterprogrararn ;Unterprogramm UP1 10F1 C5 UP1: PUSH BC ;SP:=FFFCH (FFFDH):=B (FFFCH):=C 10F2 D5 PUSH DE ;SP=0FFFAH (FFFBH):=D (FFFAH):=E ... ;Unterprogramm 1107 Dl POP DE ;SP:=FFFCH 1108 Cl POP BC ;SP:=FFFEH 1109 C9 RET ;Ruecksprung zur ;Adresse, die jetzt im Keller oben ;an steht, in diesem Falle 1006H ;SP:=OOOOH
Man erkennt, dass das „Zurueckholen“ in genau umgekehrter Reihenfolge erfolgen muss wie das „Retten“. Die Ursache liegt darin begruendet, dass der zuletzt gerettete Wert zuerst wieder zurueckgeholt wird und demzufolge der zuerst gerettete Wert als letzter im Stack verfuegbar ist. Im Keller werden also alle geretteten Werte „aufeinandergestapelt“ und von diesem Stapel in umgekehrter Reihenfolge wieder herausgeholt.
Unterprogramme sind Programmteile, die sich bei der Abarbeitung eines Programmes oft wiederholen. Um unnoetige Programmlaengen zu vermeiden, werden solche Teile nur einmal ins Programm eingefuegt und bei Bedarf als UP aufgerufen. Das heisst: Das Hauptprogramm wird an diesen Stellen verlassen, das Unterprogramm abgearbeitet und dann das Hauptprogramm mit dem Befehl fortgesetzt, der der Aufrufstelle folgt.
Der Aufruf von Unterprogrammen kann sowohl unbedingt als auch bedingt in Abhaengigkeit vom Flagregister erfolgen. Im wesentlichen ist mit dem Unterprogrammaufruf die definierte Aenderung des Befehlszaehlers aehnlich den Sprungbefehlen verbunden, allerdings muss bei Rueckkehr aus dem Unterprogramm der Befehlszaehler PC die Adresse des Befehls enthalten, der als unnimittelbarer Nachfolger des Unterprogrammaufrufes gilt, um genau an dieser Stelle im Programm weiterarbeiten zu koennen. Dies wird realisiert, indem vor dem Sprung ins Unterprogramm die alte PCAdresse, die auf den folgenden Befehl zeigt, gekellert wird und erst dann der Befehlszaehler PC die Unterprogrammadresse erhaelt. Bei Rueckkehr aus dem Unterprograrnin wird diese im Keller gesicherte Adresse wieder in den Befehlszaehler geladen. Das erledigt der Prozessor allein durch den Befehl 'RET'.
CALL adr ;Unterprogrammaufruf, es wird die Adresse des CALL-Befehls +3 in den Keller gebracht (also der nachher notwendige PC-Stand), der PC selbst nimmt den Wert adr an (16-Bit-Adresse). Der Stackpointer wird um 2 erniedrigt. RET ;Unterprogrammrueckkehr, aus dem Keller wird die sichergestellte Adresse in den Befehlszaehler PC geholt, das Hauptprogramm kann weitergehen; der SP wird wieder um 2 erhoeht. CAcc adr ;bedingter Unterprogrammaufruf, wenn die Bedingung cc erfuellt ist, sonst nachfolgender Befehl. Rcc ;bedingte Unterprogrammrueckkehr, wenn die Bedin- gung cc erfuellt ist, sonst nachfolgender Befehl.
Moegliche Bedingungen: cc= NZ, Z, C, NC, P, M, PO, PE
Die Bedingungen der Unterprogrammrufe sind die gleichen wie bei den bedingten Sprungbefehlen.
Einen Sonderfall des Unterprogrammrufes bilden die Restart-Befehle. Hier entfaellt die Angabe einer 2-Byte Sprungadres- se. Es erfolgen Spruenge zu festen Adressen (0000H, 0008H, 0010H, 0018H, 0020H, 0028H, 0030H, 0038H).
RST hh ;Unterprogrammruf, der aktuelle PC des RST-Be- fehle (konkret der PC-Stand nach dem RST-Befehl) wird gekellert. Der PC nimmt den Wert 00hhH an. hh=OH, 8H, 10H, ... , 30H, 38H
Beispiel zur Unterprogrammtechnik:
Befehls- Maschinen- Quellkode Kommentar zaehler kode ----------------------------------------------------- 1000 3E FF START: LD A,0FFH ;Start des Haupt- programms 1002 77 LD (HL),A ... 100E CD 34 13 CALL UP1 ;1. Unterprogramm- ;ruf ;UP1 beginnt bei ;Adr.1334H 1012 23 INC HL ;Fortsetzung des ;Hauptprogramms 1013 7E LD A,(HL) ... 103F 88 ADC B ... 125E CD 34 13 CALL UP1 ;2. Unterprogramm- ;ruf 1261 23 INC HL ;Fortsetzung des ;Hauptprogrammes ... 126A 126B DD CB 00 DE SET 3,(IX+0) ... 1333 76 HALT 1334 C5 UP1: PUSH BC ;Beginn des UP 1335 CB 4F BIT 1, A .. 1353 Cl POP BC 1354 C9 RET ;Rueckkehr ins ;Hauptprogramm
<note tip>Hinweis: Es ist unbedingt zu beachten, dass im Unterprogramm die Anzahl der PUSH-Befehle identisch der Anzahl der POP-Befehle sein muss, da sonst bei der Entkellerumg bei Unterprogrammrueckkehr ein falscher Wert in den Befehlszaehler kommt und Programm undefiniert und nicht ab der Aufrufstelle wei- terlaeuft. </note> Einde Verschactelung mehrerer Unterprogramme (ein UP ruft ein weiteress UP auf ) ist moeglich, die Anzahle der Schachtelungen ist theoretisch unbegrenzt.
Wie bereits erwaehnt, sind beim U 880 maximal 256 Ein- und Ausgabekanaele (Peripherieadressen) adressierbar. Zur Adressierung bei Ein- und Ausgaben wird der niederwertige Teil des Adressbusses verwendet. Im Befehl selbst wird die Geraeteadresse (Kanaladresse) entweder direkt ausgegeben oder indirekt ueber das C-Register adressiert. Bei direkter Kanaladresse erfolgt der Datentransport immer zwischen dem A-Register und der Peripherie, bei indirekter Kanaladresse (C-Register muss vorher mit der Kanaladresse geladen werden) kann der Datentransport zwischen einem der Register A, B, C, D, E, H, L, und der Peripherie erfolgen.
IN n ;Eingabe des Kanals n in das A-Register, A:=(n) IN r ;Eingabe dec Kanals, dessen Adresse im C-Register enthalten ist, nach dem Register 'r'. OUT n ;Ausgabe des A-Registers nach Kanal 'n', (n):=A OUT r ;Ausgabe des Registers 'r' nach dem Kanal, dessen Adresse im C-Register enthalten ist.
Register 'r' = A, B, C, D, E, H, L
Einen Sonderfall stellt der Eingabebefehl 'INF' dar. Der Inhalt des von Register C adressierten Kanals wird gelesen und danach entsprechend die Flags gesetzt.
Beispiel: Das Ausgaberegister mit der Adresse 10H soll definiert mit 00, 01 und 02 geladen werden.
Befehls- Maschinen- Quellkode Kommentar zaehler kode ----------------------------------------------------- 1000 0E 10 LD C,10H ;C:=10H Kanaladres- ;se des Registers 1002 A8 XOR A ;A:=00H 1003 ED 79 OUT A ;(C):=00H 1005 3C INC A ;A:=A+1 = 01H 1006 ED 79 OUT A ;(C):=01H 1008 3C INC A ;A:=A+1 = 02H 1009 ED 79 OUT A ;(C):=02H ... 1178 76 END: HALT
Gruppenoperationen in diesem Sinne sind hardwaremaessig im Prozessor U 880 installierte Befehlsablaeufe, die vom Programmierer lediglich die Generierung bestimmter Register als Parameter verlangen. Diese Befehle vermeiden nicht nur das umstaendliche Programmieren mit einzelnen Befehlen, sondern fuehren besonders zur Programmbeschleunigung und Einsparung von Programmspeicherplaetzen.
LDI ;inkrementierendes Laden - die Zieladresse ist in DE zu laden - die Quelladresse ist in HL zu laden - die Blocklaenge in BC (=Anzahl der im Speicher auf einanderfolgenden 'zu transportierenden Byte's). Befehlsablauf: (DE):=(HL) DB:=DE+1 HL:=HL+1 BC:=BC-1 P/V=0 bei BC-1=0 1 bei BC-1<>0 LDD ;dekrementierendes Laden wie LDI, nur DE:=DE-1 und HL:=HL-1 CPI ;inkrementierendes Vergleichen (Suchbefehl) - die Anfangsadresse ist in HL zu laden - die Blocklaenge ist in BC zu laden Befehlsausfuehrung: A-(HL)=? HL:=HL+1 BC:=BC-1 Z=1 bei A=(HL) 0 bei A<>(HL) P/V=0 bei BC-1=0 1 bei BC-1<>O CPD ;dekrementierendes Vergleichen wie CPI, nur HL:=HL-1 INI ;inkrementierende Eingabe - Zieladresse ist in HL zu laden - Kanaladresse ist in C zu laden - Blocklaenge in B (max. 256 Byte) Befehlsausfuehrung: (HL):=(C) HL:=HL+1 B:=B-1 Z=1 bei B=0 0 bei B<>O 58 IND ;dekrementierende Eingabe wie INI, nur HL:=HL-1 OUTI ;inkrementierende Ausgabe - Zieladresse ist in C zu laden - Kanaladresse ist in Hl zu laden - Blocklaenge in B Befehlsausfuehrung: (C):=(HL) HL: =HL+1 B:=B-1 Z=1 bei B=0 0 bei B<>O OUTD ;dekrementierende Ausgabe wie OUTI, nur HL:=HL-1
Bei den einfachen Gruppenoperationen kann der Programmierer gezielt die Flags testen und entsprechende Rueckspruenge bzw. die weitere Programmbearbeitung fordern.
Als moegliche Anwendungen ergeben sich:
LDI, LDD zum Blocktransport CPI, CPD zur Byte- oder Blocksuche INI, IND Blockeingabe OUTI, OUTD Blockausgabe
Die Blocklaenge ist dabei in BC bzw. B anzugeben.
LDIR ; wie LDI, Befehl wird wiederholt bis BC:=00H LDDR ; wie LDD, Befehl wird wiederholt bis BC:=00H OPIR ; wie CPI, Befehl wird wiederholt bis BC:=00H oder A=(HL) CPDR ; wie CPD, wird wiederholt bis BC:=00H oder A=(HL) INIR ; wie INI, wird wiederholt bis B:=0 INDR ; wie IND, wird wiederholt tis B:=0 OTIR ; wie OVIl, wird wiederholt bis B:=0 OTDR ; wie OUTD, wird wiederholt bis B:=0
Beispiel: Ein Speicherbereich von Adresse 0D00H bis Adresse 0FFFH soll definiert mit „0E3H“ geladen werden.
Befehls- Maschinen- Quellkode Kommentar zaehler kode ----------------------------------------------------- 1000 21 00 0D LD HL, 0D00H ;Quelladresse 1003 3E E3 LD A, 0E3H 1005 77 LD (HL),A ;(HL):=0E3H, ;1. Speicherplatz geladen 1006 11 01 OD LD DE,0D01H ;1. Zieladresse 1009 01 FE 02 LD BC,2FEH ;Blocklaenge -1 ;da ein byte schon geladen wurde - 1000 ED B0 LDIR ;Befehl bewirkt ;das sogenannte Durchschleifen des Wer- ;tes '0E3H' bis zur Adresse 0FFFH
EXAF ; Wechsel des Doppelregisters AF gegen AF' EXX ; Wechsel des Doppelregistersatzes: BC gegen BC' DE gegen DE' HL gegen HL'
Angewendet wird der Registerwechsel beispielsweise zur Rettung bei Interrupt oder Unterprogramaufruf, da diese Variante schneller ist als das Kellern bzw. Entkellern der Register.
EX DE, HL ; Tausch der Doppelregisterinhalte E-->L und L-->E D-->H und H-->D EX (SP), xx; xx=HL, IX, IY Tausch der jeweils obenanstehenden Stackinhalte gegen die Inhalte der Doppelregister xx. (SP) gegen L, N(IX) oder N(IY) (SP+1) gegen H, H(IX) oder K(IY)
Beispiel:
Befehls- Maschinen- Quellkode Kommentar zaehler kode ----------------------------------------------------- 1000 08 INT1: EXAF ;Register- ;wechsel, da im Interruptprogramm ein ;Grossteil der Register benoetigt wird 1001 D9 EXX 1002 3E E3 LD A,3FH 1004 ... 101B D3 04 OUT 04 101D D9 EXX 101E 08 EXAF 101F FB EI 1020 ED 4D RETI
NOP ; Es wird keine Operation ausgefuehrt, nur der Befehle- zaehler um ein Byte weitergestellt. HALT ; Prozessor fuehrt intern NOP-Operationen zur Aufrecht- erhaltung des Refresch-Zyklus durch. Der Befehlszaehler erhaelt die Adresse des nachfolgen- den Befehls. Dieser Befehl wird aber erst nach der vollstaendigen Ausfuehrung einer Interruptroutine aus- gefuehrt. Eine Fortsetzung ist auch mit Reset moeglich.
Ein Grossteil aller Mikroprozessorbefehle beeinflusst definiert entweder das gesamte Flag-Register bzw. nur einzelne Flag-Bits. Die genaue Kenntnis der Bedeutung der Flag-Bits bzw. die Art der Beeinflussung durch verschiedene Befehle ist die wichtigste Voraussetzung fuer die fehlerfreie bzw. optimale Programmerstellung. Die allgemeine Bedeutung der Flag-Bits ist folgender Zusammenstellung zu entnehmen:
S: Vorzeichen (signum) Ist eine Kopie des Bits A7; es repraesentiert das echte Vorzeichen des Resultates nach arithmetischen Operationen mit Operanden in Zweier- komplementdarstellung. S=1, wenn das Ergebnis <0 ist, Abfrage mit cc=M (JPM) S=0, wenn das Ergebnis >=0 ist, Abfrage mit cc=P (JPP) Z: Null (zero) Bei einer Null im A-Register (alle 8 Bitpositionen = 0) nach arithmetischen und logischen Operationen (auch nach CMP) wird Z=1. H: Halbbyteuebertrag (half-carry) Wird bei einem Uebertrag von Bit A3 nach Bit A4 auf "1" gesetzt. (Wird vom DAA-Befehl intern ausgewertet.) N: Subtraktion N=1, wenn der Befehl eine Subtraktion (auch CMP) war. Wird vom DAA-Befehl ebenfalls herangezogen. CY: Uebertrag (Carry) Uebertrag aus dem A-Register nach einer Addition, Mittels SO? und CO? ist das OY-Flag auch setz- und komplement ierbar. P/V: Paritaets/Ueberlauf (parity/overflow) Dieses Flag hat verschiedene Funktionen. 1.) Es zeigt nach logischen und Verschiebeoperationen und nach dem Befehl 'IN r' die Paritaet P an: P=1 bei gerader Anzahl vorhandener Bit-Einsen, die Abfra- ge kann mit JPPE erfolgen Abfrage einer ungeraden Anzahl mit JPPO 2.) Es zeigt im Gegensatz zu Carry den echten Ueberlauf V des Resultates nach einer arithmetischen Operation mit Operanden an. Abfrage mit JPPE 3.) Das Flag sichert nach LD A,I und LD A,R das Bit aus IFF2, damit es mit 'LD A,I' wieder in IFF2 gesetzt werden kann. In IFF2 wird eine angemeldete Unterbrechung gespeichert, bis sie vom Prozessor bearbeitet wird. 4.) Es fixiert nach LD- und CMP-Gruppenoperationen die Aussa- ge, ob der Bytezaehler in BC nach Erniedrigung ungleich Null ist. D. h. P/V=0 bei BC-1=0 P/V=1 bei BC-1<>O
Die Abfrage der Flag-Bits bei bedingten Operanden erfolgt nach den im jeweiligen Befehl anzugebenden Bedingungen (siehe Sprungbefehle) wie folgt:
Bedingung Frage NZ : Z=0? ===> JPNZ , JRNZ Z : Z=1? ===> JPZ , JRZ NC : C=0? usw. C : C=1? PO : P/V=0? PE : P/V=1? P : S=0? M : S=1?
Die komplette Analyse aller Flag-Bits ist jederzeit moeglich durch Kellern von AF und anschliessendem Laden der durch den SP angezeigten letzten zwei Speicherplaetze in ein Doppelregister.
Beispiel:
Befehls- Maschinen- Quellkode Kommentar zaehler kode ----------------------------------------------------- 1000 F5 PUSK AF ;Kellern von AF 1001 El POP HL ;H:=(SP+1)=A,L:=(SP)=F 1002 LD A,L
Die im Anhang beigefuegte Befehlsliste enthaelt Hinweise auf die Beeinflussung der Flag-Bits durch die jeweiligen Befehle sowie die Kodierung der einzelnen Befehle zur manuellen Programmuebersetzung.
Um auf Signale aus der Umwelt des Prozessors reagieren zu koennen, kann mit einem Programm eine Leitung (also ein Signal) zyklisch abgefragt werden. Das setzt aber voraus, dass dieses Programm immer dieses Signal abfragt. Eine Reaktion des Rechners erfolgt erst, wenn das Signal durch die Abfrage erkannt wird. Der U 880 verfuegt ueber die Moeglichkeit eines Interrupts. Das heisst, dass ein Signal von einem externen Geraet eine Unterbrechung des laufenden Programms zu einem beliebigen Zeitpunkt verursachen kann, um den Prozessor zur sofortigen Abarbeitung eines Programms zu zwingen, das diese Unterbrechung entsprechend behandelt (Interruptbehandlungsroutine).
Fuer die effektive und schnelle Bearbeitung von Unterbrechungswuenschen der Peripherie stehen beim U 880 ein maskierbarer Interrupt und ein nichtmaskierbarer Interrupt zur Verfuegung (der maskierbare Interrupt kann verboten werden).
Wird von der Peripherie ein Signal fuer den nichtmaskierbaren Interrupt erzeugt (L-Pegel am Eingang NMI), so fuegt der Prozessor eine RST-Operation mit der festen Adresse 0066H ein. Es liegt beim Programmierer, inwieweit er in diesem Unterprogramm fuer eine Rettung bestimmter Registerinhalte sorgt. Es gibt keinen Befehl, der den nichtmaskierbaren Interrupt verbietet. Die Anwendung liegt meist bei der Datenrettung vor Erkennen eines Spannungsausfalis des Rechnersystems. Der maskierbare Interrupt kann in 3 unterschiedlichen Betriebsarten auftreten, die in der CPU durch einen Befehl eingestellt werden koennen.
Fuer das Sperren bzw. Freigeben aller drei maskierbaren Interruptarten steht jeweils ein Befehl zur Verfuegung.
Interrupt sperren: DI
Interrupt erlauben: EI
Trifft eine Anforderung an den maskierbaren Interrupt ein (L-Pegel am Eingang INT), wenn er durch 'DI' gesperrt ist, so nimmt der Prozessor diese Anforderung zur Kenntnis und arbeitet diese Anforderung sofort nach dem Wiederfreigeben der Interrupterlaubnis durch den Befehl 'EI' ab.
Maskierbare Interruptarten
Diese 3 Interruptarten werden durch einen der Befehle 'IM0', 'IM1' oder 'IM2' gesetzt.
IM0: In dieser Betriebsart wird nach akzeptiertem Unter- brechungswunsch der Interruptquelle der naechste abzu- arbeitende Befehl vom Datenbus geholt und in den Pro- grammlauf eingeschoben. (Es bietet sich hier an, RST-Befehle zu verwenden. Das sind 1-Byte-Befehle, die einem Unterprogrammsprung entsprechen.) Das heisst aber auch, dass durch das in- terruptanfordernde Geraet der Befehl auf den Datenbus gelegt wird. IM1: Nach dem Akzeptieren des Unterbrechungswunsches wird der Befehl 'RST 38H' automatisch ausgefuehrt. Gegebenenfalls muss im Interruptbehandlungsprogramm eine Abfrageroutine eingeleitet werden, welche den "Interrupt-Anmelder" feststellt und danach entsprechen- de Programme aktiviert. IM2: Diese Betriebsart stellt fuer den Prozessor die lei- stungsfaehigste Unterbrechungsbehandlung dar. Man nennt sie auch Vektorinterrupt, weil die Organisation der Behandlungsroutinen ueber Zeiger auf einen Adress- vektor realisiert wird. Bei Unterbrechungsanforderung stellt jede Interrupt- quelle den fuer die gewuenschte Interruptroutine not- wendigen niederwertigen "Zeigerteil" durch Aussenden eines 8-Bit-Wertes auf den Datenbus bereit (sogenann- tes Vektorlesen). Dieser Wert bildet den niederwertigen Teil, der Inhalt des I-Registers den hoeherwertigen Teil einer Adresse einer bestimmten Speicherzelle. Diese und die nachfol- gende Speicherzelle beinhalten dann die Adresse des In- terruptbehandlunnsprogramms. Dies setzt aber natuerlich das vorbereitende Laden des I-Registers und der ent- sprechenden Register der Peripheriebausteine voraus (sogenannte Initialisierung).
Beispiel:
3 Peripheriebausteine verlangen jeweils eine ande- re Interruptroutine. Die Startadressen fuer die jeweiligen Unterprogramme lauten: INT1:=0FF0H INT2:=0FFFH INT3:=2F00H Aufbau der Startadressentabelle: Zeiger1: 0C00 F0H 0C01 OFH Zeiger2: 0C02 FFH <=== N(INT2):=0FFH 0C03 0FH <=== H(INT2):=0FH Zeiger3: 0C04 00H ===> 0FFFH=Startadresse 0C05 2FH 0C06 - Das I-Register muss mit "0CH" geladen werden. Es stellt den absoluten Zeigerteil dar. - Dem Peripheriebaustein 1 muss fuer das entsprechen- de Register der variable Zeigerteil mit dem Wert "00" mitgeteilt werden. Entspechend gilt "02H" und "04H" fuer Baustein 2 und 3.
Durch Aneinandersetzen des I-Registers als High-Teil und des variablen Zeigerteils als Low-Teil entsteht der gesamte Zeiger.
Das heisst zum Beispiel:
Peripheriebaustein 2 meldet einen Interrupt an. Der Interrupt 2 wird zu gegebener Zeit akzeptiert und der Peripheriebaustein muss jetzt den variablen Zeigerteil im Falle des Zahlenbeispiels 02H, auf den Datenbus legen (Vektorlesen der CPU). Jetzt erfolgt die Bestimmung des gesamten Zeigers.
I-Register 0CH (High-Teil) var. Zeiger 02H (Low-Teil) ---------------------------- Zeiger 2 0C02H
In der Startadresstabelle ist unter der Adresse 0C02H ein 0FFH und unter 0C03H ein 0FH eingetragen, d. h. die Startadresse der zum Peripheriebaustein 2 gehoerenden Interruptbehandlungsroutine lautet 0FFFH.
Auf diese Art, laesst sich nicht nur sehr schnell aus vielen Interruptroutinen die fuer den Peripheriebaustein notwendige herausfinden und aktivieren, es wird auch moeglich, fuer ein und denselben Peripheriebaustein durch Umprogrammieren des „variablen Zeigerteils“ eine andere Interruptroutine aufzurufen. Das Akzeptieren einer Interruptanforderung setzt stets das Retten der Fortsetzungsadresse voraus. Dies geschieht wie beim Unterprogrammruf durch Kellern des Befehlszaehlers. Bei Rueckkehr aus der Interruptroutine wird der Befehlszaehler wieder entkellert und es erfolgt somit die Fortsetzung der Programmabarbeitung an der zuvor verlassenen Stelle. Das Kellern und Entkellern fuehrt der Prozessor automatisch aus. Auch hier gilt zu beachten, dass im Interruptprogramm die Anzahl der Keller- und Entkelleroperationen gleich sein muss.
Problematisch ist es, wenn mehrere Peripheriebausteine gleichzeitig eine Unterbrechung anmelden. Vorrang hat stets der Baustein, welcher in der Prioritaetskette an „weitesten vorn“ steht. Diese Kette wird durch die Signale 'IEI' und 'IEO' gebildet, die durch alle Bausteine hindurchgefuehrt werden. Waehrend der Abarbeitung einer Interruptbehandlungsroutine bleibt es dem Programmierer ueberlassen, ob er durch Setzen des EI-Befehls die Unterbrechung der Interruptbehandlungsroutine vorzeitig durch einen Peripheriebaustein hoeherer Prioritaet zulaesst oder nicht, da die Annahme einer Unterbrechung weitere Unterbrechungsannahmen ausschliesst. Am Ende einer Interruptbehandlungsroutine muss stets, sofern nicht schon erfolgt, mit dem Befehl 'EI' die Unterbrechungserlaubnis wieder freigegeben werden. EI wird immer erst nach Ausfuehrung des auf EI folgenden Befehls wirksam.
- Rueckkehrbefehle aus dem Interruptprogramm:
RETI ; Rueckkehr aus dem maskierbaren Interruptprogramm RETN ; Rueckkehr aus dem nichtmaskierbaren Interruptpro- gramm Hinweis: RETI bewirkt beim Peripheriebaustein, welcher die Interruptroutine ausgeloest hat, das Wiederschlies- sen der Prioritaetskette (IEO--high). Somit koennen nach RETI auch die Peripheriebausteine niedriger Prioritaet einen Interrupt ausloesen.