Frage zu VESA Videomodus 1024x768x4
-
Hallo zusammen, Hallo Dirk,
ich hab es nun geschafft über die VESA Bios Funktionen alle Modi mit ihren Eigenschaften in eine Datei zu schreiben... (wusste garnicht das es so viele gibt)
hier erstmal der Auszug:
Modus 260 (104h)
Granularitaet: 64
Groesse des Fensters: 64
Fensterbreite: 1024
Anzahl Bitfelder: 4
Bankgroesse: 0
Speichermodeltype: 3Mit dem Modus scheint wohl alles richtig zu sein... Vielleicht hab ich auch nur einen Programmfehler drin
währe nicht das erste mal...
Weiß vielleicht jemand wie ich im PMode auf den gesamten Speicher zugreifen kann?
Gruß, Nicky
-
$Bits pro Pixel: 4
Naja, dann hat ja mein Tipp doch gepasst?
-
Thuruk schrieb:
$Bits pro Pixel: 4
Naja, dann hat ja mein Tipp doch gepasst?
Hallo Thuruk,
dein Tipp paßt zu 50%.
4 Bit pro Pixel aber 8 Pixel pro Byte, da 4 Bitplanes hintereinander liegen.Nicky
-
supernicky schrieb:
Hallo zusammen, Hallo Dirk,
ich hab es nun geschafft über die VESA Bios Funktionen alle Modi mit ihren Eigenschaften in eine Datei zu schreiben...
Prima. Von welcher Karte ist es?
(wusste garnicht das es so viele gibt)
Je nach Bios variert die Anzahl der Modi.
ATI 9800 PRO VESA Modi 128 MB ------------------------------------- 4 8 15 16 24 32 Matrix ------------------------------------- 109 132 x 25 10A 132 x 43 130 132 x 44 182 10D 10E 10F 120 320 x 200 192 193 194 195 196 320 x 240 1A2 1A3 1A4 1A5 1A6 400 x 300 1B2 1B3 1B4 1B5 1B6 512 x 384 1C2 1C3 1C4 1C5 1C6 640 x 350 100 183 184 185 186 640 x 400 101 110 111 112 121 640 x 480 102 103 113 114 115 122 800 x 600 104 105 106 107 108 123 1024 x 768 107 119 11A 11B 124 1280 x 1024 ATI X800 PRO VESA MODI 256 MB ------------------------------------- 4 8 15 16 24 32 Matrix ------------------------------------- 109 132 x 25 10A 132 x 34 130 132 x 44 10D 10F 320 x 200 193 194 196 320 x 240 1B3 1B4 1B6 512 x 384 1C3 1C4 1C6 640 x 350 100 184 186 640 x 400 101 110 112 640 x 480 133 134 136 720 x 400 103 113 115 800 x 600 105 116 118 1024 x 768 153 154 156 1152 x 864 107 119 11B 1280 x 1024 143 144 146 1400 x 1050 173 174 176 1600 x 1200 1D3 1D4 1D6 1856 x 1392 1E3 1E4 1E6 1920 x 1440 NVIDIA GF 4 Ti4200 VESA Modi 64 MB ------------------------------------- 4 8 15 16 24 32 Matrix ------------------------------------- 108 80 x 60 109 132 x 25 10A 132 x 43 10B 132 x 50 10C 132 x 60 130 10E 10F 320 x 200 134 135 136 320 x 240 131 132 133 320 x 400 100 13D 13E 640 x 400 101 111 112 640 x 480 102 103 114 115 800 x 600 104 105 117 118 1024 x 768 106 107 11A 1280 x 1024 147 148 1400 x 1050 145 146 1600 x 1200 NVIDIA GF 6800 GT VESA Modi 256 MB ------------------------------------- 4 8 15 16 24 32 Matrix ------------------------------------- 130 10E 10F 320 x 200 134 135 136 320 x 240 131 132 133 320 x 400 100 13D 13E 640 x 400 101 111 112 640 x 480 102 103 114 115 800 x 600 104 105 117 118 1024 x 768 106 107 11A 11B 1280 x 1024 145 146 1600 x 1200 147 148 1400 x 1050 152 2048 x 1536 Vesamodi Colorfull GTX295(alle Werte hex) ----------------------------------------- 0100 X=0280 Y=0190 8Bit 0101 X=0280 Y=01E0 8Bit 0102 X=0320 Y=0258 4Bit * 0103 X=0320 Y=0258 8Bit 0104 X=0400 Y=0300 4Bit * 0105 X=0400 Y=0300 8Bit 0106 X=0500 Y=0400 4Bit * 0107 X=0500 Y=0400 8Bit 010E X=0140 Y=00C8 10Bit 010F X=0140 Y=00C8 20Bit 0111 X=0280 Y=01E0 10Bit 0112 X=0280 Y=01E0 20Bit 0114 X=0320 Y=0258 10Bit 0115 X=0320 Y=0258 20Bit 0117 X=0400 Y=0300 10Bit 0118 X=0400 Y=0300 20Bit 011A X=0500 Y=0400 10Bit 011B X=0500 Y=0400 20Bit 0130 X=0140 Y=00C8 8Bit 0131 X=0140 Y=0190 8Bit 0132 X=0140 Y=0190 10Bit 0133 X=0140 Y=0190 20Bit 0134 X=0140 Y=00F0 8Bit 0135 X=0140 Y=00F0 10Bit 0136 X=0140 Y=00F0 20Bit 013D X=0280 Y=0190 10Bit 013E X=0280 Y=0190 20Bit 0145 X=0640 Y=04B0 8Bit 0146 X=0640 Y=04B0 10Bit 014A X=0640 Y=04B0 20Bit 0160 X=0500 Y=0320 8Bit 0161 X=0500 Y=0320 20Bit 0162 X=0300 Y=01E0 8Bit 017B X=0500 Y=02D0 20Bit 017C X=0780 Y=04B0 8Bit 017D X=0780 Y=04B0 20Bit
hier erstmal der Auszug:
Modus 260 (104h)
Granularitaet: 64
Groesse des Fensters: 64
Fensterbreite: 1024
Anzahl Bitfelder: 4
Bankgroesse: 0
Speichermodeltype: 3Mit dem Modus scheint wohl alles richtig zu sein... Vielleicht hab ich auch nur einen Programmfehler drin
währe nicht das erste mal...
Weiß vielleicht jemand wie ich im PMode auf den gesamten Speicher zugreifen kann?
Gruß, Nicky
Damit man auf den gesamten Speicher zugreifen kann, dafür muss die Segmentlänge erweitert werden.
Beispiel für ein Segment-Eintrag im GDT/LDT:
DW 0FFFFh ; Segmentlänge Bits: 0-15 DW 0 ; Seg.Adresse Bits: 0-15 DB 0 ; Seg.Adresse Bits:16-23 DB 92h ; Zugriffsrechte DB 0FFh ; Seg.Länge Bits:16-19 im Bit0-3//Bit7:1=4KByte/0=1Byte DB 0FFh ; Seg.Adresse Bits:24-31
Im PM läd man dafür ein Segmentregister mit dem entsprechenden Selektor und die 21. Adressleitung muss dann ebenfalls noch angeschaltet werden.
Es würde wohl etwas den Rahmen dieses Threads sprengen alles darüber hier zu erklären....
Anstelle des PM könnte man auch den 16 Bit Unreal Mode/Big Realmode verwenden, um damit auch weiterhin alle DOS/BIOS-Funktionen verwenden zu können.
Daneben kann man ohne das lästige Bankumschalten auf den linearen Framebuffer zugreifen.
Eigentlich sollten nach dem Zurückschalten in den Realmode alle Segmentregister/Schattenegister wieder auf 64 KB begrenzt sein.
Doch beginnend vom Intel 80386, 80486, Pentium, Pentium MMX, Pentium 2, 3, 4, Core2quad und auch diverse Modelle von AMD konnte ich noch keine einzige CPU finden,
die sich laut Spezifikation so verhält (sind wohl sehr viele der handelsüblichen CPUs mit diesem Bug ausgestattet. :p)Ein Beispiel dafür: http://www.alice-dsl.net/freecracmaps/Tool/Neutrip.zip
(Mindest-Anforderung für dieses Demo: Pentium MMX, Grafikkarte mit VBE3-Bios, CRT-Monitor mit 96khz und 100hz Refreshrate in 1024x768x32)Dirk
-
Hallo Dirk,
ich habe eine ATI 3870X2.
Was mich nur wundert ist, das die unterstützten Textmodi nicht angezeigt werden.Das mit dem P-Mode habe ich schon verstanden (habe fleißig bei Herr Henkes gelesen). Darum bin ich auch auf NASM umgestiegen. Jedoch selbst wenn ich im P-Mode währe, blendet die GraKa "nur" 64Kb in den RAM ein. Im Vesa-Bios ist mir keine Funktion bekannt die mehr Speicher einblendet.
Das mit dem UnrealMode klingt gut. Aber erstmal eins fertig bekommen.
Gruß und Danke, Nicky
-
supernicky schrieb:
Hallo Dirk,
ich habe eine ATI 3870X2.
Aha, ich vermute diese Karte hat auch ein VBE3-Bios.
Was mich nur wundert ist, das die unterstützten Textmodi nicht angezeigt werden.
Das mit dem P-Mode habe ich schon verstanden (habe fleißig bei Herr Henkes gelesen). Darum bin ich auch auf NASM umgestiegen. Jedoch selbst wenn ich im P-Mode währe, blendet die GraKa "nur" 64Kb in den RAM ein. Im Vesa-Bios ist mir keine Funktion bekannt die mehr Speicher einblendet.
Im ModeAttributes field(Modeinfo-Buffer) Bit D7 = Linear frame buffer mode is available(0 = No, 1 = Yes) kann man erstmal schauen, ob für den gewünschten Mode ein LFB-Zugriff möglich ist.
The ModeAttributes field is defined as follows: D0 = Mode supported by hardware configuration 0 = Mode not supported in hardware 1 = Mode supported in hardware D1 = 1 (Reserved) D2 = TTY Output functions supported by BIOS 0 = TTY Output functions not supported by BIOS 1 = TTY Output functions supported by BIOS D3 = Monochrome/color mode (see note below) 0 = Monochrome mode 1 = Color mode D4 = Mode type 0 = Text mode 1 = Graphics mode D5 = VGA compatible mode 0 = Yes 1 = No D6 = VGA compatible windowed memory mode is available 0 = Yes 1 = No D7 = Linear frame buffer mode is available 0 = No 1 = Yes D8 = Double scan mode is available 0 = No 1 = Yes D9 = Interlaced mode is available 0 = No 1 = Yes D10 = Hardware triple buffering support 0 = No 1 = Yes D11 = Hardware stereoscopic display support 0 = No 1 = Yes D12 = Dual display start address support 0 = No 1 = Yes D13-D15 = Reserved
Wenn ja, dann kann man die Startadresse des LFBs(Modeinfo-Buffer+28h) auf ungleich Null überprüfen und wenn ungleich Null, dann können wir über diese Adresse den LFB beschreiben.
; Mandatory information for VBE 2.0 and above PhysBasePtr dd ? ; physical address for flat memory frame buffer
Das mit dem UnrealMode klingt gut. Aber erstmal eins fertig bekommen.
Gruß und Danke, Nicky
In meinem Beispiel: http://www.alice-dsl.net/freecracmaps/Tool/Neutrip.zip ist eine Subroutine(mit dem Namen "ESEG") enthalten welche vom RM in den 16 Bit Unrealmode schaltet
und im Hauptprogramm ist im Abschnitt mit der Überschrift "Switch to the 16 Bit unrealmode" es zu sehen, wie man diese Subroutine aufrufen kann.Lediglich diese beiden folgenden Befehle (im Hauptprogramm) kann man dafür weglassen, da sie mit dem Umschalten in den Unrealmode eigentlich nichts zu tun haben und dafür auch nicht nötig sind:
mov al, 2 ; Dissable IRQ 1 out IRQs_Port, al ; (Wird für die Laufzeit zum Pollen der Tastatur ausgeschaltet.)
...
Für den Unrealmode erweitere ich nur DS, um darüber unseren Datenbereich zu erreichen und ebenfalls alle Adressen oberhalb des ersten Megabytes.
Beispiel:mov ebx, LFB_ADRESSE xor eax, eax mov ax, DATENSEGMENT mov ds, ax shl eax, 4 sub ebx, eax mov si, OFFSET PIXEL mov eax, [si] ; DS:SI <- Datensegment mov [ebx], eax ; DS:EBX -> LFB
Dirk
-
Hallo,
habe nun jeden Modus auf das 7. Bit testen lassen.
Das ist bei allen Videomodi gesetzt.
Wenn ich zum Anfang der Struktur 28h rechnen und das Word anzeigen lasse,
erhalte ich bei allen : 4.160.749.568 das ist die Speicherstelle mit exakt
127MB vor dem Ende des 32Bit Adressraumes.Kann das sein?
Bei mir in den Büchern sind nur die ersten 39 Byte der Struktur beschrieben, der Rest ist als Buffer hinterlegt für "spätere" Versionen. Auch habe ich nur VBE 2.0.
vidinfo: modeattrib dw 0 win1attrib db 0 ;+2 win2attrib db 0 ;+3 granularity dw 0 ;+4 winsize dw 0 ;+6 win1seg dw 0 ;+8 win2seg dw 0 ;+10 pointer dd 0 ;+12 byteperline dw 0 ;+16 width dw 0 ;+18 height dw 0 ;+20 wofcbox db 0 ;+22 hofcbox db 0 ;+23 memplanes db 0 ;+24 bpp db 0 ;+25 banks db 0 ;+26 memmodeltype db 0 ;+27 banksize db 0 ;+28 impages db 0 ;+29 res1 db 0 ;+30 rms db 0 ;+31 rmp db 0 ;+32 gms db 0 ;+33 gmp db 0 ;+34 bms db 0 ;+35 bmp db 0 ;+36 resms db 0 ;+37 resmp db 0 ;+38 dcmode db 0 ;+39 res2 times 216 db 0 ;Puffer auffüllen bis auf 256Byte
Eine Sache hab ich noch bemerkt. Ich habe 3 Videomodi mit folgenden Eigenschaften:
Modus 281 Granularitaet: 65535 $Byte pro Linie: 32774 $Groesse des Fensters: 65535 $Startsegment Fenster 1: 65535 $Fensterbreite: 32770 $Fensterhoehe: 36866 $Anzahl Bitfelder: 16 $Bits pro Pixel: 1 $Bankgroesse: 0 $Anzahl der Baenke: 8 $Speichermodeltype: 1 $LFB ja: 0 $
Davon habe ich wie gesagt drei. Und bei diesen dreien ist das Bit 7 im ModeAttrib jedoch nicht gesetzt.
Für Info's bin ich sehr dankbar.
Gruß, Nicky
-
supernicky schrieb:
Hallo,
habe nun jeden Modus auf das 7. Bit testen lassen.
Das ist bei allen Videomodi gesetzt.
Wenn ich zum Anfang der Struktur 28h rechnen und das Word anzeigen lasse,
erhalte ich bei allen : 4.160.749.568 das ist die Speicherstelle mit exakt
127MB vor dem Ende des 32Bit Adressraumes.Kann das sein?
Im Modinfobuffer+28h sollte eine lineare 32 Bit-Adresse enthalten sein und nicht nur ein WORD, sondern ein DWORD. Ich vermute das du es nur hier falsch geschrieben hast.
Bei mir in den Büchern sind nur die ersten 39 Byte der Struktur beschrieben, der Rest ist als Buffer hinterlegt für "spätere" Versionen.
Im vbe3.pdf sind noch weitere Details aufgelistet.
Das vbe3.pdf kann man sich kostenlos von http://www.vesa.org/ aus dem Public-Bereich herunterladen. (Registrieren und/oder Anmelden ist dafür erforderlich.)Auch habe ich nur VBE 2.0.
Das wundert mich zwar etwas, weil eine ältere ATI x800 pro bereits schon ein VBE3-Bios mitbrachte, doch das ist ja eine Sache der GraKa-Herstellers ein passendes Bios bereitzustellen und nicht die Sache der GPU-Hersteller.
So kann man sich eigentlich schon freuen wenn überhaupt noch ein Vesa-Bios mit eingebaut wird. Laut CT-Redaktion kann davon gar nicht mehr ausgegangen werden dass ein VESA-Bios zukünftig immer noch vorhanden ist.Mit einem VBE2-Bios ist es aber auch schon möglich den linaren Framebuffer zu verwenden. Nur das hardware triple buffering, stereoskopische Modi und Modi mit einer eigenen Refreshrate höher als 60hz sind damit nicht möglich, weil erst mit VBE3 verfügbar.
vidinfo: modeattrib dw 0 win1attrib db 0 ;+2 win2attrib db 0 ;+3 granularity dw 0 ;+4 winsize dw 0 ;+6 win1seg dw 0 ;+8 win2seg dw 0 ;+10 pointer dd 0 ;+12 byteperline dw 0 ;+16 width dw 0 ;+18 height dw 0 ;+20 wofcbox db 0 ;+22 hofcbox db 0 ;+23 memplanes db 0 ;+24 bpp db 0 ;+25 banks db 0 ;+26 memmodeltype db 0 ;+27 banksize db 0 ;+28 impages db 0 ;+29 res1 db 0 ;+30 rms db 0 ;+31 rmp db 0 ;+32 gms db 0 ;+33 gmp db 0 ;+34 bms db 0 ;+35 bmp db 0 ;+36 resms db 0 ;+37 resmp db 0 ;+38 dcmode db 0 ;+39 res2 times 216 db 0 ;Puffer auffüllen bis auf 256Byte
Eine Sache hab ich noch bemerkt. Ich habe 3 Videomodi mit folgenden Eigenschaften:
Modus 281 Granularitaet: 65535 $Byte pro Linie: 32774 $Groesse des Fensters: 65535 $Startsegment Fenster 1: 65535 $Fensterbreite: 32770 $Fensterhoehe: 36866 $Anzahl Bitfelder: 16 $Bits pro Pixel: 1 $Bankgroesse: 0 $Anzahl der Baenke: 8 $Speichermodeltype: 1 $LFB ja: 0 $
Davon habe ich wie gesagt drei. Und bei diesen dreien ist das Bit 7 im ModeAttrib jedoch nicht gesetzt.
Für Info's bin ich sehr dankbar.
Gruß, Nicky
Huch nur ein Bit pro Pixel erscheint mir etwas merkwürdig.
Hast du diese Werte unter Windows ermittelt?
Weil Windows emuliert derartige Anfragen und ohne die Intallation eines Grafikkarten-Teibers meldet die Anfrage von Funktion 0 (Vesainfo) das kein VESA-Bios vorhanden sei. Mit installierten Grafikkarten-Teiber konnte ich bisher immer die selben Werte die ich auch unter purem DOS erhalte bekommen. Darauf würde ich mich allerdings nicht verlassen, besonders dann nicht wenn es zu Ungereimtheiten bei den Werten kommt, dann lieber noch einmal unter purem DOS testen.
Dirk
-
Hallo Dirk,
Ja, ich lese ein DWORD aus
was mich aber doch etwas wundert ist, das mein Laptop "nur" 3GB RAM hat, aber jeder Wert vom LFB 4.160.749.568 beträgt. Ist das ein Standardwert oder lese ich falsch aus oder muss hier noch was umgerechnet werden?xor edi, edi mov di, infostruc add di, 28h ausgabe: mov eax, dword [di] call PRINT ;PRINT schreibt die Zahl als ASCII auf den Schirm infostruc times 256 db 0 ;256Byte Buffer für die Daten
Gruß, Nicky
-
supernicky schrieb:
Hallo Dirk,
Ja, ich lese ein DWORD aus
Ok.
was mich aber doch etwas wundert ist, das mein Laptop "nur" 3GB RAM hat, aber jeder Wert vom LFB 4.160.749.568 beträgt. Ist das ein Standardwert oder lese ich falsch aus oder muss hier noch was umgerechnet werden?
Die Adresse wird wohl stimmen.
Der LFB blendet sich meistens im obersten Gigabyte ein, auch dann wenn dort kein physikalischer RAM vorhanden ist und dort wo der LFB sich einblendet, dort kann man den darunter liegenden RAM eh nicht verwenden falls vorhanden.
Ich habe bisher für alle VESA-Modi einer Karte immer nur die selbe LFB-Adresse gefunden, die aber je nach verwendeter Karte variieren kann.
Die Adresse des LFB ist vermutlich wohl auch davon abhängig welche Hardware-Komponenten noch vorhanden sind, die ebenfalls im obersten Gigabyte einen Platz beanspruchen und das dann mit dem BIOS vom Mainbaord aushandeln welche Bereiche dafür belegt werden.
Möglicherweise kann eine Grafikkarte in einem anderen Mainboard verwendet einen andere Adresse für den LFB bekommen. Konkrete Infos habe ich darüber aber auch nicht, es ist somit nur eine Vermutung von mir.Dirk