// license:BSD-3-Clause // copyright-holders:Derrick Renaud /************************************************************************* audio\triplhnt.cpp *************************************************************************/ #include "emu.h" #include "includes/triplhnt.h" #include "sound/discrete.h" const char *const triplhnt_sample_names[] = { "*triplhnt", "bear_rac", "witch", nullptr }; /************************************************************************/ /* triplhnt Sound System Analog emulation */ /* Feb 2004, Derrick Renaud */ /************************************************************************/ static const discrete_lfsr_desc triplhnt_lfsr = { DISC_CLK_IS_FREQ, 16, /* Bit Length */ 0, /* Reset Value */ 0, /* Use Bit 0 as XOR input 0 */ 14, /* Use Bit 14 as XOR input 1 */ DISC_LFSR_XNOR, /* Feedback stage1 is XNOR */ 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 */ 0, /* Output not inverted */ 15 /* Output bit */ }; static const discrete_dac_r1_ladder triplhnt_bear_roar_v_dac = { 4, // size of ladder {1000000, 470000, 220000, 2200000}, // R47, R50, R48, R51 5, // vBias 68000, // R44 0, // no rGnd 0 // no smoothing cap }; static const discrete_dac_r1_ladder triplhnt_bear_roar_out_dac = { 3, // size of ladder {100000, 33000, 100000}, // R56, R58, R57 0, // no vBias 0, // no rBias 0, // no rGnd 0 // no smoothing cap }; static const discrete_dac_r1_ladder triplhnt_shot_dac = { 4, // size of ladder {8200, 3900, 2200, 1000}, // R53, R54, R55, R52 0, // no vBias 0, // no rBias 0, // no rGnd 0 // no smoothing cap }; 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, 0.7 // Q2 junction voltage }; static const discrete_schmitt_osc_desc triplhnt_screech_osc = { 2200, // R84 330, // R85 1.e-6, // C59 DEFAULT_7414_VALUES, 1 // invert output using 7400 gate E7 }; static const discrete_mixer_desc triplhnt_mixer = { DISC_MIXER_IS_RESISTOR, {3300 + 19879.5, 47000, 27000 + 545.6}, // R59 + (R56||R57||R58), R60 + (R52||R53||R54||R55), R61 {0}, // No variable resistor nodes {0}, // No caps 0, // No rI 1000, // R78 1e-7, // C72 1e-7, // C44 0, // vBias not used for resistor network 245000 }; /* Nodes - Sounds */ #define TRIPLHNT_NOISE NODE_10 #define TRIPLHNT_BEAR_ROAR_SND NODE_11 #define TRIPLHNT_SHOT_SND NODE_12 #define TRIPLHNT_SCREECH_SND NODE_13 #define POOLSHRK_SCORE_SND NODE_14 DISCRETE_SOUND_START(triplhnt_discrete) /************************************************/ /* Input register mapping for triplhnt */ /************************************************/ /* NODE GAIN OFFSET INIT */ DISCRETE_INPUTX_DATA(TRIPLHNT_BEAR_ROAR_DATA, -1, 0x0f, 0) DISCRETE_INPUT_NOT (TRIPLHNT_BEAR_EN) DISCRETE_INPUT_DATA (TRIPLHNT_SHOT_DATA) DISCRETE_INPUT_LOGIC(TRIPLHNT_SCREECH_EN) DISCRETE_INPUT_NOT (TRIPLHNT_LAMP_EN) /************************************************/ DISCRETE_LFSR_NOISE(TRIPLHNT_NOISE, // Output A7 pin 13 TRIPLHNT_LAMP_EN, TRIPLHNT_LAMP_EN, // From gate A8 pin 10 12096000.0/2/256, // 256H signal DEFAULT_TTL_V_LOGIC_1, 0, DEFAULT_TTL_V_LOGIC_1/2, &triplhnt_lfsr) /************************************************/ /* Bear Roar is a VCO with noise mixed in. */ /************************************************/ DISCRETE_ADJUSTMENT(NODE_20, 10000, // R86 + R88 @ 0 260000, // R86 + R88 @ max DISC_LOGADJ, "BEAR") DISCRETE_DAC_R1(NODE_21, // base of Q2 TRIPLHNT_BEAR_ROAR_DATA, // IC B10, Q0-Q3 DEFAULT_TTL_V_LOGIC_1, // TTL ON level &triplhnt_bear_roar_v_dac) DISCRETE_555_CC(NODE_22, 1, // IC C11 pin 3, always enabled NODE_21, // vIn NODE_20, // current adjust 1.e-8, // C58 0, 390000, 0, // no rBias, R87, no rDis &triplhnt_bear_roar_vco) DISCRETE_COUNTER(NODE_23, 1, TRIPLHNT_BEAR_EN, // IC B6, QB-QD NODE_22, // from IC C11, pin 3 0, 5, 1, 0, DISC_CLK_ON_R_EDGE) // /6 counter on rising edge DISCRETE_TRANSFORM2(NODE_24, NODE_23, 2, "01>") // IC B6, pin 8 DISCRETE_LOGIC_INVERT(NODE_25, NODE_22) // IC D9, pin 3 DISCRETE_LOGIC_NAND(NODE_26, NODE_25, TRIPLHNT_NOISE) // IC D9, pin 11 DISCRETE_LOGIC_XOR(NODE_27, NODE_24, NODE_26) // IC B8, pin 6 DISCRETE_COUNTER(NODE_28, 1, TRIPLHNT_BEAR_EN, // IC B6, pin 12 NODE_27, // from IC B8, pin 6 0, 1, 1, 0, DISC_CLK_ON_R_EDGE) // /2 counter on rising edge DISCRETE_TRANSFORM5(NODE_29, NODE_24, NODE_28, NODE_26, 2, 4, "13*24*+0+") // Mix the mess together in binary DISCRETE_DAC_R1(TRIPLHNT_BEAR_ROAR_SND, NODE_29, DEFAULT_TTL_V_LOGIC_1, &triplhnt_bear_roar_out_dac) /************************************************/ /* Shot is just the noise amplitude modulated */ /* by an R1 DAC. */ /************************************************/ DISCRETE_SWITCH(NODE_40, 1, // Gate A9, pins 6, 8, 11, 3 TRIPLHNT_NOISE, // noise enables the data which is then inverted 1, TRIPLHNT_SHOT_DATA) DISCRETE_DAC_R1(TRIPLHNT_SHOT_SND, NODE_40, DEFAULT_TTL_V_LOGIC_1, &triplhnt_shot_dac) /************************************************/ /* Screech is just the noise modulating a */ /* Schmitt VCO. */ /************************************************/ DISCRETE_SCHMITT_OSCILLATOR(TRIPLHNT_SCREECH_SND, TRIPLHNT_SCREECH_EN, TRIPLHNT_NOISE, 3.4, &triplhnt_screech_osc) /************************************************/ /* Final mix and output. */ /************************************************/ DISCRETE_MIXER3(NODE_90, 1, TRIPLHNT_BEAR_ROAR_SND, TRIPLHNT_SHOT_SND, TRIPLHNT_SCREECH_SND, &triplhnt_mixer) DISCRETE_OUTPUT(NODE_90, 1) DISCRETE_SOUND_END