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