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