Sprint 8 - complete discrete sound

This commit is contained in:
Derrick Renaud 2009-10-02 02:10:43 +00:00
parent 27bbf65bd1
commit 9ca9d30419
11 changed files with 131 additions and 107 deletions

View File

@ -272,31 +272,20 @@ static DISCRETE_RESET(dst_comp_adder)
* *
* DST_CLAMP - Simple signal clamping circuit * DST_CLAMP - Simple signal clamping circuit
* *
* input[0] - Enable ramp * input[0] - Input value
* input[1] - Input value * input[1] - Minimum value
* input[2] - Minimum value * input[2] - Maximum value
* input[3] - Maximum value
* input[4] - Clamp output when disabled
* *
************************************************************************/ ************************************************************************/
#define DST_CLAMP__ENABLE DISCRETE_INPUT(0) #define DST_CLAMP__IN DISCRETE_INPUT(0)
#define DST_CLAMP__IN DISCRETE_INPUT(1) #define DST_CLAMP__MIN DISCRETE_INPUT(1)
#define DST_CLAMP__MIN DISCRETE_INPUT(2) #define DST_CLAMP__MAX DISCRETE_INPUT(2)
#define DST_CLAMP__MAX DISCRETE_INPUT(3)
#define DST_CLAMP__CLAMP DISCRETE_INPUT(4)
static DISCRETE_STEP(dst_clamp) static DISCRETE_STEP(dst_clamp)
{ {
if(DST_CLAMP__ENABLE)
{
if (DST_CLAMP__IN < DST_CLAMP__MIN) node->output[0] = DST_CLAMP__MIN; if (DST_CLAMP__IN < DST_CLAMP__MIN) node->output[0] = DST_CLAMP__MIN;
else if (DST_CLAMP__IN > DST_CLAMP__MAX) node->output[0] = DST_CLAMP__MAX; else if (DST_CLAMP__IN > DST_CLAMP__MAX) node->output[0] = DST_CLAMP__MAX;
else node->output[0]= DST_CLAMP__IN; else node->output[0]= DST_CLAMP__IN;
}
else
{
node->output[0] = DST_CLAMP__CLAMP;
}
} }

View File

@ -1193,34 +1193,30 @@
* *
* .------------. * .------------.
* | | * | |
* ENAB -0------>| | * INP0 -0------>| |
* | | * | |
* INP0 -1------>| | * MIN -1------>| CLAMP |----> Netlist node
* | | * | |
* MIN -2------>| CLAMP |----> Netlist node * MAX -2------>| |
* | |
* MAX -3------>| |
* | |
* CLAMP -4------>| |
* | | * | |
* '------------' * '------------'
* *
* Declaration syntax * Declaration syntax
* *
* DISCRETE_CLAMP(name of node, * DISCRETE_CLAMP(name of node,
* enable,
* input node, * input node,
* minimum node or static value, * minimum node or static value,
* maximum node or static value, * maximum node or static value),
* clamp node or static value when disabled)
* *
* Example config line * Example config line
* *
* DISCRETE_CLAMP(NODE_9,NODE_10,NODE_11,2.0,10.0,5.0) * DISCRETE_CLAMP(NODE_9,NODE_10,2.0,10.0)
* *
* Node10 when not zero will allow clamp to operate forcing the value * Force the value on the node output, to be within the MIN/MAX
* on the node output, to be within the MIN/MAX boundard. When enable * boundary. In this example the output is clamped to the range
* is set to zero the node will output the clamp value * of 2.0 to 10.0 inclusive.
*
* EXAMPLES: Sprint 8
* *
*********************************************************************** ***********************************************************************
* *
@ -4319,7 +4315,7 @@ enum
#define DISCRETE_ADDER2(NODE,ENAB,INP0,INP1) { NODE, DST_ADDER , 3, { ENAB,INP0,INP1 }, { ENAB,INP0,INP1 }, NULL, "DISCRETE_ADDER2" }, #define DISCRETE_ADDER2(NODE,ENAB,INP0,INP1) { NODE, DST_ADDER , 3, { ENAB,INP0,INP1 }, { ENAB,INP0,INP1 }, NULL, "DISCRETE_ADDER2" },
#define DISCRETE_ADDER3(NODE,ENAB,INP0,INP1,INP2) { NODE, DST_ADDER , 4, { ENAB,INP0,INP1,INP2 }, { ENAB,INP0,INP1,INP2 }, NULL, "DISCRETE_ADDER3" }, #define DISCRETE_ADDER3(NODE,ENAB,INP0,INP1,INP2) { NODE, DST_ADDER , 4, { ENAB,INP0,INP1,INP2 }, { ENAB,INP0,INP1,INP2 }, NULL, "DISCRETE_ADDER3" },
#define DISCRETE_ADDER4(NODE,ENAB,INP0,INP1,INP2,INP3) { NODE, DST_ADDER , 5, { ENAB,INP0,INP1,INP2,INP3 }, { ENAB,INP0,INP1,INP2,INP3 }, NULL, "DISCRETE_ADDER4" }, #define DISCRETE_ADDER4(NODE,ENAB,INP0,INP1,INP2,INP3) { NODE, DST_ADDER , 5, { ENAB,INP0,INP1,INP2,INP3 }, { ENAB,INP0,INP1,INP2,INP3 }, NULL, "DISCRETE_ADDER4" },
#define DISCRETE_CLAMP(NODE,ENAB,INP0,MIN,MAX,CLAMP) { NODE, DST_CLAMP , 5, { ENAB,INP0,MIN,MAX,CLAMP }, { ENAB,INP0,MIN,MAX,CLAMP }, NULL, "DISCRETE_CLAMP" }, #define DISCRETE_CLAMP(NODE,INP0,MIN,MAX) { NODE, DST_CLAMP , 3, { INP0,MIN,MAX }, { INP0,MIN,MAX }, NULL, "DISCRETE_CLAMP" },
#define DISCRETE_DIVIDE(NODE,ENAB,INP0,INP1) { NODE, DST_DIVIDE , 3, { ENAB,INP0,INP1 }, { ENAB,INP0,INP1 }, NULL, "DISCRETE_DIVIDE" }, #define DISCRETE_DIVIDE(NODE,ENAB,INP0,INP1) { NODE, DST_DIVIDE , 3, { ENAB,INP0,INP1 }, { ENAB,INP0,INP1 }, NULL, "DISCRETE_DIVIDE" },
#define DISCRETE_GAIN(NODE,INP0,GAIN) { NODE, DST_GAIN , 3, { INP0,NODE_NC,NODE_NC }, { INP0,GAIN,0 }, NULL, "DISCRETE_GAIN" }, #define DISCRETE_GAIN(NODE,INP0,GAIN) { NODE, DST_GAIN , 3, { INP0,NODE_NC,NODE_NC }, { INP0,GAIN,0 }, NULL, "DISCRETE_GAIN" },
#define DISCRETE_INVERT(NODE,INP0) { NODE, DST_GAIN , 3, { INP0,NODE_NC,NODE_NC }, { INP0,-1,0 }, NULL, "DISCRETE_INVERT" }, #define DISCRETE_INVERT(NODE,INP0) { NODE, DST_GAIN , 3, { INP0,NODE_NC,NODE_NC }, { INP0,-1,0 }, NULL, "DISCRETE_INVERT" },

View File

@ -280,7 +280,7 @@ static DISCRETE_SOUND_START(galaxian)
// Next is mult/add opamp circuit // Next is mult/add opamp circuit
DISCRETE_MULTADD(NODE_110, NODE_105, GAL_R33/RES_3_PARALLEL(GAL_R31,GAL_R32,GAL_R33), DISCRETE_MULTADD(NODE_110, NODE_105, GAL_R33/RES_3_PARALLEL(GAL_R31,GAL_R32,GAL_R33),
-5.0*GAL_R33/GAL_R31) -5.0*GAL_R33/GAL_R31)
DISCRETE_CLAMP(NODE_111,1,NODE_110,0.0,5.0,0.0) DISCRETE_CLAMP(NODE_111,NODE_110,0.0,5.0)
// The three 555 // The three 555
DISCRETE_555_ASTABLE_CV(NODE_115, GAL_INP_FS1, GAL_R22, GAL_R23, GAL_C17, NODE_111, &galaxian_555_vco_desc) DISCRETE_555_ASTABLE_CV(NODE_115, GAL_INP_FS1, GAL_R22, GAL_R23, GAL_C17, NODE_111, &galaxian_555_vco_desc)
DISCRETE_555_ASTABLE_CV(NODE_116, GAL_INP_FS2, GAL_R25, GAL_R26, GAL_C18, NODE_111, &galaxian_555_vco_desc) DISCRETE_555_ASTABLE_CV(NODE_116, GAL_INP_FS2, GAL_R25, GAL_R26, GAL_C18, NODE_111, &galaxian_555_vco_desc)

View File

@ -187,7 +187,7 @@ DISCRETE_SOUND_START( madalien )
DISCRETE_TRANSFORM3(NODE_32, MADALIEN_8910_PSG_A, NODE_30, -RES_K(10)/RES_K(3.3), "01-2*1+") DISCRETE_TRANSFORM3(NODE_32, MADALIEN_8910_PSG_A, NODE_30, -RES_K(10)/RES_K(3.3), "01-2*1+")
// pin 1 // pin 1
DISCRETE_SWITCH(NODE_33, 1, MADALIEN_8910_PORTA_3, NODE_31, NODE_32) DISCRETE_SWITCH(NODE_33, 1, MADALIEN_8910_PORTA_3, NODE_31, NODE_32)
DISCRETE_CLAMP(NODE_34, 1, NODE_33, -5, 5.0-1.5, 0) DISCRETE_CLAMP(NODE_34, NODE_33, -5, 5.0-1.5)
// bottom op-amp // bottom op-amp
DISCRETE_ONOFF(NODE_40, MADALIEN_8910_PORTA_6, MADALIEN_8910_PSG_B) DISCRETE_ONOFF(NODE_40, MADALIEN_8910_PORTA_6, MADALIEN_8910_PSG_B)
@ -230,7 +230,7 @@ DISCRETE_SOUND_START( madalien )
************************************************/ ************************************************/
DISCRETE_CRFILTER(NODE_60, 1, MADALIEN_8910_PORTB_7, RES_K(100), CAP_U(4.7)) DISCRETE_CRFILTER(NODE_60, 1, MADALIEN_8910_PORTB_7, RES_K(100), CAP_U(4.7))
// 2 diodes clamp it positive. // 2 diodes clamp it positive.
DISCRETE_CLAMP(NODE_62, 1, NODE_60, 0, 12, 0) DISCRETE_CLAMP(NODE_62, NODE_60, 0, 12)
// the 0.047uF cap to ground just removes real world spikes. // the 0.047uF cap to ground just removes real world spikes.
// it does not have to be simulated. // it does not have to be simulated.
DISCRETE_MIXER2(NODE_64, 1, NODE_62, 5, &madalien_555_1c_cv) DISCRETE_MIXER2(NODE_64, 1, NODE_62, 5, &madalien_555_1c_cv)

View File

@ -981,11 +981,9 @@ static DISCRETE_SOUND_START(checkmat)
NODE_23, /* IN0 */ NODE_23, /* IN0 */
15) /* GAIN */ 15) /* GAIN */
DISCRETE_CLAMP(CHECKMAT_BOOM_SND, /* IC Q2/3, pin 10 */ DISCRETE_CLAMP(CHECKMAT_BOOM_SND, /* IC Q2/3, pin 10 */
1, /* ENAB */
NODE_24, /* IN0 */ NODE_24, /* IN0 */
0 - 6, /* MIN */ 0 - 6, /* MIN */
12.0 - OP_AMP_NORTON_VBE -6,/* MAX */ 12.0 - OP_AMP_NORTON_VBE -6)/* MAX */
0) /* CLAMP */
/************************************************ /************************************************
* Tone generator * Tone generator
@ -2572,11 +2570,9 @@ static DISCRETE_SOUND_START(spcenctr)
NODE_31, /* IN0 */ NODE_31, /* IN0 */
-0.5) /* IN1 */ -0.5) /* IN1 */
DISCRETE_CLAMP(NODE_33, DISCRETE_CLAMP(NODE_33,
1, /* ENAB */
NODE_32, /* IN0 */ NODE_32, /* IN0 */
0, /* MIN */ 0, /* MIN */
12, /* MAX */ 12) /* MAX */
0) /* CLAMP */
DISCRETE_CRFILTER(NODE_34, DISCRETE_CRFILTER(NODE_34,
1, /* ENAB */ 1, /* ENAB */
SPCENCTR_NOISE, /* IN0 */ SPCENCTR_NOISE, /* IN0 */
@ -2640,11 +2636,9 @@ static DISCRETE_SOUND_START(spcenctr)
NODE_63, /* IN0 */ NODE_63, /* IN0 */
6.8) /* IN1 */ 6.8) /* IN1 */
DISCRETE_CLAMP(SPCENCTR_CRASH_SND, /* IC C2, pin 5 */ DISCRETE_CLAMP(SPCENCTR_CRASH_SND, /* IC C2, pin 5 */
1, /* ENAB */
NODE_64, /* IN0 */ NODE_64, /* IN0 */
0, /* MIN */ 0, /* MIN */
12.0 - OP_AMP_NORTON_VBE, /* MAX */ 12.0 - OP_AMP_NORTON_VBE) /* MAX */
0) /* CLAMP */
/************************************************ /************************************************
@ -3599,11 +3593,9 @@ static const discrete_mixer_desc invaders_mixer =
INVADERS_NODE(71, _board), /* IN0 */ \ INVADERS_NODE(71, _board), /* IN0 */ \
-0.5) /* IN1 */ \ -0.5) /* IN1 */ \
DISCRETE_CLAMP(INVADERS_NODE(73, _board), \ DISCRETE_CLAMP(INVADERS_NODE(73, _board), \
1, /* ENAB */ \
INVADERS_NODE(72, _board), /* IN0 */ \ INVADERS_NODE(72, _board), /* IN0 */ \
0, /* MIN */ \ 0, /* MIN */ \
12, /* MAX */ \ 12) /* MAX */ \
0) /* CLAMP */ \
DISCRETE_CRFILTER(INVADERS_NODE(74, _board), \ DISCRETE_CRFILTER(INVADERS_NODE(74, _board), \
1, /* ENAB */ \ 1, /* ENAB */ \
INVADERS_NOISE, /* IN0 */ \ INVADERS_NOISE, /* IN0 */ \

View File

@ -336,11 +336,9 @@ DISCRETE_SOUND_START(polepos)
0.5 /* overall filter GAIN */) 0.5 /* overall filter GAIN */)
/* clamp to the maximum of the op-amp shifted by vRef */ /* clamp to the maximum of the op-amp shifted by vRef */
DISCRETE_CLAMP(POLEPOS_CHANL4_SND, DISCRETE_CLAMP(POLEPOS_CHANL4_SND,
1, /* ENAB */
NODE_54, /* IN0 */ NODE_54, /* IN0 */
0, /* MIN */ 0, /* MIN */
5.0 - OP_AMP_VP_RAIL_OFFSET - POLEPOS_VREF, /* MAX */ 5.0 - OP_AMP_VP_RAIL_OFFSET - POLEPOS_VREF) /* MAX */
0.0 - POLEPOS_VREF /* disabled CLAMP value */)
/************************************************ /************************************************
* Output * Output

View File

@ -335,7 +335,7 @@ DISCRETE_SOUND_START( skyraid )
DISC_OP_AMP_FILTER_IS_BAND_PASS_1M, &skyraid_explosion_filter) /* TYPE,INFO */ DISC_OP_AMP_FILTER_IS_BAND_PASS_1M, &skyraid_explosion_filter) /* TYPE,INFO */
/* IC E10, pin 14 gain and clipping */ /* IC E10, pin 14 gain and clipping */
DISCRETE_GAIN(NODE_23, NODE_22, SKYRAID_R119 / SKYRAID_R121 + 1) DISCRETE_GAIN(NODE_23, NODE_22, SKYRAID_R119 / SKYRAID_R121 + 1)
DISCRETE_CLAMP(SKYRAID_EXPLOSION_SND, 1, NODE_23, -5, 12.0 - 1.5, 0) DISCRETE_CLAMP(SKYRAID_EXPLOSION_SND, NODE_23, -5, 12.0 - 1.5)
/************************************************ /************************************************
* Jet, Plane sound * Jet, Plane sound
@ -397,7 +397,7 @@ DISCRETE_SOUND_START( skyraid )
SKYRAID_C93) SKYRAID_C93)
/* IC E10, pin 1 gain and clipping */ /* IC E10, pin 1 gain and clipping */
DISCRETE_GAIN(NODE_94, NODE_93, - SKYRAID_R118 / (SKYRAID_R122 + RES_5_PARALLEL(SKYRAID_R120, SKYRAID_R32, SKYRAID_R29, SKYRAID_R30, SKYRAID_R31))) DISCRETE_GAIN(NODE_94, NODE_93, - SKYRAID_R118 / (SKYRAID_R122 + RES_5_PARALLEL(SKYRAID_R120, SKYRAID_R32, SKYRAID_R29, SKYRAID_R30, SKYRAID_R31)))
DISCRETE_CLAMP(NODE_95, 1, NODE_94, -5, 12.0 - 1.5, 0) DISCRETE_CLAMP(NODE_95, NODE_94, -5, 12.0 - 1.5)
DISCRETE_OUTPUT(NODE_95, 32700.0/8) DISCRETE_OUTPUT(NODE_95, 32700.0/8)
DISCRETE_SOUND_END DISCRETE_SOUND_END

View File

@ -361,7 +361,7 @@ DISCRETE_SOUND_START( fantasy )
/* This is not the perfect way to discharge, but it is good enough for now */ /* This is not the perfect way to discharge, but it is good enough for now */
/* it does not take into acount that there is no discharge when noise is low */ /* it does not take into acount that there is no discharge when noise is low */
DISCRETE_RCDISC2(NODE_10, FANTASY_BOMB_EN, 0, RES_K(10) + RES_K(33), DEFAULT_TTL_V_LOGIC_1 - 0.5, RES_K(1), CAP_U(1)) DISCRETE_RCDISC2(NODE_10, FANTASY_BOMB_EN, 0, RES_K(10) + RES_K(33), DEFAULT_TTL_V_LOGIC_1 - 0.5, RES_K(1), CAP_U(1))
DISCRETE_CLAMP(FANTASY_NOISE_LOGIC, 1, FANTASY_NOISE_STREAM_IN, 0, 1, 0) DISCRETE_CLAMP(FANTASY_NOISE_LOGIC, FANTASY_NOISE_STREAM_IN, 0, 1)
DISCRETE_SWITCH(NODE_11, 1, FANTASY_NOISE_LOGIC, 0, NODE_10) DISCRETE_SWITCH(NODE_11, 1, FANTASY_NOISE_LOGIC, 0, NODE_10)
DISCRETE_OP_AMP_FILTER(NODE_20, 1, NODE_11, 0, DISC_OP_AMP_FILTER_IS_BAND_PASS_1M, &fantasy_filter) DISCRETE_OP_AMP_FILTER(NODE_20, 1, NODE_11, 0, DISC_OP_AMP_FILTER_IS_BAND_PASS_1M, &fantasy_filter)

View File

@ -36,6 +36,9 @@
#define SPRINT8_AUDIO_5_6 NODE_24 #define SPRINT8_AUDIO_5_6 NODE_24
#define SPRINT8_AUDIO_4_8 NODE_25 #define SPRINT8_AUDIO_4_8 NODE_25
/* Adjusters */
#define SPRINT8_R132_POT NODE_29
/* Parts List - Resistors */ /* Parts List - Resistors */
#define SPRINT8_R1 RES_K(47) #define SPRINT8_R1 RES_K(47)
@ -56,12 +59,16 @@
#define SPRINT8_R97 RES_K(2.2) #define SPRINT8_R97 RES_K(2.2)
#define SPRINT8_R99 RES_K(27) #define SPRINT8_R99 RES_K(27)
#define SPRINT8_R100 RES_K(1) #define SPRINT8_R100 RES_K(1)
#define SPRINT8_R101 RES_K(2.2)
#define SPRINT8_R132 RES_K(100)
#define SPRINT8_R145 RES_K(3.3) #define SPRINT8_R145 RES_K(3.3)
#define SPRINT8_R146 RES_K(7.5) #define SPRINT8_R146 RES_K(7.5)
#define SPRINT8_R147 100 #define SPRINT8_R147 100
#define SPRINT8_R148 RES_K(1) #define SPRINT8_R148 RES_K(1)
#define SPRINT8_R149 RES_K(22)
/* Parts List - Capacitors */ /* Parts List - Capacitors */
#define SPRINT8_C8 CAP_U(.01)
#define SPRINT8_C17 CAP_U(.001) #define SPRINT8_C17 CAP_U(.001)
#define SPRINT8_C18 CAP_U(.047) #define SPRINT8_C18 CAP_U(.047)
#define SPRINT8_C19 CAP_U(.047) #define SPRINT8_C19 CAP_U(.047)
@ -69,6 +76,7 @@
#define SPRINT8_C27 CAP_U(.22) #define SPRINT8_C27 CAP_U(.22)
#define SPRINT8_C28 CAP_U(.1) #define SPRINT8_C28 CAP_U(.1)
#define SPRINT8_C59 CAP_U(.1) #define SPRINT8_C59 CAP_U(.1)
#define SPRINT8_C63 CAP_U(.1)
#define SPRINT8_C64 CAP_U(.1) #define SPRINT8_C64 CAP_U(.1)
#define SPRINT8_C89 CAP_U(.1) #define SPRINT8_C89 CAP_U(.1)
#define SPRINT8_C90 CAP_U(.1) #define SPRINT8_C90 CAP_U(.1)
@ -85,11 +93,11 @@ static const discrete_lfsr_desc sprint8_lfsr =
0, /* Reset Value */ 0, /* Reset Value */
10, /* Use Bit 10 as XOR input 0 */ 10, /* Use Bit 10 as XOR input 0 */
15, /* Use Bit 15 as XOR input 1 */ 15, /* Use Bit 15 as XOR input 1 */
DISC_LFSR_XOR, /* Feedback stage1 is XOR */ DISC_LFSR_XNOR, /* Feedback stage1 is XNOR */
DISC_LFSR_OR, /* Feedback stage2 is just stage 1 output OR with external feed */ DISC_LFSR_OR, /* Feedback stage2 is just stage 1 output OR with external feed */
DISC_LFSR_REPLACE, /* Feedback stage3 replaces the shifted register contents */ DISC_LFSR_REPLACE, /* Feedback stage3 replaces the shifted register contents */
0x000001, /* Everything is shifted into the first bit only */ 0x000001, /* Everything is shifted into the first bit only */
DISC_LFSR_FLAG_RESET_TYPE_H, /* Output is not inverted */ DISC_LFSR_FLAG_RESET_TYPE_L, /* Output is not inverted */
12 /* Output bit */ 12 /* Output bit */
}; };
@ -126,11 +134,19 @@ static const discrete_op_amp_filt_info sprint8_motor_filter =
5.0 * RES_VOLTAGE_DIVIDER(SPRINT8_R19, SPRINT8_R20), 5, 0 /* vRef, vP, vN */ 5.0 * RES_VOLTAGE_DIVIDER(SPRINT8_R19, SPRINT8_R20), 5, 0 /* vRef, vP, vN */
}; };
static const discrete_mixer_desc sprint8_crash_screech_mixer =
{
DISC_MIXER_IS_RESISTOR,
{SPRINT8_R149, SPRINT8_R91},
{0, NODE_80}, /* R93 switched in/out of circuit */
{0}, 0, 0, SPRINT8_C64, 0, 0, 1 /* c, rI, rF, cF, cAmp, vRef, gain */
};
static const discrete_mixer_desc sprint8_mixer = static const discrete_mixer_desc sprint8_mixer =
{ {
DISC_MIXER_IS_RESISTOR, DISC_MIXER_IS_RESISTOR,
{SPRINT8_R1 + SPRINT8_R100, SPRINT8_R3, SPRINT8_R4}, {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 */ {0}, {0}, 0, 0, 0, SPRINT8_C8, 0, 1 /* r_nodes, c, rI, rF, cF, cAmp, vRef, gain */
}; };
@ -153,7 +169,7 @@ DISCRETE_SOUND_START( sprint8 )
/************************************************ /************************************************
* Input register mapping * Input register mapping
************************************************/ ************************************************/
DISCRETE_INPUT_NOT (SPRINT8_CRASH_EN) DISCRETE_INPUT_LOGIC(SPRINT8_CRASH_EN)
DISCRETE_INPUT_NOT (SPRINT8_SCREECH_EN) DISCRETE_INPUT_NOT (SPRINT8_SCREECH_EN)
DISCRETE_INPUT_NOT (SPRINT8_ATTRACT_EN) DISCRETE_INPUT_NOT (SPRINT8_ATTRACT_EN)
DISCRETE_INPUTX_LOGIC(SPRINT8_MOTOR1_EN, DEFAULT_TTL_V_LOGIC_1, 0, 0) DISCRETE_INPUTX_LOGIC(SPRINT8_MOTOR1_EN, DEFAULT_TTL_V_LOGIC_1, 0, 0)
@ -164,30 +180,55 @@ DISCRETE_SOUND_START( sprint8 )
DISCRETE_INPUTX_LOGIC(SPRINT8_MOTOR6_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_MOTOR7_EN, DEFAULT_TTL_V_LOGIC_1, 0, 0)
DISCRETE_INPUTX_LOGIC(SPRINT8_MOTOR8_EN, DEFAULT_TTL_V_LOGIC_1, 0, 0) DISCRETE_INPUTX_LOGIC(SPRINT8_MOTOR8_EN, DEFAULT_TTL_V_LOGIC_1, 0, 0)
DISCRETE_ADJUSTMENT_TAG(SPRINT8_R132_POT, 0, SPRINT8_R132, DISC_LINADJ, "R132")
/************************************************ /************************************************
* Noise Generator, Crash, Screech * Noise Generator, Crash, Screech
************************************************/ ************************************************/
/* Address line A2 is used to XOR the feedback bits.
* This can not easily be implemented, so I just set the
* feedback as XNOR. */
DISCRETE_LFSR_NOISE(SPRINT8_NOISE, /* IC F7, pin 13 */ DISCRETE_LFSR_NOISE(SPRINT8_NOISE, /* IC F7, pin 13 */
1, /* ENAB */ 1, /* ENAB */
SPRINT8_ATTRACT_EN, /* RESET */ SPRINT8_ATTRACT_EN, /* RESET */
SPRINT8_2V, 1, 0, 0.5, &sprint8_lfsr) /* CLK,AMPL,FEED,BIAS,LFSRTB */ SPRINT8_2V, 1, 0, 0.5, &sprint8_lfsr) /* CLK,AMPL,FEED,BIAS,LFSRTB */
DISCRETE_CONSTANT(NODE_70, 0) DISCRETE_GAIN(NODE_70, SPRINT8_NOISE, DEFAULT_TTL_V_LOGIC_1 * RES_VOLTAGE_DIVIDER(SPRINT8_R148, SPRINT8_R147))
// DISCRETE_CUSTOM4(NODE_70, SPRINT8_NOISE, SPRINT8_R148, SPRINT8_R147, SPRINT8_C90, &sprint8_custom_screech_charge) DISCRETE_CRFILTER_VREF(NODE_71,
DISCRETE_555_ASTABLE_CV(NODE_71, 1, /* ENAB */
NODE_70, /* IN0 */
RES_2_PARALLEL(SPRINT8_R148, SPRINT8_R147) + RES_2_PARALLEL(RES_K(5), RES_K(10)),
SPRINT8_C90,
5.0 * RES_VOLTAGE_DIVIDER(RES_K(5), RES_K(10))) /* ref to 555 CV pin */
DISCRETE_555_ASTABLE_CV(NODE_72,
SPRINT8_SCREECH_EN, /* RESET */ SPRINT8_SCREECH_EN, /* RESET */
SPRINT8_R145, SPRINT8_R146, SPRINT8_C89, SPRINT8_R145, SPRINT8_R146, SPRINT8_C89,
NODE_70, /* CTRLV */ NODE_71, /* CTRLV */
&sprint8_crash_555a_desc) &sprint8_crash_555a_desc)
DISCRETE_INTEGRATE(NODE_72, SPRINT8_CRASH_EN, 0, &sprint8_crash_integrate) DISCRETE_INTEGRATE(NODE_73, 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) DISCRETE_SWITCH(NODE_80,
1, /* ENAB */
SPRINT8_NOISE, /* SWITCH */
SPRINT8_R93, 1) /* INP0,INP1*/
DISCRETE_SWITCH(NODE_74, /* effect of Q20 */
1, /* ENAB */
SPRINT8_NOISE, /* SWITCH */
NODE_73, 0) /* INP0,INP1*/
DISCRETE_MIXER2(NODE_75,
1, /* ENAB */
NODE_72,
NODE_74,
&sprint8_crash_screech_mixer)
DISCRETE_CRFILTER_VREF(NODE_76,
1, /* ENAB */
NODE_75, /* IN0 */
SPRINT8_R93 + SPRINT8_R91, SPRINT8_C63,
5) /* VREF */
/* IC E5, pin 14 gain. Does not simulate minor DC offset caused by R93. */
DISCRETE_TRANSFORM5(NODE_77, NODE_76, 5, SPRINT8_R132_POT, SPRINT8_R101, 1, "01-23/4+*1+")
DISCRETE_CLAMP(SPRINT8_CRASH_SCREECH_SND, NODE_77, 0, 15.0 - 1.5)
/************************************************ /************************************************
* Car Motor * Car Motor
@ -195,54 +236,54 @@ DISCRETE_SOUND_START( sprint8 )
DISCRETE_TASK_START() DISCRETE_TASK_START()
SPRINT8_MOTOR_CIRCUIT(1) SPRINT8_MOTOR_CIRCUIT(1)
SPRINT8_MOTOR_CIRCUIT(2) SPRINT8_MOTOR_CIRCUIT(2)
DISCRETE_TASK_END()
DISCRETE_TASK_START()
SPRINT8_MOTOR_CIRCUIT(3)
SPRINT8_MOTOR_CIRCUIT(7)
DISCRETE_TASK_END()
DISCRETE_TASK_START()
SPRINT8_MOTOR_CIRCUIT(5)
SPRINT8_MOTOR_CIRCUIT(6)
DISCRETE_TASK_END()
DISCRETE_TASK_START()
SPRINT8_MOTOR_CIRCUIT(4)
SPRINT8_MOTOR_CIRCUIT(8)
DISCRETE_TASK_END()
/************************************************
* Final Mix
************************************************/
DISCRETE_MIXER3(SPRINT8_AUDIO_1_2, DISCRETE_MIXER3(SPRINT8_AUDIO_1_2,
SPRINT8_ATTRACT_EN, /* ENAB */ SPRINT8_ATTRACT_EN, /* ENAB */
SPRINT8_CRASH_SCREECH_SND, SPRINT8_CRASH_SCREECH_SND,
SPRINT8_MOTOR1_SND, SPRINT8_MOTOR1_SND,
SPRINT8_MOTOR2_SND, SPRINT8_MOTOR2_SND,
&sprint8_mixer) &sprint8_mixer)
DISCRETE_TASK_END()
DISCRETE_TASK_START()
SPRINT8_MOTOR_CIRCUIT(3)
SPRINT8_MOTOR_CIRCUIT(7)
DISCRETE_MIXER3(SPRINT8_AUDIO_3_7, DISCRETE_MIXER3(SPRINT8_AUDIO_3_7,
SPRINT8_ATTRACT_EN, /* ENAB */ SPRINT8_ATTRACT_EN, /* ENAB */
SPRINT8_CRASH_SCREECH_SND, SPRINT8_CRASH_SCREECH_SND,
SPRINT8_MOTOR3_SND, SPRINT8_MOTOR3_SND,
SPRINT8_MOTOR7_SND, SPRINT8_MOTOR7_SND,
&sprint8_mixer) &sprint8_mixer)
DISCRETE_TASK_END()
DISCRETE_TASK_START()
SPRINT8_MOTOR_CIRCUIT(5)
SPRINT8_MOTOR_CIRCUIT(6)
DISCRETE_MIXER3(SPRINT8_AUDIO_5_6, DISCRETE_MIXER3(SPRINT8_AUDIO_5_6,
SPRINT8_ATTRACT_EN, /* ENAB */ SPRINT8_ATTRACT_EN, /* ENAB */
SPRINT8_CRASH_SCREECH_SND, SPRINT8_CRASH_SCREECH_SND,
SPRINT8_MOTOR5_SND, SPRINT8_MOTOR5_SND,
SPRINT8_MOTOR6_SND, SPRINT8_MOTOR6_SND,
&sprint8_mixer) &sprint8_mixer)
DISCRETE_TASK_END()
DISCRETE_TASK_START()
SPRINT8_MOTOR_CIRCUIT(4)
SPRINT8_MOTOR_CIRCUIT(8)
DISCRETE_MIXER3(SPRINT8_AUDIO_4_8, DISCRETE_MIXER3(SPRINT8_AUDIO_4_8,
SPRINT8_ATTRACT_EN, /* ENAB */ SPRINT8_ATTRACT_EN, /* ENAB */
SPRINT8_CRASH_SCREECH_SND, SPRINT8_CRASH_SCREECH_SND,
SPRINT8_MOTOR4_SND, SPRINT8_MOTOR4_SND,
SPRINT8_MOTOR8_SND, SPRINT8_MOTOR8_SND,
&sprint8_mixer) &sprint8_mixer)
DISCRETE_TASK_END() DISCRETE_OUTPUT(SPRINT8_AUDIO_1_2, 65500.0/8)
DISCRETE_OUTPUT(SPRINT8_AUDIO_3_7, 65500.0/8)
/************************************************ DISCRETE_OUTPUT(SPRINT8_AUDIO_5_6, 65500.0/8)
* Final Mix DISCRETE_OUTPUT(SPRINT8_AUDIO_4_8, 65500.0/8)
************************************************/
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 DISCRETE_SOUND_END

View File

@ -252,7 +252,7 @@ DISCRETE_SOUND_START(tank8)
1.0 + 100.0/22, // max gain of E5 = 1 + r132/r101 1.0 + 100.0/22, // max gain of E5 = 1 + r132/r101
DISC_LINADJ, "CRASH") DISC_LINADJ, "CRASH")
DISCRETE_MULTIPLY(NODE_129, NODE_127, NODE_128 ) DISCRETE_MULTIPLY(NODE_129, NODE_127, NODE_128 )
DISCRETE_CLAMP(TANK8_CRASHEXPL, 1, NODE_129, -(12.0 - OP_AMP_VP_RAIL_OFFSET)/2, (12.0 - OP_AMP_VP_RAIL_OFFSET)/2, 0) DISCRETE_CLAMP(TANK8_CRASHEXPL, NODE_129, -(12.0 - OP_AMP_VP_RAIL_OFFSET)/2, (12.0 - OP_AMP_VP_RAIL_OFFSET)/2)
/************************************************/ /************************************************/
/* Combine all 10 sound sources. */ /* Combine all 10 sound sources. */

View File

@ -261,6 +261,10 @@ static INPUT_PORTS_START( sprint8 )
PORT_START("VBLANK") PORT_START("VBLANK")
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_VBLANK ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_VBLANK )
/* this is actually a variable resistor */
PORT_START("R132")
PORT_ADJUSTER(65, "R132 - Crash & Screech Volume")
INPUT_PORTS_END INPUT_PORTS_END
@ -385,6 +389,10 @@ static INPUT_PORTS_START( sprint8p )
PORT_START("VBLANK") PORT_START("VBLANK")
PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_VBLANK ) PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_VBLANK )
/* this is actually a variable resistor */
PORT_START("R132")
PORT_ADJUSTER(65, "R132 - Crash & Screech Volume")
INPUT_PORTS_END INPUT_PORTS_END
@ -476,8 +484,8 @@ static MACHINE_DRIVER_START( sprint8 )
* F/R/L/R speakers. Though you can pretend the 1-2 mix is the front. * 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. */ * 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_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.0, 0.0, -0.5) /* back */
MDRV_SPEAKER_ADD("speaker_5_6", -0.2, 0.0, 1.0) /* left */ MDRV_SPEAKER_ADD("speaker_3_7", -0.2, 0.0, 1.0) /* left */
MDRV_SPEAKER_ADD("speaker_4_8", 0.2, 0.0, 1.0) /* right */ MDRV_SPEAKER_ADD("speaker_4_8", 0.2, 0.0, 1.0) /* right */
MDRV_SOUND_ADD("discrete", DISCRETE, 0) MDRV_SOUND_ADD("discrete", DISCRETE, 0)
@ -529,5 +537,5 @@ ROM_START( sprint8a )
ROM_END ROM_END
GAME( 1977, sprint8, 0, sprint8, sprint8, 0, ROT0, "Atari", "Sprint 8", GAME_IMPERFECT_SOUND ) GAME( 1977, sprint8, 0, sprint8, sprint8, 0, ROT0, "Atari", "Sprint 8", 0 )
GAME( 1977, sprint8a, sprint8, sprint8, sprint8p, 0, ROT0, "Atari", "Sprint 8 (play tag & chase)", GAME_IMPERFECT_SOUND ) GAME( 1977, sprint8a, sprint8, sprint8, sprint8p, 0, ROT0, "Atari", "Sprint 8 (play tag & chase)", 0 )