summaryrefslogtreecommitdiffstatshomepage
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
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]
-rw-r--r--src/lib/netlist/plib/pfunction.cpp7
-rw-r--r--src/lib/netlist/plib/pfunction.h1
-rw-r--r--src/mame/audio/nl_cheekyms.cpp56
3 files changed, 34 insertions, 30 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;
diff --git a/src/lib/netlist/plib/pfunction.h b/src/lib/netlist/plib/pfunction.h
index 0e24a633f3b..50e279cf034 100644
--- a/src/lib/netlist/plib/pfunction.h
+++ b/src/lib/netlist/plib/pfunction.h
@@ -32,6 +32,7 @@ namespace plib {
POW,
SIN,
COS,
+ RAND, /* random number between 0 and 1 */
PUSH_CONST,
PUSH_INPUT
};
diff --git a/src/mame/audio/nl_cheekyms.cpp b/src/mame/audio/nl_cheekyms.cpp
index 9effd3bf83b..cb93a6b6b72 100644
--- a/src/mame/audio/nl_cheekyms.cpp
+++ b/src/mame/audio/nl_cheekyms.cpp
@@ -7,6 +7,9 @@
#ifndef __PLIB_PREPROCESSOR__
+ #define NOISE(_name) \
+ NET_REGISTER_DEV(NOISE, _name)
+
#endif
/* Couriersud, 2013-05-26
@@ -58,15 +61,18 @@ NETLIST_START(cheekyms_schematics)
NET_C(C10.2, Q1.E, GND)
// Cheese
-#if 1
- // FIXME: We need a generic noise voltage or current source which be can
- // place in parallel to B-E so simulate device noise.
-
+#if 0
// RDUMMY will ensure the circuit does not become singular.
RES(RDUMMY, RES_M(1000))
NET_C(RDUMMY.1, GND)
NET_C(RDUMMY.2, Q2.C)
+ QBJT_EB(Q2, "2SC945")
+#else
+ // Use a simple noise generating macro device based on a current source
+ // to simulate the noise across B-E
+ NOISE(Q2)
+#endif
RES(R2, RES_M(1))
RES(R3, RES_K(1))
@@ -82,7 +88,6 @@ NETLIST_START(cheekyms_schematics)
CAP(C8, CAP_U(0.1))
CAP(C9, CAP_U(0.1))
CAP(C11, CAP_U(0.1))
- QBJT_EB(Q2, "2SC945")
NET_C(R2.1, I_VPLUS.Q)
NET_C(R2.2, C8.1, Q2.E)
NET_C(R3.1, C8.2)
@@ -97,31 +102,6 @@ NETLIST_START(cheekyms_schematics)
NET_C(R9.2, I_V5.Q)
NET_C(R11.1, R12.1, C11.2)
NET_C(R4.2, R5.1, R11.2, Q2.B, GND)
-#else
- // Rip out just enough to make it not blow up
- RES(R4, RES_K(100))
- RES(R5, RES_K(1))
- RES(R6, RES_K(100))
- RES(R7, RES_K(1))
- RES(R8, RES_M(1))
- RES(R9, RES_K(10))
- RES(R10, RES_K(10))
- RES(R11, RES_K(10))
- RES(R12, RES_K(100))
- CAP(C9, CAP_U(0.1))
- CAP(C11, CAP_U(0.1))
- NET_C(R4.1, IC5.10)
- NET_C(R5.2, R6.1, IC5.9)
- NET_C(R6.2, C9.1, IC5.8)
- NET_C(R7.1, C9.2)
- NET_C(R7.2, R8.1, IC5.13)
- NET_C(R8.2, C11.1, IC5.14)
- NET_C(R10.1, IC1.4)
- NET_C(R9.1, R10.2, IC5.12)
- NET_C(R9.2, I_V5.Q)
- NET_C(R11.1, R12.1, C11.2)
- NET_C(R4.2, R5.1, R11.2, GND)
-#endif
// Music
RES(R13, RES_K(100))
@@ -255,6 +235,17 @@ NETLIST_START(cheekyms_schematics)
NETLIST_END()
+/* simple noise generator to replace BJT E-B one
+ *
+ */
+
+NETLIST_START(NOISE)
+ CS(FC, 0)
+ PARAM(FC.FUNC, "0.0000001 rand *")
+
+ ALIAS(E, FC.P)
+ ALIAS(B, FC.N)
+NETLIST_END()
NETLIST_START(cheekyms)
@@ -267,8 +258,11 @@ NETLIST_START(cheekyms)
PARAM(Solver.DYNAMIC_LTE, 5e-4)
PARAM(Solver.DYNAMIC_MIN_TIMESTEP, 20e-6)
+ LOCAL_LIB_ENTRY(NOISE)
+
LOCAL_SOURCE(cheekyms_schematics)
+
ANALOG_INPUT(I_V5, 5)
ANALOG_INPUT(I_VPLUS, 12.9) // very approximate - 15V dropped by three diodes and filtered
@@ -294,3 +288,5 @@ NETLIST_START(cheekyms)
NET_C(I_COIN_EXTRA.Q, IC4_2.RESET)
NETLIST_END()
+
+