diff options
-rw-r--r-- | src/lib/netlist/plib/pfunction.cpp | 7 | ||||
-rw-r--r-- | src/lib/netlist/plib/pfunction.h | 1 | ||||
-rw-r--r-- | src/mame/audio/nl_cheekyms.cpp | 56 |
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() + + |