Added slurp & spew functions to VVS stdlib.
[vvhitespace] / stdlib / stdio.pvvs
#ifndef VVS_STDLIB_STDIO
#define VVS_STDLIB_STDIO
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Name:
@ printstackstring (1000)
@ Description:
@ Prints a null-terminated string from the stack.
@ Call Stack:
@ null-terminator (ASCII '\0')
@ char n
@ ...
@ char 2
@ char 1 <-- TOS
@ Return Stack:
@ <empty>
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
NSSVTSSSN | Mark: 1000 (print string from stack)
SNS | DUP
NTSSSSSTSSSSSSSSSSTN | BRZ > 00001000 00000001
TNSS | Print character
NSNTSSSN | JMP > 1000
NSSVSSSSTSSSSSSSSSSTN | Mark: 00001000 00000001
SNN | DROP
NTN | RTS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Name:
@ printheapstring (1001)
@ Description:
@ Prints a null-terminated string from the heap.
@ Call Stack:
@ pointer to first character <-- TOS
@ Return Stack:
@ <empty>
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
NSSVTSSTN | Mark: 1001 (print string from heap)
SNS | DUP
TTT | LOAD
SNS | DUP
NTSSSSSTSSTSSSSSSSTN | BRZ > 00001001 00000001
TNSS | Print character
SSSTN | Push +1
TSSS | ADD
NSNTSSTN | JMP > 1001
NSSVSSSSTSSTSSSSSSSTN | Mark: 00001001 00000001
SNN | DROP
SNN | DROP
NTN | RTS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Name:
@ printstacknumber (1010)
@ Description:
@ Prints 'number' from the stack in sign-magnitude format.
@ Leading zeros are suppressed.
@ Call Stack:
@ number <-- TOS
@ Return Stack:
@ <empty>
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
NSSVTSTSN | Mark: 1010 (print number from stack)
SNS | DUP
NSTTSSSSSSN | JSR > 1000000
NSTTSSSSSTN | JSR > 1000001
NTN | RTS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Name:
@ printstacknumbersign (1000000)
@ Description:
@ Prints the sign of 'number' from the stack.
@ Call Stack:
@ number <-- TOS
@ Return Stack:
@ <empty>
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
NSSVTSSSSSSN | Mark: 1000000 (print sign of number from stack)
NTTSTSSSSSSSSSSSSSTN | BMI > 010000000 00000001
SSSTSTSTTN | PUSH ASCII '+'
NSNSTSSSSSSSSSSSSTSN | JMP > 010000000 00000010
NSSVSTSSSSSSSSSSSSSTN | Mark: 010000000 00000001
SSSTSTTSTN | PUSH ASCII '-'
NSSVSTSSSSSSSSSSSSTSN | Mark: 010000000 00000010
TNSS | PUTC
NTN | RTS
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ Name:
@ printstacknumbermagnitude (1000001)
@ Description:
@ Prints the magnitude of 'number' from the stack.
@ Call Stack:
@ number <-- TOS
@ Return Stack:
@ <empty>
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
#include <math.pvvs>
NSSVTSSSSSTN | Mark: 1000001 (print magnitude of number from stack)
NSTTSSSTN | JSR > 10001 (absolute value)
SSSSN | PUSH ASCII '\0'
SNT | SWAP
@ Pick off one digit on each pass through this loop.
NSSVSTSSSSSTSSSSSSSSN | Mark: 01000001 00000000
SNS | DUP
@ Mod-off a digit, convert to ASCII, store on stack as part of the string.
SSSTSTSN | PUSH +10
TSTT | MODULO
SSSTTSSSSN | PUSH ASCII '0'
TSSS | ADD
SNT | SWAP
@ Divide down to next digit and keep looping if number != 0 yet.
SSSTSTSN | PUSH +10
TSTS | DIVIDE
SNS | DUP
NTSSTSSSSSTSSSSSSSTN | BRZ > 01000001 00000001
NSNSTSSSSSTSSSSSSSSN | JMP > 01000001 00000000
@ Print the string we have built on the stack.
NSSVSTSSSSSTSSSSSSSTN | Mark: 01000001 00000001
SNN | DROP
NSTTSSSN | JSR > 1000 (print string from stack)
NTN | RTS
#endif