Autor Thema: Assembler, Auflösung höher als 1600x1200x24  (Gelesen 7233 mal)

aletes

  • Beiträge: 43
    • Profil anzeigen
Gespeichert
« am: 26. July 2011, 15:10 »
Hi

Vorab: Ich arbeite im Moment eigentlich gar nicht mit Assembler, muss aber für ein Projekt dringend wissen, wie ich in den Bildschirmmodus wechseln kann, welcher mir eine höhere Auflösung als 1600x1200 Pixel liefert, und mit dem ich auch Truecolor habe. Ich weiß, dass ich mit int 10h und der Funktion 4Fh in den Bildschirmmodus wechseln kann, aber diesem Link nach zu urteilen kann ich weder Truecolor nutzen noch habe ich mehr als 1600x1200 Pixel zur Verfügung. Was mache ich also, wenn ich 1920x1080 oder 1680x1080 haben möchte?

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 26. July 2011, 15:19 »
Hallo,


bei solchen Wünschen solltest Du dich an VBE halten, da gibt es nicht nur vordefinierte Modi sondern man kann auch eine Liste der unterstützten Modi auslesen und sich daraus einen aussuchen. Du kannst aber nicht davon ausgehen das eine bestimmte von Dir gewünschte Auflösung überall unterstützt wird (ein alter Laptop mit nur XGA-Display wird nichts liefern was über 1024x768 hinaus geht).


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

aletes

  • Beiträge: 43
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 26. July 2011, 15:26 »
Danke für die Antwort  :wink:

Nun, das ist ja genau das was ich nicht wollte. Dass ich dies bereits kenne habe ich bereits geschrieben. Aber wie komme ich jetzt an höhere Auflösungen als 1600x1200 ran?

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 26. July 2011, 15:54 »
Hallo,


VBE listet natürlich nur die Modi die auch unterstützt werden, da kann es leider auch mal vorkommen das die BIOS-Programmierer nicht ganz so weit sind wie die Treiber-Programmierer für Windows. Außerdem wird eventuell (möglicherweise fehlerhaft) auch berücksichtigt was der angeschlossene Monitor unterstützt.
In meinem privaten Laptop steckt ein Display mit 1920x1200 und das VBE listet diese Auflösung auch, selbst mit 32 Bit Color-Mode, und alle möglichen kleineren Auflösungen auch aber definitiv keine größeren Auflösungen.
Auflösungen die in dieser Liste nicht drin sind kannst Du leider nicht (so ohne weiteres) benutzen.


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

MNemo

  • Beiträge: 547
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 26. July 2011, 15:57 »
Hast du den Absatz unter der Tabelle nicht gelesen, oder liefert dir die Funktion nur auflösungen kleiner als 1600×1200×24. Bei letzterem wird dir wohl keine andere möglichkeit bleiben als richtige Grafik-Treiber (kein VESA) zu nutzen/schreiben.

Was TrueColor betrifft: Ist doch sogar in der tablle aufgelistet 1600×1200×24 oder was verstehst du unter TrueColor?
„Wichtig ist nicht, besser zu sein als alle anderen. Wichtig ist, besser zu sein als du gestern warst!“

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 26. July 2011, 17:18 »
Es gibt drei Möglichkeiten:

(a) Du nimmst die vordefinierten BIOS-Modi und den int 10h. Das sind VGA- und VESA-Modi. Größer als 1600x1200 geht allerdings nicht... du kannst natürlich auch nur die Modi benutzen, die das Video-BIOS bereitstellt. Teilweise sind das echt wenig. Nichts für dich. ;-)

(b) Du implementierst einen Grafiktreiber, der Modesetting unterstützt. Dann darfst du die Video-Timings selbst einstellen und kriegst beliebige Auflösungen. Viel Arbeit. ;-)

(c) Du implementierst einen kompletten VBE-Treiber (auch int 10h). Das heißt, du fragst das Video-BIOS nach den unterstützten Auflösungen und kriegst eine Liste davon zurück, die du dann benutzen kannst. Teilweise sind das echt wenig. Wenn du Glück hast, ist deine Wunschauflösung dabei und du hast gewonnen. Sonst hast du verloren.

Gruß,
Svenska

aletes

  • Beiträge: 43
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 27. July 2011, 10:50 »
Hm, ok. Ich probiere es mal mit (c). Danke an alle

freecrac

  • Beiträge: 86
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 27. July 2011, 14:12 »
(a) Du nimmst die vordefinierten BIOS-Modi und den int 10h. Das sind VGA- und VESA-Modi. Größer als 1600x1200 geht allerdings nicht...
Das VBE-Bios auf meiner Colorfull GTX 295 und das VBE-Bios auf erik laptop unterstützt doch auch 1920x1200x32.

VesaInfo.bat
@echo off
echo e cs:0100>tmp.deb
echo B8 00 4F BF 00 02 CD 10>>tmp.deb
echo g=cs:0100 0108>>tmp.deb
echo d cs:0200>>tmp.deb
echo q>>tmp.deb
debug <tmp.deb >Vesa.info
del tmp.deb

[Vesa.info von Colorfull GTX 295]
-e cs:0100

1537:0100 00.B8 00.00 00.4f 00.BF 00.00 00.02 00.CD 00.10

-g=cs:0100 0108


AX=004F BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0200
DS=1537 ES=1537 SS=1537 CS=1537 IP=0108 NV UP EI PL NZ NA PO NC
1537:0108 0000 ADD [BX+SI],AL DS:0000=CD
-d cs:200

1537:0200 56 45 53 41 00 03 1E B5-00 C0 01 00 00 00 22 02 VESA..........".
1537:0210 37 15 E0 00 00 00 00 00-00 00 00 00 00 00 00 00 7...............
1537:0220 00 00 00 01 01 01 02 01-03 01 04 01 05 01 06 01 ................
1537:0230 07 01 0E 01 0F 01 11 01-12 01 14 01 15 01 17 01 ................
1537:0240 18 01 1A 01 1B 01 30 01-31 01 32 01 33 01 34 01 ......0.1.2.3.4.
1537:0250 35 01 36 01 3D 01 3E 01-45 01 46 01 4A 01 60 01 5.6.=.>.E.F.J.`.
1537:0260 61 01 62 01 66 01 67 01-70 01 7B 01 7C 01 7D 01 a.b.f.g.p.{.|.}.
1537:0270 FF FF 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................
-q

Die Modeliste habe ich rot markiert und blau den Pointer der auf die Modeliste zeigt.

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
(alle Werte sind hexadezimal)

Edit:
Quelle: vbe3.pdf von vesa.org (Zum Downloaden registrieren und/oder einloggen nötig.)
VESA PUBLIC STANDARDS DOWNLOAD REGISTRATION: https://fs16.formsite.com/VESA/form714826558/secure_index.html

Dirk
« Letzte Änderung: 27. July 2011, 15:19 von freecrac »

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 27. July 2011, 14:37 »
Hallo,


Das VBE-Bios auf meiner Colorfull GTX 295 und das VBE-Bios auf erik laptop unterstützt doch auch 1920x1200x32.
Ja, aber nicht im Rahmen der vordefinierten Modi. Alles interessante ist nur über Weg (c) erreichbar (wenn wir mal Web (b) außer acht lassen). In Deiner Tabelle fangen die interessanten Modi auch erst bei 0130 an.


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 27. July 2011, 14:38 »
(a) Du nimmst die vordefinierten BIOS-Modi und den int 10h. Das sind VGA- und VESA-Modi. Größer als 1600x1200 geht allerdings nicht...
Das VBE-Bios auf meiner Colorfull GTX 295 und das VBE-Bios auf erik laptop unterstützt doch auch 1920x1200x32.
Das sind aber nicht die vordefinierten (standardisierten) VESA-Modi, sondern vom Grafikkartenhersteller dort eingetragene nicht-standard-Modi.

Ehe ich mit Debug rumspiele, um an die Liste zu kommen, hätte ich direkt einen Linux-Kernel mit dem Parameter "vga=ask" gebootet, dann zeigt der nämlich alle im Grafik-BIOS vorhandenen Modi an und man kann sie auch einfach eintragen. Das geschieht sogar, bevor der eigentliche Kernel bootet.

Ansonsten ist deine Lösung ziemlich technisch (die Angaben "10 Bit" und "20 Bit" betrachte ich mal als fehlerhafte Bit-Dekodierung, das sollen bestimmt 16 Bit bzw. 32 Bit Farbtiefe sein...) ;-)

Gruß,
Svenska

freecrac

  • Beiträge: 86
    • Profil anzeigen
Gespeichert
« Antwort #10 am: 27. July 2011, 15:09 »
(a) Du nimmst die vordefinierten BIOS-Modi und den int 10h. Das sind VGA- und VESA-Modi. Größer als 1600x1200 geht allerdings nicht...
Das VBE-Bios auf meiner Colorfull GTX 295 und das VBE-Bios auf erik laptop unterstützt doch auch 1920x1200x32.
Das sind aber nicht die vordefinierten (standardisierten) VESA-Modi, sondern vom Grafikkartenhersteller dort eingetragene nicht-standard-Modi.

Ehe ich mit Debug rumspiele, um an die Liste zu kommen, hätte ich direkt einen Linux-Kernel mit dem Parameter "vga=ask" gebootet, dann zeigt der nämlich alle im Grafik-BIOS vorhandenen Modi an und man kann sie auch einfach eintragen. Das geschieht sogar, bevor der eigentliche Kernel bootet.

Ansonsten ist deine Lösung ziemlich technisch (die Angaben "10 Bit" und "20 Bit" betrachte ich mal als fehlerhafte Bit-Dekodierung, das sollen bestimmt 16 Bit bzw. 32 Bit Farbtiefe sein...) ;-)

Gruß,
Svenska

Bitte auch das kleingedruckte lesen: (alle Werte sind hexadezimal).

vbe3.pdf: Starting with VBE version 2.0, VESA will no longer define new VESA mode numbers and it will no longer be mandatory to support these old mode numbers.

Diese alte Mode-Liste wird ofiziel nur bis VBE 1.X unterstützt:

 100h   640x400x256
 101h   640x480x256
 102h   800x600x16
 103h   800x600x256
 104h   1024x768x16
 105h   1024x768x256
 106h   1280x1024x16
 107h   1280x1024x256
 108h   80x60 text
 109h   132x25 text
 10Ah   132x43 text
 10Bh   132x50 text
 10Ch   132x60 text
---VBE v1.2---
 10Dh   320x200x32K
 10Eh   320x200x64K
 10Fh   320x200x16M
 110h   640x480x32K
 111h   640x480x64K
 112h   640x480x16M
 113h   800x600x32K
 114h   800x600x64K
 115h   800x600x16M
 116h   1024x768x32K
 117h   1024x768x64K
 118h   1024x768x16M
 119h   1280x1024x32K
 11Ah   1280x1024x64K
 11Bh   1280x1024x16M

Bei VBE2 und VBE3 ist es nicht sicher ob es die alte Nummern noch gibt, oder eine andere Auflösung besitzen.

Edit:
Sorry, das abc-zitieren muss ich noch lernen.

Es wäre doch etwas unpraktisch dafür neu zu booten während ich einen Beitrag schreibe.
Ich habe die Batchdatei schnell unter XP geschrieben und während ich den Beitrag schrieb sie ausgeführt, um das Ergebniss(Inhalt von Vesa.info-Datei) dann mit einzufügen.

In Deiner Tabelle fangen die interessanten Modi auch erst bei 0130 an
Das stimmt leider, aber verwenden tue ich meist nur 1920x1200x32 native Auflösung meines LCD und kleinere Modi sehen damit eher bescheiden aus.

Dirk
« Letzte Änderung: 27. July 2011, 15:58 von freecrac »

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 27. July 2011, 18:42 »
Hallo,


.... and it will no longer be mandatory to support these old mode numbers.
Ein Grund mehr sich auf Weg (c) zu konzentrieren. Je nach dem welche Priorität bei neuen Graphikkarten noch das BIOS genießt kann es also durchaus sein das da nicht mehr viel geht und man eh die individuelle Liste auslesen muss. Der Großteil aller Graphikkarten der letzten 10 Jahre hat wimre VBE 2.0 (das solltest Du auch immer prüfen bevor Du weitere Funktionen benutzt!).

Ich habe die Batchdatei schnell unter XP geschrieben und während ich den Beitrag schrieb sie ausgeführt, um das Ergebniss(Inhalt von Vesa.info-Datei) dann mit einzufügen.
Na hoffentlich sind das dann auch die echten VESA-Modi die Dir da der DOS-Emulator von Windows XP angeboten hat, wenn Du diese Information korrekt möchtest dann mach das unter purem DOS oder nutze Svenskas Vorschlag mit dem Linux-Kernel (ich vermute mal eine beliebige Linux-CD reicht aus um das hinzubekommen).

In Deiner Tabelle fangen die interessanten Modi auch erst bei 0130 an
Das stimmt leider ....
Ja und das bedeutet das Du da nur mit Weg (c) dran kommst.


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

freecrac

  • Beiträge: 86
    • Profil anzeigen
Gespeichert
« Antwort #12 am: 28. July 2011, 08:19 »
Hallo,


.... and it will no longer be mandatory to support these old mode numbers.
Ein Grund mehr sich auf Weg (c) zu konzentrieren. Je nach dem welche Priorität bei neuen Graphikkarten noch das BIOS genießt kann es also durchaus sein das da nicht mehr viel geht und man eh die individuelle Liste auslesen muss. Der Großteil aller Graphikkarten der letzten 10 Jahre hat wimre VBE 2.0 (das solltest Du auch immer prüfen bevor Du weitere Funktionen benutzt!).

Ja genau.

Zitat
Ich habe die Batchdatei schnell unter XP geschrieben und während ich den Beitrag schrieb sie ausgeführt, um das Ergebniss(Inhalt von Vesa.info-Datei) dann mit einzufügen.
Na hoffentlich sind das dann auch die echten VESA-Modi die Dir da der DOS-Emulator von Windows XP angeboten hat,

Ohne GraKa-Treiber(unmitttelbar nach der Windowsinstallation) stimmen die Einträge aus Funktion 4F00h nicht. Aber wenn ein GraKa-Treiber installiert ist, dann werden auch die InIformationen aus Funktion 4F00h und 4F01h richtig emuliert. Mit Win2K konnte man sogar die EDID(4F15h) holen, mit XP geht es nicht mehr.

Zitat
wenn Du diese Information korrekt möchtest dann mach das unter purem DOS oder nutze Svenskas Vorschlag mit dem Linux-Kernel (ich vermute mal eine beliebige Linux-CD reicht aus um das hinzubekommen).

Danke. aber die Informationen stimmen schon und sind mit denen unter puren DOS identisch. Du kannst es ja selber ausprobieren, wenn du ein XP installiert hast.

Dirk
« Letzte Änderung: 28. July 2011, 08:29 von freecrac »

 

Einloggen