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