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
Sinon, toutes
les portions de codes données dans cet ouvrage seront en asm.
2.Les fonctionnalités du mode VESA
II.Problèmes de compatibilité VESA/VGA
III.Numéros de modes pour le mode VESA
1.Principe
3.Utilisation des écrans vrituels
4.Structure de la mémoire vidéo
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
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.)
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
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)