First draft of a real README for the VVS stdlib.
[vvhitespace] / stdlib / heap.pvvs
CommitLineData
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
20NSSVTTSSSN | Mark: 11000 (memset)
21
bb21580a 22@ Store 'pattern' into one memory location on each pass through this loop.
3695b659 23NSSVSSSTTSSSSSSSSSSSN | Mark: 00011000 00000000
6cb31a3e
AT
24SNS | DUP
25SSSTTN | PUSH 3
26NSTTTSSN | JSR > 1100 (deepdup)
bb21580a 27TSSS | ADD
6cb31a3e
AT
28SSSTSSN | PUSH 4
29NSTTTSSN | JSR > 1100 (deepdup)
3695b659
AT
30TTS | STORE
31
6cb31a3e 32@ Check for loop end condition 'count == 0'.
3695b659
AT
33SNS | DUP
34NTSSSSTTSSSSSSSSSSTN | BRZ > 00011000 00000001
6cb31a3e 35@ Decrement and loop again.
3695b659
AT
36SSSTN | PUSH 1
37TSST | SUBTRACT
3695b659
AT
38NSNSSSTTSSSSSSSSSSSN | JMP > 00011000 00000000
39
40@ Clean up and return
41NSSVSSSTTSSSSSSSSSSTN | Mark: 00011000 00000001
42SNN | DROP
6cb31a3e
AT
43SNN | DROP
44SNN | DROP
3695b659
AT
45NTN | 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 60NSSVTTSSTN | Mark: 11001 (memcpy)
3d75b928
AT
61
62@ Copy one word on each pass through this loop.
63NSSVSSSTTSSTSSSSSSSSN | Mark: 00011001 00000000
6cb31a3e
AT
64SNS | DUP
65SSSTTN | PUSH 3
66NSTTTSSN | JSR > 1100 (deepdup)
3d75b928 67TSSS | ADD
6cb31a3e
AT
68SSSTSN | PUSH 2
69NSTTTSSN | JSR > 1100 (deepdup)
70SSSTSTN | PUSH 5
71NSTTTSSN | JSR > 1100 (deepdup)
3d75b928
AT
72TSSS | ADD
73TTT | LOAD
74TTS | STORE
75
6cb31a3e 76@ Check for loop end conditions and decrement.
3d75b928
AT
77SNS | DUP
78NTSSSSTTSSTSSSSSSSTN | BRZ > 00011001 00000001
79SSSTN | PUSH 1
80TSST | SUBTRACT
3d75b928
AT
81NSNSSSTTSSTSSSSSSSSN | JMP > 00011001 00000000
82
83@ Clean up and return
84NSSVSSSTTSSTSSSSSSSTN | Mark: 00011001 00000001
85SNN | DROP
6cb31a3e
AT
86SNN | DROP
87SNN | DROP
3d75b928
AT
88NTN | 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 103NSSVTTSTSN | Mark: 11010 (memrand)
d63de3fa
AT
104
105@ Store random word into one memory location on each pass through this loop.
106NSSVSSSTTSTSSSSSSSSSN | Mark: 00011010 00000000
107SNS | DUP
6cb31a3e
AT
108SSSTTN | PUSH 3
109NSTTTSSN | JSR > 1100 (deepdup)
d63de3fa
AT
110TSSS | ADD
111NSTTSSSSN | JSR > 10000 (random)
112TTS | STORE
113
114@ Decrement and check loop end conditions
6cb31a3e 115SNT | SWAP
d63de3fa
AT
116SNS | DUP
117NTSSSSTTSTSSSSSSSSTN | BRZ > 00011010 00000001
118SSSTN | PUSH 1
119TSST | SUBTRACT
6cb31a3e 120SNT | SWAP
d63de3fa
AT
121NSNSSSTTSTSSSSSSSSSN | JMP > 00011010 00000000
122
d63de3fa
AT
123@ Clean up and return
124NSSVSSSTTSTSSSSSSSSTN | Mark: 00011010 00000001
125SNN | DROP
6cb31a3e 126SNN | DROP
d63de3fa
AT
127NTN | 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 146NSSVTTSTTN | Mark: 11011 (memcmp)
87d27426
AT
147
148@ Compare one word on each pass through this loop.
6cb31a3e 149@ TOS> blk2ptr, blk1ptr, count
87d27426 150NSSVSSSTTSTTSSSSSSSSN | Mark: 00011011 00000000
6cb31a3e 151@ Retrieve *blk2ptr
87d27426 152SNS | DUP
6cb31a3e
AT
153SSSTSSN | PUSH 4
154NSTTTSSN | JSR > 1100 (deepdup)
87d27426
AT
155TSSS | ADD
156TTT | LOAD
6cb31a3e
AT
157@ Retrieve *blk1ptr
158SSSTTN | PUSH 3
159NSTTTSSN | JSR > 1100 (deepdup)
160SSSTSTN | PUSH 5
161NSTTTSSN | JSR > 1100 (deepdup)
87d27426
AT
162TSSS | ADD
163TTT | LOAD
6cb31a3e 164@ Compare
87d27426 165TSST | SUBTRACT
6cb31a3e 166@ TOS> *blk2ptr-*blk1ptr, blk2ptr, blk1ptr, count
87d27426
AT
167NTSSSSTTSTTSSSSSSTSN | BRZ > 00011011 00000010 (jump if words match)
168
169@ Return 'match? = false'
170SNN | DROP
6cb31a3e
AT
171SNN | DROP
172SNN | DROP
87d27426
AT
173SSSTN | PUSH 1
174NTN | RTS
175
d00258fa 176@ Decrement and loop again if loop is not complete.
87d27426 177NSSVSSSTTSTTSSSSSSTSN | Mark: 00011011 00000010
6cb31a3e
AT
178SSSTTN | PUSH 3
179NSTTTSSN | JSR > 1100 (deepdup)
180@ TOS> count, blk2ptr, blk1ptr, count
87d27426 181NTSSSSTTSTTSSSSSSSTN | BRZ > 00011011 00000001 (jump if loop is complete)
6cb31a3e
AT
182SSSTTN | PUSH 3
183NSTTSTTN | JSR > 1011 (stackrotatereverse)
87d27426 184SSSTN | PUSH 1
6cb31a3e
AT
185TSSS | ADD
186SSSTTN | PUSH 3
187NSTTSTSN | JSR > 1010 (stackrotate)
87d27426
AT
188NSNSSSTTSTTSSSSSSSSN | JMP > 00011011 00000000
189
190@ Return 'match? = true'
191NSSVSSSTTSTTSSSSSSSTN | Mark: 00011011 00000001
192SNN | DROP
6cb31a3e
AT
193SNN | DROP
194SNN | DROP
87d27426
AT
195SSSSN | PUSH 0
196NTN | 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 213NSSVTTTSSN | Mark: 11100 (memsrch)
6cb31a3e
AT
214
215@ Setup an 'offset counter' on the stack.
216SSSSN | PUSH 0
fd04fb41
AT
217
218@ Compare one word on each pass through this loop.
6cb31a3e 219@ TOS> counter, address, count, pattern
fd04fb41 220NSSVSSSTTTSSSSSSSSSSN | Mark: 00011100 00000000
6cb31a3e 221SNT | SWAP
fd04fb41 222SNS | DUP
6cb31a3e
AT
223SSSTTN | PUSH 3
224NSTTSTTN | JSR > 1011 (stackrotatereverse)
225SNS | DUP
226SSSTTN | PUSH 3
227NSTTSTTN | JSR > 1011 (stackrotatereverse)
fd04fb41
AT
228TSSS | ADD
229TTT | LOAD
6cb31a3e
AT
230SSSTSTN | PUSH 5
231NSTTTSSN | JSR > 1100 (deepdup)
fd04fb41 232TSST | SUBTRACT
6cb31a3e 233@ TOS> pattern-(address+counter), counter, address, count, pattern
fd04fb41 234NTSSSSTTTSSSSSSSSSTN | BRZ > 00011100 00000001
6cb31a3e
AT
235
236@ Test for end of loop by comparing 'counter' and 'count'.
fd04fb41 237SNS | DUP
6cb31a3e
AT
238SSSTSSN | PUSH 4
239NSTTTSSN | JSR > 1100 (deepdup)
fd04fb41 240TSST | SUBTRACT
6cb31a3e 241@ TOS> counter-count, counter, address, count, pattern
fd04fb41 242NTSSSSTTTSSSSSSSSTSN | BRZ > 00011100 00000010
6cb31a3e
AT
243
244@ Increment 'counter' and loop again.
fd04fb41
AT
245SSSTN | PUSH 1
246TSSS | ADD
247NSNSSSTTTSSSSSSSSSSN | JMP > 00011100 00000000
248
249@ Found a match. Clean up and return.
250NSSVSSSTTTSSSSSSSSSTN | Mark: 00011100 00000001
fd04fb41 251TSSS | ADD
6cb31a3e
AT
252SNT | SWAP
253SNN | DROP
254SNT | SWAP
255SNN | DROP
fd04fb41
AT
256NTN | RTS
257
258@ No match found. Clean up and return.
259NSSVSSSTTTSSSSSSSSTSN | Mark: 00011100 00000010
260SNN | DROP
bb21580a 261SNN | DROP
ae1f85a1 262SNN | DROP
6cb31a3e
AT
263SNN | DROP
264SSSSN | PUSH 0
ae1f85a1
AT
265NTN | 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 282NSSVTTTTSN | Mark: 11110 (slurp)
ae1f85a1
AT
283
284@ Load one word from heap on each pass.
23d17247
AT
285SNS | DUP
286SSSTTN | PUSH 3
287NSTTSTSN | JSR > 1010 (stackrotate)
288SNT | SWAP
289SNS | DUP
290SSSTTN | PUSH 3
291NSTTSTSN | JSR > 1010 (stackrotate)
ae1f85a1
AT
292TSSS | ADD
293TTT | LOAD
23d17247
AT
294SSSTTN | PUSH 3
295NSTTSTSN | JSR > 1010 (stackrotate)
296SNT | SWAP
ae1f85a1
AT
297
298@ Check for loop completion.
ae1f85a1 299SNS | DUP
23d17247 300NTSSSSTTTTSSSSSSSSSN | BRZ > 00011110 00000000
ae1f85a1
AT
301SSSTN | PUSH 1
302TSST | SUBTRACT
23d17247
AT
303NSNTTTTSN | JMP > 11110 (slurp)
304
305@ Clean up and return.
306NSSVSSSTTTTSSSSSSSSSN | Mark: 00011110 00000000
ae1f85a1
AT
307SNN | DROP
308SNN | DROP
309NTN | 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 330NSSVTTTTTN | Mark: 11111 (spew)
ae1f85a1 331
6cb31a3e 332@ Create a counter that doubles as a dest. pointer offset generator.
ae1f85a1 333SSSSN | PUSH 0
ae1f85a1
AT
334
335@ Store one word to heap on each pass.
336NSSVSSSTTTTTSSSSSSSSN | Mark: 00011111 00000000
6cb31a3e
AT
337SNS | DUP
338SSSTSSN | PUSH 4
339NSTTTSSN | JSR > 1100 (deepdup)
ae1f85a1 340TSSS | ADD
6cb31a3e
AT
341SSSTSTN | PUSH 5
342NSTTSTTN | JSR > 1011 (stackrotatereverse)
ae1f85a1
AT
343TTS | STORE
344
345@ Check for loop completion.
6cb31a3e
AT
346SNT | SWAP
347SNS | DUP
348SSSTTN | PUSH 3
349NSTTSTTN | JSR > 1011 (stackrotatereverse)
350SNS | DUP
351SSSTTN | PUSH 3
352NSTTSTTN | JSR > 1011 (stackrotatereverse)
ae1f85a1
AT
353TSST | SUBTRACT
354NTSSSSTTTTTSSSSSSSTN | BRZ > 00011111 00000001
355
6cb31a3e
AT
356@ Increment counter.
357SSSTN | PUSH 1
ae1f85a1 358TSSS | ADD
bb21580a
AT
359NSNSSSTTTTTSSSSSSSSN | JMP > 00011111 00000000
360
361@ Clean up and return.
362NSSVSSSTTTTTSSSSSSSTN | Mark: 00011111 00000001
6cb31a3e
AT
363SNN | DROP
364SNN | DROP
365SNN | DROP
bb21580a 366NTN | RTS
d63de3fa 367
3695b659 368#endif