Graphiques Tektronix4014 avec Bywater Basic

Le but de cette page est de montrer comment on peut pallier l'absence d'instructions graphiques en Bywater Basic (BW-Basic) en se servant de l'émulateur de terminaux Xterm. Le procédé peut évidemment servir pour d'autres interpréteurs Basic, ou pour d'autres langages de programmation interprétés (Awk, Perl, Lisp...) ou compilés (Fortran, Pascal, Algol 60, Algol 68, Ada...).

Xterm

Dans l'environnement graphique X Window System, le programme xterm permet l'émulation des terminaux DEC VT100 (texte) et Tektronix 4014 (graphique). La commande xterm fait démarrer le programme xterm en mode VT100, et la commande xterm -t en mode Tektronix 4014. Il est possible de passer d'un mode à l'autre en envoyant des caractères de contrôle: en envoyant la séquence ESC[38?h on bascule du mode VT100 au mode Tektronix4014, et en envoyant la séquence ESC ETX on repasse du mode Tektronix4014 au mode VT100.

Tektronix4104

Les terminaux Tektronix4014 étaient des terminaux graphiques vectoriels à tube cathodique. Ils étaient commandés au moyen de séquences de caractères de contrôle. Le manuel (fichier PDF de 7Mo) décrit ces séquences en détail. La séquence pour effacer l'écran est ESC FF. En BW-Basic cela donne 10 PRINT CHR$(27);CHR$(12)

Changement de la taille des fontes

Sequence Taille de fonte Nombre de caractères par ligne Nombre de lignes
ESC 8 Grands caractères 74 35
ESC 9 Caractères moyens 81 38
ESC : Caractères petits 121 58
ESC ; Caractères très petits 133 64
Le programme suivant, en BW-Basic, montre les quatre différentes fontes disponibles. 10 tek$=chr$(&h1b)+"[?38h" : rem mode Tektronix 4014 15 vt$=chr$(27)+chr$(3) : rem mode VT100 20 print tek$ 30 print chr$(27)+chr$(12) 40 print "Taille Normale" 50 print chr$(27);"9 taille plus petite" 60 print chr$(27);": encore plus petite" 70 print chr$(27);"; toujours plus petite" 80 print chr$(27);"8 Taille Normale" 90 print vt$ 100 end

Tracé de points

L'écran du Tektronix 4010 a une résolution de 1024x768, avec l'origine des coordonnées située au coin inférieur gauche de la fenêtre. Les coordonnées d'un point sont donc encodées au moyen de deux entiers de 10 bits, le premier, x, représentant l'abcisse et second, y l'ordonnée. Pout tracer un point aux coordonnées (x,y) il faut envoyer une séquence formée de:
  1. FS (Code ascii 28)
  2. un caractère de code ASCII (32 + les 5 bits les plus significatifs de y)
  3. un caractère de code ASCII (96 + les 5 bits les moins significatifs de y)
  4. un caractère de code ASCII (32 + les 5 bits les plus significatifs de x)
  5. un caractère de code ASCII (64 + les 5 bits les moins significatifs de x)
Cette méthode est illustrée par le programme ci dessous qui trace un attracteur de Hénon. Les 5 bits les plus significatifs de x1 et y1 sont obtenus lignes 90 et 100 en divisant respectivement x1 et y1 par 2^5=32 et en ne gardant que la partie entière. Les 5 bits les moins significatifs de x1 et y1 sont obtenus lignes 110-120 en prenant respectivement les restes de x1 et y1 dans la division par 32. Le point est dessiné par la ligne 130 du programme.
5 REM attracteur de Hénon (M. Hénon J. Phys. Coll. 39, C5 (1978) C5-5) 6 REM http://hal.archives-ouvertes.fr/jpa-00217465/fr/ 10 PRINT CHR$(27);"[?38h": REM Activation de la fenêtre Tek4014 20 PRINT CHR$(27)+CHR$(12): REM efface l'écran 30 a=1.4:b=0.3 40 x=0 : y=-0.3 60 FOR i=1 to 2000 70 xx=y+1-a*x^2 80 y=b*x : x=xx 85 x1=512+x*300 : y1=412+700*y 90 hx=INT(x1/32) 100 hy=INT(y1/32) 110 lx=INT(x1-32*hx) 120 ly=INT(y1-32*hy) 130 PRINT CHR$(28);CHR$(32+hy);CHR$(ly+96);CHR$(32+hx);CHR$(64+lx) 140 NEXT i 150 PRINT CHR$(27)+CHR$(3): REM retour à la fenêtre VT100 160 END
Il existe aussi sur les terminaux Tektronix une façon de contrôler la luminosité du point en envoyant la séquence (dite Special point plot mode):
  1. ESC (Code ASCII 27)
  2. FS (Code ASCII 28)
  3. un caractère de code ASCII entre 32 et 126 (qui contrôle la luminosité du point)
  4. un caractère de code ASCII (32 + les 5 bits les plus significatifs de y)
  5. un caractère de code ASCII (96 + les 5 bits les moins significatifs de y)
  6. un caractère de code ASCII (32 + les 5 bits les plus significatifs de x)
  7. un caractère de code ASCII (64 + les 5 bits les moins significatifs de x)
Dans l'émulateur de terminal Tektronix 4014 de xterm, cette séquence produit l'affichage d'un point aux coordonnées (x,y) mais la luminosité du point est invariable.

Tracé de segments

Le tracé de segments s'effectue de manière analogue au tracé de points. Pour tracer un segment allant du point (x1,y1) au point (x2,y2) on doit d'abord indiquer l'origine du segment (x1,y1) en envoyant la séquence:
  1. GS (Code ASCII 29)
  2. un caractère de code ASCII 32 + les 5 bits les plus significatifs de y1
  3. un caractère de code ASCII 96+ les 5 bits les moins significatifs de y1
  4. un caractère de code ASCII 32 + les 5 bits les plus significatifs de x1
  5. un caractère de code ASCII 64+ les 5 bits les moins significatifs de x1
Cette commande positionne le curseur en (x1,y1) sans tracer de segment. Puis on indique l'extremité (x2,y2) avec la séquence
  1. un caractère de code ASCII 32 + les 5 bits les plus significatifs de y2
  2. un caractère de code ASCII 96+ les 5 bits les moins significatifs de y2
  3. un caractère de code ASCII 32 + les 5 bits les plus significatifs de x2
  4. un caractère de code ASCII 64+ les 5 bits les moins significatifs de x2
et on obtient un segment reliant le point (x1,y1) au point (x2,y2). Le tracé d'un nouveau segment partant de (x2,y2) et allant en (x3,y3) se fera simplement en indiquant les coordonnées du point (x3, y3) avec la séquence:
  1. un caractère de code ASCII 32 + les 5 bits les plus significatifs de y3
  2. un caractère de code ASCII 96+ les 5 bits les moins significatifs de y3
  3. un caractère de code ASCII 32 + les 5 bits les plus significatifs de x3
  4. un caractère de code ASCII 64+ les 5 bits les moins significatifs de x3
Si on veut seulement déplacer le curseur de (x2,y2) en (x3,y3) sans tracer de segment, on doit envoyer la séquence:
  1. GS (Code ASCII 29)
  2. un caractère de code ASCII 32 + les 5 bits les plus significatifs de y1
  3. un caractère de code ASCII 96+ les 5 bits les moins significatifs de y1
  4. un caractère de code ASCII 32 + les 5 bits les plus significatifs de x1
  5. un caractère de code ASCII 64+ les 5 bits les moins significatifs de x1
On peut choisir le style des segments en envoyant, avant de commencer le tracé des segments, une des séquences du tableau suivant.
type de traits séquence
Traits pleins
(solid)
ESC h ou ESC ` ou ESC p
Pointillés
(dotted)
ESC a ou ESC i ou ESC q
traits mixtes
(dash-dotted)
ESC b ou ESC j ou ESC r
traits interrompus courts
(short-dashed)
ESC c ou ESC k ou ESC s
traits interrompus longs
(long-dashed)
ESC dou ESC l ou ESC t
10 PRINT CHR$(&h1b);"[?38h" 20 PRINT CHR$(27)+CHR$(12) 25 REM PRINT CHR$(27);"`" OU PRINT CHR$(27);"h" POUR DES TRAITS PLEINS 27 REM PRINT CHR$(27);"a" POUR DES POINTILLÉS 28 REM PRINT CHR$(27);"b" POUR DES TRAITS MIXTES 29 REM PRINT CHR$(27);"c" POUR DES TRAITS INTERROMPUS COURTS 40 PRINT CHR$(27);"d" : REM TRAITS INTERROMPUS LONGS 50 PRINT CHR$(29); 55 PI=3.1416 60 FOR I=1 TO 200 70 X=INT(511+384*SIN(.02*I*PI)) 80 Y=INT(389+300*SIN(.05*I*PI)) 90 HX=INT(X/32) 100 HY=INT(Y/32) 110 LX=X-32*HX 120 LY=Y-32*HY 130 PRINT CHR$(32+HY);CHR$(LY+96);CHR$(32+HX);CHR$(64+LX); 135 IF I=INT(I/17)*17 THEN PRINT : PRINT CHR$(29);CHR$(32+HY);CHR$(LY+96);CHR$(32+HX);CHR$(64+LX); 140 NEXT I 150 PRINT CHR$(27)+CHR$(3) 160 END
L'éxecution de ce programme donne la courbe de Lissajous.

Coordonnées relatives (Incremental plot mode)

Pour dessiner en coordonnées relatives dans la fenêtre Textronix 4014, il faut envoyer une séquence:
  1. caractère spécial RS (code ASCII 30)
  2. caractère P (beam on) pour afficher un point ou caratère espace( beam off) pour déplacer le curseur sans rien tracer.
  3. une suite de caractères A,B,D,E,F,H,I,J représentant les déplacements relatifs (voir la figure pour les déplacements)
Par exemple, pour dessiner un carré, on peut utiliser: 10 PRINT CHR$(30);"PAAAAAADDDDDDBBBBBHHHHHH" ce qui trace un segment horizontal dirigé vers la droite et formé de 6 points (déplacement "A"), puis un ségment vertical, dirigé vers le haut et formé de 6 points (déplacement "D"), puis un segment horizontal dirigé vers la gauche et formé de 6 points (déplacement "B") et enfin un déplacement vertical dirigé vers le bas et formé de 6 points (déplacement "H"). Ce mode est surtout utile pour dessiner de petits symboles (croix, losange, carrés etc...) pour marquer la position d'un point.

mode GIN (Graphical INput)

Dans ce mode, le pointeur de souris prend dans le fenêtre Tektronix la forme d'une croix ("crosshair" = collimateur). Lorsqu'on clique ou presse une touche à l'intérieur de la fenêtre Tektronix, une chaîne de caractère est émise qui contient un premier caractère indiquant la touche ou le bouton de la souris qui a été pressé et quatre autres caractères qui indiquent quelle était la position du pointeur de souris lorsqu'on a cliqué ou pressé une touche.

On entre dans le mode GIN en envoyant la séquence ESC+SUB (chr$(27)+chr$(26) voire ligne 90). Le premier caractère contient la touche enfoncée. Si on a cliqué sur un bouton de la souris, le premier caractère a le code ASCII = 128 + ASC("l") si on a cliqué avec le bouton de gauche (Left), le code ASCII=128+ASC("m") si on a cliqué avec le bouton du milieu (Middle) et le code ASCII=128+ASC("r") si on a cliqué avec le bouton de droite (Right). En Bywater BASIC, un code ASCII supérieur à 128 devient un code ASCII négatif, ce qui explique la ligne 140. La formule donnant les coordonnées correspond aux lignes 150-190.

10 PRINT "GIN (GRAPHICAL INPUT) MODE" 20 PRINT "LORSQUE LE POINTEUR DE LA SOURIS SE CHANGE EN CROIX" 30 PRINT "DÉPLACER LA SOURIS À L'INTÉRIEUR DE LA FENÊTRE TEK" 40 PRINT "ET PRESSER UNE TOUCHE DU CLAVIER PUIS ENTER" 50 REM CE PROGRAMME PERMET DE VOIR QUE LA RÉSOLUTION EST 1024 (ABCISSE) X768 (ORDONNÉE) 60 REM L'ORIGINE DES COORDONNÉES EST LE COIN INFÉRIEUR GAUCHE DE L'ÉCRAN. 70 REM SI ON NE PRESSE PAS DE TOUCHE AVANT ENTER CE PROGRAMME A UN BUG. 90 PRINT CHR$(27);CHR$(26); 100 LINE INPUT A$ 110 IF LEN(A$)<5 THEN PRINT "AAAAAAAAARRRRRRRRGGGGGGGGHHHHHHHH!!!!!!": GOTO 200 120 KEY=ASC(LEFT$(A$,1)) 130 IF (KEY>0) THEN PRINT "VOUS AVEZ PRESSÉ ASCII =";KEY 140 IF (KEY<0) THEN B$=CHR$(128+KEY) : PRINT "VOUS AVEZ CLIQUÉ AVEC"; 141 IF B$="l" OR B$="L" THEN PRINT "LE BOUTON DE GAUCHE" 142 IF B$="m" OR B$="M" THEN PRINT "LE BOUTON DU MILIEU" 143 IF B$="r" OR B$="R" THEN PRINT "LE BOUTON DE DROITE" 144 IF B$<="R" THEN PRINT "LA TOUCHE SHIFT ETAIT ENFONCEE" 145 REM SHIFT + CLICK=L,M,R EN MAJUSCULES / CLIC = l,m,r EN MINUSCULES 150 HX=ASC(MID$(A$,2,1))-32 160 LX=ASC(MID$(A$,3,1))-32 170 HY=ASC(MID$(A$,4,1))-32 180 LY=ASC(MID$(A$,5,1))-32 190 PRINT "LE POINTEUR DE SOURIS ÉTAIT EN ABCISSE=";32*HX+LX;" ORDONNÉE=";32*HY+LY 200 END Retour à la page BASIC sur linux