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