Récréation 3D
Aujourd'hui, j'ai préparé quelques illustrations sous forme d'évocations de machines connues. Voici une première image, qui j'espère évoque assez bien la machine dont j'ai parlé jusqu'à maintenant sur ce site.

Aujourd'hui, j'ai préparé quelques illustrations sous forme d'évocations de machines connues. Voici une première image, qui j'espère évoque assez bien la machine dont j'ai parlé jusqu'à maintenant sur ce site.

Après avoir vu le point, si nous passions à la ligne ? Ou plus exactement, au segment de droite.
Sur une feuille de papier, tracer un segment de droite entre deux points est une chose simple : un crayon, un règle, on positionne la règle sur les deux points et l'on trace un trait en tenant fermement cette dernière.
Le trait a alors une allure continue ; du moment que l'on n'utilise pas un microscope pour en détailler la composition. Et c'est une représentation suffisante, dans la plupart des cas, de l'objet mathématique sous-jacent.
Sur un écran d'ordinateur, c'est un tout autre problème. En effet, un écran traditionnel est constitué d'une matrice de petits carreaux, les pixels. Les pixels des écrans récents sont très petits et malgré cela, tracer un beau segment de droite n'est pas si simple. Alors imaginez avec les gros carreaux formant les affichages d'anciens ordinateurs ?
Plutôt que de l'imaginer …
Ça y est, après avoir vu la structure des caractères semi-graphiques, l'arrangement en mémoire des valeurs d'affichage et fait un essai de manipulation de ces valeurs, nous voici prêts pour écrire un morceau de programme qui peut prendre en entrée des coordonnées et allumer ou éteindre un point à l'écran.
Le BASIC est un langage, dans les versions de l'époque de cette machine, assez limité. Il n'y a entre autre pas de notion de portée lexicale des variables. La portée lexicale d'une variable, c'est l'ensemble des parties d'un code source depuis lesquelles une variable, ou plus généralement un symbole, est accessible. En BASIC sur VG5000µ, comme sur les BASIC d'autres machines de cette période, c'est simple, les variables simples sont accessibles de partout à partir du moment où elles ont été définies.
À cela s'ajoute le fait que seuls les deux premiers caractères d'une variable sont significatifs. ABC et ABD …
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 … |
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.
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 …Cet article est la version française de cet autre que j'ai écrit suite à une demande d'aide dans le forum System.cfg forum. Je me suis dit que c'était le moment de mettre à plat mes notes, même si du coup cela cassait un peu la progression des articles en français sur l'affichage.
Cela donne un article un peu plus austère que d'habitude, et un peu plus dense.
Pour commencer, le processeur vidéo du VG5000µ est un EF9345. On peut y accéder de deux façons, soit en discutant directement, soit à travers la RAM lorsqu'on utilise le BASIC embarqué dans la machine. La manière directe est plus puissante, la seconde est plus simple.
Le signal de début d'affichage (Blank Start) du processeur vidéo est connecté à la broche d'interruption du Z80. Cela provoque une interruption IRQ qui, dans le mode dans lequel le BASIC initialise le Z80, fait un appel …
La dernière fois, j'avais présenté le début d'une idée pour accéder à des pixels « basse définition » sur le VG5000µ en se servant de caractères semi-graphiques.
Avant de continuer sur l'idée, je me demandais ce que donnerais, sans trop de traitement, une image de synthèse en niveau de gris avec une telle technique.
Afin de transformer cette image en niveaux de gris vers du noir et blanc, je fais appel à une technique appelée « Dithering » ou « tramage » en français. Il s'agit de transformer le niveau de lumière en série de points plus ou moins dense.
Plus la résolution est dense, plus le résultat est bon. Forcément, en basse résolution semi-graphique, il ne faut pas s'attendre à des merveilles.
Voici donc deux couples d'images. En premier le rendu en niveau de gris d'une image de synthèse assez simple. Puis un rendu avec du tramage. Il existe de nombreuses techniques de tramages, et …
Lorsque l'on regarde de près la structure des caractères semi-graphiques du VG5000µ, on voit qu'elle a été réfléchie pour être facile à manipuler. Voici quelques observations :
Le caractère 127, par exemple, est le caractère complètement rempli. Le caractère 127 - 64, c'est-à-dire 63, est le caractère rempli, quadrillé.

Une observation supplémentaire est plus visible si l'on réarrange les blocs de chaque caractère semi-graphique sur une seule ligne. Pour cela, je prends les deux blocs du haut, puis j'y ajoute les deux blocs du milieu, et enfin les …
Une fois le VG5000µ démarré, on pourrait imaginer afficher des formes à l'écran en allumant des pixels avec des couleurs prises dans une palette donnée. Au même moment, c'est ce que font d'autres ordinateurs sur le marché. Avec de grandes limitations, certes, mais des commandes en BASIC sont fournies à l'utilisateur pour afficher des points, voires même tracer des lignes.
Il n'en est rien.
Les commandes en BASIC méritent d'être étudiées avant de se lancer. La manuel d'utilisation consacre quatre pages d'explications à l'affichage graphique et auront pu, je pense, décourager tous ceux qui ne cherchaient pas un minimum à conduire quelques expériences. Par chance, avoir un ordinateur à cette époque, c'est avoir un peu l'esprit curieux.
Deux commandes, CURSORX et CURSORY, suivies d'une nombre, permettent de placer la position courante d'affichage sur l'espace à l'écran, divisé en 25 lignes de 40 colonnes. Les caractères affichés avec PRINT qui suivent …
Lorsqu'on allume un ordinateur personnel dans les années 80, il y a de bonnes chances de se retrouver dans un environnement BASIC. La machine présente, après quelques lignes d'introduction, une invite de commande à partir de laquelle l'utilisateur peut diriger les opérations. Ces opérations sont alors de deux types : lancer un programme, ou bien programmer (voire lancer un programme pour programmer).
Il y a plusieurs exceptions à ce schéma. Le TO7, par exemple, a besoin d'une cartouche pour démarrer son environnement ; celui livré avec la machine est cependant un BASIC. Le Jupiter Ace quant à lui démarre avec un environnement en FORTH.
Le VG5000µ fait parti de la catégorie des ordinateurs avec BASIC intégré. Dès l'allumage, on peut se lancer dans de l'expérimentation ou de la programmation.

Dire qu'un ordinateur fonctionne avec BASIC n'est qu'une partie de la définition. Il n'y a pas un BASIC, mais plusieurs dialectes du même …
La machine à laquelle je vais m'intéresser est le VG5000µ, de Philips. La plupart du temps, le µ n'est pas précisé. C'est une machine qui n'a pas vraiment de secret, ses nombreux fans l'ayant depuis longtemps passée au peigne fin et la documentation technique est abondante.
Ce n'est cependant pas une machine si populaire. Je pense avoir passé les années 80 sans vraiment en entendre parler, ni en croiser sur mon chemin. J'ai donc découvert cette machine plutôt récemment, début 2016.
C'est une machine extrêmement simple, autour d'un processeur central, d'un processeur vidéo et d'un clavier. Le tout dans un boîtier léger est plutôt aéré, pour ne pas dire plein de vide. Chose très appréciable, du moins en France, l'appareil est munie d'une prise Péritel, ce qui évite les jonglages pour sortir une image sur un écran pas trop ancien.
Le clavier n'est pas extrêmement pratique, mais pas affreusement inconfortable …
Le premier billet de ce site, que je veux consacrer principalement à la programmation et son histoire, commence, c'est le paradoxe, par de la soudure.
De discussion en discussion sur le forum System.cfg, l'idée de créer un lecteur de SD Card pour le VG5000 est apparue. Initialement, j'avais plus dans l'idée de m'occuper de la partie programmation. Cependant, à moins de vouloir utiliser de la sauvegarde sur cassette comme à l'époque, il est nécessaire d'avoir de quoi communiquer des informations depuis un ordinateur plus moderne.
La méthode est simple, en théorie, on branche un cordon entre la prise cassette du VG5000µ et les prises son du PC. Et c'est ainsi que commence l'aventure : je n'ai pas ce cable à disposition. Un petit coup d'oeil au brochage me montre qu'il me faut une prise DIN 8 broches. J'ai des prises DIN 8 broches sous la main... mais celles pour Commodore …