Der MOS 6567/6569 Videocontroller (VIC-II) und seine Anwendung im Commodore 64
Inhalt 3. Funktionsweise des VIC 3.14. Effekte/Anwendungen
3.14.7. Sprite-Stretching |
Da die Sprites einfacher aufgebaut sind als die Textgrafik, sind mit ihnen nicht so viele besondere Effekte möglich, aber darunter ist ein sehr interessanter Effekt, der die Funktionsweise der Sprite-Y-Expansion ausnutzt: Durch Ändern der MxYE-Bits in Register $d017 ist es nämlich nicht nur möglich, für jede Spritezeile einzeln zu bestimmen, ob sie verdoppelt werden soll, sondern man kann auch einzelne Zeilen drei- oder mehrmals wiederholen lassen und damit ein Sprite oder Teile davon um beliebige Faktoren vergrößern. Dieser Effekt läßt sich wie folgt verstehen (siehe dazu Abschnitt 3.8.1.): Angenommen, wir befinden uns in Zyklus 55 einer Rasterzeile, in der Sprite 0 angeschaltet ist und deren Y-Koordinate gleich der Y-Koordinate des Sprites ist, also in der Zeile bevor das Sprite dargestellt wird. Das M0YE-Bit sei gesetzt. Dann schaltet der VIC den DMA für Sprite 0 an und löscht MCBASE und das Expansions-Flipflop. BA geht nach Low, damit der VIC in Zyklus 58 und 59 in den zweiten Taktphasen zugreifen kann. In Zyklus 58 wird MC mit MCBASE geladen und dadurch ebenfalls gelöscht, und der p-Zugriff für das Sprite gemacht. Anschließend werden die drei s-Zugriffe ausgeführt und MC nach jedem Zugriff erhöht, steht also dann auf 3. Nun wartet man auf Zyklus 16 der folgenden Zeile. Da das Expansions-Flipflop gelöscht ist, bleibt MCBASE weiterhin auf Null. Jetzt löscht man zunächst das M0YE-Bit und setzt damit das Flipflop, setzt das M0YE-Bit aber danach gleich wieder. In Zyklus 55 wird das Flipflop dann invertiert, da M0YE wieder gesetzt ist, und ist nun also gelöscht (hätte man das M0YE-Bit nicht gelöscht, wäre das Flipflop nun gesetzt). Dies ist aber genau der Zustand, in dem der VIC auch in Zyklus 55 der vorigen Zeile war. Der VIC "glaubt" daher, sich erst in der ersten Rasterzeile einer expandierten Spritezeile zu befinden und wird (da MC immer noch Null ist) die erste Spritezeile noch zweimal aus dem Speicher lesen, insgesamt jetzt also dreimal: Die erste Spritezeile wurde verdreifacht. Ein weiterer interessanter Effekt läßt sich erzielen, wenn man genau wie oben vorgeht, aber das M0YE-Bit nicht nach Zyklus 16 löscht, sondern in der zweiten Phase von Zyklus 15. Dann wird MCBASE um 1 erhöht und die nächste Spritezeile wird mit MC=1..3 aus dem Speicher gelesen, also ein Byte höher als vorgesehen. Diese "Verstimmung" setzt sich komplett in der Darstellung des Sprites fort. Daher wird auch die Bedingung MC=63 für das Abschalten des Sprite-DMA in Zyklus 16 nicht erreicht und das Sprite wird effektiv zweimal direkt hintereinander dargestellt. Erst nach Ende der zweiten Darstellung steht MC auf 63 und der DMA wird abgeschaltet.