Added bitwise OR and XOR subroutines to VVS stdlib.
[vvhitespace] / stdlib / logic.pvvs
index eccc68b..0003380 100644 (file)
@@ -20,10 +20,110 @@ NSSVTSTSSSN             | Mark: 101000 (not)
 @ In twos-complement, NOT(X) = (-X)-1
 SSTTN                   | PUSH -1
 TSSN                    | MULTIPLY
 @ In twos-complement, NOT(X) = (-X)-1
 SSTTN                   | PUSH -1
 TSSN                    | MULTIPLY
-SSTTN                   | PUSH -1
+SSSTN                   | PUSH 1
 TSST                    | SUBTRACT
 NTN                     | RTS
 
 TSST                    | SUBTRACT
 NTN                     | RTS
 
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@ Name:
+@   and (101001)
+@ Description:
+@   Performs a bitwise AND on the TOS word.
+@ Call Stack:
+@   X
+@   Y
+@ Return Stack:
+@   X ^ Y
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+NSSVTSTSSTN             | Mark: 101001 (and)
+
+@ Prepare the stack for computation.
+SSSSN                   | PUSH 0 (result)
+SSSTTTTTTN              | PUSH 63 (shift counter)
+
+@ Loop through the bits one at a time.
+NSSVSSTSTSSTSSSSSSSSN   | Mark: 00101001 00000000
+@ Prepare copy of X for the AND
+SNS                     | DUP
+SSSTSTN                 | PUSH 5
+NSTTTSSN                | JSR > 1100 (deepdup)
+SNT                     | SWAP
+NSTTSTTSSN              | JSR > 101100 (rshift)
+@ Prepare copy of Y for the AND
+SSSTSSN                 | PUSH 4
+NSTTTSSN                | JSR > 1100 (deepdup)
+SSSTTN                  | PUSH 3
+NSTTTSSN                | JSR > 1100 (deepdup)
+NSTTSTTSSN              | JSR > 101100 (rshift)
+@ Do the AND and store in result.
+NSTTSSSSSSN             | JSR > 1000000 (lowbitand)
+SSSTTN                  | PUSH 3
+NSTTSTTN                | JSR > 1011 (stackrotatereverse)
+SSSTN                   | PUSH 1
+NSTTSTTSTN              | JSR > 101101 (lshift)
+TSSS                    | ADD
+SSSTSN                  | PUSH 2
+NSTTSTSN                | JSR > 1010 (stackrotate)
+@ Test for end of loop.
+SNS                     | DUP
+NTSSSTSTSSTSSSSSSSTN    | BRZ > 00101001 00000001
+@ Decrement the counter and loop again.
+SSSTN                   | PUSH 1
+TSST                    | SUBTRACT
+NSNSSTSTSSTSSSSSSSSN    | JMP > 00101001 00000000
+
+@ Clean up and return.
+NSSVSSTSTSSTSSSSSSSTN   | Mark: 00101001 00000001
+SNN                     | DROP
+SNT                     | SWAP
+SNN                     | DROP
+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
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+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)
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 @ Name:
 @   rshift (101100)
@@ -37,7 +137,7 @@ NTN                     | RTS
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NSSVTSTTSSN             | Mark: 101100 (rshift)
 
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NSSVTSTTSSN             | Mark: 101100 (rshift)
 
-@ Test for loop completion first since it's allowable to shift by zero.
+@ Test for loop completion first since it is allowable to shift by zero.
 NSSVSSTSTTSSSSSSSSSTN   | Mark: 00101100 00000001
 SNS                     | DUP
 NTSSSTSTTSSSSSSSSSSN    | BRZ > 00101100 00000000
 NSSVSSTSTTSSSSSSSSSTN   | Mark: 00101100 00000001
 SNS                     | DUP
 NTSSSTSTTSSSSSSSSSSN    | BRZ > 00101100 00000000
@@ -70,7 +170,7 @@ NTN                     | RTS
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NSSVTSTTSTN             | Mark: 101101 (lshift)
 
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 NSSVTSTTSTN             | Mark: 101101 (lshift)
 
-@ Test for loop completion first since it's allowable to shift by zero.
+@ Test for loop completion first since it is allowable to shift by zero.
 NSSVSSTSTTSTSSSSSSSTN   | Mark: 00101101 00000001
 SNS                     | DUP
 NTSSSTSTTSTSSSSSSSSN    | BRZ > 00101101 00000000
 NSSVSSTSTTSTSSSSSSSTN   | Mark: 00101101 00000001
 SNS                     | DUP
 NTSSSTSTTSTSSSSSSSSN    | BRZ > 00101101 00000000
@@ -90,4 +190,27 @@ NSSVSSTSTTSTSSSSSSSSN   | Mark: 00101101 00000000
 SNN                     | DROP
 NTN                     | RTS
 
 SNN                     | DROP
 NTN                     | RTS
 
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@ Name:
+@   lowbitand (1000000)
+@ Description:
+@   Performs logical AND on the least-significant bit of 'X' and 'Y'.
+@   Returns either 1 or 0, no other values.
+@ Call Stack:
+@   X
+@   Y
+@ Return Stack:
+@   lsb(X) AND lsb(Y)
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+NSSVTSSSSSSN            | Mark: 1000000 (lowbitand)
+SSSTSN                  | PUSH 2
+TSTT                    | MODULO
+SNT                     | SWAP
+SSSTSN                  | PUSH 2
+TSTT                    | MODULO
+TSSS                    | ADD
+SSSTSN                  | PUSH 2
+TSTS                    | DIVIDE
+NTN                     | RTS
+
 #endif
 #endif