Commit | Line | Data |
---|---|---|
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 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
22 | NSSVTSTSN | Mark: 1010 (stackrotate) | |
23 | ||
24 | @ For the convenience of other functions, modulo the | |
25 | @ rotation depth by the available registers. | |
26 | SSSTSTN | PUSH 5 | |
27 | TSTT | MODULO | |
28 | ||
29 | @ Use heap[14] for generating register addresses. | |
30 | SSSTTTSN | PUSH 14 (ptr) | |
31 | SSSSN | PUSH 0 | |
32 | TTS | STORE | |
33 | ||
34 | @ Dump one word from stack to heap each pass through the loop. | |
35 | NSSVSSSSTSTSSSSSSSSSN | Mark: 00001010 00000000 | |
36 | SNT | SWAP | |
37 | SSSTSSTN | PUSH 9 (starting register) | |
38 | SSSTTTSN | PUSH 14 (ptr) | |
39 | TTT | LOAD | |
40 | TSSS | ADD | |
41 | SNT | SWAP | |
42 | TTS | STORE | |
43 | ||
44 | @ See if the loop is complete. | |
45 | SNS | DUP | |
46 | SSSTTTSN | PUSH 14 (ptr) | |
47 | TTT | LOAD | |
48 | SSSTN | PUSH 1 | |
49 | TSSS | ADD | |
50 | TSST | SUBTRACT | |
51 | NTSSSSSTSTSSSSSSSSTN | BRZ > 00001010 00000001 | |
52 | ||
53 | @ Increment the loop counter | |
54 | SSSTTTSN | PUSH 14 (ptr) | |
55 | TTT | LOAD | |
56 | SSSTN | PUSH 1 | |
57 | TSSS | ADD | |
58 | SSSTTTSN | PUSH 14 (ptr) | |
59 | SNT | SWAP | |
60 | TTS | STORE | |
61 | NSNSSSSTSTSSSSSSSSSN | 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. | |
68 | NSSVSSSSTSTSSSSSSSSTN | Mark: 00001010 00000001 | |
69 | SSSTN | PUSH 1 | |
70 | TSST | SUBTRACT | |
71 | SSSTTTSN | PUSH 14 (ptr) | |
72 | SNT | SWAP | |
73 | TTS | STORE | |
74 | ||
75 | @ Second, read in the old TOS manually. | |
76 | SSSTSSTN | PUSH 9 (starting register) | |
77 | TTT | LOAD | |
78 | ||
79 | @ Read one word per pass through this loop. | |
80 | NSSVSSSSTSTSSSSSSSTSN | Mark: 00001010 00000010 | |
81 | SSSTSSTN | PUSH 9 (starting register) | |
82 | SSSTTTSN | PUSH 14 (ptr) | |
83 | TTT | LOAD | |
84 | TSSS | ADD | |
85 | TTT | LOAD | |
86 | ||
87 | @ See if the loop is complete. | |
88 | SSSTTTSN | PUSH 14 (ptr) | |
89 | TTT | LOAD | |
90 | SSSTN | PUSH 1 | |
91 | TSST | SUBTRACT | |
92 | NTSSSSSTSTSSSSSSSTTN | BRZ > 00001010 00000011 | |
93 | ||
94 | @ Decrement the loop counter and loop again. | |
95 | SSSTTTSN | PUSH 14 (ptr) | |
96 | TTT | LOAD | |
97 | SSSTN | PUSH 1 | |
98 | TSST | SUBTRACT | |
99 | SSSTTTSN | PUSH 14 (ptr) | |
100 | SNT | SWAP | |
101 | TTS | STORE | |
102 | NSNSSSSTSTSSSSSSSTSN | JMP > 00001010 00000010 | |
103 | ||
104 | @ Return | |
105 | NSSVSSSSTSTSSSSSSSTTN | Mark: 00001010 00000011 | |
106 | NTN | 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 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
126 | NSSVTSTTN | Mark: 1011 (stackrotatereverse) | |
127 | ||
128 | @ For the convenience of other functions, modulo the | |
129 | @ rotation depth by the available registers. | |
130 | SSSTSTN | PUSH 5 | |
131 | TSTT | MODULO | |
132 | ||
133 | @ Use heap[14] for generating register addresses. | |
134 | SSSTTTSN | PUSH 14 (ptr) | |
135 | SSSSN | PUSH 0 | |
136 | TTS | STORE | |
137 | ||
138 | @ Dump one word from stack to heap each pass through the loop. | |
139 | NSSVSSSSTSTTSSSSSSSSN | Mark: 00001011 00000000 | |
140 | SNT | SWAP | |
141 | SSSTSSTN | PUSH 9 (starting register) | |
142 | SSSTTTSN | PUSH 14 (ptr) | |
143 | TTT | LOAD | |
144 | TSSS | ADD | |
145 | SNT | SWAP | |
146 | TTS | STORE | |
147 | ||
148 | @ See if the loop is complete. | |
149 | SNS | DUP | |
150 | SSSTTTSN | PUSH 14 (ptr) | |
151 | TTT | LOAD | |
152 | SSSTN | PUSH 1 | |
153 | TSSS | ADD | |
154 | TSST | SUBTRACT | |
155 | NTSSSSSTSTTSSSSSSSTN | BRZ > 00001011 00000001 | |
156 | ||
157 | @ Increment the loop counter | |
158 | SSSTTTSN | PUSH 14 (ptr) | |
159 | TTT | LOAD | |
160 | SSSTN | PUSH 1 | |
161 | TSSS | ADD | |
162 | SSSTTTSN | PUSH 14 (ptr) | |
163 | SNT | SWAP | |
164 | TTS | STORE | |
165 | NSNSSSSTSTTSSSSSSSSN | 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. | |
171 | NSSVSSSSTSTTSSSSSSSTN | Mark: 00001011 00000001 | |
172 | SSSTN | PUSH 1 | |
173 | TSST | SUBTRACT | |
174 | SNS | DUP | |
175 | SSSTN | PUSH 1 | |
176 | TSST | SUBTRACT | |
177 | SSSTTTSN | PUSH 14 (ptr) | |
178 | SNT | SWAP | |
179 | TTS | STORE | |
180 | ||
181 | @ Read one word per pass through this loop. | |
182 | @ Store it behind 'rd' on the stack. | |
183 | NSSVSSSSTSTTSSSSSSTSN | Mark: 00001011 00000010 | |
184 | SSSTSSTN | PUSH 9 (starting register) | |
185 | SSSTTTSN | PUSH 14 (ptr) | |
186 | TTT | LOAD | |
187 | TSSS | ADD | |
188 | TTT | LOAD | |
189 | SNT | SWAP | |
190 | ||
191 | @ See if the loop is complete. | |
192 | SSSTTTSN | PUSH 14 (ptr) | |
193 | TTT | LOAD | |
194 | NTSSSSSTSTTSSSSSSTTN | BRZ > 00001011 00000011 | |
195 | ||
196 | @ Decrement the loop counter and loop again. | |
197 | SSSTTTSN | PUSH 14 (ptr) | |
198 | TTT | LOAD | |
199 | SSSTN | PUSH 1 | |
200 | TSST | SUBTRACT | |
201 | SSSTTTSN | PUSH 14 (ptr) | |
202 | SNT | SWAP | |
203 | TTS | STORE | |
204 | NSNSSSSTSTTSSSSSSTSN | JMP > 00001011 00000010 | |
205 | ||
206 | @ Read in the final value manually and return. | |
207 | NSSVSSSSTSTTSSSSSSTTN | Mark: 00001011 00000011 | |
208 | SSSTSSTN | PUSH 9 (starting register) | |
209 | TSSS | ADD | |
210 | TTT | LOAD | |
211 | NTN | 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 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
231 | NSSVTTSSN | Mark: 1100 (deepdup) | |
232 | ||
233 | @ Copy 'dupdepth' and use it to bring forth the desired stack word. | |
234 | SNS | DUP | |
235 | SSSTN | PUSH 1 | |
236 | TSSS | ADD | |
237 | NSTTSTTN | JSR > 1011 (stackrotatereverse) | |
238 | ||
239 | @ Copy the desired stack word and return it back into the stack. | |
240 | SNS | DUP | |
241 | SSSTTN | PUSH 3 | |
242 | NSTTSTTN | JSR > 1011 (stackrotatereverse) | |
243 | SSSTN | PUSH 1 | |
244 | TSSS | ADD | |
245 | NSTTSTSN | JSR > 1010 (stackrotate) | |
246 | NTN | RTS | |
247 | ||
23d17247 | 248 | #endif |
a67867ae | 249 |