Programmer un émulateur

Chapitre 1 : Un tour d'horizon

BestCoder

Nous allons commencer notre aventure avec un voyage dans les coulisses de l'émulation. Comment est-il possible de créer un émulateur ? Comment faut-il s'y prendre pour espérer en créer un ? Cette partie nous permettra de répondre à ces différentes interrogations.

Commentez

- Titre : Programmer un émulateur

- Auteur : BestCoder

- Parution : 6 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. Définition de l'émulation

- III-A. Émulation

- III-A-1. Définition

- III-A-2. Difficultés

- III-A-3. Comment fonctionne un émulateur ?

- III-B. Les ROM

- III-B-1. Définition

- III-B-2. Utilité

- III-C. Les consoles de jeu

- III-C-1. Définition

- III-C-2. Caractéristiques

- IV. Les informations sur les consoles de jeux

- IV-A. Par où commencer ?

- IV-A-1. Savoir ce que vous voulez

- IV-A-2. Prendre le maximum possible

- Ce qu'il faut rechercher

- IV-B-1. Opcode : Operation Code

- IV-B-2. CPU : Central Processing Unit

- IV-C. Les obstacles liés aux nouvelles consoles

- IV-C-1. Le manque d'informations

- IV-C-2. Des consoles de plus en plus performantes

- V. Législation

- V-A. Les obstacles

- V-B. Une lueur d'espoir

- Navigation

Navigation

Sommaire

Tutoriel suivant : quelle console émuler ?

II - Introduction

Nous allons commencer notre aventure avec un voyage dans les coulisses de l'émulation. Comment est-il possible de créer un émulateur ? Comment faut-il s'y prendre pour espérer en créer un ? Cette partie nous permettra de répondre à ces différentes interrogations.

III - Définition de l'émulation

Je parie que vous avez, plusieurs fois, fait des recherches pour savoir comment programmer un émulateur et que vous vous êtes retrouvés sur des sites vous montrant comment en configurer un, déjà existant.
Votre calvaire vient de prendre fin. Grâce à ce tutoriel, vous serez en mesure de programmer le vôtre de A à Z.
Avant de commencer notre passionnante aventure, nous allons définir les différentes notions que nous utiliserons afin de mieux cerner nos objectifs.

III-A - Émulation

III-A-1 - Définition

D'après Wikipédia, en informatique, l'émulation consiste à substituer un élément de matériel informatique − tels un terminal informatique, un ordinateur ou une console de jeu − par un logiciel.
La définition du terme émuler est « chercher à imiter ». Il faut voir dans l'émulation une imitation du comportement physique d'un matériel par un logiciel, et ne pas la confondre avec la simulation.

Théoriquement, il est donc possible de créer un émulateur pour toutes les machines électroniques. Pour ce faire, il suffit juste de :

- connaître ses caractéristiques ;

- trouver un support au moins aussi puissant que la machine à émuler ;

- traduire les caractéristiques.

III-A-2 - Difficultés

Vous verrez tout au long de ce tutoriel que programmer un émulateur n'a rien d'extraordinaire. Le plus difficile est de connaître le fonctionnement exact de la machine que l'on désire émuler.
Eh oui, les constructeurs n'ont aucun intérêt à publier les caractéristiques de leurs consoles et ce n'est pas aujourd'hui qu'ils le feront .
Pour trouver les informations qu'il leur faut, les programmeurs doivent donc avoir recours à diverses méthodes que l'on abordera dans le prochain chapitre.

III-A-3 - Comment fonctionne un émulateur ?

Un émulateur fonctionne avec une facilité qui pourrait même faire pleurer.
Voyez par vous-mêmes :

while("Machine Fonctionne")
{
regarder_ce_qu_il_faut_faire();
Le_faire();
}

Tous les émulateurs ont la même structure de base. Le principe consiste tout simplement à regarder l'opération qu'il faut effectuer, puis l'effectuer. Cette routine sera exécutée tant que la machine − la console de jeu − est en marche.

III-B - Les ROM

III-B-1 - Définition

Littéralement, ROM signifie « Read Only Memory », ou en français « mémoire à lecture seule ». C'est un support qui ne permet que la lecture des données qu'il contient. C'est le cas pour presque tous les supports de jeux vidéo.
Il existe divers moyens de copier le contenu de ces supports sur votre ordinateur. Pour ce faire, on utilise des ROM Dumper. Les fichiers binaires ainsi obtenus sont communément appelés : ROM.
Les ROM sont donc aux émulateurs ce que les cartouches de jeu − CD, DVD, etc. − sont aux consoles de jeu.

III-B-2 - Utilité

Je vous ai dit plus haut que la première étape pour créer un émulateur est de regarder ce qu'il faut faire. C'est là que les ROM interviennent. Elles contiennent toutes les instructions à exécuter. C'est-à-dire que par « regarder ce qu'il faut faire », il faut comprendre « lire le contenu du fichier ROM »

III-C - Les consoles de jeu

III-C-1 - Définition

Une console de jeu est un appareil électronique conçu pour permettre de lire, interpréter et afficher les informations contenues dans un support conçu à cet effet (les cartouches, CD ou DVD de jeu).
Il existe deux principaux types de consoles :

- les consoles de salon, qui se branchent sur un écran pour afficher le jeu, et auxquelles on connecte accessoirement des manettes ;

- les consoles portables, de petite taille, qui possèdent leur propre écran et sont de ce fait autonomes et facilement transportables.

Nos éventuelles victimes !

III-C-2 - Caractéristiques

La définition importe peu (je sais que vous le saviez déjà), mais je veux attirer votre attention sur les caractéristiques des consoles.
Toutes les consoles de jeu sont basées sur le même principe. Elles sont constituées :

- d'un microprocesseur qui effectue les calculs ;

- de mémoire vive pour stocker les données ;

- d'une carte graphique pour afficher le rendu graphique ;

- de périphériques de contrôle et le plus souvent de manettes de jeu pour interagir avec la console.

Notre travail sera donc de remplacer tous ces éléments par ceux de notre ordinateur.

microprocesseur

processeur

mémoire vive

RAM

carte graphique

carte graphique

périphériques de contrôle

clavier, souris, joystick

Ça y est, nous venons de faire le tour de l'émulation console. Vous êtes donc en mesure de programmer votre émulateur.

Avec cette petite présentation, nous venons de voir en gros le travail que nous aurons à faire pour réaliser notre émulateur.
Cette définition assez simpliste nous permet de mieux cerner la notion d'émulation.

IV - Les informations sur les consoles de jeux

Maintenant que nous savons à peu près comment programmer notre émulateur, certains se sont rués sur leur moteur de recherche. Bon réflexe ! Pour simuler une machine, il faut connaître ses caractéristiques au maximum pour espérer des résultats satisfaisants. Ici, « connaître » veut juste dire qu'il faut avoir sous la main des documents qui décrivent exhaustivement la machine à émuler. Si vous possédez toutes les informations qu'il vous faut, il ne restera plus qu'à traduire ces informations dans un langage de programmation, sans même les comprendre si cela vous arrange.
Mais la compréhension sera un atout majeur si vous ne voulez pas passer des journées à chercher un bogue.

IV-A - Par où commencer ?

C'est beau de dire « chercher », mais que faut-il chercher ? Si vous vous rendez sur un moteur de recherche et que vous tapez « caractéristiques de la Gameboy », vous obtiendrez des informations loin d'être suffisantes pour programmer votre émulateur.
Si vous êtes malchanceux, vous verrez des liens vers des sites pour configurer des émulateurs déjà existants.

IV-A-1 - Savoir ce que vous voulez

C'est bizarre de savoir ce qu'on est censé chercher, mais c'est la vie. Imaginez-vous dans un supermarché et que vous ne savez pas ce que vous souhaitez acheter. C'est la même chose que de lancer son moteur de recherche sans savoir ce que vous cherchez.

Donc pour obtenir des résultats qui correspondent à vos attentes, il faut connaître un tout petit peu le jargon de l'émulation.

IV-A-2 - Prendre le maximum possible

Si vous faites vos recherches, prenez le maximum d'informations possible : soyez « boulimiques ». Cela vous permettra de faire des comparaisons et de voir celles qui sont le plus utilisées. En outre, la plupart des documentations ne sont pas claires sur tous les points. Elles seront donc complémentaires, ce qui facilitera grandement l'implémentation de notre émulateur.

Jetons maintenant un coup d'œil sur quelques mots clefs pour trouver notre bonheur :

- opcode ;

- CPU.

Ce qu'il faut rechercher

Dans la section précédente, j'avais dit :

C'est-à-dire que par « regarder ce qu'il faut faire », il faut comprendre « lire le contenu du fichier ROM ».

Lorsque le fichier binaire est à notre disposition, on le lit en entier et on le stocke dans un tableau. Je précise quand même que cela ne se passera pas comme cela pour un DVD : on n'interprétera pas le contenu d'un seul coup mais bout par bout, étape par étape. Ces « bouts » sont appelés opcodes.
Par exemple, nous pouvons avoir un fichier de 1 000 ko, mais les informations seront lues par morceau de 1 ko. Chaque ko représentera notre opcode.

IV-B-1 - Opcode : Operation Code

L'opcode définit en quelque sorte toute action que peut effectuer une console du point de vue calcul et rendu graphique.
Si vous regardez par exemple les opcodes de la Chip 8, vous en verrez 35. La Chip 8 ne peut donc effectuer que 35 opérations, et c'est tout. Ce sera au programmeur de voir comment faire son jeu avec 35 opérations. Il va de soi qu'une console récente aura des centaines d'opcodes ! Eh oui, plus c'est récent, plus cela sera difficile d'élaborer un émulateur.

Selon la console qu'on émule, les opcodes ne sont pas de la même taille (en bits), mais le principe d'interprétation reste le même.

IV-B-2 - CPU : Central Processing Unit

Comme son nom l'indique, le CPU gère le fonctionnement de votre console de jeu. Il effectue les différentes opérations définies par les opcodes.
Cette exécution se fait toujours à une vitesse donnée : on parle de cadencement de la console. C'est une valeur qui est donnée en hertz (Hz). Par exemple, mon PC est cadencé à 2.0 GHz, soit cycles d'horloge par seconde.

Si vous désirez des informations portant sur la vitesse d'interprétation des opcodes, jetez un coup d'œil sur le CPU.
Si vous avez déjà testé des émulateurs et qu'ils vont trop vite ou trop lentement, le problème vient du fait que le CPU est mal implémenté (à moins que votre PC ne soit du dixième siècle).

Il faudra toujours axer ses recherches autour de ces mots. J'utilise en priorité « opcode » parce que les résultats sont le plus souvent très fructueux. Mais « CPU » donne aussi des informations très complètes.

Preuves à l'appui, recherchez :

- « Gameboy caractéristiques » ;

- puis « Gameboy opcode » ;

- et enfin « Gameboy CPU ».

Vous verrez par vous-mêmes qu'il n'y a aucune comparaison à faire. Si vous trouvez des documents avec des choses peu courantes, n'ayez pas peur, vous serez en mesure de tout déchiffrer à la fin de ce tutoriel.

IV-C - Les obstacles liés aux nouvelles consoles

IV-C-1 - Le manque d'informations

Un gros obstacle à la programmation d'émulateurs reste le manque d'informations concernant la machine à émuler. En effet, pour bien développer son programme, il faut réunir un maximum d'informations avant de débuter. Pour ce faire, il existe des moyens comme la rétro-ingénierie (reverse engineering) que l'on ne va pas aborder ici. Je ne la maîtrise d'ailleurs pas. En gros, la rétro-ingénierie permet de retrouver les caractéristiques d'une machine en effectuant divers tests sur celle-ci.
Pour les machines anciennes, vous trouverez votre bonheur sur le Net, étant donné que d'autres auront déjà fait les investigations à votre place. Cependant, vous pourrez trouver des caractéristiques différentes pour une même machine, chaque auteur pouvant avoir une compréhension différente de son fonctionnement. Malgré ces divergences, les principales caractéristiques restent le plus souvent les mêmes dans la plupart des documentations disponibles.

Maintenant, pour les machines récentes, le problème est tout autre. Vous pourrez obtenir des résultats, mais il n'y aura sûrement pas assez d'informations pour créer votre émulateur. Des séances de tâtonnement ne seront pas à exclure, ce qui rendra le travail particulièrement difficile. À moins que vous ne fassiez le reverse engineering vous-mêmes.

IV-C-2 - Des consoles de plus en plus performantes

Mis à part la récupération des informations essentielles, il existe un plus gros obstacle devant vous : l'évolution des consoles.
Faisons une petite comparaison :

Caractéristique

Game Boy

PSP

Cadence

2,2 Mhz

333 Mhz

Résolution

160 × 144 pixels

480 × 272 pixels

Couleur

14 nuances de gris

16,77 millions de couleurs

Ces chiffres parlent d'eux-mêmes : les nouvelles consoles sont de plus en plus puissantes. Donc, pour que votre émulateur ne tourne pas à deux à l'heure, il faudra une machine très, très puissante. Je doute même que l'émulation puisse suivre l'évolution fulgurante des consoles de jeu (avis personnel) : la XBOX 360 et la PS3 sont déjà cadencées à 3,2 GHz (plus que mon ordinateur à 2 GHz).

En plus de cela, l'organisation de ces consoles est tellement complexe qu'il est très difficile de tout implémenter en solo. Mais avec tout ce qu'il existe comme consoles à émuler, je vous assure qu'une vie entière ne suffirait pas. Jetez un coup d'œil ici pour en avoir le cœur net.

Voilà, nous savons maintenant ce qu'il faudra rechercher comme documentation autour des consoles de jeu pour les émuler toutes, une par une.

V - Législation

Est-ce que vous avez déjà vu un domaine dans lequel les juristes ne sont pas impliqués ? Bien qu'il n'existe pas encore, à ma connaissance, de lois spécifiques à l'émulation, il en existe qui défendent les droits d'auteur et la propriété intellectuelle.
Les consoles de jeu sont toutes sous licences propriétaires et sources de revenus. Le marché est très lucratif et ne cesse de s'étendre. Dès lors, créer un outil gratuit pour les substituer peut susciter des débats.

A-t-on réellement le droit de créer un émulateur console ?

V-A - Les obstacles

L'un des plus gros problèmes pour l'émulation est sans doute le respect du droit d'auteur (copyright). En plus de ne divulguer aucune information sur les caractéristiques techniques de leurs consoles, les constructeurs les protègent jalousement. Ainsi, avec les licences utilisées, il est formellement interdit de prendre ou d'utiliser une partie ou la totalité de leur travail.
D'ailleurs, les discussions sur la légalité de l'émulation font couler beaucoup d'encre.

Nous pouvons cependant retenir que la programmation d'un émulateur est totalement légale tant qu'on ne fait pas usage de ressources sous droits d'auteur (le BIOS, par exemple).

Ce genre de symboles vous est sûrement familier, ils sont présents sur presque tous les jeux vidéo pour signifier qu'ils sont sous droits d'auteur.

Tout au long de ce tutoriel, nous ferons du HLE (High Level Emulation), c'est-à-dire que nous programmerons tout ce dont nous aurons besoin.

En résumé, votre émulateur restera légal tant que vous le développez avec vos propres ressources et que vous le redistribuez sans aucun jeu sous droits d'auteur.

Cependant, l'utilisation d'un émulateur nécessite des jeux ou ROM qui sont le plus souvent difficiles d'accès et non libres d'utilisation. (Sinon : illégalité. )

V-B - Une lueur d'espoir

Après ce que l'on vient de voir, il est légitime de se poser cette question. Mais il existe toujours des exceptions à toute règle.
Certains jeux (notamment ceux que nous allons utiliser) sont dans le domaine public et sont dès lors libres d'utilisation et de redistribution.
En plus de cela, vous êtes autorisés à posséder une ROM à condition d'être en possession du jeu original, cette ROM étant considérée comme une sauvegarde.

À défaut de tout cela, vous pourrez utiliser un homebrew. Un homebrew est un jeu de console créé par un amateur et ces jeux sont le plus souvent libres. Pour éviter de faire un cours de droit ici, je vous laisse creuser si cela vous intéresse.
Pour de plus amples explications ou preuves, vous pouvez consulter :

- Wikipédia: Émulation  ;

- Wikipédia: Propriété intellectuelle  ;

- et pour les plus téméraires, Legifrance.

Il existe des jeux avec des mentions « Non utilisable en dehors du support d'origine », donc attention !

Une dernière chose, je vous laisse le fameux :

Je, BestCoder, décline toute responsabilité sur des agissements qui pourraient survenir à la suite de la lecture de ce tutoriel.
BestCoder ne pourrait être tenu responsable sur aucun plan et ce en aucun cas.

Je vous invite à accorder une grande importance à la législation pour éviter des ennuis inutiles.
Après ce long discours, j'espère que vous avez bien cerné le sujet et que votre curiosité a été bien assouvie. À présent, nous allons voir ce qu'il nous faut comme bagage pour nous lancer dans notre périlleuse aventure.

Nous voilà fin prêts et avertis pour nous lancer dans notre aventure. Puisque nous savons à la fois ce que nous voulons et comment l'obtenir, la moitié du travail est déjà effectuée, il ne reste plus qu'à passer à l'action.

Je signale qu'il faut une certaine maîtrise de l'hexadécimal, du binaire et des opérations logiques pour suivre ce tutoriel sans trop de difficultés.

Navigation

Sommaire

Tutoriel suivant : quelle console émuler ?