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