Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen Revision Vorhergehende Überarbeitung | |||
z1013:handbuecher:handbuch_1 [2010/07/22 12:41] – koma | z1013:handbuecher:handbuch_1 [2013/06/25 11:04] (aktuell) – volkerp | ||
---|---|---|---|
Zeile 73: | Zeile 73: | ||
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 2277: | Zeile 2277: | ||
| | ||
+ | === 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. | ||
+ | </ | ||