Der ZX Spectrum zählt zu den legendärsten Heimcomputern der frühen 1980er Jahre und hat eine treue Fangemeinde, die sich bis heute mit seiner Hardware und Software beschäftigt. Trotz seiner vergleichsweise bescheidenen technischen Ausstattung besitzt er eine faszinierende Grafikarchitektur, die nicht nur für Entwickler gleichermaßen herausfordernd als auch kreativitätsfördernd war. Wer beginnen möchte, die wahre Magie seiner Bildschirmausgabe zu verstehen, sollte die Grundlagen der Grafikstruktur und der Speicheranordnung genau kennen. Erst dann lassen sich Pixel präzise setzen, bunte Sprites zeichnen und coole Effekte erzielen – und damit der ZX Spectrum zum Leben erwecken. Genau darüber soll es im Folgenden gehen: darum, wie der Bildschirm aufgebaut ist, warum er so arbeitet, wie er arbeitet, und wie man auf ihm effektive Grafiken erstellt.
Das tiefe Verständnis dieser Grundlagen ist der Schlüssel für jeden, der gerne Spiele, Demos oder Anwendungen auf dem Spectrum programmieren möchte. Das Herzstück der ZX Spectrum Grafik liegt in der Art und Weise, wie der Bildschirmspeicher organisiert ist. Anders als bei modernen Systemen ist das Display in zwei getrennte Bereiche aufgeteilt: Der Pixelbereich und der Attributebereich. Der Pixelbereich ist der reine Schwarz-Weiß-Bit-Bereich, der definiert, ob jeder einzelne Punkt am Bildschirm ein- oder ausgeschaltet ist. Das bedeutet, dass jede einzelne Bildpunktposition nur ein einzelnes Bit im Speicher belegt.
Die Farbe hingegen wird nicht für jeden Pixel individuell gespeichert, sondern im Attributebereich, der für jeweils 8×8 Pixel großen Blocks des Bildschirms genau eine Farb- und Effektinformation hinterlegt. Somit legt das Attributbyte für jedes Blockfeld die Vordergrundfarbe (Ink), die Hintergrundfarbe (Paper), Helligkeit (Bright) und Flasheffekt (Flash) fest. Dieser Aufbau bringt eine grundlegende Einschränkung mit sich, die unter dem Namen „Attribute Clash“ bekannt wurde. Denn innerhalb eines 8×8 Pixel großen Blocks können nicht beliebig viele verschiedene Farben simultan verwendet werden. Alle aktivierten Pixel im Block teilen sich dieselbe Vordergrundfarbe, während die inaktiven Pixel die Hintergrundfarbe erhalten.
Wenn bewegte Grafiken über mehrere dieser Blöcke laufen, kann es zu plötzlich wechselnden Farben kommen, was typisch für Spectrum-Grafiken ist und ihren einzigartigen Charme ausmacht. Das Aufteilen von Pixel- und Attributdaten in zwei separate Speicherbereiche hat historische und technische Gründe. Der Bildschirm selbst hat eine Auflösung von 256×192 Pixeln. Aufgeteilt in 8×8 Blocks ergibt sich ein Raster mit 32 Blöcken horizontal und 24 vertikal. Der Pixelbereich benötigt also 256×192 = 49152 Bits, was 6144 Bytes entspricht.
Die Attribute benötigen für die 768 Blöcke jeweils ein Byte, womit sich weitere 768 Bytes ergeben. Das ergibt zusammen einen Videobereich von genau 6912 Bytes. Die Adressierung der Pixeldaten ist eine Herausforderung für Einsteiger, denn die Anordnung der Bilddaten im Speicher folgt keinem einfachen Zeilenfolgeprinzip. Stattdessen ist die Videoring-Struktur geschickt verwoben, um mit der damals verfügbaren Hardware, insbesondere dem ULA-Chip, effizient zusammenzuarbeiten. Der Speicherbereich beginnt bei der Adresse 0x4000 und ist in drei vertikale Segmente zu je 64 Bildzeilen aufgeteilt.
Innerhalb dieser Segmente sind die Zeilen nicht linear gespeichert. Die erste 8-Zeilen-Gruppe füllt die erste Segmenthöhe, danach springt der Speicher in einer Art Versatz zum nächsten Segment, wodurch das Lesen zeilenweise erschwert wird, aber die Hardware wird entlastet. Dies ist durch eine spezielle Adressierungsformel abbildbar, die die hochkomplexe Anordnung der Bits und Bytes beschreibt und für die Pixelzeichnung auf dem Bildschirm essentiell ist. Das Prinzip, wie einzelne Pixel gesetzt werden, besteht darin, den korrekten Speicherbyte zu finden, in dem unser Punkt gespeichert wird, und dort das passende Bit zu setzen. Dabei ist das Pixel mit dem Index innerhalb eines Bytes so festgelegt, dass Bit 7 das linke Pixel und Bit 0 das rechte Pixel des Byteblockes darstellt.
Somit muss beim Berechnen der Maske stets berücksichtigt werden, welches Bit wir verändern wollen: für die Position X gilt die Verschiebung als 7 minus (X modulo 8). Die Adressberechnung selbst erfolgt aus einer Kombination mehrerer Bitmasken und bitweiser Operationen auf der Y-Koordinate, dazu wird die X-Koordinate in Bytes übersetzt. Für den Attributbereich ist die Adressierung viel einfacher, da hier jeder einzelne der 768 Blöcke genau ein Byte für die Farb- und Effektinformationen besitzt. Die Formel enthält lediglich das integer-dividierte Verhältnis von X und Y durch 8 multipliziert mit der Breite des Bildschirms in Blöcken (32), plus den horizontalen Blockindex. Diese adressierte Position kann dann direkt beschrieben werden, um Farbe, Helligkeit oder Blinkeffekte anzupassen.
Das Zusammenspiel von Pixel- und Attributbereichen bestimmt das Aussehen der endgültigen Grafik. Die Farbpalette des ZX Spectrum umfasst acht Basisfarben, die jeweils mit einem Helligkeitsbit leicht verändert werden können, was im Grunde genommen 15 gut sichtbare Farben ermöglicht. Die Flash-Option sorgt für periodisches Blinken, indem Vorder- und Hintergrundfarben alternierend vertauscht werden. Diese Eigenschaften erlauben trotz der traditionell begrenzten Farbmenge dynamische und ansprechende visuelle Effekte. Das schrittweise Zeichnen einer Grafik auf dem ZX Spectrum erfordert das Setzen von Bits für einzelne Pixel sowie das Anpassen der Attribute für Farbgebung in korrespondierenden Bereichen.
Ein Basisbeispiel ist das Zeichnen eines einzelnen leuchtenden Pixels: Man berechnet die Adresse des entsprechenden Bytes im Pixelbereich, legt den korrekten Bitmask-Wert fest und schreibt diesen durch ein logisches OR in das Byte, um vorhandene Pixelbits nicht zu zerstören. Parallel dazu wird das Attributbyte für das 8×8 Blockfeld gesetzt, wodurch dem Pixel seine Farbe verliehen wird. Der nächste natürliche Schritt ist das Zeichnen von 8×8 Pixel großen Grafiken, was der klassischen Zeichenbildeinheit (Character) entspricht. Diese sind in Datenarrays als Bytes organisiert, bei denen jedes Byte eine Bildzeile enthält. Dabei muss beim Schreiben der Linien der Zeilenversatz im Speicher beachtet werden.
Anders als bei modernen Systemen liegen die Zeilen der Grafik nicht direkt nebeneinander, sondern sind im Abstand von 256 Bytes zueinander gespeichert, was der speziellen Speicherstruktur des Spectrum geschuldet ist. Entsprechend muss die Speicheradresse für jede Zeile unter Berücksichtigung dieses Sprungs berechnet und mit den Bits der eigenen Grafik beschrieben werden. Zur Verbesserung der Leistungsfähigkeit sind verschiedene Methoden zur Adressberechnung entwickelt worden. Die rein algorithmische Berechnung anhand von Bitoperationen ist zwar korrekt, aber relativ langsam. Sie verbraucht viele CPU-Zyklen, was bei der begrenzten Leistung des Z80 Prozessors spürbar ist.
Daher hat sich die Verwendung von Lookup-Tabellen etabliert, die die Startadresse jeder Bildschirmzeile vorab speichern. Mit 192 Einträgen zu je zwei Bytes ermöglicht dieser Ansatz einen schnellen Zugriff auf die Ausgangsadresse einer Zeile. Anschließend wird nur noch der horizontale Offset addiert. Damit erreicht man eine hohe Geschwindigkeit bei der Bildschirmmanipulation, die insbesondere für Animations- und Spieleprogrammierung wichtig ist. Zusätzlich gibt es inkrementelle Techniken für das zeitnahe Bewegen im Speicher, wie beispielsweise das Hinzufügen oder Subtrahieren fester Werte beim Wechsel zu aufeinanderfolgenden Pixeln oder Zeilen, was in der Assemblerprogrammierung häufig umgesetzt wird.
Besondere Cases entstehen beim Übergang zwischen 8-zeiligen Blöcken, welche mit Zwischenschritten korrigiert werden müssen – dies ist jedoch durch intelligentes Adress- und Registermanagement lösbar. Diese Kombination aus kluger Hardwarearchitektur, speziellen Farb- und Attributsystemen sowie programmiertechnischen Kniffen prägt den einzigartigen visuellen Stil und die Arbeitsweise des ZX Spectrum. Trotz der Hardwarebegrenzungen gelang es Entwicklern, eindrucksvolle Grafiken, spannende Animationen und spannende Spieleerfahrungen zu realisieren. Das Wissen um diese Grundlagen befähigt auch heutige Programmierer, authentische und effiziente Anwendungen für den Spectrum zu erstellen und die Faszination des Systems zu erleben. Abschließend lässt sich festhalten, dass die Architektureigenheiten des ZX Spectrum Bildschirms eine wichtige Lektion in Resourceneffizienz, technischem Einfallsreichtum und der kreativen Bewältigung von Limitierungen bieten.
Sie fordern zum tiefen Verständnis der Speichertechnik und Grafikprogrammierung heraus und eröffnen gleichzeitig den Zugang in eine Welt des Retroprogrammierens mit all seinen nostalgischen wie technischen Vorzügen. Wer diese Grundlagen meistert, besitzt die Schlüsselkompetenz, um auf dem klassischen Speccy mehr als nur Pixelpunkte zu setzen, sondern echte visuelle Magie zu erschaffen.