CODING ★ INTERRUPT-KURSUS FÜR DEN CPC V2 (CPC AMSTRAD INTERNATIONAL) ★

Interrupt-Kursus für den CPC v2 (CPC Amstrad International)
★ Ce texte vous est présenté dans sa version originale ★ 
 ★ This text is presented to you in its original version ★ 
 ★ Este texto se presenta en su versión original ★ 
 ★ Dieser Text wird in seiner Originalfassung präsentiert ★ 

Einen Moment mal!

Im dritten Teil unseres Interrupt-Kurses wollen wir zuerst auf eine der am häufigsten programmierten Interrupt-Varianten eingehen, den selbstprogrammierten Interrupt. Dieser findet zwar auch in der Assemblerprogram-mierung eine schwerpunktmäßige Anwendung, er soll aber hier der Verständlichkeit zuliebe in BASIC erklärt werden.

Das eigentliche Geheimnis der selbstprogrammierten Interrupts liegt darin, daß diese keine Interrupts im herkömmlichen Sinne, das heißt dem Betriebssystem übergeordnet sind, sondern aus der Ebene der Programmiersprache gesteuert werden. Deshalb werden sie auch in der Abgrenzung zu herkömmlichen Interrupts als “Events“ bezeichnet; es ist im Prinzip nichts anderes als ein bedingter GOSUB-Aufruf. Die Aufrufe dieser Events sind im Vergleich zu den “normalen“ Interrupts nur bedingt von der verstrichenen Zeit abhängig, da die Ausführung von der Anzahl der Programmdurchläufe gesteuert wird. Da die Event-Verwaltung vom Benutzer selbst programmiert werden muß, ergibt sich auch gleich die erst Schwäche dieser Methode. Bei jedem Programmdurchlauf muß abgefragt werden, ob die Event-Unterroutine ausgeführt werden soll oder nicht. Dabei geht natürlich mehr Zeit verloren, als wenn das Betriebssystem dieses intern regelt. Diese Programmierung bietet sich aber vor allem deshalb an, weil ein ständiges Ein- und Aushängen wie bei systemeigenen Interrupts entfällt. Außerdem ist mit dieser Methode gewährleistet, daß man den genauen Zeitpunkt der Unterbrechung im Programmablauf vorgeben kann. Damit entfallt auch ein lästiges “Schützen“ von Pro-grammteilen (wie in einer der vorigen Folgen erläutert), da die Abfrage, ob ein ein Unterprogrammaufruf stattfinden soll, immer an derselben Stelle im Programm steht.

Die zentrale Stelle im obenstehenden Programm ist Zeile 100. Hier werden alle drei Programmdurchläufe des Unterprogramms für die Straßenverwaltung aufgerufen. Zusätzlich wäre noch zu erwähnen, daß auch eine Quasi-Zeitabfrage bei selbstprogrammierten Interrupts möglich ist. Dabei wird die Systemvariable TIME in folgender Weise benutzt: Zuerst wird eine Variable für die Zeit initalisiert A=TIME. Die eigentliche Steuerung übernimmt aber nachstehende Anweisung:

IF TIME-A> (ZEIT IN 1/300 SEKUNDEN) THEN A=TIME: GOSUB (UNTERPROGRAMM)

Mit dieser Zeile wird etwa im angegebenen Zeitintervall eine Unterprogrammroutine aufgerufen.

Da die Verwaltung trotzdem immer noch auf den Programmdurchläufen aufbaut, wird die angegebene Zeit zwangsläufig immer überschritten, da der Aufruf erst dann erfolgen kann, wenn das Programm an die Stelle gekommen ist, an der die entsprechende Abfrage steht.

Grundlagen der Maschinen-Interrupts

Sicher ist Ihnen im Verlauf dieses Interrupt-Kurses die Frage nach den eigentlichen Steuermechanismen im Betriebssystem gekommen. Die Hardware Ihres CPCs, genaugenommen das sagenumwobenen “Gate Array“, erzeugt nun den einzigen Interrupt-Impuls, der alle 1/300 Sekunden auftritt. Alle weiteren Interrupts bauen auf diesem Impuls auf, das heißt, sie betragen ein Vielfaches von ihm. Der schnellste aller Interrupts auf dem CPC ist der sogenannte Fast Ticker, der synchron zum 1/300-Sekunden-ImpuIs läuft. Ein weiterer Interrupt ist der Frame Flyback, der alle 1/50 Sekunden auftritt und den Bildrücklauf koordiniert sowie alle Farbregister versorgt. Der dritte systemeigene Interrupt ist der Ticker, der wieder vom Fast Ticker abgeleitet wird und auch alle 1/50 Sekunden eintritt. Von diesen drei verschiedenen Interrupts können auch mehrere parallel auftreten. Damit das Betriebssystem diese interne Verwaltung bewerkstelligen kann, werden die für jeden Interrupt benötigten Informationen in einem sogenannten Event-Block zusammengestellt.

Diese Informationen geben dem System Angaben über den momentanen Status des Interrupt-Unterprogramms. Es wird also abgefragt, ob es aktiv ist oder nicht, denn es ist auch möglich, ein Unterprogramm kurzzeitig zu sperren. ohne den Event-Block löschen zu müssen. Außerdem erhält das System Angaben über die Priorität und die Anzahl der Aufrufe sowie die Adresse des

Unterprogramms. Alle Event-Blocks, die zu einer Interrupt-Art (zum Beispiel Frame Flyback) gehören, sind untereinander durch Pointer verkettet, einer Information, die angibt, wo im Speicher der nächste Block zu finden ist. Tritt einer der drei Hardware-Interrupts auf (Fast Ticker, Frame Flyback. Ticker), werden die Interrupt-Blocks, falls vorhanden und aktiv, nach ihrer Priorität abgearbeitet. In dieser Reihenfolge werden sie dazu zuerst in eine bestimmte Kette, die Pending Queue, eingereiht (in der Fachsprache auch Kicken genannt). Nach dem Einreihen werden die Interrupt-Blocks der Pending Queue dann der Reihe nach abgearbeitet. Es gibt jedoch Möglichkeiten, diese Einordnung zu umgehen. Zum einen durch sogenannte asynchrone Interrupts, die sofort gekickt werden, zum anderen durch Express-Interrupts, die die höchste Priorität unter den Events haben. Die asynchronen Interrupts haben nun den Vorteil, daß sie nicht nur vom System bearbeitet werden wie die Synchrone-Events, sondern daß dieses sic selbsttätig ausführt, nachdem das Einreihen der anderen Interrupts vonstatten gegangen ist. Bei den anderen (synchronen) Interrupts wird nur ein Zähler im Event-Block erhöht, der die Anzahl der Aufrufe speichert, höchstens jcdoch 127. Eine zusätzliche Möglichkeit bietet nun noch die Kombination der beiden obengenannten Sonderformen. Es entsteht so ein asynchroner Express-Interrupt, der seinerseits, ohne Zeitverzögerung beim Kicken direkt ausgeführt wird. Er ist somit die beste und leistungsfähigste Unterbrechung des CPC.

MC-Programmierung

Nun wollen wir endlich dazu kommen, wie der Event Block in der Praxis angewendet und programmiert wird. Dazu müssen wir erst einmal auf die genaue Struktur dieses Informationspaketes eingehen. Grundsätzlich ist es uninteressant, an welcher Stelle im Speicher ein Event-Block steht, es muß nur darauf geachtet werden, daß er sich im Speicherbereich von hexadezimal &4000 bis &BFFF, dem zentralen RAM, befindet. Dieser Bereich ist aber nur als theoretische Begrenzung zu sehen, da in den höheren Speicheradressen systemeigene Routinen, zum Beispiel die Betriebssystemvektoren oder verschiedene Parameter des Diskettenbetriebssystems. stehen, die natürlich nicht einfach überschrieben werden sollten. Im Normalfall kann man davon ausgehen, daß Operationen im Bereich bis &A600 ungefährlich sind. Falls man parallel noch mit BASIC arbeitet, muß man natürlich die MC-Routinen durch Memory-Befehle absichern und noch genügend Platz für Variablen lassen. Der Speicher außerhalb des zentralen RAM kann deswegen nicht benutzt werden, weil man auf ihn nur dann zugreifen kann, wenn es die ROM-Konfiguration erlaubt, daß heißt, das dem RAM parallel liegende ROM muß abgeschaltet sein: doch dies ist nicht immer gewährleistet.

Der Event-Block

Im folgenden wollen wir nun auf die genaue Bedeutung der einzelnen Bytes im Event-Block eingehen.

Der Event-Block teilt sich in zwei Teilbereiche auf; der eine Teil verwaltet die einzelnen Blöcke, bevor sie in die Pending Queue eingereiht werden, der andere enthält die Daten des Unterprogramms, die für die spätere Koordination notwendig sind (zum Beispiel die Regelung der Prioritätsstufe). Die Länge des ersten Teils variiert je nach Art des verwendeten Interrupts zwischen 2 und 6 Byte, letzteres ist aber nur beim Ticker-Interrupt der Fall. Bei allen drei Interrupts haben die ersten beiden Bytes keine Bedeutung für den Programmierer. sondern werden vom System für interne Operationen benötigt. Bei Frame-Flyback- und Fast-Ticker-Interrupts schließt hiernach direkt der zweite Teil des Event-Blocks an. bei Ticker-Interrupts geben die nächsten beiden Bytes an, wieviel Zeit (in 1/50 Sekunden) noch verbleibt, bis der jeweilige Block gekickt wird. Dieses Register wird ständig vom System verändert. Das dann folgende Bytepaar enthält die Information, in welchem Zeitintervall (auch in 1/50 Sekunden angegeben) oben genanntes Einreihen vonstatten geht. Mit ihm wird das Zählregister, das vom System heruntergezählt wird, geladen, wenn dieses bei Null angelangt ist und sonnt der Block gekickt wurde. Am Anfang des zweiten Teils des Event-Blocks sind nun erst einmal wieder 2 Byte für interne Kettungsvorgänge reserviert. Diese sorgen für Ordnung innerhalb der Pending Queue und sind für den Programmierer ohne wesentliche Bedeutung. Mit dem nächsten Byte beginnt nun der eigentlich ausschlaggebende Teil. Dieses ist nämlich das Zählbyte, welches nun mehrere Aufgaben hat. Zum einen wird es bei jedem Kickvorgang erhöht und kann so bis zu 127 Aufrufe vermerken. Eine Ausnahme sind jedoch die asynchronen Interrupts, bei denen der Zähler nicht erhöht wird, wenn er vorher den Wert null hatte, da solche Events quasi sofort ausgeführt werden und so nicht gespeichert werden müssen. Ist der Wert ungleich Null, findet auch dort nur eine Zählererhöhung statt. Zum anderen bietet das Zählerbyte eine komfortable Möglichkeit, ein spezielles Interrupt-Programm zu sperren, indem man einfach die Ausführung des Event-Blocks verhindert. Dazu wird dieses Register einfach mit einem Wert größer 127 (hexadezimal &7F) geladen. Das jetzt folgende Byte ist ein Multifunktionsregister, in dem jedes Bit (oder eine Gruppe von Bits) eine Information übergibt. Das erste Bit gibt die ungefähre Lage der zum Event-Block gehörenden Interrupt-Routine im Speicher an. Im Regelfall ist dieses Bit gesetzt (also eins), es sei denn, die Routine steht im oberen ROM-Bereich. Die nächsten vier Bits bestimmen die Priorität des Events, wobei diese Bits als eine binäre Zahl aufgefaßt werden. Je höher diese Zahl ist. desto höher ist auch die Priorität des entsprechenden Interrupts. Bit sechs muß immer null sein, da es vom System benötigt wird. Das folgende Bit gibt im gesetzten Zustand an, daß cs sich um einen Express-Interrupt handelt. Das letzte Bit dieses Bytes enthält nun schließlich die Information, ob der Interrupt synchron (Bit=0) oder asynchron (Bit = l) ist. Die folgenden zwei Bytes haben jetzt wieder eine weitaus leichtere Aufgabe, sie geben die Adresse der Interrupt-Routine an, aufgespalten nach LO- und HI-Byte. Danach folgt ein Byte, das nur benutzt wird, wenn die Interrupt-Routine im oberen ROM-Bereich steht. Das Register gibt dann die ROM-Nummer an. Hiernach können beliebig viele Bytes folgen, in denen beispielsweise Parameter an das Interrupt-Unterprogramm übergeben werden.

Programmierung des Event-Blocks

Nachdem jetzt ausführlich auf die einzelnen Bedeutungen der Bytes im Event-Block eingegangen wurde, wollen wir noch eine kurze tabellarische Zusammenfassung der für den Programmierer wichtigen Bytes bringen, die benötigt werden, um einen Interrupt einzuhängen:

  • Byte A: systemversorgt
  • Byte B: systemversorgt
  • Byte C: nur Ticker, beim Einhängen übergeben
  • Byte D: nur Ticker, beim Einhängen
  • Byte E: nur Ticker, beim Einhängen
  • Byte F: nur Ticker, beim Einhängen
  • Byte 1: systemversorgt
  • Byte 2: systemversorgt
  • Byte 3: Zähler, systemversorgt
  • Byte 4: Multifunktionsregister
    • Bit 1: RAM (1)/ROM (0)
    • Bit 2-5: Priorität
    • Bit 6: 0
    • Bit 7: Express (1)
    • Bit 8: Asynchron (1)
  • Byte 5: LO-Byte der Ansprungsadr.
  • Byte 6: HI-Byte der Ansprungsadr.
  • Byte 7: ROM-Nummer (nur wenn Bvte 4. Bit 1 = 0)
  • Byte 8: beliebig (siehe oben)

In der nächsten Folge:

Fortsetzung der Event-Block-Programmierung

Notwendige Sprungadressen Beispielprogramme zu den einzelnen Interrupt-Arten

CPCAI ,Jens Buri & Matthias Wittern/cd

★ PUBLISHER: CPC Amstrad International
★ YEAR: 1990
★ CONFIG: 64K + AMSDOS
★ LANGUAGE:
★ LiCENCE: ???
★ COLLECTION: CPC AMSTRAD INTERNATIONAL 1990
★ AUTHORS: Jens Buri , Matthias Wittern
 

Page précédente : Interrupt-Kursus für den CPC v1
★ AMSTRAD CPC ★ DOWNLOAD ★

Type-in/Listing:
» CPC-Interruptkurs  v2.1    (CPC  Amstrad  International)    GERMANDATE: 2020-06-13
DL: 148
TYPE: ZIP
SiZE: 4Ko
NOTE: 40 Cyls
.HFE: Χ

★ AMSTRAD CPC ★ A voir aussi sur CPCrulez , les sujets suivants pourront vous intéresser...

Lien(s):
» Coding » Clefs1 19 Logiciel Interne Table Cassette
» Coding » Clefs1 21 Logiciel Interne Table Kernel
» Coding Src's » SUB INVERT (CPC Amstrad International)
» Coding » Interrupt-Kursus für den CPC v1 (CPC Amstrad International)
» Coding » Clefs1 15 Logiciel Interne Table Clavier
» Coding » Clefs2 41 - Ctc8253 Interfacage
Je participe au site:
» Vous avez des infos personnel ?
» Vous avez remarqué une erreur dans ce texte ?
» Aidez-nous à améliorer cette page : en nous contactant via le forum ou par email.

CPCrulez[Content Management System] v8.7-desktop
Page créée en 235 millisecondes et consultée 703 fois

L'Amstrad CPC est une machine 8 bits à base d'un Z80 à 4MHz. Le premier de la gamme fut le CPC 464 en 1984, équipé d'un lecteur de cassettes intégré il se plaçait en concurrent  du Commodore C64 beaucoup plus compliqué à utiliser et plus cher. Ce fut un réel succès et sorti cette même années le CPC 664 équipé d'un lecteur de disquettes trois pouces intégré. Sa vie fut de courte durée puisqu'en 1985 il fut remplacé par le CPC 6128 qui était plus compact, plus soigné et surtout qui avait 128Ko de RAM au lieu de 64Ko.