----------------------------------------------------
Kapitel
2
ANTIC
und die Display List
----------------------------------------------------
FERNSEH-BILDSCHIRME
Um
die Graphik-Möglichkeiten des ATARI™ Personal Computer Systems ganz zu begreifen,
muß man erst die Funktionsgrundlagen eines Fernsehgerätes verstehen. Fernseher
bedienen sich eines Systems, das als "Raster Scan Display" (Raster Bildschirm-Anzeige)
bezeichnet wird. Am hinteren Ende der Fernsehröhre wird ein Elektronenstrahl
erzeugt, der dann auf die Mattscheibe geworfen wird. Dabei wird er von waagerecht
und senkrecht angebrachten Magnetspulen abgelenkt, sofern diese unter Spannung stehen.
Auf diese Weise kann der Strahl auf jeden Punkt des Schirms geworfen werden. Durch
die im Fernseher befindliche Elektronik wird diese Ablenkung so gesteuert, dazu sich
der Strahl mit gleichmäFiger Geschwindigkeit über die Mattscheibe bewegt.
Weiterhin kann die Stärke, d.h. die Intensität das Strahls gesteuert werden.
Wird der Strahl intensiver, so leuchtet der getroffene Punkt auf dem Schirm heller;
wird der Strahl schwächer, dann leuchtet der Punkt weniger stark oder überhaupt
nicht mehr.
Der
Strahl startet in der linken oberen Ecke des Schirmes und bewegt sich waagerecht
über denselben. Während dieses Vorgangs wird durch Intensitätsänderung
des Strahls ein Bild auf den Fernsehschirm gezeichnet. Sobald der Strahl den rechten
Bildschirmrand erreicht, wird er abgeschaltet und zurück zur linken Seite gebracht.
Gleichzeitig wird er um eine Elektronenstrahldicke nach unten bewegt. Danach wird
er wieder eingeschaltet und läuft ein weiteres Mal über den Schirm. Dieser
Vorgang wird insgesamt 312 mal wiederholt. (Bei einem "abwechselnden" System
gibt es in Wahrheit 625 Bewegungen über den Fernsehschirm, was als "Interlace"
bezeichnet wird. Wir wollen dieses Interlace ignorieren und vorgehen, als ob der
Fernseher nur 312 Zeilen hätte.) Diese 312 Zeilen füllen den Bildschirm
von oben bis unten aus. Am unteren Ende des Schirmes wird der Strahl (nachdem die
312te Zeile gezeichnet wurde) ausgeschaltet und wieder in die linke obere Bildschirmecke
gebracht. Dann beginnt der gesamte ProzeF von vorne. Dieser Zyklus wiederholt sich
50mal in einer Sekunde.
Das
Ganze jetzt noch einmal in Fachsprache: eine einzelne Bewegung des Elektronenstrahls
quer über den Bildschirm bezeichnet man als “Horizontal Scan Line". Sie
ist die grundlegende Einheit beim Messen von senkrechten Entfernungen auf dem Schirm.
Die Höhe eines Bildes wird festgelegt, indem man die Anzahl der Horizontal Scan
Lines, über die es sich erstreckt, angibt. Die Periode, in welcher der Elektronenstrahl
vom rechten zum linken Bildschirmrand zurückläuft, wird "Horizontal
Blank'' genannt. Der Zeitraum, in welchem der Strahl zum oberen Mattscheibenrand
zurückkehrt, wird als “Vertical Blank" bezeichnet. Der Zeichenvorgang für
den gesamten Bildschirm dauert 16684 Mikrosekunden. Der “Vertical Blank" erstreckt
sich über ca. 1400 Mikrosekunden. Der Horizontal Blank benötigt 14 Mikrosekunden.
Eine einzelne Horizontal Scan Line braucht 64 Mikrosekunden, um gezeichnet zu werden.
Die
meisten Fernsehgeräte besitzten einen “Overscan", das bedeutet, sie ziehen
die Bilder soweit auseinander, daß sich deren Ränder auFerhalb des Mattscheibenrandes
befinden. Dieses garantiert ein Fernsehbild ohne störende Randbalken. Andererseits
ist dies für Computer sehr ungünstig, da die Information, die sich auFerhalb
des Schirmes befindet, für den Benutzer keine Bedeutung mehr hat und somit verlorengeht.
Aus diesem Grunde ist das Bild, welches der Computer ausgibt, etwas kleiner als jenes,
das der Fernseher theoretisch anzeigen könnte. Es werden nur 192 Horizontal
Scan Lines von ATARI ™-Display benutzt. Dies bedeutet, daß die normale Begrenzung
der senkrechten Auflösung eines Fernsehers in Verbindung mit diesem Computer
192 Pixel beträgt.
Die
standardmäFige Einheit für horizontale Entfernungen ist das “Color Clock".
Die Breite eines Bildes wird festgelegt, indem man die Anzahl der Color Clocks, über
die es sich erstreckt, angibt. Es gibt 228 Color Clocks in einer Horizontal Scan
Line, von denen allerdings maximal nur 176 wirklich sichtbar sind. Dieses bedeutet
wiederum, daß die absolute Begrenzung für vollfarbige waagerechte Auflösung
mit einem handelsüblichen Fernseher 176 Pixel beträgt. Mit dem ATARI ™
Personal Computer System ist es möglich, noch weiter zu gehen und individuelle
Halb-Clocks zu kontrollieren. Dieses ergibt dann eine waagerechte Auflösung
von 352 Pixeln.
COMPUTER
UND FERNSEHGERƒTE
Das
grundsätzliche Problem eines Computers mit einem Raster Scan Fernseh-System
für Anzeigezwecke ist, daß die Erzeugung des Fernsehbildes ein dynamischer
Vorgang ist; der Fernseher kann sich nicht an das Bild erinnern. Folglich fällt
diese Aufgabe dem Computer zu. Er muß ständig ein Signal zum Fernseher
senden, das diesem mitteilt, was er anzeigen soll. Dieser Sendevorgang ist ein ununterbrochener
ProzeF und erfordert daher andauernde Beachtung. Aus diesem Grunde haben die meisten
Mikrocomputer spezielle Hardware, um den Fernseher zu bedienen. Die Grundanordnung
ist auf fast allen Systemen die gleiche:
Mikroprozessor
- Bildschirm-RAM - Video-Hardware - TV-Schirm
Der
Mikroprozessor schreibt Informationen in den Bereich des Bildschirm-RAMs, der die
Bilddaten beinhaltet. Die Video-Hardware greift nun andauernd in diesen Bereich,
um die Daten zu erhalten, die sie dann in Fernsehsignale umwandelt. Diese Signale
gehen zum Fernsehgerät, das diese schlieFlich als Information anzeigt. Der Bildschirmspeicher
wird in der gleichen Reihenfolge auf den Schirm geworfen, wie die Daten im RAM stehen.
Das bedeutet, das erste Byte im Speicher gehört zur linken oberen Ecke des Bildschirms,
das zweite Byte im Speicher zur rechts daneben liegenden Position und so fort, bis
zum letzten Byte, welches zur rechten unteren Ecke der Mattscheibe gehört.
Die
Qualität des Bildes, das zum Fernseher gelangt, hängt von zwei Faktoren
ab: der Qualität der Video-Hardware und der GröFe des Bildschirm-RAMs,
welches für das Display benutzt wird. Die einfachste Anordnung findet sich bei
TRS-80 und PET (TRS-80 ist ein Warenzeichen der Radio Shack Co.; PET ist ein Warenzeichen
der Commodore Business Machines). Diese beiden Geräte benutzen einen festgelegten
1K-Bereich des RAMs als Bildschirmspeicher, Die Video-Hardware holt einfach Daten
aus diesem Bereich und interpretiert sie mit Hilfe eines Zeichensatzes im ROM als
Zeichen, was eine Anzahl von 256 verschiedenen Zeichen erlaubt. Mit einem Bildschirm-RAM
von 1K können ca. 1000 Zeichen auf den Schirm gebracht werden. Mit so einem
System gibt es allerdings nicht viele Möglichkeiten. Der Apple benutzt ausgefeiltere
Video-Hardware (Apple ist ein Warenzeichen der Apple Computers). Es sind drei verschiedene
Graphik-Modi vorhanden: Text, Lo(w)-Res(olution)-Graphik und Hi(gh)-Res(uolution)-Graphik.
Der Text-Modus funktioniert etwa auf die gleiche Art, wie das Anzeige-System von
PET und TRS-80.
Im
Lo-Res-Graphik-Modus greift die Video-Hardware auf den Bildschirmspeicher zu und
interpretiert ihn folgendermaFen: anstatt ein Byte als ein Zeichen darzustellen,
wird jedes Byte in ein Paar von Farb-Nybbles (Halbbytes) aufgeteilt. Der Wert eines
jeden Nybbles im Speicher legt die Farbe eines Pixels (Bildschirmpunktes) fest. Im
Hi-Res-Graphik-Modus entspricht jedes Speicher-Bit einem Pixel auf dem Schirm. Enthält
das Bit eine 1, dann leuchtet das entsprechende Pixel; enthält es eine 0, dann
leuchtet es nicht. Hierdurch ergibt sich eine Vielzahl von Farbnuancen, welches aber
die Grundidee ist. Die entscheidende Tatsache ist, daß der Apple drei Anzeige-Modi
besitzt; drei unterschiedliche Arten die Daten im Bildschirmspeicher zu interpretieren.
Die Apple-Hardware für den Bildschirm kann ein Byte des Speichers als 8-Bit
Zeichen (Text-Modus), als zwei 4-Bit Farb-Nybbles (Lo-Res-Modus) oder als 7 individuelle
Bits für Bit-Map (Hi-Res-Modus) auslegen.
ANTIC,
EIN VIDEO-MIKROPROZESSOR
Das
ATARI Computer Display List ist eine Erweiterung der oben genannten Systeme. Wo PET-
und TRS-80 Geräte einen, und der Apple drei verschiedene Modi besitzen, da hat
der ATARI ganze 14 Modi. Der zweite wichtige Unterschied ist, daß die Anzeige-Modi
auf dem Bildschirm gemischt werden können. Das bedeutet, daß der Benutzer
nicht gezwungen ist, sich zwischen einem Bildschirm voll Graphik oder einem Bildschirm
voll Text zu entscheiden. Der dritte grundlegende Unterschied ist, daß das
Bildschirm-RAM überall im Speicher des Computers abgelegt und sogar bewegt werden
kann, während das Programm läuft, wogegen andere Geräte festgelegte
RAM-Bereiche benutzen.
All
dieses wird durch einen Mikroprozessor, den ANTIC, möglich gemacht. Wo die früheren
Geräte sehr einfache Video-Schaltkreise benutzen, hat ATARI ™ einen ganzen Mikroprozessor
eingesetzt, der nur für das Fernsehbild zuständig ist. ANTIC ist ein wirklicher
Mikroprozessor, d.h. er besitzt einen Befehlssatz, ein Programm und Daten. Das Programm
für den ANTIC wird als Display List bezeichnet. Diese Display List legt drei
Dinge fest: wo die Bildschirmdaten zu finden sind, welche Anzeige-Modi benutzt werden
sollen um die Bildschirmdaten zu interpretieren, und welche speziellen Anzeige-Einstellungen
eingefügt werden sollen.
Beim
Benutzen der Display List muß man sich von der Vorstellung eines alten Bildschirmes
freimachen. Der Schirm ist kein gleichmässiges Bild in einem einzelnen Modus,
sondern ein "Stapel" von sogenannten "Mode-Lines". Eine solche
Mode-Line ist eine Zusammenstellung von Horizontal Scan Lines. Sie erstreckt sich
waagerecht über die ganze Bildschirmbreite. Eine Graphik-Modus 2 Mode-Line ist
16 Horizontal Scan Lines hoch, wogegen eine Graphik-Modus 7 Mode-Line nur zwei Scan-Lines
hoch ist. Viele Graphik-Modi, die in BASIC verfügbar sind, sind durchgehende
Modi, d.h. der gesamte Bildschirm besteht aus einem einzelnen Modus. Dies bedeutet
aber nicht, daß man darauf beschränkt ist: mit der Display List ist es
möglich, jede Folge von Mode-Lines auf dem Schirm zu erzeugen. Die Display List
ist eine Zusammenstellung von Code-Bytes, die diese Abfolge festlegen.
ANTICs
Befehlssatz ist sehr einfach. Es gibt vier Befehlsklassen: Map-Mode-Befehle, Charakter-Mode-
(Zeichen-Modus) Befehle , Blank-Line- (Leerzeilen) Befehle und Sprunganweisungen.
Map-Mode-Befehle veranlassen, daß ANTIC eine Mode-Line mit einfach gefärbten
Pixeln anzeigt. Charakter-Mode-Befehle veranlassen ANTIC eine Mode-Line mit Zeichen
anzuzeigen. Blank-Line-Befehle bewirken, daß ANTIC eine bestimmte Anzahl von
Horizontal Scan Lines mit fester Hintergrundfarbe ausgibt.
Sprunganweisungen
entsprechen den 6502-Sprungbefehlen: sie laden den Programmzähler von ANTIC
neu. Es können auFerdem vier spezielle Einstellungen festgelegt werden, indem
ein bestimmtes Bit des Befehls für ANTIC gesetzt wird. Die Operationen sind:
Display-List-Interrupt
(DLI), Load-Memory-Scan (LMS), sowie senkrechtes und waagerechtes Scrolling.
Map-Modus-Befehle
veranlassen ANTIC eine Mode-Line zu zeigen die Pixel mit festen Farben enthält.
Die angezeigte Farbe wird durch ein Farbregister festgelegt. Die Wahl zwischen den
einzelnen Farbregistern wird durch den Wert der Bildschirmdaten bestimmt. In 4-Farb-Map-Modi
(BASIC-Modi 3, 5, 7 und 15; ANTIC-Modi 8, A, D und E) wird ein Bitpaar benötigt,
um eine Farbe festzulegen.
Wert des Bitpaares
ausgewähltes Farbregister
00 = 0
COLBAK
01 = 1
COLPFO
10 = 2
COLPF1
11 = 3
COLPF2
Da
nur zwei Bits zur Festlegung eines Pixels gebraucht werden, sind in jedem Bildschirm-Datenbyte
4 Pixel codiert. Beispiel: ein Byte der Bildschirm-Daten enthält den Wert $1B.
Es würde 4 Pixel in den folgenden Farben anzeigen: das erste in Hintergrundfarbe,
das zweite nach Farbregister 0, das dritte nach Farbregister 1 und das vierte nach
Farbregister 2:
$1B = 00011011 = 00 01 10 11
In
2-Farb-Map-Modi (BASIC-Modi 4, 6, 14, und 8; ANTIC-Modi 9, B, C und F) wählt
jedes Bit eines von zwei Farbregistern aus. Ein Bit-Wert von 0 bedeutet Hintergrundfarbe
für das entsprechende Pixel, ein Bit-Wert von 1 wählt Farbregister 0 für
das Pixel aus.
Es
gibt acht unterschiedliche Map-Anzeige-Modi. Sie differieren in der Anzahl der Farben,
die sie anzeigen (2 oder 4), der senkrechten GröFe einer Mode-Line (1, 2, 4
oder 8 Scan-Lines) und in der Anzahl der Pixel, die waagerecht in eine Mode-Line
paFen (40, 80, 160 oder 320). Das bedeutet, einige Map-Modi geben eine bessere Auflösung,
benötigen dann aber entsprechend mehr RAM. In Abbildung 2.1 werden die verschiedenen
Modi mit den zugehörigen Werten gezeigt:
ANTIC-
BASIC- Far-
Scan Lines/ Pixel/
Bytes/ Bytes/
Modus
Modus ben
Mod Line Mode Line
Zeile Schirm
2
0
2 8
40
40
960
3
--- 2
10
40
40
760
4
12
4 8
40
40
960
5
13
4 16
40
40
480
6
1
5 8
20
20
480
7
2
5 16
20
20
240
8
3
4 8
40
10
240
9
4
2 4
80
10
480
A
5
4 4
80
20
960
B
6
2 2
160 20
1920
C
14
2 1
160 20
3840
D
7
4 2
160 40
3840
E
15
4 1
160 40
7680
F
8
2 1
320 40
7680
Abbildung 2.1:
Charakter-Mode-Befehle
bewirken, daß ANTIC eine mit Zeichen gefüllte Mode-Line anzeigt. Jedes
Byte im RAM legt ein Zeichen fest. Es gibt 6 Zeichen Charakter-Anzeige-Modi. Zeichen-Displays
werden in Kapitel 3 besprochen.
Blank-Line-Befehle
erzeugen Leerzeilen mit fester Hintergrundfarbe. Es gibt 8 verschiedene Blank-Line
Instruktionen; sie legen das Anzeigen von einer bis acht Leerzeilen (Scan-Lines)
fest.
Es
gibt zwei Sprungbefehle. Der erste (JMP) ist ein direkter Sprung; er lädt den
Programmzähler von ANTIC mit der neuen Adresse, die der JMP-Anweisung als Operand
folgt. Seine einzige Funktion ist es, eine Lösung zu einem ansonsten schwierigen
Problem zu liefern: ANTICs Programmzähler besitzt nur 10 Zähler-Bits; die
6 restlichen Bits werden anderweitig benutzt. Daher kann die Display List eine 1K-Grenze
normalerweise nicht überschreiten. Wenn es aber notwendig ist, eine solche Grenze
zu übergehen, muß eine JMP-Instruktion verwendet werden. Dieses bedeutet,
daß die Display List nicht voll “relocatable" (frei verschiebbar) ist.
Der
zweite Sprung-Befehl (JVB) wird normalerweise benutzt. Er lädt den Programmzähler
mit dem Wert des 0peranden und wartet auf die Ausführung eines Vertical Blanks
durch den Fernseher. Diese Anweisung wird normalerweise verwendet, um eine Display
Liest abzuschlieFen, indem zu deren Anfang zurückgesprungen wird. Durch diesen
Sprung zum Anfang entsteht eine Endlos-Schleife; durch das Warten auf den Vertical
Blank wird die Schleife mit der Bildfrequenz des Fernsehers synchronisiert. Sowohl
der JMP-, als auch der JVB-Befehl sind 3-Byte-Anweisungen: das erste Byte ist der
Opcode, das zweite und dritte Byte bilden den Operanden = anzuspringende Adresse
(nieder-, danach höherwertig).
Die
oben genannten 4 speziellen Einstellungen werden in den Kapiteln 5 und 6 erklärt.
Die Load Memory Scan (LMS) Instruktion benötigt eine einleitende Erklärung.
Diese Option wird gewählt, indem Bit 6 einer Map- oder Zeichenmodus-Anwendung
gesetzt wird. Wenn ANTIC au+ solch einen Befehl stöFt, wird sein Memory-Scan-Zähler
mit den nachfolgenden zwei Bytes neugeladen. Dieser Memory-Scan-Zähler teilt
ANTIC mit, wo sich das Bildschirm-RAM befindet. ANTIC beginnt dann damit, sich Anzeige-Daten
aus diesem Bereich zu holen. Der LMS-Befehl ist eine 3-Byte-Anweisung: ein Byte Opcode
gefolgt von zwei Bytes des Operanden.
In
einfachen Display Lists wird der LMS-Befehl nur einmal verwendet; dieses geschieht
am Anfang der Liste. Manchmal aber wird es notwendig eine zweite LMS-Anweisung anzubringen.
Dieses tritt z. B. dann auf, wenn der Bildschirm-RAM eine 4K-Grenze überschreitet.
Der Memory-Scan-Zähler nutzt nur 12 Bits und läFt 4 Bits unberücksichtigt;
d. h. die Anzeigedaten können eine 4K-Grenze nicht überqueren. In diesem
Falle muß eine neue LMS-Anweisung benutzt werden, um über die 4K-Grenze
zu springen. Weiterhin bedeutet dieses, daß die Anzeigedaten nicht frei verschiebbar
sind. LMS-Anweisungen besitzen noch gröFere Anwendungsbereiche, die später
besprochen werden.
AUFSTELLEN
VON DISPLAY LISTEN
Jede
Display List sollte mit 3 "Blank-8-Lines"-Anweisungen beginnen. Dieses
ist notwendig, um den Overscan am Bidschirmrand zu umgehen, indem die gesamte Anzeige
24 Scan Lines tiefer anfängt. Danach wird die erste benutzte Zeile festgelegt,
wobei gleichzeitig die LMS-Anweisungen angebracht werden muß, um ANTIC den
Anfang des Bildschirmrandes mitzuteilen. Dann wird die Display List fortgesetzt,
welche die Anzeige-Bytes für die Mode-Lines auf dem Fernsehschirm auflistet.
Die Gesamtzahl der Horizontal-Scan-Lines sollte 192 nicht überschreiten, darf
aber darunter liegen. ANTIC berücksichtigt die Synchronisation für den
Bildschirm nicht. Wenn ANTIC zu viele Scan-Lines anzeigen soll, führt er dieses
zwar durch, doch das Bild kann anfangen zu laufen. Das Anzeigen von weniger als 192
Scan-Lines verursacht keinerlei Probleme; im Gegenteil, es erhöht die verfügbare
Zeit des 6502s, da weniger Zyklen von ANTIC verbraucht werden. Der Programmierer
muß also die Anzahl, der durch seine Display List angezeigten Horizontal-Scan-Lines
berechnen und überprüfen. Die Display List endet mit einer JVB-Anweisung.
Die folgende Abbildung zeigt eine Display List für BASIC Graphik-Modus 0 (alle
Werte sind in hexadezimaler Notation angegeben):
70 Blank-8-Line
70 Blank-8-Line
70 Blank-8-Line
42 ANTIC-Modus 2 (BASIC-Modus
0)+LMS
20 die Adresse des
Bildschirm-RAMs = $7C20
7C
02 ANTIC-Modus 2
02
02
02
02
02
02
02
02
02
02
02
02
02
02
02
02
02
02
02
02
02
02
41 Warte auf Vertical
Blank
EO und springe zum
Display List-Anfang
7B bei $7BEO.
Wie
man sehen kann, ist diese Display List nicht sehr lang nur 32 Bytes. Die meisten
Display Lists sind weniger als 100 Bytes lang. AuFerdem sind sie von der Struktur
her sehr einfach und leicht zu erstellen.
Um
eine eigene Display List zu schreiben und zu implementieren, muß das Anzeige-Format
entworfen werden. Dieses geschieht am besten auf einem Blatt Papier. Danach wird
das entworfene Bild in eine Folge von Mode-Lines übersetzt, wobei auf die Anzahl
der Scan-Lines des Displays geachtet werden muß (siehe Abbildung 2.1). Die
Folge der Mode-Lines wird dann in eine Folge von Mode-Bytes übertragen. An den
Anfang der Display List werden 3 Blank-8-Line Bytes ($70) gesetzt. Danach wird Bit
6 des ersten Display-List-Bytes gesetzt (d.h. das obere Nybble wird zu einer 4).
Dieses ergibt das Load-Memory-Scan-Kommando. Dann folgen zwei Bytes, welche die Adresse
des Bildschirm-RAMs festlegen (nieder-, dann höherwertig). Nun folgt der Rest
der Display-List. Am Ende der Display List muß die JVB-Anweisung ($41) und
die Anfangsadresse der Display List eingetragen werden. Wenn dieses erfolgt ist,
werden alle Bytes in¥s RAM gebracht. Dieses kann überall hin geschehen,
nur muß dabei darauf geachtet werden, daß sie nicht überlagern und
daß die JVB-Anweisung wirklich auf den Anfang der neuen Display Liest zeigt.
Die
Display List darf eine 1K-Grenze nicht überschreiten. Andernfalls muß
eine JMP-Anweisung genau vor dieser 1K-Grenze plaziert werden. Der Operand ist dann
die Adresse des ersten Bytes auf der anderen Seite der 1K-Grenze.
Als
nächstens muß ANTIC für den Bruchteil einer Sekunde ausgeschaltet
werden, damit der Display Listen-Zeiger neu eingespeichert werden kann. Dieses geschieht,
indem eine Null nach SDMCTL ($22F) geschrieben wird. Danach wird die Adresse der
neuen Display List in die Speicherstellen $230 und $231 (nieder-, dann höherwertig)
gespeichert. SchlieFlich wird ANTIC wieder angeschaltet, indem eine $22 nach SDMCTL
geschrieben wird. Während des Vertical Blanks, wo ANTIC inaktiv ist, lädt
das Betriebssystem ANTICs Programmzähler mit den neuen Werten.
MODIFIZIEREN
EINER NORMALEN DISPLAY LIST
Der
Bildschirmspeicher kann irgendwo im Adressbereich des Computers abgelegt werden.
Normalerweise legt die Display List den Anfang des Bildschirmspeichers mit der ersten
LMS-Anweisung fest. Natürlich kann ANTIC mit jeder neuen Zeile
der
Display List einen neuen LMS-Befehl ausführen. Auf diese Art können Informationen
aus jedem Bereich des Adressraumes des Computers auf einem Bildschirm zusammengebracht
werden. Dieses kann zum Erzeugen unabhängiger Textfenster von Wert sein.
Es
gibt allerdings ein paar Einschränkungen beim Plazieren des Bildschirmspeichers.
Erstens: der Bildschirmspeicher kann eine 4K-Grenze normalerweise nicht überschreiten.
Wird dieses aber doch nötig (wie z.B. bei BASIC-Modus 8, der 8K des Speichers
benötigt), muß der Memory-Scan-Zähler mit einer LMS-Anweisung neu
geladen werden. Zweitens: wenn die Bildschirm-Routinen des OS verwendet werden sollen,
muß den Regeln des OS Folge geleistet werden. Dieses kann manchmal sehr schwierig
sein; z.B. wenn eine geänderte Display List in einem BASIC-Programm benutzt
wird. Wird eine standardmäFige Display List mit einem Programm in BASIC geändert
und dann versucht, zu PLOTten oder zu PRINTen, dann führt das OS dieses unter
der Annahme aus, daß die Display Liest sich noch in ihrem originalen Zustand
befindet. Dieses kann zu einem unerwarteten Bild führen.
Es
gibt drei Wege, auf die die Anzeige zerstört werden kann. Erstens: BASIC verweigert
die Ausführung einer Bildschirmoperation, weil es sonst unmöglich ist,
sie in dem Graphik-Modus, den das OS als gegeben annimmt, durchzuführen. Das
OS speichert den Graphik-Modus in Adresse $57. Es ist möglich, das OS durch
das ƒndern des Wertes in dieser Speicherstelle zu täuschen. Geschieht dieses,
muß allerdings die Nummer des entsprechenden BASIC-Modus anstelle einer ANTIC-Modus-Nummer
benutzt werden.
Der
zweite Fehler kann durch das Mischen von Mode-Lines mit unterschiedlichen Speicher-Erfordernissen
erfolgen. Einige Mode-Lines benötigen nur 40 Bytes pro Zeile, einige 20 Bytes
und noch andere nur 10 Bytes. Angenommen, man führt eine 20 Byte Mode-Line in
eine Display List mit 40 Byte Mode-Line ein. Was geschieht, wenn man nun den PRINT-Befehl
verwendet? ‹berhalb der eingeschobenen Zeile ist alles in Ordnung, aber unterhalb
sind alle Zeichen um 20 Stellen nach rechts verschoben. Dieses erfolgt aus der Annahme
des Systems, daß jede Zeile 40 Bytes benötigen würde. Dementsprechend
werden die Zeichen positioniert. ANTIC nimmt aber, sobald es auf die eingeschobene
Zeile stöFt, nur 20 Bytes von dem, was das OS in einer 40 Byte Zeile als vorhanden
annimmt. ANTIC interpretiert die anderen 20 Bytes als zur nächsten Zeile gehörend
an und bringt sie daher dorthin. Dadurch werden die folgenden Zeilen um 20 Stellen
nach rechts verschoben.
Eine
Möglichkeit, diesem Problem aus dem Weg zu gehen ist, keine BASIC PRINTs und
PLOTs zu verwenden, um auf einen Bildschirm mit geänderter Display List zu schreiben.
Die andere, einfachere Lösung ist, einen Schirm in Zeilengruppen zu organisieren,
die ganzzahlige Vielfache der standardmäFigen Byte-Erfordernisse enthalten.
Das bedeutet, in eine 40-Byte-Mode-Line darf keine 20-Byte-Mode-Line eingefügt
werden; statt dessen müFen zwei 20-Byte-Mode-Lines oder eine 20-Byte-Mode-Line
und zwei 10-Byte-Mode-Line eingeschoben werden. Solange das beachtet wird, tritt
keine waagerechte Verschiebung auf.
Diese
Lösung ist bezeichnend für das dritte Problem beim Benutzen von gemischten
Display Lists in BASIC: senkrechte Verschiebungen. Das OS positioniert Bildschirmmaterial
senkrecht, indem die Anzahl der zu überspringenden Bytes vom oberen Bildschirmrand
berechnet werden. Bei einem standardmäFigen 40 Byte Zeilen Display würde
BASIC die Zeichen auf die zehnte Zeile bringen, indem 360 Bytes vom Anfang an übersprungen
werden. Wenn vier 10-Byte-Mode-Lines eingeschoben werden würden, dann würde
BASIC die Zeichen drei Zeilen tiefer auf dem Schirm ausgeben. Weiterhin verbrauchen
unterschiedliche Mode-Lines unterschiedlich viele Scan-Lines, so daß die Bildschirmposition
nicht dem Erwarteten entspricht, sofern die Scan-Line-Erfordernisse nicht in Betracht
gezogen werden.
Wie
man sieht, können Displays mit gemischten Mode-Lines in Verbindung mit dem OS
problematisch sein. Oft muß das OS getäuscht werden, damit solche Displays
überhaupt arbeiten. Um in ein Mode-Window (=Fenster) zu PRINTen oder zu PLOTten,
muß die Nummer des BASIC-Modus¥ für dieses Fenster in die Adresse
$57 gebracht werden. Danach wird die Adresse des linken oberen Pixels für dieses
Fenster in die Speicherstellen $58 und $59 geschrieben (nieder-, dann hochwertig).
In Zeichen-Modi muß eine Position 0,0 ausgeführt werden, damit der Cursor
in die linke obere Ecke des Mode-Fensters gebracht wird. In Map-Modi werden alle
PLOT- und DRAWTO-Befehle ausgeführt, indem die linke obere Ecke als Koordinatenursprung
des Mode-Fensters benutzt wird.
Display
Lists können optimal zum Erzeugen ansprechender Bilder benutzt werden. Die augenfälligste
Anwendung ist das Mischen von Text und Graphik. Es wäre z.B. möglich, einen
Schirm mit einen groFen Titel in BASIC-Modus 2, einem mittelgroFen Titel in BASIC-Modus
1 und einem Text in BASIC-Modus 0 aufzustellen. Ein Bild in BASIC-Modus 8 könnte
in die Bildschirmmitte und ein Text an den unteren Rand gedruckt werden. Ein gutes
Beispiel für diese Technik ist das Programm “Europäische Länder +
Hauptstädte".
Die
oben genannten Probleme schrecken wahrscheinlich von der Benutztung dieser Techniken
in BASIC ab. Modifizierte Display-Lists könnten am besten durch Assembler-Routinen
bearbeitet werden, wobei der Schirm in eine Reihe von Fenstern organisiert wird.
Dabei besitzt jedes Fenster seine eigene LMS-Instruktion und einen unabhängigen
RAM-Bereich.
VERWENDUNG
VON MODIFIZIERTEN DISPLAY LISTS
Eine
andere bedeutende graphische Möglichkeit, die nur über die Manipulation
von Display Lists erreicht werden kann, ist z.B. der Zugriff auf in BASIC nicht verfügbare
Graphik-Modi des Gerätes. Es gibt drei Text-Modi, die in BASIC nicht verfügbar
sind, aber von ANTIC erzeugt werden können. Lediglich die Manipulation der Display
List gestattet dem Benutzer den Zugriff auf diese Modi. Es gibt auFerdem die Möglichkeiten
des “Display List Interrupts" und des “Feinen Scrollings", die nur erreichbar
sind, nachdem die Display List vom Programmierer geändert wurde. Diese Dinge
sind das Thema von Kapitel 5 und 6.
Manipulation
mit der LMS-Anweisung und ihrem Operanden eröffnen dem kreativen Programmierer
viele Möglichkeiten. So können z.B. während des Vertical Blanks die
Bilder auf dem Schirm geändert werden. Dieses kann in einer “langsameren"
Geschwindigkeit geschehen, um zwischen vorgezeichneten Bildern zu wechseln, ohne
jedes neu zeichnen zu müssen. Jedes Bild wäre weiterhin im RAM vorhanden
und wäre daher sofort verfügbar. Durch schnelles Wechseln einer Folge von
Displays kann eine sogenannte zyklische Animation erreicht werden. Das hierfür
erforderliche Programm müßte lediglich zwei Adress-Bytes manipulieren,
um tausende von RAM-Bytes anzuzeigen.
Es
ist auFerdem möglich, Bilder übereinander zu legen, indem mit hoher Geschwindigkeit
gewechselt wird. Das menschliche Auge hat eine zeitmäFige Auflösung von
einem 16tel einer Sekunde. So kann ein Programm zwischen vier Bildern wechseln, so
daß eines jeden 15ten Teil einer Sekunde wiedererscheint. Auf diese Weise können
sich scheinbar bis zu vier Bilder gleichzeitig auf dem Schirm befinden.
Natürlich
gibt es einige Nachteile bei dieser Methode. Als erstes brauchen vier separate Bilder
einen groFen Bereich des Speichers. Zum zweiten erscheinen die einzelnen Bilder verwaschen,
weil sie nur jedes 4. Mal zu sehen sind. AuFerdem muß der Hintergrund schwarz
sein, damit sich die Bilder klar abzeichnen. Weiterhin gibt es ein unangenehmes Flackern
beim Benutzen dieser Technik. Ein konservativer Programmierer wird es vorziehen,
nur zwischen drei oder sogar nur zwischen zwei Bildern zu wechseln.
Diese
Technik kan auch dazu verwendet werden, die Farb- und Helligkeitsauflösung des
Displays zu steigern. Dieses geschieht, indem man zwischen vier Versionen des gleichen
Bildes wechselt, wobei jede Version andere Farb- und Helligkeitswerte besitzt. Hierdurch
ist ein breites Spektrum an Farbe und Helligkeit verfügbar. Wenn z.B. ein Balken
gezeichnet werden soll, der verschiedene Helligkeitsstufen besitzt, dann werden als
erstes die vier Farbregister auf die folgenden Werte gesetzt:
Hintergrund: 00
Playfield 1: 02
Playfield 2: OA
Playfield 3: OC
Danach setzen wir
die folgenden Bilder in verschiedene RAM-Bereiche:
Pixelinhalte (Auswahl
der Playfield-Register)
1.
Reihe: 1
1 1
1 2
3 2
3 2
3 2
3
2.
Reihe: B
1 1
1 B
B 2
3 2
3 2
3
3.
Reihe: B
B 1
1 B
B B
B 2
3 2
3
4.
Reihe: B
B B
1 B
B B
B B
B 2
3
Effektive
Helligkeit x 4:
2 4
6 8
10 12
20 24
30 36 40
48
Erzielte
Hellig-
keit:
|
Auf diese Weise ist
eine viel höhere Helligkeits- und Farbauflösung möglich.
Ein abschlieFender
Gedanke betrifft ein Objekt, das viele Möglichkeiten liefert, aber bis jetzt
noch schwer zugänglich und verständlich ist: die dynamische Display-List.
Dieses ist eine Display-List, die der 6502 während des Vertical Blanks ändert.
Es sollte möglich sein, interessante Effekte mit Hilfe der dynamischen Display-List
zu produzieren. Ein Text-Editierprogramm könnte z.B. dynamisch Leerzeilen über
und unter die zu editierende Zeile setzen, um sie von den anderen abzuheben. Wenn
der Cursor sich senkrecht bewegt, ändert sich
die Display-List.
Diese Technik ist sicherlich umständlich, aber auch sehr effektiv.