VSP

Aus C64-Wiki
Zur Navigation springenZur Suche springen
Baustelle Dieser Artikel befindet sich im Aufbau und ist vorläufig als Entwurf einzustufen.


VSP (Variable Screen Positioning, auch bekannt als DMA Delay) ist ein undokumentierter Effekt des VIC-II-Chips und ermöglicht horizontales Scrollen, ohne dass größere Mengen Daten beim Scrollen umkopiert werden müssen - anders als das bei den dokumentierten Möglichkeiten des VIC-II nötig ist (XSCROLL, $D016).

Das vertikale "Gegenstück" zu VSP ist unter dem Begriff "Linecrunching" bekannt.

Eine Kombination dieser beiden Effekte wird auch mit AGSP (Any Given Screen Position") bezeichnet, um den Screen beliebig in X- und Y-Richtung zu scrollen.[1]

Effekt[Bearbeiten | Quelltext bearbeiten]

VSP benötigt ein absolut zyklenexaktes Timing (das VIC-Register $D011 muss zum richtigen Zeitpunkt geändert werden). Der Zeitpunkt hängt davon ab, wie weit gescrollt werden soll (Offset). Dabei liegt der Trick darin, dass das Timing stabil bleibt, wofür die entsprechende Wartezyklen exakt eingelegt werden müssen.

Typisches Einsatzgebiet ist das horizontales Scrolling bei einem Platformer-Spiel. Gemeinsam mit dem Pixel-Scroll-Register des VIC (XSCROLL, $D016) kann nach 8 Pixel des Fine-Scrollings der Bildschirminhalt effizient per VSP "weitergeschaltet" werden. Typischerweise muss nur eine neue Spalte aufgebaut werden (inklusive jener in einem Double-Buffer sind das rund 2x25 Byte).

Die Belastung des Systems ist dabei recht gering, denn man benötigt lediglich ein stabiles Timing für Rasterzeilen-Interrupt am oberen Rand des Schirms und weitere Raster-Interrupts, um die neue Bildspalte zeitlich verteilt aufzufüllen (für Zeichen und Farbe). Der aufwändigere Teil ist dann am Bildschirmende, wenn auf den anderen Double-Buffer-Screen umgeschaltet wird. Für den Zeichen-Screen reicht zwar das Umsetzen eines VIC-Registers, aber das Farb-RAM muss vollständig umkopiert werden.[2]

Bug[Bearbeiten | Quelltext bearbeiten]

Bei bestimmten VIC-Revisionen und Boards kann es vorkommen, dass die Nutzung von VSP das RAM-Refresh des VIC stört. Genauer kann dies bei dieser Hardware immer vorkommen, wenn das Registers $D011 des VIC zu einem ungünstigen Zeitpunkt geändert wird. In diesem Fall kann es passieren, dass einige Speicherzellen die Werte von anderen Speicherzellen annehmen, was zu Fehlern und insbesondere auch zum Absturz des Computers führen kann. In selten Fällen ist es wohl sogar möglich, dass dadurch die Hardware beschädigt wird.

Beschreibung des Bugs[Bearbeiten | Quelltext bearbeiten]

Das DRAM des C64 (die acht Bausteine, die den Speicher des Computers bilden) kann Daten nur für sehr kurze Zeit speichern (im Bereich von Mikrosekunden). Damit die Daten nicht verloren gehen, müssen sie in regelmäßigen Abständen neu geschrieben werden. Dies passiert automatisch jedesmal, wenn die Daten gelesen werden und dann sogar für die ganze Speicherseite (256 Bytes), die das gelesene Byte enthält, auf einmal. Da aber nicht garantiert werden kann, dass der Prozessor jede Speicherseite oft genug liest, übernimmt der VIC diese Aufgabe: Zu bestimmten Zeiten liest er nach einem bestimmten Schema einfach eine Seite aus und verwirft das Ergebnis. Dadurch ist sichergestellt, dass jede Seite oft genug gelesen (und damit erneut geschrieben) wird.

Für diese Zugriffe nutzt der VIC zwei unabhängige Leitungen: Zum einen wird die Adresse der Speicherseite auf den Bus gelegt und zum anderen wird das RAS-Signal (Row Address Strobe) gesendet. Dies passiert im VIC unabhängig voneinander an ganz unterschiedlichen Stellen im Baustein.

Direkt nach einer Änderung von Register $D011 kommt der VIC kurz durcheinander und schreibt zuerst %11111111 auf den Bus und direkt darauf %00000111. Das führt dazu, dass die ersten fünf Bits auf dem Bus keinen definierten Zustand haben, sondern zwischen 0 und 1 "hin- und herflackern", wenn das RAS-Signal gesendet wird. Dadurch kann es passieren, dass das Auslesen des Speichers auf anderen Speicherzellen passiert, als das Zurückschreiben direkt danach, was nichts anderes bedeutet, als dass die Daten von einer Speicherzelle in eine andere kopiert wurden.

Bug beheben[Bearbeiten | Quelltext bearbeiten]

Es handelt sich bei dem Bug um einen Hardware-Bug. Dementsprechend kann der Bug auch nur auf Hardware-Seite behoben werden.

Üblicherweise lässt sich der Bug beheben, indem man andere RAM-Bausteine (kein DRAM) oder einen anderen VIC-Chip verwendet.[3]

Bug am C64 Reloaded[Bearbeiten | Quelltext bearbeiten]

Auf einem C64 Reloaded findet sich mitunter der VSP-Bug.

  • Ein C64 Reloaded MK1 ist mit neueren VIC-II (8565) nicht 100%ig VSP-sicher.[4]
  • Ein alter VIC-II (6569) ist dagegen auf dem Reloaded MK1- 100%ig VSP-sicher.[4]
VSP-Tests
Thema: C64 Reloaded / Bugs / Auffälligkeiten auf Forum64.de zeigt konkrete Tests
VSP-Bug beheben
  • Das RAM durch SRAM (Umbau C64 auf SRAM[5]) ersetzen. Es gibt auch eine SRAM-Platine, welche einfach in die RAM-Sockel der Reloaded-Platine passt.[6]
  • Beim VIC 8565R2: Neben der Lösung einen 6569-VIC einzusetzen, gibt es auch eine kleine Zusatzplatine, welche in den GAL-Sockel gesteckt wird und so ein verändertes Timing erzeugen kann, damit auch der 8565R2 keine VSP-Probleme mehr verursacht.[7] 8565R2)

Den Bug via Software umgehen[Bearbeiten | Quelltext bearbeiten]

Man kann Software so schreiben, dass der VSP-Bug keine Auswirkungen hat: Hierfür muss entweder sichergestellt werden, dass alle Speicheradressen jeder Speicherseite die auf 7 oder F enden, den gleichen Inhalt haben, oder dass diese nie genutzt werden, beispielsweise indem sie mit einem illegalen Opcode (NOP immediate) im Programmablauf übersprungen werden. Im Falle von Daten kann man diese Adressen auch rechtzeitig aus einer Sicherung wieder zurückschreiben. Das führt allerdings zu stark unleserlichem Code und zudem zu einer deutlich spürbaren Verlangsamung des Computers.

Seit einigen Jahren kursiert auch die Theorie der VSP-Channel. Mit Hilfe dieser Channel kann man die problematischen Teile des Speichers weiter eingrenzen. Kennt man die betroffenen Channel, müssen nicht mehr alle Speicheradressen, die auf 7 oder F enden berücksichtig werden. Allerdings kann man bis heute nicht genau sagen, wovon diese Channel genau abhängen. Unter anderem wird vermutet, dass physikalische Eigenschaften (zum Beispiel die Themperatur) beim Einschalten des Computers einen Einfluß darauf haben.

In der Praxis dürfte es sinnvoller sein, den VSP-Bug bei der Programmierung zu ignorieren. Hardware mit diesem Bug sollte auf Hardware-Ebene repariert werden.


Weblinks[Bearbeiten | Quelltext bearbeiten]

Blöder Anti-Missbrauch. Jetzt ist alles, was ich hier geschrieben habe, wieder weg. Hier die Links. Auf den Rest hab' ich keine Lust mehr.

https://kodiak64.com/blog/future-of-VSP-scrolling https://www.linusakesson.net/scene/safevsp/index.php

Sonstiges[Bearbeiten | Quelltext bearbeiten]

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.

Quellen[Bearbeiten | Quelltext bearbeiten]

  1. Thema: FLD-VSP-Effekt vom IRQ-Kurs aus der Magic Disk auf Forum64.de (Begriffe VSP, Linecrunching, AGSP)
  2. Forum lemon64.com: Ugh. Why can't I understand VSP? Sprache:englisch
  3. Thema: VSP Bug auf Forum64.de (VSP-Bug auf Standard-Hardware beheben)
  4. 4,0 4,1 Thema: Super Mario Bros für den C64 auf Forum64.de (VSP-Bug auf C64-Reloaded-Hardware)
  5. Thema: Umbau C64 auf SRAM auf Forum64.de
  6. Thema: C64 Reloaded / Bugs / Auffälligkeiten auf Forum64.de (VSP-Bug-Behebung durch RAM-Umbau)
  7. Thema: C64 Reloaded / Bugs / Auffälligkeiten auf Forum64.de (VSP-Bug-Behebung für VIC)