La machine CHIP-8

CHIP-8

La nuit dernière, j’ai codé un émulateur CHIP-8 en C. Il s’agit de mon premier émulateur et il fonctionne plutôt bien !

Je me suis servi des spécifications du CHIP-8 que j’ai récupéré ici : http://devernay.free.fr/hacks/chip8/C8TECH10.HTM

Pong sur l'émulateur CHIP-8

Pong sur l'émulateur CHIP-8

Le travail consiste dans un premier temps à reproduire l’architecture du processeur (mémoire, registres, pile et horloge) et de la machine (clavier, écran et buzzer).

A ce stade, il est possible d’initialiser le CHIP-8, et de charger  le programme (tétris, pong, …) en mémoire. On peut ensuite entamer la lecture du programme.

 

La principale difficulté du projet est  de réussir à interpréter correctement les instructions. Le processeur utilise un jeu d’instruction assez réduit (une trentaine seulement) et les instructions sont codées sur 16 bits. On lit donc le programme par blocs de 16 bits pour former une instruction à chaque fois.

Je lis par exemple : 0x5430. Un coup d’œil sur les spécifications m’indique :

5xy0 - SE Vx, Vy
Skip next instruction if Vx = Vy.

Ainsi, pour pouvoir matcher cette instruction, il est nécessaire de pouvoir vérifier qu’elle commence par 5 et finit par 0 (ces deux chiffres hexa l’identifient comme étant SE Vx, Vy) et récupérer les deux valeurs x et y.

Pour matcher une instruction, je construit un masque. Pour l’exemple ci-dessus, j’utilise 0xF00F.

0×5**0 AND 0xF00F = 0×5000

(0×5120 AND 0xF00F) == 1 = 1 : l’instruction est matchée avec 0x5xy0

(0×5121 AND 0xF00F) == 1 = 0 : l’instruction n’est pas matchée 0x5xy0

Je peux ainsi matcher une instruction en me basant uniquement sur certains chiffres.

Pour récupérer un digit, le processus est quasiment identique :

Extraction du 3eme chiffre :

(0xABCD AND 0x00F0) = 0xC0 : le chiffre est extrait mais il y a une seizaine en trop !

(0xABCD AND 0x00F0) >> 4 = 0xC : le chiffre est correctement extrait

 

Une fois le code des 36 instructions écrit, il a ensuite fallu débug… à l’aveugle !