1. Einleitung Ich erklre mich fr nichts verantwortlich. Weder Schden an Monitor, Grafikkarte, CD-ROM, Joystick, Modem, HD-LED oder Gehirn knnen mir angelastet werden. Weiterhin verwende ich Markennamen ohne expliziten Hinweis. Der Quellcode entstammt meinen Fingern. Deshalb behalte ich mir die Copyrights vor. Anfragen auf Verffentlichung usw. werden gern beantwortet. Wer den Kurs ohne meine Zustimmung wesentlich verndert, mu mit Todesstrafe rechnen. Jedoch darf der Quellcode verndert in Intros etc. mit Erwhnung meines Namens (!) verwendet werden. Zum Kurs gehren folgende Datenstrme: CUTZEROS.EXE CutZeros - Tool CUTZEROS.PAS der Quellcode dazu FILE_ID .DIZ kurze Beschreibung fr Mailboxen LIZARD .TXT Infos ber uns selbst SINUS .EXE Sinus - Tool SINUS .PAS Quellcode dazu VESA .ASM Assembler-Quellcode VESA .COM das eigentliche Intro VESA .TXT diese Datei 2. Die Grafik 2.1. VESA 2.1.1. Allgemeines VESA ist in mehreren Revisionen auf dem Markt. Ganz alte Grafikkarten gengen VESA 1.0, die Mehrheit VESA 1.2 und brandneu ist VESA 2.0. Das Programm selbst begngt sich mit VESA 1.0. Die Schnittstelle ist der Interrupt 10h. Im AH-Register hat stets 4Fhex zu stehen. War die auszufhrende Funktion erfolgreich, steht in AH 0 und in AL 4Fhex. Ist AH jedoch 1, trat ein Fehler auf. Hat AL einen Inhalt ungleich 4Fhex, so wird die Funktion erst gar nicht untersttzt. Treten Probleme bei der Ausfhrung auf, so sollte man einen neueren VESA- Treiber, z.B. UNIVBE probieren. Dies ist u.a. bei Cirrus-Logic-Karten der Fall. Im folgenden wird VESA nur kurz berflogen. Tiefer in die Materie geht die c't 6/95, Seite 266ff und das Buch 'PC Intern' von Michael Tischer. 2.1.2. Initialisierung Die Initialisierung erfolgt, indem zuerst die Existenz von VESA berprft wird. Ist dies erfolgreich, wird der Modus 101hex (640*480, 256 Farben) getestet. War auch dies erfolgreich, werden bentigte Werte, wie der FAR-CALL- Pointer und die Granularitt ausgelesen. Ungltige oder nicht bearbeitbare Situationen werden dabei auch berprft. Codeabschnitt: INITMODE 2.1.3. Punkte setzen Ab Segment 0A000hex werden 64k des Bildschirmspeichers in den Hauptspeicher eingeblendet. Modus 101hex bentigt aber 640*480=307200 Bytes. Dieses Problem umgeht man mit Hilfe der 'Window'-Technik. Diese erlaubt, unterschiedliche Teile des Bildschirmspeichers einzublenden. Zuerst berechnet man den 32-Bit-Offset mit der Formel Y*MaxX+X, in unserem Fall Y*640+X. Die unteren 16 Bit sind der Offset im eingeblendeten Speicher. Die oberen 16 Bit bergibt man der FAR-CALL-Routine. Da diese aber immer noch recht zeitaufwendig ist, wird mittels der Variablen VESASEG versucht, unntige Aufrufe zu vermeiden. Codeabschnitte: SETWINDOW und PUTPIXEL 2.2. Zustzliche Grafikoperationen 2.2.1. Palettenmanipulation Das sanfte Ein- und Ausblenden wre mit Setzen von Pixeln nicht zu reali- sieren. Jedoch kommt uns hier die Palette zur Hilfe. Sie definiert fr jeden Pixelwert einen RGB-Wert (Rot-Grn-Blau). Wird dieser verndert, ndern sich alle entsprechenden Pixel. Wie der Name RGB schon andeutet, besteht der RGB-Wert aus 3 Byte. Sie sind jedoch auf 6 Bit beschrnkt, d.h. auf Werte zwischen 0 und 63. Jedoch lassen sich damit 2^(6+6+6)=262144 Farbtne darstellen, theoretisch mehr, als das menschliche Auge unterscheiden kann. Beim Ein- bzw. Ausblenden (Fading) wird folgende Technik verwendet: Eine Schleife, die 64 mal durchlaufen wird, setzt jeden RGB-Wert neu. Davon wird jeder Einzelwert wiederum (R, G, B) nach dieser Formel berechnet: neuer Wert = Originalwert * Schleifendurchlauf / 64 Dabei darf der Originalwert nicht verndert werden. Anschlieend wird die Palette gesetzt, d.h. der Grafikkarte mitgeteilt. Der DAC-Port, der fr die Palette verantwortlich ist, befindet sich an 3C7hex bis 3C9hex. Dabei ist 3C9hex fr die Daten verantwortlich. An 3C7hex wird der Pixelwert bergeben, fr den in 3C9hex die RGB-Werte geschrieben werden. Fr 3C8hex gilt das gleiche, nur fr Lesezugriffe. Codeabschnitte: SAVEPALETTE, SETPALETTE, PALBLACK, FADEIN, FADEOUT 2.2.2. Linien Das Programm enthlt zwei Linienalgorithmen, einer fr horizontale und einer fr vertikale Linien. Beliebige Linien werden nicht bentigt, eine ent- sprechende Implementation war deshalb auch nicht ntig. Wen es trotzdem interessiert, der lese Artikel ber den Bresenham-Algorithmus. Horizontale Linien: Horizontale Linien werden beim Programmstart gebraucht und mssen deshalb schnell gezeichnet werden. Also wird in 2 Flle unterschieden: a. Die Linie verteilt sich auf 2 'Windows'. b. Die Linie liegt innerhalb eines 'Windows'. Fall b tritt wesentlich hufiger auf, Fall a ist ein rgerliches Beiwerk. So wird Fall b mit schnellen Prozessorbefehlen bearbeitet, Fall a setzt sich aus einer Schleife zusammen, die PUTPIXEL-hnlich arbeitet. Vertikale Linien: Vertikale Linien werden kaum gebraucht und werden deshalb (langsam) auf PUTPIXEL-hnliche Weise gezeichnet. Codeabschnitte: XLINE, YLINE 3. Die Mathematik 3.1. 3D-Theorie Das Sternenfeld besteht aus einzelnen Punkten, die mittels ihrer X-,Y- und Z-Koordinate spezifiziert sind. Alle 3 Werte liegen im Bereich -63 bis +63. Einzige verwendete mathematische Manipulation ist die Rotation. Sie erfolgt, indem zwei der drei Koordinaten wie in 2D mit Sinus und Cosinus um einen Mittelpunkt gedreht werden: a' = a*cos(alpha) - b*sin(alpha) b' = a*sin(alpha) + b*sin(alpha) Fr a und b werden X, Y und Z in allen Kombinationen eingesetzt. Entsprechend wird alpha mit dem jeweiligen Winkel gesetzt. Dies ist zwar mathematisch voll daneben geggriffen, gengt aber den Ansprchen. Codeabschnitte: ROTATE, Teile von SHOWPOINTS 3.2. Transformation nach 2D Leider ist damit noch nicht die gesamte Arbeit geleistet. Der Monitor ist nur 2-dimensional. Dieses Problem wird mit Hilfe des Strahlensatzes gelst. Die entsprechenden Formeln sind: 2D-x = (x*i)/z 2D-y = (y*i)/z Dabei ist i der Abstand Mensch-Monitor und wird willkrlich mit 128 gewhlt, da dies durch Bitverschiebung bewltigt werden kann. Auerdem wird Z um 200 erhht, da sonst das Sternenfeld nur teilweise sichtbar wre. Codeabschnitt: CONV3D 4. Sonstige Operationen 4.1. 386er-Test Im Quellcode werden nicht wenige 386-spezifische Befehle verwendet. Deshalb mu seine Existenz berprft werden, um INT6 und Abstrze auf 286er etc. zu verhindern. Das Prinzip ist, zu berprfen, ob die Flagbits 13 bis 16 verndert werden knnen. Bis einschlielich 286er war dies nicht mglich. Codeabschnitt: CHECK386 4.2. Digitalschrift Die einzelnen Segmente der Digitalschrift werden nach folgendem Schema organisiert: 111111 4 5 4 5 4 5 222222 6 7 6 7 6 7 333333 Im Programm werden die einzelnen Segmente binr codiert. So sieht die Codierung der 5 wie folgt aus: Bit 7 6 5 4 3 2 1 0 0 1 0 0 1 1 1 1 Durch Bitoperatoren werden die einzelnen Bits herausgefiltert und geprft. Codeabschnitte: DIGITALCHAR, DIGITALTEXT 4.3. Zufallsgenerator Das Sternenfeld wird per Zufallsgenerator erzeugt. Dieser ist extrem simpel und erhebt keinen Anspruch auf Genauigkeit. Das Prinzip hnelt sehr stark der RANDOM-Funktion aus der Runtime Library von Borland Pascal 7.0. Deshalb will ich hier keinerlei Ansprche auf eigene Kreativitt erheben. Der Zufallsgenerator wird nicht initialisiert und erzeugt deswegen immer die gleichen Zahlen. Codeabschnitt: RANDOM 4.4. Daten initialisieren Da ein relativ groer Datenoverhead vorhanden ist, der aber nur Nullen ent- hlt, wurde dieser nachtrglich entfernt. (siehe 5.) Bei Programmstart ist dieser Bereich zwischen STARTOFZEROS und ENDOFZEROS in einem undefiniertem Zustand. Also wird er vorsichtshalber mit Nullen be- schrieben. Dann wird das Sternenfeld per Zufall generiert und die Palette aufgebaut. Aus dem 1. Quadranten der Sinusfunktion wird der Cosinus des 1.Quadranten berechnet. Aus diesem werden dann die 2., 3. und 4.Quadranten aufgebaut. Da Sinus und Cosinus mathematisch um 90 Grad verschoben sind, macht sich das Programm diese Eigenschaft in Form einer Speicherberlappung zunutze. Codeabschnitt: CLEARDATA, INITDATA 5. Tools Neben den VESA-Files sind auch noch zwei kleine Hilfsprogramme dem Kurs beigelegt. Beide sind nicht dokumentiert, aber trotzdem leicht verstndlich. Im einzelnen handelt es sich um: SINUS.EXE: Dieses Programm berechnet lediglich im Assembler-konformen Format eine Sinus- tabelle im Bereich -127..+127 CUTZEROS.EXE: Die Dateigre konnte mit CUTZEROS.PAS wesentlich verkrzt werden. Dabei machte ich mir die Eigenschaft zunutze, da alle Daten am Dateiende nur Nullen enthalten. Diese werden abgeschnitten und zur Laufzeit erst belegt. Wer also VESA.ASM neu compiliert, wird eine Dateigre von 8839 Bytes feststellen. Nach Programmlauf von CUTZEROS bleiben nur noch 1689 Bytes brig. Dies entspricht etwa 19% der Ursprungsgre. Bei dieser Gre versagten dann auch alle mir verfgbaren EXE- bzw. COM-Komprimierer. 6. Anhang Natrlich sind alle Mglichkeiten noch lange nicht ausgereizt. So fehlt Musik, ein netter Scrolly und vieles mehr. Doch dies alles wrde diesen Kurs ausufern lassen. Zur Zeit besteht das Sternenfeld aus 300 Sternen. Allerdings werden auch noch 900 Sterne flssig angezeigt (486DX40). Fr meine Arbeit habe ich als uerst empfehlenswert empfunden: PC Intern 3.0 von Michael Tischer c't 6/95, Seite 266ff Das Assemblerbuch von Trutz Eyke Podschun 7. Der Autor Stephan "ZAN" Brumme kommt aus Luckenwalde bei Berlin, ist 17 und baut gerade sein Abi. Wenn er nicht programmiert ( Turbo Assembler 3.2, Borland Pascal 7.0 ) dann hrt er Musik ( Smashing Pumpkins... ) oder spielt Basketball. Bugreports, Vorschlge usw. bitte in Ghost BBS posten. Ciao.