Added printf and stackrotate functions to VVS stdlib.
[vvhitespace] / stdlib / heap.pvvs
index 3fa352c..4953fad 100644 (file)
@@ -277,7 +277,10 @@ NTN                     | RTS
 @     TOS+1 -> heap[2]
 @     ...
 @     TOS+n -> heap[count]
 @     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
 @   ...
 @ Call Stack:
 @   data-words
 @   ...
@@ -288,28 +291,32 @@ NTN                     | RTS
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NSSVTSSSSSTN            | Mark: 1000001 (spewreg)
 
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 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
 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
 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
 
 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
 SNS                     | DUP
 TTT                     | LOAD
 SSSTN                   | PUSH 1
@@ -337,30 +344,30 @@ NTN                     | RTS
 @   heap[address]  <-- TOS
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NSSVTTTTSN              | Mark: 11110 (slurp)
 @   heap[address]  <-- TOS
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NSSVTTTTSN              | Mark: 11110 (slurp)
-SSSTSN                  | PUSH 2
-NSTTSSSSSTN             | JSR > 1000001 (spewreg)
 
 @ Load one word from heap on each pass.
 
 @ 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
 TSSS                    | ADD
 TTT                     | LOAD
+SSSTTN                  | PUSH 3
+NSTTSTSN                | JSR > 1010 (stackrotate)
+SNT                     | SWAP
 
 @ Check for loop completion.
 
 @ Check for loop completion.
-@ As a side effect, prepare the next address.
-SSSTN                   | PUSH 1 (ptr)
 SNS                     | DUP
 SNS                     | DUP
-TTT                     | LOAD
-SNS                     | DUP
-NTSSSSTTTTSSSSSSSSTN    | BRZ > 00011110 00000001
+NTSSSSTTTTSSSSSSSSSN    | BRZ > 00011110 00000000
 SSSTN                   | PUSH 1
 TSST                    | SUBTRACT
 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
 SNN                     | DROP
 SNN                     | DROP
 NTN                     | RTS