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

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.