Author: jquelin
Date: Fri Jan 9 01:39:27 2009
New Revision: 35255
Modified:
trunk/languages/befunge/befunge.pir
trunk/languages/befunge/flow.pir
Log:
instruction | implemented (vertical if)
Modified: trunk/languages/befunge/befunge.pir
==============================================================================
--- trunk/languages/befunge/befunge.pir (original)
+++ trunk/languages/befunge/befunge.pir Fri Jan 9 01:39:27 2009
@@ -89,6 +89,8 @@
if char == '<' goto FLOW_GO_WEST
# flow control
+ if char == '_' goto FLOW_IF_HORIZONTAL
+ if char == '!' goto FLOW_IF_VERTICAL
# math functions
if char == '!' goto MATHS_NOT
@@ -111,8 +113,8 @@
# Flow control.
eq S0, "`", FLOW_COMPARE
- eq S0, "_", FLOW_EW_IF
- eq S0, "|", FLOW_NS_IF
+ #eq S0, "_", FLOW_EW_IF
+ #eq S0, "|", FLOW_NS_IF
eq S0, "#", FLOW_BRIDGE
eq S0, "@", FLOW_END
@@ -152,6 +154,12 @@
FLOW_GO_WEST:
flow__go_west()
goto MOVE_PC
+ FLOW_IF_HORIZONTAL:
+ flow__if_horizontal()
+ goto MOVE_PC
+ FLOW_IF_VERTICAL:
+ flow__if_vertical()
+ goto MOVE_PC
FLOW_TOGGLE_STRING_MODE:
flow__toggle_string_mode()
goto MOVE_PC
Modified: trunk/languages/befunge/flow.pir
==============================================================================
--- trunk/languages/befunge/flow.pir (original)
+++ trunk/languages/befunge/flow.pir Fri Jan 9 01:39:27 2009
@@ -45,6 +45,43 @@
.end
+# ** ifs & comparisons
+
+#
+# flow__if_horizontal()
+#
+# east/west if.
+# befunge stack:
+# before: ... b
+# after: ...
+# delta <- if (b) (-1,0) else (1,0)
+.sub "flow__if_horizontal"
+ $I0 = stack__pop()
+ if $I0 == 0 goto FLOW__IF_HORIZONTAL__FALSE
+ flow__go_west()
+ .return()
+ FLOW__IF_HORIZONTAL__FALSE:
+ flow__go_east()
+.end
+
+#
+# flow__if_vertical()
+#
+# north/south if.
+# befunge stack:
+# before: ... b
+# after: ...
+# delta <- if (b) (0,-1) else (0,1)
+.sub "flow__if_vertical"
+ $I0 = stack__pop()
+ if $I0 == 0 goto FLOW__IF_HORIZONTAL__FALSE
+ flow__go_south()
+ .return()
+ FLOW__IF_HORIZONTAL__FALSE:
+ flow__go_north()
+.end
+
+
# ** flag handling
#
@@ -88,31 +125,6 @@
restore I2
branch MOVE_PC
-# East/West if.
-# Befunge stack:
-# before: ... b
-# after: ...
-# delta <- if (b) (-1,0) else (1,0)
-FLOW_EW_IF:
- set I10, P2
- unless I10, FLOW_EW_IF_POP_1
- pop I10, P2
-FLOW_EW_IF_POP_1:
- eq I10, 0, FLOW_GO_EAST
- branch FLOW_GO_WEST
-
-# North/South if.
-# Befunge stack:
-# before: ... b
-# after: ...
-# delta <- if (b) (0,-1) else (0,1)
-FLOW_NS_IF:
- set I10, P2
- unless I10, FLOW_NS_IF_POP_1
- pop I10, P2
-FLOW_NS_IF_POP_1:
- eq I10, 0, FLOW_GO_SOUTH
- branch FLOW_GO_NORTH
# Greater than.