X-Git-Url: http://git.subgeniuskitty.com/vvhitespace/.git/blobdiff_plain/3eaa958a01e1c70c313fb887ab2d2f723dd9062e..93ea92e6864051fe748ca3f64d2af6bb47019f50:/stdlib/logic.pvvs diff --git a/stdlib/logic.pvvs b/stdlib/logic.pvvs index ff53654..a69cd3a 100644 --- a/stdlib/logic.pvvs +++ b/stdlib/logic.pvvs @@ -1,3 +1,6 @@ +@ (c) 2020 Aaron Taylor +@ See LICENSE.txt file for copyright and license details. + #ifndef VVS_STDLIB_LOGIC #define VVS_STDLIB_LOGIC @@ -20,7 +23,7 @@ NSSVTSTSSSN | Mark: 101000 (not) @ In twos-complement, NOT(X) = (-X)-1 SSTTN | PUSH -1 TSSN | MULTIPLY -SSTTN | PUSH -1 +SSSTN | PUSH 1 TSST | SUBTRACT NTN | RTS @@ -35,6 +38,7 @@ NTN | RTS @ Return Stack: @ X ^ Y @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#include NSSVTSTSSTN | Mark: 101001 (and) @ Prepare the stack for computation. @@ -43,13 +47,13 @@ SSSTTTTTTN | PUSH 63 (shift counter) @ Loop through the bits one at a time. NSSVSSTSTSSTSSSSSSSSN | Mark: 00101001 00000000 -@ Prepare X for the AND +@ Prepare copy of X for the AND SNS | DUP SSSTSTN | PUSH 5 NSTTTSSN | JSR > 1100 (deepdup) SNT | SWAP NSTTSTTSSN | JSR > 101100 (rshift) -@ Prepare Y for the AND +@ Prepare copy of Y for the AND SSSTSSN | PUSH 4 NSTTTSSN | JSR > 1100 (deepdup) SSSTTN | PUSH 3 @@ -81,6 +85,50 @@ SNT | SWAP SNN | DROP NTN | RTS +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@ Name: +@ or (101010) +@ Description: +@ Performs a bitwise OR on the TOS word. +@ Call Stack: +@ X +@ Y +@ Return Stack: +@ X v Y +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +NSSVTSTSTSN | Mark: 101010 (or) +NSTTSTSSSN | JSR > 101000 (not) +SNT | SWAP +NSTTSTSSSN | JSR > 101000 (not) +NSTTSTSSTN | JSR > 101001 (and) +NSTTSTSSSN | JSR > 101000 (not) +NTN | RTS + +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +@ Name: +@ xor (101011) +@ Description: +@ Performs a bitwise XOR on the TOS word. +@ Call Stack: +@ X +@ Y +@ Return Stack: +@ X xor Y +@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ +#include +NSSVTSTSTTN | Mark: 101011 (xor) +SNS | DUP +SSSTTN | PUSH 3 +NSTTTSSN | JSR > 1100 (deepdup) +NSTTSTSTSN | JSR > 101010 (or) +SNT | SWAP +SSSTTN | PUSH 3 +NSTTSTTN | JSR > 1011 (stackrotatereverse) +NSTTSTSSTN | JSR > 101001 (and) +NSTTSTSSSN | JSR > 101000 (not) +NSTTSTSSTN | JSR > 101001 (and) +NTN | RTS + @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ Name: @ rshift (101100) @@ -93,13 +141,17 @@ NTN | RTS @ X >> shiftcount @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ NSSVTSTTSSN | Mark: 101100 (rshift) - @ Test for loop completion first since it is allowable to shift by zero. -NSSVSSTSTTSSSSSSSSSTN | Mark: 00101100 00000001 SNS | DUP NTSSSTSTTSSSSSSSSSSN | BRZ > 00101100 00000000 -@ Shift by one bit on each pass. + +@ Negative numbers need special handling. SNT | SWAP +SNS | DUP +NTTSSTSTTSSSSSSSTSTN | BMI > 00101100 00000101 + +@ Shift by one bit on each pass. +NSSVSSTSTTSSSSSSSTSSN | Mark: 00101100 00000100 SSSTSN | PUSH 2 TSTS | DIVIDE @ Decrement the counter. @@ -107,13 +159,23 @@ SNT | SWAP SSSTN | PUSH 1 TSST | SUBTRACT @ Loop again. -NSNSSTSTTSSSSSSSSSTN | JMP > 00101100 00000001 +NSNTSTTSSN | JMP > 101100 (rshift) -@ Clean up and return. +@ Clean up NSSVSSTSTTSSSSSSSSSSN | Mark: 00101100 00000000 SNN | DROP NTN | RTS +@ Found a negative number. Subtract one before proceeding if odd. +NSSVSSTSTTSSSSSSSTSTN | Mark: 00101100 00000101 +SNS | DUP +SSSTSN | PUSH 2 +TSTT | MODULO +NTSSSTSTTSSSSSSSTSSN | BRZ > 00101100 00000100 +SSSTN | PUSH 1 +TSST | SUBTRACT +NSNSSTSTTSSSSSSSTSSN | JMP > 00101100 00000100 + @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ Name: @ lshift (101101)