Der MOS 6567/6569 Videocontroller (VIC-II) und seine Anwendung im Commodore 64
Inhalt 3. Funktionsweise des VIC 3.8. Sprites
3.8.2. Priorität und Kollisionserkennung |
Sobald sich mehrere Grafikelemente (Sprites und Text-/Bitmapgrafik) auf dem Bildschirm überlappen, muß entschieden werden, welches Element im Vordergrund dargestellt werden soll. Dazu wird jedem Element eine Priorität zugeordnet und nur das Element mit der höchsten Priorität dargestellt. Die Sprites haben untereinander eine feste Rangfolge: Sprite 0 hat die höchste und Sprite 7 die niedrigste Priorität. Wenn sich zwei Sprites überlappen, wird das Sprite mit der höheren Nummer nur dort dargestellt, wo das andere Sprite ein transparentes Pixel hat. Die Priorität der Sprites zur Text-/Bitmapgrafik läßt sich in gewissen Grenzen regeln. Zunächst einmal muß man bei der Text-/Bitmapgrafik zwischen Vordergrund- und Hintergrundpixeln unterscheiden. Welche Bitkombinationen zum Vorder- oder Hintergrund gehören, entscheidet das MCM-Bit in Register $d016 unabhängig von Zustand des Grafikdatensequenzers und von den BMM- und ECM-Bits in Register $d011:
| MCM=0 | MCM=1
Bit/Pixel | 1 | 2
Pixel/Byte | 8 | 4
Hintergrund | "0" | "00", "01"
Vordergrund | "1" | "10", "11"
Im Multicolor-Modus (MCM=1) gehören also die Bitkombinationen "00" und "01" zum Hintergrund und "10" und "11" zum Vordergrund, während im Standard-Modus (MCM=0) einfach gelöschte Pixel zum Hintergrund und gesetzte zum Vordergrund gehören. Es sollte noch bemerkt werden, daß dies auch für die im Idle-Zustand erzeugte Grafik gilt. Mit den MxDP-Bits aus Register $d01b läßt sich nun für jedes Sprite getrennt angeben, ob es vor oder hinter den Vordergrundpixeln dargestellt wird (die Tabelle in [2] ist falsch): Auch hier werden die Grafikelemente, die eine niedrigere Priorität als ein darüberliegendes Sprite haben, nur an den Stellen sichtbar, wo das Sprite ein transparentes Pixel hat. Wenn man einen der ungültigen Grafikmodi einstellt, sind nur die Sprites sichtbar (Vorder- und Hintergrundgrafik sind schwarz, siehe Abschnitte 3.7.3.6.-3.7.3.8.), aber schaltet man die Sprites so, daß sie hinter der Vordergrundgrafik erscheinen, sieht man die Vordergrundgrafik als schwarze Pixel über den Sprites. Gleichzeitig mit der Prioritätsvergabe ist der VIC in der Lage, Kollisionen zwischen Sprites untereinander und zwischen Sprites und Vordergrundpixeln der Text-/Bitmapgrafik zu erkennen. Eine Kollision zwischen Sprites untereinander wird erkannt, sobald beim Bildaufbau zwei oder mehrere Spritedatensequenzer gleichzeitig ein nicht-transparentes Pixel ausgeben (dies kann auch irgendwo außerhalb des sichtbaren Bildausschnittes geschehen). In diesem Fall werden im Register $d01e die MxM-Bits aller betroffenen Sprites gesetzt und (falls erlaubt, siehe Abschnitt 3.12.) ein Interrupt ausgelöst. Die Bits bleiben gesetzt, bis das Register vom Prozessor gelesen wird und werden durch den Lesezugriff automatisch gelöscht. Eine Kollision zwischen Sprites und anderen Grafikdaten wird erkannt, sobald beim Bildaufbau ein oder mehrere Spritedatensequenzer ein nicht-transparentes Pixel und der Grafikdatensequenzer ein Vordergrundpixel ausgeben. In diesem Fall werden im Register $d01f die MxD-Bits der betroffenen Sprites gesetzt und (fall erlaubt, siehe Abschnitt 3.12.) ein Interrupt ausgelöst. Wie bei der Sprite-Sprite-Kollision bleiben die Bits gesetzt, bis das Register vom Prozessor ausgelesen wird. Wenn das vertikale Rahmenflipflop gesetzt ist (also normalerweise innerhalb des oberen/unteren Rahmens, siehe nächsten Abschnitt), ist der Ausgang des Grafikdatensequenzers abgeschaltet und löst keine Kollisionen aus.