Grafik und Text ausgeben – gar nicht so einfach (1)
In meiner lockeren Reihe über Technologien von Computern von „früher“ will ich heute mal die Ausgabe von Grafik und Text in den Achtzigern beleuchten. Heute geht vieles aufgrund dedizierten Grafikkarten mit eigenem Speicher und Monitoren mit einzeln adressierbaren Pixeln anders. Morgen gibt es dann Teil zwei des Artikels.
Das Prinzip
Damals schloss man den Rechner entweder an den (Farb)Fernseher oder einen Monitor an. Auch wenn ein Monitor schon damals die bessere Wahl war, weil er eine bessere Bildqualität bot ,funktionierten doch beide nach dem gleich physikalischen und technischen Prinzip. Basis war ein erzeugter, eng fokussierter Elektronenstrahl. Der Elektronenstrahl wurde von einer Ablenkelektronik mithilfe von Magnetfeldern in einer horizontalen Linie bewegt. Ein Signal vom Computer, die horizontale Synchronisation schichtete ihn wieder zum Zeilenanfang, wobei gleichzeitig die Höhe verschoben wurde das er eine neue Zeile begann. Wie hoch diese Differenz war, was die Zeilenzahl eines Bildes festlegte, war programmierbar. Am Ende des Bildes musste der Elektronenstrahl zum Ursprung, also in die linke, obere Ecke zurückgeschickt werden. Auch dafür gab es ein Signal, die vertikale Synchronisation. Bei einem einfachen Grünmonitor oder anderem Monochrommonitor war die Oberfläche der Glasröhre mit einem Material beschichtet, das durch den Elektronenstrahl aufleuchtete, meist auch nachleuchtete, das erlaubte es die Bildwiederholrate kleinzuhalten, ohne das man ein Flimmern aufgrund des Bildwechsels wahrnahm.
Farbmonitore hatten dagegen eine Maske, beschichtet mit vielen Punkten in den drei Grundfarben rot, grün und blau, die zusammen die Helligkeit eines Bildpunktes ergaben. (additive Farbmischung) Dass man einen einzelnen Punkt wahrnahm und sich nicht die Farbinformation verschiedener Bildpunkte vermischte, gab es zudem eine Lochmaske, welche die Bildpunkte voneinander trennte.
Was der Rechner nun machen musste, war zum einen die Intensität des Elektronstrahls zu verändern – für einen hellen Punkt auf voller Intensität, für einen Punkt der dunkel bleiben muss, wird er kurzzeitig abgeschaltet und er muss die beiden Synchronisationssignale für horizontale und vertikale Synchronisation schicken. Wie viele Bildpunkte pro Zeile es sind, legt er durch die Zahl der Helligkeitsanpassungen des Elektronenstrahls Zeile fest. Wer mal einen alten Monitor hat, weiß das man auch das Bild selbst nachjustieren konnte. Man konnte das Bild dehnen oder stauchen oder in der Lage verändern. Ganz ausnutzen tat man die Bildfläche nie. Monitore und Fernseher hatten damals eine Glasröhre, die nur in der Mitte einigermaßen plan war, an den Ecken hin wurde sie immer mehr gewölbter und die Abbildung verzerrt. In der Praxis nutzen Computer nur diesen zentralen Bereich um die Mitte, außen blieb ein Rand, der im Laufe der Zeit durch Steigerung der Auflösung aber immer kleiner wurde. Dieser Rand machte in den Achtziger Jahren bei einem Heimcomputer durchaus ein Drittel bis Hälfte der gesamten Fläche aus. Das ist nicht unwichtig, weil in der Zeit wo der Elektronenstrahl diese Fläche überstreicht, der Computer keine Daten übertragen muss und was anderes tun kann.
So legen technische Angaben immer die Fähigkeiten eines Monitors fest. In der Spätzeit bevor die heutigen Flachbildschirme auf Basis von LCD/LED aufkamen, waren Begriffe wie Zeilenfrequenz und Bandbreite wichtig. Die Zeilenfrequenz gab an wie viele Zeilen multipliziert mit der Bildwiederholrate ein Monitor anzeigen konnte. Für VGA waren es zum Beispiel 31,5 kHz. Wollte man mehr Zeilen in einem Bild unterbringen, indem man die Auflösung hochfuhr, musste man die Bildwiederholrate senken. Wie viele Punkte insgesamt pro Sekunde angezeigt wurden, gab die Bandbreite an. In meiner Zeit, den Achziger Jahren waren da 14,5 bis 18,5 MHz üblich. Sprich der Monitor konnte maximal ~ 18,5 Millionen Bildpunkte anzeigen. Teilt man diese 18,5 Millionen Hz durch eine Bildwiederholrate von 60 Hz, so sind das 308.000 Bildpunkte pro Bild – nicht gerade viel nach heutigen Maßstäben und dabei ist auch der Bereich dabei der nur Rand ist. Der nutzbare Bereich ist also noch kleiner und dürfte bei 150.000 bis 210.000 Bildpunkten liegen.
Ein Fernseher unterschied sich von einem Monitor durch zusätzliche Komponenten, dem Empfänger und Dekoder für die PAL- oder NTSC-Signale und dem Verstärker. Sie sorgten in der Praxis für mehr Unschärfe, weil zuerst ein direktes Signal in ein TV-Signal umgewandelt werden musste und dann wieder zurückgewandelt wurde. Das erfolgte ja noch komplett analog, sodass es hier immer Verluste gab. So gab es sehr viele Bauanleitungen in Zeitschriften, wie man einen Heimcomputer direkt an einen Fernseher ohne den Umweg über den Modulator anschließen konnte. Farbintensive hatten damals meist je einen Eingang pro Farbkomponente, also Rot, Grün und Blau. Aus der Mischung dieser drei Grundfarben erhielt man insgesamt acht Farbtöne – schwarz (kein Signal auf allen drei Farben), weiß (volles Signal auf allen drei Farben), Rot, Grün und Blau sowie Türkis (grün+blau), Violett (rot+blau) und Gelb (rot+grün). Geräte mit 16 Farben hatten eine zusätzliche Luminanzleitung, die dafür sorgte das die Sättigung mal halb (0) oder voll (1) war. Es gab dann von jeder Farbe noch eine dunklere Variante sowie ein Hellgrau/Dunkelgrau.
Die Anforderung
Das alles ist bisher nicht kompliziert. Die Anforderung für den Rechner ergibt sich nun daraus, das das Zeichnen und Aufrechterhalten des Bildes eine Echtzeitanwendung ist. Sprich der Rechner muss in dem Augenblick, in dem der Elektronenstrahl eine Stelle mit einer Spielfigur überstreicht, das Pixelmuster bitweise übertragen, in dessen Pixeln die Figur steckt. Dasselbe gilt aber auch für statischen Text. Ja selbst, wenn sich nichts tut, muss das Bild dauernd neu gezeichnet werden, weil es selbst beim Fernsehen mit der niedrigsten Bildwiederholfrequenz 25-mal pro Sekunde erneuert wird. In der Frühzeit des Einsatzes von Monitoren – die es auch erst ab Mitte der Sechziger Jahre gab, vorher bestanden Konsolen aus vielen Lämpchen und einem Fernschreiber als Ein-/Ausgabegerät – war diese Aufgabe sogar zu komplex. Da lenkte man den Elektronenstrahl nach dem zu zeichnenden Schriftzug, also nicht in einem festen Raster und „zeichnete“ so den Text. Das ersparte den Bildschirmspeicher und sein Auslesen, weil das aber relativ lange dauerte, leuchteten diese Monitore oft lange nach.
Unser Auge ist relativ empfindlich, wenn der Bildschirmneuaufbau mal an einer Stelle ausbleibt und bemerkt dies als Flimmern oder Grießeln je nachdem wie hell der Hintergrund ist und was es für eine Störung gibt. Für eine CPU ist das dauernde Übertragen der Information zum Monitor aber keine leicht Aufgabe. Üblicherweise ist vor dem Ausgang ein Schiebregister geschaltet, das getaktet bei jedem Takt ein Bit an den Monitorausgang schiebt und damit die Helligkeit des Elektronenstrahls steuert. Aber auch ein Schieberegister muss periodisch gefüttert werden. Nehmen wir nur mal eine damals populäre Auflösung von 256 x 192 Pixels für Heimcomputer und 8 Farben gespeichert in drei Byte, also je 8 Pixel pro Byte und je ein Byte für Rot, Grün und Blau. Eine CPU müsste für eine Zeile dann in etwa dieses Codestück abarbeiten:
Zeilenbeginn:
lade register1 mit der Startadresse
lade register3 mit derAnzahl der Bildpunkte pro Zeile
Punktausgabe:
Lade den Wert aus der Adresse in Register1 in das Register2
Gebe Register2 an das Rot-Schiebregister aus
Erhöhe Adresse in Register1 um 1
Lade den Wert aus der Adresse in Register1 in das Register2
Gebe Register2 an das Grün-Schiebregister aus
Erhöhe die Adresse in Register1 um 1
Lade den Wert aus der Adresse in Register1 in das Register2
Gebe das Register2 an das Blau-Schiebregister aus
Erhöhe die Adresse in Register1 um 1
Erniedrige Register3 um 1
Prüfe ob Register3=0
Wenn Nein, dann springe zu „Punktausgabe“
Wir haben für die Ausgabe von 8 Bildpunkten hier acht Anweisungen, die bei einem 8080 Prozessors 73 Takte brauchen, beim Zilog Z80 mit Blockbefehlen für die Ausgabe sind es immerhin noch 63 Takte. Multipliziert man diese 73 Takte für acht Bildpunkte pro Byte nun mit 256 x 192 Bildpunkte so kommt man auf 448.512 Takte pro Bild und selbst bei Fernsehanschluss mit nur 25 Bildern pro Sekunde auf 11,2 MHz. Diese Taktfrequenz erreichte damals kein Mikroprozessor. Der 8080 hatte eine Taktfrequenz bei 2 bis 3 MHz, der Z80 bei 2,5 bis 4 MHz in bezahlbaren Geräten (es gab Ende der Achtziger auch schnellere Versionen, die aber selten eingesetzt wurden).
Ich kenne nur wenige Beispiele, wo ein Mikroprozessor die Ausgabe übernahm, eines ist der Sinclair ZX80/ZX81 wo man sogar unter BASIC umstellen musste, wenn man den Prozessor mit voller Geschwindigkeit arbeiten lassen wollte, dafür das Bild aber nicht erneuert wird. Der ZX81 hatte denn auch nur 49.152 Bildpunkte in Schwarz-Weiß, also ein Drittel der Datenmenge oben. Mit voller Geschwindigkeit das Programm abarbeiten kann der Rechner bei diesem Prinzip eigentlich nur, wenn der Elektronenstrahl die Ränder abtastet, also den Bereich, in dem man keine aktive Ausgabe hat.
Schon die erste „Grafikkarte“ Dazzler für den Altair 8800 ging daher eine andere Lösung. Im Ptrinzip baute man mit TTL-Bausteinen diese Logik nach. Ein Mastertakt sorgte dafür das automatisch aus dem Speicher je ein Byte gelesen und an ein Schieberegister übertragen wurde. Andere Bausteine generierten aus dem Mastertakt dann die zusätzlich benötigten Signale für die horizontale und vertikale Synchronisation.
Später wurde es üblich das man diese Funktion in einen anwendungsspezifischen Baustein, ein Gate Array oder ULA integrierte. Die CPU hatte also mit dem Bildaufbau nichts zu tun und mit komplexeren Bausteinen waren dann auch mehrere Grafikmodi möglich.
Videocontroller und Videoprozessoren
Wie immer, wenn viele Rechner so eine spezialisierte Funktion brauchen gab es bald von der Industrie standardisierte Bausteine, diesmal sogar zwei Arten, den Videocontroller und den Videoprozessor. Der Videocontroller überträgt keine Daten zum Monitor. Seine Aufgabe ist die Signal- und die Adresserzeugung. Die Logik für das Übertragen der Daten wird so vereinfacht. Der Videocontroller überträgt selbst die Signale für die Synchronisation, er legt an die Logik jeweils die Adresse an, von der sie lesen muss, er erhöht diese je nach gewähltem Videomodus und berechnet auch die Adressen wo man das Bitmuster bei der Textdarstellung im ROM findet. Andere Komfortfunktionen sind das er signalisiert wenn man an der Position angekommen ist, wo der Cursor blinkend davorstellt werden muss und manche können, auch wenn man sie mit einem Lightpen verbindet dessen Position auf dem Monitor feststellen. Der bekannteste Videokontroller ist der 6845 von Motorola der im BBC-Mikro, den Amstrad CPC aber auch den IBM Grafikkarten MDA und CGA steckte.
Weiter geht ein Videoprozessor. Er kontrolliert einen eigenen Speicherbereich, den Grafikspeicher, selbstständig und unabhängig vom Hauptspeicher. Er überträgt die Daten an den Monitor und verfügt meist über weitere Funktionen wie Sprites. Das sind Spielfiguren deren Muster und Bewegung der Anwender definiert und die der Videoprozessor selbst bewegt, ohne das die CPU etwas tun musste. Oft informierte er die CPU auch über eine Kollision von Sprites, die man in Spielen wie Pacman nutzen konnte. Das macht das Programmieren natürlich einfacher. Commodore baute den VC-20, weil sie einen Videoprozessor VIC entwickelt hatten aber keinen Kunden für das Bauteil fanden. Der TMS 9918/9919 steckte im Ti 99/4a und den MSX-Geräten.