Triceraprog
La programmation depuis le Crétacé

VG5000µ, SetPoint en BASIC, manipulation de gros pixels ()

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.

Peek écran

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 :

Bit76543210
ContenuN (0)/E (1)numéro du caractère

Et que la seconde a celle-ci :

Bit76543210
ContenuTX (0)Inverse vidéoLargeur x2Hauteur x2ClignotementCouleur
ContenuGR (1)Couleur de fondClignotementCouleur du caractère

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 1 en position des dizaines et 6 en position des unités.

C'est d'ailleurs au programme du primaire à l'école, où l'on apprends que 79, c'est 1 dizaine et 6 unités. Autrement dit, 1 × 10 + 6. De même, 0 est composé de 2 centaines, de 0 dizaines et de 5 unités, autrement dit 2 * 100 + 0 * 10 + 5.

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 et 255,
  • 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'écrit 01001111 (en base 2)
  • 0 (en base 10), s'écrit 00000000 (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 :

Bit76543210
Contenu01001111

Le second octet, de valeur 0, mis en base 2 et placé dans le tableau de décodage donne ceci :

Bit76543210
Contenu00000000

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.

Poke écran

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) :

Bit76543210
Contenu01001100
Bit76543210
Contenu11100000

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 !

Poke écran