* t/pmc/complex.t:
[parrot.git] / languages / befunge / flow.pasm
blobd1524221728d108e8a430bbde543b71afd199654
1 # $Id$
3 # Go north.
4 # Befunge stack unchanged.
5 # delta <- (0,-1)
6 FLOW_GO_NORTH:
7         set I2, 0
8         branch MOVE_PC
10 # Go east.
11 # Befunge stack unchanged.
12 # delta <- (1,0)
13 FLOW_GO_EAST:
14         set I2, 1
15         branch MOVE_PC
17 # Go south.
18 # Befunge stack unchanged.
19 # delta <- (0,1)
20 FLOW_GO_SOUTH:
21         set I2, 2
22         branch MOVE_PC
24 # Go west.
25 # Befunge stack unchanged.
26 # delta <- (-1,0)
27 FLOW_GO_WEST:
28         set I2, 3
29         branch MOVE_PC
31 FLOW_GO_AWAY:
32         save 4
33         bsr MATHS_RAND
34         restore I10
35         set I2, I10
36         save I2
37         restore I2
38         branch MOVE_PC
40 # East/West if.
41 # Befunge stack:
42 #   before:     ... b
43 #   after:      ...
44 # delta <- if (b) (-1,0) else (1,0)
45 FLOW_EW_IF:
46         set I10, P2
47         unless I10, FLOW_EW_IF_POP_1
48         pop I10, P2
49 FLOW_EW_IF_POP_1:
50         eq I10, 0, FLOW_GO_EAST
51         branch FLOW_GO_WEST
53 # North/South if.
54 # Befunge stack:
55 #   before:     ... b
56 #   after:      ...
57 # delta <- if (b) (0,-1) else (0,1)
58 FLOW_NS_IF:
59         set I10, P2
60         unless I10, FLOW_NS_IF_POP_1
61         pop I10, P2
62 FLOW_NS_IF_POP_1:
63         eq I10, 0, FLOW_GO_SOUTH
64         branch FLOW_GO_NORTH
67 # Greater than.
68 # Befunge stack:
69 #   before:     ... a b
70 #   after:      ... a>b
71 # Result is either 1 or 0.
72 FLOW_COMPARE:
73         set I10, P2
74         unless I10, FLOW_COMPARE_POP_1
75         pop I10, P2
76 FLOW_COMPARE_POP_1:
77         set I11, P2
78         unless I11, FLOW_COMPARE_POP_2
79         pop I11, P2
80 FLOW_COMPARE_POP_2:
81         set I12, 1
82         gt I11, I10, FLOW_COMPARE_TRUE
83         set I12, 0
84 FLOW_COMPARE_TRUE:
85         push P2, I12
86         branch MOVE_PC
88 # Toggle string mode.
89 # Befunge stack unchanged.
90 FLOW_TOGGLE_STRING_MODE:
91         eq I4, 1, FLOW_TOGGLE_STRING_MODE_OFF
92         set I4, 1
93         branch MOVE_PC
94 FLOW_TOGGLE_STRING_MODE_OFF:
95         set I4, 0
96         branch MOVE_PC
98 # Trampoline.
99 # Befunge stack unchanged.
100 # Skip next instruction (pos < pos + delta)
101 FLOW_BRIDGE:
102         set I4, 2
103         branch MOVE_PC
105 # Stop.
106 # Befunge stack unchanged.
107 # End program.
108 FLOW_END:
109         set I4, 3
110         branch MOVE_PC