Added memsrch function to VVS stdlib.
[vvhitespace] / stdlib / heap.pvvs
#ifndef VVS_STDLIB_HEAP
#define VVS_STDLIB_HEAP
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Description:
@ This function writes pattern into the memory locations:
@ startaddr -> startaddr+count
@ Call Stack:
@ pattern
@ startaddr
@ count <-- TOS
@ Return Stack:
@ <empty>
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
NSSVTTSSSN | Mark: 11000 (memset)
@ Prepare the stack for computation.
@ Addr | Contents
@ 0 | count
@ 1 | startaddr
@ 2 | pattern
SSSSN | PUSH 0 (ptr)
SNT | SWAP
TTS | STORE
SSSTN | PUSH 1 (ptr)
SNT | SWAP
TTS | STORE
SSSTSN | PUSH 2 (ptr)
SNT | SWAP
TTS | STORE
@ Store pattern into one memory location on each pass through this loop.
NSSVSSSTTSSSSSSSSSSSN | Mark: 00011000 00000000
SSSSN | PUSH 0 (ptr)
TTT | LOAD
SSSTN | PUSH 1 (ptr)
TTT | LOAD
TSSS | ADD
SSSTSN | PUSH 2 (ptr)
TTT | LOAD
TTS | STORE
@ Decrement and check for loop end condition count == 0.
SSSSN | PUSH 0 (ptr)
TTT | LOAD
SNS | DUP
NTSSSSTTSSSSSSSSSSTN | BRZ > 00011000 00000001
SSSTN | PUSH 1
TSST | SUBTRACT
SSSSN | PUSH 0 (ptr)
SNT | SWAP
TTS | STORE
NSNSSSTTSSSSSSSSSSSN | JMP > 00011000 00000000
@ Clean up and return
NSSVSSSTTSSSSSSSSSSTN | Mark: 00011000 00000001
SNN | DROP
NTN | RTS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Description:
@ This function copies count+1 words from source to destination.
@ Call Stack:
@ source
@ destination
@ count <-- TOS
@ Return Stack:
@ <empty>
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
NSSVTTSSTN | Mark: 11001 (memcpy)
@ Prepare the stack for computation.
@ Addr | Contents
@ 0 | count
@ 1 | destination
@ 2 | source
SSSSN | PUSH 0 (ptr)
SNT | SWAP
TTS | STORE
SSSTN | PUSH 1 (ptr)
SNT | SWAP
TTS | STORE
SSSTSN | PUSH 2 (ptr)
SNT | SWAP
TTS | STORE
@ Copy one word on each pass through this loop.
NSSVSSSTTSSTSSSSSSSSN | Mark: 00011001 00000000
SSSTN | PUSH 1 (ptr)
TTT | LOAD
SSSSN | PUSH 0 (ptr)
TTT | LOAD
TSSS | ADD
SSSTSN | PUSH 2 (ptr)
TTT | LOAD
SSSSN | PUSH 0 (ptr)
TTT | LOAD
TSSS | ADD
TTT | LOAD
TTS | STORE
@ Decrement and check for loop end conditions.
SSSSN | PUSH 0 (ptr)
TTT | LOAD
SNS | DUP
NTSSSSTTSSTSSSSSSSTN | BRZ > 00011001 00000001
SSSTN | PUSH 1
TSST | SUBTRACT
SSSSN | PUSH 0 (ptr)
SNT | SWAP
TTS | STORE
NSNSSSTTSSTSSSSSSSSN | JMP > 00011001 00000000
@ Clean up and return
NSSVSSSTTSSTSSSSSSSTN | Mark: 00011001 00000001
SNN | DROP
NTN | RTS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Description:
@ This function writes random words into the memory locations:
@ startaddr -> startaddr+count
@ Call Stack:
@ count
@ startaddr <-- TOS
@ Return Stack:
@ <empty>
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
NSSVTTSTSN | Mark: 11010 (memrand)
SSSSN | PUSH 0 (ptr)
SNT | SWAP
TTS | STORE
@ Store random word into one memory location on each pass through this loop.
NSSVSSSTTSTSSSSSSSSSN | Mark: 00011010 00000000
SNS | DUP
SSSSN | PUSH 0 (ptr)
TTT | LOAD
TSSS | ADD
NSTTSSSSN | JSR > 10000 (random)
TTS | STORE
@ Decrement and check loop end conditions
SNS | DUP
NTSSSSTTSTSSSSSSSSTN | BRZ > 00011010 00000001
SSSTN | PUSH 1
TSST | SUBTRACT
NSNSSSTTSTSSSSSSSSSN | JMP > 00011010 00000000
@ Clean up and return
NSSVSSSTTSTSSSSSSSSTN | Mark: 00011010 00000001
SNN | DROP
NTN | RTS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Description:
@ This function 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)
@ Prepare the stack for computation.
@ Addr | Contents
@ 0 | blk2ptr
@ 1 | blk1ptr
SSSSN | PUSH 0 (ptr)
SNT | SWAP
TTS | STORE
SSSTN | PUSH 1 (ptr)
SNT | SWAP
TTS | STORE
@ Compare one word on each pass through this loop.
NSSVSSSTTSTTSSSSSSSSN | Mark: 00011011 00000000
SNS | DUP
SNS | DUP
SSSSN | PUSH 0 (ptr)
TTT | LOAD
TSSS | ADD
TTT | LOAD
SNT | SWAP
SSSTN | PUSH 1 (ptr)
TTT | LOAD
TSSS | ADD
TTT | LOAD
TSST | SUBTRACT
NTSSSSTTSTTSSSSSSTSN | BRZ > 00011011 00000010 (jump if words match)
@ Return 'match? = false'
SNN | DROP
SSSTN | PUSH 1
NTN | RTS
@ Decrement and loop again if loop is not complete.
NSSVSSSTTSTTSSSSSSTSN | Mark: 00011011 00000010
SNS | DUP
NTSSSSTTSTTSSSSSSSTN | BRZ > 00011011 00000001 (jump if loop is complete)
SSSTN | PUSH 1
TSST | SUBTRACT
NSNSSSTTSTTSSSSSSSSN | JMP > 00011011 00000000
@ Return 'match? = true'
NSSVSSSTTSTTSSSSSSSTN | Mark: 00011011 00000001
SNN | DROP
SSSSN | PUSH 0
NTN | RTS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Description:
@ This function 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)
@ Prepare the stack for computation.
@ Stack:
@ offset <-- TOS
@ Addr | Contents
@ 0 | address
@ 1 | count
@ 2 | pattern
SSSSN | PUSH 0 (ptr)
SNT | SWAP
TTS | STORE
SSSTN | PUSH 1 (ptr)
SNT | SWAP
TTS | STORE
SSSTSN | PUSH 2 (ptr)
SNT | SWAP
TTS | STORE
@ Compare one word on each pass through this loop.
NSSVSSSTTTSSSSSSSSSSN | Mark: 00011100 00000000
SNS | DUP
SSSSN | PUSH 0 (ptr)
TTT | LOAD
TSSS | ADD
TTT | LOAD
SSSTSN | PUSH 2 (ptr)
TTT | LOAD
TSST | SUBTRACT
NTSSSSTTTSSSSSSSSSTN | BRZ > 00011100 00000001
SNS | DUP
SSSTN | PUSH 1 (ptr)
TTT | LOAD
TSST | SUBTRACT
NTSSSSTTTSSSSSSSSTSN | BRZ > 00011100 00000010
SSSTN | PUSH 1
TSSS | ADD
NSNSSSTTTSSSSSSSSSSN | JMP > 00011100 00000000
@ Found a match. Clean up and return.
NSSVSSSTTTSSSSSSSSSTN | Mark: 00011100 00000001
SSSSN | PUSH 0 (ptr)
TTT | LOAD
TSSS | ADD
NTN | RTS
@ No match found. Clean up and return.
NSSVSSSTTTSSSSSSSSTSN | Mark: 00011100 00000010
SNN | DROP
SSSSN | PUSH 0
NTN | RTS
#include <math.pvvs>
#endif