Jelentése:
Video Electronics Standards Association

Jelenleg a VESA 1.2 a szabvány, ez már minden videokártyán megtalálható, de már 2.0 is, ami terjedőben van. A kártyák általában nem tudják, de ugye mindenki találkozott már univbe-vel. Na ez az. 

Ennyi általános rizsa után nézzük a szabványos VESA módokat:
 

GRAFIKUS MÓDOK
15-bit
mode
number
7-bit
mode
number
Resolution
Colors
100h
-
640×400
256
101h
-
640×480
256
102h
6Ah
800×600
16
103h
-
800×600
256
104h
-
1024×768
16
105h
-
1024×768
256
106h
-
1280×1024
16
107h
-
1280×1024
256
 
SZÖVEGES MÓDOK
15-bit
mode
number
7-bit
mode
number
Rows
Columns
108h
-
80
60
109h
-
132
25
10Ah
-
132
43
10Bh
-
132
50
10Ch
-
132
60
 

HICOLOR ÉS TRUECOLOR GRAFIKUS MÓDOK

15-bit
mode
number
7-bit
mode
number
Resolution
Colors
Felépítés
(fenntartott:piros:zöld:kék)
10Dh
-
320×200
32K
(1:5:5:5)
10Eh
-
320×200
64K
(5:6:5)
10Fh
-
320×200
16.8M
(8:8:8)
110h
-
640×480
32K
(1:5:5:5)
111h
-
640×480
64K 
 (5:6:5)
112h
-
640×480
 16.8M
(8:8:8)
113h
-
800×600
32K 
 (1:5:5:5)
114h
-
800×600
 64K
(5:6:5)
115h
-
800×600
 16.8M
(8:8:8)
116h
-
1024×768
32K
 (1:5:5:5)
117h
-
1024×768
64K
(5:6:5)
118h
-
1024×768
16.8M
(8:8:8)
119h
-
1280×1024
32K
 (1:5:5:5)
11Ah
-
1280×1024
64K
(5:6:5)
11Bh
-
1280×1024
16.8M
(8:8:8)

Amint látható, a VESA módok 100h-tól kezdődnek. Persze ez nem azt jelenti, hogy VESA-n keresztül ne lehetne beállítani a stdandard VGA módokat.
A mode number  formátuma:

(Di=i edik bit)
D0-D8  = Mode number
              D8 == 0, nem  VESA mode
              D8 == 1, VESA mode
D9-D14 = fenntartott (= 0)
D15    = fenntartott (= 0)
Tehát a VESA módok 15 bitesek. 

Fontosabb VESA funkciók:
Minden VESA funkció az AX-ben adja vissza az eredményét.

        Status:

AL == 4Fh:      a funkció létezik
Al != 4Fh:        a funkció nem támogatott
AH == 00h:      sikerült
AH == 01h:      nem nyert
VESA Információ lekérdezése:
        Input:AH = 4Fh        VESA használat
                AL = 00h         funkciókód
                ES:DI = Pointer az információs blokkra. 

        Output: AX = Status 

Az Információs blokk: 

TVgaInfoBlock=RECORD       VESASignature : array[1..4] of char;{ 'VESA' }       VESAVersion   : word;                    { verzioszam}       OEMStringPtr  : ^char;              { Pointer az OEM stringre}       Capabilities  : array[1..4] of byte;     { lehetőségek}       VideoModePtr  : ^word;         { pointer a támogatott módokra}       TotalMemory   : word;    { Videomemória 64kb-os blokkokban}       Reserved      : array[1..236] of byte;{Fejlesztésre fenntertva}   end;

A támogatott módokra mutató pointer egy sima word-os tombre mutat, minden word egy mód száma. A végét FFFFh jelzi. 

Vajon mi az a Capabilities:
        D0      : színösszetevők hossza változtatható-e
                  0 = csak  6 bit lehet
                  1 = változtatható
        D1-31   = fenntartva
 

VESA mód információk lekérdezése:
        Input AH = 4Fh      VESA használat
                AL = 01h         funkciókód
                CX = mód
                ES:DI = mutató az információs blokkra 

        Output: AX = Status 

Módinformációs blokk:

TModeInfoBlock=RECORD              {általános információk}         ModeAttributes  : word;  { mode attributes}         WinAAttributes  : byte;  { A ablak(window) attributumai}         WinBAttributes  : byte;  { B ablak(window) attributumai}         WinGranularity  : word;  { ablak sűrűség (window
granularity)}
        WinSize         : word;     { ablak méret (window size)}         WinASegment     : word;  { A ablak szegmense (window A start
segment) (a000)}
        WinBSegment     : word;  { B ablak szegmense (window B start
segment) (b000)}
        WinFuncPtr      : longint;   { mutató az ablaklapozó
függvényre (pointer to window function)}
        BytesPerScanLine: word; {bytes per scan line}        { formális információk}         XResolution     : word;  { horizontális felbontás}         YResolution     : word;  { vertikális felbontás}         XCharSize       : byte;   { karakter szélesség}         YCharSize       : byte;   { karakter magasság}         NumberOfPlanes  : byte; { planek száma (VESA módoknál mindig
1, csak a régebbi VGA módok használnak plane-eket }
        BitsPerPixel    : byte;  { bits per pixel}         NumberOfBanks   : byte;  { bankok száma}         MemoryModel     : byte;   { memóriamodell}         BankSize        : byte;        { bankméret}         NumberOfImagePages:byte; { képernyőlapok  száma}         Reserved        : byte;  { fenntartva}            {          VESA Super VGA Standard VS911022-15}         RedMaskSize         : byte; { piros színösszetevő hossza
bitekben}
        RedFieldPosition    : byte;  { piros színösszetevő bitbeli
eltolása }
        GreenMaskSize       : byte;{ zöld színösszetevő hossza
bitekben}
        GreenFieldPosition  : byte; { zöld színösszetevő bitbeli
eltolása }
        BlueMaskSize        : byte; { kék színösszetevő hossza
bitekben}
        BlueFieldPosition   : byte;  { kék színösszetevő bitbeli
eltolása }
        RsvdMaskSize        : byte; { fenntartott hely hossza
bitekben}
        ReservedFieldPosition : byte; { fenntartott hely bitbeli
eltolása}
        DirectColorModeInfo : byte;  { attributumok}        {VBE v2.0+}         PhysicalAddress     : longint;    {linear frame buffer
Címe}
        reserved2           : array[1..212] of char; {fenntartva} end;

Egy pár dolog magyarázatra szorul: 

mode attributes:
        D0 = 0 : Az adott módot nem bírja a hardware
                1  : bírja a hardware
        D1 = 1 (Reserved)
        D2 = 0 : Output funkciókat nem támogatja a BIOS
                1 :  Output funkciókat támogatja a BIOS
        D3 = 0 : Mono
                1 : Color
        D4 = 0 : Szöveges
                1 : Grafikus
        D5-D15 : fenntertva 

Mik azok az ablakok. Nos mivel a CPU-val egyszerre címezhető memória 64K, egyszerre csak ennyit lát a video memóriából. Ez egy ablak (A window). az A000 szegmens. A legtöbb módnál azonban be lehet hozni még egy ablakot a B000 szegmenst (B window). Az így látható memória már  128K. Ezeket pedig össze vissza lehet lapozgatni, így be tudjuk járni az egész videomemóriát.
Ezeknek az ablakoknak vannak attributumai: 

Window Attributes
        D0 = Window supported
                0 = Window is not supported
                1 = Window is supported
        D1 = 0 : nem olvasható
                1  : olvasható
        D2 = 0 : nem írható
                 1 : írható
        D3-D7  : fenntartott. 

A window Granularity az ablaksűrűséget határozza meg. Ez azt jelenti, hogy milyen távolságra vannak egymástól az ablakok. A régebbi kártyáknál még előfordul, hogy ez 4K-ban van meghatározva, ami persze nekünk nem jó, mert 64k-t már úgy is látunk, így az a jó, ha 64K-ként kezdődnek a lapok. Ez majdnem az összes kártyánál így van. 

Winsize az ablakok méretét határozza meg. (64K) 

WinFuncPtr mutató az ablaklapozó függvényre. Ez a cucc szintén elérhető a VESA 05-ös funkciójával, de ennél gyorsabb hozzáférést biztosít. Ha ez a mező nulla, akkor csak a VESA BIOS 05-t -t használhtjuk. 

Ablaklapozás :

Input : ah=4fh
           al=05h
           bx=Window num (0=A, 1=B)
           dx=page
Output : ax : Status

A többi dolog vagy magától értetődő, vagy soha nem fog kelleni. A linear frame buffer még azért jöhet. Ez a dolog a VESA 2.0-tól vann bent. Főleg a protected módú programok számára hasznos, segítségével együtt tudja címezni az egész videomemóriát. nem kell lapozgatni. Tehát ugyanúgy tudjuk kezelni egy 640X480 as képet, mintha mondjuk  320X200 lenne. Egy sima rep movsd és már kinn is van a képernyőmemóriában. A linear frame buffer által meghatározott cím jelenti a kép kezdetét. 

Nos ennyi egy alapvető VESA detektáló/használó program megírásához elég. ld detect.pas 

Ja, és a legfontosabb, VESA mód beállítása
        Input:AH = 4Fh
                AL = 02h
                BX = mód
                     D0-D14 = Video mód
                     D15 :
                           0 = törli a video memórát
                           1 = nem törli a video memóriát 

        Output: AX = Status 

Ennyi a száraz, elmélet nagyon röviden. 

Egy pár gyakorlati dolog. Egy VESA információt lekérdező cucc: 

function GetVgaInfo(var block : TVgaInfoBlock) : word;ASSEMBLER;asm    push es    les di,block    mov ah,4fh    mov al,00h    int 10h    pop esend;
Egy mód információt lekérdező: 
function GetModeInfo(var block : TModeInfoBlock;num : word) :
word;ASSEMBLER;
asm    push es    les di,block    mov ah,4fh    mov al,01h    mov cx,num    int 10h    pop es end;

(remélem mindenki tud Pascalban) 

Az egyik példaprogram egy VESA detektáló pascalban, a másik meg a bump mapping 320X200 truecolorban egy zöld, egy kék, és egy piros színösszetevővel Watcom C-ben. A program kicsit (nagyon) lassú (de szép). Fel lehetne dobni , ha mondjuk a lapozásra nem a BIOS-t használná, hanem a mód információknál visszaadott lapozó függvényt hívná. Vagy, ha már protected mód, akkor legyen linear fame buffering. Vagy legyen teljesen assembly . Lehet mit csinálni rajta.