mirror of
https://github.com/holub/mame
synced 2025-05-22 13:48:55 +03:00
DISCRETE_555_MSTABLE - optimized speed and added new operating modes.
Sprint 8 - started discrete sound.
This commit is contained in:
parent
7286603bdf
commit
54d913bda8
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -1215,6 +1215,7 @@ src/mame/audio/spiders.c svneol=native#text/plain
|
|||||||
src/mame/audio/sprint2.c svneol=native#text/plain
|
src/mame/audio/sprint2.c svneol=native#text/plain
|
||||||
src/mame/audio/sprint4.c svneol=native#text/plain
|
src/mame/audio/sprint4.c svneol=native#text/plain
|
||||||
src/mame/audio/sprint4.h svneol=native#text/plain
|
src/mame/audio/sprint4.h svneol=native#text/plain
|
||||||
|
src/mame/audio/sprint8.c svneol=native#text/plain
|
||||||
src/mame/audio/starshp1.c svneol=native#text/plain
|
src/mame/audio/starshp1.c svneol=native#text/plain
|
||||||
src/mame/audio/starwars.c svneol=native#text/plain
|
src/mame/audio/starwars.c svneol=native#text/plain
|
||||||
src/mame/audio/subs.c svneol=native#text/plain
|
src/mame/audio/subs.c svneol=native#text/plain
|
||||||
|
@ -58,6 +58,8 @@ struct dsd_555_mstbl_context
|
|||||||
int output_is_ac;
|
int output_is_ac;
|
||||||
double ac_shift; /* DC shift needed to make waveform ac */
|
double ac_shift; /* DC shift needed to make waveform ac */
|
||||||
int flip_flop; /* 555 flip/flop output state */
|
int flip_flop; /* 555 flip/flop output state */
|
||||||
|
int has_rc_nodes;
|
||||||
|
double exp_charge;
|
||||||
double cap_voltage; /* voltage on cap */
|
double cap_voltage; /* voltage on cap */
|
||||||
double threshold;
|
double threshold;
|
||||||
double trigger;
|
double trigger;
|
||||||
@ -457,6 +459,9 @@ static DISCRETE_RESET(dsd_555_astbl)
|
|||||||
#define DSD_555_MSTBL__R DISCRETE_INPUT(2)
|
#define DSD_555_MSTBL__R DISCRETE_INPUT(2)
|
||||||
#define DSD_555_MSTBL__C DISCRETE_INPUT(3)
|
#define DSD_555_MSTBL__C DISCRETE_INPUT(3)
|
||||||
|
|
||||||
|
/* bit mask of the above RC inputs */
|
||||||
|
#define DSD_555_MSTBL_RC_MASK 0x0c
|
||||||
|
|
||||||
static DISCRETE_STEP(dsd_555_mstbl)
|
static DISCRETE_STEP(dsd_555_mstbl)
|
||||||
{
|
{
|
||||||
const discrete_555_desc *info = (const discrete_555_desc *)node->custom;
|
const discrete_555_desc *info = (const discrete_555_desc *)node->custom;
|
||||||
@ -464,6 +469,11 @@ static DISCRETE_STEP(dsd_555_mstbl)
|
|||||||
|
|
||||||
double v_cap; /* Current voltage on capacitor, before dt */
|
double v_cap; /* Current voltage on capacitor, before dt */
|
||||||
double v_cap_next = 0; /* Voltage on capacitor, after dt */
|
double v_cap_next = 0; /* Voltage on capacitor, after dt */
|
||||||
|
double x_time = 0; /* time since change happened */
|
||||||
|
double dt, exponent;
|
||||||
|
int trigger = 0;
|
||||||
|
int trigger_type;
|
||||||
|
int update_exponent = 0;
|
||||||
|
|
||||||
if(DSD_555_MSTBL__RESET)
|
if(DSD_555_MSTBL__RESET)
|
||||||
{
|
{
|
||||||
@ -471,26 +481,44 @@ static DISCRETE_STEP(dsd_555_mstbl)
|
|||||||
node->output[0] = 0;
|
node->output[0] = 0;
|
||||||
context->flip_flop = 0;
|
context->flip_flop = 0;
|
||||||
context->cap_voltage = 0;
|
context->cap_voltage = 0;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
trigger_type = info->options;
|
||||||
|
dt = node->info->sample_time;
|
||||||
|
|
||||||
|
switch (trigger_type & DSD_555_TRIGGER_TYPE_MASK)
|
||||||
{
|
{
|
||||||
int trigger;
|
case DISC_555_TRIGGER_IS_LOGIC:
|
||||||
|
trigger = (int)!DSD_555_MSTBL__TRIGGER;
|
||||||
|
break;
|
||||||
|
case DISC_555_TRIGGER_IS_VOLTAGE:
|
||||||
|
trigger = (int)(DSD_555_MSTBL__TRIGGER < context->trigger);
|
||||||
|
break;
|
||||||
|
case DISC_555_TRIGGER_IS_COUNT:
|
||||||
|
trigger = (int)DSD_555_MSTBL__TRIGGER;
|
||||||
|
if (trigger && !context->flip_flop)
|
||||||
|
{
|
||||||
|
x_time = DSD_555_MSTBL__TRIGGER - trigger;
|
||||||
|
if (x_time != 0)
|
||||||
|
{
|
||||||
|
/* adjust sample to after trigger */
|
||||||
|
x_time = (1.0 - x_time);
|
||||||
|
update_exponent = 1;
|
||||||
|
dt = x_time * node->info->sample_time;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (context->trig_is_logic)
|
if ((trigger_type & DISC_555_TRIGGER_DISCHARGES_CAP) && trigger)
|
||||||
trigger = !DSD_555_MSTBL__TRIGGER;
|
|
||||||
else
|
|
||||||
trigger = DSD_555_MSTBL__TRIGGER < context->trigger;
|
|
||||||
|
|
||||||
if (context->trig_discharges_cap && trigger)
|
|
||||||
context->cap_voltage = 0;
|
context->cap_voltage = 0;
|
||||||
|
|
||||||
if (!context->flip_flop)
|
|
||||||
{
|
|
||||||
/* Wait for trigger */
|
/* Wait for trigger */
|
||||||
if (trigger)
|
if (!context->flip_flop && trigger)
|
||||||
context->flip_flop = 1;
|
context->flip_flop = 1;
|
||||||
}
|
|
||||||
else
|
if (context->flip_flop)
|
||||||
{
|
{
|
||||||
v_cap = context->cap_voltage;
|
v_cap = context->cap_voltage;
|
||||||
|
|
||||||
@ -508,13 +536,20 @@ static DISCRETE_STEP(dsd_555_mstbl)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Charging */
|
/* Charging */
|
||||||
v_cap_next = v_cap + ((info->v_pos - v_cap) * RC_CHARGE_EXP(DSD_555_MSTBL__R * DSD_555_MSTBL__C));
|
update_exponent |= context->has_rc_nodes;
|
||||||
|
if (update_exponent)
|
||||||
|
exponent = RC_CHARGE_EXP_DT(DSD_555_MSTBL__R * DSD_555_MSTBL__C, dt);
|
||||||
|
else
|
||||||
|
exponent = context->exp_charge;
|
||||||
|
v_cap_next = v_cap + ((info->v_pos - v_cap) * exponent);
|
||||||
|
|
||||||
/* Has it charged past upper limit? */
|
/* Has it charged past upper limit? */
|
||||||
/* If trigger is still enabled, then we keep charging,
|
/* If trigger is still enabled, then we keep charging,
|
||||||
* regardless of threshold. */
|
* regardless of threshold. */
|
||||||
if ((v_cap_next >= context->threshold) && !trigger)
|
if ((v_cap_next >= context->threshold) && !trigger)
|
||||||
{
|
{
|
||||||
|
dt = DSD_555_MSTBL__R * DSD_555_MSTBL__C * log(1.0 / (1.0 - ((v_cap_next - context->threshold) / (context->v_charge - v_cap))));
|
||||||
|
x_time = dt / node->info->sample_time;
|
||||||
v_cap_next = 0;
|
v_cap_next = 0;
|
||||||
v_cap = context->threshold;
|
v_cap = context->threshold;
|
||||||
context->flip_flop = 0;
|
context->flip_flop = 0;
|
||||||
@ -522,6 +557,7 @@ static DISCRETE_STEP(dsd_555_mstbl)
|
|||||||
}
|
}
|
||||||
|
|
||||||
context->cap_voltage = v_cap_next;
|
context->cap_voltage = v_cap_next;
|
||||||
|
}
|
||||||
|
|
||||||
switch (info->options & DISC_555_OUT_MASK)
|
switch (info->options & DISC_555_OUT_MASK)
|
||||||
{
|
{
|
||||||
@ -537,8 +573,12 @@ static DISCRETE_STEP(dsd_555_mstbl)
|
|||||||
if (context->output_is_ac)
|
if (context->output_is_ac)
|
||||||
node->output[0] -= context->threshold * 3.0 /4.0;
|
node->output[0] -= context->threshold * 3.0 /4.0;
|
||||||
break;
|
break;
|
||||||
}
|
case DISC_555_OUT_ENERGY:
|
||||||
}
|
if (x_time == 0) x_time = 1.0;
|
||||||
|
node->output[0] = context->v_out_high * (context->flip_flop ? x_time : (1.0 - x_time));
|
||||||
|
if (context->output_is_ac)
|
||||||
|
node->output[0] -= context->v_out_high / 2.0;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -572,6 +612,13 @@ static DISCRETE_RESET(dsd_555_mstbl)
|
|||||||
context->flip_flop = 0;
|
context->flip_flop = 0;
|
||||||
context->cap_voltage = 0;
|
context->cap_voltage = 0;
|
||||||
|
|
||||||
|
/* optimization if none of the values are nodes */
|
||||||
|
context->has_rc_nodes = 0;
|
||||||
|
if (node->input_is_node & DSD_555_MSTBL_RC_MASK)
|
||||||
|
context->has_rc_nodes = 1;
|
||||||
|
else
|
||||||
|
context->exp_charge = RC_CHARGE_EXP(DSD_555_MSTBL__R * DSD_555_MSTBL__C);
|
||||||
|
|
||||||
node->output[0] = 0;
|
node->output[0] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2893,7 +2893,7 @@
|
|||||||
* options, - bit mapped options
|
* options, - bit mapped options
|
||||||
* v_pos, - B+ voltage of 555
|
* v_pos, - B+ voltage of 555
|
||||||
* v_charge, - voltage (or node) to charge circuit (Defaults to v_pos)
|
* v_charge, - voltage (or node) to charge circuit (Defaults to v_pos)
|
||||||
* v_out_high, - High output voltage of 555 (Defaults to v_pos - 1.2V)
|
* v_out_high - High output voltage of 555 (Defaults to v_pos - 1.2V)
|
||||||
* }
|
* }
|
||||||
*
|
*
|
||||||
* The last 2 options of discrete_555_desc can use the following defaults:
|
* The last 2 options of discrete_555_desc can use the following defaults:
|
||||||
@ -2993,6 +2993,9 @@
|
|||||||
* DISC_555_TRIGGER_IS_VOLTAGE - Input is actual voltage.
|
* DISC_555_TRIGGER_IS_VOLTAGE - Input is actual voltage.
|
||||||
* Voltage must drop below
|
* Voltage must drop below
|
||||||
* trigger to activate.
|
* trigger to activate.
|
||||||
|
* DISC_555_TRIGGER_IS_COUNT - 1 when trigger, allows passing of x_time.
|
||||||
|
* Mainly connected with other module using
|
||||||
|
* a xxx_COUNT_F_X type.
|
||||||
* DISC_555_TRIGGER_DISCHARGES_CAP - some circuits connect an external
|
* DISC_555_TRIGGER_DISCHARGES_CAP - some circuits connect an external
|
||||||
* device (transistor) to the cap to
|
* device (transistor) to the cap to
|
||||||
* discharge it when the trigger is
|
* discharge it when the trigger is
|
||||||
@ -3006,8 +3009,9 @@
|
|||||||
* Waveform Types: (ORed with trigger types)
|
* Waveform Types: (ORed with trigger types)
|
||||||
* DISC_555_OUT_SQW - Output is Squarewave. 0 or v_out_high. (DEFAULT)
|
* DISC_555_OUT_SQW - Output is Squarewave. 0 or v_out_high. (DEFAULT)
|
||||||
* DISC_555_OUT_CAP - Output is Timing Capacitor 'C' voltage.
|
* DISC_555_OUT_CAP - Output is Timing Capacitor 'C' voltage.
|
||||||
|
* DISC_555_OUT_ENERGY - see DISCRETE_555_MSTABLE.
|
||||||
*
|
*
|
||||||
* EXAMPLES: see Frogs
|
* EXAMPLES: see Frogs, Sprint 8
|
||||||
*
|
*
|
||||||
***********************************************************************
|
***********************************************************************
|
||||||
*
|
*
|
||||||
@ -3562,7 +3566,9 @@ enum
|
|||||||
#define DISC_555_OUT_AC 0x10
|
#define DISC_555_OUT_AC 0x10
|
||||||
|
|
||||||
#define DISC_555_TRIGGER_IS_LOGIC 0x00
|
#define DISC_555_TRIGGER_IS_LOGIC 0x00
|
||||||
#define DISC_555_TRIGGER_IS_VOLTAGE 0x40
|
#define DISC_555_TRIGGER_IS_VOLTAGE 0x20
|
||||||
|
#define DISC_555_TRIGGER_IS_COUNT 0x40
|
||||||
|
#define DSD_555_TRIGGER_TYPE_MASK 0x60
|
||||||
#define DISC_555_TRIGGER_DISCHARGES_CAP 0x80
|
#define DISC_555_TRIGGER_DISCHARGES_CAP 0x80
|
||||||
|
|
||||||
#define DISC_555_OUT_SQW 0x00 /* Squarewave */
|
#define DISC_555_OUT_SQW 0x00 /* Squarewave */
|
||||||
|
@ -68,7 +68,7 @@ popmessage("ASR");
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#define FIRETRUCK_HSYNC 15750.0
|
#define FIRETRUCK_HSYNC 15750.0 /* not checked */
|
||||||
#define FIRETRUCK_1V FIRETRUCK_HSYNC/2
|
#define FIRETRUCK_1V FIRETRUCK_HSYNC/2
|
||||||
#define FIRETRUCK_2V FIRETRUCK_1V/2
|
#define FIRETRUCK_2V FIRETRUCK_1V/2
|
||||||
#define FIRETRUCK_8V FIRETRUCK_1V/8
|
#define FIRETRUCK_8V FIRETRUCK_1V/8
|
||||||
|
267
src/mame/audio/sprint8.c
Normal file
267
src/mame/audio/sprint8.c
Normal file
@ -0,0 +1,267 @@
|
|||||||
|
/************************************************************************
|
||||||
|
* sprint8 Sound System Analog emulation
|
||||||
|
* Sept 2009, Derrick Renaud
|
||||||
|
************************************************************************/
|
||||||
|
|
||||||
|
#include "driver.h"
|
||||||
|
#include "sprint8.h"
|
||||||
|
|
||||||
|
|
||||||
|
/* Discrete Sound Input Nodes */
|
||||||
|
#define SPRINT8_CRASH_EN NODE_01
|
||||||
|
#define SPRINT8_SCREECH_EN NODE_02
|
||||||
|
#define SPRINT8_ATTRACT_EN NODE_03
|
||||||
|
#define SPRINT8_MOTOR1_EN NODE_04
|
||||||
|
#define SPRINT8_MOTOR2_EN NODE_05
|
||||||
|
#define SPRINT8_MOTOR3_EN NODE_06
|
||||||
|
#define SPRINT8_MOTOR4_EN NODE_07
|
||||||
|
#define SPRINT8_MOTOR5_EN NODE_08
|
||||||
|
#define SPRINT8_MOTOR6_EN NODE_09
|
||||||
|
#define SPRINT8_MOTOR7_EN NODE_10
|
||||||
|
#define SPRINT8_MOTOR8_EN NODE_11
|
||||||
|
|
||||||
|
/* Discrete Sound Output Nodes */
|
||||||
|
#define SPRINT8_NOISE NODE_12
|
||||||
|
#define SPRINT8_MOTOR1_SND NODE_13
|
||||||
|
#define SPRINT8_MOTOR2_SND NODE_14
|
||||||
|
#define SPRINT8_MOTOR3_SND NODE_15
|
||||||
|
#define SPRINT8_MOTOR4_SND NODE_16
|
||||||
|
#define SPRINT8_MOTOR5_SND NODE_17
|
||||||
|
#define SPRINT8_MOTOR6_SND NODE_18
|
||||||
|
#define SPRINT8_MOTOR7_SND NODE_19
|
||||||
|
#define SPRINT8_MOTOR8_SND NODE_20
|
||||||
|
#define SPRINT8_CRASH_SCREECH_SND NODE_21
|
||||||
|
#define SPRINT8_AUDIO_1_2 NODE_22
|
||||||
|
#define SPRINT8_AUDIO_3_7 NODE_23
|
||||||
|
#define SPRINT8_AUDIO_5_6 NODE_24
|
||||||
|
#define SPRINT8_AUDIO_4_8 NODE_25
|
||||||
|
|
||||||
|
|
||||||
|
/* Parts List - Resistors */
|
||||||
|
#define SPRINT8_R1 RES_K(47)
|
||||||
|
#define SPRINT8_R3 RES_K(47)
|
||||||
|
#define SPRINT8_R4 RES_K(47)
|
||||||
|
#define SPRINT8_R19 RES_K(1)
|
||||||
|
#define SPRINT8_R20 RES_K(1)
|
||||||
|
#define SPRINT8_R27 RES_K(18)
|
||||||
|
#define SPRINT8_R28 820
|
||||||
|
#define SPRINT8_R29 RES_K(330)
|
||||||
|
#define SPRINT8_R39 RES_K(120)
|
||||||
|
#define SPRINT8_R40 RES_K(22)
|
||||||
|
#define SPRINT8_R41 RES_K(150)
|
||||||
|
#define SPRINT8_R89 RES_K(22)
|
||||||
|
#define SPRINT8_R91 RES_K(47)
|
||||||
|
#define SPRINT8_R93 RES_K(2.2)
|
||||||
|
#define SPRINT8_R96 RES_K(47)
|
||||||
|
#define SPRINT8_R97 RES_K(2.2)
|
||||||
|
#define SPRINT8_R99 RES_K(27)
|
||||||
|
#define SPRINT8_R100 RES_K(1)
|
||||||
|
#define SPRINT8_R145 RES_K(3.3)
|
||||||
|
#define SPRINT8_R146 RES_K(7.5)
|
||||||
|
#define SPRINT8_R147 100
|
||||||
|
#define SPRINT8_R148 RES_K(1)
|
||||||
|
|
||||||
|
/* Parts List - Capacitors */
|
||||||
|
#define SPRINT8_C17 CAP_U(.001)
|
||||||
|
#define SPRINT8_C18 CAP_U(.047)
|
||||||
|
#define SPRINT8_C19 CAP_U(.047)
|
||||||
|
#define SPRINT8_C26 CAP_U(100)
|
||||||
|
#define SPRINT8_C27 CAP_U(.22)
|
||||||
|
#define SPRINT8_C28 CAP_U(.1)
|
||||||
|
#define SPRINT8_C59 CAP_U(.1)
|
||||||
|
#define SPRINT8_C64 CAP_U(.1)
|
||||||
|
#define SPRINT8_C89 CAP_U(.1)
|
||||||
|
#define SPRINT8_C90 CAP_U(.1)
|
||||||
|
|
||||||
|
#define SPRINT8_HSYNC 15750.0 /* not checked */
|
||||||
|
#define SPRINT8_1V SPRINT8_HSYNC/2
|
||||||
|
#define SPRINT8_2V SPRINT8_1V/2
|
||||||
|
|
||||||
|
|
||||||
|
static const discrete_lfsr_desc sprint8_lfsr =
|
||||||
|
{
|
||||||
|
DISC_CLK_IS_FREQ,
|
||||||
|
16, /* Bit Length */
|
||||||
|
0, /* Reset Value */
|
||||||
|
10, /* Use Bit 10 as XOR input 0 */
|
||||||
|
15, /* Use Bit 15 as XOR input 1 */
|
||||||
|
DISC_LFSR_XOR, /* Feedback stage1 is XOR */
|
||||||
|
DISC_LFSR_OR, /* Feedback stage2 is just stage 1 output OR with external feed */
|
||||||
|
DISC_LFSR_REPLACE, /* Feedback stage3 replaces the shifted register contents */
|
||||||
|
0x000001, /* Everything is shifted into the first bit only */
|
||||||
|
DISC_LFSR_FLAG_RESET_TYPE_H, /* Output is not inverted */
|
||||||
|
12 /* Output bit */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const discrete_555_desc sprint8_crash_555a_desc =
|
||||||
|
{
|
||||||
|
DISC_555_OUT_ENERGY,
|
||||||
|
5, DEFAULT_555_VALUES
|
||||||
|
};
|
||||||
|
|
||||||
|
static const discrete_integrate_info sprint8_crash_integrate =
|
||||||
|
{
|
||||||
|
DISC_INTEGRATE_OP_AMP_1,
|
||||||
|
SPRINT8_R99, SPRINT8_R97, SPRINT8_R96, SPRINT8_C59, /*r1, r2, r3, c, */
|
||||||
|
5, 5, /* v1, vP*/
|
||||||
|
0, 0, 0 /* no functions */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const discrete_555_desc sprint8_motor_555a_desc =
|
||||||
|
{
|
||||||
|
DISC_555_OUT_COUNT_F_X,
|
||||||
|
5, DEFAULT_555_VALUES
|
||||||
|
};
|
||||||
|
|
||||||
|
static const discrete_555_desc sprint8_motor_555m_desc =
|
||||||
|
{
|
||||||
|
DISC_555_OUT_ENERGY | DISC_555_TRIGGER_IS_COUNT,
|
||||||
|
5, DEFAULT_555_VALUES
|
||||||
|
};
|
||||||
|
|
||||||
|
static const discrete_op_amp_filt_info sprint8_motor_filter =
|
||||||
|
{
|
||||||
|
SPRINT8_R27, 0, SPRINT8_R28 + RES_2_PARALLEL(SPRINT8_R19, SPRINT8_R20), 0, SPRINT8_R29, /* r1, r2, r3, r4, rF, */
|
||||||
|
SPRINT8_C18, SPRINT8_C19, 0, /* c1, c2, c3, */
|
||||||
|
5.0 * RES_VOLTAGE_DIVIDER(SPRINT8_R19, SPRINT8_R20), 5, 0 /* vRef, vP, vN */
|
||||||
|
};
|
||||||
|
|
||||||
|
static const discrete_mixer_desc sprint8_mixer =
|
||||||
|
{
|
||||||
|
DISC_MIXER_IS_RESISTOR,
|
||||||
|
{SPRINT8_R1 + SPRINT8_R100, SPRINT8_R3, SPRINT8_R4},
|
||||||
|
{0}, {0}, 0, 0, 0, 0, 0, 1 /* no r_nodes, c, rI, rF, cF, cAmp, vRef, gain */
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/************************************************
|
||||||
|
* Car Motor
|
||||||
|
************************************************/
|
||||||
|
/* The first (astable) 555 generates a quick falling pulse that triggers the second (monostable) 555.
|
||||||
|
* This pulse is passed through C17 and pulled up with R40. This pulse is too fast to emulate so
|
||||||
|
* we will just tell the monostable it was triggered once and ignore C17/R40.
|
||||||
|
*/
|
||||||
|
#define SPRINT8_MOTOR_CIRCUIT(_car) \
|
||||||
|
DISCRETE_RCFILTER(NODE_RELATIVE(NODE_30, _car - 1), 1, NODE_RELATIVE(SPRINT8_MOTOR1_EN, _car - 1), SPRINT8_R89, SPRINT8_C26) \
|
||||||
|
DISCRETE_ADDER2(NODE_RELATIVE(NODE_40, _car - 1), 1, NODE_RELATIVE(NODE_30, _car - 1), 0.7) /* add Q21 shift */ \
|
||||||
|
DISCRETE_555_ASTABLE_CV(NODE_RELATIVE(NODE_50, _car - 1), 1, SPRINT8_R39, 0, SPRINT8_C27, NODE_RELATIVE(NODE_40, _car - 1), &sprint8_motor_555a_desc) \
|
||||||
|
DISCRETE_555_MSTABLE(NODE_RELATIVE(NODE_60, _car - 1), 1, NODE_RELATIVE(NODE_50, _car - 1), SPRINT8_R41, SPRINT8_C28, &sprint8_motor_555m_desc) \
|
||||||
|
DISCRETE_OP_AMP_FILTER(NODE_RELATIVE(SPRINT8_MOTOR1_SND, _car - 1), 1, NODE_RELATIVE(NODE_60, _car - 1), 0, DISC_OP_AMP_FILTER_IS_BAND_PASS_1M, &sprint8_motor_filter)
|
||||||
|
|
||||||
|
|
||||||
|
DISCRETE_SOUND_START( sprint8 )
|
||||||
|
/************************************************
|
||||||
|
* Input register mapping
|
||||||
|
************************************************/
|
||||||
|
DISCRETE_INPUT_NOT (SPRINT8_CRASH_EN)
|
||||||
|
DISCRETE_INPUT_NOT (SPRINT8_SCREECH_EN)
|
||||||
|
DISCRETE_INPUT_NOT (SPRINT8_ATTRACT_EN)
|
||||||
|
DISCRETE_INPUTX_LOGIC(SPRINT8_MOTOR1_EN, DEFAULT_TTL_V_LOGIC_1, 0, 0)
|
||||||
|
DISCRETE_INPUTX_LOGIC(SPRINT8_MOTOR2_EN, DEFAULT_TTL_V_LOGIC_1, 0, 0)
|
||||||
|
DISCRETE_INPUTX_LOGIC(SPRINT8_MOTOR3_EN, DEFAULT_TTL_V_LOGIC_1, 0, 0)
|
||||||
|
DISCRETE_INPUTX_LOGIC(SPRINT8_MOTOR4_EN, DEFAULT_TTL_V_LOGIC_1, 0, 0)
|
||||||
|
DISCRETE_INPUTX_LOGIC(SPRINT8_MOTOR5_EN, DEFAULT_TTL_V_LOGIC_1, 0, 0)
|
||||||
|
DISCRETE_INPUTX_LOGIC(SPRINT8_MOTOR6_EN, DEFAULT_TTL_V_LOGIC_1, 0, 0)
|
||||||
|
DISCRETE_INPUTX_LOGIC(SPRINT8_MOTOR7_EN, DEFAULT_TTL_V_LOGIC_1, 0, 0)
|
||||||
|
DISCRETE_INPUTX_LOGIC(SPRINT8_MOTOR8_EN, DEFAULT_TTL_V_LOGIC_1, 0, 0)
|
||||||
|
|
||||||
|
/************************************************
|
||||||
|
* Noise Generator, Crash, Screech
|
||||||
|
************************************************/
|
||||||
|
DISCRETE_LFSR_NOISE(SPRINT8_NOISE, /* IC F7, pin 13 */
|
||||||
|
1, /* ENAB */
|
||||||
|
SPRINT8_ATTRACT_EN, /* RESET */
|
||||||
|
SPRINT8_2V, 1, 0, 0.5, &sprint8_lfsr) /* CLK,AMPL,FEED,BIAS,LFSRTB */
|
||||||
|
|
||||||
|
DISCRETE_CONSTANT(NODE_70, 0)
|
||||||
|
// DISCRETE_CUSTOM4(NODE_70, SPRINT8_NOISE, SPRINT8_R148, SPRINT8_R147, SPRINT8_C90, &sprint8_custom_screech_charge)
|
||||||
|
DISCRETE_555_ASTABLE_CV(NODE_71,
|
||||||
|
SPRINT8_SCREECH_EN, /* RESET */
|
||||||
|
SPRINT8_R145, SPRINT8_R146, SPRINT8_C89,
|
||||||
|
NODE_70, /* CTRLV */
|
||||||
|
&sprint8_crash_555a_desc)
|
||||||
|
DISCRETE_INTEGRATE(NODE_72, SPRINT8_CRASH_EN, 0, &sprint8_crash_integrate)
|
||||||
|
DISCRETE_RCDISC2(NODE_73,
|
||||||
|
SPRINT8_NOISE, /* SWITCH - inverted by Q20 */
|
||||||
|
NODE_72, SPRINT8_R93 + SPRINT8_R91, /* INP0,RVAL0 */
|
||||||
|
0, SPRINT8_R91, /* INP1,RVAL1 */
|
||||||
|
SPRINT8_C64) /* CVAL */
|
||||||
|
|
||||||
|
DISCRETE_CONSTANT(SPRINT8_CRASH_SCREECH_SND, 0)
|
||||||
|
|
||||||
|
/************************************************
|
||||||
|
* Car Motor
|
||||||
|
************************************************/
|
||||||
|
DISCRETE_TASK_START()
|
||||||
|
SPRINT8_MOTOR_CIRCUIT(1)
|
||||||
|
SPRINT8_MOTOR_CIRCUIT(2)
|
||||||
|
DISCRETE_MIXER3(SPRINT8_AUDIO_1_2,
|
||||||
|
SPRINT8_ATTRACT_EN, /* ENAB */
|
||||||
|
SPRINT8_CRASH_SCREECH_SND,
|
||||||
|
SPRINT8_MOTOR1_SND,
|
||||||
|
SPRINT8_MOTOR2_SND,
|
||||||
|
&sprint8_mixer)
|
||||||
|
DISCRETE_TASK_END()
|
||||||
|
|
||||||
|
DISCRETE_TASK_START()
|
||||||
|
SPRINT8_MOTOR_CIRCUIT(3)
|
||||||
|
SPRINT8_MOTOR_CIRCUIT(7)
|
||||||
|
DISCRETE_MIXER3(SPRINT8_AUDIO_3_7,
|
||||||
|
SPRINT8_ATTRACT_EN, /* ENAB */
|
||||||
|
SPRINT8_CRASH_SCREECH_SND,
|
||||||
|
SPRINT8_MOTOR3_SND,
|
||||||
|
SPRINT8_MOTOR7_SND,
|
||||||
|
&sprint8_mixer)
|
||||||
|
DISCRETE_TASK_END()
|
||||||
|
|
||||||
|
DISCRETE_TASK_START()
|
||||||
|
SPRINT8_MOTOR_CIRCUIT(5)
|
||||||
|
SPRINT8_MOTOR_CIRCUIT(6)
|
||||||
|
DISCRETE_MIXER3(SPRINT8_AUDIO_5_6,
|
||||||
|
SPRINT8_ATTRACT_EN, /* ENAB */
|
||||||
|
SPRINT8_CRASH_SCREECH_SND,
|
||||||
|
SPRINT8_MOTOR5_SND,
|
||||||
|
SPRINT8_MOTOR6_SND,
|
||||||
|
&sprint8_mixer)
|
||||||
|
DISCRETE_TASK_END()
|
||||||
|
|
||||||
|
DISCRETE_TASK_START()
|
||||||
|
SPRINT8_MOTOR_CIRCUIT(4)
|
||||||
|
SPRINT8_MOTOR_CIRCUIT(8)
|
||||||
|
DISCRETE_MIXER3(SPRINT8_AUDIO_4_8,
|
||||||
|
SPRINT8_ATTRACT_EN, /* ENAB */
|
||||||
|
SPRINT8_CRASH_SCREECH_SND,
|
||||||
|
SPRINT8_MOTOR4_SND,
|
||||||
|
SPRINT8_MOTOR8_SND,
|
||||||
|
&sprint8_mixer)
|
||||||
|
DISCRETE_TASK_END()
|
||||||
|
|
||||||
|
/************************************************
|
||||||
|
* Final Mix
|
||||||
|
************************************************/
|
||||||
|
DISCRETE_OUTPUT(SPRINT8_AUDIO_1_2, 32700.0/8)
|
||||||
|
DISCRETE_OUTPUT(SPRINT8_AUDIO_3_7, 32700.0/8)
|
||||||
|
DISCRETE_OUTPUT(SPRINT8_AUDIO_5_6, 32700.0/8)
|
||||||
|
DISCRETE_OUTPUT(SPRINT8_AUDIO_4_8, 32700.0/8)
|
||||||
|
DISCRETE_SOUND_END
|
||||||
|
|
||||||
|
|
||||||
|
WRITE8_DEVICE_HANDLER( sprint8_crash_w )
|
||||||
|
{
|
||||||
|
discrete_sound_w(device, SPRINT8_CRASH_EN, data & 0x01);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE8_DEVICE_HANDLER( sprint8_screech_w )
|
||||||
|
{
|
||||||
|
discrete_sound_w(device, SPRINT8_SCREECH_EN, data & 0x01);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE8_DEVICE_HANDLER( sprint8_attract_w )
|
||||||
|
{
|
||||||
|
discrete_sound_w(device, SPRINT8_ATTRACT_EN, data & 0x01);
|
||||||
|
}
|
||||||
|
|
||||||
|
WRITE8_DEVICE_HANDLER( sprint8_motor_w )
|
||||||
|
{
|
||||||
|
discrete_sound_w(device, NODE_RELATIVE(SPRINT8_MOTOR1_EN, offset & 0x07), data & 0x01);
|
||||||
|
}
|
@ -103,16 +103,6 @@ static WRITE8_HANDLER( sprint8_int_reset_w )
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* names of sound effects taken from Tank 8, might differ for Sprint 8 */
|
|
||||||
|
|
||||||
static WRITE8_HANDLER( sprint8_crash_w ) {}
|
|
||||||
static WRITE8_HANDLER( sprint8_explosion_w ) {}
|
|
||||||
static WRITE8_HANDLER( sprint8_bugle_w ) {}
|
|
||||||
static WRITE8_HANDLER( sprint8_bug_w ) {}
|
|
||||||
static WRITE8_HANDLER( sprint8_attract_w ) {}
|
|
||||||
static WRITE8_HANDLER( sprint8_motor_w ) {}
|
|
||||||
|
|
||||||
|
|
||||||
static ADDRESS_MAP_START( sprint8_map, ADDRESS_SPACE_PROGRAM, 8 )
|
static ADDRESS_MAP_START( sprint8_map, ADDRESS_SPACE_PROGRAM, 8 )
|
||||||
AM_RANGE(0x0000, 0x00ff) AM_RAM
|
AM_RANGE(0x0000, 0x00ff) AM_RAM
|
||||||
AM_RANGE(0x1800, 0x1bff) AM_RAM_WRITE(sprint8_video_ram_w) AM_BASE(&sprint8_video_ram)
|
AM_RANGE(0x1800, 0x1bff) AM_RAM_WRITE(sprint8_video_ram_w) AM_BASE(&sprint8_video_ram)
|
||||||
@ -126,13 +116,13 @@ static ADDRESS_MAP_START( sprint8_map, ADDRESS_SPACE_PROGRAM, 8 )
|
|||||||
AM_RANGE(0x1c20, 0x1c2f) AM_WRITEONLY AM_BASE(&sprint8_pos_d_ram)
|
AM_RANGE(0x1c20, 0x1c2f) AM_WRITEONLY AM_BASE(&sprint8_pos_d_ram)
|
||||||
AM_RANGE(0x1c30, 0x1c37) AM_WRITE(sprint8_lockout_w)
|
AM_RANGE(0x1c30, 0x1c37) AM_WRITE(sprint8_lockout_w)
|
||||||
AM_RANGE(0x1d00, 0x1d00) AM_WRITE(sprint8_int_reset_w)
|
AM_RANGE(0x1d00, 0x1d00) AM_WRITE(sprint8_int_reset_w)
|
||||||
AM_RANGE(0x1d01, 0x1d01) AM_WRITE(sprint8_crash_w)
|
AM_RANGE(0x1d01, 0x1d01) AM_DEVWRITE("discrete", sprint8_crash_w)
|
||||||
AM_RANGE(0x1d02, 0x1d02) AM_WRITE(sprint8_explosion_w)
|
AM_RANGE(0x1d02, 0x1d02) AM_DEVWRITE("discrete", sprint8_screech_w)
|
||||||
AM_RANGE(0x1d03, 0x1d03) AM_WRITE(sprint8_bugle_w)
|
AM_RANGE(0x1d03, 0x1d03) AM_WRITENOP
|
||||||
AM_RANGE(0x1d04, 0x1d04) AM_WRITE(sprint8_bug_w)
|
AM_RANGE(0x1d04, 0x1d04) AM_WRITENOP
|
||||||
AM_RANGE(0x1d05, 0x1d05) AM_WRITEONLY AM_BASE(&sprint8_team)
|
AM_RANGE(0x1d05, 0x1d05) AM_WRITEONLY AM_BASE(&sprint8_team)
|
||||||
AM_RANGE(0x1d06, 0x1d06) AM_WRITE(sprint8_attract_w)
|
AM_RANGE(0x1d06, 0x1d06) AM_DEVWRITE("discrete", sprint8_attract_w)
|
||||||
AM_RANGE(0x1e00, 0x1e07) AM_WRITE(sprint8_motor_w)
|
AM_RANGE(0x1e00, 0x1e07) AM_DEVWRITE("discrete", sprint8_motor_w)
|
||||||
AM_RANGE(0x1f00, 0x1f00) AM_WRITENOP /* probably a watchdog, disabled in service mode */
|
AM_RANGE(0x1f00, 0x1f00) AM_WRITENOP /* probably a watchdog, disabled in service mode */
|
||||||
AM_RANGE(0x2000, 0x3fff) AM_ROM
|
AM_RANGE(0x2000, 0x3fff) AM_ROM
|
||||||
AM_RANGE(0xf800, 0xffff) AM_ROM
|
AM_RANGE(0xf800, 0xffff) AM_ROM
|
||||||
@ -479,7 +469,30 @@ static MACHINE_DRIVER_START( sprint8 )
|
|||||||
MDRV_VIDEO_UPDATE(sprint8)
|
MDRV_VIDEO_UPDATE(sprint8)
|
||||||
MDRV_VIDEO_EOF(sprint8)
|
MDRV_VIDEO_EOF(sprint8)
|
||||||
|
|
||||||
|
|
||||||
/* sound hardware */
|
/* sound hardware */
|
||||||
|
#if 0
|
||||||
|
/* the proper way is to hook up 4 speakers, but they are not really
|
||||||
|
* F/R/L/R speakers. Though you can pretend the 1-2 mix is the front.
|
||||||
|
* For now I just output 1-2 as mono. */
|
||||||
|
MDRV_SPEAKER_ADD("speaker_1_2", 0.0, 0.0, 1.0) /* front */
|
||||||
|
MDRV_SPEAKER_ADD("speaker_3_7", 0.0, 0.0, -0.5) /* back */
|
||||||
|
MDRV_SPEAKER_ADD("speaker_5_6", -0.2, 0.0, 1.0) /* left */
|
||||||
|
MDRV_SPEAKER_ADD("speaker_4_8", 0.2, 0.0, 1.0) /* right */
|
||||||
|
|
||||||
|
MDRV_SOUND_ADD("discrete", DISCRETE, 0)
|
||||||
|
MDRV_SOUND_CONFIG_DISCRETE(sprint8)
|
||||||
|
MDRV_SOUND_ROUTE(0, "speaker_1_2", 1.0)
|
||||||
|
MDRV_SOUND_ROUTE(1, "speaker_3_7", 1.0)
|
||||||
|
MDRV_SOUND_ROUTE(3, "speaker_5_6", 1.0)
|
||||||
|
MDRV_SOUND_ROUTE(4, "speaker_4_8", 1.0)
|
||||||
|
#else
|
||||||
|
MDRV_SPEAKER_STANDARD_MONO("speaker")
|
||||||
|
|
||||||
|
MDRV_SOUND_ADD("discrete", DISCRETE, 0)
|
||||||
|
MDRV_SOUND_CONFIG_DISCRETE(sprint8)
|
||||||
|
MDRV_SOUND_ROUTE(0, "speaker", 1.0)
|
||||||
|
#endif
|
||||||
MACHINE_DRIVER_END
|
MACHINE_DRIVER_END
|
||||||
|
|
||||||
|
|
||||||
@ -516,5 +529,5 @@ ROM_START( sprint8a )
|
|||||||
ROM_END
|
ROM_END
|
||||||
|
|
||||||
|
|
||||||
GAME( 1977, sprint8, 0, sprint8, sprint8, 0, ROT0, "Atari", "Sprint 8", GAME_NO_SOUND )
|
GAME( 1977, sprint8, 0, sprint8, sprint8, 0, ROT0, "Atari", "Sprint 8", GAME_IMPERFECT_SOUND )
|
||||||
GAME( 1977, sprint8a, sprint8, sprint8, sprint8p, 0, ROT0, "Atari", "Sprint 8 (play tag & chase)", GAME_NO_SOUND )
|
GAME( 1977, sprint8a, sprint8, sprint8, sprint8p, 0, ROT0, "Atari", "Sprint 8 (play tag & chase)", GAME_IMPERFECT_SOUND )
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
#include "sound/discrete.h"
|
||||||
|
|
||||||
/*----------- defined in drivers/sprint8.c -----------*/
|
/*----------- defined in drivers/sprint8.c -----------*/
|
||||||
|
|
||||||
void sprint8_set_collision(running_machine *machine, int n);
|
void sprint8_set_collision(running_machine *machine, int n);
|
||||||
@ -17,3 +19,13 @@ VIDEO_START( sprint8 );
|
|||||||
VIDEO_UPDATE( sprint8 );
|
VIDEO_UPDATE( sprint8 );
|
||||||
|
|
||||||
WRITE8_HANDLER( sprint8_video_ram_w );
|
WRITE8_HANDLER( sprint8_video_ram_w );
|
||||||
|
|
||||||
|
|
||||||
|
/*----------- defined in audio/sprint8.c -----------*/
|
||||||
|
|
||||||
|
DISCRETE_SOUND_EXTERN( sprint8 );
|
||||||
|
|
||||||
|
WRITE8_DEVICE_HANDLER( sprint8_crash_w );
|
||||||
|
WRITE8_DEVICE_HANDLER( sprint8_screech_w );
|
||||||
|
WRITE8_DEVICE_HANDLER( sprint8_attract_w );
|
||||||
|
WRITE8_DEVICE_HANDLER( sprint8_motor_w );
|
||||||
|
@ -433,7 +433,7 @@ $(MAMEOBJ)/atari.a: \
|
|||||||
$(DRIVERS)/skyraid.o $(AUDIO)/skyraid.o $(VIDEO)/skyraid.o \
|
$(DRIVERS)/skyraid.o $(AUDIO)/skyraid.o $(VIDEO)/skyraid.o \
|
||||||
$(DRIVERS)/sprint2.o $(AUDIO)/sprint2.o $(VIDEO)/sprint2.o \
|
$(DRIVERS)/sprint2.o $(AUDIO)/sprint2.o $(VIDEO)/sprint2.o \
|
||||||
$(DRIVERS)/sprint4.o $(VIDEO)/sprint4.o $(AUDIO)/sprint4.o \
|
$(DRIVERS)/sprint4.o $(VIDEO)/sprint4.o $(AUDIO)/sprint4.o \
|
||||||
$(DRIVERS)/sprint8.o $(VIDEO)/sprint8.o \
|
$(DRIVERS)/sprint8.o $(AUDIO)/sprint8.o $(VIDEO)/sprint8.o \
|
||||||
$(DRIVERS)/starshp1.o $(AUDIO)/starshp1.o $(VIDEO)/starshp1.o \
|
$(DRIVERS)/starshp1.o $(AUDIO)/starshp1.o $(VIDEO)/starshp1.o \
|
||||||
$(DRIVERS)/starwars.o $(MACHINE)/starwars.o $(AUDIO)/starwars.o \
|
$(DRIVERS)/starwars.o $(MACHINE)/starwars.o $(AUDIO)/starwars.o \
|
||||||
$(DRIVERS)/subs.o $(MACHINE)/subs.o $(AUDIO)/subs.o $(VIDEO)/subs.o \
|
$(DRIVERS)/subs.o $(MACHINE)/subs.o $(AUDIO)/subs.o $(VIDEO)/subs.o \
|
||||||
|
Loading…
Reference in New Issue
Block a user