MOS Technology VDC

aus Wikipedia, der freien Enzyklopädie

Wechseln zu: Navigation, Suche

Der MOS Technology VDC (Video Display Controller) ist ein Videochip, der für die 80-Zeichen-Ausgabe im Commodore C128 zuständig ist. Er wird an einen Monitor mit RGBI-Eingang (z.B. CGA-Bildschirme) angeschlossen. Ursprünglich wurde der VDC für den CBM 900 entwickelt, ein Computersystem mit einer Zilog Z-8001-CPU. Es wurden 2 nicht vollständig kompatible Versionen produziert, der 8563 und der 8568. Der Chip verfügt über ein eigenes Video-RAM, dieses ist in den alten C128-Versionen 16 KB groß, im neueren C128DCR 64 KB, jedoch können beide 64 KB adressieren.
Der Chip wird asynchron zum Rest des Computers getaktet.

[Bearbeiten] Technische Daten

  • 16 oder 64 KB Speicher
  • 16 Farben (RGBI)
  • Grafik-Auflösung 640 x 200 Pixel, bei 64 KB-Version auch erweiterbar auf 800 x 240 bzw 480 (Interlaced) Pixel
  • Textmodus mit 80 Zeichen à 25 Zeilen, variierbar je nach Zeichengröße
  • 2 Zeichensätze à 256 Zeichen gleichzeitig nutzbar
  • Zeichengröße 2 bis 32 Rasterzeilen à 8 Pixel Breite
  • 1 bildschirmweite Hintergrundfarbe, 1 Vordergrundfarbe pro Zeichen und 4 Attribute (invertiert, blinkend, unterstrichen, Zeichensatz 1 oder 2)
  • Farbzellen im Bitmap-Modus von 8 Pixeln Breite und 2 bis 32 Pixeln Höhe, jede Zelle kann eine eigene Vorder- und Hintergrundfarbe benutzen.
  • Hardware-Textcursor
  • Fähigkeit zum Verschieben von bis zu 256 Bytes großen Datenblöcken
  • Horizontales und vertikales Hardware Scrolling

[Bearbeiten] Programmierung des VDC

Der VDC verfügt über 36 (8563) bzw. 37 (8568) interne Register. Register 37 kam beim 8568 hinzu, wodurch der Refresh schneller getaktet werden konnte als bei seinem Vorgänger. Erreichbar sind diese jedoch nur sehr umständlich über 2 Speicherzellen im Ein/Ausgabe-Bereich an der Hexadezimal-Adresse $D600/$D601.

In Adresse $D600 wird angegeben welches Register man ansprechen will, in Adresse $D601 wird dann das angesprochene Register ausgelesen oder beschrieben. Dabei muss man warten, bis Bit 7 von $D600 gesetzt ist. Am einfachsten geht dies mit den beiden Betriebssystemfunktionen $FCDCA & $FCDD8 (auch in Basic).

Adresse $FD600 hat noch weitere Bedeutungen, beim Auslesen erhält man:

  • Bit 7 = Statusbit: hier erfährt man ob der VDC mit seiner letzten Arbeit fertig ist (0 = Fertig).
  • Bit 6 = Lichtgriffel (Lightpen)
  • Bit 5 = Kathodenstrahl-Rücklauf: 1 = Rücklauf.

die anderen Bits sind nicht belegt.


[Bearbeiten] Bedeutung der 37 ($25) Register

Die Zahl in Klammer bedeutet den Standardwert (Dec $Hex) Schreibweise.

Register 0 ($00): Max. Horizontale Zeilen; (126 $7E)

            Hier werden die maximal zur Verfügung stehenden Zeichen pro 
            Zeile festgelegt. Die Zeichenzahl sollte durch 8 teilbar sein.

Register 1 ($01): Max. Zeichen pro Zeile; (80 $50)

            Hier wird die tatsächliche Zeichenzahl pro Zeile festgelegt.
            Alle Werte die kleiner als Register 1 sind, sind möglich.

Register 2 ($02): Linker Rand; (102 $66)

            Hier wird der linke Rand positioniert. Erlaubt sind alle Werte die
            kleiner als Register 0 sind. Wenn die Zahl in diesem
            Register mit einem kleineren Wert überschrieben wird, wandert das
            Bild nach rechts. Interessante Effekte sind damit möglich.

Register 3 ($03): Sync Breite; (73 $49)

            Bits 0-3 bestimmen die horizontale Sync-Puls-Breite in Zeichen.
                     Der Wert 0 $00 lässt sich nicht programmieren.
            Bits 4-7 bestimmen die vertikale Sync-Puls-Breite. Diese ist ein
                     vielfaches einer Rasterperiode. Null entspricht
                     dem Wert 16.

Register 4 ($04): Max. Vertikal Zeichen; (39 $27)

            In diesem Register wird die Anzahl der totalen Zeilen inklusive
            des vertikalen Strahlrücklaufes angegeben.

Register 5 ($05): Feinjustierung von Register 4; (224 $E0)

            Bits 0-4 ist die Feinjustierung von Register 4.
            Bits 5-7 müssen immer gesetzt sein.
            Der Wert 224 bedeutet, dass die Bits 0-4 gelöscht sind.

Register 6 ($06): Zeilenzahl; (25 $19)

            Hier wird festgelegt, wieviel Zeilen der VDC anzeigt; Größere Werte
            als in Register 4 sind nicht möglich.

Register 7 ($07): Oberer Rand; (32 $20)

            Hier wird festgelegt an welcher Stelle die erste Zeile beginnt.
            Je größer die Zahl um so weiter unten beginnt die erste Zeile.

Register 8 ($08): Interlace / Video Modus; (252 $FC)

            Bit 0 Video Modus normalerweise 0.
            Bit 1 Interlace 0 = aus 1 = ein normalerweise 0, bei 1 scheint
                  das Bild zu flackern.
            Die Bits 2 - 7 sind nicht belegt.

Register 9 ($09): Rasterzeilen pro Zeichen; (231 $E7)

            Bits 0 - 4 bestimmen aus wievielen Rasterzeilen ein Zeichen
            besteht,(Wert -1).
            Bits 5 - 7 sind immer gesetzt.

Register 10 ($0A): Cursor Modus / Raster Start; (160 $A0)

            Bits 5 + 6 bestimmen den Cursor Modus
                       00 = Cursor blinken aus,
                       01 = Cursor aus,
                       10 = Cursor blinken schnell,
                       11 = Cursor blinken normal.

Register 11 ($0B): Cursor Ende; (231 $E7)

            Bits 0 - 4 geben die Rasterzeilen an, an denen der Cursor aufhört.
            Bits 5 - 7 sind immer gesetzt.

Register 12 ($0C: Video Ram Hi; (0 $00)

            Hi Byte Adresse an der, das Video Ram beginnt.

Register 13 ($0D): Video Ram Lo; (0 $00)

            Lo Byte Adresse an der, das Video Ram beginnt.

Register 14 ($0E): Cursor Position Hi;

            Hi Byte Adresse an der, der Cursor ist.

Register 15 ($0F): Cursor Position Lo;

            Lo Byte Adresse an der, der Cursor ist.

Register 16 ($10): Lightpen vertikal;

            Vertikale Lightpen-Position in Zeichenzeilen.

Register 17 ($11): Lightpen horizontal;

            Horizontale Lightpen-Position (Zeichen)

Register 18 ($12): Update Adresse Hi;

            Hier wird das Hi-Byte der Adresse angegeben, die man beschreiben 
            will, egal ob Video, Attribut oder sonstiges Ram.

Register 19 ($13): Update Adresse Lo;

            dito jedoch das Lo-Byte.

Register 20 ($14): Farb Ram Hi; (4 $04)

            Hi-Byte Adresse an der das Farb-Ram beginnt.

Register 21 ($15): Farb Ram Lo; (0 $00)

            Lo-Byte Adresse an der das Farb-Ram beginnt.

Register 22 ($16): Max. Zeichenbreite; (120 $78)

            Bits 0 - 3 geben die Zeichenbreite an.
            Bits 4 - 7 geben die maximal darstellbare Zeichenbreite -1 an.

Register 23 ($17): Zeichenhöhe; (232 $E8)

            Hier wir die Höhe eines Zeichens festgelegt.

Register 24 ($18): Vertikal Smooth Scroll; (32 $20)

            Bit 7      Copy - Bit: ist das Bit gesetzt von Reg 32 nach Reg 18
                       Kopiert sonst von Reg 31.
            Bit 6      RVS - Bit: wird das Bit gesetzt, dann wird der gesamte
                       Bildschirm invertiert (revers) angezeigt.
            Bit 5      Blinkrate 1 = 1/30; 0 = 1/16
            Bits 0 - 4 Smooth Scrolling: verschiebt den vertikalen Rand in
                       Rasterzeilen

Register 25 ($19): Horizontal Smooth Scroll; (64 $47)

            Bit 7      Text 0 = Einzelpunktgrafik; 1 = Textmodus 
            Bit 6      ATR  0 = Monochrom; 1 = Color
            Bit 5      Semi 0 = der Zeichenzwichenraum wird mit der 
                       Hindergrundfarbe 1 = mit der Farbe des letzten 
                       Zeichens aufgefüllt.
            Bit 4      DBL gesetztes Bit = doppelte Zeichenbreite 
            Bits 0 - 3 Der Horizontale Rand wird in Rasterzeilen verschoben.

Register 26 ($1A): Hintergrúndfarbe / Vordergrundfarbe; (240 $F0)

            Bits 0 - 3 Hintergrundfarbe
            Bits 4 - 7 Vordergrundfarbe

Register 27 ($1B): Addierwert zur Zeichenanzahl; (0 $00)

            Der Wert dieses Byte wird zum Videoram hinzuaddiert.
            Der Wert 20 bedeutet 60 Zeichen pro Zeile 

Register 28 ($1C): Zeichensatz-Adresse; (47 $2F)

            Die Bits 5 - 7 legen die Startadresse des Zeichengenerators in
            8K Schritten fest.
            Das Bit 4 bestimmt die Größe des VDC-Rams: 0 = 16 K Ram, 1 = 64 K Ram; das Bit muss gesetzt
            werden (keine automatische Erkennung).

Register 29 ($1D): Unterstreichungszeile; (231 $E7)

            Mit den Bits 0 - 4 wird angegeben, in welcher Pixelzeile ein Zeichen unterstrichen wird
            (Standard ist 8).

Register 30 ($1E): Wort Zahl;

            Hier wird angegeben wieviel Byte geschrieben bzw. kopiert werden.

Register 31 ($1F): Data;

            Über dieses Register werden die Daten ein- und aus- gelesen.

Register 32 ($20): Block Startadresse Hi;

            Hier und im folgenden Register wird die Startadresse definiert ab 
            der kopiert werden soll.

Register 33 ($21): Block Startadresse Lo;

            Siehe Register 32.

Register 34 ($22): Beginn 1. Zeichen; (125 $7D)

            Beginn der Zeichenanzahl, die bis zur positiven Flanke dargestellt 
            werden soll.

Register 35 ($23): Ende letztes Zeichen; (64 $100)

            dito. jedoch negative Flanke.

Register 36 ($24): DRam Refresh; (245 $F5)

            Bits 0 - 3 geben die Refreshrate des VDC Ramspeichers an.
Persönliche Werkzeuge
Andere Sprachen