Commit | Line | Data |
---|---|---|
8bed3ccd AT |
1 | #ifndef VVS_STDLIB_STDIO |
2 | #define VVS_STDLIB_STDIO | |
3 | ||
4 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
bb21580a | 5 | @ Name: |
b8b65c17 | 6 | @ printstackstring (1000100) |
8bed3ccd | 7 | @ Description: |
bb21580a | 8 | @ Prints a null-terminated string from the stack. |
8bed3ccd AT |
9 | @ Call Stack: |
10 | @ null-terminator (ASCII '\0') | |
11 | @ char n | |
12 | @ ... | |
13 | @ char 2 | |
14 | @ char 1 <-- TOS | |
15 | @ Return Stack: | |
16 | @ <empty> | |
17 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
b8b65c17 | 18 | NSSVTSSSTSSN | Mark: 1000100 (print string from stack) |
32c440bf | 19 | SNS | DUP |
b8b65c17 | 20 | NTSSTSSSTSSSSSSSSSTN | BRZ > 01000100 00000001 |
32c440bf | 21 | TNSS | Print character |
b8b65c17 AT |
22 | NSNTSSSTSSN | JMP > 1000100 |
23 | NSSVSTSSSTSSSSSSSSSTN | Mark: 01000100 00000001 | |
32c440bf AT |
24 | SNN | DROP |
25 | NTN | RTS | |
26 | ||
8bed3ccd | 27 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
bb21580a | 28 | @ Name: |
b8b65c17 | 29 | @ printheapstring (1000101) |
8bed3ccd | 30 | @ Description: |
bb21580a | 31 | @ Prints a null-terminated string from the heap. |
8bed3ccd AT |
32 | @ Call Stack: |
33 | @ pointer to first character <-- TOS | |
34 | @ Return Stack: | |
35 | @ <empty> | |
36 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
b8b65c17 | 37 | NSSVTSSSTSTN | Mark: 1000101 (print string from heap) |
32c440bf AT |
38 | SNS | DUP |
39 | TTT | LOAD | |
40 | SNS | DUP | |
b8b65c17 | 41 | NTSSTSSSTSTSSSSSSSTN | BRZ > 01000101 00000001 |
32c440bf AT |
42 | TNSS | Print character |
43 | SSSTN | Push +1 | |
44 | TSSS | ADD | |
b8b65c17 AT |
45 | NSNTSSSTSTN | JMP > 1000101 |
46 | NSSVSTSSSTSTSSSSSSSTN | Mark: 01000101 00000001 | |
32c440bf AT |
47 | SNN | DROP |
48 | SNN | DROP | |
49 | NTN | RTS | |
8bed3ccd | 50 | |
3625ff3a | 51 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
bb21580a | 52 | @ Name: |
23d17247 | 53 | @ printstacknumber (1001) |
3625ff3a | 54 | @ Description: |
bb21580a | 55 | @ Prints 'number' from the stack in sign-magnitude format. |
3625ff3a AT |
56 | @ Leading zeros are suppressed. |
57 | @ Call Stack: | |
bb21580a | 58 | @ number <-- TOS |
3625ff3a AT |
59 | @ Return Stack: |
60 | @ <empty> | |
61 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
23d17247 | 62 | NSSVTSSTN | Mark: 1001 (print number from stack) |
3625ff3a | 63 | SNS | DUP |
ae1f85a1 AT |
64 | NSTTSSSSTSN | JSR > 1000010 |
65 | NSTTSSSSTTN | JSR > 1000011 | |
3625ff3a AT |
66 | NTN | RTS |
67 | ||
68 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
bb21580a | 69 | @ Name: |
ae1f85a1 | 70 | @ printstacknumbersign (1000010) |
3625ff3a | 71 | @ Description: |
bb21580a | 72 | @ Prints the sign of 'number' from the stack. |
3625ff3a | 73 | @ Call Stack: |
bb21580a | 74 | @ number <-- TOS |
3625ff3a AT |
75 | @ Return Stack: |
76 | @ <empty> | |
77 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
ae1f85a1 AT |
78 | NSSVTSSSSTSN | Mark: 1000010 (print sign of number from stack) |
79 | NTTSTSSSSTSSSSSSSSTN | BMI > 01000010 00000001 | |
3625ff3a | 80 | SSSTSTSTTN | PUSH ASCII '+' |
ae1f85a1 AT |
81 | NSNSTSSSSTSSSSSSSTSN | JMP > 01000010 00000010 |
82 | NSSVSTSSSSTSSSSSSSSTN | Mark: 01000010 00000001 | |
3625ff3a | 83 | SSSTSTTSTN | PUSH ASCII '-' |
ae1f85a1 | 84 | NSSVSTSSSSTSSSSSSSTSN | Mark: 01000010 00000010 |
3625ff3a AT |
85 | TNSS | PUTC |
86 | NTN | RTS | |
87 | ||
88 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
bb21580a | 89 | @ Name: |
ae1f85a1 | 90 | @ printstacknumbermagnitude (1000011) |
3625ff3a | 91 | @ Description: |
bb21580a | 92 | @ Prints the magnitude of 'number' from the stack. |
3625ff3a | 93 | @ Call Stack: |
bb21580a | 94 | @ number <-- TOS |
3625ff3a AT |
95 | @ Return Stack: |
96 | @ <empty> | |
97 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
bb21580a | 98 | #include <math.pvvs> |
ae1f85a1 | 99 | NSSVTSSSSTTN | Mark: 1000011 (print magnitude of number from stack) |
3625ff3a AT |
100 | NSTTSSSTN | JSR > 10001 (absolute value) |
101 | ||
102 | SSSSN | PUSH ASCII '\0' | |
103 | SNT | SWAP | |
104 | ||
105 | @ Pick off one digit on each pass through this loop. | |
ae1f85a1 | 106 | NSSVSTSSSSTTSSSSSSSSN | Mark: 01000011 00000000 |
3625ff3a AT |
107 | SNS | DUP |
108 | ||
109 | @ Mod-off a digit, convert to ASCII, store on stack as part of the string. | |
110 | SSSTSTSN | PUSH +10 | |
111 | TSTT | MODULO | |
112 | SSSTTSSSSN | PUSH ASCII '0' | |
113 | TSSS | ADD | |
114 | SNT | SWAP | |
115 | ||
116 | @ Divide down to next digit and keep looping if number != 0 yet. | |
117 | SSSTSTSN | PUSH +10 | |
118 | TSTS | DIVIDE | |
119 | SNS | DUP | |
ae1f85a1 AT |
120 | NTSSTSSSSTTSSSSSSSTN | BRZ > 01000011 00000001 |
121 | NSNSTSSSSTTSSSSSSSSN | JMP > 01000011 00000000 | |
3625ff3a AT |
122 | |
123 | @ Print the string we have built on the stack. | |
ae1f85a1 | 124 | NSSVSTSSSSTTSSSSSSSTN | Mark: 01000011 00000001 |
3625ff3a | 125 | SNN | DROP |
45abb94e | 126 | NSTTSSSTSSN | JSR > 1000100 (print string from stack) |
3625ff3a AT |
127 | NTN | RTS |
128 | ||
23d17247 AT |
129 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ |
130 | @ Name: | |
131 | @ printf | |
132 | @ Description: | |
133 | @ If printing a static string (i.e. no substitutions), pass | |
134 | @ 'number of substitutions' as 0, immediately followed by 'string word 1'. | |
135 | @ If printing a string from the heap instead of stack, pass an empty string | |
136 | @ on the stack followed by a pointer to the first word of the | |
137 | @ null-terminated string on the heap. | |
138 | @ For example: | |
139 | @ pointer | |
140 | @ ASCII '\0' | |
141 | @ substitution n | |
142 | @ <remainder of call stack is unchanged> | |
6cb31a3e AT |
143 | @ Maximum substitutions determined by upper heap limit in stackrotate and |
144 | @ stackrotatereverse subroutines. | |
23d17247 AT |
145 | @ Call Stack: |
146 | @ ACSII '\0' | |
147 | @ string word n | |
148 | @ ... | |
149 | @ string word 1 | |
150 | @ substitution n | |
151 | @ ... | |
152 | @ substitution 1 | |
153 | @ number of substitutions <-- TOS | |
154 | @ Return Stack: | |
155 | @ <empty> | |
156 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
157 | #include <heap.pvvs> | |
158 | #include <string.pvvs> | |
159 | NSSVTSSSN | Mark: 1000 (printf) | |
160 | ||
23d17247 AT |
161 | @ If the stack contains an empty string (i.e. just an ASCII '\0'), the next |
162 | @ word is a pointer we must use to load the string from the heap. | |
6cb31a3e | 163 | @ This will leave the stack looking exactly like the example call stack above. |
23d17247 AT |
164 | @ Do the test this way so we can keep the code inline. |
165 | SNS | DUP | |
6cb31a3e AT |
166 | SSSTSN | PUSH 2 |
167 | TSSS | ADD | |
168 | NSTTTSSN | JSR > 1100 (deepdup) | |
23d17247 AT |
169 | SSTTN | PUSH -1 |
170 | TSSN | MULTIPLY | |
171 | NTTSSSSTSSSSSSSSSSTN | BMI > 00001000 00000001 | |
6cb31a3e AT |
172 | SNS | DUP |
173 | SSSTSN | PUSH 2 | |
174 | TSSS | ADD | |
175 | NSTTSTTN | JSR > 1011 (stackrotatereverse) | |
23d17247 AT |
176 | SNN | DROP |
177 | SNS | DUP | |
6cb31a3e AT |
178 | SSSTSN | PUSH 2 |
179 | TSSS | ADD | |
180 | NSTTSTTN | JSR > 1011 (stackrotatereverse) | |
181 | NSTSSSSTSSSTSSSTTSSN | JSR > 00001000 10001100 (printf_deepslurp) | |
23d17247 AT |
182 | |
183 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
184 | @ The rest of printf parses a string according to the following information. | |
185 | @ ASCII '\ ': | |
186 | @ ASCII '\ ': putchar '\ ' | |
187 | @ ASCII '%': putchar '%' | |
188 | @ ASCII 'n': putchar '\n' | |
189 | @ ASCII 't': putchar '\t' | |
190 | @ ASCII '%': | |
191 | @ ASCII 'c': (print character) | |
192 | @ ASCII 's': (print string) | |
193 | @ ASCII 'd': (print decimal digit) | |
194 | @ ASCII 'u': (print abs(integer), w/o sign) | |
195 | @ ASCII 'i': (print integer w/sign) | |
196 | @ ASCII '\0': | |
197 | @ cleanup and exit | |
198 | @ default: | |
199 | @ putchar | |
200 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
201 | ||
202 | @@@@@@@@@@@@@@@@@@@@ | |
6cb31a3e | 203 | @ The next block tests the char against all possible level 1 branches (see above). |
23d17247 AT |
204 | @ If there is a match, execution jumps to the appropriate level 2 branch label. |
205 | @ If no match is found, print the character and move on. | |
206 | @@@@@@@@@@@@@@@@@@@@ | |
207 | NSSVSSSSTSSSSSSSSSSTN | Mark: 00001000 00000001 | |
6cb31a3e AT |
208 | @ Move the next character of the string to TOS. |
209 | NSTSSSSTSSSTSSSTSTTN | JSR > 00001000 10001011 (next char to TOS) | |
23d17247 AT |
210 | @ TOS is an ASCII '\ '. Jump to process the possible level 2 branches. |
211 | SNS | DUP | |
212 | SSSTSTTTSSN | PUSH ASCII slash | |
213 | TSST | SUBTRACT | |
214 | NTSSSSSTSSSSSSSSSTSN | BRZ > 00001000 00000010 | |
215 | @ TOS is an ASCII '%'. Jump to process the possible level 2 branches. | |
216 | SNS | DUP | |
217 | SSSTSSTSTN | PUSH ASCII '%' | |
218 | TSST | SUBTRACT | |
219 | NTSSSSSTSSSSSSSSSTTN | BRZ > 00001000 00000011 | |
220 | @ TOS is an ASCII "\0". Jump to clean-up-and-exit. | |
221 | SNS | DUP | |
222 | NTSSSSSTSSSSSSSSSSSN | BRZ > 00001000 00000000 | |
223 | @ TOS is a normal character. Print it and loop again. | |
224 | TNSS | PUTC | |
225 | NSNSSSSTSSSSSSSSSSTN | JMP > 00001000 00000001 | |
226 | ||
227 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
228 | @ Level 2 - ASCII '\ ' - Escapes | |
229 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
230 | ||
231 | @@@@@@@@@@@@@@@@@@@@ | |
232 | @ The level 1 match was an ASCII '\ '. | |
233 | @ Now look for level 2 matches that trigger a character substitution (n -> newline, etc). | |
234 | @ If no matches are found, print the character directly (e.g. "\%" -> '%') | |
235 | @ When finished, loop back to testing level 1 branches. | |
236 | @@@@@@@@@@@@@@@@@@@@ | |
237 | NSSVSSSSTSSSSSSSSSTSN | Mark: 00001000 00000010 | |
238 | SNN | DROP | |
6cb31a3e AT |
239 | @ Move the next character of the string to TOS. |
240 | NSTSSSSTSSSTSSSTSTTN | JSR > 00001000 10001011 (next char to TOS) | |
23d17247 AT |
241 | @ Check for ASCII '\n' |
242 | SNS | DUP | |
243 | SSSTTSTTTSN | PUSH ASCII 'n' | |
244 | TSST | SUBTRACT | |
245 | NTSSSSSTSSSSSSSSTSSN | BRZ > 00001000 00000100 | |
246 | @ Check for ASCII '\t' | |
247 | SNS | DUP | |
248 | SSSTSSTN | PUSH ASCII '\t' | |
249 | TSST | SUBTRACT | |
250 | NTSSSSSTSSSSSSSSTSTN | BRZ > 00001000 00000101 | |
251 | @ No substitution necessary. Print literally. | |
252 | TNSS | PUTC | |
253 | NSNSSSSTSSSSSSSSSSTN | JMP > 00001000 00000001 | |
254 | ||
255 | @@@@@@@@@@@@@@@@@@@@ | |
256 | @ These are utility labels to output the appropriate non-printable ASCII character. | |
257 | @ After output, they loop back to testing level 1 branches. | |
258 | @@@@@@@@@@@@@@@@@@@@ | |
259 | ||
260 | @ Print a newline and loop for the next character. | |
261 | NSSVSSSSTSSSSSSSSTSSN | Mark: 00001000 00000100 | |
262 | SNN | DROP | |
263 | SSSTSTSN | PUSH ASCII '\n' | |
264 | TNSS | PUTC | |
265 | NSNSSSSTSSSSSSSSSSTN | JMP > 00001000 00000001 | |
266 | ||
267 | @ Print a horizontal tab and loop for the next character. | |
268 | NSSVSSSSTSSSSSSSSTSTN | Mark: 00001000 00000101 | |
269 | SNN | DROP | |
270 | SSSTSSTN | PUSH ASCII '\t' | |
271 | TNSS | PUTC | |
272 | NSNSSSSTSSSSSSSSSSTN | JMP > 00001000 00000001 | |
273 | ||
274 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
275 | @ Level 2 - ASCII '%' - Substitutions | |
276 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
277 | ||
278 | @@@@@@@@@@@@@@@@@@@@ | |
279 | @ The level 1 match was an ASCII '%'. | |
280 | @ Now look for level 2 matches that trigger a substitution. | |
281 | @ When finished, loop back to testing level 1 branches. | |
282 | @@@@@@@@@@@@@@@@@@@@ | |
283 | NSSVSSSSTSSSSSSSSSTTN | Mark: 00001000 00000011 | |
284 | SNN | DROP | |
6cb31a3e AT |
285 | @ Move the next character of the string to TOS. |
286 | NSTSSSSTSSSTSSSTSTTN | JSR > 00001000 10001011 (next char to TOS) | |
23d17247 AT |
287 | @ Check for ASCII 'c' - Print character |
288 | SNS | DUP | |
289 | SSSTTSSSTTN | PUSH ASCII 'c' | |
290 | TSST | SUBTRACT | |
291 | NTSSSSSTSSSSSSSSTTSN | BRZ > 00001000 00000110 | |
292 | @ Check for ASCII 's' - Print string | |
293 | SNS | DUP | |
294 | SSSTTTSSTTN | PUSH ASCII 's' | |
295 | TSST | SUBTRACT | |
296 | NTSSSSSTSSSSSSSSTTTN | BRZ > 00001000 00000111 | |
297 | @ Check for ASCII 'd' - Print decimal digit | |
298 | SNS | DUP | |
299 | SSSTTSSTSSN | PUSH ASCII 'd' | |
300 | TSST | SUBTRACT | |
301 | NTSSSSSTSSSSSSSTSSSN | BRZ > 00001000 00001000 | |
302 | @ Check for ASCII 'u' - Print unsigned number | |
303 | SNS | DUP | |
304 | SSSTTTSTSTN | PUSH ASCII 'u' | |
305 | TSST | SUBTRACT | |
306 | NTSSSSSTSSSSSSSTSSTN | BRZ > 00001000 00001001 | |
307 | @ Check for ASCII 'i' - Print signed number | |
308 | SNS | DUP | |
309 | SSSTTSTSSTN | PUSH ASCII 'i' | |
310 | TSST | SUBTRACT | |
311 | NTSSSSSTSSSSSSSTSTSN | BRZ > 00001000 00001010 | |
312 | @ Unrecognized substitution specifier. | |
313 | @ For now, silently consume it and continue. | |
314 | @ Do not increment the substitution counter. | |
315 | @ TODO: Is this really what I want to do here? | |
316 | SNN | DROP | |
317 | NSNSSSSTSSSSSSSSSSTN | JMP > 00001000 00000001 | |
318 | ||
319 | ||
320 | @@@@@@@@@@@@@@@@@@@@ | |
321 | @ These are utility labels to call the appropriate type of output subroutine. | |
6cb31a3e AT |
322 | @ After output, they decrement the substition counter and loop back to testing |
323 | @ level 1 branches. | |
23d17247 AT |
324 | @@@@@@@@@@@@@@@@@@@@ |
325 | ||
326 | @ Print a character | |
327 | NSSVSSSSTSSSSSSSSTTSN | Mark: 00001000 00000110 | |
328 | SNN | DROP | |
6cb31a3e | 329 | SNT | SWAP |
23d17247 | 330 | TNSS | PUTC |
6cb31a3e AT |
331 | SSSTN | PUSH 1 |
332 | TSST | SUBTRACT | |
23d17247 AT |
333 | NSNSSSSTSSSSSSSSSSTN | JMP > 00001000 00000001 |
334 | @ Print a string | |
335 | NSSVSSSSTSSSSSSSSTTTN | Mark: 00001000 00000111 | |
336 | SNN | DROP | |
6cb31a3e | 337 | SNT | SWAP |
23d17247 | 338 | NSTTSSSTSTN | JSR > 1000101 (print string from heap) |
6cb31a3e AT |
339 | SSSTN | PUSH 1 |
340 | TSST | SUBTRACT | |
23d17247 AT |
341 | NSNSSSSTSSSSSSSSSSTN | JMP > 00001000 00000001 |
342 | @ Print a decimal digit | |
343 | NSSVSSSSTSSSSSSSTSSSN | Mark: 00001000 00001000 | |
344 | SNN | DROP | |
6cb31a3e | 345 | SNT | SWAP |
23d17247 | 346 | TNST | PUTDIGIT |
6cb31a3e AT |
347 | SSSTN | PUSH 1 |
348 | TSST | SUBTRACT | |
23d17247 AT |
349 | NSNSSSSTSSSSSSSSSSTN | JMP > 00001000 00000001 |
350 | @ Print an unsigned integer | |
351 | NSSVSSSSTSSSSSSSTSSTN | Mark: 00001000 00001001 | |
352 | SNN | DROP | |
6cb31a3e | 353 | SNT | SWAP |
23d17247 | 354 | NSTTSSSSTTN | JSR > 1000011 (print magnitude of number from stack) |
6cb31a3e AT |
355 | SSSTN | PUSH 1 |
356 | TSST | SUBTRACT | |
23d17247 AT |
357 | NSNSSSSTSSSSSSSSSSTN | JMP > 00001000 00000001 |
358 | @ Print a signed integer | |
359 | NSSVSSSSTSSSSSSSTSTSN | Mark: 00001000 00001010 | |
360 | SNN | DROP | |
6cb31a3e | 361 | SNT | SWAP |
23d17247 | 362 | NSTTSSTN | JSR > 1001 (print number from stack) |
6cb31a3e AT |
363 | SSSTN | PUSH 1 |
364 | TSST | SUBTRACT | |
23d17247 AT |
365 | NSNSSSSTSSSSSSSSSSTN | JMP > 00001000 00000001 |
366 | ||
367 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
368 | @ These are misc labels associated with the printf function. | |
369 | @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ | |
370 | ||
6cb31a3e AT |
371 | @ Found an ASCII "\0" when processing the format string. Clean up and exit. |
372 | NSSVSSSSTSSSSSSSSSSSN | Mark: 00001000 00000000 | |
373 | SNN | DROP | |
374 | NTN | RTS | |
375 | ||
376 | @ Move the next string character to TOS. | |
377 | @ Stack should look like the printf call stack, with num-of-subs at TOS. | |
378 | NSSVSSSSTSSSTSSSTSTTN | Mark: 00001000 10001011 (next char to TOS) | |
379 | SNS | DUP | |
380 | SSSTSN | PUSH 2 | |
23d17247 | 381 | TSSS | ADD |
6cb31a3e | 382 | NSTTSTTN | JSR > 1011 (stackrotatereverse) |
23d17247 AT |
383 | NTN | RTS |
384 | ||
6cb31a3e AT |
385 | @ Slurps a string from the heap to the stack, storing it behind the substitutions. |
386 | @ Call Stack: | |
387 | @ substitution n | |
388 | @ ... | |
389 | @ substitution 1 | |
390 | @ number of substitutions <-- TOS | |
391 | @ pointer to string | |
392 | @ Return Stack: | |
393 | @ ACSII '\0' | |
394 | @ string word n | |
395 | @ ... | |
396 | @ string word 1 | |
397 | @ substitution n | |
398 | @ ... | |
399 | @ substitution 1 | |
400 | @ number of substitutions <-- TOS | |
401 | @ TODO: This, along with a deepspew, should probably be stdlib routines. | |
402 | NSSVSSSSTSSSTSSSTTSSN | Mark: 00001000 10001100 (printf_deepslurp) | |
403 | SNS | DUP | |
404 | @ Advance a duplicate copy of the pointer until it points to the null-terminator. | |
405 | NSSVSSSSTSSSTSSSTTSTN | Mark: 00001000 10001101 | |
406 | SNS | DUP | |
407 | TTT | LOAD | |
408 | NTSSSSSTSSSTSSSTTTSN | BRZ > 00001000 10001110 | |
409 | SSSTN | PUSH 1 | |
410 | TSSS | ADD | |
411 | NSNSSSSTSSSTSSSTTSTN | JMP > 00001000 10001101 | |
412 | @ Load a character to the stack on each pass through this loop. | |
413 | NSSVSSSSTSSSTSSSTTTSN | Mark: 00001000 10001110 | |
414 | SNS | DUP | |
415 | TTT | LOAD | |
416 | SSSTSSN | PUSH 4 | |
417 | NSTTTSSN | JSR > 1100 (deepdup) | |
418 | SSSTSSN | PUSH 4 | |
419 | TSSS | ADD | |
420 | NSTTSTSN | JSR > 1010 (stackrotate) | |
421 | @ Test for end of loop. | |
422 | SNS | DUP | |
423 | SSSTTN | PUSH 3 | |
424 | NSTTTSSN | JSR > 1100 (deepdup) | |
425 | TSST | SUBTRACT | |
426 | NTSSSSSTSSSTSSSTTTTN | BRZ > 00001000 10001111 | |
427 | @ Decrement pointer to end of string, loop again. | |
428 | SSSTN | PUSH 1 | |
429 | TSST | SUBTRACT | |
430 | NSNSSSSTSSSTSSSTTTSN | JMP > 00001000 10001110 | |
431 | @ Clean up and return. | |
432 | NSSVSSSSTSSSTSSSTTTTN | Mark: 00001000 10001111 | |
433 | SNN | DROP | |
23d17247 AT |
434 | SNN | DROP |
435 | NTN | RTS | |
436 | ||
8bed3ccd | 437 | #endif |