Added bitwise AND subroutine to VVS stdlib.
[vvhitespace] / stdlib / stack.pvvs
CommitLineData
23d17247
AT
1#ifndef VVS_STDLIB_STACK
2#define VVS_STDLIB_STACK
3
4@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
5@ Name:
6@ stackrotate
7@ Description:
8@ Maximum rotation depth is five. Stomps on heap[9]-heap[14].
9@ Assumes rotation depth greater than two, otherwise use SWAP.
10@ Call Stack:
11@ stack word n
12@ ...
13@ stack word 1
14@ rotation depth (rd) <-- TOS
15@ Return Stack (n>rd=3):
16@ stack word n
17@ ...
18@ stack word 1
19@ stack word 3
20@ stack word 2 <-- TOS
21@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
22NSSVTSTSN | Mark: 1010 (stackrotate)
23
24@ For the convenience of other functions, modulo the
25@ rotation depth by the available registers.
26SSSTSTN | PUSH 5
27TSTT | MODULO
28
29@ Use heap[14] for generating register addresses.
30SSSTTTSN | PUSH 14 (ptr)
31SSSSN | PUSH 0
32TTS | STORE
33
34@ Dump one word from stack to heap each pass through the loop.
35NSSVSSSSTSTSSSSSSSSSN | Mark: 00001010 00000000
36SNT | SWAP
37SSSTSSTN | PUSH 9 (starting register)
38SSSTTTSN | PUSH 14 (ptr)
39TTT | LOAD
40TSSS | ADD
41SNT | SWAP
42TTS | STORE
43
44@ See if the loop is complete.
45SNS | DUP
46SSSTTTSN | PUSH 14 (ptr)
47TTT | LOAD
48SSSTN | PUSH 1
49TSSS | ADD
50TSST | SUBTRACT
51NTSSSSSTSTSSSSSSSSTN | BRZ > 00001010 00000001
52
53@ Increment the loop counter
54SSSTTTSN | PUSH 14 (ptr)
55TTT | LOAD
56SSSTN | PUSH 1
57TSSS | ADD
58SSSTTTSN | PUSH 14 (ptr)
59SNT | SWAP
60TTS | STORE
61NSNSSSSTSTSSSSSSSSSN | JMP > 00001010 00000000
62
63@ The correct number of words have been stored to registers.
64@ Time to read them back in rotated order.
65
66@ First, prepare the counter in heap[14] again.
67@ This consumes 'rd' from the stack.
68NSSVSSSSTSTSSSSSSSSTN | Mark: 00001010 00000001
69SSSTN | PUSH 1
70TSST | SUBTRACT
71SSSTTTSN | PUSH 14 (ptr)
72SNT | SWAP
73TTS | STORE
74
75@ Second, read in the old TOS manually.
76SSSTSSTN | PUSH 9 (starting register)
77TTT | LOAD
78
79@ Read one word per pass through this loop.
80NSSVSSSSTSTSSSSSSSTSN | Mark: 00001010 00000010
81SSSTSSTN | PUSH 9 (starting register)
82SSSTTTSN | PUSH 14 (ptr)
83TTT | LOAD
84TSSS | ADD
85TTT | LOAD
86
87@ See if the loop is complete.
88SSSTTTSN | PUSH 14 (ptr)
89TTT | LOAD
90SSSTN | PUSH 1
91TSST | SUBTRACT
92NTSSSSSTSTSSSSSSSTTN | BRZ > 00001010 00000011
93
94@ Decrement the loop counter and loop again.
95SSSTTTSN | PUSH 14 (ptr)
96TTT | LOAD
97SSSTN | PUSH 1
98TSST | SUBTRACT
99SSSTTTSN | PUSH 14 (ptr)
100SNT | SWAP
101TTS | STORE
102NSNSSSSTSTSSSSSSSTSN | JMP > 00001010 00000010
103
104@ Return
105NSSVSSSSTSTSSSSSSSTTN | Mark: 00001010 00000011
106NTN | RTS
107
a67867ae
AT
108@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
109@ Name:
110@ stackrotatereverse
111@ Description:
112@ Maximum rotation depth is five. Stomps on heap[9]-heap[14].
113@ Assumes rotation depth greater than two, otherwise use SWAP.
114@ Call Stack:
115@ stack word n
116@ ...
117@ stack word 1
118@ rotation depth (rd) <-- TOS
119@ Return Stack (n>rd=3):
120@ stack word n
121@ ...
122@ stack word 2
123@ stack word 1
124@ stack word 3 <-- TOS
125@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
126NSSVTSTTN | Mark: 1011 (stackrotatereverse)
127
128@ For the convenience of other functions, modulo the
129@ rotation depth by the available registers.
130SSSTSTN | PUSH 5
131TSTT | MODULO
132
133@ Use heap[14] for generating register addresses.
134SSSTTTSN | PUSH 14 (ptr)
135SSSSN | PUSH 0
136TTS | STORE
137
138@ Dump one word from stack to heap each pass through the loop.
139NSSVSSSSTSTTSSSSSSSSN | Mark: 00001011 00000000
140SNT | SWAP
141SSSTSSTN | PUSH 9 (starting register)
142SSSTTTSN | PUSH 14 (ptr)
143TTT | LOAD
144TSSS | ADD
145SNT | SWAP
146TTS | STORE
147
148@ See if the loop is complete.
149SNS | DUP
150SSSTTTSN | PUSH 14 (ptr)
151TTT | LOAD
152SSSTN | PUSH 1
153TSSS | ADD
154TSST | SUBTRACT
155NTSSSSSTSTTSSSSSSSTN | BRZ > 00001011 00000001
156
157@ Increment the loop counter
158SSSTTTSN | PUSH 14 (ptr)
159TTT | LOAD
160SSSTN | PUSH 1
161TSSS | ADD
162SSSTTTSN | PUSH 14 (ptr)
163SNT | SWAP
164TTS | STORE
165NSNSSSSTSTTSSSSSSSSN | JMP > 00001011 00000000
166
167@ The correct number of words have been stored to registers.
168@ Time to read them back in rotated order.
169
170@ First, prepare the counter in heap[14] again.
171NSSVSSSSTSTTSSSSSSSTN | Mark: 00001011 00000001
172SSSTN | PUSH 1
173TSST | SUBTRACT
174SNS | DUP
175SSSTN | PUSH 1
176TSST | SUBTRACT
177SSSTTTSN | PUSH 14 (ptr)
178SNT | SWAP
179TTS | STORE
180
181@ Read one word per pass through this loop.
182@ Store it behind 'rd' on the stack.
183NSSVSSSSTSTTSSSSSSTSN | Mark: 00001011 00000010
184SSSTSSTN | PUSH 9 (starting register)
185SSSTTTSN | PUSH 14 (ptr)
186TTT | LOAD
187TSSS | ADD
188TTT | LOAD
189SNT | SWAP
190
191@ See if the loop is complete.
192SSSTTTSN | PUSH 14 (ptr)
193TTT | LOAD
194NTSSSSSTSTTSSSSSSTTN | BRZ > 00001011 00000011
195
196@ Decrement the loop counter and loop again.
197SSSTTTSN | PUSH 14 (ptr)
198TTT | LOAD
199SSSTN | PUSH 1
200TSST | SUBTRACT
201SSSTTTSN | PUSH 14 (ptr)
202SNT | SWAP
203TTS | STORE
204NSNSSSSTSTTSSSSSSTSN | JMP > 00001011 00000010
205
206@ Read in the final value manually and return.
207NSSVSSSSTSTTSSSSSSTTN | Mark: 00001011 00000011
208SSSTSSTN | PUSH 9 (starting register)
209TSSS | ADD
210TTT | LOAD
211NTN | RTS
212
f0499c77
AT
213@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
214@ Name:
215@ deepdup
216@ Description:
217@ Duplicates an item deep on the stack, placing the duplicate on TOS.
218@ By default, maximum depth is 11.
219@ True maximum depth is (max depth of stackrotate & stackrotatereverse)-3.
220@ Call Stack:
221@ stack word n
222@ ...
223@ stack word 1
224@ dupdepth <-- TOS
225@ Return Stack:
226@ stack word n
227@ ...
228@ stack word 1
229@ copy of stack word 3 <-- TOS
230@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
231NSSVTTSSN | Mark: 1100 (deepdup)
232
233@ Copy 'dupdepth' and use it to bring forth the desired stack word.
234SNS | DUP
235SSSTN | PUSH 1
236TSSS | ADD
237NSTTSTTN | JSR > 1011 (stackrotatereverse)
238
239@ Copy the desired stack word and return it back into the stack.
240SNS | DUP
241SSSTTN | PUSH 3
242NSTTSTTN | JSR > 1011 (stackrotatereverse)
243SSSTN | PUSH 1
244TSSS | ADD
245NSTTSTSN | JSR > 1010 (stackrotate)
246NTN | RTS
247
23d17247 248#endif
a67867ae 249