erschienen in: GO64! - Das Magazin für Computerfreaks, Ausgabe 1/2000

Der Fluch der Langsamkeit - oder: Warum es keine Grafikkarte für den C64 geben wird

Hello World,

fragt man den durch SCPU geschwindigkeits- und RAM-verwöhnten C64-User, was er sich denn als weitere Peripherie wünscht, so steht hier mit an erster Stelle eine Grafikkarte. Sicherlich läßt sich mittels einiger Programmierkniffe mehr aus dem VIC-II herausholen, als seine Schöpfer jemals für möglich hielten - jedoch sind auch die so erzielten 320x200 Punkte Auflösung in 136 Farben irgendwie nicht mehr Stand der Zeit. Und waren 50Hz einmal eine ganz akzeptable Bildwiederholfrequenz, so schreit das durch neue Ergonomieverordnungen verwöhnte Auge nach Bildwiederholfrequenzen jenseits der 70Hz.

Nun gibt es für den C64/128 doch alle erdenkliche Peripherie: Turbokarten, Speichererweiterungen, SCSI-Interfaces, schnelle serielle Schnittstellen - eins jedoch gab es nie: vernünftige Grafikkarten. Einzig 80Zeichen-Karten machten Anfang/Mitte der 80er von sich reden - und verschwanden alsbald wieder in der Versenkung, denn außer von einigen Textprogrammen wurden diese Karten von nichts unterstützt.

Speicherbedarf

Das waren noch Zeiten, als man ein HiRes-Bild in nur 8kB speichern konnte. Heutige Bilder sind weit davon entfernt, lediglich effiziente Datenkompression bewahrt den Heimanwender davor, daß seine Festplatte durch einige wenige Bilder zum Platzen gebracht wird, denn der Speicherbedarf eines Bildes errechnet sich wie folgt:

Dateigröße (in Byte) = ( Auflösung_H * Auflösung_V * Farbtiefe (in Bit) ) / 8
Macht also bei einem 640x400 Pixel großen Bild mit 256 Farben (entsprechend 8 Bit Farbtiefe) bereits 250kB, bei heute durchaus nicht unüblichen 1280x1024 Pixeln in Truecolor (16.7 Mio. Farben, d.h. 24 Bit Farbtiefe) sind es gar 3.75MB.

Nun verfügt der C64/128 glücklicherweise über entsprechende Peripherie, die diesen (für C64/128-Verhältnisse) gigantischen Speicher bereitstellt. Bekanntermaßen können die CPUs der 6502-Familie jedoch nur 64kB auf einmal adressieren, so daß diese großen Speicher meist bankweise über einen reservierten Speicherbereich eingeblendet (gemappt) werden. Und hier kommen wir zu einem ernsten Problem, der...

Bandbreite

Der C64 ist auf einen Betrieb mit 1MHz ausgelegt, der C128 schafft gar derer 2. Dies war Anfang der 80er, als diese Geräte entworfen wurden eine recht gängige Größe, wenn auch nicht unbedingt das damals schnellste. Heutzutage erweist sie sich jedoch als echter Hemmschuh, denn diese Größe gibt nicht nur die maximale Taktfrequenz der CPU sondern auch die maximale Datentransferrate - diese gilt aber nur unter bestimmten Voraussetzungen (vorsicht, Technik!):

In der Praxis heißt dies, daß die CPU nicht zu häufig von DMA-Anforderungen unterbrochen werden darf, soll diese nebenher noch vernünftig arbeiten. Wie gravierend dies sein kann, mag das Beispiel FLI-Grafik zeigen: Hier wird bei jeder Bildschirmzeile eine Badline ausgelöst, was dem C64 auf der einen Seite zwar zuvor nie gekannte Grafikmodi beschert - auf der anderen Seite das System doch entsprechend verlangsamt. (Für die Historiker unter uns: ZX81-Software-HiRes war auch so eine Sache, da kam der Video-Interrupt dann jede Zeile und nicht nur alle 8 Zeilen - dafür hatte man dann zwar 256x192 Punkte Auflösung, allerdings um den Preis einer auf 1/8 gesunkenen Rechenleistung.)

Bandbreitenfresser

Wir erinnern uns: Bereits eine Grafik mit 640x400 Punkten Auflösung und 256 Farben benötigt 250kB, d.h. auf 1MHz Bandbreite umgerechnet braucht die "Ubertragung dieses Bildes in einen externen Grafikspeicher bereits 1/4s! 250ms sind nun ein Zeitraum, den wir mehr als deutlich wahrnehmen: Liefe ein Film mit nur 4 Bildern pro Sekunde, wäre das mehr eine Aneinanderreihung von Standbildern als wirklich ein Film. Für flüssiges Spielen wäre jedoch eine Framerate mind. 10 Bildern/Sekunde angeraten, 24 Bilder/Sekunde die übliche Filmgeschwindigkeit. Wie jeder selbst errechnen kann, haben wir diese Bandbreite schlichtweg nicht. Geht's denn trotzdem?

Alternativen

Die einfachste Lösung wäre sicherlich, eine externe Grafikkarte lediglich als sog. Framebuffer zu verwenden. Dies ist für all jene befriedigend, die solch eine Grafikkarte nur dazu verwenden wollen, ein Bild hochauflösend und in ''richtigen'' Farben darzustellen anstatt diese als FLI-Scrollbild mit entsprechendem Farbdithering. Hier wäre es durchaus verkraftbar, daß ein Grafiktransfer einige wenige Sekunden benötigt, da die eigentliche Zeit ohnehin für das Laden von einem Externspeicher benötigt würde.

Eine weitere Möglichkeit wäre das Stillegen des VIC, was ungebremsten DMA-Transfer ermöglicht: Bei direktem RAM-Transfer könnte man so einen maximalen Durchsatz von 6.67MB/s pro DMA-Zyklus erreichen. Hierzu müste die Grafikkarte über einen Taktvervielfacher verfügen, der aus den 1MHz des phi2-Taktes eine entsprechend höhere Taktrate erzeugt. Vorteil dieser Lösung ist, daß pro DMA-Zyklus eine auf das sechsfache gesteigerte Datenmenge übertragen werden können - die Frage stellt sich indes, ob dies überhaupt sinnvoll ist, denn übliche externe RAM-Erweiterungen haben nur eine Transferleistung von 1MB/s, so daß immer nur ein eingeblendetes ''Häppchen'' mit HighSpeed zu einer solchen Grafikkarte übertragen werden kann. So betrachtet ist der ganze Aufwand also recht sinnlos. Nachteil diese Lösung ist außerdem, daß kein DualScreening, d.h. der Betrieb zweier Monitore möglich ist.

Der traditionelle Ansatz

Bislang spricht alles dafür, daß es nie eine sinnvolle Grafikkarte für den C64/128 geben wird, doch bislang wurde eine Möglichkeit noch nicht erläutert, die - gemessen an der Commodore-Historie - doch geradezu auf der Hand liegt:

Was haben die Commodore Floppies, ein SCSI-Interface und die SCPU gemeinsam? Alle drei sind letzten Endes vollkommen eigenständige Computersysteme, die den C64/128 von entsprechend lästigen Arbeiten entlasten bzw. ihm ihre Rechenleistung zur Verfügung stellen. Was liegt also näher, als dies auch auf eine Grafikkarte anzuwenden?

Die Idee ist nicht neu. Professionelle DTP-Systeme verwenden sogenanntes Display PostScript und PC-Spielefreaks haben in OpenGL eine Entsprechung gefunden: Hierbei wird an die Grafikkarte das Bild nicht in Form entsprechender (analoger) Bildsignale geschickt, vielmehr sendet man ihr eine textuelle Beschreibung des Bildschirminhaltes. Dieses wäre auch die Lösung für den C64/128, denn es wäre so unnötig, riesige Datenmengen zu transferieren. Um beispielsweise eine Linie zu zeichnen, wird diese nicht als Bitmap im C64-Speicher erzeugt und an die Grafikkarte transferiert, stattdessen sendet man einfach ein l(0,0,640,400), und schon hat man eine diagonale Linie quer über den Bildschirm.

Dem Erfindungsreichtum sind hier keine Grenzen gesetzt. Verfügt beispielsweise der verwendete Grafikchip über Sprites, so müßte man nicht mühsam in Registern herumschreiben (VDC-Programmierer wissen um die Freude der indirekten Ansteuerung :) - man implementiert einfach einen Sprite-Verschiebebefehl in das Kommunikationsprotokoll. Und sollte doch einmal ein Bitmaptransfer notwendig sein (z.B. für die Anzeige hochauflösender Bilder), so kann dies ebenfalls mittels einem speziellen Befehl erfolgen - bei entsprechend gesteigerter Transferdauer.

Vorteil dieser Lösung ist außerdem, daß kaum Rücksicht auf die langsame Taktrate des C64 genommen werden muß - der Grafikchip selbst darf bei seiner bevorzugten Taktrate laufen (heute durchaus 150MHz und mehr), denn er wird von einer nicht minder schnellen CPU kontrolliert, die darüberhinaus über ein entsprechendes (langsames!) Interface mit dem C64/128 kommuniziert.

Die Crux mit den Grafikchips

Leider sind eigentlich alle Ansätze zum Scheitern verurteilt, denn die Zeiten, da man einen leistungsfähigen Grafikchip beim Elektronikhändler um die Ecke kaufen konnte, sind endgültig vorbei. Heutige Grafikboliden erhält man zu vernünftigen Preisen nur bei Abnahme etlicher tausend Stück - und beinhalten allesamt ein PCI- bzw. AGP-Interface. Dieser ist jedoch für speziell auf den C64/128 ausgerichtete Hardwareschmieden schlichtweg viel zu komplex und nicht handhabbar. "Altere Chips, die dem C64/128 ebenfalls schon zu einem Quantensprung in Sachen Grafik verhelfen würden (ich denke da z.B. an die etwa 10 Jahre alten Trident 4000 Chips), sind jedoch nicht mehr lieferbar und bestenfalls noch über den Gebrauchthandel beziehbar - in Form von ISA-Grafikkarten. Den Rechner (z.B. 386-PC) drumrum gibt's meist gratis dazu...

Der PC als intelligentes Grafiksubsystem

...und so liegt es auf der Hand, eben diesen PC als Grafiksubsystem zu zweckentfremden. Die Kommunikation könnte hierbei über den Expansionsport des C64/128 zum parallelen Druckerport (LPT) des PCs erfolgen: Daß letzterer als universeller Peripheriebus zu mißbrauchen ist, davon zeugen unzählige Peripheriegeräte, die an den PC über den Druckerport anzuschließen sind, ja selbst im C64/128-Sektor ist diese Methode nicht unbekannt, über ein spezielles Kabel (X1541) kann die 1541 an den PC-Druckerport angeschlossen werden. Wieso also nicht auch einen Grafikbus hierüber etablieren?

An dieser Stelle wollen wir uns allerdings die Frage verkneifen, ob denn ein derart hochgezüchteter C64/128 überhaupt noch ein C64/128 im eigentlichen Sinne ist, denn man könnte diese problemlos auch auf die SCPU bzw. das SCSI-Interface anwenden. Außerdem: War es denn nicht schon immer Commodore-Philosophie, die Peripherie mit mehr Rechenpower als den eigentlichen Rechner auszustatten?