summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/plib/pfunction.cpp
diff options
context:
space:
mode:
author couriersud <couriersud@gmx.org>2017-05-27 14:28:40 +0200
committer couriersud <couriersud@gmx.org>2017-05-27 14:28:53 +0200
commit994263eaf99a1cf2a436ce86b1047e8ca320e68a (patch)
treede15519bdc8a4e1deea4db107e319c557db50da1 /src/lib/netlist/plib/pfunction.cpp
parentf83daa37a3d184d05e891b42f75ce35e906cd46f (diff)
Add rand() function to pfunction expression parser. Use this to simulate
E-B noise in Cheeky Mouse and fix the "cheese" choose. [Couriersud]
Diffstat (limited to 'src/lib/netlist/plib/pfunction.cpp')
-rw-r--r--src/lib/netlist/plib/pfunction.cpp7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/lib/netlist/plib/pfunction.cpp b/src/lib/netlist/plib/pfunction.cpp
index c369dc2ed90..42f767ef562 100644
--- a/src/lib/netlist/plib/pfunction.cpp
+++ b/src/lib/netlist/plib/pfunction.cpp
@@ -12,6 +12,7 @@
#include <cmath>
#include <stack>
+#include <stdlib.h>
namespace plib {
@@ -37,6 +38,7 @@ void pfunction::compile_postfix(const std::vector<pstring> &inputs,
for (const pstring &cmd : cmds)
{
+ printf("%s %d\n", cmd.c_str(), stk);
rpn_inst rc;
if (cmd == "+")
{ rc.m_cmd = ADD; stk -= 1; }
@@ -52,6 +54,8 @@ void pfunction::compile_postfix(const std::vector<pstring> &inputs,
{ rc.m_cmd = SIN; stk -= 0; }
else if (cmd == "cos")
{ rc.m_cmd = COS; stk -= 0; }
+ else if (cmd == "rand")
+ { rc.m_cmd = RAND; stk += 1; }
else
{
for (unsigned i = 0; i < inputs.size(); i++)
@@ -199,6 +203,9 @@ double pfunction::evaluate(const std::vector<double> &values)
OP(POW, 1, std::pow(ST2, ST1))
OP(SIN, 0, std::sin(ST2));
OP(COS, 0, std::cos(ST2));
+ case RAND:
+ stack[ptr++] = static_cast<double>(rand()) / static_cast<double>(RAND_MAX);
+ break;
case PUSH_INPUT:
stack[ptr++] = values[static_cast<unsigned>(rc.m_param)];
break;