----------------------------------------------------
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.