X-Git-Url: http://git.subgeniuskitty.com/vvhitespace/.git/blobdiff_plain/769749143b0ad46735cd1dd4cf388455c73eeba7..6cb31a3ecea681051cfa36fde3f17b18f8eacfea:/stdlib/heap.pvvs diff --git a/stdlib/heap.pvvs b/stdlib/heap.pvvs index 4953fad..2c5eb79 100644 --- a/stdlib/heap.pvvs +++ b/stdlib/heap.pvvs @@ -14,35 +14,30 @@ @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ NSSVTTSSSN | Mark: 11000 (memset) -SSSTTN | PUSH 3 -NSTTSSSSSTN | JSR > 1000001 (spewreg) @ 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 -SSSTTN | PUSH 3 (ptr) -TTT | LOAD +SSSTSSN | PUSH 4 +NSTTTSSN | JSR > 1100 (deepdup) 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 +@ Decrement and loop again. 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 +SNN | DROP +SNN | DROP NTN | RTS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ -58,39 +53,33 @@ NTN | RTS @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ NSSVTTSSTN | Mark: 11001 (memcpy) -SSSTTN | PUSH 3 -NSTTSSSSSTN | JSR > 1000001 (spewreg) @ 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 -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 -@ 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 -SSSTN | PUSH 1 (ptr) -SNT | SWAP -TTS | STORE NSNSSSTTSSTSSSSSSSSN | JMP > 00011001 00000000 @ Clean up and return NSSVSSSTTSSTSSSSSSSTN | Mark: 00011001 00000001 SNN | DROP +SNN | DROP +SNN | DROP NTN | RTS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ -106,28 +95,29 @@ NTN | RTS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #include NSSVTTSTSN | Mark: 11010 (memrand) -SSSTN | PUSH 1 -NSTTSSSSSTN | JSR > 1000001 (spewreg) @ 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 +SNT | SWAP 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 +SNN | DROP NTN | RTS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ -147,41 +137,54 @@ NTN | RTS @ retvalue <-- TOS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ NSSVTTSTTN | Mark: 11011 (memcmp) -SSSTSN | PUSH 2 -NSTTSSSSSTN | JSR > 1000001 (spewreg) @ Compare one word on each pass through this loop. +@ TOS> blk2ptr, blk1ptr, count NSSVSSSTTSTTSSSSSSSSN | Mark: 00011011 00000000 +@ Retrieve *blk2ptr SNS | DUP -SNS | DUP -SSSTN | PUSH 1 (ptr) -TTT | LOAD +SSSTSSN | PUSH 4 +NSTTTSSN | JSR > 1100 (deepdup) 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 +@ Compare TSST | SUBTRACT +@ TOS> *blk2ptr-*blk1ptr, blk2ptr, blk1ptr, count 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 -SNS | DUP +SSSTTN | PUSH 3 +NSTTTSSN | JSR > 1100 (deepdup) +@ TOS> count, blk2ptr, blk1ptr, count NTSSSSTTSTTSSSSSSSTN | BRZ > 00011011 00000001 (jump if loop is complete) +SSSTTN | PUSH 3 +NSTTSTTN | JSR > 1011 (stackrotatereverse) 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 +SNN | DROP +SNN | DROP SSSSN | PUSH 0 NTN | RTS @@ -200,133 +203,57 @@ NTN | RTS @ pointer <-- TOS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ NSSVTTTSSN | Mark: 11100 (memsrch) -SSSTTN | PUSH 3 -NSTTSSSSSTN | JSR > 1000001 (spewreg) + +@ Setup an 'offset counter' on the stack. +SSSSN | PUSH 0 @ Compare one word on each pass through this loop. +@ TOS> counter, address, count, pattern NSSVSSSTTTSSSSSSSSSSN | Mark: 00011100 00000000 +SNT | SWAP 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 -SSSTTN | PUSH 3 (ptr) -TTT | LOAD +SSSTSTN | PUSH 5 +NSTTTSSN | JSR > 1100 (deepdup) TSST | SUBTRACT +@ TOS> pattern-(address+counter), counter, address, count, pattern NTSSSSTTTSSSSSSSSSTN | BRZ > 00011100 00000001 + +@ Test for end of loop by comparing 'counter' and 'count'. SNS | DUP -SSSTSN | PUSH 2 (ptr) -TTT | LOAD +SSSTSSN | PUSH 4 +NSTTTSSN | JSR > 1100 (deepdup) TSST | SUBTRACT +@ TOS> counter-count, counter, address, count, pattern 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 (ptr) -TTT | LOAD 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 -SSSSN | PUSH 0 -NTN | RTS - -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@ Name: -@ slurpreg (1000000) -@ Description: -@ Reads 'count' values from heap to stack in complementary order to 'spewreg'. -@ Call Stack: -@ count -@ Return Stack: -@ heap[count] -@ ... -@ heap[2] -@ heap[1] <-- TOS -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -NSSVTSSSSSSN | Mark: 1000000 (slurpreg) - -@ Load one word from heap on each pass. -NSSVSTSSSSSSSSSSSSSSN | Mark: 01000000 00000000 -SNS | DUP -TTT | LOAD -SNT | SWAP - -@ Check for loop completion. -@ As a side effect, prepare the next address. -SSSTN | PUSH 1 -TSST | SUBTRACT -SNS | DUP -NTSSTSSSSSSSSSSSSSTN | BRZ > 01000000 00000001 -NSNSTSSSSSSSSSSSSSSN | JMP > 01000000 00000000 -NSSVSTSSSSSSSSSSSSSTN | Mark: 01000000 00000001 SNN | DROP -NTN | RTS - -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -@ Name: -@ spewreg (1000001) -@ Description: -@ Writes 'count' values from stack to heap in this order: -@ TOS -> heap[1] -@ TOS+1 -> heap[2] -@ ... -@ TOS+n -> heap[count] -@ 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 -@ ... -@ data-words -@ count <-- TOS -@ Return Stack: -@ -@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ -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[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 -SSSTTTTN | PUSH 15 (ptr) -TTT | LOAD -SNT | SWAP -TTS | STORE - -@ Check for loop completion. -SNS | DUP -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 +SNN | DROP +SSSSN | PUSH 0 NTN | RTS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @@ -343,6 +270,7 @@ NTN | RTS @ heap[address+1] @ heap[address] <-- TOS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#include NSSVTTTTSN | Mark: 11110 (slurp) @ Load one word from heap on each pass. @@ -390,44 +318,43 @@ NTN | RTS @ Return Stack: @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#include 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) +@ Create a counter that doubles as a dest. pointer offset generator. 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 +SNS | DUP +SSSTSSN | PUSH 4 +NSTTTSSN | JSR > 1100 (deepdup) TSSS | ADD -SNT | SWAP +SSSTSTN | PUSH 5 +NSTTSTTN | JSR > 1011 (stackrotatereverse) TTS | STORE @ Check for loop completion. -SSSTN | PUSH 1 (ptr) -TTT | LOAD -SSSTTN | PUSH 3 (ptr) -TTT | LOAD +SNT | SWAP +SNS | DUP +SSSTTN | PUSH 3 +NSTTSTTN | JSR > 1011 (stackrotatereverse) +SNS | DUP +SSSTTN | PUSH 3 +NSTTSTTN | JSR > 1011 (stackrotatereverse) TSST | SUBTRACT NTSSSSTTTTTSSSSSSSTN | BRZ > 00011111 00000001 -@ Increment heap[3] if continuing. -SSSTTN | PUSH 3 (ptr) -SNS | DUP -TTT | LOAD -SSSTN | PUSH 1 +@ Increment counter. +SSSTN | PUSH 1 TSSS | ADD -TTS | STORE NSNSSSTTTTTSSSSSSSSN | JMP > 00011111 00000000 @ Clean up and return. NSSVSSSTTTTTSSSSSSSTN | Mark: 00011111 00000001 +SNN | DROP +SNN | DROP +SNN | DROP NTN | RTS #endif