VGA-Grafikeffekte

  • Hallo die Runde,


    ich hatte die Idee, hier einige Quellcodes für einzelne VGA-Grafikeffekte (Modus 13h 320x200) zu sammeln. Ich finde, die 320x200 Ausflösung mit 256 Farben ist etwas absolut typisches für die DOS-Ära und das Maximum aus den Möglichkeiten dieses Grafikmodus herauszuholen, ist eine tolle Herausforderung für Programmierer.
    Als ich kürzlich, nach Jahren ohne DOS-Programmierung, wieder angefangen habe mich da reinzdenken, habe ich mit VGA-Grafik angefangen und fand das einen perfekten (Wieder-)Eisntieg. Als ich gerade gelesen habe, dass es hier noch anderen so geht wie mir und sie nach längerer Pause gerne wieder in die DOS-Programmierung "reinkommen" würden, kam mir der Gedanke zu diesem Thread. Einige von euch schrieben ja auch, dass ihnen gerade die Idee für ein kleines Programmier-Projekt fehlt, vielleicht bringt euch ja dieser Thread eine neue Idee oder Anregung. Wie wäre es denn mit einem schönen Scrolltext, Linsen-, Schnee- oder Wassereffekt? ;)
    Ich selbst programmiere in Pascal, aber natürlich sind auch alle anderen Programmiersprachen willkommen. Wenn wir hier eine schöne Sammlung zusammenbekommen, können wir ja auch überlegen daraus eine "Forums-Demo" zusammenzustellen. Dann haben auchdie Nicht-Programmierer unter uns etwas davon. :)
    Was haltet ihr von der Idee?
    Ich bin gespannt auf eure Meinungen und Quelltexte und guck jetzt mal durch meine Quelltexte nach einem schönen Grafikeffekt um den Anfang zu machen :tasskaff

    Meine DOS-Rechner:

    Kleiner Industrie-486er mit 100 MHz (Intel 80486DX-4), 32 MB SD-RAM, Diamond SpeedSTAR 24 und SB 16 ( CT2770 ) + TNDY

    "Frankenstein" Pentium II mit 266 MHz, Elsa Winner 1000 TrioV + Voodoo I, SB 16 (CT2290) + Yamaha DB50XG


    Von mir geschriebene DOS-Programme gibt es hier.

  • So, dann bring ich hier mal Leben in die Bude mit einem ersten Quellcode.


    Für den Anfang einen recht simplen Effekt:
    Ich habe mal für ein Horror-Thema diesen schönen "blutigen Regen" als Hintergrund benutzt.
    Wer es friedlicher möchte, mit blauer Palette ergibt das auch einen ganz prima Wasserfall :mrgreen




    Wie habe ich das gemacht, so:



    Meine DOS-Rechner:

    Kleiner Industrie-486er mit 100 MHz (Intel 80486DX-4), 32 MB SD-RAM, Diamond SpeedSTAR 24 und SB 16 ( CT2770 ) + TNDY

    "Frankenstein" Pentium II mit 266 MHz, Elsa Winner 1000 TrioV + Voodoo I, SB 16 (CT2290) + Yamaha DB50XG


    Von mir geschriebene DOS-Programme gibt es hier.

  • Mit dem 320x200 256 Farben Modus habe ich noch nie was gemacht.

    Der Modus hat den großen Vorteil, dass eine Bildschirmseite genau ein Segment, also 64 KB groß ist und die Farben ja 8 Bit. Deshalb kann man, wie ich es in meinem Code ja auch mache, einen Pixel direkt mit "mem[$a000:x+320*y] := Farbnummer" setzen (oder umgekehrt auch lesen). Das ist natürlich viel schneller, als mit Umweg über int 10h. Auch lassen sich dadurch Puffer für Animationen o.ä. sehr einfach realisieren. Diesen ganzen komplizierten Kram wie "Bankswitching" bei VESA gibt es hier nicht. :D
    Aus diesem Grund gab es auch relativ spät (um die Jahrtausendwende) noch viele Demos, die den Modus benutzen. Und natürlich weil der von jeder VGA oder MCGA kompatiblen Karte beherrscht wird. Lohnt sich also, damit mal ein bisschen rumzuprobieren.
    Die Ports 969 und 968 sind übrigens die direkte Ansteuerung des DAC der Grafikkarte. Um einen Paletteeintrag zu ändern einfach die Farbnummer in 968 und dann die drei bytes für Rot, Grün und Blau nacheinander in 969 schreiben.

    Meine DOS-Rechner:

    Kleiner Industrie-486er mit 100 MHz (Intel 80486DX-4), 32 MB SD-RAM, Diamond SpeedSTAR 24 und SB 16 ( CT2770 ) + TNDY

    "Frankenstein" Pentium II mit 266 MHz, Elsa Winner 1000 TrioV + Voodoo I, SB 16 (CT2290) + Yamaha DB50XG


    Von mir geschriebene DOS-Programme gibt es hier.

    Einmal editiert, zuletzt von Dragonsphere ()

  • Aha, sehr interessant. Ich hab auch gerade mal eine ganz kleine bescheidene Demo erstellt. Gut, is kein wirklicher Effekt, aber zum Anschauen der Farbpalette fand ich es hilfreich. Kommt natuerlich nicht an deine tolle Demo heran, aber naja... :we-are-not-worthy
    Hab auch die Routinen zum Ein- und Ausschalten des Grafikmodus mal in reine Assemblerprozeduren verpackt :P



  • Sehr schön, die Farbpalette ist immer ein guter Anfang. :thumbup:


    Mich hatte gerade auch nochmal die Lust aufs Pascal-Programmieren gepackt und da ich heute Zeit habe, habe ich schnell noch ein kleines Programm geschrieben, dass mit den Ports des DAC und einem Bildschirmpuffer arbeitet. Bitteschön :)


    Das Program prüft erstmal, ob auch eine VGA kompatible Grafikkarte installiert ist. Anschließend werden im Textmodus alle Farben langsam auf schwarz runter gedimmt.
    Dann geht es in den Grafikmodus, wo ein Muster in einen vorher reserviertes Segment gezeichnet wird, um dann in den Bildschirmspeicher geschoben und langsam eingeblendet zu werden.
    Nach einem Tastendruck wird dann wieder ausgeblendet und fertig.


    Das Timing des Aus- und Einblendens läuft übrigens direkt über den Uhrenchip des Mainboards und nicht per Delay oder DOS. Also schon etwas komplexer...


    Meine DOS-Rechner:

    Kleiner Industrie-486er mit 100 MHz (Intel 80486DX-4), 32 MB SD-RAM, Diamond SpeedSTAR 24 und SB 16 ( CT2770 ) + TNDY

    "Frankenstein" Pentium II mit 266 MHz, Elsa Winner 1000 TrioV + Voodoo I, SB 16 (CT2290) + Yamaha DB50XG


    Von mir geschriebene DOS-Programme gibt es hier.

  • Sehr interessant - ich hatte zu Pascal nie ein gutes Verhältnis, habe aber eine kurze Zeit damit gearbeitet.
    Falls Ihr es noch nicht kennt, es gibt ein nettes Buch "PC Underground" dass einige Grafikkonzepte, die in den 90igern mal das NonPlusUltra darstellten, in Pascal und Assembler näherbringt.
    Hatte sogar das Original, aber habe es leider weggeworfen.
    Trotz des realtiv guten Inhalts ist es aber ein Augenauswischer, da es sich auf Doom bezieht(Kapitel 14: "The Secrets Behind Doom"), ohne nur irgendwie auf die dem Spiel zugrundeliegende Eigenart der Visualisierung einzugehen... muss eine Art Marketingstrategie gewesen sein. Enttäuschend speziell wenn die Autoren sich als Teile der Szene bezeichnen oder es sogar sind/waren.


    Der Bluteffekt ist minimalistisch und clever - ModeX würde sich vielleicht hier ganz gut eignen da du anscheinend keinen Puffer brauchst, der strikt linear addressierbar ist und mit ein wenig Register"magie" könntest du ja das Bild im nachhinein ein wenig "deformieren" wobei das nicht der CPU im Magen liegen würde... sozusagen ein T(ransform) der Antike.

  • Mit Pascal habe ich meine ersten Programmierversuche gestartet und damals sehr viel damit gemacht. Das lag auch daran, dass ich sogar Borland Pascal 7.0 (nicht nur Turbo) über die Schule bekommen konnte. Ohne Internet an einen C/C++ Compiler zu kommen, war nicht so einfach. Später habe ich dann mehr in reinem Assemblercode gemacht. Das war ja damals absolute Pflicht für jeden (Hobby-)Programmierer, der was auf sich hielt :D
    Heute empfinde ich insbesondere die "Begin"/"End" Konstruktionen von Pascal wahnsinnig umständlich, aber ein Pascal Programm zu schreiben ist für mich absolute Retro-Nostalgie. Ein wesentlicher Grund für mich, mir wieder einen DOS-PC aufzustellen, war auch ein Packen erhaltener Disketten mit Pascal-Quellcodes von mir.
    Von einer dieser Disketten stammt auch der Bluteffekt, den habe ich 1998 als Hintergrund für das Hauptmenü eines eigenen Ghosts and Goblins Spiels geschrieben. Dafür musste er also nicht viel können. Für die Verwendung in einem Intro/Demo könnte man ihn gut erweitern, wie du ja schon vorgeschlagen hast. Genial wäre natürlich auch, Objekte davon umfließen zu lassen. Oder auf das gesamte Bild noch einen leichten Blur-Effekt zu legen, aber dann wird es doch schon wieder CPU-Intensiv.


    Mit Doom warben damals viele Bücher. Ich erinnere mich da auch an so eine Enttäuschung... Ein Buch, ich komme gerade nicht mehr auf den Titel, versprach vollmundig, einen Schritt für Schritt an die Programmierung von 3D-Grafik (wie in Doom) heranzuführen. Mit Beispielen in C und Pascal! Ich war begeistert! Das Ganze blieb dann aber sehr hinter den gamachten Erwartungen zurück und führte nur zu einem groben Grundgerüst. EIn einfaches Labyrinth auf Lininenbasis. Ich lernte dadurch zwr, wie man die Illusion von 3D erzeugt, aber zu Texturen gab es in dem Buch aber kein Wort. Und dann nutzten die noch Borlands BGI-Funktionen! Was war ich damals enttäuscht!
    Ich hatte doch so gehofft, mir damit meinen eigenen Egoshooter schreiben zu können. :(

    Meine DOS-Rechner:

    Kleiner Industrie-486er mit 100 MHz (Intel 80486DX-4), 32 MB SD-RAM, Diamond SpeedSTAR 24 und SB 16 ( CT2770 ) + TNDY

    "Frankenstein" Pentium II mit 266 MHz, Elsa Winner 1000 TrioV + Voodoo I, SB 16 (CT2290) + Yamaha DB50XG


    Von mir geschriebene DOS-Programme gibt es hier.

  • ich hatte die Idee, hier einige Quellcodes für einzelne VGA-Grafikeffekte (Modus 13h 320x200) zu sammeln. Ich finde, die 320x200 Ausflösung mit 256 Farben ist etwas absolut typisches für die DOS-Ära und das Maximum aus den Möglichkeiten dieses Grafikmodus herauszuholen, ist eine tolle Herausforderung für Programmierer.

    Ich auch :) Ich denke, einige von uns werden ihre Programmieranfänge in diesem Modus verbracht haben, und man kann damit danke 256 Farben schon ansprechende Effekte zaubern.


    Kann leider nichts beitragen, weil mein eigenes Projekt momentan sämtliche Freizeit verschlingt... dazu später an anderer Stelle mehr.

    Mit Doom warben damals viele Bücher. Ich erinnere mich da auch an so eine Enttäuschung... Ein Buch, ich komme gerade nicht mehr auf den Titel, versprach vollmundig, einen Schritt für Schritt an die Programmierung von 3D-Grafik (wie in Doom) heranzuführen. Mit Beispielen in C und Pascal! Ich war begeistert! Das Ganze blieb dann aber sehr hinter den gamachten Erwartungen zurück und führte nur zu einem groben Grundgerüst. EIn einfaches Labyrinth auf Lininenbasis. Ich lernte dadurch zwr, wie man die Illusion von 3D erzeugt, aber zu Texturen gab es in dem Buch aber kein Wort. Und dann nutzten die noch Borlands BGI-Funktionen! Was war ich damals enttäuscht!
    Ich hatte doch so gehofft, mir damit meinen eigenen Egoshooter schreiben zu können.

    Was natürlich nicht drinstand, ist, dass man nicht mal eben alleine einen Egoshooter schreiben kann :rolleyes: Dass es eben nicht reicht, ein paar Zeilen Code zu schreiben. Und selbst wenn man es schafft, eine brauchbare Engine auf die Beine zu stellen, gehört zu einem fertigen Spiel noch viel mehr als Code...


  • Was natürlich nicht drinstand, ist, dass man nicht mal eben alleine einen Egoshooter schreiben kann :rolleyes: Dass es eben nicht reicht, ein paar Zeilen Code zu schreiben. Und selbst wenn man es schafft, eine brauchbare Engine auf die Beine zu stellen, gehört zu einem fertigen Spiel noch viel mehr als Code...

    Gabz genau. Aber damals (mit etwa 17) war ich halt noch jung und naiv. ;)
    Und natürlich fasziniert von der Erfolgsstory Ken Silvermans und seiner Build Engine. :D


    Zustande gebracht habe ich zu der Zeit aber einige wirklich gute Projekte. Kleinere Spiele, diverse Tools, natürlich Demos und Intros sowie einen Player für diverse OPL-3 Formate. Leider sind viele dieser Projekte zwischenzeitlich verloren gegangen. Vielleicht stellle ich hier demnächst mal was von dem vor, was ich noch habe.

    Meine DOS-Rechner:

    Kleiner Industrie-486er mit 100 MHz (Intel 80486DX-4), 32 MB SD-RAM, Diamond SpeedSTAR 24 und SB 16 ( CT2770 ) + TNDY

    "Frankenstein" Pentium II mit 266 MHz, Elsa Winner 1000 TrioV + Voodoo I, SB 16 (CT2290) + Yamaha DB50XG


    Von mir geschriebene DOS-Programme gibt es hier.

  • Zustande gebracht habe ich zu der Zeit aber einige wirklich gute Projekte. Kleinere Spiele, diverse Tools, natürlich Demos und Intros sowie einen Player für diverse OPL-3 Formate. Leider sind viele dieser Projekte zwischenzeitlich verloren gegangen. Vielleicht stellle ich hier demnächst mal was von dem vor, was ich noch habe.

    Ja, bitte! Ich war bei weitem nicht so erfolgreich und habe eigentlich nichts vorzeigbares...

  • Oh ja da hänge ich mich auch noch mit an... hab noch irgendwo meine Basic Spielereien... aber die sind ja schnell nach Pascal übersetzt.
    Ist Assembler auch erlaubt?

    [ SUCHTLISTE ] [ WD-40 ]

    :bump:Face:bump

    C:\>format c: /y_
    ____________________________________________

    8|

  • Klar ist Assembler erlaubt! Habe ich doch zum Teil auch in meinem Code, oder wonach sieht das hier für dich aus: :D

    Meine DOS-Rechner:

    Kleiner Industrie-486er mit 100 MHz (Intel 80486DX-4), 32 MB SD-RAM, Diamond SpeedSTAR 24 und SB 16 ( CT2770 ) + TNDY

    "Frankenstein" Pentium II mit 266 MHz, Elsa Winner 1000 TrioV + Voodoo I, SB 16 (CT2290) + Yamaha DB50XG


    Von mir geschriebene DOS-Programme gibt es hier.

  • Ich habe neulich noch mal ein VGA Feuer in C programmiert:


    https://gist.github.com/root42…3e935aa03e54b239cfa39d298


    Code ist zu lang zum pasten, aber kurz gesagt, es kompiliert in Turbo C 2.0 und läuft auf meinem 286er relativ flüssig. Für grossflächigere Feuer sollte es ein 386er oder 486 mit local bus sein... ;)


    Die Kernfunktionen sind get_fire_palette, welches ein passende VGA Palette setzt, dann draw_fuel und draw_fire. Erstere sorgt dafür, dass das Feuer nicht erlöscht, und draw_fire berechnet das neue Frame durch Mittelwertbildung der nächsten Zeile.


    Das ganze ist simplistisch gehalten, ohne Mode X oder page flipping. Aber immerhin an den vertical retrace gekoppelt.

    root42 auf YouTube


    80486DX@33 MHz, 16 MiB RAM, Tseng ET4000 1 MiB, GUSar Lite & TNDY & SnarkBarker, PC MIDI Card + SC55 + MT-32, XT CF Lite, OSSC 1.6

  • Ich habe mal etwas herumgeschnipselt.
    Noch ungetestet:


    @echo off
    REM Bloody.bat
    echo Program Bloodyrain;>tmp.pas
    echo uses crt;>>tmp.pas
    echo var p : integer;>>tmp.pas
    echo Procedure RotatePal;>>tmp.pas
    echo Var a : Word;>>tmp.pas
    echo begin>>tmp.pas
    echo inc(p);>>tmp.pas
    echo a := 100;>>tmp.pas
    echo port[968] := 35;>>tmp.pas
    echo while a > 1 do>>tmp.pas
    echo begin>>tmp.pas
    echo port[969] := 255-(a+p);>>tmp.pas
    echo port[969] := 0;>>tmp.pas
    echo port[969] := 0;>>tmp.pas
    echo dec(a);>>tmp.pas
    echo end;>>tmp.pas
    echo end;>>tmp.pas
    echo Procedure Makerain;>>tmp.pas
    echo Var x,y,c,d:word;>>tmp.pas
    echo begin>>tmp.pas
    echo d:=1;>>tmp.pas
    echo randomize;>>tmp.pas
    echo for x := 0 to 320 do>>tmp.pas
    echo begin>>tmp.pas
    echo c := random(65);>>tmp.pas
    echo for y:= 1 to 200 do>>tmp.pas
    echo begin>>tmp.pas
    echo if c > 64 then c := 1;>>tmp.pas
    echo mem[$a000:x+320*y] := 35+c;>>tmp.pas
    echo inc(c,d);>>tmp.pas
    echo end;>>tmp.pas
    echo d:=random(5)+1;>>tmp.pas
    echo end;>>tmp.pas
    echo end;>>tmp.pas
    echo begin>>tmp.pas
    echo asm>>tmp.pas
    echo mov ax,13h>>tmp.pas
    echo int 10h>>tmp.pas
    echo end;>>tmp.pas
    echo while keypressed do readkey;>>tmp.pas
    echo makerain;>>tmp.pas
    echo repeat>>tmp.pas
    echo rotatepal;>>tmp.pas
    echo delay(10);>>tmp.pas
    echo until keypressed;>>tmp.pas
    echo while keypressed do readkey;>>tmp.pas
    echo asm>>tmp.pas
    echo mov ax,03h>>tmp.pas
    echo int 10h>>tmp.pas
    echo end;>>tmp.pas
    echo end.>>tmp.pas


    Fehlt aber noch der Compile-Vorgang. Bitte ergänzen.

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!