@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Writes 'pattern' in memory locations 'startaddr' to 'startaddr+count'.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
NSSVTTSSSN | Mark: 11000 (memset)
@ Store 'pattern' into one memory location on each pass through this loop.
NSSVSSSTTSSSSSSSSSSSN | Mark: 00011000 00000000
NSTTTSSN | JSR > 1100 (deepdup)
NSTTTSSN | JSR > 1100 (deepdup)
@ Check for loop end condition 'count == 0'.
NTSSSSTTSSSSSSSSSSTN | BRZ > 00011000 00000001
@ Decrement and loop again.
NSNSSSTTSSSSSSSSSSSN | JMP > 00011000 00000000
NSSVSSSTTSSSSSSSSSSTN | Mark: 00011000 00000001
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Copies 'count+1' words from 'source' to 'destination'.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
NSSVTTSSTN | Mark: 11001 (memcpy)
@ Copy one word on each pass through this loop.
NSSVSSSTTSSTSSSSSSSSN | Mark: 00011001 00000000
NSTTTSSN | JSR > 1100 (deepdup)
NSTTTSSN | JSR > 1100 (deepdup)
NSTTTSSN | JSR > 1100 (deepdup)
@ Check for loop end conditions and decrement.
NTSSSSTTSSTSSSSSSSTN | BRZ > 00011001 00000001
NSNSSSTTSSTSSSSSSSSN | JMP > 00011001 00000000
NSSVSSSTTSSTSSSSSSSTN | Mark: 00011001 00000001
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Writes random words into memory locations 'startaddr' to 'startaddr+count'.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
NSSVTTSTSN | Mark: 11010 (memrand)
@ Store random word into one memory location on each pass through this loop.
NSSVSSSTTSTSSSSSSSSSN | Mark: 00011010 00000000
NSTTTSSN | JSR > 1100 (deepdup)
NSTTSSSSN | JSR > 10000 (random)
@ Decrement and check loop end conditions
NTSSSSTTSTSSSSSSSSTN | BRZ > 00011010 00000001
NSNSSSTTSTSSSSSSSSSN | JMP > 00011010 00000000
NSSVSSSTTSTSSSSSSSSTN | Mark: 00011010 00000001
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Compares two blocks of memory:
@ blk1ptr -> blk1ptr+count
@ blk2ptr -> blk2ptr+count
@ The return value is zero if the blocks are identical, otherwise non-zero.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
NSSVTTSTTN | Mark: 11011 (memcmp)
@ Compare one word on each pass through this loop.
@ TOS> blk2ptr, blk1ptr, count
NSSVSSSTTSTTSSSSSSSSN | Mark: 00011011 00000000
NSTTTSSN | JSR > 1100 (deepdup)
NSTTTSSN | JSR > 1100 (deepdup)
NSTTTSSN | JSR > 1100 (deepdup)
@ TOS> *blk2ptr-*blk1ptr, blk2ptr, blk1ptr, count
NTSSSSTTSTTSSSSSSTSN | BRZ > 00011011 00000010 (jump if words match)
@ Return 'match? = false'
@ Decrement and loop again if loop is not complete.
NSSVSSSTTSTTSSSSSSTSN | Mark: 00011011 00000010
NSTTTSSN | JSR > 1100 (deepdup)
@ TOS> count, blk2ptr, blk1ptr, count
NTSSSSTTSTTSSSSSSSTN | BRZ > 00011011 00000001 (jump if loop is complete)
NSTTSTTN | JSR > 1011 (stackrotatereverse)
NSTTSTSN | JSR > 1010 (stackrotate)
NSNSSSTTSTTSSSSSSSSN | JMP > 00011011 00000000
NSSVSSSTTSTTSSSSSSSTN | Mark: 00011011 00000001
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ 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.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
NSSVTTTSSN | Mark: 11100 (memsrch)
@ Setup an 'offset counter' on the stack.
@ Compare one word on each pass through this loop.
@ TOS> counter, address, count, pattern
NSSVSSSTTTSSSSSSSSSSN | Mark: 00011100 00000000
NSTTSTTN | JSR > 1011 (stackrotatereverse)
NSTTSTTN | JSR > 1011 (stackrotatereverse)
NSTTTSSN | JSR > 1100 (deepdup)
@ TOS> pattern-(address+counter), counter, address, count, pattern
NTSSSSTTTSSSSSSSSSTN | BRZ > 00011100 00000001
@ Test for end of loop by comparing 'counter' and 'count'.
NSTTTSSN | JSR > 1100 (deepdup)
@ TOS> counter-count, counter, address, count, pattern
NTSSSSTTTSSSSSSSSTSN | BRZ > 00011100 00000010
@ Increment 'counter' and loop again.
NSNSSSTTTSSSSSSSSSSN | JMP > 00011100 00000000
@ Found a match. Clean up and return.
NSSVSSSTTTSSSSSSSSSTN | Mark: 00011100 00000001
@ No match found. Clean up and return.
NSSVSSSTTTSSSSSSSSTSN | Mark: 00011100 00000010
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Reads values from heap to stack in complementary order to 'spew'.
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
NSSVTTTTSN | Mark: 11110 (slurp)
@ Load one word from heap on each pass.
NSTTSTSN | JSR > 1010 (stackrotate)
NSTTSTSN | JSR > 1010 (stackrotate)
NSTTSTSN | JSR > 1010 (stackrotate)
@ Check for loop completion.
NTSSSSTTTTSSSSSSSSSN | BRZ > 00011110 00000000
NSNTTTTSN | JMP > 11110 (slurp)
NSSVSSSTTTTSSSSSSSSSN | Mark: 00011110 00000000
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Writes values from stack to heap in this order:
@ TOS+1 -> heap[address+1]
@ TOS+n -> heap[address+count]
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
NSSVTTTTTN | Mark: 11111 (spew)
@ Create a counter that doubles as a dest. pointer offset generator.
@ Store one word to heap on each pass.
NSSVSSSTTTTTSSSSSSSSN | Mark: 00011111 00000000
NSTTTSSN | JSR > 1100 (deepdup)
NSTTSTTN | JSR > 1011 (stackrotatereverse)
@ Check for loop completion.
NSTTSTTN | JSR > 1011 (stackrotatereverse)
NSTTSTTN | JSR > 1011 (stackrotatereverse)
NTSSSSTTTTTSSSSSSSTN | BRZ > 00011111 00000001
NSNSSSTTTTTSSSSSSSSN | JMP > 00011111 00000000
NSSVSSSTTTTTSSSSSSSTN | Mark: 00011111 00000001