Added printf and stackrotate functions to VVS stdlib.
[vvhitespace] / stdlib / heap.pvvs
index d753363..4953fad 100644 (file)
@@ -15,7 +15,7 @@
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NSSVTTSSSN              | Mark: 11000 (memset)
 SSSTTN                  | PUSH 3
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NSSVTTSSSN              | Mark: 11000 (memset)
 SSSTTN                  | PUSH 3
-NSTTTTTTN               | JSR > 11111 (spew)
+NSTTSSSSSTN             | JSR > 1000001 (spewreg)
 
 @ Store 'pattern' into one memory location on each pass through this loop.
 NSSVSSSTTSSSSSSSSSSSN   | Mark: 00011000 00000000
 
 @ Store 'pattern' into one memory location on each pass through this loop.
 NSSVSSSTTSSSSSSSSSSSN   | Mark: 00011000 00000000
@@ -59,7 +59,7 @@ NTN                     | RTS
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NSSVTTSSTN              | Mark: 11001 (memcpy)
 SSSTTN                  | PUSH 3
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NSSVTTSSTN              | Mark: 11001 (memcpy)
 SSSTTN                  | PUSH 3
-NSTTTTTTN               | JSR > 11111 (spew)
+NSTTSSSSSTN             | JSR > 1000001 (spewreg)
 
 @ Copy one word on each pass through this loop.
 NSSVSSSTTSSTSSSSSSSSN   | Mark: 00011001 00000000
 
 @ Copy one word on each pass through this loop.
 NSSVSSSTTSSTSSSSSSSSN   | Mark: 00011001 00000000
@@ -107,7 +107,7 @@ NTN                     | RTS
 #include <math.pvvs>
 NSSVTTSTSN              | Mark: 11010 (memrand)
 SSSTN                   | PUSH 1
 #include <math.pvvs>
 NSSVTTSTSN              | Mark: 11010 (memrand)
 SSSTN                   | PUSH 1
-NSTTTTTTN               | JSR > 11111 (spew)
+NSTTSSSSSTN             | JSR > 1000001 (spewreg)
 
 @ Store random word into one memory location on each pass through this loop.
 NSSVSSSTTSTSSSSSSSSSN   | Mark: 00011010 00000000
 
 @ Store random word into one memory location on each pass through this loop.
 NSSVSSSTTSTSSSSSSSSSN   | Mark: 00011010 00000000
@@ -148,7 +148,7 @@ NTN                     | RTS
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NSSVTTSTTN              | Mark: 11011 (memcmp)
 SSSTSN                  | PUSH 2
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NSSVTTSTTN              | Mark: 11011 (memcmp)
 SSSTSN                  | PUSH 2
-NSTTTTTTN               | JSR > 11111 (spew)
+NSTTSSSSSTN             | JSR > 1000001 (spewreg)
 
 @ Compare one word on each pass through this loop.
 NSSVSSSTTSTTSSSSSSSSN   | Mark: 00011011 00000000
 
 @ Compare one word on each pass through this loop.
 NSSVSSSTTSTTSSSSSSSSN   | Mark: 00011011 00000000
@@ -201,7 +201,7 @@ NTN                     | RTS
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NSSVTTTSSN              | Mark: 11100 (memsrch)
 SSSTTN                  | PUSH 3
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NSSVTTTSSN              | Mark: 11100 (memsrch)
 SSSTTN                  | PUSH 3
-NSTTTTTTN               | JSR > 11111 (spew)
+NSTTSSSSSTN             | JSR > 1000001 (spewreg)
 
 @ Compare one word on each pass through this loop.
 NSSVSSSTTTSSSSSSSSSSN   | Mark: 00011100 00000000
 
 @ Compare one word on each pass through this loop.
 NSSVSSSTTTSSSSSSSSSSN   | Mark: 00011100 00000000
@@ -238,9 +238,9 @@ NTN                     | RTS
 
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 @ Name:
 
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 @ Name:
-@   slurp (11110)
+@   slurpreg (1000000)
 @ Description:
 @ Description:
-@   Reads 'count' values from heap to stack in complementary order to 'spew'.
+@   Reads 'count' values from heap to stack in complementary order to 'spewreg'.
 @ Call Stack:
 @   count
 @ Return Stack:
 @ Call Stack:
 @   count
 @ Return Stack:
@@ -249,10 +249,10 @@ NTN                     | RTS
 @   heap[2]
 @   heap[1]      <-- TOS
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 @   heap[2]
 @   heap[1]      <-- TOS
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-NSSVTTTTSN              | Mark: 11110 (slurp)
+NSSVTSSSSSSN            | Mark: 1000000 (slurpreg)
 
 @ Load one word from heap on each pass.
 
 @ Load one word from heap on each pass.
-NSSVSSSTTTTSSSSSSSSSN   | Mark: 00011110 00000000
+NSSVSTSSSSSSSSSSSSSSN   | Mark: 01000000 00000000
 SNS                     | DUP
 TTT                     | LOAD
 SNT                     | SWAP
 SNS                     | DUP
 TTT                     | LOAD
 SNT                     | SWAP
@@ -262,22 +262,25 @@ SNT                     | SWAP
 SSSTN                   | PUSH 1
 TSST                    | SUBTRACT
 SNS                     | DUP
 SSSTN                   | PUSH 1
 TSST                    | SUBTRACT
 SNS                     | DUP
-NTSSSSTTTTSSSSSSSSTN    | BRZ > 00011110 00000001
-NSNSSSTTTTSSSSSSSSSN    | JMP > 00011110 00000000
-NSSVSSSTTTTSSSSSSSSTN   | Mark: 00011110 00000001
+NTSSTSSSSSSSSSSSSSTN    | BRZ > 01000000 00000001
+NSNSTSSSSSSSSSSSSSSN    | JMP > 01000000 00000000
+NSSVSTSSSSSSSSSSSSSTN   | Mark: 01000000 00000001
 SNN                     | DROP
 NTN                     | RTS
 
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 @ Name:
 SNN                     | DROP
 NTN                     | RTS
 
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 @ Name:
-@   spew (11111)
+@   spewreg (1000001)
 @ Description:
 @   Writes 'count' values from stack to heap in this order:
 @     TOS   -> heap[1]
 @     TOS+1 -> heap[2]
 @     ...
 @     TOS+n -> heap[count]
 @ Description:
 @   Writes 'count' values from stack to heap in this order:
 @     TOS   -> heap[1]
 @     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
 @   ...
@@ -286,30 +289,136 @@ NTN                     | RTS
 @ Return Stack:
 @   <empty>
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 @ Return Stack:
 @   <empty>
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
-NSSVTTTTTN              | Mark: 11111 (spew)
+NSSVTSSSSSTN            | Mark: 1000001 (spewreg)
+
+@ To simplify other functions, sprewreg shall accept 0 as a valid count value.
+SNS                     | DUP
+NTSSTSSSSSTSSSSSSSTN    | BRZ > 01000001 00000001
 
 
-@ Create a counter in heap[0] that doubles as a destination pointer generator.
-SSSSN                   | PUSH 0 (ptr)
+@ 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.
 SSSTN                   | PUSH 1
 TTS                     | STORE
 
 @ Store one word to heap on each pass.
-NSSVSSSTTTTTSSSSSSSSN   | Mark: 00011111 00000000
+NSSVSTSSSSSTSSSSSSSSN   | Mark: 01000001 00000000
 SNT                     | SWAP
 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
+
+@ Increment heap[15] if continuing.
+SSSTTTTN                | PUSH 15 (ptr)
+SNS                     | DUP
+TTT                     | LOAD
+SSSTN                   | PUSH 1
+TSSS                    | ADD
+TTS                     | STORE
+NSNSTSSSSSTSSSSSSSSN    | JMP > 01000001 00000000
+
+@ Clean up and return.
+NSSVSTSSSSSTSSSSSSSTN   | Mark: 01000001 00000001
+SNN                     | DROP
+NTN                     | RTS
+
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@ Name:
+@   slurp (11110)
+@ Description:
+@   Reads values from heap to stack in complementary order to 'spew'.
+@ Call Stack:
+@   address
+@   count  <-- TOS
+@ Return Stack:
+@   heap[address+count]
+@   ...
+@   heap[address+1]
+@   heap[address]  <-- TOS
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+NSSVTTTTSN              | Mark: 11110 (slurp)
+
+@ Load one word from heap on each pass.
+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.
+SNS                     | DUP
+NTSSSSTTTTSSSSSSSSSN    | BRZ > 00011110 00000000
+SSSTN                   | PUSH 1
+TSST                    | SUBTRACT
+NSNTTTTSN               | JMP > 11110 (slurp)
+
+@ Clean up and return.
+NSSVSSSTTTTSSSSSSSSSN   | Mark: 00011110 00000000
+SNN                     | DROP
+SNN                     | DROP
+NTN                     | RTS
+
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@ Name:
+@   spew (11111)
+@ Description:
+@   Writes values from stack to heap in this order:
+@     TOS   -> heap[address]
+@     TOS+1 -> heap[address+1]
+@     ...
+@     TOS+n -> heap[address+count]
+@ Call Stack:
+@   data-words
+@   ...
+@   data-words
+@   address
+@   count  <-- TOS
+@ Return Stack:
+@   <empty>
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+NSSVTTTTTN              | Mark: 11111 (spew)
+SSSTSN                  | PUSH 2
+NSTTSSSSSTN             | JSR > 1000001 (spewreg)
+
+@ Create a counter in heap[3] that doubles as a dest. pointer offset generator.
+SSSTTN                  | PUSH 3 (ptr)
+SSSSN                   | PUSH 0
+TTS                     | STORE
+
+@ Store one word to heap on each pass.
+NSSVSSSTTTTTSSSSSSSSN   | Mark: 00011111 00000000
+SSSTSN                  | PUSH 2 (ptr)
+TTT                     | LOAD
+SSSTTN                  | PUSH 3 (ptr)
+TTT                     | LOAD
+TSSS                    | ADD
+SNT                     | SWAP
+TTS                     | STORE
+
+@ Check for loop completion.
+SSSTN                   | PUSH 1 (ptr)
+TTT                     | LOAD
+SSSTTN                  | PUSH 3 (ptr)
 TTT                     | LOAD
 TSST                    | SUBTRACT
 NTSSSSTTTTTSSSSSSSTN    | BRZ > 00011111 00000001
 
 TTT                     | LOAD
 TSST                    | SUBTRACT
 NTSSSSTTTTTSSSSSSSTN    | BRZ > 00011111 00000001
 
-@ Increment heap[0] if continuing.
-SSSSN                   | PUSH 0 (ptr)
+@ Increment heap[3] if continuing.
+SSSTTN                  | PUSH 3 (ptr)
 SNS                     | DUP
 TTT                     | LOAD
 SSSTN                   | PUSH 1
 SNS                     | DUP
 TTT                     | LOAD
 SSSTN                   | PUSH 1
@@ -319,7 +428,6 @@ NSNSSSTTTTTSSSSSSSSN    | JMP > 00011111 00000000
 
 @ Clean up and return.
 NSSVSSSTTTTTSSSSSSSTN   | Mark: 00011111 00000001
 
 @ Clean up and return.
 NSSVSSSTTTTTSSSSSSSTN   | Mark: 00011111 00000001
-SNN                     | DROP
 NTN                     | RTS
 
 #endif
 NTN                     | RTS
 
 #endif