# CHIP-8

CHIP-8 est un langage de programmation hexadécimal interprété utilisant une machine virtuelle, développé par Joseph Weisbecker en 1978. Il était spécifiquement conçu pour faciliter la conception de jeux vidéo sur les micro-ordinateurs 8-bits bas de gamme de cette époque, comme le COSMAC VIP, le Telmac 1800 ou le DREAM 6800.
Le CHIP-8 a connu un regain d'intérêt en 1990, lorsqu'un interpréteur avait été développé pour la calculatrice graphique HP-48, inspirant des évolutions du langage (Super Chip-48).
Des interpréteurs du CHIP-8 et ses évolutions ont été développées pour un grand nombre de plateformes. Ceci est en partie dû au fait que le court jeu d'instruction, la simplicité des caractéristiques, ainsi qu'une bonne documentation technique et une grande communauté ont fait de la machine virtuelle du CHIP-8 un cas d'école pour les programmeurs désirant débuter dans le développement des émulateurs.

## Histoire

En décembre 1978, Joseph Weisbecker introduit dans un article de Byte Magazine le CHIP-8 pour démontrer la puissance des langages de programmation hexadécimaux interprétés.
Le CHIP-8 se veut alors comme étant un langage de plus haut niveau que l'assembleur tout en restant un pseudo-langage machine, mais utilisable sur les machines bas de gamme de l'époque, n'ayant que 1 ou 2 kB de mémoire adressable, des terminaux monochromes basse résolution de quelques dizaines de pixels, et des claviers 16 touches.
Non seulement l'interpréteur CHIP-8 pouvait s'exécuter sur du matériel bas de gamme, ses programmes occupant 5 à 10 fois moins de place que des programmes équivalents en BASIC, à une époque où la mémoire RAM coutait extrêmement cher.
A titre comparatif, l'interpréteur BASIC le plus léger nécessitait au moins 8 kB de mémoire, un clavier complet et un terminal capable d'afficher des caractères alphanumériques, autrement dit un matériel dont le prix était encore hors de portée des particuliers.
Le langage CHIP-8 offre des boucles de contrôle, arithmétique, affichage de graphiques monochromes, émission de bips sonores, et support des claviers 16-touches hexadécimaux. De nombreux jeux phares de l'époque (Pong, Space Invaders, Pac-Man, etc.) sont vite adaptés en CHIP-8.
En 1990, Andreas Gustafsson développe un interpréteur en CHIP-8 pour la calculatrice graphique HP-48 qui manque alors de moyens de créer facilement des jeux. Ceci lance un regain d'intérêt pour le langage, et entraine des évolutions baptisées Chip-48, puis Super Chip-48 visant à tirer parti des possibilités de la calculatrice HP-48, notamment une plus grande résolution des graphismes. Par la suite, la machine virtuelle de CHIP-8 a souvent été utilisée comme cas pratique pour les gens souhaitant s'initier à la programmation d'émulateurs, et des implémentations de l'interpréteur de CHIP-8 et ses évolutions ont été développés sur une grande variété de plateformes.

## Caractéristiques de la machine virtuelle

CHIP-8 peut adresser 3584 octets de mémoire sur la plage 0x200 - 0xFFF. Sur les premiers ordinateurs où CHIP-8 était implémenté, l'interpréteur occupait les 512 octets de la plage 0x000 à 0x1FF. De plus la plage 0xF00 à 0xFFF était réservée à l'affichage, et la plage 0xEA0 à 0xEFF à la pile d'appel et les variables.
La machine virtuelle du CHIP-8 implémente 16 registres de données de 8 bits, nommés V0 à VF. Le registre VF sert d'indicateur de retenue et son contenu est modifié par certaines fonctions. CHIP-8 comprend également un registre d'index de 16 bits exploité par certaines fonctions de mémoire. Enfin, il existe des registres utilisés par l'interpréteur mais inaccessibles aux programmes qui comprennent un compteur ordinal de 16-bits et un pointeur de pile de 8-bits qui pointe vers le plus haut niveau de la pile.
CHIP-8 utilise également une pile stockant les adresses de retour des sous-routines. Originellement, 48 octets étaient alloués pour cette pile, permettant jusqu'à 12 niveaux d'appels.
CHIP-8 comporte deux timers :
* le timer de délai permet de chronométrer des évènements. Sa valeur peut être réglée et lue.
* le timer de son provoque un bip lorsque sa valeur est supérieure à zéro.
Les timers sont décrémentés à une cadence de 60 hertz jusqu'à ce qu'ils atteignent zéro.
Les entrées sont faites à l'aide de claviers à 16 touches prenant les valeurs 0x0 à 0xF. Les touches 2,4,6 et 8 sont usuellement utilisées comme flèches directionnelles. CHIP-8 fournit des fonctions permettant de détecter qu'une touche a été pressée ou non, ou d'attendre qu'une touche soit pressée.
CHIP-8 supporte une résolution d'affichage de 64x32 pixels monochromes. L'affichage des graphiques se fait uniquement par sprite de 8 pixels de large pour 1 à 16 de haut. L'affichage des sprites se fait uniquement en mode XOR, et si un pixel est désactivé lors de l'affichage d'un sprite, l'indicateur de retenue est fixé à 1, ce qui permet la détection de collision.
CHIP-8 comporte originellement 35 codes opération (CHIP-48 ayant ajouté dix instructions supplémentaires). Les instructions ont une longueur de deux octets. Les bits de poids fort des adresses sont stockés en premier.