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 |