• MYSELF
  • Start
  • About Me...
  • Photo's
  • COMMUNICATE
  • Foren
  • Links
  • weiter Links...
  • SOMETHING
  • Musik
  • Elektronik
  • Unsere Welt...
  • Shop
  • PROGRAMMING
  • Tips+Infos
  • VGA Grafik
  • MS-DOS
  • WIN32
  • Python
  • THE END
  • Impressum
  • CSS ist valide!

  • Valid HTML 4.01 Transitional

  

VGA Graphik mittels Assembler


Wichtig! Bitte vor dem Herunterladen lesen!
Hinweise zum Download PDF HTML

Wichtig! Bitte vor dem Herunterladen lesen und abspeichern!
Allgemeine Nutzungsbedingungen PDF HTML

Um die Beispiele besser zu verstehen und zum eigenen Programmieren, möchte ich an der Stelle mal auf Ralf Brown's Interrupt List verweisen, die praktisch ein Standartwerk zum Thema Interrupts darstellt. Wer allerdings noch ganz am Anfang steht sollte vielleich zunächst einmal Markus Romings Webseite (PDF) besuchen.
Für Fragen zu speziellen Themen steht euch das Forum der Codingcrew zur Verfügung.

Graphikprogrammierung - Memory mapped IO

Anmerkung: aus Kompatibilitätsgründen verwenden alle Graphicbeispiele den 640 x 480 VGA Modus, da dieser von allen handelsüblichen PC unterstützt wird.

Bitmap Dateien laden und darstellen

Mindestens genauso oft wie Bilder berechnet und dargestellt werden, soll der Inhalt bestehender Bilddateien dargestellt werden. Testen wir das am Beispiel von Bitmap Dateien, Bitmaps sind Palettenbasierte Rastergraphiken, das Format wurde mit Windows 3 vorgestellt. Das Beispiel lädt eine Schwarzweißgraphik mit bis zu 640x480 Pixeln, analysiert die wichtigsten Bilddaten, und gibt das Bild auf dem Monitor aus. Beispielbitmaps sind in der ZIP enthalten.
Der Quellcode (.asm): Anschauen!
Ein Beispiel zum Test: Anschauen / Download
Die Ausführbare Datei (.exe): Ausführen oder Speichern!
Alle Dateien Speichern! ZIP-Archiv

Winkelfunktionen III

aus verschiedenen Gründen ist es nicht allzu zweckmäßig zur Graphikberechnung den Coprozessor zu verwenden, die Alternative wird in diesem Beispiel präsentiert: Ermittlung der Werte durch einen LookUp Table (Wertetabelle). Um dem Beispiel etwas Dynamik zu verleihen, kann man die Phasenverschiebung simulieren, was auch verdeutlicht, warum man nur eine Tabelle für Sinus und Cosinus benötigt. Ein Programm zur Erzeugung der Wertetabellen gibt es auf meiner Assembler 16 Bit Seite.
Der Quellcode (.asm): Anschauen!
Liesmich.txt: Anschauen!
Die Ausführbare Datei (.exe): Ausführen oder Speichern!
Alle Dateien Speichern! ZIP-Archiv

640 x 480 in Farbe!

Hier gehts sehr hardwarenah zur Sache! Um im 640 x 480 Modus Farben benutzen zu können, würde man ggf. zuerst eine Farbtabelle (Palette) ins RAMDAC laden, dann kann man innerhalb des Graphicrams auf diese Einträge zugreifen, der ganze Mechanismus ist nicht! trivial und ist durch die VGA Standart Spezifikation vorgegeben. Wer selbst Farbgraphik im 640x480 Modus (oder mehr) erstellen möchte braucht daher eine Hardwaredokumentation, bzw. mindestens eine vollständige VGA Standart Dokumentation.
Hinweis: innerhalb des Beispiels wird auf Register der Graphikkarte direkt zugegriffen, und icht habe das Beispiel so wie es ist getestet, und es läuft. Wenn man die Werte verändert, oder evtl. sogar die Portaddressen, könnte das für die 'Systemgesundheit' unkalkulierbare Folgen haben, im harmlosesten Fall bleibt nach Schliessen der Konsole ein Farbfehler bis zum Ende der Windows Sitzung bestehen, im Worst Case (verstellte Timing Register) wird der Monitor beschädigt!
Der Quellcode (.asm): Anschauen!
Die Ausführbare Datei (.exe): Ausführen oder Speichern!
Alle Dateien Speichern! ZIP-Archiv

Geraden beliebiger Winkel

Weiter unten habe ich ja schon in dem 'Analoguhrbeispiel' vorgestellt wie man nicht nur senkrechte oder waagerechte Linien zeichnet, sondern auch schräge Linien.
Allerdings ist es nicht immer zweckmässig nur zum Zeichnen einer Linie die Winkelfunktionen heranzuziehen, eine Alternative ist das Berechnen der Punkte mittels der linearen Steigungsfunktion: Y = (m/n) * X + b.
Der Quellcode (.asm): Anschauen!
Die Ausführbare Datei (.exe): Ausführen oder Speichern!
Alle Dateien Speichern! ZIP-Archiv

Winkelfunktionen II

Lange Rede, kurzer Sinn: das 'Mopped' da unten lief mir doch noch was zu unrund also hab ich da noch ein wenig optimiert, und das man besser sieht worums geht (flüssiger Bildaufbau) habe ich statt des veränderbaren Rasters, jetzt die Amplitude der Kurve steuerbar gemacht.
Bonus: eine Zwischenversion ist der Zip Datei beigelegt.
Der Quellcode (.asm): Anschauen!
Versionsunterschiede: Anschauen!
Die Ausführbare Datei (.exe): Ausführen oder Speichern!
Alle Dateien Speichern! ZIP-Archiv

Winkelfunktionen

Alle untenstehenden Beispiele hatten bisher einen Nachteil: statt des unmittelbaren Zugriffs auf das Videoram, wurde der relativ langsame BIOS/Videointerrupt 010h benutzt.
Hier habe ich das Beispiel Sinus/Cosinus mal auf die effizientere Methode des Memorymapped Input/Output umgebaut. Der Effekt zeigt sich wenn man mittels [R] oder [L] das Textfenster verschiebt. Da ich den höher aufgelösten VGA Modus dem EGA Modus (320x240 Pixel, 256 Farben) vorziehe, Ist das Beispiel vorerst Monochrom.
Bei einer späteren Revision werde ich dann auch ein PDF zum Thema erstellen,
bis es soweit ist sollten den Neugierigen die Kommentare im Quelltext der Includedatei reichen.
Innerhalb von 24Std. habe ich das Beispiel noch Geschwindigkeitsoptimiert, die 'alte' evtl. anschaulichere Version, ist komplett in der ZIP Datei enthalten.
Der Quellcode (.asm): Anschauen!
Versionsunterschiede: Anschauen!
Die Ausführbare Datei (.exe): Ausführen oder Speichern!
Alle Dateien Speichern! ZIP-Archiv

Graphikprogrammierung - BIOS Interrupt 010h

Analoguhr

Die unten vorgestellten Verfahren ermöglichen es Polarkoordinaten in kartesische Koordinaten umzurechnen. Also ist es damit möglich die Skalenstriche und Zeiger einer Analoguhr zu berechnen und darzustellen. Die umrechnung von Zeit in Winkelschritte erfordert an einigen Stellen trickreiche Korrekturen, das alles ist in diesem Beispiel enthalten. In der ZIP Datei sind zusätzlich noch Beispiele für Rad, Scheibe und gefüllter Kreis.
Der Quellcode (.asm): Anschauen!
Die Ausführbare Datei (.exe): Ausführen oder Speichern!
Alle Dateien Speichern! ZIP-Archiv

Sinus und Cosinus

Hier wird der Coprozessor benutzt um die Werte der Sinusfunktion zu berechnen, diese werden dann grafisch dargestellt. Zu dem Zweck wird wieder der Videointerrupt 010h verwendet.
Der Quellcode (.asm): Anschauen!
Graphics includes Datei: Anschauen!
Die Ausführbare Datei (.exe): Ausführen oder Speichern!
Alle Dateien Speichern! ZIP-Archiv

Bildschärfe

Ebenfalls ein einfaches Testbildmuster, ich habe in dem Quelltext ganz auf Includes, Macros, Prozeduren und Stapeloperationen verzichtet, und bedingte und unbedingte Sprünge weitesgehendst optimiert, Fazit: weniger ist manchmal mehr.
Der Quellcode (.asm): Anschauen!
Die Ausführbare Datei (.exe): Das Beispiel - Ausführen oder Speichern!
Alle Dateien Speichern: ZIP-Archiv

Gitter und Kreis

Ein Testbildmuster (Gitter und Kreis) wird erzeugt, zur Darstellung wird der Grafikinterrupt 010h benutzt, zur Berechnung des Kreises der Coprozessor.
Der Quellcode (.asm): Anschauen!
Die Ausführbare Datei (.exe): Das Beispiel - Ausführen oder Speichern!
Alle Dateien Speichern: ZIP-Archiv

Das Assembler Beispiel Farbalken neu

Das Beispiel zeigt 8 Farbbalken wie beim Testbild. Zur Erzeugung wird der Graphik Interrupt 010h benutzt.
Der Quellcode (.asm): Anschauen!
Graphics includes Datei: Anschauen!
(latest Version) Die Ausführbare Datei (.exe): Ausführen oder Speichern!
Alle Dateien Speichern: ZIP-Archiv

Das Assembler Beispiel Farbalken alt

Das Beispiel benutzt den Textmodus Video Mode 3.
Der Quellcode (.asm): Anschauen!
Die Ausführbare Datei (.exe): Das Beispiel - Ausführen oder Speichern!
Alle Dateien Speichern: ZIP-Archiv

neue Stats:
eXTReMe Tracker - neue Statistik
Sir Shylock   •  53783 Eitorf
E-Mail: webmaster
alte Stats:
eXTReMe Tracker - alte Statistik