Added memsrch function to VVS stdlib.
[vvhitespace] / stdlib / heap.pvvs
CommitLineData
3695b659
AT
1#ifndef VVS_STDLIB_HEAP
2#define VVS_STDLIB_HEAP
3
4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
5@ Description:
6@ This function writes pattern into the memory locations:
3d75b928 7@ startaddr -> startaddr+count
3695b659
AT
8@ Call Stack:
9@ pattern
10@ startaddr
3d75b928 11@ count <-- TOS
3695b659
AT
12@ Return Stack:
13@ <empty>
14@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
15NSSVTTSSSN | Mark: 11000 (memset)
16
17@ Prepare the stack for computation.
18@ Addr | Contents
3d75b928 19@ 0 | count
3695b659
AT
20@ 1 | startaddr
21@ 2 | pattern
22
23SSSSN | PUSH 0 (ptr)
24SNT | SWAP
25TTS | STORE
26SSSTN | PUSH 1 (ptr)
27SNT | SWAP
28TTS | STORE
29SSSTSN | PUSH 2 (ptr)
30SNT | SWAP
31TTS | STORE
32
33@ Store pattern into one memory location on each pass through this loop.
34NSSVSSSTTSSSSSSSSSSSN | Mark: 00011000 00000000
35SSSSN | PUSH 0 (ptr)
36TTT | LOAD
37SSSTN | PUSH 1 (ptr)
38TTT | LOAD
39TSSS | ADD
40SSSTSN | PUSH 2 (ptr)
41TTT | LOAD
42TTS | STORE
43
3d75b928 44@ Decrement and check for loop end condition count == 0.
3695b659
AT
45SSSSN | PUSH 0 (ptr)
46TTT | LOAD
47SNS | DUP
48NTSSSSTTSSSSSSSSSSTN | BRZ > 00011000 00000001
49SSSTN | PUSH 1
50TSST | SUBTRACT
51SSSSN | PUSH 0 (ptr)
52SNT | SWAP
53TTS | STORE
54NSNSSSTTSSSSSSSSSSSN | JMP > 00011000 00000000
55
56@ Clean up and return
57NSSVSSSTTSSSSSSSSSSTN | Mark: 00011000 00000001
58SNN | DROP
59NTN | RTS
60
3d75b928
AT
61@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
62@ Description:
63@ This function copies count+1 words from source to destination.
64@ Call Stack:
65@ source
66@ destination
67@ count <-- TOS
68@ Return Stack:
69@ <empty>
70@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
71NSSVTTSSTN | Mark: 11001 (memcpy)
72
73@ Prepare the stack for computation.
74@ Addr | Contents
75@ 0 | count
76@ 1 | destination
77@ 2 | source
78
79SSSSN | PUSH 0 (ptr)
80SNT | SWAP
81TTS | STORE
82SSSTN | PUSH 1 (ptr)
83SNT | SWAP
84TTS | STORE
85SSSTSN | PUSH 2 (ptr)
86SNT | SWAP
87TTS | STORE
88
89@ Copy one word on each pass through this loop.
90NSSVSSSTTSSTSSSSSSSSN | Mark: 00011001 00000000
91SSSTN | PUSH 1 (ptr)
92TTT | LOAD
93SSSSN | PUSH 0 (ptr)
94TTT | LOAD
95TSSS | ADD
96SSSTSN | PUSH 2 (ptr)
97TTT | LOAD
98SSSSN | PUSH 0 (ptr)
99TTT | LOAD
100TSSS | ADD
101TTT | LOAD
102TTS | STORE
103
104@ Decrement and check for loop end conditions.
105SSSSN | PUSH 0 (ptr)
106TTT | LOAD
107SNS | DUP
108NTSSSSTTSSTSSSSSSSTN | BRZ > 00011001 00000001
109SSSTN | PUSH 1
110TSST | SUBTRACT
111SSSSN | PUSH 0 (ptr)
112SNT | SWAP
113TTS | STORE
114NSNSSSTTSSTSSSSSSSSN | JMP > 00011001 00000000
115
116@ Clean up and return
117NSSVSSSTTSSTSSSSSSSTN | Mark: 00011001 00000001
118SNN | DROP
119NTN | RTS
120
d63de3fa
AT
121@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
122@ Description:
123@ This function writes random words into the memory locations:
124@ startaddr -> startaddr+count
125@ Call Stack:
126@ count
127@ startaddr <-- TOS
128@ Return Stack:
129@ <empty>
130@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
131NSSVTTSTSN | Mark: 11010 (memrand)
132SSSSN | PUSH 0 (ptr)
133SNT | SWAP
134TTS | STORE
135
136@ Store random word into one memory location on each pass through this loop.
137NSSVSSSTTSTSSSSSSSSSN | Mark: 00011010 00000000
138SNS | DUP
139SSSSN | PUSH 0 (ptr)
140TTT | LOAD
141TSSS | ADD
142NSTTSSSSN | JSR > 10000 (random)
143TTS | STORE
144
145@ Decrement and check loop end conditions
146SNS | DUP
147NTSSSSTTSTSSSSSSSSTN | BRZ > 00011010 00000001
148SSSTN | PUSH 1
149TSST | SUBTRACT
150NSNSSSTTSTSSSSSSSSSN | JMP > 00011010 00000000
151
d63de3fa
AT
152@ Clean up and return
153NSSVSSSTTSTSSSSSSSSTN | Mark: 00011010 00000001
154SNN | DROP
155NTN | RTS
156
87d27426
AT
157@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
158@ Description:
159@ This function compares two blocks of memory:
160@ blk1ptr -> blk1ptr+count
161@ -- versus --
162@ blk2ptr -> blk2ptr+count
163@ The return value is zero if the blocks are identical, otherwise non-zero.
164@ Call Stack:
165@ count
166@ blk1ptr
167@ blk2ptr <-- TOS
168@ Return Stack:
169@ retvalue <-- TOS
170@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
171NSSVTTSTTN | Mark: 11011 (memcmp)
172
173@ Prepare the stack for computation.
174@ Addr | Contents
175@ 0 | blk2ptr
176@ 1 | blk1ptr
177
178SSSSN | PUSH 0 (ptr)
179SNT | SWAP
180TTS | STORE
181SSSTN | PUSH 1 (ptr)
182SNT | SWAP
183TTS | STORE
184
185@ Compare one word on each pass through this loop.
186NSSVSSSTTSTTSSSSSSSSN | Mark: 00011011 00000000
187SNS | DUP
188SNS | DUP
189SSSSN | PUSH 0 (ptr)
190TTT | LOAD
191TSSS | ADD
192TTT | LOAD
193SNT | SWAP
194SSSTN | PUSH 1 (ptr)
195TTT | LOAD
196TSSS | ADD
197TTT | LOAD
198TSST | SUBTRACT
199NTSSSSTTSTTSSSSSSTSN | BRZ > 00011011 00000010 (jump if words match)
200
201@ Return 'match? = false'
202SNN | DROP
203SSSTN | PUSH 1
204NTN | RTS
205
d00258fa 206@ Decrement and loop again if loop is not complete.
87d27426
AT
207NSSVSSSTTSTTSSSSSSTSN | Mark: 00011011 00000010
208SNS | DUP
209NTSSSSTTSTTSSSSSSSTN | BRZ > 00011011 00000001 (jump if loop is complete)
210SSSTN | PUSH 1
211TSST | SUBTRACT
212NSNSSSTTSTTSSSSSSSSN | JMP > 00011011 00000000
213
214@ Return 'match? = true'
215NSSVSSSTTSTTSSSSSSSTN | Mark: 00011011 00000001
216SNN | DROP
217SSSSN | PUSH 0
218NTN | RTS
219
fd04fb41
AT
220@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
221@ Description:
222@ This function searches the heap from address to address+count.
223@ If pattern is found, the return value is a pointer to the matching word.
224@ If not found, the return value is a null pointer.
225@ Call Stack:
226@ pattern
227@ count
228@ address <-- TOS
229@ Return Stack:
230@ pointer <-- TOS
231@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
232NSSVTTTSSN | Mark: 11100 (memsrch)
233
234@ Prepare the stack for computation.
235@ Stack:
236@ offset <-- TOS
237@ Addr | Contents
238@ 0 | address
239@ 1 | count
240@ 2 | pattern
241
242SSSSN | PUSH 0 (ptr)
243SNT | SWAP
244TTS | STORE
245SSSTN | PUSH 1 (ptr)
246SNT | SWAP
247TTS | STORE
248SSSTSN | PUSH 2 (ptr)
249SNT | SWAP
250TTS | STORE
251
252@ Compare one word on each pass through this loop.
253NSSVSSSTTTSSSSSSSSSSN | Mark: 00011100 00000000
254SNS | DUP
255SSSSN | PUSH 0 (ptr)
256TTT | LOAD
257TSSS | ADD
258TTT | LOAD
259SSSTSN | PUSH 2 (ptr)
260TTT | LOAD
261TSST | SUBTRACT
262NTSSSSTTTSSSSSSSSSTN | BRZ > 00011100 00000001
263SNS | DUP
264SSSTN | PUSH 1 (ptr)
265TTT | LOAD
266TSST | SUBTRACT
267NTSSSSTTTSSSSSSSSTSN | BRZ > 00011100 00000010
268SSSTN | PUSH 1
269TSSS | ADD
270NSNSSSTTTSSSSSSSSSSN | JMP > 00011100 00000000
271
272@ Found a match. Clean up and return.
273NSSVSSSTTTSSSSSSSSSTN | Mark: 00011100 00000001
274SSSSN | PUSH 0 (ptr)
275TTT | LOAD
276TSSS | ADD
277NTN | RTS
278
279@ No match found. Clean up and return.
280NSSVSSSTTTSSSSSSSSTSN | Mark: 00011100 00000010
281SNN | DROP
282SSSSN | PUSH 0
283NTN | RTS
284
d63de3fa
AT
285#include <math.pvvs>
286
3695b659 287#endif