drzeissler hat geschrieben:PS: 101h : 640x480 256-colour
Seit VBE 2 kann man sich aber nicht mehr wirklich darauf verlassen, das diese Nummer bei jedem VBE2-Bios, oder VBE3-Bios für die Auflösung von 640x480 mit 256 Farben vorhanden ist, oder ob eine andere Nummen dafür verwendet werden muss, um diese Auflösung von 640x480 mit 256 Farben zu bekommen.
Weil seit VBE2 hat das VBE-Bios eine eigene Modeliste mit Modenummern die man Nummer für Nummer auslesen kann und mit der man mit der jeweiligen Nummer die Video-Mode spezifischen Informationen abrufen kann, um herauszufinden welche Eigenschaften der jeweilge Video-Mode hat und ob er z.B. die gewünsachte Auflösung mitbringt. Auf diese Weise kann man die Mode-Nummern jeweils überprüfen, bis man die gewünschte Auflösung gefunden hat.
Nun können wir mit der gefundenen Nummen den Videomode einschalten.
Hier habe ich ein kleines Programm (bzw. den vollständigen Quelltext davon) womit alle Modenummern eines VBE2- und VBE3-Bios ausgelesen und am Bildschirm (im Textmode bleibend) aufgelistet und ausgegeben werden.
Dafür wird zunächst Funktion 0 aufgerufen, um dort den Zeiger auf die Modeliste zu holen und darüber die Modenummen zu bekommen und dann wird mit jeder Nummer Funktion 1 aufgerufen, um die Eigenschaften(nur einige davon) des jeweiligen Mode auszulesen und am Bildschirm auszugeben.
Code: Alles auswählen
.MODEL SMALL ; Programm möglichst klein halten
.386
CODE SEGMENT use16 'CODE'
assume cs:CODE,ds:DATEN,ss:STAPEL
org 100h
START: mov ax, DATEN ; Segmentadresse vom Datenbereich
mov ds, ax ; in das DS-Segmentregister laden
mov es, ax ; in das ES-Segmentregister laden
mov di, OFFSET VINF ; OFFSET für ausgewählten Datenbereich (512 Bytes)
mov ax, 4F00h ; Vesa Funktionsnummer 0 Vesa-Bios-Info
int 10h ; holt 512 Bytes nach es:di (Datensegment:VINF)
cmp ax, 4Fh ; Wenn Rückgabewert "4F", dann war Funktion erfolgreich
jnz NOVESA ; sonst FEHLER: Kein Vesabios vorhanden
mov dl, [di+5] ; Major version number of Vesa über ds:di+5 in das dl-Register holen
cmp dl, 2 ; kleiner als Version 2 ?
jb VESA1 ; wenn ja FEHLER: Keine Modeliste vorhanden.
mov dx, OFFSET HEADER
mov ah, 9
int 21h
lfs si, [di+0Eh] ; Pointer der Modeliste über ds:di+E ins fs-Segmentregister und si-Offsetregister laden
MODE: mov cx, fs:[si] ; Modenummern über fs:si ins cx-register holen
add si, 2 ; Qell-Adresszeiger(Offset) erhöhen
cmp cx, 0FFFFh ; Ende der Liste erreicht?
jz MEND
mov ax, cx
call HEXOUT16 ; Modenummer ausgeben
mov ax, 4F01h ; Modus spezifische Info holen
mov di, OFFSET MINF
int 10h ; es:di 256 byte
cmp ax, 4Fh
jnz short NOVESA ; FEHLER: wird nicht unterstützt
mov ax, [di+12h] ; MaxX
call DEZOUT16
mov dx, OFFSET X
mov ah, 9
int 21h
mov ax, [di+14h] ; MaxY
call DEZOUT16
mov dx, OFFSET X
mov ah, 9
int 21h
xor ax, ax
mov al, [di+19h] ; Bit per pixel?
call DEZOUT16
mov dx, OFFSET SPACE
mov ah, 9
int 21h
and BYTE PTR[di], 80h ; linear access enable ?
jz short NOLIN
mov eax, [di+28h] ; linearer Bild-Offset vorhanden ?
call HEXOUT32
NOLIN: mov dx, OFFSET CRLF
mov ah, 9
int 21h
jmp MODE
;-------------------------------------
org START + ((($-START)/16)*16)+16 ; Code-Ausrichtung
;-------------------------------------
NOVESA: mov dx, OFFSET T1
mov ah, 9
int 21h
mov cl, 0FFh
jmp short ERREND
;-------------------------------------
org START + ((($-START)/16)*16)+16 ; Code-Ausrichtung
;-------------------------------------
VESA1: mov dx, OFFSET T2
mov ah, 9
int 21h
mov cl, 1
jmp short ERREND
;-------------------------------------
org START + ((($-START)/16)*16)+16 ; Code-Ausrichtung
;-------------------------------------
MEND: xor cl, cl
ERREND: mov al, cl ; ERRORLEVEL holen
mov ah, 4Ch ; Rücksprung zu DOS, Programm-Ende
int 21h
;----------------------------------------------------------------------------
; AX nach fünf dezimalen ASCII's wandeln und im Daten-Bereich ablegen
;----------------------------------------------------------------------------
org START + ((($-START)/16)*16)+16 ; Code-Ausrichtung
;-------------------------------------
DEZOUT16: pusha
mov di, OFFSET DEZ16
mov cl, 5 ; fünf dezimale ASCII's
mov bx, 10000
WANDEL: xor dx, dx
div bx
add al, 30h ; nach ASCII wandeln
mov si, dx ; Rest retten
mov [di], al ; Ziffer retten
inc di ; Zeiger erhöhen
mov ax, bx
mov bx, 0Ah
xor dx, dx
div bx
mov bx, ax
mov ax, si
dec cl
jnz WANDEL
;-------------------------------------
mov si, OFFSET DEZ16 -1 ; erste(n) Null(en) überlesen
mov dx, si
inc dx
NULL: inc si
cmp BYTE PTR[si], "0"
jz NULL
sub si, 5
cmp si, dx
jz short AUSG ; keine null vorhanden !
add si, 5
mov dx, si
AUSG: mov ah, 9 ; dezimale Zahl ausgeben
int 21h
popa
ret
;----------------------------------------------------------------------------
; EAX nach acht hexadezimale ASCII's wandeln und im Daten-Bereich ablegen
;----------------------------------------------------------------------------
org START + ((($-START)/16)*16)+16 ; Code-Ausrichtung
;-------------------------------------
HEXOUT32: pusha
mov di, OFFSET HEX32 ; Doppel-Word nach Hex-Ziffern wandeln
mov cl, 8 ; 8 Ziffern
A: rol eax, 4 ; 1 Nibble weiter
mov bl, al
and bl, 0Fh ; nur low-Nibble
add bl, 30h ; nach ASCII wandeln
cmp bl, 39h ; größer als Ziffer neun ?
jna short B
add bl, 7 ; dann Buchstabe von "A" bis "F"
B: mov [di], bl ; ASCII retten
inc di ; Zeiger erhöhen
dec cl ; Ziffer-Anzahl verringern
jnz A
;-------------------------------------
mov dx, OFFSET HEX32
mov ah, 9 ; hexadezimale Zahl ausgeben
int 21h
popa
ret
;----------------------------------------------------------------------------
; AX nach vier hexadezimale ASCII's wandeln und im Daten-Bereich ablegen
;----------------------------------------------------------------------------
org START + ((($-START)/16)*16)+16 ; Code-Ausrichtung
;-------------------------------------
HEXOUT16: pusha
mov di, OFFSET HEX16 ; Word nach Hex-Ziffern wandeln
mov cl, 4 ; 4 Ziffern
C: rol ax, 4 ; 1 Nibble weiter
mov bl, al
and bl, 0Fh ; nur low-Nibble
add bl, 30h ; nach ASCII wandeln
cmp bl, 39h ; größer als Ziffer neun ?
jna short D
add bl, 7 ; dann Buchstabe von "A" bis "F"
D: mov [di], bl ; ASCII retten
inc di ; Zeiger erhöhen
dec cl ; Ziffer-Anzahl verringern
jnz C
;-------------------------------------
mov dx, OFFSET HEX16
mov ah, 9 ; hexadezimale Zahl ausgeben
int 21h
popa
ret
CODE ends
;----------------------------------------------------------------------------
DATEN SEGMENT use32 'DATA'
;-------------------------------------
VINF DB 512 dup (0AAh) ; Vesa-Info(4F00)
MINF DB 512 dup (44h) ; Mode-Info(4F01)
DEZ16 DB "00000","$"
HEX32 DB "00000000 ","$"
HEX16 DB "0000 ","$"
HEADER DB "Vesamode,XRes,YRes,Bits per Pixel,Adresse des Framebuffer",0Dh,0Ah,"$"
CRLF DB 0Dh,0Ah,"$"
X DB "x","$"
SPACE DB " ","$"
T1 DB "Kein Vesabios vorhanden.", 0Dh, 0Ah, "$"
T2 DB "Keine Modeliste vorhanden.", 0Dh, 0Ah, "$"
DATEN ends
;----------------------------------------------------------------------------
STAPEL SEGMENT use16 STACK 'STACK'
DB 100h dup (88h)
STAPEL ends
end
Edit: Genauere Angaben findet man im "vbe3.pdf" von vesa.org. Ein Registrieren und/oder Einloggen ist aber erforderlich, da die Seite mit den "public documents" erst zur Laufzeit neu generiert wird und nur für eine gewisse Dauer existiert und sich für einen permanenten Link daher nicht mehr eignet und ältere Links dahin ungültig wurden.
Es gibt aber auch Kopien davon im internet (vermutlich ohne Rechte zur Verbreitung dafür).
Edit2:
Function 00h - Return VBE Controller Information
Input: AX = 4F00h Return VBE Controller Information
ES:DI = Pointer to buffer in which to place
VbeInfoBlock structure
(VbeSignature should be set to 'VBE2' when
function is called to indicate VBE 3.0 information
is desired and the information block is 512 bytes in
size.)
Output: AX = VBE Return Status
Code: Alles auswählen
he VbeInfoBlock information block
size is 256
bytes for VBE 1.x, and 512 bytes for VBE 2.0+.
The information block has the following structure:
VbeInfoBlock struc
VbeSignature db 'VESA' ; VBE Signature
VbeVersion dw 0300h ; VBE Version
OemStringPtr dd ? ; VbeFarPtr to OEM String
Capabilities db 4 dup (?) ; Capabilities of graphics controller
VideoModePtr dd ? ; VbeFarPtr to VideoModeList
TotalMemory dw ? ; Number of 64kb memory blocks
; Added for VBE 2.0+
OemSoftwareRev dw ? ; VBE implementation Software revision
OemVendorNamePtr dd ? ; VbeFarPtr to Vendor Name String
OemProductNamePtr dd ? ; VbeFarPtr to Product Name String
OemProductRevPtr dd ? ; VbeFarPtr to Product Revision String
Reserved db 222 dup (?) ; Reserved for VBE implementation scratch
; area
OemData db 256 dup (?) ; Data Area for OEM Strings
VbeInfoBlock ends.
------------------------------------------------------------------------------------
Mit der Modenummer und Funktion 1 Mode speziefische Informationen abrufen
Dafür benötigen wir 256 Bytes.
Function 01h - Return VBE Mode Information
Input: AX = 4F01h Return VBE mode information
CX = Mode number
ES:DI = Pointer to ModeInfoBlock structure
Output: AX = VBE Return Status
Note: All other registers are preserved.
This required function returns extended information about a specific VBE display
mode from the mode list returned by VBE Function 00h. This function fills the mode information
block, ModeInfoBlock, structure with technical details on the requested mode.
The ModeInfoBlock structure is provided by the application with a fixed size of 256 bytes.
Information can be obtained for all listed modes in the VideoModeList returned in Function 00h.
If the requested mode cannot be used or is unavailable, a bit will be set in the ModeAttributes
field to indicate that the mode is not supported in the current configuration.
Code: Alles auswählen
ModeInfoBlock struc
; Mandatory information for all VBE revisions
ModeAttributes dw ? ; mode attributes
WinAAttributes db ? ; window A attributes
WinBAttributes db ? ; window B attributes
WinGranularity dw ? ; window granularity
WinSize dw ? ; window size
WinASegment dw ? ; window A start segment
WinBSegment dw ? ; window B start segment
WinFuncPtr dd ? ; real mode pointer to window function
BytesPerScanLine dw ? ; bytes per scan line
; Mandatory information for VBE 1.2 and above
XResolution dw ? ; horizontal resolution in pixels or characters
3
YResolution dw ? ; vertical resolution in pixels or characters
XCharSize db ? ; character cell width in pixels
YCharSize db ? ; character cell height in pixels
NumberOfPlanes db ? ; number of memory planes
BitsPerPixel db ? ; bits per pixel
NumberOfBanks db ? ; number of banks
3 Pixels in graphics modes, characters in text modes..VBE Function Reference
VBE CORE FUNCTIONS VERSION 3.0 Page 31
MemoryModel db ? ; memory model type
BankSize db ? ; bank size in KB
NumberOfImagePages db ? ; number of images
Reserved db 1 ; reserved for page function
; Direct Color fields (required for direct/6 and YUV/7 memory models)
RedMaskSize db ? ; size of direct color red mask in bits
RedFieldPosition db ? ; bit position of lsb of red mask
GreenMaskSize db ? ; size of direct color green mask in bits
GreenFieldPosition db ? ; bit position of lsb of green mask
BlueMaskSize db ? ; size of direct color blue mask in bits
BlueFieldPosition db ? ; bit position of lsb of blue mask
RsvdMaskSize db ? ; size of direct color reserved mask in bits
RsvdFieldPosition db ? ; bit position of lsb of reserved mask
DirectColorModeInfo db ? ; direct color mode attributes
; Mandatory information for VBE 2.0 and above
PhysBasePtr dd ? ; physical address for flat memory frame buffer
Reserved dd 0 ; Reserved - always set to 0
Reserved dw 0 ; Reserved - always set to 0
; Mandatory information for VBE 3.0 and above
LinBytesPerScanLine dw ? ; bytes per scan line for linear modes
BnkNumberOfImagePages db ? ; number of images for banked modes
LinNumberOfImagePages db ? ; number of images for linear modes
LinRedMaskSize db ? ; size of direct color red mask (linear modes)
LinRedFieldPosition db ? ; bit position of lsb of red mask (linear modes)
LinGreenMaskSize db ? ; size of direct color green mask (linear modes)
LinGreenFieldPositiondb ? ; bit position of lsb of green mask (linear modes)
LinBlueMaskSize db ? ; size of direct color blue mask (linear modes)
LinBlueFieldPosition db ? ; bit position of lsb of blue mask (linear modes)
LinRsvdMaskSize db ? ; size of direct color reserved mask (linear modes)
LinRsvdFieldPosition db ? ; bit position of lsb of reserved mask (linear modes)
MaxPixelClock dd ? ; maximum pixel clock (in Hz) for graphics mode
Reserved db 189 dup (?) ; remainder of ModeInfoBlock
ModeInfoBlock ends
Es fehlen noch weitere Tabellen und eine Erklärung dafür.
Dirk