Les modes texte
---------------

Introduction
------------

Faisons une petite trve avec les modes graphiques du VGA pour nous
intresser de plus prs aux modes texte qui sont encore
trs utiliss, 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
esthtique mais c'est aussi plus lent. La rsolution des
modes texte est moins grande mais des effets tout  fait satisfaisant
peuvent tre programms 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 complique. Par contre, le BIOS nous propose
quelques modes trs intressants 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
possibilits. Soit on utilise des fonctions de l'interruption 010h ou
alors, on travaille avec la mmoire texte. C'est la deuxime
possibilit que nous allons voir. 

Utilisation de la mmoire texte
-------------------------------

Nous travaillons en mode 80x25 ce qui fait 2000 caractres.
Pour pouvoir dsigner la couleur, nous utiliserons 2000 autres
octets. Une page texte fait donc 4000 octets. La mmoire du texte se
trouve  l'emplacement 0B800h:0000 tandis que la
mmoire vido se trouve  0A000h:0000. Nous allons mettre dans ES,
la valeur du segment, ici 0B800h et se placer au
premier caractre.

mov ax,03
int 10h
push 0b800h
pop es
xor di,di    
ret

Nous avons maintenant dans ES:DI, l'adresse de la mmoire texte.
Un caractre, dans la mmoire texte, est dcompos en deux parties :

|caractre|couleur|
   AL        AH

Un caractre est donc un Word. Nous plaons le caractre "E" avec la couleur
jaune dans la mmoire texte (ES:DI pointe sur la mmoire texte) :

mov al,'E'
mov ah,14
mov es:[di],ax

N'oubliez pas que pour afficher le caractre suivant, il faut
incrmenter DI de 2. Ici, A86 et les autres assembleurs, nous
permettent de mettre le caractre entre des ' '. Cela indique  l'assembleur
que nous voulons le code du caractre entre
apostrophes. Vous pouvez maintenant modifier la couleur de chaque caractre
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 dj calcule.
Ensuite, on inverse l'ordre des pages. Cela vite les effets de
scintillements et de coupures. La page n'est affiche que lorsqu'elle
est entirement calcule. 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 premire 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 incrment de 512... Pour afficher un caractre
sur la seconde page qui n'est pas visible au dbut :

mov al,'E'
mov ah,14
mov es:[di+4096],ax

Voila, nous plaons dans DI+4096, le nouveau caractre. 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 dpart de la
mmoire texte (voir chapitre sur la vido 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 premire 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 deuxime 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 caractres dans la page 2 et ds 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 srement dj vu le mode texte 80x50, les caractres sont carrs.
Voici la procdure 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 gnant, utilisez cela:

ENLEVE:  
mov ax,0100h
mov cx,02607h           
int 10h

Pour l'afficher  nouveau, soit vous rinitialisez le mode texte ou
vous fates :

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


