@ (c) 2020 Aaron Taylor @ See LICENSE.txt file for copyright and license details. #ifndef VVS_STDLIB_STRING #define VVS_STDLIB_STRING @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ Name: @ strlen (100000) @ Description: @ Counts number of words in a null-terminated string. @ Returned number does not include the null-terminator. @ Call Stack: @ pointer to first character <-- TOS @ Return Stack: @ number of words in string <-- TOS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ NSSVTSSSSSN | Mark: 100000 (strlen) @ Create a length counter. SSSSN | PUSH 0 SNT | SWAP @ Increment the counter (and pointer) on each pass through the loop. NSSVSSTSSSSSSSSSSSSSN | Mark: 00100000 00000000 SNS | DUP TTT | LOAD NTSSSTSSSSSSSSSSSSTN | BRZ > 00100000 00000001 SNT | SWAP SSSTN | PUSH 1 TSSS | ADD SNT | SWAP SSSTN | PUSH 1 TSSS | ADD NSNSSTSSSSSSSSSSSSSN | JMP > 00100000 00000000 @ Clean up and return. NSSVSSTSSSSSSSSSSSSTN | Mark: 00100000 00000001 SNN | DROP NTN | RTS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ Name: @ isdigit (100001) @ Description: @ Tests 'character' on stack. Is it an ASCII number? @ Returns 1 or 0 representing True/False. @ Call Stack: @ character <-- TOS @ Return Stack: @ 1 or 0 <-- TOS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ NSSVTSSSSTN | Mark: 100001 (isdigit) SSSSSTTSSSSN | PUSH 48 (ASCII '0') TSST | SUBTRACT SNS | DUP NTTSSTSSSSTSSSSSSSSN | BMI > 00100001 00000000 (not digit) SNS | DUP SSSTSTSN | PUSH 10 TSST | SUBTRACT NTTSSTSSSSTSSSSSSSTN | BMI > 00100001 00000001 (is digit) NSSVSSTSSSSTSSSSSSSSN | Mark: 00100001 00000000 (not digit) SNN | DROP SSSSN | PUSH 0 NTN | RTS NSSVSSTSSSSTSSSSSSSTN | Mark: 00100001 00000001 (is digit) SNN | DROP SSSTN | PUSH 1 NTN | RTS @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ Name: @ get_user_string @ Description: @ Read one line of user input or read buffer_size characters, whichever comes @ first, and store at buffer_address. @ Appends null terminator to end of string. @ Call Stack: @ buffer_size (>0) @ buffer_address <-- TOS @ Return Stack: @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ #include NSSVTSSSTSN | MARK: 100010 (get_user_string) @ Verify we were handed a plausible buffer size. SNT | SWAP SNS | DUP NTSSSTSSSTSSSSSSSSSN | BRZ > 00100010 00000000 (get_user_string:bad_buffer_size) SNS | DUP NTTSSTSSSTSSSSSSSSSN | BMI > 00100010 00000000 (get_user_string:bad_buffer_size) SNT | SWAP @ Push an offset counter on to the stack for use inside the loop. SSSSN | PUSH 0 @ Get one character from user on each pass through this loop. @ TOS> offset, buffer_addr, buffer_size NSSVSSTSSSTSSSSSSSSTN | MARK: 00100010 00000001 (get_user_string:main_loop) @ Have we reached the end of the buffer? SSSTTN | PUSH 3 NSTTTSSN | JSR > 1100 (deepdup) SSSTSN | PUSH 2 NSTTTSSN | JSR > 1100 (deepdup) TSST | SUBTRACT SSSTN | PUSH 1 TSST | SUBTRACT NTSSSTSSSTSSSSSSSTTN | BRZ > 00100010 00000011 (get_user_string:end_of_buffer) @ Get a character, store it in the buffer, and echo it back to user. SNS | DUP SSSTTN | PUSH 3 NSTTTSSN | JSR > 1100 (deepdup) TSSS | ADD SNS | DUP TNTS | GETCHAR TTT | LOAD SNS | DUP (for later testing) TNSS | PUTCHAR @ Did the user press ENTER? SSSTSTSN | PUSH 10 (ASCII '\n') TSST | SUBTRACT NTSSSTSSSTSSSSSSSTSN | BRZ > 00100010 00000010 (get_user_string:end_of_line) @ User did not press ENTER. Increment offset and loop again. SSSTN | PUSH 1 TSSS | ADD NSNSSTSSSTSSSSSSSSTN | JMP > 00100010 00000001 (get_user_string:main_loop) NSSVSSTSSSTSSSSSSSTSN | MARK: 00100010 00000010 (get_user_string:end_of_line) TSSS | ADD SSSSN | PUSH 0 (ASCII '\0') TTS | STORE SNN | DROP NTN | RTS NSSVSSTSSSTSSSSSSSTTN | MARK: 00100010 00000011 (get_user_string:end_of_buffer) SNN | DROP TSSS | ADD SSSTN | PUSH 1 TSST | SUBTRACT SSSSN | PUSH 0 (ASCII '\0') TTS | STORE NTN | RTS NSSVSSTSSSTSSSSSSSSSN | MARK: 00100010 00000000 (get_user_string:bad_buffer_size) SNN | DROP SNN | DROP NNN | DIE #endif