Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
z1013:handbuecher:handbuch_1 [2010/07/20 14:16] – koma | z1013:handbuecher:handbuch_1 [2013/06/25 11:04] (aktuell) – volkerp | ||
---|---|---|---|
Zeile 28: | Zeile 28: | ||
2.4.2.[[# | 2.4.2.[[# | ||
2.4.3.[[# | 2.4.3.[[# | ||
- | 3. Hardware des Z1013 | + | 3.[[# |
- | 3.1. Blockschaltbild | + | 3.1.[[# |
- | 3.2. Steuerung des Mikroprozessors | + | 3.2.[[# |
- | 3.2.1. | + | 3.2.1.[[# |
- | 3.2.2. | + | 3.2.2.[[# |
- | 3.2.3. | + | 3.2.3.[[# |
- | 3.3. Speichereinheiten | + | 3.3.[[# |
- | 3.3.1. | + | 3.3.1.[[# |
- | 3.3.2. | + | 3.3.2.[[# |
- | 3.4. Ein-/ | + | 3.4.[[# |
- | 3.4.1. | + | 3.4.1.[[# |
- | 3.4.1.1. | + | 3.4.1.1.[[# |
- | 3.4.1.2. | + | 3.4.1.2.[[# |
- | 3.4.2. | + | 3.4.2.[[# |
- | 3.4.3. | + | 3.4.3.[[# |
- | 3.4.4. | + | 3.4.4.[[# |
- | 3.5. Stromversorgung | + | 3.5.[[# |
- | 3.6. Bussystem | + | 3.6.[[# |
- | 4. Der Befehlssatz des Mikroprozessors U880 | + | 4.[[# |
- | 4.1. Befehlsschluessel | + | 4.1.[[# |
- | 4.1.1. | + | 4.1.1.[[# |
- | 4.1.2. | + | 4.1.2.[[# |
- | 4.1.3. | + | 4.1.3.[[# |
- | 4.1.4. | + | 4.1.4.[[# |
- | 4.2. Adressierung | + | 4.2.[[# |
- | 4.2.1. | + | 4.2.1.[[# |
- | 4.2.2. | + | 4.2.2.[[# |
- | 4.2.3. | + | 4.2.3.[[# |
- | 4.2.4. | + | 4.2.4.[[# |
- | 4.3. Maschinenbefehle und ihre Bedeutung | + | 4.3.[[# |
- | 4.3.1. | + | 4.3.1.[[# |
- | 4.3.2. | + | 4.3.2.[[# |
- | 4.3.3. | + | 4.3.3.[[# |
- | 4.3.4. | + | 4.3.4.[[# |
- | 4.3.5. | + | 4.3.5.[[# |
- | 4.3.6. | + | 4.3.6.[[# |
- | 4.3.7. | + | 4.3.7.[[# |
- | 4.3.8. | + | 4.3.8.[[# |
- | 4.3.9. | + | 4.3.9.[[# |
- | 4.3.10. | + | 4.3.10.[[# |
- | 4.3.11. | + | 4.3.11.[[# |
- | 4.3.12. | + | 4.3.12.[[# |
- | 4.3.13. | + | 4.3.13.[[# |
- | 4.3.14. | + | 4.3.14.[[# |
- | 4.3.15. | + | 4.3.15.[[# |
- | 4.3.16. | + | 4.3.16.[[# |
- | 4.4. Unterbrechungsorganisation | + | 4.4.[[# |
Bestandteile des Handbuches: | Bestandteile des Handbuches: | ||
Zeile 679: | Zeile 679: | ||
Ergebnis: | Ergebnis: | ||
- | Bei der teilweisen Addition kann ebenfalls ein Uebertrag auftreten, d. h. der Zahlenbereich ueberschritten werden. | + | 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. |
- | | + | |
+ | ===== 3. Hardware des Z1013 ===== | ||
+ | |||
+ | |||
+ | 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. | ||
+ | |||
+ | ==== 3.1. Blockschaltbild ==== | ||
+ | < | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | | ||
+ | | CPU | | ||
+ | | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | | ||
+ | |Takt-| | ||
+ | |gene-| | ||
+ | |rator| | ||
+ | | | ||
+ | | ||
+ | | | | | ||
+ | BAS | | | | ||
+ | | ||
+ | | ||
+ | | | HF- | ||
+ | | | Modu- | | | | ||
+ | | | lator | | | | ||
+ | | ||
+ | | ||
+ | TV-Geraet | ||
+ | |||
+ | ==== 3.2. Steuerung des Mikroprozessors ==== | ||
+ | |||
+ | === 3.2.1. Beschreibung der Steuersignale === | ||
+ | |||
+ | 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 " | ||
+ | ausgesandte, | ||
+ | fuer Signale, die sowohl von der CPU empfangen als auch ausgesandt werden koennen. | ||
+ | |||
+ | (A-Ausgabe, E-Eingabe, B-bidirektional, | ||
+ | als auch Ausgabe) | ||
+ | * **A0 bis A15 (A)**\\ Sie bilden den 16-Bit-Adressbus. Sie werden in der CPU gebildet und bei der Arbeit mit den Speichern als Speicheradresse sowie die Leitungen A0 bis A7 bei der E/A-Arbeit als E/A-Adresse verwendet. | ||
+ | * **A0 bis A6 (A)**\\ Sie dienen zum Auffrischen dynamischer Speicher. | ||
+ | * **D0 bis D7 (B)**\\ Diese Leitungen stellen den 8 Bit-Datenbus dar. Die Signale koennen sowohl von der CPU gebildet werden (bei Ausgabe oder Speicherschreiben) oder sie werden von den ausgewaehlten Funktionseinheiten erzeugt (bei Eingaben oder Speicherlesen). | ||
+ | * **/MREQ (A)**\\ Dieses Signal wird benoetigt, um eine auf dem Adressbus ausgesandte Adresse zur Speicheradresse zu erklaeren und einen Speicherzugriff durchzufuehren. | ||
+ | * **/IORQ (A)**\\ Das Signal kennzeichnet die auf dem Adressbus anliegende Adresse als Adresse einer E/ | ||
+ | * **/M1 (A)**\\ Es charakterisiert den Maschinenzyklus 1. Dieses Signal wird von der CPU ausgesendet und kennzeichnet in Verbindung mit dem Signal /MREQ, dass vom Speicher ein Befehl geholt wird. In Verbindung mit dem Signal /IORQ wird gekennzeichnet, | ||
+ | * **/RD (A)**\\ Es wird in den angeschlossenen Funktionseinheiten ausgewertet und legt die Richtung des Datentransportes als " | ||
+ | * **/WR (A)**\\ Es kennzeichnet die Richtung des Datentransportes fuer die angeschlossenen Funktionseinheiten als " | ||
+ | * **/RFEH (A)**\\ Zeigt den angeschlossenen Speichereinheiten in Verbindung mit /MREQ, dass auf dem Adressbus eine Refresh-Information verfuegbar ist. Diese Refresh-Information besteht aus einer 7-Bit-Adresse (A0 bis A6), die festlegt, welche Speicherzellen in den dynamischen Speichern; aufgefrischt werden sollen. Das Adressbit 7 kann durch den Programmierer gesetzt oder rueckgesetzt werden und ist Bestandteil der Refresh-Information. Auf dem hoeherwertigen Teil des Adressbusses wird der Inhalt des I-Registers ausgesandt. | ||
+ | * **/HALT (A)**\\ Wird von der CPU ausgesandt, wenn der soeben gelesene Befehl den Operationskode 76H hatte. Die Abarbeitung wird unterbrochen, | ||
+ | * **/WAIT (E)**\\ Wird von der CPU zu bestimmten Zeiten abgetastet. Ist dieses Signal Low, wird die Arbeit der CPU angehalten, die Informationen auf dem Systembus bleiben erhalten. Anwendung findet dieses Signal vor allem bei der Anpassung der Verarbeitungsgeschwindigkeit von langsamen Funktionseinheiten, | ||
+ | * **/INT (E)**\\ Wird von der CPU am Ende eines Befehls abgetastet und signalisiert, | ||
+ | * **/NMI (E)**\\ Dieser Eingang stellt aequivalent zum INT-Signal eine Unterbrechungsmoeglichkeit der laufenden CPU-Arbeit dar, die allerdings nicht gesperrt werden kann. Die Abarbeitung des Unterbrechungsbehandlungsprogramms beginnt ab der Adresse 66H, nachdem zuvor die Fortsetzungsadresse des gerade laufenden Programmes gerettet wurde. | ||
+ | * **/RESET (E)**\\ Unterbricht jede weitere Arbeit der CPU, stellt einen Anfangszustand ein und gibt mit dem Uebergang nach H-Pegel die CPU wieder frei. Da das Reset-Signal meist manuell erzeugt wird, wird durch die Schaltung eine Verkuerzung dieses Signals vorgenommen, | ||
+ | * **C (E)**\\ Stellt den der CPU zugefuehrten Systemtakt dar. Dieser Takt ist gleichzeitig in allen Funktionseinheiten verfuegbar und sichert die Synchronitaet aller Baugruppen. | ||
+ | * **/BUSRQ (E)**\\ Diese Leitung wird am Ende eines Befehls durch die CPU abgetastet. Dieses Signal kennzeichnet, | ||
+ | * **/BUSAK (A)**\\ Ist das Quittungssignal der CPU, welches den hochohmigen Zustand kennzeichnet und damit der den Systembus anfordernden Funktionseinheit den Zugriff erlaubt. | ||
+ | |||
+ | Weiterhin umfasst der Systembus folgende Signale, die nichtvon der CPU ausgesandt oder empfangen werden: | ||
+ | * **/ | ||
+ | * **/IODI**\\ Stellt analog zum MEMDI-Signal eine Moeglichkeit dar, bestimmte Adressbereiche auszublenden und Konflikte auf dem Datenbus bei der E/A-Arbeit zu verhindern. | ||
+ | * **/IEI** und **/IEO**\\ Werden zur Bildung der Prioritaetskette der interrupterzeugenden Funktionseinheiten benoetigt. Jeweils der Ausgang (IEO) der hoeheren Prioritaet wird dem Eingang (IEI) dernaechstfolgenden Prioritaetsstufe zugefuehrt (vergleiche auch Abschnitt 4.4 Interruptbehandlung). Ein Interrupt kann von einer Funktionseinheit nur ausgeloest werden, wenn das zugefuehrte Signal IEI H-Pegel fuehrt. Gleichzeitig wird das abgegebene Signal IEO auf L-Pegel gehalten. Damit wird sichergestellt, | ||
+ | * **/BAI** und **/BAO**\\ Stellen analog zu den Signalen IEI und IEO die Signale einer Prioritaetskette dar, die alle Funktionseinheiten verbindet, die eine Anforderung auf den Systembus (BUSRQ) stellen keennen. Fuer die Benutzer des MRB Z1013 werden diese Signale kaum Bedeutung haben. | ||
+ | * **RDY**\\ Stellt ein aehnliches Signal wie WAIT dar, um langsame Funktionseinheiten an die CPU anzupassen. Es kennzeichnet die Kommunikationsbereitschaft einer Funktionseinheit und kann mit der WAIT-Leitung verbunden werden. Im Gegensatz zu den meisten anderen Steuersignalen ist es nicht Low-aktiv. | ||
+ | |||
+ | === 3.2.2. Takterzeugung === | ||
+ | |||
+ | 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/ | ||
+ | |||
+ | Dieser Takt realisiert die Synchronitaet aller Zeitablaeufe. | ||
+ | |||
+ | === 3.2.3 RESET-Logik === | ||
+ | |||
+ | Um einen definierten Anfangszustand der CPU zu erreichen, | ||
+ | ist die RESET-Steuerung erforderlich. RESET kann von 3 Stellen | ||
+ | ausgeloest werden: | ||
+ | - Taste TAl auf der Leiterplatte (RESET-Taste) | ||
+ | - Externe Tastatur ueber den Steckverbinderanschluss X2:A02 | ||
+ | - A20 des Systemsteckverbinders X1 | ||
+ | |||
+ | 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. | ||
+ | |||
+ | ==== 3.3 Speichereinheiten ==== | ||
+ | === 3.3.1. Anschluss === | ||
+ | |||
+ | 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, | ||
+ | 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, | ||
+ | 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 | ||
+ | |||
+ | < | ||
+ | 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 | ||
+ | | ||
+ | | ||
+ | 0 0 0 --->/ | ||
+ | 0 0 1 --->/ | ||
+ | ... | ||
+ | 0 1 1 --->/ | ||
+ | | ||
+ | 1 0 0 --->/ | ||
+ | 1 0 1 --->/ | ||
+ | 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: | ||
+ | |||
+ | < | ||
+ | 0 0 Diese Adressbits werden intern zur | ||
+ | | ||
+ | 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, | ||
+ | 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 | ||
+ | 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). | ||
+ | |||
+ | === 3.3.2. Zusammenarbeit mit der CPU === | ||
+ | |||
+ | Wenn die CPU auf den Speicher zugreifen moechte, sei es, um | ||
+ | Befehle oder Daten zu holen oder um etwas abzuspeichern, | ||
+ | das durch folgende Signale gekennzeichnet: | ||
+ | * /MREQ (Speicheranforderung) wird Low, d. h. aktiv und zeigt damit den Zugriff auf den Speicher an. | ||
+ | * A0 bis A15 (Adressen) geben den konkret adressierten Speicherplatz an. | ||
+ | * /WRt (Schreiben) wird aktiv, wenn die CPU etwas in den Speicher schreiben moechte. | ||
+ | * /RD (Lesen) wird beim Lesen von Daten oder Befehlen aktiv. | ||
+ | * /M1 (Befehlsholezyklus) kennzeichnet in Verbindung mit /MREQ und /RD das Holen des Operationskodes eines Befehls (s. Kapitel 4) | ||
+ | * D0 bis D7 enthalten entweder die abzuspeichernde oder gelesene Information. | ||
+ | |||
+ | Die detaillierten Zeitablaeufe koennen der Anlage 10 entnom- | ||
+ | men werden, wo die Taktdiagramme fuer den Speicher-Schreib- | ||
+ | und Speichen-Lese-Zyklus angegeben werden. | ||
| | ||
+ | | ||
+ | ==== 3.4. Ein- und Ausgabebaugruppen ==== | ||
+ | === 3.4.1. Parallel E/ | ||
+ | |||
+ | == 3.4.1.1. Beschreibung der Steuersignale == | ||
+ | |||
+ | 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/ | ||
+ | (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. | ||
+ | * **B/A SEL (E)**\\ Liegt dieser Eingang auf " | ||
+ | * **C/D SEL (E)**\\ Der U 855 ist ein programmierbarer E/ | ||
+ | * **/CS (E)**\\ Hiermit wird die PIO fuer den Datentransfer freigegeben. Die Bildung dieses Bausteinauswahlsignals erfolgt analog zur CS-Dekodierung fuer die Speichereinheiten, | ||
+ | * **/IORQ (E)**\\ Dient in Verbindung mit den anderen Signalen zur Kennzeichnung der E/ | ||
+ | * ** /M1 (E)**\\ Mit aktiven Ml bei nicht aktiven RD und IORQ wird die PIO in einen definierten Anfangszustand zurueckgesetzt. Geschieht dies nicht, arbeitet die PIO unkontrolliert. Anschliessend muss die Initialisierung erfolgen. Ausserdem synchronisiert dieses Signal in Verbindung mit IORQ die Interruptbehandlung durch die CPU. Damit beide Funk- tionen gewaehrleistet werden koennen, muss dieses M1 aktiv bei aktivem RESET der CPU oder bei Aussendung des CPU-M1 sein. Diese ODER-Verknuepfung wird durch die Bildung des /PM1 realisiert, welches an das PIO-M1 angeschlossen wird. | ||
+ | * **RD (E)**\\ Wird die Datenbusinformation in den PIO geschrieben, | ||
+ | * **C (E)**\\ Systemtakt analog zur CPU | ||
+ | * **/ASTB (E)**, **/BSTB (E)**\\ Diese Steuerleitungen werden zur Quittung des erfolgten Datenaustausches verwendet. Zur Ausgabe wird diese Leitung (Low-aktiv) vom angeschlossenen Geraet aktiviert und damit die Daten uebernommen. Bei der Eingabe wird mit dieser Leitung angezeigt, dass die anstehenden Daten in die PIO uebernommen werden koennen. Der Uebergang des Signals /STB aus dem aktiven Zustand in den H-Pegel kann zur Bildung des Interruptsignals verwendet werden. | ||
+ | * **ARDY (A)**, **BRDY (A)**\\ Diese Steuerleitungen teilen dem angeschlossenen Geraet mit, dass bei der Ausgabe Daten bereitstehen, | ||
+ | * **/INT (A)**\\ Dieses Signal liegt parallel zu allen anderen interruptausloesenden E/ | ||
+ | * **/IEI (E)**, **/IEO (A)**\\ Hiermit werden die Prioritaeten bei der Behandlung von Unterbrechungsanforderungen durch Bildung einer Prioritaetskette (daisy chain).< | ||
+ | | E/ | ||
+ | | | ||
+ | 5P -----| IEI IEO |-------| IEI IEO |----> | ||
+ | | ||
+ | |||
+ | == 3.4.1.2. Programmierung == | ||
+ | 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/ | ||
+ | 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: | ||
+ | |||
+ | < | ||
+ | C/D SEL | ||
+ | 0, wenn Information Daten | ||
+ | 1, wenn Information Steuerworte | ||
+ | B/A SEL | ||
+ | | ||
+ | beliebig, z.B. | ||
+ | 0 0 0 0 0 0 ==> | ||
+ | | ||
+ | |||
+ | Damit ergeben sich die Adressen: | ||
+ | < | ||
+ | Tor A (Anwenderport) - Daten: | ||
+ | - Steuerwort: 01H | ||
+ | Tor B (Systemport) | ||
+ | - 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. | ||
+ | |||
+ | - **Betriebsartenauswahl**< | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | - **Ein-/ | ||
+ | - **Interruptvektor**< | ||
+ | | ||
+ | niederwertiger Teil des Interruptvektors</ | ||
+ | - **Interruptsteuerwert** < | ||
+ | Belegung: | ||
+ | 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 | ||
+ | | ||
+ | | ||
+ | - **Interruptmaskenwort**\\ Die Bitzelle der Eingabeleitungen, | ||
+ | - **Interrupt Ein/ | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | | ||
+ | === 3.4.2. Tastaturanschluss === | ||
+ | |||
+ | 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 " | ||
+ | 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 " | ||
+ | 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). | ||
+ | |||
+ | === 3.4.3. Magnetbandanschluss === | ||
+ | |||
+ | Von der auf der Leiterplatte installierten PIO wird eine Bitleitung (PB 7) zur Ausgabe eines seriellen Datenstromes ge- | ||
+ | nutzt. Die erforderliche Parallel/ | ||
+ | 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/ | ||
+ | |||
+ | === 3.4.4. Bildschirmsteuerung === | ||
+ | |||
+ | Die Bildschirmsteuerung wandelt die vom Rechner auszugebende | ||
+ | Information in ein CCIR-kopatibles Fernsehsignal, | ||
+ | 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, | ||
+ | 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, | ||
+ | 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, | ||
+ | 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, | ||
+ | die 5 niederwertigen Adressen des Bildwiederholspeichers (BWS) | ||
+ | A30/31 genutzt. Die hoeherwertigen Adresseingaenge zaehlen die | ||
+ | Zeichenzeilen eines Bildes. Da die Zaehlkaskade immer zyklisch | ||
+ | durchzaehlt, | ||
+ | |||
+ | 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, | ||
+ | niederwertigen Adresseingaenge von A44 gehen, werden nacheinander die Bildpunktzeilen an den nachfolgenden Parallel/ | ||
+ | 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 | ||
+ | |||
+ | 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, | ||
+ | |||
+ | 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. | ||
+ | |||
+ | ==== 3.5. Stromversorgung ==== | ||
+ | |||
+ | 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, | ||
+ | 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/ | ||
+ | geringen Leistungsbedarf ausreichend. | ||
+ | |||
+ | Um die Spannung 12P zu erzeugen, wird eine verdoppelte und anschliessend mit einer Widerstands/ | ||
+ | stabilisierte Spannung der Basis eines Transistors V2 zugefuehrt. Dadurch ist am Emitter dieses Transistors eine stabilisierte Spannung verfuegbar, die staerker belastet werden kann. | ||
+ | |||
+ | ==== 3.6. Bussystem ==== | ||
+ | |||
+ | 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: | ||
+ | | 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: | ||
+ | | 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. | ||
+ | |||
+ | ===== 4. Der Befehlssatz des Mikroprozessors U880 ===== | ||
+ | |||
+ | 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: | ||
+ | * 64 K Byte Adressraum fuer Speicher | ||
+ | * 256 Ein-/ | ||
+ | * 3 Doppelregister mit Alternativregistersatz | ||
+ | * 2 Indexregister mit je 16 Bit Breite | ||
+ | * 1 Refreshregister (ermoeglicht das automatische Auffrischen | ||
+ | * externer dynamischer RAM-Speicher) | ||
+ | * 1 maskierbarer, | ||
+ | * Architektur des Mikroprozessors U 880:< | ||
+ | Bit 76543210 76543210 | ||
+ | ------------------- | ||
+ | AF | | ||
+ | ------------------- | ||
+ | BC | | ||
+ | ------------------- | ||
+ | DE | | ||
+ | ------------------- | ||
+ | HL | | ||
+ | ------------------- | ||
+ | Hauptregistersatz | ||
+ | 15 ... 8 7 ... 0 | ||
+ | ----------------------- | ||
+ | | Stackpointer | ||
+ | ----------------------- | ||
+ | | Befehlszaehler | ||
+ | ----------------------- | ||
+ | | Indexregister | ||
+ | ----------------------- | ||
+ | | Indexregister | ||
+ | ----------------------- | ||
+ | | I |0| R | | ||
+ | ----------------------- | ||
+ | |||
+ | Speicheradressen: | ||
+ | ________ | ||
+ | 0000H |________| | ||
+ | 0001H |________| maximal | ||
+ | . | . | 64 K Byte | ||
+ | . | . | = 65 536 S Signum (Vorzeichen) | ||
+ | . | . | Speicher- | ||
+ | . |_.______| plätze | ||
+ | 0FFFEH |________| | ||
+ | 0FFFFH |________| | ||
+ | C Carry | ||
+ | X nicht verwendet | ||
+ | 36 | ||
+ | |||
+ | | ||
+ | |||
+ | | ||
+ | oder | ||
+ | 0.. .255 256 Ausgaenge | ||
+ | |||
+ | Befehlsvorrat: | ||
+ | |||
+ | 158 Grundbefehle</ | ||
+ | | ||
+ | ==== 4.1. Befehlsschluessel ==== | ||
+ | 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; | ||
+ | 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, | ||
+ | die fuehrende ' | ||
+ | |||
+ | < | ||
+ | 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. | ||
+ | |||
+ | === 4.1.1. 1-Byte-Befehle === | ||
+ | |||
+ | Diese Befehle bestehen nur aus dem Operationskode (im | ||
+ | weiteren als OPC bezeichnet). Da es sich fast ausschliesslich | ||
+ | um Registeroperationen, | ||
+ | Prozessorregister handelt, ist in diesem Byte auch die | ||
+ | notwendige Registeradresse enthalten. Bei der Behandlung der | ||
+ | Adressierung wird noch einmal naeher darauf eingegangen. | ||
+ | |||
+ | < | ||
+ | | ||
+ | |||
+ | Beispiel: | ||
+ | |||
+ | < | ||
+ | zaehler | ||
+ | --------------------------------------------- | ||
+ | 1000 | ||
+ | 1001 | ||
+ | 1002 | ||
+ | 1003 | ||
+ | |||
+ | 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, | ||
+ | Spalte bietet die Moeglichkeit, | ||
+ | nachvollziehen | ||
+ | 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 " | ||
+ | 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 | ||
+ | Signalbyte | ||
+ | Signalbyte | ||
+ | | ||
+ | === 4.1.2. 2-Byte-Befehle === | ||
+ | Diese Befehle koennen jetzt einen zweiten OPC, einen Direktwert oder eine Sprungweite (s. auch Sprungbefehle) im 2. Byte | ||
+ | des Befehle enthalten. | ||
+ | |||
+ | < | ||
+ | OPC OPC | ||
+ | OPC | ||
+ | OPC | ||
+ | |||
+ | Ist das 2. Byte ein OPC, so stellt das 1. Byte das Signalbytedar. | ||
+ | |||
+ | Beispiele: | ||
+ | < | ||
+ | --------------------------------------------- | ||
+ | 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- | ||
+ | ; | ||
+ | 100A 28 04 JRZ 06 ; | ||
+ | ;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, | ||
+ | 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. | ||
+ | |||
+ | === 4.1.3. 3-Byte-Befehle === | ||
+ | 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. | ||
+ | |||
+ | < | ||
+ | OPC | ||
+ | OPC | ||
+ | OPC | ||
+ | | ||
+ | sein kann)</ | ||
+ | |||
+ | Die Angabe " | ||
+ | die letzten 8 Bit des 16-Bit-Direktwertes, | ||
+ | den hoeherwertigen Teil, d.h. die ersten 8 Bit. | ||
+ | |||
+ | < | ||
+ | 15...8 7...1</ | ||
+ | |||
+ | Beispiele: | ||
+ | < | ||
+ | zaehler | ||
+ | ------------------------------------------ | ||
+ | 1000 21 00 F7 LD HL,0F700H ;Lade HL mit 0F7OCH | ||
+ | 1003 C3 2D F0 JMP 0F02DH | ||
+ | ; | ||
+ | 1006 CD B7 E1 CALL OF1B7H | ||
+ | 1009 DD 46 3F LD B,(IX+3FH) | ||
+ | 100C FD 72 00 LD (IY+0), | ||
+ | |||
+ | === 4.1.4. 4-Byte-Befehle === | ||
+ | |||
+ | 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: | ||
+ | |||
+ | < | ||
+ | zaehler | ||
+ | ------------------------------------------ | ||
+ | 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 ' | ||
+ | rung im Maschinenkode als rationelles Hilfsmittel. | ||
+ | |||
+ | ==== 4.2. Adressierung ==== | ||
+ | |||
+ | === 4.2.1. Registeradressierung === | ||
+ | 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: | ||
+ | |||
+ | < | ||
+ | Kurz- | ||
+ | adresse | ||
+ | (binaer) | ||
+ | |||
+ | < | ||
+ | (binaer) | ||
+ | |||
+ | 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. | ||
+ | |||
+ | === 4.2.2. Direktwertadressierung === | ||
+ | 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. | ||
+ | |||
+ | < | ||
+ | zaehler | ||
+ | ------------------------------------------ | ||
+ | 1000 3A 00 30 LD A,(3000H) ;A:=(3000) | ||
+ | 1003 32 10 30 LD (3010H),A ; | ||
+ | |||
+ | === 4.2.3. Registerindirektadressierung === | ||
+ | Bei der indirekten Adressierung erfolgt der Speicherzugriff | ||
+ | durch Angabe eines Doppelregisters im Maschinenbefehl, | ||
+ | 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, | ||
+ | |||
+ | < | ||
+ | zaehler | ||
+ | ------------------------------------------ | ||
+ | 1000 01 00 30 LD BC,3000H ; | ||
+ | 1003 21 10 30 LD HL,3010H ; | ||
+ | 1006 | ||
+ | 1007 | ||
+ | |||
+ | Anmerkung: Zur indirekten Adressierung wird gern das Doppel- | ||
+ | register HL zur Adressenbereitstellung eingesetzt; man | ||
+ | schreibt auch: | ||
+ | < | ||
+ | |||
+ | Dann wuerde die letzte Zeile des obigen Beispiels lauten: | ||
+ | |||
+ | < | ||
+ | |||
+ | === 4.2.4. Indexierte Adressierung === | ||
+ | Soll der Speicherzugriff mittels indexierter Adressierung | ||
+ | erfolgen, so wird im Maschinenbefehl ein sogenanntes Indexregister (IX, IY) und eine Verschiebung ' | ||
+ | fuer den Speicherzugriff erfolgt durch Summierung der im | ||
+ | jeweiligen Indexregister enthaltenen Grundadresse und der | ||
+ | Verschiebung ' | ||
+ | -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. | ||
+ | |||
+ | < | ||
+ | zaehler | ||
+ | ------------------------------------------ | ||
+ | 1000 DD 21 00 30 LD IX,3000H | ||
+ | 1004 DD 7E 00 LD A, | ||
+ | 1007 DD 77 10 LD (IX+16), | ||
+ | ;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 ' | ||
+ | konkreten Tabellenposition. | ||
+ | |||
+ | ==== 4.3. Maschinenbefehle und ihre Bedeutungen ==== | ||
+ | Im folgenden Abschnitt werden die entsprechenden Befehlsgruppen naeher erlaeutert und an Beispielen die Funktionsweise | ||
+ | untermauert. | ||
+ | |||
+ | === 4.3.1. Ladebefehle === | ||
+ | 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: | ||
+ | < | ||
+ | |||
+ | Die eingeklammerten Angaben sind wahlfrei, sie koennen vorhanden sein, muessen aber nicht. | ||
+ | |||
+ | Beispiele fuer Byte-Ladebefehle: | ||
+ | < | ||
+ | zaehler | ||
+ | ------------------------------------------ | ||
+ | 1000 3E 3A LD A,3AH ;A: =3AH | ||
+ | 1002 | ||
+ | 1003 | ||
+ | 1004 | ||
+ | 1005 | ||
+ | 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- | ||
+ | ; | ||
+ | ;von IFF 2 in das Flag P/V | ||
+ | 100E ED 5F LD A,R ;das Refreshre- | ||
+ | ; | ||
+ | |||
+ | Beispiele fuer Doppelbyte-Ladebefehle | ||
+ | |||
+ | < | ||
+ | zaehler | ||
+ | ------------------------------------------ | ||
+ | 1000 01 34 12 LD BC, | ||
+ | 1003 2A 34 12 LD HL,(1234H) | ||
+ | 1006 ED 43 34 12 LD (1234H),BC | ||
+ | 100A DD F9 LD SP, | ||
+ | |||
+ | Es ist verstaendlich, | ||
+ | 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, | ||
+ | |||
+ | === 4.3.2 Byte- und Doppelbyte-Zaehl-Befehle === | ||
+ | |||
+ | Diese Befehlsgruppe dient dem Erniedrigen bzw. Erhoehen von | ||
+ | Registerinhalten oder Speicherinhalten um jeweils den Wert 1. | ||
+ | |||
+ | Beispiele fuer Zaehlbefehle: | ||
+ | |||
+ | < | ||
+ | zaehler | ||
+ | ------------------------------------------ | ||
+ | 1000 | ||
+ | 1001 | ||
+ | 1002 | ||
+ | 1003 DD 23 INC IX | ||
+ | 1005 | ||
+ | 1006 DD 35 00 DEC (IX+0) | ||
+ | 1009 DD 2B DEC IX ; | ||
+ | |||
+ | Die Byte-Zaehlbefehle beeinflussen das Z-Flag. Ist das Resultat des Befehls im behandelten Byte identisch 0, so wird das Z-Flag auf " | ||
+ | |||
+ | Beispiel: Laden von 3 Speicherstellen mit 00,01,02 ab Adresse 3000H | ||
+ | |||
+ | < | ||
+ | zaehler | ||
+ | ------------------------------------------ | ||
+ | 1000 3E 03 LB A,3 ; | ||
+ | 1002 21 00 30 LD HL, | ||
+ | 1005 | ||
+ | 1006 | ||
+ | ;um 1 erhoehen | ||
+ | 1007 | ||
+ | 1008 20 FB JRNZ M1-# ; | ||
+ | ;wenn L noch nicht 3</ | ||
+ | |||
+ | === 4.3.3. Arithmetische Befehle === | ||
+ | Beim U 880 ist nur die Addition und die Subtraktion von Bytes | ||
+ | und Doppelbytes (16-Bit-Worte) moeglich. | ||
+ | |||
+ | Beispiele fuer arithmetische Befehle: | ||
+ | |||
+ | < | ||
+ | zaehler | ||
+ | ------------------------------------------ | ||
+ | 1000 | ||
+ | 1001 66 3E ADD 3EH ;A:=A+3EH | ||
+ | 1003 | ||
+ | 1004 | ||
+ | 1005 CE 0F ADC OFH ; | ||
+ | 1007 | ||
+ | 1008 DD 9E 04 SBC (IX+4) | ||
+ | |||
+ | Die arithmetischen Operationen laufen prinzipiell in folgender Form ab: | ||
+ | |||
+ | < | ||
+ | |||
+ | Hierbei ist die Konstruktion ": | ||
+ | Wirkungsweise der Flag-Bits laesst sich guenstig bei Zahlenbereichsueberschreitungen nach Ausfuehrung der Operationen zeigen: | ||
+ | |||
+ | < | ||
+ | A:= -128 | ||
+ | ADD B ; | ||
+ | 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 | ||
+ | |||
+ | 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. | ||
+ | |||
+ | < | ||
+ | zaehler | ||
+ | ------------------------------------------ | ||
+ | 1000 | ||
+ | 1001 ED 7A ADC HL,SP ; | ||
+ | 1003 | ||
+ | 1004 DD 09 ADD IX, | ||
+ | |||
+ | Falls bei der ADD-Operation ein Ueberlauf entsteht, wird das | ||
+ | Carry-Flag gesetzt (auf " | ||
+ | |||
+ | === 4.3.4. Vergleichsbefehle === | ||
+ | Einen Sonderfall der Arithmetik-Befehle bilden die Vergleichsbefehle. Es wird eine Subtraktion des A-Registerinhaltes mit | ||
+ | dem jeweiligen Operanden ausgefuehrt, | ||
+ | Ergebnis der Operation nur die Flags geaendert, der A-Register | ||
+ | inhalt bleibt unveraendert. | ||
+ | |||
+ | Beispiele fuer Vergleichsbefehle: | ||
+ | |||
+ | < | ||
+ | zaehler | ||
+ | ------------------------------------------ | ||
+ | 1000 | ||
+ | 1001 FE 38 CMP 38H ;A-38H=? | ||
+ | 1003 FD BE 05 CMP (IX+5) | ||
+ | |||
+ | Die Flagbeeinflussung funktioniert nach folgender Tabelle: | ||
+ | |||
+ | < | ||
+ | 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 | ||
+ | |||
+ | (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 ' | ||
+ | |||
+ | === 4.3.5. Logische Befehle === | ||
+ | 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: | ||
+ | |||
+ | < | ||
+ | zaehler | ||
+ | ------------------------------------------ | ||
+ | 1000 | ||
+ | 1001 | ||
+ | 1002 F6 55 OR 55H ;A:=A OR 55H | ||
+ | |||
+ | Spezialfall: | ||
+ | 1004 | ||
+ | ;P:=1, A:=00H!!! | ||
+ | 46</ | ||
+ | |||
+ | Das Flag-Register wird bei diesen Operationen neu bestimt: | ||
+ | * Carry-Flag ist stets 0 | ||
+ | * Zero-Flag entsprechend dem A-Registerinhalt | ||
+ | * Sign-Flag entsprechend dem Bit 7 des A-Registers | ||
+ | * Paritaets-Flag entsprechend der Anzahl der 1-Bits des Ergebnisses (P=1, wenn die Anzahl der 1-Bits geradzahlig ist) | ||
+ | |||
+ | === 4.3.6. Spezielle arithmetische Hilfsoperationen === | ||
+ | |||
+ | < | ||
+ | |||
+ | 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, | ||
+ | SCF ; Setzen des Carry-Flags, | ||
+ | |||
+ | 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: | ||
+ | |||
+ | < | ||
+ | |||
+ | 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, | ||
+ | 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: | ||
+ | zugelassenen Wertebereich von 0.. .9. | ||
+ | |||
+ | Die Korrektur nach Additionen erfolgt in der Form: | ||
+ | < | ||
+ | H(A) > 9 oder CY= 1 ===> A: | ||
+ | |||
+ | Bei Subtraktionen erfolgt die Korrektur in folgender Form: | ||
+ | |||
+ | < | ||
+ | H(A) > 9 oder CY= 1 ===> A: | ||
+ | |||
+ | Zahlenbeispiel: | ||
+ | |||
+ | < | ||
+ | >>> | ||
+ | |||
+ | | ||
+ | | ||
+ | ---------------------------------- | ||
+ | A: | ||
+ | CY=0 H=1! | ||
+ | |||
+ | DAA: +06H 0000 0110 = 38 | ||
+ | +60H 0110 0000 = 60 | ||
+ | ---------------------------------- | ||
+ | | ||
+ | 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. | ||
+ | |||
+ | === 4.3.7. Befehle zur Bit-Manipulation === | ||
+ | Diese Befehlsgruppe erlaubt den Einzelbit-Test, | ||
+ | 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: | ||
+ | |||
+ | < | ||
+ | Z-Flag auswertbar; Z:=1, wenn das Bit i des | ||
+ | | ||
+ | Z:=0, wenn das Bit i = 1 ist | ||
+ | 0 <= i <= 7 | ||
+ | Operanden ' | ||
+ | |||
+ | 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. | ||
+ | |||
+ | === 4.3.8 Verschiebebefehle === | ||
+ | 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 ' | ||
+ | |||
+ | < | ||
+ | |||
+ | Linksverschieben um eine Dualstelle | ||
+ | |||
+ | < | ||
+ | |||
+ | | ||
+ | | ||
+ | |CY| < | ||
+ | | ||
+ | |||
+ | RL s ; Linksverschieben ueber das Carry-Flag | ||
+ | |||
+ | |----------------------------------| | ||
+ | | __ | ||
+ | |< | ||
+ | | ||
+ | |||
+ | SLA s ; Linksverschieben durch Carry-Flag | ||
+ | |||
+ | | ||
+ | |CY| < | ||
+ | | ||
+ | |||
+ | 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 | ||
+ | |||
+ | |----------------------| | ||
+ | | | ||
+ | |-----> | ||
+ | --------- | ||
+ | |||
+ | RR s ; Rechtsverschiebung ueber das Carry-Flag | ||
+ | |||
+ | |------------------------------------| | ||
+ | | | ||
+ | |-----> | ||
+ | --------- | ||
+ | |||
+ | SRA s ; Rechtsverschieben mit Setzen des Carry-Flags | ||
+ | | ||
+ | |||
+ | _________ | ||
+ | | ||
+ | | | ||
+ | | ||
+ | |||
+ | SRL s ; Rechtsverschieben mit Setzen des Carry-Flags | ||
+ | (logische Rechtsverschiebung) | ||
+ | |||
+ | _________ | ||
+ | 0-----> | ||
+ | --------- | ||
+ | |||
+ | 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. | ||
+ | |||
+ | < | ||
+ | zaehler | ||
+ | ----------------------------------------------------- | ||
+ | 1000 | ||
+ | ;ist | ||
+ | 1001 28 0D JRZ END-# ;Abbruch des | ||
+ | ;Programms, wenn A = 0 | ||
+ | 1003 CB 3F Ml: SRL A ; | ||
+ | ; | ||
+ | 1005 30 FC JRNC M1-# ; | ||
+ | ;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 | ||
+ | |||
+ | 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 | ||
+ | < | ||
+ | HL indirekt adressierten Speicheroperanden. | ||
+ | __________________ | ||
+ | | ||
+ | | ||
+ | A:|7 | ||
+ | | ||
+ | | ||
+ | ------------ | ||
+ | |||
+ | Zahlenbeispiel: | ||
+ | |||
+ | < | ||
+ | | ||
+ | (HL): 3C (HL): CF</ | ||
+ | |||
+ | Rechtsverschiebung um vier Dualstellen | ||
+ | |||
+ | < | ||
+ | ____________ | ||
+ | | ||
+ | | ||
+ | A:|7 | ||
+ | | ||
+ | | ||
+ | ------------------</ | ||
+ | |||
+ | === 4.3.9 Sprungbefehle === | ||
+ | |||
+ | Grundsaetzlich werden bedingte und unbedingte Spruenge unterschieden. | ||
+ | |||
+ | * **Unbedingte Spruenge: | ||
+ | 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 ' | ||
+ | zaehler | ||
+ | ----------------------------------------------------- | ||
+ | 1000 21 00 10 LD HL, | ||
+ | 1003 | ||
+ | 1004 | ||
+ | 1005 20 FC JRNZ M1-# | ||
+ | 1007 | ||
+ | ... ; | ||
+ | ... ; | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | * **Bedingte Spruenge: | ||
+ | JPcc adr ; wenn die Bedigung ' | ||
+ | der PC den Wert ' | ||
+ | |||
+ | cc kann sein: C wenn Carry gesetzt | ||
+ | NC wenn No Carry " | ||
+ | Z wenn Zero " | ||
+ | NZ wenn No Zero " | ||
+ | P wenn Plus " | ||
+ | M wenn Minus " | ||
+ | PO wenn No Parity | ||
+ | PE wenn Parity | ||
+ | |||
+ | JRcc ; | ||
+ | PC um den Wert ' | ||
+ | |||
+ | cc = C , ==> JRC e | ||
+ | NC, ==> JRNC e | ||
+ | Z , ==> JRZ e | ||
+ | NZ, ==> JRNZ e</ | ||
+ | < | ||
+ | Solange dessen Inhalt groesser Null ist, erfolgt | ||
+ | der relative Sprung (PC:=PC+e), sonst wird der | ||
+ | diesem Befehl folgende aufgerufen.</ | ||
+ | zaehler | ||
+ | ----------------------------------------------------- | ||
+ | 1000 | ||
+ | 1001 | ||
+ | 1002 10 FE DJNZ 2 ; | ||
+ | ; | ||
+ | ;also um 2 Byte zurueck | ||
+ | 1004 | ||
+ | ; | ||
+ | |||
+ | === 4.3.10. Kelleroperationen === | ||
+ | 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, | ||
+ | maximal 16 Bit lang. Sie stellt die Anfangsadresse (den | ||
+ | Kontrollboden) des gewuenschten Kellerspeicherbereiches dar. | ||
+ | < | ||
+ | | ||
+ | | ||
+ | +-------------------+ | ||
+ | nn-6 -> | 4. : | ||
+ | nn-4 -> | 3. : | ||
+ | nn-2 -> | 2. : | ||
+ | nn -> | 1. : | ||
+ | +-------------------+</ | ||
+ | |||
+ | Die Anwendung der Kelleroperationen liegt vor allem im Retten | ||
+ | von Doppelregistern und anschliessendem " | ||
+ | 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 " | ||
+ | |||
+ | Auf Grund des 8-Bit-Datenbusses wird deutlich, dass eine | ||
+ | Kelleroperation immer in zwei Schritten ablaeuft. Beim Kellern wird zuerst der Stackpointer dekrementiert, | ||
+ | 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. | ||
+ | |||
+ | < | ||
+ | Entkellern: | ||
+ | |||
+ | Beispiel: | ||
+ | |||
+ | Retten der Register BC, DB, AF und HL in einem Unterprogramm, | ||
+ | und danach ihre alten Inhalte wieder erhalten sollen. | ||
+ | |||
+ | < | ||
+ | zaehler | ||
+ | ----------------------------------------------------- | ||
+ | 1000 31 00 00 LD SP,0 ; | ||
+ | ;laden | ||
+ | 1003 CD F1 10 CALL UP1 ; | ||
+ | ;PC wird gekellert: (FFFFH): | ||
+ | ; | ||
+ | ;SP: =FFFEH | ||
+ | 1006 ... ; | ||
+ | ;aus dem Unterprogrararn | ||
+ | ; | ||
+ | 10F1 | ||
+ | | ||
+ | | ||
+ | 10F2 | ||
+ | | ||
+ | | ||
+ | ... ; | ||
+ | 1107 | ||
+ | 1108 | ||
+ | 1109 | ||
+ | ; | ||
+ | ;an steht, in diesem Falle 1006H | ||
+ | ; | ||
+ | |||
+ | Man erkennt, dass das " | ||
+ | Reihenfolge erfolgen muss wie das " | ||
+ | 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 " | ||
+ | diesem Stapel in umgekehrter Reihenfolge wieder herausgeholt. | ||
+ | |||
+ | === 4.3.11. Unterprogrammoperationen === | ||
+ | |||
+ | Unterprogramme sind Programmteile, | ||
+ | Befehl fortgesetzt, | ||
+ | |||
+ | 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 ' | ||
+ | |||
+ | < | ||
+ | CALL-Befehls +3 in den Keller gebracht (also der | ||
+ | | ||
+ | den Wert adr an (16-Bit-Adresse). Der Stackpointer | ||
+ | wird um 2 erniedrigt. | ||
+ | |||
+ | RET ; | ||
+ | sichergestellte Adresse in den Befehlszaehler PC | ||
+ | geholt, das Hauptprogramm kann weitergehen; | ||
+ | SP wird wieder um 2 erhoeht. | ||
+ | |||
+ | CAcc adr ;bedingter Unterprogrammaufruf, | ||
+ | cc erfuellt ist, sonst nachfolgender Befehl. | ||
+ | |||
+ | Rcc ;bedingte Unterprogrammrueckkehr, | ||
+ | gung cc erfuellt ist, sonst nachfolgender Befehl.</ | ||
+ | |||
+ | Moegliche Bedingungen: | ||
+ | |||
+ | 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). | ||
+ | |||
+ | < | ||
+ | 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: | ||
+ | |||
+ | < | ||
+ | zaehler | ||
+ | ----------------------------------------------------- | ||
+ | 1000 3E FF START: LD A, | ||
+ | programms | ||
+ | 1002 | ||
+ | ... | ||
+ | 100E CD 34 13 CALL UP1 ;1. Unterprogramm- | ||
+ | ;ruf | ||
+ | ;UP1 beginnt bei | ||
+ | ; | ||
+ | 1012 | ||
+ | ; | ||
+ | 1013 | ||
+ | ... | ||
+ | 103F | ||
+ | ... | ||
+ | 125E CD 34 13 CALL UP1 ;2. Unterprogramm- | ||
+ | ;ruf | ||
+ | 1261 | ||
+ | ; | ||
+ | ... | ||
+ | 126A | ||
+ | 126B DD CB 00 DE SET 3,(IX+0) | ||
+ | ... | ||
+ | 1333 | ||
+ | 1334 | ||
+ | 1335 CB 4F BIT 1, A | ||
+ | .. | ||
+ | 1353 | ||
+ | 1354 | ||
+ | ; | ||
+ | |||
+ | <note tip> | ||
+ | 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. | ||
+ | </ | ||
+ | Einde Verschactelung mehrerer Unterprogramme (ein UP ruft ein | ||
+ | weiteress UP auf ) ist moeglich, die Anzahle der Schachtelungen | ||
+ | ist theoretisch unbegrenzt. | ||
+ | |||
+ | === 4.3.12 Ein- und Ausgabebefehle === | ||
+ | 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 r ;Eingabe dec Kanals, dessen Adresse im C-Register | ||
+ | | ||
+ | OUT n ; | ||
+ | OUT r ; | ||
+ | | ||
+ | |||
+ | Register ' | ||
+ | |||
+ | Einen Sonderfall stellt der Eingabebefehl ' | ||
+ | danach entsprechend die Flags gesetzt. | ||
+ | |||
+ | Beispiel: Das Ausgaberegister mit der Adresse 10H soll definiert mit 00, 01 und 02 geladen werden. | ||
+ | |||
+ | < | ||
+ | zaehler | ||
+ | ----------------------------------------------------- | ||
+ | 1000 0E 10 LD C,10H ; | ||
+ | ;se des Registers | ||
+ | 1002 | ||
+ | 1003 ED 79 OUT A ; | ||
+ | 1005 | ||
+ | 1006 ED 79 OUT A ; | ||
+ | 1008 | ||
+ | 1009 ED 79 OUT A ; | ||
+ | ... | ||
+ | 1178 | ||
+ | |||
+ | === 4.3.13. Gruppenoperationen fuer Lade-, Vergleichs- und Ein-/ | ||
+ | |||
+ | Gruppenoperationen in diesem Sinne sind hardwaremaessig im | ||
+ | Prozessor U 880 installierte Befehlsablaeufe, | ||
+ | Parameter verlangen. Diese Befehle vermeiden nicht nur das | ||
+ | umstaendliche Programmieren mit einzelnen Befehlen, sondern | ||
+ | fuehren besonders zur Programmbeschleunigung und Einsparung | ||
+ | von Programmspeicherplaetzen. | ||
+ | * **Einfache Gruppenoperationen**< | ||
+ | - 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' | ||
+ | Befehlsablauf: | ||
+ | DB:=DE+1 | ||
+ | HL:=HL+1 | ||
+ | BC:=BC-1 | ||
+ | P/V=0 bei BC-1=0 | ||
+ | 1 bei BC-1<> | ||
+ | |||
+ | LDD ; | ||
+ | wie LDI, nur DE:=DE-1 und HL:=HL-1 | ||
+ | |||
+ | CPI ; | ||
+ | - die Anfangsadresse ist in HL zu laden | ||
+ | - die Blocklaenge ist in BC zu laden | ||
+ | Befehlsausfuehrung: | ||
+ | HL:=HL+1 | ||
+ | BC:=BC-1 | ||
+ | Z=1 bei A=(HL) | ||
+ | 0 bei A<> | ||
+ | P/V=0 bei BC-1=0 | ||
+ | 1 bei BC-1<> | ||
+ | |||
+ | CPD ; | ||
+ | wie CPI, nur HL:=HL-1 | ||
+ | |||
+ | INI ; | ||
+ | - Zieladresse ist in HL zu laden | ||
+ | - Kanaladresse ist in C zu laden | ||
+ | - Blocklaenge in B (max. 256 Byte) | ||
+ | Befehlsausfuehrung: | ||
+ | HL:=HL+1 | ||
+ | B:=B-1 | ||
+ | Z=1 bei B=0 | ||
+ | 0 bei B<>O | ||
+ | 58 | ||
+ | |||
+ | IND ; | ||
+ | wie INI, nur HL:=HL-1 | ||
+ | |||
+ | OUTI ; | ||
+ | - Zieladresse ist in C zu laden | ||
+ | - Kanaladresse ist in Hl zu laden | ||
+ | - Blocklaenge in B | ||
+ | Befehlsausfuehrung: | ||
+ | HL: =HL+1 | ||
+ | B:=B-1 | ||
+ | Z=1 bei B=0 | ||
+ | 0 bei B<>O | ||
+ | |||
+ | OUTD ; | ||
+ | wie OUTI, nur HL: | ||
+ | CPI, CPD zur Byte- oder Blocksuche | ||
+ | INI, IND Blockeingabe | ||
+ | OUTI, OUTD Blockausgabe</ | ||
+ | * **Repetierende Gruppenoperationen** (sich automatisch wiederholende Gruppenoperationen)\\ Diese Befehle basieren auf den einfachen Gruppenoperationen. Es werden lediglich die Testung der Flags und entspechende Rueckspruenge zur Wiederholung des Befehls automatisch ausgefuehrt. Allerdings ist bei den Ein- und Ausgabegruppenoperationen zu beachten, dass die peripheren Geraete eine gleiche Verarbeitungsgeschwindigkeit haben muessen wie der Prozessor, oder hardwaremaessig ueber die WAIT-Leitung an der CPU eine Angleichung der Verarbeitungsgeschwindigkeit erfolgen muss.< | ||
+ | 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: | ||
+ | zaehler | ||
+ | ----------------------------------------------------- | ||
+ | 1000 21 00 0D LD HL, 0D00H ; | ||
+ | 1003 3E E3 LD A, 0E3H | ||
+ | 1005 | ||
+ | ;1. Speicherplatz geladen | ||
+ | 1006 11 01 OD LD DE, | ||
+ | 1009 01 FE 02 LD BC, | ||
+ | ;da ein byte schon geladen wurde - | ||
+ | 1000 ED B0 | ||
+ | ;das sogenannte Durchschleifen des Wer- | ||
+ | ;tes ' | ||
+ | |||
+ | === 4.3.14. Austauschbefehle === | ||
+ | < | ||
+ | |||
+ | EXX ; Wechsel des Doppelregistersatzes: | ||
+ | BC gegen BC' | ||
+ | DE gegen DE' | ||
+ | HL gegen HL'</ | ||
+ | |||
+ | Angewendet wird der Registerwechsel beispielsweise zur Rettung bei Interrupt oder Unterprogramaufruf, | ||
+ | schneller ist als das Kellern bzw. Entkellern der Register. | ||
+ | |||
+ | < | ||
+ | E-->L und L-->E | ||
+ | D-->H und H-->D | ||
+ | |||
+ | EX (SP), xx; xx=HL, IX, IY | ||
+ | | ||
+ | gegen die Inhalte der Doppelregister xx. | ||
+ | | ||
+ | | ||
+ | |||
+ | Beispiel: | ||
+ | |||
+ | < | ||
+ | zaehler | ||
+ | ----------------------------------------------------- | ||
+ | 1000 | ||
+ | ;wechsel, da im Interruptprogramm ein | ||
+ | ;Grossteil der Register benoetigt wird | ||
+ | 1001 | ||
+ | 1002 3E E3 LD A,3FH | ||
+ | 1004 ... | ||
+ | 101B D3 04 OUT 04 | ||
+ | 101D | ||
+ | 101E | ||
+ | 101F | ||
+ | 1020 ED 4D RETI</ | ||
+ | |||
+ | === 4.3.15. CPU-Steuerbefehle === | ||
+ | < | ||
+ | | ||
+ | HALT ; Prozessor fuehrt intern NOP-Operationen zur Aufrecht- | ||
+ | | ||
+ | Der Befehlszaehler erhaelt die Adresse des nachfolgen- | ||
+ | den Befehls. Dieser Befehl wird aber erst nach der | ||
+ | | ||
+ | | ||
+ | |||
+ | === 4.3.16. Bedeutung der Flags === | ||
+ | |||
+ | 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 " | ||
+ | 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/ | ||
+ | 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<> | ||
+ | </ | ||
+ | |||
+ | Die Abfrage der Flag-Bits bei bedingten Operanden erfolgt | ||
+ | nach den im jeweiligen Befehl anzugebenden Bedingungen (siehe | ||
+ | Sprungbefehle) wie folgt: | ||
+ | |||
+ | < | ||
+ | Bedingung Frage | ||
+ | |||
+ | NZ : | ||
+ | Z : | ||
+ | NC : | ||
+ | C : | ||
+ | PO : P/ | ||
+ | PE : P/ | ||
+ | P : | ||
+ | M : | ||
+ | </ | ||
+ | |||
+ | 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 | ||
+ | ; | ||
+ | 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. | ||
+ | |||
+ | ==== 4.4. Unterbrechungsorganisation ==== | ||
+ | |||
+ | 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, | ||
+ | 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 ' | ||
+ | nimmt der Prozessor diese Anforderung zur Kenntnis und arbeitet diese Anforderung sofort nach dem Wiederfreigeben der Interrupterlaubnis durch den Befehl ' | ||
+ | |||
+ | **Maskierbare Interruptarten** | ||
+ | |||
+ | Diese 3 Interruptarten werden durch einen der Befehle ' | ||
+ | ' | ||
+ | |||
+ | < | ||
+ | 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, | ||
+ | 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 | ||
+ | " | ||
+ | de Programme aktiviert. | ||
+ | |||
+ | IM2: Diese Betriebsart stellt fuer den Prozessor die lei- | ||
+ | stungsfaehigste Unterbrechungsbehandlung dar. Man | ||
+ | nennt sie auch Vektorinterrupt, | ||
+ | der Behandlungsroutinen ueber Zeiger auf einen Adress- | ||
+ | vektor realisiert wird. | ||
+ | Bei Unterbrechungsanforderung stellt jede Interrupt- | ||
+ | quelle den fuer die gewuenschte Interruptroutine not- | ||
+ | wendigen niederwertigen " | ||
+ | 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: | ||
+ | INT2: | ||
+ | INT3: | ||
+ | |||
+ | Aufbau der Startadressentabelle: | ||
+ | Zeiger1: 0C00 F0H | ||
+ | 0C01 OFH | ||
+ | Zeiger2: 0C02 FFH <=== N(INT2): | ||
+ | 0C03 0FH <=== H(INT2): | ||
+ | Zeiger3: 0C04 00H ===> 0FFFH=Startadresse | ||
+ | 0C05 2FH | ||
+ | 0C06 | ||
+ | |||
+ | - Das I-Register muss mit " | ||
+ | Es stellt den absoluten Zeigerteil dar. | ||
+ | - Dem Peripheriebaustein 1 muss fuer das entsprechen- | ||
+ | de Register der variable Zeigerteil mit dem Wert | ||
+ | |||
+ | " | ||
+ | " | ||
+ | </ | ||
+ | |||
+ | 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 | ||
+ | var. Zeiger 02H (Low-Teil) | ||
+ | ---------------------------- | ||
+ | Zeiger 2 | ||
+ | </ | ||
+ | |||
+ | In der Startadresstabelle ist unter der Adresse 0C02H ein | ||
+ | 0FFH und unter 0C03H ein 0FH eingetragen, | ||
+ | |||
+ | 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 | ||
+ | " | ||
+ | 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 " | ||
+ | ' | ||
+ | Waehrend der Abarbeitung einer Interruptbehandlungsroutine bleibt es dem | ||
+ | Programmierer ueberlassen, | ||
+ | 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 ' | ||
+ | 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, | ||
+ | Interruptroutine ausgeloest hat, das Wiederschlies- | ||
+ | sen der Prioritaetskette (IEO--high). Somit koennen | ||
+ | nach RETI auch die Peripheriebausteine niedriger | ||
+ | Prioritaet einen Interrupt ausloesen. | ||
+ | </ | ||
+ |