Les modes texte --------------- Introduction ------------ Faisons une petite trève avec les modes graphiques du VGA pour nous intéresser de plus près aux modes texte qui sont encore très utilisés, surtout sous DOS. Ils sont plus rapides que les modes graphiques et permettent l'utilisation de plusieurs pages. Certains modes graphiques comme le Mode-X, l'autorisent, c'est plus esthétique mais c'est aussi plus lent. La résolution des modes texte est moins grande mais des effets tout à fait satisfaisant peuvent être programmés avec un peu de patience en mode texte. Comment mettre en place ces modes ? ----------------------------------- Nous n'allons pas voir les modes non-standards dit "Vesa" car ils demandent une programmation un peu plus compliquée. Par contre, le BIOS nous propose quelques modes très intéressants et parfaitement suffisants pour faire de petits effets. En voici quelques uns : 00 = 40x25 avec 16 couleurs 02 = 80x25 avec 16 niveaux de gris 03 = 80x25 avec 16 couleurs Le mode 03 est le plus courant, c'est celui du DOS. Pour pouvoir mettre en place un des ces modes, vous devez appeler l'interruption 10h : mov ax,numero_mode int 10h Pour le mode 80x25 - 16 coul : mov ax,03 int 10h A partir de ce moment, nous pouvons afficher du texte : mov ax,03 int 10h lea dx,message ;on met dans DX, l'offset de "message" mov ah,09h int 21h ret message db 'Texte - Texte$' Cela aura pour effet d'afficher le texte et de revenir au DOS. Cependant, vous ne pouvez pas utiliser de couleurs. Il y a deux possibilités. Soit on utilise des fonctions de l'interruption 010h ou alors, on travaille avec la mémoire texte. C'est la deuxième possibilité que nous allons voir. Utilisation de la mémoire texte ------------------------------- Nous travaillons en mode 80x25 ce qui fait 2000 caractères. Pour pouvoir désigner la couleur, nous utiliserons 2000 autres octets. Une page texte fait donc 4000 octets. La mémoire du texte se trouve à l'emplacement 0B800h:0000 tandis que la mémoire vidéo se trouve à 0A000h:0000. Nous allons mettre dans ES, la valeur du segment, ici 0B800h et se placer au premier caractère. mov ax,03 int 10h push 0b800h pop es xor di,di ret Nous avons maintenant dans ES:DI, l'adresse de la mémoire texte. Un caractère, dans la mémoire texte, est décomposé en deux parties : |caractère|couleur| AL AH Un caractère est donc un Word. Nous plaçons le caractère "E" avec la couleur jaune dans la mémoire texte (ES:DI pointe sur la mémoire texte) : mov al,'E' mov ah,14 mov es:[di],ax N'oubliez pas que pour afficher le caractère suivant, il faut incrémenter DI de 2. Ici, A86 et les autres assembleurs, nous permettent de mettre le caractère entre des ' '. Cela indique à l'assembleur que nous voulons le code du caractère entre apostrophes. Vous pouvez maintenant modifier la couleur de chaque caractère qui se trouve à l'écran... Le flipping des pages --------------------- La particularité du mode texte est de permettre le page-flipping. Il s'agit d'une techique qui consiste à écrire dans une page qui n'est pas visible pendant que l'on affiche une page déjà calculée. Ensuite, on inverse l'ordre des pages. Cela évite les effets de scintillements et de coupures. La page n'est affichée que lorsqu'elle est entièrement calculée. Cela n'est pas possible en mode graphique 13h (on peut le faire mais c'est plus compliqué). L'autre possibilité pour faire du page-flipping en mode graphique est l'utilisation du mode-x (ou le vesa 2.0). Donc, le mode texte nous permet le page-flipping. La première page se trouve à l'offset 0 et la seconde à l'offset 4096 et non 4000. L'offset de la seconde n'est pas à 4000 car on ne peut travailler que par incrément de 512... Pour afficher un caractère sur la seconde page qui n'est pas visible au début : mov al,'E' mov ah,14 mov es:[di+4096],ax Voila, nous plaçons dans DI+4096, le nouveau caractère. Maintenant, nous allons utiliser un registre de la carte VGA pour faire le flipping. Nous allons indiquer à l'index 03D4h (CRTC), registre 0c4h qui s'appelle "Linear Starting Address High", le nouvel emplacement de départ de la mémoire texte (voir chapitre sur la vidéo pour savoir ce qu'est le CRTC). FLIP1 PROC mov dx, 3D4h mov al, 0Ch mov ah, 0 ;emplacement 0*512=0 - c'est la première page out dx, ax ret FLIP1 ENDP FLIP2 PROC mov dx, 3D4h mov al, 0Ch mov ah, 8 ;emplacement 8*512=4096 - c'est la deuxième page out dx, ax ret FLIP2 ENDP En appellant FLIP1, on affiche la page1 et en appellant FLIP2, on affiche la page 2. Donc le page-flipping consiste à appeller FLIP1 pendant que l'on écrit les caractères dans la page 2 et dès qu'on a fini, on appelle FLIP2 et on écrit dans la page 1. On continue comme ça... D'autres modes et techniques ---------------------------- Vous avez sûrement déjà vu le mode texte 80x50, les caractères sont carrés. Voici la procédure pour l'initialiser : mov ax,03h int 10h xor ax,1111h int 10h On l'utilise comme le mode 80x25. Si vous voulez enlever le curseur qui peut parfois être gênant, utilisez cela: ENLEVE: mov ax,0100h mov cx,02607h int 10h Pour l'afficher à nouveau, soit vous réinitialisez le mode texte ou vous faîtes : AFFICHE: mov ax,0100h mov cx,0506h int 10h ### Chapitre 11 - dake / c a l o d o x ### ### http://www.space.ch/scene/calodox ###