Upload
dokhanh
View
217
Download
0
Embed Size (px)
Citation preview
8. Standard Grafikadapter & SVGA
8.1 Adapter-Stammbaum
• Monochrome Display Adapter (MDA): MDA
CGA
EGA
Hercules
SVGA
TIGAWindows- Beschleunigerkarten
VGA
Ansteuerung digital
Ansteuerung analog
Monochrom- schwarz/weiss, nur Text, keine Pixelgrafik, - 25 Zeilen mit 80 Zeichen,
• Color Graphics Adapter (CGA): - 640 * 200 Punkte, - 8 * 8 Zeichenmatrix, - Text mit 16 Farben, - Grafik mit 4 Farben.
• Hercules S/W mit 720 * 350 Pixeln. • Enhanced Graphics Adapter (EGA):
- 16 aus 64 Farben sind wählbar, - Maskierung der Farbebenen, - bis 8 * 14 Zeichenmatrix, - BIOS auf Adapterkarte, - 640 * 350 Pixel.
1 Systemprogrammierung I, Sommer 2005, © VS Informatik, Ulm, P. Schulthess
• Video Graphics Array (VGA): - 320 * 200 Pixel mit 256 Farben aus 2**18, - 640 * 480 Pixel mit 16 Farben aus 2**18, - maximal 64 KByte pro Farb-Ebene.
• Super VGA (SVGA/XGA): - Höhere Auflösung, linearer Bildschirmspeicher möglich, Bank-Select Register, - Kompatibilität auf Grund standardisierter BIOS-Aufrufe.
• Beschleunigerkarten mit umfangreichen HW-Funktionen für 3D-Grafik: - nach Vorgabe durch DirectDraw & Direct3D, - OpenGL als Alternative zu MS-Direct3D, - eventuell Koordinaten transformieren, - BitBlockTransfer, Glyphen zeichnen, - Polygone zeichnen und schattieren, - Dreiecke zeichnen & bewegen, - texturieren ...
• ATI Radeon Karten für Plurix: - Keine Registerdokumentation für neue Modelle, - Unterstützung für Modelle 7000 bis 9250, - Mobile Radeon in Arbeit.
2 Systemprogrammierung I, Sommer 2005, © VS Informatik, Ulm, P. Schulthess
8.2 Konfigurierung und Ansteuerung
8.2.1 Direkte Konfigurierung über VGA-Register im E/A-Raum: • Mühselig und für höhere Funktionen herstellerabhängig:
- Grosse Anzahl von Geräteregistern und Bitfeldern, - Zeitkritische Umschaltvorgänge.
• Taktung der Bildpunkte und Erzeugen der Bildfrequenz: - Pixeltakt mithilfe einer PLL erzeugen (verschiedene Frequenzteiler), - Anzahl Pixel pro Zeile bestimmen, Strahlrücklauf pro Zeile,
- Anzahl Zeilen pro Bild, vertikaler Strahlrücklauf.
• Speicherung der Bildpunkte für VGA Adapter: - 128 KB Pixelspeicher in den Realspeicher eingeblendet, - Bei SVGA nur ein Ausschnitt eingeblendet, - Direkter Pixelzugriff möglich, - Video-Fenster bei $a0000, - maximal 480*640.
• Interpretation der Bytes im Grafikspeicher: - Als attributierte Buchstaben (Vordergrund- & Hintergrundfarbe, Blinken), - Als separate Farbebenen mit selektivem Ebenenzugriff, - Als 4-Bit oder 8-Bit Pixel.
3 Systemprogrammierung I, Sommer 2005, © VS Informatik, Ulm, P. Schulthess
8.2.2 Softwareunterstützung für die Grafikausgabe:
• Uneinheitliche Registerschnittstelle, Zugriff soweit möglich über BIOS: - BIOS auf Hauptplatine oder/und im Adapter-ROM, - BIOS hauptsächlich für die Initialisierung: - BIOS eigentlich nur für Real-Mode.
• Erzeugen des Bildes: - entweder die Bildpunkte direkt in den Grafikspeicher schreiben, - oder Grafikbibliotheken mit 3D-Funktionen verwenden.
• Über DOS: - ohne echte Grafik, nur Spezialbuchstaben, mager.
• Linux Treiber: - XFree 386, OpenGL, Direct Rendering Interface, - Dokumentation der Hardware unvollständig.
• Microsoft DirectDraw und Direct3D: - SW-Emulation nicht implementierter Funktionen, - Beschleuniger-Schnittstelle z.B. für Spiele, - echte 3D Modellierungen.
4 Systemprogrammierung I, Sommer 2005, © VS Informatik, Ulm, P. Schulthess
8.2.3 Zugriff über BIOS
• Standardisierte Initialisierung von: - Farbmodell (Masked, Indexed, True-Color), - Speichermodell (Linearer Framebuffer), - Auflösung & Bildfrequenz einstellen.
• Aufruf des BIOS: - über INT $10, Funktion in AH, - Unterfunktion AL, evtl. Teilfunktion in DL.
• Motherboard BIOS für MDA & CGA. • BIOS Routinen im ROM der EGA/VGA Adapterkarte:
- installiert in INT $10, Motherboard BIOS über INT $42.
• BIOS Ergänzung für SVGA Adapter (VESA): - ergänzend zum EGA/VGA BIOS, ebenfalls aus Adapter ROM, - INT $10, Funktion $4f, ...
• BIOS Datenbereich zur Ablage & Sicherung des Bildformates: - ab $40:$10 bei MDA, CGA Adapter, - Zusätzlich ab $40:84 für EGA, VGA.
5 Systemprogrammierung I, Sommer 2005, © VS Informatik, Ulm, P. Schulthess
8.3 Videospeicherorganisation
8.3.1 Map-Mask Register
640 K
CPU-RAM
Map-Mask Register
Pixel
Video-RAM
DAC
- Interessant aber veraltet. - schont den Real-Mode Adressraum, - spartSpeicherzugriffe im Real-Mode. - Videomodi[13,14,15,17] können
gleichzeitig in mehrere Ebenen schreiben.
- 16 Farbwerte mit 4 Ebenen. - =< 128 KByte pro Farbebene.
8.3.2 High-Color & True-Color 15 bis 32 Bit
RGB Pixel
Analog
Video-Out
DAC
DAC
- 15/16 Bit/Pixel (High-Color). - 24/32 Bit/Pixel (True-Color). - Z-Puffer, Alpha Puffer etc..
6 Systemprogrammierung I, Sommer 2005, © VS Informatik, Ulm, P. Schulthess
8.3.3 Palettenregister
• Ab VGA analoges Signal aus den DAC (Dig.-Analog Convertert) zum Bildschirm.
• Farbwert im Grafikspeicher abgespeichert. • Pro Pixel 4 Farbbits. • 16 Palettenregister à 6 Bits.
4 Bit
Analog
Video- Out
DACDACDAC
CLUT - Color Lookup Table
16 Paletten- register
Color Page Register
• 4*64 Farbtabelleneinträge. • Tabellenseite umschalten.
7 Systemprogrammierung I, Sommer 2005, © VS Informatik, Ulm, P. Schulthess
8.3.4 Indexed Color
• Nur die wichtigsten Farben werden in die Farbtabelle aufgenommen. - 15 Bit Farbtabelleneintrag: 5R, 5G, 5B, - 16 Bit Farbtabelleneintrag: 5R, 6G, 5B, - 24 Bit Farbtabelleneintrag: 8R, 8G, 8B.
• Die Farbtabelle kann jeweils für ein gegebenes Bild optimiert werden. • Ein Pixel beschreibt maxi-
mal 256 Farbwerte.
8 Bit Pixel
Analog Video- Out
DAC DAC DAC
CLUT – Color Lookup Table
• Jeweils auf die Farbtabelle für das Vordergrundfenster umschalten.
8 Systemprogrammierung I, Sommer 2005, © VS Informatik, Ulm, P. Schulthess
8.4 VESA Standard für SVGA BIOS Aufrufe
• VESA = Video Electronic Standards Association: 3Dlabs, Apple, ATI, Evans & Sutherland, Fujitsu, Genesis, Hewlett-Packard, Hitachi Ltd., IBM, Intel, Matrox, Microsoft, NVidia, Qualcomm, Samsung, Sony, Sun, Texas Instruments, Trident,ViewSonic, WayTech, XFree 86 Project
• Linearer Framebuffer bei VESA 3.0 möglich. • Erweiterter Registersatz gegenüber VGA. • Pixel-Speicher für Super VGA:
- 2 Speicherseiten: a0000-bffff, e4000-effff.
In
dexi
erte
Ger
äter
egis
ter
PC-B
us
DatenIndex
• I/O Adressen für (Super) VGA (hex): - 3b4-3b5 (monchrom), 3ba (status), - 3d0-3d7, 3da-3dc (Color), - 3c0-3cf (EGA/VGA).
• Zugriff auf weitere Geräte-Register nach Indexierung an Port $3d4: - Indexregister: $3d4 - Datenregister: $3d5
9 Systemprogrammierung I, Sommer 2005, © VS Informatik, Ulm, P. Schulthess
8.4.1 Z.B. Videospeicher einblenden
• Im Protected Mode können auch große Video-Speicherbereiche ganz in den Adressraum gelegt werden („Linear Framebuffer“).
• Problem: Im Real-Mode kann nur ein Teil des Video-Speichers in den CPU-Adressraum eingeblendet werden.
• Bank-Select Register bildet den CPU-Adressbereich $a0000-$affff in das Video-RAM ab.
640 K Bank-Select
Video-RAM
CPU-RAM
Granula- rität
Display• Die Plazierung kann nur auf mindestens 1 KByte Grenzen geschehen: - vorzugsweise über SVGA-BIOS, - oder über Bank-Select Register.
• Leider haben dieGrafik-Adapter normalerweise kein Protected Mode BIOS.
10 Systemprogrammierung I, Sommer 2005, © VS Informatik, Ulm, P. Schulthess
8.4.2 SVGA BIOS Aufrufskonvention • Parameter in CPU Registern beim SVGA-Aufruf („Registerschnittstelle“):
- :Immer INT $10, Funktion $4f in AH, Subfunktion in AL .
• SVGA-Info ermitteln: - AL =$00, Rückgabe eines Info-Records (s. Programm).
• SVGA-Modus ermitteln: - AL =$01, Rückgabe eines Info-Records (s. M. Tischer).
• SVGA-Modus einstellen: - AL =$02, gewünschter Modus in BX.
• SVGA-Modus ermitteln: - AL =$03, Rückgabe des Modus in BX.
• SVGA-Status sichern/wiederherstellen: - AL =$04, (siehe M. Tischer).
• CPU-Fenster auf Video-Speicher abbilden: - AL =$05, stückweise Fensteradresse in DX (s. Progr.).
• SVGA-Abtastzeile einstellen: - AL =$06, SVGA-Anzeigebeginn in Video-RAM setzen.
11 Systemprogrammierung I, Sommer 2005, © VS Informatik, Ulm, P. Schulthess
8.4.3 VESA Videomodi
• SVGA-Modi $100 oder größer, zusätzlich zu MDA, CGA, EGA Modi. • Verbreitet sind VESA 1.0 und VESA 2.0 nicht jedoch VESA 3.0.
Video-Modus Grafik Auflösung Farben$100 ja 640*400 256$101 ja 640*480 256$102 ja 800*600 16$103 ja 800*600 256$104 ja 1024*768 16
VESA $105 ja 1024*768 256$106 ja 1280*1024 16$107 ja 1280*1024 256$108 Text 60*80$109 Text 25*132$10a Text 43*132$10b Text 50*132$10c Text 60*132$03 Text 25*80 16
MDA, CGA, VGA $18 ja 640*480 16 $19 ja 320*200 256
12 Systemprogrammierung I, Sommer 2005, © VS Informatik, Ulm, P. Schulthess
8.4.4 Programmbeispiel SVGADemo.PAS • VESA Informationsrecord vereinbaren, holen und prüfen. • Grafikspeicherbänke in Hauptspeicher einblenden & mit Pixeln füllen.
program SVGADemo; (* Super VGA Demo *) uses dos; type InfoPtr = ^ InfoBuf; IntPtr = ^ IntWurm; CharPtr = ^ CharWurm; IntWurm = array[ 0..127 ] of integer; CharWurm = array[ 0..255 ] of char; InfoBuf = record signatur : array[ 0..3 ] of char; (* "VESA" *) version : integer; (* 1, 2, 3 ...*) manufact: CharPtr; (* Name des Herstellers *) implFunc: integer; suppMods: IntPtr; (* einstellbare Grafikmodi *) reserved: CharWurm; end; var infAdr : InfoPtr; adrval : longint; reg : registers;
13 Systemprogrammierung I, Sommer 2005, © VS Informatik, Ulm, P. Schulthess
14 Systemprogrammierung I, Sommer 2005, © VS Informatik, Ulm, P. Schulthess
procedure RamWindow( bank, farb: integer ); var offset: longint; begin with reg do begin (* set Video-Bank: *) dx := bank; ah := $4f; al := $05; bx := $0000 (* page 0 *); Intr( $10, reg ); if ( ah=0 ) and ( al=$4f ) then (* ok *) else writeln( 'SVGA Error in Subfunction 5' ); end; (* with *); for offset:=0 to 60000 do (* set pixel *) mem[ $a000 : offset ] := farb; end; begin new(infAdr); adrVal:=longint(infAdr); with reg do begin (* Now obtain and verify SVGA-Info: *) ah := $4f; al := $00; es := adrVal shr 16; di := adrVal and $ffff; (* Infobuffer, segment and offset *) Intr( $10, reg ); if (ah=0) and (al=$4f) then (* ok *) else writeln('No SVGA-Bios'); (* and now set some SVGA-Videomode : *) ah := $4f; al := $02; bx := $101; (*Videomodes ..$101..105.. etc. *) Intr( $10, reg ); if ( ah=0) and ( al=$4f ) then (* ok *) else writeln( 'SVGA Error in Subfunction 2' ); end; RamWindow( 0, 40 ); RamWindow( 1, 50 ); RamWindow( 2, 60 ); RamWindow( 3, 70 ); RamWindow( 4, 80 ); RamWindow( 5, 90 ); readln; end.