Added printf and stackrotate functions to VVS 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@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
16NSSVTTSSSN | Mark: 11000 (memset)
bb21580a 17SSSTTN | PUSH 3
ae1f85a1 18NSTTSSSSSTN | JSR > 1000001 (spewreg)
3695b659 19
bb21580a 20@ Store 'pattern' into one memory location on each pass through this loop.
3695b659 21NSSVSSSTTSSSSSSSSSSSN | Mark: 00011000 00000000
3695b659
AT
22SSSTN | PUSH 1 (ptr)
23TTT | LOAD
3695b659
AT
24SSSTSN | PUSH 2 (ptr)
25TTT | LOAD
bb21580a
AT
26TSSS | ADD
27SSSTTN | PUSH 3 (ptr)
28TTT | LOAD
3695b659
AT
29TTS | STORE
30
bb21580a
AT
31@ Decrement and check for loop end condition 'count == 0'.
32SSSTN | PUSH 1 (ptr)
3695b659
AT
33TTT | LOAD
34SNS | DUP
35NTSSSSTTSSSSSSSSSSTN | BRZ > 00011000 00000001
36SSSTN | PUSH 1
37TSST | SUBTRACT
bb21580a 38SSSTN | PUSH 1 (ptr)
3695b659
AT
39SNT | SWAP
40TTS | STORE
41NSNSSSTTSSSSSSSSSSSN | JMP > 00011000 00000000
42
43@ Clean up and return
44NSSVSSSTTSSSSSSSSSSTN | Mark: 00011000 00000001
45SNN | DROP
46NTN | RTS
47
3d75b928 48@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
bb21580a
AT
49@ Name:
50@ memcpy (11001)
3d75b928 51@ Description:
bb21580a 52@ Copies 'count+1' words from 'source' to 'destination'.
3d75b928
AT
53@ Call Stack:
54@ source
55@ destination
56@ count <-- TOS
57@ Return Stack:
58@ <empty>
59@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
60NSSVTTSSTN | Mark: 11001 (memcpy)
bb21580a 61SSSTTN | PUSH 3
ae1f85a1 62NSTTSSSSSTN | JSR > 1000001 (spewreg)
3d75b928
AT
63
64@ Copy one word on each pass through this loop.
65NSSVSSSTTSSTSSSSSSSSN | Mark: 00011001 00000000
bb21580a 66SSSTSN | PUSH 2 (ptr)
3d75b928 67TTT | LOAD
bb21580a 68SSSTN | PUSH 1 (ptr)
3d75b928
AT
69TTT | LOAD
70TSSS | ADD
bb21580a 71SSSTTN | PUSH 3 (ptr)
3d75b928 72TTT | LOAD
bb21580a 73SSSTN | PUSH 1 (ptr)
3d75b928
AT
74TTT | LOAD
75TSSS | ADD
76TTT | LOAD
77TTS | STORE
78
79@ Decrement and check for loop end conditions.
bb21580a 80SSSTN | PUSH 1 (ptr)
3d75b928
AT
81TTT | LOAD
82SNS | DUP
83NTSSSSTTSSTSSSSSSSTN | BRZ > 00011001 00000001
84SSSTN | PUSH 1
85TSST | SUBTRACT
bb21580a 86SSSTN | PUSH 1 (ptr)
3d75b928
AT
87SNT | SWAP
88TTS | STORE
89NSNSSSTTSSTSSSSSSSSN | JMP > 00011001 00000000
90
91@ Clean up and return
92NSSVSSSTTSSTSSSSSSSTN | Mark: 00011001 00000001
93SNN | DROP
94NTN | RTS
95
d63de3fa 96@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
bb21580a
AT
97@ Name:
98@ memrand (11010)
d63de3fa 99@ Description:
bb21580a 100@ Writes random words into memory locations 'startaddr' to 'startaddr+count'.
d63de3fa
AT
101@ Call Stack:
102@ count
103@ startaddr <-- TOS
104@ Return Stack:
105@ <empty>
106@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
bb21580a 107#include <math.pvvs>
d63de3fa 108NSSVTTSTSN | Mark: 11010 (memrand)
bb21580a 109SSSTN | PUSH 1
ae1f85a1 110NSTTSSSSSTN | JSR > 1000001 (spewreg)
d63de3fa
AT
111
112@ Store random word into one memory location on each pass through this loop.
113NSSVSSSTTSTSSSSSSSSSN | Mark: 00011010 00000000
114SNS | DUP
bb21580a 115SSSTN | PUSH 1 (ptr)
d63de3fa
AT
116TTT | LOAD
117TSSS | ADD
118NSTTSSSSN | JSR > 10000 (random)
119TTS | STORE
120
121@ Decrement and check loop end conditions
122SNS | DUP
123NTSSSSTTSTSSSSSSSSTN | BRZ > 00011010 00000001
124SSSTN | PUSH 1
125TSST | SUBTRACT
126NSNSSSTTSTSSSSSSSSSN | JMP > 00011010 00000000
127
d63de3fa
AT
128@ Clean up and return
129NSSVSSSTTSTSSSSSSSSTN | Mark: 00011010 00000001
130SNN | DROP
131NTN | RTS
132
87d27426 133@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
bb21580a
AT
134@ Name:
135@ memcmp (11011)
87d27426 136@ Description:
bb21580a 137@ Compares two blocks of memory:
87d27426
AT
138@ blk1ptr -> blk1ptr+count
139@ -- versus --
140@ blk2ptr -> blk2ptr+count
141@ The return value is zero if the blocks are identical, otherwise non-zero.
142@ Call Stack:
143@ count
144@ blk1ptr
145@ blk2ptr <-- TOS
146@ Return Stack:
147@ retvalue <-- TOS
148@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
149NSSVTTSTTN | Mark: 11011 (memcmp)
bb21580a 150SSSTSN | PUSH 2
ae1f85a1 151NSTTSSSSSTN | JSR > 1000001 (spewreg)
87d27426
AT
152
153@ Compare one word on each pass through this loop.
154NSSVSSSTTSTTSSSSSSSSN | Mark: 00011011 00000000
155SNS | DUP
156SNS | DUP
bb21580a 157SSSTN | PUSH 1 (ptr)
87d27426
AT
158TTT | LOAD
159TSSS | ADD
160TTT | LOAD
161SNT | SWAP
bb21580a 162SSTSN | PUSH 2 (ptr)
87d27426
AT
163TTT | LOAD
164TSSS | ADD
165TTT | LOAD
166TSST | SUBTRACT
167NTSSSSTTSTTSSSSSSTSN | BRZ > 00011011 00000010 (jump if words match)
168
169@ Return 'match? = false'
170SNN | DROP
171SSSTN | PUSH 1
172NTN | RTS
173
d00258fa 174@ Decrement and loop again if loop is not complete.
87d27426
AT
175NSSVSSSTTSTTSSSSSSTSN | Mark: 00011011 00000010
176SNS | DUP
177NTSSSSTTSTTSSSSSSSTN | BRZ > 00011011 00000001 (jump if loop is complete)
178SSSTN | PUSH 1
179TSST | SUBTRACT
180NSNSSSTTSTTSSSSSSSSN | JMP > 00011011 00000000
181
182@ Return 'match? = true'
183NSSVSSSTTSTTSSSSSSSTN | Mark: 00011011 00000001
184SNN | DROP
185SSSSN | PUSH 0
186NTN | RTS
187
fd04fb41 188@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
bb21580a
AT
189@ Name:
190@ memsrch (11100)
fd04fb41 191@ Description:
bb21580a
AT
192@ Searches the heap from 'address' to 'address+count'.
193@ If 'pattern' is found, the return value is a pointer to the matching word.
fd04fb41
AT
194@ If not found, the return value is a null pointer.
195@ Call Stack:
196@ pattern
197@ count
198@ address <-- TOS
199@ Return Stack:
200@ pointer <-- TOS
201@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
202NSSVTTTSSN | Mark: 11100 (memsrch)
bb21580a 203SSSTTN | PUSH 3
ae1f85a1 204NSTTSSSSSTN | JSR > 1000001 (spewreg)
fd04fb41
AT
205
206@ Compare one word on each pass through this loop.
207NSSVSSSTTTSSSSSSSSSSN | Mark: 00011100 00000000
208SNS | DUP
bb21580a 209SSSTN | PUSH 1 (ptr)
fd04fb41
AT
210TTT | LOAD
211TSSS | ADD
212TTT | LOAD
bb21580a 213SSSTTN | PUSH 3 (ptr)
fd04fb41
AT
214TTT | LOAD
215TSST | SUBTRACT
216NTSSSSTTTSSSSSSSSSTN | BRZ > 00011100 00000001
217SNS | DUP
bb21580a 218SSSTSN | PUSH 2 (ptr)
fd04fb41
AT
219TTT | LOAD
220TSST | SUBTRACT
221NTSSSSTTTSSSSSSSSTSN | BRZ > 00011100 00000010
222SSSTN | PUSH 1
223TSSS | ADD
224NSNSSSTTTSSSSSSSSSSN | JMP > 00011100 00000000
225
226@ Found a match. Clean up and return.
227NSSVSSSTTTSSSSSSSSSTN | Mark: 00011100 00000001
bb21580a 228SSSTN | PUSH 1 (ptr)
fd04fb41
AT
229TTT | LOAD
230TSSS | ADD
231NTN | RTS
232
233@ No match found. Clean up and return.
234NSSVSSSTTTSSSSSSSSTSN | Mark: 00011100 00000010
235SNN | DROP
236SSSSN | PUSH 0
237NTN | RTS
238
bb21580a
AT
239@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
240@ Name:
ae1f85a1 241@ slurpreg (1000000)
bb21580a 242@ Description:
ae1f85a1 243@ Reads 'count' values from heap to stack in complementary order to 'spewreg'.
bb21580a
AT
244@ Call Stack:
245@ count
246@ Return Stack:
247@ heap[count]
248@ ...
249@ heap[2]
250@ heap[1] <-- TOS
251@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
ae1f85a1 252NSSVTSSSSSSN | Mark: 1000000 (slurpreg)
bb21580a
AT
253
254@ Load one word from heap on each pass.
ae1f85a1 255NSSVSTSSSSSSSSSSSSSSN | Mark: 01000000 00000000
bb21580a
AT
256SNS | DUP
257TTT | LOAD
258SNT | SWAP
259
260@ Check for loop completion.
261@ As a side effect, prepare the next address.
262SSSTN | PUSH 1
263TSST | SUBTRACT
264SNS | DUP
ae1f85a1
AT
265NTSSTSSSSSSSSSSSSSTN | BRZ > 01000000 00000001
266NSNSTSSSSSSSSSSSSSSN | JMP > 01000000 00000000
267NSSVSTSSSSSSSSSSSSSTN | Mark: 01000000 00000001
bb21580a
AT
268SNN | DROP
269NTN | RTS
270
271@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
272@ Name:
ae1f85a1 273@ spewreg (1000001)
bb21580a
AT
274@ Description:
275@ Writes 'count' values from stack to heap in this order:
276@ TOS -> heap[1]
277@ TOS+1 -> heap[2]
278@ ...
279@ TOS+n -> heap[count]
0425a4c6
AT
280@ This function uses heap[15] for temporary storage, thus limiting the total
281@ registers to 14 since heap[0] is reserved. Since this function populates
282@ the registers, encoding the value here seems a natural location to document
283@ the limit. TODO: Should this be turned into a CPP define?
bb21580a
AT
284@ Call Stack:
285@ data-words
286@ ...
287@ data-words
288@ count <-- TOS
289@ Return Stack:
290@ <empty>
291@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
ae1f85a1 292NSSVTSSSSSTN | Mark: 1000001 (spewreg)
bb21580a 293
23d17247
AT
294@ To simplify other functions, sprewreg shall accept 0 as a valid count value.
295SNS | DUP
296NTSSTSSSSSTSSSSSSSTN | BRZ > 01000001 00000001
297
0425a4c6
AT
298@ Create a counter in heap[15] that doubles as a destination pointer generator.
299SSSTTTTN | PUSH 15 (ptr)
bb21580a
AT
300SSSTN | PUSH 1
301TTS | STORE
302
303@ Store one word to heap on each pass.
ae1f85a1 304NSSVSTSSSSSTSSSSSSSSN | Mark: 01000001 00000000
bb21580a 305SNT | SWAP
0425a4c6 306SSSTTTTN | PUSH 15 (ptr)
bb21580a
AT
307TTT | LOAD
308SNT | SWAP
309TTS | STORE
310
311@ Check for loop completion.
312SNS | DUP
0425a4c6 313SSSTTTTN | PUSH 15 (ptr)
bb21580a
AT
314TTT | LOAD
315TSST | SUBTRACT
ae1f85a1 316NTSSTSSSSSTSSSSSSSTN | BRZ > 01000001 00000001
bb21580a 317
0425a4c6
AT
318@ Increment heap[15] if continuing.
319SSSTTTTN | PUSH 15 (ptr)
bb21580a
AT
320SNS | DUP
321TTT | LOAD
322SSSTN | PUSH 1
323TSSS | ADD
324TTS | STORE
ae1f85a1
AT
325NSNSTSSSSSTSSSSSSSSN | JMP > 01000001 00000000
326
327@ Clean up and return.
328NSSVSTSSSSSTSSSSSSSTN | Mark: 01000001 00000001
329SNN | DROP
330NTN | RTS
331
332@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
333@ Name:
334@ slurp (11110)
335@ Description:
336@ Reads values from heap to stack in complementary order to 'spew'.
337@ Call Stack:
338@ address
339@ count <-- TOS
340@ Return Stack:
341@ heap[address+count]
342@ ...
343@ heap[address+1]
344@ heap[address] <-- TOS
345@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
346NSSVTTTTSN | Mark: 11110 (slurp)
ae1f85a1
AT
347
348@ Load one word from heap on each pass.
23d17247
AT
349SNS | DUP
350SSSTTN | PUSH 3
351NSTTSTSN | JSR > 1010 (stackrotate)
352SNT | SWAP
353SNS | DUP
354SSSTTN | PUSH 3
355NSTTSTSN | JSR > 1010 (stackrotate)
ae1f85a1
AT
356TSSS | ADD
357TTT | LOAD
23d17247
AT
358SSSTTN | PUSH 3
359NSTTSTSN | JSR > 1010 (stackrotate)
360SNT | SWAP
ae1f85a1
AT
361
362@ Check for loop completion.
ae1f85a1 363SNS | DUP
23d17247 364NTSSSSTTTTSSSSSSSSSN | BRZ > 00011110 00000000
ae1f85a1
AT
365SSSTN | PUSH 1
366TSST | SUBTRACT
23d17247
AT
367NSNTTTTSN | JMP > 11110 (slurp)
368
369@ Clean up and return.
370NSSVSSSTTTTSSSSSSSSSN | Mark: 00011110 00000000
ae1f85a1
AT
371SNN | DROP
372SNN | DROP
373NTN | RTS
374
375@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
376@ Name:
377@ spew (11111)
378@ Description:
379@ Writes values from stack to heap in this order:
380@ TOS -> heap[address]
381@ TOS+1 -> heap[address+1]
382@ ...
383@ TOS+n -> heap[address+count]
384@ Call Stack:
385@ data-words
386@ ...
387@ data-words
388@ address
389@ count <-- TOS
390@ Return Stack:
391@ <empty>
392@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
393NSSVTTTTTN | Mark: 11111 (spew)
394SSSTSN | PUSH 2
395NSTTSSSSSTN | JSR > 1000001 (spewreg)
396
397@ Create a counter in heap[3] that doubles as a dest. pointer offset generator.
398SSSTTN | PUSH 3 (ptr)
399SSSSN | PUSH 0
400TTS | STORE
401
402@ Store one word to heap on each pass.
403NSSVSSSTTTTTSSSSSSSSN | Mark: 00011111 00000000
404SSSTSN | PUSH 2 (ptr)
405TTT | LOAD
406SSSTTN | PUSH 3 (ptr)
407TTT | LOAD
408TSSS | ADD
409SNT | SWAP
410TTS | STORE
411
412@ Check for loop completion.
413SSSTN | PUSH 1 (ptr)
414TTT | LOAD
415SSSTTN | PUSH 3 (ptr)
416TTT | LOAD
417TSST | SUBTRACT
418NTSSSSTTTTTSSSSSSSTN | BRZ > 00011111 00000001
419
420@ Increment heap[3] if continuing.
421SSSTTN | PUSH 3 (ptr)
422SNS | DUP
423TTT | LOAD
424SSSTN | PUSH 1
425TSSS | ADD
426TTS | STORE
bb21580a
AT
427NSNSSSTTTTTSSSSSSSSN | JMP > 00011111 00000000
428
429@ Clean up and return.
430NSSVSSSTTTTTSSSSSSSTN | Mark: 00011111 00000001
bb21580a 431NTN | RTS
d63de3fa 432
3695b659 433#endif