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