----------------------------------------------------
Kapitel
5
Display-List-Interrupts
----------------------------------------------------
Der
Display-List-Interrupt ist eine der leistungsstärksten Fähigkeiten des
ATARI ™ Personal Computer Systems, es ist allerdings auch eine der am schwersten
zugänglichen. Er erfordert tiefste Kenntnis der Maschinensprache und der Maschinen-Charakteristiken.
Display-List-Interrupts an sich liefern keine Verbesserungen; sie müßen
in Verbindung mit den anderen Möglichkeiten des Systems, wie z.B. Player-Missile-Graphiken,
indirekte Zeichensatz- oder Farb- register-Adressierung, benutzt werden. Mit Display-List-Interrupts
kann die volle Leistungsstärke dieser Möglichkeiten erreicht werden.
Display-List-Interrrupts
ziehen den Vorteil aus der sequentiellen Anordnung des Raster-Scan-Fernsehsytems.
Der Fernseher zeichnet das Bild in einer bestimmten Zeitfolge vom oberen zum unteren
Bildschirmrand. Dieser Zeichenvorgang verbraucht ungefähr 13.000 Mikrosekunden,
was dem menschlichen Auge als ein gleichmäßiges Bild erscheint, für
den Computer aber ein großer Zeitraum ist. Das Gerät hat sehr viel Zeit,
um die Parameter des Displays zu ändern, während der Bildschirm gezeichnet
wird. Das bedeutet, der Zyklus des Parameter-Änderns muß zum Zyklus des
Bildschirmzeichnens synchronisiert werden. Dieses kann zum einen geschehen, indem
der 6502 in eine Schleife geschickt wird, deren Ausführungsfrequenz exakt bei
50 Hertz liegt. Dieses macht andere Berechnungen allerdings nahezu unmöglich.
Eine andere (und bessere) Methode ist, zu unterbrechen, d.h. anzuhalten <->Interrupt).
Der 6502 reagiert auf den den Interrupt, indem er die Bildschirmparameter ändert
und danach zu seinen normalen Aufgaben zurückkehrt. Der Interrupt hierfür
muß zeitlich präzise abgestimmt werden, damit er exakt beim Bildschirm-Zeichen-Prozeß
auftritt. Dieser speziell getimte Interrupt wird von ANTIC ausgelöst und als
Display-List-Interrupt (DLI) bezeichnet.
Das
Timing und die Ausführung eines jeden Interrupt-Prozesses ist kompliziert; daher
soll hier erst die Folge von Ereignissen, die bei einem sauber arbeitenden Display-List-Interrupt
auftritt, geschildert werden. Der Vorgang beginnt damit, daß der ANTIC-Chip
auf eine Instruktion in der Display-List stößt, deren Interrupt-Bit (D7)
gesetzt ist. ANTIC wartet dann bis zur letzten Scan-Line der im Augenblick angezeigten
Mode-Line und "sieht" dann im NMIEN-Register "nach", ob Display-List-Interrupts
eingeschaltet, d.h. zugelassen sind. Ist das entsprechende Bit ausgeschaltet, dann
ignoriert ANTIC den Interrupt und fährt mit seiner normalen Anzeige-Arbeit fort.
Andernfalls schickt ANTIC ein NMI-Signal (NMI = Non Maskable Interrupt = Nicht maskierbares
Interrupt) an den 6502 und kehrt dann erst zu seiner normalen Aufgabe zurück.
Der 6502 springt über den NMI-Vektor zur Interrupt-Routine des OS. Diese Routine
stellt als erstes den Grund für den Interrupt fest. Wenn letzterer tatsächlich
ein Display-List-Interrupt ist, wird die angesprungene Routine über die Adressen
$0200 und $0201 (nieder-, danach höherwertig) zu einer DLI-Service-Routine umgeleitet.
Diese DLI-Routine ändert ein oder mehrere Graphik-Register, die die Anzeige
kontrollieren. Danach führt der 6502 sein Hauptprogramm weiter.
Es
gibt eine Anzahl von Schritten, die für das Erstellen eines DLIs erforderlich
sind. Als erstes muß natürlich die DLI-Routine selbst geschrieben werden.
Diese Routine muß alle 6502-Register, die evt. geändert werden, auf den
Stapel schieben, da die OS-Routine keine Register rettet (Das Status-Register des
Prozessors wird automatisch auf den Stapel gebracht). Die Routine sollte kurz und
schnell sein; sie sollte nur Register ändern, die in Zusammenhang mit dem Display
stehen. Sie muß außerdem damit enden, daß alle auf den Stapel gebrachten
Register wieder zurückgespeichert werden.
Als
nächstes muß die DLI-Service-Routine irgendwo im Speicher plaziert werden.
Page 6 ist hierfür ideal. Danach wird der Vektor bei $0200 und $0201 so gesetzt,
daß er auf diese Routine zeigt. Nun wird der vertikale Punkt auf dem Schirm
festgelegt, an dem der DLI auftreten soll, dann die zugehörige Anweisung in
der Display-List gesetzt. Dort wird Bit D7 der vorangegangenen Instruktion gesetzt.
Schließlich wird der DLI eingeschaltet, indem Bit D7 des NMIEN-Registers ($D40E)
gesetzt wird. Der DLI ist dann sofort aktiviert.
Wie
bei jeder Interrupt-Service-Routine können durch zeitliche Erfordernisse Probleme
aufgeworfen werden. ANTIC leitet den Interrupt nicht sofort an den 6502 weiter, sobald
er auf eine entsprechende Anweisung stößt, sondern wartet bis zur letzten
Scan-Line der unterbrechenden Mode-Line. Der 6502 und die Interrupt-Service-Routine
des OS verbrauchen zusammen zwischen 18 und 25 Maschinenzyklen. Die erste Instruktion
der DLI-Service-Routine wird also erst erreicht, nachdem mindestens 18 Maschinenzyklen
vergangen sind. Diese 18 Maschinenzyklen entsprechen 36 Color Clocks auf dem Bildschirm.
Das bedeutet, daß sich der Elektronenstrahl in der Mitte des Schirms (in der
letzten Scan-Line der unterbrechenden Mode-Line) befindet, wenn die DLI-Routine gestartet
wird. Ändert die DLI-Service-Routine ein Farbregister, dann erscheint die alte
Farbe auf der linken und die neue Farbe auf der rechten Bildschirmseite. Aufgrund
des unsicheren Timings beim Reagieren dem 6502 auf einen Interrupt, ist diese Grenzlinie
zwar scharf, zittert aber hin und her.
Es
gibt allerdings eine Lösung für dieses Problem. Sie besteht im WSYNC- (Warten
auf waagerechte Synchronisation) Register. Immer wenn dieses Register auf irgendeine
Weise adressiert wird, setzt ANTIC das RDY-Signal des 6502 Low und "friert"
damit den 6502 solange ein, bis das Register durch eine waagerechte Synchronisation
wieder zurückgesetzt wird. Wird in der Interrupt-Routine eine STA WSYNC-Anweisung
genau vor der Anweisung, die den Wert eines Farbregisters ändert, plaziert,
so wird die entsprechende Farbe geändert, während sich der Elektronenstrahl
außerhalb des linken Bildschirmrandes befindet. Dadurch wechselt die entsprechende
Farbe erst eine Scan-Line tiefer, als ursprünglich beabsichtigt, ist dafür
aber "sauber".
Die
richtige Benutzung eines DLIs ist deshalb, das DLI-Bit der Mode-Line vor der Mode-Line
zu setzen, in welcher der DLI auftreten soll. Die DLI-Service-Routine muß also
als erstes die 6502-Register auf den Stapel schieben. Danach werden diese mit den
zu benutzenden neuen Graphik-Werten geladen. Die Routine muß eine STA WSYNC-Anweisung
ausführen und dann die neuen Werte in die entsprechenden ANTIC- bzw. CTIA-Register
speichern. Schließlich müßen die 6502-Register wieder vom Stapel
geholt werden, woraufhin zum Hauptprogramm zurückgesprungen wird. Dieser Vorgang
garantiert, daß die Graphik-Register am Anfang der gewünschten Zeile geändert
werden, während der Elektronenstrahl sich außerhalb des Bildschirmrandes
befindet.
Das folgende Programm
ist ein Beispiel für einen DLI:
10 DLIST=PEEK(560)+256*PEEK(561):REM
Display-List finden
20 POKE DLIST+15,130:REM
Einfügen der Interrupt-Anweisung
30 FOR I=O TO 19:REM
Schleife zum Einpoken der DLI-
40 READ A:POKE 1536+I,A:NEXT
I:REM Service-Routine
50 DATA 72,138,72,169,80,162,88
60 DATA 141,10,212,141,23,208
70 DATA 142,24,208,104,170,104,64
90 POKE 512,0:POKE
513,6:REM Setzen des Interrupt-Vektors
90 POKE 54286,192:REM
DLI einschalten
Dieses Programm benutzt
die folgende DLI-Service-Routine in Assembler:
PHA
Akkumulator sichern
TXA
PHA
X-Register sichern
LDA #$50
Dunkle Farbe für Zeichen
LDX #$58
Purpur
STA WSYNC Warten
STA COLPF1 Farbe
speichern
STX COLPF2 Farbe
speichern
PLA
TAX
Zurückspeichern der Register
PLA
RTI
Abschluß der Routine
Dieses
ist eine sehr einfache DLI-Routine. Sie ändert die Hintergrundfarbe von Blau
nach Purpur, sowie die Farbe der Buchstaben, so daß diese dunkler vor dem hellen
Hintergrund angezeigt werden. Es ist vielleicht verwunderlich, daß die obere
Hälfte des Bildschirmes weiterhin die blaue Farbe behält, obwohl die DLI-Rautine
andauernd Purpur in das Farbregister schiebt. Die Antwort hierauf liegt in der Vertical-Blank-Routine
des OS, die während des Vertical-Blanks immer wieder den blauen Farbwert in
das Farbregister schreibt. Das Blau wird von der Schattenadresse dieses Farbregisters
geliefert. Jedes Hardware-Farbregister besitzt eine Schattenadresse an einer festgelegten
RAM-Speicherstelle. Diese Adressen liegen bei dezimal 708 bis 712. In den meisten
Fällen werden die Farben geändert, indem die neuen Werte in diese Register
geschrieben werden. Wenn direkt in die Hardware-Register geschrieben wird, "wischt"
das OS die neuen Werte durch den ‹bertragungsprozeß innerhalb einer 50stel
Sekunde wieder aus dem Register. Bei DLIs muß der neue Farbwert allerdings
direkt in die Hardware-Register geladen werden. Ein DLI kann nicht, verwendet werden,
um die Farbe der ersten Scan-Line zu ändern; das OS übernimmt deren Farbgebung.
DLIs sind also nur für die nachfolgenden Zeilen anwendbar.
Durch
das direkte Speichern von Farbwerten in die Hardware-Register wird ein neues Problem
hervorgerufen: der "Attract-Modus" des Gerätes wird außer Kraft
gesetzt. Dieser Modus ist eine Einrichtung, die durch das OS gesteuert wird. Wird
neun Minuten lang keine Taste des Computers gedrückt, so beginnt das System
die Bildschirmfarben durch zufällige Werte auf geringeren Helligkeitsstufen
laufen zu lassen. Dieses garantiert, daß der mehrere Stunden nicht bediente
Computer kein Bild in die Mattscheibe brennt. Es ist sehr einfach, einen solchen
Modus in einen DLI einzufügen. Es müßen lediglich zwei neue Zeilen
in das Assemblerprogramm eingeschoben werden:
Alt
Neu
LDA NEWCOL LDA
NEWCOL
STA WSYNC EOR
COLRSH
STA COLPF2 AND
DRKMSK
STA WSYNC
STA COLPF2
DRKMSK und COLRSH sind Zero-Page-Adressen ($4E und $4F), die während des Vertical-Blank-Interrupts vom OS auf den neuesten Stand gebracht werden. Wird der Attract-Modus außer Kraft gesetzt, nehmen die Register COLRSH und DRKMSK die Werte $00 bzw. $FF an. Ist der Attract-Modus aktiviert, dann erhält COLRSH alle 4 Sekunden einen neuen Zufallswert, wogegen DRKMSK den Wert $F6 enthält. Das bedeutet, COLRSH bestimmt die Farbe und DRKMSK "maskiert" das höchste Helligkeits-Bit "aus".
Die
Einfügung des Attract-Modus in einen DLI ist allerdings ein Problem: die Ausführungszeit
eines DLIs wird erhöht. Dieses Problem wird vielleicht durch die Beschreibung
des DLI-Timings deutlicher. Die Ausführung eines DLIs läßt sich in
drei Phasen auf teilen: Phase Eins reicht vom Beginn des DLIs bis zur STA WSYNC-Anweisung.
Während dieses Zeitraumes zeichnet der Elektronenstrahl die letzte Scan-Line
der unterbrechenden Mode-Line. Phase Zwei ist die Periode vom STA WSYNC-Befehl bis
zum Auftauchen des Strahls auf dem Bildschirm. Diese Phase gehört zum Horizontal-Blank;
alle Graphik-ƒnderungen sollten während dieser Periode ausgeführt werden.
Phase Drei umfaßt den Zeitraum vom Auftauchen des Elektronenstrahls auf dem
Schirm bis zum Ende der DLI-Service-Routine. Das Timing dieser Phase ist nicht als
kritisch zu bezeichnen.
Eine
Horizontal-Scan-Line benötigt 114 Taktzyklen. Ein DLI erreicht den 6502 ungefähr
beim 15. Zyklus. Der 6502 benötigt nun weitere 7 Zyklen, um auf den Interrupt
zu reagieren. Die OS-Routine zum Bearbeiten des Interrupts, sowie deren Sprung zur
DLI-Service-Routine verbraucht 11 Maschinenzyklen. Dieses bedeutet, die Service-Routine
wird nicht vor Verstreichen von 33 Taktzyklen erreicht. Außerdem muß
mit der STA WSYNC-Anweisung beim 103. Zyklus begonnen werden; dieses reduziert die
in Phase Eins verfügbare Zeit um weitere 11 Zyklen. Schließlich gehen
dem 6502 noch weitere Zyklen durch den DMA vom ANTIC-Prozessor verloren. Dieses läßt
maximal 61 Zyklen für die erste Phase zu; dieses Maximum wird allerdings nur
mit Blank-Line-Mode-Lines erreicht. Zeichen- und Map-Modus-Befehle resultieren in
dem Verlust eines Zyklus¥ für jedes Datenbyte der Anzeige. Im ungünstigsten
Fall sind dieses die BASIC-Modi 0,7 oder 8, die jeweils 40 Bytes pro Zeile verbrauchen.
In solchen Modi sind lediglich 21 Maschinenzyklen für Phase Eins vorhanden.
Das bedeutet, die Routine, die in Phase Eins abgearbeitet werden soll, besitzt eine
Ausführungszeit von 21 bis 61 Maschinenzyklen.
Phase
Zwei erstreckt sich über 24 Taktzyklen und ist die kritische Periode eines DLIs.
Ebenso wie bei Phase Eins gehen einige Zyklen durch den DMA ANTICs verloren. Player-Missile-Graphiken
verbrauchen 5 Zyklen, sofern sie benutzt werden. Die Anzeige-Anweisung kostet einen
Zyklus; ist es eine LMS-Anweisung, so gehen zwei weitere Zyklen verloren. Schließlich
werden noch ein oder zwei Taktzyklen durch die Speicherauffrischung oder durch das
Einholen von Daten verbraucht. Das heißt für Phase Zwei sind 14 bis 23
Maschinenzyklen verfügbar.
Das
Timing-Problem bei DLIs wird nun offensichtlich. Um eine einzelne Farbe laden, ändern
und speichern zu können, werden 14 Zyklen benötigt. Das Sichern des A-,
X- und Y-Registers auf den Stapel, sowie das Laden der 3 Farben in diese Register
und deren abschließendes Abspeichern verbraucht 47 Zyklen, was den größten,
wenn nicht sogar ganzen Teil von Phase Eins ausmacht. Der Programmierer, der DLIs
für ausgedehnte Graphik-ƒnderungen benutzt, muß das Timing derselben genau
beachten. Glücklicherweise muß der angehende Programmierer sich nicht
den Kopf über Timing-Berechnungen zerbrechen, da das Zählen der Zyklen
und eine Geschwindigkeits-Optimierung bei einfachen Graphik-Operationen überflüssig
ist. Diese Berücksichtigungen sind nur in Situationen erforderlich, bei denen
eine hohe Leistung gewünscht wird.
Es
gibt keine Vereinfachungen für den Programmierer, der mehr als drei Farbregister
in einem einzigen DLI ändern will. Es mag möglich sein, eine vierte Farbe
während der dritten Phase zu ändern, sofern diese nicht am linken Bildschirmrand
angezeigt wird. Entsprechend kann eine Farbe, die nicht am rechten Rand erscheint,
während der ersten Phase nicht geändert werden. Eine andere Möglichkeit
wäre, den überaktiven DLI in zwei weniger beschäftigte DLIs aufzuspalten,
die jeweils die Hälfte der Arbeit des ursprünglichen ausführen. Der
zweite DLI könnte durch Einfügen einer einzigen Scan-Line-Blank-Line-Anweisung
(deren DLI-Bit gesetzt ist), plaziert werden, die direkt unter die unterbrechende
Mode-Line in die Display-List eingefügt wird. Hierdurch wird natürlich
ein kleiner Bereich des Bildschirmes verbraucht.
Eine
andere Teillösung wäre, die Berechnungen für den Attract-Modus während
des Vertical-Blanks durchzuführen. Hierfür müßten zwei Farbtafeln
im RAM gespeichert werden: die erste Tafel enthält die Farbwerte, die durch
die DLI-Routinen angezeigt werden sollen; die zweite beinhaltet die Attract-Werte
der ersten. Während des Vertical-Blanks holt dann eine vom Benutzer geschriebene
Routine die Farben aus der ersten Tafel, wandelt sie um und speichert diese Attract-Farben
in der zweiten Tafel. Die DLI-Routine nimmt dann die Werte direkt aus der zweiten
Tafel, ohne daß dabei Zeit für das Umwandeln der Attract-Farben verloren
geht.
Vielfach wird der Einsatz von mehreren DLIs gewünscht, die an verschiedenen senkrechten Bildschirmpositionen auftreten. Dieses ist eine wichtige Möglichkeit, um mehr Farbe auf den Bildschirm zu bringen. Es gibt aber nur einen DLI-Vektor; sollen mehrere DLIs eingesetzt werden, dann muß die Vektorenänderung mit in die DLI-Routine eingebracht werden. Es gibt verschiedene Wege, um dieses zu tun. Falls die DLI-Routine jedesmal den gleichen Arbeitsgang nur mit anderen Farben ausführt, kann sie über eine Speichertafel gesteuert werden. Jedesmal, wenn die DLI-Routine angesteuert wird, wird ein Zähler inkrementiert und als Index für die zu benutzende Tafel verwendet. Das folgende Programm ist ein, Beispiel für diese Idee:
PHA
TXA
PHA
INC COUNTR
LDX COUNTR
LDA COLTAB,X Page $F0 wird als
Farbtafel benutzt
STA WSYNC Warten
STA COLBAK
CPX #$4F
Letzte Zeile
BNE ENDDLI Nein
- DLI beenden
LDA #$00
Ja - Zähler zurücksetzen
STA COUNTR
ENDDLI
PLA
TAX
PLA
Akkumulator zurückspeichern
RTI
Das BASIC-Programm
zum Aufrufen dieser Routine sieht wie folgt aus:
10
GRAPHICS 7
20
DLIST=PEEK(560)+256*PEEK(561):REM Display-List finden
30
FOR J=6 TO 84:REM In jede Mode-Line ein DLI einfügen
40
POKE DLIST+J,141:REM BASIC-Modus 7 mit gesetztem DLI-Bit
50
NEXT J
60
FOR J=0 TO 30
70
READ A:POKE 1536+J,A:NEXT J:REM Laden der Service-Routine
in
Page 6
80
DATA 72,138,72,238,32,6,175,32,6
90
DATA 189,0,240,141,10,212,141,26,208
100
DATA 224,79,208,5,169,0
110
DATA 141,32,6,104,170,104,64
120
POKE 512,0:POKE 513,6:REM Vektor zur Service-Routine
130
POKE 54286,192:REM DLI einschalten
Dieses Programm bringt
80 verschiedene Farben auf den Schirm.
Es
gibt noch eine andere Möglichkeit, um mehr DLIs einzusetzen. Einerseits könnte
ein DLI-Zähler zum Verzweigen zu den Service-Routinen benutzt werden. Dieses
verlangsamt allerdings die "Reaktion" der DLI-Routine; besonders die der
am Ende der Abfrage liegenden Routine. Eine andere Möglichkeit wäre, daß
jede DLI-Routine die Adresse der DLI-Vektoren bei $200 und $201 schreibt. Es ist
die beliebteste Methode beim Einsetzen mehrerer DLIs. Sie hat außerdem den
Vorteil, daß die Vektor-Logik nach anstatt vor der kritischen Zeitphase ausgeführt
wird.
Die
Routine für das Klicken der Tastatur wird mit der Funktion eines DLIs zwischengeschaltet.
Bei jedem Tastendruck ertönt aus dem internen Lautsprecher ein Klicken, sofern
dieser Druck anerkannt wurde. Das Timing für dieses Geräusch wird durch
mehrere STA WSYNC-Anweisungen geliefert. Hierdurch kann allerdings das Timing einer
DLI-Routine gestört worden, die Bildschirmfarben rutschen für den Bruchteil
einer Sekunde eine Scan Line nach unten. Es gibt allerdings keine einfache Lösung
dieses Problems. Eine Möglichkeit bezieht sich auf das VCOUNT-Register. Es ist
ein Nur-Lese-Register im ANTIC-Chip, das ANTIC mitteilt, welche Zeile dieser augenblicklich
anzeigt. Eine DLI-Routine könnte dieses vorgenannte Register überprüfen
und entscheiden, ob eine Farbe zu ändern ist.
Eine
andere Lösung wäre das Abschalten der OS-Routine und das Einsetzen einer
eigenen Routine, was allerdings eine komplizierte Aufgabe ist. (Die brutalste Lösung
wäre die Verweigerung sämtlicher Tastatureingaben. Werden keine Tastendrucke
anerkannt so kann auf dem Bildschirm auch kein Zittern auftreten.)
Der
DLI wurde entworfen, um eine primitive Software/Hardware-Technik zu ersetzen, welche
als "Kernel" bezeichnet wird. Ein Kernel ist eine Programmschleife des
6502-Prozessors, die präzise zum Anzeige-Zyklus des Fernsehgerätes synchronisiert
ist. Durch ‹berwachung des VCOUNT-Registers und Konsultieren einer Tafel, in welcher
Bildschirm-ƒnderungen als eine Funktion von VCOUNT-Werten katalogisiert sind, kann
der 6502 eigenmächtig alle Graphikwerte des gesamten Schirmes kontrollieren.
Für
diese Leistungsfähigkeit wird allerdings ein hoher Preis bezahlt: der 6502 kann
während der Bildschirm-Anzeige Periode nicht mehr für Berechnungen benutzt
werden, was einen Zeitraum von ungefähr 75% der gesamten Prozessorzeit ausmacht.
Außerdem darf keine Berechnung größer als ca. 4000 Maschinenzyklen
sein, die während des Vertical Blanks und der Overscanzeit zur Verfügung
stehen. Das heißt, Kernel können nur in Programmen benutzt werden, die
wenig Berechnungen erfordern, wie es bei einigen Telespielen der Fall ist. Das "BASKETBALL
"TM""-Programm auf dem ATARI Computer benutzt z.B. die Kerneltechnik;
das Spiel benötigt wenig Berechnungen, aber viel Farbe. Die mehrfarbigen Player
dieses Programms könnten nicht mit DLIs erzeugt werden, da diese auf vertikale
Bildschirm- anstatt auf Playerpositionen bezogen werden.
Es
ist möglich, die Kernel-Idee soweit zu erweitern, daß sie nur auf einzelne
Scan-Lines angewandt wird. Auf diese Weise kann ein einzelnes Farbregister in einer
Scan-Line mehrere Farben erzeugen. Die waagerechte Position des Farbwechsels wird
durch die Zeit bestimmt, die bis zur Farbänderung vergeht. Das heißt,
durch sorgfältiges Abzählen von Maschinenzyklen kann der Programmierer
mehr Farbe auf den Bildschirm bringen.
Unglücklicherweise
ist dieses in der Praxis sehr schwer durchführbar. Durch ANTICs DMA ist es schwierig
zu bestimmen, wieviel Zyklen in Wirklichkeit verstreichen; ein einfaches Zählen
der 6502-Zyklen reicht hierbei nicht aus. Wenn der DMA ANTICs abgeschaltet wird,
kann der 6502 zwar die volle Kontrolle über die Anzeige übernehmen, muß
aber zusätzlich alle Arbeit verrichten, die der ANTIC-Prozessor sonst durchführt.
Aus diesem Grunde sind waagerechte Kernels sehr selten den Aufwand wert, den sie
erfordern. Natürlich wäre diese Technik durchführbar, wenn zwei Bilder,
die verschiedene Farben besitzen sollen, einen einigermaßen großen Abstand
zueinander haben. Hierdurch muß das Timing nicht so genau abgestimmt sein.
Der
ungeheure Wert der indirekten Graphik-Adressierung und aller Register wird nun offensichtlich.
Mit Hilfe von Display-List-Interrupts können diese Register "im Vorbeigehen"
geändert werden. Deshalb ist es möglich mehr Farbe, bessere Graphik oder
spezielle Effekte auf den Bildschirm zu bringen. Die offensichtlichste Verbesserung
ist die Erzeugung von vielfarbigen Displays. Jedes Farbregister kann so oft geändert
werden, wie DLIs vorhanden sind. Das gilt natürlich sowohl für Playfield-
als auch für Player-Missile-Farbregister, von denen Jedes 128 Farben speichern
kann.
Natürlich
können die hierdurch gegebenen Möglichkeiten nicht mit jedem Programm voll
ausgenutzt werden. Zu viele DLIs beeinflussen die Programmgeschwindigkeit. In der
Praxis bedeutet dieses: ein Dutzend Farben sind einfach einzubringen, zwei Dutzend
Farben erfordern eine genaue Planung, und noch mehr Farben schon von vornherein sehr
günstige Umstände.
DLIs
können allerdings nicht nur benutzt werden, um mehr Farben auf den Bildschirm
zu bringen, mit ihnen kann auch die Leistungsfähigkeit von Player-Missile-Graphiken
gesteigert werden. Die waagerechte Position eines Players kann mit Hilfe eine DLIs
geändert werden. Auf diese Weise kann ein Player auf dem Bildschirm etwas tiefer
ein zweites, drittes oder viertes Mal erscheinen. Ein einzelner Player kann verschiedene
Figuren auf dem Bildschirm darstellen. Wenn man sich einen Player als einen senkrechten
Papierstreifen vorstellt, auf dem sich Bilder befinden, dann wäre der DLI eine
Schere, mit der dieser Streifen in mehrere Teile zerschnitten wird, die dann neu
positioniert werden. Hierbei können natürlich nicht zwei Teile eines Players
auf der gleichen Zeile stehen. Wird ein Display aufgebaut, daß Graphik-Objekte
benötigt, die sich niemals auf den gleichen Zeilen befinden, kann hierfür
ein einziger Player benutzt werden.
Eine andere Art DLIs
in Verbindung mit Playern zu verwenden wäre, ihre Breite oder Priorität
zu ändern. Dieses geschieht meistens mit dem Maskierungs-Trick, der in Kapitel
4 beschrieben wurde.
Die
letzte Anwendung von DLIs betrift das ƒndern von Zeichensätzen mit zunehmender
Zahl der Bildschirmzeilen. Dieses ermöglicht einem Programm die Verwendung von
Zeichengraphiken innerhalb eines großen und normalen Textes innerhalb eines
kleinen Fensters. Ein Programm könnte also einen Graphik-Satz im oberen Bildschirmrand,
einen Großschrift-Satz in der Bildschirmmitte und normalen Text am unteren
Rand ausgeben. Außerdem könnte das Reflektions-Bit mit einer DLI-Routine
geändert werden, was besonders für schon angesprochene Kartenspiele von
Nutzen ist.
Die
einwandfreie Benutzung eines DLIs erfordert sorgfältiges Anlegen des Displays,
bei welcher der Programmierer die senkrechte Architektur der Bildschirmaufteilung
in Erwägung ziehen muß. Das Raster-Scan-Fernseh-System ist nicht zweidimensional
symetrisch; es besitzt aufgrund der Geschwindigkeitsverhältnisse beim Zeichnen
des Schirmes eine mehr in senkrechte Richtung orientierte Struktur. Das waagerechte
Zeichnen läuft ungefähr 200 mal schneller ab als das senkrechte. Das Display
System des ATARI Computers wurde speziell für dieses Raster-Scan-System entwarfen,
daher spiegelt sich dessen Struktur in der Technik dem Computers wieder. Das ATARI™-Display
ist kein flaches, leeres Blatt, auf welchem gezeichnet wird; es ist ein Stapel von
dünnen Streifen, von denen jeder andere Werte annehmen kann. Der Programmierer,
der auf einem speziellen Display besteht, schlägt viele Möglichkeiten aus.
Optimale Resultate werden erzielt, wenn die anzuzeigende Information in einer streng
senkrechten Struktur angelegt wird. Dieses erlaubt die Entfaltung der vollen Leistungsfähigkeit
von DLIs.
Abbildung 5.1 zeigt einige Bildschirme verschiedener Programme und gibt die relative Menge der verwendeten DLIs an.
Missile Command Star Raiders
---einige--- ---wenige---
Space Invaders Scram
---sehr viele--- ---wenige---
Abbildung 5.1.
Beispiele senkrechter Bildschirmarchitektur