LES FONCTIONS VESA

Définition et utilisation des fonctions VESA à partir de la version 1.2

 

But du présent document :

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é.

C’est vrai, quoi ! Dès qu’on commence à vouloir programmer un peu plus sérieusement, et qu’on en a marre du vieux 16 couleurs du BIOS, on s’attaque 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à, c’est sûrement que vous vous êtes dit la même chose que moi. Mais seulement, c’est plus facile à dire qu’à faire. Car dès qu’on commence à chercher des infos là-dessus, tout ce qu’on trouve (si on trouve), c’est des trucs incompréhensibles en anglais. Alors pour ceux que ça fait chier l’anglais, voici intégralement pour eux l’explication 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.

Sinon, toutes les portions de codes données dans cet ouvrage seront en asm.

 

SOMMAIRE

I.Introduction

1.La création du mode VESA

2.Les fonctionnalités du mode VESA

II.Problèmes de compatibilité VESA/VGA

III.Numéros de modes pour le mode VESA

1.Structure des numéros

2.Les différents modes VESA

3.Mémoire utilisée

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

1.Principe

2.Utilisation des fenêtres

3.Utilisation des écrans vrituels

4.Structure de la mémoire vidéo

V.Les fonctions VESA

1.Principe

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

3.Fonction 01h : Lire les données-clés d'un mode VESA

4.Fonction 02h : Activer le mode VESA

5.Fonction 03h : Lire le mode en cours

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

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

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

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

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

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

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

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

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

b.Sous-fonction 01h : Lire la longueur des lignes

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

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

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

10.Fonction 08h : Contrôle de la palette DAC

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

b.Sous-fonction 01h : Lire la largeur de la palette

VI.Remerciements

I.Introduction

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 d’habitude, en essayant chacun de choper le monopole avec leurs propres standards, et évidemment ils y sont pas arrivés (comme d’habitude), et le seul résultat a été que les programmeurs s’arrachaient les cheveux (et plus si affinités) pour pouvoir supporter toutes les configs possibles. Alors, comme on l’a 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 (c’est marrant, normalement ça devrait être un pléonasme, ça, non ?) appelé VESA (Video Electronics Standards Association), et qui permet d’utiliser pleinement tous les atouts du Super VGA. Et maintenant ça marche pareil pour toutes les cartes (enfin, normalement).

2.Les fonctionnalités du mode VESA

Cette extension du BIOS permet surtout :

- de retourner des informations au programme sur l’environnement vidéo

- de l’assister 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 (qu’est-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 : d’une part, il faudrait éviter de se gourer et d’écrire à côté, sinon ça risque de faire du grabuge, et surtout, comme l’extension 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 !

II.Problèmes de compatibilité VESA/VGA

D’autre part, il convient, comme à chaque fois qu’on crée un nouveau protocole, que le mode VESA ne perturbe pas les vieux modes BIOS. L’extension n’affecte 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 l’ancienne 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 d’activer le mode VESA, puis de le restaurer à la fin par le fonction 00h.

III.Numéros de modes pour le mode VESA

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 :

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)

2.Les différents modes VESA

N° du mode

Résolution

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.Mémoire utilisée

Pour les modes 256 couleurs, chaque point a une taille d’un 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 l’on 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. Structure des modes de plus de 256 couleurs :

- 32 K : codé sur 16 bits (1:5:5:5)

* 1 bit inutilisé            (15e)

* 5 bits rouge (10à 14)

* 5 bits vert    (5à 9)

* 5 bits bleu    (0à 4)

- 64 K : codé sur 16 bits (5:6:5)

* 5 bits rouge (11à 15)

* 6 bits vert    (5à 10)

* 5 bits bleu    (0à 4)

- 16.8 M : codé sur 24 bits (8:8:8)

* 8 bits rouge (16à 23)

* 8 bits vert    (8à 15)

* 8 bits bleu    (0à 7)

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

1.Principe

L’accès à la mémoire vidéo est nécessaire pour l’affichage, puisque les fonctions VESA ne fournissent que des outils pour l’initialisation des modes vidéos, et rien pour l’afichage. 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 n°0). 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 n°1 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.

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.

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.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.

V.Les fonctions VESA

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 :

AL        = 4Fh : Fonction supportée

Ou AL <> 4Fh : Fonction non supportée

AH       = 00h : Appel de la fonction réussi

Ou AH <> 00h : Appel de la fonction non réussi

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 soutenues.

Entrée :

AH = 4Fh

AL = 00h

ES:DI : Pointeur FAR sur le buffer Info

Sortie :

AX = status (voir 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 III./2. ). Cette liste se termine par un Word de valeur 0FFFFh. Sa longueur varie d'une carte à l'autre.

Structure du dword des performances :

Bit 0 = 1 : largeur de la palette DAC modifiable

Bit 0 = 0 : largeur de la palette DAC fixée à 6 bits par couleur primaire

Bits 1 à 31 : Réservés

3.Fonction 01h : Lire les données-clés 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 buffer Info

Sortie :

AX = status (voir 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é.

Bit 0 = 1 : ce mode peut être initialisé dans la présente configuration vidéo

Bit 0 = 0 : ce mode ne peut être initialisé, par exemple s'il requiert un moniteur spécifique…

Avant la version 1.2 du mode VESA, le bit 1 signifiait :

Bit 1 = 1 information optionnelle présente

Bit 1     = 0 information optionnelle non présente

A partir de la version 1.2, tous les champs sont remplis, sauf le champ Direct Color, qui n'est rempli que si le modèle mémoire est à 6 (Direct Color) ou 7 (YUV), et le bit 1 est réservé et placé à 1

Bit 2 = 1 le BIOS supporte les fonctions basiques de sortie (scrolling, putpixel…)

Bit 2     = 0 le BIOS ne supporte pas les fonctions basiques de sortie

Bit 3 = 1 mode couleur

Bit 3     = 0 mode monochrome

Bit 4 = 1 mode graphique

Bit 4     = 0 mode texte

Bits 5 à 15        : réservés

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

Bit 0 = 0           fenêtre non disponible

Bit 0 = 1           fenêtre disponible

Bit 1 = 0           lecture de la RAM vidéo par cette fenêtre interdite

Bit 1 = 0           lecture de la RAM vidéo par cette fenêtre autorisée

Bit 2 = 0           Ecriture en RAM-vidéo par cette fenêtre interdite

Bit 2 = 1           Ecriture en RAM-vidéo par cette fenêtre autorisée

Bit 3 à 7           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.

Les tailles des masques définissentla 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é).

Les attributs du mode Direct Color sont définis selon la façon suivante :

Bit 0 = 1 : la palette DAC est modifiable

Bit 0 = 0 : la palette DAC n'est pas modifiable

Bit 1 = 1 : Les bits du champ réservés peuvent être utilisés par d'autres applications

Bit 1 = 0 : Les bits du champ réservés ne peuvent pas être utilisés par d'autres applications

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 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.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

Sortie :

AX = status (voir 1.)

BX = Numéro de code du mode en cours

Remarques :

 Cette fonction ne doit être pelé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.

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

a.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 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. Dans ce cas, seul l'octet faible du registre CX est occupé par les bits suivants :

Bit 0 = 1 : Statut de l'électronique vidéo

Bit 1 = 1 : Variables de la zone de données BIOS

Bit 2 = 1 : Registre de la table de couleurs DAC

Bit 3 = 1 : Statut SuperVGA

Bit 4 à 7 : Non occupé (0)

b.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 (voir a) )

ES:BX : pointeur FAR sur le buffer de stockage

Sortie :

AX = status (voir 1.)

c.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 (voir a) )

ES:BX : pointeur FAR sur le buffer de stockage

Sortie :

AX = status (voir 1.)

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

a.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 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 Fct 00h)

b.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 :

DX = Adresse de départ

AX = status (voir 1.)

>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.

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.

a.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 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 charactères.

b.Sous-fonction 01h : Lire la longueur des lignes

Entrée :

AH = 4Fh

AL = 06h

BL = 01h

Sortie :

AX = status (voir 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.

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.

a.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 1.)

Remarques :

 Cette fonction est aussi accessible en mode texte. Les valeurs en pixels doivent alors être considérées en charactères.

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

Entrée :

AH = 4Fh

AL = 07h

BL = 01h

Sortie :

AX = status (voir 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.

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

a.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 1.)

BH = Nombre de bits par couleur effectifs

b.Sous-fonction 01h : Lire la largeur de la palette

Entrée :

AH = 4Fh

AL = 08h

BL = 01h

Sortie :

AX = status (voir 1.)

BH = Nombre de bits par couleur

VI.Remerciements

Document écrit par Antoche – Antoche@altern.org - #ICQ : 38 08 99 43

Libre reproduction et diffusion autorisée - modifications interdites sans autorisation de l'auteur.

Bibliographie :

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)

Retour à la rubrique programmation.