À la fin de cet exposé, vous trouverez une traduction en Purebasic que j'ai fait moi-même d'un émulateur qui n'est pas de moi.
Cet émulateur fonctionne.
Si vous commencez de zéro alors vous devez vous familiariser avec les notions suivantes : Je vous fais confiance pour y remédier, WikiPedia est là pour ça. (A lire : http://www.jbaumann.info/pdf/microprocesseurs.pdf)Travail préparatoire.
Architecture RISC et CISC, bit, byte ou octet, bus du processeur, bus de donnée, bus de données, bus de commande, port I/O, interruption, microprocesseur, microcontrôleur, co-processeur arithmétique.
Vous devrez approfondir les notions suivantes (non exhaustif) : ALU (unité arithmétique et logique), Registre, opcode (jeu d'instruction), adressage (direct, indirect, indexé), décalage de bit, logique et ou xor non, calcul binaire, calcul hexadécimal, calcul bcd, assembleur. Pointeur de programme PC, pointeur de pile SP, registre indicateur d'état. Stockage MSB, LSB.
Pas besoin d'avoir un niveau ingénieur mais simplement savoir ce que cela signifie. Il est avantageux de savoir calculer en binaire et en hexadécimal.
La puce : Chip8Le choix du processeur à émuler.
Je vous le dis tout de suite, si j'ai choisi Chip8, c'est parce que j'ai étudié un tuto à cette adresse http://www.siteduzero.com/tutoriel-3-55 ... art_555023
Un pdf se trouve icihttp://www.siteduzero.com/tuto_pdf.php?vrsid=555021
Évidemment, vous devrez l'étudier aussi.
Avant de vous jeter dessus, sachez que le tuto d'origine est codé en C avec la librairie SDL ... J'ai traduit le code en PureBasic sans SDL, voir en fin de post. Dans ma traduction, si l'émulation fonctionne, il y a un bug dans l'affichage et le clavier ne fonctionne pas. En guise d'exercice, essayez de faire fonctionner ce code !
Par contre l'auteur propose en téléchargement un deuxième code source de son émulateur en C++/SDL avec toute la panoplie du C++. J'ai aussi traduit ce code en PureBasic et j'en ai profité pour éliminer quelques boggues. De plus, pour le simplifier, exit la programmation orienté objet, dehors la SDL, oust la gestion des Thread, pas une ligne d'assembleur même pas un pointeur que du pure bonheur de PureBasic !
L'auteur (BestCoder) a choisi cette puce parce que son fonctionnement est le plus simple possible. En effet, entrer dans le monde de l'émulation peut être très vite décourageant car il faut gérer de front plusieurs problèmes et tous en même temps : le processeur, la mémoire, l'affichage, le clavier sans parler du son et du joystick quand il existe. Le déboggage devient vite un enfer. Nous commencerons petit et c'est tant mieux.
Chip8 apparaît dans deux consoles de jeu en 1977... Oui, oui en 1977, le COSMAC VIP et le TELMAC 1800 et deux ordinateurs en 1978 le dream6800 et le ETI660. Jetez donc un coup d'œil au site Internet dédié à cette puce: http://www.chip8.comFaisons connaissance avec Chip8.
Chip8 ressemble plus à un microcontrôleur qu'à un microprocesseur, c'est même un interpréteur, peu importe... Cela veut dire que c'est un cas un peu particulier mais tout ce que vous apprendrez avec elle, ne sera pas perdu, bien au contraire, au cas où vous poursuivriez vers l'émulation d'une puce plus récente.
Elle a eu des descendants sous le nom de SuperChip8, MeagaChip8 (http://www.revival-studios.com/?page=21) et une version 16 bits Chip16 (http://www.siteduzero.com/forum-83-6105 ... hip16.html).
Pour info, Chip8 s'est réincarné dans les années 90 sous le nom HP48 que l'on trouve dans les calculatrices graphiques du même nom, avec quelques opcodes de plus.
Les acharnés de l'émulation se formeront en étudiant cet émulateur par eux-mêmes puis le feront évoluer vers l'émulation de SuperChip8, MeagaChip8, Chip16 puis la Nintendo NESS, la gameboy, etc...
La difficulté allant crescendo.
Intéressons-nous à Chip8. Pour cela, il nous faut un maximum d'informations sur cette puce. http://www.Chip8.com et http://devernay.free.fr/hacks/chip8/C8TECH10.HTM nous en donnent déjà beaucoup.
Chip8 : Puce 8 bits
Mémoire adressable : 4 Ko (oui, oui que 4 Ko) de RAM
Registres 8 bits : 16
Registres 16 bits : 1
2 timers compte à rebours de 8bits à 60 Hz pour le système et le son
1 PC (pointeur de programme) 16 bits
1 SP (pointeur de pile) 8bits
1 pile de 16 niveaux de 16 bits
Opcodes : 35 constitués de 2 octets en MSB (ce qui est très peu, comparez avec les opcode du pentium : http://ref.x86asm.net/coder32-abc.html) (http://en.wikipedia.org/wiki/X86_instruction_listings)
Mode d'adressage (direct) unique inclus dans l'opcode
Horloge : vitesse inconnue, probablement 1,7 MHz
Entrée : Clavier de 16 touches
Sortie : Écran monochrome noir et blanc de 64x32 pixels, comment faire plus simple !
Maintenant, vous pouvez suivre le tuto de BestCoder sur http://www.siteduzero.com/tutoriel-3-55 ... nsole.htmlL'Emulation
La traduction du C en PB est beaucoup plus simple que je ne le pensais. Je déteste ce fichu langage C et mes connaissances dans ce langage sont minimales. Alors si j'ai pu y arriver, vous aussi. C'est un excellent exercice d'apprentissage de PB. (PB= PureBasic)
Pour la traduction du C en PB, traduire :
#define en MACRO/EndMacro
#include par rien du tout ou par xincludefile si vous utilisez des .pbi (inutile ici)
Uint8 en .a (octet non signé)
Uint16 en .u (mot non signé)
Typedef par rien du tout
Void par rien du tout (ne pas oublier procedure()/endprocedure)
[] en () dans les tableaux
. en \ dans les structures
for(i=0;i<16;i++) en for i=0 to 15... next i
break; par rien du tout
: par rien du tout
Certains ; en :
D'autres ; les laisser ou les supprimer (ça sera plus clair in situ)
&& en &
|| en |
Accent circonflexe en !
Ne traduisez pas la SDL, utilisez les fonctions PB : InitSprite(), InitKeyboard(), InitMouse(), InitSound(), OpenWindow(), OpenWindowedScreen(), StartDrawing(ScreenOutput()), StopDrawing(), FlipBuffers(),ExamineKeyboard(); KeyboardPushed(#PB_Key_xxxx) et Box().
Pour la gestion des fichiers : ReadFile(), Eof() , ReadByte(), CloseFile()
Timers : ElapsedMilliseconds()
En plus de l'émulateur nous avons besoin d'une ROMPrincipes généraux de l'émulation :
Une ROM est un fichier contenant un jeu par exemple. C'est une suite d'octets représentant des opcodes. A l'origine, la ROM était gravée dans une puce et quelqu'un a dumpé (transferé) le contenu de cette puce dans un fichier.
Dans la fenêtre de l'émulateur :Comment fonctionne un émulateur ?
Ouvrir et mettre en mémoire une ROM
Boucle:
Lire un octet ou un mot et pour chaque octet lu
Traduire l'octet ou le mot en opcode et l'opcode en instruction purebasic
(la compilation traduira les instructions PB en opcode compatible avec le microprocesseur de votre ordinateur)
Exécuter l'opcode
Délai d'attente sinon le jeu sera injouable tellement il sera rapide
(de plus certaine puce on besoin de synchroniser des actions pas chip8)
Gérer le son
Mise à jour de l'écran
Examiner le clavier et agir en conséquence (mettre en pause, etc)
Fin de la boucle quand on appuie sur Echap (par exemple)
Dans ce "squelette", 2 points sont délicats. La traduction des opcodes en PB n'est pas forcément difficile mais trèèès lonnnnnguuuuue à faire. Elle réclame aussi une bonne compréhension du fonctionnement de la puce.
Le deuxième point est la gestion du temps. Ici on a de la chance, c'est l'électronique de Chip8 qui s'occupe de ça. Nous ne nous occuperons que de ralentir l'émulateur. Mais quand il s'agit d'émuler la Wii par exemple, les programmeurs sont obligés d'utiliser la compilation dynamique, c'est-à-dire que l'émulateur lui-même peut recompiler une partie de son propre code en temps réel tout en émulant, afin de choisir la meilleure stratégie de gain de temps.
L'auteur du tuto a fourni une ROM qu'il a créée pour savoir si tous les opcodes de votre émulateur fonctionnent, elle s'appelle "BC_test.ch8".
Si tout va bien, vous devez obtenir ceci :

By mesarc at 2011-12-06
Ensuite, vous pourrez jouer à breakout et à une cinquantaine de jeux dont PONG et INVADERS.

By mesarc at 2011-12-06
Vous trouverez tout dans les rar à ces adresses :
http://www.mediafire.com/?p8hqakcvsn1y8oi
http://www.mediafire.com/?ajbdsdfo0mrs9yr
Pour finir, certaines ROM ne fonctionnent pas bien, cela est dû aux informations incomplètes de Chip8 utilisées ici. Il faudrait plus de renseignement sur cette puce.
Et enfin, j'ai eu la flemme de faire fonctionner le son mais ça reste abordable.
Bon courage.