Artikel pedia
| Home | Kontakt | Artikel einreichen | Oberseite 50 artikel | Oberseite 50 autors
 
 


Artikel kategorien
Letztes fugte hinzu
    Ms-access

   Instrumentation + schnittstellen

   Pc tuning - volle kraft voraus für ihr system

   Informatorische grundlagen

   Javascript

   Interne sortieralgorithmen - der kern der sache

   Plotter und sonstige drucker

   Frage 20 (rössl priska)

   Internet - programmierung

   Monitore

   Semesterarbeit und spezialgebiet für informatik

   Erörterungs zum thema

   Inhaltsverzeichnis

   Einführung in die entwicklung ganzheitlicher informationssysteme:

   Titel dokument
alle kategorien

  Grafik

GRAFIK      Historische Entwicklung der Grafik-Hardware: MDA (Monochrome Display Adapter):Diese Karte wurde 1981 zusammen mit dem ersten IBM-PC von IBM vorgestellt und war bis zum Erscheinen der Hercules-Karte Monochrom-Standard. Sie verfügt nur über einen Betriebsmodus zu 80 (Spalten) x 25 (Zeilen) Text und sehr wenig Video-RAM, so daß nur eine Bildschirmseite im Speicher Platz hat. Der MDA unterstützt keine Grafiken, weist aber eine deutlich höhere Bildschirmauflösung als der CGA auf.CGA (Color Graphics Adapter):Auch diese Karte kam 1981 auf den Markt und bot im Gegensatz zum MDA bereits Grafikdarstellung. Sie konnte über einen speziellen Ausgang an einen normalen Fernseher angeschlossen werden, oder über einen RGB-Ausgang an einen eigenen Monitor. Die Auflösung ist deutlich schlechter als beim MDA.

Im Textmodus stellt die CGA-Karte, genau wie die MDA-Karte, 80 x 25 dar, wobei die einzelnen Zeichen aber auf einer kleineren Punktmatrix basieren. An Grafikmodi stehen 320 x 200 (Punkte) x 4 (Farben) sowie 640 x 200 x 2 zur Verfügung. CGA und MDA basierten beide auf dem MC6845 von Motorola.Hercules Graphics Card:Ein Jahr später kam die Hercules-Karte auf den Markt, die weitestgehend zum MDA kompatibel war. Darüber hinaus konnte sie jedoch zwei Grafikseiten mit einer Auflösung von 720 x 348 (monochrom) darstellen. Diese Karte war sehr einfach zu programmieren und bot auch eine parallele Schnittstelle.

Sie stellt heute den Monochrom-Standard dar.EGA (Enhanced Graphics Adapter):Der EGA wurde 1985 vorgestellt und war eine späte Antwort auf die Hercules-Karte. Er ist voll kompatibel zu MDA und CGA und kann neben farbigen auch monochrome Grafiken darstellen. Die EGA-Karte war damit die erste, die mit einem Monochrom- oder einem Colormonitor eingesetzt werden konnte. Im Grafikmodus stellt sie bei 640 x 350 Punkten 16 Farben aus einer Palette von 64 gleichzeitig dar. Der Video-RAM ist standardmäßig 64 KB groß, die Karte kann aber mit bis zu 256 KB bestückt werden, um mehrere Grafikseiten im Speicher unterzubringen.

Das Bild ist wesentlich schärfer als bei einer CGA-Karte, außerdem kann der EGA mit variablen Schriftsätzen arbeiten. Erstmals hat die EGA-Karte ein eigenes ROM-BIOS onboard, um den Zugriff auf die erweiterten Leistungsmerkmale zu erleichtern.VGA (Video Graphics Array):Die VGA-Karte wurde 1987 vorgestellt und ist zu allen Vorgängern kompatibel. Sie stellt heute den Standard der PC-Grafikkarten dar und ist dabei der kleinste gemeinsame Nenner, zu dem alle SVGA-Karten (siehe dort) kompatibel sind. Der VGA sendet erstmals analoge Signale an den Monitor, was die große Farbenvielfalt ermöglicht. Die höchste Auflösung ist 640 x 480, wobei maximal 16 Farben dargestellt werden können.

Im Mode 13h können außerdem bei 320 x 200 Bildpunkten 256 Farben gleichzeitig aus einer Palette von 262.144 dargestellt werden. Dieser Modus diente dabei ursprünglich der Kompatibilität zu MCGA, wobei der VGA diese Auflösung eigentlich gar nicht darstellen kann. Durch einen Trick wird aber durch Setzen von zwei VGA-Registern die tatsächliche Auflösung von 640 x 400 einfach halbiert. Dem Profi-Programmierer bietet sich dadurch die Möglichkeit, durch Löschen der beiden Register einen sehr einfach zu programmierenden hochauflösenden Modus zu erhalten, der von jeder VGA-Karte mit mindestens 512 KB Speicher dargestellt werden kann. Ursprünglich wurden VGA-Karten mit 256 KB Video-RAM bestückt, heute ist aber 1 MB bereits das Minimum, da jede Karte gleichzeitig auch eine SVGA-Karte ist, mit mehr oder weniger erweiterten Möglichkeiten.

SVGA (Super VGA):SVGA-Karten sind VGA-Karten mit erweiterten Möglichkeiten. Sie sind mit mindestens 1 MB, meistens schon 2 MB, häufig 4 MB und inzwischen bis zu 8 MB Video-RAM bestückt. Der maximale Grafikmodus ist derzeit 1600 x 1200 Bildpunkte bei 16.7 Mio. Farben gleichzeitig (!), inzwischen bieten manche Karten sogar 32 Bit Farbtiefe, was die Brillianz des Bildes noch erhöhen soll. Bildwiederholraten von bis zu 150 oder gar 200 Hertz sind bei den Karten der Luxusklasse dabei schon keine Seltenheit mehr, erfordern aber auch einen entsprechend teuren und leistungsfähigen Monitor.

Als weitere Zuckerln bieten viele Karten heute auch Zusatzfunktionen: Windows-Beschleuniger sollen dem Hauptprozessor unter Windows Arbeit abnehmen und sind speziell für die Zusammenarbeit mit dem GDI ausgelegt. AVI-Beschleuniger stellen AVIs unter Windows dar, ohne den Hauptprozessor zu belasten. Sie erlauben auch freies Skalieren und Zoomen und können das Video als hardwaremäßiges Overlay über das Bild legen. MPEG-Decoder spielen MPEG-Videos in Echtzeit ab, ohne den Prozessor zu belasten. Der Nachteil des ganzen Zaubers ist allerdings, daß nichts (!) davon genormt ist und deswegen von Hersteller zu Hersteller unterschiedlich zu programmieren. Das soll sich zwar mit Windows ändern (siehe unten), für die Zeit bis dahin wurde allerdings 1989 das VESA-Komitee gegründet.


VESA (Video Electronics Standard Association):Um das Chaos bei der Ansteuerung von SVGA-Karten zu beenden, haben sich 1989 die wichtigsten Anbieter an einen Tisch gesetzt und gemeinsam den VESA-Standard entwickelt. Zu diesen Firmen gehören unter anderen: ATI, Chips & Technologies, Everex, Genoa, Intel, Phoenix Technologies, Orchid, Paradise, Tseng, Video Seven und noch eine Reihe anderer, um nur die wichtigsten zu nennen. 1990 stellten sie den VESA-Standard vor, eine Video-BIOS-Erweiterung, die die Kartenansteuerung vereinheitlicht. Bei neueren Karten ist sie schon im ROM-BIOS eingebaut, für ältere Karten ist sie durch TSRs realisierbar. Die aktuelle Version ist 1.2.

Dieser Standard ist ziemlich schnell und bietet sehr tiefgreifende Möglichkeiten, darüber hinaus ist er noch sehr einfach zu programmieren und stellt derzeit wohl die beste Möglichkeit dar, mit SVGA unter DOS zu arbeiten.  Windows:Windows vereinfacht die Ansteuerung der Grafikkarte enorm, da es eine einheitliche Plattform für alle Programme bietet. Mit der zunehmenden Verbreitung von Windows 95 als Betriebssystem sollte deshalb das Chaos der Programmierung bald der Vergangenheit angehören (Hörten wir das nicht von der Speicherverwaltung auch schon ?). In Zukunft liefert dann jeder Hersteller nur noch einen optimierten Windows-Treiber für seine Grafikkarte, der alle ihre Möglichkeiten bestmöglich ausnützt. Windows greift dann über diesen Treiber auf die Grafikhardware zu und stellt den Programmen eine einheitliche Schnittstelle zur Verfügung. Im konkreten sieht das so aus, daß der Programmierer seine Grafikdaten einfach ins GDI schreibt, und Windows sorgt dann für die korrekte Darstellung.

Allerdings hat das GDI nur eine beschränkte Größe, auch wenn es bei Windows 95 erweitert wurde, und Spezialfunktionen (wie z. B. das Abspielen von MPEG-Videos) bedürfen immer noch eines eigenen Treibers, der aber vom Hersteller mitgeliefert wird. Sollte hier aber nicht bald ein Machtwort gesprochen werden, könnte auf diesem Gebiet bald ein ähnliches Ansteuerungschaos drohen wie bei SVGA unter DOS. Ein klarer Vorteil des GDI ist aber sicherlich die extrem einfache Programmierung beliebiger Grafikmodi (die übrigens in C-Konvention definiert wurde). Die geringe Geschwindigkeit dieser Art der Grafikdarstellung ist zwar für Standardanwendungen (Textverarbeitung, .

..) durchaus ausreichend, bei Spielen oder ähnlich grafikintensiven Anwendungen wird es aber problematisch. Zur Behebung dieser Schwierigkeiten wurde WIN-G definiert, das direkte Grafikprogrammierung unter Windows erlaubt, ohne irgendwelche Standard-Probleme! Zusammenfassend ist zu sagen, daß Windows 95 möglicherweise die Lösung aller Programmierprobleme darstellen könnte (Wer´s glaubt, hat Murphy´s Gesetze noch nicht gelesen ...

) und man erstmals ohne Geschwindigkeitsverluste (!!!) aus einer Hochsprache ernsthaft Grafik programmieren könnte...  Speicher:Beim Video-RAM unterscheidet man nicht nur nach der Größe, sondern auch nach der Art der Speicherchips. Ursprünglich gab es nur DRAMs, welche allerdings sehr langsam sind. Sie können nämlich nur entweder gelesen oder beschrieben werden.

Die nächste Generation bildeten dann die VRAMs, welche gleichzeitig ausgelesen und beschrieben werden konnten. Sie sind deshalb um mindestens die Hälfte schneller, allerdings auch empfindlich teurer. Heute kommen meistens VRAMs und nur noch selten DRAMs zum Einsatz. Der letzte Schrei sind WRAMs, welche noch einmal um cirka 50 % schneller und dabei sogar billiger zu produzieren sind. Derzeit sind zwar erst sehr wenige Karten mit ihnen bestückt, sie dürften in nächster Zeit aber sehr große Verbreitung erlangen. Speicherverwaltung: Beim Programmieren sieht es normalerweise so aus, daß Teile des Video-RAMs (die über Register selektiert werden) in den konventionellen Speicherbereich eingeblendet werden (Zur leichteren Vorstellung: ähnlich wie bei EMS).

Um genau zu sein, liegt der Grafikpuffer zwischen A000 und AFFF, der Monochrom-Textpuffer zwischen B000 und B7FF (der allerdings bei Farbsystemen häufig von diversen Memorymanagern verwendet wird) und der Farb-Textpuffer zwischen B800 und BFFF. Auf der Grafikkarte wird die lineare Adressierung dann in eine planare umgewandelt und die entsprechenden Punkte gesetzt, abhängig natürlich von den Registereinstellungen. Dies gilt aber alles nur für VGA und höher (und ist heute als einziges noch interessant), bei früheren Grafikstandards sah die Sache teilweise etwas anders aus.  Mode 13h:Dies ist der 256-Farbenmodus des Standard-VGA und wohl einer der am häufigsten verwendeten. Er ist kompatibel zu MCGA, bezieht daher aber auch eine seiner Schwächen, nämlich die interne Halbierung der Auflösung auf 320 x 200 durch Setzen der entsprechenden Register. Auf VGA-Karten mit mindestens 512 KB Video-RAM kann sich ein Profiprogrammierer durch Löschen dieser Register daher sehr einfach einen High-Res-256-Farbenmodus schaffen, muß dann allerdings auf BIOS-Unterstützung verzichten.

Kehren wir aber zurück zum Mode 13h. Hier macht man sich das Chaining der Bit-Planes zu einem linearen Adreßraum zunutze, das heißt der VGA-Adreßraum wird ab Segment A000 im konventionellen Speicher eingeblendet. Man kann dadurch einen Punkt sehr einfach durch folgende Formel adressieren: Offset=Y x 320 + X An die entsprechende Adresse schreibt man nun einfach den Farbwert aus der Palette, die man natürlich vorher in den VGA schreiben muß. Die Palette bietet hierbei 256 Farben von 262.144 und ist 768 Bytes groß. Für jede Farbe stehen dabei nacheinander die Rot-, Grün- und Blau-Werte.

Da an der Punktadresse nur ein Pointer auf die entsprechende Farbe steht, spart dieser Modus sehr viel Speicher. Intern wandelt der VGA die lineare dann wieder in eine planare Adressierung um. Dazu werden Bit 0 und 1 des Offsets zur Selektierung der Schreib- bzw. Lese-Plane verwendet, die restlichen sechs Bit (2-7) werden als physikalische Adresse innerhalb der Plane verwendet. Ein ähnliches Verfahren (Odd/Even-Adressierung) verwenden übrigens auch sämtliche Textmodi. Dabei dient Bit 0 zur Selektion zwischen Plane 0 und 1, so daß sich aus Sicht der CPU Zeichen- und Attribut-Byte jeweils direkt hintereinander befinden, intern jedoch Zeichen in Plane 0 und Attribute in Plane 1 abgelegt werden, Plane 2 und 3 dienen als Zeichensatzspeicher.

 Grafikformate:GIF: GIF ist eines der am häufigsten verwendeten Grafikformate und das Standardformat von CompuServe. Es wurde 1987 entwickelt, ist systemunabhängig und bietet eine hervorragende Kompression. GIF erlaubt Bilder bis zu einer Auflösung von 16.000 x 16.000 Punkten bei einer Palette von 256 Farben aus 16.7 Mio.

Intern baut GIF auf einer Blockstruktur auf, auf die hier aber nicht näher eingegangen werden soll (siehe Referenzen am Textende). Als Packverfahren wird ein modifizierter LZW-Algorithmus (Lempel, Ziv, Welch) verwendet, der aber ebenfalls hier nicht erklärt werden kann. BMP: BMP steht für Bitmap, was auch gleich den internen Aufbau dieser Files sehr gut beschreibt. Es ist das Standardformat von Microsoft und wird unter Windows häufig verwendet. BMP ist an und für sich ein sehr einfaches Format und auch sehr schnell. RLE: RLE ist die komprimierte Form von BMP.

Die Abkürzung RLE steht eigentlich für Run Length Encoding und bezeichnet das Packverfahren, das hier zum Einsatz kommt. Dabei wird bei sich wiederholenden Bytes einfach die Anzahl der Wiederholungen und dann das eigentliche Byte geschrieben. Es ist also offensichtlich ein sehr einfaches Pachverfahren, das schlechte Packraten durch hohe Geschwindigkeit und geringen Rechenaufwand kompensiert. PCX: Dieses Grafikformat wurde ursprünglich von ZSoft für ihr Programm Paintbrush entwickelt und ist heute ebenfalls sehr verbreitet. Auch PCX nutzt RLE zur Kompression der Bilddaten. TIF: TIF ist ein Grafikformat mit sehr ausgeprägter Blockstruktur und hervorragender Kompression, das aber leider selten unterstützt wird.

JPG: Dieses Format nutzt intern das JPEG-Packverfahren, welches eine der besten Kompressionsraten überhaupt bietet, allerdings leider auch verbunden mit einem enormen Aufwand an Rechenzeit. MPG: Dies ist ein Format für Videos, das intern das MPEG-Packverfahren nutzt. MPEG ist eine Weiterentwicklung von Motion-JPEG, und es gilt das gleiche, das auch schon bei JPG gesagt wurde. Heute wird oft schon MPEG-2 verwendet, wobei Kompressionsrate und Geschwindigkeit noch einmal verbessert wurden. Der Rechenaufwand ist dabei aber so gigantisch, das spezielle Zusatzhardware (entweder in Form einer eigenen Steckkarte oder häufig auch schon auf Grafikkarten der Oberklasse integriert) benötigt wird, um das Ganze mit halbwegs annehmbarer Systembelastung abzuspielen. AVI: Auch AVI ist ein Video-Format, das von Microsoft entwickelt wurde.

Der Rechenaufwand ist hier ebenfalls sehr hoch, allerdings bietet AVI leider nur Briefmarkenvideos. Diese können zwar auf Vollbild vergrößert werden, wirken dann aber arg pixelig. AVI wird unter Windows häufig verwendet.  VGA-Register:Für professionelle Grafikprogrammierung ist es unerläßlich, die Register des VGA zu kennen. Niemand wird diese allerdings auswendig lernen, was auch sinnlos wäre. Wir wollen an dieser Stelle aus Platzgründen deshalb gar nicht näher auf dieses Thema eingehen und verweisen auf die vielfältige Sekundärliteratur (siehe Textende).

Vorsicht ist allerdings bei Änderungen des VGA-Timings geboten. Extreme Werte können die Grafikhardware irreparabel beschädigen !!! Naiven Anfängern muß gesagt werden, daß Profis aus einer Standard(!)-VGA-Karte (allerdings ohne Bilddarstellung) Frequenzen von weit über 100 Hz herausholen können! Dieses Gebiet ist also für Experimente offensichtlich zu gefährlich und deshalb hoffentlich tabu! Aus eben diesen Gründen sind die entsprechenden Register auch extra geschützt (Protection-Bit 7 des CRTC-Registers 11), und wer dieses Bit löscht, sollte besser wissen, was er tut (!!!) ! Um aber trotzdem einen kleinen Einblick in das Innenleben einer VGA-Karte zu gewähren, hier nun eine kurze Vorstellung der einzelnen Register: Einzelregister: Lesen Schreiben Miscellaneous Output Register 3CCh 3C2h Input Status Register 0 3C2h Input Status Register 1 3DAh Indizierte Register: Index-Register Daten-Register Cathod Ray Tube Controller (CRTC) 3D4h 3D5h CRTC-Register 0: Horizontal Total CRTC-Register 1: Horizontal Display End CRTC-Register 2: Horizontal Blank Start CRTC-Register 3: Horizontal Blank End CRTC-Register 4: Horizontal Sync Start CRTC-Register 5: Horizontal Sync End CRTC-Register 6: Vertical Total CRTC-Register 7: Overflow CRTC-Register 8: Initial Row Address CRTC-Register 9: Maximum Row Address CRTC-Register 0Ah: Cursor Start-Zeile CRTC-Register 0Bh: Cursor End-Zeile CRTC-Register 0Ch: Linear Starting Address High CRTC-Register 0Dh: Linear Starting Address Low CRTC-Register 0Eh: Cursor Address High CRTC-Register 0Fh: Cursor Address Low CRTC-Register 10h: Vertical Sync Start CRTC-Register 11h: Vertical Sync End CRTC-Register 12h: Vertical Display End CRTC-Register 13h: Row Offset CRTC-Register 14h: Underline Location CRTC-Register 15h: Vertical Blank Start CRTC-Register 16h: Vertical Blank End CRTC-Register 17h: CRTC Mode CRTC-Register 18h: Line Compare (Split Screen) Timing Sequencer (TS) 3C4h 3C5h TS-Register 0: Synchroner Reset TS-Register 1: TS Mode TS-Register 2: Write Plane Mask TS-Register 3: Font Select TS-Register 4: Memory Mode Graphics Data Controller (GDC) 3CEh 3CFh GDC-Register 0: Set/Reset GDC-Register 1: Enable Set/Reset GDC-Register 2: Color Compare GDC-Register 3: Function Select GDC-Register 4: Read Plane Select GDC-Register 5: GDC Mode GDC-Register 6: Miscellaneous GDC-Register 7: Color Care GDC-Register 8: Bit Mask Attribute Controller (ATC) Schreibzugriffe: 3C0h ® Index/Data-Flip-Flop Lesezugriff auf Input Status Register 1 ® Index-Mode Schreibzugriff: Index auf 3C0h, anschließend Daten-Byte auf gleichen Port Lesezugriff: Index geschrieben, 3C1h ® Daten-Byte (3C0h ® Index) ATC-Register: Index/Data ATC-Register 0 - F: Palette Ram ATC-Register 10h: Mode Control ATC-Register 11h: Overscan Color ATC-Register 12h: Color Plane Enable ATC-Register 13h: Horizontal Pixel Panning ATC-Register 14h: Color Select Digital to Analog Converter (DAC) Pixel Mask 3C6h Pixel Write Address 3C8h Pixel Read Address 3C7h Pixel Color Value 3C9h DAC State 3C7h   Mode X: Bei der Verwendung von Sprites (siehe unten) ergibt sich die Notwendigkeit von Bildschirmseiten. Diese Seiten können einfach hintereinander im Bildschirmspeicher abgelegt werden und über Register 0Ch und 0Dh (Linear Starting Address) gewählt werden. Das Problem besteht beim Mode 13h (siehe oben) jedoch darin, daß das ganze Bild bereits fast 64 KB (genau 64.000 Bytes) groß ist. Eine Bildschirmseite belegt also schon den gesamten im Hauptspeicher eingeblendeten Videospeicher (0A0000h - 0AFFFFh), was es der CPU unmöglich macht, die zweite Bildschirmseite anzusprechen.

Modifikationen sind also nur über die Segmentselektoren des VGA möglich, die aber bei jedem Hersteller anders programmiert werden. Die Lösung dieses Problems findet sich im Mode X, der auch eine hohe Zugriffsgeschwindigkeit bietet. Im Mode X werden bei einem Byte-Zugriff vier Pixel auf einmal kopiert, außerdem werden Read-Mode 0 und Write-Mode 1 verwendet, die weder aufwendige interne Adreßumwandlungen erfordern noch Daten an die CPU schicken, was den Geschwindigkeitsvorteil gegenüber 32-Bit-Zugriffen der CPU ausmacht. Initialisierung: Das Wichtigste ist die Abschaltung des Chain-4-Mechanismus, so daß wieder freier Zugriff auf einzelne Planes möglich ist, außerdem muß sichergestellt werden, daß der Odd/Even-Mode (Plane-Selektion durch unterstes Offset-Bit) ausgeschaltet ist, dazu muß nur im TS-Register 4 (Memory Mode) Bit 3 (Enable Chain4) gelöscht und Bit 2 (Odd/Even-Mode) gesetzt werden. Je nach Grafikkarte (es lebe die Kompatibilität) muß noch der Speicherzugriff auf Byte-Adressierung geschaltet werden, also zunächst Doubleword-Adressierung aus Bit 6 in CRTC-Register 14h (Underline Row Address) löschen und Bit 6 in CRTC-Register 17h (CRTC-Mode) setzen. Sinnvollerweise wird jetzt noch der Bildschirmspeicher gelöscht, weil an den vom Mode 13h unbenutzten Stellen des Bildschirmspeichers, die jetzt sichtbar werden, noch “Bit-Müll” aus anderen Videomodi stehen kann.

Am einfachsten geht das über das Write Plane Mask Register 2 des Timing-Sequenzers, in dem zum Löschen des Bildschirmspeichers alle Planes eingeschaltet werden, so daß 32.000 Word-Zugriffe oder 16.000 DWord-Zugriffe ausreichen, um alle vier Bildschirmseiten zu löschen. Die weitere Grafikprogrammierung muß nun aber direkt in Assembler erfolgen, da weder vom BIOS noch irgendeiner Hochsprache auch nur die geringste Unterstützung zu erwarten ist. Aufbau: In sämtlichen Plane-basierten Grafikmodi verbergen sich hinter einer Speicheradresse gleich 4 Byte, jeweils eins pro Plane. Die 4 Bytes liegen quasi übereinander an einer Adresse, daher auch der Begriff der Plane (Ebene).

Die Planes sind quasi unabhängige Speicher, die sich einzeln ansprechen lassen, aber bei der Darstellung des Bildes auf dem Monitor parallel verwendet werden, d. h. die Daten aus allen vier Planes werden gleichzeitig gelesen. Im weiteren Aufbau gibt es jedoch gravierende Unterschiede zwischen den 16-Farben-Modi und Mode X. 16 Farben lassen sich durch 4 Bit darstellen, daher auch die 4 Planes. Hier wird nämlich Bit 0 eines Punktes im entsprechenden Bit der Plane 0 gespeichert, Nit 1 in Plane1 usw.

Anders sieht es dagegen im Mode X aus, hier reichen 4 Bit für die Adressierung eines Punktes nicht mehr aus, so daß ein Punkt jetzt ein Byte einer bestimmten Plane verwendet. Dabei werden die Planes byteweise aufgefüllt, d. h. Punkt 0 befindet sich an Offset 0 in Plane 0, Punkt 1 am gleichen Offset in Plane 1, erst Punkt 4 steht an Offset 1, wobei wieder Plane 0 verwendet wird. Die Punktnummer läßt sich im Mode X errechnen wie im Mode 13h (320 x Y + X). Plane und Offset lassen sich nach folgenden Formeln berechnen: Plane = X mod 4 Offset = Y x 80 + X div 4 Dieses Verfahren entspricht exakt dem, das der Mode 13h standardmäßig verwendet, mit einem Unterschied: Der Offset wird durch Shiften der Punktnummer um 2 Bit nach rechts gebildet, nicht durch Maskieren, so daß im Speicher keine Lücken zwischen den Punkten entstehen und somit vier Seiten in die 256 KB Bildschirmspeicher passen.

Bei der Selektion der Plane im Mode X muß allerdings noch zwischen Schreib- und Lesezugriffen unterschieden werden: Beim Lesen wird die Plane-Nummer in Register 4 (Read Plane Select) des GDC geschrieben, beim Schreiben dagegen ist es möglich, mehrere Planes gleichzeitig anzusprechen (wie schon beim Bildschirmlöschen gezeigt). Daher wird eine Maske in Register 2 (Write Plane Mask) des TS gesetzt, die erst aus der Plane-Nummer erzeugt werden muß. Es gilt folgende Formel: Maske = 1 shl Plane-Nummer Aus Plane 2 wird somit die Maske 1 shl 2 = 4 = 0100. Ein Wort noch zur byteweisen Adressierung seitens der CPU: Es drängt sich förmlich die Versuchung auf, mittels 32-Bit-Zugriffen auf die Grafikdaten zuzugreifen (wozu hat man denn einen 386er?) oder wenigstens 16 Bit zu nutzen (das kann theoretisch schon der XT). Wer dies versucht, wird jedoch schon bald eines Besseren belehrt: Das Bild wird völlig verzerrt dargestellt, was sich durch die Vorgehensweise der CPU beim Speicherzugriff erklären läßt. Wenn die CPU ein Word (entsprechendes gilt für ein Doubleword) kopiert (per movsw), zerlegt sie diesen Kopiervorgang natürlich nicht in einzelne Byte-Bewegungen, sondern liest ein Wort komplett und schreibt es wieder komplett zurück.

Der VGA kann jedoch in seinen vier Latches, die ja als Zwischenspeicher dienen, nur 4 Byte aufnehmen. Daher stehen nach dem Lesezugriff dort nur die 4 High-Bytes der gelesenen Words. Beim folgenden Schreibzugriff werden sowohl die 4 High- als auch die Low-Bytes auf den gleichen, den Latches entsprechenden Wert gesetzt. Am Bildschirm zeigt sich dies darin, daß immer zwei (bei 32-Bit-Zugriffen sogar vier) aufeinanderfolgende Viererblöcke den gleichen Inhalt haben, eine vernünftige Bilddarstellung also nicht mehr möglich ist. Höhere Auflösungen im Mode X: Der Mode X bietet den großen Vorzug, mit vier Bildschirmseiten arbeiten zu können, aber an der Auflösung hat er gegenüber seinem Vorgänger Mode 13h nichts geändert. Für bestimmte Anwendungen ist aber eine höhere Auflösung erforderlich.

Dafür gibt es selbstverständlich die Super-VGA-Auflösungen, die zwar für jede Karte unterschiedlich angesprochen werden, was man aber zur Not über VESA-Treiber in den Griff bekommen kann. Das größere Problem taucht dann auf, wenn man auch in der hohen Auflösung mehrere Bildschirmseiten benutzen möchte. Zwar sind kaum noch VGA-Karten im Verkehr, die weniger als 1 MB Speicher besitzen, so daß selbst der 800 x 600-Punkte-Modus theoretisch zwei Bildschirmseiten im Speicher unterbringen könnte, aber eine Verwaltung von Bildschirmseiten ähnlich dem Linear-Starting-Address-Register ist unter VESA nicht vorgesehen; eine direkte Programmierung wirft wieder das bei Super-VGA unvermeidliche Kompatibilitätsproblem auf. Auf der Suche nach einem höherauflösenden Modus, der aber auch das Seitenkonzept unterstützt, fällt auf, daß der Mode X ganze vier Bildschirmseiten unterstützt, man aber in vielen Fällen nur zwei benötigt. Eine Verdoppelung der Auflösung auf 320 x 400 ist also ohne weiteres möglich. Daß 320 x 400 und nicht 640 x 200 verwendet wird, hängt mit dem eigentlichen Aufbau der 200-Zeilen-Modi auf VGA-Karten zusammen.

200 Zeilen können VGAs nämlich gar nicht explizit ansprechen (Miscellaneous-Output-Register, Bit 6-7 erlauben nur die Werte 350, 400, 480 und teilweise 768 Zeilen vertikale Auflösung). Daß sie es dennoch können, verdanken sie einer Fähigkeit, genannt Double-Scan. Das bedeutet nichts anderes, als daß bei einer physikalischen Vertikalauflösung von 400 Zeilen jede Zeile zweimal dargestellt und somit in y-Richtung verdoppelt wird, was zu einer Auflösungshalbierung führt. Dabei muß weder das horizontale noch das vertikale Timing verändert werden, weil physikalisch weiterhin 400 Zeilen zu je 320 Punkten dargestellt werden. Das macht es sehr einfach, diesen Mechanismus wieder auszuschalten: Im Register 9 des CRTC (Maximum Row Address) müssen 5 Bit gelöscht werden, Bit 7 und Bits 0 - 3. Je nach VGA-BIOS erfolgt die Verdoppelung über das eigentlich dafür vorgesehene Bit 7 (Double Scan Enable) oder Bits 0 - 3, die im Textmodus angeben, wie viele Scan-Zeilen pro Zeichen-Zeile benötigt werden.

Dabei muß dieser Wert um 1 vermindert in das Register geschrieben werden. Im Grafikmodus entspricht der Registerwert dann der Anzahl Kopien, die von der Zeile zusätzlich dargestellt werden. Benutzt man hier größere Werte, kann man die vertikale Auflösung immer weiter herunterteilen bis zu einer Auflösung von 320 x 25 bzw. in Verbindung mit Bit 7 sogar 320 x 12.5. Daß dies keinen Sinn ergibt (Ausnahme: siehe Effekte), ist offensichtlich, aber es zeigt die Bedeutung und Anwendung dieses Registers.

Um also wieder die ursprünglichen Zeilen zu erhalten, müssen nur die genannten Bits des Registers gelöscht werden. Wie gesagt sind keine Timing-Veränderungen nötig, auch ein Umschreiben der Mode-X-bezogenen Routinen ist nicht erforderlich, weil der Aufbau exakt gleichgeblieben ist. Im Prinzip werden die 200 Zeilen des normalen Mode X beim Umschalten auf 400 Zeilen am oberen Rand “zusammengeschoben” und geben den Blick frei auf die darunterliegenden 200 Zeilen, die im VGA-Speicher direkt darauf folgen. Es steht jetzt also in allen Routinen ein vergrößerter Wertebereich der Koordinaten zur Verfügung, der frei benutzt werden kann, da Sicherheitsabfragen dort aus Geschwindigkeitsgründen sowieso nichts zu suchen haben. Die einzige Änderung bezieht sich auf das Umschalten der Bildschirmseiten, statt vier Seiten à 64.000 Byte stehen jetzt nur noch zwei Seiten à 128.

000 Byte zur Verfügung. Dies spielt beim Umschalten eine Rolle, weil die Startadresse in diesem Fall nicht mehr zwischen 0 und 16.000 umgeschaltet wird, sondern zwischen 0 und 128.000. Außerdem steht keine “Reserveseite” für ein Hintergrundbild mehr zur Verfügung, weil nahezu die gesamten 256 KB belegt sind (256 KB - 256.000 Byte = 6 KB sind noch ganz am Ende frei und können für kleine (!) Sprite-Hintergründe verwendet werden).

Hintergründe müssen in diesem Modus also aus dem Hauptspeicher in den VGA kopiert werden. Beim Erstellen eines Hintergrunds ist übrigens auch das äußerst ungewohnte Seitenverhältnis von 320 : 400 zu berücksichtigen, das sehr flache, breite Rechtecke als Bildschirmpunkte erzeugt, so daß Kreise keine Kreise mehr sind, sondern sehr flache Ellipsen. Ein Bild sollte deshalb am besten in einer “quadratischen” Auflösung (z. B. 640 x 480) erstellt und dann auf 320 x 400 heruntergerechnet werden. Neben dieser neuen Auflösung lassen sich auch Grafikmodi mit noch höherer Auflösung erzeugen.

Dabei entstehen sehr kuriose Auflösungen wie 512 x 400 oder 320 x 480. Abgesehen von der weit komplizierteren Initialisation dieser Modi, die eine komplette Umprogrammierung der Timing-Register erfordern, bieten sie auch keine erwähnenswerten Vorteile gegenüber Super-VGA-Modi, weil sie weit über den für Seitenprogrammierung maximalen Speicherverbrauch hinausschießen. Eine Seite läßt sich zwar auf jeder Standard-VGA darstellen, zwei Seiten überschreiten jedoch die 256 KB, die für die allgemeingültigen Adressierungsmethoden die oberste Grenze der Adressierbarkeit darstellen. Für höhere Adressen kommt das Problem der Inkompatibilität der Super-VGA-Karten zum Tragen, so daß man auch gleich einen Super-VGA-Modus verwenden kann, der dann wenigstens ein vernünftiges Seitenverhältnis aufweist.   Grabben: Grabben (oder auch Capturen) bedeutet das “einfangen” des Bildschirminhalts (oder eines Teils davon). Dieser kann dann entweder in eine Datei gespeichert oder im Speicher verschoben werden, eventuell auch innerhalb des Video-RAMs oder wieder zurück in diesen.

Ernsthaftes Grabben greift sehr weit in das System ein und ist deshalb auch nur in Assembler möglich. Im allgemeinen arbeitet man Interrupt-gesteuert, das heißt man installiert seine Capture-Routine auf einen Interrupt (der natürlich frei sein muß, im Zweifelsfall vorher überprüfen !). Da meistens auf Tastendruck gegrabbt werden soll, hängt man sich auch in den Tastaturinterrupt ein, es sind aber auch andere Auslöser möglich. Wird die Routine nun aufgerufen, muß sie als erstes das System blockieren. Es empfiehlt sich auch, weitere Interrupts für die Dauer des Grabbens zu sperren, hier ist natürlich ein gutes Timing notwendig. Nun gilt es zuerst, den Status der Grafikhardware zu bestimmen.

Dazu stellt man den Grafikmodus fest und liest dann unbedingt (!) auch die Register aus! Viele Amateure scheitern an Non-Standard-Modes, wie zum Beispiel Mode X, was im besten Fall “Müll” zurückliefert und im schlimmsten Fall das System zum Absturz bringt. Nachdem man sich nun (hoffentlich...) vollkommen klar ist, was man vor sich hat (natürlich, einen Computer..

.; aber ich meinte die Grafik-Situation), kann man beginnen, in Abhängigkeit vom ermittelten Grafikstatus die Daten zurückzulesen. Je nach Sinn und Zweck des Ganzen braucht man diese jetzt nur noch für spätere Verwendung z. B. in den XMS zu kopieren oder fürs Abspeichern im entsprechenden Grafikformat zu verschlüsseln und auf die Harddisk zu schreiben. Letzteres kann auch bereits im Hintergrund geschehen, vor allem unter Windows.

Man sollte auch unbedingt vor (!!!) dem Capturen bestimmen, ob Windows aktiv ist, und das dann berücksichtigen! Nachdem das eigentliche Grabben fertig ist, braucht man dann nur noch die Interrupts wieder freizuschalten und das System wieder freizugeben, nachdem man es wieder in den Ursprungszustand (!!!) versetzt hat (Prozessorregister, ...)!   Effekte: Split Screen: Diese Technik dient dazu, zwei unabhängige Bereiche am Bildschirm anzuzeigen. Dabei wird über das Line-Compare- (oder auch Split-Screen-) Register der Bildschirm in einen oberen beweglichen und einen unteren statischen Teil gespalten (in den 200-Zeilen-Modi ist dieser Wert zu verdoppeln). Während der Darstellung des Bildes zählt der VGA permanent die aktuelle (physikalische !) Zeile mit.

Diese Zeilennummer befindet sich in einem (leider !!!) nicht über Port-Adressen zugänglichen Register, das jedoch intern zu einem Vergleich mit dem Line-Compare-Register (CRTC, Index 18h) herangezogen wird. Erreicht es den Wert, den dieses Register vorgibt, so wird der Adreßzähler mit 0 geladen, das heißt die Darstellung beginnt in dieser Zeile mit den Daten, die sich an Offset 0 des Bildschirmspeichers befinden. Weil sich die Zeilennummer grundsätzlich nicht in 8 Bit unterbringen läßt (der VGA kennt keinen Modus mit weniger als 350 Zeilen, auch 200-Zeilen-Modi werden durch 400 physikalische zeilen erzeugt), ist das Line-Compare-Register auf drei, bei Super-VGA-Karten sogar auf vier Register aufgeteilt. Weil auch andere Register, die vor allem das vertikale Timing betreffen, 8 Bit überschreiten, wird aus Platzgründen kein zusätzliches Register eingeführt, sondern alle “überlaufenden” Bits dieser Register in zwei (bei Super-VGA drei) neuen Registern zusammengefaßt. Das erste dieser Register ist das Overflow-Register, das - nomen est omen - die Überläufe der vertikalen Timing-Register aufnimmt. Unter anderem befindet sich hier in Bit 4 (übrigens das einzige dieses Registers, das nicht über das Protection-Bit des Registers 11h geschützt ist) das Bit 8 des Line-Compare-Registers.

Line-Compare-Bit 9, das bei diesen Auflösungen jedoch noch nicht benötigt wird, befindet sich im zweiten Überlaufregister, dem Register Maximum Row Address, an Bit 6. Möchte man Line Compare also setzen, muß man die Bits der Zeilennummer durch Bit-Verschiebungen und Maskierungen auf diese drei Register verteilen. Setzt man den Bildschirmstart mit Hilfe der Linear-Starting-Address-Register 0Ch und 0Dh auf eine größere Position, beispielsweise den Start der Seite 2, dann wird in der oberen Hälfte unterhalb der im Line-Compare-Register gesetzten Zeile der Inhalt des Bildschirmspeicher-Starts angezeigt. Nun läßt sich der obere Bereich durch die Linear-Starting-Address beliebig verschieben und in alle Richtungen scrollen, während der untere immer den gleichen Inhalt aufweist. Scrolling: Bis jetzt benutzten wir das Register Linear Starting Address des CRTC (Register Nr. 0Ch/0Dh) zum Umschalten der Bildschirmseiten.

Dazu wurde der Offset dieser Seite berechnet (Seitennummer x 16.000) und in dieses Register geschrieben. Genausogut lassen sich aber auch beliebige Zwischenwerte schreiben und der Anfang des dargestellten Bereichs somit frei im RAM verschieben. Wird ein neues Bild durch den Kathodenstrahl aufgebaut, bezieht dieser die Bilddaten nicht mehr aus dem Anfang des Bildschirmspeichers, sondern vom Beginn der im Register Linear Starting Address festgelegten Stelle. Auf diese Weise läßt sich der physikalische Bildschirm, d. h.

der Bereich, der letzten Endes auf dem Monitor erscheint, wie ein Fenster über das ganze VGA-RAM verschieben, so daß immer ein beliebiger Ausschnitt eines 256 KB großen Bildes angezeigt wird. Verschiebt man diesen Bildschirmstart innerhalb des RAM, bewegt sich das Fenster in diese Richtung, so daß die Grafik auf dem Monitor entgegengesetzt bewegt wird. Eine Erhöhung der Linear Starting Address um 80 bedeutet also eine Verschiebung des Bildinhalts um eine Zeile (320 Pixel / 4 Planes = 80 Byte lang) nach oben. Der Inhalt der Zeile 0 befindet sich außerhalb des Fensters, und Zeile 200 rückt von unten nach und erscheint als unterste Zeile. Jetzt sind also die Zeilen 1 - 200 sichtbar. Durch weiteres Erhöhen des Registers in Schritten von 80 Byte kann man unter minimalem Einsatz von Rechenleistung ein vertikales Scrolling des gesamten Bildschirminhalts erreichen.

Oft möchte man nicht nur vertikal, sondern auch horizontal scrollen, man denke nur an ein vier Bildschirmseiten großes Logo, das immer nur ausschnittsweise sichtbar ist und sozusagen “unter” dem Bildschirm hin und her bewegt wird. Die Lösung scheint sehr einfach: Bisher wurde das Register Linear Starting Address immer noch in Schritten von 80 bewegt, warum also nicht einfach in Einerschritten zählen? In diesem Fall wird jedoch das, was am linken Bereich herausgescrollt wird, direkt am rechten Rand wieder angefügt. Dies resultiert einfach daraus, daß die Zeilen immer noch direkt hintereinander im Speicher liegen. Hat man nun den Bildschirmstart zum Beispiel um ein Byte verschoben (Linksverschiebung um 40 Pixel), so stellt der CRTC in der ersten Rasterzeile die Bytes 1 bis 80 (statt normalerweise 0 - 79) dar; das Byte 80 gehört jedoch eigentlich schon zur zweiten Zeile der Vorlage, dadurch wird jedes Byte, das am linken Rand herausgescrollt wird, eine Zeile höher am rechten Rand wieder angefügt. Die Lösung des Problems liegt darin, den Bildschirm virtuell auf 640 Pixel Breite zu vergrößern. Angezeigt werden dabei weiterhin nur 320 Punkte, aber rechts “neben” dem Monitor werden weitere theoretische Punkte angefügt, so daß die vier Bildschirmseiten nicht mehr übereinander liegen wie beim vertikalen Scrolling, sondern ein Quadrat bilden.

Dann erscheinen links herausgescrollte Punkte ganz rechts außen (x-Koordinaten 636 - 639) im unsichtbaren Bereich, und neue Punkte werden vom unsichtbaren Bereich in den sichtbaren hineingescrollt. Anders gesagt kann man das Fenster, das der Bildschirm ja eigentlich im Mode X darstellt, auch horizontal bewegen, weil jetzt Platz dazu da ist (waagrecht nebeneinander liegende Bildschirmseiten). Doch wie erzeugt man diesen besonderen Modus? Der VGA besitzt natürlich auch hierfür ein Register. Es handelt sich dabei um das Register 13h des CRTC: Row Offset. Hinter diesem unscheinbaren Namen verbergen sich ungeahnte Nöglichkeiten. Hier wird nämlich die Sprungweite angegeben, um die beim Erreichen des rechten Rands durch den Kathodenstrahl der interne Zeiger auf die Daten (Linear Counter) weiterbewegt werden soll.

Dies entspricht also dem Abstand der Zeilen innerhalb des Bildschirmspeichers, also deren Länge! Normalerweise enthält dieses Register sowohl im Mode 13h als auch im Mode X den Wert 40, was einer Breite von 80 Byte entspricht. Das Register zählt in Word-Schritten, d. h. 80 Byte Breite werden als 40 Word gezählt. Im Mode 13h sind die Zeilen zwar 320 Byte lang, aber auch die Berechnungsgrundlage, die der größten durch die CPU adressierbaren Einheit entspricht, wird vervierfacht von einem Byte auf ein Doubleword, wodurch als programmierter Wert wieder 320/8 = 40 herauskommt. Nun lassen sich natürlich auch größere Werte einsetzen.

Schreibt man in dieses Register zum Beispiel den Wert 80, heißt das, daß die Zeilen einen Abstand, also eine Länge, von 160 Byte haben (entspricht 640 Pixel). Dadurch entstehen natürlich Lücken von 80 Byte Länge zwischen den einzelnen 80-Byte-Zeilen, die von den rechts überstehenden, unsichtbaren Zeilenhälften aufgefüllt werden. Zusammenfahren eines Bildes: Eine Anwendung der Kombination aus Split Screen und Scrolling besteht im Zusammenfahren eines Bildes aus zwei Hälften. Dabei wird die obere Hälfte, die von oben zur Mitte gefahren wird, durch die Linear Starting Address kontrolliert, sie wird also einfach nur vertikal (in diesem Fall nach unten) gescrollt. Dabei ist darauf zu achten, daß Bildschirmseite 1 leer oder mit einer bestimmten Farbe gefüllt ist, da sie zu Beginn zur Hälfte sichtbar ist. Die untere Hälfte wird durch das Splitting gesteuert: Durch Verringern der Zeilennummer wird der Beginn des Split-Screens nach oben geschoben, also zur Mitte hin.

Smooth-Scrolling im Textmodus: Scrolling im Textmodus funktioniert eigentlich genauso wie im Grafikmodus: Über die Startadresse Linear Starting Address) wird der sichtbare Ausschnitt des Bildschirmspeichers verschoben. Die Sache hat jedoch einen Haken: Dieses Scrolling ruckelt stark, weil immer um ganze Zeichen verschoben wird, während im Grafikmodus um einzelne Punkte verschoben werden kann. Das liegt am Aufbau des Bildschirmspeichers im Textmodus: Informationen für einzelne Punkte liegen hier nicht mehr vor, so daß auch die Linear Starting Address sich immer auf ganze Zeichen bezieht und nur ein sehr grobes Scrolling erlaubt. Die Rettung kommt mal wieder von neuen Registern des VGA, die nur darauf warten, sich dieser Problematik anzunehmen. Es handelt sich dabei um das horizontale und das vertikale Panning-Register. Unter Panning versteht man generell die Verschiebung des Bildinhalts um einen Punkt, wobei diese beiden Register eben dies auch im Textmodus erlauben.

Um nun sanft zu scrollen, verschiebt man einfach den Bildinhalt durch Panning in Einzelschritten in die gewünschte Richtung. Hat man dabei ein Zeichen weit grscrollt, setzt man das entsprechende Panning-Register wieder auf seinen Ursprungswert und modifiziert nun das Register Linear Starting Address. Dies ist erforderlich, weil Panning nur bis zu einem Zeichen Breite bzw. Höhe möglich ist und somit nur zur Feinsteuerung dienen kann, während die Linear Starting Address weiterhin für das Grobscrolling sorgt. Das Vertikal-Panning wird durch das Register 8 des CRTC (Initial Row Address) erzeugt, dessen Bits 4 - 0 angeben, mit welcher Grafikzeile bei der Darstellung der ersten Scan-Zeile begonnen wird. Erhöht man diesen Wert also um 1, wird mit der Zeile 1 innerhalb des Zeichensatzes begonnen, der Bildschirminhalt bewegt sich um eine Zeile nach oben.

Für das horizontale Panning dagegen ist der Attribute Controller zuständig, dessen Register 13h (Horizontal Pixel Panning) für gleichmäßige Bewegung in x-Richtung sorgt. Bei diesem Register ist jedoch die etwas ungewöhnliche Wertezuweisung zu beachten: Ein Wert von 0 bedeutet ein Panning um einen Pixel, eine 1 bis 7 bedeutet Panning um 2 bis 8 Pixel, wogegen ein Wert von 8 auf agr kein Panning hindeutet. Die erforderliche Formatumwandlung wird - ohne langsame If-Strukturen - durch eine einfache Rechnung erledigt: Register-Wert = (Panning-Wert - 1) mod 9 Wegfließendes Bild: Es wurde bereits öfter der Double-Scan-Modus des VGA erwähnt. Diese Zeilenverdoppelung (um bei physikalischer Auflösung von 400 Zeilen 200 Grafikzeilen darzustellen) wird je nach BIOS entweder über das dafür zuständige Bit 7 (Double-Scan Enable) des CRTC-Registers 9 (Maximum Row Address) erreicht oder durch Einsetzen von 1 statt 0 in die Bits 4 - 0. In diesen Bits befindet sich in den Textmodi die Anzahl der Rasterzeilen pro Zeichenzeile minus 1, in VGA-Textmodi also 15, es bestimmt damit die Anzahl Rasterzeilen, in denen immer wieder die gleichen Informationen aus dem Bildschirmspeicher geholt werden. Im Textmodus sind diese Rasterzeilen natürlich trotzdem nicht gleich, weil jedesmal eine andere Zeile des Zeichensatzes verwendet wird.

Im Grafikmodus gibt es jedoch keinen Zeichensatz, so daß tatsächlich immer wieder die gleichen Daten dargestellt werden. Ein Wert von 1 in diesen Bits sorgt also auch für eine Zeilenverdopplung, es wird praktisch von jeder Zeile eine Kopie erzeugt. Was passiert nun, wenn man noch höhere Werte einsetzt? Genau das Erwartete: Es werden noch mehr Kopien erzeugt, die Pixel werden in y-Richtung in die Länge gezogen, die vertikale Auflösung halbiert. Im Prinzip ist dieses Vorgehen auch im Textmodus möglich, führt dort jedoch zu unansehlichen Bildern. Dies kommt daher, daß der VGA hier zwar wie im Grafikmodus auch die Speicherinhalte verdoppelt, verdreifacht usw., daß für diese neuen Zeilen aber keine Zeichensatzinformationen mehr vorliegen, so daß hier nur Bit-Müll erscheint.

Dieser Effekt bleibt also auf den Grafikmodus beschränkt. Bei der Wahl eines geeigneten Bildes ist zu beachten, daß am oberen Rand mindestens 13 Zeilen schwarz sind oder eine andere gemeinsame Farbe haben, weil das Bild sonst nicht herausfließt, sondern einfach nur in die Länge gezogen wird. Bei 400 Zeilen vertikaler Auflösung und einem maximalen Wert von 31 für das Register Maximum Row Address wird jede Zeile 32mal dargestellt, was zu 400/32 = 12.5 sichtbaren Zeilen führt, die alle die gleiche Farbe aufweisen müssen, damit das ganze Bild hinterher einfarbig ist. Copper-Balken: Die bisherigen Effekte ließen sich alle im wesentlichen durch einfache Umprogrammierung bestimmter VGA-Register erzielen. Die CPU übernahm dabei nur die Steuerung, z.

B. die stetige Veränderung der Bildschirmstartadresse zum Scrolling. Jetzt erhält die CPU eine neue Aufgabe: Sie soll nicht mehr nur steuern, sondern auch Kontrollaufgaben wahrnehmen. Kopieren ist dagegen weiterhin tabu. Das bedeutet, daß die CPU ständig den VGA überwacht, und an bestimmten Rasterzeilen Modifikationen an VGA-Registern vornimmt. Dadurch läßt sich ein Effekt erzeugen, der bereits zu C64-Zeiten beliebt war: die Copper-Balken.

Dabei handelt es sich um waagrecht verlaufende Balken bestimmter Farbe, die sich ständig in y-Richtung herauf- und herunterbewegen, während andere Grafikeffekte wie Text-Scroller gleichzeitig und teilweise vor ihnen ablaufen. Aus dem Erscheinungsbild dieser Balken läßt sich bereits ihre grundlegende Funktionsweise herleiten: Der Bildschirmspeicher enthält an den betreffenden Stellen überhaupt keine Daten, er ist z. B. mit Nullen gefüllt, so daß von hier aus keine Copper ausgehen können. Allerdings wird in jeder neuen Rasterzeile neu definiert, was diese Null eigentlich bedeutet, so daß sie einmal für ein schwaches Rot, in einer anderen Zeile aber für ein helles Gelb stehen kann. Auf diese Art und Weise lassen sich übrigens auch wesentlich mehr als 256 Farben auf dem Bildschirm darstellen, weil theoretisch jede Rasterzeile 256 Farben enthalten kann, die nach jeder Zeile eine andere Bedeutung haben.

In der Praxis ist diese Farbenvielfalt jedoch sehr eingeschränkt, weil innerhalb eines Retrace nicht eine ganze Palette gesetzt werden kann, sondern nur eine bestimmte Anzahl, je nach Rechnergeschwindigkeit. Nur durch umprogrammieren von Farbe 0 entstehen aber bereits 127 neue Farben. Programmiert man also nur ein paar Farben mehr um, läßt sich diese Zahl noch weiter vergrößern. Allerdings spielt diese Möglichkeit im Zeitalter der HiColor- und TrueColor-Karten kaum noch eine Rolle. Wird diese Farbe also im Rhythmus der Darstellung der Rasterzeilen gewechselt bzw. fließend verändert, lassen sich damit waagrechte Strukturen wie Balken darstellen.

Andere Farben als 0 werden davon nicht berührt, so daß ohne weiteres im Vordergrund ein Text vorbeiscrollen kann, der beispielsweise die Farben 1 - 16 benutzt, während er an den Stellen, wo er Null enthält, durchscheint und die Copper-Balken im Hintergrund sichtbar werden. Auf diese Weise braucht man sich beim Bewegen des Scroll-Textes keine Gedanken über den Hintergrund zu machen, der auf konventionelle Weise zwischendurch immer wieder gesichert und zurückgeschrieben werden muß. Man kopiert einfach Byte-Blöcke auf den Bildschirm, die an den durchsichtigen Stellen eine 0 enthalten. Der große Vorteil besteht darin, daß zum Kopieren der schnelle Write-Mode 1 verwendet werden kann. Dieses Verfahren kann sehr gut mit dem des Genlock-Interfaces verglichen werden, das an Stellen, an denen das Video-Signal eine bestimmte Farbe anzeigt (meist Blau), ein Fernsehbild einblendet. Auch hier erfolgt die Mischung auf sehr niedriger Ebene und nicht im langsamen Bildschirmspeicher.

Wie erzeugt man nun aber die verschiedenfarbigen Zeilen? Home-Computer besitzen meist einen sogenannten Rasterzeileninterrupt. Hier kann der Videocontroller programmiert werden, bei Erreichen einer bestimmten Rasterzeile einen Interrupt auszulösen, so daß sehr schnell auf dieses Ereignis reagiert und die Farbe neu gesetzt werden kann. Verfügen einige VGAs noch über einen Vertical-Retrace-Interrupt (oft über Dip-Schalter deaktiviert), so sieht die Sache beim Horizontal-Retrace wesentlich magerer aus. Keine uns bekannte Grafikkarte unterstützt diesen Interrupt. Also bleibt keine andere Wahl, als ständig den Zustand der VGA zu überwachen und die Rasterzeilen mitzuzählen, um in der gewünschten Zeile die Farbe zu ändern. Dazu muß zunächst ein definierter Ausgangszustand geschaffen werden, indem auf einen vertikalen Retrace gewartet wird.

Wird das nächste Mal die Display Enable-Leitung aktiviert (abzulesen im Input-Status-Register, Bit 0 - Display Enable Complement), kann man sicher sein, daß man sich in Rasterzeile 0 befindet und kann durch permanentes Abfragen dieses Bits die aktuelle Zeile mitzählen. Weil die Darstellung einer Rasterzeile im Vergleich zur Darstellung des ganzen Bildes extrem kurz dauert (etwa 30 µs, reicht gerade für 990 Taktzyklen bei 33 Mhz Rechnertakt), kann man es sich nicht erlauben, daß während des Wartens Interrupts auftreten, die oft viel zu lange dauern. Aus dem Abschalten der Interrupts ergibt sich jedoch ein ernstes Problem: Möchte man nebenbei noch Sound abspielen, wird es zeitlich eng, und sehr gutes Timing ist gefordert, um zu verhindern, daß die Soundkarte ausgerechnet während des Wartens auf einen Horizontal-Retrace neue Daten verlangt. Diese Schwierigkeit ist jedoch zu vernachlässigen gegenüber der nötigen Rechenzeit, um den Copper-Effekt durch kopieren im Bildschirmspeicher zu erreichen. Belegt man nicht den ganzen Bildschirm mit Rasterzeilen - Coppern -, sondern nur z. B.

die obere Hälfte, dann bleibt in der unteren Bildschirmhälfte noch genügend Rechenzeit, um Scroller über den Bildschirm zu fahren oder auch Soundberechnungen durchzuführen. Beim Timing ist außerdem gesteigerter Wert auf die Reihenfolge der Befehle zu legen; in der kurzen Zeit des eigentlichen Retrace (ca. 6 µs) ist es praktisch unmöglich, die Berechnungen für mehrere Balken durchzuführen, dies muß also vorher geschehen, während im Retrace selbst nur noch das Setzen der Farbe erfolgt. Wobbler: Mit Hilfe des Horizontal-Retrace lassen sich auch noch ganz andere Effekte als die Copper-Balken erzeugen. Wie wäre es zum Beispiel, wenn man statt der Farbe die horizontale Position in jeder Zeile veränderte? Legt man diesem Effekt eine Sinustabelle zugrunde, kann auf diese Weise der ganze Bildschirm mit einer Wellenbewegung überlagert werden, und das wegen der direkten Programmierung von CRTC-Registern sogar im Textmodus. Die horizontale Lage einer Rasterzeile kontrolliert man am besten mit Hilfe des CRTC-Registers 4.

Dieses Register bestimmt, wie der Name Horizontal-Sync-Start bereits erahnen läßt, die Position, an der der horizontale Retrace einsetzt. Weil das Ende der Synchronisation relativ zum Anfang festgelegt wird, verschiebt man durch Modifikation dieses Registers lediglich die “Lage” des Retrace am Bildschirm, nicht jedoch seine Länge, was auch möglichst zu vermeiden ist, weil bei zu kurzem Retrace einige Monitore nicht mehr mitkommen und das Bild völlig entstellt wird. Die Technik des Wobblers besteht nun darin, wiederum bis zu einer festgelegten Rasterzeile abzuwarten und danach in jeder Zeile das Register 4 mit neuen Werten zu füttern. Diese Werte entnimmt man am besten einer Sinustabelle. Selbstverständlich lassen sich auch andere Funktionen verwenden, Sinus sieht aber unserer Meinung nach Wasserwellen am ähnlichsten. Besondere Beachtung verdient noch das Timing dieses Effekts.

Im Gegensatz zum Copper sollte die Registermodifikation hier während der Darstellung des Bildes durch den Kathodenstrahl erfolgen. Beim Copper spielte die Farbgebung während des Retrace keine Rolle, dafür aber während der Display-Periode. Darum wurde hier während des Retrace umgeschaltet. Im Fall des Wobblers spielt die Position des Retrace jedoch während des Retrace bzw. der Dunkelperiode (Blank Time) eine große Rolle, während das Register bei der Darstellung der Bilddaten selber keinen Einfluß hat. Die Umschaltung muß also diesmal während der Zeit des Display Enable erfolgen, dazu wird einfach die Reihenfolge der beiden Warteschleifen vertauscht.

Auch dieser Effekt funktioniert selbstverständlich wieder völlig unabhängig vom Bildinhalt, weil direkt auf unterster Ebene in das Timing der Bilddarstellung eingegriffen wird. Lediglich bei der Erzeugung der Sinustabelle muß die unterschiedliche Vorgabe der Register in den verschiedenen Modi berücksichtigt werden. Im Textmodus 3 beträgt der Wert gewöhnlich 85, im Mode 13h und Mode X dagegen 84. Dies spielt insofern eine Rolle, weil zum einen bei Nichtbeachtung die festen Bereiche des Bildschirms nach rechts oder links verschoben werden, weil diese durch den Nullpunkt der Sinustabelle bestimmt werden. Zum zweiten bewegt sich der Wert des Registers nur in bestimmten Bahnen. Wird hier zum Beispiel fälschlicherweise 87 als Nullpunkt verwendet und eine Amplitude von 4 dazuaddiert, liegt das Resultat jenseits des Annahmebereichs und zeigt keine Wirkung, der Sinus ist an dieser Stelle abgeflacht, Clipping heißt dieser Effekt in der HiFi-Szene.

Nebenbei muß noch gesagt werden, daß das Horizontal-Sync-Start-Register, wie alle das Horizontal-Timing betreffenden Register, durch Bit 7 des CRTC-Registers 11h (Vertical Sync End) geschützt ist. Es muß also zunächst gelöscht werden, sollte aber zum Ende des Programms wieder gesetzt werden. Schließlich muß es wohl einen Sinn ergeben, daß das Protection-Bit standardmäßig gesetzt ist. Paletten-Effekte: Die Palette bietet hervorragende Möglichkeiten, durch wenige Befehle - und damit in kürzester Zeit - den gesamten Bildschirm zu verändern, weil alle Punkte eines Farbwertes auf einen Schlag auf eine neue Farbe gesetzt werden. In Nicht-Paletten-Modi müßte jeder einzelne Pixel neu gesetzt werden, was natürlich einen immensen Zeitaufwand bedeutet. Ausblenden: Der einfachste Effekt, der sich auf diese Weise erreichen läßt, ist das Ausblenden eines Bildes.

Ähnlich wie beim Film wird dabei in relativ kurzer Zeit die Helligkeit des Bildes vom Normalwert auf Null reduziert. Dies läßt sich sehr einfach durch die Palette realisieren, indem in einer Schleife alle Farbwerte um 1 vermindert werden und die neu berechnete Palette dann gesetzt wird. Nun wartet man auf den nächsten Retrace und zählt wieder um 1 herunter, bis alles schwarz ist. An dieser Stelle zeigt sich auch ein großer Vorteil der direkten DAC-Programmierung gegenüber der Verwendung des BIOS: Ein Paletten-Zugriff im Text-Mode ist über das BIOS gar nicht möglich, während er im Grafikmodus lediglich unerträglich langsam ist. Daher bleibt in diesem Fall nur die direkte Registermanipulation. Einblenden: Die andere Richtung des Blendens ist das Einblenden, bei dem, von einem schwarzen Bild ausgehend, die Helligkeit bis zur eigentlichen Bildpalette hochgezogen wird.

Im Prinzip funktioniert dies wie beim Ausblenden: Die Farbwerte werden bei jedem Durchlauf - natürlich synchronisiert mit dem Vertical-Retrace - immer um 1 oder mehr erhöht, bis der Zielwert (aus der Originalpalette des Bildes) erreicht ist. Als Abbruchbedingung kann natürlich nicht mehr das Erreichen von 0 herangezogen, sondern es muß ständig mit dem Zielwert verglichen werden. Blenden von beliebiger Quelle auf Zielpalette: Bis jetzt wurde immer entweder von einer Palette zu Schwarz oder umgekehrt geblendet. Was noch fehlt, ist ein Überblenden von einer konkreten Palette zu einer anderen. Dies scheint auf den ersten Blick keinen großen Sinn zu haben, weil sich außer einer schrittweisen Farbverfälschung des Bildes nicht viel erreichen läßt. Irrtum! Auf diese Weise läßt sich ein sehr schöner Effekt erzeugen.

Wie wäre es zum Beispiel damit, daß ein Demoteil zu Ende geht und daraufhin das letzte Bild langsam auf Schwarzweiß-Darstellung heruntergerechnet wird? Im Vordergrund läßt sich dann zum Beispiel ein Text mit den Credits, also den Danksagungen, darstellen. Hier zeigt sich der Nutzen der neuen Prozedur: Nach Berechnung der Schwarzweiß-Palette muß nur noch auf diese herübergeblendet werden. Das erste Problem, das sich dabei stellt, ist: Wie erzeuge ich eine schwarzweiße Palette? Zum Glück besitzt das BIOS eine Funktion dafür, die hier zwar nicht benutzt werden soll (langsam, unflexibel), von der man aber die Funktionsweise sehr gut abgucken kann. Um eine Farbe, die sich aus Komponenten von Rot, Grün und Blau zusammensetzt, auf Schwarzweiß herunterzurechnen, muß man die drei Farbanteile zusammenzählen und mit diesem Wert in der neuen Palette alle drei Farben beschreiben. Werden alle drei Farben zu gleichen Teilen gemischt, kommt immer eine Abstufung zwischen Schwarz und Weiß heraus. Die Frage ist nur, wie die Summe zu bilden ist.

Einfach alle drei Farben zu gleichen Teilen einfließen zu lassen, führt zu keinem befriedigenden Ergebnis. Das menschliche Auge empfindet die verschiedenen Farben nämlich nicht als gleich hell. Ein blauer Punkt von maximaler Helligkeit erscheint zum Beispiel wesentlich dunkler als ein grüner. Ebenfalls vom BIOS abgeguckt ist das optimale Mischverhältnis, das die naturgetreueste Darstellung gewährleistet: Man nehme 30 % des Rotanteils, 59 % des Grünanteils und 11 % des Blauanteils. Überblenden von einem Bild zum nächsten: Es ist schon wesentlich professioneller, beim Wechsel von einem Bild auf das nächste zunächst das erste auszublenden, um dann das nächste einzublenden, anstatt abrupt umzuschalten; dazu sind Sie mit den erarbeiteten Prozeduren bereits in der Lage. Für wirklich professionelle Bildwechsel kommt man allerdings nicht darum herum, einen fließenden Übergang von einem Bild zum anderen zu erzeugen, man muß also beide Bilder mischen.

Zu diesem Zweck gibt es mittlerweile zahlreiche sogenannte Morphing-Programme, die allerdings den Nachteil vorberechneter Bilder haben: Die Bilder müssen erst einmal aufwendig berechnet werden, nehmen viel Platz auf der Platte und im Speicher ein und müssen umständlich (und langsam) in den Bildschirmspeicher kopiert werden. Dies ist also nur eine Lösung für Anfänger, der Profi berechnet seine Blenden in Echtzeit! Bei Palettenbildern - und die behandelten Grafikmodi sind alle palettenbasiert - läuft das Blenden, wie sich noch zeigen wird, im Endeffekt auf ein einfaches Paletten-Blenden hinaus. Erst bei komplizierten Metamorphosen, die gleichzeitig die Bildteile durch Bewegung ineinander überführen, muß man also die Morphingsoftware zu Rate ziehen. Man blendet also nur eine Palette in eine andere über. Weil aber die beiden Bilder übereinanderliegen und eine Veränderung der Bilddaten (das ist der Weg des Morphing) aus Geschwindigkeitsgründen nicht in Frage kommt, müssen dieselben Bilddaten je nach Palette verschiedene Bilder darstellen. Zunächst ist die Quellpalette aktiv, wodurch die Daten das Quellbild darstellen.

Am Schluß ist dann die Zielpalette aktiv, woraufhin dieselben Bilddaten, die vorher das Quellbild dargestellt haben, jetzt für das Zielbild stehen. Bei dieser Vorgehensweise stellen sich zwei Fragen: Wie müssen die Bilddaten manipuliert werden, daß sie - je nach Palette - sowohl das ursprüngliche (Quell-) Bild oder aber das Zielbild darstellen? Wie müssen die Paletten beschaffen sein, um aus den gleichen Bilddaten unterschiedliche Bilder zu erzeugen? Zunächst zu Frage 1: Bei dieser Art von Blende haben wir es mit einem grundsätzlich anderen Problem als bisher zu tun. In den bisherigen Blenden war entweder die Zielfarbe für alle Punkte gleich, nämlich Schwarz (Ausblenden), oder die Ausgangsfarbe (Einblenden). Nun muß jede beliebige Farbe in jede beliebige andere übergeblendet werden. Es gibt rote Punkte, die im Zielbild grün sein müssen, aber auch rote, die später blaue Farbe annehmen sollen. Wer in Mathematik (Bereich der Stochastik, Thema Kombinatorik) gut aufgepaßt hat, weiß, was das für die Farbenpracht bedeutet: Bei der Kombination einer bestimmten Anzahl Farben mit einer gleichen Anzahl anderer Farben gibt es genausoviele Möglichkeiten, wie das Quadrat der Farbanzahl beträgt.

Jede dieser Kombinationen muß beim Überblenden berücksichtigt werden, muß also einen Eintrag in der beim Blenden verwendeten Palette haben. Um ein Zweifarbbild in ein anderes zu überführen, werden vier Paletteneinträge benötigt (Farbe 0 nach Farbe 0, also gleichbleibend, Farbe 0 nach Farbe 1, 1 nach 0 und 1 nach 1). Bei zwei Vierfarbbildern werden bereits 16 Einträge belegt. Weil auf dem VGA nun einmal nur eine Palette von 256 Farben besteht, liegt also die größtmögliche Farbanzahl, die sich ohne Bilddaten-Veränderung überblenden läßt, bei 16 Farben. Beim mehrmaligen flimmerfreien (!) Überblenden von Bildern wird diese Zahl jedoch, wie weiter unten erklärt, noch weiter reduziert auf 15. Aus diesen kombinatorischen Überlegungen läßt sich auch bereits die Vorgehensweise beim Mischen der Bilder ableiten: Jede Kombination muß vertreten sein, dazu verwendet man N Blöcke mit jeweils N Einträgen, wobei N für die Anzahl Farben pro Bild steht.

Die Blocknummer entspricht der Zielfarbe, während der Index innerhalb des Blocks der Quellfarbe entspricht. Andersherum ist es zwar auch denkbar, dies würde jedoch den später erläuterten Reset unnötig verkomplizieren. Um die Farbnummer zu ermitteln, geht man einfach nach der folgenden Formel vor: Farbnummer = Zielfarbe x Anzahl Farben + Quellfarbe Dieses Prinzip kommt manchem vielleicht bekannt vor: Auf die gleiche Weise rechnet man ein hexadezimales Byte in eine dezimale Zahl um: Oberes Nibble (höherwertige Stelle) x 16 + unteres Nibble. Das würde bei einer Farbanzahl von 16 die Sache sehr beschleunigen, weil einfach die Zielfarbe in das obere Nibble und die Quellfarbe in das untere Nibble geladen werden könnte, und man hätte den Farbwert, der benutzt werden muß. Die Sache hat nur den Haken, daß 16 Farben hier nicht verwendet werden k&ou

Suchen artikel im kategorien
Schlüsselwort
  
Kategorien
  
  
   Zusammenfassung Der Vorleser

   sachtextanalyse

   interpretation zwist

   Fabel interpretation

   literarische charakteristik

   interpretation bender heimkehr

   felix lateinbuch

   interpretation der taucher von schiller

   textbeschreibung

   charakterisierung eduard selicke
Anmerkungen:

* Name:

* Email:

URL:


* Diskussion: (NO HTML)




| impressum | datenschutz

© Copyright Artikelpedia.com