Commit | Line | Data |
---|---|---|
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 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
19 | NSSVTSTSSSN | Mark: 101000 (not) | |
20 | @ In twos-complement, NOT(X) = (-X)-1 | |
21 | SSTTN | PUSH -1 | |
22 | TSSN | MULTIPLY | |
23 | SSTTN | PUSH -1 | |
24 | TSST | SUBTRACT | |
25 | NTN | 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 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
38 | NSSVTSTSSTN | Mark: 101001 (and) | |
39 | ||
40 | @ Prepare the stack for computation. | |
41 | SSSSN | PUSH 0 (result) | |
42 | SSSTTTTTTN | PUSH 63 (shift counter) | |
43 | ||
44 | @ Loop through the bits one at a time. | |
45 | NSSVSSTSTSSTSSSSSSSSN | Mark: 00101001 00000000 | |
46 | @ Prepare X for the AND | |
47 | SNS | DUP | |
48 | SSSTSTN | PUSH 5 | |
49 | NSTTTSSN | JSR > 1100 (deepdup) | |
50 | SNT | SWAP | |
51 | NSTTSTTSSN | JSR > 101100 (rshift) | |
52 | @ Prepare Y for the AND | |
53 | SSSTSSN | PUSH 4 | |
54 | NSTTTSSN | JSR > 1100 (deepdup) | |
55 | SSSTTN | PUSH 3 | |
56 | NSTTTSSN | JSR > 1100 (deepdup) | |
57 | NSTTSTTSSN | JSR > 101100 (rshift) | |
58 | @ Do the AND and store in result. | |
59 | NSTTSSSSSSN | JSR > 1000000 (lowbitand) | |
60 | SSSTTN | PUSH 3 | |
61 | NSTTSTTN | JSR > 1011 (stackrotatereverse) | |
62 | SSSTN | PUSH 1 | |
63 | NSTTSTTSTN | JSR > 101101 (lshift) | |
64 | TSSS | ADD | |
65 | SSSTSN | PUSH 2 | |
66 | NSTTSTSN | JSR > 1010 (stackrotate) | |
67 | @ Test for end of loop. | |
68 | SNS | DUP | |
69 | NTSSSTSTSSTSSSSSSSTN | BRZ > 00101001 00000001 | |
70 | @ Decrement the counter and loop again. | |
71 | SSSTN | PUSH 1 | |
72 | TSST | SUBTRACT | |
73 | NSNSSTSTSSTSSSSSSSSN | JMP > 00101001 00000000 | |
74 | ||
75 | @ Clean up and return. | |
76 | NSSVSSTSTSSTSSSSSSSTN | Mark: 00101001 00000001 | |
77 | SNN | DROP | |
78 | SNT | SWAP | |
79 | SNN | DROP | |
80 | SNT | SWAP | |
81 | SNN | DROP | |
82 | NTN | RTS | |
83 | ||
0c56152e AT |
84 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
85 | @ Name: | |
86 | @ rshift (101100) | |
87 | @ Description: | |
88 | @ Shifts 'X' right by 'shiftcount' bits with sign extension. | |
89 | @ Call Stack: | |
90 | @ X | |
91 | @ shiftcount | |
92 | @ Return Stack: | |
93 | @ X >> shiftcount | |
94 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
95 | NSSVTSTTSSN | Mark: 101100 (rshift) | |
96 | ||
3eaa958a | 97 | @ Test for loop completion first since it is allowable to shift by zero. |
0c56152e AT |
98 | NSSVSSTSTTSSSSSSSSSTN | Mark: 00101100 00000001 |
99 | SNS | DUP | |
100 | NTSSSTSTTSSSSSSSSSSN | BRZ > 00101100 00000000 | |
101 | @ Shift by one bit on each pass. | |
102 | SNT | SWAP | |
103 | SSSTSN | PUSH 2 | |
104 | TSTS | DIVIDE | |
105 | @ Decrement the counter. | |
106 | SNT | SWAP | |
107 | SSSTN | PUSH 1 | |
108 | TSST | SUBTRACT | |
109 | @ Loop again. | |
110 | NSNSSTSTTSSSSSSSSSTN | JMP > 00101100 00000001 | |
111 | ||
112 | @ Clean up and return. | |
113 | NSSVSSTSTTSSSSSSSSSSN | Mark: 00101100 00000000 | |
114 | SNN | DROP | |
115 | NTN | RTS | |
116 | ||
117 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
118 | @ Name: | |
119 | @ lshift (101101) | |
120 | @ Description: | |
121 | @ Shifts 'X' left by 'shiftcount' bits with zero filling. | |
122 | @ Call Stack: | |
123 | @ X | |
124 | @ shiftcount | |
125 | @ Return Stack: | |
126 | @ X << shiftcount | |
127 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
128 | NSSVTSTTSTN | Mark: 101101 (lshift) | |
129 | ||
3eaa958a | 130 | @ Test for loop completion first since it is allowable to shift by zero. |
0c56152e AT |
131 | NSSVSSTSTTSTSSSSSSSTN | Mark: 00101101 00000001 |
132 | SNS | DUP | |
133 | NTSSSTSTTSTSSSSSSSSN | BRZ > 00101101 00000000 | |
134 | @ Shift by one bit on each pass. | |
135 | SNT | SWAP | |
136 | SSSTSN | PUSH 2 | |
137 | TSSN | MULTIPLY | |
138 | @ Decrement the counter. | |
139 | SNT | SWAP | |
140 | SSSTN | PUSH 1 | |
141 | TSST | SUBTRACT | |
142 | @ Loop again. | |
143 | NSNSSTSTTSTSSSSSSSTN | JMP > 00101101 00000001 | |
144 | ||
145 | @ Clean up and return. | |
146 | NSSVSSTSTTSTSSSSSSSSN | Mark: 00101101 00000000 | |
147 | SNN | DROP | |
148 | NTN | RTS | |
149 | ||
e0d5136c AT |
150 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
151 | @ Name: | |
152 | @ lowbitand (1000000) | |
153 | @ Description: | |
154 | @ Performs logical AND on the least-significant bit of 'X' and 'Y'. | |
155 | @ Returns either 1 or 0, no other values. | |
156 | @ Call Stack: | |
157 | @ X | |
158 | @ Y | |
159 | @ Return Stack: | |
160 | @ lsb(X) AND lsb(Y) | |
161 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
162 | NSSVTSSSSSSN | Mark: 1000000 (lowbitand) | |
163 | SSSTSN | PUSH 2 | |
164 | TSTT | MODULO | |
165 | SNT | SWAP | |
166 | SSSTSN | PUSH 2 | |
167 | TSTT | MODULO | |
168 | TSSS | ADD | |
169 | SSSTSN | PUSH 2 | |
170 | TSTS | DIVIDE | |
171 | NTN | RTS | |
172 | ||
0c56152e | 173 | #endif |