Dans l'épisode précédent, j'avais décrit l'arrangement en mémoire vidéo des caractères semi-graphiques et un moyen d'accéder directement en mémoire à celui qui nous intéresse.
Le but est toujours de pouvoir allumer un élément constitutif d'un caractère semi-graphique, que je nomme « gros pixel ». Et l'article précédent s'arrêtait au moment où je pouvais récupérer, via une paire d'appels à commande PEEK
, les deux valeurs décrivant le caractère affiché à l'écran.
Premier test, après avoir effacé l'écran avec INIT
, j'affiche les deux valeurs correspondantes à la colonne 1, ligne 0.
Les deux valeurs obtenues et visibles sur la capture d'écran sont 79
et 0
. Pour comprendre ce qu'ils signifient, je reprends ici un morceau de l'article sur l'arrangement de la mémoire vidéo qui décrit la structure de ces deux valeurs.
On y lit que la première valeur a cette structure :
Bit | 7 | 6 / 5 / 4 / 3 / 2 / 1 / 0 |
---|---|---|
Contenu | N (0)/E (1) | numéro du caractère |
Et que la seconde a celle-ci :
Bit | 7 | 6 | 5 | 4 | 3 | 2 / 1 / 0 |
---|---|---|---|---|---|---|
Contenu | TX (0) | Inverse vidéo | Largeur x2 | Hauteur x2 | Clignotement | Couleur |
Contenu | GR (1) | Couleur ... | ... de ... | ... fond | Clignotement | Couleur |
Compter jusqu'à deux
Pour comprendre ce que ces tableaux signifient, il faut savoir et comprendre que les valeurs que j'ai obtenues et affichées le sont en base 10, c'est-à-dire sous la forme sous laquelle nous comptons usuellement dans la vie de tous les jours. En base 10, il y a 10 chiffres, et 0 à 9, et les nombres sont composés de ces chiffres. 79
est composé du chiffre 7
en position des dizaines et 9
en position des unités.
C'est d'ailleurs au programme du primaire à l'école, où l'on apprends que 79
, c'est 7 dizaines et 9 unités. Autrement dit, 7 × 10 + 9
. De même, 0
est composé de 0
unité.
Ces 10 chiffres sont arbitraires. On aurait pu, et d'autres civilisations l'ont fait, avoir un système de comptage avec 20 chiffres. Pourquoi pas. En programmation, il est usuel de compter en base 10, bien entendu, mais aussi en base 8, donc en ne prenant que les chiffres de 0 à 7, en base 16, où nous avons besoins de chiffres supplémentaires au-delà du 9 (qui sont notés A, B, C, D, E et F) et... en base 2, où seuls les chiffres 0 et 1 sont utilisés.
Le pourquoi de ces bases sort du cadre de cet article. J'y reviendrai probablement une autre fois. Je ne vais pas non plus expliquer ici les conversions d'écritures entre ces bases.
Ces chiffres, 0
et 1
dont on va se servir se nomment chiffres binaires, en anglais Binary Digits, raccourcis en bit. C'est ce bit qui est mentionné dans les tableaux ci-dessus.
Les valeurs que nous avons obtenues sont, de part l'organisation de l'ordinateur, des valeurs entre 0 et 255, et il se trouve que ces valeurs peuvent toutes s'écrire avec 8 chiffres binaires. Cette organisation en groupe de 8 bits s'appelle en octet.
On reprend son souffle
Cela fait beaucoup de vocabulaire d'un coup. Alors reprenons. Les valeurs que nous avons obtenues avec PEEK
:
- Sont toujours comprises entre
0
et255
, - Peuvent s'écrire en base 2 avec 8 bits (chiffres binaires) maximum,
- Ces groupements de 8 bits, s'appellent des octets.
À quoi ressemblent ces deux valeurs écrites en base 2 ? Les voici :
79
(en base 10), s'écrit01001111
(en base 2)0
(en base 10), s'écrit00000000
(en base 2)
Tout comme en base 10, le 0 en tête du 01001111
est optionnel, mais je les garde ici pour bien faire la différence entre les deux notations, et pour montrer que ces deux valeurs écrites en binaires s'associent parfaitement aux cases des tableaux ci-dessus.
Dernier petit détail, dans les tableaux, le rang du chiffre binaire commence par le rang 0, à droite, puis va jusqu`au rang 7, à gauche. Cela donne bien 8 chiffres/colonnes.
Décodage, enfin
On a maintenant tous les éléments pour comprendre les deux valeurs récupérées au début de cet article. Le premier octet, de valeur 79
, écrit en base 2 et remis en place dans le tableau de décodage, donne ceci :
Bit | 7 | 6 / 5 / 4 / 3 / 2 / 1 / 0 |
---|---|---|
Contenu | 0 | 1001111 |
Le second octet, de valeur 0
, mis en base 2 et placé dans le tableau de décodage donne ceci :
Bit | 7 | 6 | 5 | 4 | 3 | 2 / 1 / 0 |
---|---|---|---|---|---|---|
Contenu | 0 | 0 | 0 | 0 | 0 | 000 |
Ce qui se lit :
- Première valeur : il s'agit d'un caractère non étendu (bit 7 vaut 0) dont le numéro est 79
- Seconde valeur : il s'agit d'un caractère textuel, de hauteur et largeur normale, sans clignotement, et de couleur 0 (noir)
Un rapide coup d’œil sur la table de caractère nous renseigne que le caractère normal (non étendu) de rang 79
est le caractère O
. Nous avons bien lu le O
de Ok!
en haut de l'écran.
Et maintenant, l'encodage
La commande pour modifier la valeur d'un emplacement mémoire, c'est-à-dire l'inverse de PEEK
, est POKE
. Cette commande prend un numéro d'emplacement mémoire et une valeur pour se charger de mettre cette valeur à cet emplacement mémoire.
Exemple rapide en faisant POKE &"4000"+2,80
pour voir que le O
de Ok!
se transforme en P
.
Ce que je voudrais maintenant, c'est utiliser des caractères semi-graphiques pour tracer une ligne horizontale au milieu de l'écran. En reprenant la méthode décrite dans l'article sur la constitution des caractères semi-graphiques, je calcule que les deux pixels du milieu allumés donnent le caractère numéro 76, ce que je peux vérifier sur le tableau des caractères semi-graphiques.
D'après le calcul pour trouver l'emplacement mémoire du milieu de l'écran, ligne 12, colonne 0, j'obtiens 960
, que je devrai ajouter à l'adresse de début de la mémoire vidéo &"4000"
.
Dans les 20 paires de valeurs à partir de cet emplacement, je dois placer le caractère semi-graphique numéro 76
(1001100
en binaire sur 7 bits) non étendu, sans clignotement, avec comme couleur de fond la couleur 6
(110
en binaire sur 3 bits) et la couleur d'encre 0
(000
en binaire sur 3 bits), qui sont les couleurs par défaut à l'allumage du VG5000µ (INIT 6
).
Cela donne dans les tableaux d'encodage (qui sont toujours les mêmes) :
Bit | 7 | 6 / 5 / 4 / 3 / 2 / 1 / 0 |
---|---|---|
Contenu | 0 | 1001100 |
Bit | 7 | 6 / 5 / 4 | 3 | 2 / 1 / 0 |
---|---|---|---|---|
Contenu | 1 | 110 | 0 | 000 |
Soit, une fois convertis en base 10, les valeurs 76
et 224
.
Et enfin, le programme
10 INIT 6 : REM On efface l'écran
20 P=&"4000"+960 : REM La variable P est positionnée en début de ligne 12
30 FOR X=1 TO 40 : REM On effectue 40 fois les instructions suivantes
40 POKE P,76 : REM La première valeur est 76
50 POKE P+1,224 : REM La valeur suivante est 224
60 P=P+2 : REM La variable P est avancée de 2, afin de traiter la paire suivante
70 NEXT X : REM Fin des instructions à répéter 40 fois
Voici une belle ligne horizontale à base d'un caractère semi graphique choisi et positionné grâce à une série de calculs. Il n'y a plus long avant de pouvoir choisir directement quel point de l'écran afficher !