Added bitwise OR and XOR subroutines to VVS stdlib.
[vvhitespace] / stdlib / logic.pvvs
CommitLineData
0c56152e
AT
1#ifndef VVS_STDLIB_LOGIC
2#define VVS_STDLIB_LOGIC
3
4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
5@ These subroutines assume they are running on the official VVS interpreter
6@ which internally uses a twos-complement representation.
7@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
8
9@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
10@ Name:
11@ not (101000)
12@ Description:
13@ Performs a bitwise NOT on the TOS word.
14@ Call Stack:
15@ X
16@ Return Stack:
17@ NOT(X)
18@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
19NSSVTSTSSSN | Mark: 101000 (not)
20@ In twos-complement, NOT(X) = (-X)-1
21SSTTN | PUSH -1
22TSSN | MULTIPLY
76974914 23SSSTN | PUSH 1
0c56152e
AT
24TSST | SUBTRACT
25NTN | RTS
26
3eaa958a
AT
27@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
28@ Name:
29@ and (101001)
30@ Description:
31@ Performs a bitwise AND on the TOS word.
32@ Call Stack:
33@ X
34@ Y
35@ Return Stack:
36@ X ^ Y
37@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
38NSSVTSTSSTN | Mark: 101001 (and)
39
40@ Prepare the stack for computation.
41SSSSN | PUSH 0 (result)
42SSSTTTTTTN | PUSH 63 (shift counter)
43
44@ Loop through the bits one at a time.
45NSSVSSTSTSSTSSSSSSSSN | Mark: 00101001 00000000
76974914 46@ Prepare copy of X for the AND
3eaa958a
AT
47SNS | DUP
48SSSTSTN | PUSH 5
49NSTTTSSN | JSR > 1100 (deepdup)
50SNT | SWAP
51NSTTSTTSSN | JSR > 101100 (rshift)
76974914 52@ Prepare copy of Y for the AND
3eaa958a
AT
53SSSTSSN | PUSH 4
54NSTTTSSN | JSR > 1100 (deepdup)
55SSSTTN | PUSH 3
56NSTTTSSN | JSR > 1100 (deepdup)
57NSTTSTTSSN | JSR > 101100 (rshift)
58@ Do the AND and store in result.
59NSTTSSSSSSN | JSR > 1000000 (lowbitand)
60SSSTTN | PUSH 3
61NSTTSTTN | JSR > 1011 (stackrotatereverse)
62SSSTN | PUSH 1
63NSTTSTTSTN | JSR > 101101 (lshift)
64TSSS | ADD
65SSSTSN | PUSH 2
66NSTTSTSN | JSR > 1010 (stackrotate)
67@ Test for end of loop.
68SNS | DUP
69NTSSSTSTSSTSSSSSSSTN | BRZ > 00101001 00000001
70@ Decrement the counter and loop again.
71SSSTN | PUSH 1
72TSST | SUBTRACT
73NSNSSTSTSSTSSSSSSSSN | JMP > 00101001 00000000
74
75@ Clean up and return.
76NSSVSSTSTSSTSSSSSSSTN | Mark: 00101001 00000001
77SNN | DROP
78SNT | SWAP
79SNN | DROP
80SNT | SWAP
81SNN | DROP
82NTN | RTS
83
76974914
AT
84@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
85@ Name:
86@ or (101010)
87@ Description:
88@ Performs a bitwise OR on the TOS word.
89@ Call Stack:
90@ X
91@ Y
92@ Return Stack:
93@ X v Y
94@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
95NSSVTSTSTSN | Mark: 101010 (or)
96NSTTSTSSSN | JSR > 101000 (not)
97SNT | SWAP
98NSTTSTSSSN | JSR > 101000 (not)
99NSTTSTSSTN | JSR > 101001 (and)
100NSTTSTSSSN | JSR > 101000 (not)
101NTN | RTS
102
103@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
104@ Name:
105@ xor (101011)
106@ Description:
107@ Performs a bitwise XOR on the TOS word.
108@ Call Stack:
109@ X
110@ Y
111@ Return Stack:
112@ X xor Y
113@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
114NSSVTSTSTTN | Mark: 101011 (xor)
115SNS | DUP
116SSSTTN | PUSH 3
117NSTTTSSN | JSR > 1100 (deepdup)
118NSTTSTSTSN | JSR > 101010 (or)
119SNT | SWAP
120SSSTTN | PUSH 3
121NSTTSTTN | JSR > 1011 (stackrotatereverse)
122NSTTSTSSTN | JSR > 101001 (and)
123NSTTSTSSSN | JSR > 101000 (not)
124NSTTSTSSTN | JSR > 101001 (and)
125NTN | RTS
126
0c56152e
AT
127@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
128@ Name:
129@ rshift (101100)
130@ Description:
131@ Shifts 'X' right by 'shiftcount' bits with sign extension.
132@ Call Stack:
133@ X
134@ shiftcount
135@ Return Stack:
136@ X >> shiftcount
137@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
138NSSVTSTTSSN | Mark: 101100 (rshift)
139
3eaa958a 140@ Test for loop completion first since it is allowable to shift by zero.
0c56152e
AT
141NSSVSSTSTTSSSSSSSSSTN | Mark: 00101100 00000001
142SNS | DUP
143NTSSSTSTTSSSSSSSSSSN | BRZ > 00101100 00000000
144@ Shift by one bit on each pass.
145SNT | SWAP
146SSSTSN | PUSH 2
147TSTS | DIVIDE
148@ Decrement the counter.
149SNT | SWAP
150SSSTN | PUSH 1
151TSST | SUBTRACT
152@ Loop again.
153NSNSSTSTTSSSSSSSSSTN | JMP > 00101100 00000001
154
155@ Clean up and return.
156NSSVSSTSTTSSSSSSSSSSN | Mark: 00101100 00000000
157SNN | DROP
158NTN | RTS
159
160@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
161@ Name:
162@ lshift (101101)
163@ Description:
164@ Shifts 'X' left by 'shiftcount' bits with zero filling.
165@ Call Stack:
166@ X
167@ shiftcount
168@ Return Stack:
169@ X << shiftcount
170@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
171NSSVTSTTSTN | Mark: 101101 (lshift)
172
3eaa958a 173@ Test for loop completion first since it is allowable to shift by zero.
0c56152e
AT
174NSSVSSTSTTSTSSSSSSSTN | Mark: 00101101 00000001
175SNS | DUP
176NTSSSTSTTSTSSSSSSSSN | BRZ > 00101101 00000000
177@ Shift by one bit on each pass.
178SNT | SWAP
179SSSTSN | PUSH 2
180TSSN | MULTIPLY
181@ Decrement the counter.
182SNT | SWAP
183SSSTN | PUSH 1
184TSST | SUBTRACT
185@ Loop again.
186NSNSSTSTTSTSSSSSSSTN | JMP > 00101101 00000001
187
188@ Clean up and return.
189NSSVSSTSTTSTSSSSSSSSN | Mark: 00101101 00000000
190SNN | DROP
191NTN | RTS
192
e0d5136c
AT
193@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
194@ Name:
195@ lowbitand (1000000)
196@ Description:
197@ Performs logical AND on the least-significant bit of 'X' and 'Y'.
198@ Returns either 1 or 0, no other values.
199@ Call Stack:
200@ X
201@ Y
202@ Return Stack:
203@ lsb(X) AND lsb(Y)
204@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
205NSSVTSSSSSSN | Mark: 1000000 (lowbitand)
206SSSTSN | PUSH 2
207TSTT | MODULO
208SNT | SWAP
209SSSTSN | PUSH 2
210TSTT | MODULO
211TSSS | ADD
212SSSTSN | PUSH 2
213TSTS | DIVIDE
214NTN | RTS
215
0c56152e 216#endif