Added old `random` function back as `fastrand`.
authorAaron Taylor <ataylor@subgeniuskitty.com>
Tue, 31 Mar 2020 08:22:00 +0000 (01:22 -0700)
committerAaron Taylor <ataylor@subgeniuskitty.com>
Tue, 31 Mar 2020 08:22:00 +0000 (01:22 -0700)
stdlib/README.md
stdlib/math.pvvs
stdlib_tests/5004_fastrand.pvvs [new file with mode: 0644]
stdlib_tests/vv_test.py

index 6f12f4a..6c26770 100644 (file)
@@ -95,6 +95,7 @@ header comment for each function to learn the call and return stack.
           10000 ----- random                        (math.pvvs)
           10001 ----- absolute value                (math.pvvs)
           10010 ----- greatest common divisor       (math.pvvs)
+          10011 ----- fastrand                      (math.pvvs)
          011xxx - heap functions
           11000 ----- memset                        (heap.pvvs)
           11001 ----- memcpy                        (heap.pvvs)
index 90a3666..eac0181 100644 (file)
@@ -48,6 +48,42 @@ SNT                     | SWAP
 TTS                     | STORE
 NTN                     | RTS
 
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@ Name:
+@   fastrand (10011)
+@ Description:
+@   Returns a pseudo-random number.
+@   Probably not as good as `random`, but much faster since it doesn't use XOR.
+@   Based on the POSIX.1-2001 example for random().
+@   Before using for the first time, seed heap[0] with a value.
+@ Call Stack:
+@   empty
+@ Return Stack:
+@   random number  <-- TOS
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+NSSVTSSTTN              | Mark: 10011 (fastrand)
+
+@ Generate the next seed value
+SSSSN                   | PUSH 0 (ptr)
+TTT                     | LOAD
+SSSTSSSSSTTTSSSTTSSTSSTTTSSTTSTTSTN | PUSH 1103515245
+TSSN                    | MULTIPLY
+SSSTTSSSSSSTTTSSTN      | PUSH 12345
+TSSS                    | ADD
+
+@ Store the next seed value but keep a copy on the stack.
+SNS                     | DUP
+SSSSN                   | PUSH 0 (ptr)
+SNT                     | SWAP
+TTS                     | STORE
+
+@ Calculate the random number and return.
+SSSTSSSSSSSSSSSSSSSSN   | PUSH 65536
+TSTS                    | DIVIDE
+SSSTSSSSSSSSSSSSSSSN    | PUSH 32768
+TSTT                    | MODULO
+NTN                     | RTS
+
 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
 @ Name:
 @   abs (10001)
diff --git a/stdlib_tests/5004_fastrand.pvvs b/stdlib_tests/5004_fastrand.pvvs
new file mode 100644 (file)
index 0000000..a66670b
--- /dev/null
@@ -0,0 +1,10 @@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+@ 
+@  This test intentionally blank.
+@
+@  If there comes a day when the tests are extended beyond testing basic
+@  functionality, include fastrand in the new tests.
+@
+@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
+
+NNN | Die
index 34d8a26..7db107b 100755 (executable)
@@ -46,6 +46,7 @@ tests = [
         ['5001_abs', '', '+1+1+0+0'],
         ['5002_random', '', ''],
         ['5003_gcd', '', '+0+4+4+3+3+3'],
+        ['5004_fastrand', '', ''],
         ['6001_printstackstring', '', 'test'],
         ['6002_printheapstring', '', 'test'],
         ['6003_printnumbersign', '', '+-'],