X-Git-Url: http://git.subgeniuskitty.com/vvhitespace/.git/blobdiff_plain/bb21580a5abba6a1e6666e9fb363f68d40f785d7..6cb31a3ecea681051cfa36fde3f17b18f8eacfea:/stdlib/heap.pvvs diff --git a/stdlib/heap.pvvs b/stdlib/heap.pvvs index d753363..2c5eb79 100644 --- a/stdlib/heap.pvvs +++ b/stdlib/heap.pvvs @@ -14,35 +14,30 @@ @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 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 -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 -NSTTTTTTN | JSR > 11111 (spew) @ 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 -NSTTTTTTN | JSR > 11111 (spew) @ 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 -NSTTTTTTN | JSR > 11111 (spew) @ 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,39 +203,56 @@ NTN | RTS @ 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. +@ 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 +SNN | DROP +SNN | DROP +SNN | DROP SSSSN | PUSH 0 NTN | RTS @@ -240,31 +260,43 @@ NTN | RTS @ 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: -@ count +@ address +@ count <-- TOS @ Return Stack: -@ heap[count] +@ heap[address+count] @ ... -@ heap[2] -@ heap[1] <-- TOS +@ heap[address+1] +@ heap[address] <-- TOS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#include NSSVTTTTSN | Mark: 11110 (slurp) @ Load one word from heap on each pass. -NSSVSSSTTTTSSSSSSSSSN | Mark: 00011110 00000000 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. +SNS | DUP +NTSSSSTTTTSSSSSSSSSN | BRZ > 00011110 00000000 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 @@ -272,54 +304,57 @@ NTN | RTS @ 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 +@ address @ count <-- TOS @ Return Stack: @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#include 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 -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. +SNT | SWAP 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 -@ Increment heap[0] if continuing. -SSSSN | PUSH 0 (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