• 20 heures
  • Difficile

Mis à jour le 05/12/2013

Quelle console émuler ?

Connectez-vous ou inscrivez-vous gratuitement pour bénéficier de toutes les fonctionnalités de ce cours !

Pour construire un gratte-ciel, il faut des fondations solides. Nous aussi, pour faire des prouesses en émulation, nous allons débuter par des choses simples.
Ça ne sert à rien d'attaquer la NDS ou la PSP NGP en premier, vous allez vous casser les dents et détester l'émulation à jamais. :D
Nous allons donc progresser lentement mais sûrement.

Critères de sélection

Dans tous les domaines où l'on évolue, il est toujours préférable de procéder du plus facile au plus compliqué. Pour l'émulation, cette règle reste valable et la « machine » qui me paraît la plus appropriée est la Chip 8.

En effet, avec un faible nombre d'instructions (35 pour être plus précis) et un rendu graphique de 64 × 32 pixels en noir et blanc, la Chip 8 est l'un des meilleurs supports pour débuter en émulation.
En plus de sa facilité d'implémentation, un bon nombre de jeux Chip 8 sont dans le domaine public, ce qui limite (supprime même) les problèmes liés à la légalité.

Mais c'est quoi la Chip 8 en réalité ?

Pourquoi as-tu mis « machine » entre guillemets ?

Vous serez éclairés sous peu.

La Chip 8

Définition

Image utilisateur

La Chip 8 est en réalité un langage interprété qui a été utilisé sur le RCA TELMAC-1800 et le COSMAC VIP en 1977. Elle est constituée d'un ensemble d'instructions qui permettent une programmation facile pour lesdites machines.

Remodelée, la Chip 8 fut utilisée plus tard pour créer des calculatrices graphiques. D'ailleurs, plusieurs jeux ont été développés pour ce système et on ne manquera pas d'en discuter plus tard.

Caractéristiques de la Chip 8

Voici les principales caractéristiques de la Chip 8. Le document est une traduction de la présentation de Wikipédia.

La mémoire

Les adresses mémoire de la Chip 8 vont de $200 à $FFF (l'hexadécimal revient), faisant ainsi 3 584 octets. La raison pour laquelle la mémoire commence à partir de $200 est que sur le VIP et Cosmac Telmac 1800, les 512 premiers octets sont réservés pour l'interpréteur. Sur ces machines, les 256 octets les plus élevés ($F00-$FFF sur une machine 4K) ont été réservés pour le rafraîchissement de l'écran, et les 96 octets inférieurs ($EA0-$EFF) ont été réservés pour la pile d'appels, à usage interne, et les variables.

Les registres

La Chip 8 comporte 16 registres de 8 bits dont les noms vont de V0 à VF (F = 15, encore l'hexadécimal). Le registre VF est utilisé pour toutes les retenues lors des calculs.
En plus de ces 16 registres, nous avons le registre d'adresse, nommé I, qui est de 16 bits et qui est utilisé avec plusieurs opcodes qui impliquent des opérations de mémoire.

La pile

La pile sert uniquement à stocker des adresses de retour lorsque les sous-programmes sont appelés. Les implémentations modernes doivent normalement avoir au moins 16 niveaux.

Les compteurs

La Chip 8 est composée deux compteurs. Ils décomptent tous les deux à 60 hertz, jusqu'à ce qu'ils atteignent 0.

Minuterie système : cette minuterie est destinée à la synchronisation des événements de jeux. Sa valeur peut être réglée et lue.
Minuterie sonore : cette minuterie est utilisée pour les effets sonores. Lorsque sa valeur est différente de zéro, un signal sonore est émis. Sa valeur peut être réglée et lue.

Les contrôles

L'entrée est faite avec un clavier qui possède 16 touches allant de 0 à F. Les touches « 8 », « 4 », « 6 » et « 2 » sont généralement utilisées pour l'entrée directionnelle.

Le graphique

La résolution de l'écran est de 64 × 32 pixels, et la couleur est monochrome. Les dessins sont établis à l'écran uniquement par l'intermédiaire de sprites, qui font 8 pixels de large et avec une hauteur qui peut varier de 1 à 15 pixels. Les sprites sont codés en binaire. Pour une valeur de 1, le pixel correspondant est allumé et pour une valeur 0, aucune opération n'est effectuée. Si un pixel d'un sprite est dessiné sur un pixel de l'écran déjà allumé, alors les deux pixels sont éteints. Le registre de retenue (VF) est mis à 1 à cet effet.

Liste des instructions

La Chip 8 possède 35 opcodes, qui sont tous de deux octets de long.
Ils sont énumérés ci-dessous, en hexadécimal et avec les symboles suivants :

  • NNN : adresse de 12 bits ;

  • NN : constante de 8 bits ;

  • N : constante de 4 bits ;

  • X et Y : identifiant registre de 4 bits.

Opcode

Explication, description

0NNN

Appelle le programme de la RCA 1802 à l'adresse NNN. (Voir plus bas.)

00E0

Efface l'écran.

00EE

Retourne à partir d'une sous-fonction.

1NNN

Effectue un saut à l'adresse NNN.

2NNN

Exécute le sous-programme à l'adresse NNN.

3XNN

Saute l'instruction suivante si VX est égal à NN.

4XNN

Saute l'instruction suivante si VX et NN ne sont pas égaux.

5XY0

Saute l'instruction suivante si VX et VY sont égaux.

6XNN

Définit VX à NN.

7XNN

Ajoute NN à VX.

8XY0

Définit VX à la valeur de VY.

8XY1

Définit VX à VX OR VY.

8XY2

Définit VX à VX AND VY.

8XY3

Définit VX à VX XOR VY.

8XY4

Ajoute VY à VX. VF est mis à 1 quand il y a un dépassement de mémoire (carry), à 0 quand il n'y en a pas.

8XY5

VY est soustrait de VX. VF est mis à 0 quand il y a un emprunt et à 1 quand il n'y en a pas.

8XY6

Décale (shift) VX à droite de 1 bit. VF est fixé à la valeur du bit de poids faible de VX avant le décalage.

8XY7

VX = VY - VX, VF est mis à 0 quand il y a un emprunt, et à 1 quand il n'y en a pas.

8XYE

Décale (shift) VX à gauche de 1 bit. VF est fixé à la valeur du bit de poids fort de VX avant le décalage.

9XY0

Saute l'instruction suivante si VX et VY ne sont pas égaux.

ANNN

Affecte NNN à I.

BNNN

Passe à l'adresse NNN + V0.

CXNN

Définit VX à un nombre aléatoire inférieur à NN.

DXYN

Dessine un sprite aux coordonnées (VX, VY).
Le sprite a une largeur de 8 pixels et une hauteur en pixels N.
Chaque rangée de 8 pixels est lue comme codée en binaire à partir de l'emplacement mémoire I.
I ne change pas de valeur après l'exécution de cette instruction.

EX9E

Saute l'instruction suivante si la clé stockée dans VX est pressée.

EXA1

Saute l'instruction suivante si la clé stockée dans VX n'est pas pressée.

FX07

Définit VX à la valeur de la temporisation.

FX0A

L'appui sur une touche est attendu, puis stocké dans VX.

FX15

Définit la temporisation à VX.

FX18

Définit la minuterie sonore à VX.

FX1E

Ajoute VX à I. VF est mis à 1 quand il y a overflow (I+VX>0xFFF), et à 0 si ce n'est pas le cas.

FX29

Définit I à l'emplacement du caractère stocké dans VX. Les caractères 0-F (en hexadécimal) sont représentés par une police 4x5.

FX33

Stocke dans la mémoire le code décimal représentant VX (dans I, I+1, I+2).

FX55

Stocke V0 à VX en mémoire à partir de l'adresse I.

FX65

Remplit V0 à VX avec les valeurs de la mémoire à partir de l'adresse I.

La RCA 1802

0NNN

Appelle le programme de la RCA 1802 à l'adresse NNN.

Cette instruction ne nous intéresse pas. En réalité, la RCA 1802 est un microprocesseur 8 bits qui a été utilisé dans certains micro-ordinateurs et consoles de jeu tels que la RCA Studio II. Ce microprocesseur possédait un jeu d'instructions intégrées que les nouvelles implémentations ignorent. Nous allons donc faire de même. :-°

Mais ça m'avance à quoi, tous ces détails ?

Ne paniquez pas si cette description ne vous éclaire pas, nous allons expliquer ligne par ligne tout ce qui a été dit ci-dessus.
C'est grâce à ce document que nous allons programmer notre émulateur ; nous allons le traduire en langage machine. ;)
Vous pouvez lancer votre IDE, et que la programmation commence !

Exemple de certificat de réussite
Exemple de certificat de réussite