Site logo

Triceraprog
La programmation depuis le Crétacé

  • Environnement de développement pour Picthorix ()

    Forth est naturellement un langage qui est souvent utilisé dans un environnement interactif qui est à la fois un interpréteur et un compilateur. Il est aussi parfois accompagné d'un éditeur qui permet d'enregistrer des pages de code, afin de les sauvegarder, de les recharger et de les exécuter.

    Le Hector HRX a bien tout ça, et cela était probablement très agréable dans les conditions d'époque. Enfin, peut-être pas lorsque l'on n'avait que le lecteur de cassette intégré. En effet, le système puissant des écrans charge et sauve les pages automatiquement au besoin. Pratique lorsque la mémoire de masse est à accès direct, comme une disquette. Mais avec une cassette, il faut souvent avancer, rembobiner avec de bonnes chances d'écraser des données.

    Pour le développement de Picthorix, j'ai souvent utilisé le mode interactif pour bien comprendre le fonctionnement de certains mots, pour tester des idées, pour vérifier le fonctionnement de certaines parties de mon code. Mais hors de question d'utiliser en continu le mode natif, j'aurais perdu trop de temps en manipulations et en erreurs.

    Donc, comme souvent, j'ai réfléchi à un petit environnement de développement à base d'éditeur et d'émulateur sur PC.

    Formatage des écrans

    Le Hector HRX peut avoir en mémoire 10 écrans simultanés. Chaque écran contient 798 caractères. Chaque caractère est donc précieux. Mais formatter son code pour le rendre lisible et ajouter des commentaire est très précieux aussi, surtout dans un langage que l'on ne maîtrise pas.

    J'ai donc fait le choix d'avoir en source un fichier texte de forme libre et d'avoir une moulinette qui compacte le code pour mettre le maximum de code dans un écran. Il existe aussi le mot Forth --> qui permet de lancer l'exécution de l'écran suivant numériquement, la moulinette peut donc ajouter ce mot de transition à la fin de chaque écran, sauf le dernier.

    En pratique, il y a quelques pièges dans lesquels je suis tomber. Le premier est que la définition d'un mot ne peut pas commencer sur un écran et continuer dans le suivant. Il aurait fallu avoir un peu d'analyse du code Forth pour faire ce découpage correctement. C'est un piège que j'ai contourné de manière tout à fait manuelle : je place les --> à la main dans le code source pour séparer les screens. Pas le plus agréable, je me suis souvent retrouvé avec des screens trop grands qui ne chargeaient pas correctement, mais pas assez par rapport au temps de développement que cela m'aurait pris.

    Second piège, que j'ai mis un moment à comprendre. Parfois, mes affichages de chaînes de caractères étaient décalées, comme si des espaces étaient ajoutées en début de chaîne. J'ai mis un moment à comprendre que c'était parce que la mot de début de chaîne ." se trouvait en fin de ligne, mais pas en dernière caractère, et que le premier mot affiché se trouvait à la ligne suivante. Comme les écrans ont une largeur fixe, des espaces étaient ajoutés mécaniquement en début de chaîne.

    J'ai corrigé ça rapidement en revenant à la ligne lors de la détection d'un mot .". Cela fait perdre de l'espace, mais pas trop. Ça passe...

    Dernier piège... un développement un peu fait rapidement. La moulinette n'est pas très solide et se plante parfois lorsque la ligne source est « trop » longue. Je n'ai pas analysé pourquoi. J'ai contourné le problème en coupant les lignes trop longues dans le source lorsque le bug apparaissait. Celui-ci provoque un saut au prochain screen pour une raison qui m'échappe, mais qui serait probablement simple à comprendre avec du temps pour le débugger. Je n'ai pas pris ce temps.

    L'éditeur

    Le code source est édité dans Visual Code, mais techniquement, il n'y a rien de spécial. Je ne l'ai pas spécifiquement customisé, à part une petite colorisation syntaxique.

    L'émulateur

    Comme d'habitude, j'utilise MAME pour son scripting Lua qui a un accès au debugger. J'ai fais évoluer le script déjà utilisé dans des précédents projets (description initiale ici). Il a fallu bien entendu adapter les points d'arrêt pour l'automatisation et injecter les écrans préalablement converti en format binaire en mémoire.

    L'injection des écrans directement en mémoire est un peu fragile. En effet, Forth ajuste des variables lorsque l'on créé et on manipule des écrans. J'ai tenter de forcer ces variables à des valeurs connues en fonction des écrans injectés, mais sans vraiment de succès. Je me retrouvais avec un environnement extrêmement instable. J'ai cependant repéré qu'en évitant d'utiliser le premier écran, le système se comportait bien. Tant pis pour la perte d'un écran.

    Une fois les écrans injectés, je lance la compilation en passant l'émulateur en mode rapide, et j'obtiens ainsi un compilateur. La nature du Forth fait qu'à la fin du processus, j'ai une image du jeu compilé en mémoire à un emplacement tout à fait déterminé.

    À partir de là, soit je peux lancer le jeu pour les tests, soit tester certains mots. Je peux aussi sauvegarder la mémoire pour la recharger plus tard.

    Comme au bout d'un moment, j'ai rempli tous les screens, j'ai eu besoin d'une deuxième série d'écran à compiler à la suite. Pour scripter cela, le dernier écran de la première série termine en écrivant à un endroit précis de la mémoire et très éloigné de l'espace utilisé. Le script Lua détecte cette écriture et injecte la nouvelle série d'écran, puis lance une nouvelle compilation.

    Cela aurait pu être étendu à plus de séries d'écrans, il reste encore beaucoup de place en mémoire avec le jeu au complet. Cependant, comme il s'agit de le mettre sur cassette à la fin, il faut aussi veiller à ce que le temps de chargement soit de durée acceptable.

    Toujours automatiser !

    C'est mon conseil récurrent, et je le répète à nouveau. La dernière étape pour créer un jeu distribuable est donc de dumper la mémoire contenant tous les mots compilés qui forment le jeu. À partir du debuggeur, il faut donc spécifier une plage mémoire à sauvegarder et une adresse du mot de démarrage. Pour cela, en fin de compilation de la dernière série de screen, j'affichais les informations (taille, adresse de début) à l'écran. Restait à utiliser ces informations dans le debugger pour sauvegarder la mémoire.

    Le jour où je voulais publier le jeu, impossible d'avoir un dump qui fonctionne. J'ai passé la soirée à analyser un bug. Forcément, un vendredi soir, la fatigue de fin de semaine n'aide pas. Je suis allé me coucher sans trouver. Le lendemain, je relance et je trouve immédiatement (une bonne nuit de sommeil, ça aide). La taille que j'avais recopié à la main pour le dump n'était pas la bonne, de quatre octets...

    J'ai donc ajouté au script Lua le dump automatique, en allant chercher l'information sur la taille laissée par la fin de la compilation en mémoire.

    Conclusion

    Chaque operation manuelle répétée est une occasion de perdre son temps...

    À part ça, pas grand chose de neuf. Les outils sont disponibles dans les sources du jeu. Cependant, à la date d'écriture de cet article, avoir un Hector HRX qui fonctionne bien sur MAME nécessite quelques modifications que je n'ai pas encore proposé pour intégration. Mais cela sera fait quand j'aurais nettoyé les changements et vérifié que je n'ai pas cassé d'autres machines.


  • Un jeu en Forth pour Hector HRX : Picthorix ()

    À nouvelle édition de Retro Programmers United for Obscure Systems, nouvelle machine et une nouvelle participation.

    La gamme de machine couverte par cette édition est la gamme Hector HR et suivants : 2HR, 2HR+, HRX, MX40 et MX80. Pour des informations sur cette gamme de machines, je vous invite à consulter cette page.

    Hector HRX

    Ces machines forment une gamme de machines vaguement compatibles les unes avec les autres. Des petites différences de matériel, et surtout de ROM, font que les programmes ne sont pas forcément compatibles entre les différentes machines. D'après ce que j'ai compris, pour rien n'arranger, c'était une machine ouverte à la bidouille et aux modifications hardware. Le parc de machines devait donc être assez hétérogène.

    De la gamme, j'ai donc choisi une machine : le HRX. Pour deux raisons. La première est parce que j'en avais une sous la main (mais en demande de réparation), et j'aime bien pouvoir voir la machine pour imaginer le jeu qui va avec (et pour tester... quand la machine fonctionne). La seconde car c'est une machine qui a un Forth résident. Et si je connais un peu le Forth pour avoir joué avec et lu à son propos, je n'avais jamais développé un programme complet en Forth. Or, c'est dans ces situations que l'on découvre vraiment un langage.

    La découverte

    La première étape, comment toujours, est de découvrir la machine. Il y a pas mal de documentation disponible sur les différentes machines, surtout sous forme de magazines spécialisés à petits tirages (j'imagine), un peu de document de reverse engineering, des plans des certaines des machines (dont le HRX) et le code source de MAME. Il existe même un manuel Forth, sous forme de didacticiel, pour le HRX. Ce manuel m'a été très utile pour me remettre dans l'esprit Forth et faire le tour des capacités de la machine.

    Une fois lu le manuel et fait quelques exercices et tests, j'ai démarré... non pas le jeu, mais une relecture du manual, en notant tous les mots Forth et leur fonctionnement, afin de les classer par catégorie, les expliquer et les rendre accessible sous forme de référence en ligne, indexé. Cela m'a pris pas mal de temps, mais j'étais certain d'avoir parcouru tous les mots, de les avoir presque tous compris, et surtout, de pouvoir les retrouver rapidement.

    Le résultat est disponible sur cette page.

    Ce n'est pas tout à fait complet et j'y trouve encore quelques petites erreurs en m'y référant, mais c'est déjà très utilisable. Le code source de la page est disponible si vous voulez le compléter.

    L'environnement de développement

    Le Forth du HRX est fourni avec un système de « screen », qui est classique pour le Forth. Les « screens » permettent d'éditer et d'enregistrer des données, généralement des commandes et des mots, pour les réutiliser à volonté. Le système offre du paging automatique mais avec un système sur cassette, c'est pratiquement inutilisable.

    De plus, l'éditeur est un éditeur de ligne, pas très agréable, même si ça dépanne. Il existe un éditeur pleine page que l'on peut charger depuis une disquette. Ça peut être intéressant pour retrouver les sensations sur la machine, mais pour un développement, je trouvais ça un peu lourd.

    J'ai donc, comme souvent, créé mon petit environnement en utilisant MAME et un script d'automatisation. Je ferai un article à ce sujet par la suite. Sans détail, cela m'a permis de programmer depuis Visual Code et de lancer une compilation en me servant de la machine émulée.

    Le jeu

    Lorsque je n'ai pas une machine fonctionnelle sous la main, je préfère chercher des idées de jeux qui ne vont pas pousser les performances ou les exotismes de la machine. Particulièrement dans le cas de ces machines avec peu d'activité, où les émulateurs ne sont pas toujours très fidèles.

    Mon fils m'a proposé alors l'idée d'un Picross, aussi connu sous le nom de Nonogram ou encore Logimage... et plein d'autres noms. L'idée est de remplir une grille en suivant des indications sur les groupes de « pixels » par lignes et par colonnes. Bonne idée, je suis parti là-dessus.

    Du à ma méconnaissance du Forth, ça a été assez laborieux. J'ai pas mal appris au passage et j'écrirais certaines choses probablement différemment si je devais recommencer. Je n'ai pas utilisé les capacités de la machines au niveau graphique, qui peut aller bien plus loin que ça, avec de l'adressage au pixel sans color clash.

    Au passage, j'ai aussi appris à créer des grilles de Picross. Pour cela, j'ai utilisé un programme un ligne qui permet de savoir si la grille est résolvable ou pas. C'est pratique, car il ne suffit pas de faire une grille avec un dessin sympa. Il faut à cette grille une solution unique, ce qui n'est pas toujours le cas sur une grille quelconque.

    Au final, j'ai créé 9 grilles, dont deux vraiment comme une initiation et cinq comme références aux cinq jeux précédents avec lesquels j'ai participé aux précédentes éditions de RPUfOS.

    Pour télécharger le jeu, c'est sur la page itch.io.

    Picthorix


  • Yeno SC-3000 et condensateurs ()

    Suite à une panne sur un Yeno SC-3000 récemment, j'ai du changer un condensateur. En travail préparatoire, j'ai fait une photo annotée de la carte mère.Là voici, si ça peut aider.

    L'image est cliquable pour l'agrandir.

    Platine principale


  • Suite de tests pour VG5000µ ()

    Il y a quelques années, j'avais commencé une suite de tests pour le VG5000µ sous la forme d'un programme en mélange de C et assembleur. L'idée était double : écrire une référence pour s'inspirer dans la programmation du VG5000µ (et particulièrement de l'EF9345), ainsi que tester la fidélité des émulateurs.

    Je me suis servi de cette base de code pour la première raison et mes besoins personnels. J'ai aussi pu corriger une paire de bugs dans MAME grâce à la seconde utilisation.

    Cependant, cette base de code traîne depuis un moment sur mon disque et je n'y passe pas beaucoup de temps. Alors autant que ça serve à d'autres, et je mets donc aujourd'hui cette base à disposition.

    Je ne sais plus trop dans quel état il est. Ça doit globalement fonctionner. J'imagine.

    En tout cas, c'est dispo sous licence CC0, donc faites-en ce que vous voulez.


  • Un peu d'Atari ST ()

    Ce site est, en tout cas a été jusqu'à maintenant, très machines 8 bits. Du fait des participations aux Retro Programmers United for Obscure Systems, mais aussi aux machines sur lesquelles je m'amuse le plus. L'avantage des machines 8 bits, c'est qu'elles la plupart du temps assez simple à comprendre, à programmer, avec des designs techniques parfois originaux mais qui restent abordables.

    Cependant, il y a peu, Zisquier a lancé un site pour aborder le 68000 à travers la programmation en assembleur sur Atari ST. Je m'étais lancé dans l'idée d'essayer d'enseigner l'assembleur de manière ludique, mais comme on dit, « life happens » et je n'ai pas poursuit sur la lancée.

    Comme j'étais en pause d'été, que l'Atari ST (STE en réalité) fait partie de mon historique de machines personnelles, et que j'avais quitté cette machine sans en avoir fait le tour je pense, même si j'y avais fait un peu d'assembleur, je me suis dit que c'était l'occasion de la redécouvrir. Par la programmation bien entendu.

    Le ton de Zisquier est direct, il va à l'essentiel, progressivement. Il y a des tests à la fin des leçons qui apportent un petit côté ludique. C'est fun et j'aime bien. Et petit à petit, me voici actuellement avec un sprite qui se déplace à l'écran au-dessus d'un décors.

    Le code est un peu moche, j'y vais un peu à tâtons et je ne sais pas toujours quels sont les meilleurs façon d'utiliser les instructions 68000. Mais il y a un Discord associé avec des personnes qui sont aidantes sur le sujet.

    Le sprite est en CC-BY 3.0 par « Withthelove », trouvé sur OpenGameArt.org.

    Le tileset est en CC0 par « Kenney », c'est Tiny Town remanié au niveau de la palette de couleurs et du layout pour correspondre à l'Atari ST et à mon besoin.

    Sprite et Tilemap sur Atari ST


Page 1 / 22 (suivant) »

Tous les tags

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

Les derniers articles

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
Le Forth sur Hector HRX
J'MSX 24 et un micro jeu
Récréation 3D, Matra Alice
Tuiles des plus très-curieuses
Notes sur le Motorola 6809

Atom Feed

Réseaux