Author: jquelin
Date: Fri Jan 9 01:17:27 2009
New Revision: 35251
Modified:
trunk/languages/befunge/befunge.pir
trunk/languages/befunge/io.pir
Log:
instruction p implemented (put value)
Modified: trunk/languages/befunge/befunge.pir
==============================================================================
--- trunk/languages/befunge/befunge.pir (original)
+++ trunk/languages/befunge/befunge.pir Fri Jan 9 01:17:27 2009
@@ -88,19 +88,19 @@
if char == 'v' goto FLOW_GO_SOUTH
if char == '<' goto FLOW_GO_WEST
+ # flow control
+ # math functions
+ # stack operations
+ if char == ':' goto STACK_DUP
+
+ # i/o operations
+ if char == 'p' goto IO_PUT_VALUE
+
# unknown instruction
goto MOVE_PC
=pod
-
- # Direction changing.
- eq S0, "^", FLOW_GO_NORTH
- eq S0, ">", FLOW_GO_EAST
- eq S0, "v", FLOW_GO_SOUTH
- eq S0, "<", FLOW_GO_WEST
- eq S0, "?", FLOW_GO_AWAY
-
# Flow control.
eq S0, "`", FLOW_COMPARE
eq S0, "_", FLOW_EW_IF
@@ -117,7 +117,7 @@
eq S0, "!", MATHS_NOT
# Stack operations.
- eq S0, ":", STACK_DUP
+ #eq S0, ":", STACK_DUP
eq S0, "$", STACK_POP
eq S0, "\\", STACK_SWAP
@@ -127,7 +127,7 @@
eq S0, ".", IO_OUTPUT_INT
eq S0, ",", IO_OUTPUT_CHAR
eq S0, "g", IO_GET_VALUE
- eq S0, "p", IO_PUT_VALUE
+ #eq S0, "p", IO_PUT_VALUE
=cut
@@ -155,12 +155,20 @@
IO_PUSH_CHAR:
io__push_char()
goto MOVE_PC
+ IO_PUT_VALUE:
+ io__put_value()
+ goto MOVE_PC
# maths instructions
MATHS_PUSH_NUMBER:
maths__push_number()
goto MOVE_PC
-
+
+ # stack operations
+ STACK_DUP:
+ stack__duplicate()
+ goto MOVE_PC
+
# instruction executed, now move the pc
Modified: trunk/languages/befunge/io.pir
==============================================================================
--- trunk/languages/befunge/io.pir (original)
+++ trunk/languages/befunge/io.pir Fri Jan 9 01:17:27 2009
@@ -18,6 +18,27 @@
set_global "stack", $P1
.end
+
+#
+# io__put_value()
+#
+# put a value in the playfield.
+# befunge stack:
+# before: ... i x y
+# after: ...
+# value_at(x,y) = i
+#
+.sub "io__put_value"
+ .local int x, y, v
+ y = stack__pop()
+ x = stack__pop()
+ v = stack__pop()
+
+ $P0 = get_global "playfield"
+ $P0[y;x] = v
+ set_global"playfield", $P0
+.end
+
=pod
IO_PUSH_CHAR:
@@ -120,26 +141,6 @@
push P2, I12
branch MOVE_PC
-# Put a value in the playfield.
-# Befunge stack:
-# before: ... i x y
-# after: ...
-# value_at(x,y) = i
-IO_PUT_VALUE:
- set I11, P2
- unless I11, IO_PUT_VALUE_POP_1
- pop I11, P2
-IO_PUT_VALUE_POP_1:
- set I10, P2 # offset
- unless I10, IO_PUT_VALUE_POP_2
- pop I10, P2
-IO_PUT_VALUE_POP_2:
- set I20, P2
- unless I20, IO_PUT_VALUE_POP_3
- pop I20, P2
-IO_PUT_VALUE_POP_3:
- set P1[I11;I10], I20
- branch MOVE_PC
=cut