Warning: Declaration of MainMenu::Show($MaxLevel) should be compatible with MenuItem::Show($Level = 0) in /var/www/html/evasion/people/Antoine.Bouthors/common.php on line 156

Warning: Declaration of MainMenu::FindMe($Path, $Level) should be compatible with MenuItem::FindMe($Path) in /var/www/html/evasion/people/Antoine.Bouthors/common.php on line 167
Les fonctions VESA 1.2 sous DOS
 

Les fonctions VESA 1.2 sous DOS

Avant-propos

ATTENTION : Cet article est VIEUX ! Ils a été écrit en 1998 (ou peut-être même avant) pour un système d'exploitation défunt, nommé DOS. Pour les boulets qui essayent de faire de l'assembleur DOS sous Windows, si vous essayez d'utiliser ce qui est écrit dans cet article, si ca ne marche pas, c'est normal ! Pas besoin de m'envoyer un email. Si vous voulez que ça marche, soit repassez à DOS, soit utilisez les fonctions Windows, et pas les interruptions DOS.

Le but de ce document est de fournir aux programmeurs désirant utiliser un mode graphique un peu plus évolué que le classique mode 13h la possibilité de créer des applicationsde toute beauté.

Cest vrai, quoi ! Dès quon commence à vouloir programmer un peu plus sérieusement, et quon en a marre du vieux 16 couleurs du BIOS, on sattaque au 13h et là on voit toutes les limites des vieux systèmes. Alors pourquoi ne pas faire des trucs aussi beaux que ceux actuels ? Si vous en êtes arrivé là, cest sûrement que vous vous êtes dit la même chose que moi. Mais seulement, cest plus facile à dire quà faire. Car dès quon commence à chercher des infos là-dessus, tout ce quon trouve (si on trouve), cest des trucs incompréhensibles en anglais. Alors pour ceux que ça fait chier langlais, voici intégralement pour eux lexplication des fonctions VESA en français !

Attention : ici je n'écris que des docs pour savoir comment utiliser au mieux les rressources de son PC. Je n'aime pas distribuer mes source comme ca. Non pas parce que je n'aime pas que les autres en profitent, mais tout simplement parce que je ne trouve pas cela très didactique. Mais bon si vous tenez vraiment à avoir des sources toutes prêtes, vous pouvez toujours demander, je ne suis pas égoïste.

A part ça, toutes les portions de codes données dans cet ouvrage seront en assembleur.
 

1. Introduction

1.1 La création du mode VESA

Au départ, les constructeurs fabriquaient des cartes au standard BIOS, mais de plus en plus performantes, avec chacunes des avantages de plus en plus grand, des modes vidéos plus avancés, etc... Et tout ça chacun dans son coin, comme dhabitude, en essayant chacun de choper le monopole avec leurs propres standards, et évidemment ils y sont pas arrivés (comme dhabitude), et le seul résultat a été que les programmeurs sarrachaient les cheveux (et plus si affinités) pour pouvoir supporter toutes les configs possibles. Alors, comme on la vu plus récemment pour les protocoles modems ou les DVD, les constructeurs se sont réunis et ont créé, contraints et forcés, un standard commun à toutes les cartes vidéos (cest marrant, normalement ça devrait être un pléonasme, ça, non ?) appelé VESA (Video Electronics Standards Association), et qui permet dutiliser pleinement tous les atouts du Super VGA. Et maintenant ça marche pareil pour toutes les cartes (enfin, normalement). 

1.2 Les fonctionnalités du mode VESA

Cette extension du BIOS permet surtout :
  • de retourner des informations au programme sur lenvironnement vidéo
  • de lassister pour initialiseret programmer la carte vidéo
Le dessin en mode VESA se fait de manière très simple et directe : il suffit d'écrire directement des données dans le buffer vidéo, sans passer par des procédures lentes et fastidieuses. Cela permet une rapidité sans égales (quest-ce qui peut être plus rapide que décrire dans la mémoire vidéo, à part dessiner à la main sur lécran ?) mais évidemment il y a deux inconvénients majeurs : dune part, il faudrait éviter de se gourer et décrire à côté, sinon ça risque de faire du grabuge, et surtout, comme lextension BIOS VESA ne sert que de traducteur avec des procédures hardware, il n'y a pas de fonctions du genre Circle, Line, ni même putpixel ! Il faut tout écrire soi-même !
 

Problèmes de compatibilité VESA/VGA

Dautre part, il convient, comme à chaque fois quon crée un nouveau protocole, que le mode VESA ne perturbe pas les vieux modes BIOS. Lextension naffecte donc pas le mode standard VGA, si les programmes utilisent les nouvelles fonctions VESA, qui ne touchent pas au BIOS. Cependant, certains programmes assez vieux (des TSR, ou le vieux CLS du DOS), utilisent lancienne fonction 0Fh pour lire le mode vidéo, et la 00h pour restaurer ou définir le mode vidéo, et le mode VESA modifie leurs valeurs. Cela risque donc de faire tout déconner. Pour léviter, VESA recommende de sauvegarder le numéro de mode retourné par la fonction 0Fh avant dactiver le mode VESA, puis de le restaurer à la fin par le fonction 00h. 

3. Numéros de modes pour le mode VESA

3.1 Structure des numéros

Dans le mode VGA standard du BIOS, les numéros de mode sont codés sur 7 bits et vont de 00h (texte) à 13h (320 x 200 256 couleurs). Dans le mode VESA, le numéro de mode est codé sur 15 bits et commence à partir de 100h. La forme du numéro est donc :

Structure du numéro de mode VESA
Bits Valeurs
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
                               
          
  Numéro du mode
  1 = mode VESA
0 = mode non VESA
  0 (réservés pour expansion ultérieure)
  0 (réservé)

Le mode VESA commence donc à partir de 100000000b, soit 100h. De plus, on peut parfaitement utiliser cette fonction pour initaliser les anciens modes : il suffit juste de mettre à zéro la partie haute (bits 8 à 15) et de mettre le numéro de l'ancien mode dans la partie basse.

Une exception : sachez que le mode 800 x 600 16 couleurs (102h) est aussi supporté en VGA (mode 6Ah).
 

3.2 Les différents modes VESA

Numéro du mode Résolution Nombre de couleurs Mode Mémoire
1 écran 2 écrans
100h 640 x 400 256 Graphique 250 Ko 500 Ko
101h 640 x 480 256 Graphique 300 Ko 600 Ko
102h 800 x 600 16 Graphique 32 Ko 64 Ko
103h 800 x 600 256 Graphique 500 Ko 1 Mo
104h 1024 x 768 16 Graphique 48 Ko 96 Ko
105h 1024 x 768 256 Graphique 768 Ko 1.5 Mo
106h 1280 x 1024 16 Graphique 80 Ko 160 Ko
107h 1280 x 1024 256 Graphique 1.25 Mo 2.5 Mo
108h 80 x 60   Texte 4800 o 9600 o
109h 132 x 25   Texte 3300 o 6600 o
10Ah 132 x 43   Texte 6 Ko 12 Ko
10Bh 132 x 50   Texte 6600 o 13200 Ko
10Ch 132 x 60   Texte 8 Ko 16 Ko
10Dh 320x 200 32 K Graphique 125 Ko 250 Ko
10Eh 320 x 200 64 K Graphique 125 Ko 250 Ko
10Fh 320 x 200 16.8 M Graphique 250 Ko 500 Ko
110h 640 x 480 32 K Graphique 600 Ko 1.2 Mo
111h 640 x 480 64 K Graphique 600 Ko 1.2 Mo
112h 640 x 480 16.8 M Graphique 900 Ko 1.8 Mo
113h 800 x 600 32 K Graphique 1 Mo 2 Mo
114h 800 x 600 64 K Graphique 1 Mo 2 Mo
115h 800 x 600 16.8 M Graphique 1.5 Mo 2.75 Mo
116h 1024 x 768 32 K Graphique 1.5 Mo 3Mo
117h 1024 x 768 64 K Graphique 1.5 Mo 3 Mo
118h 1024 x 768 16.8 M Graphique 2.25 Mo 4.5 Mo
119h 1280 x 1024 32 K Graphique 2.5 Mo 5 Mo
11Ah 1280 x 1024 64 K Graphique 2.5 Mo 5 Mo
11Bh 1280 x 1024 16.8 M Graphique 3.75 Mo 7.5 Mo
 

3.3 Mémoire utilisée

Pour les modes 256 couleurs, chaque point a une taille dun octet, et la valeur de cet octet détermine la couleur du point, parmi 256 couleurs possibles. Les couleurs correspondant à chaque valeur sont enregistrés dans une palette DAC, que lon peut retoucher directement par les ports 03C8h et 03C9h, ou à l'aide de l'INT 10h, Fct 10h.

Pour les modes avec plus de couleurs, il suffit décrire directement la valeur RGB dans la mémoire vidéo. Voici la structure des modes de plus de 256 couleurs :

Codage des couleurs pour 32000 couleurs (16 bits)
Bits Valeurs
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
                               
          
  Bleu
  Vert
  Rouge
  Inutilisé

Codage des couleurs pour 64000 couleurs (16 bits)
Bits Valeurs
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
                               
        
  Bleu
  Vert
  Rouge

Codage des couleurs pour 16 millions de couleurs (24 bits)
Bits Valeurs
23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
                                               
        
  Bleu
  Vert
  Rouge

Codage des couleurs pour 16 millions de couleurs (32 bits)
Bits Valeurs
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
                                                               
          
  Inutilisé
  Bleu
  Vert
  Rouge
 

4. Accès à la mémoire vidéo

4.1 Principe

Laccès à la mémoire vidéo est nécessaire pour laffichage, puisque les fonctions VESA ne fournissent que des outils pour linitialisation des modes vidéos, et rien pour lafichage. On est donc obligé décrire directement dans la mémoire vidéo. Mais comme celle-ci a souvent une taille supérieure à 64 Ko, on ne peut pas accéder à la totalité de cette mémoire avec un seul pointeur de type word. Pour remédier à ce problème, la mémoire vidéo est divisée en blocs de 64 Ko, appelés "Chunks", et on utilise des fenêtres d'accès pour lire et écrire dans la mémoire. Je m'explique : une fenêtre permet d'accéder à 64 Ko de données. Elle est positionnée à l'initialisation à l'adresse A000h, début de la mémoire vidéo. Elle recouvre donc à ce moment tout le premier chunk (chunk n0). Nous pouvons donc écrire (ou lire) des pixels dans tout le chunk. Si nous voulons maintenant inscrire des données dans le 2e chunk (la portion de mémoire entre 64 et 128 Ko), il suffit de positionner la fenêtre au début de ce deuxième chunk, grâce à la fonction VESA 05h. Et nous n'avons même pas à modifier la valeur du pointeur, puisque celle-ci est automatiquement remise à zéro dès qu'on dépasse 65535 (valeur maximum d'un word).

Pour donner un exemple, imaginons que nous voulions écrire la couleur "noir" à la position A000h:100000. Ceci n'est pas possible puisque 100000 > 65535. Il suffit donc de passer dans le chunk n1 grâce à la fonction 05h et ensuite d'écrire à l'adresse A000h:100000. Comme le processeur remet à zéro la valeur d'un word dès qu'elle dépasse 65535, cela reviendra à A000h:34465. Mais cela n'écrira pas à l'adresse A000h:34465, mais à A000h:(64K + 34465), car nous sommes passés dans le chunk suivant. C'est donc un moyen rapide pour franchir les limites des 64 Ko.
 

4.2 Utilisation des fenêtres

Les systèmes de fenêtragede la mémoire vidéo sont différents selon les systèmes. Certaines cartes permettent de disposer de 2 fenêtres, tandis que d'autres n'en fournissent qu'une. Lorsqu'on ne dispose que d'une seule fenêtre, celle-ci permet à la fois d'écrire et de lire dans la mémoire vidéo, mais lorsque l'on dispose de deux fenêtres, il existe deux systèmes différents :
  • Fenêtres chevauchantes : les deux fenêtres peuvent accéder à la totalité de la mémoire, mais l'une permet d'écrire et l'autre de lire
  • Fenêtres non chevauchantes : les deux fenêtres peuvent toutes deux lire et écrire, mais chacune dispose d'une portion de mémoire réservée
L'avantage des systèmes à double fenêtre est évidemment la rapidité : là où une seule fenêtre doit faire de grands déplacements pour lire et écrire à des endroits différents, le système de double fenêtre ne fait que de petits déplacement. L'inconvénient est évidemment qu'il doit être obligatoirement supporté par les programmes.
 

4.3. Utilisation des écrans vrituels

Souvent en programmation graphique on utilise des écrans virtuels, zones de mémoire, qui permettent un meilleur rendu esthétique : on exécute d'abord les fonctions graphiques sur un écran virtuel puis on définit le pointeur d'affichage sur cette zone. Ainsi, l'affichage est instantané. En mode VESA, les écrans virtuels sont en fait les chunks laissés libres dans la mémoire vidéo. Pour les utiliser, il suffit donc d'utiliser une fenêtre d'accès pour y écrire (fonction 05h), puis de placer le début de l'affichage sur le premier chunk en dehors de l'écran (fonction 07h). 

4.4 Structure de la mémoire vidéo

Pour écrire un point à des coordonnées précises, il faut bien sûr savoir à quel endroit se trouve ce point dans la mémoire vidéo. C'est pas du tout compliqué : les lignes sont écrites les unes à la suite des autres du haut vers le bas et de gauche à droite. En clair, en mode 640 x 480 256 couleurs, la première ligne va de l'offset 0 à 639, la deuxième de 640 à 1279, etc Pour connaître l'emplacement du pixel de coordonnées (x,y), il suffit donc de faire y*Width + x 1. 

5. Les fonctions VESA

5.1 Principe

Toutes les fonctions VESA sont appelées par l'intermédiaire de l'interruption 10h, fonction 4Fh. Toutes les fonctions VESA sont donc en fait des sous-fonctions de la fonction 4Fh. Pour l'instant, seules les sous-fonctions 00h à 08h sont utilisées. Les sous-fonctions 09h à 0FFh sont réservées pour des ajouts ultérieurs.

Chaque appel à une sous-fonction renvoie le status dans le registre AX :
  • Si AL vaut 4Fh, la fonction est supportée (sinon, elle ne l'est pas)
  • Si AH vaut 00h, l'appel de la fonction a réussi (sinon, non)
 

5.2 Fonction 00h : Lire les spécificités de la carte Super VGA

Cette fonction permet de prendre connaissance des techniques offertes par la carte Super VGA installée et déterminer si les fonctions VESA sont supportées.
  • Entrée :
    • AH = 4Fh
    • AL = 00h
    • ES:DI = Pointeur FAR sur le buffer Info
  • Sortie :
    • AX = status (voir 5.1)
  • Remarques :
    • Le buffer Info dont l'adresse est à transmettre à la fonction doit disposer de 256 octets. Si la fonction s'exécute correctement, vous obtenez les informations suivantes :

      Structure du buffer Info
      Offset Type Contenu
      00h DB "VESA" Signature VESA
      03h DB ? Version VESA, Numéro de version principal
      04h DB ? Version VESA, Numéro de version secondaire
      05h DD ? Pointeur FAR sur chaîne ASCII contenant le nom du fabricant
      09h DD ? Performances de l'environnement vidéo
      0Dh DD ? Pointeur FAR sur liste contenant les numéros des modes vidéo reconnus
      11h DW ? Nombre de chunks de 64 Ko
      13h DB 236 DUP (?) Reste du buffer

    • Le nom du fabricant se termine par un caractère ASCII 0
    • La liste des numéros de codes des modes vidéo reconnus, transmise dans le dernier champ du buffer, se compose de divers Words indiquant chacun le code d'un mode (voir 3.2). Cette liste se termine par un Word de valeur 0FFFFh. Sa longueur varie d'une carte à l'autre.
    • Structure du dword des performances :

      Structure du dword des performances
      Bits Valeurs
      31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
                                                                     
            
        1 = largeur de la palette DAC modifiable
      0 = largeur de la palette DAC fixée à 6 bits par couleur primaire
        Réservés
 

5.3 Fonction 01h : Lire les données d'un mode VESA

Cette fonction donne des informations sur un mode VESA sans pour autant l'activer.

  • Entrée :
    • AH = 4Fh
    • AL = 01h
    • CX = Numéro de code du mode VESA souhaité
    • ES:DI = Pointeur FAR sur le buffer Info
  • Sortie :
    • AX = status (voir 5.1)
  • Remarques :
    • Cette fonction ne doit être appelée que si la sous-fonction 00h s'est exécutée correctement et ainsi l'existence d'un driver VESA a pu être signalée. En outre, seuls les modes inclus dans la liste de la fonction 00h peuvent être réclamés.
    • Le buffer Info dont l'adresse est à transmettre à la fonction doit disposer de 256 octets. Si la fonction s'exécute correctement, vous obtenez les informations suivantes :

      Structure du buffer Info
      Offset Type Contenu
      00h DW ? Flag de mode
      02h DB ? Flags pour la première fenêtre d'accès
      03h DB ? Flags pour la seconde fenêtre d'accès
      04h DW ? Granulosité des deux fenêtres d'accès
      06h DW ? Taille des deux fenêtres d'accès
      08h DW ? Addresse de segment de la première fenêtre d'accès
      0Ah DW ? Addresse de segment de la seconde fenêtre d'accès
      0Ch DD ? Pointeur FAR sur fonction de fenêtrage des fenêtres d'accès
      10h DW ? Nombre d'octets par ligne
      Informations en option
      12h DW ? Résolution horizontale
      14h DW ? Résolution verticale
      16h DB ? Largeur de la matrice de caractères en points
      17h DB ? Hauteur de la matrice de caractères en points
      18h DB ? Nombre de plans mémoire
      19h DB ? Nombre de bits par points
      1Ah DB ? Nombre de blocs mémoire
      1Bh DB ? Modèle mémoire
      1Ch DB ? Taille d'un bloc mémoire en Ko
      1Dh DB ? Nombre de pages image
      1Eh DB 1 Réservé pour les fonctions page
      Nouveaux champs Direct Color
      1Fh DB ? Taille du masque rouge Direct Color en bits
      20h DB ? Position en bit du bit le moins signifiant du masque rouge
      21h DB ? Taille du masque vert Direct Color en bits
      22h DB ? Position en bit du bit le moins signifiant du masque vert
      23h DB ? Taille du masque bleu Direct Color en bits
      24h DB ? Position en bit du bit le moins signifiant du masque bleu
      25h DB ? Taille du masque réservé Direct Color en bits
      26h DB ? Position en bit du bit le moins signifiant du masque réservé
      27h DB ? Attributs du mode Direct Color
      28h DB 215 DUP (?) Reste du bloc info

    • Le flag de mode (offset 00h) indique si les champs optionnels du buffer Info ont été complétés par la fonction VESA et retourne également des informations importantes concernant le mode souhaité :

      Structure du flag de mode
      Bits Valeurs
      15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0  
                                     
                    
        1 = ce mode peut être initialisé dans la présente configuration vidéo
      0 = ce mode ne peut être initialisé, par exemple s'il requiert un moniteur spécifique
        1 (réservé)
        1 = le BIOS supporte les fonctions basiques de sortie (scrolling, putpixel)
      0 = le BIOS ne supporte pas les fonctions basiques de sortie
        1 = mode couleur
      0 = mode monochrome
        1 = mode graphique
      0 = mode texte
        0 (réservés)

    • Les deux fenêtres d'accès (Offset 02h et 03h) sont décrites à travers les champs de bits suivants :

      Structure des flags des fenêtres d'accès
      Bits Valeurs
      7 6 5 4 3 2 1 0  
                     
                
        0 = fenêtre non disponible
      1 = fenêtre disponible
        0 = lecture de la RAM vidéo par cette fenêtre interdite
      1 = lecture de la RAM vidéo par cette fenêtre autorisée
        0 = écriture en RAM vidéo par cette fenêtre interdite
      1 = écriture en RAM vidéo par cette fenêtre autorisée
        réservés

      Si les deux fenêtres ne sont pas supportées, le programme peut supposer que le buffer vidéo se situe à l'adresse standard appropiée au modèle mémoire du mode.

    • La granulosité est la plus petite limite (en Ko) sur laquelle la fenêtre peut être placée dans la mémoire vidéo (par exemple si elle n'a qu'une zone limitée dans le cas de deux fenêtres non chevauchantes). Sa valeur est indéfinie si la fenêtre n'est pas supportée.
    • La fonction de fenêtrage peut aussi être appelée avec la fonction VESA 05h, mais un appel direct permet un accès plus rapide aux registres page. Si égal à null, utiliser la fonction 05h.
    • La résolution est le nombre de pixels (ou de caractères, dans le cas d'un mode texte) par ligne ou par colonnes.
    • Les blocs mémoire sont des groupes de lignes. Ils dépendent du modèle mémoire.
    • Le modèle de mémoire (Offset 1Bh) reproduit la structure de la RAM vidéo dans le mode vidéo souhaité. Les codes suivants sont reconnus à cet effet :

      Codes de description du modèle de mémoire
      00h Mode texte
      01h Format CGA, soit 2 ou 4 blocs de mémoire
      02h Format Hercules avec 4 blocs de mémoire
      03h Format normal EGA/VGA pour mode graphique 16 couleurs
      04h Format compacté avec deux points à 4 bits par octet
      05h Format normal EGA/VGA pour mode graphique 256 couleurs
      06h Direct Color
      07h YUV
      08h-0Fh Réservé pour des formats ultérieurs
      10h-FFh Code spécifique au constructeur, actuellement inutilisé

    • Le nombre de pages image est le nombre d'images complètes qui peuvent tenir dans la mémoire VGA dans ce mode. Une application peut charger plus d'une image si ce champ n'est pas nul.
    • Le champ réservé est défini pour le cas où une nouvelle version du mode VESA viendrait et est toujours à 1 dans cette version.
    • Le champ Direct Color n'est rempli que si le modèle mémoire est à 6 (Direct Color) ou 7 (YUV). Les attributs du mode Direct Color sont définis selon la façon suivante :

      Structure des attributs du mode Direct Color
      Bits Valeurs
      7 6 5 4 3 2 1 0  
                     
              
        1 = la palette DAC est modifiable
      0 = la palette DAC n'est pas modifiable
        1 = Les bits du champ réservés peuvent être utilisés par d'autres applications
      0 = Les bits du champ réservés ne peuvent pas être utilisés par d'autres applications
        réservés

    • Les tailles des masques définissent la taille, en bits, des composants d'un pixel Direct Color. Par exemple, si un pixel est de la forme 1:5:5:5, la valeur des masques rouge, vert et bleu sera 5 et celui du masque réservé sera 1. Pour le système YUV, le champ rouge est utilisé pour V, le vert pour Y et le bleu pour U. Si le modèle mémoire n'utilise pas les pixels formés par composantes, les masques sont à 0.
    • Les positions des masques sont les positions en bits du bit 0 de chaque composante. Par exemple, pour un modèle 65 000 couleurs, (5:6:5), les positions seront respectivement 11,5 et 0 pour les champs rouge, vert et bleu (et 0 pour le champ réservé).
 

5.4 Fonction 02h : Activer le mode VESA

Cette fonction sert à activer un mode VESA.
  • Entrée :
    • AH = 4Fh
    • AL = 02h
    • BX = Numéro de code du mode souhaité
  • Sortie :
    • AX = status (voir 5.1)
  • Remarques :
    • Cette fonction ne doit être appelée que si la sous-fonction 00h s'est exécutée correctement et ainsi l'existence d'un driver VESA a pu être signalée. En outre, seuls les modes inclus dans la liste de la fonction 00h peuvent être initialisés.
    • Le bit 15 peut être mis dans le registre BX contenant le numéro de code du mode vidéo si la RAM vidéo ne doit pas être effacée pendant l'initialisation du mode vidéo.
 

5.5 Fonction 03h : Lire le mode en cours

Cette fonction retourne le numéro de code du mode vidéo en cours et tient compte des modes non VESA.
  • Entrée :
    • AH = 4Fh
    • AL = 03h
    • BX = Numéro de code du mode souhaité
  • Sortie :
    • AX = status (voir 5.1)
    • BX = Numéro de code du mode en cours
  • Remarques :
    • Cette fonction ne doit être appelée que si la sous-fonction 00h s'est exécutée correctement et ainsi l'existence d'un driver VESA a pu être signalée.
 

5.6 Fonction 04h : Sauver/Restaurer l'état vidéo Super VGA

5.6.1 Sous-fonction 00h : Lire la taille du buffer de stockage

La taille du buffer de stockage nécessaire peut être obtenue à l'aide de cette fonction en vue d'un appel ultérieur de la sous-fonction 01h.
  • Entrée :
    • AH = 4Fh
    • AL = 04h
    • DL = 00h
    • CX = Eléments de l'état vidéo à sauvegarder
  • Sortie :
    • AX = status (voir 5.1)
    • BX = Nombre de blocs de 64 octets nécessaires en guise de buffer de stockage
  • Remarques :
    • Cette fonction doit être appelée avant la sous-fonction 01h. La taille du buffer nécessaire à la sous-fonction 01h peut ainsi être obtenue.
    • Lors de l'appel de la fonction, les différents bits du registre CX indiquent les éléments de l'état vidéo à sauvegarder (1= sauvegarder, 0 = ne pas sauvegarder). Dans ce cas, seul l'octet faible du registre CX est occupé par les bits suivants :

      Structure du registre CX
      Bits Valeurs
      7 6 5 4 3 2 1 0  
                     
                  
        Statut de l'électronique vidéo
        Variables de la zone de données BIOS
        Registre de la table de couleurs DAC
        Statut SuperVGA
        0 (inutilisés)
 

5.6.2 Sous-fonction 01h : Sauver l'état vidéo de la carte Super VGA

Après un appel préalable de la sous-fonction 04h/00h, les informations souhaitées à propos des divers éléments de l'état vidéo sont stockées dans un buffer à l'aide de cette fonction.
  • Entrée :
    • AH = 4Fh
    • AL = 04h
    • DL = 01h
    • CX = Eléments de l'état vidéo à sauvegarder (cf. 5.6.1)
    • ES:BX = pointeur FAR sur le buffer de stockage
  • Sortie :
    • AX = status (voir 5.1)
 

5.6.3 Sous-fonction 02h : Restaurer l'état vidéo de la carte Super VGA

Après avoir sauvegardé l'état vidéo avec la sous-fonction 04h/01h, vous pouvez le restaurer en appelant cette fonction.
  • Entrée :
    • AH = 4Fh
    • AL = 04h
    • DL = 02h
    • CX = Eléments de l'état vidéo à restaurer (cf. 5.6.1)
    • ES:BX = pointeur FAR sur le buffer de stockage
  • Sortie :
    • AX = status (voir 5.1)
 

5.7 Fonction 05h : Contrôle des fenêtres d'accès

5.7.1 Sous-fonction 00h : Placer la fenêtre d'accès sur la RAM vidéo

Cette fonction sert à insérer une portion précise de la RAM vidéo dans l'une des deux fenêtres d'accès VESA pour qu'un programme puisse l'adresser.
  • Entrée :
    • AH = 4Fh
    • AL = 05h
    • BH = 00h
    • BL = Fenêtre d'accès (0 ou 1)
    • DX = Adresse de départ
  • Sortie :
    • AX = status (voir 5.1)
  • Remarques :
    • Dans le registre DX, l'adresse de départ doit être considérée par rapport à la granularité de la fenêtre obtenue par l'appel de la fonction 01h.
    • Les fenêtres ne peuvent être appelées que si elles sont accessibles (voir 5.2)
 

5.7.2 Sous-fonction 01h : Lire la position de la fenêtre d'accès sur la RAM vidéo

Cette fonction permet de déterminer l'état de la fenêtre d'accès sur la RAM vidéo de la carte Super VGA.
  • Entrée :
    • AH = 4Fh
    • AL = 05h
    • BH = 01h
    • BL = Fenêtre d'accès (0 ou 1)
  • Sortie :
    • AX = status (voir 5.1)
    • DX = Adresse de départ
  • Remarques :
    • L'adresse de départ située dans le registre DX doit être considérée par rapport à la granularité de la fenêtre obtenue par l'appel de la fonction 01h.
    • Cette fonction peut aussi être exécutée par un FAR call. L'adresse de cette fonction peut changer selon les modes, songez donc à la récupérer après chaque initialisation. Dans la version FAR call, aucune information n'est retournée à l'appelant, et les registres AX et DX seront détruits (pensez à les sauver !). Notez que le registre AX n'est pas nécessaire dans le FAR call, puisqu'il sert pour l'interruption.
 

5.8 Fonction 06h : Longueur des lignes de l'écran

Grâce à cette fonction, vous pouvez définir un écran plus large que l'écran réel. Cela permet notemment de faire des scrollings. Evidemment, il faudra plus de mémoire pour un même nombre de lignes. 

5.8.1 Sous-fonction 00h : Définir la longueur des lignes

  • Entrée :
    • AH = 4Fh
    • AL = 06h
    • BL = 00h
    • CX = Longueur de la ligne en pixels
  • Sortie :
    • AX = status (voir 5.1)
    • BX = Nombre d'octets par ligne
    • CX = Nombre de pixels par ligne
    • DX = Nombre maximum de lignes
  • Remarques :
    • Certaines longueurs de lignes ne pourront pas être disponible à cause de limitations hardware, c'est pourquoi la longueur réelle des lignes est renvoyée dans CX. Vous pouvez grâce à BX sauter des lignes.
    • Cette fonction est aussi accessible en mode texte. Les valeurs en pixels doivent alors être considérées en caractères.
 

5.8.2 Sous-fonction 01h : Lire la longueur des lignes

  • Entrée :
    • AH = 4Fh
    • AL = 06h
    • BL = 01h
  • Sortie :
    • AX = status (voir 5.1)
    • BX = Nombre d'octets par ligne
    • CX = Nombre de pixels par ligne
    • DX = Nombre maximum de lignes
  • Remarques :
    • Les mêmes que pour au-dessus.
 

5.9 Fonction 07h : Point de départ de l'affichage

Cette fonction, comme la fonction précédente, est une des nouvelles fonctions du mode VESA et permet, en association avec la 06h, de faire des scrollings, pans et autres anims. 

5.9.1 Sous-fonction 00h : Définir le point de départ de l'affichage

  • Entrée :
    • AH = 4Fh
    • AL = 07h
    • BH = 00h (réservé)
    • BL = 00h
    • CX = Abscisse du pixel de départ
    • DX = Ordonnée du pixel de départ (= numéro de la ligne)
  • Sortie :
    • AX = status (voir 5.1)
  • Remarques :
    • Cette fonction est aussi accessible en mode texte. Les valeurs en pixels doivent alors être considérées en caractères.
 

5.9.2 Sous-fonction 01h : Lire le point de départ de l'affichage

  • Entrée :
    • AH = 4Fh
    • AL = 07h
    • BL = 01h
  • Sortie :
    • AX = status (voir 5.1)
    • CX = Abscisse du pixel de départ
    • DX = Ordonnée du pixel de départ (= numéro de la ligne)
    • BH = 00h (réservé)
  • Remarques :
    • Idem.
 

5.10 Fonction 08h : Contrôle de la palette DAC

Certaines palettes DAC sont configurables pour fournir des définitions de couleurs en 6 bits, 8 bits, ou plus, par composantes primaires (RGB). Notez que la palette est remise à zéro (palette VGA 6 bits) lors d'une initialisation du mode VESA par la fonction 02h. 

5.10.1 Sous-fonction 00h : Définir la largeur de la palette

  • Entrée :
    • AH = 4Fh
    • AL = 08h
    • BL = 00h
    • BH = Nombre de bits par couleur désirés
  • Sortie :
    • AX = status (voir 5.1)
    • BH = Nombre de bits par couleur effectifs
 

5.10.2 Sous-fonction 01h : Lire la largeur de la palette

  • Entrée :
    • AH = 4Fh
    • AL = 08h
    • BL = 01h
  • Sortie :
    • AX = status (voir 5.1)
    • BH = Nombre de bits par couleur
 

6. Remerciements

Ce guide n'aurait pas pu être écrit sans quelque aide. Je remercie :
  • DDSoft - www.alpes-net.fr/~thillosn/ (site français excellent !)
  • Game Programming 99 www.gameprog.com (site excellent aussi, mais anglais)
  • La Bible du programmeur PC 5e édition (Micro application 1994)
  • HelpPC 2.10 (David Jurgens)

© 1998 Antoche