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