cvsuser     03/11/09 02:15:34

  Modified:    languages/bf bf.pasm bfc.imc
  Log:
  make data cells 8bit; fix read op; speed up compiler
  
  Revision  Changes    Path
  1.4       +23 -4     parrot/languages/bf/bf.pasm
  
  Index: bf.pasm
  ===================================================================
  RCS file: /cvs/public/parrot/languages/bf/bf.pasm,v
  retrieving revision 1.3
  retrieving revision 1.4
  diff -u -w -r1.3 -r1.4
  --- bf.pasm   30 Aug 2003 10:01:14 -0000      1.3
  +++ bf.pasm   9 Nov 2003 10:15:34 -0000       1.4
  @@ -1,4 +1,4 @@
  -# $Id: bf.pasm,v 1.3 2003/08/30 10:01:14 leo Exp $
  +# $Id: bf.pasm,v 1.4 2003/11/09 10:15:34 leo Exp $
   # A Brainfuck interpreter
   # By Leon Brocard <[EMAIL PROTECTED]>
   #
  @@ -8,6 +8,7 @@
     # Get the brainfuck source file into S0
     set S0, P5[1]
     if S0, SOURCE
  +usage:
     set S0, P5[0]
     print "usage: ./parrot "
     print S0
  @@ -16,7 +17,14 @@
   
     # Read the file into S1
   SOURCE:
  +  null I3
  +  ne S0, "-O", no_o
  +  set I3, 1          # optimize switch
  +  set S0, P5[2]
  +no_o:
     open P1, S0, "<"
  +  defined I0, P1
  +  unless I0, usage
   SOURCE_LOOP:
     readline S2, P1
     concat S1, S2
  @@ -30,6 +38,7 @@
     set I0, 0          # Our PC
     new P0, .PerlArray # Our memory
     set I1, 0          # Our pointer
  +  getstdin P30
   
     # The main interpreter loop
   INTERP:
  @@ -37,6 +46,7 @@
     ne S0, "+", NOTPLUS
     set I2, P0[I1]
     inc I2
  +  band I2, 0xff
     set P0[I1], I2
     branch NEXT
   
  @@ -44,6 +54,7 @@
     ne S0, "-", NOTMINUS
     set I2, P0[I1]
     dec I2
  +  band I2, 0xff
     set P0[I1], I2
     branch NEXT
   
  @@ -78,6 +89,10 @@
   
   NOTOPEN:
     ne S0, "]", NOTCLOSE
  +  unless I3, no_opt
  +  set I2, P0[I1]
  +  unless I2, NEXT
  +no_opt:
     set I2, 0 # "height"
   
   CLOSE_LOOP:
  @@ -101,15 +116,19 @@
   
   NOTDOT:
     ne S0, ",", NEXT
  -  getstdin P30
  -  readline S31, P30
  +  read S31, P30, 1
  +  if S31, no_eof
  +  null I2    # some return -1, some don't change data
  +  branch eof
  +no_eof:
     ord I2, S31
  +eof:
     set P0[I1], I2
     branch NEXT
   
   NEXT:
     inc I0
  -  le I0, I30, INTERP
  +  lt I0, I30, INTERP
     end
   
   
  
  
  
  1.5       +50 -34    parrot/languages/bf/bfc.imc
  
  Index: bfc.imc
  ===================================================================
  RCS file: /cvs/public/parrot/languages/bf/bfc.imc,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -w -r1.4 -r1.5
  --- bfc.imc   30 Aug 2003 10:01:14 -0000      1.4
  +++ bfc.imc   9 Nov 2003 10:15:34 -0000       1.5
  @@ -1,4 +1,4 @@
  -# $Id: bfc.imc,v 1.4 2003/08/30 10:01:14 leo Exp $
  +# $Id: bfc.imc,v 1.5 2003/11/09 10:15:34 leo Exp $
   # A Brainfuck compiler
   # By Leon Brocard <[EMAIL PROTECTED]>
   #
  @@ -47,43 +47,46 @@
   
     # Initialise
     code =      "set I0, 0          # pc\n"
  -  code = code . "new P0, .PerlArray # memory\n"
  -  code = code . "set I1, 0          # pointer\n"
  +  concat code,  "new P0, .PerlArray # memory\n"
  +  concat code,  "set I1, 0          # pointer\n"
  +  concat code,  "getstdin P30\n"
   
     pc    = 0    # pc
     label = 0    # label count
   
  -  # The main interpreter loop
  +  # The main compiler loop
   INTERP:
  -  char = file[pc]
  -  code = code . "\nSTEP"
  +  substr_r char, file, pc, 1
  +  concat code,  "\nSTEP"
     labelstr = pc
  -  code = code . labelstr
  -  code = code . ": # "
  -  code = code . char
  -  code = code . "\n"
  +  concat code,  labelstr
  +  concat code,  ": # "
  +  concat code,  char
  +  concat code,  "\n"
   
     if char != "+" goto NOTPLUS
  -  code = code . "set I2, P0[I1]\n"
  -  code = code . "inc I2\n"
  -  code = code . "set P0[I1], I2\n"
  +  concat code,  "set I2, P0[I1]\n"
  +  concat code,  "inc I2\n"
  +  concat code,  "band I2, 0xff\n"
  +  concat code,  "set P0[I1], I2\n"
     goto NEXT
   
   NOTPLUS:
     if char != "-" goto NOTMINUS
  -  code = code . "set I2, P0[I1]\n"
  -  code = code . "dec I2\n"
  -  code = code . "set P0[I1], I2\n"
  +  concat code,  "set I2, P0[I1]\n"
  +  concat code,  "dec I2\n"
  +  concat code,  "band I2, 0xff\n"
  +  concat code,  "set P0[I1], I2\n"
     goto NEXT
   
   NOTMINUS:
     if char != ">" goto NOTGT
  -  code = code . "inc I1\n"
  +  concat code,  "inc I1\n"
     goto NEXT
   
   NOTGT:
     if char != "<" goto NOTLT
  -  code = code . "dec I1\n"
  +  concat code,  "dec I1\n"
     goto NEXT
   
   NOTLT:
  @@ -106,10 +109,10 @@
   OPEN_NEXT:
     inc label
     labelstr = label
  -  code = code . "set I2, P0[I1]\n"
  -  code = code . "unless I2, STEP"
  -  code = code . labelstr
  -  code = code . "\n"
  +  concat code,  "set I2, P0[I1]\n"
  +  concat code,  "unless I2, STEP"
  +  concat code,  labelstr
  +  concat code,  "\n"
   
     goto NEXT
   
  @@ -133,32 +136,45 @@
   
   CLOSE_NEXT:
     labelstr = label
  -  code = code . "branch STEP"
  -  code = code . labelstr
  -  code = code . "\n"
  +  concat code,  "branch STEP"
  +  concat code,  labelstr
  +  concat code,  "\n"
   
     goto NEXT
   
   NOTCLOSE:
     if char != "." goto NOTDOT
  -  code = code . "set I2, P0[I1]\n"
  -  code = code . "chr S31, I2\n"
  -  code = code . "print S31\n"
  +  concat code,  "set I2, P0[I1]\n"
  +  concat code,  "chr S31, I2\n"
  +  concat code,  "print S31\n"
     goto NEXT
   
   NOTDOT:
     if char != "," goto NEXT
  -  code = code . "getstdin P30\n"
  -  code = code . "readline S31, P30\n"
  -  code = code . "ord I2, S31\n"
  -  code = code . "set P0[I1], I2\n"
  +  labelstr = pc
  +  concat code,  "read S31, P30, 1\n"
  +  concat code,  "if S31, no_eof"
  +  concat code,  labelstr
  +  concat code,  "\n"
  +  concat code,  "null I2\n"
  +  concat code,  "branch eof"
  +  concat code,  labelstr
  +  concat code,  "\n"
  +  concat code,  "no_eof"
  +  concat code,  labelstr
  +  concat code,  ":\n"
  +  concat code,  "ord I2, S31\n"
  +  concat code,  "eof"
  +  concat code,  labelstr
  +  concat code,  ":\n"
  +  concat code,  "set P0[I1], I2\n"
     goto NEXT
   
   NEXT:
     inc pc
   
     if pc < maxpc goto INTERP
  -  code = code . "end\n"
  +  concat code,  "end\n"
   
   #  print code
   #  print "\n"
  @@ -166,6 +182,6 @@
     # Now actually run it
     compreg P1, "PASM"
     compile P0, P1, code
  -  invoke
  + # invoke
     end
   .end
  
  
  

Reply via email to