CHIP-8 offre 64 × 32 pixels monochromes, seize registres de 8 bits et, si l’on veut rester compatible avec les implémentations historiques, environ 3 232 octets pour le programme et ses données.1 C’est à peine assez pour ranger une petite image moderne. Pourtant, un demi-siècle après sa création, des gens continuent à écrire de nouveaux programmes pour cette machine virtuelle.

Le long guide The Art of CHIP-8 part d’une idée plus intéressante que la nostalgie : préserver une vieille plateforme ne suffit pas à la garder vivante. Il faut encore fabriquer des choses dessus.1

Extrait du guide The Art of CHIP-8 avec instructions, registres et exemples de code
L’instruction set est petit, mais cinquante ans d’interpréteurs ont ajouté une autre contrainte : écrire du code qui se comporte pareil sur des machines légèrement différentes.BeyondLoom / capture IRZ

La compatibilité est devenue une contrainte créative en plus

CHIP-8 possède seulement 34 instructions élémentaires dans la description utilisée par le guide.1 Ce minimalisme devrait rendre la plateforme simple. L’histoire a fait l’inverse.

Des centaines d’interpréteurs ont reproduit CHIP-8 avec de petites différences. Certaines instructions de décalage ne manipulent pas les registres de la même manière. Des variantes modifient le registre de retenue après des opérations binaires. Les sprites qui dépassent de l’écran peuvent être coupés ou se comporter différemment selon l’interpréteur.1 Le site CHIP-8 Research Facility documente ces extensions et divergences historiques.2

Le programmeur doit donc choisir entre exploiter un comportement particulier ou rester dans un sous-ensemble suffisamment prudent pour tourner partout. La limite ne vient plus seulement des 3 232 octets. Elle vient aussi de la diversité des machines qui prétendent toutes être CHIP-8.

Dessiner signifie faire un XOR

La contrainte la plus fertile se trouve dans l’affichage. CHIP-8 ne propose pas une grande API graphique. Une instruction dessine un sprite en combinant ses bits avec ceux déjà présents à l’écran par XOR.1

Un pixel blanc redessiné devient noir. Un pixel noir devient blanc. La machine peut signaler qu’une collision a eu lieu lorsqu’un pixel allumé a été effacé pendant cette opération.1 La même primitive sert donc à afficher, effacer et détecter certaines collisions.

Cette mécanique change la manière de penser une animation. Le guide montre qu’on peut préparer des images déjà XORées entre deux frames : une seule opération efface alors l’ancien état et dessine le nouveau. On réduit le scintillement, mais on renonce en partie à utiliser le drapeau de collision de manière classique.1

Ce n’est pas « faire la même animation avec moins de pixels ». C’est construire l’animation autour de la façon exacte dont la machine sait modifier son framebuffer.

Exemples de code et de dessin dans le guide The Art of CHIP-8
Avec CHIP-8, l’outil de dessin et la structure du programme finissent souvent par se confondre. Les contraintes graphiques deviennent des contraintes d’algorithme.BeyondLoom / capture IRZ

Les outils naissent autour de la contrainte

Le paradoxe arrive ensuite. Une machine minuscule finit par demander des outils supplémentaires. L’auteur d’Octo explique que les animations sophistiquées peuvent pousser à fabriquer des convertisseurs ou petits programmes de préparation capables de transformer les données avant qu’elles n’entrent dans les quelques kilo-octets disponibles.1

C’est un mouvement familier dans la fabrication. Quand la machine finale possède peu de degrés de liberté, on déplace de l’intelligence dans le gabarit, le fichier de préparation ou la méthode. Un métier à tisser, un plotter ou une CNC imposent eux aussi leur grammaire. La créativité ne disparaît pas sous la contrainte. Elle change d’endroit.

CHIP-8 reste alors intéressant moins comme objet rétro que comme petit laboratoire. Avec une surface technique assez réduite pour être comprise, il rend visibles des décisions que les outils modernes cachent souvent derrière une API : combien coûte un sprite, ce qu’efface réellement un dessin, pourquoi une frame scintille, quel comportement est portable.

64 × 32 pixels ne donnent pas beaucoup d’espace. Ils donnent surtout très peu d’endroits où cacher une mauvaise décision.