Fonctions de sortie de l'écran du BIOS
Le BIOS contient une série de routines affichant des données sur l'écran et maintiennent d'autres fonctions d'affichage. En plus du mode vidéo, le BIOS gère le positionnement du curseur, la sortie de texte et les routines d'affichage graphique. L'interruption 10h appelle toutes ces routines. Les registres du microprocesseur transfèrent les données entre le programme d'application et la routine d'interruption du BIOS.
Sous les versions DOS 1.0 et 1.1, ces routines du BIOS étaient les seules options pour le positionnement du curseur et le choix des couleurs. Les versions DOS 2.0 et ultérieures rendent également ces fonctions disponibles sous DOS.
En savoir plus sur la compatibilité
Les routines du BIOS s'exécutent plus rapidement que leurs routines DOS correspondantes. Ceux étant préoccupés par la compatibilité et la redirection des périphériques de sortie feraient mieux d'utiliser des routines DOS. Dans tous les cas, l'application elle-même doit dicter les routines qui seront utilisées.
Les routines BIOS, comme les routines DOS, offrent au programmeur l'avantage de l'indépendance vis-à-vis d'une carte vidéo particulière (IBM monochrome, IBM couleur, Hercules...), puisqu'elles peuvent être adaptées à différentes cartes. Étant donné que ces cartes ont différentes fonctionnalités prises en charge par le BIOS, examinons les capacités de ces cartes avant d'examiner les routines d'interruption 10h.
Adaptateur d'affichage monochrome (MDA)
Cette carte affiche une page de 25 lignes et 80 colonnes. La colonne 0 et la ligne 0 se trouvent dans le coin supérieur gauche de l'écran. La numérotation continue vers la droite et vers le bas à partir de la colonne 0, ligne 0.
Chacune des 2000 (80 x 25) positions à l'écran est représentée par un caractère parmi un ensemble de 256 caractères (ensemble de caractères standard IBM PC) et un caractère d'attribut, également appelé octet d'attribut. Les deux caractères nécessitent un octet chacun, donc 2000 x 2 (4000 octets) de mémoire vidéo doivent être disponibles pour afficher tout l'écran. Cette mémoire vidéo existe sur la carte d'affichage vidéo. Étant donné que la mémoire vidéo ne fait pas partie de la mémoire normale, l'adresse de départ reste constante à l'adresse B000:0000 pour la carte monochrome.
Alors que les systèmes PC ont des ensembles de caractères standard pour toutes les cartes vidéo décrites ici, les octets d'attribut changent d'une carte à l'autre.
Comme le montre la figure ci-dessous, les bits 0 à 2 et 4 à 6 de l'octet d'attribut définissent la couleur de premier plan et d'arrière-plan du caractère affiché.
Voici la structure de couleur d'octet d'attribut pour l'adaptateur d'affichage monochrome :
Bit | Description |
---|---|
0 à 2 | Couleur du caractères |
3 | Intensité de couleur : 0=normal, 1=haute intensité |
4 à 6 | Couleur d'arrière plan |
7 | Clignotement : 0=désactivé, 1=activé |
Le bit 3 de l'octet d'attribut indique l'intensité de la couleur de premier plan. S'il contient un 1, le caractère apparaît en haute intensité. Le bit 8 indique si le caractère à l'écran doit clignoter (un 1 dans ce bit fait clignoter le caractère). Bien que ces bits puissent être définis de n'importe quelle manière, seules les combinaisons de bits "semblant bien" doivent être utilisées pour la couleur de premier plan et d'arrière-plan.
Adaptateur graphique couleur (CGA)
Cette carte offre un affichage textuel d'un ensemble de caractères standard IBM PC et divers modes graphiques. Le mode texte fonctionne avec une résolution de 80x25 ou 40x25 caractères. La résolution 40x25 affiche les caractères en double largeur. Ce mode permet de gérer jusqu'à huit pages vidéo différentes (le mode 80x25 permet jusqu'à quatre pages différentes). L'attribution des numéros de ligne et de colonne est similaire à la carte d'affichage monochrome.
Octets d'attribut CGA
L'octet d'attribut utilisé sur cette carte sélectionne principalement les couleurs de premier plan et d'arrière-plan des caractères. Un total de 16 couleurs est disponible. Les huit premiers d'entre eux peuvent être utilisés comme couleurs de fond :
Binaire | Décimal | Couleur | |
---|---|---|---|
0000(b) | 0 | Noir | |
0001(b) | 1 | Bleu | |
0010(b) | 2 | Vert | |
0011(b) | 3 | Turquoise | |
0100(b) | 4 | Rouge | |
0101(b) | 5 | Magenta | |
0110(b) | 6 | Brun (jaune foncé sur certains moniteurs) | |
0111(b) | 7 | Gris clair (parfois blanc) | |
1000(b) | 8 | Gris foncé (ou noir) | |
1001(b) | 9 | Bleu clair | |
1010(b) | 10 | Vert clair | |
1011(b) | 11 | Turquoise clair | |
1100(b) | 12 | Rouge clair | |
1101(b) | 13 | Magenta clair | |
1110(b) | 14 | Jaune (également jaune clair) | |
1111(b) | 15 | Blanc |
Comme le montre le tableau ci-dessous, les bits 0 à 3 des octets d'attribut représentent la couleur de premier plan, tandis que les bits 4 à 6 indiquent la couleur d'arrière-plan. Le bit 7 a la même signification que dans la carte à affichage monochrome : il décide si le caractère doit clignoter.
Bit | Description |
---|---|
0 à 3 | Couleur du caractère |
4 à 6 | Couleur de l'arrière-plan |
7 | Clignotement, 0=désactiver, 1=activé |
Cette carte peut émuler une carte d'affichage monochrome (voir ci-dessus) dans laquelle le caractère d'attribut a la même signification que dans la carte monochrome, à l'exception qu'aucun caractère souligné ne peut être produit.
Modes graphiques et CGA
Les modes graphiques peuvent avoir une résolution de 640x200 points avec 2 couleurs ou 320x200 points avec 4 couleurs. Dans les deux modes, le coin supérieur gauche de l'écran a les coordonnées 0/0.
Aucun octet d'attribut n'existe dans ce mode car chaque point de l'affichage est éclairé ou non par une couleur et n'est pas composé de caractères standard d'un ensemble de caractères. Pour afficher les caractères de l'ensemble de caractères standard dans ce mode, ils doivent être dessinés à l'écran avec des pixels (points).
En résolution 320x200, une des 16 couleurs disponibles peut être définie comme couleur de fond. La couleur de premier plan doit être l'une des trois couleurs d'une palette prédéterminée par la carte graphique. Deux palettes sont normalement disponibles : l'une contient les couleurs cyan, magenta et blanc, tandis que l'autre propose les couleurs vert, rouge et jaune.
La RAM vidéo de cette carte commence à l'emplacement B800:0000 (contrairement à la carte à écran monochrome qui commence à B000:0000). Cela garantit que les RAM vidéo des deux cartes ne se chevauchent pas. Ils peuvent être utilisés en parallèle, chacun affichant des données sur son propre moniteur.
Cartes graphiques Hercules
La carte graphique Hercules a le même mode texte que l'adaptateur d'affichage monochrome IBM et peut afficher deux pages vidéo de texte à la fois. Une carte Hercules propose également un mode graphique dans lequel deux pages vidéo peuvent être affichées avec une résolution de 720x348 pixels. Malheureusement, le BIOS ne peut accéder ni aux deux pages vidéo ni au mode graphique. Le BIOS traite cette carte comme une carte monochrome normale, qui ne peut afficher qu'une seule page de texte de 80x25 caractères.
Maintenant que vous avez des connaissances générales sur les adaptateurs graphiques d'origine, voici les fonctions appelées depuis l'interruption 10h :
Décimal | Hexadécimal | Description |
---|---|---|
0 | 0h | Déterminer le mode vidéo |
1 | 1h | Définir la taille du curseur |
2 | 2h | Déterminer la position du curseur |
3 | 3h | Détecter la position du curseur |
4 | 4h | Lire le crayon lumineux |
5 | 5h | Définir la page d'affichage actuelle |
6 | 6h | Faire défiler l'affichage vers le haut |
7 | 7h | Faire défiler l'affichage vers le bas |
8 | 8h | Lire le caractère/attribut à la position du curseur |
9 | 9h | Écrire un caractère/attribut à la position du curseur |
10 | Ah | Écrire le caractère à la position du curseur |
11 | Bh | Déterminer la palette de couleurs pour le mode graphique |
12 | Ch | Définir le point d'affichage en mode graphique |
13 | Dh | Détecter le point d'affichage en mode graphique |
14 | Eh | Sortie de caractères (comme un terminal) |
15 | Fh | Déterminer le mode vidéo |
19 | 13h | Écrire une chaîne de caractères (uniquement disponible sur AT) |
Comme toujours, les registres du microprocesseur transmettent les arguments de la fonction. Certaines règles communes définissent quels registres acceptent quels paramètres : Le registre AH indique le numéro de la fonction à appeler avec l'interruption 10h. Si un caractère doit être affiché, ou un point placé sur l'écran en mode graphique, sa valeur passe dans le registre AL.
Fonctions d'Hercules
Si la fonction attend des coordonnées d'affichage pour le mode texte, la coordonnée X (colonne) doit être chargée dans le DL et la coordonnée Y (ligne) dans le registre DH. En mode graphique, le registre CX accepte la coordonnée X et le registre DX la coordonnée Y. Le numéro de la page d'affichage (si nécessaire) doit être contenu dans le registre BH.
Il est important pour les programmeurs assembleurs que le contenu des registres BX, CX, DX et le contenu des registres de segments restent les mêmes avant et après l'appel d'interruption. Le contenu de tous les autres registres peut changer.
Fonction 0h : Définir le mode vidéo
Avant d'envoyer la sortie à l'écran, le mode vidéo doit être sélectionné. Le mode vidéo actuellement utilisé n'est peut-être pas celui que vous désirez. La fonction 0 de l'interruption 10h effectue cette tâche et sélectionne également la carte vidéo active dans le cas où le PC a plusieurs cartes vidéo connectées. Pour un appel à cette fonction par l'interruption 10h, le registre AH doit contenir le numéro de fonction 0 et le registre AL doit contenir le numéro du mode vidéo à activer. Bien sûr, seuls les modes vidéo pris en charge par la carte vidéo du compatible PC peuvent être activés. Les numéros suivants correspondent aux différents modes vidéo (la carte vidéo prenant en charge le mode est entre parenthèses) :
Numéro | Description | Mode |
---|---|---|
0 | Affichage texte monochrome 40x25 caractères | (Couleur) |
1 | Affichage de texte couleur 40x25 caractères | (Couleur) |
2 | Affichage texte monochrome 80x25 caractères | (Mono) |
3 | Affichage de texte couleur 80x25 caractères | (Couleur) |
4 | Graphiques 320 x 200 pixels avec 4 couleurs | (Couleur) |
5 | Graphiques 320 x 200 pixels avec 4 couleurs | (Couleur) mais affichage monochrome |
6 | Graphiques 640 x 200 pixels avec 2 couleurs | (Couleur) |
Le mode ne fait aucune différence sur une carte monochrome, puisqu'un seul mode existe (80x25) ; ce mode est constamment actif. Il utilise le numéro de désignation interne de 7.
Fonction 0Fh : Obtenir le mode vidéo
L'opposé de cette fonction est la fonction 0Fh, déterminant le mode vidéo actuel. Une valeur de 0Fh dans le registre AH lors d'un appel à l'interruption 10h exécute cette fonction. Il renvoie la valeur du mode vidéo (voir le tableau ci-dessus) dans le registre AL. Comme mentionné ci-dessus, une carte monochrome renvoie toujours la valeur 7. Outre le mode vidéo, le nombre de colonnes par ligne d'affichage dans ce mode (40 ou 80) revient dans le registre AH et le numéro de la page d'affichage en cours dans le registre BH.
Fonction 02h : Définir la position du curseur
Après l'initialisation du mode vidéo, la sortie d'écran peut commencer. La fonction 2 définit la position du curseur. L'appel de cette fonction place le curseur clignotant à l'emplacement souhaité sur l'écran. Cela définit la position de départ de l'affichage des caractères. Avant d'appeler cette fonction, le registre AH doit être chargé avec le numéro de fonction (2), le registre DH avec l'emplacement de ligne du curseur et le registre DL avec l'emplacement de colonne du curseur. Le registre BH contient la page d'affichage sur laquelle le curseur doit être positionné. N'oubliez pas que chaque page d'affichage a son propre curseur pour positionner la sortie de texte, mais qu'il n'existe qu'un seul curseur d'affichage actif ou clignotant. Ce curseur actif apparaît toujours sur la page actuellement affichée.
La fonction 2 déplace le curseur actif si la valeur du registre BH correspond à la page écran en cours.
Fonction 03h : Lire la position du curseur
Le pendant de cette fonction est la fonction 03h. Il lit la position actuelle du curseur d'une page d'affichage sélectionnée et renvoie la position au programme appelant. A l'appel de cette fonction, le registre AL doit contenir le numéro de la fonction (3) et le registre BH le numéro de la page d'affichage dont la position du curseur est en cours de lecture.
Les cartes à affichage monochrome renvoient la valeur 0, car la carte ne peut afficher qu'une seule page (numérotée 0). Après l'appel de l'interruption 10h, le registre DH contient la ligne de la position du curseur et le registre DL la colonne de la position du curseur. De plus, deux valeurs sont renvoyées aux registres CH et CL ayant une signification particulière. Ils indiquent les lignes de balayage raster (pixel) de début et de fin du curseur. Ces lignes sont indépendantes de la page affichée.
Pour comprendre cette signification, il est important de savoir que chaque caractère en mode texte sur les cartes couleur et monochrome a des hauteurs de 8 et 14 pixels par caractère respectivement. Le programmeur peut choisir à laquelle de ces lignes de pixels le curseur clignotant commence et à laquelle il s'arrête.
Ces valeurs doivent bien sûr rester dans les valeurs légales des cartes vidéo individuelles (c'est-à-dire 0 à 7 pour une carte couleur et 0 à 13 pour une carte monochrome), sinon le curseur de texte clignotant peut disparaître de l'écran.
Fonction 01h : Définir la taille du curseur
Pendant que ces valeurs sont lues à l'aide de la fonction 3, la fonction 1 est utilisée pour définir ces valeurs. Le registre AH se charge avec un 1, le registre CH avec la ligne de départ du curseur et le registre CL avec la ligne de fin du curseur, avant d'appeler l'interruption 10h. La ligne de départ doit être inférieure ou égale à la ligne de fin, sinon le curseur devient invisible.
Fonction 05h : Définir la page d'affichage active
Cette page a fréquemment mentionné la page d'affichage en cours sans dire comment activer cette page. La fonction 05h de l'interruption 10h exécute cette tâche. Placez une valeur de 5 dans le registre AH et le numéro de la page que vous souhaitez activer (affichée sur le moniteur) dans le registre AL. Le numéro de la page à activer dépend du nombre de pages disponibles dans la carte vidéo et le mode vidéo actuels. Comme la carte vidéo monochrome ne propose qu'une seule page d'affichage, utiliser cette fonction avec une carte monochrome n'a aucun sens. Les valeurs suivantes sont autorisées pour les différents modes vidéo de la palette de couleurs :
Mode | Description |
---|---|
0 à 7 | Affichage de texte de 40x25 caractères [Carte couleur] |
0 à 3 | Affichage de texte de 80x25 caractères [Carte couleur] |
Après avoir sélectionné le mode vidéo et déplacé le curseur à l'emplacement souhaité sur l'écran, un ou plusieurs caractères sont affichés à l'écran dans la plupart des cas. Le BIOS met à disposition diverses fonctions ayant des capacités différentes pour fournir l'affichage des caractères à l'écran. Une différence entre ces fonctions est qu'elles traitent les codes de contrôle de différentes manières. Ces codes de contrôle sont les codes ASCII 7, 8, 10 et 13. Ils représentent ce qui suit :
Code | Contrôle | Description |
---|---|---|
7 | Bell | Produit un son |
8 | BackSpace | Efface le caractère précédent et fait reculer le curseur d'une position de caractère |
10 | Linefeed | Déplace le curseur d'une ligne vers le bas |
13 | Carriage return | Déplace le curseur au début de la ligne courante |
Certaines fonctions considèrent ces codes comme des caractères ASCII normaux et les exécutent en conséquence. D'autres fonctions les voient comme des codes de contrôle. Par exemple, le code 7 produit un son avec certaines fonctions. Le choix de la fonction à utiliser dépend du traitement de code de contrôle souhaité.
Affichage du texte en mode graphique
Les fonctions d'affichage de texte peuvent être utilisées en mode texte et en mode graphique. La sortie de texte en mode graphique crée des caractères différents car les caractères doivent être dessinés à l'écran à partir de pixels. Le PC utilise des codes ASCII pour définir les pixels graphiques. Alors que les échantillons de caractères pour les codes ASCII 0 à 127 sont déjà stockés dans la ROM, les modèles de caractères pour les codes 128 à 255 doivent être lus à partir d'une table en RAM. Cette table s'installe en RAM lorsque vous exécutez la commande GRAFTABL du DOS. Voir l'exemple https://github.com/gladir/corail/blob/master/GRAFTABL.PAS en Turbo Pascal de la commande suivant GRAFTABL pour plus détails sur cette commande.
Le BIOS obtient l'adresse de cette table à partir des emplacements mémoire 0000:007C à 0000:007F, où l'adresse de déplacement de la table se situe dans les deux octets inférieurs et l'adresse de segment de la table dans les deux octets supérieurs. Ces emplacements mémoire sont à l'intérieur de la table des vecteurs d'interruption mais peuvent être utilisés à cette fin puisque l'interruption 1Fh (dont l'adresse y figure normalement) reste inutilisée.
Le fait d'avoir cette table entreposée dans la RAM permet de définir votre propre table, de sorte que les caractères spéciaux n'étant pas contenus dans l'ensemble de caractères standard peuvent être affichés à l'écran. Chaque caractère étant composé de 8 octets, les 8 premiers octets de la table sont réservés au code ASCII 128, les 8 suivants au code 129,... Chaque octet contient le schéma binaire d'une des 8 lignes composant un caractère. Le bit 0 représente le point sur le bord droit de la matrice de caractères, le bit 7 le point sur le bord gauche. Si vous réglez un bit sur 1, cela illumine le pixel correspondant à l'écran.
Fonction 09h : écriture d'un caractère avec attribut
Fonction 0Ah : Écrire un caractère
Les fonctions 09h et 0Ah sont disponibles pour la sortie de caractères. La fonction 0Ah affiche le caractère dans la couleur déterminée par l'attribut correspondant à cette position particulière sur l'écran. La fonction 09h définit la couleur (attribut) du caractère à afficher. Aucune de ces fonctions ne déplace le curseur vers la position d'écran suivante après l'affichage des caractères. La sortie des caractères reprend au même emplacement lors du prochain appel de fonction. La fonction 02h doit être appelée pour déplacer le curseur à la position d'écran suivante pour afficher le texte lisible.
Détermination de l'appel de la fonction
Les deux fonctions 09h et 0Ah interprètent les codes de contrôle décrits ci-dessus comme des caractères normaux et les affichent en conséquence. Lors de l'appel de ces fonctions, le contenu du registre AH dépend si l'utilisateur a appelé la fonction 09h et 0Ah. Le registre AL accepte le code ASCII du caractère à afficher. La page d'affichage pour l'affichage des caractères se trouve dans le registre BH. Le registre CX contient un nombre qui indique combien de fois le caractère doit être affiché. De ce fait, il est possible d'afficher un caractère plusieurs fois avec un seul appel d'interruption (cela économise du temps et de la mémoire). Si vous souhaitez que le caractère du registre AL ne s'affiche qu'une seule fois, un 1 doit être stocké dans le registre CX lors de l'appel de la fonction. Comme la fonction 09h détermine également la couleur du caractère à sortir, le registre BL transmet la couleur du caractère.
Fonction 0Eh : mode télétype
Un sérieux inconvénient de ces deux fonctions est que la position du curseur n'avance pas après l'appel de la fonction. La fonction 0Eh résout ce problème. Il agit comme un terminal, d'où son nom de routine TTY (sortie d'un télétype). Le curseur passe à la position d'écran suivante après l'affichage d'un caractère. Si le curseur atteint la fin de la ligne écran, il se déplace au début de la ligne suivante. Si le curseur se trouve dans la dernière position de l'écran d'affichage (ligne 24, colonne 79), tout l'écran défile d'une ligne vers le haut et la ligne supérieure de l'écran disparaît de la zone d'affichage. De plus, la fonction efface la ligne 24 et le curseur se déplace au début de la ligne.
Une autre approche pour contrôler les codes
Contrairement aux fonctions 09h et 0Ah, la fonction 0Eh traite les codes de contrôle selon leurs fonctions, et non comme des codes ASCII normaux. Comme la fonction 0Ah, les caractères sont affichés par la fonction 0Eh en utilisant la couleur de caractère (attribut) déjà présente à cet emplacement de l'écran. Ceci n'est valable que pour le mode texte. En mode graphique, la couleur de premier plan doit être passée dans le registre BL.
Avant l'appel de la fonction, le registre AH doit être chargé avec le numéro de fonction 0Eh, le registre AL chargé avec le code du caractère à afficher et le registre BH avec la page d'affichage destinée à l'affichage des caractères.
Fonction 08h : Lire caractère/attribut
Alors que les fonctions 09h, 0Ah et 0Eh affichent des caractères à l'écran, la fonction 08h permet de lire des caractères à l'écran, c'est-à-dire de détecter le caractère et l'attribut affichés. Avant l'appel, la valeur 08 doit être chargée dans le registre AH et le numéro de la page d'affichage à partir de laquelle le caractère doit être chargé dans le registre BH. La position d'affichage à partir de laquelle le caractère doit être lu est la position actuelle du curseur dans la page d'affichage indiquée par le registre BH.
En mode texte, le code de caractère peut être lu directement à partir de la RAM vidéo. Cependant, le mode graphique nécessite une comparaison entre la configuration binaire à la position actuelle du curseur et la configuration binaire de chaque caractère dans l'ensemble de caractères.
Après l'appel de la fonction, le registre AH contient l'attribut (couleur) et le registre AL contient le code ASCII du caractère lu.
Fonction 06h : Faire défiler la fenêtre vers le haut
La fonction 06h fait défiler l'écran vers le haut d'une ou plusieurs lignes, ou efface des sections de l'écran en affichant des espaces (code ASCII 32). Ces opérations ne peuvent être effectuées que sur la page d'affichage en cours. Pour appeler cette fonction, vous devez charger le registre AH avec le numéro de fonction (6). Le registre AL est chargé avec le nombre de lignes dont l'affichage doit être déplacé vers le haut. Un 0 dans ce registre indique à la fonction de remplir la zone d'écran avec des espaces au lieu de faire défiler l'écran. Le registre BH contient la couleur (attribut) de la ligne vide. Les registres CH, CL, DH et DL définissent la fenêtre de la page d'affichage à faire défiler ou à effacer. Le registre C représente le coin supérieur gauche de la fenêtre, tandis que le registre D définit le coin inférieur droit de la fenêtre. La liste suivante illustre la signification de chaque registre :
Registre | Description |
---|---|
CH | Ligne du coin supérieur gauche de la fenêtre |
CL | Colonne du coin supérieur gauche de la fenêtre |
DH | Ligne du coin inférieur droit de la fenêtre |
DL | Colonne du coin inférieur droit de la fenêtre |
Fonction 07h : Faire défiler la fenêtre vers le bas
La fonction 07h fait défiler l'écran vers le bas d'une ou plusieurs lignes, ou efface des sections de l'écran en affichant des espaces (code ASCII 32). Ces opérations ne peuvent être effectuées que sur la page d'affichage en cours. Pour appeler cette fonction, vous devez charger le registre AH avec le numéro de fonction (7). Le registre AL est chargé avec le nombre de lignes dont l'affichage doit être déplacé vers le bas. Un 0 dans ce registre indique à la fonction de remplir la zone d'écran avec des espaces au lieu de faire défiler l'écran. Le registre BH contient la couleur (attribut) de la ligne vide. Les registres CH, CL, DH et DL définissent la fenêtre de la page d'affichage à faire défiler ou à effacer. Le registre C représente le coin supérieur gauche de la fenêtre, tandis que le registre D définit le coin inférieur droit de la fenêtre. La liste suivante illustre la signification de chaque registre :
Registre | Description |
---|---|
CH | Ligne du coin supérieur gauche de la fenêtre |
CL | Colonne du coin supérieur gauche de la fenêtre |
DH | Ligne du coin inférieur droit de la fenêtre |
DL | Colonne du coin inférieur droit de la fenêtre |
Fonctions graphiques
Voici les descriptions des fonctions utilisées dans les différents modes graphiques. Ils peuvent être utilisés avec des cartes vidéo capables de produire des graphiques.
Fonction 00h : Définir le mode vidéo
La fonction 00h active l'un des modes graphiques disponibles. La couleur de bordure (ou palette de couleurs) doit alors être sélectionnée pour le mode 320x200 (ou texte) en chargeant le numéro de fonction 0Ah dans le registre AH. Le registre BH dicte l'utilisation de la couleur de bordure ou de la palette de couleurs. Si lors de l'appel de la fonction le registre BH contient un 0, la valeur du registre BL devient la couleur de fond et de bordure du mode graphique. Les 16 couleurs sont toutes disponibles, le registre BL peut donc contenir une valeur comprise entre 0 et 15. Cette fonction reste valable pour le mode texte. Cependant, seule la couleur de la bordure peut être définie. La couleur d'arrière-plan de chaque caractère est définie individuellement par les 4 premiers bits de l'attribut de couleur et ne peut donc pas être définie pour tout.
Si le registre BH contient un 1, la valeur dans le registre BL (0 ou 1) sélectionne la palette de couleurs active. Les palettes contiennent les couleurs suivantes :
Palette | Description |
---|---|
0 | Vert, rouge, jaune |
1 | Cyan, magenta et blanc |
Fonction 0Bh : définir la palette de couleurs
Une fois le mode graphique initialisé et les couleurs sélectionnées, le dessin graphique peut commencer. La fonction 0Bh écrit des pixels graphiques à des emplacements spécifiés de l'écran. Les coordonnées des pixels à adresser sont passées dans les registres CX et DX. Les valeurs de ces registres dépendent de la résolution graphique du mode graphique courant. Le registre CX contient la coordonnée X (coordonnée de colonne) du pixel, et le registre DX la coordonnée Y (coordonnée de ligne) du pixel. L'appel de fonction doit avoir le numéro de fonction (0Bh) passé dans le registre AH. La valeur de couleur du pixel à manipuler est passée dans le registre AL. La carte Hercules et le mode 640x200 de la carte couleur n'autorisent que les valeurs 0 et 1. Dans le mode 320x200 de la carte des couleurs, les valeurs 0 à 3 sont autorisées pour les 4 couleurs possibles. La signification de ces valeurs dépend de la palette de couleurs active. Si un programme active la palette 0, les valeurs ont la signification suivante :
Valeur | Description |
---|---|
0 | Couleur sélectionnée pour le fond avec la fonction 0Bh |
1 | Vert |
2 | Rouge |
3 | Jaune |
Une palette active 1 change légèrement les valeurs :
Valeur | Description |
---|---|
0 | Couleur sélectionnée pour le fond avec la fonction 0Bh |
1 | Cyan |
2 | Magenta |
3 | Blanc |
Fonction 0Dh : Lecture du pixel
La fonction 0Dh est l'équivalent de cette fonction déterminant la valeur de couleur d'un pixel. Avant l'appel, la valeur 0Dh doit être passée dans le registre AH, l'abscisse du pixel doit être chargée dans le registre CX, et l'ordonnée dans le registre DX. La couleur du pixel est renvoyée en conséquence dans le registre AL. Cette valeur correspond aux règles décrites dans la fonction 0Bh.
Fonction 13h : Écrire une chaîne de caractères
L'interruption 10h inclut une autre fonction sur les ordinateurs AT. La fonction 13h affiche des chaînes de caractères à l'écran. Lors de son appel, une série de paramètres doit être transmise, en plus de transmettre le numéro de la fonction au registre AH. Le registre BH accepte le numéro de la page d'affichage sur laquelle la chaîne doit être affichée (pas nécessairement la page d'affichage en cours). La position de départ de la chaîne de caractères sur l'affichage est dans le registre DH (ligne) et le registre DL (colonne). Le registre CX contient le nombre de caractères de la chaîne de caractères.
Le contenu du registre AL définit l'un des quatre modes possibles d'affichage de la chaîne de caractères. Le format de chaîne de caractères dans les modes 0 et 1 diffère du format de chaîne dans les modes 2 et 3. Les modes 2 et 3 placent des octets d'attribut après chaque caractère de la chaîne de caractères. Dans les modes 0 et 1, les caractères individuels de la chaîne de caractères se succèdent dans l'ordre. L'octet d'attribut pour tous les caractères dépend du contenu du registre BL. Dans les modes 2 et 3, 2 octets sont entreposés dans la chaîne de caractères pour chaque caractère affiché. Par exemple, une chaîne de caractères de 4 caractères nécessite 8 octets de mémoire. Le nombre de caractères à afficher (4 caractères dans cet exemple) doit être indiqué dans le registre CX. Une autre différence entre les modes 0 et 2 et les modes 1 et 3 réside dans le format d'affichage. Après l'affichage de la chaîne dans les modes 1 et 3, le curseur apparaît à la suite du dernier caractère de la chaîne de caractères. Le prochain caractère affiché avec l'une des fonctions du BIOS apparaît alors à cette position sur l'écran. La position du curseur n'est pas mise à jour dans les modes 0 et 2.
Le BIOS des EGA et VGA
Les fonctions du BIOS pour la sortie d'écran font partie du ROM-BIOS depuis les débuts des compatibles IBM PC. Bien qu'ils aient fait leurs preuves dans des milliers d'applications, ils ne fonctionnent pas avec les nouveaux types de cartes graphiques. Les cartes EGA et VGA sont par la suite devenus courantes sur le marché des compatibles IBM PC. Des incompatibilités surviennent entre le matériel et le logiciel, car ces cartes ont peu de points communs avec les cartes CGA et MDA auxquelles les fonctions BIOS d'origine étaient destinées.
Pour rendre les cartes EGA et VGA compatibles avec les programmes utilisant les fonctions du BIOS pour faire leur sortie d'écran, les fonctions du BIOS doivent d'abord être adaptées aux nouvelles normes matérielles. La première option serait de remplacer le ROM-BIOS de la carte mère du PC par de nouvelles ROM. Cette solution peut créer d'autres problèmes, car aucune norme définie n'existe actuellement pour EGA ou VGA. Contrairement aux cartes CGA et MDA, où la norme IBM a pris le relais simplement parce qu'il n'y avait pas d'autres alternatives, les fabricants EGA et VGA n'ont pas encore défini de norme universelle. Une telle norme devrait s'appliquer au matériel, aux options et aux capacités offertes par chaque fabricant.
BIOS en ROM des EGA/VGA
Puisqu'il n'est pas pratique d'adapter la ROM-BIOS fournie avec l'ordinateur à toutes les cartes graphiques du marché, les fabricants de ces systèmes utilisent l'approche inverse. Ils emballent un ROM-BIOS indépendant avec leurs cartes vidéo. Il y a une petite ROM sur la carte vidéo elle-même contenant les fonctions de sortie d'écran nécessaires. Lorsque le système est démarré, le BIOS détecte cette extension de ROM et lui permet de rediriger l'interruption 10h vidéo du BIOS vers ses propres routines, remplaçant les anciennes fonctions.
En utilisant ces routines, tous les programmes utilisant les fonctions du BIOS pour la sortie peuvent être exécutés sans problème, mais les capacités améliorées de ces cartes vidéo ne sont pas utilisées. Étant donné que le ROM-BIOS de la carte mère est destiné à fonctionner uniquement avec les cartes CGA et MDA, il ne prend en charge que les capacités de ces cartes. Ainsi, les fabricants de cartes graphiques étendent le BIOS de ces cartes vidéo en incluant de nouvelles fonctions ou en mettant à niveau d'anciennes fonctions, afin que les capacités vidéo améliorées puissent être utilisées.
Cette section est dédiée à ces fonctions. Aucune norme réelle n'existe pour ces extensions du BIOS, comme mentionné précédemment. Nous pourrions utiliser cette section pour décrire les fonctions vidéo des cartes EGA et VGA les plus importantes (de nombreuses cartes différentes), mais même avec ces informations, vous ne seriez toujours pas en mesure d'écrire des programmes étant compatibles avec toutes les cartes vidéo sur le marché. L'écriture d'un programme pour une carte vidéo spécifique n'a de sens que si vous souhaitez que le programme s'exécute uniquement avec cette carte.
Modes vidéo EGA/VGA
Au lieu de cela, regardons le plus petit dénominateur commun, les modes et fonctions vidéo pris en charge par pratiquement toutes les cartes EGA/VGA. Si vous vous en tenez à cette norme "de bas niveau", vous pouvez être sûr que vos programmes fonctionneront correctement avec toutes les cartes EGA/VGA. La base de cette norme est l'ensemble des modes vidéo pris en charge par la carte EGA originale, introduite par IBM en 1985, ou la carte VGA originale, introduite par IBM en 1987. Tous les fabricants de cartes compatibles ont inclus des fonctions similaires dans leur propre cartes, et ajouté leurs propres fonctionnalités.
Toutes les cartes EGA et VGA ont une flexibilité en commun, ce qui leur permet d'émuler d'autres cartes vidéo, ainsi que d'effectuer d'autres tâches. Le type d'émulation dépend du moniteur connecté, car contrairement aux autres cartes, les cartes EGA/VGA peuvent être utilisées avec différents types de moniteurs.
Moniteurs et EGA/VGA
Si vous connectez un moniteur monochrome à une carte EGA ou VGA, il assume les fonctionnalités d'une carte graphique MDA ou Hercules. Si vous connectez un moniteur couleur à une EGA ou une VGA, il émule une carte CGA normale. Cependant. Les cartes EGA/VGA fonctionnent mieux lorsqu'elles sont connectées à un moniteur multisynchrone, ce qui permet des affichages couleur à des résolutions plus élevées que Hercules ou CGA. Les résolutions standards (640x350 pour EGA, 640x480 pour VGA) peuvent être affichées sans problème sur un moniteur multisync. Cependant, les moniteurs mUltisync prennent également en charge les résolutions plus élevées disponibles sur de nombreuses cartes EGA et VGA. Les résolutions de 800x600 pixels et 1024x768 pixels sont courantes. Ces résolutions plus élevées ne peuvent être utilisées que si la carte EGA/VGA dispose de suffisamment de RAM, car le mode graphique étendu nécessite une RAM vidéo supplémentaire pour gérer les résolutions plus élevées. Le programmeur n'a pas à s'inquiéter de cela, car presque toutes les cartes EGA sont livrées avec la norme 256 Ko RAM. Très peu de cartes EGA sont livrées avec seulement 64 Ko et doivent être étendues à 256 Ko. La plupart des cartes VGA sont équipées de 256 Ko de RAM vidéo, ainsi que d'un BIOS VGA spécial. Ce BIOS spécial peut nécessiter des pilotes spéciaux pour fonctionner conjointement avec des interfaces utilisateur graphiques telles que GEM, GeoWorks ou Windows 2, Windows 3.0 ou Windows 3.1.
De plus, pour supporter les nouveaux modes graphiques avec des résolutions plus élevées, les cartes EGA proposent une palette de 16 couleurs choisies parmi les 64 couleurs disponibles. En mode texte, il est également possible de définir la hauteur des caractères individuels, de sorte que jusqu'à 43 lignes puissent être affichées à l'écran à la fois, au lieu des 25 lignes habituelles.
Fonctionnalités VGA
La carte VGA est encore plus puissante. En mode texte, la carte VGA peut afficher 25 lignes, 43 lignes et même 50 lignes de texte. De plus, la VGA a encore plus de couleurs disponibles (262 144 couleurs, par opposition au spectre de 64 couleurs de la carte EGA). Bien sûr, ces couleurs ne sont efficaces que lorsqu'elles sont affichées sur un moniteur ayant une résolution suffisamment élevée.
Le reste de cette section montre comment ces fonctionnalités étendues peuvent être utilisées et comment les fonctions du BIOS d'origine ont changé.
Comme avec le BIOS normal, tous les modes vidéo du BIOS des cartes EGA et VGA sont définis à l'aide de la fonction 00h de l'interruption vidéo du BIOS. Cette fonction n'a pas été modifiée depuis l'ancien BIOS, mais elle a été étendue. Le numéro du mode vidéo à régler est passé dans le registre AL. Les codes suivants sont autorisés :
Code | Mode | Mono | Couleur | EGA/VGA |
---|---|---|---|---|
00h | 40x25 caractères, 16 couleurs | Non | Oui | Oui |
01h | 40x25 caractères, 16 couleurs | Non | Oui | Oui |
02h | 80x25 caractères, 16 couleurs | Non | Oui | Oui |
03h | 80x25 caractères, 16 couleurs | Non | Oui | Oui |
04h | 320x200 pixels de graphique, 4 couleurs | Non | Oui | Oui |
05h | 320x200 pixels de graphique, 4 couleurs | Non | Oui | Oui |
06h | 640x200 pixels de graphique, 2 couleurs | Non | Oui | Oui |
07h | 80x25 caractères, monochrome | Oui | Non | Non |
0Dh | 320x200 pixels de graphique, 16 couleurs | Non | Non | Oui |
0Eh | 640x200 pixels de graphique, 16 couleurs | Non | Non | Oui |
0Fh | 640x350 pixels de graphique, monochrome | Oui | Non | Non |
10h | 640x350 pixels de graphique,16 couleurs. Les cartes EGA avec 64K de RAM ajoutée ne peuvent afficher que 4 couleurs. | Non | Non | Oui |
11h | 640x480 pixels de graphique 2 couleurs | Non | Non | VGA seulement |
12h | 640x480 pixels de graphique, 16 couleurs | Non | Non | VGA seulement |
13h | 320x200 pixels de graphique, 256 couleurs | Non | Non | VGA seulement |
Fonctions étendues
Après la fonction 0Fh, figurant également dans l'ancien ROM-BIOS, nous avons trois nouvelles fonctions EGA/VGA numérotées 10h, 11h et 12h. Ces nouvelles fonctions sont dédiées à une tâche spécifique et comportent un certain nombre de sous-fonctions.
Fonction 10h
La fonction 10h comprend toutes les sous-fonctions permettant d'exploiter les capacités couleur des cartes EGA/VGA. Avant de décrire ces fonctions, nous devons d'abord examiner la manière dont les cartes EGA et VGA créent des couleurs.
Contrairement aux cartes MDA et CGA, les deux quartets de l'octet d'attribut d'un caractère en mode texte ne spécifient pas directement la couleur ou les attributs du caractère dans la EGA. Ils comprennent un index vers l'un des 16 registres de palette de la carte EGA, contenant alors la couleur réelle. Cela permet de définir individuellement les couleurs souhaitées et permet des changements de couleur simplement en modifiant le contenu des registres de palette. L'interprétation du contenu du registre de la palette et le nombre de couleurs affichables dépendent du type de moniteur utilisé. La carte EGA elle-même peut générer 64 couleurs, mais celles-ci ne peuvent être affichées que sur des moniteurs EGA ou multisync, puisque ces moniteurs ont les six lignes de couleur requises (26 = 64). Deux lignes sont disponibles pour chaque couleur fondamentale (rouge, vert et bleu), où les deux lignes contrôlent le niveau d'intensité de la couleur. Ces six lignes correspondent directement aux six bits inférieurs d'un registre de palette, comme le montre le tableau suivant (registres de palette EGA lorsqu'elle est connectée à un moniteur EGA ou multisync) :
Bit | Description |
---|---|
0 | Bleu (intensité) |
1 | Vert (intensité) |
2 | Rouge (intensité) |
3 | Bleu (Moins d'intensité) |
4 | Vert (Moins d'intensité) |
5 | Rouge (Moins d'intensité) |
6 et 7 | Non utilisé |
Cet ensemble de couleurs n'est pas disponible lorsqu'un moniteur couleur normal est connecté. Il n'a que quatre lignes pour la représentation des couleurs, dont trois sont affectées aux couleurs fondamentales rouge, vert et bleu. La quatrième ligne permet simplement d'afficher la couleur résultante avec une intensité plus élevée. Ces possibilités limitées affectent la structure du registre de palette, différant clairement de la structure à six bits utilisée lorsqu'un moniteur EGA ou multisync est connecté. Au total, seulement 16 couleurs peuvent être affichées dans ce mode. Voici les registres de palette EGA lorsqu'elle est connectée à un moniteur couleur :
Bit | Description |
---|---|
0 | Bleu |
1 | Vert |
2 | Rouge |
3 | Non utilisé |
4 | Intensité |
5, 6 et 7 | Non utilisé |
Les bits d'un registre de palette prennent une toute autre signification lorsque la carte est connectée à un moniteur monochrome. Dans ce cas, le moniteur ne peut pas afficher différentes couleurs et ne peut afficher que des caractères clairs, inversés et soulignés. Lorsqu'il est connecté à un tel moniteur, la signification des bits individuels correspond à celle de l'octet d'attribut d'une carte MDA, que nous avons examinée plus haut dans cette page.
Table des couleurs DAC
La carte VGA utilise également les quartets les plus significatifs et les moins significatifs de l'octet d'attribut comme index, pointant vers l'un des 16 registres de palette. Contrairement à la carte EGA ne contenant que le code couleur, cet octet contient une valeur comprise entre 0 et 255. Ce numéro sert de référence à la table des couleurs du DAC (convertisseur analogique numérique). Cette table permet à la carte VGA de convertir un code couleur noté numériquement en un signal vidéo analogique. La table de couleurs DAC considère chaque code de couleur comme trois valeurs à six bits, chaque valeur représentant le degré d'intensité rouge, verte et bleue dans la couleur.
Comme le montre la figure suivante, la disposition du code couleur dans certains registres joue un rôle impliquant également le BIOS
Le bit 7 de chaque valeur contrôle le regroupement des différents registres dans la table de couleurs DAC, contrôlant ainsi le registre de contrôle de mode du contrôleur vidéo. Si ce bit contient un 0, l'index de la table des couleurs du DAC base son registre de palette sur le contenu des bits 0 à 5, et le registre de sélection des couleurs sur les bits 2 et 3. La conséquence est que la table des couleurs du DAC est divisée en quatre groupes de 64 registres consécutifs. La valeur dans le registre de palette représente l'index dans ce groupe, moyennant quoi le groupe actif sélectionne lui-même la couleur sur la base du contenu des bits 2 et 3 du registre de sélection de couleur.
Lorsque le bit 7 du registre de commande de mode contient un 1, la table des couleurs du DAC se divise en 16 groupes de 16 registres consécutifs. L'index de cette table est basé sur les bits 0 à 3 du registre de palette correspondant et les bits 0 à 3 du registre de sélection de couleur.
Ces registres sélectionnent le groupe de couleurs actif à partir de la table de couleurs DAC, et le contenu des registres de palette représente l'index de ce groupe.
Vous pouvez utiliser cette forme de codage pour créer des changements de couleur rapides et faciles lorsque les caractères à l'écran doivent être changés rapidement. Cela implique d'entreposer différents groupes dans la table de couleurs DAC spécifiant des couleurs plus claires ou plus sombres, et d'incrémenter rapidement le groupement de couleurs actif via le registre de sélection de couleurs.
Pour émuler parfaitement une carte CGA ou MDA, le BIOS EGA/VGA définit les registres de palette individuels (ou dans le cas de la carte VGA, les registres de couleurs DAC) sur le même schéma de couleurs utilisé par une carte CGA ou MDA lorsque le mode correspondant est initialisé. Dans le cas d'une émulation CGA (carte EGA/VGA et un moniteur CGA), cela signifie que le registre de palette 0 contient la valeur 0, le registre de palette 1 la valeur 1,... En même temps, le registre de sélection de couleur de la carte VGA doit être réglé sur la première des 16 palettes dont les codes couleurs correspondent à ceux d'une carte CGA. Ceci s'applique également aux modes CGA 4 et 5 (320x200 pixels, quatre couleurs), fonctionnant avec l'une des deux palettes de couleurs sélectionnables via la fonction 0Bh, sous-fonction 1. Le BIOS du EGA charge simplement les couleurs correspondantes dans les trois couleurs inférieures des registres de palette, en fonction de la palette sélectionnée.
Il n'est normalement pas nécessaire de modifier le contenu des registres de palette dans ce cas, car aucune nouvelle couleur ne peut être affichée à l'écran. Les couleurs individuelles peuvent facilement être échangées les unes avec les autres.
Les choses sont différentes lorsqu'un moniteur EGA/VGA ou multisync est connecté. Le BIOS des EGA et VGA charge les valeurs 0 à 15 dans les 16 registres de couleurs lorsque le mode texte est initialisé, mais cela n'épuise pas les options de couleur de la carte EGA. Pour utiliser pleinement ces options, la sous-fonction 00h de la fonction 10h peut être utilisée pour charger l'un des 16 registres de palette. En plus du numéro de la fonction dans le registre AH et du numéro de la sous-fonction dans AL, il faut également passer à cette fonction le numéro de la palette (0 à 15) dans BH et la nouvelle valeur de couleur pour cette palette dans le registre BL. Comme cette fonction ne vérifie pas le numéro du registre, elle peut également être utilisée pour modifier le contenu d'un 17e registre de palette (bordure d'écran et couleur de fond en mode graphique), bien qu'il soit préférable d'utiliser la sous-fonction 01h de la fonction 10h pour ça. En outre, cela n'a pas beaucoup de sens de définir une couleur d'arrière-plan dans les modes texte, car l'affichage du texte occupe presque tout l'écran avec seulement deux ou trois lignes raster restantes pour la sortie d'une couleur de bordure. Le contenu de ce registre de palette est ignoré lorsqu'un moniteur monochrome est connecté.
Pour appeler la fonction d'accès à ce registre de palette, il faut d'abord charger le registre AH avec le numéro de fonction 10h et le registre AL avec le numéro de sous-fonction 01h. Le registre BH contient la couleur de bordure, étant ensuite chargée dans le registre de palette 16 lorsque la fonction est appelée.
La sous-fonction 02h de la fonction 10h est utilisée lorsque l'on veut charger tous les registres de la palette en même temps, y compris le registre de la couleur de bordure. Outre les numéros de fonction et de sous-fonction respectivement dans AH et AL, l'adresse d'une table doit être transmise dans la paire de registres ES:DX. Ce tableau contient les valeurs des 17 registres de palette. Lorsque cette fonction est exécutée, le contenu de cette table sera copié dans les 17 registres de la palette et fera changer toutes les couleurs à l'écran en même temps.
La dernière sous-fonction de la fonction 10h (uniquement pour EGA) définit la signification d'un bit dans les modes texte. Comme pour les cartes CGA et MDA, ce bit peut également être utilisé sur la carte EGA pour mettre en valeur un caractère en l'affichant sur une couleur de fond claire ou en le faisant clignoter, si le bit est défini. Alors que la signification de ce bit ne peut être modifiée qu'en programmant directement le matériel vidéo avec des cartes CGA ou MDA, le BIOS des EGA et VGA peut effectuer la même tâche en utilisant la sous-fonction 03h de la fonction 10h.
Comme pour l'appel des autres sous-fonctions, les numéros de fonction et de sous-fonction doivent être passés dans les registres AH et AL. La signification du bit sept de l'octet d'attribut est déterminée par le contenu du registre BL. La valeur zéro dans ce registre définit la couleur d'arrière-plan claire, tandis que la valeur un fait clignoter tous les caractères à l'écran, avec le bit sept de leurs octets d'attribut définis. La carte VGA dispose de fonctions supplémentaires permettant d'accéder à cette table. Ces fonctions sont toutes des sous-fonctions de la fonction 10h, et ne sont accessibles qu'à partir de la carte VGA.
Le contenu d'un seul registre de couleur DAC peut être modifié à l'aide de la sous-fonction 10h. Charger le registre AL avec le numéro de la sous-fonction, le registre BX avec le numéro du registre correspondant (0 à 255) et les registres CH, CL et DH avec le code couleur. Appelez ensuite la fonction. Pour aider à interpréter correctement le contenu de ce registre, la table de couleurs DAC doit être codée comme une valeur de 18 bits (6 bits pour le rouge, 6 bits pour le vert et 6 bits pour le bleu). Les composantes rouges doivent être chargées dans le registre DH, les composantes vertes dans le registre CH et les composantes bleues dans le registre DL.
Vous devez charger le numéro du registre à mettre à jour dans le registre BX. Les registres reçoivent le numéro du registre DAC à mettre à jour lorsque vous appelez la sous-fonction 15h.
N'importe quel nombre de registres de couleur DAC peut être chargé à la fois à l'aide de la sous-fonction 12h. Le numéro du premier registre de couleur DAC à charger est transmis au registre BX, et le nombre de registres de couleur DAC à charger est transmis au registre CX. Le nouveau contenu des registres de couleurs du DAC est chargé dans un tampon (l'adresse de ce tampon est contenue dans la paire de registres ES:DX). Chaque registre de couleur DAC reçoit trois octets consécutifs de ce tampon. Ces trois octets précisent les composantes vertes, les composantes rouges et les composantes bleues du code couleur.
Lecture de la table des couleurs DAC
La sous-fonction 17h lit le contenu d'un groupe de registres de couleur DAC. Le numéro du premier registre de couleur DAC à lire est passé au registre BX, et le nombre de registres est passé au registre CX. Le contenu de ce registre copie le BIOS du VGA dans un tampon, dont le segment et l'adresse de déplacement se trouvent dans la paire de registres ES:DX. La structure est identique à celle de la sous-fonction 12h. N'oubliez pas que les registres de chaque registre de couleur DAC se composent de trois octets (pas un), et d'allouer un tampon de taille appropriée.
Organisation de la table des couleurs DAC
La sous-fonction 13h permet l'organisation de la table des couleurs DAC et du groupe de couleurs actives, offrant deux de ses propres sous-fonctions. Si le registre BL contient la valeur 0, alors la sous-fonction recopie le bit 0 du registre BH dans le bit 7 du registre de contrôle de mode du contrôleur VGA. L'organisation de la table des couleurs DAC peut alors être décomposée en 4 ou 16 groupes. Cependant, si le registre BL contient la valeur 1 lorsque cette sous-fonction est appelée, alors la sous-fonction copie le contenu du registre BH dans le registre de sélection de couleur, puis sélectionne le groupe de couleurs actif.
Le contenu des deux registres peut être véhiculé en appelant la sous-fonction 1Ah. Après avoir appelé cette fonction, le contenu du bit 7 du registre de commande de mode est transmis au registre BL et le contenu du registre de sélection de couleur est transmis au registre BH.
Échelles de gris
La sous-fonction 1Bh convertit les codes de couleur dans la table de couleurs DAC en échelles de gris. Passez le numéro du premier registre à convertir en registre BX, et le nombre de registres à convertir en registre CX. La conversion donne une valeur de couleur comprise entre 0 (noir) et 1 (blanc), basée sur une intensité rouge de 30 %, une intensité verte de 59 % et une intensité bleue de 11 %.
Registres de palette
Le BIOS du VGA a encore plus de sous-fonctions dans la fonction 10h pour lire les registres de palette. La sous-fonction 07H lit le contenu de n'importe quel registre de palette. Lorsque la fonction est passée et que le numéro du registre de palette est passé au registre BL, le numéro du contenu est renvoyé dans le registre BH. Ceci permet un accès en lecture au contenu du registre de surbalayage (la bordure de couleur sur le registre palette 16), mais cet accès nécessite l'utilisation de la sous-fonction 08h. Comme la sous-fonction 07h, le résultat est chargé dans le registre BH.
La sous-fonction 09h charge le contenu de la table de palette entière (c'est-à-dire les 16 registres de palette et les registres de surbalayage) dans un tampon de 17 octets. L'adresse de segment de ce tampon est chargée dans le registre ES et l'adresse de déplacement est chargée dans le registre DX.
Une autre caractéristique des cartes EGA et VGA est leur capacité à travailler avec un certain nombre de polices et de tailles de police de caractères différentes. Cette fonctionnalité permet aux cartes EGA et VGA d'être utilisées avec différents moniteurs, dans différentes résolutions. Étant donné que la résolution de l'écran est déterminée par le matériel du moniteur et ne peut pas être modifiée, la carte vidéo doit s'adapter à la résolution du moniteur. Les exceptions à la règle sont les moniteurs multisync plus polyvalents et coûteux, qui tirent leur nom de la capacité de s'adapter à différentes synchronisations (résolutions).
Parmi les différents moniteurs pouvant être utilisés avec une carte EGA ou VGA, le moniteur couleur, normalement utilisé avec une carte CGA, a la résolution la plus faible. Il n'a qu'une résolution de 640 pixels (direction horizontale) par 200 pixels (direction verticale). Si vous souhaitez afficher 25 lignes de 80 colonnes chacune à l'écran, vous devrez utiliser une matrice de caractères de 8 par 8 pixels afin que tous les caractères tiennent sur l'écran.
Même si le moniteur monochrome ne peut pas afficher différentes couleurs, il offre une résolution de 720 par 350 pixels lorsqu'il est utilisé avec une carte graphique MDA ou Hercules. Les caractères individuels sont affichés avec une matrice de 9 par 14 pixels.
Les moniteurs EGA et multisync ont également une résolution verticale de 350 pixels, mais ne peuvent afficher que 640 pixels horizontalement. La résolution des caractères individuels est de 8x14 pixels, légèrement inférieure à celle des moniteurs monochromes. Les cartes VGA et les moniteurs multisynchrones prennent généralement en charge une résolution verticale minimale de 480 pixels, mais certaines unités prennent même en charge 600 lignes raster. Les cartes VGA permettent souvent des matrices de caractères de 8x16 (mode texte) et 9x16 pixels.
Générateurs de caractères
Afin de prendre en charge les différentes résolutions, les cartes EGA et VGA ont leurs propres générateurs de caractères pouvant afficher des caractères dans n'importe quelle hauteur entre 1 et 32 lignes tramées. Le nombre de lignes de texte par écran dépend de la hauteur des caractères affichés et de la résolution du moniteur. Pour tirer le meilleur parti de cette fonctionnalité, les cartes EGA et VGA obtiennent les modèles de bits des caractères à partir d'une section de la RAM vidéo au lieu de la ROM.
Fonction 11h
Normalement, le générateur de caractères est programmé automatiquement et l'ensemble de caractères approprié est chargé lorsqu'un mode vidéo est initialisé, mais il est possible qu'un programme contrôle ces fonctionnalités avec la fonction 11h. Vous souhaiterez peut-être l'utiliser pour afficher plus que les 25 lignes de texte habituelles sur un moniteur monochrome, EGA ou multisync. Mais même si vous souhaitez utiliser 25 lignes, ces fonctions offrent la possibilité de redéfinir des caractères individuels d'un ensemble de caractères ou d'installer un ensemble de caractères entièrement nouveau. Cela peut être fait avec la sous-fonction 00h. Comme toutes les sous-fonctions de la fonction 11h, la valeur 11h doit être passée dans le registre AH et le numéro de la sous-fonction doit être passé dans le registre AL. Un certain nombre d'autres paramètres doivent également être passés dans les autres registres du processeur. Le registre BH entrepose la hauteur des caractères individuels. Étant donné que cette fonction est destinée à modifier des caractères individuels d'un ensemble de caractères actuel, vous devez charger ici la hauteur de ces caractères. Comme mentionné ci-dessus, la hauteur des caractères sur les moniteurs monochromes, EGA ou multisync est normalement de 14 lignes (ou avec la carte VGA, 16 lignes sur un moniteur VGA ou multisync), tandis que sur les moniteurs couleur, elle est de 8 lignes. Le registre BL entrepose le numéro de la table de caractères dans laquelle le caractère sera chargé. Théoriquement, un numéro de 0 à 3 peut être donné ici pour l'une des quatre tables de caractères différentes, mais vous devez vous limiter à modifier la table de caractères 0, car c'est la seule table garantie accessible par les cartes EGA avec moins de 256 Ko de RAM. Cette table de caractères est également celle dans laquelle le BIOS du EGA charge les définitions de caractères lorsque le mode vidéo est initialisé avec la fonction 00h. Étant donné que vous ne souhaitez peut-être pas redéfinir tout l'ensemble de caractères, le registre CX contient le nombre de caractères à définir (maximum de 256). Le numéro du premier caractère à définir est placé dans le registre DX et ne doit pas dépasser la valeur 255.
Les définitions de caractères elles-mêmes sont entreposées dans un tampon dont l'adresse est transmise dans la paire de registres ES:BP. Les modèles de bits des caractères individuels sont placés dans ce tampon de sorte que la hauteur de chaque caractère (registre BH) spécifie également le nombre d'octets par caractère dans le tampon.
Les caractères individuels sont entreposés séquentiellement, de sorte que la taille totale du tampon correspond au nombre de caractères multiplié par la hauteur des caractères. Les 8 bits de chaque octet reflètent l'état des pixels individuels dans chaque ligne raster. Si un bit est défini, le pixel apparaîtra à la position correspondante dans la couleur de premier plan. Si le bit est effacé, le pixel apparaîtra dans la couleur d'arrière-plan. Notez que la matrice de caractères est en fait large de huit pixels, même si les caractères sont affichés avec une largeur de neuf pixels sur un écran monochrome. Dans ce cas, le neuvième bit n'est pas extrait de la définition de caractère, le dernier bit de chaque ligne est simplement dupliqué.
Tant que les caractères avec les codes ASCII appropriés sont affichés à l'écran, les changements seront perceptibles immédiatement après l'appel de cette fonction.
Alors que la sous-fonction 00h peut être utilisée pour charger des caractères définis par l'utilisateur dans l'ensemble de caractères, les sous-fonctions 01h et 02h sont utilisées pour charger les deux ensembles de caractères ROM contenus sur la carte EGA et VGA. La sous-fonction 01h charge l'ensemble du jeu de caractères 8x14 de la carte EGA et VGA dans l'une des quatre tables de caractères. La sous-fonction 02h charge l'ensemble de caractères compatible CGA 8x8 dans l'une des quatre tables de caractères. En plus des numéros de fonction et de sous-fonction, les deux fonctions reçoivent le numéro de la table de caractères dans laquelle l'ensemble de caractères doit être chargé dans le registre BL. Si la table de caractères concernée est celle actuellement affichée à l'écran, les modifications seront visibles immédiatement après l'appel de la fonction. Bien que ces deux fonctions chargent les ensembles de caractères, elles ne définissent pas le générateur de caractères à la hauteur de l'ensemble de caractères approprié. Par exemple, si vous chargez l'ensemble de caractères 8x8 dans la table de caractères actuelle alors que les caractères sont affichés dans une matrice 8x14, vous obtiendrez un affichage. Les lignes raster 1 à 8 auront le bitmap d'un ensemble de caractères 8x8 tandis que les lignes neuf à 14 auront le reste de l'ensemble 8x14.
La sous-fonction 04h (disponible uniquement pour VGA) a un objectif similaire aux sous-fonctions 01h, 02h et 03h. La différence est que l'appel de la sous-fonction 04h charge l'ensemble de caractères ROM 8x16 dans l'une des quatre tables de caractères.
Si vous souhaitez travailler avec plusieurs ensembles de caractères en parallèle, il est recommandé de charger les ensembles de caractères individuels dans leurs propres tables de caractères, puis de basculer entre les tables. La sous-fonction 03h permet de basculer vers une nouvelle table de caractères. En plus des numéros de fonction et de sous-fonction, il faut passer le numéro de la table de caractères à activer dans le registre BL.
Les sous-fonctions 10h, 11h et 12h sont presque identiques aux sous-fonctions 00h, 01h et 02h. Ils sont également utilisés pour charger des ensembles de caractères, mais ils programment en même temps le générateur de caractères. Cela a pour résultat que les caractères sont affichés avec la bonne hauteur de caractère après l'appel de la fonction. Le nombre de lignes de texte à l'écran change automatiquement.
La fonction 10h est utilisée pour charger et activer des ensembles de caractères définis par l'utilisateur et est appelée exactement comme la fonction 00h. Le nombre de lignes de texte affichées après l'appel de la fonction résulte de la résolution verticale du moniteur divisée par la hauteur des caractères individuels. Si cette division n'est pas paire et qu'il y a un reste, les lignes restantes seront divisées également entre les bordures supérieure et inférieure de l'écran. Les lignes de texte partielles ne sont pas affichées.
Les sous-fonctions 11h et 12h chargent et activent des jeux de caractères entiers. Si l'ensemble de caractères 8x14 est chargé avec la sous-fonction 11h et qu'un moniteur monochrome, EGA ou multisync est utilisé, 25 lignes (EGA) ou 28 lignes (VGA) seront affichées à l'écran. Si cela est fait alors qu'un moniteur couleur est connecté, ayant une résolution verticale de seulement 200 lignes, seules 14 lignes seront affichées à l'écran.
Ces changements doivent également être pris en compte lors de l'appel de la fonction 12h, chargeant et activant l'ensemble de caractères 8x8. Les 25 lignes habituelles seront visibles sur un moniteur couleur, alors que sur les autres moniteurs l'écran sera composé de 43 lignes de texte (EGA) ou 50 lignes de texte (VGA).
Le BIOS VGA a une sous-fonction supplémentaire. Lorsque la sous-fonction 14h est appelée, elle charge et active l'ensemble de caractères ROM 8x16. Seulement 25 lignes de texte apparaîtront à l'écran.
Quel que soit le nombre de lignes de texte résultant de l'appel de l'une de ces fonctions, le BIOS EGA garantit que les fonctions traditionnelles du BIOS pour la sortie d'écran (numéros de fonction 00H à 0Fh) fonctionneront toujours correctement. Même si l'écran contient 43 lignes, vous pouvez appeler les fonctions de sortie de caractères, faire défiler l'écran et accéder aux lignes en dehors de la limite habituelle de 125 lignes. Cependant, vous devez éviter d'utiliser plusieurs pages d'écran et utiliser uniquement la page 0, sinon vous risquez de rencontrer des problèmes avec les versions du BIOS de divers fabricants.
Émulation de curseur
Certaines cartes EGA peuvent avoir des problèmes avec le mécanisme appelé émulation de curseur. Cela implique de convertir les lignes de début et de fin du curseur lorsque la hauteur de la matrice de caractères est modifiée. Par exemple, si la hauteur des caractères diminue de 14 à 8 lignes, le curseur sera invisible s'il se trouvait dans la plage de lignes raster de 9 à 14. Pour éviter cela, le BIOS convertit les lignes de début et de fin dans la nouvelle matrice hauteur. Ce mécanisme doit être désactivé au début d'un programme. Malheureusement, aucune fonction pour ce faire n'existe dans le BIOS EGA; la seule façon de le désactiver est d'effacer un indicateur dans l'une des variables du BIOS (bit 0 dans l'octet à l'adresse 0040:0087).
Fonction 12h
Toutes les fonctions décrites jusqu'à présent ne peuvent être utilisées qu'avec une carte EGA ou une carte VGA Pour déterminer si une carte EGA/VGA est installée, le BIOS EGA/VGA offre la fonction 12h, n'étant pas disponible dans le BIOS en ROM normale. Il est appelé avec le numéro de fonction dans AH et la valeur 10h dans le registre BL. Si cette valeur est toujours dans le registre BL après l'appel, vous pouvez supposer qu'aucune carte EGA/VGA n'est disponible et que le ROM-BIOS normal a été appelé, ce qui ne prend pas en charge cette fonction. Une valeur différente indique qu'une carte EGA ou VGA est disponible. Dans ce cas, les registres BH, BL et CL contiennent des informations de configuration sur la carte EGA/VGA installée.
La valeur dans BH spécifie le mode vidéo qui sera activé après le démarrage du système. Puisqu'un autre mode a pu être activé entre-temps, cette information est de peu d'utilité. La valeur dans le registre CL, qui vous indique quel type de moniteur la carte pilote, est beaucoup plus utile. Les valeurs suivantes sont renvoyées pour les types de moniteurs individuels :
Valeur | Description |
---|---|
0Bh | Moniteur monochrome |
09h | Moniteur haute résolution (EGA/VGA ou multisync) |
08h | Moniteur couleur |
Le contenu du registre BL est également utile. Ils spécifient la quantité de RAM installée dans la carte EGA. Les codes suivants peuvent apparaître :
Valeur | Description |
---|---|
0 | 64 Ko |
1 | 128 Ko |
2 | 192 Ko |
3 | 256 Ko |
Cette distinction est importante si vous souhaitez travailler avec plusieurs tables de caractères ou avec les modes graphiques haute résolution de la carte EGA ou VGA. Par exemple, le numéro de mode graphique 10h, offrant une résolution de 640x350 pixels, ne peut être utilisé que si la carte EGA ou VGA dispose d'au moins 128 Ko de RAM. Le nombre de tables de caractères disponibles dépend également de la taille de la RAM. Ceci peut être déterminé en incrémentant de 1 le nombre retourné dans le registre BL.
Fonction 1Ah
La fonction 1Ah, sous-fonction 00h informe l'utilisateur si une carte EGA ou une carte VGA est installée. Cette fonction n'est disponible que pour les cartes VGA. Vous devez passer le numéro de fonction au registre AH et placer la valeur 00H dans le registre AL. Ceci détermine si une carte VGA est installée. Si la valeur 00h reste inchangée, aucune carte VGA n'est disponible. tandis qu'une valeur renvoyée de 1Ah indique une carte VGA. Le contenu du registre BL indique le mode vidéo actif :
Code | Description |
---|---|
00h | Pas de carte vidéo |
01h | Carte MDA/moniteur monochrome |
02h | Carte CGA/moniteur couleur |
03h | Réservé |
04h | Carte EGA/moniteur haute résolution |
05h | Carte EGA/moniteur monochrome |
06h | Réservé |
07h | Carte VGA/moniteur monochrome analogique |
08h | Carte VGA/moniteur couleur analogique |
La fonction 12h, la sous-fonction 20h peut être utilisée pour installer une routine d'impression alternative. Ceci peut être utilisé lorsque l'écran affiche plus ou moins de 25 lignes. Étant donné que la routine de copie papier normale du BIOS suppose qu'il y a 25 lignes à l'écran, il imprime toujours exactement 25 lignes, ce qui peut omettre certaines lignes de la copie papier. La copie papier alternative du BIOS EGA/VGA tient toujours compte du nombre réel de lignes affichées à l'écran et est donc préférable à la routine de copie papier normale. Il est installé en appelant l'interruption vidéo 10h du BIOS, la valeur 12h étant passée dans le registre AH et la valeur 20h devant être dans le registre BL.
Le BIOS VGA comprend six autres sous-fonctions de la fonction 12h, exclusivement pour le contrôle de la carte VGA. La sous-fonction 30h permet de déterminer le nombre de lignes raster disponibles (pas de lignes de texte) lorsqu'un VGA fonctionne avec un moniteur VGA ou multisync. En mode CGA, cela devient seulement 200 lignes au lieu de 400. Le numéro de sous-fonction doit être chargé dans le registre BL. Le BIOS VGA interprète le nombre qu'il trouve dans le registre AL comme le nombre de lignes raster. Une valeur de 0 dans le registre AL indique 200, la valeur 1 indique 350 et la valeur 2 indique 400 lignes raster.
En collaboration avec la sélection de couleurs comme mentionné ci-dessus, afin que les cartes EGA et VGA puissent charger leurs palettes ou leurs registres DAC, le spectre de couleurs d'une carte CGA peut être émulé. La sous-fonction 31h active ou désactive cette émulation dans la carte VGA après appel de la fonction 00h (sélection du mode vidéo). L'appel de cette sous-fonction signalée par la valeur 0 dans le registre AL active le feu vert, tandis qu'une valeur de 1 indique au BIOS VGA d'éviter de charger le registre correspondant.
Échelle de gris automatique
La sous-fonction 33h spécifie l'état de la sommation automatique des niveaux de gris. Cette sommation indique aux accès du BIOS à la table de couleurs DAC de convertir automatiquement les valeurs de couleur en échelles de gris. Le contenu du registre AL indique cet état : une valeur de 0 indique la conversion activée, tandis qu'une valeur de 1 indique aucune conversion.
La fonction 12h, sous-fonction 34h commande la suppression de l'émulation du curseur. Une valeur de 0 dans le registre AL active l'émulation de curseur, tandis qu'une valeur de 1 supprime cette émulation.
Fonction 13h
Nous mentionnerons une dernière fonction du BIOS EGA/VGA. Ce n'est pas exactement nouveau, car il était déjà dans la ROM du BIOS du PC AT, mais ce n'était pas dans le BIOS du PC ou du XT. Il s'agit de la fonction 13h affichant une chaîne de caractères à l'écran. Il existe quatre modes de sortie différents disponibles, différant par la manière dont la chaîne de caractères est transmise au BIOS et si le curseur sera placé ou non à la fin de la chaîne de caractères lorsque la sortie est terminée. En outre, les fonctions diffèrent selon que tous les caractères de la chaîne de caractères reçoivent une couleur constante ou sont dotés d'attributs individuels. Dans le premier cas, le tampon dont l'adresse est passée dans le couple de registres ES:BP ne doit contenir que les codes ASCII des caractères à afficher. La couleur de tous les caractères est tirée du registre BL. Dans le second cas, l'octet d'attribut de chaque caractère suit son code ASCII dans le tampon.
Le contenu du registre AL détermine le mode étant utilisé :
Valeur | Description |
---|---|
0 | Une couleur pour tous les caractères. La position du curseur ne change pas. |
1 | Une couleur pour tous les caractères. Le curseur sera placé après le dernier caractère de la chaîne de caractères. |
2 | Le tampon contient les attributs individuels. La position du curseur ne change pas. |
3 | Le tampon contient les attributs individuels. Le curseur sera placé après le dernier caractère de la chaîne de caractères. |
Le numéro de la page écran sur laquelle la chaîne de caractères doit apparaître peut être spécifié dans le registre BH, mais il doit toujours s'agir de la page courante. Sinon, des problèmes surviendront lors de l'impression des caractères de contrôle (retour chariot, saut de ligne,...). Le registre CX contient la longueur de la chaîne de caractères. Il s'agit du nombre de caractères à afficher (les attributs ne doivent pas être comptés dans les modes 2 et 3). La position de sortie est transmise à la fonction 13h dans les registres DH (ligne) et DL (colonne). Et, enfin, il ne faut pas oublier le numéro de fonction dans le registre AH.