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