Navigation

Tutoriel précédent : tour d'horizon   Sommaire   Tutoriel suivant : la base

II. Introduction

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.
Nous allons donc progresser lentement mais sûrement.

III. 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 son 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é.

IV. La Chip 8

IV-A. Définition

Chip 8

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.

IV-B. Caractéristiques de la Chip 8

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

IV-B-1. La mémoire

Les adresses mémoire de la Chip 8 vont de $200 à $FFF, 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 premiers 512 octets sont réservés à l'interpréteur. Sur ces machines, les 256 octets les plus élevés ($F00-$FFF sur une machine 4 Ko) ont été réservés au rafraîchissement de l'écran, et les 96 octets inférieurs ($EA0-$EFF) ont été réservés à la pile d'appels, à usage interne, et les variables.

IV-B-2. Les registres

La Chip 8 comporte 16 registres de 8 bits dont les noms vont de V0 à VF (F = 15, en 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.

IV-B-3. 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.

IV-B-4. Les compteurs

La Chip 8 est composée de 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.

IV-B-5. 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.

IV-B-6. 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.

IV-B-7. 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.

Rappel : un opcode est la valeur lue à partir de la mémoire.

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 N en pixels.
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.

IV-C. 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 ?

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. Image non disponible
Vous pouvez lancer votre IDE et que la programmation commence !

Pour créer l'émulateur, je donne des explications par rapport à une citation dans la présentation de la Chip 8 puis le code C/SDL pour le réaliser. Je vous conseille donc d'essayer avec les explications de créer votre propre code pour mieux comprendre. Vous pourrez éventuellement jeter un coup d'œil sur le code proposé pour vous faire une idée plus précise.

Navigation

Tutoriel précédent : tour d'horizon   Sommaire   Tutoriel suivant : la base