Copy Link
Add to Bookmark
Report

Tutorial Assembleur - Chapitre 11

eZine's profile picture
Published in 
Tutorial Assembleur
 · 4 years ago

  

TUTORIAL ASSEMBLEUR - chapitre 11
---------------------------------

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


← previous
loading
sending ...
New to Neperos ? Sign Up for free
download Neperos App from Google Play
install Neperos as PWA

Let's discover also

Recent Articles

Recent Comments

Neperos cookies
This website uses cookies to store your preferences and improve the service. Cookies authorization will allow me and / or my partners to process personal data such as browsing behaviour.

By pressing OK you agree to the Terms of Service and acknowledge the Privacy Policy

By pressing REJECT you will be able to continue to use Neperos (like read articles or write comments) but some important cookies will not be set. This may affect certain features and functions of the platform.
OK
REJECT