VDC

Aus C64-Wiki
Wechseln zu: Navigation, Suche

VDC steht für Video Display Controller (in deutsch etwa: Videoanzeigencontroller) und bezeichnet einen Videochip der Firma MOS. Ursprünglich für den CBM 900 entwickelt, kam der VDC letztendlich im C128 zum Einsatz. Dort übernimmt er die Bildschirmausgabe im 80-Zeichen-Modus. Es wurden 2 nicht vollständig kompatible Versionen produziert, der 8563 und der 8568. Die Ausgabe erfolgt als RGBI- und als Monochrom-Signal, somit können CGA- und Monochrom-Bildschirme direkt angeschlossen werden.

Der VDC besitzt ein eigenes Video-RAM mit 16 oder 64 KByte Größe und wird asynchron zum Rest des C128 getaktet, wobei ein 16 MHz Pixeltakt zugrunde liegt.

Fähigkeiten[Bearbeiten]

  • 16 Farben (RGBI)
  • Textmodus:
    • standardmäßig 25 Zeilen à 80 Zeichen
    • Zeilenanzahl und Anzahl Zeichen/Zeile kann weitgehend frei bestimmt werden.
    • 2 Zeichensätze à 256 Zeichen sind gleichzeitig benutzbar.
    • Vordergrundfarbe für einzelne Zeichen wählbar
    • 4 Attribute/Zeichen: invertiert, blinkend, unterstrichen, Zeichensatz 1 oder 2
    • hardwaremäßiges Interlace
    • variable Zeichenhöhe von 2 bis 32 Pixel
    • Hardware-Textcursor mit automatischem Blinkmodus
  • Grafikmodus:
    • Auflösung von 640×200 Pixel, bei 64 KByte Speicher bis zu 800×240 Pixel
    • Auflösung variierbar
    • Vorder- und Hintergrundfarbe kann für einzelne Farbzellen separat eingestellt werden.
  • Selbständiges Verschieben von bis zu 256 Bytes großen Datenblöcken

Vor- und Nachteile gegenüber dem VIC[Bearbeiten]

Im Vergleich zum VIC-II ergeben sich folgende
Vorteile:

  • Höhere Auflösung
  • Gestochen scharfe Darstellung
  • Horizontales und vertikales Hardware-Scrolling ohne Tricks
  • Doppelt so viele unterschiedliche Zeichen darstellbar als beim VIC (4× soviel, wenn man auch die Reverse-Darstellung berücksichtigt)
  • Einfachere Datenorganisation des Hires-Modus
  • Hardware-Textcursor

Nachteile:

Programmierung des VDC[Bearbeiten]

Der VDC verfügt über 36 (8563) bzw. 37 (8568) interne Register, diese sind jedoch nur indirekt über 2 Register im Ein-/Ausgabe-Bereich an der Adresse $D600/$D601 zu erreichen:

  1. In Register $D600 wird das gewünschte VDC-Register geschrieben.
  2. Es wird gewartet, bis Bit 7 von $D600 gesetzt ist.
  3. Den Wert des gewünschten Registers aus $D601 auslesen bzw. in $D601 schreiben.

Auch der Videospeicher des VDC ist nur auf diese Weise erreichbar.

Beim C128 ist am einfachsten die Nutzung der zwei Betriebssystemfunktionen bei $CDCC (VDC-Register schreiben) und $CDDA (VDC-Register lesen). Ein Beispiel in BASIC (erhöht die Zeilenhöhe auf 9 Rasterzeilen):

SYS DEC("CDCC"),8,9

Beim Auslesen hat Adresse $D600 folgende Bedeutungen:

Bit Bezeichnung Funktion
7 Status Dieses Bit signalisiert, ob der VDC mit seiner letzten Tätigkeit fertig ist. (1 = fertig)
6 LP Lichtgriffel (Lightpen)
5 VBlank Kathodenstrahl-Rücklauf (1 = Rücklauf)
4..3 Ohne Funktion
2..0 VER VDC-Version

Interne Register des VDC[Bearbeiten]

Register Standardwert
dez. (hex)
binär
Bits Funktion Bemerkung
0 126 ($7E) NTSC
%01111110
127 ($7F) PAL(*)
%01111110
7..0 Anzahl der Zeichen - 1 zwischen 2 horizontalen Synchronisationspulse Hier werden die maximal zur Verfügung stehenden Zeichen pro Zeile festgelegt. Die Zeichenzahl sollte durch 8 teilbar sein.
Entspricht der Horizontalfrequenz, ausgehend vom Pixeltakt: 16.000.000 / ((Register0 + 1) * 8) in Hz
1 80 ($50)
%01010000
7..0 Anzahl der angezeigten Zeichen pro Zeile Hier wird die tatsächliche Zeichenzahl pro Zeile festgelegt. Alle Werte die kleiner als Register 0 sind, sind möglich.
2 102 ($66)
%01100110
7..0 Horizontale Sync-Position Hier wird der linke Rand positioniert. Erlaubt sind alle Werte, die größer als Register 1 sind. Wenn die Zahl in diesem Register mit einem kleineren Wert überschrieben wird, wandert das Bild nach rechts. Interessante Effekte sind damit möglich.
3 73 ($49)
%01001001
7..4 Breite des vertikalen Synchronisationspulses Wert ist ein Vielfaches einer Rasterperiode. Null entspricht dem Wert 16.
3..0 Breite des horizontalen Synchronisationspulses Pulsbreite in Zeichen + 1. Der Wert 0 lässt sich nicht programmieren.
4 32 ($20) NTSC
%00100000
38 ($26) PAL(*)
%00100110
7..0 Gesamte Anzahl der Zeilen In diesem Register wird die Anzahl der Zeichenzeilen - 1 inklusive des vertikalen Strahlrücklaufs angegeben.
Bildzeilen = (Register4 + 1) * (Register9 + 1)
5 25 ($19)
%00011001
7..5 unbenutzt Bits immer gesetzt
4..0 Feinjustierung von Register 4
6 25 ($19)
%00011001
7..0 Anzahl der angezeigten Zeilen Hier wird festgelegt, wie viele Zeilen der VDC anzeigt; Größere Werte als in Register 4 sind nicht möglich.
7 32 ($20)
%00100000
7..0 Vertikale Sync-Position Hier wird festgelegt, an welcher Stelle die erste Zeile beginnt. Je größer die Zahl, um so weiter unten beginnt die erste Zeile.
8 32 ($20)
%00100000
7..2 unbelegt Bits immer gesetzt
1..0 Interlace & Video-Modus Wert 00 oder 01 => Normaler, nicht-Interlace-Modus

Wert 10 => Interlace-Sync-Modus:
Wert 11 => Interlace-Modus: doppelte vertikale Auflösung, aber verbunden mit starkem Flackern

9 231 ($E7)
%11100111
7..5 ungenutzt Bits immer gesetzt
4..0 Rasterzeilen pro Zeichen bestimmt die Höhe eines Zeichens in Rasterzeilen (Wert - 1)
10 160 ($A0)
%10100000
7 ungenutzt Bits immer gesetzt
6..5 Cursormodus 00 => Cursor-Blinken aus

01 => Cursor aus
10 => Cursor-Blinken schnell
11 => Cursor-Blinken normal

4..0 Cursor-Startzeile Rasterzeile, wo der Textcursor anfängt. Bestimmt zusammen mit Register 11 die Höhe des Cursors.
11 231 ($E7)
%11100111
7..5 ungenutzt Bits immer gesetzt
4..0 Cursor-Endzeile Rasterzeile + 1, wo der Textcursor aufhört.
12 0 ($00)
%00000000
7..0 Beginn Videospeicher High High-Byte der Adresse, an der das Video-RAM beginnt.
13 0 ($00)
%00000000
7..0 Beginn Videospeicher Low Low-Byte der Adresse, an der das Video-RAM beginnt.
14 0 ($00)
%00000000
7..0 Cursor-Position High High-Byte der Position des Textcursors.
15 0 ($00)
%00000000
7..0 Cursor-Position Low Low-Byte der Position des Textcursors.
16 undefiniert 7..0 Lightpen vertikal Vertikale Lightpen-Position in Zeichenzeilen + 1
17 undefiniert 7..0 Lightpen horizontal Horizontale Lightpen-Position in Zeichen + 8
18 undefiniert 7..0 Update-Adresse High High-Byte der Adresse, die man lesen oder beschreiben will. Wird vom VDC automatisch inkrementiert.
19 undefiniert 7..0 Update-Adresse Low Low-Byte der Adresse, die man lesen oder beschreiben will. Wird vom VDC automatisch inkrementiert.
20 4 ($04)
%00000100
7..0 Beginn Attributspeicher High High-Byte der Adresse, an der das Attribut-RAM beginnt.
21 0 ($00)
%00000000
7..0 Beginn Attributspeicher Low Low-Byte der Adresse, an der das Attribut-RAM beginnt.
22 120 ($78)
%01111000
7..4 Maximale Zeichenbreite Zeichenbreite in Pixel - 1, inkl. Zeichenzwischenraum
3..0 Angezeigte Zeichenbreite Zeichenbreite in Pixel - 1, ohne Zeichenzwischenraum
23 232 ($E8)
%11101000
7..5 ungenutzt Bits immer gesetzt
4..0 Zeichenhöhe Rasterzeilen - 1 der angezeigten Zeichenhöhe ohne Zeilenzwischenraum. Sollte kleiner oder gleich Register 9 sein.
24 32 ($20)
%00100000
7 Block-Copy 0 => Block wird geschrieben

1 => Block wird kopiert.

6 Revers/Normal-Darstellung 0 => Normaldarstellung

1 => Bildschirm wird invertiert.

5 Blinkrate der Buchstaben 0 => Rate entspricht 1/16 der Bildwiederholfrequenz,

1 => Rate entspricht 1/32 der Bildwiederholfrequenz.

4..0 Vertikales Smooth (Soft)-Scrolling Anzahl der Rasterzeilen, um die die Darstellung nach oben verschoben wird.
25 64 ($40)
%01000000
7 Darstellungsmodus 0 => Textmodus

1 => Grafikmodus (Hires)

6 Attribute ein/aus 0 => Zeichen-Attribute ausgeschaltet

1 => Zeichen-Attribute eingeschaltet

5 Semigrafik 0 => der Zeichenzwischenraum wird mit der Hintergrundfarbe gefüllt,

1 => der Zeichenzwischenraum wird mit der Farbe des letzten Zeichens gefüllt.

4 Pixelbreite 0 => normale Pixelbreite

1 => doppelte Pixelbreite

3..0 Horizontales Smooth (Soft)-Scrolling Anzahl der Pixel, um die die Darstellung nach links verschoben wird.
26 240 ($F0)
%11110000
7..4 Vordergrundfarbe Vordergrundfarbe bei abgeschaltetem Attribut-RAM
3..0 Hintergrundfarbe Hintergrund und Rahmenfarbe
27 0 ($00)
%00000000
7..0 Adressen-Inkrement pro Zeile Wert, der am Ende jeder Zeichenzeile zum Video- und Attribut-RAM-Zeiger aufaddiert wird, um die Adresse der neuen Zeile zu erhalten.
28 47 ($2F)
%00101111
7..5 Startadresse des Zeichengenerators Startadresse wird in 8K-Schritten festgelegt.
4 Größe des VDC-RAMs 0 => 16 KByte RAM
1 => 64 KByte RAM
(keine automatische Erkennung)
3..0 ungenutzt
29 231 ($E7)
%11100111
7..5 ungenutzt Bits immer gesetzt
4..0 Unterstreichungszeile Pixelzeile in welcher ein Zeichen unterstrichen wird.
30 undefiniert 7..0 Anzahl Block-Write- oder Block-Copy-Zyklen Gibt die Größe eines Write- oder Copy-Blockes an. 0 entspricht 256 Bytes. Ein Beschreiben des Registers startet den Zyklus.
31 undefiniert 7..0 Data Lesen: Inhalt der durch Register 18/19 angegebenen Adresse

Schreiben: Wert wird in die durch Register 18/19 angegebene Speicherzelle geschrieben. Anschließend kann der Wert für Block-Write benutzt werden.

32 undefiniert 7..0 High-Byte der Block-Copy-Quelladresse High-Byte der Start-Adresse des zu kopierenden Blockes.
33 undefiniert 7..0 Low-Byte der Block-Copy-Quelladresse Low-Byte der Start-Adresse des zu kopierenden Blockes.
34 125 ($7D)
%011100111
7..0 Beginn 1. Zeichen Anzahl der Zeichen vom Beginn der dargestellten Zeile bis zur positiven Flanke des Display-Enable-Pins.
35 64 ($40)
%01000000
7..0 Ende letztes Zeichen Anzahl der Zeichen vom Beginn der dargestellten Zeile bis zur negativen Flanke des Display-Enable-Pins.
36 245 ($F5)
%11110101
7..4 ungenutzt Bits immer gesetzt
3..0 DRAM-Refresh Anzahl der Refresh-Zyklen pro Rasterzeile.

Anmerkung:

  • ab ROM-Version von 1986

Bildparameter[Bearbeiten]

Details siehe Literatur und Diskussionen in Foren zur VDC-Programmierung[1].

Pixelfrequenz/-takt:

T = 16 MHz

Horizontal-/Zeilenfrequenz:

HF = T / ((Register0 + 1) * 8)
  • Einheit: Hz
  • Standardwert:
    • PAL: 15625 Hz
    • NTSC: 15748 Hz (Normfrequenz: 15734,26 Hz)

Bildzeilen:

Zeilen = (Register4 + 1) * (Register9 + 1)

Vertikalfrequenz oder Bildwiederholfrequenz/-rate:

BF = HF / Zeilen
  • Einheit: Hz
  • Standardwert:
    • PAL: 50,08 Hz
    • NTSC: 59,65 Hz

Emulation[Bearbeiten]

Die exakte Nachbildung des Verhaltens bei C128-Emulatoren ist faktisch nicht gegeben. Schon sehr nahe kommt aber der im Beta-Stadium befindliche Z128K bzw. Z64K. Mit etlichen Detailfehlern zu kämpfen hat hingegen VICE.

Pinbelegung des VDC 8563[Bearbeiten]

Pin Beschreibung
VDC-Pinbelegung.png CCLK Character Clock
DCLK Video Dot Clock D
HSYNC Horizontales Sync-Signal
n/c nicht verbunden
CS Chip Select
RS Register Select:
  • Low -> Lesen/Schreiben externes Register 0
  • High -> Lesen/Schreiben externes Register 1
R/W Read/Write - Register lesen oder schreiben
D0 - D7 Datenbus Bits 0 - 7
Vss Systemmasse
DISPEN Display Enable
VSYNC Vertikales Sync-Signal
DR/W Read/Write - VDC-RAM lesen/schreiben
INIT bei Low-Pegel werden die internen Control-Latches gelöscht
RES Reset-Eingang
TEST
LPEN Eingang für Lightpen
DA0 - DA7 Adressbus Bits 0 - 7 multiplext mit 8 - 15 für VDC-RAM
DD0 - DD7 Datenbus Bits 0 - 7
Vcc Versorgungsspannung +5 V DC
R, G, B, I Ausgabe Farbwerte für Rot, Grün, Blau, Intensität
RAS Row Address Strobe für VDC-RAM
CAS Column Address Strobe für VDC-RAM

Literatur[Bearbeiten]

Weblinks[Bearbeiten]

WP-W11.png Wikipedia: MOS Technology VDC
WP-W11.png Wikipedia: MOS Technology 8563 Sprache:english

Quellen

  1. Forum64: VICE x128 und VDC: Kein Interlace möglich?