VIC
Die Bezeichnung bzw. Abkürzung VIC steht bei Commodore-Heimcomputern für Video-Interface-Chip. Er dient 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 und in der C128-Ausprägung auch als VIC-IIe bekannt ist. Erst der VIC-II unterstützt Sprites.
VIC-Varianten[Bearbeiten | Quelltext bearbeiten]
Folgende Chip-Varianten wurden verwendet:
- Im C64 und seinen Varianten wie SX64, PET 64 oder C64 Games System: 6567, 8562 (NTSC) / 6569, 8565 (PAL)
- Der 6569R1 besitzt ledliglich 5 Helligkeitsstufen, alle Revisionen danach können 9 Helligkeitsstufen darstellen.
- 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. Besonders betroffen oder bekannt ist das Problem bei den Varianten[1][2]
- PAL 8565R2-4191
- PAL 8565R2-3991(22)
- PAL 8565R2-0787(22)
- Im VC20: 6560 (NTSC) / 6561 (PAL)
- In der MAX Machine: 6566 (NTSC)
- In der CBM500-Serie: 6567 (NTSC) / 6569 (PAL)
- Im C128/D/DCR: 8564 (NTSC), 8566 (PAL-B), 8569 (PAL-N)[3] "VIC-IIe"
- Im C65: 4567 "Bill"
Aufgaben des VIC-II im C64[Bearbeiten | Quelltext 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 | Quelltext bearbeiten]
- Der VIC-II greift ausschließlich auf das RAM bzw. das Character-ROM zu. Die Konfiguration der PLA ist für den VIC - außer im Ultimax-Modus - nicht relevant. Das Character-ROM ist für den VIC an $1000 bzw. $9000 (Offset $1000 in Bank 0 bzw. Bank 2) sichtbar, siehe VIC-Bank.
- 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.
- $D02F (beim VIC-II) bis $D03F werden nicht vom VIC-II dekodiert. Die CPU liest dort $FF. Geschriebene Werte werden ignoriert.
- Die VIC-Register erscheinen im CPU-Adressraum alle $40/64 Bytes von $D000 bis $D3FF. Z.B. $D060 ist also mit $D020 identisch.
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 Text/Grafik in Rasterzeilen vom oberen Bildschirmrand (YSCROLL), gilt nicht für Sprites |
$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, halbe Auflösung im Vergleich zu anderen Registern in X-Richtung) |
$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 Text/Grafik in Pixeln vom linken Bildschirmrand (XSCROLL), gilt nicht für Sprites |
$D017 | 53271 | 23 | Sprite-Schalter, Bit = 1: Sprite n doppelt hoch (Bitmaske: 0..255) |
$D018 | 53272 | 24 | VIC-Speicherkontrollregister
Im Textmodus:
Z.B. bei Bit 3…0 = 0010 erwartet der VIC den Zeichensatz bei Adresse 2048 innerhalb der gewählten VIC-Bank.
Z.B. bei Bit 3…0 = 1000 erwartet der VIC die Bitmap-Daten ab Adresse 8192 innerhalb der gewählten VIC-Bank. |
$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 |
$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 im Extended-Color-Modus und Multicolorfarbe 1 im Multicolor-Modus (0..15) |
$D023 | 53283 | 35 | Bildschirmhintergrundfarbe 2 im Extended-Color-Modus und Multicolorfarbe 2 im Multicolor-Modus (0..15) |
$D024 | 53284 | 36 | Bildschirmhintergrundfarbe 3 im 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 |
$D030 | 53296 | 48 | nur VIC-IIe (C128) Bit 7..2: unbenutzt |
Undokumentierte Effekte[Bearbeiten | Quelltext bearbeiten]
- Grafiken im Rahmen durch Rahmensprites 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 und Sprite-Crunching
Eine genauere Beschreibung der Effekte gibt es im Wiki auf Codebase64.org.
In der Zeittafel der C64-Demos wird versucht, die wichtigsten Demos, bei denen Effekte wie diese zum ersten Mal verwendet wurden, in chronologischer Form zusammenzutragen.
Pinbelegung des MOS 6566/6567/8562 (NTSC) und 6569/8565 (PAL)[Bearbeiten | Quelltext bearbeiten]
Pin | Beschreibung | |
---|---|---|
![]() |
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 +12 V DC (6567/69), oder +5 V 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 +5 V 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) |
Kühlung[Bearbeiten | Quelltext bearbeiten]
In älteren C64 (vor 1986) gehört der VIC zu den heißesten Chips im C64, neben dem SID. In den Boards mit Revision 250407 ist er stets in einem Metallkäfig, der mit einer Kühlzunge mit dem VIC verbunden ist. Bei den Revisionen 250425 und später entfällt dieser häufig - sollte der VIC dennoch unangenehm heiß werden, kann ein Kühlkörper angebracht werden. Besonders heiß werden gern die VICs im Keramik-Gehäuse, und die Oberfläche des Metallkäfigs als zusätzliche Kühlung reicht unter Umständen nicht mehr aus - es können Pixel-Flackerer am Bildschirm entstehen oder gar Abstürze. Bevor hier der VIC für defekt erklärt wird, kann es helfen, die Standard-Fassung auszulöten und eine Präzisionsfassung einzusetzen. Durch dessen bessere Kontakteigenschaften sinkt der Widerstand an den Pins und nebenbei wird noch etwas Wärme nach unten weggeleitet.
Weblinks[Bearbeiten | Quelltext bearbeiten]
Wikipedia: MOS Technology VIC |
Wikipedia: MOS Technology VIC II |
- Der MOS 6569 (VIC II) im Commodore Computer Online Museum
- Der MOS 6567/6569 Videocontroller (VIC II) und seine Anwendung im Commodore 64 von Christian Bauer
- Datasheet zum VIC-II (MOS/CSG 6567)
- Mapping the C64 - u.a. Details zur VIC-Programmierung
- Thema: VIC2 Die Bilder released (Mikroskopaufnahmen) auf Forum64.de
- VIC II Manual Neue Seite von Herwig Siebenhofer
- VIC-II: 'Die Grafikkarte' bei retroprogramming.de (Webarchiv)
- VIC-II for Beginners bei dustlayer.com
Quellen
Hardware-Aufbau des C64 · Hardware-Portalseite
Komponenten des C64: CPU · VIC · SID · CIA · PLA · RAM · ROM · Farb-RAM