von Bernd Dongus Heute geht es noch einmal 'Back to the roots'. Ich starte zunächst meinen zweiten Versuch Fein-Scrolling zu erklären, da es beim ersten Mal scheinbar nicht verstanden wurde (mein altes Problem mit dem vorausgesetzten Wissen). Aber ich will auch noch zeigen, wie man die GTIA-Modi erzeugt und was man mit ihnen anstellen kann. Das vertikale Fein-Scrolling In den Modi die nur eine Bildzeile Höhe haben muß nur der Bildspeicherzeiger in der Dipsplay-List (DL) um die Breite (in Byte) des Modus eröht/erniedrigt werden, je nach gewünschter Richtung. In den anderen Modi läuft es etwas anders. Hier wird die Hilfe ANTIC's benötigt. Er besitzt ein Register, welches ermöglicht auch diese Modi feinzuscrollen. Dieses Register hat die Adresse $d405 und wird meist VSCROL genannt. Die Moduszeilen bei denen Bit 5 im DL-Befehl gesetzt ist verschiebt ANTIC um die in VSCROL stehende Anzahl von Bildzeilen nach oben. Der Höchstwert dieses Registers hängt natürlich von dem Grafikmodus ab. Die folgende Tabelle zeigt deshalb die jeweiligen Maxima der einzelnen Modi. ANTIC-Modus Maximum ----------- ------- 2 7 3 9 4 7 5 15 6 7 7 15 8 7 9 3 10 3 11 1 12 0 13 1 14 0 15 0 Auf die Modi mit Maximum = 0 hat VSCROL keinerlei Wirkung, sie werden Mit der anfangs beschriebenen Methode verschoben. Beim Erstellen der Display-List ist noch darauf zu achten, daß in der letzten zu verschiebende Moduszeile Bit 5 NICHT gesetzt ist. Diese Zeile benötigt ANTIC als 'Verschiebepuffer'. Wer hier aber genaueres wissen will, den muß ich auf das ATARI XL/XE INTERN verweisen. (Anmerkung für die Red.: Wie wäre es, wenn man versucht für die Wissbegierigen noch ein paar Exemplare auszugraben ???) Jetzt will ich mich aber um das Beispiel kümmern. Im heutigen Beispielprogramm übernimmt das Unterprogramm VERTIKAL das vertikale Fein-Scrolling. Um nach oben zu scrollen muß also 'nur' VSCROL hochgezählt werden ? Irrtum. VSCROL ist ein Register, in das nur geschrieben werden kann. Also benötigt man eine Speicherstelle, die als Zwischenspeicher fungiert. Dies wird in unserem Beispiel von VSAV erledigt. Es gibt allerding einen weiteren Knackpunkt: Mit VSCROL läßt sich nur eine Moduszeile scrollen. Da uns aber die Höchstwerte für VSCROL bekannt sind und VSAV den aktuellen Wert des Scroll-Registers enthält, läßt sich leicht abfragen, ob eine Moduszeile gescrollt wurde, oder nicht. Die Assembler-Befehle könnten für ANTIC-Modus 2 etwa so aussehen : DL .HX 70707062 DLSCR .DA TEXT : : VBL JSR VERTIKAL : : VERTIKAL INC VSAV LDA VSAV AND #3 STA VSCROL BNE .1 LDA DLSCR CLC ADC #40 STA DLSCR BCC .2 INC DLSCR+1 .2 LDA DLSCR CMP #TEXTENDE BNE .1 LDA DLSCR+1 CMP /TEXTENDE BNE .1 (* HIER KANN MAN DLSCR WIEDER AUF *) (* DEN TEXTANFANG SETZEN ODER EINE *) (* ANDERE AKTION VERANLASSEN, DIE *) (* BEI ERREICHEN DES TEXTENDES AUS-*) (* GEFÜHRT WERDEN SOLL. *) .1 RTS Die Routine im Beispiel sieht ein wenig anders aus, ist aber vom Prinzip her gleich aufgebaut. Das horizontale Fein-Scrolling Hier gilt Ähnliches, wie für das vertikale Fein-Scrolling. Das Verschiebe-Register heißt hier HSCROL und liegt bei $d404. Im DL-Befehl muß nicht Bit 5, sondern Bit 4 gesetzt sein. Auch die Tabelle der Höchstwerte sieht anders aus : ANTIC-Modus Maximum ----------- ------- 2 3 3 3 4 3 5 3 6 7 7 7 8 15 9 15 10 7 11 7 12 7 13 3 14 3 15 3 Alle Moduszeilen mit Bit 4 = 1 werden um, die in HSCROL stehende Anzahl Farbtakte, nach rechts verschoben. Mit Erreichen des Höchstwertes in HSCROL ist ein Zeichen verschoben worden. In meinem Beispielprogramm wird der aktuelle Wert von HSCROL in HSAV zwischengespeichert. Die Assembler- befehle zum Scrolling nach links könnten dann so aussehen : DL .HX 70707052 DLSCR2 .DA TEXT2 : : VBL JSR HORIZONTAL : : HORIZONTAL DEC HSAV LDA HSAV AND #3 STA HSCROL CMP #3 neues Zeichen ? BNE .1 INC DLSCR2 BNE .2 INC DLSCR2+1 .2 LDA DLSCR2 CMP #TEXTENDE2 BNE .1 LDA DLSCR2+1 CMP /TEXTENDE BNE .1 (* HIER WERDEN DIE AKTION PLAZIERT,*) (* AM ENDE DES TEXTES DURCHGEFÜHRT *) (* WERDEN SOLLEN. *) .1 RTS Soviel zu den Grundlagen des Fein- Scrollings. Das wahr zwar nicht alles über dieses Thema, aber es sollten ja nur die Grundzüge beschrieben werden. Richtig verstehen ist vermutlich erst nach etlichen Fehlversuchen möglich. Also nur nicht entmutigen lassen, wenn der Rechner abstürtzt oder Unerwartetes vollbringt. Ich habe das Meiste auch nur durch Zufall herausgefunden. Zum Schluß will ich noch die GTIA-Modi umreißen und die Grundlagen für einen 256-Farben-Modus legen. Die GTIA-Modi sind an sich keine eigenständigen Modi. Es wird nur die Interpretation der Bilddaten verändert, wodurch anscheinend neue Modi ent- stehen. Wie GTIA die Bilddaten verarbeitet wird über das Register GTIACTL ($d01b) und dessen Schatten- register ($026f) festgelegt. Konkret zuständig sind hierfür die Bits 6 und 7 dieses Registers. Bevor nun alle Möglichkeiten aufgeführt werden muß klar gestellt werden, daß die Bilddaten nicht dem Inhalt des Bildspeichers entsprechen müssen. Dies ist bei den Textmodi der Fall. Bei diesen entsprechen die Bilddaten den Zeichensatzdaten des jeweiligen Zeichens in der aktuellen Bildzeile. Dies wird im Beispielprogramm klar. Denn hier wird ein neues Zeichen definiert, um in einem Zeichen und dessen inverser Darstellung sämtliche Farben zeigen zu können. Es werden also 8 Farben in einem Zeichen dargestellt. Doch dies nur am Rande. Durch Spielen mit der nun folgenden Tabelle und den ANTIC-Modi sollte es mehr oder minder einfach sein dies und noch ein paar andere Kleinigkeiten herauszufinden. Bit7 Bit6 0 0 Normale Darstellung der ANTIC-Modi 0 1 So faßt GTIA je 4 Bit (genannt Nibble) zusammen und wertet sie als Helligkeitsstufe. Als Farbe wird die Rahmen- bzw. Hintergrundfarbe verwendet ($d01a/$02c8). Dies wäre GRAPHICS 9. 1 0 Jetzt interpretiert GTIA die Nibbles als Farbreg- isternummer. Da aber nur neun Reg. existieren, stehen auch nur neun Farben zur Verfügung. Dies wäre GRAPHICS 10. 1 1 Nun werden die Nibbles als Farbstufen benutzt, deren Helligkeit in $d01a/$02c8 steht. Dies wäre GRAPHICS 11. Durch eine Schwäche der Technik und des menschlichen Auges läßt sich nun ein 256-Farben-Modus erstellen. Das Prinzip ist einfach, doch der Bildspeicheraufbau ändert sich ein wenig. Das Prinzip ist folgendes: Man schaltet von Zeile zu Zeile zwischen dem Modus mit 16 Farbstufen und dem mit 16 Helligkeitsstufen. Durch oben erwähnte Schwäche überlagern sich die Zeilen und es entstehen 16x16 = 256 Farben. Klingt doch ganz einfach, oder ? Es ist nur so, daß die Auflösung darunter zu leiden hat und zwischen den einzelnen Bildzeilen scheinbar Leer- zeilen entstehen. Eibentlich auf verständlich, denn wir stellen ja auch zwei Zeilen dar, nur die Überlagerung macht uns glaugen, es wäre nur eine. Das Umschalten könnte so aussehen : LDA #$C0 STA GTIACTL STA WSYNC $D40A LDA #$40 STA GTIACTL $D01B STA WSYNC Dies muß nun für jede 256-Farben-Zeile gemacht werden. Ein fertiges Programm wird hierzu aber nicht geliefert, denn ich glaube es ist viel schöner den genauen Ablauf selbst herauszufinden. Es wäre wohl auch ziemlich langweilig, wenn alles auf dem Silbertablett geboten wird und man die Routine doch nicht versteht (siehe Wellenscroller). Das war's dann wohl. Ich bin voerst zum letzten Mal zum Ende eines Artikels gekommen. Sollten mein Studium und mein zweiter Rechner (IBM AT) mir aber noch den nötigen Freiraum lassen, melde ich mich zwischendurch wieder mit einem Artikel. LANG LEBE DER ATARI-8-BIT ! (Auch wenn Atari selbst ihn schon lange fallengelassen hat.) Nächste Ausgabe wird vorerst Ulf Petersen wieder die Assembler-Ecke übernehmen (Nachfolger wird gesucht !)