#ifndef VVS_STDLIB_HEAP #define VVS_STDLIB_HEAP @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ Name: @ memset (11000) @ Description: @ Writes 'pattern' in memory locations 'startaddr' to 'startaddr+count'. @ Call Stack: @ pattern @ startaddr @ count <-- TOS @ Return Stack: @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ NSSVTTSSSN | Mark: 11000 (memset) @ Store 'pattern' into one memory location on each pass through this loop. NSSVSSSTTSSSSSSSSSSSN | Mark: 00011000 00000000 SNS | DUP SSSTTN | PUSH 3 NSTTTSSN | JSR > 1100 (deepdup) TSSS | ADD SSSTSSN | PUSH 4 NSTTTSSN | JSR > 1100 (deepdup) TTS | STORE @ Check for loop end condition 'count == 0'. SNS | DUP NTSSSSTTSSSSSSSSSSTN | BRZ > 00011000 00000001 @ Decrement and loop again. SSSTN | PUSH 1 TSST | SUBTRACT NSNSSSTTSSSSSSSSSSSN | JMP > 00011000 00000000 @ Clean up and return NSSVSSSTTSSSSSSSSSSTN | Mark: 00011000 00000001 SNN | DROP SNN | DROP SNN | DROP NTN | RTS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ Name: @ memcpy (11001) @ Description: @ Copies 'count+1' words from 'source' to 'destination'. @ Call Stack: @ source @ destination @ count <-- TOS @ Return Stack: @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ NSSVTTSSTN | Mark: 11001 (memcpy) @ Copy one word on each pass through this loop. NSSVSSSTTSSTSSSSSSSSN | Mark: 00011001 00000000 SNS | DUP SSSTTN | PUSH 3 NSTTTSSN | JSR > 1100 (deepdup) TSSS | ADD SSSTSN | PUSH 2 NSTTTSSN | JSR > 1100 (deepdup) SSSTSTN | PUSH 5 NSTTTSSN | JSR > 1100 (deepdup) TSSS | ADD TTT | LOAD TTS | STORE @ Check for loop end conditions and decrement. SNS | DUP NTSSSSTTSSTSSSSSSSTN | BRZ > 00011001 00000001 SSSTN | PUSH 1 TSST | SUBTRACT NSNSSSTTSSTSSSSSSSSN | JMP > 00011001 00000000 @ Clean up and return NSSVSSSTTSSTSSSSSSSTN | Mark: 00011001 00000001 SNN | DROP SNN | DROP SNN | DROP NTN | RTS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ Name: @ memrand (11010) @ Description: @ Writes random words into memory locations 'startaddr' to 'startaddr+count'. @ Call Stack: @ count @ startaddr <-- TOS @ Return Stack: @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #include NSSVTTSTSN | Mark: 11010 (memrand) @ Store random word into one memory location on each pass through this loop. NSSVSSSTTSTSSSSSSSSSN | Mark: 00011010 00000000 SNS | DUP 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 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ Name: @ memcmp (11011) @ Description: @ Compares two blocks of memory: @ blk1ptr -> blk1ptr+count @ -- versus -- @ blk2ptr -> blk2ptr+count @ The return value is zero if the blocks are identical, otherwise non-zero. @ Call Stack: @ count @ blk1ptr @ blk2ptr <-- TOS @ Return Stack: @ retvalue <-- TOS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ NSSVTTSTTN | Mark: 11011 (memcmp) @ Compare one word on each pass through this loop. @ TOS> blk2ptr, blk1ptr, count NSSVSSSTTSTTSSSSSSSSN | Mark: 00011011 00000000 @ Retrieve *blk2ptr SNS | DUP SSSTSSN | PUSH 4 NSTTTSSN | JSR > 1100 (deepdup) TSSS | ADD 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 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 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 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ Name: @ memsrch (11100) @ Description: @ Searches the heap from 'address' to 'address+count'. @ If 'pattern' is found, the return value is a pointer to the matching word. @ If not found, the return value is a null pointer. @ Call Stack: @ pattern @ count @ address <-- TOS @ Return Stack: @ pointer <-- TOS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ NSSVTTTSSN | Mark: 11100 (memsrch) @ 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 SSSTTN | PUSH 3 NSTTSTTN | JSR > 1011 (stackrotatereverse) SNS | DUP SSSTTN | PUSH 3 NSTTSTTN | JSR > 1011 (stackrotatereverse) TSSS | ADD 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 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 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 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ 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 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #include 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: @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #include NSSVTTTTTN | Mark: 11111 (spew) @ 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 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 SSSTTN | PUSH 3 NSTTSTTN | JSR > 1011 (stackrotatereverse) SNS | DUP SSSTTN | PUSH 3 NSTTSTTN | JSR > 1011 (stackrotatereverse) TSST | SUBTRACT NTSSSSTTTTTSSSSSSSTN | BRZ > 00011111 00000001 @ Increment counter. SSSTN | PUSH 1 TSSS | ADD NSNSSSTTTTTSSSSSSSSN | JMP > 00011111 00000000 @ Clean up and return. NSSVSSSTTTTTSSSSSSSTN | Mark: 00011111 00000001 SNN | DROP SNN | DROP SNN | DROP NTN | RTS #endif