summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Derrick Renaud <derrickr@mamedev.org>2010-10-27 02:09:13 +0000
committer Derrick Renaud <derrickr@mamedev.org>2010-10-27 02:09:13 +0000
commit13c39be4947cdd20ed3ed93ca9bf81149709b804 (patch)
treeb8fd9821faf15a1b87c47e1b413859ed8218c8cc
parent411f90023dac76cd23c800392e488f79cfd27ed2 (diff)
Discrete Updates [Derrick Renaud]
Removed old DISCRETE_74LS624 code and replaced it with new 74LS629 based code. Updated Mario to use new DISCRETE_74LS624 and DISCRETE_XTIME_logic modules. ---- Some not whats.new stuff: I also fixed the regression to Galaxian. I made a DISCRETE_DECLARE_CONTEXT() macro to clean up the discrete module code and make it easier for any future possible C++ conversion.
-rw-r--r--src/emu/sound/disc_dev.c281
-rw-r--r--src/emu/sound/disc_flt.c153
-rw-r--r--src/emu/sound/disc_inp.c30
-rw-r--r--src/emu/sound/disc_mth.c216
-rw-r--r--src/emu/sound/disc_sys.c57
-rw-r--r--src/emu/sound/disc_wav.c198
-rw-r--r--src/emu/sound/discrete.c19
-rw-r--r--src/emu/sound/discrete.h113
-rw-r--r--src/mame/audio/bzone.c8
-rw-r--r--src/mame/audio/dkong.c158
-rw-r--r--src/mame/audio/mario.c536
-rw-r--r--src/mame/audio/skyraid.c8
12 files changed, 822 insertions, 955 deletions
diff --git a/src/emu/sound/disc_dev.c b/src/emu/sound/disc_dev.c
index bb7b874b346..ba1cfb5f8b1 100644
--- a/src/emu/sound/disc_dev.c
+++ b/src/emu/sound/disc_dev.c
@@ -14,8 +14,7 @@
* DSD_555_CC - NE555 Constant Current VCO
* DSD_555_VCO1 - Op-Amp linear ramp based 555 VCO
* DSD_566 - NE566 Simulation
- * DSD_LS624
- * DSD_LS629
+ * DSD_LS624 - 74LS624/629 Simulation
*
************************************************************************
*
@@ -127,20 +126,11 @@ struct dsd_566_context
struct dsd_ls624_context
{
- int state;
- double remain; /* remaining time from last step */
- int out_type;
- double k1; /* precalculated cap part of formula */
- double k2; /* precalculated ring part of formula */
- double dt_vmod_at_0;
-};
-
-struct dsd_ls629_context
-{
double exponent;
double t_used;
- double vmod_scale;
double v_cap_freq_in;
+ double v_freq_scale;
+ double v_rng_scale;
int flip_flop;
int has_freq_in_cap;
int out_type;
@@ -176,10 +166,10 @@ struct dsd_ls629_context
#define DSD_555_ASTBL_T_RC_CHARGE ((DSD_555_ASTBL__R1 + ((info->options & DISC_555_ASTABLE_HAS_FAST_CHARGE_DIODE) ? 0 : DSD_555_ASTBL__R2)) * DSD_555_ASTBL__C)
#define DSD_555_ASTBL_T_RC_DISCHARGE (DSD_555_ASTBL__R2 * DSD_555_ASTBL__C)
-static DISCRETE_STEP(dsd_555_astbl)
+DISCRETE_STEP(dsd_555_astbl)
{
- const discrete_555_desc *info = (const discrete_555_desc *)node->custom;
- struct dsd_555_astbl_context *context = (struct dsd_555_astbl_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dsd_555_astbl)
+ DISCRETE_DECLARE_INFO(discrete_555_desc)
int count_f = 0;
int count_r = 0;
@@ -402,10 +392,11 @@ static DISCRETE_STEP(dsd_555_astbl)
context->flip_flop = flip_flop;
}
-static DISCRETE_RESET(dsd_555_astbl)
+DISCRETE_RESET(dsd_555_astbl)
{
- const discrete_555_desc *info = (const discrete_555_desc *)node->custom;
- struct dsd_555_astbl_context *context = (struct dsd_555_astbl_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dsd_555_astbl)
+ DISCRETE_DECLARE_INFO(discrete_555_desc)
+
node_description *v_charge_node;
context->use_ctrlv = (node->input_is_node >> 4) & 1;
@@ -486,10 +477,10 @@ static DISCRETE_RESET(dsd_555_astbl)
/* bit mask of the above RC inputs */
#define DSD_555_MSTBL_RC_MASK 0x0c
-static DISCRETE_STEP(dsd_555_mstbl)
+DISCRETE_STEP(dsd_555_mstbl)
{
- const discrete_555_desc *info = (const discrete_555_desc *)node->custom;
- struct dsd_555_mstbl_context *context = (struct dsd_555_mstbl_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dsd_555_mstbl)
+ DISCRETE_DECLARE_INFO(discrete_555_desc)
double v_cap; /* Current voltage on capacitor, before dt */
double v_cap_next = 0; /* Voltage on capacitor, after dt */
@@ -606,10 +597,10 @@ static DISCRETE_STEP(dsd_555_mstbl)
}
}
-static DISCRETE_RESET(dsd_555_mstbl)
+DISCRETE_RESET(dsd_555_mstbl)
{
- const discrete_555_desc *info = (const discrete_555_desc *)node->custom;
- struct dsd_555_mstbl_context *context = (struct dsd_555_mstbl_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dsd_555_mstbl)
+ DISCRETE_DECLARE_INFO(discrete_555_desc)
context->output_type = info->options & DISC_555_OUT_MASK;
if ((context->output_type == DISC_555_OUT_COUNT_F) || (context->output_type == DISC_555_OUT_COUNT_R))
@@ -682,10 +673,10 @@ static DISCRETE_RESET(dsd_555_mstbl)
#define DSD_555_CC_T_RC_DISCHARGE (r_discharge * DSD_555_CC__C)
-static DISCRETE_STEP(dsd_555_cc)
+DISCRETE_STEP(dsd_555_cc)
{
- const discrete_555_cc_desc *info = (const discrete_555_cc_desc *)node->custom;
- struct dsd_555_cc_context *context = (struct dsd_555_cc_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dsd_555_cc)
+ DISCRETE_DECLARE_INFO(discrete_555_cc_desc)
int count_f = 0;
int count_r = 0;
@@ -1003,10 +994,10 @@ static DISCRETE_STEP(dsd_555_cc)
context->flip_flop = flip_flop;
}
-static DISCRETE_RESET(dsd_555_cc)
+DISCRETE_RESET(dsd_555_cc)
{
- const discrete_555_cc_desc *info = (const discrete_555_cc_desc *)node->custom;
- struct dsd_555_cc_context *context = (struct dsd_555_cc_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dsd_555_cc)
+ DISCRETE_DECLARE_INFO(discrete_555_cc_desc)
double r_temp, r_discharge = 0, r_charge = 0;
@@ -1233,10 +1224,10 @@ static DISCRETE_RESET(dsd_555_cc)
#define DSD_555_VCO1__VIN1 DISCRETE_INPUT(1)
#define DSD_555_VCO1__VIN2 DISCRETE_INPUT(2)
-static DISCRETE_STEP(dsd_555_vco1)
+DISCRETE_STEP(dsd_555_vco1)
{
- const discrete_555_vco1_desc *info = (const discrete_555_vco1_desc *)node->custom;
- struct dsd_555_vco1_context *context = (struct dsd_555_vco1_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dsd_555_vco1)
+ DISCRETE_DECLARE_INFO(discrete_555_vco1_desc)
int count_f = 0;
int count_r = 0;
@@ -1386,10 +1377,10 @@ static DISCRETE_STEP(dsd_555_vco1)
}
}
-static DISCRETE_RESET(dsd_555_vco1)
+DISCRETE_RESET(dsd_555_vco1)
{
- const discrete_555_vco1_desc *info = (const discrete_555_vco1_desc *)node->custom;
- struct dsd_555_vco1_context *context = (struct dsd_555_vco1_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dsd_555_vco1)
+ DISCRETE_DECLARE_INFO(discrete_555_vco1_desc)
double v_ratio_r3, v_ratio_r4_1, r_in_1;
@@ -1524,9 +1515,9 @@ static const struct
{4.495, /*4.895,*/ 5.343, /*5.703,*/ 5.997, 6.507, 7.016, 7.518} /* osc_stop */
};
-static DISCRETE_STEP(dsd_566)
+DISCRETE_STEP(dsd_566)
{
- struct dsd_566_context *context = (struct dsd_566_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dsd_566)
double i = 0; /* Charging current created by vIn */
double i_rise; /* non-linear rise charge current */
@@ -1646,9 +1637,9 @@ static DISCRETE_STEP(dsd_566)
}
}
-static DISCRETE_RESET(dsd_566)
+DISCRETE_RESET(dsd_566)
{
- struct dsd_566_context *context = (struct dsd_566_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dsd_566)
int v_int;
double v_float;
@@ -1697,130 +1688,21 @@ static DISCRETE_RESET(dsd_566)
*
* DSD_LS624 - Usage of node_description values
*
- * input[0] - Modulation Voltage
- * input[1] - Range Voltage
- * input[2] - C value
- * input[3] - Output type
- *
- * Dec 2007, Couriersud
- ************************************************************************/
-#define DSD_LS624__VMOD DISCRETE_INPUT(0)
-#define DSD_LS624__VRNG DISCRETE_INPUT(1)
-#define DSD_LS624__C DISCRETE_INPUT(2)
-#define DSD_LS624__OUTTYPE DISCRETE_INPUT(3)
-
-/*
- * The datasheet mentions a 600 ohm discharge. It also gives
- * equivalent circuits for VI and VR.
- */
-
-#define LS624_F1(x) (0.19 + 20.0/90.0*(x))
-#define LS624_T(_C, _R, _F) ((-600.0 * (_C) * log(1.0-LS624_F1(_R)*0.12/LS624_F1(_F))) * 16.0 )
-
-/* The following formula was derived from figures 2 and 3 in LS624 datasheet. Coefficients
- * where calculated using least square approximation.
- * This approach gives a bit better results compared to the first approach.
- */
-/* Original formula before optimization of static values
- #define LS624_F(_C, _VI, _VR) pow(10, -0.912029404 * log10(_C) + 0.243264328 * (_VI) \
- - 0.091695877 * (_VR) -0.014110946 * (_VI) * (_VR) - 3.207072925)
-*/
-
-/* pow(10, x) = exp(ln(10)*x) */
-#define pow10(x) exp(2.30258509299404568401*(x))
-
-#define LS624_F(_VI) pow10(context->k1 + 0.243264328 * (_VI) + context->k2 * (_VI))
-
-static DISCRETE_STEP(dsd_ls624)
-{
- struct dsd_ls624_context *context = (struct dsd_ls624_context *)node->context;
-
- double dt; /* change in time */
- double sample_t;
- double t;
- double en = 0.0f;
- int cntf = 0, cntr = 0;
-
- sample_t = node->info->sample_time; /* Change in time */
- //dt = LS624_T(DSD_LS624__C, DSD_LS624__VRNG, DSD_LS624__VMOD) / 2.0;
- if (EXPECTED(DSD_LS624__VMOD > 0.001))
- dt = 0.5 / LS624_F(DSD_LS624__VMOD);
- else
- /* close enough to 0, so we can speed things up by no longer call pow() */
- dt = context->dt_vmod_at_0;
- t = context->remain;
- en += (double) context->state * t;
- while (EXPECTED(t + dt <= sample_t))
- {
- en += (double) context->state * dt;
- context->state = (1 - context->state);
- if (context->state)
- cntr++;
- else
- cntf++;
- t += dt;
- }
- en += (sample_t - t) * (double) context->state;
- context->remain = t - sample_t;
-
- switch (context->out_type)
- {
- case DISC_LS624_OUT_ENERGY:
- node->output[0] = en / sample_t;
- break;
- case DISC_LS624_OUT_LOGIC:
- /* filter out randomness */
- if (UNEXPECTED(cntf + cntr > 1))
- node->output[0] = 1;
- else
- node->output[0] = context->state;
- break;
- case DISC_LS624_OUT_COUNT_F:
- node->output[0] = cntf;
- break;
- case DISC_LS624_OUT_COUNT_R:
- node->output[0] = cntr;
- break;
- }
-}
-
-static DISCRETE_RESET(dsd_ls624)
-{
- struct dsd_ls624_context *context = (struct dsd_ls624_context *)node->context;
-
- context->remain = 0;
- context->state = 0;
- context->out_type = DSD_LS624__OUTTYPE;
-
- /* precalculate some parts of the formula for speed */
- context->k1 = -0.912029404 * log10(DSD_LS624__C) -0.091695877 * (DSD_LS624__VRNG) - 3.207072925;
- context->k2 = -0.014110946 * (DSD_LS624__VRNG);
-
- context->dt_vmod_at_0 = 0.5 / LS624_F(0);
-
- /* Step the output */
- DISCRETE_STEP_CALL(dsd_ls624);
-}
-
-
-/************************************************************************
- *
- * DSD_LS629 - Usage of node_description values
- *
* Dec 2007, Couriersud based on data sheet
* Oct 2009, complete re-write based on IC testing
************************************************************************/
-#define DSD_LS629__ENABLE DISCRETE_INPUT(0)
-#define DSD_LS629__VMOD DISCRETE_INPUT(1)
-#define DSD_LS629__VRNG DISCRETE_INPUT(2)
-#define DSD_LS629__C DISCRETE_INPUT(3)
-#define DSD_LS629__R_FREQ_IN DISCRETE_INPUT(4)
-#define DSD_LS629__C_FREQ_IN DISCRETE_INPUT(5)
-#define DSD_LS629__OUTTYPE DISCRETE_INPUT(6)
+#define DSD_LS624__ENABLE DISCRETE_INPUT(0)
+#define DSD_LS624__VMOD DISCRETE_INPUT(1)
+#define DSD_LS624__VRNG DISCRETE_INPUT(2)
+#define DSD_LS624__C DISCRETE_INPUT(3)
+#define DSD_LS624__R_FREQ_IN DISCRETE_INPUT(4)
+#define DSD_LS624__C_FREQ_IN DISCRETE_INPUT(5)
+#define DSD_LS624__R_RNG_IN DISCRETE_INPUT(6)
+#define DSD_LS624__OUTTYPE DISCRETE_INPUT(7)
#define LS624_R_EXT 600.0 /* as specified in data sheet */
#define LS624_OUT_HIGH 4.5 /* measured */
-#define LS624_FREQ_R_IN RES_K(90) /* measured & 70K + 20k per data sheet */
+#define LS624_IN_R RES_K(90) /* measured & 70K + 20k per data sheet */
/*
* The 74LS624 series are constant current based VCOs. The Freq Control voltage
@@ -1856,17 +1738,17 @@ static DISCRETE_RESET(dsd_ls624)
*/
-static DISCRETE_STEP(dsd_ls629)
+DISCRETE_STEP(dsd_ls624)
{
- struct dsd_ls629_context *context = (struct dsd_ls629_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dsd_ls624)
double x_time = 0;
double freq, t1;
+ double v_freq_2, v_freq_3, v_freq_4;
double t_used = context->t_used;
double dt = node->info->sample_time;;
- double vmod = DSD_LS629__VMOD;
- double vmod_2, vmod_3, vmod_4;
- double range = DSD_LS629__VRNG;
+ double v_freq = DSD_LS624__VMOD;
+ double v_rng = DSD_LS624__VRNG;
int count_f = 0, count_r = 0;
/* coefficients */
@@ -1881,36 +1763,36 @@ static DISCRETE_STEP(dsd_ls629)
const double k9 = 2.9914575453819188E+00;
const double k10 = 1.6855569086173170E+00;
- if (UNEXPECTED(DSD_LS629__ENABLE == 0))
+ if (UNEXPECTED(DSD_LS624__ENABLE == 0))
return;
/* scale due to input resistance */
- if ((EXPECTED(DSD_LS629__R_FREQ_IN > 0)))
- vmod *= context->vmod_scale;
+ v_freq *= context->v_freq_scale;
+ v_rng *= context->v_rng_scale;
/* apply cap if needed */
if (context->has_freq_in_cap)
{
- context->v_cap_freq_in += (vmod - context->v_cap_freq_in) * context->exponent;
- vmod = context->v_cap_freq_in;
+ context->v_cap_freq_in += (v_freq - context->v_cap_freq_in) * context->exponent;
+ v_freq = context->v_cap_freq_in;
}
/* Polyfunctional3D_model created by zunzun.com using sum of squared absolute error */
- vmod_2 = vmod * vmod;
- vmod_3 = vmod_2 * vmod;
- vmod_4 = vmod_3 * vmod;
+ v_freq_2 = v_freq * v_freq;
+ v_freq_3 = v_freq_2 * v_freq;
+ v_freq_4 = v_freq_3 * v_freq;
freq = k1;
- freq += k2 * vmod;
- freq += k3 * vmod_2;
- freq += k4 * vmod_3;
- freq += k5 * vmod_4;
- freq += k6 * range;
- freq += k7 * range * vmod;
- freq += k8 * range * vmod_2;
- freq += k9 * range * vmod_3;
- freq += k10 * range * vmod_4;
-
- freq *= CAP_U(0.1) / DSD_LS629__C;
+ freq += k2 * v_freq;
+ freq += k3 * v_freq_2;
+ freq += k4 * v_freq_3;
+ freq += k5 * v_freq_4;
+ freq += k6 * v_rng;
+ freq += k7 * v_rng * v_freq;
+ freq += k8 * v_rng * v_freq_2;
+ freq += k9 * v_rng * v_freq_3;
+ freq += k10 * v_rng * v_freq_4;
+
+ freq *= CAP_U(0.1) / DSD_LS624__C;
t1 = 0.5 / freq ;
t_used += node->info->sample_time;
@@ -1941,16 +1823,6 @@ static DISCRETE_STEP(dsd_ls629)
switch (context->out_type)
{
- case DISC_LS624_OUT_SQUARE:
- node->output[0] = context->flip_flop ? LS624_OUT_HIGH : 0;
- break;
- case DISC_LS624_OUT_ENERGY:
- if (x_time == 0) x_time = 1.0;
- node->output[0] = LS624_OUT_HIGH * (context->flip_flop ? x_time : (1.0 - x_time));
- break;
- case DISC_LS624_OUT_LOGIC:
- node->output[0] = context->flip_flop;
- break;
case DISC_LS624_OUT_LOGIC_X:
node->output[0] = context->flip_flop + x_time;
break;
@@ -1966,22 +1838,33 @@ static DISCRETE_STEP(dsd_ls629)
case DISC_LS624_OUT_COUNT_R:
node->output[0] = count_r;
break;
+ case DISC_LS624_OUT_ENERGY:
+ if (x_time == 0) x_time = 1.0;
+ node->output[0] = LS624_OUT_HIGH * (context->flip_flop ? x_time : (1.0 - x_time));
+ break;
+ case DISC_LS624_OUT_LOGIC:
+ node->output[0] = context->flip_flop;
+ break;
+ case DISC_LS624_OUT_SQUARE:
+ node->output[0] = context->flip_flop ? LS624_OUT_HIGH : 0;
+ break;
}
}
-static DISCRETE_RESET(dsd_ls629)
+DISCRETE_RESET(dsd_ls624)
{
- struct dsd_ls629_context *context = (struct dsd_ls629_context *)node->context;
+ struct dsd_ls624_context *context = (struct dsd_ls624_context *)node->context;
- context->out_type = (int)DSD_LS629__OUTTYPE;
+ context->out_type = (int)DSD_LS624__OUTTYPE;
context->flip_flop = 0;
context->t_used = 0;
- context->vmod_scale = RES_K(90) / (DSD_LS629__R_FREQ_IN + RES_K(90));
- if (DSD_LS629__C_FREQ_IN > 0)
+ context->v_freq_scale = LS624_IN_R / (DSD_LS624__R_FREQ_IN + LS624_IN_R);
+ context->v_rng_scale = LS624_IN_R / (DSD_LS624__R_RNG_IN + LS624_IN_R);
+ if (DSD_LS624__C_FREQ_IN > 0)
{
context->has_freq_in_cap = 1;
- context->exponent = RC_CHARGE_EXP(RES_2_PARALLEL(DSD_LS629__R_FREQ_IN, RES_K(90)) * DSD_LS629__C_FREQ_IN);
+ context->exponent = RC_CHARGE_EXP(RES_2_PARALLEL(DSD_LS624__R_FREQ_IN, LS624_IN_R) * DSD_LS624__C_FREQ_IN);
context->v_cap_freq_in = 0;
}
else
diff --git a/src/emu/sound/disc_flt.c b/src/emu/sound/disc_flt.c
index 2eb880e2568..c4a339249be 100644
--- a/src/emu/sound/disc_flt.c
+++ b/src/emu/sound/disc_flt.c
@@ -27,7 +27,7 @@
*
************************************************************************/
-struct dss_filter1_context
+struct dst_filter1_context
{
double x1; /* x[k-1], previous input value */
double y1; /* y[k-1], previous output value */
@@ -35,7 +35,7 @@ struct dss_filter1_context
double b0, b1; /* digital filter coefficients, numerator */
};
-struct dss_filter2_context
+struct dst_filter2_context
{
double x1, x2; /* x[k-1], x[k-2], previous 2 input values */
double y1, y2; /* y[k-1], y[k-2], previous 2 output values */
@@ -155,9 +155,9 @@ struct dst_rcintegrate_context
#define DST_CRFILTER__C DISCRETE_INPUT(2)
#define DST_CRFILTER__VREF DISCRETE_INPUT(3)
-static DISCRETE_STEP(dst_crfilter)
+DISCRETE_STEP(dst_crfilter)
{
- struct dst_rcfilter_context *context = (struct dst_rcfilter_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_rcfilter)
if (UNEXPECTED(context->has_rc_nodes))
{
@@ -174,9 +174,9 @@ static DISCRETE_STEP(dst_crfilter)
context->vCap += (node->output[0] - DST_CRFILTER__VREF) * context->exponent;
}
-static DISCRETE_RESET(dst_crfilter)
+DISCRETE_RESET(dst_crfilter)
{
- struct dst_rcfilter_context *context = (struct dst_rcfilter_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_rcfilter)
context->has_rc_nodes = node->input_is_node & 0x6;
context->rc = DST_CRFILTER__R * DST_CRFILTER__C;
@@ -228,9 +228,9 @@ static void calculate_filter1_coefficients(const discrete_info *disc_info, doubl
}
}
-static DISCRETE_STEP(dst_filter1)
+DISCRETE_STEP(dst_filter1)
{
- struct dss_filter1_context *context = (struct dss_filter1_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_filter1)
double gain = 1.0;
@@ -245,9 +245,9 @@ static DISCRETE_STEP(dst_filter1)
context->y1 = node->output[0];
}
-static DISCRETE_RESET(dst_filter1)
+DISCRETE_RESET(dst_filter1)
{
- struct dss_filter1_context *context = (struct dss_filter1_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_filter1)
calculate_filter1_coefficients(node->info, DST_FILTER1__FREQ, DST_FILTER1__TYPE, &context->a1, &context->b0, &context->b1);
node->output[0] = 0;
@@ -314,9 +314,9 @@ static void calculate_filter2_coefficients(const discrete_info *disc_info,
}
}
-static DISCRETE_STEP(dst_filter2)
+DISCRETE_STEP(dst_filter2)
{
- struct dss_filter2_context *context = (struct dss_filter2_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_filter2)
double gain = 1.0;
@@ -334,9 +334,9 @@ static DISCRETE_STEP(dst_filter2)
context->y1 = node->output[0];
}
-static DISCRETE_RESET(dst_filter2)
+DISCRETE_RESET(dst_filter2)
{
- struct dss_filter2_context *context = (struct dss_filter2_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_filter2)
calculate_filter2_coefficients(node->info, DST_FILTER2__FREQ, DST_FILTER2__DAMP, DST_FILTER2__TYPE,
&context->a1, &context->a2,
@@ -363,10 +363,10 @@ static DISCRETE_RESET(dst_filter2)
#define DST_OP_AMP_FILT__INP2 DISCRETE_INPUT(2)
#define DST_OP_AMP_FILT__TYPE DISCRETE_INPUT(3)
-static DISCRETE_STEP(dst_op_amp_filt)
+DISCRETE_STEP(dst_op_amp_filt)
{
- const discrete_op_amp_filt_info *info = (const discrete_op_amp_filt_info *)node->custom;
- struct dst_op_amp_filt_context *context = (struct dst_op_amp_filt_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_op_amp_filt)
+ DISCRETE_DECLARE_INFO(discrete_op_amp_filt_info)
double i, v = 0;
@@ -463,10 +463,10 @@ static DISCRETE_STEP(dst_op_amp_filt)
}
-static DISCRETE_RESET(dst_op_amp_filt)
+DISCRETE_RESET(dst_op_amp_filt)
{
- const discrete_op_amp_filt_info *info = (const discrete_op_amp_filt_info *)node->custom;
- struct dst_op_amp_filt_context *context = (struct dst_op_amp_filt_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_op_amp_filt)
+ DISCRETE_DECLARE_INFO(discrete_op_amp_filt_info)
/* Convert the passed filter type into an int for easy use. */
context->type = (int)DST_OP_AMP_FILT__TYPE & DISC_OP_AMP_FILTER_TYPE_MASK;
@@ -577,9 +577,9 @@ static DISCRETE_RESET(dst_op_amp_filt)
#define CD4066_R_ON 270
-static DISCRETE_STEP( dst_rc_circuit_1 )
+DISCRETE_STEP( dst_rc_circuit_1 )
{
- struct dst_rc_circuit_1_context *context = (struct dst_rc_circuit_1_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_rc_circuit_1)
if (DST_RC_CIRCUIT_1__IN0 == 0)
if (DST_RC_CIRCUIT_1__IN1 == 0)
@@ -608,9 +608,9 @@ static DISCRETE_STEP( dst_rc_circuit_1 )
}
}
-static DISCRETE_RESET( dst_rc_circuit_1 )
+DISCRETE_RESET( dst_rc_circuit_1 )
{
- struct dst_rc_circuit_1_context *context = (struct dst_rc_circuit_1_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_rc_circuit_1)
/* the charging voltage across the cap based on in2*/
context->v_drop = RES_VOLTAGE_DIVIDER(CD4066_R_ON, CD4066_R_ON + DST_RC_CIRCUIT_1__R);
@@ -645,9 +645,9 @@ static DISCRETE_RESET( dst_rc_circuit_1 )
#define DST_RCDISC__R DISCRETE_INPUT(2)
#define DST_RCDISC__C DISCRETE_INPUT(3)
-static DISCRETE_STEP(dst_rcdisc)
+DISCRETE_STEP(dst_rcdisc)
{
- struct dst_rcdisc_context *context = (struct dst_rcdisc_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_rcdisc)
switch (context->state)
{
@@ -672,9 +672,9 @@ static DISCRETE_STEP(dst_rcdisc)
}
}
-static DISCRETE_RESET(dst_rcdisc)
+DISCRETE_RESET(dst_rcdisc)
{
- struct dst_rcdisc_context *context = (struct dst_rcdisc_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_rcdisc)
node->output[0] = 0;
@@ -704,9 +704,9 @@ static DISCRETE_RESET(dst_rcdisc)
#define DST_RCDISC2__R1 DISCRETE_INPUT(4)
#define DST_RCDISC2__C DISCRETE_INPUT(5)
-static DISCRETE_STEP(dst_rcdisc2)
+DISCRETE_STEP(dst_rcdisc2)
{
- struct dst_rcdisc_context *context = (struct dst_rcdisc_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_rcdisc)
double diff;
@@ -718,9 +718,9 @@ static DISCRETE_STEP(dst_rcdisc2)
node->output[0] += diff;
}
-static DISCRETE_RESET(dst_rcdisc2)
+DISCRETE_RESET(dst_rcdisc2)
{
- struct dst_rcdisc_context *context = (struct dst_rcdisc_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_rcdisc)
node->output[0] = 0;
@@ -750,9 +750,9 @@ static DISCRETE_RESET(dst_rcdisc2)
#define DST_RCDISC3__C DISCRETE_INPUT(4)
#define DST_RCDISC3__DJV DISCRETE_INPUT(5)
-static DISCRETE_STEP(dst_rcdisc3)
+DISCRETE_STEP(dst_rcdisc3)
{
- struct dst_rcdisc_context *context = (struct dst_rcdisc_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_rcdisc)
double diff;
@@ -799,9 +799,9 @@ static DISCRETE_STEP(dst_rcdisc3)
}
}
-static DISCRETE_RESET(dst_rcdisc3)
+DISCRETE_RESET(dst_rcdisc3)
{
- struct dst_rcdisc_context *context = (struct dst_rcdisc_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_rcdisc)
node->output[0] = 0;
@@ -835,9 +835,9 @@ static DISCRETE_RESET(dst_rcdisc3)
#define DST_RCDISC4__VP DISCRETE_INPUT(6)
#define DST_RCDISC4__TYPE DISCRETE_INPUT(7)
-static DISCRETE_STEP(dst_rcdisc4)
+DISCRETE_STEP(dst_rcdisc4)
{
- struct dst_rcdisc4_context *context = (struct dst_rcdisc4_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_rcdisc4)
int inp1 = (DST_RCDISC4__IN == 0) ? 0 : 1;
@@ -861,9 +861,9 @@ static DISCRETE_STEP(dst_rcdisc4)
if (node->output[0] < 0) node->output[0] = 0;
}
-static DISCRETE_RESET( dst_rcdisc4)
+DISCRETE_RESET( dst_rcdisc4)
{
- struct dst_rcdisc4_context *context = (struct dst_rcdisc4_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_rcdisc4)
double v, i, r, rT;
@@ -947,9 +947,9 @@ static DISCRETE_RESET( dst_rcdisc4)
#define DST_RCDISC5__R DISCRETE_INPUT(2)
#define DST_RCDISC5__C DISCRETE_INPUT(3)
-static DISCRETE_STEP( dst_rcdisc5)
+DISCRETE_STEP( dst_rcdisc5)
{
- struct dst_rcdisc_context *context = (struct dst_rcdisc_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_rcdisc)
double diff,u;
@@ -978,9 +978,9 @@ static DISCRETE_STEP( dst_rcdisc5)
}
}
-static DISCRETE_RESET( dst_rcdisc5)
+DISCRETE_RESET( dst_rcdisc5)
{
- struct dst_rcdisc_context *context = (struct dst_rcdisc_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_rcdisc)
node->output[0] = 0;
@@ -1015,9 +1015,9 @@ static DISCRETE_RESET( dst_rcdisc5)
#define DST_RCDISC_MOD__C DISCRETE_INPUT(6)
#define DST_RCDISC_MOD__VP DISCRETE_INPUT(7)
-static DISCRETE_STEP(dst_rcdisc_mod)
+DISCRETE_STEP(dst_rcdisc_mod)
{
- struct dst_rcdisc_mod_context *context = (struct dst_rcdisc_mod_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_rcdisc_mod)
double diff, v_cap, u, vD;
int mod_state, mod1_state, mod2_state;
@@ -1050,9 +1050,9 @@ static DISCRETE_STEP(dst_rcdisc_mod)
context->v_cap = v_cap;
}
-static DISCRETE_RESET(dst_rcdisc_mod)
+DISCRETE_RESET(dst_rcdisc_mod)
{
- struct dst_rcdisc_mod_context *context = (struct dst_rcdisc_mod_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_rcdisc_mod)
double rc[2], rc2[2];
@@ -1104,9 +1104,9 @@ static DISCRETE_RESET(dst_rcdisc_mod)
#define DST_RCFILTER__C DISCRETE_INPUT(2)
#define DST_RCFILTER__VREF DISCRETE_INPUT(3)
-static DISCRETE_STEP(dst_rcfilter)
+DISCRETE_STEP(dst_rcfilter)
{
- struct dst_rcfilter_context *context = (struct dst_rcfilter_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_rcfilter)
if (UNEXPECTED(context->has_rc_nodes))
{
@@ -1126,15 +1126,16 @@ static DISCRETE_STEP(dst_rcfilter)
node->output[0] = context->vCap + DST_RCFILTER__VREF;
}
-static DISCRETE_STEP(dst_rcfilter_fast)
+DISCRETE_STEP(dst_rcfilter_fast)
{
- struct dst_rcfilter_context *context = (struct dst_rcfilter_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_rcfilter)
+
node->output[0] += ((DST_RCFILTER__VIN - node->output[0]) * context->exponent);
}
-static DISCRETE_RESET(dst_rcfilter)
+DISCRETE_RESET(dst_rcfilter)
{
- struct dst_rcfilter_context *context = (struct dst_rcfilter_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_rcfilter)
context->has_rc_nodes = node->input_is_node & 0x6;
context->rc = DST_RCFILTER__R * DST_RCFILTER__C;
@@ -1173,9 +1174,9 @@ static DISCRETE_RESET(dst_rcfilter)
#define CD4066_ON_RES (40)
// FIXME: This needs optimization !
-static DISCRETE_STEP(dst_rcfilter_sw)
+DISCRETE_STEP(dst_rcfilter_sw)
{
- struct dst_rcfilter_sw_context *context = (struct dst_rcfilter_sw_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_rcfilter_sw)
int i;
int bits = (int)DST_RCFILTER_SW__SWITCH;
@@ -1217,9 +1218,9 @@ static DISCRETE_STEP(dst_rcfilter_sw)
}
}
-static DISCRETE_RESET(dst_rcfilter_sw)
+DISCRETE_RESET(dst_rcfilter_sw)
{
- struct dst_rcfilter_sw_context *context = (struct dst_rcfilter_sw_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_rcfilter_sw)
int i, bits;
@@ -1289,9 +1290,9 @@ static DISCRETE_RESET(dst_rcfilter_sw)
#define KT 0.026
#define EM_IC(x) (ALPHAT * IES * exp( (x) / KT - 1.0 ))
-static DISCRETE_STEP( dst_rcintegrate)
+DISCRETE_STEP( dst_rcintegrate)
{
- struct dst_rcintegrate_context *context = (struct dst_rcintegrate_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_rcintegrate)
double diff, u, iQ, iQc, iC, RG, vE;
double vP;
@@ -1350,9 +1351,9 @@ static DISCRETE_STEP( dst_rcintegrate)
break;
}
}
-static DISCRETE_RESET(dst_rcintegrate)
+DISCRETE_RESET(dst_rcintegrate)
{
- struct dst_rcintegrate_context *context = (struct dst_rcintegrate_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_rcintegrate)
double r;
double dt = node->info->sample_time;
@@ -1394,9 +1395,9 @@ static DISCRETE_RESET(dst_rcintegrate)
#define DST_SALLEN_KEY__INP0 DISCRETE_INPUT(1)
#define DST_SALLEN_KEY__TYPE DISCRETE_INPUT(2)
-static DISCRETE_STEP(dst_sallen_key)
+DISCRETE_STEP(dst_sallen_key)
{
- struct dss_filter2_context *context = (struct dss_filter2_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_filter2)
double gain = 1.0;
@@ -1414,10 +1415,10 @@ static DISCRETE_STEP(dst_sallen_key)
context->y1 = node->output[0];
}
-static DISCRETE_RESET(dst_sallen_key)
+DISCRETE_RESET(dst_sallen_key)
{
- struct dss_filter2_context *context = (struct dss_filter2_context *)node->context;
- const discrete_op_amp_filt_info *info = (const discrete_op_amp_filt_info *)node->custom;
+ DISCRETE_DECLARE_CONTEXT(dst_filter2)
+ DISCRETE_DECLARE_INFO(discrete_op_amp_filt_info)
double freq, q;
@@ -1456,7 +1457,7 @@ static DISCRETE_RESET(dst_sallen_key)
#define DST_RCFILTERN__R DISCRETE_INPUT(2)
#define DST_RCFILTERN__C DISCRETE_INPUT(3)
-static DISCRETE_RESET(dst_rcfilterN)
+DISCRETE_RESET(dst_rcfilterN)
{
#if 0
double f=1.0/(2*M_PI* DST_RCFILTERN__R * DST_RCFILTERN__C);
@@ -1489,7 +1490,7 @@ static DISCRETE_RESET(dst_rcfilterN)
#define DST_RCDISCN__R DISCRETE_INPUT(2)
#define DST_RCDISCN__C DISCRETE_INPUT(3)
-static DISCRETE_RESET(dst_rcdiscN)
+DISCRETE_RESET(dst_rcdiscN)
{
#if 0
double f = 1.0 / (2 * M_PI * DST_RCDISCN__R * DST_RCDISCN__C);
@@ -1505,9 +1506,9 @@ static DISCRETE_RESET(dst_rcdiscN)
#endif
}
-static DISCRETE_STEP(dst_rcdiscN)
+DISCRETE_STEP(dst_rcdiscN)
{
- struct dss_filter1_context *context = (struct dss_filter1_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_filter1)
double gain = 1.0;
@@ -1548,7 +1549,7 @@ static DISCRETE_STEP(dst_rcdiscN)
#define DST_RCDISC2N__R1 DISCRETE_INPUT(4)
#define DST_RCDISC2N__C DISCRETE_INPUT(5)
-struct dss_rcdisc2_context
+struct dst_rcdisc2_context
{
double x1; /* x[k-1], last input value */
double y1; /* y[k-1], last output value */
@@ -1556,9 +1557,9 @@ struct dss_rcdisc2_context
double a1_1, b0_1, b1_1; /* digital filter coefficients, filter #2 */
};
-static DISCRETE_STEP(dst_rcdisc2N)
+DISCRETE_STEP(dst_rcdisc2N)
{
- struct dss_rcdisc2_context *context = (struct dss_rcdisc2_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_rcdisc2)
double input = ((DST_RCDISC2N__ENABLE == 0) ? DST_RCDISC2N__IN0 : DST_RCDISC2N__IN1);
@@ -1571,9 +1572,9 @@ static DISCRETE_STEP(dst_rcdisc2N)
context->y1 = node->output[0];
}
-static DISCRETE_RESET(dst_rcdisc2N)
+DISCRETE_RESET(dst_rcdisc2N)
{
- struct dss_rcdisc2_context *context = (struct dss_rcdisc2_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_rcdisc2)
double f1,f2;
f1 = 1.0 / (2 * M_PI * DST_RCDISC2N__R0 * DST_RCDISC2N__C);
diff --git a/src/emu/sound/disc_inp.c b/src/emu/sound/disc_inp.c
index c74ff87a97a..8c917c105ac 100644
--- a/src/emu/sound/disc_inp.c
+++ b/src/emu/sound/disc_inp.c
@@ -146,9 +146,9 @@ WRITE8_DEVICE_HANDLER(discrete_sound_w)
#define DSS_ADJUSTMENT__PMIN DISCRETE_INPUT(4)
#define DSS_ADJUSTMENT__PMAX DISCRETE_INPUT(5)
-static DISCRETE_STEP(dss_adjustment)
+DISCRETE_STEP(dss_adjustment)
{
- struct dss_adjustment_context *context = (struct dss_adjustment_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_adjustment)
INT32 rawportval = input_port_read_direct(context->port);
@@ -166,9 +166,9 @@ static DISCRETE_STEP(dss_adjustment)
}
}
-static DISCRETE_RESET(dss_adjustment)
+DISCRETE_RESET(dss_adjustment)
{
- struct dss_adjustment_context *context = (struct dss_adjustment_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_adjustment)
double min, max;
@@ -210,7 +210,7 @@ static DISCRETE_RESET(dss_adjustment)
************************************************************************/
#define DSS_CONSTANT__INIT DISCRETE_INPUT(0)
-static DISCRETE_RESET(dss_constant)
+DISCRETE_RESET(dss_constant)
{
node->output[0]= DSS_CONSTANT__INIT;
}
@@ -226,9 +226,9 @@ static DISCRETE_RESET(dss_constant)
* input[3] - Current data value
*
************************************************************************/
-static DISCRETE_RESET(dss_input)
+DISCRETE_RESET(dss_input)
{
- struct dss_input_context *context = (struct dss_input_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_input)
context->is_buffered = FALSE;
context->is_stream = FALSE;
@@ -251,9 +251,9 @@ static DISCRETE_RESET(dss_input)
node->output[0] = context->data * context->gain + context->offset;
}
-static DISCRETE_STEP(dss_input_pulse)
+DISCRETE_STEP(dss_input_pulse)
{
- struct dss_input_context *context = (struct dss_input_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_input)
/* Set a valid output */
node->output[0] = context->data;
@@ -276,10 +276,10 @@ static DISCRETE_STEP(dss_input_pulse)
#define DSS_INPUT_STREAM__GAIN DISCRETE_INPUT(1)
#define DSS_INPUT_STREAM__OFFSET DISCRETE_INPUT(2)
-static DISCRETE_STEP(dss_input_stream)
+DISCRETE_STEP(dss_input_stream)
{
/* the context pointer is set to point to the current input stream data in discrete_stream_update */
- struct dss_input_context *context = (struct dss_input_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_input)
if (EXPECTED(context->ptr))
{
@@ -290,17 +290,17 @@ static DISCRETE_STEP(dss_input_stream)
node->output[0] = 0;
}
-static DISCRETE_RESET(dss_input_stream)
+DISCRETE_RESET(dss_input_stream)
{
- struct dss_input_context *context = (struct dss_input_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_input)
context->ptr = NULL;
context->data = 0;
}
-static DISCRETE_START(dss_input_stream)
+DISCRETE_START(dss_input_stream)
{
- struct dss_input_context *context = (struct dss_input_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_input)
assert(DSS_INPUT_STREAM__STREAM < linked_list_count(node->info->input_list));
diff --git a/src/emu/sound/disc_mth.c b/src/emu/sound/disc_mth.c
index d908c0b5c8c..c8ddc1b8484 100644
--- a/src/emu/sound/disc_mth.c
+++ b/src/emu/sound/disc_mth.c
@@ -71,7 +71,7 @@ struct dst_dac_r1_context
int last_data;
};
-struct dst_diode_mix__context
+struct dst_diode_mix_context
{
int size;
double v_junction[8];
@@ -118,7 +118,7 @@ struct dst_oneshot_context
int type;
};
-struct dss_ramp_context
+struct dst_ramp_context
{
double step;
int dir; /* 1 if End is higher then Start */
@@ -209,7 +209,7 @@ struct dst_tvca_op_amp_context
#define DST_ADDER__IN2 DISCRETE_INPUT(3)
#define DST_ADDER__IN3 DISCRETE_INPUT(4)
-static DISCRETE_STEP(dst_adder)
+DISCRETE_STEP(dst_adder)
{
if(DST_ADDER__ENABLE)
{
@@ -234,9 +234,9 @@ static DISCRETE_STEP(dst_adder)
************************************************************************/
#define DST_COMP_ADDER__SELECT DISCRETE_INPUT(0)
-static DISCRETE_STEP(dst_comp_adder)
+DISCRETE_STEP(dst_comp_adder)
{
- struct dst_comp_adder_context *context = (struct dst_comp_adder_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_comp_adder)
int select;
select = (int)DST_COMP_ADDER__SELECT;
@@ -244,10 +244,10 @@ static DISCRETE_STEP(dst_comp_adder)
node->output[0] = context->total[select];
}
-static DISCRETE_RESET(dst_comp_adder)
+DISCRETE_RESET(dst_comp_adder)
{
- const discrete_comp_adder_table *info = (const discrete_comp_adder_table *)node->custom;
- struct dst_comp_adder_context *context = (struct dst_comp_adder_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_comp_adder)
+ DISCRETE_DECLARE_INFO(discrete_comp_adder_table)
int i, bit;
int length = 1 << info->length;
@@ -292,7 +292,7 @@ static DISCRETE_RESET(dst_comp_adder)
#define DST_CLAMP__MIN DISCRETE_INPUT(1)
#define DST_CLAMP__MAX DISCRETE_INPUT(2)
-static DISCRETE_STEP(dst_clamp)
+DISCRETE_STEP(dst_clamp)
{
if (DST_CLAMP__IN < DST_CLAMP__MIN) node->output[0] = DST_CLAMP__MIN;
else if (DST_CLAMP__IN > DST_CLAMP__MAX) node->output[0] = DST_CLAMP__MAX;
@@ -314,10 +314,10 @@ static DISCRETE_STEP(dst_clamp)
#define DST_DAC_R1__DATA DISCRETE_INPUT(0)
#define DST_DAC_R1__VON DISCRETE_INPUT(1)
-static DISCRETE_STEP(dst_dac_r1)
+DISCRETE_STEP(dst_dac_r1)
{
- const discrete_dac_r1_ladder *info = (const discrete_dac_r1_ladder *)node->custom;
- struct dst_dac_r1_context *context = (struct dst_dac_r1_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_dac_r1)
+ DISCRETE_DECLARE_INFO(discrete_dac_r1_ladder)
int bit, bit_val, data;
double v, i_bit, i_total, x_time, von;
@@ -362,10 +362,10 @@ static DISCRETE_STEP(dst_dac_r1)
node->output[0] = info->cFilter ? node->output[0] + ((v - node->output[0]) * context->exponent) : v;
}
-static DISCRETE_RESET(dst_dac_r1)
+DISCRETE_RESET(dst_dac_r1)
{
- const discrete_dac_r1_ladder *info = (const discrete_dac_r1_ladder *)node->custom;
- struct dst_dac_r1_context *context = (struct dst_dac_r1_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_dac_r1)
+ DISCRETE_DECLARE_INFO(discrete_dac_r1_ladder)
int bit;
@@ -427,9 +427,9 @@ static DISCRETE_RESET(dst_dac_r1)
#define DST_DIODE_MIX_INP_OFFSET 0
#define DST_DIODE_MIX__INP(addr) DISCRETE_INPUT(DST_DIODE_MIX_INP_OFFSET + addr)
-static DISCRETE_STEP(dst_diode_mix)
+DISCRETE_STEP(dst_diode_mix)
{
- struct dst_diode_mix__context *context = (struct dst_diode_mix__context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_diode_mix)
double val, max = 0;
int addr;
@@ -443,10 +443,10 @@ static DISCRETE_STEP(dst_diode_mix)
node->output[0] = max;
}
-static DISCRETE_RESET(dst_diode_mix)
+DISCRETE_RESET(dst_diode_mix)
{
- const double *info = (const double *)node->custom;
- struct dst_diode_mix__context *context = (struct dst_diode_mix__context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_diode_mix)
+ DISCRETE_DECLARE_INFO(double)
int addr;
@@ -483,7 +483,7 @@ static DISCRETE_RESET(dst_diode_mix)
#define DST_DIVIDE__IN DISCRETE_INPUT(1)
#define DST_DIVIDE__DIV DISCRETE_INPUT(2)
-static DISCRETE_STEP(dst_divide)
+DISCRETE_STEP(dst_divide)
{
if(DST_DIVIDE__ENABLE)
{
@@ -517,7 +517,7 @@ static DISCRETE_STEP(dst_divide)
#define DST_GAIN__GAIN DISCRETE_INPUT(1)
#define DST_GAIN__OFFSET DISCRETE_INPUT(2)
-static DISCRETE_STEP(dst_gain)
+DISCRETE_STEP(dst_gain)
{
node->output[0] = DST_GAIN__IN * DST_GAIN__GAIN + DST_GAIN__OFFSET;
}
@@ -571,10 +571,10 @@ static int dst_trigger_function(int trig0, int trig1, int trig2, int function)
return (result);
}
-static DISCRETE_STEP(dst_integrate)
+DISCRETE_STEP(dst_integrate)
{
- const discrete_integrate_info *info = (const discrete_integrate_info *)node->custom;
- struct dst_integrate_context *context = (struct dst_integrate_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_integrate)
+ DISCRETE_DECLARE_INFO(discrete_integrate_info)
int trig0, trig1;
double i_neg = 0; /* current into - input */
@@ -616,10 +616,11 @@ static DISCRETE_STEP(dst_integrate)
if (node->output[0] > context->v_max_out) node->output[0] = context->v_max_out;
}
-static DISCRETE_RESET(dst_integrate)
+DISCRETE_RESET(dst_integrate)
{
- const discrete_integrate_info *info = (const discrete_integrate_info *)node->custom;
- struct dst_integrate_context *context = (struct dst_integrate_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_integrate)
+ DISCRETE_DECLARE_INFO(discrete_integrate_info)
+
double i, v;
if (info->type & DISC_OP_AMP_IS_NORTON)
@@ -651,7 +652,7 @@ static DISCRETE_RESET(dst_integrate)
************************************************************************/
#define DST_LOGIC_INV__IN DISCRETE_INPUT(0)
-static DISCRETE_STEP(dst_logic_inv)
+DISCRETE_STEP(dst_logic_inv)
{
node->output[0] = DST_LOGIC_INV__IN ? 0.0 : 1.0;
}
@@ -666,9 +667,10 @@ static DISCRETE_STEP(dst_logic_inv)
#define DST_BITS_DECODE__TO DISCRETE_INPUT(2)
#define DST_BITS_DECODE__VOUT DISCRETE_INPUT(3)
-static DISCRETE_STEP(dst_bits_decode)
+DISCRETE_STEP(dst_bits_decode)
{
- struct dst_bits_decode_context *context = (struct dst_bits_decode_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_bits_decode)
+
int new_val = DST_BITS_DECODE__IN;
int last_val = context->last_val;
int last_had_x_time = context->last_had_x_time;
@@ -681,6 +683,7 @@ static DISCRETE_STEP(dst_bits_decode)
int count = context->count;
int decode_x_time = context->decode_x_time;
int has_x_time = x_time > 0 ? 1 : 0;
+ double out = 0;
double v_out = DST_BITS_DECODE__VOUT;
for (i = 0; i < count; i++ )
@@ -695,23 +698,24 @@ static DISCRETE_STEP(dst_bits_decode)
if (decode_x_time)
{
- v_out = new_bit;
+ out = new_bit;
if (bit_changed)
- v_out += x_time;
+ out += x_time;
}
else
{
+ out = v_out;
if (has_x_time && bit_changed)
{
if (new_bit)
- v_out *= x_time;
+ out *= x_time;
else
- v_out *= (1.0 - x_time);
+ out *= (1.0 - x_time);
}
else
- v_out *= new_bit;
+ out *= new_bit;
}
- node->output[i] = v_out;
+ node->output[i] = out;
if (has_x_time && bit_changed)
/* set */
context->last_had_x_time |= 1 << (i + from);
@@ -723,9 +727,9 @@ static DISCRETE_STEP(dst_bits_decode)
}
}
-static DISCRETE_RESET(dst_bits_decode)
+DISCRETE_RESET(dst_bits_decode)
{
- struct dst_bits_decode_context *context = (struct dst_bits_decode_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_bits_decode)
context->from = DST_BITS_DECODE__FROM;
context->count = DST_BITS_DECODE__TO - context->from + 1;
@@ -754,7 +758,7 @@ static DISCRETE_RESET(dst_bits_decode)
#define DST_LOGIC_AND__IN2 DISCRETE_INPUT(2)
#define DST_LOGIC_AND__IN3 DISCRETE_INPUT(3)
-static DISCRETE_STEP(dst_logic_and)
+DISCRETE_STEP(dst_logic_and)
{
node->output[0] = (DST_LOGIC_AND__IN0 && DST_LOGIC_AND__IN1 && DST_LOGIC_AND__IN2 && DST_LOGIC_AND__IN3)? 1.0 : 0.0;
}
@@ -774,7 +778,7 @@ static DISCRETE_STEP(dst_logic_and)
#define DST_LOGIC_NAND__IN2 DISCRETE_INPUT(2)
#define DST_LOGIC_NAND__IN3 DISCRETE_INPUT(3)
-static DISCRETE_STEP(dst_logic_nand)
+DISCRETE_STEP(dst_logic_nand)
{
node->output[0]= (DST_LOGIC_NAND__IN0 && DST_LOGIC_NAND__IN1 && DST_LOGIC_NAND__IN2 && DST_LOGIC_NAND__IN3)? 0.0 : 1.0;
}
@@ -794,7 +798,7 @@ static DISCRETE_STEP(dst_logic_nand)
#define DST_LOGIC_OR__IN2 DISCRETE_INPUT(2)
#define DST_LOGIC_OR__IN3 DISCRETE_INPUT(3)
-static DISCRETE_STEP(dst_logic_or)
+DISCRETE_STEP(dst_logic_or)
{
node->output[0] = (DST_LOGIC_OR__IN0 || DST_LOGIC_OR__IN1 || DST_LOGIC_OR__IN2 || DST_LOGIC_OR__IN3) ? 1.0 : 0.0;
}
@@ -814,7 +818,7 @@ static DISCRETE_STEP(dst_logic_or)
#define DST_LOGIC_NOR__IN2 DISCRETE_INPUT(2)
#define DST_LOGIC_NOR__IN3 DISCRETE_INPUT(3)
-static DISCRETE_STEP(dst_logic_nor)
+DISCRETE_STEP(dst_logic_nor)
{
node->output[0] = (DST_LOGIC_NOR__IN0 || DST_LOGIC_NOR__IN1 || DST_LOGIC_NOR__IN2 || DST_LOGIC_NOR__IN3) ? 0.0 : 1.0;
}
@@ -830,7 +834,7 @@ static DISCRETE_STEP(dst_logic_nor)
#define DST_LOGIC_XOR__IN0 DISCRETE_INPUT(0)
#define DST_LOGIC_XOR__IN1 DISCRETE_INPUT(1)
-static DISCRETE_STEP(dst_logic_xor)
+DISCRETE_STEP(dst_logic_xor)
{
node->output[0] = ((DST_LOGIC_XOR__IN0 && !DST_LOGIC_XOR__IN1) || (!DST_LOGIC_XOR__IN0 && DST_LOGIC_XOR__IN1)) ? 1.0 : 0.0;
}
@@ -846,7 +850,7 @@ static DISCRETE_STEP(dst_logic_xor)
#define DST_LOGIC_XNOR__IN0 DISCRETE_INPUT(0)
#define DST_LOGIC_XNOR__IN1 DISCRETE_INPUT(1)
-static DISCRETE_STEP(dst_logic_nxor)
+DISCRETE_STEP(dst_logic_nxor)
{
node->output[0] = ((DST_LOGIC_XNOR__IN0 && !DST_LOGIC_XNOR__IN1) || (!DST_LOGIC_XNOR__IN0 && DST_LOGIC_XNOR__IN1)) ? 0.0 : 1.0;
}
@@ -867,9 +871,9 @@ static DISCRETE_STEP(dst_logic_nxor)
#define DST_LOGIC_DFF__CLOCK DISCRETE_INPUT(2)
#define DST_LOGIC_DFF__DATA DISCRETE_INPUT(3)
-static DISCRETE_STEP(dst_logic_dff)
+DISCRETE_STEP(dst_logic_dff)
{
- struct dst_flipflop_context *context = (struct dst_flipflop_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_flipflop)
int clk = (int)DST_LOGIC_DFF__CLOCK;
@@ -882,9 +886,10 @@ static DISCRETE_STEP(dst_logic_dff)
context->last_clk = clk;
}
-static DISCRETE_RESET(dst_logic_ff)
+DISCRETE_RESET(dst_logic_ff)
{
- struct dst_flipflop_context *context = (struct dst_flipflop_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_flipflop)
+
context->last_clk = 0;
node->output[0] = 0;
@@ -908,9 +913,9 @@ static DISCRETE_RESET(dst_logic_ff)
#define DST_LOGIC_JKFF__J DISCRETE_INPUT(3)
#define DST_LOGIC_JKFF__K DISCRETE_INPUT(4)
-static DISCRETE_STEP(dst_logic_jkff)
+DISCRETE_STEP(dst_logic_jkff)
{
- struct dst_flipflop_context *context = (struct dst_flipflop_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_flipflop)
int clk = (int)DST_LOGIC_JKFF__CLOCK;
int j = (int)DST_LOGIC_JKFF__J;
@@ -954,9 +959,9 @@ static DISCRETE_STEP(dst_logic_jkff)
#define DST_LOGIC_SHIFT__SIZE DISCRETE_INPUT(3)
#define DST_LOGIC_SHIFT__OPTIONS DISCRETE_INPUT(4)
-static DISCRETE_STEP(dst_logic_shift)
+DISCRETE_STEP(dst_logic_shift)
{
- struct dst_shift_context *context = (struct dst_shift_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_shift)
double cycles;
double ds_clock;
@@ -1030,9 +1035,9 @@ static DISCRETE_STEP(dst_logic_shift)
node->output[0] = context->shift_data;
}
-static DISCRETE_RESET(dst_logic_shift)
+DISCRETE_RESET(dst_logic_shift)
{
- struct dst_shift_context *context = (struct dst_shift_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_shift)
context->bit_mask = (1 << (int)DST_LOGIC_SHIFT__SIZE) - 1;
context->clock_type = (int)DST_LOGIC_SHIFT__OPTIONS & DISC_CLK_MASK;
@@ -1059,16 +1064,16 @@ static DISCRETE_RESET(dst_logic_shift)
#define DST_LOOKUP_TABLE__IN DISCRETE_INPUT(0)
#define DST_LOOKUP_TABLE__SIZE DISCRETE_INPUT(1)
-static DISCRETE_STEP(dst_lookup_table)
+DISCRETE_STEP(dst_lookup_table)
{
- const double *table = (const double *)node->custom;
+ DISCRETE_DECLARE_INFO(double)
int addr = DST_LOOKUP_TABLE__IN;
if (addr < 0 || addr >= DST_LOOKUP_TABLE__SIZE)
node->output[0] = 0;
else
- node->output[0] = table[addr];
+ node->output[0] = info[addr];
}
@@ -1125,10 +1130,10 @@ static DISCRETE_STEP(dst_lookup_table)
#define DST_MIXER__ENABLE DISCRETE_INPUT(0)
#define DST_MIXER__IN(bit) DISCRETE_INPUT(bit + 1)
-static DISCRETE_STEP(dst_mixer)
+DISCRETE_STEP(dst_mixer)
{
- const discrete_mixer_desc *info = (const discrete_mixer_desc *)node->custom;
- struct dst_mixer_context *context = (struct dst_mixer_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_mixer)
+ DISCRETE_DECLARE_INFO(discrete_mixer_desc)
double v, vTemp, r_total, rTemp, rTemp2 = 0;
double i = 0; /* total current of inputs */
@@ -1283,10 +1288,11 @@ static DISCRETE_STEP(dst_mixer)
}
-static DISCRETE_RESET(dst_mixer)
+DISCRETE_RESET(dst_mixer)
{
- const discrete_mixer_desc *info = (const discrete_mixer_desc *)node->custom;
- struct dst_mixer_context *context = (struct dst_mixer_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_mixer)
+ DISCRETE_DECLARE_INFO(discrete_mixer_desc)
+
node_description *r_node;
int bit;
@@ -1405,9 +1411,9 @@ static DISCRETE_RESET(dst_mixer)
#define DST_MULTIPLEX__ADDR DISCRETE_INPUT(0)
#define DST_MULTIPLEX__INP(addr) DISCRETE_INPUT(1 + addr)
-static DISCRETE_STEP(dst_multiplex)
+DISCRETE_STEP(dst_multiplex)
{
- struct dst_size_context *context = (struct dst_size_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_size)
int addr;
@@ -1423,9 +1429,9 @@ static DISCRETE_STEP(dst_multiplex)
}
}
-static DISCRETE_RESET(dst_multiplex)
+DISCRETE_RESET(dst_multiplex)
{
- struct dst_size_context *context = (struct dst_size_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_size)
context->size = node->active_inputs - 1;
@@ -1451,9 +1457,9 @@ static DISCRETE_RESET(dst_multiplex)
#define DST_ONESHOT__WIDTH DISCRETE_INPUT(3)
#define DST_ONESHOT__TYPE (int)DISCRETE_INPUT(4)
-static DISCRETE_STEP(dst_oneshot)
+DISCRETE_STEP(dst_oneshot)
{
- struct dst_oneshot_context *context = (struct dst_oneshot_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_oneshot)
int trigger = (DST_ONESHOT__TRIG != 0);
@@ -1511,9 +1517,9 @@ static DISCRETE_STEP(dst_oneshot)
}
-static DISCRETE_RESET(dst_oneshot)
+DISCRETE_RESET(dst_oneshot)
{
- struct dst_oneshot_context *context = (struct dst_oneshot_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_oneshot)
context->countdown = 0;
context->state = 0;
@@ -1544,9 +1550,9 @@ static DISCRETE_RESET(dst_oneshot)
#define DST_RAMP__END DISCRETE_INPUT(4)
#define DST_RAMP__CLAMP DISCRETE_INPUT(5)
-static DISCRETE_STEP(dst_ramp)
+DISCRETE_STEP(dst_ramp)
{
- struct dss_ramp_context *context = (struct dss_ramp_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_ramp)
if(DST_RAMP__ENABLE)
{
@@ -1571,9 +1577,9 @@ static DISCRETE_STEP(dst_ramp)
}
}
-static DISCRETE_RESET(dst_ramp)
+DISCRETE_RESET(dst_ramp)
{
- struct dss_ramp_context *context = (struct dss_ramp_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_ramp)
node->output[0] = DST_RAMP__CLAMP;
context->step = DST_RAMP__GRAD / node->info->sample_rate;
@@ -1595,9 +1601,9 @@ static DISCRETE_RESET(dst_ramp)
#define DST_SAMPHOLD__CLOCK DISCRETE_INPUT(1)
#define DST_SAMPHOLD__TYPE DISCRETE_INPUT(2)
-static DISCRETE_STEP(dst_samphold)
+DISCRETE_STEP(dst_samphold)
{
- struct dst_samphold_context *context = (struct dst_samphold_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_samphold)
switch(context->clocktype)
{
@@ -1625,9 +1631,9 @@ static DISCRETE_STEP(dst_samphold)
context->last_input = DST_SAMPHOLD__CLOCK;
}
-static DISCRETE_RESET(dst_samphold)
+DISCRETE_RESET(dst_samphold)
{
- struct dst_samphold_context *context = (struct dst_samphold_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_samphold)
node->output[0] = 0;
context->last_input = -1;
@@ -1652,7 +1658,7 @@ static DISCRETE_RESET(dst_samphold)
#define DST_SWITCH__IN0 DISCRETE_INPUT(2)
#define DST_SWITCH__IN1 DISCRETE_INPUT(3)
-static DISCRETE_STEP(dst_switch)
+DISCRETE_STEP(dst_switch)
{
if(DST_SWITCH__ENABLE)
{
@@ -1678,7 +1684,7 @@ static DISCRETE_STEP(dst_switch)
#define DST_ASWITCH__THRESHOLD DISCRETE_INPUT(2)
-static DISCRETE_STEP(dst_aswitch)
+DISCRETE_STEP(dst_aswitch)
{
node->output[0] = DST_ASWITCH__CTRL > DST_ASWITCH__THRESHOLD ? DST_ASWITCH__IN : 0;
}
@@ -1717,7 +1723,7 @@ INLINE void dst_transform_push(double *stack, int *pointer, double value)
stack[(*pointer)++] = value;
}
-static DISCRETE_STEP(dst_transform)
+DISCRETE_STEP(dst_transform)
{
double trans_stack[MAX_TRANS_STACK];
double number1,top;
@@ -1830,10 +1836,10 @@ static DISCRETE_STEP(dst_transform)
#define DST_OP_AMP__INP0 DISCRETE_INPUT(1)
#define DST_OP_AMP__INP1 DISCRETE_INPUT(2)
-static DISCRETE_STEP(dst_op_amp)
+DISCRETE_STEP(dst_op_amp)
{
- const discrete_op_amp_info *info = (const discrete_op_amp_info *)node->custom;
- struct dst_op_amp_context *context = (struct dst_op_amp_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_op_amp)
+ DISCRETE_DECLARE_INFO(discrete_op_amp_info)
double i_pos = 0;
double i_neg = 0;
@@ -1897,10 +1903,10 @@ static DISCRETE_STEP(dst_op_amp)
node->output[0] = 0;
}
-static DISCRETE_RESET(dst_op_amp)
+DISCRETE_RESET(dst_op_amp)
{
- const discrete_op_amp_info *info = (const discrete_op_amp_info *)node->custom;
- struct dst_op_amp_context *context = (struct dst_op_amp_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_op_amp)
+ DISCRETE_DECLARE_INFO(discrete_op_amp_info)
context->has_r1 = info->r1 > 0;
context->has_r4 = info->r4 > 0;
@@ -1941,10 +1947,10 @@ static DISCRETE_RESET(dst_op_amp)
************************************************************************/
#define DST_OP_AMP_1SHT__TRIGGER DISCRETE_INPUT(0)
-static DISCRETE_STEP(dst_op_amp_1sht)
+DISCRETE_STEP(dst_op_amp_1sht)
{
- const discrete_op_amp_1sht_info *info = (const discrete_op_amp_1sht_info *)node->custom;
- struct dst_op_amp_1sht_context *context = (struct dst_op_amp_1sht_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_op_amp_1sht)
+ DISCRETE_DECLARE_INFO(discrete_op_amp_1sht_info)
double i_pos;
double i_neg;
@@ -1981,10 +1987,10 @@ static DISCRETE_STEP(dst_op_amp_1sht)
context->v_cap1 += ((node->output[0] - OP_AMP_NORTON_VBE) * context->r34ratio + OP_AMP_NORTON_VBE - context->v_cap1) * context->exponent1c;
}
-static DISCRETE_RESET(dst_op_amp_1sht)
+DISCRETE_RESET(dst_op_amp_1sht)
{
- const discrete_op_amp_1sht_info *info = (const discrete_op_amp_1sht_info *)node->custom;
- struct dst_op_amp_1sht_context *context = (struct dst_op_amp_1sht_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_op_amp_1sht)
+ DISCRETE_DECLARE_INFO(discrete_op_amp_1sht_info)
context->exponent1c = RC_CHARGE_EXP(RES_2_PARALLEL(info->r3, info->r4) * info->c1);
context->exponent1d = RC_CHARGE_EXP(info->r4 * info->c1);
@@ -2016,10 +2022,10 @@ static DISCRETE_RESET(dst_op_amp_1sht)
#define DST_TVCA_OP_AMP__INP0 DISCRETE_INPUT(3)
#define DST_TVCA_OP_AMP__INP1 DISCRETE_INPUT(4)
-static DISCRETE_STEP(dst_tvca_op_amp)
+DISCRETE_STEP(dst_tvca_op_amp)
{
- const discrete_op_amp_tvca_info *info = (const discrete_op_amp_tvca_info *)node->custom;
- struct dst_tvca_op_amp_context *context = (struct dst_tvca_op_amp_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_tvca_op_amp)
+ DISCRETE_DECLARE_INFO(discrete_op_amp_tvca_info)
int trig0, trig1, trig2, f3;
double i2 = 0; /* current through r2 */
@@ -2116,10 +2122,10 @@ static DISCRETE_STEP(dst_tvca_op_amp)
if (node->output[0] > context->v_out_max) node->output[0] = context->v_out_max;
}
-static DISCRETE_RESET(dst_tvca_op_amp)
+DISCRETE_RESET(dst_tvca_op_amp)
{
- const discrete_op_amp_tvca_info *info = (const discrete_op_amp_tvca_info *)node->custom;
- struct dst_tvca_op_amp_context *context = (struct dst_tvca_op_amp_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dst_tvca_op_amp)
+ DISCRETE_DECLARE_INFO(discrete_op_amp_tvca_info)
context->r67 = info->r6 + info->r7;
@@ -2195,7 +2201,7 @@ enum
#define DST_XTIME_BUFFER_OUT_HIGH DISCRETE_INPUT(2)
#define DST_XTIME_BUFFER_INVERT DISCRETE_INPUT(3)
-static DISCRETE_STEP(dst_xtime_buffer)
+DISCRETE_STEP(dst_xtime_buffer)
{
int in0 = (int)DST_XTIME_BUFFER__IN;
int out = in0;
@@ -2242,7 +2248,7 @@ static DISCRETE_STEP(dst_xtime_buffer)
#define DST_XTIME_AND_OUT_HIGH DISCRETE_INPUT(3)
#define DST_XTIME_AND_INVERT DISCRETE_INPUT(4)
-static DISCRETE_STEP(dst_xtime_and)
+DISCRETE_STEP(dst_xtime_and)
{
int in0 = (int)DST_XTIME_AND__IN0;
int in1 = (int)DST_XTIME_AND__IN1;
@@ -2462,7 +2468,7 @@ static DISCRETE_STEP(dst_xtime_and)
#define DST_XTIME_OR_OUT_HIGH DISCRETE_INPUT(3)
#define DST_XTIME_OR_INVERT DISCRETE_INPUT(4)
-static DISCRETE_STEP(dst_xtime_or)
+DISCRETE_STEP(dst_xtime_or)
{
int in0 = (int)DST_XTIME_OR__IN0;
int in1 = (int)DST_XTIME_OR__IN1;
@@ -2687,7 +2693,7 @@ static DISCRETE_STEP(dst_xtime_or)
#define DST_XTIME_XOR_OUT_HIGH DISCRETE_INPUT(3)
#define DST_XTIME_XOR_INVERT DISCRETE_INPUT(4)
-static DISCRETE_STEP(dst_xtime_xor)
+DISCRETE_STEP(dst_xtime_xor)
{
int in0 = (int)DST_XTIME_XOR__IN0;
int in1 = (int)DST_XTIME_XOR__IN1;
diff --git a/src/emu/sound/disc_sys.c b/src/emu/sound/disc_sys.c
index 5d834131279..fab1147454c 100644
--- a/src/emu/sound/disc_sys.c
+++ b/src/emu/sound/disc_sys.c
@@ -23,7 +23,7 @@ struct dso_csvlog_context
char name[32];
};
-struct dso_wavelog_context
+struct dso_wavlog_context
{
wav_file *wavfile;
char name[32];
@@ -103,9 +103,12 @@ static void task_check(discrete_task *task, discrete_task *dest_task)
}
}
-static DISCRETE_START( dso_task_start )
+#define DISCRETE_DECLARE_TASK discrete_task *task = (discrete_task *) node->context;
+
+DISCRETE_START( dso_task_start )
{
- discrete_task *task = (discrete_task *) node->context;
+ DISCRETE_DECLARE_TASK
+
const linked_list_entry *task_entry;
task->task_group = (int) DISCRETE_INPUT(0);
@@ -123,18 +126,20 @@ static DISCRETE_START( dso_task_start )
}
-static DISCRETE_STEP( dso_task_end )
+DISCRETE_STEP( dso_task_end )
{
- discrete_task *task = (discrete_task *) node->context;
+ DISCRETE_DECLARE_TASK
+
int i;
for (i = 0; i < task->numbuffered; i++)
*(task->ptr[i]++) = *task->source[i];
}
-static DISCRETE_STEP( dso_task_start )
+DISCRETE_STEP( dso_task_start )
{
- const discrete_task *task = (discrete_task *) node->context;
+ DISCRETE_DECLARE_TASK
+
const linked_list_entry *entry;
/* update source node buffer */
@@ -146,12 +151,12 @@ static DISCRETE_STEP( dso_task_start )
}
-static DISCRETE_RESET( dso_task )
+DISCRETE_RESET( dso_task )
{
/* nothing to do - just avoid being stepped */
}
-static DISCRETE_STEP( dso_output )
+DISCRETE_STEP( dso_output )
{
stream_sample_t **output = (stream_sample_t **) &node->context;
double val;
@@ -163,14 +168,15 @@ static DISCRETE_STEP( dso_output )
(*output)++;
}
-static DISCRETE_RESET( dso_output )
+DISCRETE_RESET( dso_output )
{
/* nothing to do - just avoid being stepped */
}
-static DISCRETE_START( dso_csvlog )
+DISCRETE_START( dso_csvlog )
{
- struct dso_csvlog_context *context = (struct dso_csvlog_context *) node->context;
+ DISCRETE_DECLARE_CONTEXT(dso_csvlog)
+
int log_num, node_num;
log_num = node_module_index(node);
@@ -191,18 +197,19 @@ static DISCRETE_START( dso_csvlog )
fprintf(context->csv_file, "\n");
}
-static DISCRETE_STOP( dso_csvlog )
+DISCRETE_STOP( dso_csvlog )
{
- struct dso_csvlog_context *context = (struct dso_csvlog_context *) node->context;
+ DISCRETE_DECLARE_CONTEXT(dso_csvlog)
/* close any csv files */
if (context->csv_file)
fclose(context->csv_file);
}
-static DISCRETE_STEP( dso_csvlog )
+DISCRETE_STEP( dso_csvlog )
{
- struct dso_csvlog_context *context = (struct dso_csvlog_context *) node->context;
+ DISCRETE_DECLARE_CONTEXT(dso_csvlog)
+
int nodenum;
/* Dump any csv logs */
@@ -214,9 +221,10 @@ static DISCRETE_STEP( dso_csvlog )
fprintf(context->csv_file, "\n");
}
-static DISCRETE_START( dso_wavelog )
+DISCRETE_START( dso_wavlog )
{
- struct dso_wavelog_context *context = (struct dso_wavelog_context *) node->context;
+ DISCRETE_DECLARE_CONTEXT(dso_wavlog)
+
int log_num;
log_num = node_module_index(node);
@@ -224,18 +232,19 @@ static DISCRETE_START( dso_wavelog )
context->wavfile = wav_open(context->name, node->info->sample_rate, node->active_inputs/2);
}
-static DISCRETE_STOP( dso_wavelog )
+DISCRETE_STOP( dso_wavlog )
{
- struct dso_wavelog_context *context = (struct dso_wavelog_context *) node->context;
+ DISCRETE_DECLARE_CONTEXT(dso_wavlog)
/* close any wave files */
if (context->wavfile)
wav_close(context->wavfile);
}
-static DISCRETE_STEP( dso_wavelog )
+DISCRETE_STEP( dso_wavlog )
{
- struct dso_wavelog_context *context = (struct dso_wavelog_context *) node->context;
+ DISCRETE_DECLARE_CONTEXT(dso_wavlog)
+
double val;
INT16 wave_data_l, wave_data_r;
@@ -246,12 +255,12 @@ static DISCRETE_STEP( dso_wavelog )
wave_data_l = (INT16)val;
if (node->active_inputs == 2)
{
- /* DISCRETE_WAVELOG1 */
+ /* DISCRETE_WAVLOG1 */
wav_add_data_16(context->wavfile, &wave_data_l, 1);
}
else
{
- /* DISCRETE_WAVELOG2 */
+ /* DISCRETE_WAVLOG2 */
val = DISCRETE_INPUT(2) * DISCRETE_INPUT(3);
val = (val < -32768) ? -32768 : (val > 32767) ? 32767 : val;
wave_data_r = (INT16)val;
diff --git a/src/emu/sound/disc_wav.c b/src/emu/sound/disc_wav.c
index 9c54c0c5357..79fdc54c499 100644
--- a/src/emu/sound/disc_wav.c
+++ b/src/emu/sound/disc_wav.c
@@ -190,9 +190,10 @@ struct dss_trianglewave_context
static const int disc_7492_count[6] = {0x00, 0x01, 0x02, 0x04, 0x05, 0x06};
-static DISCRETE_STEP(dss_counter)
+DISCRETE_STEP(dss_counter)
{
- struct dss_counter_context *context = (struct dss_counter_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_counter)
+
double cycles;
double ds_clock;
int clock = 0, last_count, inc = 0;
@@ -295,9 +296,9 @@ static DISCRETE_STEP(dss_counter)
}
}
-static DISCRETE_RESET(dss_counter)
+DISCRETE_RESET(dss_counter)
{
- struct dss_counter_context *context = (struct dss_counter_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_counter)
if (DSS_COUNTER__MAX < DSS_COUNTER__MIN)
fatalerror("MAX < MIN in NODE_%02d", NODE_INDEX(node->block->node));
@@ -411,17 +412,18 @@ INLINE int dss_lfsr_function(const discrete_info *disc_info, int myfunc, int in0
}
/* reset prototype so that it can be used in init function */
-static DISCRETE_RESET(dss_lfsr);
+DISCRETE_RESET(dss_lfsr);
-static DISCRETE_STEP(dss_lfsr)
+DISCRETE_STEP(dss_lfsr)
{
- const discrete_lfsr_desc *lfsr_desc = (const discrete_lfsr_desc *)node->custom;
- struct dss_lfsr_context *context = (struct dss_lfsr_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_lfsr)
+ DISCRETE_DECLARE_INFO(discrete_lfsr_desc)
+
double cycles;
int clock, inc = 0;
int fb0, fb1, fbresult = 0, noise_feed;
- if (lfsr_desc->clock_type == DISC_CLK_IS_FREQ)
+ if (info->clock_type == DISC_CLK_IS_FREQ)
{
/* We need to keep clocking the internal clock even if disabled. */
cycles = (context->t_left + node->info->sample_time) / context->t_clock;
@@ -436,7 +438,7 @@ static DISCRETE_STEP(dss_lfsr)
return;
}
- switch (lfsr_desc->clock_type)
+ switch (info->clock_type)
{
case DISC_CLK_ON_F_EDGE:
case DISC_CLK_ON_R_EDGE:
@@ -445,7 +447,7 @@ static DISCRETE_STEP(dss_lfsr)
if (context->last != clock)
{
context->last = clock;
- if (lfsr_desc->clock_type == clock)
+ if (info->clock_type == clock)
{
/* Toggled */
inc = 1;
@@ -465,32 +467,32 @@ static DISCRETE_STEP(dss_lfsr)
for (clock = 0; clock < inc; clock++)
{
/* Fetch the last feedback result */
- fbresult = (context->lfsr_reg >> lfsr_desc->bitlength) & 0x01;
+ fbresult = (context->lfsr_reg >> info->bitlength) & 0x01;
/* Stage 2 feedback combine fbresultNew with infeed bit */
- fbresult = dss_lfsr_function(node->info, lfsr_desc->feedback_function1, fbresult, noise_feed, 0x01);
+ fbresult = dss_lfsr_function(node->info, info->feedback_function1, fbresult, noise_feed, 0x01);
/* Stage 3 first we setup where the bit is going to be shifted into */
- fbresult = fbresult * lfsr_desc->feedback_function2_mask;
+ fbresult = fbresult * info->feedback_function2_mask;
/* Then we left shift the register, */
context->lfsr_reg = context->lfsr_reg << 1;
/* Now move the fbresult into the shift register and mask it to the bitlength */
- context->lfsr_reg = dss_lfsr_function(node->info, lfsr_desc->feedback_function2, fbresult, context->lfsr_reg, (1 << lfsr_desc->bitlength) - 1 );
+ context->lfsr_reg = dss_lfsr_function(node->info, info->feedback_function2, fbresult, context->lfsr_reg, (1 << info->bitlength) - 1 );
/* Now get and store the new feedback result */
/* Fetch the feedback bits */
- fb0 = (context->lfsr_reg >> lfsr_desc->feedback_bitsel0) & 0x01;
- fb1 = (context->lfsr_reg >> lfsr_desc->feedback_bitsel1) & 0x01;
+ fb0 = (context->lfsr_reg >> info->feedback_bitsel0) & 0x01;
+ fb1 = (context->lfsr_reg >> info->feedback_bitsel1) & 0x01;
/* Now do the combo on them */
- fbresult = dss_lfsr_function(node->info, lfsr_desc->feedback_function0, fb0, fb1, 0x01);
- context->lfsr_reg = dss_lfsr_function(node->info, DISC_LFSR_REPLACE, context->lfsr_reg, fbresult << lfsr_desc->bitlength, (2 << lfsr_desc->bitlength) - 1);
+ fbresult = dss_lfsr_function(node->info, info->feedback_function0, fb0, fb1, 0x01);
+ context->lfsr_reg = dss_lfsr_function(node->info, DISC_LFSR_REPLACE, context->lfsr_reg, fbresult << info->bitlength, (2 << info->bitlength) - 1);
}
/* Now select the output bit */
if (context->out_is_f0)
node->output[0] = fbresult & 0x01;
else
- node->output[0] = (context->lfsr_reg >> lfsr_desc->output_bit) & 0x01;
+ node->output[0] = (context->lfsr_reg >> info->output_bit) & 0x01;
/* Final inversion if required */
if (context->invert_output) node->output[0] = node->output[0] ? 0 : 1;
@@ -511,39 +513,40 @@ static DISCRETE_STEP(dss_lfsr)
}
}
-static DISCRETE_RESET(dss_lfsr)
+DISCRETE_RESET(dss_lfsr)
{
- const discrete_lfsr_desc *lfsr_desc = (const discrete_lfsr_desc *)node->custom;
- struct dss_lfsr_context *context = (struct dss_lfsr_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_lfsr)
+ DISCRETE_DECLARE_INFO(discrete_lfsr_desc)
+
int fb0 , fb1, fbresult;
- context->reset_on_high = (lfsr_desc->flags & DISC_LFSR_FLAG_RESET_TYPE_H) ? 1 : 0;
- context->invert_output = lfsr_desc->flags & DISC_LFSR_FLAG_OUT_INVERT;
- context->out_is_f0 = (lfsr_desc->flags & DISC_LFSR_FLAG_OUTPUT_F0) ? 1 : 0;
- context->out_lfsr_reg = (lfsr_desc->flags & DISC_LFSR_FLAG_OUTPUT_SR_SN1) ? 1 : 0;
+ context->reset_on_high = (info->flags & DISC_LFSR_FLAG_RESET_TYPE_H) ? 1 : 0;
+ context->invert_output = info->flags & DISC_LFSR_FLAG_OUT_INVERT;
+ context->out_is_f0 = (info->flags & DISC_LFSR_FLAG_OUTPUT_F0) ? 1 : 0;
+ context->out_lfsr_reg = (info->flags & DISC_LFSR_FLAG_OUTPUT_SR_SN1) ? 1 : 0;
- if ((lfsr_desc->clock_type < DISC_CLK_ON_F_EDGE) || (lfsr_desc->clock_type > DISC_CLK_IS_FREQ))
+ if ((info->clock_type < DISC_CLK_ON_F_EDGE) || (info->clock_type > DISC_CLK_IS_FREQ))
discrete_log(node->info, "Invalid clock type passed in NODE_%d\n", NODE_BLOCKINDEX(node));
context->last = (DSS_COUNTER__CLOCK != 0);
- if (lfsr_desc->clock_type == DISC_CLK_IS_FREQ) context->t_clock = 1.0 / DSS_LFSR_NOISE__CLOCK;
+ if (info->clock_type == DISC_CLK_IS_FREQ) context->t_clock = 1.0 / DSS_LFSR_NOISE__CLOCK;
context->t_left = 0;
- context->lfsr_reg = lfsr_desc->reset_value;
+ context->lfsr_reg = info->reset_value;
/* Now get and store the new feedback result */
/* Fetch the feedback bits */
- fb0 = (context->lfsr_reg >> lfsr_desc->feedback_bitsel0) & 0x01;
- fb1=(context->lfsr_reg >> lfsr_desc->feedback_bitsel1) & 0x01;
+ fb0 = (context->lfsr_reg >> info->feedback_bitsel0) & 0x01;
+ fb1=(context->lfsr_reg >> info->feedback_bitsel1) & 0x01;
/* Now do the combo on them */
- fbresult = dss_lfsr_function(node->info, lfsr_desc->feedback_function0, fb0, fb1, 0x01);
- context->lfsr_reg=dss_lfsr_function(node->info, DISC_LFSR_REPLACE, context->lfsr_reg, fbresult << lfsr_desc->bitlength, (2<< lfsr_desc->bitlength ) - 1);
+ fbresult = dss_lfsr_function(node->info, info->feedback_function0, fb0, fb1, 0x01);
+ context->lfsr_reg=dss_lfsr_function(node->info, DISC_LFSR_REPLACE, context->lfsr_reg, fbresult << info->bitlength, (2<< info->bitlength ) - 1);
/* Now select and setup the output bit */
- node->output[0] = (context->lfsr_reg >> lfsr_desc->output_bit) & 0x01;
+ node->output[0] = (context->lfsr_reg >> info->output_bit) & 0x01;
/* Final inversion if required */
- if(lfsr_desc->flags & DISC_LFSR_FLAG_OUT_INVERT) node->output[0] = node->output[0] ? 0 : 1;
+ if(info->flags & DISC_LFSR_FLAG_OUT_INVERT) node->output[0] = node->output[0] ? 0 : 1;
/* Gain stage */
node->output[0] = node->output[0] ? DSS_LFSR_NOISE__AMP / 2 : -DSS_LFSR_NOISE__AMP / 2;
@@ -567,9 +570,9 @@ static DISCRETE_RESET(dss_lfsr)
#define DSS_NOISE__AMP DISCRETE_INPUT(2)
#define DSS_NOISE__BIAS DISCRETE_INPUT(3)
-static DISCRETE_STEP(dss_noise)
+DISCRETE_STEP(dss_noise)
{
- struct dss_noise_context *context = (struct dss_noise_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_noise)
if(DSS_NOISE__ENABLE)
{
@@ -604,9 +607,9 @@ static DISCRETE_STEP(dss_noise)
}
-static DISCRETE_RESET(dss_noise)
+DISCRETE_RESET(dss_noise)
{
- struct dss_noise_context *context = (struct dss_noise_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_noise)
context->phase=0;
DISCRETE_STEP_CALL( dss_noise );
@@ -633,9 +636,9 @@ static DISCRETE_RESET(dss_noise)
#define DSS_NOTE__MAX2 DISCRETE_INPUT(4)
#define DSS_NOTE__CLOCK_TYPE DISCRETE_INPUT(5)
-static DISCRETE_STEP(dss_note)
+DISCRETE_STEP(dss_note)
{
- struct dss_note_context *context = (struct dss_note_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_note)
double cycles;
int clock = 0, last_count2, inc = 0;
@@ -723,9 +726,9 @@ static DISCRETE_STEP(dss_note)
node->output[0] = 0;
}
-static DISCRETE_RESET(dss_note)
+DISCRETE_RESET(dss_note)
{
- struct dss_note_context *context = (struct dss_note_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_note)
context->clock_type = (int)DSS_NOTE__CLOCK_TYPE & DISC_CLK_MASK;
context->out_type = (int)DSS_NOTE__CLOCK_TYPE & DISC_OUT_MASK;
@@ -762,11 +765,10 @@ static DISCRETE_RESET(dss_note)
/* the same to save a calculation step */
#define DSS_OP_AMP_OSC_NORTON_VP_IN context->v_out_high
-static DISCRETE_STEP(dss_op_amp_osc)
+DISCRETE_STEP(dss_op_amp_osc)
{
- const discrete_op_amp_osc_info *info = (const discrete_op_amp_osc_info *)node->custom;
- struct dss_op_amp_osc_context *context = (struct dss_op_amp_osc_context *)node->context;
-
+ DISCRETE_DECLARE_CONTEXT(dss_op_amp_osc)
+ DISCRETE_DECLARE_INFO(discrete_op_amp_osc_info)
double i = 0; /* Charging current created by vIn */
double v = 0; /* all input voltages mixed */
@@ -1025,10 +1027,11 @@ static DISCRETE_STEP(dss_op_amp_osc)
#define DIODE_DROP 0.7
-static DISCRETE_RESET(dss_op_amp_osc)
+DISCRETE_RESET(dss_op_amp_osc)
{
- const discrete_op_amp_osc_info *info = (const discrete_op_amp_osc_info *)node->custom;
- struct dss_op_amp_osc_context *context = (struct dss_op_amp_osc_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_op_amp_osc)
+ DISCRETE_DECLARE_INFO(discrete_op_amp_osc_info)
+
const double *r_info_ptr;
const double **r_context_ptr;
int loop;
@@ -1230,9 +1233,9 @@ static DISCRETE_RESET(dss_op_amp_osc)
#define DSS_SAWTOOTHWAVE__GRAD DISCRETE_INPUT(4)
#define DSS_SAWTOOTHWAVE__PHASE DISCRETE_INPUT(5)
-static DISCRETE_STEP(dss_sawtoothwave)
+DISCRETE_STEP(dss_sawtoothwave)
{
- struct dss_sawtoothwave_context *context = (struct dss_sawtoothwave_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_sawtoothwave)
if(DSS_SAWTOOTHWAVE__ENABLE)
{
@@ -1256,9 +1259,10 @@ static DISCRETE_STEP(dss_sawtoothwave)
context->phase = fmod((context->phase + ((2.0 * M_PI * DSS_SAWTOOTHWAVE__FREQ) / node->info->sample_rate)), 2.0 * M_PI);
}
-static DISCRETE_RESET(dss_sawtoothwave)
+DISCRETE_RESET(dss_sawtoothwave)
{
- struct dss_sawtoothwave_context *context = (struct dss_sawtoothwave_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_sawtoothwave)
+
double start;
/* Establish starting phase, convert from degrees to radians */
@@ -1290,10 +1294,10 @@ static DISCRETE_RESET(dss_sawtoothwave)
#define DSS_SCHMITT_OSC__VIN DISCRETE_INPUT(1)
#define DSS_SCHMITT_OSC__AMP DISCRETE_INPUT(2)
-static DISCRETE_STEP(dss_schmitt_osc)
+DISCRETE_STEP(dss_schmitt_osc)
{
- const discrete_schmitt_osc_desc *info = (const discrete_schmitt_osc_desc *)node->custom;
- struct dss_schmitt_osc_context *context = (struct dss_schmitt_osc_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_schmitt_osc)
+ DISCRETE_DECLARE_INFO(discrete_schmitt_osc_desc)
double supply, v_cap, new_vCap, t, exponent;
@@ -1364,10 +1368,11 @@ static DISCRETE_STEP(dss_schmitt_osc)
node->output[0] *= DSS_SCHMITT_OSC__AMP;
}
-static DISCRETE_RESET(dss_schmitt_osc)
+DISCRETE_RESET(dss_schmitt_osc)
{
- const discrete_schmitt_osc_desc *info = (const discrete_schmitt_osc_desc *)node->custom;
- struct dss_schmitt_osc_context *context = (struct dss_schmitt_osc_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_schmitt_osc)
+ DISCRETE_DECLARE_INFO(discrete_schmitt_osc_desc)
+
double rSource;
context->enable_type = info->options & DISC_SCHMITT_OSC_ENAB_MASK;
@@ -1409,9 +1414,9 @@ static DISCRETE_RESET(dss_schmitt_osc)
#define DSS_SINEWAVE__BIAS DISCRETE_INPUT(3)
#define DSS_SINEWAVE__PHASE DISCRETE_INPUT(4)
-static DISCRETE_STEP(dss_sinewave)
+DISCRETE_STEP(dss_sinewave)
{
- struct dss_sinewave_context *context = (struct dss_sinewave_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_sinewave)
/* Set the output */
if(DSS_SINEWAVE__ENABLE)
@@ -1435,9 +1440,10 @@ static DISCRETE_STEP(dss_sinewave)
context->phase=fmod((context->phase + ((2.0 * M_PI * DSS_SINEWAVE__FREQ) / node->info->sample_rate)), 2.0 * M_PI);
}
-static DISCRETE_RESET(dss_sinewave)
+DISCRETE_RESET(dss_sinewave)
{
- struct dss_sinewave_context *context = (struct dss_sinewave_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_sinewave)
+
double start;
/* Establish starting phase, convert from degrees to radians */
@@ -1468,9 +1474,9 @@ static DISCRETE_RESET(dss_sinewave)
#define DSS_SQUAREWAVE__BIAS DISCRETE_INPUT(4)
#define DSS_SQUAREWAVE__PHASE DISCRETE_INPUT(5)
-static DISCRETE_STEP(dss_squarewave)
+DISCRETE_STEP(dss_squarewave)
{
- struct dss_squarewave_context *context = (struct dss_squarewave_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_squarewave)
/* Establish trigger phase from duty */
context->trigger=((100-DSS_SQUAREWAVE__DUTY)/100)*(2.0*M_PI);
@@ -1501,9 +1507,10 @@ static DISCRETE_STEP(dss_squarewave)
context->phase=fmod(context->phase + ((2.0 * M_PI * DSS_SQUAREWAVE__FREQ) / node->info->sample_rate), 2.0 * M_PI);
}
-static DISCRETE_RESET(dss_squarewave)
+DISCRETE_RESET(dss_squarewave)
{
- struct dss_squarewave_context *context = (struct dss_squarewave_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_squarewave)
+
double start;
/* Establish starting phase, convert from degrees to radians */
@@ -1534,9 +1541,9 @@ static DISCRETE_RESET(dss_squarewave)
#define DSS_SQUAREWFIX__BIAS DISCRETE_INPUT(4)
#define DSS_SQUAREWFIX__PHASE DISCRETE_INPUT(5)
-static DISCRETE_STEP(dss_squarewfix)
+DISCRETE_STEP(dss_squarewfix)
{
- struct dss_squarewfix_context *context = (struct dss_squarewfix_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_squarewfix)
context->t_left -= context->sample_step;
@@ -1563,9 +1570,9 @@ static DISCRETE_STEP(dss_squarewfix)
}
}
-static DISCRETE_RESET(dss_squarewfix)
+DISCRETE_RESET(dss_squarewfix)
{
- struct dss_squarewfix_context *context = (struct dss_squarewfix_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_squarewfix)
context->sample_step = 1.0 / node->info->sample_rate;
context->flip_flop = 1;
@@ -1612,9 +1619,10 @@ static DISCRETE_RESET(dss_squarewfix)
#define DSS_SQUAREWAVE2__BIAS DISCRETE_INPUT(4)
#define DSS_SQUAREWAVE2__SHIFT DISCRETE_INPUT(5)
-static DISCRETE_STEP(dss_squarewave2)
+DISCRETE_STEP(dss_squarewave2)
{
- struct dss_squarewave_context *context = (struct dss_squarewave_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_squarewave)
+
double newphase;
if(DSS_SQUAREWAVE2__ENABLE)
@@ -1647,9 +1655,10 @@ static DISCRETE_STEP(dss_squarewave2)
}
}
-static DISCRETE_RESET(dss_squarewave2)
+DISCRETE_RESET(dss_squarewave2)
{
- struct dss_squarewave_context *context = (struct dss_squarewave_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_squarewave)
+
double start;
/* Establish starting phase, convert from degrees to radians */
@@ -1685,8 +1694,8 @@ static DISCRETE_RESET(dss_squarewave2)
INLINE double dss_inverter_tftab(const node_description *node, double x)
{
- const discrete_inverter_osc_desc *info = (const discrete_inverter_osc_desc *)node->custom;
- struct dss_inverter_osc_context *context = (struct dss_inverter_osc_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_inverter_osc)
+ DISCRETE_DECLARE_INFO(discrete_inverter_osc_desc)
x = x / info->vB;
if (x > 0)
@@ -1697,8 +1706,8 @@ INLINE double dss_inverter_tftab(const node_description *node, double x)
INLINE double dss_inverter_tf(const node_description *node, double x)
{
- const discrete_inverter_osc_desc *info = (const discrete_inverter_osc_desc *)node->custom;
- struct dss_inverter_osc_context *context = (struct dss_inverter_osc_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_inverter_osc)
+ DISCRETE_DECLARE_INFO(discrete_inverter_osc_desc)
if (x < 0.0)
return info->vB;
@@ -1708,10 +1717,10 @@ INLINE double dss_inverter_tf(const node_description *node, double x)
return context->tf_tab[DSS_INV_TAB_SIZE - 1];
}
-static DISCRETE_STEP(dss_inverter_osc)
+DISCRETE_STEP(dss_inverter_osc)
{
- struct dss_inverter_osc_context *context = (struct dss_inverter_osc_context *)node->context;
- const discrete_inverter_osc_desc *info = (const discrete_inverter_osc_desc *)node->custom;
+ DISCRETE_DECLARE_CONTEXT(dss_inverter_osc)
+ DISCRETE_DECLARE_INFO(discrete_inverter_osc_desc)
double diff, vG1, vG2, vG3, vI;
double vMix, rMix;
@@ -1823,10 +1832,10 @@ static DISCRETE_STEP(dss_inverter_osc)
node->output[0] = (node->output[0] > info->vInFall);
}
-static DISCRETE_RESET(dss_inverter_osc)
+DISCRETE_RESET(dss_inverter_osc)
{
- struct dss_inverter_osc_context *context = (struct dss_inverter_osc_context *)node->context;
- const discrete_inverter_osc_desc *info = (const discrete_inverter_osc_desc *)node->custom;
+ DISCRETE_DECLARE_CONTEXT(dss_inverter_osc)
+ DISCRETE_DECLARE_INFO(discrete_inverter_osc_desc)
int i;
@@ -1867,9 +1876,9 @@ static DISCRETE_RESET(dss_inverter_osc)
#define DSS_TRIANGLEWAVE__BIAS DISCRETE_INPUT(3)
#define DSS_TRIANGLEWAVE__PHASE DISCRETE_INPUT(4)
-static DISCRETE_STEP(dss_trianglewave)
+DISCRETE_STEP(dss_trianglewave)
{
- struct dss_trianglewave_context *context = (struct dss_trianglewave_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_trianglewave)
if(DSS_TRIANGLEWAVE__ENABLE)
{
@@ -1894,9 +1903,10 @@ static DISCRETE_STEP(dss_trianglewave)
context->phase=fmod((context->phase + ((2.0 * M_PI * DSS_TRIANGLEWAVE__FREQ) / node->info->sample_rate)), 2.0 * M_PI);
}
-static DISCRETE_RESET(dss_trianglewave)
+DISCRETE_RESET(dss_trianglewave)
{
- struct dss_trianglewave_context *context = (struct dss_trianglewave_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dss_trianglewave)
+
double start;
/* Establish starting phase, convert from degrees to radians */
@@ -1920,10 +1930,8 @@ static DISCRETE_RESET(dss_trianglewave)
************************************************************************/
#define DSS_ADSR__ENABLE DISCRETE_INPUT(0)
-static DISCRETE_STEP(dss_adsrenv)
+DISCRETE_STEP(dss_adsrenv)
{
-/* struct dss_adsr_context *context = node->context; */
-
if(DSS_ADSR__ENABLE)
{
node->output[0] = 0;
@@ -1935,7 +1943,7 @@ static DISCRETE_STEP(dss_adsrenv)
}
-static DISCRETE_RESET(dss_adsrenv)
+DISCRETE_RESET(dss_adsrenv)
{
DISCRETE_STEP_CALL(dss_adsrenv);
}
diff --git a/src/emu/sound/discrete.c b/src/emu/sound/discrete.c
index 4ee79f92f39..8a4d7a5a54d 100644
--- a/src/emu/sound/discrete.c
+++ b/src/emu/sound/discrete.c
@@ -201,7 +201,7 @@ static const discrete_module module_list[] =
{
{ DSO_OUTPUT ,"DSO_OUTPUT" , 0 ,0 ,dso_output_reset ,dso_output_step ,NULL ,NULL },
{ DSO_CSVLOG ,"DSO_CSVLOG" , 0 ,sizeof(struct dso_csvlog_context) ,NULL ,dso_csvlog_step ,dso_csvlog_start ,dso_csvlog_stop },
- { DSO_WAVELOG ,"DSO_WAVELOG" , 0 ,sizeof(struct dso_wavelog_context) ,NULL ,dso_wavelog_step ,dso_wavelog_start ,dso_wavelog_stop },
+ { DSO_WAVELOG ,"DSO_WAVELOG" , 0 ,sizeof(struct dso_wavlog_context) ,NULL ,dso_wavlog_step ,dso_wavlog_start ,dso_wavlog_stop },
{ DSO_IMPORT ,"DSO_IMPORT" , 0 ,0 ,NULL ,NULL ,NULL ,NULL },
/* parallel modules */
@@ -261,7 +261,7 @@ static const discrete_module module_list[] =
{ DST_LOOKUP_TABLE,"DST_LOOKUP_TABLE", 1 ,0 ,NULL ,dst_lookup_table_step,NULL ,NULL },
{ DST_MULTIPLEX ,"DST_MULTIPLEX" , 1 ,sizeof(struct dst_size_context) ,dst_multiplex_reset ,dst_multiplex_step ,NULL ,NULL },
{ DST_ONESHOT ,"DST_ONESHOT" , 1 ,sizeof(struct dst_oneshot_context) ,dst_oneshot_reset ,dst_oneshot_step ,NULL ,NULL },
- { DST_RAMP ,"DST_RAMP" , 1 ,sizeof(struct dss_ramp_context) ,dst_ramp_reset ,dst_ramp_step ,NULL ,NULL },
+ { DST_RAMP ,"DST_RAMP" , 1 ,sizeof(struct dst_ramp_context) ,dst_ramp_reset ,dst_ramp_step ,NULL ,NULL },
{ DST_SAMPHOLD ,"DST_SAMPHOLD" , 1 ,sizeof(struct dst_samphold_context) ,dst_samphold_reset ,dst_samphold_step ,NULL ,NULL },
{ DST_SWITCH ,"DST_SWITCH" , 1 ,0 ,NULL ,dst_switch_step ,NULL ,NULL },
{ DST_ASWITCH ,"DST_ASWITCH" , 1 ,0 ,NULL ,dst_aswitch_step ,NULL ,NULL },
@@ -269,7 +269,7 @@ static const discrete_module module_list[] =
/* Component specific */
{ DST_COMP_ADDER ,"DST_COMP_ADDER" , 1 ,sizeof(struct dst_comp_adder_context) ,dst_comp_adder_reset ,dst_comp_adder_step ,NULL ,NULL },
{ DST_DAC_R1 ,"DST_DAC_R1" , 1 ,sizeof(struct dst_dac_r1_context) ,dst_dac_r1_reset ,dst_dac_r1_step ,NULL ,NULL },
- { DST_DIODE_MIX ,"DST_DIODE_MIX" , 1 ,sizeof(struct dst_diode_mix__context) ,dst_diode_mix_reset ,dst_diode_mix_step ,NULL ,NULL },
+ { DST_DIODE_MIX ,"DST_DIODE_MIX" , 1 ,sizeof(struct dst_diode_mix_context) ,dst_diode_mix_reset ,dst_diode_mix_step ,NULL ,NULL },
{ DST_INTEGRATE ,"DST_INTEGRATE" , 1 ,sizeof(struct dst_integrate_context) ,dst_integrate_reset ,dst_integrate_step ,NULL ,NULL },
{ DST_MIXER ,"DST_MIXER" , 1 ,sizeof(struct dst_mixer_context) ,dst_mixer_reset ,dst_mixer_step ,NULL ,NULL },
{ DST_OP_AMP ,"DST_OP_AMP" , 1 ,sizeof(struct dst_op_amp_context) ,dst_op_amp_reset ,dst_op_amp_step ,NULL ,NULL },
@@ -283,10 +283,10 @@ static const discrete_module module_list[] =
/* from disc_flt.c */
/* Generic modules */
- { DST_FILTER1 ,"DST_FILTER1" , 1 ,sizeof(struct dss_filter1_context) ,dst_filter1_reset ,dst_filter1_step ,NULL ,NULL },
- { DST_FILTER2 ,"DST_FILTER2" , 1 ,sizeof(struct dss_filter2_context) ,dst_filter2_reset ,dst_filter2_step ,NULL ,NULL },
+ { DST_FILTER1 ,"DST_FILTER1" , 1 ,sizeof(struct dst_filter1_context) ,dst_filter1_reset ,dst_filter1_step ,NULL ,NULL },
+ { DST_FILTER2 ,"DST_FILTER2" , 1 ,sizeof(struct dst_filter2_context) ,dst_filter2_reset ,dst_filter2_step ,NULL ,NULL },
/* Component specific modules */
- { DST_SALLEN_KEY ,"DST_SALLEN_KEY" , 1 ,sizeof(struct dss_filter2_context) ,dst_sallen_key_reset ,dst_sallen_key_step ,NULL ,NULL },
+ { DST_SALLEN_KEY ,"DST_SALLEN_KEY" , 1 ,sizeof(struct dst_filter2_context) ,dst_sallen_key_reset ,dst_sallen_key_step ,NULL ,NULL },
{ DST_CRFILTER ,"DST_CRFILTER" , 1 ,sizeof(struct dst_rcfilter_context) ,dst_crfilter_reset ,dst_crfilter_step ,NULL ,NULL },
{ DST_OP_AMP_FILT ,"DST_OP_AMP_FILT" , 1 ,sizeof(struct dst_op_amp_filt_context) ,dst_op_amp_filt_reset ,dst_op_amp_filt_step ,NULL ,NULL },
{ DST_RC_CIRCUIT_1,"DST_RC_CIRCUIT_1", 1 ,sizeof(struct dst_rc_circuit_1_context),dst_rc_circuit_1_reset,dst_rc_circuit_1_step,NULL ,NULL },
@@ -300,9 +300,9 @@ static const discrete_module module_list[] =
{ DST_RCFILTER ,"DST_RCFILTER" , 1 ,sizeof(struct dst_rcfilter_context) ,dst_rcfilter_reset ,dst_rcfilter_step ,NULL ,NULL },
{ DST_RCFILTER_SW ,"DST_RCFILTER_SW" , 1 ,sizeof(struct dst_rcfilter_sw_context) ,dst_rcfilter_sw_reset ,dst_rcfilter_sw_step ,NULL ,NULL },
/* For testing - seem to be buggered. Use versions not ending in N. */
- { DST_RCFILTERN ,"DST_RCFILTERN" , 1 ,sizeof(struct dss_filter1_context) ,dst_rcfilterN_reset ,dst_filter1_step ,NULL ,NULL },
- { DST_RCDISCN ,"DST_RCDISCN" , 1 ,sizeof(struct dss_filter1_context) ,dst_rcdiscN_reset ,dst_rcdiscN_step ,NULL ,NULL },
- { DST_RCDISC2N ,"DST_RCDISC2N" , 1 ,sizeof(struct dss_rcdisc2_context) ,dst_rcdisc2N_reset ,dst_rcdisc2N_step ,NULL ,NULL },
+ { DST_RCFILTERN ,"DST_RCFILTERN" , 1 ,sizeof(struct dst_filter1_context) ,dst_rcfilterN_reset ,dst_filter1_step ,NULL ,NULL },
+ { DST_RCDISCN ,"DST_RCDISCN" , 1 ,sizeof(struct dst_filter1_context) ,dst_rcdiscN_reset ,dst_rcdiscN_step ,NULL ,NULL },
+ { DST_RCDISC2N ,"DST_RCDISC2N" , 1 ,sizeof(struct dst_rcdisc2_context) ,dst_rcdisc2N_reset ,dst_rcdisc2N_step ,NULL ,NULL },
/* from disc_dev.c */
/* generic modules */
@@ -314,7 +314,6 @@ static const discrete_module module_list[] =
{ DSD_555_VCO1 ,"DSD_555_VCO1" , 1 ,sizeof(struct dsd_555_vco1_context) ,dsd_555_vco1_reset ,dsd_555_vco1_step ,NULL ,NULL },
{ DSD_566 ,"DSD_566" , 1 ,sizeof(struct dsd_566_context) ,dsd_566_reset ,dsd_566_step ,NULL ,NULL },
{ DSD_LS624 ,"DSD_LS624" , 1 ,sizeof(struct dsd_ls624_context) ,dsd_ls624_reset ,dsd_ls624_step ,NULL ,NULL },
- { DSD_LS629 ,"DSD_LS629" , 1 ,sizeof(struct dsd_ls629_context) ,dsd_ls629_reset ,dsd_ls629_step ,NULL ,NULL },
/* must be the last one */
{ DSS_NULL ,"DSS_NULL" , 0 ,0 ,NULL ,NULL ,NULL ,NULL }
};
diff --git a/src/emu/sound/discrete.h b/src/emu/sound/discrete.h
index 892d289176a..ac4c6af84c3 100644
--- a/src/emu/sound/discrete.h
+++ b/src/emu/sound/discrete.h
@@ -25,7 +25,7 @@
* http://www.ibiblio.org/obp/electricCircuits/
* For a free circuit simulator:
* http://qucs.sourceforge.net/index.html
- * For a free waveform editor to view DISCRETE_WAVELOG dumps:
+ * For a free waveform editor to view DISCRETE_WAVLOG dumps:
* http://audacity.sourceforge.net/
* http://www.sonicvisualiser.org/
*
@@ -315,8 +315,7 @@
* DISCRETE_555_VCO1(NODE,RESET,VIN,OPTIONS)
* DISCRETE_555_VCO1_CV(NODE,RESET,VIN,CTRLV,OPTIONS)
* DISCRETE_566(NODE,VMOD,R,C,VPOS,VNEG,VCHARGE,OPTIONS)
- * DISCRETE_74LS624(NODE,VMOD,VRNG,C,OUTTYPE)
- * DISCRETE_74LS629(NODE,ENAB,VMOD,VRNG,C,R_FREQ_IN,OUTTYPE)
+ * DISCRETE_74LS624(NODE,ENAB,VMOD,VRNG,C,R_FREQ_IN,C_FREQ_IN,R_RNG_IN,OUTTYPE)
*
* DISCRETE_CUSTOM1(NODE,IN0,INFO)
* DISCRETE_CUSTOM2(NODE,IN0,IN1,INFO)
@@ -333,8 +332,8 @@
* DISCRETE_CSVLOG3(NODE1,NODE2,NODE3)
* DISCRETE_CSVLOG4(NODE1,NODE2,NODE3,NODE4)
* DISCRETE_CSVLOG5(NODE1,NODE2,NODE3,NODE4,NODE5)
- * DISCRETE_WAVELOG1(NODE1,GAIN1)
- * DISCRETE_WAVELOG2(NODE1,GAIN1,NODE2,GAIN2)
+ * DISCRETE_WAVLOG1(NODE1,GAIN1)
+ * DISCRETE_WAVLOG2(NODE1,GAIN1,NODE2,GAIN2)
* DISCRETE_OUTPUT(OPNODE,GAIN)
*
***********************************************************************
@@ -1401,7 +1400,7 @@
* will be output. Otherwise the Low/High voltages will be used
* to convert the x_time to energy.
*
- * EXAMPLES: see Mario, Donkey Kong Jr
+ * EXAMPLES: see Mario Bros.; Donkey Kong Jr
*
***********************************************************************
*
@@ -3315,49 +3314,54 @@
*
***********************************************************************
*
- * DISCRETE_74LS624 - VCO.
+ * DISCRETE_74LS624 - VCO. 1/2 of 74LS629.
*
- * Simplified 74LS624 - calculated frequencies should match datasheet
- * for C > 1nF. Output is Logic (1/0)
- *
- * The datasheet gives no formulae. The implementation therefore is
- * a rough model of the diagrams given.
+ * The datasheet gives no formulae. The implementation is based on
+ * testing a 74LS629.
*
* For a LS628, use VRng = 3.2
*
- * V+
- * |
- * .---------.
- * vRng >------------|Rng V+ |
- * | |
- * vMod >------------|Freq Z |---------> Netlist Node
- * | |
- * .---|CX1 |
- * | | |
- * --- | |
- * C --- | |
- * | | |
- * '---|CX2 |
- * '---------'
- * |
- * GND
+ * V+
+ * |
+ * R_rng_in .---------.
+ * vRng >-----------ZZZZ-------|Rng V+ |
+ * R_freq_in | |
+ * vMod >---ZZZZ-+-------------|Freq Z |---------> Netlist Node
+ * | | |
+ * C_freq_in --- .---|CX1 |
+ * --- | | |
+ * | --- | |
+ * | C --- | |
+ * Gnd | | |
+ * '---|CX2 |
+ * '---------'
+ * |
+ * GND
*
* Declaration syntax
*
- * DISCRETE_74LS624(name of node,
+ * DISCRETE_74LS624(name of node,(NODE,ENAB,VMOD,VRNG,C,R_FREQ_IN,C_FREQ_IN,OUTTYPE)
+ * enable node or static value,
* vMod node or static value,
* vRng static value,
* C static value in Farads,
- * Type of output static value)
+ * R_freq_in static value in Ohms,
+ * C_freq_in static value in Farads,
+ * R_rng_in static value in Ohms,
+ * Type of output static value)
*
* Type of Output
- * DISC_LS624_OUT_ENERGY Energy - use for audio output
- * DISC_LS624_OUT_LOGIC Logic ( 0 or 1)
- * DISC_LS624_OUT_COUNT_F Number of Falling edges
- * DISC_LS624_OUT_COUNT_R Number of Rising edges
+ * DISC_LS624_OUT_SQUARE - 4.4V square wave
+ * DISC_LS624_OUT_ENERGY - 4.4V anti-aliased square wave
+ * DISC_LS624_OUT_LOGIC - Logic ( 0 or 1)
+ * DISC_LS624_OUT_LOGIC_X - Logic ( 0 or 1) with xime
+ * DISC_LS624_OUT_COUNT_F - Number of Falling edges
+ * DISC_LS624_OUT_COUNT_F_X - Number of Falling edges with xime
+ * DISC_LS624_OUT_COUNT_R - Number of Rising edges
+ * DISC_LS624_OUT_COUNT_R_X - Number of Rising edges with xime
*
*
- * EXAMPLES: see Donkey Kong Jr.
+ * EXAMPLES: see Donkey Kong Jr.; Mario Bros.
*
***********************************************************************
*
@@ -3380,7 +3384,7 @@
* if you have used DISCRETE_STEP(basename) and DISCRETE_RESET(basename) to define
* the step/reset procedures.
*
- * EXAMPLES: see Donkey Kong, Mario Bros., Sky Raider
+ * EXAMPLES: see Sky Raider, Donkey Kong
*
***********************************************************************
=======================================================================
@@ -3409,21 +3413,21 @@
*
************************************************************************
*
- * DISCRETE_WAVELOG - Dump nodes into a wav file
+ * DISCRETE_WAVLOG - Dump nodes into a wav file
*
* Declaration syntax
*
- * DISCRETE_WAVELOG1(node,
+ * DISCRETE_WAVLOG1(node,
* static gain for node)
*
- * DISCRETE_WAVELOG2(left node,
+ * DISCRETE_WAVLOG2(left node,
* static gain for left node,
* right node,
* static gain for right node)
*
* Use this to monitor nodes while debugging the driver. You should
* remove these nodes from the final driver. You can use up to a maximum
- * of DISCRETE_MAX_WAVELOGS. Each file will be called discreteX_Y.wav,
+ * of DISCRETE_MAX_WAVLOGS. Each file will be called discreteX_Y.wav,
* where X is the sound tag. Y is 0-9, in the order the file is
* created in the driver.
*
@@ -3501,16 +3505,19 @@
#define DISCRETE_FUNC(_func) void _func (node_description *node)
-#define DISCRETE_STEP(_func) DISCRETE_FUNC(DISCRETE_STEP_NAME(_func))
-#define DISCRETE_RESET(_func) DISCRETE_FUNC(DISCRETE_RESET_NAME(_func))
-#define DISCRETE_START(_func) DISCRETE_FUNC(DISCRETE_START_NAME(_func))
-#define DISCRETE_STOP(_func) DISCRETE_FUNC(DISCRETE_STOP_NAME(_func))
+#define DISCRETE_STEP(_func) static DISCRETE_FUNC(DISCRETE_STEP_NAME(_func))
+#define DISCRETE_RESET(_func) static DISCRETE_FUNC(DISCRETE_RESET_NAME(_func))
+#define DISCRETE_START(_func) static DISCRETE_FUNC(DISCRETE_START_NAME(_func))
+#define DISCRETE_STOP(_func) static DISCRETE_FUNC(DISCRETE_STOP_NAME(_func))
#define DISCRETE_STEP_CALL(_func) DISCRETE_STEP_NAME(_func) (node)
#define DISCRETE_RESET_CALL(_func) DISCRETE_RESET_NAME(_func) (node)
#define DISCRETE_START_CALL(_func) DISCRETE_START_NAME(_func) (node)
#define DISCRETE_STOP_CALL(_func) DISCRETE_STOP_NAME(_func) (node)
+#define DISCRETE_DECLARE_CONTEXT(_name) struct _name##_context *context = (struct _name##_context *)node->context;
+#define DISCRETE_DECLARE_INFO(_name) const _name *info = (const _name *)node->custom;
+
#define DISCRETE_CUSTOM_MODULE(_basename, _context_type) \
{ DST_CUSTOM, "CUSTOM", 1, sizeof(_context_type), DISCRETE_RESET_NAME(_basename), DISCRETE_STEP_NAME(_basename) }
@@ -3725,11 +3732,11 @@ enum
#define DISC_LS624_OUT_SQUARE 0x01
#define DISC_LS624_OUT_ENERGY 0x02
#define DISC_LS624_OUT_LOGIC 0x03
-#define DISC_LS624_OUT_LOGIC_X 0x08
-#define DISC_LS624_OUT_COUNT_F 0x04
-#define DISC_LS624_OUT_COUNT_R 0x05
-#define DISC_LS624_OUT_COUNT_F_X 0x06
-#define DISC_LS624_OUT_COUNT_R_X 0x07
+#define DISC_LS624_OUT_LOGIC_X 0x04
+#define DISC_LS624_OUT_COUNT_F 0x05
+#define DISC_LS624_OUT_COUNT_R 0x06
+#define DISC_LS624_OUT_COUNT_F_X 0x07
+#define DISC_LS624_OUT_COUNT_R_X 0x08
/* Oneshot types */
#define DISC_ONESHOT_FEDGE 0x00
@@ -4379,7 +4386,6 @@ enum
DSD_555_VCO1, /* Op-Amp linear ramp based 555 VCO */
DSD_566, /* NE566 Emulation */
DSD_LS624, /* 74LS624 Emulation */
- DSD_LS629, /* 74LS624 Emulation - new */
/* Custom */
DST_CUSTOM, /* whatever you want */
@@ -4580,8 +4586,7 @@ enum
#define DISCRETE_555_VCO1(NODE,RESET,VIN,OPTIONS) { NODE, DSD_555_VCO1 , 3, { RESET,VIN,NODE_NC }, { RESET,VIN,-1 }, OPTIONS, "DISCRETE_555_VCO1" },
#define DISCRETE_555_VCO1_CV(NODE,RESET,VIN,CTRLV,OPTIONS) { NODE, DSD_555_VCO1 , 3, { RESET,VIN,CTRLV }, { RESET,VIN,CTRLV }, OPTIONS, "DISCRETE_555_VCO1_CV" },
#define DISCRETE_566(NODE,VMOD,R,C,VPOS,VNEG,VCHARGE,OPTIONS) { NODE, DSD_566 , 7, { VMOD,R,C,NODE_NC,NODE_NC,VCHARGE,NODE_NC }, { VMOD,R,C,VPOS,VNEG,VCHARGE,OPTIONS }, NULL, "DISCRETE_566" },
-#define DISCRETE_74LS624(NODE,VMOD,VRNG,C,OUTTYPE) { NODE, DSD_LS624 , 4, { VMOD,NODE_NC,NODE_NC,NODE_NC }, { VMOD,VRNG,C,OUTTYPE }, NULL, "DISCRETE_74LS624" },
-#define DISCRETE_74LS629(NODE,ENAB,VMOD,VRNG,C,R_FREQ_IN,C_FREQ_IN,OUTTYPE) { NODE, DSD_LS629 , 7, { ENAB,VMOD,NODE_NC,NODE_NC,NODE_NC,NODE_NC,NODE_NC }, { ENAB,VMOD,VRNG,C,R_FREQ_IN,C_FREQ_IN,OUTTYPE }, NULL, "DISCRETE_74LS629" },
+#define DISCRETE_74LS624(NODE,ENAB,VMOD,VRNG,C,R_FREQ_IN,C_FREQ_IN,R_RNG_IN,OUTTYPE) { NODE, DSD_LS624 , 8, { ENAB,VMOD,NODE_NC,NODE_NC,NODE_NC,NODE_NC,NODE_NC,NODE_NC }, { ENAB,VMOD,VRNG,C,R_FREQ_IN,C_FREQ_IN,R_RNG_IN,OUTTYPE }, NULL, "DISCRETE_74LS624" },
/* NOP */
#define DISCRETE_NOP(NODE) { NODE, DSS_NOP , 0, { 0 }, { 0 }, NULL, "DISCRETE_NOP" },
@@ -4592,8 +4597,8 @@ enum
#define DISCRETE_CSVLOG3(NODE1,NODE2,NODE3) { NODE_SPECIAL, DSO_CSVLOG , 3, { NODE1,NODE2,NODE3 }, { NODE1,NODE2,NODE3 }, NULL, "DISCRETE_CSVLOG3" },
#define DISCRETE_CSVLOG4(NODE1,NODE2,NODE3,NODE4) { NODE_SPECIAL, DSO_CSVLOG , 4, { NODE1,NODE2,NODE3,NODE4 }, { NODE1,NODE2,NODE3,NODE4 }, NULL, "DISCRETE_CSVLOG4" },
#define DISCRETE_CSVLOG5(NODE1,NODE2,NODE3,NODE4,NODE5) { NODE_SPECIAL, DSO_CSVLOG , 5, { NODE1,NODE2,NODE3,NODE4,NODE5 }, { NODE1,NODE2,NODE3,NODE4,NODE5 }, NULL, "DISCRETE_CSVLOG5" },
-#define DISCRETE_WAVELOG1(NODE1,GAIN1) { NODE_SPECIAL, DSO_WAVELOG , 2, { NODE1,NODE_NC }, { NODE1,GAIN1 }, NULL, "DISCRETE_WAVELOG1" },
-#define DISCRETE_WAVELOG2(NODE1,GAIN1,NODE2,GAIN2) { NODE_SPECIAL, DSO_WAVELOG , 4, { NODE1,NODE_NC,NODE2,NODE_NC }, { NODE1,GAIN1,NODE2,GAIN2 }, NULL, "DISCRETE_WAVELOG2" },
+#define DISCRETE_WAVLOG1(NODE1,GAIN1) { NODE_SPECIAL, DSO_WAVELOG , 2, { NODE1,NODE_NC }, { NODE1,GAIN1 }, NULL, "DISCRETE_WAVLOG1" },
+#define DISCRETE_WAVLOG2(NODE1,GAIN1,NODE2,GAIN2) { NODE_SPECIAL, DSO_WAVELOG , 4, { NODE1,NODE_NC,NODE2,NODE_NC }, { NODE1,GAIN1,NODE2,GAIN2 }, NULL, "DISCRETE_WAVLOG2" },
/* import */
#define DISCRETE_IMPORT(INFO) { NODE_SPECIAL, DSO_IMPORT , 0, { 0 }, { 0 }, &(INFO##_discrete_interface), "DISCRETE_IMPORT" },
diff --git a/src/mame/audio/bzone.c b/src/mame/audio/bzone.c
index eb218e91dd5..aa606add98c 100644
--- a/src/mame/audio/bzone.c
+++ b/src/mame/audio/bzone.c
@@ -237,9 +237,9 @@ struct bzone_custom_filter_context
#define CD4066_R_ON 270
-static DISCRETE_STEP(bzone_custom_filter)
+DISCRETE_STEP(bzone_custom_filter)
{
- struct bzone_custom_filter_context *context = (struct bzone_custom_filter_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(bzone_custom_filter)
int in0 = (BZONE_CUSTOM_FILTER__IN0 == 0) ? 0 : 1;
double v;
@@ -254,9 +254,9 @@ static DISCRETE_STEP(bzone_custom_filter)
node->output[0] += (v - node->output[0]) * context->exponent;
}
-static DISCRETE_RESET(bzone_custom_filter)
+DISCRETE_RESET(bzone_custom_filter)
{
- struct bzone_custom_filter_context *context = (struct bzone_custom_filter_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(bzone_custom_filter)
context->gain[0] = BZONE_CUSTOM_FILTER__R1 + BZONE_CUSTOM_FILTER__R2;
context->gain[0] = BZONE_CUSTOM_FILTER__R5 / context->gain[0] + 1;
diff --git a/src/mame/audio/dkong.c b/src/mame/audio/dkong.c
index 3f15dfd84bc..148c82b1b5e 100644
--- a/src/mame/audio/dkong.c
+++ b/src/mame/audio/dkong.c
@@ -302,9 +302,9 @@ struct dkong_custom_mixer_context
double exp[2];
};
-static DISCRETE_STEP( dkong_custom_mixer )
+DISCRETE_STEP( dkong_custom_mixer )
{
- struct dkong_custom_mixer_context *context = (struct dkong_custom_mixer_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dkong_custom_mixer)
int in_1 = (int)DKONG_CUSTOM_IN1;
@@ -321,9 +321,9 @@ static DISCRETE_STEP( dkong_custom_mixer )
#define NE555_CV_R RES_2_PARALLEL(RES_K(5), RES_K(10))
-static DISCRETE_RESET( dkong_custom_mixer )
+DISCRETE_RESET( dkong_custom_mixer )
{
- struct dkong_custom_mixer_context *context = (struct dkong_custom_mixer_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(dkong_custom_mixer)
/* everything is based on the input to the O.C. inverter */
/* precalculate current from In1 */
@@ -786,6 +786,9 @@ DISCRETE_SOUND_END
#define JR_R25 RES_K(47)
#define JR_R27 RES_K(10)
#define JR_R28 RES_K(100)
+#define JR_R33 RES_K(1)
+#define JR_R34 RES_K(1)
+#define JR_R35 RES_K(1)
#define JR_C13 CAP_U(4.7)
@@ -883,13 +886,13 @@ DISCRETE_TASK_START(1)
0, 0x3FFF, DISC_COUNT_UP, 0, DISC_CLK_BY_COUNT | DISC_OUT_HAS_XTIME)
DISCRETE_BIT_DECODE(NODE_101, /* IC 6L, pin 6 */
- NODE_100, 6, 0)
+ NODE_100, 6, 0) /* output x_time logic */
DISCRETE_BIT_DECODE(NODE_102, /* IC 6L, pin 7 */
- NODE_100, 3, 0)
+ NODE_100, 3, 0) /* output x_time logic */
DISCRETE_BIT_DECODE(NODE_103, /* IC 6L, pin 2 */
- NODE_100, 12, 0)
+ NODE_100, 12, 0) /* output x_time logic */
DISCRETE_BIT_DECODE(NODE_104, /* IC 6L, pin 1 */
- NODE_100, 11, 0)
+ NODE_100, 11, 0) /* output x_time logic */
/* LS157 Switches - IC 6K */
DISCRETE_SWITCH(NODE_106, /* IC 6K, pin 7 */
@@ -906,24 +909,24 @@ DISCRETE_TASK_START(1)
1, NODE_110, /* ENAB; IC 4F, pin 11 */
4.14, 0.151) /* INP0; INP1 (measured) */
-/* Breadboarded measurements IC 5K, pin 7
- D.R. Oct 2010
- V Hz
- 0.151 3139
- 0.25 2883
- 0.5 2820
- 0.75 3336
- 1 3805
- 2 6498
- 3 9796
- 4 13440
- 4.14 13980
-*/
-
- DISCRETE_74LS629(NODE_113, /* IC 5K, pin 7 */
+ /* Breadboarded measurements IC 5K, pin 7
+ D.R. Oct 2010
+ V Hz
+ 0.151 3139
+ 0.25 2883
+ 0.5 2820
+ 0.75 3336
+ 1 3805
+ 2 6498
+ 3 9796
+ 4 13440
+ 4.14 13980
+ */
+
+ DISCRETE_74LS624(NODE_113, /* IC 5K, pin 7 */
1, /* ENAB */
NODE_111, DK_SUP_V, /* VMOD - IC 5K, pin 2; VRNG */
- JR_C18, JR_R10, JR_C17, /* C; R_FREQ_IN; C_FREQ_IN */
+ JR_C18, JR_R10, JR_C17, JR_R33, /* C; R_FREQ_IN; C_FREQ_IN; R_RNG_IN */
DISC_LS624_OUT_LOGIC_X)
DISCRETE_SWITCH(NODE_105, /* IC 6K, pin 4 */
1, /* ENAB */
@@ -938,24 +941,24 @@ DISCRETE_TASK_START(1)
NODE_107, /* IC 5J, pin 9 */
0.135, 4.15) /* measured Low/High */
-/* Breadboarded measurements IC 5K, pin 10
- D.R. Oct 2010
- V Hz
- 0.135 14450 - measured 74LS04 low
- 0.25 13320
- 0.5 12980
- 0.75 15150
- 1 17270
- 2 28230
- 3 41910
- 4 56950
- 4.15 59400 - measured 74LS04 high
-*/
-
- DISCRETE_74LS629(NODE_118, /* IC 5K, pin 10 */
+ /* Breadboarded measurements IC 5K, pin 10
+ D.R. Oct 2010
+ V Hz
+ 0.135 14450 - measured 74LS04 low
+ 0.25 13320
+ 0.5 12980
+ 0.75 15150
+ 1 17270
+ 2 28230
+ 3 41910
+ 4 56950
+ 4.15 59400 - measured 74LS04 high
+ */
+
+ DISCRETE_74LS624(NODE_118, /* IC 5K, pin 10 */
1, /* ENAB */
NODE_116, DK_SUP_V, /* VMOD - IC 5K, pin 1; VRNG */
- JR_C19, JR_R11, JR_C16, /* C; R_FREQ_IN; C_FREQ_IN */
+ JR_C19, JR_R11, JR_C16, JR_R33, /* C; R_FREQ_IN; C_FREQ_IN; R_RNG_IN */
DISC_LS624_OUT_COUNT_F_X)
DISCRETE_SWITCH(NODE_119, 1, NODE_110, 0, 1) /* convert from voltage to x_time logic */
DISCRETE_XTIME_NAND(DS_OUT_SOUND0, /* IC 5N, pin 11 */
@@ -980,25 +983,25 @@ DISCRETE_TASK_START(2)
0.151, 4.14) /* measured Low/High */
DISCRETE_MIXER2(NODE_13, 1, NODE_11, NODE_12, &dkongjr_s1_mixer_desc)
-/* Breadboarded measurements IC 8L, pin 10
- D.R. Oct 2010
- V Hz
- 0.151 313
- 0.25 288
- 0.5 275
- 0.75 324
- 1 370
- 2 635
- 3 965
- 4 1325
- 4.14 1378
-*/
-
- DISCRETE_74LS629(NODE_14, /* IC 8L, pin 10 */
+ /* Breadboarded measurements IC 8L, pin 10
+ D.R. Oct 2010
+ V Hz
+ 0.151 313
+ 0.25 288
+ 0.5 275
+ 0.75 324
+ 1 370
+ 2 635
+ 3 965
+ 4 1325
+ 4.14 1378
+ */
+
+ DISCRETE_74LS624(NODE_14, /* IC 8L, pin 10 */
1, /* ENAB */
NODE_13, DK_SUP_V, /* VMOD - IC 8L, pin 1, VRNG */
/* C_FREQ_IN is taken care of by the NODE_13 mixer */
- JR_C22, RES_2_PARALLEL(JR_R13, JR_R12), 0, /* C, R_FREQ_IN, C_FREQ_IN */
+ JR_C22, RES_2_PARALLEL(JR_R13, JR_R12), 0, JR_R35, /* C; R_FREQ_IN; C_FREQ_IN; R_RNG_IN */
DISC_LS624_OUT_ENERGY)
DISCRETE_LOGIC_INVERT(NODE_15, NODE_10) /* fake invert for NODE_16 */
@@ -1044,23 +1047,23 @@ DISCRETE_TASK_START(1)
DS_SOUND9_EN, /* IC 7N, pin 9 */
0.134, 4.16) /* measured Low/High */
- /* Breadboarded measurements IC 7P, pin 7
- D.R. Oct 2010
- V Hz
- 0.134 570
- 0.25 538
- 0.5 489
- 0.75 560
- 1 636
- 2 1003
- 3 1484
- 4 2016
- 4.16 2111
-*/
- DISCRETE_74LS629(NODE_91, /* IC 7P, pin 7 */
+ /* Breadboarded measurements IC 7P, pin 7
+ D.R. Oct 2010
+ V Hz
+ 0.134 570
+ 0.25 538
+ 0.5 489
+ 0.75 560
+ 1 636
+ 2 1003
+ 3 1484
+ 4 2016
+ 4.16 2111
+ */
+ DISCRETE_74LS624(NODE_91, /* IC 7P, pin 7 */
1, /* ENAB */
NODE_90, DK_SUP_V, /* VMOD - IC 7P, pin 2, VRNG */
- JR_C37, JR_R14, JR_C26, /* C, R_FREQ_IN, C_FREQ_IN */
+ JR_C37, JR_R14, JR_C26, JR_R34, /* C; R_FREQ_IN; C_FREQ_IN; R_RNG_IN */
DISC_LS624_OUT_LOGIC_X)
DISCRETE_XTIME_NAND(DS_OUT_SOUND9, /* IC 5N, pin 8 */
DS_SOUND9_EN, /* IC 5N, pin 9 */
@@ -1101,7 +1104,12 @@ DISCRETE_TASK_START(3)
* Just a 1:n amplifier without filters - just the output filter
*/
DISCRETE_CRFILTER(NODE_295, NODE_288, 1000, JR_C13)
- DISCRETE_OUTPUT(NODE_295, 32767.0/5.0 * 5)
+ /* approx -1.805V to 2.0V when playing, but turn on sound peaks at 2.36V */
+ /* we will set the full wav range to 1.18V which will cause clipping on the turn on
+ * sound and explosions. The real game would do this when the volume is turned up too.
+ * Reducing MAME's master volume to 50% will provide full unclipped volume.
+ */
+ DISCRETE_OUTPUT(NODE_295, 32767.0/1.18)
DISCRETE_TASK_END()
DISCRETE_SOUND_END
@@ -1245,16 +1253,16 @@ static READ8_DEVICE_HANDLER( dkong_voice_status_r )
static READ8_DEVICE_HANDLER( dkong_tune_r )
{
dkong_state *state = device->machine->driver_data<dkong_state>();
- UINT8 page = latch8_r(state->dev_vp2,0) & 0x47;
+ UINT8 page = latch8_r(state->dev_vp2, 0) & 0x47;
if ( page & 0x40 )
{
- return (latch8_r(device, 0) & 0x0F) | (dkong_voice_status_r(device,0)<<4);
+ return (latch8_r(device, 0) & 0x0F) | (dkong_voice_status_r(device, 0) << 4);
}
else
{
/* printf("%s:rom access\n",cpuexec_describe_context(device->machine)); */
- return (state->snd_rom[0x1000+(page & 7)*256+offset]);
+ return (state->snd_rom[0x1000 + (page & 7) * 256 + offset]);
}
}
diff --git a/src/mame/audio/mario.c b/src/mame/audio/mario.c
index b8071e42e49..11938782864 100644
--- a/src/mame/audio/mario.c
+++ b/src/mame/audio/mario.c
@@ -15,12 +15,6 @@
/* FIXME: Capacitor aging - only in for calibration now */
/* Adjustments are needed to bring this close to recordings */
-/* FIXME: Awaiting verification. VCO range inputs are shown */
-/* as connected to +5V on schematics. This does not match */
-/* recordings */
-
-#define USE_LS629 (0) /* set to use new LS624 code */
-
#define RUN_VCO_VOLTAGE (0.0) /* 5 in schematics */
#define USE_8039 (0) /* set to 1 to try 8039 hack */
@@ -93,6 +87,9 @@
/* 27 verified, 30K in schematics */
#define MR_R19 RES_K(22) /* verified */
#define MR_R20 RES_K(22) /* verified */
+#define MR_R34 RES_M(2) /* */
+#define MR_R35 RES_M(1) /* */
+#define MR_R36 RES_M(1.8) /* */
#define MR_R40 RES_K(22) /* verified */
#define MR_R41 RES_K(100) /* verified */
#define MR_R42 RES_K(43) /* verified */
@@ -124,298 +121,236 @@
/* KT = 0.25 for diode circuit, 0.33 else */
#define DISCRETE_LS123(_N, _T, _R, _C) \
- DISCRETE_ONESHOTR(_N, 0, _T, TTL_HIGH, (0.25 * (_R) * (_C) * (1.0+700./(_R))), DISC_ONESHOT_RETRIG | DISC_ONESHOT_REDGE)
+ DISCRETE_ONESHOTR(_N, 0, _T, 1, (0.25 * (_R) * (_C) * (1.0+700./(_R))), DISC_ONESHOT_RETRIG | DISC_ONESHOT_REDGE)
#define DISCRETE_LS123_INV(_N, _T, _R, _C) \
- DISCRETE_ONESHOTR(_N, 0, _T, TTL_HIGH, (0.25 * (_R) * (_C) * (1.0+700./(_R))), DISC_ONESHOT_RETRIG | DISC_ONESHOT_REDGE | DISC_OUT_ACTIVE_LOW)
-
-/* speed optimization */
-/* pow(10, x) = exp(ln(10)*x) */
-#define pow10(x) exp(2.30258509299404568401*(x))
+ DISCRETE_ONESHOTR(_N, 0, _T, 1, (0.25 * (_R) * (_C) * (1.0+700./(_R))), DISC_ONESHOT_RETRIG | DISC_ONESHOT_REDGE | DISC_OUT_ACTIVE_LOW)
-/* The following formula was derived from figures 2 and 3 in LS624 datasheet. Coefficients
- * where calculated using least square approximation.
- * This approach gives a bit better results compared to the first approach.
- */
-//#define LS624_F(_C, _VI, _VR) pow10( -0.912029404 * log10(_C) + 0.243264328 * (_VI)
-// - 0.091695877 * (_VR) -0.014110946 * (_VI) * (_VR) - 3.207072925)
-#define LS624_F(_in, _num) pow10(context->k1_##_num + 0.243264328 * (_in) + context->k2_##_num * (_in))
-/************************************************************************
- *
- * Custom mario run
- *
- * Two VCO with XOR'd signal
- *
- * input[0] - Enable / Amplitude
- * input[1] - In1 VCO Control 1
- * input[2] - In2 VCO Control 2
- * input[3] - C1 VCO 1 Cap
- * input[4] - C2 VCO 2 CAP
- * input[5] - R1
- * input[6] - C3
- *
- * Vout >--------------------------
- * |
- * C1 |
- * -||- |
- * | | -- +---
- * ------ --- |AND| R1
- * In1 >---+ Y1 +--------+ | |(*)+---ZZZ--+------> Out
- * | | |XOR+------+--- |
- * | | ---+ | |
- * | | | --- ---
- * In2 >---+ Y2 +---- --- C3
- * ------ |
- * | | Gnd
- * -||-
- * C2
- ************************************************************************/
-#define MARIO_CUSTOM_VOUT DISCRETE_INPUT(0)
-#define MARIO_CUSTOM_IN1 DISCRETE_INPUT(1)
-#define MARIO_CUSTOM_IN2 DISCRETE_INPUT(2)
-#define MARIO_CUSTOM_C1 DISCRETE_INPUT(3)
-#define MARIO_CUSTOM_C2 DISCRETE_INPUT(4)
-#define MARIO_CUSTOM_R1 DISCRETE_INPUT(5)
-#define MARIO_CUSTOM_C3 DISCRETE_INPUT(6)
-
-struct mario_custom_run_context
+ static const discrete_op_amp_info mario_dac_amp =
{
- int state1;
- int state2;
- double remain1;
- double remain2;
- double vc3;
- double r1_c3;
- double k1_1;
- double k2_1;
- double k1_2;
- double k2_2;
- double exponent_c3;
- double dt_in1_at_0;
- double dt_in2_at_0;
+ DISC_OP_AMP_IS_NORTON,
+ MR_R34, MR_R36, 0, MR_R35, 0, /* r1, r2, r3, r4, c */
+ 0, 5 /* vN, vP */
};
-static DISCRETE_STEP( mario_custom_run )
-{
- struct mario_custom_run_context *context = (struct mario_custom_run_context *)node->context;
-
- double sample_t = node->info->sample_time;
- double vn, exponent, t = 0;
- int update_exponent;
- double t1, t2;
-
- if (EXPECTED(MARIO_CUSTOM_IN1 > 0.001))
- t1 = 0.5 / LS624_F(MARIO_CUSTOM_IN1, 1);
- else
- /* close enough to 0, so we can speed things up by no longer call pow() */
- t1 = context->dt_in1_at_0;
-
- if (EXPECTED(MARIO_CUSTOM_IN2 > 0.001))
- t2 = 0.5 / LS624_F(MARIO_CUSTOM_IN2, 2);
- else
- t2 = context->dt_in2_at_0;
-
- while (sample_t > 0.0f)
- {
- /* state before time advance */
- vn = (double) (context->state1 ^ context->state2);
- vn *= MARIO_CUSTOM_VOUT;
- update_exponent = 0;
- if (context->remain1 < context->remain2)
- {
- if (EXPECTED(context->remain1 < sample_t))
- {
- t = context->remain1;
- update_exponent = 1;
- context->state1 ^= 1;
- sample_t -= context->remain1;
- context->remain2 -= context->remain1;
- context->remain1 = t1;
- }
- else
- {
- context->remain1 -= sample_t;
- context->remain2 -= sample_t;
- sample_t = 0.0f;
- }
- }
- else
- {
- if (EXPECTED(context->remain2 < sample_t))
- {
- t = context->remain2;
- update_exponent = 1;
- context->state2 ^= 1;
- sample_t -= context->remain2;
- context->remain1 -= context->remain2;
- context->remain2 = t2;
- }
- else
- {
- context->remain1 -= sample_t;
- context->remain2 -= sample_t;
- sample_t = 0.0f;
- }
- }
-
- if (EXPECTED(update_exponent))
- exponent = RC_CHARGE_EXP_DT(context->r1_c3, t);
- else
- exponent = context->exponent_c3;
- context->vc3 += (vn - context->vc3) * exponent;
- }
- node->output[0] = context->vc3;
-}
-
-static DISCRETE_RESET( mario_custom_run )
-{
- struct mario_custom_run_context *context = (struct mario_custom_run_context *)node->context;
-
- context->remain1 = 0.0;
- context->remain2 = 0.0;
- context->state1 = 0;
- context->state2 = 0;
- context->vc3 = 0;
- context->r1_c3 = MARIO_CUSTOM_R1 * MARIO_CUSTOM_C3;
- node->output[0] = 0;
-
- /* precalculate some parts of the formulas for speed */
- context->k1_1 = -0.912029404 * log10(MARIO_CUSTOM_C1) -0.091695877 * (RUN_VCO_VOLTAGE) - 3.207072925;
- context->k2_1 = -0.014110946 * (RUN_VCO_VOLTAGE);
- context->k1_2 = -0.912029404 * log10(MARIO_CUSTOM_C2) -0.091695877 * (RUN_VCO_VOLTAGE) - 3.207072925;
- context->k2_2 = -0.014110946 * (RUN_VCO_VOLTAGE);
- context->exponent_c3 = RC_CHARGE_EXP(context->r1_c3);
-
- context->dt_in1_at_0 = 0.5 / LS624_F(0, 1);
- context->dt_in2_at_0 = 0.5 / LS624_F(0, 2);
-}
-
-static const discrete_custom_info mario_custom_run_info =
-{
- DISCRETE_CUSTOM_MODULE( mario_custom_run, struct mario_custom_run_context),
- NULL
-};
-
-static const discrete_mixer_desc mario_mixer =
+ static const discrete_mixer_desc mario_mixer =
{
DISC_MIXER_IS_RESISTOR,
{MR_R20, MR_R19, MR_R41, MR_R40},
{0}, {0}, 0, 0, MR_C31, MR_C32, 0, 1 /* r_node{}, c{}, rI, rF, cF, cAmp, vRef, gain*/
};
-#define LS629_FREQ_R_IN RES_K(95)
+#define LS629_FREQ_R_IN RES_K(90)
static DISCRETE_SOUND_START(mario)
- /************************************************/
- /* Input register mapping for mario */
- /************************************************/
+ /************************************************
+ * Input register mapping for mario
+ ************************************************/
/* DISCRETE_INPUT_DATA */
- DISCRETE_INPUT_NOT(DS_SOUND7_INV)
+ DISCRETE_INPUT_NOT(DS_SOUND7_INV) /* IC 7L, pin 8 */
- /************************************************/
- /* SOUND0 */
- /************************************************/
+ /************************************************
+ * SOUND0
+ ************************************************/
DISCRETE_TASK_START(1)
- DISCRETE_INPUT_PULSE(DS_SOUND0_INV, 1)
- DISCRETE_LS123(NODE_10, DS_SOUND0_INV, MR_R17, MR_C14)
- DISCRETE_RCFILTER(NODE_11, NODE_10, MR_R6, MR_C3 )
-#if (USE_LS629)
- DISCRETE_74LS629(NODE_12, /* IC 1J, pin 10 */
+ DISCRETE_INPUT_PULSE(DS_SOUND0_INV, 1) /* IC 4C, pin 15 */
+ DISCRETE_LS123(NODE_10, /* IC 2H, pin 13 */
+ DS_SOUND0_INV, /* IC 2H, pin 2 */
+ MR_R17, MR_C14)
+
+/* Breadboarded measurements IC 1J, pin 10
+ D.R. Oct 2010
+ V Hz
+ 0.115 14470
+ 0.250 15190
+ 0.500 14980
+ 0.750 18150
+ 1.000 21690
+ 2.000 38790
+ 3.000 58580
+ 4.000 79890
+*/
+
+/* Breadboarded measurements IC 2J, pin 10
+ D.R. Oct 2010
+ V Hz
+ 0.116 2458
+ 0.250 2593
+ 0.500 2540
+ 0.750 3081
+ 1.000 3676
+ 2.000 6590
+ 3.000 9974
+ 4.000 13620
+*/
+
+ /* covert logic to measured voltage */
+ DISCRETE_XTIME_BUFFER(NODE_11, /* IC 1H, pin 10 */
+ NODE_10, /* IC 1H, pin 11 */
+ 0.115, 4.0) /* measured Low/High */
+ /* work out cap charge of RC in parallel with 2 74LS629s */
+ DISCRETE_RCFILTER(NODE_12, NODE_11, RES_3_PARALLEL(MR_R6, LS629_FREQ_R_IN, LS629_FREQ_R_IN), MR_C3 )
+ /* work out voltage drop of RC in parallel with 2 74LS629s */
+ DISCRETE_GAIN(NODE_13, NODE_12, RES_VOLTAGE_DIVIDER(MR_R6, RES_2_PARALLEL(LS629_FREQ_R_IN, LS629_FREQ_R_IN)))
+ DISCRETE_74LS624(NODE_14, /* IC 1J, pin 10 */
1, /* ENAB */
- NODE_11, 5, /* VMOD, VRNG */
- MR_C6, RES_2_PARALLEL(MR_R6, LS629_FREQ_R_IN), /* C, R_FREQ_IN */
- DISC_LS624_OUT_SQUARE)
- DISCRETE_74LS629(NODE_13, /* IC 2J, pin 10 */
+ NODE_13, 5, /* VMOD - IC 1J, pin 1; VRNG */
+ MR_C6, 0, 0, 0, /* C; R_FREQ_IN; C_FREQ_IN; R_RNG_IN */
+ DISC_LS624_OUT_LOGIC_X)
+ DISCRETE_74LS624(NODE_15, /* IC 2J, pin 10 */
1, /* ENAB */
- NODE_11, 5, /* VMOD, VRNG */
- MR_C17, RES_2_PARALLEL(MR_R6, LS629_FREQ_R_IN), /* C, R_FREQ_IN */
- DISC_LS624_OUT_SQUARE)
- DISCRETE_LOGIC_XOR(NODE_14, /* IC 1K, pin 6 */
- NODE_12, NODE_13)
- DISCRETE_SWITCH(DS_OUT_SOUND0, /* IC 2K, pin 3 */
- NODE_10, NODE_14, /* ENAB, SWITCH */
- 0, TTL_HIGH) /* INP0,INP1 */
-#else
- DISCRETE_CUSTOM7(DS_OUT_SOUND0, NODE_10, NODE_11, NODE_11, MR_C6, MR_C17,
- MR_MIXER_RPAR, MR_C31, &mario_custom_run_info)
-#endif
+ NODE_13, 5, /* VMOD - IC 2J, pin 1; VRNG */
+ MR_C17, 0, 0, 0, /* C; R_FREQ_IN; C_FREQ_IN; R_RNG_IN */
+ DISC_LS624_OUT_LOGIC_X)
+ DISCRETE_XTIME_XOR(NODE_16, /* IC IC 1K, pin 6 */
+ NODE_14, NODE_15, /* IC 1K, pin 5; pin 4 */
+ 0, 0) /* use x_time logic */
+ DISCRETE_XTIME_AND(DS_OUT_SOUND0, /* IC 2K, pin 6 */
+ NODE_10, NODE_16, /* IC 2K, pin 5; pin 4 */
+ 0.066, 3.8) /* LOW; HIGH (varies due to load 3.7 - 4.4) */
DISCRETE_TASK_END()
- /************************************************/
- /* SOUND1 */
- /************************************************/
+ /************************************************
+ * SOUND1
+ ************************************************/
DISCRETE_TASK_START(1)
- DISCRETE_INPUT_PULSE(DS_SOUND1_INV, 1)
- DISCRETE_LS123(NODE_20, DS_SOUND1_INV, MR_R18, MR_C15)
- DISCRETE_RCFILTER(NODE_21, NODE_20, MR_R7, MR_C4 )
-#if (USE_LS629)
- DISCRETE_74LS629(NODE_22, /* IC 1J, pin 7 */
+ DISCRETE_INPUT_PULSE(DS_SOUND1_INV, 1) /* IC 4C, pin 14 */
+ DISCRETE_LS123(NODE_20, /* IC 2H, pin 5 */
+ DS_SOUND1_INV, /* IC 2H, pin 10 */
+ MR_R18, MR_C15)
+
+/* Breadboarded measurements IC 1J, pin 7
+ D.R. Oct 2010
+ V Hz
+ 0.116 1380
+ 0.250 1448
+ 0.500 1419
+ 0.750 1717
+ 1.000 2053
+ 2.000 3677
+ 3.000 5561
+ 4.000 7610
+*/
+
+/* Breadboarded measurements IC 2J, pin 7
+ D.R. Oct 2010
+ V Hz
+ 0.112 8030
+ 0.250 8490
+ 0.500 8326
+ 0.750 10030
+ 1.000 12000
+ 2.000 21460
+ 3.000 32540
+ 4.000 44300
+*/
+
+ /* covert logic to measured voltage */
+ DISCRETE_XTIME_BUFFER(NODE_21, /* IC 1H, pin 8 */
+ NODE_20, /* IC 1H, pin 9 */
+ 0.115, 4.0) /* measured Low/High */
+ /* work out cap charge of RC in parallel with 2 74LS629s */
+ DISCRETE_RCFILTER(NODE_22, NODE_21, RES_3_PARALLEL(MR_R7, LS629_FREQ_R_IN, LS629_FREQ_R_IN), MR_C4 )
+ /* work out voltage drop of RC in parallel with 2 74LS629s */
+ DISCRETE_GAIN(NODE_23, NODE_22, RES_VOLTAGE_DIVIDER(MR_R7, RES_2_PARALLEL(LS629_FREQ_R_IN, LS629_FREQ_R_IN)))
+ DISCRETE_74LS624(NODE_24, /* IC 1J, pin 7 */
1, /* ENAB */
- NODE_21, 5, /* VMOD, VRNG */
- MR_C5, RES_2_PARALLEL(MR_R7, LS629_FREQ_R_IN), /* C, R_FREQ_IN */
- DISC_LS624_OUT_SQUARE)
- DISCRETE_74LS629(NODE_23, /* IC 2J, pin 7 */
+ NODE_23, 5, /* VMOD, VRNG */
+ MR_C5, 0, 0, 0, /* C; R_FREQ_IN; C_FREQ_IN; R_RNG_IN */
+ DISC_LS624_OUT_LOGIC_X)
+ DISCRETE_74LS624(NODE_25, /* IC 2J, pin 7 */
1, /* ENAB */
- NODE_21, 5, /* VMOD, VRNG */
- MR_C16, RES_2_PARALLEL(MR_R7, LS629_FREQ_R_IN), /* C, R_FREQ_IN */
- DISC_LS624_OUT_SQUARE)
- DISCRETE_LOGIC_XOR(NODE_24, /* IC 1K, pin 3 */
- NODE_22, NODE_23)
- DISCRETE_SWITCH(DS_OUT_SOUND1, /* IC 2K, pin 3 */
- NODE_20, NODE_24, /* ENAB, SWITCH */
- 0, TTL_HIGH) /* INP0,INP1 */
-#else
- DISCRETE_CUSTOM7(DS_OUT_SOUND1, NODE_20, NODE_21, NODE_21, MR_C5, MR_C16,
- MR_MIXER_RPAR, MR_C31, &mario_custom_run_info)
-#endif
+ NODE_23, 5, /* VMOD, VRNG */
+ MR_C16, 0, 0, 0, /* C; R_FREQ_IN; C_FREQ_IN; R_RNG_IN */
+ DISC_LS624_OUT_LOGIC_X)
+ DISCRETE_XTIME_XOR(NODE_26, /* IC IC 1K, pin 3 */
+ NODE_24, NODE_25, /* IC 1K, pin 1; pin 2 */
+ 0, 0) /* use x_time logic */
+ DISCRETE_XTIME_AND(DS_OUT_SOUND1, /* IC 2K, pin 3 */
+ NODE_20, NODE_26, /* IC 2K, pin 2; pin 1 */
+ 0.066, 3.8) /* LOW; HIGH (varies due to load 3.7 - 4.4) */
DISCRETE_TASK_END()
- /************************************************/
- /* SOUND7 */
- /************************************************/
+ /************************************************
+ * SOUND7
+ ************************************************/
DISCRETE_TASK_START(1)
- DISCRETE_COUNTER(NODE_100,1,0,NODE_118,0,0xFFFF,DISC_COUNT_UP,0,DISC_CLK_BY_COUNT)
-
- DISCRETE_BIT_DECODE(NODE_102, NODE_100, 3, 1) //LS157 2B
- DISCRETE_BIT_DECODE(NODE_104, NODE_100, 11, TTL_HIGH) //LS157 3B
-
- DISCRETE_LS123(NODE_110, DS_SOUND7_INV, MR_R61, MR_C41)
- DISCRETE_TRANSFORM2(NODE_111, NODE_110, TTL_HIGH, "0!1*")
- DISCRETE_RCFILTER(NODE_112, NODE_111, MR_R65, MR_C44)
-#if (USE_LS629)
- DISCRETE_74LS629(NODE_113, /* IC 4K, pin 10 */
+ DISCRETE_COUNTER(NODE_100, /* IC 3H */
+ 1, 0, /* ENAB; RESET */
+ NODE_118, /* CLK - IC 3H, pin 10 */
+ 0, 0x3FFF, DISC_COUNT_UP, 0, DISC_CLK_BY_COUNT | DISC_OUT_HAS_XTIME)
+ DISCRETE_BIT_DECODE(NODE_102, /* IC 3H, pin 7 */
+ NODE_100, 3, 0) /* output x_time logic */
+ DISCRETE_BIT_DECODE(NODE_104, /* IC 3H, pin 1 */
+ NODE_100, 11, 0) /* output x_time logic */
+
+ DISCRETE_LS123(NODE_110, /* IC 4L, pin 13 */
+ DS_SOUND7_INV, /* IC 4L, pin 2 */
+ MR_R61, MR_C41)
+ DISCRETE_XTIME_INVERTER(NODE_111, /* IC 4J, pin 8 */
+ NODE_110, /* IC 4J, pin 9 */
+ 0.151, 4.14) /* measured Low/High */
+
+/* Breadboarded measurements IC 4K, pin 10
+ D.R. Oct 2010
+ V Hz
+ 0.151 3139
+ 0.25 2883
+ 0.5 2820
+ 0.75 3336
+ 1 3805
+ 2 6498
+ 3 9796
+ 4 13440
+ 4.14 13980
+*/
+
+ DISCRETE_74LS624(NODE_113, /* IC 4K, pin 10 */
1, /* ENAB */
- NODE_112, 5, /* VMOD, VRNG */
- MR_C40, MR_R65, /* C, R_FREQ_IN */
- DISC_LS624_OUT_LOGIC)
-#else
- DISCRETE_74LS624(NODE_113, NODE_112, RUN_VCO_VOLTAGE /*VSS*/, MR_C40, DISC_LS624_OUT_LOGIC)
-#endif
-
- DISCRETE_LOGIC_XOR(NODE_115, NODE_102, NODE_113)
-
- DISCRETE_RCFILTER(NODE_117, NODE_104, MR_R64, MR_C43)
-#if (USE_LS629)
- DISCRETE_74LS629(NODE_118, /* IC 4K, pin 7 */
+ NODE_111, 5, /* VMOD - IC 4K, pin 1; VRNG */
+ MR_C40, MR_R65, MR_C44, 0, /* C; R_FREQ_IN; C_FREQ_IN; R_RNG_IN */
+ DISC_LS624_OUT_LOGIC_X)
+
+ DISCRETE_XTIME_XOR(NODE_115, /* IC 6N, pin 3 */
+ NODE_113, NODE_102, /* IC 6N, pin 1; pin 2 */
+ 0, 0) /* use x_time logic */
+
+/* Breadboarded measurements IC 4K, pin 7
+ D.R. Oct 2010
+ V Hz
+ 0.135 14450
+ 0.25 13320
+ 0.5 12980
+ 0.75 15150
+ 1 17270
+ 2 28230
+ 3 41910
+ 4 56950
+ 4.15 59400
+*/
+
+ DISCRETE_XTIME_INVERTER(NODE_117, /* IC 4J, pin 4 */
+ NODE_104, /* IC 4J, pin 3 */
+ 0.135, 4.15) /* measured Low/High */
+ DISCRETE_74LS624(NODE_118, /* IC 4K, pin 7 */
1, /* ENAB */
- NODE_117, 5, /* VMOD, VRNG */
- MR_C39, MR_R64, /* C, R_FREQ_IN */
- DISC_LS624_OUT_LOGIC)
-#else
- DISCRETE_74LS624(NODE_118, NODE_117, RUN_VCO_VOLTAGE /*VSS*/, MR_C39, DISC_LS624_OUT_COUNT_F)
-#endif
- DISCRETE_LOGIC_AND(NODE_120, NODE_115, NODE_110)
- DISCRETE_MULTIPLY(DS_OUT_SOUND7, NODE_120, TTL_HIGH)
+ NODE_117, 5, /* VMOD - IC 4K, pin 2; VRNG */
+ MR_C39, MR_R64, MR_C43, 0, /* C; R_FREQ_IN; C_FREQ_IN; R_RNG_IN */
+ DISC_LS624_OUT_LOGIC_X)
+
+ DISCRETE_XTIME_AND(DS_OUT_SOUND7, /* IC 2K, pin 11 */
+ NODE_110, NODE_115, /* IC 2K, pin 12; pin 13 */
+ 0.066, 4.07) /* LOW; HIGH (varies due to load 4.07 is lowest) */
DISCRETE_TASK_END()
- /************************************************/
- /* DAC */
- /************************************************/
+ /************************************************
+ * DAC
+ ************************************************/
/* following the resistor DAC are two opamps. The first is a 1:1 amplifier, the second
* is a filter circuit. Simulation in LTSPICE shows, that the following is equivalent:
@@ -423,21 +358,34 @@ static DISCRETE_SOUND_START(mario)
DISCRETE_TASK_START(1)
DISCRETE_INPUT_BUFFER(DS_DAC, 0)
- DISCRETE_MULTIPLY(NODE_170, DS_DAC, TTL_HIGH/256.0)
- DISCRETE_RCFILTER(DS_OUT_DAC, NODE_170, RES_K(750), CAP_P(200))
+ DISCRETE_MULTIPLY(NODE_170, DS_DAC, TTL_HIGH / 256.0) /* MXR1 */
+ /* this stage reduces the gain of the DAC by 50%, so yes the volume is much lower then the walk sound */
+ DISCRETE_OP_AMP(NODE_171, /* IC 3M, pin 5 */
+ 1, /* ENAB */
+ NODE_170, 5, /* IN0 - IC 3M, pin 6; IN1 - IC 3M, pin 1 */
+ &mario_dac_amp)
+ /* This provides a close simulation of the IC 3M, pin 10 filter circuit */
+ /* The Measured and SPICEd low freq gain is 1, it then has a high frequency
+ * drop close to the following RC filter. */
+ DISCRETE_RCFILTER_VREF(DS_OUT_DAC, NODE_171, RES_K(750), CAP_P(180), 2.5)
DISCRETE_TASK_END()
- /************************************************/
- /* MIXER */
- /************************************************/
+ /************************************************
+ * MIXER
+ ************************************************/
DISCRETE_TASK_START(2)
DISCRETE_MIXER4(NODE_297,
1, /* ENAB */
DS_OUT_SOUND0, DS_OUT_SOUND1, DS_OUT_SOUND7, DS_OUT_DAC,
&mario_mixer)
- DISCRETE_OUTPUT(NODE_297, 32767.0/1.7)
+ /* approx -0.625V to 0.980V when playing, but turn on sound peaks at 2.38V */
+ /* we will set the full wav range to 1.19V which will cause clipping on the turn on
+ * sound. The real game would do this when the volume is turned up too.
+ * Reducing MAME's master volume to 50% will provide full unclipped volume.
+ */
+ DISCRETE_OUTPUT(NODE_297, 32767.0/1.19)
DISCRETE_TASK_END()
DISCRETE_SOUND_END
@@ -496,12 +444,12 @@ static SOUND_RESET( mario )
#endif
/* FIXME: convert to latch8 */
- soundlatch_clear_w(space,0,0);
- soundlatch2_clear_w(space,0,0);
- soundlatch3_clear_w(space,0,0);
- soundlatch4_clear_w(space,0,0);
- I8035_P1_W(space,0x00); /* Input port */
- I8035_P2_W(space,0xff); /* Port is in high impedance state after reset */
+ soundlatch_clear_w(space, 0, 0);
+ soundlatch2_clear_w(space, 0, 0);
+ soundlatch3_clear_w(space, 0, 0);
+ soundlatch4_clear_w(space, 0, 0);
+ I8035_P1_W(space, 0x00); /* Input port */
+ I8035_P2_W(space, 0xff); /* Port is in high impedance state after reset */
state->last = 0;
}
@@ -524,12 +472,12 @@ static READ8_HANDLER( mario_sh_p2_r )
static READ8_HANDLER( mario_sh_t0_r )
{
- return I8035_T_R(space,0);
+ return I8035_T_R(space, 0);
}
static READ8_HANDLER( mario_sh_t1_r )
{
- return I8035_T_R(space,1);
+ return I8035_T_R(space, 1);
}
static READ8_HANDLER( mario_sh_tune_r )
@@ -539,24 +487,24 @@ static READ8_HANDLER( mario_sh_tune_r )
UINT8 p2 = I8035_P2_R(space);
if ((p2 >> 7) & 1)
- return soundlatch_r(space,offset);
+ return soundlatch_r(space, offset);
else
- return (SND[(0x1000 + (p2 & 0x0f)*256+offset) & mask]);
+ return (SND[(0x1000 + (p2 & 0x0f) * 256 + offset) & mask]);
}
static WRITE8_DEVICE_HANDLER( mario_sh_sound_w )
{
- discrete_sound_w(device,DS_DAC,data);
+ discrete_sound_w(device, DS_DAC, data);
}
static WRITE8_HANDLER( mario_sh_p1_w )
{
- I8035_P1_W(space,data);
+ I8035_P1_W(space, data);
}
static WRITE8_HANDLER( mario_sh_p2_w )
{
- I8035_P2_W(space,data);
+ I8035_P2_W(space, data);
}
/****************************************************************
@@ -572,7 +520,7 @@ WRITE8_HANDLER( masao_sh_irqtrigger_w )
if (state->last == 1 && data == 0)
{
/* setting bit 0 high then low triggers IRQ on the sound CPU */
- cputag_set_input_line_and_vector(space->machine, "audiocpu",0,HOLD_LINE,0xff);
+ cputag_set_input_line_and_vector(space->machine, "audiocpu", 0, HOLD_LINE, 0xff);
}
state->last = data;
@@ -580,7 +528,7 @@ WRITE8_HANDLER( masao_sh_irqtrigger_w )
WRITE8_HANDLER( mario_sh_tuneselect_w )
{
- soundlatch_w(space,offset,data);
+ soundlatch_w(space, offset, data);
}
/* Sound 0 and 1 are pulsed !*/
@@ -588,13 +536,13 @@ WRITE8_HANDLER( mario_sh_tuneselect_w )
/* Mario running sample */
WRITE8_DEVICE_HANDLER( mario_sh1_w )
{
- discrete_sound_w(device,DS_SOUND0_INP, 0);
+ discrete_sound_w(device, DS_SOUND0_INP, 0);
}
/* Luigi running sample */
WRITE8_DEVICE_HANDLER( mario_sh2_w )
{
- discrete_sound_w(device,DS_SOUND1_INP, 0);
+ discrete_sound_w(device, DS_SOUND1_INP, 0);
}
/* Misc samples */
@@ -611,25 +559,25 @@ WRITE8_HANDLER( mario_sh3_w )
cputag_set_input_line(space->machine, "audiocpu",0,CLEAR_LINE);
break;
case 1: /* get coin */
- I8035_T_W_AH(space,0,data & 1);
+ I8035_T_W_AH(space, 0,data & 1);
break;
case 2: /* ice */
- I8035_T_W_AH(space,1,data & 1);
+ I8035_T_W_AH(space, 1, data & 1);
break;
case 3: /* crab */
- I8035_P1_W_AH(space,0,data & 1);
+ I8035_P1_W_AH(space, 0, data & 1);
break;
case 4: /* turtle */
- I8035_P1_W_AH(space,1,data & 1);
+ I8035_P1_W_AH(space, 1, data & 1);
break;
case 5: /* fly */
- I8035_P1_W_AH(space,2,data & 1);
+ I8035_P1_W_AH(space, 2, data & 1);
break;
case 6: /* coin */
- I8035_P1_W_AH(space,3,data & 1);
+ I8035_P1_W_AH(space, 3, data & 1);
break;
case 7: /* skid */
- discrete_sound_w(space->machine->device("discrete"),DS_SOUND7_INP,data & 1);
+ discrete_sound_w(space->machine->device("discrete"), DS_SOUND7_INP, data & 1);
break;
}
}
@@ -699,13 +647,13 @@ MACHINE_CONFIG_FRAGMENT( mario_audio )
MDRV_SPEAKER_STANDARD_MONO("mono")
MDRV_SOUND_ADD("discrete", DISCRETE, 0)
MDRV_SOUND_CONFIG_DISCRETE(mario)
- MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.5)
+ MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1)
MACHINE_CONFIG_END
MACHINE_CONFIG_FRAGMENT( masao_audio )
- MDRV_CPU_ADD("audiocpu", Z80,24576000/16) /* ???? */
+ MDRV_CPU_ADD("audiocpu", Z80, 24576000/16) /* ???? */
MDRV_CPU_PROGRAM_MAP(masao_sound_map)
MDRV_SOUND_START(mario)
diff --git a/src/mame/audio/skyraid.c b/src/mame/audio/skyraid.c
index 7f35c3fee61..9162c93cb0d 100644
--- a/src/mame/audio/skyraid.c
+++ b/src/mame/audio/skyraid.c
@@ -151,9 +151,9 @@ struct skyraid_missle_custom_charge_context
/* the high charge is clamped by the diode to 0.7V above the 5V line */
#define SKYRAID_MISSLE_CHARGE_PLUS (5.0 + 0.7)
-static DISCRETE_STEP( skyraid_missle_custom_charge )
+DISCRETE_STEP( skyraid_missle_custom_charge )
{
- struct skyraid_missle_custom_charge_context *context = (struct skyraid_missle_custom_charge_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(skyraid_missle_custom_charge)
int in_1 = (SKYRAID_MISSLE_CUSTOM_IN1 == 0) ? 0 : 1;
@@ -163,9 +163,9 @@ static DISCRETE_STEP( skyraid_missle_custom_charge )
node->output[0] = SKYRAID_MISSLE_CHARGE_PLUS - context->v_cap;
}
-static DISCRETE_RESET( skyraid_missle_custom_charge )
+DISCRETE_RESET( skyraid_missle_custom_charge )
{
- struct skyraid_missle_custom_charge_context *context = (struct skyraid_missle_custom_charge_context *)node->context;
+ DISCRETE_DECLARE_CONTEXT(skyraid_missle_custom_charge)
/* everything is based on the input to the O.C. inverter */