Mit Bezug auf mein doch etwas längeres Assembler-Listing liste ich hier nun nachträglich mal den ungefähren Ablauf auf, um so einen kleinen Einblick vom Inhalt zu geben:
Deklaration verwendeter Konstanen
Überprüfung ob eine MMX-CPU vorhanden ist
Vesa-Info holen und überprüfen ob ein VBE 3-Bios vorhanden ist
Überprüfung ob ein Vesamode in der Modeliste vorhanden ist, der die gewünschte Auflösung (von 1024x768), die gewünschte Anzahl Bits je Pixel (32Bit) und mit einem linearen Zugriff auf den Framebuffer existiert
Pixelclock für den CRTC-Parameter-Block ermitteln
Refreshrate berechnen
Über DDC die Monitor-Informationen(EDID) holen und überprüfen ob der Verwendete Monitor 96khz unterstützt
Vesamode einschalten
IRQ 1 (Tastatur) ausschalten
Unterprogrammaufruf zur Routine die den 16Bit-Unrealmode anschaltet (DS-Segment auf 4GB erweitern und 21. Adressleitung anschalten)
Unterprogrammaufruf zur Routine die eine Offset-Tabelle der Zeilenanfänge jeder Bildschirmzeile am Anfang des Datensegments anlegt
In der linken obere Ecke des Bildschirms einen Ball zeichnen
Unterprogrammaufruf zur Routine die vom Bildschirminhalt eine Sprite-Tabelle (Offset,Farbe...) anlegt
Ball vom Bildschirm über Sprite-Tabelle wieder löschen
"Anzahl" Bälle über festgelegte Positionen (siehe Positionstabelle im Datenbereich) zum Bildschirm unter Verwendung der Sprite-Tabelle zeichnen
Anfang der Hauptschleife
Über die Sprite-Tabelle alle Bälle wieder löschen
Über eine Stepper-Tabelle und eine Richtungstabelle (siehe Datenbereich) neue Positionen der Bälle berechnen und dabei überprüfen, ob der Bildschirmrand erreicht wurde und wenn ja, dann die jeweilige Bewegungs-Richtung des Balles in der Richtungstabelle umkehren
Alle Bälle mit ihrer neuen Positionen zum Bildschirm bringen
Vesa triple Buffering einleiten (nur das erste Mal)
Für das verwendete triple buffering eine neue Bildadresse berechnen
Vesa triple Buffering mit Bildadresse verwenden
Überprüfen ob der dritte Buffer benutzt wurde und wenn ja, dann das Adressregister auf die Adresse des ersten Buffers zurücksetzen
Überprüfung ob eine Taste auf der Tastatur gedrückt wurde und wenn ja, dann die Taste vom Tastaturcontroler holen, den IRQ 1 wieder anschalten, den Tastaturpuffer leeren, zurück in den Textmode(3) schalten und die Anwendung beenden und wenn keine Taste gedrückt wurde, dann erfolgt ein Sprung zum Anfang der Hauptschleife
Ausgabe der Fehlertexte mit Rücksprung zu DOS, wenn ein Fehler aufgetreten ist
GDT für den Protected Mode
Unterprogramm das den 16 Bit-Unrealmode anschaltet
Unterprogramm das ein Ball zeichnet
Unterprogramm das vom Bildschirminhalt eine Sprite-Tabelle(Offset,Farbe...) anlegt
Unterprogramm das von jedem Bildschirmzeilenanfang eine Offset-Tablelle am Anfang des Datenbereiches anlegt
Beginn des Datenbereiches
Offset-Tablelle jeder Bildschirmzeile
Positionstabelle der zu bewegenden Bälle
Stepper-Tabelle für die Anzahl der Pixel die jeder Ball horizontal und vertical bewegt wird
Richtungstabelle die bestimmt in welche Richtung bewegt wird
Sprite-Tabelle (Offset, Farbe...) die den Inhalt des Bildschirms enthält (ein Ball wurde gezeichnet)
Aktuelle Bildschirmadresse die angibt wohin gezeichnet wird, wird je nach buffer gewechselt
Anzahl Bytes des Bildschirms
Maximale Bildschirmadresse
Platz zum Zwischenspeichern vom SI-Register
Verwendete Hintergrungfarbe für das Löschen der Bälle
Parameter zum Berechnen eines Kreises
EDID-Tabelle der Monitorinformationen
Tabelle für VESA-Info
Tabelle für Mode-Info
CRTC-Parameter-Tabelle für Vesamode mit eigener Refreshrate
Flag für tripple buffering
Fehlertexte
Stackbereich (16 Byte genügen für diese Anwendung, wenn für DOS selber ein genügend grosser Stack bereits vorhanden ist.)
Dirk