64'er

VDC - 80 Zeichen ist nicht alles

Teil 2 (64'er 05/87)

Der 80-Zeichen-Chip des C 128 birgt noch einige Geheimnisse. Wir helfen Ihnen, diesen auf die Schliche zu kommen und den VDC zu beherrschen.

Im ersten Artikel dieser in loser Folge erscheinenden Serie (Ausgabe 3/87) ging es um die Möglichkeiten, die wir mit den Befehlen PRINT und CHAR haben. Diesmal befassen wir uns mit den Registern des VDC und deren Manipulation.

Wie der VIC (40-Zeichen-Video-Controller) und die CIAs (Portbausteine) hat auch der VDC (80-Zeichen-Video-Controller) seine internen Register. Diese beinhalten alle wichtigen Informationen, die er zum Bildaufbau benötigt. Beim VIC liegen diese im Bereich von 53248 bis 53269 ($D000 bis $D030) in BANK 15 ($F) und können über direkte Zugriffe angesprochen werden, wenn dies auch nicht ganz unproblematisch ist. (Mehr dazu in der 64'er-Ausgabe 8/96, "Reise durch den C128(Teil4)", Seite 69ff.) Sucht man aber in einer Speicherbelegungsübersicht nach einem entsprechenden Bereich, in dem die VDC-Register liegen, wird man beim besten Willen nicht mehr als die Adressen 54784 ($D600) und 54785 ($D601) in BANK 15 ($F) ausfindig machen. Nur zwei Register für einen so komplexen Baustein wie den VDC, von dessen Fähigkeiten wir einen ersten Eindruck in der letzten Folge bekommen haben? Sie liegen richtig, der VDC hat mehr Register. Die aufgeführten Adressen dienen nur der Kommunikation zwischen dem VDC und der Zentraleinheit des C 128. Dazu muß man wissen, daß der VDC ein ziemlich abgeschiedenes Leben führt: Er hat einen eigenen Speicherbereich für seine Register und ein 16 KByte großes RAM als Bildschirmspeicher. Beide Speicherbereiche unterliegen dem VDC unmittelbar und beanspruchen kein Bit des Hauptspeichers (von den Adressen 54784 und 54785 einmal abgesehen, die keine VDC-Register im eigentlichen Sinne sind). Im Anhang E des C 128-Handbuchs wird kurz erklärt, wie man einen Wert an ein VDC-Register übergibt: Man schreibt in $FD600 die Nummer des Registers (0 bis 36) und in $FD601 den zu schreibenden Wert. Dies ist jedoch nicht ganz korrekt. Zusätzlich muß man prüfen, ob der VDC bereit ist, unseren Auftrag auszuführen. Dies erledigt eine Betriebssystem-Routine recht gut. Sie liegt ab $CDCC im ROM und wird in Maschinensprache folgendermaßen aufgerufen:

LDA #Wert
LDX #Registernummer
JSR $CDCC

Sie können die entsprechende Routine disassemblieren (mit dem Monitor: "D CDCC") oder aber in einem kommentierten ROM-Listing nachschlagen. Empfehlen kann ich Ihnen hier das "C 128 ROM-Listing" von Dr. Ruprecht aus der Commodore-Sachbuchreihe. Wenn sie Ihren C 128 in Basic programmieren - das hervorragende Basic 7.0 lädt dazu ja förmlich ein - und nun befürchten, Sie könnten dieses Verfahren nicht anwenden, so können wir Sie beruhingen. Der SYS-Befehl des C 128 ersetzt den JSR-Aufruf:

BANK 15:SYS DEC("CDCC"),Wert,Registernummer

Folgendes Beispiel ändert die Hintergrundfarbe:

BANK 15:SYS DEC("CDCC"),9,26

Das ist die korrigierte Version des im Handbuch auf Seite E-4 vorgestellten Beispiels. Und noch etwas fehlt im Handbuch: das Auslesen von Registerinhalten. Dies geschieht, indem man die Registernummer nach $D600 schreibt und dann die Adresse $D601 ausliest; auch hier muß man warten, bis der VDC seine Bereitschaft signalisiert. Hier gleich die Betriebssystem-Routine:

LDX #Registernummer
JSR $CDDA;  im Akku steht jetzt der Registerinhalt

In Basic gibt es wieder eine Ersatzlösung:

BANK 15:SYS DEC("CDDA"),,Registernummer:RREG W

Danach steht in W der Inhalt des Registers. Eine andere Möglichkeit, als diesen in eine Variable wie W zu transportieren, ist das Auslesen von Adresse 6 über PEEK(6). Dazu sollte man allerdings einige Erfahrung mit dem Betriebssystem des C 128 haben. Die zwei Kommata nach SYS DEC("CDDA") sind übrigens kein Druckfehler, sondern unbedingt erforderlich. Das Auslesen von Registern wird im C 128-Handbuch überhaupt nicht besprochen, das Verfahren zum Beschreiben ist nicht korrekt und zu umständlich. Zur Entlastung des C 128-Handbuchs: Die an die Kurz-Erläuterung anknüpfende Tabelle der Register ist hervorragend, so daß es reine Platzverschwendung wäre, hier eine solche abzudrucken. Außerdem wird der VDC auch in sogenannter weiterführender Literatur vernachlässigt. Eine Ausnahme ist das Buch "Vom C 64 zum C128 Tips & Tricks", das aber ebenso zu allen anderen C 128-Themen eine Fülle von neuartigen und wertvollen Informationen vermittelt.

Die Register des VDC

Kehren wir zurück zu den VDC-Registern. Hier wollen wir alle Register im einzelnen besprechen; ausführlicher als die Tabelle im Handbuch, die Sie danach als Nachschlagewerk einsetzen können, wofür sie sich bestens eignet.

Register 0: Anzahl der Zeichen zwischen Synchronimpulsen.
Ausgangswert: 126 ($7e)

Für die Programmierung läßt sich dieses Register nicht sinnvoll nutzen, aber vielleicht kennen Sie doch eine Möglichkeit (schreiben Sie uns dann bitte). Folgende Eingabe gibt einen verwirrenden Effekt von etwas seltsamer Schönheit:

BANK 15:SYS DEC("CDCC"),150,0
und anschließendes Drücken von (Bildschirm löschen).

Register 1: Anzahl der Zeichen pro Zeile
Ausgangswert: 80 ($50)

Dieses Register zählt zu den interessantesten im C 128 überhaupt. Es bestimmt, wie viele Zeichen pro Zeile am Bildschirm dargestellt werden. Nur durch Beschreiben dieses Register 1 ist es also möglich, auch mehr als 80 Zeichen (!) in einer Zeile unterzubringen. Dies geschieht, indem der Bildschirmrand verkleinert wird - die Zeichen an sich ändern ihre Größe nicht.

Allerdings genügt es nicht, nur neue Werte über das vorgestellte Verfahren in dieses Register zu befördern, denn das Betriebssystem ist darauf nicht eingestellt. Wenn Sie Listing 1 eingeben und starten, können Sie aber wenigstens schon einen Eindruck von dem bekommen, was wir in einem späteren Artikel endgültig klären werdden.

Dieses Programm verlangt von Ihnen die Eingabe der Anzahl an Zeichen pro Zeile (Zeile 400). Dann werden zunächst 80 Punkte ausgegeben (für die 80 standardmäßig vorhandenen Spalten); jede Spalte über 80 wird durch eine Ziffer gekennzeichnet (Zeilen 410-440). Schließlich wird in Zeile 500 die neue Zeilenbreite eingestellt. Jetzt können Sie sehen, daß die oberste Bildschirmzeile zusätzliche Spalten bekommen hat. Gleiches gilt auch für die anderen Zeilen, wird aber vom Programm nicht gezeigt. Der erste SYS-Befehl in Zeile 500 hat mit der eigentlichen Erweiterung der Zeile nichts zu tun; er stellt nur das Bildschirmformat auf fünf Zeilen um, da sonst ein unangenehmes Flackern am unteren Bildschirmrand auftritt (probieren Sie es durch Löschen des ersten SYS-Befehls aus), das wir erst später beheben können.

Bei Eingabe von 81 und 82 kann man recht gut sehen, daß diese Spalten hinzukommen: Im erweiterten Modus sind außer den 80 Punkten auch die entsprechenden Ziffern in der obersten Zeile zu sehen. Nach Drücken einer Taste rutschen diese in die zweite Zeile, da die 80 Punkte schon eine Normalzeile ergeben. Bei Werten über 82 allerdings fällt Ihnen sicher auf, daß ein Punkt (manchmal auch mehrere) durch eine Ziffer überlagert wird. Dies ist kein Programmfehler, sondern hängt mit der Art, wie der VDC Daten aus seinem Bildschirmspeicher bezieht, zusammen. Obwohl ich viele Experimente unternommen habe, ist es mir bis heute nicht gelungen, eine zufriedenstellende Lösung zu finden. Wenn Sie eine solche haben, schreiben Sie uns bitte. Damit könnten Sie allen C 128-Besitzern weiterhelfen.

Wir sollten aber bedenken, daß auch ein oder zwei Spalten ein großer Gewinn sind. Man stelle sich nur eine Textverarbeitung vor, die rechts und links von den herkömmlichen 80 Spalten eine Spalte zur Abgrenzung für eine weitere Spalte mit einem Links- oder Rechtspfeil in der 82. Spalte verwendet. Dieser kann die Cursorposition anzeigen und dadurch die aktuelle Schreibstelle viel leichter auffindbar machen.

Da auf dem Monitor durchaus auch 85 Spalten möglich wären, und von Register 1 auch unterstützt werden, möchte ich meine Bitte wiederholen, Lösungsvorschläge zu machen. Vielleicht hilft Ihnen über diesen Kurs hinaus die Bschäftigung mit Werken aus dem Literaturverzeichnis weiter.

Register 2: Linker Bildschirmrand
Ausgangswert: 102 ($66)

Der Kommentar sagt es schon. Dieses Register kann zum Verschieben des linken Bildschirmrandes am Monitor eingesetzt werden. Für Besitzer eines Monitors, der eine solche Einstellmöglichkeit von vornherein bietet (beispielsweise der Commodore 1901), ist dies ziemlich uninteressant, soll aber dennoch erwähnt werden. Je größer der Wert in Register 2 ist, desto weiter links steht der Bildschirm. Beispiel:

BANK 15:SYS DEC("CDCC"),100,2

Register 3: Breite des horizontalen und vertikalen Synchronimpulses
Ausgangswert: 73 ($49)

Obwohl es sich mehr um einen technischen Wert handelt, sind hier leichte Verschiebungen des Bildschirms möglich, die auch für eigene Programme nützlich sein könnten. Folgendes Beispiel läßt den Bildschirm ganz links erscheinen:

BANK 15:SYS DEC("CDCC"),255,3
Folgende Eingabe bewirkt das genaue Gegenteil:
BANK 15:SYS DEC("CDCC"),65,3

Register 4: Wie Register 0, aber für Anzahl der Zeilen.
Ausgangswert: 39 ($27)

Je größer der Inhalt dieses Registers ist, desto weiter unten liegt der Bildschirm. Durch den Wert 20 (wie Sie diesen in Register 4 befördern, wissen Sie mittlerweile) rufen Sie einen interessanten Effekt hervor. Sinnvollere Ergebnisse liefern aber die Werte 32 bis 41. Besonders beeindruckend ist aber folgende Eingabe, die ich nur mit einem Commodore 1901-Monitor testen konnte (sie müßte auch auf anderen Monitoren funktionieren):

BANK 15: SYS DEC("CDCC"),42,4
Das Ergebnis ist ein ununterbrochenes Scrolling des Bildschirms mit beachtlicher Geschwindigkeit.

Register 5: Feineinstellung zu Register 4
Ausgangswert: 224 ($E0)

Die drei obersten Bit dieses Registers werden nicht genutzt und haben den Wert 1. Wenn Register 4 den Normalwert hat, sind nur die Werte 224 bis 231 sinnvoll.

Register 6: Anzahl der Bildschirmzeilen
Ausgangswert: 25 ($19)

Dieses Register bietet ähnliche Möglichkeiten wie Register 1. Es können auch weitere Bildschirmzeilen hinzugewonnen werden, indem man Werte größer 25 hier hineinschreibt. Dabei tritt jedoch ohne sonstige Vorkehrungen ein Flackern des unteren Bildschirmrandes auf. Der Grund ist, daß der VDC dann auch einen größeren Bildschirmspeicher erwartet, diesen aber nicht vorfindet und so mehr oder weniger zufällige Werte am Bildschirm abbildet, die dann ein Blinken auslösen. Eine Lösung dafür, die sogar recht einfach ist, erarbeiten wir später. Zunächst zwei Demonstrationsbeispiele. Erstens: CP/M nutzt eine 26. Bildschirmzeile! Die Statuszeile wird auf diese Weise hinzugewonnen. Dies können Sie testen, indem Sie beispielsweise die NO SCROLL-Taste betätigen, worauf die Unterbrechungsmeldung erscheint.

Zweitens: Ein Programm für den C 128-Modus, das davon Gebrauch macht, wurde in Ausgabe 6/86 auf Seite 83 als Listing 2 veröffentlicht ("F.KEY-DISPLAY") und erzeugt sogar vier weitere Zeilen.

Selbstverständlich werden wir auch noch eigene Programme dieser Art entwickeln, aber im Moment fehlen uns bestimmte Informationen, zum Beispiel, wie man den Bildschirmspeicher des VDC anspricht.

Register 7: Oberer Bildschirmrand
Ausgangwert: 32 ($20)

Dieses Register ist mit Register 2 zu vergleichen. Je größer hier der Wert ist, desto weiter oben liegt der Bildschirm. Es sind Werte von 0 bis 39 möglich, mit denen Sie ohne weiteres experimentieren sollten. Für ein sanftes Abrollen des Bildschirms (Soft-Scrolling oder Smooth-Scrolling genannt) kann dieses Register von Nutzen sein.

Dies zeigt folgende Eingabe:

BANK 15:FOR F=0 TO 39:SYS DEC("CDCC"),F,7:FOR G=1 TO 150:NEXTG,F

Nächstes Mal lernen wir weitere Register kennen, um unser Wissen über die VDC-Möglichkeiten allmählich zu komplettieren.

(Florian Müller/dm)

Literaturverzeichnis:
(1) Gerd Möllmann, C 128 Programmieren in Maschinensprache, Markt & Technik Verlag
(2) Larry Greenly u.a.: Das C 128-Buch, Sybex-Verlag
(3) Heimo Ponnath, Grafikprogrammierung C 128, Markt & Technik Verlag
(4) Schieb, Thrun, Wrobel: C 128 Intern, Data Becker Verlag