VIC

Aus C64-Wiki
Wechseln zu: Navigation, Suche
Produktionsdatum dieses Chips: 1984 - Kalenderwoche 43
ältere Bauform des VIC 6569

Die Bezeichnung bzw. Abkürzung VIC steht bei Commodore-Heimcomputer für Video-Interface-Chip. Er dient zu der Steuerung aller grafischen Vorgänge (Zeichen, Sprites, Bitmapgrafik) beim VC20/10, C64/128 und bei der CBM500-Serie. Die Chips wurden vom Halbleiterhersteller MOS Technology produziert, den Commodore 1976 übernommen hatte.

Der im VC-20 für Ton- und Grafikausgabe verwendete VIC 6560/6561 wird als "Original" VIC-Chip bezeichnet, während die wesentlich veränderten Nachfolger (im VC-10, C64 und C128) die Bezeichnung VIC-II tragen. Erst der VIC-II unterstützt Sprites.

VIC-Varianten[Bearbeiten]

Folgende Chip-Varianten wurden verwendet:

  • Im C64 und seinen Varianten wie SX64, PET 64 oder C64 Games System: 6566, 6567, 8562 (NTSC) / 6569, 8565 (PAL)
    • Achtung: An Pin 13/Vdd erwarten die NMOS-Chips 6566/67/69 +12V, die HMOS-II-Varianten (8562/65) erwarten +5V DC.
    • Die 856x haben das sogenannte Grey Dots-Problem.
  • Im VC20: 6560 (NTSC) / 6561 (PAL)
  • Im VC10 und bei der CBM500-Serie: 6566 (NTSC) / 6569 (PAL)
  • Im C128/D/DCR: 8564 (NTSC), 8566 (PAL-B), 8569 (PAL-N)[1]
  • Im C65: 4567 "Bill"

Aufgaben des VIC-II im C64[Bearbeiten]

Der VIC-II im C64 übernimmt einige Aufgaben, die man nicht in einem Grafikchip vermutet, so kümmert er sich z.B. um das Refresh des RAMs. Außerdem kann der VIC-II die CPU, mit der er normalerweise im Wechseltakt auf den Speicher zugreift, zeitweise komplett anhalten (das passiert alle paar Rasterzeilen bei den sogenannten "Badlines"). Das ist nötig, da ansonsten die Speicherbandbreite für die Grafikfähigkeiten des VIC-II nicht ausreichen würde. Schließlich steht dem VIC-II noch ein eigener kleiner Speicher zur Verfügung, das Farbram, das zusätzlich zum normalen (CPU-)Datenbus einen eigenen Datenbus zum VIC-II hat. Details dazu finden sich im Artikel Hardware-Aufbau des C64.

Speicheradressen des VIC-II[Bearbeiten]

  • Sprites liegen bei Adresse MEM (Bildschirmspeicher + $03F8 + Sprite-Nummer)*64.
  • Die Adresse des Bildschirmspeichers wird durch die gewählte VIC-Bank ($DD00, siehe CIA 2) und $D018 festgelegt.
Adresse (hex) Adresse (dez) Register Inhalt
$D000 53248 0 X-Koordinate für Sprite 0 (0..255)
$D001 53249 1 Y-Koordinate für Sprite 0 (0..255)
$D002 53250 2 X-Koordinate für Sprite 1 (0..255)
$D003 53251 3 Y-Koordinate für Sprite 1 (0..255)
$D004 53252 4 X-Koordinate für Sprite 2 (0..255)
$D005 53253 5 Y-Koordinate für Sprite 2 (0..255)
$D006 53254 6 X-Koordinate für Sprite 3 (0..255)
$D007 53255 7 Y-Koordinate für Sprite 3 (0..255)
$D008 53256 8 X-Koordinate für Sprite 4 (0..255)
$D009 53257 9 Y-Koordinate für Sprite 4 (0..255)
$D00A 53258 10 X-Koordinate für Sprite 5 (0..255)
$D00B 53259 11 Y-Koordinate für Sprite 5 (0..255)
$D00C 53260 12 X-Koordinate für Sprite 6 (0..255)
$D00D 53261 13 Y-Koordinate für Sprite 6 (0..255)
$D00E 53262 14 X-Koordinate für Sprite 7 (0..255)
$D00F 53263 15 Y-Koordinate für Sprite 7 (0..255)
$D010 53264 16 Bit 8 für die obigen X-Koordinaten (Bitmaske: 0..255),
jedes Bit steht für eines der Sprites von 0 bis 7.
$D011 53265 17 Steuerregister, Einzelbedeutung der Bits (1 = an):
Bit 7: Bit 8 von $D012, Rasterzeile
Bit 6: Extended-Color-Modus
Bit 5: Bitmap-Modus
Bit 4: Bildausgabe eingeschaltet (Effekt erst beim nächsten Einzelbild)
Bit 3: 25 Zeilen (sonst 24)
Bit 2..0: Offset in Rasterzeilen vom oberen Bildschirmrand
$D012 53266 18 Lesen: Aktuelle Rasterzeile
Schreiben: Rasterzeile, bei der ein IRQ ausgelöst wird (zugehöriges Bit 8 in $D011)
$D013 53267 19 Lightpen X-Koordinate (assoziiert mit Pin LP am VIC-Chip)
$D014 53268 20 Lightpen Y-Koordinate
$D015 53269 21 Sprite-Schalter, Bit = 1: Sprite n an (Bitmaske: 0..255)
$D016 53270 22 Steuerregister, Einzelbedeutung der Bits (1 = an):
Bit 7..5: unbenutzt
Bit 4: Multicolor-Modus
Bit 3: 40 Spalten (an)/38 Spalten (aus)
Bit 2..0: Offset in Pixeln vom linken Bildschirmrand
$D017 53271 23 Spriteschalter, Bit = 1: Sprite n doppelt hoch (Bitmaske: 0..255)
$D018 53272 24 VIC-Speicherkontrollregister
  • Bit 7..4: Basisadresse des Bildschirmspeichers in aktueller 16-KByte-Bank des VIC = 64*(Bit 7…4)[2]
  • Bit 3..1: Basisadresse des Zeichensatzes = 1024*(Bit 3…1).

o d e r im Bitmap-Modus

  • Bit 3: Basisadresse der Bitmap = 1024*8 (Bit 3)
    (8-KByte-Schritte in VIC-Bank)
  • Bit 0 ist immer 1: nur 2 KByte Schritte in VIC-Bank[3]
Beachte: Das Character-ROM wird nur in VIC-Bank 0 und 2 ab 4096 eingeblendet.
$D019 53273 25 Interrupt Request, Bit (1 = an)
Lesen:
Bit 7: IRQ durch VIC ausgelöst
Bit 6..4: unbenutzt
Bit 3: Anforderung durch Lightpen
Bit 2: Anforderung durch Sprite-Sprite-Kollision (Reg. $D01E)
Bit 1: Anforderung durch Sprite-Hintergrund-Kollision (Reg. $D01F)
Bit 0: Anforderung durch Rasterstrahl (Reg. $D012)
Schreiben:
1 in jeweiliges Bit schreiben = zugehöriges Interrupt-Flag löschen
$D01A 53274 26 Interrupt Request: Maske, Bit (1 = an)
Ist das entsprechende Bit hier und in $D019 gesetzt, wird ein IRQ ausgelöst und Bit 7 in $D019 gesetzt.
Bit 7..4: unbenutzt
Bit 3: IRQ wird durch Lightpen ausgelöst
Bit 2: IRQ wird durch S-S-Kollision ausgelöst
Bit 1: IRQ wird durch S-H-Kollision ausgelöst
Bit 0: IRQ wird durch Rasterstrahl ausgelöst.
$D01B 53275 27 Priorität Sprite-Hintergrund, Bit = 1: Hintergrund liegt vor Sprite n (Bitmaske: 0..255)
$D01C 53276 28 Sprite-Darstellungsmodus, Bit = 1: Sprite n ist Multicolor, sonst einfärbig und hochauflösend (Bitmaske: 0..255)
$D01D 53277 29 Sprite-Schalter, Bit = 1: Sprite n doppelt breit (Bitmaske: 0..255)
$D01E 53278 30 Sprite-Info: Bits = 1: Sprites miteinander kollidiert (Bitmaske: 0..255)
Wird durch Zugriff gelöscht.
$D01F 53279 31 Sprite-Info: Bits = 1: Sprite n mit Hintergrund kollidiert (Bitmaske: 0..255)
Wird durch Zugriff gelöscht.
$D020 53280 32 Farbe des Bildschirmrands (0..15)
$D021 53281 33 Bildschirmhintergrundfarbe (0..15)
$D022 53282 34 Bildschirmhintergrundfarbe 1 bei Extended-Color-Modus (0..15)
$D023 53283 35 Bildschirmhintergrundfarbe 2 bei Extended-Color-Modus (0..15)
$D024 53284 36 Bildschirmhintergrundfarbe 3 bei Extended-Color-Modus (0..15)
$D025 53285 37 gemeinsame Sprite-Farbe 0 im Sprite-Multicolor-Modus, Bitkombination %01 (0..15)
$D026 53286 38 gemeinsame Sprite-Farbe 1 im Sprite-Multicolor-Modus, Bitkombination %11 (0..15)
$D027 53287 39 Farbe Sprite 0, Bitkombination %10 (0..15)
$D028 53288 40 Farbe Sprite 1, Bitkombination %10 (0..15)
$D029 53289 41 Farbe Sprite 2, Bitkombination %10 (0..15)
$D02A 53290 42 Farbe Sprite 3, Bitkombination %10 (0..15)
$D02B 53291 43 Farbe Sprite 4, Bitkombination %10 (0..15)
$D02C 53292 44 Farbe Sprite 5, Bitkombination %10 (0..15)
$D02D 53293 45 Farbe Sprite 6, Bitkombination %10 (0..15)
$D02E 53294 46 Farbe Sprite 7, Bitkombination %10 (0..15)
$D02F 53295 47 nur VIC IIe (C128)

Bit 7..3: unbenutzt
Bit 2..0: Status der 3 zusätzlichen Tastatur-Pins

$D030 53296 48 nur VIC IIe (C128)

Bit 7..2: unbenutzt
Bit 1: Testmodus
Bit 0: 0 => Slow-Mode (1 MHz), 1 => Fast-Mode (2 MHz)

Undokumentierte Effekte[Bearbeiten]

  • Grafiken im Rahmen lassen sich durch zeitlich abgepasstes Ändern der Scrolling-Register darstellen.
  • FLD (Flexible Line Distance)
  • VSP (Variable Screen Positioning) bzw. DMA Delay erlaubt das schnelle horizontale Scrollen des Bildschirms über große Distanzen.
  • Linecrunch erlaubt das schnelle vertikale Scrollen des Bildschirms über große Distanzen.
  • FLI (Flexible Line Interpretation) erlaubt die Nutzung neuer Farben in jeder Zeile.
  • FPP (Flexible Picture Positioning)
  • Sprite stretching
  • Sprite crunching

Eine genauere Beschreibung der Effekte gibt es im Codebase64.org-Wiki.

Pinbelegung des MOS 6566/6567/8562 (NTSC) und 6569/8565 (PAL)[Bearbeiten]

Pin Beschreibung
Pinbelegung VIC-II Mos6567.png DB0 - DB7 Datenbits 0 - 7 aus RAM bzw. Zeichensatz-ROM
DB8 - DB11 Datenbits 8 - 11 aus Farbram
IRQ Interrupt-Request, bei LOW wird Interrupt ausgelöst
LP Lightpen-Eingang
CS Chip Select - ein Low-Pegel an diesem Eingang bedeutet, dass die Daten am Datenbus gültig sind
R/W High-Pegel = Register lesen (READ), Low-Pegel = Register schreiben (WRITE)
BA Bus Available - zeigt an, dass der Bus in der zweiten Takthälfte (phi2 HIGH) für die CPU verfügbar ist
Vdd Versorgungsspannung +12V DC (6567/69), oder +5V DC (8562/65)
Color Chrominanz, Farbsignal
S/LUM Sync/Luminanz, S/W-Signal
AEC Address Enable Control, direkt verbunden mit der CPU. Bei LOW geht die CPU in den Tri-State-Zustand und gibt den Bus frei.
φ0 (phi0) Systemtakt, generiert aus dem Pixeltakt an Pin φIN mittels Division durch 8
RAS Row Address Strobe, zeigt an, dass auf den multiplexten Adressleitungen die Zeilenadresse anliegt
CAS Column Address Strobe, zeigt an, dass auf den multiplexten Adressleitungen die Spaltenadresse anliegt
Vss Systemmasse
Vcc Versorgungsspannung +5V DC
A0 - A5 Adressleitungen 0 bis 5, multiplext mit den Adressleitungen A8 - A13
A6 - A11 Adressleitungen 6 bis 11
φIN (phi_IN) Eingang für Pixeltakt (7,88 MHz für PAL, 8,18 MHz für NTSC)
φCL (phi_CL) Eingang für den Farbtakt (17,734472 MHz für PAL, 14,31818 MHz für NTSC)

Weblinks[Bearbeiten]

WP-W11.png Wikipedia: MOS Technology VIC
WP-W11.png Wikipedia: MOS Technology VIC II


Quellen

  1. Liste von Commodore MOS/CSG ICs Sprache:englisch
  2. Commodore 64 Programmer's Reference, Chapter 3, Screen Memory Sprache:englisch
  3. ebd.