Der MOS 6567/6569 Videocontroller (VIC-II) und seine Anwendung im Commodore 64
Inhalt 3. Funktionsweise des VIC 3.14. Effekte/Anwendungen
3.14.3. FLI |
Anstatt wie beim FLD-Effekt das Auftreten der Bad Lines zu verzögern, kann man auch künstlich zusätzliche Bad Lines erzeugen, bevor der VIC die aktuelle Textzeile beendet hat. Besonders interessant ist dies in den Bitmap-Modi, denn dort werden die Daten aus der Videomatrix (die ja in den Bad Lines gelesen werden) für die Farbinformation benötigt, weshalb in den Bitmap-Modi normalerweise nur einzelne 8×8-Pixelblöcke individuell eingefärbt werden können. Macht man jedoch durch geeignetes Ändern von YSCROLL jede Rasterzeile zur Bad Line, liest der VIC in jeder Rasterzeile aus der Videomatrix und holt damit auch für jede Rasterzeile neue Farbinformationen. Dadurch ist man nun in der Lage, innerhalb der 4×8 Pixel eines Blocks im Multicolor-Modus jedes Pixel einzeln einzufärben. Dieser durch Software erzeugte, neue Grafikmodus wird als "Flexible Line Interpretation" (FLI) bezeichnet und stellt vermutlich das herausragendste Beispiel "unkonventioneller" VIC-Programmierung dar. Ein Problem gibt es allerdings: Wenn man eine neue Bad Line erzeugt, noch bevor die aktuelle Textzeile beendet wurde, wird VCBASE nicht erhöht (siehe 3.7.2.). Der VIC liest also von den gleichen Adressen aus der Videomatrix, wie in der Zeile zuvor. Da man die Videomatrix mit dem Prozessor nicht schnell genug ändern kann, muß man mit den Bits VM10-VM13 aus Register $d018 die Basisadresse der Videomatrix umschalten (das Farb-RAM läßt sich leider nicht umschalten, daher ist die Farbwahl der Pixel nicht vollkommen frei). Außerdem darf man den Zugriff auf $d011 zum Erzeugen der Bad Lines erst ab Zyklus 14 jeder Rasterzeile machen, denn sonst wird der RC in jeder Zeile gelöscht und die Darstellung der Bitmap nicht wie gewünscht. Dies hat aber auch zur Folge, daß die ersten drei c-Zugriffe des VIC in jeder Zeile keine gültigen Daten liefern, denn der erste c-Zugriff in Zyklus 15 erfordert, daß BA schon in Zyklus 12 auf Low gegangen sein muß, damit AEC in Zyklus 15 Low bleibt (AEC bleibt prinzipiell immer erst drei Zyklen nach der negativen Flanke von BA auf Low, dies läßt sich nicht umgehen). Da aber die Bad Line erst in Zyklus 14 erzeugt wurde, ist zwar in Zyklus 15 beim ersten c-Zugriff BA auf Low, aber AEC ist High und damit sind auch die internen Datenbustreiber D0-D7 des VIC geschlossen und da der Chip in NMOS gefertigt ist, liest er den Wert $ff und nicht die Videomatrix-Daten (die Datenbustreiber D8-D11 sind allerdings offen, jedoch wird dies in Abschnitt 3.14.6. noch näher erläutert), was am linken Bildrand als 24 Pixel breite Streifen sichtbar wird. In der Praxis legt man im Speicher acht Videomatrizen an, die nach folgendem Schema benutzt werden: In der ersten Rasterzeile die erste Zeile der ersten Matrix, in der zweiten Zeile die erste Zeile der zweiten Matrix, usw..., in der achten Zeile die erste Zeile der achten Matrix, in der neunten Zeile die zweite Zeile der ersten Matrix, usw. Mit diesen acht Matrizen kann man eine komplette Bitmap zeilenweise abdecken. Vom FLI-Modus gibt es noch einige Abarten, z.B. AFLI (Advanced FLI), das den Standard-Bitmap-Modus benutzt und Farbmischungen durch ähnlich gefärbte, nebeneinanderliegende Pixel simuliert, und IFLI (Interlaced FLI), das in einer Art Interlace-Verfahren abwechselnd zwei Halbbilder darstellt.