Articles de la catégorie Machines.

Des outils pour programmer en assembleur sur VG5000µ

La dernière fois, j'avais évoqué le logiciel d'assemblage, ou assembleur comme étant le programme permettant de passer d'un programme sous sa forme source, c'est-à-dire écrite sous forme lisible par un humain, dans une forme binaire, qui sera plus exactement nommée forme objet. C'est cette forme qui pourra être exécutée par la machine.

Pour programmer, quel que soit la forme que revêt cette programmation, on a besoin d'outils. Les outils primaires peuvent être une table de référence, des manuels, un stylo, des feuilles et beaucoup de patience. Rapidement, le besoin d'outils pour effectuer les tâches automatiques et répétitives qui forment la transformation d'un programme source en programme objet se fait sentir. Et quoi de mieux pour traier des tâches automatiques et répétitives de transformation qu'un... ordinateur.

Le problème de la poule et de l'œuf n'est pas le sujet ici. Le principal est qu'à l'heure de l'écriture de cet article, il y …

Lire la suite →

Du langage machine à l'assembleur sur VG5000µ

Après cette pause estivale, reprenons là où l'on était restés. Dans l'article précédent, je parlais du langage machine, une suite de signaux provoquant l'activité d'un processeur selon des directives précises.

Un inconvénient du langage machine, c'est qu'il est peu pratique à manipuler. Par exemple, sur un Z80, charger l'accumulateur (une mémoire spécifique interne au processeur) avec la valeur 1, je dois écrire : 00111110 00000001 en binaire, ou encore 3E 01 en système hexadécimal.

Écrire de cette manière n'est pas simple, prend beaucoup de temps avec un grand risque d'erreurs. Relire est encore pire. Programmez une machine de cette manière et vous ressentirez a priori rapidement le besoin de manipuler des éléments plus faciles à comprendre pour un Humain.

Et c'est ainsi que du langage machine on passe au langage d'assemblage, ou, par abus de langage, à l'assembleur.

L'assembleur

La première chose à savoir est que l'assembleur est un programme. Mais …

Lire la suite →

Z80 et VG5000µ

Lors des articles précédents sur l'affichage, un résultat était net : c'est lent ! Extrêmement lent. Les magazines ou de livres consacrés à la programmation des machines personnelles des années 1980 affirmaient tous ceci : si vous voulez quelque chose de rapide, passez à l'assembleur.

Que signifie utiliser l'assembleur, et en quoi c'est différent du BASIC ? Pourquoi est-ce que c'est plus rapide ? Était-ce vraiment la seule solution ? C'est ce que nous allons voir dans cet article et les suivants.

J'ai tenté plusieurs approches pour arriver au premier programme en assembleur dans une série d'articles. Et j'en suis arrivé à la conclusion qu'il n'y a pas moyen de passer outre quelques explications rapides des constituants de l'ordinateur et de leurs fonctionnements.

On va tout de même garder une vue large et schématique pour la plupart des composants. Pour le microprocesseur, un Z80 sur le VG5000µ, il faudra descendre un peu vers le fonctionnement …

Lire la suite →

VG5000µ, haute résolution

Dans les articles précédents sur l'affichage du VG5000µ, je travaillais dans une résolution que je nomme « gros pixels », basée sur des caractères semi-graphiques. Grâce à l'implémentation d'une routine d'affichage de pixel, j'avais pu programmer un affichage de ligne et un affichage de cercle.

Avec ce mode d'affichage, on obtient une résolution de 80 pixels horizontalement par 75 pixels verticalement. Ce qui donne un total de 6000 pixels. Cependant, le manuel d'utilisation de la machine indique une définition d'image de 80 000 points. Plus de 13 fois plus. Existe-t-il une façon d'afficher des pixels plus petits et d'atteindre une haute (toute proportion gardée) définition ?

Petit rappel : je ne m'occupe pour le moment que des capacités du VG5000µ offertes par le BASIC, et se mettant à la place d'une utilisation à l'époque, avec juste le manuel de base.

Plus fin

Pour atteindre une définition plus fine depuis le BASIC, il faut …

Lire la suite →

Tracé d'un cercle en BASIC sur VG5000µ

Maintenant que nous avons un algorithme pour tracer un cercle ainsi que le moyen d'afficher un gros pixel à l'écran, nous voilà prêts pour traduire tout cela en BASIC, comme cela a été fait auparavant avec le segment de droite.

Pour rappel, voici l'implémentation en BASIC d'affichage d'un point à l'écran.

100 REM AFFICHE UN POINT DANS L'ESPACE SEMI-GRAPHIQUE
110 REM X CONTIENT L'ABSCISSE ENTRE 0 et 79
120 REM Y CONTIENT L'ABSCISSE ENTRE 0 et 74
130 ZX=INT(X/2):ZY=INT(Y/3)
140 RX=X-ZX*2:RY=Y-ZY*3
150 CH=2^(RY*2+RX)
160 DI=&"4000"+ZY*80+ZX*2
170 AT=PEEK(DI+1)
200 OL=64:IF (AT AND 128) = 128 THEN OL=PEEK(DI)
220 IF (OL AND 128) = 128 THEN OL=64
230 POKE DI,OL OR CH
240 POKE DI+1,224
250 RETURN …
Lire la suite →

VG5000µ, simplification du tracé du cercle

Avec de passer à l'implémentation en BASIC du cercle décrit dans un article précédent, passons un peu par une phase de simplification. Cet article va contenir quelques lignes de mathématiques.

L'outil mathématique le plus complexe utilisé est celui des factorisations et développements de carrés. Les identités remarquables seront d'un grand secours. Niveau de fin de collège je crois.

Pour rappel, voici l'algorithme de tracé de cercle de Bresenham :

  • initialiser cx et cy avec les coordonnées du centre du cercle, r avec son rayon
  • initialiser (x, y) à (0, r), c'est à dire le point au sommet du cercle.
  • tant que x ≤ y
    • tracer le pixel(x + cx, y + cy) et ses sept symétries.
    • calculer $m = (x+1)^2 + (y-0.5)^2 - r^2$
    • si m ≥ 0 alors $x \leftarrow x + 1$ et $y \leftarrow y - 1$
    • sinon $x \leftarrow x + 1$
  • fin

On pourrait l'implémenter tel quel. Mais je veux …

Lire la suite →

VG5000µ, tracer une ligne en BASIC

Après avoir décrit un algorithme de tracé de segment de droite de manière générique, voyons un peu comment traduire ça en BASIC sur le VG5000µ. Pour ce premier article, il s'agira d'une implémentation simpliste, qui servira de base.

Pour rappel, voici l'algorithme générique :

  • En entrée, on a deux points de coordonnées (x, y) et (x', y')
  • Si x' est plus petit que x, échanger les valeurs de x et x' ainsi que de y et y'
  • Choix de l'octant en fonction de |y' - y| et de |x' - x|
  • Si on fait un balayage des x, alors
    • Calculer la pente $a = \frac{(y' - y)}{(x' - x)}$
    • Calculer $b = \frac{x'y - xy'}{x'-x}$
    • Pour tous les x'' de x à x', calculer $y'' = ax'' + b$.
    • Tracer un pixel en (x'', y'').
  • Si on fait un balayage des y, alors
    • Si y' est plus petit que y, échanger les valeurs de x …
Lire la suite →

VG5000µ, SetPoint en BASIC, l'implémentation

Ç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 …

Lire la suite →

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 :

Bit 7 6 / 5 / 4 / 3 / 2 / 1 / 0
Contenu N (0)/E …
Lire la suite →

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 …
Lire la suite →

VG5000µ, Arrangement de la mémoire vidéo

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 …

Lire la suite →

Tramage basse définition pour le VG5000µ

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 …

Lire la suite →

Les caractères semi-graphiques du VG5000µ

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 :

  1. les caractères sont divisés en deux plages, l'une numérotée de 0 à 63, l'autre de 64 à 127.
  2. si on prend un caractère de la première plage, contenant les caractères « quadrillés » et que l'on ajoute 64 à son numéro, on obtient le même caractère en format « plein »
  3. de manière similaire, si on soustrait 64 au numéro d'un caractère plein, on obtient sa forme quadrillée.

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é.

Tous les caractères semi-graphiques du VG5000µ

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 …

Lire la suite →

Les commandes graphiques en BASIC du VG5000µ

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 …

Lire la suite →

VG5000µ

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 …

Lire la suite →