Je me mets doucement à la création d'émulateurs, et plutôt que de commencer par le Chip 8, j'ai réalisé un interpréteur de la machine virtuelle BrainF*uck (littéralement mast*rbation intellectuelle).
Pour ceux qui ne connaissent pas, c'est une machine virtuelle qui reçoit 8 instructions seulement mais peut théoriquement réaliser n'importe quel programme.
Les specs sont sur le http://fr.wikipedia.org/wiki/Brainfuck
On y trouve aussi des exemples de programmes.
Capture du soft :

Et voilà le Code source (compilé sous PB 4.51) :
Code : Tout sélectionner
; Pure Brain Fuck - Hackotedelaplaque 27/08/2012
Structure loop
startloop.l
endloop.l
EndStructure
Global NewList Loop.loop()
Global Dim TableauOctets.a(30000) ; tableau de 30000 octets type non signé
Global pointeur.u=0 ; pointeur de type unicode : non signé jusqu'à 65535
Global entree.a, sortie.a ; Input/output bus (char Ascii)
Global PC.l=0 ; Program Counter
Global programme.s
Global Dim source.s(0)
Procedure Interpreter()
ClearList(Loop())
pointeur=0
Dim TableauOctets(30000)
longueur=Len(programme)
Dim source(longueur)
For n=0 To longueur-1 ; stockage lettre par lettre dans Source()
source(n)=Mid(programme,n+1,1)
Next
;- resencement des boucles
For n=0 To longueur-1
If source(n)="["
AddElement(Loop())
Loop()\startloop=n
EndIf
If source(n)="]"
For a=ListSize(Loop())-1 To 0 Step -1
SelectElement(Loop(),a)
If Loop()\endloop=0
Loop()\endloop=n
EndIf
Next
EndIf
Next
For PC=0 To longueur-1
;- début de l'interprétation
Select source(PC)
Case ">" : pointeur=pointeur+1 ; incrémente (augmente de 1) le pointeur.
Case "<" : pointeur=pointeur-1 ; décrémente (diminue de 1) le pointeur.
Case "+" : TableauOctets(pointeur)=TableauOctets(pointeur)+1 ; incrémente l'octet du tableau sur lequel est positionné le pointeur (l'octet pointé).
Case "-" : TableauOctets(pointeur)=TableauOctets(pointeur)-1 ; décrémente l'octet pointé.
Case "." ; sortie de l'octet pointé (valeur ASCII).
sortie=TableauOctets(pointeur)
Print(Chr(sortie))
Case "," ; entrée d'un octet dans le tableau à l'endroit où est positionné le pointeur (valeur ASCII).
PrintN("")
entree=Asc(Input())
TableauOctets(pointeur)=entree
Case "[" ;saute à l'instruction après le ] correspondant si l'octet pointé est à 0.
If TableauOctets(pointeur)=0
ForEach Loop()
If Loop()\startloop=PC
PC=Loop()\endloop
Break
EndIf
Next
EndIf
Case "]" : ;retourne à l'instruction après le [ si l'octet pointé est différent de 0.
If TableauOctets(pointeur)<>0
ForEach Loop()
If Loop()\endloop=PC
PC=Loop()\startloop
Break
EndIf
Next
EndIf
EndSelect
Next
EndProcedure
If OpenConsole()
ConsoleColor(7,0)
ConsoleTitle("Interpreteur Brainf*uck - Hackotedelaplaque")
PrintN(" *************************************************")
PrintN(" * *")
PrintN(" * Interpreteur Brainf*uck *")
PrintN(" * Hackotedelaplaque - Aout 2012 *")
PrintN(" * *")
PrintN(" *************************************************")
PrintN("")
ConsoleColor(15,0)
PrintN("Brainf*ck est un langage de programmation simple.")
PrintN("Ce langage se satisfait en effet de seulement huit instructions.")
PrintN("Le brainf*ck est pourtant un langage Turing-complet.")
PrintN("C'est a dire qu'il est possible d'ecrire n'importe quel programme en brainf*ck.")
PrintN("")
PrintN("Les 8 instructions du langage, d'un seul caractere chacune, sont les suivantes : > < + - . , [ ]")
PrintN("")
PrintN("Essayez par exemple le programme suivant : ++++++++++[>+++++++>++++++++++>+++>+<<<<-]>++.>+.+++++++..+++.>++.<<+++++++++++++++.>.+++.------.--------.>+.>.")
;- Boucle principale
Boucle:
ConsoleColor(14,0)
PrintN("")
PrintN("---------------------------------------------")
PrintN("Entrez le code source brainf*uck a executer :")
PrintN("---------------------------------------------")
programme=Input()
ConsoleColor(15,0)
PrintN("")
Interpreter()
PrintN("")
Goto Boucle
EndIf
End