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