VGA für alle - Selbstbauprojekt: TT-Auflösungen für jeden ST, Teil 2

In der letzten Ausgabe starteten wir ein Projekt, das allen ST-Modellen zu TT-Grafikfähigkeiten verhilft. Diesmal stellen wir die Funktionsweise von ODIN vor.

Wie in der letzten Ausgabe beschrieben, nutzen wir die 4 MByte Datenrate am Videoport des ST, um eine höhere Bildauflösung zu erreichen. Sehen wir uns die Fakten einmal im Detail an: Die mittlere TT-Auflösung hat 640 x 480 x 4 Bit Auflösung bei 60 Hz Bildwiederholfrequenz. Der Bildspeicher ist demnach 153600 Byte groß. Ebensoviel Speicher ist für die Auflösungen 320 x 480 und 1280 x 960 nötig. Verglichen mit dem ST, der 32000 Byte pro Bild an den Monitor liefert, entspricht die Datenrate des TT dem 4,8fachen. Unsere Treibersoftware meldet dem Betriebsystem die gewünschte neue Auflösung, damit alle Programme in dieser arbeiten. Der ST liefert brav 32000 Bytes seines vermeintlichen Bildes an die Monitorbuchse. Die Software schaltet nach den ersten 32000 Bytes im VBL die Physbase auf die nächsten 32000 Bytes des 153600 Bytes großen Bildes um. Nach dem fünften Wechsel der physikalische Bildschirmadresse beginnt der Zyklus von vorne. Würden wir diese Daten auf einem herkömmlichen Bildschirm betrachten, sähen wir lediglich ein wildes Flackern. ODIN sammelt die fünf Päckchen, speichert sie in seinem 256 KByte großen Videospeicher und stellt sie bis zum nächsten Update mit 60 Hz im VGA-Modus dar. Während nun die nächsten fünf Teilbilder eingelesen werden, stellt ODIN auf der anderen Seite gleichzeitig das neue 4,8fach so gute Bild dar. Diese kontinuierliche Verzögerung zwischen Übertragen und Darstellen äußert sich manchmal am Mausverhalten. Wenn Sie die Maus zu schnell bewegen, kann es Vorkommen, daß ein Teil des Mauszeigers noch in der alten Position gezeichnet wird. Der Mauscursor erscheint im ungünstigsten Fall etwas ruckelig.

Aufbau und Realisierung

Da wir durch Einsatz des hochintegrierten Logikbausteins Xilinx wenig Fläche benötigen, konnten wir ODIN auf einer kleinen zweiseitige Platine unterbringen. Leider steht uns am Monitorausgang keine Stromversorgung zur Verfügung, sodaß wir ODIN über ein kleines Steckernetzteil versorgen müssen. Um einen Verpolungsschutz und eine einwandfreie Versorgung zu gewährleisten, brachten wir auf der Platine einen robusten Festspannungsregler unter. Sie dürfen an ODIN jede Gleichspannung von 9 bis 18V anschließen.

Wir liefern ODIN als Bausatz, wobei die Platine komplett gesockelt, gelötet und getestet ausgeliefert wird, um stundenlange Fehlersuche zu vermeiden. Ihre Aufgabe ist es, die Kabel zu konfektionieren und in das Gehäuse einzupassen. Grundsätzlich bekommen wir über den Monitorausgang drei verschiedene Informationen. Konfigurationsdaten für den Xilinx, Bilddaten und Palettendaten. Im GAL und im Xilinx besteht eine Auswahllogik, die entscheidet, welche Art von Daten gerade an liegt. Über die Monitorselect-Leitung, die sich als Ausgang schalten läßt, löschen wir den Xilinx. Die folgenden Daten werden als Konfigurationsdaten vom GAL in den Xilinx kopiert. Ist der Xilinx programmiert, tritt dieser seine Aufgaben an:

Wie erkennt ODIN, ob Daten, Xilinx-Code oder Farbinformationen vorliegen? Die Monitorselect-Leitung läßt sich beim ST auf Ausgang stellen. Ist diese Leitung auf logisch 0 gelegt, wird der Xilinx gelöscht. GAL und Xilinx »erkennen« diesen Zustand. Ab nun enthält das Bild Konfigurationsdaten für den Xilinx. Da der Xilinx zu diesem Zeitpunkt noch »dumm« ist, übernimmt ein GAL das Initialisieren.

Nach der Programmierung kommen die eigentlichen Bilddaten. Fünf ST-Bilder ergeben ein TT-Bild. Um zu erkennen, welches das erste Teilbild ist, wird dieses durch eine Umprogrammierung der ST-Palette rot gefärbt.

Zum Ändern der Farbpalette lassen wir ein rot gefärbtes Bild aus. Fällt ein gefärbtes Bild aus, interpretiert der Xilinx die ankommenden Daten nicht als Bilddaten, sondern als solche für die Farbpalette und leitet diese an den INMOS CLUT-Chip (CLUT = Color Look Up Table) weiter.

ODIN digitalisiert die ST-Bilddaten, da diese farbcodiert werden. Zum Digitalisieren der Bilddaten tasten wir diese synchron zum ST-Takt ab, um nicht einzelne Pixel zu verlieren. Wir verwenden dazu einen '4046 PLL-Baustein. Der ST liefert die Daten mit 16 MHz Punkttakt, auf die sich der PLL synchronisiert. Da wir zur Ausgabe jedoch 32 MHz benötigen, muß ODINs Arbeitsfrequenz doppelt so hoch wie die Abtastrate sein. Eine Frequenzverdoppler-Schaltung im Xilinx erledigt dies. Rot verwenden wir bereits für die Selektion der einzelnen Bauteile, also bleiben uns Blau und Grün für die eigentliche Daten. Aus Preisgründen verzichteten wir auf einen A/D-Wandler und detektieren lediglich Farbe vorhanden oder nicht vorhanden. Dadurch reduziert sich die Digitalisierschaltung auf ein paar Widerstände.

Der Bestückungsplan von ODIN

Der ST arbeitet im MID-RES-Modus mit 640 x 200 Pixel. Die möglichen Farben sind in der Farbpalette so definiert, daß die Farbkanonen zum besseren Digitalisieren voll ausgesteuert werden. Mit jedem Takt lassen sich die vier binären Kombinationen »keingrün-keinblau«, »keingrün-dochblau«, »dochgrün-keinblau« oder »doch-grün-dochblau« übermitteln. Ein Schieberegister bringt das Signal in den Speicher.

Wie oben erwähnt, benötigen wir mindestens 153600 Byte RAM. Wir verwenden zwei RAM-Bausteine von je 256000 x 4 Bit. Aus Geschwindigkeitsgründen kommt nur entweder extrem schnelles D-RAM oder Video-RAM in Frage, um gleichzeitig das Atari-Signal zu digitalisieren und die VGA-Bilddaten auszugeben. Wir haben uns für das preiswerte V-RAM entschieden.

Der Bildspeicher verliert seinen Inhalt, wenn man nicht alle 8 ms jede Zeile einmal benutzt (auffrischt). Während des H-Sync erledigt ODIN dieses Auffrischen mit einem »CAS before RAS Zyklus«. Dieses stellt die einfachste Form dar, da keine Adressen zu erzeugen sind. Wir benötigen 512 solcher Zyklen pro 8ms, also 64µs x 512 / 8ms = 4 je H-Sync. Zur Sicherheit erzeugen wir acht Refresh-Zyklen zu Beginn eines jeden H-Sync.

Wie wir wissen, bestehen diese Monitorsignale aus H-Sync, V-Sync und den Bilddaten. Da das Bild von einem Rahmen umgeben ist, müssen wir ein Fenster mit gültigen Bilddaten definieren. Wir haben also je einen Zähler für horizontal und vertikal, mit dem wir diverse Zeitpunkte festlegen.

Das Blockschaltbild unserer VGA-Karte

Dazu müssen wir die Unterschiede zwischen ST- und VGA-Bild kennen:

Der Strahl auf dem Schirm läuft bei beiden jeweils von links nach rechts und dann von oben nach unten. Horizontal wie vertikal gibt es ein Signal (H-Sync, V-Sync), welches angibt, wann der Strahl am linken bzw. oberen Rand sein soll. Die Monitore erhalten während der Strahlrücklaufzeiten keine Bildinformation. Hinzu kommt, daß Monitore aus physikalischen Gründen zu den Ecken hin ein mehr oder weniger unscharfes Bild liefern. Daher setzt man um das aktive Bild einen Rahmen.

Horizontal und vertikal hat man also folgendes Timing: Die totale Zeit t beträgt vertikal 16,6 ms, da ST und VGA bei 60 Hz laufen. Horizontal ist die Zeit t beim ST mit 64µs und bei VGA mit 31,5µs definiert. Da 32µs ein Vielfaches der ST-Zeit ist und nur eine Abweichung von 1,5 Prozent bedeutet, geben wir bei ODIN die Signale auf allen Ausgängen mit doppelter und synchroner Zeilenfrequenz des ST aus. Horizontal sammeln wir die Bilddaten vom ST in 4-Bit-Paketen und schreiben diese mit 8 MHz in den Speicher. Bauen wir unseren Zähler mit einem 8 MHz-Takt auf, so muß er bis 508 zählen, um auf die gleiche Zeit (64>us) wie der ST zu kommen. Um den Schaltungsaufwand zu minimieren, bildet der Horizontal-Zähler gleichzeitig unseren Spalten-Zähler im RAM. Dazu starten wir den Zähler immer zu Beginn der Bilddaten: Wir schreiben je 16 Bildpunkte in acht Paketen in aufeinanderfolgende Speicherstellen. Bit 3 unseres Zählers definiert, ob in die obere oder untere Bushälfte geschrieben wird. Auf diese Weise bilden Bit 0 bis 2 und Bit 4 bis 8 unseren Spaltenzähler von 0 bis 159 (640 x 2/8 Bildpunkte x Anzahl Planes / Busbreite).

Der ST liefert pro Bildzeile 640 x 2 Bit Daten. Für eine TT-Auflösung von 640 x 4 Bit benötigen wir also jeweils zwei ST-Zeilen, die zusammen eine TT-Zeile bilden. Aus diesem Grund addieren wir jede ungerade ST-Zeile zu unserem Horizontal-Zähler, um total auf die benötigten 320 x 8 Bit Bilddaten einer Zeile zu kommen.

Ansonsten legen wir horizontal noch diverse Zeitpunkte fest. Das VGA-H-Sync ist 32µs lang, sodaß wir zwei dieser Pulse in einer ST-Zeile erzeugen. Die Pulsbreite beträgt 22 Takte. In diesen zwei Hälften wird jeweils der Bildrahmen gesetzt und kurz vorher das serielle Register der RAMs mit einem RDT geladen. Den Spaltenzeiger setzen wir beim RDT einfach auf 0, da die Daten ab Adresse 0 ausgegeben werden.

# Was ist ein Xilinx

Xilinx sind hochintegrierte Bausteine, die sich während des Betriebs neu konfigurieren lassen. Ein Xilinx kann also mal Zählerbaustein sein, mal ein Schieberegister. Für jede Funktion findet ein Code-»download« statt, vergleichbar etwa wie bei Druckern, die auf diese Art neue Fonts erhalten. Zudem sind Xilinx wesentlich höher integriert als PALs oder GALs und sparen so viel Platz.

Vertikal verwenden wir ein ähnliches Verfahren. Diesmal bildet unser Zähler den vertikalen VGA-Zeilen-Zähler. Der Zähler, mit VGA-H-Sync getaktet, addiert mit 9 Bit bis 480, um dort zu stoppen. Ein zweiter 5-Bit-Zähler definiert den oberen Rand und startet dann den VGA-Zeilenzähler. So lösen wir mit geringem Aufwand den vertikalen Ausgang. Nun definieren wir die Zählerstände, wann aktive Daten vom ST kommen, und lassen während dieser Zeit einen Einlese-Zeilen-Zähler laufen, der ebenfalls bis 480 zählt. Zu beachten ist, daß der nur alle zwei ST-Zeilen weiterzählt, da dies eine TT-Zeile ergibt. Bei 200 ST-Zeilen erhalten wir also 100 TT-Zeilen pro Bild. Der Zähler benötigt daher fünf Bilder zum Erreichen des Endwertes.

Zum Synchronisieren müssen wir wissen, wann welcher der fünf Bildausschnitte übermittelt wird. Aus diesem Grund schalten wir jeweils zu Beginn einer Sequenz für ein Bild die Rot-Kanone ein. Ist der Rot-Ausgang ausgesteuert, beginnt unser Zähler von 0 zu zählen. Andersherum läßt sich festlegen, daß, wenn nach fünf Bildern die Rot-Kanone nicht an ist, keine Bilddaten kommen. Dieses nutzen wir für die Palettenprogrammierung.

Das Timing unserer Bastelei

Die Farbpalette

Wir wählten zur Darstellung der Palette den INMOS-Baustein IMSG 171, der *256 Farben aus 262000 darstellen kann. Programmieren läßt sich die Palette über D0.D7, RSI, RS2 und WR. Die Punktdaten werden über P0.P7 geliefert und nach einem Punkt-Takt auf den drei Farbkanonen RGB ausgegeben. Zusätzlich verfügt die Palette über einen BLANK-Eingang, mit dem wir den Rahmen um das Bild setzen.

Der IMSG 171 hat den Vorteil, daß sich pinkompatible Bausteine als Ersatz einsetzen lassen. Der IMSG 170 ist funktions- und pinkompatibel zum 171, jedoch ohne Rücklesemöglichkeit, die wir ohnehin nicht nutzen.

Nehmen wir einmal an, wir würden auf der TT-Bitmap eine Farb-treppe mit den 16 Farben zeichnen (Punkt 1 den Farbwert 0, Punkt 2 den Farbwert 1, ...), dann müssen wir die 4 Planes wie folgt beschreiben:

Plane 0 Plane 1 Plane 2 Plane 3
0x5555 0x3333 0x0f0f 0x00ff
I I I I
I....... I I........ I
I I
16 Punkte, 4 Farben 16 Punkte, 4 Farben

Ist ein Bit in Plane 0,2 gesetzt, ist Blau voll ausgesteuert, ansonsten dunkel. Das gleiche gilt für Grün in Plane 1,3.

Wir parallelisieren je zwei Punkte mit einem Schieberegister und speichern sie als 4-Bit-Paket im VRAM. Die ersten 16-Punkte wandern ins erste VRAM, die folgenden (Plane 2 und 3) in VRAM 2. Wenn wir nun die Bilddaten 8 Bit parallel aus dem RAM holen, erhalten die Daten wie folgt:

D0 0 0 0 0 0 0 0 0
D1  1 1 1 1 1 1 1 1 
D2 0 1 0 1 0 1 0 1
D3  0 1 0 1 0 1 0 1
D4 0 0 1 1 0 0 1 1
D5  0 0 1 1 0 0 1 1
D6 0 0 0 0 1 1 1 1
D7  0 0 0 0 1 1 1 1
         |
         Farbpunkt mit 16 Farben

Da wir im Byte zwei Punkte haben, ist jeweils der erste Punkt auf DO, D2, D4, D6 und der zweite auf DI, D3, D5, D7. Auf diese Weise haben wir die Bilddaten in zwei Stufen umgerechnet.

Betrachten wir kurz die Daten raten. Der ST liefert über Midres-Daten mit 16 MHz/Punkt. Wir sammeln je zwei Punkte und schreiben sie mit 8 MHz im Page Mode-Write (spezielles Speicher-Timing, wenn innerhalb einer RAM-Zeile Daten geschrieben oder gelesen werden) in das VRAM. Dort werden sie über das serielle Ausgabe-Schieberegister der RAMs 8 Bit parallel abgeholt und mit 32 MHz Punkttakt mit 4 Bit/Punkt an die Palette weitergeleitet.

In der nächsten Ausgabe gehen wir auf die Software und auf VGA-Monitore ein und geben Tips zum Zusammenbau von ODIN. Zudem zeigen wir, wie man mit den faszinierenden neuen Bausteinen, den Xilinx, entwickelt und arbeitet, (uh)

# Eigenschaften von ODIN

Vorteile: Voll kompatibel, da sich GEM ohne Probleme auf höhere Auflösungen konfigurieren läßt; da der Bildschirmspeicher im normalen ST-Speicher liegt, funktionieren auch die Programme, die den Bildschirm direkt beschreiben; ST wird nicht durch die Grafikkarte gebremst; da der Monitorausgang benutzt wird, kein Ein- oder Umbau Nachteile: Einige Programme, die keine offiziellen Wege gehen, stören den Betrieb der Grafikkarte: Programme, die die Palettenregister direkt beschreiben (Spiele), die den Interrupt (VBL) wegschalten - kein Umschalten der Physbase; leichtes Nachziehen von schnell bewegten Objekten, bedingt durch den Bildaufbau in fünf Teilen.


Ulrich Breuer
Aus: TOS 10 / 1991, Seite 114

Links

Copyright-Bestimmungen: siehe Über diese Seite