CONTROLE DE L'AFFICHAGE

A. Changement de base numérique.

FORTH ne traite pas n'importe quels nombres. Ceux que vous avez utilisés en essayant les précédents exemples sont des entiers signés 16 bits. Le domaine de définition des entiers 16 bits est compris entre moins 32768 et plus 32767. Exemple:

32767 .    affiche    32767
-32768 .    affiche    -32768
65535 .    affiche    -1

Ces nombres peuvent être traités dans n'importe quelle base numérique, toutes les bases numériques situées entre 2 et 36 étant valides:

255 HEX . DECIMAL    affiche    FF

On peut choisir une base numérique encore plus grande, mais les symboles disponibles sortiront de l'ensemble alpha-numérique [0..9,A..Z] et risquent de devenir incohérents. Exemple:

DECIMAL 255 BASE !
ò 2 + .

fonctionnera, mais n'est guère concevable sur un plan sémantique.

La base numérique courante est controlée par une variable nommée BASE et dont le contenu peut être modifié. Ainsi, pour passer en binaire, il suffit de stocker la valeur 2 dans BASE. Exemple:

2 BASE !

et de taper DECIMAL pour revenir à la base numérique décimale.

TURBO-Forth dispose de trois mots pré-définis permettant de sélectionner différentes bases numériques:

-DECIMALpour sélectionnner la base numérique décimale. C'est la base numérique prise par défaut au démarrage de TURBO- Forth.

-HEX pour sélectionner la base numérique hexadécimale.

-OCTAL pour sélectionner la base numérique octale.

Dès sélection d'une de ces bases numériques, les nombres litéraux seront interprétés, affichés ou traités dans cette base. Tout nombre entré précédemment dans une base numérique différente de la base numérique courante est automatiquement converti dans la base numérique actuelle. Exemple:

DECIMAL 255 HEX 1+ .    affiche     100
  \ base en décimal; ajout d'un chiffre; conversion en base hexadécimal; ajout de 1 au nombre héxadécimal.

On peut définir sa propre base numérique en définissant le mot approprié ou en stockant cette base dans BASE. Exemple:

: BINARY ( ---)      \ sélectionne la base numérique binaire
2 BASE ! ;
DECIMAL 255 BINARY .    affiche     11111111
  \ ?? Est-ce qu'en mettant A2 à la place de 255 il afficherait un résultat ??

Le contenu de BASE peut être empilé comme le contenu de n'importe quelle autre variable:

VARIABLE RANGE-BASE
BASE @ RANGE-BASE !
HEX FF 10 + .
RANGE-BASE @ BASE !

Dans une définition "deux-points", le contenu de BASE peut transiter par la pile de retour:

: OPERATION ( ---)
  BASE @ >R   \ stocke BASE sur pile de retour
  HEX FF 10 + .   \ opération du précédent exemple
  R> BASE ! ;   \ restaure valeur initiale de BASE

B. Définition de nouveaux formats d'affichage.

TURBO-Forth dispose de primitives permettant d'adapter l'affichage d'un nombre à un format quelconque. Ces primitives ne traitent que des nombres double précision:

<# débute une séquence de définition de format
# insère un digit dans une séquence de définition de format
#S équivaut à une succession de #
HOLD insère un caractère dans une définition de format
#> achève une définition de format et laisse sur la pile l'adresse et la longueur de la chaîne contenant le nombre à afficher

Ces mots ne sont utilisables qu'au sein d'une définition. Exemple, soit à afficher un nombre exprimant un montant libellé en francs avec la virgule comme séparateur décimal:

: FRANCS ( ud ---)
  <# # # ASCII , HOLD #S #>
  TYPE ." Fr " ;

Exemples d'exécution:

0.35 FRANCS    affiche     0,35 Fr
35.75 FRANCS    affiche     35,75 Fr
10.15 35.75 D+ FRANCS    affiche     45,90 Fr

La définition de FRANCS ne prend pas en compte le signe du résultat, ni la position de la virgule. Si vous tapez:

35. FRANCS vous aurez à l'affichage 0,35 Fr

Dans la définition de FRANCS, le mot <# débute la séquence de définition de format d'affichage; les deux mots # placent les chiffres des unités et des dizaines dans la chaîne de caractère; ASCII , HOLD placent le caractère , (virgule) à la suite des deux chiffres de droite; le mot #S complète le format d'affichage avec les chiffres non nuls à la suite de ,; le mot #> ferme la définition de format et dépose sur la pile l'adresse et la longueur de la chaîne contenant les digits du nombre à afficher; le mot TYPE affiche cette chaîne de caractères.

En exécution, une séquence de format d'affichage traite exclusivement des nombres entiers 32 bits signés ou non signés. La concaténation des différents éléments de la chaîne se fait de droite à gauche, c'est à dire en commençant par les chiffres les moins significatifs.

Le traitement d'un nombre par une séquence de format d'affichage est exécutée en fonction de la base numérique courante. La base numérique peut être modifiée entre deux digits.

Voici un exemple plus complexe démontrant la compacité du FORTH. Il s'agit d'écrire un programme convertissant un nombre quelconque de secondes au format HH:MM:SS:

: :00 ( ---)
  DECIMAL # 6 BASE ! # ASCII : HOLD DECIMAL ;
: HMS ( ud ---) <# :00 :00 #S #> TYPE SPACE ;

Exemples d'exécution:

59. HMS    affiche    0:00:59
60. HMS    affiche     0:01:00
4500. HMS    affiche     1:15:00

Explication: le système d'affichage des secondes et des minutes est appelé système sexagésimal. Les 'unités' sont exprimées dans la base numérique décimale, les 'dizaines' sont exprimées dans la base six. Le mot :00 défini précédemment gère la conversion des 'unités' et des 'dizaines' dans ces deux bases pour la mise au format des digits correspondants aux secondes et aux minutes. Pour les heures, les digits sont tous décimaux.

Autre exemple, soit à définir un programme convertissant un nombre entier 16 bits décimal en binaire et l'affichant au format bbbb bbbb bbbb bbbb:

: QUATRE-DIGITS ( ---)
  # # # # 32 HOLD ;
: AFB ( d ---) BASE @ >R
  2 BASE !
  <# 4 0
  DO QUATRE-DIGITS LOOP
  #> TYPE SPACE
  R> BASE ! ;

  \ mise au format 4 digits et un espace

  \ Sauvegarde base courante
  \ Sélection base numérique binaire
  \ Boucle de mise au format
  \ Affichage en binaire
  \ Restauration base numérique initiale

Exemple d'exécution:

DECIMAL 12. AFB    affiche     0000 0000 0000 0110
HEX 3FC5. AFB      affiche     0011 1111 1100 0101

Encore un exemple, soit à créer un agenda téléphonique où l'on associe à un patronyme un ou plusieurs numéros de téléphone. On définit un mot par patronyme:

: .## ( ---) # # ASCII . HOLD ;
: .TEL ( d ---)
  CR <# .## .## .## # # #> TYPE CR BYE ;
: JEDI ( ---) .43409653 .TEL ;
...ici votre agenda téléphonique...
: BTX ( ---) .36224949 .TEL ;
SAVE-SYSTEM APPEL.COM BYE

puis sous DOS:

APPEL JEDI affiche 43.40.96.53 et retourne sous DOS.

Cet agenda, qui peut être compilé depuis un fichier source, est facilement modifiable, et bien que les noms ne soient pas classés, la recherche y est extrêmement rapide.

C. Affichage des caractères et chaînes de caractères.

L'affichage d'un caractère est réalisé par le mot EMIT:

65 EMIT affiche A

Les caractères affichables sont compris dans l'intervalle 32..255. Les codes compris entre 0 et 31 seront également affichés, sous réserve de certains caractères exécutés comme des codes de contrôle. Voici une définition affichant tout le jeu de caractères de la table ASCII:

: JEU-ASCII ( ---)
  DARK 256 32
  DO I 3 .R SPACE     \ affiche code du caractère
    I EMIT 2 SPACES     \ affiche caractère
    #OUT @ 77 = IF CR THEN
  LOOP ;

L'exécution de JEU-ASCII affiche les codes ASCII et les caractères dont le code est compris entre 32 et 255. Pour afficher la table équivalente avec les codes ASCII en hexadécimal, taper HEX JEU-ASCII.

Les chaînes de caractères sont affichées de diverses manières. La première, utilisable en compilation seulement, affiche une chaîne de caractères délimitée par le caractère " (guillemet):

: TITRE ." MENU GENERAL" ;
TITRE    affiche     MENU GENERAL

La seconde, utilisable en interprétation seulement, affiche une chaîne de caractères délimitée par le caractère ) (parenthèse fermée). Ce mot est à réserver pour faire afficher un message depuis un fichier en cours de compilation:

.( MENU GENERAL)    affiche     MENU GENERAL

Dans les deux cas, la chaîne est séparée du mot ." ou .( par au moins un caractère espace.

Une chaîne de caractères peut aussi être compilée par le mot " (guillemet) et délimitée par le caractère " (guillemet):

: LIGNE1 " E..Enregistrement de données" ;

L'exécution de LIGNE1 dépose sur la pile de données l'adresse et la longueur de la chaîne compilée dans la définition. L'affichage est réalisé par le mot TYPE:

LIGNE1 TYPE
affiche E..Enregistrement de données

En fin d'affichage d'une chaîne de caractères, le retour à la ligne doit être provoqué s'il est souhaité:

TITRE LIGNE1 TYPE
affiche MENU GENERALE..Enregistrement de données

CR TITRE CR CR LIGNE1 TYPE CR
affiche
MENU GENERAL

E..Enregistrement de données

Un ou plusieurs espaces peuvent être ajoutés en début ou fin d'affichage d'une chaîne alphanumérique:

SPACE affiche un caractère espace
n SPACES affiche n caractères espace

On peut répéter l'affichage d'autres caractères en exécutant le mot REPLICATE précédé du code ASCII du caractère et du nombre de répétitions:

10 177 REPLICATE

affiche une barre formée de dix fois le caractère de code ASCII 177. Voici comment en un tour de main afficher un superbe graphique statistique:

: ANNEE$ " JAN FEV MAR AVR MAI JUN JUL AOU SEP OCT NOV DEC" ;
: GRAPHE ( n12 n11 n10...n1 ---)
  DEPTH 12 <
  ABORT" manque de données"   \ erreur si manque 12 données
  DARK 13 1
  DO ANNEE$ I ITEM TYPE   \ affiche libellé du mois
    SPACE 220 REPLICATE CR   \ affiche graphe et 2 retour chariot
  LOOP
3 SPACES 192 EMIT 72 1   \ affiche barre graduée
  DO I 5 MOD 0= IF 193 EMIT   \ affiche caractère 193 tous
    ELSE 196 EMIT THEN   \ les 5 caractères
  LOOP CR 2 SPACES 71 0   \ affiche unités sous barre
  DO I 0 <# # # #> TYPE 3 SPACES 5 +LOOP ;
: DATAS87 10 40 20 15 50 12 10 40 60 15 7 35 ;
: DATAS88 15 20 12 10 40 30 25 22 17 35 12 10 ;

DATAS88 GRAPHE


affiche le graphe des données délivrées par DATAS88

Pour centrer un texte, il faut le faire précéder de caractères espaces après un retour chariot. Le nombre d'espaces à afficher ou imprimer dépend du mode graphique ou du jeu de caractères sélectionnés.

DEFER LARGEUR
80 CONSTANT ECRAN   \ largeur écran vidéo
132 CONSTANT PAPIER   \ largeur papier=297mm
' ECRAN IS LARGEUR
  \ largeur par défaut=largeur écran monochrome
: .CENTRE ( adr long ---) LARGEUR OVER - 2/ SPACES
  \ centrage:=(LARGEUR-longTXT)/2
TYPE ;   \ affiche chaîne de caractères
CR " RESULTATS 1988" .CENTRE affiche la chaîne centrée

D. Contrôle de la position du curseur.

La position du curseur peut être dévcinie en utilisant le mot AT précédé du numéro de colonne et de ligne. Les indices contrôlant la position du curseur sont comprises dans l'intervalle 0..79 pour le numéro de colonne et 0..24 pour le numéro de ligne

Exemple:

0 0 AT 177 EMIT affiche un pavé gris en haut à gauche de l'écran
La position du curseur est mémorisé en permanence dans deux variable numérique #OUT et #LINE:

#OUT mémorise la position du curseur en colonne. Sa valeur est remise à zéro à chaque exécution d'un mots DARK ou CR. Lors de l'exécution de AT, la variable #OUT prend la valeur de la colonne de positionnement du curseur.

#LINE mémorise le nombre de lignes affichées depuis la dernière instructuin DARK. Sa valeur est mise à jour lors de l'exécution de AT avec la valeur de la ligne de positionnement du curseur. Le contenu de #LINE est incrémenté d'une unité à chaque exécution de CR.

Exemple, soit à provoquer un saut de page imprimante toutes les quarantes ligne:

: cr-ff ( ---)   \ carriage Ret + Form feed
    \ cr modifie pour faire un saut de page imprimante
    \ toutes les 40 lignes
#line @ 40 =   \ test si #line=40
if 12 emit   \ envoie saut de page
#line off   \ mise à zéro
#line else crlf   \ sinon exécution de crlf
then ;  
: pr-words ( ---)   \ words vers imprimante
#line off   \ mise à zéro
#line 5 lmargin !   \ marge de gauche à 5 caractères
40 rmargin !   \ marge de droite à 40 caractères
['] cr-ff is cr   \ vecteur cr-ff dans cr
printing on   \ imprimante activée
words cr   \ exécution de words suivi de cr
printing off   \ désactivation de l'imprimante
['] cr-ff is cr   \ vecteur cr-ff dans cr
0 lmargin !   \ marge de gauche initiale
0 rmargin !   \ marge de droite initiale

l'exécution de PR-WORDS imprime le contenu du dictionnaire FORTH sur 3 colonnes, avec une marge de gauche à 5 caractères-espace, et 40 lignes maximum par page. On remarquera qu'il n'a pas été nécessaure de réécrire WORDS pour obtenirce résultat. Le nombre de lignes à imprimer est controlé par CR-FF dont le code d'exécution devien vecteur de CR lequel est utilisé par WORDS, affirmation vacile à vérifier en tapent SEE WORDS (pour SEE, c'est à dire la fonction de décompilation, se rérérer au chapitre OUTILS D'AIDE ET DE MISE AU POINT)

E. Les attributs d'affichage.

Les attributs d'affichage sur les systèmes IBM et compatibles de type PC/XT/AT sont contrôlés de deux manières:

-soit en accès direct à la mémoire vidéo. Bien que donnant des résultats très spectaculaires du point de vue vitesse d'affichage, cette méthode comporte quelques inconvénients. Parmis ceux- ci, la diversité des cartes vidéo et pagination des écrans ne garantit pas toujours un résultat identique entre divers systèmes. En effet, les adresses et méthodes de contrôle du contenu de l'affichage vidéo varient énormément d'une carte vidéo à l'autre.

-soit en utilisant les séquences de type ESCAPE, c'est à dire commençant par le code 27 (1B en hexadécimal), et qui sont traitées par le code contenu dans le fichier ANSI.SYS. Le code de ANSI.SYS n'est opérationnel que si la ligne DEVICE=ANSI.SYS figure dans le fichier CONFIG.SYS et présent dans le répertoire racine de la disquette DOS ou du disque dur le cas échéant.

Au démarrage de TURBO-Forth, certains caractères de l'écran de présentation doivent apparaître en vidéo inverse et en surintensité. Si ce n'était pas le cas, vérifier le contenu du fichier CONFIG.SYS figurant sur votre disquette DOS ou dans le répertoire racine de votre disque dur.

Sinon, si l'affichage est parasité par des ]xx, vous pouvez désactiver le tratement des attributs vidéo en tapant:

ATTRIBUTS OFF

Pour réactiver le traitement des attributs vidéo, il faut taper:

ATTRIBUTS ON

L'effet de ces commandes est immédiat, comme on peut le constater sur l'intensité de l'affichage de OK.

Les différentes commandes de modification d'attributs sont:

BOLD    provoque la surintensité des caractères à afficher,

INVERS    provoque l'affichage en vidéo inverse des caractères à afficher,

UNDERL    provoque le soulignement des caractères à afficher. Cette commande produit des effets divers selon les systèmes. Sur les systèmes équipés de cartes couleur de type CGA/VGA, la commande UNDERL modifie la couleur de l'affichage,

BLINK    provoque le clignotement des caractères à afficher,

ATTOFF     désélectionne l'activation de tous les attributs.

Les effets des différentes commandes de modification d'attributs peuvent être cumulés:

: WARNING. ( str ---)
  BOLD   \ sélection surintensité
  BLINK   \ sélection clignotement
  TYPE   \ affichage de chaîne ATTOFF ;   \ désélection attributs et fin de définition
" DANGER" WARNING.

affiche     DANGER en surintensité et clignotant.

TURBO-Forth ne dispose pas de primitives pour gérer les attributs de couleur des systèmes équipés de cartes vidéo et écran couleur. Mais la définition des mots donnant accès à ces fonctions ne pose guère de problème

30 CONSTANT BLACK   \ noir
31 CONSTANT RED   \ rouge
32 CONSTANT GREEN   \ vert
33 CONSTANT YELLOW   \ jaune
34 CONSTANT BLUE   \ bleu foncé
35 CONSTANT MAGENTA   \ magenta
36 CONSTANT CYAN   \ bleu ciel
37 CONSTANT WHITE   \ blanc
: COLORS ( couleur-car. couleur-fond ---)
>R 0 R> 10 + 0   \ rend paramètres doubles
<# ASCII m HOLD   \ ouvre format de chaîne
# #   \ stocke digits de couleur forme
ASCII ; HOLD   \ séparateur d'attributs
2DROP   \ suppression reliquats de paramètres
# #   \ stocke digits de couleur fond
ASCII ; HOLD   \ séparateur d'attributs
ASCII 0 HOLD   \ reset attributs
ASCII [ HOLD   \ marqueur début de séquence
ANSI 27 HOLD   \ code de ESCAPE
#> TYPE ;   \ envoi de la séquence de contrôle des couleurs
EOF

Exemple: RED GREEN .( TEST) affiche TEST en rouge sur fond vert

F. Sélection des modes graphiques.

Le mot DARK fait à une interruption chargée d'effacer le contenu de l'écran vidéo. Plus exactement, de réinitialiser le mode d'affichage.

Les systèmes de type PC/XT/AT/PS et compatibles sélectionnent le mode d'affichage à partir du numéro de mode vidéo à sélectionner:

5 MODE

sélectionne le mode vidéo CGA 320*200 en 4 couleurs. Pour disposer de fonctions graphiques élémentaires, il faut charger le contenu du fichier GRAPHIC.FTH (archivé dans GRAPHIC.ARC).

tableau des modes graphique standard:

Les modes graphiques différents de ceux mentionnés ci-dessus sont également disponibles sous réserve que le BIOS ou le contrôleur d'écran les gère sans problème:

-mode graphique HERCULES monochrome
-mode graphique HERCULES couleur (Color Graphice Card)
-mode graphique VGA, etc...

Des routines graphiques pour carte HERCULES sont disponibles dans le fichier HERCULES.FTH (archivé dans HERCGRAF.ARC) et des routines de gestion graphique VGA (mode 18) gérant l'affichage vidéo par accès mémoirs sont définies dans le fichier LINA.FTH (archivé dans le fichier 3DJ.ARC). Pour ces deux modes graphiques, HERCULES et VGA, il est nécessaire de disposer des cartes graphiques adéquates sur le système.

TURBO-Forth faisant abondamment appel aux techniques de vectorisation, il est possible de gérer des cartes vidéo, des teminaux par liaison série, un MINITEL par exemple, ou d'émules des terminaux professionnels avec un minimum de routines d'interfaçage.

 

 

-- hautdepage -- page d'accueil --