#ifndef VVS_STDLIB_STDIO #define VVS_STDLIB_STDIO @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ Name: @ printstackstring (1000100) @ Description: @ Prints a null-terminated string from the stack. @ Call Stack: @ null-terminator (ASCII '\0') @ char n @ ... @ char 2 @ char 1 <-- TOS @ Return Stack: @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ NSSVTSSSTSSN | Mark: 1000100 (print string from stack) SNS | DUP NTSSTSSSTSSSSSSSSSTN | BRZ > 01000100 00000001 TNSS | Print character NSNTSSSTSSN | JMP > 1000100 NSSVSTSSSTSSSSSSSSSTN | Mark: 01000100 00000001 SNN | DROP NTN | RTS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ Name: @ printheapstring (1000101) @ Description: @ Prints a null-terminated string from the heap. @ Call Stack: @ pointer to first character <-- TOS @ Return Stack: @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ NSSVTSSSTSTN | Mark: 1000101 (print string from heap) SNS | DUP TTT | LOAD SNS | DUP NTSSTSSSTSTSSSSSSSTN | BRZ > 01000101 00000001 TNSS | Print character SSSTN | Push +1 TSSS | ADD NSNTSSSTSTN | JMP > 1000101 NSSVSTSSSTSTSSSSSSSTN | Mark: 01000101 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: @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ NSSVTSTSN | Mark: 1010 (print number from stack) SNS | DUP NSTTSSSSTSN | JSR > 1000010 NSTTSSSSTTN | JSR > 1000011 NTN | RTS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ Name: @ printstacknumbersign (1000010) @ Description: @ Prints the sign of 'number' from the stack. @ Call Stack: @ number <-- TOS @ Return Stack: @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ NSSVTSSSSTSN | Mark: 1000010 (print sign of number from stack) NTTSTSSSSTSSSSSSSSTN | BMI > 01000010 00000001 SSSTSTSTTN | PUSH ASCII '+' NSNSTSSSSTSSSSSSSTSN | JMP > 01000010 00000010 NSSVSTSSSSTSSSSSSSSTN | Mark: 01000010 00000001 SSSTSTTSTN | PUSH ASCII '-' NSSVSTSSSSTSSSSSSSTSN | Mark: 01000010 00000010 TNSS | PUTC NTN | RTS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ Name: @ printstacknumbermagnitude (1000011) @ Description: @ Prints the magnitude of 'number' from the stack. @ Call Stack: @ number <-- TOS @ Return Stack: @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #include NSSVTSSSSTTN | Mark: 1000011 (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. NSSVSTSSSSTTSSSSSSSSN | Mark: 01000011 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 NTSSTSSSSTTSSSSSSSTN | BRZ > 01000011 00000001 NSNSTSSSSTTSSSSSSSSN | JMP > 01000011 00000000 @ Print the string we have built on the stack. NSSVSTSSSSTTSSSSSSSTN | Mark: 01000011 00000001 SNN | DROP NSTTSSSTSSN | JSR > 1000100 (print string from stack) NTN | RTS #endif