Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
z1013:handbuecher:handbuch_1 [2010/07/22 12:41] komaz1013:handbuecher:handbuch_1 [2013/06/25 11:04] (aktuell) volkerp
Zeile 73: Zeile 73:
 4.3.14.[[#austauschbefehle|Austauschbefehle]]\\                                  4.3.14.[[#austauschbefehle|Austauschbefehle]]\\                                 
 4.3.15.[[#cpu-steuerbefehle|CPU-Steuerbefehle]]\\                                 4.3.15.[[#cpu-steuerbefehle|CPU-Steuerbefehle]]\\                                
-4.3.16.   Bedeutung der Flags                              +4.3.16.[[#bedeutung_der_flags|Bedeutung der Flags]]\\  
-4.4.      Unterbrechungsorganisation                      +4.4.[[#unterbrechungsorganisation|Unterbrechungsorganisation]]
  
 Bestandteile des Handbuches: Bestandteile des Handbuches:
Zeile 2277: Zeile 2277:
        gefuehrt. Eine Fortsetzung ist auch mit Reset moeglich.</code>        gefuehrt. Eine Fortsetzung ist auch mit Reset moeglich.</code>
  
 +=== 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: 
 +
 +<code>
 +S:   Vorzeichen (signum) 
 +     Ist eine Kopie des Bits A7; 
 +     es repraesentiert das echte Vorzeichen des Resultates 
 +     nach arithmetischen Operationen mit Operanden in Zweier- 
 +     komplementdarstellung. 
 +     S=1, wenn das Ergebnis <0 ist, Abfrage mit cc=M (JPM) 
 +     S=0, wenn das Ergebnis >=0 ist, Abfrage mit cc=P (JPP) 
 +
 +Z:   Null (zero) 
 +     Bei einer Null im A-Register (alle 8 Bitpositionen = 0) 
 +     nach arithmetischen und logischen Operationen (auch nach 
 +     CMP) wird Z=1. 
 +
 +H:   Halbbyteuebertrag (half-carry) 
 +     Wird bei einem Uebertrag von Bit A3 nach Bit A4 auf "1" 
 +     gesetzt. (Wird vom DAA-Befehl intern ausgewertet.) 
 +
 +N:   Subtraktion 
 +     N=1, wenn der Befehl eine Subtraktion (auch CMP) war. 
 +     Wird vom DAA-Befehl ebenfalls herangezogen. 
 +
 +CY:  Uebertrag (Carry) 
 +     Uebertrag aus dem A-Register nach einer Addition, 
 +     Mittels SO? und CO? ist das OY-Flag auch setz- und 
 +     komplement ierbar. 
 +
 +P/V: Paritaets/Ueberlauf (parity/overflow) 
 +     Dieses Flag hat verschiedene Funktionen. 
 +
 +1.)  Es zeigt nach logischen und Verschiebeoperationen und 
 +     nach dem Befehl 'IN r' die Paritaet P an: 
 +     P=1 bei gerader Anzahl vorhandener Bit-Einsen, die Abfra- 
 +     ge kann mit JPPE erfolgen 
 +     Abfrage einer ungeraden Anzahl mit JPPO 
 +
 +2.)  Es zeigt im Gegensatz zu Carry den echten Ueberlauf V 
 +     des Resultates nach einer arithmetischen Operation mit 
 +     Operanden an. 
 +     Abfrage mit JPPE 
 +
 +3.)  Das Flag sichert nach LD A,I und LD A,R das Bit aus IFF2, 
 +     damit es mit 'LD A,I' wieder in IFF2 gesetzt werden kann. 
 +     In IFF2 wird eine angemeldete Unterbrechung gespeichert, 
 +     bis sie vom Prozessor bearbeitet wird. 
 +
 +4.)  Es fixiert nach LD- und CMP-Gruppenoperationen die Aussa- 
 +     ge, ob der Bytezaehler in BC nach Erniedrigung ungleich 
 +     Null ist. 
 +     D. h. P/V=0 bei BC-1=0 
 +           P/V=1 bei BC-1<>
 +</code>
 +
 +Die Abfrage der Flag-Bits bei bedingten Operanden erfolgt 
 +nach den im jeweiligen Befehl anzugebenden Bedingungen (siehe 
 +Sprungbefehle) wie folgt: 
 +
 +<code>
 +Bedingung  Frage 
 +
 +NZ :       Z=0?   ===> JPNZ , JRNZ 
 + Z :       Z=1?   ===> JPZ  , JRZ 
 +NC :       C=0?    usw. 
 + C :       C=1? 
 +PO :     P/V=0? 
 +PE :     P/V=1? 
 + P :       S=0? 
 + M :       S=1? 
 +</code>
 +
 +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: 
 +<code>
 +Befehls- Maschinen-   Quellkode    Kommentar 
 +zaehler  kode 
 +----------------------------------------------------- 
 +1000     F5           PUSK AF      ;Kellern von AF 
 +1001     El           POP HL 
 +                      ;H:=(SP+1)=A,L:=(SP)=F 
 +1002     LD  A,L 
 +</code>
 +
 +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, inwieweit er in diesem 
 +Unterprogramm fuer eine Rettung bestimmter Registerinhalte sorgt. Es gibt keinen 
 +Befehl, der den nichtmaskierbaren Interrupt verbietet. Die Anwendung liegt meist 
 +bei der Datenrettung vor Erkennen eines Spannungsausfalis des Rechnersystems. 
 +Der maskierbare Interrupt kann in 3 unterschiedlichen Betriebsarten auftreten, 
 +die in der CPU durch einen Befehl eingestellt werden koennen. 
 +
 +Fuer das Sperren bzw. Freigeben aller drei maskierbaren Interruptarten steht 
 +jeweils ein Befehl zur Verfuegung. 
 +
 +Interrupt sperren:  DI \\
 +Interrupt erlauben: EI 
 +
 +Trifft eine Anforderung an den maskierbaren Interrupt ein 
 +(L-Pegel am Eingang INT), wenn er durch 'DI' gesperrt ist, so 
 +nimmt der Prozessor diese Anforderung zur Kenntnis und arbeitet diese Anforderung sofort nach dem Wiederfreigeben der Interrupterlaubnis durch den Befehl 'EI' ab. 
 +
 +**Maskierbare Interruptarten**
 +
 +Diese 3 Interruptarten werden durch einen der Befehle 'IM0', 
 +'IM1' oder 'IM2' gesetzt. 
 +
 +<code>
 +IM0: In dieser Betriebsart wird nach akzeptiertem Unter- 
 +     brechungswunsch der Interruptquelle der naechste abzu- 
 +     arbeitende Befehl vom Datenbus geholt und in den Pro- 
 +     grammlauf eingeschoben. 
 +     (Es bietet sich hier an, RST-Befehle zu verwenden. 
 +     Das sind 1-Byte-Befehle, die einem Unterprogrammsprung 
 +     entsprechen.) Das heisst aber auch, dass durch das in- 
 +     terruptanfordernde Geraet der Befehl auf den Datenbus 
 +     gelegt wird. 
 +
 +IM1:  Nach dem Akzeptieren des Unterbrechungswunsches wird 
 +      der Befehl 'RST 38H' automatisch ausgefuehrt. 
 +      Gegebenenfalls muss im Interruptbehandlungsprogramm 
 +      eine Abfrageroutine eingeleitet werden, welche den 
 +      "Interrupt-Anmelder" feststellt und danach entsprechen- 
 +      de Programme aktiviert. 
 +
 +IM2:  Diese Betriebsart stellt fuer den Prozessor die lei- 
 +      stungsfaehigste Unterbrechungsbehandlung dar. Man 
 +      nennt sie auch Vektorinterrupt, weil die Organisation 
 +      der Behandlungsroutinen ueber Zeiger auf einen Adress- 
 +      vektor realisiert wird. 
 +      Bei Unterbrechungsanforderung stellt jede Interrupt- 
 +      quelle den fuer die gewuenschte Interruptroutine not- 
 +      wendigen niederwertigen "Zeigerteil" durch Aussenden 
 +      eines 8-Bit-Wertes auf den Datenbus bereit (sogenann- 
 +      tes Vektorlesen). 
 +      Dieser Wert bildet den niederwertigen Teil, der Inhalt 
 +      des I-Registers den hoeherwertigen Teil einer Adresse 
 +      einer bestimmten Speicherzelle. Diese und die nachfol- 
 +      gende Speicherzelle beinhalten dann die Adresse des In- 
 +      terruptbehandlunnsprogramms. Dies setzt aber natuerlich 
 +      das vorbereitende Laden des I-Registers und der ent- 
 +      sprechenden Register der Peripheriebausteine voraus 
 +      (sogenannte Initialisierung). 
 +</code>
 +
 +Beispiel: 
 +<code>
 +          3 Peripheriebausteine verlangen jeweils eine ande- 
 +          re Interruptroutine. Die Startadressen fuer die 
 +          jeweiligen Unterprogramme lauten: 
 +
 +          INT1:=0FF0H 
 +          INT2:=0FFFH 
 +          INT3:=2F00H 
 +
 +          Aufbau der Startadressentabelle: 
 +          Zeiger1: 0C00 F0H 
 +                   0C01 OFH 
 +          Zeiger2: 0C02 FFH <===   N(INT2):=0FFH 
 +                   0C03 0FH <===   H(INT2):=0FH 
 +          Zeiger3: 0C04 00H ===>   0FFFH=Startadresse 
 +                   0C05 2FH 
 +                   0C06 
 +
 +          -  Das I-Register muss mit "0CH" geladen werden. 
 +             Es stellt den absoluten Zeigerteil dar. 
 +           - Dem Peripheriebaustein 1 muss fuer das entsprechen- 
 +             de Register der variable Zeigerteil mit dem Wert 
 +
 +             "00" mitgeteilt werden. Entspechend gilt "02H" und 
 +             "04H" fuer Baustein 2 und 3. 
 +</code>
 +
 +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. 
 +
 +<code>
 +I-Register    0CH (High-Teil) 
 +var. Zeiger   02H (Low-Teil) 
 +---------------------------- 
 +   Zeiger 2   0C02H 
 +</code>
 +
 +In der Startadresstabelle ist unter der Adresse 0C02H ein 
 +0FFH und unter 0C03H ein 0FH eingetragen, d. h. die Startadresse der zum Peripheriebaustein 2 gehoerenden Interruptbehandlungsroutine lautet 0FFFH. 
 +
 +Auf diese Art, laesst sich nicht nur sehr schnell aus vielen 
 +Interruptroutinen die fuer den Peripheriebaustein notwendige 
 +herausfinden und aktivieren, es wird auch moeglich, fuer ein 
 +und denselben Peripheriebaustein durch Umprogrammieren des 
 +"variablen Zeigerteils" eine andere Interruptroutine aufzurufen. Das Akzeptieren einer Interruptanforderung setzt stets 
 +das Retten der Fortsetzungsadresse voraus. Dies geschieht wie 
 +beim Unterprogrammruf durch Kellern des Befehlszaehlers. Bei 
 +Rueckkehr aus der Interruptroutine wird der Befehlszaehler 
 +wieder entkellert und es erfolgt somit die Fortsetzung der 
 +Programmabarbeitung an der zuvor verlassenen Stelle. Das Kellern und Entkellern fuehrt der Prozessor automatisch aus. 
 +Auch hier gilt zu beachten, dass im Interruptprogramm die 
 +Anzahl der Keller- und Entkelleroperationen gleich sein muss. 
 +
 +Problematisch ist es, wenn mehrere Peripheriebausteine gleichzeitig eine 
 +Unterbrechung anmelden. Vorrang hat stets der Baustein, welcher in der 
 +Prioritaetskette an "weitesten vorn" steht. Diese Kette wird durch die Signale 
 +'IEI' und 'IEO' gebildet, die durch alle Bausteine hindurchgefuehrt werden. 
 +Waehrend der Abarbeitung einer Interruptbehandlungsroutine bleibt es dem 
 +Programmierer ueberlassen, ob er durch Setzen des EI-Befehls die Unterbrechung 
 +der Interruptbehandlungsroutine vorzeitig durch einen Peripheriebaustein 
 +hoeherer Prioritaet zulaesst oder nicht, da die Annahme einer Unterbrechung 
 +weitere Unterbrechungsannahmen ausschliesst. Am Ende einer 
 +Interruptbehandlungsroutine muss stets, sofern nicht schon erfolgt, mit dem 
 +Befehl 'EI' die Unterbrechungserlaubnis wieder freigegeben werden. EI wird immer 
 +erst nach Ausfuehrung des auf EI folgenden Befehls wirksam. 
 +
 +- Rueckkehrbefehle aus dem Interruptprogramm: 
 +
 +<code>
 +RETI    ; Rueckkehr aus dem maskierbaren Interruptprogramm 
 +RETN    ; Rueckkehr aus dem nichtmaskierbaren Interruptpro- 
 +          gramm 
 +
 +Hinweis:  RETI bewirkt beim Peripheriebaustein, welcher die 
 +          Interruptroutine ausgeloest hat, das Wiederschlies- 
 +          sen der Prioritaetskette (IEO--high). Somit koennen 
 +          nach RETI auch die Peripheriebausteine niedriger 
 +          Prioritaet einen Interrupt ausloesen. 
 +</code>
  
  • z1013/handbuecher/handbuch_1.1279802478.txt.gz
  • Zuletzt geändert: 2010/07/21 22:00
  • (Externe Bearbeitung)