Autor Thema: VESA Informationen zum Grafikmodus abfragen  (Gelesen 15005 mal)

üäpöol

  • Beiträge: 110
    • Profil anzeigen
Gespeichert
« Antwort #20 am: 12. June 2012, 13:25 »
Das habe ich auch schon einmal versucht. Ändert leider nicht wirklich etwas. Nur, dass eine grüne Linie gezeichnet wird. (nur in Bochs). Es soll aber ein kleines grünes Quadrat (an einer anderen Stelle) und ein großes weißen Rechteck gezeichnet werden. Mit VirtualBox gibt es aber wie immer kein Problem ...

EDIT:
Vielleicht liegt es am bochssrc:
# configuration file generated by Bochs
plugin_ctrl: unmapped=1, biosdev=1, speaker=1, extfpuirq=1, gameport=1
config_interface: win32config
display_library: win32
memory: host=32, guest=32
romimage: file=Bochs-2.5.1/BIOS-bochs-latest
vgaromimage: file=Bochs-2.5.1/VGABIOS-lgpl-latest
vga: extension=vbe, update_freq=10
boot: floppy
floppy_bootsig_check: disabled=0
floppya: type=1_44, 1_44="..\..\files\OS.img", status=inserted, write_protected=0
ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15
ata2: enabled=0
ata3: enabled=0
parport1: enabled=1, file=""
parport2: enabled=0
com1: enabled=1, mode=null, dev=""
com2: enabled=0
com3: enabled=0
com4: enabled=0
usb_uhci: enabled=0
usb_ohci: enabled=0
usb_xhci: enabled=0
pci: enabled=1, chipset=i440fx
vga: extension=vbe, update_freq=5
cpu: count=1, ips=4000000, model=bx_generic, reset_on_triple_fault=0, cpuid_limit_winnt=0, ignore_bad_msrs=1
cpuid: family=6, model=0x03, stepping=3, mmx=1, apic=xapic, sse=sse2, sse4a=0, sep=1, aes=0, xsave=0, xsaveopt=0, movbe=0, smep=0, x86_64=1, 1g_pages=0, pcid=0, fsgsbase=0, mwait=1, mwait_is_nop=0
cpuid: vendor_string="GenuineIntel"
cpuid: brand_string="              Intel(R) Pentium(R) 4 CPU        "

print_timestamps: enabled=0
port_e9_hack: enabled=0
private_colormap: enabled=0
clock: sync=realtime, time0=local
# no cmosimage
ne2k: enabled=1, ioaddr=0x300, irq=9, mac=fe:fd:de:ad:be:ef, ethmod=null, ethdev=xl0, script=none
pnic: enabled=0
sb16: enabled=1, midimode=0, midi=, wavemode=0, wave=, loglevel=0, log=, dmatimer=0
es1370: enabled=0
# no loader
log: log.bochs
logprefix: %t%e%d
panic: action=report
error: action=report
info: action=report
debug: action=report
keyboard_type: mf
keyboard_serial_delay: 250
keyboard_paste_delay: 100000
keyboard_mapping: enabled=0, map=
user_shortcut: keys=none
mouse: enabled=0, type=ps2, toggle=ctrl+mbutton

EDIT2:
Ich hab's rausbekommen. :)
or bx, 0100000000000000b
...
Bit 14 muss natürlich gesetzt sein. Vermutlich macht VirtualBox das automatisch. Nur QEMU zeichnet nichts. Muss ich da noch irgendetwas einstellen?
EDIT3:
QEMU hatte ein Problem mit LinBytesPerScanLine. Deshalb habe ich das einfach per Hand mit BitsPerPixel/8*ScreenWidth ausgerechnet. Jetzt funktioniert alles. :) Vielen Dank für eure Hilfe!
« Letzte Änderung: 12. June 2012, 15:38 von üäpöol »

üäpöol

  • Beiträge: 110
    • Profil anzeigen
Gespeichert
« Antwort #21 am: 15. June 2012, 16:54 »
Ich habe noch ein (kleines) Problem: Bochs hat eine zu hohe Auflösung. :D Mein PC ist 1280*1024 groß. Bochs zeigt aber unglaubliche 2560*1600 an. Jetzt wird nur die Hälfte angezeigt. Gibt es dafür eine andere Lösung, als temporär die Auflösung zu begrenzen?

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #22 am: 17. June 2012, 17:40 »
Meinen Hinweis hast du ja angemessen ignoriert.
Lies ihn einfach nochmal, Post vom 10.06., 19:34 Uhr. ;-)

üäpöol

  • Beiträge: 110
    • Profil anzeigen
Gespeichert
« Antwort #23 am: 17. June 2012, 19:22 »
Tut mir Leid. :oops: Das Problem hat sich sowieso von selbst erledigt, da ich jetzt einen PC mit höherer Auflösung habe. Danke.

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #24 am: 17. June 2012, 20:00 »
Damit hast du auch das Problem erfolgreich ignoriert...

Nicht jeder hat einen Bildschirm, der 1920x1080 darstellen kann, selbst dann, wenn die Grafikkarte damit wirbt. Viel schlimmer: Es gibt Bildschirme, die kaputt gehen, wenn man solche Auflösungen einfach mal draufwirft. (Wobei die inzwischen entweder 20 Jahre alt oder spezielle Geräte, z.B. Medizintechnik sein dürften. Ändert aber nichts am Fakt.)

Das zieht sich aber durch fast alle Hardware. Du kannst nicht einfach mal drauf rumbasteln und gucken, ob der Emulator deiner Wahl das schluckt. Der Code funktioniert dann halt im Emulator nicht oder der Emulator stürzt ab, im Extremfall vielleicht auch der Host. Aber echte Hardware könnte auf komische Dinge mit Rauchzeichen oder anderen dauerhaften Defekten (gelöschtes Kalibrier-EEPROM oder ähnliches) reagieren.

"Ich hab jetzt einen Computer, wo es geht" ist meist eine sehr schlechte Lösung. Gucke dir DDC an, stell sinnvolle Standardwerte ein (z.B. Xorg hat die Auflösung, wenn kein Autodetect geht, erst vor relativ kurzer Zeit von 800x600 auf 1024x768(!) gestellt, manche Treiber defaulten auf 640x480.) und mach die Werte einstellbar. Wenn dein System beim ersten Start sagt, dass der Bildschirm nicht erkannt wurde und du bitte eine Auflösung angeben sollst, wird dir keiner den Kopf abreißen. Windows tut das übrigens genauso bei der Installation: "Können Sie diesen Text lesen? [ Ja ] [ Nein ]".

Denk mal drüber nach.

Gruß,
Svenska

freecrac

  • Beiträge: 86
    • Profil anzeigen
Gespeichert
« Antwort #25 am: 20. June 2012, 12:39 »
Die Adresse der ModeList besteht aus Offset und Segment.
Function 00h - Return VBE Controller Information; Buffer + 0Eh = VideoModePtr dd ? ; VbeFarPtr to VideoModeList

Im Unterschied dazu ist die Adresse des LFBs eine lineare Adresse.
Function 01h - Return VBE Mode Information; Buffer + 28h PhysBasePtr dd ? ; physical address for flat memory frame buffer

...

Um zu überprüfen welche Kapazität unser Monitor verträgt könnte man auch dessen maximal zulässige KHZ und HZ abfragen.

  mov      ax, 4F15h           ; DDC - INSTALLATION CHECK
  xor      bl, bl
  int    10h
  cmp      ax, 4Fh
  jnz NODDC

  mov      ax, 4F15h           ; DDC - READ EDID
  mov      bl, 1
  xor      cx, cx
  xor      dx, dx
  mov      di, OFFSET EDID     ; es:di 128 byte
  int    10h
  cmp      ax, 4Fh
  jnz short NODDC
  mov      eax, 0FD000000h     ; Text-identifier V/H range
  mov      bx, 36h
  cmp      eax, [di+bx]        ; di+36h detailed timing #1
  jz  short RANGE
  lea      bx, [bx+12h]
  cmp      eax, [di+bx]        ; di+48h detailed timing #2
  jz  short RANGE
  lea      bx, [bx+12h]
  cmp      eax, [di+bx]        ; di+5Ah detailed timing #3
  jz  short RANGE
  lea      bx, [bx+12h]
  cmp      eax, [di+bx]        ; di+6Ch detailed timing #4
  jnz short NODDC

RANGE:    mov      al, [di+bx+6]       ; MAXHZ
  mov      dl, [di+bx+8]       ; MAXKHZ

Quelle: "EEDIDguideV1.pdf" von vesa.org

..

Eine beste Auflösung findet man wohl, wenn das "Feature Support Byte" im EDID-Buffer+18h auf 1 gesetzt ist und unser "Prefered Timing Mode"(GTF standard frequency range) in den Detailed Timing Position Offset 36h - 47h zu finden ist.

Ab VBE3 kann man dann die vorhandenen Vesamodi mit einem eigenen Video-Timing einschalten, wenn mehr als nur 60 hz Refreschrate benötigt werden.
Quelle: "vbe3.pdf" von vesa.org

Z.B. für 1280x1024@85 Hz Refreshrate:
;  1280x1024@85 Hz
;---------------------
CRTC    DW 1728                       ; horizontal Total       in Pixel
HORIANF DW 1336                       ; horizontal  Sync-Start in Pixel
HORIEND DW 208                        ; horizontal  Sync-End   in Pixel
VERTOTA DW 1072                       ; vertical   Total       in Lines
VERTANF DW 1024                       ; vertical    Sync-Start in Lines
VERTEND DW 44                         ; vertical    Sync-End   in Lines
DOIFLAG DB 0                          ; Flag (interlaced,doubleScan,polarity)
PIXCLOC DD 157498000                  ; Pixel clock in hz (zusätzlich müssen wir vorher Get/Set Pixelclock (Function 4F0Bh) verwenden)
REFRATE DW 8502                       ; Refresh-Rate in 0.01 hz
        DB 40 dup (0)                 ; reserved
;---------------------

Für Experimente (auf eigene Gefahr) eignet sich ein analoger CRT-Monitor der sich bei falschen Einstellungen selber abschaltet und eine "Out of Sync" -Fehlermeldung, oder änhlichen Fehlertext onscreen anzeigt, falls unser Pixelclock dazu nicht richtig eingestellt wurde, oder wir die Parameter falsch berechnet haben...etc..

Wie wäre es mit einer Sinus-Tabelle zu arbeiten?
          Grad    = 360 * 2
          Endtab  = 450 * 2
          Foktor  = 10000h

SINTAB DB Endtab DUP (?,?,?,?)
TEIL   DW Grad/2, ?
I      DW 0, 0
FAKT   DD Foktor

TABLE:    xor     di, di              ; Sinus-Tabelle anlegen
TAB:      fldpi                       ; PI laden
          fimul  DWORD PTR[I]         ; Zaehler mal PI
          fidiv  DWORD PTR[TEIL]      ; durch 180(INT) teilen
          fsin                        ; davon den Sinus
          fimul  DWORD PTR[FAKT]
          fistp  DWORD PTR[di]        ; in die Sinus-Tabelle schreiben
;-------------------------------------
          inc    WORD PTR[I]          ; Grad-Zähler erhöhen
          add     di, 4               ; Tabellen-Index erhöhen
          cmp    WORD PTR[I], Endtab  ;  Tabellen-Ende erreicht ?
          jnz TAB

Dirk
« Letzte Änderung: 20. June 2012, 15:51 von freecrac »

Dimension

  • Beiträge: 155
    • Profil anzeigen
Gespeichert
« Antwort #26 am: 20. June 2012, 19:20 »
Ich habe alle CRT aus meiner Umgebung entfernt.

EDIT: sie sind sperrig und verbrauchen mehr Strom...
« Letzte Änderung: 21. June 2012, 09:41 von Dimension »

freecrac

  • Beiträge: 86
    • Profil anzeigen
Gespeichert
« Antwort #27 am: 21. June 2012, 00:50 »
Ich habe alle CRT aus meiner Umgebung entfernt.
Bis auf eine 19" Röhre habe ich das auch gemacht. Beim Testen eines Vesamodes mit 1024x768x32 und mit eigenen Bildparameter für 100 hz Refreshrate schaltet mein LCD diesen Mode aber mit 60hz Refreshrate ein und ignoriert die angegebenen Parameter mit der höheren Refreschrate und dem dafür höheren vorgesehenen Pixeltakt einfach.

Ich vermute mal wenn ein 100hz-LCD-Monitor verwendet wird, dann wird jeder hohe Vesamode auch ohne die Übergabe eines CRT-Parameter-Blöck in 100 hz angezeigt.
Ich habe leider noch kein 100hz-LCD-Monitor, um das mal auzutesten. Weiss jemand darüber Etwas genaueres?

Dirk

 

Einloggen