@ TOS+1 -> heap[2]
@ ...
@ TOS+n -> heap[count]
-@ This is the only stdlib function which uses heap[0] for storage.
+@ This function uses heap[15] for temporary storage, thus limiting the total
+@ registers to 14 since heap[0] is reserved. Since this function populates
+@ the registers, encoding the value here seems a natural location to document
+@ the limit. TODO: Should this be turned into a CPP define?
@ Call Stack:
@ data-words
@ ...
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
NSSVTSSSSSTN | Mark: 1000001 (spewreg)
-@ Create a counter in heap[0] that doubles as a destination pointer generator.
-SSSSN | PUSH 0 (ptr)
+@ To simplify other functions, sprewreg shall accept 0 as a valid count value.
+SNS | DUP
+NTSSTSSSSSTSSSSSSSTN | BRZ > 01000001 00000001
+
+@ Create a counter in heap[15] that doubles as a destination pointer generator.
+SSSTTTTN | PUSH 15 (ptr)
SSSTN | PUSH 1
TTS | STORE
@ Store one word to heap on each pass.
NSSVSTSSSSSTSSSSSSSSN | Mark: 01000001 00000000
SNT | SWAP
-SSSSN | PUSH 0 (ptr)
+SSSTTTTN | PUSH 15 (ptr)
TTT | LOAD
SNT | SWAP
TTS | STORE
@ Check for loop completion.
SNS | DUP
-SSSSN | PUSH 0 (ptr)
+SSSTTTTN | PUSH 15 (ptr)
TTT | LOAD
TSST | SUBTRACT
NTSSTSSSSSTSSSSSSSTN | BRZ > 01000001 00000001
-@ Increment heap[0] if continuing.
-SSSSN | PUSH 0 (ptr)
+@ Increment heap[15] if continuing.
+SSSTTTTN | PUSH 15 (ptr)
SNS | DUP
TTT | LOAD
SSSTN | PUSH 1
@ heap[address] <-- TOS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
NSSVTTTTSN | Mark: 11110 (slurp)
-SSSTSN | PUSH 2
-NSTTSSSSSTN | JSR > 1000001 (spewreg)
@ Load one word from heap on each pass.
-NSSVSSSTTTTSSSSSSSSSN | Mark: 00011110 00000000
-SSSTN | PUSH 1 (ptr)
-TTT | LOAD
-SSSTSN | PUSH 2 (ptr)
-TTT | LOAD
+SNS | DUP
+SSSTTN | PUSH 3
+NSTTSTSN | JSR > 1010 (stackrotate)
+SNT | SWAP
+SNS | DUP
+SSSTTN | PUSH 3
+NSTTSTSN | JSR > 1010 (stackrotate)
TSSS | ADD
TTT | LOAD
+SSSTTN | PUSH 3
+NSTTSTSN | JSR > 1010 (stackrotate)
+SNT | SWAP
@ Check for loop completion.
-@ As a side effect, prepare the next address.
-SSSTN | PUSH 1 (ptr)
SNS | DUP
-TTT | LOAD
-SNS | DUP
-NTSSSSTTTTSSSSSSSSTN | BRZ > 00011110 00000001
+NTSSSSTTTTSSSSSSSSSN | BRZ > 00011110 00000000
SSSTN | PUSH 1
TSST | SUBTRACT
-TTS | STORE
-NSNSSSTTTTSSSSSSSSSN | JMP > 00011110 00000000
-NSSVSSSTTTTSSSSSSSSTN | Mark: 00011110 00000001
+NSNTTTTSN | JMP > 11110 (slurp)
+
+@ Clean up and return.
+NSSVSSSTTTTSSSSSSSSSN | Mark: 00011110 00000000
SNN | DROP
SNN | DROP
NTN | RTS