First draft of a real README for the VVS stdlib.
[vvhitespace] / stdlib / math.pvvs
CommitLineData
48f88489
AT
1@ (c) 2020 Aaron Taylor <ataylor at subgeniuskitty dot com>
2@ See LICENSE.txt file for copyright and license details.
3
3625ff3a
AT
4#ifndef VVS_STDLIB_MATH
5#define VVS_STDLIB_MATH
6
2612f47f 7@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
bb21580a
AT
8@ Name:
9@ random (10000)
2612f47f 10@ Description:
f969012f
DNR
11@ Returns a pseudo-random number.
12@ Before using for the first time, seed heap[0] with a non-zero value.
13@ This PRNG was taken from: https://en.wikipedia.org/wiki/Xorshift
2612f47f
AT
14@ Call Stack:
15@ empty
16@ Return Stack:
17@ random number <-- TOS
18@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
f969012f 19#include <logic.pvvs>
2612f47f 20NSSVTSSSSN | Mark: 10000 (random)
b15f1da5 21
f969012f 22@ Fetch seed from heap[0].
b15f1da5
AT
23SSSSN | PUSH 0 (ptr)
24TTT | LOAD
b15f1da5 25
f969012f
DNR
26@ Set TOS ^= TOS << 13
27SNS | DUP
28SSSTTSTN | PUSH +13
29NSTTSTTSTN | JSR > 101101 (lshift)
30NSTTSTSTTN | JSR > 101011 (xor)
31
32@ Set TOS ^= TOS >> 7
33SNS | DUP
34SSSTTTN | PUSH +7
35NSTTSTTSSN | JSR > 101100 (rshift)
36NSTTSTSTTN | JSR > 101011 (xor)
37
38@ Set TOS ^= TOS << 17
39SNS | DUP
40SSSTSSSTN | PUSH +17
41NSTTSTTSTN | JSR > 101101 (lshift)
42NSTTSTSTTN | JSR > 101011 (xor)
43
44@ Store a copy of the new seed at heap[0] and return.
b15f1da5
AT
45SNS | DUP
46SSSSN | PUSH 0 (ptr)
47SNT | SWAP
48TTS | STORE
2612f47f
AT
49NTN | RTS
50
3625ff3a 51@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
bb21580a
AT
52@ Name:
53@ abs (10001)
3625ff3a 54@ Description:
bb21580a 55@ Returns the absolute value of its argument
3625ff3a
AT
56@ Call Stack:
57@ signed number <-- TOS
58@ Return Stack:
59@ abs(signed number) <-- TOS
60@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
61NSSVTSSSTN | Mark: 10001 (absolute value)
7359501c
AT
62
63@ Catch -(2^63) as a special case since its absolute value will overflow
64@ a twos-complement 64-bit word. Return zero as though the absolute value
65@ overflowed to the bottom of the non-negative integers rather than
66@ overflowing back to the most negative integer.
67SNS | DUP
68SSTTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSN | -(2^63)
69TSST | SUBTRACT
70NTSSSSTSSSTSSSSSSTSN | BRZ > 00010001 00000010
71
72@ Handle all the other numbers.
3625ff3a
AT
73SNS | DUP
74NTTSSSTSSSTSSSSSSSSN | BMI > 00010001 00000000
75NSNSSSTSSSTSSSSSSSTN | JMP > 00010001 00000001
76NSSVSSSTSSSTSSSSSSSSN | Mark: 00010001 00000000
77SSTTN | PUSH -1
78TSSN | MULTIPLY
79NSSVSSSTSSSTSSSSSSSTN | Mark: 00010001 00000001
80NTN | RTS
81
7359501c
AT
82@ Special case: Push 0 and return.
83NSSVSSSTSSSTSSSSSSTSN | Mark: 00010001 00000010
84SNN | DROP
85SSSSN | PUSH 0
86NTN | RTS
87
37372ed0
AT
88@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
89@ Name:
90@ gcd (10010)
91@ Description:
92@ Returns greatest common divisor of X and Y.
93@ Call Stack:
94@ Y
95@ X <-- TOS
96@ Return Stack:
97@ gcd(X,Y) <-- TOS
98@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
99#include <stack.pvvs>
100NSSVTSSTSN | Mark: 10010 (gcd)
101
102@ Since 1 > -1, transform problem into gcd(abs(X),abs(Y)).
103SNT | SWAP
104NSTTSSSTN | JSR > 10001 (abs)
105SNT | SWAP
106NSTTSSSTN | JSR > 10001 (abs)
107
108@ Verify neither operand is zero.
109SNT | SWAP
110SNS | DUP
111NTSSSSTSSTSSSSSSSSSN | BRZ > 00010010 00000000 (gcd:zero input)
112SNT | SWAP
113SNS | DUP
114NTSSSSTSSTSSSSSSSSSN | BRZ > 00010010 00000000 (gcd:zero input)
115
116@ Verify X != Y and sort X,Y so the smaller is TOS.
117SNS | DUP
118SSSTTN | PUSH 3
119NSTTTSSN | JSR > 1100 (deepdup)
120SNT | SWAP
121TSST | SUBTRACT
122@ TOS> Y-X, X, Y
123NTTSSSTSSTSSSSSSSSTN | BMI > 00010010 00000001 (gcd:swap inputs)
124NSNSSSTSSTSSSSSSSTSN | JMP > 00010010 00000010 (gcd:main loop)
125NSSVSSSTSSTSSSSSSSSTN | MARK: 00010010 00000001 (gcd:swap inputs)
126SNT | SWAP
127
128@ Main gcd loop.
129@ Euclidean algorithm.
130NSSVSSSTSSTSSSSSSSTSN | MARK: 00010010 00000010 (gcd:main loop)
131SNS | DUP
132SSSTTN | PUSH 3
133NSTTSTSN | JSR > 1010 (stackrotate)
134TSTT | MODULO
135SNS | DUP
136NTSSSSTSSTSSSSSSSTTN | BRZ > 00010010 00000011 (gcd:loop termination)
137NSNSSSTSSTSSSSSSSTSN | JMP > 00010010 00000010 (gcd:main loop)
138NSSVSSSTSSTSSSSSSSTTN | MARK: 00010010 00000011 (gcd:loop termination)
139SNN | DROP
140NTN | RTS
141
142@ At least one operand was zero.
143@ Since we define gcd(a,0) = a, return the other operand.
144NSSVSSSTSSTSSSSSSSSSN | MARK: 00010010 00000000 (gcd:zero input)
145SNN | DROP
146NTN | RTS
147
3625ff3a 148#endif