Un émulateur CHIP-8

Au cours de l'année, j'ai cherché à réaliser quelques projets, mais entre le travail et la famille, je manque toujours de temps ou de motivation pour les terminer. J'essayais de faire un petit jeu avec Raylib, mais je finissais toujours par changer l'idée du jeu en cours de route. Je me suis donc dit : pourquoi ne pas faire un émulateur? Le jeu est déjà fait — il me reste à programmer la machine qui le fait rouler.

Après une petite recherche, j'ai vu que le CHIP-8 était le « Hello, World! » de l'émulation. Ce n'est d'ailleurs même pas une vraie console : c'est une machine virtuelle des années 70, conçue pour rendre les petits jeux faciles à programmer sur les micro-ordinateurs de l'époque. On parle de 35 codes d'opération à interpréter et de 16 registres de 8 bits. En comparaison, la Game Boy Color possède environ 70 instructions différentes et 8 registres.

La machine

Tout l'émulateur tient dans une poignée de composants :

  • 4 Ko de mémoire vive;
  • un écran monochrome de 64 × 32 pixels;
  • 16 registres d'un octet, nommés V0 à VF (VF sert aussi de registre de retenue);
  • et une boucle qui lit une instruction, la décode et l'exécute, environ 700 fois par seconde.

Ce que j'ai appris

Le projet était vraiment intéressant parce que je n'ai pas souvent l'occasion de faire des opérations sur les bits. Chaque instruction est un nombre de 16 bits qu'il faut analyser pour en extraire l'opération et ses arguments. À force, on finit par lire l'hexadécimal presque naturellement :

0x2A = 0010 1010
  méthode 1 : (2 × 16) + (10 × 1) = 42
  méthode 2 : compter en binaire : 0b00101010 = 42

C'est aussi comme un mini-ordinateur : on manipule directement la mémoire, les registres et l'écran pour arriver à jouer.

Le résultat

L'émulateur est écrit en C avec Raylib, puis compilé en WebAssembly avec Emscripten. Il est jouable directement sur ce site, avec Tetris, Breakout et Space Invaders : /projects/chip8.

En conclusion

Je crois bien que je vais reprendre l'aventure. J'ai commencé à m'immiscer dans le développement bare metal — je travaille actuellement sur un petit synthétiseur — et si tout se passe bien, j'aimerais trouver du temps dans les prochains mois pour faire un émulateur Game Boy, cette fois sur du vrai matériel.