Ein kurzer Blick, auf die Register des VIC-II
Die Register des VIC-II erlauben so vielfältige Effekte, dass ich mir nicht mal sicher bin, ob seine Entwickler an all die Möglichkeiten gedacht haben, die findige Programmierer bis heute noch entdecken.
Die meisten Register wurden bereits unter Sprites (ASM) besprochen, hier findet ihr jetzt aber sämtliche VIC-II Register am Stück.
Sofern bereits ein Beitrag vorhanden ist, der das entsprechende Register verwendet, kommt ihr durch einen Klick auf die Adresse, direkt dort hin. Wobei ihr evtl. nicht exakt die angeklickte Adresse findet, ob nun $D000 oder $D00C erklärt wird, sollte keinen nennenswerten Unterschied machen.
Adresse | Nr. | Beschreibung |
---|---|---|
00 | Sprite 0: X-Position (s. auch $D010) | |
01 | Sprite 0: Y-Position | |
02 | Sprite 1: X-Position (s. auch $D010) | |
03 | Sprite 1: Y-Position | |
04 | Sprite 2: X-Position (s. auch $D010) | |
05 | Sprite 2: Y-Position | |
06 | Sprite 3: X-Position (s. auch $D010) | |
07 | Sprite 3: Y-Position | |
08 | Sprite 4: X-Position (s. auch $D010) | |
09 | Sprite 4: Y-Position | |
10 | Sprite 5: X-Position (s. auch $D010) | |
11 | Sprite 5: Y-Position | |
12 | Sprite 6: X-Position (s. auch $D010) | |
13 | Sprite 6: Y-Position | |
14 | Sprite 7: X-Position (s. auch $D010) | |
15 | Sprite 7: Y-Position | |
16 | Für ALLE Sprites: Das höchste Bit der X-Position Da der Bildschirm breiter als 256 (mehr passt ja nicht in ein Byte) Pixel ist benötigt man noch ein weiteres Bit um ein Sprite z. B. nach X = 300 zu bringen. Die C64-Entwickler haben sich entschieden diese Info in diesem einzelnen Byte für alle Sprites zu speichern. Sprite-Nr. = Bit-Nr. (denkt dran: Bit-7 ist ganz links, Bit-0 ist ganz rechts) |
|
17 | Kontrollregister 1 BIT 7 : 9. BIT von $D012 6 : Extended Color Modus 5 : Bitmapmodus 4 : Bildausgabe an/aus (erst mit Beginn des nächsten Bildes) 3 : 25 oder 24-Zeilenmodus 2-0 : Rasterzeilen-Offset, vom oberen Rand |
|
18 | Rasterzeile lesen: aktuelle Rasterzeile schreiben: Rasterzeile für IRQ setzen $D011 beachten! |
|
$D013 | 19 | X-Koordinate des Lichtgriffels (Lightpen) lesen |
$D014 | 20 | Y-Koordinate des Lichtgriffels (Lightpen) lesen |
21 | Legt fest, ob das jeweilige Sprite aktiv (sichtbar) ist (=1) Sprite-Nr. = Bit-Nr. |
|
22 | Kontrollregister 2 BIT 7-5: unbenutzt 4: Multicolor-Modus für Text & Grafik, nicht für Sprites! 3: 40 Spalten (1) oder 38 Spalten (0) 2-0: Pixel-Offset vom linken Rand |
|
23 | Bestimmt, ob das jeweilige Sprite in seiner Höhe verdoppelt (=1) werden soll oder nicht (=0) Sprite-Nr. = Bit-Nr. |
|
24 | Speicherkontrollregister Legt jeweils fest, wo sich etwas im für den VIC-II sichtbaren 16KB-Block befindet. BIT 7-4: Festlegen, wo sich der Bildschirmspeicher für den Textmodus befindet. Die Adresse berechnet sich 1024*(BIT 7-4) + Startadresse der aktuellen VIC-Bank. Nach dem Systemstart steht in den BITs 7-4 %0001 = 1 * 1024 + 0 (da standardmäßig Bank-0 aktiv ist) = 1024 = $0400 Der Farbspeicher kann nicht verschoben werden, er beginnt immer bei $D800! 3-1: Startadresse des Zeichensatzes für den Textmodus. Berechnung 2048*(BIT 3-1) + Startadresse der gewählten VIC-Bank. Beim Systemstart steht in den BITs 3-1 %010 = 2 * 2048 + 0 = 4096 = $1000, allerdings wird in Bank-0 dort das Char-ROM bei $D000 angesprochen. 3: Im Bitmap(Grafik)-Modus wird hierüber gewählt, ob der Speicher für die Grafik in der ersten ($0000-$1FFF) oder zweiten Hälfte ($2000-$3FFF) des 16KB-Blocks liegen soll. Berechnung: 8192*(BIT 3) 0: wird überlesen |
|
25 | Interrupt-Status aktuell aufgetretene Interrupts vom VIC-II abfragen / bestätigen lesen: 1 = IRQ aufgetreten BIT 7: IRQ aufgetreten, welcher es genau ist, steht in den BITs 3-0 6-4: unbenutzt 3: IRQ von Lichtgriffel (Lightpen) 2: IRQ durch Sprite-Sprite-Kollision 1: IRQ durch Sprite-Hintergrund-Kollision 0: IRQ von Rasterzeile schreiben: Ein verarbeiteter IRQ muss mit einer 1 im jeweiligen BIT bestätigt werden! Dadurch wird dieser IRQ gelöscht!! |
|
26 | Interrupt-Maske schreiben: Durch Setzen des jeweiligen BITs den zugehörigen IRQ freigeben / erlauben BIT 7-4: unbenutzt 3: Lichtgriffel (Lightpen) 2: Sprite-Sprite-Kollision 1: Sprite-Hintergrund-Kollision 0: Rasterzeile |
|
27 | Soll das jeweilige Sprite vor (=0) oder hinter der Hintergrundgrafik (=1) erscheinen. Sprite-Nr. = Bit-Nr. |
|
28 | Legt fest, ob das jeweilige Sprite Hi-Res (=0) oder Multicolor (=1) ist. Sprite-Nr. = Bit-Nr. |
|
29 | Legt fest, ob das jeweilige Sprite normal (=0) oder in seiner Breite verdoppelt (=1) dargestellt werden soll. Sprite-Nr. = Bit-Nr. |
|
30 | Zeigt eine Kollision (=1) zwischen Sprites an. Sprite-Nr. = Bit-Nr. Der Registerinhalt wird beim lesen gelöscht! |
|
31 | Zeigt eine Kollision (=1) zwischen einem Sprite und dem Hintergrund an. Sprite-Nr. = Bit-Nr. Der Registerinhalt wird beim lesen gelöscht! |
|
32 | Rahmenfarbe | |
33 | Hintergrundfarbe | |
34 | Hintergrundfarbe-1 im Extended Color-Modus (s. $D011) | |
35 | Hintergrundfarbe-2 im Extended Color-Modus (s. $D011) | |
36 | Hintergrundfarbe-3 im Extended Color-Modus (s. $D011) | |
37 | Erste Spritefarbe (Multicolor_0) für den Sprite-Multicolormodus (s. $D01C) Achtung: Diese ist für alle Sprites gleich! |
|
38 | Zweite Spritefarbe (Multicolor_1) für den Sprite-Multicolormodus (s. $D01C) Achtung: Diese ist für alle Sprites gleich! |
|
39 | Sprite-0: Farbe - Hauptfarbe des Sprites | |
40 | Sprite-1: Farbe - Hauptfarbe des Sprites | |
41 | Sprite-2: Farbe - Hauptfarbe des Sprites | |
42 | Sprite-3: Farbe - Hauptfarbe des Sprites | |
43 | Sprite-4: Farbe - Hauptfarbe des Sprites | |
44 | Sprite-5: Farbe - Hauptfarbe des Sprites | |
45 | Sprite-6: Farbe - Hauptfarbe des Sprites | |
46 | Sprite-7: Farbe - Hauptfarbe des Sprites | |
Die letzten beiden Register gibt es nur beim VIC-IIe aus dem C128!!! | ||
$D02F | 47 | Status der zusätzlichen Tastatur-Pins BIT 7-3: unbenutzt 2-0: Status der zusätzlichen Tastatur-Pins |
$D030 | 48 | Betriebsmodus BIT 7-2: unbenutzt 1: Testmodus 0: 1MHz Slow-Mode (0) oder 2MHz Fast-Mode (1) |
Die VIC-Register belegen den kompletten Adressbereich von $D000 bis $D3FF, da es aber nur die obigen 47 (bzw. 49 beim C128) Register gibt, wiederholen sie sich alle 64 Bytes. Unbelegte Register lassen sich nicht beschreiben und liefern immer den Wert $FF zurück. Wobei dies auch nicht ganz stimmt, wenn ein Turbo Chameleon 64 am Rechner hängt, blendet es einige neue Register in diesem Bereich ein, dazu später mal mehr, wenn es ums Erkennen und Ansprechen des TC64 geht.