Emulateur machine virtuelle BF

Programmation d'applications complexes
hackotedelaplaque
Messages : 121
Inscription : mer. 21/janv./2004 22:18

Emulateur machine virtuelle BF

Message par hackotedelaplaque »

Bonjour à tous,

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 :
Image
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


J'espère que ce partage attisera votre curiosité sur cette curiosité geek qu'est ce langage. ^^
10 CLS
20 PRINT "Vive PureBasic"
30 GOTO 20
Avatar de l’utilisateur
Ar-S
Messages : 9539
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Emulateur machine virtuelle BF

Message par Ar-S »

J'avais fait un truc du genre pour solutionner un contest sur NewbieContest (ou hackbbs me souviens plus).
J'avais alors découvers ce langage BF :mrgreen:
Dernière modification par Ar-S le mar. 28/août/2012 12:52, modifié 1 fois.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Avatar de l’utilisateur
flaith
Messages : 1487
Inscription : jeu. 07/avr./2005 1:06
Localisation : Rennes
Contact :

Re: Emulateur machine virtuelle BF

Message par flaith »

Salut,
pas mal et sinon n'hésite pas à faire un tour dans les tutos, tu trouveras quelques exemples d’interpréteurs :wink:
hackotedelaplaque
Messages : 121
Inscription : mer. 21/janv./2004 22:18

Re: Emulateur machine virtuelle BF

Message par hackotedelaplaque »

J'avais étudié tes excellents tutos sur le fetch d'opcodes et le dispatch bien avant de me lancer. :wink:

Ce qui me fait penser qu'il y a longtemps, sur ce forum, quelqu'un avait réalisé un émulateur gb en PB.
Pas moyen de remettre la main sur son code source.
Ça remonte facile à 2008, peut-être même plus vieux encore.
Ça parle à quelqu'un ?
10 CLS
20 PRINT "Vive PureBasic"
30 GOTO 20
Demivec
Messages : 91
Inscription : sam. 18/sept./2010 18:13

Re: Emulateur machine virtuelle BF

Message par Demivec »

Voici est example aussi:
Rosetta Code
hackotedelaplaque
Messages : 121
Inscription : mer. 21/janv./2004 22:18

Re: Emulateur machine virtuelle BF

Message par hackotedelaplaque »

Merci Demivec pour cet autre exemple (la macro bracketsearch() a une approche plus propre que la mienne).
Par contre il ne compile pas tel quel.
Erreur à la ligne 90
Redim memory.b(memsize)
"Redim ne peut pas changer le type du tableau".
En enlevant le type .b ça fonctionne bien sûr.

J'ai retrouvé le lien pour l'émulateur gameboy, par contre les sources ne sont plus sur le blog de l'auteur, dommage.
http://www.forums.purebasic.com/english ... =14&t=2863

Pour info, une excellente série d'articles (en anglais) très bien faits et avec source sur l'ému gameboy.
C'est du javascript/html5 mais rien de dépaysant :
http://imrannazar.com/GameBoy-Emulation ... 58;-Timers
10 CLS
20 PRINT "Vive PureBasic"
30 GOTO 20
Demivec
Messages : 91
Inscription : sam. 18/sept./2010 18:13

Re: Emulateur machine virtuelle BF

Message par Demivec »

hackotedelaplaque a écrit :Erreur à la ligne 90
Redim memory.b(memsize)
"Redim ne peut pas changer le type du tableau".
En enlevant le type .b ça fonctionne bien sûr.
Merci, j'ai mis à jour le code. :)
Répondre