Modified stdlib to use stack rotations to timeshare heap registers.
[vvhitespace] / stdlib / heap.pvvs
index d753363..2c5eb79 100644 (file)
 @   <empty>
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NSSVTTSSSN              | Mark: 11000 (memset)
 @   <empty>
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NSSVTTSSSN              | Mark: 11000 (memset)
-SSSTTN                  | PUSH 3
-NSTTTTTTN               | JSR > 11111 (spew)
 
 @ 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
-SSSTN                   | PUSH 1 (ptr)
-TTT                     | LOAD
-SSSTSN                  | PUSH 2 (ptr)
-TTT                     | LOAD
+SNS                     | DUP
+SSSTTN                  | PUSH 3
+NSTTTSSN                | JSR > 1100 (deepdup)
 TSSS                    | ADD
 TSSS                    | ADD
-SSSTTN                  | PUSH 3 (ptr)
-TTT                     | LOAD
+SSSTSSN                 | PUSH 4
+NSTTTSSN                | JSR > 1100 (deepdup)
 TTS                     | STORE
 
 TTS                     | STORE
 
-@ Decrement and check for loop end condition 'count == 0'.
-SSSTN                   | PUSH 1 (ptr)
-TTT                     | LOAD
+@ Check for loop end condition 'count == 0'.
 SNS                     | DUP
 NTSSSSTTSSSSSSSSSSTN    | BRZ > 00011000 00000001
 SNS                     | DUP
 NTSSSSTTSSSSSSSSSSTN    | BRZ > 00011000 00000001
+@ Decrement and loop again.
 SSSTN                   | PUSH 1
 TSST                    | SUBTRACT
 SSSTN                   | PUSH 1
 TSST                    | SUBTRACT
-SSSTN                   | PUSH 1 (ptr)
-SNT                     | SWAP
-TTS                     | STORE
 NSNSSSTTSSSSSSSSSSSN    | JMP > 00011000 00000000
 
 @ Clean up and return
 NSSVSSSTTSSSSSSSSSSTN   | Mark: 00011000 00000001
 SNN                     | DROP
 NSNSSSTTSSSSSSSSSSSN    | JMP > 00011000 00000000
 
 @ Clean up and return
 NSSVSSSTTSSSSSSSSSSTN   | Mark: 00011000 00000001
 SNN                     | DROP
+SNN                     | DROP
+SNN                     | DROP
 NTN                     | RTS
 
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NTN                     | RTS
 
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@ -58,39 +53,33 @@ NTN                     | RTS
 @   <empty>
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NSSVTTSSTN              | Mark: 11001 (memcpy)
 @   <empty>
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NSSVTTSSTN              | Mark: 11001 (memcpy)
-SSSTTN                  | PUSH 3
-NSTTTTTTN               | JSR > 11111 (spew)
 
 @ 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
-SSSTSN                  | PUSH 2 (ptr)
-TTT                     | LOAD
-SSSTN                   | PUSH 1 (ptr)
-TTT                     | LOAD
+SNS                     | DUP
+SSSTTN                  | PUSH 3
+NSTTTSSN                | JSR > 1100 (deepdup)
 TSSS                    | ADD
 TSSS                    | ADD
-SSSTTN                  | PUSH 3 (ptr)
-TTT                     | LOAD
-SSSTN                   | PUSH 1 (ptr)
-TTT                     | LOAD
+SSSTSN                  | PUSH 2
+NSTTTSSN                | JSR > 1100 (deepdup)
+SSSTSTN                 | PUSH 5
+NSTTTSSN                | JSR > 1100 (deepdup)
 TSSS                    | ADD
 TTT                     | LOAD
 TTS                     | STORE
 
 TSSS                    | ADD
 TTT                     | LOAD
 TTS                     | STORE
 
-@ Decrement and check for loop end conditions.
-SSSTN                   | PUSH 1 (ptr)
-TTT                     | LOAD
+@ Check for loop end conditions and decrement.
 SNS                     | DUP
 NTSSSSTTSSTSSSSSSSTN    | BRZ > 00011001 00000001
 SSSTN                   | PUSH 1
 TSST                    | SUBTRACT
 SNS                     | DUP
 NTSSSSTTSSTSSSSSSSTN    | BRZ > 00011001 00000001
 SSSTN                   | PUSH 1
 TSST                    | SUBTRACT
-SSSTN                   | PUSH 1 (ptr)
-SNT                     | SWAP
-TTS                     | STORE
 NSNSSSTTSSTSSSSSSSSN    | JMP > 00011001 00000000
 
 @ Clean up and return
 NSSVSSSTTSSTSSSSSSSTN   | Mark: 00011001 00000001
 SNN                     | DROP
 NSNSSSTTSSTSSSSSSSSN    | JMP > 00011001 00000000
 
 @ Clean up and return
 NSSVSSSTTSSTSSSSSSSTN   | Mark: 00011001 00000001
 SNN                     | DROP
+SNN                     | DROP
+SNN                     | DROP
 NTN                     | RTS
 
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NTN                     | RTS
 
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@ -106,28 +95,29 @@ NTN                     | RTS
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 #include <math.pvvs>
 NSSVTTSTSN              | Mark: 11010 (memrand)
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 #include <math.pvvs>
 NSSVTTSTSN              | Mark: 11010 (memrand)
-SSSTN                   | PUSH 1
-NSTTTTTTN               | JSR > 11111 (spew)
 
 @ Store random word into one memory location on each pass through this loop.
 NSSVSSSTTSTSSSSSSSSSN   | Mark: 00011010 00000000
 SNS                     | DUP
 
 @ Store random word into one memory location on each pass through this loop.
 NSSVSSSTTSTSSSSSSSSSN   | Mark: 00011010 00000000
 SNS                     | DUP
-SSSTN                   | PUSH 1 (ptr)
-TTT                     | LOAD
+SSSTTN                  | PUSH 3
+NSTTTSSN                | JSR > 1100 (deepdup)
 TSSS                    | ADD
 NSTTSSSSN               | JSR > 10000 (random)
 TTS                     | STORE
 
 @ Decrement and check loop end conditions
 TSSS                    | ADD
 NSTTSSSSN               | JSR > 10000 (random)
 TTS                     | STORE
 
 @ Decrement and check loop end conditions
+SNT                     | SWAP
 SNS                     | DUP
 NTSSSSTTSTSSSSSSSSTN    | BRZ > 00011010 00000001
 SSSTN                   | PUSH 1
 TSST                    | SUBTRACT
 SNS                     | DUP
 NTSSSSTTSTSSSSSSSSTN    | BRZ > 00011010 00000001
 SSSTN                   | PUSH 1
 TSST                    | SUBTRACT
+SNT                     | SWAP
 NSNSSSTTSTSSSSSSSSSN    | JMP > 00011010 00000000
 
 @ Clean up and return
 NSSVSSSTTSTSSSSSSSSTN   | Mark: 00011010 00000001
 SNN                     | DROP
 NSNSSSTTSTSSSSSSSSSN    | JMP > 00011010 00000000
 
 @ Clean up and return
 NSSVSSSTTSTSSSSSSSSTN   | Mark: 00011010 00000001
 SNN                     | DROP
+SNN                     | DROP
 NTN                     | RTS
 
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NTN                     | RTS
 
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@@ -147,41 +137,54 @@ NTN                     | RTS
 @   retvalue <-- TOS
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NSSVTTSTTN              | Mark: 11011 (memcmp)
 @   retvalue <-- TOS
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NSSVTTSTTN              | Mark: 11011 (memcmp)
-SSSTSN                  | PUSH 2
-NSTTTTTTN               | JSR > 11111 (spew)
 
 @ Compare one word on each pass through this loop.
 
 @ Compare one word on each pass through this loop.
+@ TOS> blk2ptr, blk1ptr, count
 NSSVSSSTTSTTSSSSSSSSN   | Mark: 00011011 00000000
 NSSVSSSTTSTTSSSSSSSSN   | Mark: 00011011 00000000
+@ Retrieve *blk2ptr
 SNS                     | DUP
 SNS                     | DUP
-SNS                     | DUP
-SSSTN                   | PUSH 1 (ptr)
-TTT                     | LOAD
+SSSTSSN                 | PUSH 4
+NSTTTSSN                | JSR > 1100 (deepdup)
 TSSS                    | ADD
 TTT                     | LOAD
 TSSS                    | ADD
 TTT                     | LOAD
-SNT                     | SWAP
-SSTSN                   | PUSH 2 (ptr)
-TTT                     | LOAD
+@ Retrieve *blk1ptr
+SSSTTN                  | PUSH 3
+NSTTTSSN                | JSR > 1100 (deepdup)
+SSSTSTN                 | PUSH 5
+NSTTTSSN                | JSR > 1100 (deepdup)
 TSSS                    | ADD
 TTT                     | LOAD
 TSSS                    | ADD
 TTT                     | LOAD
+@ Compare
 TSST                    | SUBTRACT
 TSST                    | SUBTRACT
+@ TOS> *blk2ptr-*blk1ptr, blk2ptr, blk1ptr, count
 NTSSSSTTSTTSSSSSSTSN    | BRZ > 00011011 00000010 (jump if words match)
 
 @ Return 'match? = false'
 SNN                     | DROP
 NTSSSSTTSTTSSSSSSTSN    | BRZ > 00011011 00000010 (jump if words match)
 
 @ Return 'match? = false'
 SNN                     | DROP
+SNN                     | DROP
+SNN                     | DROP
 SSSTN                   | PUSH 1
 NTN                     | RTS
 
 @ Decrement and loop again if loop is not complete.
 NSSVSSSTTSTTSSSSSSTSN   | Mark: 00011011 00000010
 SSSTN                   | PUSH 1
 NTN                     | RTS
 
 @ Decrement and loop again if loop is not complete.
 NSSVSSSTTSTTSSSSSSTSN   | Mark: 00011011 00000010
-SNS                     | DUP
+SSSTTN                  | PUSH 3
+NSTTTSSN                | JSR > 1100 (deepdup)
+@ TOS> count, blk2ptr, blk1ptr, count
 NTSSSSTTSTTSSSSSSSTN    | BRZ > 00011011 00000001 (jump if loop is complete)
 NTSSSSTTSTTSSSSSSSTN    | BRZ > 00011011 00000001 (jump if loop is complete)
+SSSTTN                  | PUSH 3
+NSTTSTTN                | JSR > 1011 (stackrotatereverse)
 SSSTN                   | PUSH 1
 SSSTN                   | PUSH 1
-TSST                    | SUBTRACT
+TSSS                    | ADD
+SSSTTN                  | PUSH 3
+NSTTSTSN                | JSR > 1010 (stackrotate)
 NSNSSSTTSTTSSSSSSSSN    | JMP > 00011011 00000000
 
 @ Return 'match? = true'
 NSSVSSSTTSTTSSSSSSSTN   | Mark: 00011011 00000001
 SNN                     | DROP
 NSNSSSTTSTTSSSSSSSSN    | JMP > 00011011 00000000
 
 @ Return 'match? = true'
 NSSVSSSTTSTTSSSSSSSTN   | Mark: 00011011 00000001
 SNN                     | DROP
+SNN                     | DROP
+SNN                     | DROP
 SSSSN                   | PUSH 0
 NTN                     | RTS
 
 SSSSN                   | PUSH 0
 NTN                     | RTS
 
@@ -200,39 +203,56 @@ NTN                     | RTS
 @   pointer <-- TOS
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NSSVTTTSSN              | Mark: 11100 (memsrch)
 @   pointer <-- TOS
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NSSVTTTSSN              | Mark: 11100 (memsrch)
-SSSTTN                  | PUSH 3
-NSTTTTTTN               | JSR > 11111 (spew)
+
+@ Setup an 'offset counter' on the stack.
+SSSSN                   | PUSH 0
 
 @ Compare one word on each pass through this loop.
 
 @ Compare one word on each pass through this loop.
+@ TOS> counter, address, count, pattern
 NSSVSSSTTTSSSSSSSSSSN   | Mark: 00011100 00000000
 NSSVSSSTTTSSSSSSSSSSN   | Mark: 00011100 00000000
+SNT                     | SWAP
 SNS                     | DUP
 SNS                     | DUP
-SSSTN                   | PUSH 1 (ptr)
-TTT                     | LOAD
+SSSTTN                  | PUSH 3
+NSTTSTTN                | JSR > 1011 (stackrotatereverse)
+SNS                     | DUP
+SSSTTN                  | PUSH 3
+NSTTSTTN                | JSR > 1011 (stackrotatereverse)
 TSSS                    | ADD
 TTT                     | LOAD
 TSSS                    | ADD
 TTT                     | LOAD
-SSSTTN                  | PUSH 3 (ptr)
-TTT                     | LOAD
+SSSTSTN                 | PUSH 5
+NSTTTSSN                | JSR > 1100 (deepdup)
 TSST                    | SUBTRACT
 TSST                    | SUBTRACT
+@ TOS> pattern-(address+counter), counter, address, count, pattern
 NTSSSSTTTSSSSSSSSSTN    | BRZ > 00011100 00000001
 NTSSSSTTTSSSSSSSSSTN    | BRZ > 00011100 00000001
+
+@ Test for end of loop by comparing 'counter' and 'count'.
 SNS                     | DUP
 SNS                     | DUP
-SSSTSN                  | PUSH 2 (ptr)
-TTT                     | LOAD
+SSSTSSN                 | PUSH 4
+NSTTTSSN                | JSR > 1100 (deepdup)
 TSST                    | SUBTRACT
 TSST                    | SUBTRACT
+@ TOS> counter-count, counter, address, count, pattern
 NTSSSSTTTSSSSSSSSTSN    | BRZ > 00011100 00000010
 NTSSSSTTTSSSSSSSSTSN    | BRZ > 00011100 00000010
+
+@ Increment 'counter' and loop again.
 SSSTN                   | PUSH 1
 TSSS                    | ADD
 NSNSSSTTTSSSSSSSSSSN    | JMP > 00011100 00000000
 
 @ Found a match. Clean up and return.
 NSSVSSSTTTSSSSSSSSSTN   | Mark: 00011100 00000001
 SSSTN                   | PUSH 1
 TSSS                    | ADD
 NSNSSSTTTSSSSSSSSSSN    | JMP > 00011100 00000000
 
 @ Found a match. Clean up and return.
 NSSVSSSTTTSSSSSSSSSTN   | Mark: 00011100 00000001
-SSSTN                   | PUSH 1 (ptr)
-TTT                     | LOAD
 TSSS                    | ADD
 TSSS                    | ADD
+SNT                     | SWAP
+SNN                     | DROP
+SNT                     | SWAP
+SNN                     | DROP
 NTN                     | RTS
 
 @ No match found. Clean up and return.
 NSSVSSSTTTSSSSSSSSTSN   | Mark: 00011100 00000010
 SNN                     | DROP
 NTN                     | RTS
 
 @ No match found. Clean up and return.
 NSSVSSSTTTSSSSSSSSTSN   | Mark: 00011100 00000010
 SNN                     | DROP
+SNN                     | DROP
+SNN                     | DROP
+SNN                     | DROP
 SSSSN                   | PUSH 0
 NTN                     | RTS
 
 SSSSN                   | PUSH 0
 NTN                     | RTS
 
@@ -240,31 +260,43 @@ NTN                     | RTS
 @ Name:
 @   slurp (11110)
 @ Description:
 @ Name:
 @   slurp (11110)
 @ Description:
-@   Reads 'count' values from heap to stack in complementary order to 'spew'.
+@   Reads values from heap to stack in complementary order to 'spew'.
 @ Call Stack:
 @ Call Stack:
-@   count
+@   address
+@   count  <-- TOS
 @ Return Stack:
 @ Return Stack:
-@   heap[count]
+@   heap[address+count]
 @   ...
 @   ...
-@   heap[2]
-@   heap[1]      <-- TOS
+@   heap[address+1]
+@   heap[address]  <-- TOS
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+#include <stack.pvvs>
 NSSVTTTTSN              | Mark: 11110 (slurp)
 
 @ Load one word from heap on each pass.
 NSSVTTTTSN              | Mark: 11110 (slurp)
 
 @ Load one word from heap on each pass.
-NSSVSSSTTTTSSSSSSSSSN   | Mark: 00011110 00000000
 SNS                     | DUP
 SNS                     | DUP
+SSSTTN                  | PUSH 3
+NSTTSTSN                | JSR > 1010 (stackrotate)
+SNT                     | SWAP
+SNS                     | DUP
+SSSTTN                  | PUSH 3
+NSTTSTSN                | JSR > 1010 (stackrotate)
+TSSS                    | ADD
 TTT                     | LOAD
 TTT                     | LOAD
+SSSTTN                  | PUSH 3
+NSTTSTSN                | JSR > 1010 (stackrotate)
 SNT                     | SWAP
 
 @ Check for loop completion.
 SNT                     | SWAP
 
 @ Check for loop completion.
-@ As a side effect, prepare the next address.
+SNS                     | DUP
+NTSSSSTTTTSSSSSSSSSN    | BRZ > 00011110 00000000
 SSSTN                   | PUSH 1
 TSST                    | SUBTRACT
 SSSTN                   | PUSH 1
 TSST                    | SUBTRACT
-SNS                     | DUP
-NTSSSSTTTTSSSSSSSSTN    | BRZ > 00011110 00000001
-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
 NTN                     | RTS
 
@@ -272,54 +304,57 @@ NTN                     | RTS
 @ Name:
 @   spew (11111)
 @ Description:
 @ Name:
 @   spew (11111)
 @ Description:
-@   Writes 'count' values from stack to heap in this order:
-@     TOS   -> heap[1]
-@     TOS+1 -> heap[2]
+@   Writes values from stack to heap in this order:
+@     TOS   -> heap[address]
+@     TOS+1 -> heap[address+1]
 @     ...
 @     ...
-@     TOS+n -> heap[count]
-@   This is the only stdlib function which uses heap[0] for storage.
+@     TOS+n -> heap[address+count]
 @ Call Stack:
 @   data-words
 @   ...
 @   data-words
 @ Call Stack:
 @   data-words
 @   ...
 @   data-words
+@   address
 @   count  <-- TOS
 @ Return Stack:
 @   <empty>
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 @   count  <-- TOS
 @ Return Stack:
 @   <empty>
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+#include <stack.pvvs>
 NSSVTTTTTN              | Mark: 11111 (spew)
 
 NSSVTTTTTN              | Mark: 11111 (spew)
 
-@ Create a counter in heap[0] that doubles as a destination pointer generator.
-SSSSN                   | PUSH 0 (ptr)
-SSSTN                   | PUSH 1
-TTS                     | STORE
+@ Create a counter that doubles as a dest. pointer offset generator.
+SSSSN                   | PUSH 0
 
 @ Store one word to heap on each pass.
 NSSVSSSTTTTTSSSSSSSSN   | Mark: 00011111 00000000
 
 @ Store one word to heap on each pass.
 NSSVSSSTTTTTSSSSSSSSN   | Mark: 00011111 00000000
-SNT                     | SWAP
-SSSSN                   | PUSH 0 (ptr)
-TTT                     | LOAD
-SNT                     | SWAP
+SNS                     | DUP
+SSSTSSN                 | PUSH 4
+NSTTTSSN                | JSR > 1100 (deepdup)
+TSSS                    | ADD
+SSSTSTN                 | PUSH 5
+NSTTSTTN                | JSR > 1011 (stackrotatereverse)
 TTS                     | STORE
 
 @ Check for loop completion.
 TTS                     | STORE
 
 @ Check for loop completion.
+SNT                     | SWAP
 SNS                     | DUP
 SNS                     | DUP
-SSSSN                   | PUSH 0 (ptr)
-TTT                     | LOAD
+SSSTTN                  | PUSH 3
+NSTTSTTN                | JSR > 1011 (stackrotatereverse)
+SNS                     | DUP
+SSSTTN                  | PUSH 3
+NSTTSTTN                | JSR > 1011 (stackrotatereverse)
 TSST                    | SUBTRACT
 NTSSSSTTTTTSSSSSSSTN    | BRZ > 00011111 00000001
 
 TSST                    | SUBTRACT
 NTSSSSTTTTTSSSSSSSTN    | BRZ > 00011111 00000001
 
-@ Increment heap[0] if continuing.
-SSSSN                   | PUSH 0 (ptr)
-SNS                     | DUP
-TTT                     | LOAD
-SSSTN                   | PUSH 1
+@ Increment counter.
+SSSTN                  | PUSH 1
 TSSS                    | ADD
 TSSS                    | ADD
-TTS                     | STORE
 NSNSSSTTTTTSSSSSSSSN    | JMP > 00011111 00000000
 
 @ Clean up and return.
 NSSVSSSTTTTTSSSSSSSTN   | Mark: 00011111 00000001
 SNN                     | DROP
 NSNSSSTTTTTSSSSSSSSN    | JMP > 00011111 00000000
 
 @ Clean up and return.
 NSSVSSSTTTTTSSSSSSSTN   | Mark: 00011111 00000001
 SNN                     | DROP
+SNN                     | DROP
+SNN                     | DROP
 NTN                     | RTS
 
 #endif
 NTN                     | RTS
 
 #endif