----------------------------------------------------

Anhang I

VBI

Vertikal-Blank-Interrupts

----------------------------------------------------

 

Der ATARI Computer besitzt eine Vielzahl von Interrupts, die für den Benutzer von groFem Wert sein können. Dieser Anhang behandelt die Vertical-Blank-Interrupts. Diese Interrupt-Art ist nicht maskierbar und tritt 50 mal pro Sekunde auf. Dieses geschieht, während der Elektronenstrahl vom unteren Bildschirm zum Oberen zurückläuft.

 

Bei einem Verical-Blank gibt der ANTIC-Prozessor als erstes ein NMI- Signal an den 6502-Chip weiter, woraufhin dieser zu einer NMI-Service-Routine springt, welche die Ursache für den Interrupt feststellt. Ist der Interrupt ein VBI, dann schiebt der 6502 zunächst das A-, X- und Y-Register auf den Stapel. Danach springt das Programm über den Immediate- (=sofortiger)-Vertical-Blank-Vektor (VVBLKI($0222)). Dieser Vektor zeigt im Normalfall auf die Speicherstelle $E45F. AnschlieFend erfolgt ein Sprung über den Deferred- (=zurückgestellter)-Vertical-Blank-Vektor  (VVBLKD($0224)). Dieser Vektor zeigt normalerweise auf eine Routine zum AbschlieFen einer Interrupt-Bearbeitung. Diese Routine ist sehr einfach aufgebaut und beginnt bei Speicherstelle $E462. Abbildung I.1  zeigt schematisch den eben beschriebenen Ablauf:

Abbildung I.1:

Normale Bearbeitung des Vertical Blank Interrupts durch

das OS (und durch eventuelle Zusätze das Benutzers)

 

Diese beiden VBI-Vektoren sind im RAM untergebracht, damit der Programmierer die 5O-Hz-Interrupt-Routine des OS ausschalten und diesen Interrupt für seine eigenen Zwecke benutzen kann. Um dieses zu erreichen, müssen folgende Dinge getan werden: der Benutzer muF als erstes entscheiden, ob seine Routine für den Immediate oder für den Deferred VBI sein soll. In den meisten Fällen besteht hierbei kein groFer Unterschied zwischen den beiden Möglichkeiten. Es gibt allerdings auch Ausnahmen. Es ist von Bedeutung, wenn die VBI-Routine in ein Register schreibt, das von der VBI-Routine des OS übertragen wird. Die Routine vom Benutzer muF hinter der des OS stehen, damit sie wirksam ist.

 

Im zweiten entscheidenden Fall nimmt die VBI-Routine des Benutzers soviel Zeit in Anspruch, daF die Routine des OS zeitlich verschoben wird. Werden durch die OS-Routine Graphik-Register geändert, dann kann es in diesem Fall dazu kommen, daF diese ƒnderung geschieht, während der Elektronenstrahl sich schon wieder in der Bildschirmmitte befindet. Ein unschönes Bild wäre die Folge. Die VBI-Routine des Benutzers sollte in diesem Falle an der Stelle für den Deferred VBI plaziert werden.

 

Die maximale Grenze für Immediate VBI-Routine liegt bei 3800 Maschinenzyklen; für Deferred VBI-Routinen liegt sie bei 20.000. Natürlich werden viele dieser 20.000 Zyklen ausgeführt, während sich der Elektronenstrahl auf dem Bildschirm befindet. Graphische Operationen sollten also durch die Deferred VBI-Routine nicht ausgeführt werden. AuFerdem ist die Zeit für die Ausführung eines DLIs ein Teil dieser 20.000 Maschinenzyklen. Der Leser sollte sich auch daran erinnern, daF diese 20.000 Zyklen von der gesamten Menge der Prozessor-Zyklen abgezogen werden.

 

Der dritte Fall, bei dem die Stellung der Benutzer-Routine von Bedeutung ist, liegt dann vor, wenn letzterer mit zeitkritischem I/0 (z.B. Disketten- oder Casseten-I/O) gemischt wird. Die VBI-Routine des OS besteht aus zwei Stufen: einer kritischen und einer unkritischen. Während eines solchen zeitkritischen I/Os schaltet das OS die VBI-Routine nach der ersten Stufe ab. Wenn der Benutzer nicht möchte, daF seine eigene VSI-Routine während des zeitkritischen I/Os abgeschaltet wird, muF er sie als Immediate VBI-Routine definieren. Die dabei aufgebauten Verzögerungen können allerdings diesen I/0 stören, ist nun aber Problem des Programmierers.

 

Sobald der Benutzer sich entschieden hat, ob seine VBI-Routine sofortiger oder verschobener Art sein soll, wird diese im Speicher plaziert (Page 6 ist hierfür gut geeignet). Der Benutzer muF den AbschluF seiner Routine der normalen VBI-Verarbeitung anpassen und die OS RAM-Vektoren so ändern, daF sie auf diese Routine zeigen.

 

Die Immediate VBI-Routine des Programmierers muF mit JMP $E45F abschlieFen; eine Deferred VBI-Routine mit einem $E462-Befehl. Will der Benutzer die VBI-Routine des OS umgehen (z.B. um Prozesearzeit zu gewinnen), muF seine Immediate VBI-Routine mit JMP $E462 abgeschlossen werden.

 

Ein für 8-Bit-Mikrocomputer typisches Problem taucht auf, wenn Vektoren während eines Interrupts geändert werden sollen. Vektoren sind 2-Byte-Werte, d.h. es sind zwei Speicherbefehle erforderlich, um sie zu ändern. Es besteht eine geringe Wahrscheinlichkeit, daF erst ein Byte eines Vektors geändert wurde, wenn Interrupt auftritt. Diese Situation würde zu einem ìAbsturzî des Computers führen. Es gibt für diees Problem allerdings auch eine Lösung, die in Form einer OS-Routine geliefert wird. Diese Routine heiFt SETVBV und beginnt bei Speicherstelle $E45C. Das Y-Register dem 6502-Prozessors wird als erstes mit dem niederwertigen Byte für den Vektor, das X-Register mit dem höherwertigen Byte gelanden. Im Akkumulator wird eine 6 für Immediate bzw. 7 für Deferred VBI gespeichert. Durch einen nun folgenden Sprung (JSR SETVBV) zur genannten Routine wird der Interrupt auf sichere Weise eingeschaltet und beginnt 50-mal pro Sekunde zu arbeiten.

 

Für 5O-Hz-Interrupts gibt es ein weites Anwendungsfeld. Als erstes können Bildschirm-Manipulationen während des Vertical Blanks ausgeführt werden, so daF diese Änderungen garantiert nicht auf dem Bildschirm geschehen. Zum Zweiten können regelmäFig wiederkehrende Bildschirm-ƒnderungen mit hoher Geschwindigkeit ausführt werden. In vielen Fällen, bei denen Animation erforderlich ist, kann dieses sehr vorteilhaft sein. So müssen z.B. die Blasen im SCRAMîTMî-Programm mit gleichbleibender Geschwindigkeit bewegt werden. Sie dürfen nicht langsamer oder schneller werden, wenn der 6502 mehr bzw. weniger Aktionen ausführt. Die einzige Möglichkeit um dieses zu erreichen ist, die Animation während eines Vertical-Blanks auszuführen.

 

Eine andere Anwendungsmöglichkeit von VBIs liegt in der Sound-Modifikaiton. Die Sound-Register des ATARI Computers gestatten eine Kontrolle der Frequenz, der Lautstärke und der Verzerrung, aber nicht der Dauer. Diese kann über einen VBI gesteuert werden, indem zusammen mit dem Aufrufen der Routine ein Parameter gesetzt wird, der die Dauer festlegt. Die Interrupt-Routine dekrementiert dann jeden Wert, der ungleich Null ist. Diese Methode kann zum Steuern der Lautstärke eines Kanals benutzt werden, wodurch die Erzeugung von Anstiegs-, Halt- und Abfallzeit eines Tones möglich ist. Die Kontrolle von Frequenz und Verzerrung ist mit einer erweiterten Form dieser Technik möglich, wodurch interessante Effekte generiert werden können. Aufgrund einer zeitmäFigen Auflösung von einer 50stel Sekunde kann ein VBI nicht nur zur direkten Kontrolle der Lautsprecher-Amplitude eingesetzt werden.

 

VBIs sind auch zur Bearbeitung von Benutzereingaben sehr dienlich. Solche Eingaben erfordern wenig Berechnung, aber ständige Aufmerksamkeit. Ein VBI gestattet einem Programm 50 mal pro Sekunde eine Eingabe des Benutzers zu überprüfen, was andernfalls das Programm verlangsamt. Dieses ist eine ideale Lösung für die Aufrechterhaltung der Programm-Geschwindigkeit verbunden mit gleichzeitiger Beachtung des Benutzers.

 

SchlieFlich werden durch VBIs grobe Formen von sog. MULTI-TASKING (= gleichzeitige Bearbeitung mehrerer Prozesse) möglich. Ein ìVordergrundî-Programm kann unter einem VBI laufen, während ein ìHintergrundî-Programm als Hauptprogramm abgearbeitet wird. Wie bei jedem Interrupt ist eine Trennung der Datensätze beider Programme erforderlich.