mirror of
https://github.com/holub/mame
synced 2025-06-03 19:36:26 +03:00
Discrete cleanups and fixed discrete logging.
This commit is contained in:
parent
39ea677641
commit
384422ee09
File diff suppressed because it is too large
Load Diff
@ -39,22 +39,22 @@ struct dss_filter2_context
|
||||
|
||||
struct dst_op_amp_filt_context
|
||||
{
|
||||
int type; // What kind of filter
|
||||
int is_norton; // 1 = Norton op-amps
|
||||
int type; /* What kind of filter */
|
||||
int is_norton; /* 1 = Norton op-amps */
|
||||
double vRef;
|
||||
double vP;
|
||||
double vN;
|
||||
double rTotal; // All input resistance in parallel.
|
||||
double iFixed; // Current supplied by r3 & r4 if used.
|
||||
double rTotal; /* All input resistance in parallel. */
|
||||
double iFixed; /* Current supplied by r3 & r4 if used. */
|
||||
double exponentC1;
|
||||
double exponentC2;
|
||||
double exponentC3;
|
||||
double rRatio; // divide ratio of resistance network
|
||||
double vC1; // Charge on C1
|
||||
double vC1b; // Charge on C1, part of C1 charge if needed
|
||||
double vC2; // Charge on C2
|
||||
double vC3; // Charge on C2
|
||||
double gain; // Gain of the filter
|
||||
double rRatio; /* divide ratio of resistance network */
|
||||
double vC1; /* Charge on C1 */
|
||||
double vC1b; /* Charge on C1, part of C1 charge if needed */
|
||||
double vC2; /* Charge on C2 */
|
||||
double vC3; /* Charge on C2 */
|
||||
double gain; /* Gain of the filter */
|
||||
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 */
|
||||
double a1,a2; /* digital filter coefficients, denominator */
|
||||
@ -64,18 +64,18 @@ struct dst_op_amp_filt_context
|
||||
struct dst_rcdisc_context
|
||||
{
|
||||
int state;
|
||||
double t; // time
|
||||
double f; // RCINTEGRATE
|
||||
double R1; // RCINTEGRATE
|
||||
double R2; // RCINTEGRATE
|
||||
double R3; // RCINTEGRATE
|
||||
double C; // RCINTEGRATE
|
||||
double vCap; // RCDISC_MOD
|
||||
double vCE; // RCINTEGRATE
|
||||
double t; /* time */
|
||||
double f; /* RCINTEGRATE */
|
||||
double R1; /* RCINTEGRATE */
|
||||
double R2; /* RCINTEGRATE */
|
||||
double R3; /* RCINTEGRATE */
|
||||
double C; /* RCINTEGRATE */
|
||||
double vCap; /* RCDISC_MOD */
|
||||
double vCE; /* RCINTEGRATE */
|
||||
double exponent0;
|
||||
double exponent1;
|
||||
double exp_exponent0;// RCINTEGRATE
|
||||
double exp_exponent1;// RCINTEGRATE
|
||||
double exp_exponent0;/* RCINTEGRATE */
|
||||
double exp_exponent1;/* RCINTEGRATE */
|
||||
};
|
||||
|
||||
struct dst_rcdisc4_context
|
||||
@ -109,7 +109,7 @@ struct dst_rcfilter_sw_context
|
||||
* input[4] - Voltage reference. Usually 0V.
|
||||
*
|
||||
************************************************************************/
|
||||
#define DST_CRFILTER__ENABLE (*(node->input[0]))
|
||||
#define DST_CRFILTER__ENABLE (*(node->input[0]))
|
||||
#define DST_CRFILTER__IN (*(node->input[1]))
|
||||
#define DST_CRFILTER__R (*(node->input[2]))
|
||||
#define DST_CRFILTER__C (*(node->input[3]))
|
||||
@ -135,8 +135,8 @@ static void dst_crfilter_reset(node_description *node)
|
||||
struct dst_rcfilter_context *context = node->context;
|
||||
|
||||
context->exponent = -1.0 / (DST_CRFILTER__R * DST_CRFILTER__C * discrete_current_context->sample_rate);
|
||||
context->exponent = 1.0 - exp(context->exponent);
|
||||
context->vCap = 0;
|
||||
context->exponent = 1.0 - exp(context->exponent);
|
||||
context->vCap = 0;
|
||||
node->output[0] = DST_CRFILTER__IN;
|
||||
}
|
||||
|
||||
@ -186,6 +186,7 @@ static void calculate_filter1_coefficients(double fc, double type,
|
||||
static void dst_filter1_step(node_description *node)
|
||||
{
|
||||
struct dss_filter1_context *context = node->context;
|
||||
\
|
||||
double gain = 1.0;
|
||||
|
||||
if (DST_FILTER1__ENABLE == 0.0)
|
||||
@ -204,7 +205,7 @@ static void dst_filter1_reset(node_description *node)
|
||||
struct dss_filter1_context *context = node->context;
|
||||
|
||||
calculate_filter1_coefficients(DST_FILTER1__FREQ, DST_FILTER1__TYPE, &context->a1, &context->b0, &context->b1);
|
||||
node->output[0]=0;
|
||||
node->output[0] = 0;
|
||||
}
|
||||
|
||||
|
||||
@ -237,29 +238,29 @@ static void calculate_filter2_coefficients(double fc, double d, double type,
|
||||
|
||||
/* calculate digital filter coefficents */
|
||||
/*w = 2.0*M_PI*fc; no pre-warping */
|
||||
w = discrete_current_context->sample_rate*2.0*tan(M_PI*fc/discrete_current_context->sample_rate); /* pre-warping */
|
||||
w_squared = w*w;
|
||||
w = discrete_current_context->sample_rate * 2.0 * tan(M_PI * fc / discrete_current_context->sample_rate); /* pre-warping */
|
||||
w_squared = w * w;
|
||||
|
||||
den = two_over_T_squared + d*w*two_over_T + w_squared;
|
||||
|
||||
*a1 = 2.0*(-two_over_T_squared + w_squared)/den;
|
||||
*a2 = (two_over_T_squared - d*w*two_over_T + w_squared)/den;
|
||||
*a1 = 2.0 * (-two_over_T_squared + w_squared) / den;
|
||||
*a2 = (two_over_T_squared - d * w * two_over_T + w_squared) / den;
|
||||
|
||||
if (type == DISC_FILTER_LOWPASS)
|
||||
{
|
||||
*b0 = *b2 = w_squared/den;
|
||||
*b1 = 2.0*(*b0);
|
||||
*b1 = 2.0 * (*b0);
|
||||
}
|
||||
else if (type == DISC_FILTER_BANDPASS)
|
||||
{
|
||||
*b0 = d*w*two_over_T/den;
|
||||
*b0 = d * w * two_over_T / den;
|
||||
*b1 = 0.0;
|
||||
*b2 = -(*b0);
|
||||
}
|
||||
else if (type == DISC_FILTER_HIGHPASS)
|
||||
{
|
||||
*b0 = *b2 = two_over_T_squared/den;
|
||||
*b1 = -2.0*(*b0);
|
||||
*b0 = *b2 = two_over_T_squared / den;
|
||||
*b1 = -2.0 * (*b0);
|
||||
}
|
||||
else
|
||||
{
|
||||
@ -270,6 +271,7 @@ static void calculate_filter2_coefficients(double fc, double d, double type,
|
||||
static void dst_filter2_step(node_description *node)
|
||||
{
|
||||
struct dss_filter2_context *context = node->context;
|
||||
|
||||
double gain = 1.0;
|
||||
|
||||
if (DST_FILTER2__ENABLE == 0.0)
|
||||
@ -277,8 +279,8 @@ static void dst_filter2_step(node_description *node)
|
||||
gain = 0.0;
|
||||
}
|
||||
|
||||
node->output[0] = -context->a1*context->y1 - context->a2*context->y2 +
|
||||
context->b0*gain*DST_FILTER2__IN + context->b1*context->x1 + context->b2*context->x2;
|
||||
node->output[0] = -context->a1 * context->y1 - context->a2 * context->y2 +
|
||||
context->b0 * gain * DST_FILTER2__IN + context->b1 * context->x1 + context->b2 * context->x2;
|
||||
|
||||
context->x2 = context->x1;
|
||||
context->x1 = gain * DST_FILTER2__IN;
|
||||
@ -293,7 +295,7 @@ static void dst_filter2_reset(node_description *node)
|
||||
calculate_filter2_coefficients(DST_FILTER2__FREQ, DST_FILTER2__DAMP, DST_FILTER2__TYPE,
|
||||
&context->a1, &context->a2,
|
||||
&context->b0, &context->b1, &context->b2);
|
||||
node->output[0]=0;
|
||||
node->output[0] = 0;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
@ -315,6 +317,7 @@ static void dst_filter2_reset(node_description *node)
|
||||
static void dst_sallen_key_step(node_description *node)
|
||||
{
|
||||
struct dss_filter2_context *context = node->context;
|
||||
|
||||
double gain = 1.0;
|
||||
|
||||
if (DST_SALLEN_KEY__ENABLE == 0.0)
|
||||
@ -322,8 +325,8 @@ static void dst_sallen_key_step(node_description *node)
|
||||
gain = 0.0;
|
||||
}
|
||||
|
||||
node->output[0] = -context->a1*context->y1 - context->a2*context->y2 +
|
||||
context->b0*gain*DST_SALLEN_KEY__INP0 + context->b1*context->x1 + context->b2*context->x2;
|
||||
node->output[0] = -context->a1 * context->y1 - context->a2 * context->y2 +
|
||||
context->b0 * gain * DST_SALLEN_KEY__INP0 + context->b1 * context->x1 + context->b2 * context->x2;
|
||||
|
||||
context->x2 = context->x1;
|
||||
context->x1 = gain * DST_SALLEN_KEY__INP0;
|
||||
@ -333,8 +336,9 @@ static void dst_sallen_key_step(node_description *node)
|
||||
|
||||
static void dst_sallen_key_reset(node_description *node)
|
||||
{
|
||||
struct dss_filter2_context *context = node->context;
|
||||
const discrete_op_amp_filt_info *info = node->custom;
|
||||
struct dss_filter2_context *context = node->context;
|
||||
const discrete_op_amp_filt_info *info = node->custom;
|
||||
|
||||
double freq, q;
|
||||
|
||||
switch ((int) DST_SALLEN_KEY__TYPE)
|
||||
@ -350,7 +354,7 @@ static void dst_sallen_key_reset(node_description *node)
|
||||
calculate_filter2_coefficients(freq, 1.0 / q, DISC_FILTER_LOWPASS,
|
||||
&context->a1, &context->a2,
|
||||
&context->b0, &context->b1, &context->b2);
|
||||
node->output[0]=0;
|
||||
node->output[0] = 0;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
@ -373,10 +377,10 @@ static void dst_sallen_key_reset(node_description *node)
|
||||
|
||||
static void dst_op_amp_filt_step(node_description *node)
|
||||
{
|
||||
const discrete_op_amp_filt_info *info = node->custom;
|
||||
struct dst_op_amp_filt_context *context = node->context;
|
||||
const discrete_op_amp_filt_info *info = node->custom;
|
||||
struct dst_op_amp_filt_context *context = node->context;
|
||||
|
||||
double i, v=0;
|
||||
double i, v = 0;
|
||||
|
||||
if (DST_OP_AMP_FILT__ENABLE)
|
||||
{
|
||||
@ -388,7 +392,7 @@ static void dst_op_amp_filt_step(node_description *node)
|
||||
else
|
||||
{
|
||||
/* Millman the input voltages. */
|
||||
i = context->iFixed;
|
||||
i = context->iFixed;
|
||||
i += (DST_OP_AMP_FILT__INP1 - context->vRef) / info->r1;
|
||||
if (info->r2 != 0)
|
||||
i += (DST_OP_AMP_FILT__INP2 - context->vRef) / info->r2;
|
||||
@ -433,8 +437,8 @@ static void dst_op_amp_filt_step(node_description *node)
|
||||
|
||||
case DISC_OP_AMP_FILTER_IS_BAND_PASS_1M:
|
||||
case DISC_OP_AMP_FILTER_IS_BAND_PASS_1M | DISC_OP_AMP_IS_NORTON:
|
||||
node->output[0] = -context->a1*context->y1 - context->a2*context->y2 +
|
||||
context->b0*v + context->b1*context->x1 + context->b2*context->x2 +
|
||||
node->output[0] = -context->a1 * context->y1 - context->a2 * context->y2 +
|
||||
context->b0 * v + context->b1 * context->x1 + context->b2 * context->x2 +
|
||||
context->vRef;
|
||||
context->x2 = context->x1;
|
||||
context->x1 = v;
|
||||
@ -456,8 +460,8 @@ static void dst_op_amp_filt_step(node_description *node)
|
||||
|
||||
static void dst_op_amp_filt_reset(node_description *node)
|
||||
{
|
||||
const discrete_op_amp_filt_info *info = node->custom;
|
||||
struct dst_op_amp_filt_context *context = node->context;
|
||||
const discrete_op_amp_filt_info *info = node->custom;
|
||||
struct dst_op_amp_filt_context *context = node->context;
|
||||
|
||||
/* 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;
|
||||
@ -485,7 +489,7 @@ static void dst_op_amp_filt_reset(node_description *node)
|
||||
context->vN = info->vN;
|
||||
|
||||
/* Work out the input resistance. It is all input and bias resistors in parallel. */
|
||||
context->rTotal = 1.0 / info->r1; // There has to be an R1. Otherwise the table is wrong.
|
||||
context->rTotal = 1.0 / info->r1; /* There has to be an R1. Otherwise the table is wrong. */
|
||||
if (info->r2 != 0) context->rTotal += 1.0 / info->r2;
|
||||
if (info->r3 != 0) context->rTotal += 1.0 / info->r3;
|
||||
context->rTotal = 1.0 / context->rTotal;
|
||||
@ -500,26 +504,26 @@ static void dst_op_amp_filt_reset(node_description *node)
|
||||
{
|
||||
case DISC_OP_AMP_FILTER_IS_LOW_PASS_1:
|
||||
context->exponentC1 = -1.0 / (info->rF * info->c1 * discrete_current_context->sample_rate);
|
||||
context->exponentC1 = 1.0 - exp(context->exponentC1);
|
||||
context->exponentC2 = 0;
|
||||
context->exponentC1 = 1.0 - exp(context->exponentC1);
|
||||
context->exponentC2 = 0;
|
||||
break;
|
||||
case DISC_OP_AMP_FILTER_IS_HIGH_PASS_1:
|
||||
context->exponentC1 = -1.0 / (context->rTotal * info->c1 * discrete_current_context->sample_rate);
|
||||
context->exponentC1 = 1.0 - exp(context->exponentC1);
|
||||
context->exponentC2 = 0;
|
||||
context->exponentC1 = 1.0 - exp(context->exponentC1);
|
||||
context->exponentC2 = 0;
|
||||
break;
|
||||
case DISC_OP_AMP_FILTER_IS_BAND_PASS_1:
|
||||
context->exponentC1 = -1.0 / (info->rF * info->c1 * discrete_current_context->sample_rate);
|
||||
context->exponentC1 = 1.0 - exp(context->exponentC1);
|
||||
context->exponentC1 = 1.0 - exp(context->exponentC1);
|
||||
context->exponentC2 = -1.0 / (context->rTotal * info->c2 * discrete_current_context->sample_rate);
|
||||
context->exponentC2 = 1.0 - exp(context->exponentC2);
|
||||
context->exponentC2 = 1.0 - exp(context->exponentC2);
|
||||
break;
|
||||
case DISC_OP_AMP_FILTER_IS_BAND_PASS_1M | DISC_OP_AMP_IS_NORTON:
|
||||
context->rTotal = 1.0 / (1.0 / info->r1 + 1.0 / info->r2);
|
||||
case DISC_OP_AMP_FILTER_IS_BAND_PASS_1M:
|
||||
{
|
||||
double fc = 1.0 / (2 * M_PI * sqrt(context->rTotal * info->rF * info->c1 * info->c2));
|
||||
double d = (info->c1 + info->c2) / sqrt(info->rF / context->rTotal * info->c1 * info->c2);
|
||||
double d = (info->c1 + info->c2) / sqrt(info->rF / context->rTotal * info->c1 * info->c2);
|
||||
double gain = -info->rF / context->rTotal * info->c2 / (info->c1 + info->c2);
|
||||
|
||||
calculate_filter2_coefficients(fc, d, DISC_FILTER_BANDPASS,
|
||||
@ -538,15 +542,15 @@ static void dst_op_amp_filt_reset(node_description *node)
|
||||
}
|
||||
case DISC_OP_AMP_FILTER_IS_BAND_PASS_0 | DISC_OP_AMP_IS_NORTON:
|
||||
context->exponentC1 = -1.0 / ((1.0 / (1.0 / info->r1 + 1.0 / (info->r2 + info->r3 + info->r4))) * info->c1 * discrete_current_context->sample_rate);
|
||||
context->exponentC1 = 1.0 - exp(context->exponentC1);
|
||||
context->exponentC1 = 1.0 - exp(context->exponentC1);
|
||||
context->exponentC2 = -1.0 / ((1.0 / (1.0 / (info->r1 + info->r2) + 1.0 / (info->r3 + info->r4))) * info->c2 * discrete_current_context->sample_rate);
|
||||
context->exponentC2 = 1.0 - exp(context->exponentC2);
|
||||
context->exponentC2 = 1.0 - exp(context->exponentC2);
|
||||
context->exponentC3 = -1.0 / ((info->r1 + info->r2 + info->r3 + info->r4) * info->c3 * discrete_current_context->sample_rate);
|
||||
context->exponentC3 = 1.0 - exp(context->exponentC3);
|
||||
context->exponentC3 = 1.0 - exp(context->exponentC3);
|
||||
break;
|
||||
case DISC_OP_AMP_FILTER_IS_HIGH_PASS_0 | DISC_OP_AMP_IS_NORTON:
|
||||
context->exponentC1 = -1.0 / (info->r1 * info->c1 * discrete_current_context->sample_rate);
|
||||
context->exponentC1 = 1.0 - exp(context->exponentC1);
|
||||
context->exponentC1 = 1.0 - exp(context->exponentC1);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -586,7 +590,7 @@ static void dst_rcdisc_step(node_description *node)
|
||||
context->state = 1;
|
||||
context->t = 0;
|
||||
}
|
||||
node->output[0]=0;
|
||||
node->output[0] = 0;
|
||||
break;
|
||||
|
||||
case 1:
|
||||
@ -603,7 +607,7 @@ static void dst_rcdisc_reset(node_description *node)
|
||||
{
|
||||
struct dst_rcdisc_context *context = node->context;
|
||||
|
||||
node->output[0]=0;
|
||||
node->output[0] = 0;
|
||||
|
||||
context->state = 0;
|
||||
context->t = 0;
|
||||
@ -633,9 +637,10 @@ static void dst_rcdisc_reset(node_description *node)
|
||||
|
||||
static void dst_rcdisc2_step(node_description *node)
|
||||
{
|
||||
double diff;
|
||||
struct dst_rcdisc_context *context = node->context;
|
||||
|
||||
double diff;
|
||||
|
||||
/* Works differently to other as we are always on, no enable */
|
||||
/* exponential based in difference between input/output */
|
||||
|
||||
@ -678,9 +683,10 @@ static void dst_rcdisc2_reset(node_description *node)
|
||||
|
||||
static void dst_rcdisc3_step(node_description *node)
|
||||
{
|
||||
double diff;
|
||||
struct dst_rcdisc_context *context = node->context;
|
||||
|
||||
double diff;
|
||||
|
||||
/* Exponential based in difference between input/output */
|
||||
|
||||
if(DST_RCDISC3__ENABLE)
|
||||
@ -708,12 +714,12 @@ static void dst_rcdisc3_reset(node_description *node)
|
||||
{
|
||||
struct dst_rcdisc_context *context = node->context;
|
||||
|
||||
node->output[0]=0;
|
||||
node->output[0] = 0;
|
||||
|
||||
context->state = 0;
|
||||
context->t = 0;
|
||||
context->exponent0=-1.0 * DST_RCDISC3__R1 * DST_RCDISC3__C;
|
||||
context->exponent1=-1.0 *(DST_RCDISC3__R1 * DST_RCDISC3__R2)/( DST_RCDISC3__R1 + DST_RCDISC3__R2)* DST_RCDISC3__C;
|
||||
context->exponent0 = -1.0 * DST_RCDISC3__R1 * DST_RCDISC3__C;
|
||||
context->exponent1 = -1.0 *(DST_RCDISC3__R1 * DST_RCDISC3__R2)/( DST_RCDISC3__R1 + DST_RCDISC3__R2)* DST_RCDISC3__C;
|
||||
}
|
||||
|
||||
|
||||
@ -742,6 +748,7 @@ static void dst_rcdisc3_reset(node_description *node)
|
||||
static void dst_rcdisc4_step(node_description *node)
|
||||
{
|
||||
struct dst_rcdisc4_context *context = node->context;
|
||||
|
||||
int inp1 = (DST_RCDISC4__IN == 0) ? 0 : 1;
|
||||
|
||||
if (DST_RCDISC4__ENABLE == 0)
|
||||
@ -767,6 +774,7 @@ static void dst_rcdisc4_step(node_description *node)
|
||||
static void dst_rcdisc4_reset(node_description *node)
|
||||
{
|
||||
struct dst_rcdisc4_context *context = node->context;
|
||||
|
||||
double v, i, r, rT;
|
||||
|
||||
context->type = 0;
|
||||
@ -802,21 +810,21 @@ static void dst_rcdisc4_reset(node_description *node)
|
||||
v = DST_RCDISC4__VP - .5; /* diode drop */
|
||||
|
||||
/* When the input is 1, both R1 & R3 are basically in parallel. */
|
||||
r = 1.0 / (1.0 / DST_RCDISC4__R1 + 1.0 / DST_RCDISC4__R3);
|
||||
r = 1.0 / (1.0 / DST_RCDISC4__R1 + 1.0 / DST_RCDISC4__R3);
|
||||
rT = DST_RCDISC4__R2 + r;
|
||||
i = v / rT;
|
||||
i = v / rT;
|
||||
context->v[1] = i * r + .5;
|
||||
rT = 1.0 / (1.0 / DST_RCDISC4__R2 + 1.0 / r);
|
||||
context->exp[1] = -1.0 / (rT * DST_RCDISC4__C1 * discrete_current_context->sample_rate);
|
||||
context->exp[1] = 1.0 - exp(context->exp[1]);
|
||||
context->exp[1] = 1.0 - exp(context->exp[1]);
|
||||
|
||||
/* When the input is 0, R1 is out of circuit. */
|
||||
rT = DST_RCDISC4__R2 + DST_RCDISC4__R3;
|
||||
i = v / rT;
|
||||
i = v / rT;
|
||||
context->v[0] = i * DST_RCDISC4__R3 + .5;
|
||||
rT = 1.0 / (1.0 / DST_RCDISC4__R2 + 1.0 / DST_RCDISC4__R3);
|
||||
context->exp[0] = -1.0 / (rT * DST_RCDISC4__C1 * discrete_current_context->sample_rate);
|
||||
context->exp[0] = 1.0 - exp(context->exp[0]);
|
||||
context->exp[0] = 1.0 - exp(context->exp[0]);
|
||||
break;
|
||||
|
||||
case 3:
|
||||
@ -828,12 +836,12 @@ static void dst_rcdisc4_reset(node_description *node)
|
||||
context->v[1] = DST_RCDISC4__R2 / (r + DST_RCDISC4__R2) * (5.0 - 0.5);
|
||||
rT = 1.0 / ( 1.0 / r + 1.0 / DST_RCDISC4__R2);
|
||||
context->exp[1] = -1.0 / (rT * DST_RCDISC4__C1 * discrete_current_context->sample_rate);
|
||||
context->exp[1] = 1.0 - exp(context->exp[1]);
|
||||
context->exp[1] = 1.0 - exp(context->exp[1]);
|
||||
|
||||
/* When the input is 0, R1 is out of circuit. */
|
||||
context->v[0] = 0;
|
||||
context->exp[0] = -1.0 / (DST_RCDISC4__R2 * DST_RCDISC4__C1 * discrete_current_context->sample_rate);
|
||||
context->exp[0] = 1.0 - exp(context->exp[0]);
|
||||
context->exp[0] = 1.0 - exp(context->exp[0]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -855,9 +863,10 @@ static void dst_rcdisc4_reset(node_description *node)
|
||||
|
||||
static void dst_rcdisc5_step(node_description *node)
|
||||
{
|
||||
double diff,u;
|
||||
struct dst_rcdisc_context *context = node->context;
|
||||
|
||||
double diff,u;
|
||||
|
||||
/* Exponential based in difference between input/output */
|
||||
|
||||
if(DST_RCDISC5__ENABLE)
|
||||
@ -875,7 +884,7 @@ static void dst_rcdisc5_step(node_description *node)
|
||||
}
|
||||
else
|
||||
{
|
||||
node->output[0]=0;
|
||||
node->output[0] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -883,11 +892,11 @@ static void dst_rcdisc5_reset(node_description *node)
|
||||
{
|
||||
struct dst_rcdisc_context *context = node->context;
|
||||
|
||||
node->output[0]=0;
|
||||
node->output[0] = 0;
|
||||
|
||||
context->state = 0;
|
||||
context->t = 0;
|
||||
context->exponent0=-1.0 * DST_RCDISC5__R * DST_RCDISC5__C;
|
||||
context->exponent0 = -1.0 * DST_RCDISC5__R * DST_RCDISC5__C;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
@ -930,20 +939,21 @@ static void dst_rcdisc5_reset(node_description *node)
|
||||
|
||||
static void dst_rcintegrate_step(node_description *node)
|
||||
{
|
||||
double diff,u,iQ,iQc,iC,RG,vE;
|
||||
struct dst_rcdisc_context *context = node->context;
|
||||
double dt,vP;
|
||||
|
||||
double diff, u, iQ, iQc, iC, RG, vE;
|
||||
double dt, vP;
|
||||
|
||||
if(DST_RCINTEGRATE__ENABLE)
|
||||
{
|
||||
u = DST_RCINTEGRATE__IN1;
|
||||
u = DST_RCINTEGRATE__IN1;
|
||||
vP = DST_RCINTEGRATE__VP;
|
||||
dt = discrete_current_context->sample_time;
|
||||
if ( u-0.7 < context->vCap*context->R2/(context->R1+context->R2))
|
||||
{
|
||||
/* discharge .... */
|
||||
diff = 0 - context->vCap;
|
||||
iC = 0.0 - context->C / context->exponent1 * diff * context->exp_exponent1; // iC
|
||||
diff = 0.0 - context->vCap;
|
||||
iC = 0.0 - context->C / context->exponent1 * diff * context->exp_exponent1; /* iC */
|
||||
diff = diff - (diff * context->exp_exponent1);
|
||||
context->vCap += diff;
|
||||
iQ = 0;
|
||||
@ -954,7 +964,7 @@ static void dst_rcintegrate_step(node_description *node)
|
||||
{
|
||||
/* charging */
|
||||
diff = (vP - context->vCE) * context->f - context->vCap;
|
||||
iC = 0.0 - context->C / context->exponent0 * diff * context->exp_exponent0; // iC
|
||||
iC = 0.0 - context->C / context->exponent0 * diff * context->exp_exponent0; /* iC */
|
||||
diff = diff - (diff * context->exp_exponent0);
|
||||
context->vCap += diff;
|
||||
iQ = iC + (iC * context->R1 + context->vCap) / context->R2;
|
||||
@ -964,10 +974,10 @@ static void dst_rcintegrate_step(node_description *node)
|
||||
|
||||
|
||||
u = DST_RCINTEGRATE__IN1;
|
||||
if (u>0.7+vE)
|
||||
vE=u-0.7;
|
||||
if (u > 0.7+vE)
|
||||
vE = u-0.7;
|
||||
iQc = EM_IC(u - vE);
|
||||
context->vCE = MIN(vP-0.1, vP - RG*iQc);
|
||||
context->vCE = MIN(vP - 0.1, vP - RG * iQc);
|
||||
|
||||
/* Avoid oscillations
|
||||
* The method tends to largely overshoot - no wonder without
|
||||
@ -975,7 +985,7 @@ static void dst_rcintegrate_step(node_description *node)
|
||||
*/
|
||||
|
||||
context->vCE = MAX(context->vCE, 0.1 );
|
||||
context->vCE = 0.1 * context->vCE +0.9 * (vP - vE - iQ * context->R3);
|
||||
context->vCE = 0.1 * context->vCE + 0.9 * (vP - vE - iQ * context->R3);
|
||||
|
||||
switch (context->state)
|
||||
{
|
||||
@ -986,18 +996,19 @@ static void dst_rcintegrate_step(node_description *node)
|
||||
node->output[0] = vE;
|
||||
break;
|
||||
case DISC_RC_INTEGRATE_TYPE3:
|
||||
node->output[0] = MAX(0,vP - iQ * context->R3);
|
||||
node->output[0] = MAX(0, vP - iQ * context->R3);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
node->output[0]=0;
|
||||
node->output[0] = 0;
|
||||
}
|
||||
}
|
||||
static void dst_rcintegrate_reset(node_description *node)
|
||||
{
|
||||
struct dst_rcdisc_context *context = node->context;
|
||||
|
||||
double r;
|
||||
double dt = discrete_current_context->sample_time;
|
||||
|
||||
@ -1007,7 +1018,7 @@ static void dst_rcintegrate_reset(node_description *node)
|
||||
context->R1 = DST_RCINTEGRATE__R1;
|
||||
context->R2 = DST_RCINTEGRATE__R2;
|
||||
context->R3 = DST_RCINTEGRATE__R3;
|
||||
context->C = DST_RCINTEGRATE__C;
|
||||
context->C = DST_RCINTEGRATE__C;
|
||||
|
||||
context->vCap = 0;
|
||||
context->vCE = 0;
|
||||
@ -1049,27 +1060,28 @@ static void dst_rcintegrate_reset(node_description *node)
|
||||
|
||||
static void dst_rcdisc_mod_step(node_description *node)
|
||||
{
|
||||
double diff,Rc,Rc2,vCap,u,vD=0.0;
|
||||
struct dst_rcdisc_context *context = node->context;
|
||||
|
||||
double diff, Rc, Rc2, vCap, u, vD=0.0;
|
||||
|
||||
/* Exponential based in difference between input/output */
|
||||
vCap = context->vCap;
|
||||
|
||||
if(DST_RCDISC_MOD__ENABLE)
|
||||
{
|
||||
Rc = (DST_RCDISC_MOD__IN1 > 0.5) ? DST_RCDISC_MOD__R2 : DST_RCDISC_MOD__R1 + DST_RCDISC_MOD__R2;
|
||||
if (Rc<1.0)
|
||||
if (Rc < 1.0)
|
||||
Rc = 1.0;
|
||||
u = (DST_RCDISC_MOD__IN1 > 0.5) ? 0 : DST_RCDISC_MOD__VP;
|
||||
Rc2 = (DST_RCDISC_MOD__IN2 > 0.6) ? (DST_RCDISC_MOD__R3 * DST_RCDISC_MOD__R4 / (DST_RCDISC_MOD__R3 + DST_RCDISC_MOD__R4)) : DST_RCDISC_MOD__R4;
|
||||
/* Clamp */
|
||||
diff = u - vCap;
|
||||
vD = diff*Rc2/(Rc+Rc2);
|
||||
if (vD<-0.6)
|
||||
vD = diff * Rc2 / (Rc + Rc2);
|
||||
if (vD < -0.6)
|
||||
{
|
||||
Rc2=0;
|
||||
diff = u + 0.6 - vCap;
|
||||
diff = diff - (diff * exp(0.0-discrete_current_context->sample_time / (DST_RCDISC_MOD__C*Rc)));
|
||||
Rc2 = 0;
|
||||
diff = u + 0.6 - vCap;
|
||||
diff = diff - (diff * exp(0.0 - discrete_current_context->sample_time / (DST_RCDISC_MOD__C * Rc)));
|
||||
vCap += diff;
|
||||
node->output[0] = (DST_RCDISC_MOD__IN2 <= 0.6) ? -0.6 : 0;
|
||||
}
|
||||
@ -1078,13 +1090,13 @@ static void dst_rcdisc_mod_step(node_description *node)
|
||||
diff = diff - (diff * exp(0.0-discrete_current_context->sample_time / (DST_RCDISC_MOD__C*(Rc+Rc2))));
|
||||
vCap += diff;
|
||||
/* neglecting current through R3 drawn by next node */
|
||||
node->output[0] = (DST_RCDISC_MOD__IN2 <= 0.6) ? (u-vCap)*DST_RCDISC_MOD__R4/(DST_RCDISC_MOD__R4+Rc) : 0;
|
||||
node->output[0] = (DST_RCDISC_MOD__IN2 <= 0.6) ? (u - vCap) * DST_RCDISC_MOD__R4 / (DST_RCDISC_MOD__R4 + Rc) : 0;
|
||||
}
|
||||
context->vCap = vCap;
|
||||
}
|
||||
else
|
||||
{
|
||||
node->output[0]=0;
|
||||
node->output[0] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1092,8 +1104,8 @@ static void dst_rcdisc_mod_reset(node_description *node)
|
||||
{
|
||||
struct dst_rcdisc_context *context = node->context;
|
||||
|
||||
node->output[0]=0;
|
||||
context->vCap = 0;
|
||||
node->output[0] = 0;
|
||||
context->vCap = 0;
|
||||
}
|
||||
|
||||
/************************************************************************
|
||||
@ -1128,7 +1140,7 @@ static void dst_rcfilter_step(node_description *node)
|
||||
}
|
||||
else
|
||||
{
|
||||
node->output[0]=0;
|
||||
node->output[0] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@ -1138,7 +1150,7 @@ static void dst_rcfilter_reset(node_description *node)
|
||||
|
||||
context->exponent = -1.0 / (DST_RCFILTER__R * DST_RCFILTER__C * discrete_current_context->sample_rate);
|
||||
context->exponent = 1.0 - exp(context->exponent);
|
||||
context->vCap = 0;
|
||||
context->vCap = 0;
|
||||
node->output[0] = 0;
|
||||
}
|
||||
|
||||
@ -1164,25 +1176,26 @@ static void dst_rcfilter_reset(node_description *node)
|
||||
static void dst_rcfilter_sw_step(node_description *node)
|
||||
{
|
||||
struct dst_rcfilter_sw_context *context = node->context;
|
||||
|
||||
int i;
|
||||
double rcexp;
|
||||
int bits = (int)DST_RCFILTER_SW__SWITCH;
|
||||
double us=0, rs=0;
|
||||
double us = 0, rs = 0;
|
||||
|
||||
if (DST_RCFILTER_SW__ENABLE)
|
||||
{
|
||||
for (i=0;i<4;i++)
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
if ( ( bits & (1<<i)) != 0)
|
||||
if (( bits & (1 << i)) != 0)
|
||||
{
|
||||
us += context->vCap[i];
|
||||
rs += DST_RCFILTER_SW__R;
|
||||
}
|
||||
}
|
||||
node->output[0] = CD4066_ON_RES / ( CD4066_ON_RES + rs) * DST_RCFILTER_SW__VIN + DST_RCFILTER_SW__R / (CD4066_ON_RES + rs) * us;
|
||||
for (i=0;i<4;i++)
|
||||
for (i = 0; i < 4; i++)
|
||||
{
|
||||
if ( ( bits & (1<<i)) != 0)
|
||||
if (( bits & (1 << i)) != 0)
|
||||
{
|
||||
rcexp = 1.0 - exp(-1.0 / ( CD4066_ON_RES * DST_RCFILTER_SW__C(i)) * discrete_current_context->sample_rate);
|
||||
context->vCap[i] += ((node->output[0] - context->vCap[i]) * rcexp);
|
||||
@ -1191,16 +1204,17 @@ static void dst_rcfilter_sw_step(node_description *node)
|
||||
}
|
||||
else
|
||||
{
|
||||
node->output[0]=0;
|
||||
node->output[0] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
static void dst_rcfilter_sw_reset(node_description *node)
|
||||
{
|
||||
struct dst_rcfilter_sw_context *context = node->context;
|
||||
|
||||
int i;
|
||||
|
||||
for (i=0;i<4;i++)
|
||||
for (i = 0; i < 4; i++)
|
||||
context->vCap[i] = 0;
|
||||
node->output[0] = 0;
|
||||
}
|
||||
@ -1225,16 +1239,18 @@ static void dst_rcfilter_sw_reset(node_description *node)
|
||||
|
||||
static void dst_rcfilterN_reset(node_description *node)
|
||||
{
|
||||
// double f=1.0/(2*M_PI* DST_RCFILTERN__R * DST_RCFILTERN__C);
|
||||
#if 0
|
||||
double f=1.0/(2*M_PI* DST_RCFILTERN__R * DST_RCFILTERN__C);
|
||||
|
||||
// !!!!!!!!!!!!!! CAN'T CHEAT LIKE THIS !!!!!!!!!!!!!!!!
|
||||
// Put this stuff in a context
|
||||
//
|
||||
// node->input[2] = f;
|
||||
// node->input[3] = DISC_FILTER_LOWPASS;
|
||||
/* !!!!!!!!!!!!!! CAN'T CHEAT LIKE THIS !!!!!!!!!!!!!!!! */
|
||||
/* Put this stuff in a context */
|
||||
|
||||
node->input[2] = f;
|
||||
node->input[3] = DISC_FILTER_LOWPASS;
|
||||
|
||||
/* Use first order filter */
|
||||
dst_filter1_reset(node);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@ -1256,21 +1272,24 @@ static void dst_rcfilterN_reset(node_description *node)
|
||||
|
||||
static void dst_rcdiscN_reset(node_description *node)
|
||||
{
|
||||
// double f=1.0/(2*M_PI* DST_RCDISCN__R * DST_RCDISCN__C);
|
||||
#if 0
|
||||
double f = 1.0 / (2 * M_PI * DST_RCDISCN__R * DST_RCDISCN__C);
|
||||
|
||||
// !!!!!!!!!!!!!! CAN'T CHEAT LIKE THIS !!!!!!!!!!!!!!!!
|
||||
// Put this stuff in a context
|
||||
//
|
||||
// node->input[2] = f;
|
||||
// node->input[3] = DISC_FILTER_LOWPASS;
|
||||
/* !!!!!!!!!!!!!! CAN'T CHEAT LIKE THIS !!!!!!!!!!!!!!!! */
|
||||
/* Put this stuff in a context */
|
||||
|
||||
node->input[2] = f;
|
||||
node->input[3] = DISC_FILTER_LOWPASS;
|
||||
|
||||
/* Use first order filter */
|
||||
dst_filter1_reset(node);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void dst_rcdiscN_step(node_description *node)
|
||||
{
|
||||
struct dss_filter1_context *context = node->context;
|
||||
|
||||
double gain = 1.0;
|
||||
|
||||
if (DST_RCDISCN__ENABLE == 0.0)
|
||||
@ -1321,6 +1340,7 @@ struct dss_rcdisc2_context
|
||||
static void dst_rcdisc2N_step(node_description *node)
|
||||
{
|
||||
struct dss_rcdisc2_context *context = node->context;
|
||||
|
||||
double input = ((DST_RCDISC2N__ENABLE == 0) ? DST_RCDISC2N__IN0 : DST_RCDISC2N__IN1);
|
||||
|
||||
if (DST_RCDISC2N__ENABLE == 0)
|
||||
@ -1337,12 +1357,12 @@ static void dst_rcdisc2N_reset(node_description *node)
|
||||
struct dss_rcdisc2_context *context = node->context;
|
||||
double f1,f2;
|
||||
|
||||
f1=1.0/(2*M_PI* DST_RCDISC2N__R0 * DST_RCDISC2N__C);
|
||||
f2=1.0/(2*M_PI* DST_RCDISC2N__R1 * DST_RCDISC2N__C);
|
||||
f1 = 1.0 / (2 * M_PI * DST_RCDISC2N__R0 * DST_RCDISC2N__C);
|
||||
f2 = 1.0 / (2 * M_PI * DST_RCDISC2N__R1 * DST_RCDISC2N__C);
|
||||
|
||||
calculate_filter1_coefficients(f1, DISC_FILTER_LOWPASS, &context->a1_0, &context->b0_0, &context->b1_0);
|
||||
calculate_filter1_coefficients(f2, DISC_FILTER_LOWPASS, &context->a1_1, &context->b0_1, &context->b1_1);
|
||||
|
||||
/* Initialize the object */
|
||||
node->output[0]=0;
|
||||
node->output[0] = 0;
|
||||
}
|
||||
|
@ -33,8 +33,9 @@ struct dss_adjustment_context
|
||||
|
||||
READ8_HANDLER(discrete_sound_r)
|
||||
{
|
||||
discrete_info *info = sndti_token(SOUND_DISCRETE, 0);
|
||||
discrete_info *info = sndti_token(SOUND_DISCRETE, 0);
|
||||
node_description *node = discrete_find_node(info, offset);
|
||||
|
||||
UINT8 data = 0;
|
||||
|
||||
/* Read the node input value if allowed */
|
||||
@ -58,15 +59,15 @@ READ8_HANDLER(discrete_sound_r)
|
||||
|
||||
WRITE8_HANDLER(discrete_sound_w)
|
||||
{
|
||||
discrete_info *info = sndti_token(SOUND_DISCRETE, 0);
|
||||
discrete_info *info = sndti_token(SOUND_DISCRETE, 0);
|
||||
node_description *node = discrete_find_node(info, offset);
|
||||
|
||||
/* Update the node input value if it's a proper input node */
|
||||
if (node)
|
||||
{
|
||||
UINT8 *node_data = node->context;
|
||||
UINT8 last_data = *node_data;
|
||||
UINT8 new_data = 0;
|
||||
UINT8 last_data = *node_data;
|
||||
UINT8 new_data = 0;
|
||||
|
||||
switch (node->module.type)
|
||||
{
|
||||
@ -122,12 +123,13 @@ WRITE8_HANDLER(discrete_sound_w)
|
||||
static void dss_adjustment_step(node_description *node)
|
||||
{
|
||||
struct dss_adjustment_context *context = node->context;
|
||||
INT32 rawportval = input_port_read_direct(context->port);
|
||||
|
||||
INT32 rawportval = input_port_read_direct(context->port);
|
||||
|
||||
/* only recompute if the value changed from last time */
|
||||
if (rawportval != context->lastpval)
|
||||
{
|
||||
double portval = (double)(rawportval - context->pmin) * context->pscale;
|
||||
double portval = (double)(rawportval - context->pmin) * context->pscale;
|
||||
double scaledval = portval * context->scale + context->min;
|
||||
|
||||
context->lastpval = rawportval;
|
||||
@ -141,6 +143,7 @@ static void dss_adjustment_step(node_description *node)
|
||||
static void dss_adjustment_reset(node_description *node)
|
||||
{
|
||||
struct dss_adjustment_context *context = node->context;
|
||||
|
||||
double min, max;
|
||||
|
||||
if (node->custom)
|
||||
@ -153,13 +156,13 @@ static void dss_adjustment_reset(node_description *node)
|
||||
context->port = input_port_by_index(Machine->portconfig, DSS_ADJUSTMENT__PORT);
|
||||
|
||||
context->lastpval = 0x7fffffff;
|
||||
context->pmin = DSS_ADJUSTMENT__PMIN;
|
||||
context->pscale = 1.0 / (double)(DSS_ADJUSTMENT__PMAX - DSS_ADJUSTMENT__PMIN);
|
||||
context->pmin = DSS_ADJUSTMENT__PMIN;
|
||||
context->pscale = 1.0 / (double)(DSS_ADJUSTMENT__PMAX - DSS_ADJUSTMENT__PMIN);
|
||||
|
||||
/* linear scale */
|
||||
if (DSS_ADJUSTMENT__LOG == 0)
|
||||
{
|
||||
context->min = DSS_ADJUSTMENT__MIN;
|
||||
context->min = DSS_ADJUSTMENT__MIN;
|
||||
context->scale = DSS_ADJUSTMENT__MAX - DSS_ADJUSTMENT__MIN;
|
||||
}
|
||||
|
||||
@ -169,7 +172,7 @@ static void dss_adjustment_reset(node_description *node)
|
||||
/* force minimum and maximum to be > 0 */
|
||||
min = (DSS_ADJUSTMENT__MIN > 0) ? DSS_ADJUSTMENT__MIN : 1;
|
||||
max = (DSS_ADJUSTMENT__MAX > 0) ? DSS_ADJUSTMENT__MAX : 1;
|
||||
context->min = log10(min);
|
||||
context->min = log10(min);
|
||||
context->scale = log10(max) - log10(min);
|
||||
}
|
||||
|
||||
@ -249,7 +252,7 @@ static void dss_input_pulse_step(node_description *node)
|
||||
|
||||
static void dss_input_stream_step(node_description *node)
|
||||
{
|
||||
// the context pointer is set to point to the current input stream data in discrete_stream_update
|
||||
/* the context pointer is set to point to the current input stream data in discrete_stream_update */
|
||||
stream_sample_t **ptr = node->context;
|
||||
stream_sample_t *data = *ptr;
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -307,8 +307,10 @@ static void *discrete_start(const char *tag, int sndindex, int clock, const void
|
||||
|
||||
/* create the logfile */
|
||||
sprintf(name, "discrete%d.log", info->sndindex);
|
||||
if (DISCRETE_DEBUGLOG && !discrete_current_context->disclogfile)
|
||||
discrete_current_context->disclogfile = fopen(name, "w");
|
||||
if (DISCRETE_DEBUGLOG && !info->disclogfile)
|
||||
info->disclogfile = fopen(name, "w");
|
||||
|
||||
discrete_current_context = info;
|
||||
|
||||
/* first pass through the nodes: sanity check, fill in the indexed_nodes, and make a total count */
|
||||
discrete_log("discrete_start() - Doing node list sanity check");
|
||||
@ -329,8 +331,6 @@ static void *discrete_start(const char *tag, int sndindex, int clock, const void
|
||||
/* make sure this is a main node */
|
||||
if (NODE_CHILD_NODE_NUM(intf[info->node_count].node) > 0)
|
||||
fatalerror("discrete_start() - Child node number on NODE_%02d", NODE_INDEX(intf[info->node_count].node) );
|
||||
|
||||
|
||||
}
|
||||
info->node_count++;
|
||||
discrete_log("discrete_start() - Sanity check counted %d nodes", info->node_count);
|
||||
@ -357,6 +357,8 @@ static void *discrete_start(const char *tag, int sndindex, int clock, const void
|
||||
setup_output_nodes(info);
|
||||
|
||||
setup_disc_logs(info);
|
||||
|
||||
discrete_current_context = NULL;
|
||||
return info;
|
||||
}
|
||||
|
||||
@ -414,9 +416,9 @@ static void discrete_stop(void *chip)
|
||||
if (DISCRETE_DEBUGLOG)
|
||||
{
|
||||
/* close the debug log */
|
||||
if (discrete_current_context->disclogfile)
|
||||
fclose(discrete_current_context->disclogfile);
|
||||
discrete_current_context->disclogfile = NULL;
|
||||
if (info->disclogfile)
|
||||
fclose(info->disclogfile);
|
||||
info->disclogfile = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
@ -703,8 +705,8 @@ static void find_input_nodes(discrete_info *info, discrete_sound_block *block_li
|
||||
if (NODE_CHILD_NODE_NUM(inputnode) >= node_ref->module.num_output)
|
||||
fatalerror("discrete_start - Node NODE_%02d referenced non existent output %d on node NODE_%02d", NODE_INDEX(node->node), NODE_CHILD_NODE_NUM(inputnode), NODE_INDEX(inputnode));
|
||||
|
||||
node->input[inputnum] = &(node_ref->output[NODE_CHILD_NODE_NUM(inputnode)]); // Link referenced node out to input
|
||||
node->input_is_node |= 1 << inputnum; // Bit flag if input is node
|
||||
node->input[inputnum] = &(node_ref->output[NODE_CHILD_NODE_NUM(inputnode)]); /* Link referenced node out to input */
|
||||
node->input_is_node |= 1 << inputnum; /* Bit flag if input is node */
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -121,6 +121,59 @@
|
||||
*
|
||||
***********************************************************************
|
||||
*
|
||||
* x_time - ANTI-ALSING features.
|
||||
*
|
||||
* Certain modules make use of x_time. This is a feature that passes
|
||||
* infomation between modules about how long in the current sample, the
|
||||
* switch in state happened. This is a decimal value of the % of the
|
||||
* full sample period that it has been in the new state.
|
||||
* 0 means it has been at the same state the whole sample.
|
||||
*
|
||||
* Example: Here is the output of a clock source with x_time on the
|
||||
* output. The square wave is the real world waveform we
|
||||
* want. The ^'s are the sample point. The numbers under
|
||||
* the ^'s are the node output with the logic state left of
|
||||
* the decimal and the x_time to the right. Under that is
|
||||
* what the node's anti-aliased output energy would be.
|
||||
* Note: the example is not 4x sampling so the energy
|
||||
* does not provide an accurate representation of the
|
||||
* original waveform. This is intentional so it fits
|
||||
* in this header file.
|
||||
* 1 ____ ____ ____ ____ ____ ____ ____ ____
|
||||
* 0 ___ ____ ____ ____ ____ ____ ____ ____ __
|
||||
* ^....^....^....^....^....^....^....^....^....^....^....^....^
|
||||
* x_time 0.2 1.4 0.6 1.8 1.2 0.4 1.6 0.8 0.2 1.4 0.6
|
||||
* energy 0.8 0.4 0.4 0.8 0.2 0.6 0.6 0.2 0.8 0.4 0.4
|
||||
*
|
||||
* Some modules will just pass the x_time onto another module.
|
||||
*
|
||||
* Modules that process x_time will keep track of the node's previous
|
||||
* state so they can calculate the actual energy at the sample time.
|
||||
*
|
||||
* Example: Say we have a 555 module that outputs a clock with x_time
|
||||
* that is connected to a counter. The output of the counter
|
||||
* is connected to DAC_R1.
|
||||
* In this case the counter module continues counting dependant
|
||||
* on the integer portion of the 555 output. But it also
|
||||
* passes the decimal portion as the x_time.
|
||||
* The DAC_R1 then uses this info to anti-alias its output.
|
||||
* Consider the following counter outputs vs DAC_R1
|
||||
* calculations. The count changes from 9 to 10. It has
|
||||
* been at the new state for 75% of the sample.
|
||||
*
|
||||
* counter binary x_time -- DAC_R1 bit energy --
|
||||
* out count D3 D2 D1 D0
|
||||
* 9.0 1001 0.0 1.0 0.0 0.0 1.0
|
||||
* 10.75 1010 0.75 1.0 0.0 0.75 0.25
|
||||
* 10.0 1010 0.0 1.0 0.0 1.0 0.0
|
||||
*
|
||||
* The DAC_R1 uses these energy calculations to scale the
|
||||
* voltages created on each of its resistors. This
|
||||
* anti-aliases the waveform no mater what the resistor
|
||||
* weighting is.
|
||||
*
|
||||
***********************************************************************
|
||||
*
|
||||
* LIST OF CURRENTLY IMPLEMENTED DISCRETE BLOCKS
|
||||
* ---------------------------------------------
|
||||
*
|
||||
@ -142,7 +195,7 @@
|
||||
* DISCRETE_INPUTX_STREAM(NODE,NUM, GAIN,OFFSET)
|
||||
*
|
||||
* DISCRETE_COUNTER(NODE,ENAB,RESET,CLK,MAX,DIR,INIT0,CLKTYPE)
|
||||
* DISCRETE_COUNTER_7492(NODE,ENAB,RESET,CLK)
|
||||
* DISCRETE_COUNTER_7492(NODE,ENAB,RESET,CLK,CLKTYPE)
|
||||
* DISCRETE_LFSR_NOISE(NODE,ENAB,RESET,CLK,AMPL,FEED,BIAS,LFSRTB)
|
||||
* DISCRETE_NOISE(NODE,ENAB,FREQ,AMP,BIAS)
|
||||
* DISCRETE_NOTE(NODE,ENAB,CLK,DATA,MAX1,MAX2,CLKTYPE)
|
||||
@ -386,7 +439,7 @@
|
||||
* This counter counts up/down from 0 to MAX. When the enable is low, the output
|
||||
* is held at it's last value. When reset is high, the reset value is loaded
|
||||
* into the output. The counter can be clocked internally or externally. It also
|
||||
* supports xTime used by the clock modules to pass on anti-aliasing info.
|
||||
* supports x_time used by the clock modules to pass on anti-aliasing info.
|
||||
*
|
||||
* Declaration syntax
|
||||
*
|
||||
@ -399,6 +452,16 @@
|
||||
* DISC_CLK_IS_FREQ - internally clock at this frequency.
|
||||
* Clock node must be static if
|
||||
* DISC_CLK_IS_FREQ is used.
|
||||
* x_time options: you can also | these x_time features to the basic
|
||||
* types above if needed, or use seperately with 7492.
|
||||
* DISC_OUT_IS_ENERGY - This will uses the x_time to
|
||||
* anti-alias the count. Might be
|
||||
* usefull if not connected to other
|
||||
* modules.
|
||||
* DISC_OUT_HAS_XTIME - This will generate x_time if
|
||||
* being used with DISC_CLK_IS_FREQ.
|
||||
* It will pass x_time for the
|
||||
* other clock types.
|
||||
*
|
||||
* DISCRETE_COUNTER(name of node,
|
||||
* enable node or static value,
|
||||
@ -413,10 +476,12 @@
|
||||
* enable node or static value,
|
||||
* reset node or static value,
|
||||
* clock node or static value,
|
||||
* max count static value)
|
||||
* clock type static value)
|
||||
*
|
||||
* Note: A 7492 counter outputs a special bit pattern on its /6 stage.
|
||||
* A 7492 clocks on falling edge. This emulates the /6 stage only.
|
||||
* A 7492 clocks on the falling edge,
|
||||
* so it is not recommended to use DISC_CLK_ON_R_EDGE for a 7492.
|
||||
* This module emulates the /6 stage only.
|
||||
* Use another DISCRETE_COUNTER for the /2 stage.
|
||||
*
|
||||
* EXAMPLES: see Fire Truck, Monte Carlo, Super Bug, Polaris
|
||||
@ -1659,7 +1724,7 @@
|
||||
* DISCRETE_DAC_R1(name of node,
|
||||
* enable node or static value,
|
||||
* data node (static value is useless),
|
||||
* vData node or static value (vON),
|
||||
* vData node or static value (voltage when a bit is on ),
|
||||
* address of discrete_dac_r1_ladder structure)
|
||||
*
|
||||
* discrete_dac_r1_ladder = {ladderLength, r{}, vBias, rBias, rGnd, cFilter}
|
||||
@ -1668,6 +1733,9 @@
|
||||
* are out of circuit. So the bit selecting them will have no effect
|
||||
* on the DAC output voltage.
|
||||
*
|
||||
* x_time - this modules automatically handles any non-integer value
|
||||
* on the data input as x_time.
|
||||
*
|
||||
* EXAMPLES: see Fire Truck, Monte Carlo, Super Bug, Polaris
|
||||
*
|
||||
***********************************************************************
|
||||
@ -1802,7 +1870,7 @@
|
||||
* input 7 node, (if used)
|
||||
* address of discrete_mixer_info structure)
|
||||
*
|
||||
* discrete_mixer_desc = {type, r{}, rNode{}, c{}, rI, rF, cF, cAmp, vRef, gain}
|
||||
* discrete_mixer_desc = {type, r{}, r_node{}, c{}, rI, rF, cF, cAmp, vRef, gain}
|
||||
*
|
||||
* Note: Set all unused components to 0.
|
||||
* If an rNode is not used it should also be set to 0.
|
||||
@ -2681,28 +2749,29 @@
|
||||
* DISCRETE_555_ASTABLE - NE555 Chip simulation (astable mode).
|
||||
* DISCRETE_555_ASTABLE_CV - NE555 Chip simulation (astable mode) with CV control.
|
||||
*
|
||||
* v555
|
||||
* |
|
||||
* .---------+
|
||||
* | |
|
||||
* Z |8
|
||||
* R1 Z .---------.
|
||||
* | 7| Vcc |
|
||||
* +-----|Discharge|
|
||||
* | | |
|
||||
* Z | 555 |3
|
||||
* R2 Z | Out|---> Netlist Node
|
||||
* | 6| |
|
||||
* +-----|Threshold|
|
||||
* | | |
|
||||
* +-----|Trigger |
|
||||
* | 2| |---< Control Voltage
|
||||
* | | Reset |5
|
||||
* | '---------'
|
||||
* --- 4|
|
||||
* C --- |
|
||||
* | ^
|
||||
* gnd Reset
|
||||
* v_charge v_pos
|
||||
* V V
|
||||
* | |
|
||||
* | |
|
||||
* | |
|
||||
* Z |8
|
||||
* _FAST_CHARGE_DIODE R1 Z .---------.
|
||||
* (optional) | 7| Vcc |
|
||||
* +---------> +-----|Discharge|
|
||||
* | | | |
|
||||
* --- Z | 555 |3
|
||||
* \ / R2 Z | Out|---> Netlist Node
|
||||
* V | 6| |
|
||||
* --- +-----|Threshold|
|
||||
* | | | |
|
||||
* +---------> +-----|Trigger |
|
||||
* | 2| |---< Control Voltage
|
||||
* | | Reset |5
|
||||
* | '---------'
|
||||
* --- 4|
|
||||
* C --- |
|
||||
* | ^
|
||||
* gnd Reset
|
||||
*
|
||||
* Declaration syntax
|
||||
*
|
||||
@ -2723,27 +2792,27 @@
|
||||
*
|
||||
* discrete_555_desc =
|
||||
* {
|
||||
* options, // bit mapped options
|
||||
* v555, // B+ voltage of 555
|
||||
* v555high, // High output voltage of 555 (Usually v555 - 1.2V)
|
||||
* threshold555, // normally 2/3 of v555
|
||||
* trigger555 // normally 1/3 of v555
|
||||
* options, - bit mapped options
|
||||
* v_pos, - B+ voltage of 555
|
||||
* v_charge, - voltage to charge circuit (Defaults to v_pos)
|
||||
* v_out_high, - High output voltage of 555 (Defaults to v_pos - 1.2V)
|
||||
* }
|
||||
*
|
||||
* The last 3 options of discrete_555_desc can use the following defaults
|
||||
* unless otherwise needed.
|
||||
* DEFAULT_555_HIGH, DEFAULT_555_THRESHOLD, DEFAULT_555_TRIGGER
|
||||
* or all 3 combined as:
|
||||
* The last 2 options of discrete_555_desc can use the following defaults:
|
||||
* DEFAULT_555_CHARGE - to connect v_charge to v_pos
|
||||
* DEFAULT_555_HIGH - to use the normal output voltage based on v_pos
|
||||
* or combine both as:
|
||||
* DEFAULT_555_VALUES
|
||||
*
|
||||
* eg. {DISC_555_OUT_DC | DISC_555_OUT_SQW, 12, DEFAULT_555_VALUES}
|
||||
* eg. {DISC_555_OUT_SQW | DISC_555_OUT_DC, 12, DEFAULT_555_VALUES}
|
||||
*
|
||||
* Output Types:
|
||||
* Output Types: (only needed with DISC_555_OUT_SQW, DISC_555_OUT_CAP
|
||||
* and DISC_555_OUT_ENERGY)
|
||||
* DISC_555_OUT_DC - Output is actual DC. (DEFAULT)
|
||||
* DISC_555_OUT_AC - A cheat to make the waveform AC.
|
||||
*
|
||||
* Waveform Types: (ORed with output types)
|
||||
* DISC_555_OUT_SQW - Output is Squarewave. 0 or v555high. (DEFAULT)
|
||||
* DISC_555_OUT_SQW - Output is Squarewave. 0 or v_out_high. (DEFAULT)
|
||||
* When the state changes from low to high (or high to low)
|
||||
* during a sample, the output will high (or low) for that
|
||||
* sample. This can cause alaising effects.
|
||||
@ -2763,7 +2832,7 @@
|
||||
* through the sample, then the output will be 75% of the
|
||||
* normal high value.
|
||||
* DISC_555_OUT_LOGIC_X - This will output the 0/1 level of the flip-flop with
|
||||
* some eXtra info. This X info is in decimal remainder.
|
||||
* some eXtra info. This x_time is in decimal remainder.
|
||||
* It lets you know the percent of sample time where the
|
||||
* flip-flop changed state. If 0, the change did not happen
|
||||
* during the sample. 1.75 means the flip-flop is 1 and
|
||||
@ -2771,8 +2840,8 @@
|
||||
* 0.2 means the flip-flop is 0 and switched over 4/5 of
|
||||
* the way through the sample.
|
||||
* X modules can be used with counters to reduce alaising.
|
||||
* DISC_555_OUT_COUNT_F_X - Same as DISC_555_OUT_COUNT_F but with X info.
|
||||
* DISC_555_OUT_COUNT_R_X - Same as DISC_555_OUT_COUNT_R but with X info.
|
||||
* DISC_555_OUT_COUNT_F_X - Same as DISC_555_OUT_COUNT_F but with x_time.
|
||||
* DISC_555_OUT_COUNT_R_X - Same as DISC_555_OUT_COUNT_R but with x_time.
|
||||
*
|
||||
* other options - DISCRETE_555_ASTABLE only:
|
||||
* DISC_555_ASTABLE_HAS_FAST_CHARGE_DIODE - diode used to bypass rDischarge
|
||||
@ -2785,9 +2854,10 @@
|
||||
* DISCRETE_555_MSTABLE - NE555 Chip simulation (monostable mode)
|
||||
* - Triggered on falling edge.
|
||||
*
|
||||
* v555
|
||||
* |
|
||||
* .---------+
|
||||
* v_charge v_pos
|
||||
* V V
|
||||
* | |
|
||||
* | |
|
||||
* | |
|
||||
* Z |
|
||||
* R Z .---------.
|
||||
@ -2817,11 +2887,13 @@
|
||||
* C node (or value) in farads,
|
||||
* address of discrete_555_desc structure)
|
||||
*
|
||||
* discrete_555_desc = See DISCRETE_555_ASTABLE for description.
|
||||
*
|
||||
* Trigger Types
|
||||
* DISC_555_TRIGGER_IS_LOGIC - Input is (0 or !0) logic (DEFAULT)
|
||||
* DISC_555_TRIGGER_IS_VOLTAGE - Input is actual voltage.
|
||||
* Voltage must drop below
|
||||
* trigger555 to activate.
|
||||
* trigger to activate.
|
||||
* DISC_555_TRIGGER_DISCHARGES_CAP - some circuits connect an external
|
||||
* device (transistor) to the cap to
|
||||
* discharge it when the trigger is
|
||||
@ -2833,7 +2905,7 @@
|
||||
* DISC_555_OUT_AC - A cheat to make the waveform AC.
|
||||
*
|
||||
* Waveform Types: (ORed with trigger types)
|
||||
* DISC_555_OUT_SQW - Output is Squarewave. 0 or v555high. (DEFAULT)
|
||||
* DISC_555_OUT_SQW - Output is Squarewave. 0 or v_out_high. (DEFAULT)
|
||||
* DISC_555_OUT_CAP - Output is Timing Capacitor 'C' voltage.
|
||||
*
|
||||
* EXAMPLES: see Frogs
|
||||
@ -2843,7 +2915,7 @@
|
||||
* DISCRETE_555_CC - Constant Current Controlled 555 Oscillator
|
||||
* Which works out to a VCO when R is fixed.
|
||||
*
|
||||
* vCCsource v555
|
||||
* v_cc_source v_pos
|
||||
* V V
|
||||
* | .----------------------+
|
||||
* | | |
|
||||
@ -2895,16 +2967,21 @@
|
||||
* address of discrete_555_cc_desc structure)
|
||||
*
|
||||
* discrete_555_cc_desc =
|
||||
* {
|
||||
* options, // bit mapped options
|
||||
* v555, // B+ voltage of 555
|
||||
* v555high, // High output voltage of 555 (Usually v555 - 1.2V)
|
||||
* threshold555, // normally 2/3 of v555
|
||||
* trigger555, // normally 1/3 of v555
|
||||
* vCCsource, // B+ voltage of the Constant Current source
|
||||
* vCCjunction // The voltage drop of the Constant Current source transitor (0 if Op Amp)
|
||||
* }
|
||||
* {
|
||||
* options; - bit mapped options
|
||||
* v_pos; - B+ voltage of 555
|
||||
* v_cc_source; - Voltage of the Constant Current source
|
||||
* v_out_high; - High output voltage of 555 (Defaults to v_pos - 1.2V)
|
||||
* v_cc_junction; - The voltage drop of the Constant Current source transitor
|
||||
* (0 if Op Amp)
|
||||
* }
|
||||
*
|
||||
* The last 2 options of discrete_555_desc can use the following defaults:
|
||||
* DEFAULT_555_CC_SOURCE - to connect v_cc_source to v_pos
|
||||
* DEFAULT_555_HIGH - to use the normal output voltage based on v_pos
|
||||
* or combine both as:
|
||||
* DEFAULT_555_VALUES
|
||||
*
|
||||
* Output Types:
|
||||
* See DISCRETE_555_ASTABLE for description.
|
||||
*
|
||||
@ -2942,7 +3019,7 @@
|
||||
* | En|<--------. | .---|Discharge |
|
||||
* '----' | gnd | '------------'
|
||||
* | | |
|
||||
* gnd '-----------------------+---ZZZZ------> 5V
|
||||
* gnd '-----------------------+---ZZZZ------> v_charge (ignored)
|
||||
* rX
|
||||
*
|
||||
* Declaration syntax
|
||||
@ -2958,12 +3035,16 @@
|
||||
* Vin2 (CV) node or static value,
|
||||
* address of discrete_555_vco1_desc structure)
|
||||
*
|
||||
* discrete_555_vco1_desc = {options, // bit mapped options
|
||||
* r1, r2, r3, r4, c,
|
||||
* v555, // B+ voltage of 555
|
||||
* v555high, // High output voltage of 555 (Usually v555 - 1.2V)
|
||||
* threshold555, // normally 2/3 of v555
|
||||
* trigger555} // normally 1/3 of v555
|
||||
* discrete_555_vco1_desc =
|
||||
* {
|
||||
* options, - bit mapped options
|
||||
* r1, r2, r3, r4, c,
|
||||
* v_pos, - B+ voltage of 555
|
||||
* v_out_high, - High output voltage of 555 (Defaults to v_pos - 1.2V)
|
||||
* }
|
||||
*
|
||||
* The last option of discrete_555_vco1_desc can use the following default:
|
||||
* DEFAULT_555_HIGH - to use the normal output voltage based on v_pos
|
||||
*
|
||||
* Notes: The value of resistor rX is not needed. It is just a pull-up
|
||||
* for the discharge output.
|
||||
@ -3543,15 +3624,15 @@ typedef struct _discrete_mixer_desc discrete_mixer_desc;
|
||||
struct _discrete_mixer_desc
|
||||
{
|
||||
int type;
|
||||
double r[DISC_MAX_MIXER_INPUTS]; // static input resistance values. These are in series with rNode, if used.
|
||||
int rNode[DISC_MAX_MIXER_INPUTS]; // variable resistance nodes, if needed. 0 if not used.
|
||||
double r[DISC_MAX_MIXER_INPUTS]; /* static input resistance values. These are in series with rNode, if used. */
|
||||
int r_node[DISC_MAX_MIXER_INPUTS]; /* variable resistance nodes, if needed. 0 if not used. */
|
||||
double c[DISC_MAX_MIXER_INPUTS];
|
||||
double rI;
|
||||
double rF;
|
||||
double cF;
|
||||
double cAmp;
|
||||
double vRef;
|
||||
double gain; // Scale value to get output close to +/- 32767
|
||||
double gain; /* Scale value to get output close to +/- 32767 */
|
||||
};
|
||||
|
||||
|
||||
@ -3632,44 +3713,40 @@ struct _discrete_op_amp_filt_info
|
||||
};
|
||||
|
||||
|
||||
#define DEFAULT_555_CHARGE -1
|
||||
#define DEFAULT_555_HIGH -1
|
||||
#define DEFAULT_555_THRESHOLD -1
|
||||
#define DEFAULT_555_TRIGGER -1
|
||||
#define DEFAULT_555_VALUES DEFAULT_555_HIGH, DEFAULT_555_THRESHOLD, DEFAULT_555_TRIGGER
|
||||
#define DEFAULT_555_VALUES DEFAULT_555_CHARGE, DEFAULT_555_HIGH
|
||||
|
||||
typedef struct _discrete_555_desc discrete_555_desc;
|
||||
struct _discrete_555_desc
|
||||
{
|
||||
int options; // bit mapped options
|
||||
double v555; // B+ voltage of 555
|
||||
double v555high; // High output voltage of 555 (Usually v555 - 1.2V)
|
||||
double threshold555; // normally 2/3 of v555
|
||||
double trigger555; // normally 1/3 of v555
|
||||
int options; /* bit mapped options */
|
||||
double v_pos; /* B+ voltage of 555 */
|
||||
double v_charge; /* voltage to charge circuit (Defaults to v_pos) */
|
||||
double v_out_high; /* High output voltage of 555 (Defaults to v_pos - 1.2V) */
|
||||
};
|
||||
|
||||
#define DEFAULT_555_CC_SOURCE DEFAULT_555_CHARGE
|
||||
|
||||
typedef struct _discrete_555_cc_desc discrete_555_cc_desc;
|
||||
struct _discrete_555_cc_desc
|
||||
{
|
||||
int options; // bit mapped options
|
||||
double v555; // B+ voltage of 555
|
||||
double v555high; // High output voltage of 555 (Usually v555 - 1.2V)
|
||||
double threshold555; // normally 2/3 of v555
|
||||
double trigger555; // normally 1/3 of v555
|
||||
double vCCsource; // B+ voltage of the Constant Current source
|
||||
double vCCjunction; // The voltage drop of the Constant Current source transitor (0 if Op Amp)
|
||||
int options; /* bit mapped options */
|
||||
double v_pos; /* B+ voltage of 555 */
|
||||
double v_cc_source; /* Voltage of the Constant Current source */
|
||||
double v_out_high; /* High output voltage of 555 (Defaults to v_pos - 1.2V) */
|
||||
double v_cc_junction; /* The voltage drop of the Constant Current source transitor (0 if Op Amp) */
|
||||
};
|
||||
|
||||
|
||||
typedef struct _discrete_555_vco1_desc discrete_555_vco1_desc;
|
||||
struct _discrete_555_vco1_desc
|
||||
{
|
||||
int options; // bit mapped options
|
||||
double r1, r2, r3, r4, c;
|
||||
double v555; // B+ voltage of 555
|
||||
double v555high; // High output voltage of 555 (Usually v555 - 1.2V)
|
||||
double threshold555; // normally 2/3 of v555
|
||||
double trigger555; // normally 1/3 of v555
|
||||
int options; /* bit mapped options */
|
||||
double r1, r2, r3, r4, c;
|
||||
double v_pos; /* B+ voltage of 555 */
|
||||
double v_charge; /* (ignored) */
|
||||
double v_out_high; /* High output voltage of 555 (Defaults to v_pos - 1.2V) */
|
||||
};
|
||||
|
||||
|
||||
@ -3958,7 +4035,7 @@ enum
|
||||
/* from disc_wav.c */
|
||||
/* generic modules */
|
||||
#define DISCRETE_COUNTER(NODE,ENAB,RESET,CLK,MAX,DIR,INIT0,CLKTYPE) { NODE, DSS_COUNTER , 7, { ENAB,RESET,CLK,NODE_NC,DIR,INIT0,NODE_NC }, { ENAB,RESET,CLK,MAX,DIR,INIT0,CLKTYPE }, NULL, "DISCRETE_COUNTER" },
|
||||
#define DISCRETE_COUNTER_7492(NODE,ENAB,RESET,CLK) { NODE, DSS_COUNTER , 7, { ENAB,RESET,CLK,NODE_NC,NODE_NC,NODE_NC,NODE_NC }, { ENAB,RESET,CLK,5,1,0,DISC_COUNTER_IS_7492 }, NULL, "DISCRETE_COUNTER_7492" },
|
||||
#define DISCRETE_COUNTER_7492(NODE,ENAB,RESET,CLK,CLKTYPE) { NODE, DSS_COUNTER , 7, { ENAB,RESET,CLK,NODE_NC,NODE_NC,NODE_NC,NODE_NC }, { ENAB,RESET,CLK,CLKTYPE,1,0,DISC_COUNTER_IS_7492 }, NULL, "DISCRETE_COUNTER_7492" },
|
||||
#define DISCRETE_LFSR_NOISE(NODE,ENAB,RESET,CLK,AMPL,FEED,BIAS,LFSRTB) { NODE, DSS_LFSR_NOISE , 6, { ENAB,RESET,CLK,AMPL,FEED,BIAS }, { ENAB,RESET,CLK,AMPL,FEED,BIAS }, LFSRTB, "LFSR Noise Source" },
|
||||
#define DISCRETE_NOISE(NODE,ENAB,FREQ,AMPL,BIAS) { NODE, DSS_NOISE , 4, { ENAB,FREQ,AMPL,BIAS }, { ENAB,FREQ,AMPL,BIAS }, NULL, "Noise Source" },
|
||||
#define DISCRETE_NOTE(NODE,ENAB,CLK,DATA,MAX1,MAX2,CLKTYPE) { NODE, DSS_NOTE , 6, { ENAB,CLK,DATA,NODE_NC,NODE_NC,NODE_NC }, { ENAB,CLK,DATA,MAX1,MAX2,CLKTYPE }, NULL, "Note Generator" },
|
||||
@ -4079,6 +4156,8 @@ enum
|
||||
#define DISCRETE_555_VCO1_CV(NODE,RESET,VIN,CTRLV,OPTIONS) { NODE, DSD_555_VCO1 , 3, { RESET,VIN,CTRLV }, { RESET,VIN,CTRLV }, OPTIONS, "555 VCO1 with CV - Op-Amp type" },
|
||||
#define DISCRETE_566(NODE,ENAB,VMOD,R,C,OPTIONS) { NODE, DSD_566 , 4, { ENAB,VMOD,R,C }, { ENAB,VMOD,R,C }, OPTIONS, "566" },
|
||||
#define DISCRETE_74LS624(NODE,ENAB,VMOD,VRNG,C,OUTTYPE) { NODE, DSD_LS624 , 5, { ENAB,VMOD,VRNG,C,NODE_NC }, { ENAB,VMOD,VRNG,C, OUTTYPE }, NULL, "74LS624" },
|
||||
|
||||
/* logging */
|
||||
#define DISCRETE_CSVLOG1(NODE1) { NODE_SPECIAL, DSO_CSVLOG , 1, { NODE1 }, { NODE1 }, NULL, "CSV Log 1 Node" },
|
||||
#define DISCRETE_CSVLOG2(NODE1,NODE2) { NODE_SPECIAL, DSO_CSVLOG , 2, { NODE1,NODE2 }, { NODE1,NODE2 }, NULL, "CSV Log 2 Nodes" },
|
||||
#define DISCRETE_CSVLOG3(NODE1,NODE2,NODE3) { NODE_SPECIAL, DSO_CSVLOG , 3, { NODE1,NODE2,NODE3 }, { NODE1,NODE2,NODE3 }, NULL, "CSV Log 3 Nodes" },
|
||||
@ -4086,6 +4165,7 @@ enum
|
||||
#define DISCRETE_CSVLOG5(NODE1,NODE2,NODE3,NODE4,NODE5) { NODE_SPECIAL, DSO_CSVLOG , 5, { NODE1,NODE2,NODE3,NODE4,NODE5 }, { NODE1,NODE2,NODE3,NODE4,NODE5 }, NULL, "CSV Log 5 Nodes" },
|
||||
#define DISCRETE_WAVELOG1(NODE1,GAIN1) { NODE_SPECIAL, DSO_WAVELOG , 2, { NODE1,NODE_NC }, { NODE1,GAIN1 }, NULL, "Wave Log 1 Node" },
|
||||
#define DISCRETE_WAVELOG2(NODE1,GAIN1,NODE2,GAIN2) { NODE_SPECIAL, DSO_WAVELOG , 4, { NODE1,NODE_NC,NODE2,NODE_NC }, { NODE1,GAIN1,NODE2,GAIN2 }, NULL, "Wave Log 2 Nodes" },
|
||||
/* output */
|
||||
#define DISCRETE_OUTPUT(OPNODE,GAIN) { NODE_SPECIAL, DSO_OUTPUT , 2, { OPNODE,NODE_NC }, { 0,GAIN }, NULL, "Output Node" },
|
||||
|
||||
|
||||
|
@ -44,7 +44,6 @@ static const discrete_555_cc_desc asteroid_thump_555cc =
|
||||
DISC_555_OUT_SQW | DISC_555_OUT_AC | DISCRETE_555_CC_TO_CAP,
|
||||
5, // B+ voltage of 555
|
||||
DEFAULT_555_VALUES,
|
||||
5, // B+ voltage of the Constant Current source
|
||||
0.8 // VBE 2N3906 (Si)
|
||||
};
|
||||
|
||||
|
@ -95,14 +95,14 @@ static const discrete_mixer_desc crash_mixer =
|
||||
|
||||
static const discrete_555_desc crash_beeper_555m =
|
||||
{
|
||||
DISC_555_TRIGGER_IS_LOGIC | DISC_555_OUT_DC | DISC_555_OUT_SQW,
|
||||
DISC_555_OUT_SQW | DISC_555_OUT_DC | DISC_555_TRIGGER_IS_LOGIC,
|
||||
5, // B+ voltage of 555
|
||||
DEFAULT_555_VALUES
|
||||
};
|
||||
|
||||
static const discrete_555_desc crash_beeper_555a =
|
||||
{
|
||||
DISC_555_OUT_DC | DISC_555_OUT_SQW,
|
||||
DISC_555_OUT_SQW | DISC_555_OUT_DC,
|
||||
5, // B+ voltage of 555
|
||||
DEFAULT_555_VALUES
|
||||
};
|
||||
|
@ -201,62 +201,73 @@ static const discrete_lfsr_desc dkong_lfsr =
|
||||
};
|
||||
|
||||
static const discrete_mixer_desc dkong_rc_jump_desc =
|
||||
{DISC_MIXER_IS_RESISTOR,
|
||||
{1, DK_R49+DK_R51,NE555_INTERNAL_R,2*NE555_INTERNAL_R},
|
||||
{NODE_26,0,0,0},
|
||||
{0,0,0,0}, // no node capacitors
|
||||
0, 0,
|
||||
DK_C24,
|
||||
0,
|
||||
0, 1};
|
||||
{
|
||||
DISC_MIXER_IS_RESISTOR,
|
||||
{1, DK_R49+DK_R51,NE555_INTERNAL_R,2*NE555_INTERNAL_R},
|
||||
{NODE_26,0,0,0},
|
||||
{0,0,0,0}, // no node capacitors
|
||||
0, 0,
|
||||
DK_C24,
|
||||
0,
|
||||
0, 1
|
||||
};
|
||||
|
||||
static const discrete_mixer_desc dkong_rc_walk_desc =
|
||||
{DISC_MIXER_IS_RESISTOR,
|
||||
{1, DK_R45+DK_R44,NE555_INTERNAL_R,2*NE555_INTERNAL_R},
|
||||
{NODE_52,0,0,0},
|
||||
{0,0,0,0}, // no node capacitors
|
||||
0, 0,
|
||||
DK_C29,
|
||||
0,
|
||||
0, 1};
|
||||
{
|
||||
DISC_MIXER_IS_RESISTOR,
|
||||
{1, DK_R45+DK_R44,NE555_INTERNAL_R,2*NE555_INTERNAL_R},
|
||||
{NODE_52,0,0,0},
|
||||
{0,0,0,0}, // no node capacitors
|
||||
0, 0,
|
||||
DK_C29,
|
||||
0,
|
||||
0, 1
|
||||
};
|
||||
|
||||
static const discrete_mixer_desc dkong_mixer_desc =
|
||||
{DISC_MIXER_IS_RESISTOR,
|
||||
{DK_R2, DK_R24, DK_R1, DK_R14},
|
||||
{0,0,0}, // no variable resistors
|
||||
{0,0,0}, // no node capacitors
|
||||
{
|
||||
DISC_MIXER_IS_RESISTOR,
|
||||
{DK_R2, DK_R24, DK_R1, DK_R14},
|
||||
{0,0,0}, // no variable resistors
|
||||
{0,0,0}, // no node capacitors
|
||||
#if DK_REVIEW
|
||||
0, RES_K(10),
|
||||
0, RES_K(10),
|
||||
#else
|
||||
0, 0,
|
||||
0, 0,
|
||||
#endif
|
||||
DK_C159,
|
||||
DK_C12,
|
||||
0, 1};
|
||||
DK_C159,
|
||||
DK_C12,
|
||||
0, 1
|
||||
};
|
||||
|
||||
/* There is no load on the output for the jump circuit
|
||||
* For the walk circuit, the voltage does not matter */
|
||||
|
||||
static const discrete_555_desc dkong_555_vco_desc =
|
||||
{DISC_555_OUT_DC | DISC_555_OUT_ENERGY,
|
||||
DK_SUP_V,
|
||||
DK_SUP_V-0.5,DK_SUP_V*0.66,DK_SUP_V*0.33
|
||||
};
|
||||
{
|
||||
DISC_555_OUT_ENERGY | DISC_555_OUT_DC,
|
||||
DK_SUP_V,
|
||||
DEFAULT_555_CHARGE,
|
||||
DK_SUP_V - 0.5
|
||||
};
|
||||
|
||||
static const discrete_inverter_osc_desc dkong_inverter_osc_desc_jump =
|
||||
{DEFAULT_CD40XX_VALUES(DK_SUP_V),
|
||||
{
|
||||
DEFAULT_CD40XX_VALUES(DK_SUP_V),
|
||||
DISC_OSC_INVERTER_IS_TYPE1
|
||||
};
|
||||
};
|
||||
|
||||
static const discrete_inverter_osc_desc dkong_inverter_osc_desc_walk =
|
||||
{DEFAULT_CD40XX_VALUES(DK_SUP_V),
|
||||
{
|
||||
DEFAULT_CD40XX_VALUES(DK_SUP_V),
|
||||
DISC_OSC_INVERTER_IS_TYPE2
|
||||
};
|
||||
};
|
||||
|
||||
static const discrete_op_amp_filt_info dkong_sallen_key_info =
|
||||
{ RES_K(5.6), RES_K(5.6), 0, 0, 0,
|
||||
CAP_N(22), CAP_N(10), 0
|
||||
};
|
||||
{
|
||||
RES_K(5.6), RES_K(5.6), 0, 0, 0,
|
||||
CAP_N(22), CAP_N(10), 0
|
||||
};
|
||||
|
||||
static DISCRETE_SOUND_START(dkong2b)
|
||||
|
||||
@ -502,11 +513,7 @@ static const discrete_mixer_desc radarscp_mixer_desc_7 =
|
||||
/* There is no load on the output for the jump circuit
|
||||
* For the walk circuit, the voltage does not matter */
|
||||
|
||||
static const discrete_555_desc radarscp_555_vco_desc =
|
||||
{DISC_555_OUT_DC | DISC_555_OUT_ENERGY,
|
||||
DK_SUP_V,
|
||||
DK_SUP_V-0.5,DK_SUP_V*0.66,DK_SUP_V*0.33
|
||||
};
|
||||
#define radarscp_555_vco_desc dkong_555_vco_desc
|
||||
|
||||
static const discrete_inverter_osc_desc radarscp_inverter_osc_desc_0 =
|
||||
{DEFAULT_CD40XX_VALUES(DK_SUP_V),
|
||||
|
@ -110,7 +110,6 @@ static const discrete_555_cc_desc firetrk_motor_vco =
|
||||
DISC_555_OUT_DC | DISC_555_OUT_SQW,
|
||||
5, // B+ voltage of 555
|
||||
DEFAULT_555_VALUES,
|
||||
5, // B+ voltage of the Constant Current source
|
||||
0.7 // Q2 junction voltage
|
||||
};
|
||||
|
||||
@ -222,7 +221,7 @@ DISCRETE_SOUND_START(firetrk)
|
||||
RES_M(1), 0, 0, // R28, no rGnd, no rDis
|
||||
&firetrk_motor_vco)
|
||||
DISCRETE_COUNTER_7492(NODE_23, 1, FIRETRUCK_ATTRACT_EN, // IC A9, QB-QD
|
||||
NODE_22) // from IC B9, pin 3
|
||||
NODE_22, DISC_CLK_ON_F_EDGE) // from IC B9, pin 3
|
||||
DISCRETE_TRANSFORM2(NODE_24, 1, NODE_23, 0x04, "01&") // IC A9, pin 8
|
||||
DISCRETE_COUNTER(NODE_25, 1, FIRETRUCK_ATTRACT_EN, // IC A9, pin 12
|
||||
NODE_24, // from IC A9, pin 8
|
||||
@ -337,7 +336,6 @@ static const discrete_555_cc_desc superbug_motor_vco =
|
||||
DISC_555_OUT_DC | DISC_555_OUT_SQW,
|
||||
5, // B+ voltage of 555
|
||||
DEFAULT_555_VALUES,
|
||||
5, // B+ voltage of the Constant Current source
|
||||
0.7 // Q1 junction voltage
|
||||
};
|
||||
|
||||
@ -426,8 +424,8 @@ DISCRETE_SOUND_START(superbug)
|
||||
RES_M(3.3), 0, 0, // R11, no rGnd, no rDis
|
||||
&superbug_motor_vco)
|
||||
DISCRETE_COUNTER_7492(NODE_23, 1, SUPERBUG_ATTRACT_EN, // IC A7, QB-QD
|
||||
NODE_22) // from IC A6, pin 3
|
||||
DISCRETE_TRANSFORM2(NODE_24, 1, NODE_23, 0x04, "01&") // IC A7, pin 8-QD
|
||||
NODE_22, DISC_CLK_ON_F_EDGE) // from IC A6, pin 3
|
||||
DISCRETE_TRANSFORM2(NODE_24, 1, NODE_23, 0x04, "01&") // IC A7, pin 8-QD
|
||||
DISCRETE_TRANSFORM2(NODE_25, 1, NODE_23, 0x01, "01&") // IC A7, pin 11-QB
|
||||
DISCRETE_LOGIC_XOR(NODE_26, 1, NODE_24, NODE_25) // Gate A9, pin 8
|
||||
DISCRETE_COUNTER(NODE_27, 1, SUPERBUG_ATTRACT_EN, // IC A7, pin 12-QA
|
||||
@ -498,7 +496,6 @@ static const discrete_555_cc_desc montecar_motor_vco =
|
||||
DISC_555_OUT_DC | DISC_555_OUT_SQW,
|
||||
5, // B+ voltage of 555
|
||||
DEFAULT_555_VALUES,
|
||||
5, // B+ voltage of the Constant Current source
|
||||
0.7 // Q1 junction voltage
|
||||
};
|
||||
|
||||
@ -611,7 +608,7 @@ DISCRETE_SOUND_START(montecar)
|
||||
RES_M(1), 0, 0, // R86, no rGnd, no rDis
|
||||
&montecar_motor_vco)
|
||||
DISCRETE_COUNTER_7492(NODE_23, 1, MONTECAR_ATTRACT_EN, // IC B/C9, QB-QD
|
||||
NODE_22) // from IC C9, pin 9
|
||||
NODE_22, DISC_CLK_ON_F_EDGE) // from IC C9, pin 9
|
||||
DISCRETE_TRANSFORM2(NODE_24, 1, NODE_23, 0x04, "01&") // IC B/C9, pin 8-QD
|
||||
DISCRETE_TRANSFORM2(NODE_25, 1, NODE_23, 0x01, "01&") // IC B/C9, pin 11-QB
|
||||
DISCRETE_LOGIC_XOR(NODE_26, 1, NODE_24, NODE_25) // Gate A9, pin 11
|
||||
@ -646,7 +643,7 @@ DISCRETE_SOUND_START(montecar)
|
||||
RES_M(1), 0, 0, // R81, no rGnd, no rDis
|
||||
&montecar_motor_vco)
|
||||
DISCRETE_COUNTER_7492(NODE_43, 1, MONTECAR_ATTRACT_EN, // IC A/B9, QB-QD
|
||||
NODE_42) // from IC C9, pin 5
|
||||
NODE_42, DISC_CLK_ON_F_EDGE) // from IC C9, pin 5
|
||||
DISCRETE_TRANSFORM2(NODE_44, 1, NODE_43, 0x04, "01&") // IC A/B9, pin 8-QD
|
||||
DISCRETE_TRANSFORM2(NODE_45, 1, NODE_43, 0x01, "01&") // IC A/B9, pin 11-QB
|
||||
DISCRETE_LOGIC_XOR(NODE_46, 1, NODE_44, NODE_45) // Gate A9, pin 6
|
||||
|
@ -3151,10 +3151,9 @@ static const discrete_comp_adder_table invaders_thump_resistors =
|
||||
static const discrete_555_desc invaders_thump_555 =
|
||||
{
|
||||
DISC_555_OUT_ENERGY | DISC_555_OUT_DC,
|
||||
5,
|
||||
5.0 - 0.6, /* 5V - diode drop */
|
||||
DEFAULT_TTL_V_LOGIC_1, /* Output of F3 7411 buffer */
|
||||
DEFAULT_555_THRESHOLD,
|
||||
DEFAULT_555_TRIGGER
|
||||
DEFAULT_TTL_V_LOGIC_1 /* Output of F3 7411 buffer */
|
||||
};
|
||||
|
||||
|
||||
@ -3708,8 +3707,8 @@ static const discrete_555_desc blueshrk_555_H1B =
|
||||
{
|
||||
DISC_555_OUT_ENERGY | DISC_555_OUT_DC,
|
||||
5, /* B+ voltage of 555 */
|
||||
12, /* the OC buffer H2 converts the output voltage to 12V. */
|
||||
DEFAULT_555_THRESHOLD, DEFAULT_555_TRIGGER
|
||||
DEFAULT_555_CHARGE,
|
||||
12 /* the OC buffer H2 converts the output voltage to 12V. */
|
||||
};
|
||||
|
||||
|
||||
|
@ -238,7 +238,8 @@ static const discrete_555_desc phoenix_effect2_555 =
|
||||
{
|
||||
DISC_555_OUT_ENERGY,
|
||||
5, // B+ voltage of 555
|
||||
4.0, DEFAULT_555_THRESHOLD, DEFAULT_555_TRIGGER
|
||||
DEFAULT_555_CHARGE,
|
||||
4.0 // loaded output voltage
|
||||
};
|
||||
|
||||
static const discrete_comp_adder_table phoenix_effect2_cap_sel =
|
||||
@ -335,52 +336,145 @@ DISCRETE_SOUND_START(phoenix)
|
||||
/* - level 5 spaceship */
|
||||
/************************************************/
|
||||
/* R22 has been confirmed on real boards as 470 ohm, not 47k in schematics */
|
||||
DISCRETE_RCDISC4(NODE_20, 1, PHOENIX_EFFECT_1_FREQ, 470, RES_K(100), RES_K(33), CAP_U(6.8), 12, 1) // R22, R23, R24, C7
|
||||
DISCRETE_555_ASTABLE_CV(NODE_21, 1, RES_K(47), RES_K(47), CAP_U(.001), NODE_20, &phoenix_effect1_555) // R25, R26, C8
|
||||
DISCRETE_RCDISC4(NODE_20, /* IC52 output pin 7 */
|
||||
1, /* ENAB */
|
||||
PHOENIX_EFFECT_1_FREQ, /* Input to O.C. inverter */
|
||||
470, /* R22 */
|
||||
RES_K(100), /* R23 */
|
||||
RES_K(33), /* R24 */
|
||||
CAP_U(6.8), /* C7 */
|
||||
12, /* 12V supply */
|
||||
1) /* Circuit type 1 */
|
||||
DISCRETE_555_ASTABLE_CV(NODE_21, /* IC20 pin 6 */
|
||||
1, /* ENAB */
|
||||
RES_K(47), /* R25 */
|
||||
RES_K(47), /* R26 */
|
||||
CAP_U(.001), /* C8 */
|
||||
NODE_20, /* IC48 pin 5 input */
|
||||
&phoenix_effect1_555)
|
||||
/* LS163 counts rising edge, but the LS14 inverts that */
|
||||
DISCRETE_NOTE(NODE_22, 1, NODE_21, PHOENIX_EFFECT_1_DATA, 0x0f, 1, DISC_CLK_BY_COUNT | DISC_OUT_IS_ENERGY)
|
||||
DISCRETE_NOTE(NODE_22, /* IC21 pin 5 output */
|
||||
1, /* ENAB */
|
||||
NODE_21, /* IC13 pin 2 clock input */
|
||||
PHOENIX_EFFECT_1_DATA, /* Pre-load data */
|
||||
0x0f, /* Maximum count of first counter 0-15 (IC13) */
|
||||
1, /* Maximum count of second counter 0-1 (IC21) */
|
||||
DISC_CLK_BY_COUNT | DISC_OUT_IS_ENERGY) /* Module is clocked externally and we anti-alias output */
|
||||
/* When FILT is enabled, the effect is filtered.
|
||||
* While the R20 does decrease the amplitude a little, its main purpose
|
||||
* is to discharge C5 when the filter is disabled. */
|
||||
DISCRETE_SWITCH(NODE_23, 1, PHOENIX_EFFECT_1_FILT, DEFAULT_TTL_V_LOGIC_1, DEFAULT_TTL_V_LOGIC_1 * RES_K(100) / (RES_K(10) + RES_K(100))) // R20, R19
|
||||
DISCRETE_MULTIPLY(NODE_24, 1, NODE_22, NODE_23)
|
||||
DISCRETE_RCFILTER(NODE_25, 1, NODE_24, 1.0/(1.0/RES_K(10) + 1.0/RES_K(100)), CAP_U(.047)) // R19, R20, C5
|
||||
DISCRETE_SWITCH(PHOENIX_EFFECT_1_SND, 1, PHOENIX_EFFECT_1_FILT, NODE_24, NODE_25)
|
||||
DISCRETE_SWITCH(NODE_23,
|
||||
1, /* ENAB */
|
||||
PHOENIX_EFFECT_1_FILT,
|
||||
DEFAULT_TTL_V_LOGIC_1,
|
||||
DEFAULT_TTL_V_LOGIC_1 * RES_K(100) / (RES_K(10) + RES_K(100))) /* R20, R19 */
|
||||
DISCRETE_MULTIPLY(NODE_24,
|
||||
1, /* ENAB */
|
||||
NODE_22,
|
||||
NODE_23)
|
||||
DISCRETE_RCFILTER(NODE_25,
|
||||
1,
|
||||
NODE_24,
|
||||
1.0/(1.0/RES_K(10) + 1.0/RES_K(100)), /* R19, R20 */
|
||||
CAP_U(.047)) /* C5 */
|
||||
DISCRETE_SWITCH(PHOENIX_EFFECT_1_SND,
|
||||
1, /* ENAB */
|
||||
PHOENIX_EFFECT_1_FILT,
|
||||
NODE_24, /* non-filtered */
|
||||
NODE_25) /* filtered */
|
||||
|
||||
/************************************************/
|
||||
/* Effect 2 */
|
||||
/* - bird flying, bird/phoenix/spaceship hit */
|
||||
/* - phoenix wing hit */
|
||||
/************************************************/
|
||||
DISCRETE_COMP_ADDER(NODE_30, 1, PHOENIX_EFFECT_2_FREQ, &phoenix_effect2_cap_sel)
|
||||
DISCRETE_COMP_ADDER(NODE_30, /* total capacitance of selected capacitors */
|
||||
1, /* ENAB */
|
||||
PHOENIX_EFFECT_2_FREQ, /* passed selection bits */
|
||||
&phoenix_effect2_cap_sel)
|
||||
/* Part of the frequency select also effects the gain */
|
||||
DISCRETE_TRANSFORM2(NODE_31, 1, PHOENIX_EFFECT_2_FREQ, 2, "01&1/") // get bit 0x02
|
||||
DISCRETE_SWITCH(NODE_32, 1, NODE_31, DEFAULT_TTL_V_LOGIC_1, DEFAULT_TTL_V_LOGIC_1/2)
|
||||
DISCRETE_555_ASTABLE(NODE_33, 1, RES_K(47), RES_K(100), NODE_30, &phoenix_effect2_555) // R40, R41
|
||||
DISCRETE_TRANSFORM2(NODE_31, /* 0/1 state of PHOENIX_EFFECT_2_FREQ high bit */
|
||||
1, /* ENAB */
|
||||
PHOENIX_EFFECT_2_FREQ, 2, "01&1/") // get bit 0x02
|
||||
DISCRETE_SWITCH(NODE_32, /* voltage level */
|
||||
1, /* ENAB */
|
||||
NODE_31, /* PHOENIX_EFFECT_2_FREQ high bit determines voltage level */
|
||||
DEFAULT_TTL_V_LOGIC_1,
|
||||
DEFAULT_TTL_V_LOGIC_1 / 2)
|
||||
DISCRETE_555_ASTABLE(NODE_33, /* pin 3 output of IC44 */
|
||||
1, /* ENAB */
|
||||
RES_K(47), /* R40 */
|
||||
RES_K(100), /* R41 */
|
||||
NODE_30, /* C16, C17, C18 combined */
|
||||
&phoenix_effect2_555)
|
||||
/* C20 has been confirmed on real boards as 1uF, not 10uF in schematics */
|
||||
DISCRETE_555_ASTABLE(NODE_34, 1, RES_K(510), RES_K(510), CAP_U(1), &phoenix_effect2_555) // R23, R24, C20
|
||||
DISCRETE_555_ASTABLE(NODE_34, /* pin 3 output of IC51 */
|
||||
1, /* ENAB */
|
||||
RES_K(510), /* R23 */
|
||||
RES_K(510), /* R24 */
|
||||
CAP_U(1), /* C20 */
|
||||
&phoenix_effect2_555)
|
||||
/* R45 & R46 have been confirmed on real boards as 5.1k, not 51k in schematics */
|
||||
/* We need to work backwards here and calculate the voltage at the junction of R42 & R46 */
|
||||
/* If you remove C22 from the real PCB, you can WAVELOG NODE_35 with a gain of 1000 and compare
|
||||
* it against the junction of R42 & R46 on a real PCB. */
|
||||
DISCRETE_MIXER3(NODE_35, 1, NODE_33, NODE_34, 5, &phoenix_effect2_mixer1)
|
||||
DISCRETE_MIXER3(NODE_35, /* Voltage at junction of R42 & R46 with C22 removed */
|
||||
1, /* ENAB */
|
||||
NODE_33, /* output from IC44 */
|
||||
NODE_34, /* output from IC51 */
|
||||
5, /* B+ connected internally to pin 5 of 555 */
|
||||
&phoenix_effect2_mixer1)
|
||||
/* Then calculate the voltage going to C22 */
|
||||
/* If you remove C22 from the real PCB, you can WAVELOG NODE_36 with a gain of 1000 and compare
|
||||
* it against the junction of R45 & R46 on a real PCB. */
|
||||
DISCRETE_MIXER2(NODE_36, 1, NODE_34, NODE_35, &phoenix_effect2_mixer2)
|
||||
DISCRETE_MIXER2(NODE_36, /* Voltage at junction of R45 & R46 with C22 removed */
|
||||
1, /* ENAB */
|
||||
NODE_34, /* pin 3 output of IC51 */
|
||||
NODE_35, /* Voltage at junction of R42 & R46 with C22 removed */
|
||||
&phoenix_effect2_mixer2)
|
||||
/* C22 charging is R45 in parallel with R46, R42 and the 555 CV internal resistance */
|
||||
DISCRETE_RCFILTER(NODE_37, 1, NODE_36, 1.0/ (1.0/RES_K(5.1) + (1.0/(RES_K(5.1) + 1.0/(1.0/RES_K(10) + 1.0/RES_K(5) + 1.0/RES_K(10)) ))), CAP_U(100)) // R45, R46, R42, internal 555 Rs, C22
|
||||
DISCRETE_RCFILTER(NODE_37,
|
||||
1, /* ENAB */
|
||||
NODE_36,
|
||||
1.0/ (1.0/RES_K(5.1) + (1.0/(RES_K(5.1) + 1.0/(1.0/RES_K(10) + 1.0/RES_K(5) + 1.0/RES_K(10)) ))),
|
||||
CAP_U(100)) /* R45, R46, R42, internal 555 Rs, C22 */
|
||||
/* Now mix from C22 on */
|
||||
/* You can WAVELOG NODE_38 with a gain of 1000 and compare it against IC50 pin 5 on a real PCB. */
|
||||
DISCRETE_MIXER3(NODE_38, 1, NODE_33, NODE_37, 5, &phoenix_effect2_mixer3)
|
||||
DISCRETE_555_ASTABLE_CV(NODE_39, 1, RES_K(20), RES_K(20), CAP_U(0.001), NODE_38, &phoenix_effect1_555) // R47, R48, C23
|
||||
DISCRETE_NOTE(NODE_40, 1, NODE_39, PHOENIX_EFFECT_2_DATA, 0x0f, 1, DISC_CLK_BY_COUNT | DISC_OUT_IS_ENERGY)
|
||||
DISCRETE_MULTIPLY(PHOENIX_EFFECT_2_SND, 1, NODE_40, NODE_32)
|
||||
DISCRETE_MIXER3(NODE_38, /* control voltage to pin 5 of IC50 */
|
||||
1, /* ENAB */
|
||||
NODE_33, /* pin 3 output of IC44 */
|
||||
NODE_37, /* voltage on C22 */
|
||||
5, /* IC50 internally connected to B+ */
|
||||
&phoenix_effect2_mixer3)
|
||||
DISCRETE_555_ASTABLE_CV(NODE_39, /* IC20 pin 8 output */
|
||||
1, /* ENAB */
|
||||
RES_K(20), /* R47 */
|
||||
RES_K(20), /* R48 */
|
||||
CAP_U(0.001), /* C23 */
|
||||
NODE_38, /* IC50 pin 5 input */
|
||||
&phoenix_effect1_555)
|
||||
DISCRETE_NOTE(NODE_40, /* IC21 pin 9 output */
|
||||
1, /* ENAB */
|
||||
NODE_39, /* IC14 pin 2 clock input */
|
||||
PHOENIX_EFFECT_2_DATA, /* Pre-load data */
|
||||
0x0f, /* Maximum count of first counter 0-15 (IC14) */
|
||||
1, /* Maximum count of second counter 0-1 (IC21) */
|
||||
DISC_CLK_BY_COUNT | DISC_OUT_IS_ENERGY)
|
||||
DISCRETE_MULTIPLY(PHOENIX_EFFECT_2_SND,
|
||||
1, /* ENAB */
|
||||
NODE_40, /* IC21 pin 9 output */
|
||||
NODE_32) /* voltage level selected by high bit of PHOENIX_EFFECT_2_FREQ */
|
||||
|
||||
/************************************************/
|
||||
/* Combine all sound sources. */
|
||||
/************************************************/
|
||||
DISCRETE_MIXER4(NODE_90, 1, PHOENIX_EFFECT_1_SND, PHOENIX_EFFECT_2_SND, PHOENIX_EFFECT_3_SND, PHOENIX_EFFECT_4_SND,&phoenix_mixer)
|
||||
DISCRETE_MIXER4(NODE_90,
|
||||
1, /* ENAB */
|
||||
PHOENIX_EFFECT_1_SND,
|
||||
PHOENIX_EFFECT_2_SND,
|
||||
PHOENIX_EFFECT_3_SND,
|
||||
PHOENIX_EFFECT_4_SND,
|
||||
&phoenix_mixer)
|
||||
|
||||
DISCRETE_OUTPUT(NODE_90, 1)
|
||||
DISCRETE_SOUND_END
|
||||
@ -389,9 +483,11 @@ WRITE8_HANDLER( phoenix_sound_control_a_w )
|
||||
{
|
||||
discrete_sound_w(machine, PHOENIX_EFFECT_2_DATA, data & 0x0f);
|
||||
discrete_sound_w(machine, PHOENIX_EFFECT_2_FREQ, (data & 0x30) >> 4);
|
||||
// discrete_sound_w(PHOENIX_EFFECT_3_EN , data & 0x40);
|
||||
// discrete_sound_w(PHOENIX_EFFECT_4_EN , data & 0x80);
|
||||
|
||||
#if 0
|
||||
/* future handling of noise sounds */
|
||||
discrete_sound_w(PHOENIX_EFFECT_3_EN , data & 0x40);
|
||||
discrete_sound_w(PHOENIX_EFFECT_4_EN , data & 0x80);
|
||||
#endif
|
||||
stream_update(channel);
|
||||
sound_latch_a = data;
|
||||
}
|
||||
|
@ -26,7 +26,6 @@ static const discrete_555_cc_desc poolshrk_score_vco =
|
||||
DISC_555_OUT_SQW,
|
||||
5, // B+ voltage of 555
|
||||
DEFAULT_555_VALUES,
|
||||
5, // B+ voltage of the Constant Current source
|
||||
0.7 // Q3 junction voltage
|
||||
};
|
||||
|
||||
|
@ -88,7 +88,7 @@ static const discrete_555_desc spiders_fire_555a =
|
||||
|
||||
static const discrete_555_desc spiders_super_web_555a =
|
||||
{
|
||||
DISC_555_OUT_DC | DISC_555_OUT_CAP,
|
||||
DISC_555_OUT_CAP | DISC_555_OUT_DC,
|
||||
5, // B+ voltage of 555
|
||||
DEFAULT_555_VALUES
|
||||
};
|
||||
|
@ -42,7 +42,6 @@ static const discrete_555_cc_desc sprint2_motor_vco =
|
||||
DISC_555_OUT_DC | DISC_555_OUT_SQW,
|
||||
5, // B+ voltage of 555
|
||||
DEFAULT_555_VALUES,
|
||||
5, // B+ voltage of the Constant Current source
|
||||
0.7 // VBE 2N3644 (Si)
|
||||
};
|
||||
|
||||
@ -140,7 +139,7 @@ DISCRETE_SOUND_START(sprint2)
|
||||
&sprint2_motor_vco)
|
||||
|
||||
/* QB-D of 7492 */
|
||||
DISCRETE_COUNTER_7492(NODE_23, 1, SPRINT2_ATTRACT_EN, NODE_22)
|
||||
DISCRETE_COUNTER_7492(NODE_23, 1, SPRINT2_ATTRACT_EN, NODE_22, DISC_CLK_ON_F_EDGE)
|
||||
|
||||
/* Mask the bits and XOR for clock input */
|
||||
DISCRETE_TRANSFORM2(NODE_24, 1, NODE_23, 1, "01&")
|
||||
@ -178,7 +177,7 @@ DISCRETE_SOUND_START(sprint2)
|
||||
&sprint2_motor_vco)
|
||||
|
||||
/* QB-D of 7492 */
|
||||
DISCRETE_COUNTER_7492(NODE_43, 1, SPRINT2_ATTRACT_EN, NODE_42)
|
||||
DISCRETE_COUNTER_7492(NODE_43, 1, SPRINT2_ATTRACT_EN, NODE_42, DISC_CLK_ON_F_EDGE)
|
||||
|
||||
/* Mask the bits and XOR for clock input */
|
||||
DISCRETE_TRANSFORM2(NODE_44, 1, NODE_43, 1, "01&")
|
||||
@ -263,7 +262,7 @@ DISCRETE_SOUND_START(sprint1)
|
||||
&sprint2_motor_vco)
|
||||
|
||||
/* QB-D of 7492 */
|
||||
DISCRETE_COUNTER_7492(NODE_23, 1, SPRINT2_ATTRACT_EN, NODE_22)
|
||||
DISCRETE_COUNTER_7492(NODE_23, 1, SPRINT2_ATTRACT_EN, NODE_22, DISC_CLK_ON_F_EDGE)
|
||||
|
||||
/* Mask the bits and XOR for clock input */
|
||||
DISCRETE_TRANSFORM2(NODE_24, 1, NODE_23, 1, "01&")
|
||||
@ -329,7 +328,6 @@ static const discrete_555_cc_desc dominos_tone_vco =
|
||||
DISC_555_OUT_DC | DISC_555_OUT_SQW,
|
||||
5, // B+ voltage of 555
|
||||
DEFAULT_555_VALUES,
|
||||
5, // B+ voltage of the Constant Current source
|
||||
0.7 // Q1 junction voltage
|
||||
};
|
||||
|
||||
@ -381,7 +379,7 @@ DISCRETE_SOUND_START(dominos)
|
||||
DISCRETE_DAC_R1(NODE_20, 1, DOMINOS_FREQ_DATA, DEFAULT_TTL_V_LOGIC_1, &dominos_tone_vco_dac)
|
||||
DISCRETE_555_CC(NODE_21, 1, NODE_20, DOMINOS_R23, CAP_U(.01), 0, 0, 0, &dominos_tone_vco)
|
||||
DISCRETE_COUNTER_7492(NODE_22, 1, DOMINOS_ATTRACT_EN, // IC D8, QB-QD
|
||||
NODE_21) // from IC D7/8, pin 3
|
||||
NODE_21, DISC_CLK_ON_F_EDGE) // from IC D7/8, pin 3
|
||||
DISCRETE_TRANSFORM2(NODE_23, 1, NODE_22, 0x01, "01&") // IC D8, pin 11-QB
|
||||
DISCRETE_SWITCH(NODE_24, 1, NODE_23, 0, // Enable gate C5
|
||||
DOMINOS_AMP_DATA) // IC C4
|
||||
|
@ -83,7 +83,6 @@ static const discrete_555_cc_desc sprint4_motor_vco =
|
||||
DISC_555_OUT_DC | DISC_555_OUT_SQW,
|
||||
5, // B+ voltage of 555
|
||||
DEFAULT_555_VALUES,
|
||||
5, // B+ voltage of the Constant Current source
|
||||
0.7 // Q1 junction voltage
|
||||
};
|
||||
|
||||
@ -191,7 +190,8 @@ static const discrete_mixer_desc sprint4_mixer =
|
||||
DISCRETE_COUNTER_7492(SPRINT4_PLAYER_MOTOR_NODE(4, _plr), /* IC D9, pins 11,9,8 */ \
|
||||
1, /* ENAB */ \
|
||||
SPRINT4_ATTRACT_EN, /* RESET */ \
|
||||
SPRINT4_PLAYER_MOTOR_NODE(3, _plr)) /* CLK */ \
|
||||
SPRINT4_PLAYER_MOTOR_NODE(3, _plr), /* CLK */ \
|
||||
DISC_CLK_ON_F_EDGE) \
|
||||
DISCRETE_TRANSFORM3(SPRINT4_PLAYER_MOTOR_NODE(5, _plr), /* IC B10, pin 3 */ \
|
||||
1, /* ENAB */ \
|
||||
SPRINT4_PLAYER_MOTOR_NODE(4, _plr), /* INP0 */ \
|
||||
|
@ -65,7 +65,7 @@ static const discrete_555_desc tank8_555_a =
|
||||
|
||||
static const discrete_555_desc tank8_555_m =
|
||||
{
|
||||
DISC_555_TRIGGER_IS_VOLTAGE | DISC_555_OUT_SQW | DISC_555_OUT_DC,
|
||||
DISC_555_OUT_SQW | DISC_555_OUT_DC | DISC_555_TRIGGER_IS_VOLTAGE,
|
||||
5, // B+ voltage of 555
|
||||
DEFAULT_555_VALUES
|
||||
};
|
||||
|
@ -77,7 +77,6 @@ static const discrete_555_cc_desc triplhnt_bear_roar_vco =
|
||||
DISC_555_OUT_DC | DISC_555_OUT_SQW,
|
||||
5, // B+ voltage of 555
|
||||
DEFAULT_555_VALUES,
|
||||
5, // B+ voltage of the Constant Current source
|
||||
0.7 // Q2 junction voltage
|
||||
};
|
||||
|
||||
|
@ -38,7 +38,7 @@ static emu_timer *frogs_croak_timer;
|
||||
|
||||
static const discrete_555_desc frogsZip555m =
|
||||
{
|
||||
DISC_555_TRIGGER_IS_LOGIC | DISC_555_OUT_DC | DISC_555_OUT_CAP,
|
||||
DISC_555_OUT_CAP | DISC_555_OUT_DC | DISC_555_TRIGGER_IS_LOGIC,
|
||||
12, // B+ voltage of 555
|
||||
DEFAULT_555_VALUES
|
||||
};
|
||||
@ -48,7 +48,6 @@ static const discrete_555_cc_desc frogsZip555cc =
|
||||
DISC_555_OUT_CAP | DISC_555_OUT_DC,
|
||||
12, // B+ voltage of 555
|
||||
DEFAULT_555_VALUES,
|
||||
12, // B+ voltage of the Constant Current source
|
||||
0.6 // Q13 Vbe
|
||||
};
|
||||
|
||||
@ -220,53 +219,62 @@ WRITE8_HANDLER( frogs_audio_w )
|
||||
|
||||
|
||||
static const discrete_mixer_desc headon_mixer =
|
||||
{DISC_MIXER_IS_RESISTOR,
|
||||
{RES_K(130), RES_K(130), RES_K(100), RES_K(100), RES_K(100), RES_K(10)}, // 130 = 390/3, Bonus Res is dummy
|
||||
{0,0,0,0,0}, // no variable resistors
|
||||
{0,0,0,0,CAP_N(470),0},
|
||||
0, RES_K(100),
|
||||
0,
|
||||
CAP_U(1), // not in schematics, used to suppress DC
|
||||
0, 1};
|
||||
{
|
||||
DISC_MIXER_IS_RESISTOR,
|
||||
{RES_K(130), RES_K(130), RES_K(100), RES_K(100), RES_K(100), RES_K(10)}, // 130 = 390/3, Bonus Res is dummy
|
||||
{0,0,0,0,0}, // no variable resistors
|
||||
{0,0,0,0,CAP_N(470),0},
|
||||
0, RES_K(100),
|
||||
0,
|
||||
CAP_U(1), // not in schematics, used to suppress DC
|
||||
0, 1
|
||||
};
|
||||
|
||||
static const discrete_mixer_desc headon_crash_mixer =
|
||||
{DISC_MIXER_IS_OP_AMP,
|
||||
{RES_K(50), RES_K(10)}, // Resistors, in fact variable resistors (100k)
|
||||
{0,0,0,0,0}, // no variable resistors
|
||||
{CAP_N(100),CAP_U(1)},
|
||||
0, RES_K(100),
|
||||
0,
|
||||
CAP_U(1)*0, // not in schematics, used to suppress DC
|
||||
0, 1};
|
||||
{
|
||||
DISC_MIXER_IS_OP_AMP,
|
||||
{RES_K(50), RES_K(10)}, // Resistors, in fact variable resistors (100k)
|
||||
{0,0,0,0,0}, // no variable resistors
|
||||
{CAP_N(100),CAP_U(1)},
|
||||
0, RES_K(100),
|
||||
0,
|
||||
CAP_U(1)*0, // not in schematics, used to suppress DC
|
||||
0, 1
|
||||
};
|
||||
|
||||
static const discrete_inverter_osc_desc headon_inverter_osc_1 =
|
||||
{DEFAULT_CD40XX_VALUES(12),
|
||||
{
|
||||
DEFAULT_CD40XX_VALUES(12),
|
||||
DISC_OSC_INVERTER_IS_TYPE4
|
||||
};
|
||||
};
|
||||
|
||||
static const discrete_inverter_osc_desc headon_inverter_osc_2 =
|
||||
{DEFAULT_CD40XX_VALUES(12),
|
||||
{
|
||||
DEFAULT_CD40XX_VALUES(12),
|
||||
DISC_OSC_INVERTER_IS_TYPE5 | DISC_OSC_INVERTER_OUT_IS_LOGIC
|
||||
};
|
||||
};
|
||||
|
||||
static const discrete_555_desc headon_555_bonus =
|
||||
{DISC_555_OUT_DC | DISC_555_OUT_ENERGY,
|
||||
12,
|
||||
12-0.5,12*0.66,12*0.33
|
||||
};
|
||||
{
|
||||
DISC_555_OUT_ENERGY | DISC_555_OUT_DC,
|
||||
12,
|
||||
DEFAULT_555_CHARGE,
|
||||
12.0-0.5
|
||||
};
|
||||
|
||||
static const discrete_555_desc headon_555_crash =
|
||||
{DISC_555_OUT_DC | DISC_555_TRIGGER_IS_LOGIC,
|
||||
12,
|
||||
12-0.5,12*0.66,12*0.33
|
||||
};
|
||||
{
|
||||
DISC_555_OUT_SQW | DISC_555_OUT_DC | DISC_555_TRIGGER_IS_LOGIC,
|
||||
12,
|
||||
DEFAULT_555_CHARGE,
|
||||
12.0-0.5
|
||||
};
|
||||
|
||||
static const discrete_555_cc_desc headon_555cc =
|
||||
{
|
||||
DISC_555_OUT_DC,
|
||||
DISC_555_OUT_SQW | DISC_555_OUT_DC,
|
||||
12, // B+ voltage of 555
|
||||
DEFAULT_555_VALUES,
|
||||
12, // B+ voltage of the Constant Current source
|
||||
0.6 // Q16, Q10 Vbe
|
||||
};
|
||||
|
||||
@ -274,15 +282,15 @@ static const discrete_555_cc_desc headon_555cc =
|
||||
/*
|
||||
* From : http://www.vego.nl/8/08/03/08_08_03.htm
|
||||
*
|
||||
* - voeding: -7 V, clock-frequentie: 2.267 Hz
|
||||
*- voeding: -8 V, clock-frequentie: 8.731 Hz
|
||||
*- voeding: -9 V, clock-frequentie: 16,38 kHz
|
||||
*- voeding: -10 V, clock-frequentie: 23,53 kHz
|
||||
*- voeding: -11 V, clock-frequentie: 32,56 kHz
|
||||
*- voeding: -12 V, clock-frequentie: 38,34 kHz
|
||||
*- voeding: -13 V, clock-frequentie: 40,00 kHz
|
||||
*- voeding: -14 V, clock-frequentie: 37,80 kHz
|
||||
*- voeding: -15 V, clock-frequentie: 33,17 kHz
|
||||
*- voeding: -7 V, clock-frequency: 2.267 Hz
|
||||
*- voeding: -8 V, clock-frequency: 8.731 Hz
|
||||
*- voeding: -9 V, clock-frequency: 16,38 kHz
|
||||
*- voeding: -10 V, clock-frequency: 23,53 kHz
|
||||
*- voeding: -11 V, clock-frequency: 32,56 kHz
|
||||
*- voeding: -12 V, clock-frequency: 38,34 kHz
|
||||
*- voeding: -13 V, clock-frequency: 40,00 kHz
|
||||
*- voeding: -14 V, clock-frequency: 37,80 kHz
|
||||
*- voeding: -15 V, clock-frequency: 33,17 kHz
|
||||
*
|
||||
* However all other mame sources say 100kHz.
|
||||
*/
|
||||
@ -305,9 +313,10 @@ static const discrete_lfsr_desc mm5837_lfsr =
|
||||
};
|
||||
|
||||
static const discrete_op_amp_filt_info headon_sallen_key_info =
|
||||
{ RES_K(15), RES_K(15), 0, 0, 0,
|
||||
CAP_N(470), CAP_N(47), 0
|
||||
};
|
||||
{
|
||||
RES_K(15), RES_K(15), 0, 0, 0,
|
||||
CAP_N(470), CAP_N(47), 0
|
||||
};
|
||||
|
||||
static DISCRETE_SOUND_START(headon)
|
||||
/************************************************
|
||||
|
Loading…
Reference in New Issue
Block a user