Commit | Line | Data |
---|---|---|
3695b659 AT |
1 | #ifndef VVS_STDLIB_HEAP |
2 | #define VVS_STDLIB_HEAP | |
3 | ||
4 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
bb21580a AT |
5 | @ Name: |
6 | @ memset (11000) | |
3695b659 | 7 | @ Description: |
bb21580a | 8 | @ Writes 'pattern' in memory locations 'startaddr' to 'startaddr+count'. |
3695b659 AT |
9 | @ Call Stack: |
10 | @ pattern | |
11 | @ startaddr | |
3d75b928 | 12 | @ count <-- TOS |
3695b659 AT |
13 | @ Return Stack: |
14 | @ <empty> | |
15 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
149f16fd | 16 | #include <stack.pvvs> |
3695b659 AT |
17 | NSSVTTSSSN | Mark: 11000 (memset) |
18 | ||
bb21580a | 19 | @ Store 'pattern' into one memory location on each pass through this loop. |
3695b659 | 20 | NSSVSSSTTSSSSSSSSSSSN | Mark: 00011000 00000000 |
6cb31a3e AT |
21 | SNS | DUP |
22 | SSSTTN | PUSH 3 | |
23 | NSTTTSSN | JSR > 1100 (deepdup) | |
bb21580a | 24 | TSSS | ADD |
6cb31a3e AT |
25 | SSSTSSN | PUSH 4 |
26 | NSTTTSSN | JSR > 1100 (deepdup) | |
3695b659 AT |
27 | TTS | STORE |
28 | ||
6cb31a3e | 29 | @ Check for loop end condition 'count == 0'. |
3695b659 AT |
30 | SNS | DUP |
31 | NTSSSSTTSSSSSSSSSSTN | BRZ > 00011000 00000001 | |
6cb31a3e | 32 | @ Decrement and loop again. |
3695b659 AT |
33 | SSSTN | PUSH 1 |
34 | TSST | SUBTRACT | |
3695b659 AT |
35 | NSNSSSTTSSSSSSSSSSSN | JMP > 00011000 00000000 |
36 | ||
37 | @ Clean up and return | |
38 | NSSVSSSTTSSSSSSSSSSTN | Mark: 00011000 00000001 | |
39 | SNN | DROP | |
6cb31a3e AT |
40 | SNN | DROP |
41 | SNN | DROP | |
3695b659 AT |
42 | NTN | RTS |
43 | ||
3d75b928 | 44 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
bb21580a AT |
45 | @ Name: |
46 | @ memcpy (11001) | |
3d75b928 | 47 | @ Description: |
bb21580a | 48 | @ Copies 'count+1' words from 'source' to 'destination'. |
3d75b928 AT |
49 | @ Call Stack: |
50 | @ source | |
51 | @ destination | |
52 | @ count <-- TOS | |
53 | @ Return Stack: | |
54 | @ <empty> | |
55 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
149f16fd | 56 | #include <stack.pvvs> |
3d75b928 | 57 | NSSVTTSSTN | Mark: 11001 (memcpy) |
3d75b928 AT |
58 | |
59 | @ Copy one word on each pass through this loop. | |
60 | NSSVSSSTTSSTSSSSSSSSN | Mark: 00011001 00000000 | |
6cb31a3e AT |
61 | SNS | DUP |
62 | SSSTTN | PUSH 3 | |
63 | NSTTTSSN | JSR > 1100 (deepdup) | |
3d75b928 | 64 | TSSS | ADD |
6cb31a3e AT |
65 | SSSTSN | PUSH 2 |
66 | NSTTTSSN | JSR > 1100 (deepdup) | |
67 | SSSTSTN | PUSH 5 | |
68 | NSTTTSSN | JSR > 1100 (deepdup) | |
3d75b928 AT |
69 | TSSS | ADD |
70 | TTT | LOAD | |
71 | TTS | STORE | |
72 | ||
6cb31a3e | 73 | @ Check for loop end conditions and decrement. |
3d75b928 AT |
74 | SNS | DUP |
75 | NTSSSSTTSSTSSSSSSSTN | BRZ > 00011001 00000001 | |
76 | SSSTN | PUSH 1 | |
77 | TSST | SUBTRACT | |
3d75b928 AT |
78 | NSNSSSTTSSTSSSSSSSSN | JMP > 00011001 00000000 |
79 | ||
80 | @ Clean up and return | |
81 | NSSVSSSTTSSTSSSSSSSTN | Mark: 00011001 00000001 | |
82 | SNN | DROP | |
6cb31a3e AT |
83 | SNN | DROP |
84 | SNN | DROP | |
3d75b928 AT |
85 | NTN | RTS |
86 | ||
d63de3fa | 87 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
bb21580a AT |
88 | @ Name: |
89 | @ memrand (11010) | |
d63de3fa | 90 | @ Description: |
bb21580a | 91 | @ Writes random words into memory locations 'startaddr' to 'startaddr+count'. |
d63de3fa AT |
92 | @ Call Stack: |
93 | @ count | |
94 | @ startaddr <-- TOS | |
95 | @ Return Stack: | |
96 | @ <empty> | |
97 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
bb21580a | 98 | #include <math.pvvs> |
149f16fd | 99 | #include <stack.pvvs> |
d63de3fa | 100 | NSSVTTSTSN | Mark: 11010 (memrand) |
d63de3fa AT |
101 | |
102 | @ Store random word into one memory location on each pass through this loop. | |
103 | NSSVSSSTTSTSSSSSSSSSN | Mark: 00011010 00000000 | |
104 | SNS | DUP | |
6cb31a3e AT |
105 | SSSTTN | PUSH 3 |
106 | NSTTTSSN | JSR > 1100 (deepdup) | |
d63de3fa AT |
107 | TSSS | ADD |
108 | NSTTSSSSN | JSR > 10000 (random) | |
109 | TTS | STORE | |
110 | ||
111 | @ Decrement and check loop end conditions | |
6cb31a3e | 112 | SNT | SWAP |
d63de3fa AT |
113 | SNS | DUP |
114 | NTSSSSTTSTSSSSSSSSTN | BRZ > 00011010 00000001 | |
115 | SSSTN | PUSH 1 | |
116 | TSST | SUBTRACT | |
6cb31a3e | 117 | SNT | SWAP |
d63de3fa AT |
118 | NSNSSSTTSTSSSSSSSSSN | JMP > 00011010 00000000 |
119 | ||
d63de3fa AT |
120 | @ Clean up and return |
121 | NSSVSSSTTSTSSSSSSSSTN | Mark: 00011010 00000001 | |
122 | SNN | DROP | |
6cb31a3e | 123 | SNN | DROP |
d63de3fa AT |
124 | NTN | RTS |
125 | ||
87d27426 | 126 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
bb21580a AT |
127 | @ Name: |
128 | @ memcmp (11011) | |
87d27426 | 129 | @ Description: |
bb21580a | 130 | @ Compares two blocks of memory: |
87d27426 AT |
131 | @ blk1ptr -> blk1ptr+count |
132 | @ -- versus -- | |
133 | @ blk2ptr -> blk2ptr+count | |
134 | @ The return value is zero if the blocks are identical, otherwise non-zero. | |
135 | @ Call Stack: | |
136 | @ count | |
137 | @ blk1ptr | |
138 | @ blk2ptr <-- TOS | |
139 | @ Return Stack: | |
140 | @ retvalue <-- TOS | |
141 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
149f16fd | 142 | #include <stack.pvvs> |
87d27426 | 143 | NSSVTTSTTN | Mark: 11011 (memcmp) |
87d27426 AT |
144 | |
145 | @ Compare one word on each pass through this loop. | |
6cb31a3e | 146 | @ TOS> blk2ptr, blk1ptr, count |
87d27426 | 147 | NSSVSSSTTSTTSSSSSSSSN | Mark: 00011011 00000000 |
6cb31a3e | 148 | @ Retrieve *blk2ptr |
87d27426 | 149 | SNS | DUP |
6cb31a3e AT |
150 | SSSTSSN | PUSH 4 |
151 | NSTTTSSN | JSR > 1100 (deepdup) | |
87d27426 AT |
152 | TSSS | ADD |
153 | TTT | LOAD | |
6cb31a3e AT |
154 | @ Retrieve *blk1ptr |
155 | SSSTTN | PUSH 3 | |
156 | NSTTTSSN | JSR > 1100 (deepdup) | |
157 | SSSTSTN | PUSH 5 | |
158 | NSTTTSSN | JSR > 1100 (deepdup) | |
87d27426 AT |
159 | TSSS | ADD |
160 | TTT | LOAD | |
6cb31a3e | 161 | @ Compare |
87d27426 | 162 | TSST | SUBTRACT |
6cb31a3e | 163 | @ TOS> *blk2ptr-*blk1ptr, blk2ptr, blk1ptr, count |
87d27426 AT |
164 | NTSSSSTTSTTSSSSSSTSN | BRZ > 00011011 00000010 (jump if words match) |
165 | ||
166 | @ Return 'match? = false' | |
167 | SNN | DROP | |
6cb31a3e AT |
168 | SNN | DROP |
169 | SNN | DROP | |
87d27426 AT |
170 | SSSTN | PUSH 1 |
171 | NTN | RTS | |
172 | ||
d00258fa | 173 | @ Decrement and loop again if loop is not complete. |
87d27426 | 174 | NSSVSSSTTSTTSSSSSSTSN | Mark: 00011011 00000010 |
6cb31a3e AT |
175 | SSSTTN | PUSH 3 |
176 | NSTTTSSN | JSR > 1100 (deepdup) | |
177 | @ TOS> count, blk2ptr, blk1ptr, count | |
87d27426 | 178 | NTSSSSTTSTTSSSSSSSTN | BRZ > 00011011 00000001 (jump if loop is complete) |
6cb31a3e AT |
179 | SSSTTN | PUSH 3 |
180 | NSTTSTTN | JSR > 1011 (stackrotatereverse) | |
87d27426 | 181 | SSSTN | PUSH 1 |
6cb31a3e AT |
182 | TSSS | ADD |
183 | SSSTTN | PUSH 3 | |
184 | NSTTSTSN | JSR > 1010 (stackrotate) | |
87d27426 AT |
185 | NSNSSSTTSTTSSSSSSSSN | JMP > 00011011 00000000 |
186 | ||
187 | @ Return 'match? = true' | |
188 | NSSVSSSTTSTTSSSSSSSTN | Mark: 00011011 00000001 | |
189 | SNN | DROP | |
6cb31a3e AT |
190 | SNN | DROP |
191 | SNN | DROP | |
87d27426 AT |
192 | SSSSN | PUSH 0 |
193 | NTN | RTS | |
194 | ||
fd04fb41 | 195 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
bb21580a AT |
196 | @ Name: |
197 | @ memsrch (11100) | |
fd04fb41 | 198 | @ Description: |
bb21580a AT |
199 | @ Searches the heap from 'address' to 'address+count'. |
200 | @ If 'pattern' is found, the return value is a pointer to the matching word. | |
fd04fb41 AT |
201 | @ If not found, the return value is a null pointer. |
202 | @ Call Stack: | |
203 | @ pattern | |
204 | @ count | |
205 | @ address <-- TOS | |
206 | @ Return Stack: | |
207 | @ pointer <-- TOS | |
208 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
149f16fd | 209 | #include <stack.pvvs> |
fd04fb41 | 210 | NSSVTTTSSN | Mark: 11100 (memsrch) |
6cb31a3e AT |
211 | |
212 | @ Setup an 'offset counter' on the stack. | |
213 | SSSSN | PUSH 0 | |
fd04fb41 AT |
214 | |
215 | @ Compare one word on each pass through this loop. | |
6cb31a3e | 216 | @ TOS> counter, address, count, pattern |
fd04fb41 | 217 | NSSVSSSTTTSSSSSSSSSSN | Mark: 00011100 00000000 |
6cb31a3e | 218 | SNT | SWAP |
fd04fb41 | 219 | SNS | DUP |
6cb31a3e AT |
220 | SSSTTN | PUSH 3 |
221 | NSTTSTTN | JSR > 1011 (stackrotatereverse) | |
222 | SNS | DUP | |
223 | SSSTTN | PUSH 3 | |
224 | NSTTSTTN | JSR > 1011 (stackrotatereverse) | |
fd04fb41 AT |
225 | TSSS | ADD |
226 | TTT | LOAD | |
6cb31a3e AT |
227 | SSSTSTN | PUSH 5 |
228 | NSTTTSSN | JSR > 1100 (deepdup) | |
fd04fb41 | 229 | TSST | SUBTRACT |
6cb31a3e | 230 | @ TOS> pattern-(address+counter), counter, address, count, pattern |
fd04fb41 | 231 | NTSSSSTTTSSSSSSSSSTN | BRZ > 00011100 00000001 |
6cb31a3e AT |
232 | |
233 | @ Test for end of loop by comparing 'counter' and 'count'. | |
fd04fb41 | 234 | SNS | DUP |
6cb31a3e AT |
235 | SSSTSSN | PUSH 4 |
236 | NSTTTSSN | JSR > 1100 (deepdup) | |
fd04fb41 | 237 | TSST | SUBTRACT |
6cb31a3e | 238 | @ TOS> counter-count, counter, address, count, pattern |
fd04fb41 | 239 | NTSSSSTTTSSSSSSSSTSN | BRZ > 00011100 00000010 |
6cb31a3e AT |
240 | |
241 | @ Increment 'counter' and loop again. | |
fd04fb41 AT |
242 | SSSTN | PUSH 1 |
243 | TSSS | ADD | |
244 | NSNSSSTTTSSSSSSSSSSN | JMP > 00011100 00000000 | |
245 | ||
246 | @ Found a match. Clean up and return. | |
247 | NSSVSSSTTTSSSSSSSSSTN | Mark: 00011100 00000001 | |
fd04fb41 | 248 | TSSS | ADD |
6cb31a3e AT |
249 | SNT | SWAP |
250 | SNN | DROP | |
251 | SNT | SWAP | |
252 | SNN | DROP | |
fd04fb41 AT |
253 | NTN | RTS |
254 | ||
255 | @ No match found. Clean up and return. | |
256 | NSSVSSSTTTSSSSSSSSTSN | Mark: 00011100 00000010 | |
257 | SNN | DROP | |
bb21580a | 258 | SNN | DROP |
ae1f85a1 | 259 | SNN | DROP |
6cb31a3e AT |
260 | SNN | DROP |
261 | SSSSN | PUSH 0 | |
ae1f85a1 AT |
262 | NTN | RTS |
263 | ||
264 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
265 | @ Name: | |
266 | @ slurp (11110) | |
267 | @ Description: | |
268 | @ Reads values from heap to stack in complementary order to 'spew'. | |
269 | @ Call Stack: | |
270 | @ address | |
271 | @ count <-- TOS | |
272 | @ Return Stack: | |
273 | @ heap[address+count] | |
274 | @ ... | |
275 | @ heap[address+1] | |
276 | @ heap[address] <-- TOS | |
277 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
6cb31a3e | 278 | #include <stack.pvvs> |
ae1f85a1 | 279 | NSSVTTTTSN | Mark: 11110 (slurp) |
ae1f85a1 AT |
280 | |
281 | @ Load one word from heap on each pass. | |
23d17247 AT |
282 | SNS | DUP |
283 | SSSTTN | PUSH 3 | |
284 | NSTTSTSN | JSR > 1010 (stackrotate) | |
285 | SNT | SWAP | |
286 | SNS | DUP | |
287 | SSSTTN | PUSH 3 | |
288 | NSTTSTSN | JSR > 1010 (stackrotate) | |
ae1f85a1 AT |
289 | TSSS | ADD |
290 | TTT | LOAD | |
23d17247 AT |
291 | SSSTTN | PUSH 3 |
292 | NSTTSTSN | JSR > 1010 (stackrotate) | |
293 | SNT | SWAP | |
ae1f85a1 AT |
294 | |
295 | @ Check for loop completion. | |
ae1f85a1 | 296 | SNS | DUP |
23d17247 | 297 | NTSSSSTTTTSSSSSSSSSN | BRZ > 00011110 00000000 |
ae1f85a1 AT |
298 | SSSTN | PUSH 1 |
299 | TSST | SUBTRACT | |
23d17247 AT |
300 | NSNTTTTSN | JMP > 11110 (slurp) |
301 | ||
302 | @ Clean up and return. | |
303 | NSSVSSSTTTTSSSSSSSSSN | Mark: 00011110 00000000 | |
ae1f85a1 AT |
304 | SNN | DROP |
305 | SNN | DROP | |
306 | NTN | RTS | |
307 | ||
308 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
309 | @ Name: | |
310 | @ spew (11111) | |
311 | @ Description: | |
312 | @ Writes values from stack to heap in this order: | |
313 | @ TOS -> heap[address] | |
314 | @ TOS+1 -> heap[address+1] | |
315 | @ ... | |
316 | @ TOS+n -> heap[address+count] | |
317 | @ Call Stack: | |
318 | @ data-words | |
319 | @ ... | |
320 | @ data-words | |
321 | @ address | |
322 | @ count <-- TOS | |
323 | @ Return Stack: | |
324 | @ <empty> | |
325 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
6cb31a3e | 326 | #include <stack.pvvs> |
ae1f85a1 | 327 | NSSVTTTTTN | Mark: 11111 (spew) |
ae1f85a1 | 328 | |
6cb31a3e | 329 | @ Create a counter that doubles as a dest. pointer offset generator. |
ae1f85a1 | 330 | SSSSN | PUSH 0 |
ae1f85a1 AT |
331 | |
332 | @ Store one word to heap on each pass. | |
333 | NSSVSSSTTTTTSSSSSSSSN | Mark: 00011111 00000000 | |
6cb31a3e AT |
334 | SNS | DUP |
335 | SSSTSSN | PUSH 4 | |
336 | NSTTTSSN | JSR > 1100 (deepdup) | |
ae1f85a1 | 337 | TSSS | ADD |
6cb31a3e AT |
338 | SSSTSTN | PUSH 5 |
339 | NSTTSTTN | JSR > 1011 (stackrotatereverse) | |
ae1f85a1 AT |
340 | TTS | STORE |
341 | ||
342 | @ Check for loop completion. | |
6cb31a3e AT |
343 | SNT | SWAP |
344 | SNS | DUP | |
345 | SSSTTN | PUSH 3 | |
346 | NSTTSTTN | JSR > 1011 (stackrotatereverse) | |
347 | SNS | DUP | |
348 | SSSTTN | PUSH 3 | |
349 | NSTTSTTN | JSR > 1011 (stackrotatereverse) | |
ae1f85a1 AT |
350 | TSST | SUBTRACT |
351 | NTSSSSTTTTTSSSSSSSTN | BRZ > 00011111 00000001 | |
352 | ||
6cb31a3e AT |
353 | @ Increment counter. |
354 | SSSTN | PUSH 1 | |
ae1f85a1 | 355 | TSSS | ADD |
bb21580a AT |
356 | NSNSSSTTTTTSSSSSSSSN | JMP > 00011111 00000000 |
357 | ||
358 | @ Clean up and return. | |
359 | NSSVSSSTTTTTSSSSSSSTN | Mark: 00011111 00000001 | |
6cb31a3e AT |
360 | SNN | DROP |
361 | SNN | DROP | |
362 | SNN | DROP | |
bb21580a | 363 | NTN | RTS |
d63de3fa | 364 | |
3695b659 | 365 | #endif |