Site logo

Triceraprog
La programmation depuis le Crétacé

  • Human Resource Machine, le jeu assembleur ()

    Human Resource Machine est un jeu de Tomorrow Corporation de type résolution de défi. Ces défis se présentent tous sous la même formes : une série de chiffres et/ou lettres à transformer en une autre série de chiffres et/ou lettres, en fonction de directives.

    Et pour cela, le joueur a à sa disposition une série de commandes. Au début, très peu, leur nombre s'étoffe au fur et à mesure des 42 niveaux de la ligne principale. Ces commandes sont exécutées par l'avatar du joueur, qui va courir d'un bout à l'autre d'une pièce pour prendre des données, les transformer, les ajoutes, les comparer, les stocker...

    C'est ici que cela m'intéresse dans le cadre de Triceraprog. Le personnage que contrôle le joueur simule le fonctionnement d'un ordinateur (en parti). Le joueur au fur et à mesure de la résolution des puzzle apprend « tout simplement » un langage d'assemblage.

    Un langage d'assemblage, ou langage assembleur, est un langage très proche des opérations effectuées par un processeur d'ordinateur. Résoudre des problèmes avec ce seul langage est assez fastidieux et c'est sur ce ressort que joue Human Resource Machine.

    Le joueur a la possibilité de copier/coller les programmes du jeu, et ce qui est intéressant est que ce qui est sauvé dans le presse-papier ressemble à un vrai langage d'assemblage pour une machine inventée pour l'occasion. Voici un exemple de résolution d'un des premiers niveaux du jeu, copié dans un éditeur de texte :

    -- HUMAN RESOURCE MACHINE PROGRAM --
    
    a:
        INBOX   
        COPYTO   0
    b:
    c:
        INBOX   
        JUMPZ    e
        SUB      0
        JUMPN    d
        JUMP     c
    d:
        ADD      0
        COPYTO   0
        JUMP     b
    e:
        COPYFROM 0
        OUTBOX  
        JUMP     a
    

    En termes plus clairs (attention soyez attentif !) :

    1. le programme indique qu'il faut prendre une donnée dans celle qui se présentent en entrée (INBOX)
    2. la copier dans une case mémoire nommée 0 (COPYTO 0)
    3. puis prendre une autre donnée
    4. aller à la ligne indiquer e: si cette donnée est égale à zéro (JUMPZ).
    5. Dans le cas contraire, retrancher le contenu de la case 0 à la donnée courante (SUB 0)
    6. Si le résultat est négatif, allez en d:
    7. Sinon revenir en c:

    8. Dans le cas où le résultat était négatif et que l'on est maintenant en d:, cela signifie que la nouvelle donnée était plus petite que celle dans la case 0.

    9. La nouvelle donnée est rétablie (ADD 0... on ajoute ce qu'on avait retranché) et est mise dans la case 0.
    10. On revient en b: pour lire une nouvelle donnée

    11. Dans le cas où la donnée était égale à 0, on arrive en e:

    12. La donnée présente dans la case 0 est copiée dans la sortie (COPYFROM 0 puis OUTBOX)
    13. On reprend tout le depuis le début.

    Plus clair ? Mouais... Et en français ? Voici : en entrée se trouvent des suites de nombres qui sont séparées par des 0 (zéro). Pour chaque série, le plus petit des nombres est recopié en sortie. Ce qui est exactement l'énoncé du défi.

    Apprentissage ?

    Je ne suis pas entièrement persuadé que le jeu soit didactique au point d'enseigner la programmation en assembleur. Cependant, il présente une manière de décrire des problèmes et fait ressentir ce qu'est la programmation de ce type.

    Pour un programmeur déjà habitué à l'exercice, le jeu n'est pas très long. Je l'ai terminé en moins de 3 heures, à l'exception du dernier des puzzles optionnels, qui aurait été vraiment long à mettre au point, je n'en avais pas vraiment envie.

    Je me demande cependant, pour quelqu'un qui n'est pas programmeur, si le jeu est intéressant et à quel point il est complexe.

    Au final, un jeu sympathique avec une petite histoire amusante en fil rouge. Si vous voulez jouer à programmer en assembleur, ce jeu est fait pour vous.

    Aperçu du jeu Human Resource Machine


  • 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 j'en utilise une parmi d'autre, pour me donner une idée grossière de ce que cela peut donner. Il ne s'agit pas là de rendu faits sur un VG5000µ, cela sera l'objectif suivant.

    Cube et Sphère d'origine Cube et Sphère d'origine, dithered low

    Maison d'origine Maison d'origine, dithered low

    Un second but sera de faire sortir au VG5000µ une image en plus haute résolution. Mais pour cela, il faudra aller au-delà des caractères semi-graphiques.

    Cela pourrait donner quelque chose comme ça.

    Cube et Sphère d'origine, dithered high Maison d'origine, dithered high


  • Livre - Commodore VIC-20, a Visual History ()

    Après une première campagne Kickstarter manquée, Giacomo M. Vernoni n'a pas baissé les bras et lancé une nouvelle campagne pour l'édition d'un livre entièrement consacré au VIC-20 de Commodore.

    Le VIC-20, c'est un peu le grand frêre du beaucoup plus connu Commodore 64, un grand frêre aux capacités bien plus limitées. Mais c'est avant tout pour moi le premier de mes ordinateurs. Pas le premier que j'ai utilisé, ni celui sur lequel j'ai commencé la programmation, mais le premier qui était vraiment à moi.

    Alors forcément, la promesse d'un livre consacré à la machine m'a fait de l'oeil, et j'ai embarqué dans ce projet. Quelques mois après, je peux parcourir ce livre compact mais très fourni en détails et illustrations. C'est une très belle édition et je félicite son auteur pour le boulot accompli. Le livre respire le travail bien fait mêlé à la passion.

    Comme je ne suis pas toujours dans le détail les campagnes Kickstarter, j'ai été agréablement surpris de voir joint au livre des mini-posters, disons de grandes illustrations, d'un schéma de la machine, de photos des différentes cartes mère, et même un aimant aux couleurs de la marque.

    Je ne sais pas si mon VIC-20 fonctionne toujours, cela fait bien longtemps qu'il n'a pas été allumé. Je l'espère, et j'espère pouvoir ainsi en parler plus longement ici dans le futur.

    En attendant, je vous laisse avec une photo de la couverture du livre et d'un des posters.

    Image de la couverture du livre et d'un poster


  • 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 deux blocs du bas.

    En remplaçant les blocs noirs par des « X » et les blocs blancs par des « . », voici ce que cela donne :

    ......
    X.....
    .X....
    XX....
    ..X...
    X.X...
    .XX...
    XXX...
    ...X..
    X..X..
    .X.X..
    XX.X..
    ..XX..
    X.XX..
    .XXX..
    XXXX..
    ....X.
    Et ainsi de suite pour les 64 possibilités.
    

    Ceux qui sont à l'aise avec le comptage en base binaire auront probablement déjà repéré la structure. Pour les autres, essayez ceci :

    1. À partir d'un caractère donné regardez la position la plus à gauche
    2. Si la position contient un point, placez un X, puis allez à l'étape 5
    3. Sinon, c'est que la position contient un X. Remplacez le par un point
    4. Considérez à présent la position juste à droite du point que vous venez de placer, et retournez à l'étape 2.
    5. Terminé.

    Au passage, cette série d'instructions donnant des étapes à suivre pour effectuer une opération s'appelle un algorithme, un terme que nous croiserons à nouveau.

    Félicitations, vous savez compter en binaire ! Plus traditionnellement, les « X » sont notés « 1 » et les « . » sont notés « 0 », mais le principe est le même.

    Le grand avantage d'utiliser cette structure, où des nombres binaires forment les motifs des caractères semi-graphiques, c'est qu'il est assez facile de trouver le numéro d'ordre d'un caractère en fonction du ou des blocs que l'on veut allumer.

    Pour cela, il suffit d'associer à chaque position un numéro, suivant ce schéma :

    Position 0 1 2 3 4 5
    Numéro associé 1 2 4 8 16 32

    L'association est la suivante : multipliez le chiffre 2 par 2 autant de fois que la position de la colonne. On considère que multiplier 0 fois donne 1. Par exemple, pour la position 5, cela donne : 2 * 2 * 2 * 2 * 2 = 32. Je vous laisse vérifier les autres colonnes.

    Je laisse la partie mathématique de l'histoire de côté, il y a de quoi faire un article complet dessus, et il y en a déjà beaucoup sur Internet.

    Essayons maintenant. Je voudrais le caractère avec le bloc du milieu à droite allumé. Ce bloc, si on réarrange le caractère en ligne, est à la position 3 (rappelez-vous qu'on commence à numéroter à zéro) :

    ..
    .X donne ...X..
    ..
    

    En se référant au tableau ci-dessus, on trouve que la colonne 3 est associée au nombre 8. Je cherche le caractère dans sa forme pleine, j'ajoute donc 64 à 8 pour obtenir 72. Je vérifie dans le tableau du manuel... gagné !

    Comment faire maintenant si l'on veut un caractère semi-graphique avec plusieurs blocs allumé ? Simple, il suffit de faire la somme de tous les numéros associés aux colonnes. Par exemple :

    X.
    .X donne X..XX.
    X.
    

    Les blocs allumés sont donc aux positions 0, 3 et 4. Les nombres associés à ces positions sont 1, 8 et 16. Je fais la somme 1 + 8 + 16 = 25. Je veux les caractères pleins, j'ajoute donc 64. 64 + 25 = 89. Je vérifie dans le manuel le caractère 89. Encore gagné !

    Nous voilà donc avec un algorithme très simple pour trouver un caractère semi-graphique en fonction d'un ensemble de points que l'on veut allumer. Il reste à afficher ce caractère au bon endroit à l'écran, et nous pourrons obtenir de quoi allumer et éteindre des blocs de pixels individuellement.


  • 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 une changement de coordonnée commenceront à l'endroit indiqué. Tout va bien.

    La commande d'effacement d'écran, qui s'occupe aussi de choisir une couleur de fond et une couleur d'encre, se nomme INIT. C'est l'équivalent d'un CLS sur d'autres machines.

    Une commande permet de geler le défilement d'écran et une autre de le reprendre (PAGE et SCROLL). L'une permet d'empêcher le rafraichissement de l'écran et l'autre de le reprendre (STORE et SCREEN). Une autre permet de contrôler le taux de rafraichissement de l'écran (DISPLAY). Ça fait beaucoup de commandes de contrôle de la surface d'affichage. Ce sont de toutes petites commandes qui ne prennent pas beaucoup de place dans le système, mais était-ce bien utile d'avoir tout ce monde ?

    À vrai dire, la seule commande d'affichage est PRINT. PRINT est implémentée de manière assez simple : une fois les paramètres évalués, chaque caractère à traiter est pris un par un et affiché à l'emplacement du CURSOR. Puis le curseur est avancé d'une position.

    L'implémentation vérifie au préalable passage que le caractère est bien affichable, ou bien s'il mérite un traitement spécial, ou bien si le caractère n'est pas affichable ; auquel cas ce dernier est remplacé par le caractère d'espacement.

    Les caractères affichables de PRINT peuvent être séléctionnés dans quatre fontes différentes. La première contient les lettres, chiffres, ponctuations et autre caractères textuels. La seconde contient des caractères semi-graphique. Les deux autres fontes sont entièrement modifiables par l'utilisateur.

    Ces caractères semi-graphiques sont une première solution pour tracer des images. Les pixels sont grossiers et arrangés sur une grille de 2 par 3, ce qui amène une résolution d'écran de 80 par 75. Pas fameux.

    Caractères semi-graphiques du VG5000µ

    L'utilisation des caractères programmables est la seconde manière d'afficher des pixels à ĺ'écran. Cette méthode est présentée rapidement dans le manuel et est similaire à celle que l'on retrouve sur l'Amstrad CPC par exemple. Grace à un encodage d'une grille de 8 pixels par 10, un caractère peut être redéfini, puis affiché avec PRINT, après sélection de la bonne fonte.

    Ce type d'encodage sort du cadre de cet article, mais voilà ce que cela donne :

      XXXX   4+8+16+32  =  60 = 3C
     X    X  2+64       =  66 = 42
    X X  X X 1+4+32+128 = 165 = A5
    X      X 1+128      = 129 = 81
    X  XX  X 1+8+16+128 = 153 - 99
    X X  X X 1+4+32+128 = 165 = A5
    X      X 1+128      = 129 = 81
     X    X  2+64       =  66 = 42
      XXXX   4+8+16+32  =  60 = 3C
             0          =   0 = 00
    
    SETEG 65,"3C54A58199A581423C00"
    EG 0,6,0:PRINT"A";
    
      XXXX   4+8+16+32  =  60 = 3C
     X    X  2+64       =  66 = 42
    X X  X X 1+4+32+128 = 165 = A5
    X      X 1+128      = 129 = 81
    X X  X X 1+4+32+128 = 165 = A5
    X X  X X 1+4+32+128 = 165 = A5
    X  XX  X 1+8+16+128 = 153 = 99
     X    X  2+64       =  66 = 42
      XXXX   4+8+16+32  =  60 = 3C
             0          =   0 = 00
    
    SETEG 66,"3C42A581A5A599423C00"
    EG 0,6,0:PRINT"B";
    

    Smileys avec le VG5000µ

    Voilà avec quoi devait jouer un utilisateur du VG5000µ n'ayant sous les yeux que le seul manuel fourni avec l'ordinateur. Avec des caractères de 8 pixels par 10, on atteint une résolution potentielle de 320 par 250... mais avec de grosses limitations.

    Est-ce qu'il serait néanmoins possible de tracer des lignes ? Oui, surement, nous verrons ça plus tard.


« (précédent) Page 22 / 23 (suivant) »

Tous les tags

3d (15), 6809 (1), 8bits (1), Affichage (24), AgonLight (2), Altaïr (1), Amstrad CPC (1), Apple (1), Aquarius (2), ASM (30), Atari (1), Atari 800 (1), Atari ST (2), Automatisation (4), BASIC (31), BASIC-80 (4), C (3), Calculs (1), CDC (1), Clion (1), cmake (1), Commodore (1), Commodore PET (1), Compression (1), CPU (1), Debug (5), Dithering (2), Divers (1), EF9345 (1), Émulation (7), Famicom (2), Forth (3), Game Jam (1), Hector (3), Histoire (1), Hooks (4), i8008 (1), Image (17), Jeu (14), Jeu Vidéo (4), Livre (1), Logo (2), Machine virtuelle (2), Magazine (1), MAME (1), Matra Alice (3), MDLC (7), Micral (2), Motorola (1), MSX (1), Musée (2), Nintendo Switch (1), Nombres (3), Optimisation (1), Outils (3), Pascaline (1), Peertube (1), PHC-25 (1), Photo (2), Programmation (5), Python (1), ROM (15), RPUfOS (5), Salon (1), SC-3000 (1), Schéma (5), Synthèse (15), Tortue (1), Triceraprog (1), VG5000 (62), VIC-20 (1), Vidéo (1), Z80 (21), z88dk (1)

Les derniers articles

Compression de donnees, compter les repetitions
PHC-25, et Z80 en IM 2
Récréation Famicom
Family BASIC, le BASIC sur Famicom
Instance Peertube pour Triceraprog
Environnement de développement pour Picthorix
Un jeu en Forth pour Hector HRX : Picthorix
Yeno SC-3000 et condensateurs
Suite de tests pour VG5000µ
Un peu d'Atari ST

Atom Feed

Réseaux