summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/sound/disc_flt.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/sound/disc_flt.c')
-rw-r--r--src/emu/sound/disc_flt.c81
1 files changed, 40 insertions, 41 deletions
diff --git a/src/emu/sound/disc_flt.c b/src/emu/sound/disc_flt.c
index 81def840584..37280859fdf 100644
--- a/src/emu/sound/disc_flt.c
+++ b/src/emu/sound/disc_flt.c
@@ -103,19 +103,17 @@ struct dst_rcfilter_sw_context
struct dst_rcintegrate_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 exponent0;
- double exponent1;
- double exp_exponent0;/* RCINTEGRATE */
- double exp_exponent1;/* RCINTEGRATE */
+ int type;
+ double gain_r1_r2;
+ double f; /* r2,r3 gain */
+ double vCap;
+ double vCE;
+ double exponent0;
+ double exponent1;
+ double exp_exponent0;
+ double exp_exponent1;
+ double c_exp0;
+ double c_exp1;
};
/************************************************************************
@@ -1186,40 +1184,40 @@ static void dst_rcintegrate_step(node_description *node)
struct dst_rcintegrate_context *context = node->context;
double diff, u, iQ, iQc, iC, RG, vE;
- double dt, vP;
+ double vP;
if(DST_RCINTEGRATE__ENABLE)
{
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))
+
+ if ( u - 0.7 < context->vCap * context->gain_r1_r2)
{
/* discharge .... */
- diff = 0.0 - context->vCap;
- iC = 0.0 - context->C / context->exponent1 * diff * context->exp_exponent1; /* iC */
- diff = diff - (diff * context->exp_exponent1);
+ diff = 0.0 - context->vCap;
+ iC = 0.0 - context->c_exp1 * diff; /* iC */
+ diff -= diff * context->exp_exponent1;
context->vCap += diff;
iQ = 0;
- vE = context->vCap*context->R2/(context->R1+context->R2);
- RG = vE/(-iC);
+ vE = context->vCap * context->gain_r1_r2;
+ RG = vE / (-iC);
}
else
{
/* charging */
- diff = (vP - context->vCE) * context->f - context->vCap;
- iC = 0.0 - context->C / context->exponent0 * diff * context->exp_exponent0; /* iC */
- diff = diff - (diff * context->exp_exponent0);
+ diff = (vP - context->vCE) * context->f - context->vCap;
+ iC = 0.0 - context->c_exp0 * diff; /* iC */
+ diff -= diff * context->exp_exponent0;
context->vCap += diff;
- iQ = iC + (iC * context->R1 + context->vCap) / context->R2;
- RG = (vP - context->vCE)/iQ;
- vE = (RG - context->R3) / RG * (vP - context->vCE);
+ iQ = iC + (iC * DST_RCINTEGRATE__R1 + context->vCap) / DST_RCINTEGRATE__R2;
+ RG = (vP - context->vCE) / iQ;
+ vE = (RG - DST_RCINTEGRATE__R3) / RG * (vP - context->vCE);
}
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);
@@ -1229,9 +1227,9 @@ 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 * DST_RCINTEGRATE__R3);
- switch (context->state)
+ switch (context->type)
{
case DISC_RC_INTEGRATE_TYPE1:
node->output[0] = context->vCap;
@@ -1240,7 +1238,7 @@ 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 * DST_RCINTEGRATE__R3);
break;
}
}
@@ -1256,24 +1254,25 @@ static void dst_rcintegrate_reset(node_description *node)
double r;
double dt = discrete_current_context->sample_time;
- node->output[0]=0;
-
- context->state = DST_RCINTEGRATE__TYPE;
- context->R1 = DST_RCINTEGRATE__R1;
- context->R2 = DST_RCINTEGRATE__R2;
- context->R3 = DST_RCINTEGRATE__R3;
- context->C = DST_RCINTEGRATE__C;
+ context->type = DST_RCINTEGRATE__TYPE;
context->vCap = 0;
context->vCE = 0;
- r = context->R1 / context->R2 * context->R3 + context->R1 + context->R3;
+ /* pre-calculate fixed values */
+ context->gain_r1_r2 = RES_VOLTAGE_DIVIDER(DST_RCINTEGRATE__R1, DST_RCINTEGRATE__R2);
+
+ r = DST_RCINTEGRATE__R1 / DST_RCINTEGRATE__R2 * DST_RCINTEGRATE__R3 + DST_RCINTEGRATE__R1 + DST_RCINTEGRATE__R3;
- context->f = DST_RCINTEGRATE__R2/(DST_RCINTEGRATE__R2+DST_RCINTEGRATE__R3);
+ context->f = RES_VOLTAGE_DIVIDER(DST_RCINTEGRATE__R3, DST_RCINTEGRATE__R2);
context->exponent0 = -1.0 * r * context->f * DST_RCINTEGRATE__C;
context->exponent1 = -1.0 * (DST_RCINTEGRATE__R1 + DST_RCINTEGRATE__R2) * DST_RCINTEGRATE__C;
context->exp_exponent0 = exp(dt / context->exponent0);
context->exp_exponent1 = exp(dt / context->exponent1);
+ context->c_exp0 = DST_RCINTEGRATE__C / context->exponent0 * context->exp_exponent0;
+ context->c_exp1 = DST_RCINTEGRATE__C / context->exponent1 * context->exp_exponent1;
+
+ node->output[0] = 0;
}