
                256 - und keine Farbe weniger!
                

Nachdem ich in der letzten Ausgabe den Aufbau eines PCX-Bildes
in 256 Farben erlutert habe, will ich Euch nun einen 256-Farben
Modus nher bringen. Dabei nehme ich mir den einfachsten heraus:
320x200 - den Modus 13h. Alles, was ich hier sage bzw. schreibe
trifft weitestgehend auch fr die anderen 256-Farben Modis zu,
nur die Auflsung ist halt anders. Vielleicht schreibe ich ja
auch irgendwann einmal etwas dazu (VESA-Treiber...).

Dieser Artikel gliedert sich ganz grob in zwei Abschnitte:

  I  -  Grundlegendes zum Modus 13h
  II -  Vier Grafikseiten realisiert im Modus 13h.

Der erste Punkt wird in dieser Ausgabe behandelt, der zweite in
der nchsten.

Eine kleine Einfhrungsgeschichte:
Die ersten VGA-Grafikkarten wurden 1987 von IBM auf den Marktge-
worfen. Mit ihre Einfhrung wurde ein neuer Standard gesetzt, der
es bis heute auch geblieben ist (allerdings von den Super-VGA-
Karten nochmals erweitert wurde).
VGA-Karten senden, im Gegensatz zu allen vorherigen Karten, ihre
Farbsignale nicht mehr digital sondern analog zum Monitor. Da-
durch kann eine weit hhere Farbanzahl realisiert werden - bei
'normalen' VGAs mehr als 262143 (262144...)! Das war gegenber
der EGA-Karte, die gerade mal 64 Farben generieren konnte, ein
extremer Fortschritt. Allerdings wurde mit der VGA-Karte nur ein
Modus eingefhrt, der mehr als 16 Farben gleichzeitig darstellen
konnte, was die EGA-Karte schlielich auch schon implementiert
war. Dieser Modus trgt die Nummer 13h und bietet dem User, im
Gegensatz zur 'Spitzenauflsung' von 640x480, lediglich 320x200
Pixel, das aber bei 256 Farben! Die hhere Farbanzahl gleichte
die geringere Auflsung mehr als aus. Obwohl heute schon wesent-
lich hhere Auflsungen bei hherer Farbanzahl mglich sind, wird
der Modus 13h, zumindest im Spielebereich, immer noch am hufig-
sten gebraucht. Das hat er wahrscheinlich seiner sehr leichten
Handhabung zu verdanken, die ich im folgenden Text erlutern wer-
de.


Nun denn. Zu aller erst der Videospeicher. Der Modus 13h bentigt
fr eine Bildschirmseite genau 64000 Bytes. Diese Zahl lt sich
ermittlen, indem man die horizontale Auflsung (320) mit der ver-
tikalen Auflsung (200), und das Ergbenis wiederum mit der ben-
tigten Anzahl Bytes fr einen Pixel (in diesem Fall ein Byte pro
Pixel) mal nimmt. Man erhlt also den schon vorher genannten Wert
von 64000. Da dieser Wert noch gut in das Segment bei $A000, das
Segment, in das der Videospeicher eingeblendet wird, pat, gibt
es keine Probleme mit hin und herschieben dieses Fensters oder
setzen einzelner Punkte mittels verschiedener Bitplanes und
Latch-Registern, wie es zum Beispiel im Modus 12h (640x480x16)
der Fall ist. Man kann Punkte ganz einfach setzen und abfragen,
indem man einfach das Byte an die gewnschten Speicheradresse
ldt bzw. diese ausliest. Ganz einfach, ehrlich!
Da, wie schon gesagt, ein Pixel genau ein Byte belegt, findet man
also bei $A000:$0000 den Pixel, der oben links eingeblendet wird.
Bei $A000:$0001 steht dann der 2. Pixel von links usw.
Die zweite Zeile fngt danach bei $A000:$0050 an...

Will man den Offset eines beliebigen Punktes x/y ermitteln, dann
lt sich dieser nach folgender Formel berechnen:

   Offset = x + (y * 80).

Punkt geht zwar eh' vor Strichrechnung, zur besseren Darstellung
habe ich die Klammern aber gesetzt. Dieser Offsetwert gilt na-
trlich nur, wenn man den Punkt oben links mit 0/0 und nicht mit
1/1 festlegt. Will man das, dann mu man einfach von x und y je-
weils 1 abziehen (Offset = (x-1) + ((y-1) * 80)).

Mit der 'Pseudoanweisung' '$A000:$0000 = Farbe' lt sich dann
ein Punkt setzen, mit 'Farbe = $A000:$0000' ein Farbwert ausle-
sen.

Wirklich einfach, oder?

Nun eine Quizfrage: Was mu man machen, um eine Farbe an die
Koordinate 1/0 zu setzen? Wer mir die richtige Lsung schickt,
verliert eine Schokolade...  :-).

Tja, eigentlich war das alles so einfach, da ich jetzt schon
fertig bin. Oder wollt Ihr vielleicht noch etwas ber die Fest-
legung von Farben in diesem Modus hren?

Ich hab's geahnt...
    (Warum kann ich nicht einmal meine Klappe halten?).


Na schn, weiter geht's mit der DAC-Farbtabelle.

DAC, was is'n das? Kann man das essen? Trinken? Sex? ...?

So oder hnlich hren sich jetzt auch bestimmt Eure Fragen an,
stimmt's?
Meine Antwort: Nein, weder noch (wer htt's gedacht...)!

Doch nun wieder zum Thema:

DAC steht fr Digital to Analog Converter und ist das Ding, das
die digitalen Farben des Rechners in analoge Farben fr den Moni-
tor umwandelt.
Nun zur DAC-Farbtabelle: Wie Ihr vielleicht hoffentlich oder auch
nicht wit... h, was? Ach ja: Ein Farbton besteht aus 3 Farbkom-
ponenten: einem Rot-Wert, einem Grn-Wert und einem Blau-Wert,
kurz RGB-Werte genannt. Die die 'normale' (keine Super-VGAs...)
256 Farben gleichzeitig darstellen kann, brauchte man etwas, wo
man diese Farben ablegen konnte. Genau diese Aufgabe bernimmt
die DAC-Farbtabelle. Hier finden sich 256 RGB-Werte, jeweils fr
eine Farbe einer. Da jeder einzelne Wert aus einem Byte besteht
(eigentlich sind es nur 6 Bit, aber das ist jetzt egal), ergibt
sich eine Anzahl von 768 Bytes (256 * 3). Um nun einen Eintrag
der Farbtabelle zu ndern oder auszulesen, bentigt man 3 Port-
adressen:
           PortNr.    Bedeutung

           3C8h       Port fr Schreibzugriff
           3C7h       Port fr Lesezugriff
           3C9h       Datenport

Mchte man die Farbe 26 ndern, dann mu man dafr den Wert 26
an den Port 3C8h schicken, und dann nacheinander erst den Rot-
Wert, dann den Grn-Wert und dann den Blau-Wert an der Port-
adresse 3C9h ausgeben.
Will man den RGB-Wert der Farbe 37 haben, dann lade man Port
3C7h mit 37, und lese dann erst den R-Wert, dann den Grn-
Wert und dann den Blau-Wert am Datenport aus.
Einfach, nicht?
Es mag passieren, da bei mehrmaligen Lesezugriffen keine ver-
nnftigen Ergebnisse geliefert werden. Ist das der Fall, dann
sollte man eine 'kurze Pause' nach jedem Lesezugriff einle-
gen.

Noch etwas zu den 6 Bits von oben: Jeder der drei RGB-Werte
besteht in echt nicht aus 8 Bits (ein Byte) sondern lediglich
aus 6! Das heit nur, da der R-Wert 63 (00111111b) und z.B. der
Wert 200 (11001000b) identisch sind. Das ist alles!


Tja, ich glaube, hoffe und meine, da das jetzt wirklich alles
gewesen ist. Sollte es nicht so sein, dann fragt, wie auch sonst
immer, bei uns nach! Man sieht sich beim nchsten Teil im nch-
sten STOD.


  Bis dann,
                                                 Kemil

