# MOS Technology VIC II

Der VIC-II (Video Interface Controller-II) von MOS Technology, Nachfolger des VIC, ist ein Video Display Controller, der im Commodore-Heimcomputer C64 und (als leicht erweiterter VIC IIE bzw. VIC III) im C128 zum Einsatz kam. Er wurde in NTSC- (MOS 6567/MOS 8562) und PAL-Versionen (MOS 6569/MOS 8565) produziert. Eine Besonderheit des VIC II sind seine 8 Hardware-Sprites mit Kollisionsabfrage.

## Technische Daten

* Erzeugung des Systemtakts für die anderen Chips
* Automatischer Refresh für dynamische RAMs (DRAM).
* Bus und Speicher kann mit Prozessoren der 6502-Familie ohne große Verlangsamung eines der beiden Chips gemeinsam verwendet werden, beide Chips greifen abwechselnd darauf zu.
* 16 kB Adressbereich (DMA) für Video- und Zeichensatzspeicher
* Separater 1000 × 4 Bit-Farbspeicher, beim C64 mit statischem RAM (SRAM) realisiert. (Im für die CPU vorgesehenen Adressraum der Größe 1 kB erscheint nur ein Nibble je adressiertem Byte.)
* 16 Farben
* Textmodus mit 25 Zeilen zu 40 Zeichen
* 3 Textmodi:
** Hires mit 8 × 8 Pixeln pro Zeichen, einer aus 16 Vordergrundfarben je Zeichen und einer für den gesamten Bildschirm geltenden Hintergrundfarbe.
** Extended-Color Mode (ECM) mit 8 × 8 Pixeln pro Zeichen, einer aus 16 Vordergrundfarben und einer von 4 (aus 16) Hintergrundfarben je Zeichen, Zeichensatz auf die ersten 64 Zeichen eingeschränkt.
** Multi-Color mit 4 × 8 (doppeltbreiten) Pixeln pro Zeichen, je Zeichen eine aus 8 Vordergrundfarben, und 3 bildschirmweit geltenden weiteren Farben aus 16. Hires-Zeichen und Multicolor-Zeichen können dabei beliebig gemischt werden, die Vordergrundfarbe ist nur aus den ersten 8 Farben wählbar.
* 2 Grafikmodi:
** Hires mit 320 × 200 Pixeln, und einer frei wählbaren Vorder- und Hintergrundfarbe pro 8 × 8-Pixel-Feld
** Multi-Color mit 160 × 200 (doppeltbreiten) Pixeln, 3 frei wählbaren Farben je 4 × 8 Pixel-Feld sowie einer bildschirmweit einstellbaren Farbe.
* Hardware-Pixel-Bildlauf (vertikal und horizontal um maximal 8 Hires-Pixel)
* 8 Hardware-Sprites mit 24 × 21 Pixeln Größe mit Kollisionsabfrage, Multicolor-Möglichkeit und getrennter Skalierbarkeit auf das jeweils Doppelte in X- und Y-Richtung.
* Optionale Interrupts bei Sprite-Sprite- und Sprite-Grafik-Kollisionen
* Rasterzeilen-Interrupts
* Lichtgriffel-Funktion mit Interrupts
* Ausgabesignal: Y/C, getrennte Luminanz und Chrominanz (ähnlich wie bei S-Video, nur mit geringerer Luma-Amplitude)

## Programmierung des VIC II

Eine zentrale Rolle bei der Programmierung des VIC II spielt der Rasterzeileninterrupt. Dieser kann dazu dienen, an bestimmten Bildschirmpositionen das aktuelle Hauptprogramm anzuhalten und neue Registerinhalte in einige VIC II-Register zu laden. Auf diese Weise kann man sehr einfach den Bildschirm in mehrere verschiedene Bereiche unterteilen (Split Screen). Weiterhin kann man mit deren Hilfe recht leicht die 8 Sprites mehrfach pro Bildaufbau verwenden, so dass man sehr viel mehr Sprites darstellen kann. Diese beiden Verfahren werden von sehr vielen C64-Spielen verwendet.
Weiterhin stellt der Rahmen um die Grafik des C64 ein Problem dar, besonders bei PAL-Systemen ist dieser sehr breit. Der VIC II bietet keinerlei Register, die Darstellung von Grafik in diesem Bereich ermöglichen, allerdings kann man durch einige geschickte Registermanipulationen zur richtigen Zeit die Maskierung der Darstellung durch den Rahmen abschalten und so zumindest Sprites in diesem Bereich darstellen, so dass sich die Grafikdarstellung auf bis zu 402 Pixel Breite und ungefähr 284 Pixel Höhe (bei PAL, weniger bei NTSC-Systemen) erweitern lässt.
Auch die Farbauflösung in den Grafikmodi lässt sich durch geschickte Registermanipulation erhöhen. Man kann den VIC II dazu zwingen, nicht nur bei jeder achten, sondern bei jeder Rasterzeile neue Farbinformation aus dem Speicher zu laden. Das hat zur Folge, dass bei einer bildschirmfüllenden Grafik zwar mehr als 64 % der Rechenzeit für die Grafikdarstellung aufgewendet wird, aber man erhält einen fast vollwertigen 16-Farben-Modus (FLI, Flexible Line Interpreter).
Schnelles Scrollen von Bitmap-Grafik ist ebenfalls durch ausgefeilte Registermanipulationen möglich, horizontal kann so der Bildschirmanfang verschoben werden (HSP – Horizontal Screen Position), was ein viel zu rechenaufwendiges Umkopieren der gesamten Bitmap alle 8 Pixel (wie es bei herkömmlichem Hardwarescrolling nötig wäre) überflüssig macht – es braucht nur der hereinscrollende Bereich neu beschrieben zu werden. Vertikal kann die Bitmap mittels FLD (Flexible Line Distance) nach unten bzw. per Linecrunching nach oben verschoben werden (VSP – Variable Screen Position). Zusammen ist dieser Effekt unter C64-Programmierern als AGSP (Any Given Screen Position) bekannt.