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