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