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 ? Ce chapitre nous permettra de répondre à ces différentes interrogations.
Définition de l’émulation
Avant de commencer notre passionnante aventure, nous allons définir les différentes notions que nous utiliserons afin de mieux cerner nos objectifs.
Émulation
Définition
Voyons la définition de Wikipédia.
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 ses caractéristiques.
Difficultés
Nous verrons 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. Les constructeurs n’ont en effet 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.
Comment fonctionne un émulateur
Un émulateur fonctionne avec une facilité qui pourrait même faire pleurer.
Tant que la machine fonctionne
Regarder ce qu il faut faire
Le faire
Fin Tant que
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.
Mais où va-t-on regarder ce qu’on doit faire ? Et comment va-t-on le faire ?
Pas d’inquiétudes, nous verrons cela bien assez tôt.
Les ROM
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 des roms. Les roms sont donc aux émulateurs ce que les cartouches de jeu — CD, DVD, etc. — sont aux consoles de jeu.
Utilité
Nous avons dit plus haut que la première étape pour créer un émulateur était de regarder ce qu’il fallait faire. C’est là que les roms 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 ».
Ainsi, programmer un émulateur consiste essentiellement à lire le contenu d’un fichier binaire, ce que n’importe quel langage de programmation permet de faire. Ce n’est pas le diable. Répétons-le, programmer un émulateur n’a rien d’extraordinaire.
Les consoles de jeu
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.
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 |
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 et plusieurs questions peuvent nous venir à l’esprit.
Comment doit-on s’y prendre pour remplacer les composants de la console ? Et tant qu’on y est, a-t-on le droit de le faire ?
Les informations sur les consoles de jeu
Maintenant que nous savons à peu près comment programmer notre émulateur, un bon réflexe est d’utiliser un moteur de recherche pour se renseigner sur la machine à émuler ! Pour émuler 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 nous possédons toutes les informations qu’il nous faut, il ne restera plus qu’à traduire ces informations dans un langage de programmation. C’est possible de le faire sans même comprendre ces informations ! Mais la compréhension sera un atout majeur en particulier lorsque nous ferons du débogage.
Par où commencer
C’est beau de dire « chercher », mais que faut-il chercher ? Si nous nous rendons sur un moteur de recherche et que nous tapons « caractéristiques de la Gameboy », les informations que nous obtiendrons seront loin d’être suffisantes pour programmer notre émulateur. Si nous sommes malchanceux, nous verrons des liens vers des sites pour configurer des émulateurs déjà existants.
Savoir ce que nous voulons
Pour obtenir des résultats qui correspondent à nos attentes, il nous faut connaître un peu le jargon de l’émulation. Sans ça, il serait compliqué de trouver des ressources qui nous aident un minimum, puisque ce jargon nous permettra de savoir quoi chercher sur les moteurs de recherche pour obtenir des résultats pertinents.
Prendre le maximum possible
Lorsque nous faisons nos recherches, il nous faut prendre le maximum d’informations possibles : soyons « boulimiques ». Cela nous 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
Nous avons dit précédemment qu’il fallait regarder à chaque fois quelle action effectuer et pour cela lire le contenu de la rom.
Comment se passe réellement cette lecture ?
Lorsque le fichier binaire est à notre disposition, on le lit en entier et on le stocke dans un tableau. Notons 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 Kio, mais les informations seront lues à coups de 1 Kio. Chaque Kio représentera notre opcode.
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. La Chip 8 par exemple a 35 opcodes. Elle 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 vous allez en baver avant d’élaborer votre é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.
CPU
Comme son nom l’indique, le CPU gère le fonctionnement de notre 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, on peut avoir PC cadencé à 2.0 GHz, soit cycles d’horloge par seconde.
Pour avoir des informations sur la vitesse d’interprétation des opcodes, il faut regarder le CPU. Si certains émulateurs vont trop vite ou trop lentement, c’est sûrement que le CPU est mal implémenté (à moins que le PC sur lequel il est testé ne date du dixième siècle).
Il faudra toujours axer ses recherches autour de ces mots. Les résultats sont généralement plus fructueux avec le mot-clé « opcode », mais « CPU » donne aussi des informations très complètes.
Preuves à l’appui, recherchons ces différents mots-clés :
- « Gameboy caractéristiques » ;
- puis « Gameboy opcode » ;
- et enfin « Gameboy CPU ».
C’est normal de trouver des documents avec des choses peu courantes, pour le moment, ils peuvent paraître incompréhensibles, mais nous serons en mesure de tout déchiffrer à la fin du tutoriel.
Les obstacles liés aux nouvelles consoles
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. 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, nous trouverons notre bonheur sur le Net étant donné que d’autres auront déjà fait les investigations à notre place. Cependant, nous pourrons 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. Nous pouvons obtenir des résultats, mais il n’y aura sûrement pas assez d’informations pour créer un émulateur. Des séances de tâtonnement ne seront pas à exclure, ce qui rendra le travail particulièrement difficile. À moins de faire le reverse engineering soi-même.
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 notre émulateur ne tourne pas à deux à l’heure, il faudra une machine très, très puissante.
En plus de cela, l’organisation de ces consoles est tellement complexe qu’il est très difficile de tout implémenter en solo. Avec tout ce qu’il existe comme consoles à émuler, une vie entière ne suffirait pas ! Un petit coup d’œil ici permet de s’en rendre compte.
Voilà, nous savons maintenant ce qu’il faudra rechercher comme documentation autour des consoles de jeu pour les émuler toutes une par une.
À votre moteur de recherche ; prêts ? Partez !
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 le droit 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 ?
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 roms qui sont le plus souvent difficiles d’accès et non libres d’utilisation (sinon : illégalité).
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 chante.
Il existe des jeux avec des mentions « Non utilisable en dehors du support d’origine ». Nous ne pouvons donc pas les copier.
Pour de plus amples explications, vous pouvez consulter :
- Wikipédia (émulation) ;
- Wikipédia (propriété intellectuelle) ;
- et pour les plus téméraires, Légifrance.
Nous déclinons toute responsabilité sur des agissements qui pourraient survenir à la suite de la lecture de ce tutoriel et ne pourrons être tenu responsable sur aucun plan et ce en aucun cas.
Il nous faut accorder une grande importance à la législation pour éviter des ennuis inutiles.
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é, il ne reste plus qu’à passer à l’action.