Aus dem 64'er
Heft - 1/87
|
VDC 8563 voll ausgereizt
Bisher diente der 80-Zeichen-Chip des C 128 wohl in erster Linie ausschließlich zur Textdarstellung auf Schwarzweiß-Monitoren. Bedingt durch die schlechtere Lesbarkeit auf Farbmonitoren wird dort wohl viel im 40-Zeichen-Modus gearbeitet. Dieser hat allerdings den Nachteil, daß er im FAST-Modus nicht verwendbar ist.
Warum benutzen wir dann nicht einfach den 40-Zeichen-Modus des VDC? Weil es darüber fast keine Informationen gibt!
Hier zunächst eine Bemerkung: Es gibt leider zwei unterschiedliche Versionen des VDC. Bei der einen steht in Register 25 normalerweise der Wert $40, in der anderen der Wert $47. Bei allen nun folgenden Angaben werden die Werte des erstgenannten Chips vor, die des zweitgenannten nach einem Schrägstrich angegeben (zum Beispiel Register 25: $40/$47).
Zunächst soll jedoch die Frage beantwortet werden, wie man eines der VDC-Register beschreibt.
Die Register lassen sich über die Speicherstelle $D600 und $D601 ansprechen. Dabei ist zunächst in $D600 die Registernummer zu POKEn und anschließend der Wert aus $D601 zu lesen oder in diese Speicherstelle zu schreiben. Um zum Beispiel den Wert von Register 25 zu erfahren, geben Sie folgende Befehle ein: POKE 54784,25:PRINT PEEK (54785)
Auf Ihrem Bildschirm sollte dann eine der beiden folgenden Zahlen stehen: 64 / 71 (64 bei erstgenanntem Chip, sonst71).
Die gewünschten Werte bringt man am leichtesten mit einer kleinen Schleife in die dazugehörigen Register:
10 READ RG:IF RG<0 THEN END:REM REGISTER VERSORGT
20 READ WE$:POKE 54784,RG:POKE 54785,DEC(WE$):GOTO 10
30 DATA Rl,Wl,...,Rn,Wn,-1
Hierbei sind Rl bis Rn dezimal angegebene Registernummern und Wl bis Wn hexadezimal angegebene Werte, die in das zuvor angegebene Register geschrieben werden sollen.
Sie erhalten nun alle Werte, die Sie benötigen, um mit dem VDC mal etwas anders zu arbeiten. Die Wertangaben sind dabei alle hexadezimal und die Registerangaben dezimal.
1. 40 Zeichen in 25 Zeilen (Darstellung wie beim VIC-Chip, lediglich ohne Rahmen):
Register |
Wert |
1 |
$28 |
2 |
$3D |
0 |
$47 |
27 |
$28 |
25 |
$50/$56 |
Nach WINDOW 0,0,29,24 erfolgen alle Ausgaben wie bei Verwendung des VIC.
2. Wie L, jedoch bis zu 50 Zeichen je Zeile:
Register |
Wert |
1 |
$32 |
27 |
$1E |
sonst wie bei 1.
Nach WINDOW 0,0,ZEICHENZAHL,24 stehen in 25 Zeilen die gewünschte Anzahl Zeichen zur Verfügung. Durch Veränderung des Wertes in Register 2 kann die Ausgabe weiter nach rechts oder links verschoben werden.
3. 80 Zeichen je Zeile (Standardwerte):
Register |
Wert |
1 |
$50 |
2 |
$66 |
0 |
$7E |
27 |
$00 |
25 |
$40/$47 |
Hierfür ist kein WINDOW-Kommando erforderlich, da dies die voreingestellten Werte sind.
4. 40 Zeichen je Zeile, bis zu 32 Zeilen:
Register |
Wert |
1 |
$28 |
2 |
$3D |
0 |
$47 |
27 |
$00 |
25 |
$50/$56 |
Nach WINDOW 0,0,79,INT(ZEILENZAHL/2)-l erfolgen die Ausgaben wie folgt:
Jeweils zwei Bildschirmzeilen bilden eine logische Zeile. Dies bedeutet, daß durch CHR$(13) vor Spalte 40 immer eine Zeile übersprungen wird. Das Gleiche gilt bei der Verwendung der Cursor-Tasten. Um zum Beispiel von Zeile 2 nach Zeile 3 zu gelangen, muß der Cursor statt einmal nach unten, 40mal nach rechts bewegt werden. Dies ist zwar etwas umständlich, dafür können aber immerhin je nach Monitor bis zu sieben Zeilen mehr verwendet werden als sonst.
5. Hochauflösende Farbgrafik
Die hochauflösende Farbgrafik mit einer Auflösung von 640x200 Bildpunkten kann, wie ein einfaches Rechenbeispiel zeigt, nicht farbig dargestellt werden. Der dafür benötigte Speicherplatz beträgt nämlich: 640 x 200 / 8 = 16000 Byte für die Bitmap 25 x 80 = 2000 Byte für den Farbspeicher Zusammen 18000 Byte
Der VDC verfügt jedoch nur über einen Speicher von 16 KByte = 16384 Byte.
Wie verhält es sich aber, wenn wir auf einige Zeilen oder Spalten verzichten? Die Grafik ist nicht viel kleiner, wenn Sie statt 25 nur 22 Zeilen verwenden, das heißt, statt 640 x 200 nur 640 x 176 Punkte. Die Adresse des Attributspeichers muß dann entsprechend hinter die Bitmap gesetzt werden. Die Adresse eines Punktes errechnet sich übrigens leichter als beim VIC:
Adresse von Punkt X,Y : INT(X/8) +Y*80 Bitnummer : 2t(7-(X AND 7))
Adresse im Farbspeicher: INT(X/8) +INT(Y/8)*80 +Basisadresse
Leider ist es ein Problem, Werte in den Speicher des VDC zu bekommen. Hier hilft jedoch einschlägige Literatur weiter. Wie man von Basic aus Werte in den VDC-Speicher bekommt, wird noch beschrieben. Nun zunächst zur Registerbelegung:
Register |
Wert |
25 |
$CO/$C7 |
20 |
$37 |
6 |
$16 |
Rest wie bei 80 Zeichen je Zeile
Die Basisadresse der Farbinformation ist jetzt $3700 = 14080. Die Farbinformation gibt für je 8x8 Punkte die Vordergrund- und die Hintergrundfarbe an (obere 4 Bit: Hintergrundfarbe, untere 4 Bit: Vordergrundfarbe).
Auch andere Werte für Zeilen und Spalten wären denkbar, zum Beispiel 72x25, 75x24, 79x23, 82x22 oder 86x21.
Hierbei ist die Zeichenzahl je Zeile in Register l, die Anzahl der Zeilen in Register 6 und die Adresse des Farbspeichers in Register 20/21 einzutragen.
6. Zweifarbige Grafik im 40-Zeichen-Modus
Dieser Modus ist sicher nicht so interessant. Jedoch kann
hier die Grafik-Erweiterung aus Ausgabe 12/85 verwendet werden. Hierbei ist dann ein Quadrat auch ein Quadrat und nicht so stark in der X-Richtung verkürzt. Es sollte jedoch beachtet werden, daß die X-Koordinaten nicht über den Wert 320 hinausgehen. Hier die zugehörigen Werte: Register Wert
25 $90/$96
sonst wie bei 1.
Hierbei entsteht bei den Video-Chips des zweiten Typs am Rand leider ein nicht vermeidbares leichtes Flimmern.
7. Farbige Grafik im 40-Zeichen-Modus
Dieser Modus ist natürlich hier besonders interessant, da hier volle 320x200 Punkte in mehreren Farben dargestellt werden können. Im Extremfall lassen sich sogar 400x256 Punkte farbig darstellen (32 Zeilen/50 Zeichen je Zeile). Hier die Werte:
Register |
Wert |
1 |
Zeichenzahl je Zeile; $28 = 40, $32 = 50 |
27 |
$00 |
25 |
$DO/$D6 |
6 |
Zeilenzahl; $19 = 25, $20 = 32 |
20 |
$3C |
Der Farbspeicher beginnt bei dieser Kombination ab $3COO und ist damit auch für die Darstellung von 400x256 Punkten geeignet.
Zum Schluß sei noch eine Möglichkeit erwähnt, von Basic aus in den VDC-Speicher zu schreiben. (Beim C 128 des Autors hat es jedenfalls funktioniert.) Bei der hier beschriebenen Routine ist A die Adresse, an die der Wert W geschrieben werden soll:
10 POKE 54784,3l:POKE 54785,W
20 POKE 54784,18:POKE 54785,A/256
30 POKE 54784,19:POKE 54785,A AND 255 40 POKE 54784,30:POKE 54785,1
50 RETURN
Diese Routine ist jedoch für schnelle Grafik ebenso ungeeignet wie die Grafik im C 64-Modus, wenn man sie dort von Basic aus programmieren will. Daher ein Aufruf an alle Assembler-Programmierer: Schicken Sie doch eine Grafik-Erweiterung, die diese Möglichkeiten ausnutzt!
Noch ein Wort zur Geschwindigkeit: Da alle Berechnungen und Ausgaben auch im FAST-Modus arbeiten, ist die Geschwindigkeit gar nicht so gering, wie häufig angenommen wird. Oft ist nicht die Zeit zum Setzen der Punkte entscheidend, sondern die Zeit, um irgendwelche Werte zu errechnen.
Diskette zum Heft und damit auch die
genannten Listings, gibt's hier
|
|
|