Triceraprog
La programmation depuis le Crétacé

VG5000µ, SetPoint en BASIC, changements de repères ()

Après avoir fait un mini tour des commandes graphiques, puis étudié la structure des caractères semi-graphiques du VG5000µ, il est temps d'implémenter la possibilité d'allumer un point particulier de l'écran.

Comme je vais utiliser les caractères semi-graphiques, ce « point » sera sur la grille de résolution de 80 par 75. En effet, il y a 40 caractères par ligne qui ont chacun une largeur de deux éléments, et 25 caractères par colonne qui ont chacun trois éléments en hauteur.

L'idée pour allumer ou éteindre un point est donc d'abord de trouver quelle position de caractère semi-graphique est influencée, puis de modifier le caractère à cette position. Pour modifier le caractère, il faudra lire celui déjà présent, calculer le nouveau, puis écrire le nouveau.

Transformation de coordonnées

Pour visualiser la transformation de coordonnées, voici un tableau.

|-------------|-------------|-------------|-------------|-------------|
| (0,0) (1,0) | (1,0) (2,0) | (3,0) (4,0) | (5,0) (6,0) | ......
| (0,1) (1,1) | (1,1) (2,1) | (3,1) (4,1) | (5,1) (6,1) | ..... etc.
| (0,2) (1,2) | (1,2) (2,2) | (3,2) (4,2) | (5,2) (6,2) | ....
|    [0,0]    |    [1,0]    |    [2,0]    |    [3,0]    | ....
|-------------|-------------|-------------|-------------|------
| (0,3) (1,3) | (1,3) (2,3) | (3,3) (4,3) | (5,3) (6,3) |
| (0,4) (1,4) | (1,4) (2,4) | (3,4) (4,4) | (5,4) (6,4) |
| (0,5) (1,5) | (1,5) (2,5) | (3,5) (4,5) | (5,5) (6,5) |
|    [0,1]    |    [1,1]    |    [2,1]    |    [3,1]    |
|-------------|-------------|-------------|-------------|---
| (0,6) (1,6) | (1,6) (2,6) | (3,6) (4,6) | (5,6) (6,6) |
| (0,7) (1,7) | (1,7) (2,7) | (3,7) (4,7) | (5,7) (6,7) |
| (0,8) (1,8) | (1,8) (2,8) | (3,8) (4,8) | (5,8) (6,8) |
|    [0,2]    |    [1,2]    |    [2,2]    |    [3,2]    |
|-------------|-------------|-------------|-------------|-
|   .     .   |   .     .   |   .     .   |   .     .   | 
|   .     .   |   .     .   |   .     .   |   .     
|   .     .   |   .     .   |   .     .

Entre parenthèse, j'ai placé tous les couples de coordonnées qui nous intéressent. Entre crochet, j'ai placé les coordonnées du caractère correspondant.

Pour passer du premier système de coordonnées à l'autre, nous utilisons un outil mathématique très simple : la division. Prenez une coordonnée « gros pixel », divisez par 2 sa coordonnées X, divisez par 3 sa coordonnée Y (en arrondissant à l'entier inférieur), et vous obtenez les coordonnées du caractère semi-graphique à modifier.

Par exemple : (2, 7) devient (2÷2, 7÷3) ce qui fait (0, 2). Sept divisé par trois de manière entière faisant 2.

À présent que l'on sait trouver les coordonnées du caractère semi-graphique, il nous faut trouver lequel des six éléments est à modifier. Et pour cela, nous utilisons encore la division entière, mais cette fois en prenant son reste.

En continuant sur le même exemple : (2, 7) devient (reste de 2÷2, reste de 7÷3), ce qui fait (0, 1). C'est-à-dire l'élément de la colonne de gauche (0), sur la ligne du centre (1).

Pour transformer l’élément semi-graphique aux coordonnées (2, 7), il faudra donc allumer l'élément semi graphique de la colonne de gauche, ligne du centre, du caractère positionné aux coordonnées (0, 2).

Ce que nous venons de faire est un changement de repère.

Voici le même tableau avec l'élément exemple mis en évidence :

|-------------|-------------|-------------|-------------|-------------|
| (0,0) (1,0) | (1,0) (2,0) | (3,0) (4,0) | (5,0) (6,0) | ......
| (0,1) (1,1) | (1,1) (2,1) | (3,1) (4,1) | (5,1) (6,1) | ..... etc.
| (0,2) (1,2) | (1,2) (2,2) | (3,2) (4,2) | (5,2) (6,2) | ....
|    [0,0]    |    [1,0]    |    [2,0]    |    [3,0]    | ....
|-------------|-------------|-------------|-------------|------
| (0,3) (1,3) | (1,3) (2,3) | (3,3) (4,3) | (5,3) (6,3) |
| (0,4) (1,4) | (1,4) (2,4) | (3,4) (4,4) | (5,4) (6,4) |
| (0,5) (1,5) | (1,5) (2,5) | (3,5) (4,5) | (5,5) (6,5) |
|    [0,1]    |    [1,1]    |    [2,1]    |    [3,1]    |
|=============|-------------|-------------|-------------|---
I             I (1,6) (2,6) | (3,6) (4,6) | (5,6) (6,6) |
I       (1,7) I (1,7) (2,7) | (3,7) (4,7) | (5,7) (6,7) |
I             I (1,8) (2,8) | (3,8) (4,8) | (5,8) (6,8) |
I    [0,2]    I    [1,2]    |    [2,2]    |    [3,2]    |
|=============|-------------|-------------|-------------|-
|   .     .   |   .     .   |   .     .   |   .     .   | 
|   .     .   |   .     .   |   .     .   |   .     
|   .     .   |   .     .   |   .     .

Transformation du caractère

À présent que l'on connaît les coordonnées du caractère à modifier, il faut trouver un moyen de savoir quelle est sa valeur actuelle. Et là-dessus, le BASIC du VG5000µ ne nous aide pas. Il y bien une commande d'affichage à l'écran, PRINT, mais pas de commande spécifique pour connaître le caractère actuellement affiché à l'écran pour une position donnée.

Heureusement, cet article décrit l'arrangement en mémoire des informations d'affichage telles que gérées par le BASIC. Il est donc possible, moyennant un autre changement de coordonnées et de l'instruction PEEK du BASIC, d'obtenir cette information.

L'instruction PEEK prend en paramètre une adresse mémoire et renvoie son contenu sous la forme d'un octet, c'est-à-dire, d'un entier allant de 0 à 255. C'est une instruction, avec son pendant POKE qui permet de modifier le contenu d'une adresse mémoire, qui permet au BASIC d'interagir avec la machine au delà des instructions toutes faites. Nous y reviendrons dans d'autres articles.

En lisant l'article sur l'arrangement mémoire des informations écran, il est facile de convertir les coordonnées d'un caractère à l'écran en adresse mémoire. Chaque ligne prend 80 octets, il faut donc multiplier le numéro de la ligne par 80. Et chaque caractère prend deux octets sur une ligne, il faut donc multiplier le numéro de la colonne par 2.

Dans notre exemple, (0, 2) donne (0×2)+(2×80) = 160. L'emplacement est donc le 160ième depuis le début de la mémoire vidéo. Plus exactement 160ième et 161ième puisque chaque caractère prend deux octets. Encore un changement de repère.

Il reste donc à décoder cette information, la modifier et la replacer en mémoire. Ceci sera pour la prochaine fois.

Repère cartésien