Programmer un émulateur

Chapitre 2 : Quelle console émuler ?

BestCoder

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.

Commentez

- Titre : Programmer un émulateur

- Auteur : BestCoder

- Parution : 11 mars 2014

- Licence : Le contenu de cet article est rédigé par BestCoder et est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d'Utilisation Commerciale - Partage dans les Mêmes Conditions 3.0 non transposé. Les logos Developpez.com, en-tête, pied de page, css, et look & feel de l'article sont Copyright ® 2013 Developpez.com.

Sommaire

- Navigation

- II. Introduction

- III. Critères de sélection

- IV. La Chip 8

- IV-A. Définition

- IV-B. Caractéristiques de la Chip 8

- IV-B-1. La mémoire

- IV-B-2. Les registres

- IV-B-3. La pile

- IV-B-4. Les compteurs

- IV-B-5. Les contrôles

- IV-B-6. Le graphique

- IV-B-7. Liste des instructions

- IV-C. La RCA 1802

- Navigation

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

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