-= Le Vesa 2.0 ... ou comment ce bo mag il marche ... =-

       PFffffffff bon ben c bien passque c toi !

        "Au dbut il y avait .... rien et aujourd'hui c'est le
bordel ... ba oui c vrai quoi ! "
                        Un type (bourr), 2 Avril 1996, 1:10 AM


        Pourquoi parler du VESA 2.0 ? ben c une bonne question,
moi mme je sais pas encore ! Alors voila ce qu'il en est :

        Il tait une fois une bande de joyeux JCD (Jeunes Cadres
Dynamiques) qui, devant l'incomprehension totale des devellopeurs
devant les nouveaux standard videos pour PC, ont dcids de
s'allier et de definir une NORME !!! (snifff c boooo).
Voila comment est n le standard VESA (Association Standard des
joyEux constructeurs de cartes Video). Ce dernier comporte
plusieurs spcification : V1.0 V1.02 V1.2 V2.0 ... 


        Les normes 1.0  1.2 ont dfinis les bases du Super VGA.
On peut ainsi passer par une extension de l'interruption 10 pour
enclencher des modes SVGA. 
En voici quelques exemples :

 Num   Xres*Yres*coul

 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--- et +
 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
       
Values for S3 OEM video mode:
 201h 640x480x256
 202h 800x600x16
 203h 800x600x256
 204h 1024x768x16
 205h 1024x768x256
 206h 1280x960x16
 208h 1280x1024x16
 211h 640x480x64K (Diamond Stealth 24)
 212h 640x480x16M (Diamond Stealth 24)
 301h 640x480x32K

Comme on peut le constater certains foutent deja la merde(S3 en
l'occurence) en mettant leurs modes a des endroits bizzares pour
ne pas faire comme leurs petits cammarades ...


Malheureusement pour nous, les cartes SVGA sont TOUTES diffrentes
(resnifff) Etttt oui plus de registres VGA standard, la gestion du
SVGA se fera par des composants diffrents  des adresses
differentes sur chaque carte.
Il devient donc duuuur de faire un truc dans le genre :

   mov AX,[Fait_peter_le_SVGA]
   int 10h


AAAAAAAHHHHHH non mais ca va pas !?!?!?!?!?!

La norme VESA  apport de nouveaux services  l'int 10h. Ces
derniers sont reprsents par la fonction 4Fh. En voici une
descriptions :

4F00h INT 10 - VESA SupVGA BIOS - GET SupVGA INFORMATION
4F01h INT 10 - VESA SupVGA BIOS - GET SupVGA MODE INFORMATION
4F02h INT 10 - VESA SupVGA BIOS - SET SupVGA VIDEO MODE
4F03h INT 10 - VESA SupVGA BIOS - GET CURRENT VIDEO MODE
4F04h INT 10 - VESA SupVGA BIOS - SAVE/RESTORE SupVGA VIDEO STATE
4F05h INT 10 - VESA SupVGA BIOS - CPU VIDEO MEMORY CONTROL
4F06h INT 10 - VESA SupVGA BIOS v1.1+ - GET/SET LOG SCAN L LENGTH
4F07h INT 10 - VESA SupVGA BIOS v1.1+ - GET/SET DISPLAY START
4F08h INT 10 - VESA SupVGA BIOS v1.2+ - GET/SET DAC PAL CONTROL


Le SVGA se gre (jusqu'a la norme 1.2) d'une unique manire : en
mode Banque. Kezako ? 
Faites un petit calcul avec votre bi-linear textured Cerveau. Un
ecran de 640x480x256 reprsente. 640*480*256 = 307200 octets. Mais
en mode rel votre mega Pipalopentium ne gre que des segments de
64Ko, et le plus navrant : la carte video ne map (en mode
graphique) que 64Ko de RAMVideo. C donc GENANT !!!!


En mode Banked on peut donc addresser des portions de 65535 octets
de Video.
Chacune de ces portions est appel Banque (d'o le nom :) !!!).
Lorsque vous dsirez changer de Banque il faut appeler une routine
prvu  cette effet (fonction 4F05h CPU VIDEO MEMORY CONTROL de
l'int 10h) Ceux qui ont deja programm ce mode savent  quel point
c'est CHIANT !!!!!!! (pas vrai 'Rakis :) ???) 


      * Les Banques se coupent "n'importe o" sur l'cran

      * Le changement de banque c lennnt !

      * C vraiment casse couille .....


Mais avec la norme VESA 2.0 (le Retour) tout ceci va changer .. :

Cette dernire introduit un lment Nouveau hyper important : Le
linear Frame Buffer (LFB). Etant donn que le processeur est
capable d'adresser (Lineairement) des espaces d'adresses allant
jusqu'a 4 Go pourquoi ne pas mapper entierement la mmoire video
dans l'espace adressable du CPU ??? (bonjour les repetitions ....)


La norme VESA 2.0 instaure donc une manire SIMPLE et RAPIDE
d'utiliser le SVGA. MAAAAAAIIIIISSSS (z'avez remarqu y'a toujours
un mais) le LFB n'est pas support (materielement parlant) par
toutes les cartes du march.
A ma connaissance seuls les MATROX, "certaines" ATI MACH 64, et
autres TSENG ET6000 supportent actuellement cette norme. Si votre
carte n'a pas ces possibilits jetez la.
Maaiiiss nnaaann c pouurrrrr riiirrrreuuuuuuuu ;)
Des gens bien pensant (SciTech en l'occurence) ont dcid de crer
des extensions VESA 2.0 pour chaque carte du march.
Comment est-ce blessipo ?
Ben l'adresse du LFB correspond en fait  un Buffer que le
gestionnaire UNIVBE va recopier (par des methodes optimiss pour
chaque carte) dans la RAM video.



Bon tout ca c'est bien joli mais comment que ca marche ????

Avant toute chose lorsque l'on dsire utilis un mode VESA il faut
rcuprer les informations SVGA de votre cartes par la fonctions
4F00h (GET SUPER VGA INFORMATIONS)


INT 10 - VESA SuperVGA BIOS - GET SuperVGA INFORMATION
   AX = 4F00h
   ES:DI -> 256-bytes buffer SuperVGA information

Return:
   AL = 4Fh if function supported
   AH = status
       00h successful ->  ES:DI buffer filled
       01h failed


Format of SuperVGA information:

   BYTE ID[4];           // Identification VESA
   BYTE VersionVESALo;   // No de version X.
   BYTE VersionVESAHi;   // No de version .X
   WORD LoFABRIC;        // adresse (Offset) du nom constructeur
   WORD HiFABRIC;        // adresse (Segment) du nom constructeur
   DWORD Flag;           // Flag non utilis
   WORD LoLIST;          // Offset des modes SVGA disponibles
   WORD HiLIST;          // Segment des modes SVGA disponibles
   WORD Memoire;         // Nbs de segments de 64 Ko disponibles 
   WORD Flag2;           // Flag (????)
   WORD LoCARTE;         // Offset du nom du CHIP Video
   WORD HiCARTE;         // Segment du nom du CHIP Video 
   WORD LoTCARTE;        // Offset du nom de la carte
   WORD HiTCARTE;        // Segment du nom de la carte
   BYTE Buffer[237];


Aprs appel de cette fonction le champ ID doit contenir 'VESA'.
Ceci indique que votre carte est compatible VESA. Les 2 octets
suivants reprsentent le numro de version VESA (0100h 0102h 0120h
ou 0200h dans le meilleur des cas :) ). 


* Viennent ensuite une srie de pointeurs (FABRIC, CARTE, TCARTE)
sur des chaines de caractres destins  trouver le nom de la
carte, de son fabriquant, et du nom du CHIP.

* Le pointeur LIST pointe sur la liste des modes video disponibles
sur la carte. 

* Memoire: Reprsente le nombre de banques disponibles (valables
uniquement en BANKED MODE dcrit plus haut. Ceci est sans interet
pour le LFB)

* Les 2 flags ne sont pas documents.

* Buffer sert  obtenir une structure de 256 octets.


Ceci fait il va maintenant falloir obtenir des informations sur le
mode video souhait. On utilise la fonction 4F01h (GET SuperVGA
MODE INFORMATION)


INT 10 - VESA SuperVGA BIOS - GET SuperVGA MODE INFORMATION
   AX = 4F01h
   CX = SuperVGA video mode
   ES:DI -> 256-byte mode information 

Return:
   AL = 4Fh function supported
   AH = status
       00h successful ->   ES:DI buffer filled
       01h failed


Format of Mode Information

   WORD FlagMode;  // Flag du mode video concerne
   BYTE FlagW1;    // Flag de la premiere fenetre d'acces
   BYTE FlagW2;    // Flag de la deuxieme fenetre d'acces
   WORD Gran;      // Granularite en Ko
   WORD WTaille;   // Taille des deux fenetres d'acces
   WORD W1Seg;     // Segment de la premiere fenetre
   WORD W2Seg;     // Segment de la deuxieme fenetre
   DWORD Foncp;    // Offset de la fonction Bank switch
   WORD ByteRes;   // Nb d'octets occups par une ligne de pts

   WORD XRes;      // Resolution en X pts/carac
   WORD YRes;      // Resolution en Y pts/carac
   BYTE XCar;      // Largeur caractere en pts
   BYTE YCar;      // Longueur caractere en pts
   BYTE NPlan;     // Nombre de plans de bits
   BYTE BPpix;     // Nombre de bits par pixels
   BYTE NBank;     // Nombre de bank memoire
   BYTE MModel;    // Modele memoire
   BYTE BTaille;   // Taille des banks memoires
   BYTE IPage;     // Nombre d'image page
   BYTE Reserve;   // Toujours  1

   // VBE 1.2 Extensions
   BYTE   RedMaskSize;
   BYTE   RedFieldPosition;
   BYTE   GreenMaskSize;
   BYTE   GreenFieldPosition;
   BYTE   BlueMaskSize;
   BYTE   BlueFieldPosition;
   BYTE   ReservedMaskSize;
   BYTE   ReservedFieldPosition;
   BYTE   DirectColourModeInfo;

   // VBE 2.0 Extentions
   DWORD  PhysBasePtr;         // adresse phys du ptr LFB !
   DWORD  OffScreenMemOffset;
   WORD   OffScreenMemSize;
        
   BYTE   Reserved2[206];
            
Les premires infos sont utiles pour le BANKED Mode. On peut
cependant noter XRes, YRes, BPpix qui donnent la resolution de
l'ecran.

L'extension VBE 1.2 apporte des variables pour la gestion
Truecolor.

L'extension VBE 2.0 donne une information crucial Physical Base
Pointer (Pointeur sur l'adresse physique du LFB Youkaydi !!!!)


Important:

        La taille d'un LFB est, quelques soit votre carte et votre
RAM video, de 4 megas (pour la norme 2.0). Une nouvelle rvision
devrait permettre de plus grands buffers.

        Lorsque vous appelerez la fonctions SetVESAMODE fonction
4F02h il faudra imprativement fixer le bit 13  1 afin de
signifier que vous voulez utiliser le LFB. On passera alors en
mode 4101h et non 0101h. (Ca peut paraitre con mais des cartes
recentes peuvent utiliser le LFB en mode 0101h sans broncher.
Le probleme c'est que UNIVBE, lui Y BRONCHE ....) Kule ....

Voila tout ce qu'il faut theoriquement savoir. Je vous conseille
maintenant mon magnifique exemple

(Il est conseill de lire le truc pourris ke j'ai fait sur les
programmes 32 bits sous DOS auparavant)


                                         EgoN SoftwarE / K!Prod
