#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: @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 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: @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 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: @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 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: @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ 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: @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #include 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