// license:BSD-3-Clause // copyright-holders:Derrick Renaud /*************************************************************************** galaga.c Sound handler ****************************************************************************/ #include "emu.h" #include "namco52.h" #include "namco54.h" #include "includes/galaga.h" /************************************* * * Bosconian * * Discrete sound emulation: Feb 2007, D.R. * *************************************/ /* nodes - sounds */ #define BOSCO_CHANL1_SND NODE_11 #define BOSCO_CHANL2_SND NODE_12 #define BOSCO_CHANL3_SND NODE_13 #define BOSCO_CHANL4_SND NODE_14 #define BOSCO_54XX_DAC_R (1.0 / (1.0 / RES_K(47) + 1.0 / RES_K(22) + 1.0 / RES_K(10) + 1.0 / RES_K(4.7))) static const discrete_dac_r1_ladder bosco_54xx_dac = { 4, /* number of DAC bits */ /* 54XX_0 54XX_1 54XX_2 */ { RES_K(47), /* R28, R32, R46 */ RES_K(22), /* R27, R31, R45 */ RES_K(10), /* R26, R30, R44 */ RES_K(4.7)}, /* R25, R29, R43 */ 0, 0, 0, 0 /* nothing extra */ }; #define BOSCO_52XX_DAC_R (1.0 / (1.0 / RES_K(100) + 1.0 / RES_K(47) + 1.0 / RES_K(22) + 1.0 / RES_K(10))) static const discrete_dac_r1_ladder bosco_52xx_dac = { 4, /* number of DAC bits */ { RES_K(100), /* R14 */ RES_K(47), /* R13 */ RES_K(22), /* R12 */ RES_K(10)}, /* R11 */ 0, 0, 0, 0 /* nothing extra */ }; /* R39 R38 R39 */ #define BOSCO_VREF (5.0 * (RES_K(2.2) / (RES_K(3.3) + RES_K(2.2)))) static const discrete_op_amp_filt_info bosco_chanl1_filt = { BOSCO_54XX_DAC_R + RES_K(100), /* R24 */ 0, /* no second input */ RES_K(22), /* R23 */ 0, /* not used */ RES_K(220), /* R22 */ CAP_U(0.001), /* C31 */ CAP_U(0.001), /* C30 */ 0, /* not used */ BOSCO_VREF, /* vRef */ 5, /* vP */ 0 /* vN */ }; static const discrete_op_amp_filt_info bosco_chanl2_filt = { BOSCO_54XX_DAC_R + RES_K(47), /* R33 */ 0, /* no second input */ RES_K(10), /* R34 */ 0, /* not used */ RES_K(150), /* R35 */ CAP_U(0.01), /* C29 */ CAP_U(0.01), /* C28 */ 0, /* not used */ BOSCO_VREF, /* vRef */ 5, /* vP */ 0 /* vN */ }; static const discrete_op_amp_filt_info bosco_chanl3_filt = { BOSCO_54XX_DAC_R + RES_K(150), /* R42 */ 0, /* no second input */ RES_K(22), /* R41 */ 0, /* not used */ RES_K(470), /* R40 */ CAP_U(0.01), /* C27 */ CAP_U(0.01), /* C26 */ 0, /* not used */ BOSCO_VREF, /* vRef */ 5, /* vP */ 0 /* vN */ }; static const discrete_mixer_desc bosco_filter_mixer = { DISC_MIXER_IS_OP_AMP, { RES_K(33), /* R21 */ RES_K(33), /* R36 */ RES_K(10)}, /* R37 */ {0}, /* no rNode{} */ {0}, /* no c{} */ 0, /* no rI */ RES_K(3.3), /* R20 */ 0, /* no cF */ 0, /* no cAmp */ BOSCO_VREF, /* vRef */ 1, /* gain */ }; static const discrete_mixer_desc bosco_final_mixer = { DISC_MIXER_IS_RESISTOR, { RES_K(10), /* R51 */ RES_K(10)}, /* R55 */ {0}, /* no rNode{} */ {0}, /* no c{} */ 0, /* no rI */ RES_K(1), /* VR1 */ 0, /* no cF */ CAP_U(0.1), /* C18 */ 0, /* vRef */ 462000 /* gain */ }; DISCRETE_SOUND_START(bosco_discrete) /************************************************ * Input register mapping ************************************************/ DISCRETE_INPUT_DATA(NAMCO_54XX_0_DATA(NODE_01)) DISCRETE_INPUT_DATA(NAMCO_54XX_1_DATA(NODE_01)) DISCRETE_INPUT_DATA(NAMCO_54XX_2_DATA(NODE_01)) DISCRETE_INPUT_DATA(NAMCO_52XX_P_DATA(NODE_04)) /************************************************ * CHANL1 sound ************************************************/ DISCRETE_DAC_R1(NODE_20, NAMCO_54XX_2_DATA(NODE_01), 4, /* 4V - unmeasured*/ &bosco_54xx_dac) DISCRETE_OP_AMP_FILTER(BOSCO_CHANL1_SND, 1, /* ENAB */ NODE_20, /* INP0 */ 0, /* INP1 - not used */ DISC_OP_AMP_FILTER_IS_BAND_PASS_1M, &bosco_chanl1_filt) /************************************************ * CHANL2 sound ************************************************/ DISCRETE_DAC_R1(NODE_30, NAMCO_54XX_1_DATA(NODE_01), 4, /* 4V - unmeasured*/ &bosco_54xx_dac) DISCRETE_OP_AMP_FILTER(BOSCO_CHANL2_SND, 1, /* ENAB */ NODE_30, /* INP0 */ 0, /* INP1 - not used */ DISC_OP_AMP_FILTER_IS_BAND_PASS_1M, &bosco_chanl2_filt) /************************************************ * CHANL3 sound ************************************************/ DISCRETE_DAC_R1(NODE_40, NAMCO_54XX_0_DATA(NODE_01), 4, /* 4V - unmeasured*/ &bosco_54xx_dac) DISCRETE_OP_AMP_FILTER(BOSCO_CHANL3_SND, 1, /* ENAB */ NODE_40, /* INP0 */ 0, /* INP1 - not used */ DISC_OP_AMP_FILTER_IS_BAND_PASS_1M, &bosco_chanl3_filt) /************************************************ * CHANL4 sound ************************************************/ /* this circuit was simulated in SPICE and an equivalent filter circuit generated */ DISCRETE_DAC_R1(NODE_50, NAMCO_52XX_P_DATA(NODE_04), 4, /* 4V - unmeasured*/ &bosco_52xx_dac) DISCRETE_FILTER2(NODE_51, 1, /* ENAB */ NODE_50, /* INP0 */ 80, /* FREQ */ 1.0 / 0.3, /* DAMP */ DISC_FILTER_HIGHPASS) DISCRETE_FILTER2(NODE_52, 1, /* ENAB */ NODE_51, /* INP0 */ 2400, /* FREQ */ 1.0 / 0.9, /* DAMP */ DISC_FILTER_LOWPASS) DISCRETE_GAIN(BOSCO_CHANL4_SND, NODE_52, /* IN0 */ 0.25 /* overall filter GAIN */) /************************************************ * Output ************************************************/ DISCRETE_MIXER3(NODE_90, 1, /* ENAB */ BOSCO_CHANL1_SND, /* IN0 */ BOSCO_CHANL2_SND, /* IN1 */ BOSCO_CHANL3_SND, /* IN2 */ &bosco_filter_mixer /* INFO */) DISCRETE_MIXER2(NODE_91, 1, /* ENAB */ NODE_90, /* IN0 */ BOSCO_CHANL4_SND, /* IN1 */ &bosco_final_mixer /* INFO */) DISCRETE_OUTPUT(NODE_91, 1) DISCRETE_SOUND_END /************************************* * * Galaga/Xevious * * Discrete sound emulation: Feb 2007, D.R. * *************************************/ /* nodes - sounds */ #define GALAGA_CHANL1_SND NODE_11 #define GALAGA_CHANL2_SND NODE_12 #define GALAGA_CHANL3_SND NODE_13 #define GALAGA_54XX_DAC_R (1.0 / (1.0 / RES_K(47) + 1.0 / RES_K(22) + 1.0 / RES_K(10) + 1.0 / RES_K(4.7))) static const discrete_dac_r1_ladder galaga_54xx_dac = { 4, /* number of DAC bits */ { RES_K(47), RES_K(22), RES_K(10), RES_K(4.7)}, 0, 0, 0, 0 /* nothing extra */ }; #define GALAGA_VREF (5.0 * (RES_K(2.2) / (RES_K(3.3) + RES_K(2.2)))) static const discrete_op_amp_filt_info galaga_chanl1_filt = { GALAGA_54XX_DAC_R + RES_K(100), 0, /* no second input */ RES_K(22), 0, /* not used */ RES_K(220), CAP_U(0.001), CAP_U(0.001), 0, /* not used */ GALAGA_VREF, /* vRef */ 5, /* vP */ 0, /* vN */ }; static const discrete_op_amp_filt_info galaga_chanl2_filt = { GALAGA_54XX_DAC_R + RES_K(47), 0, /* no second input */ RES_K(10), 0, /* not used */ RES_K(150), CAP_U(0.01), CAP_U(0.01), 0, /* not used */ GALAGA_VREF, /* vRef */ 5, /* vP */ 0, /* vN */ }; static const discrete_op_amp_filt_info galaga_chanl3_filt = { GALAGA_54XX_DAC_R + RES_K(150), 0, /* no second input */ RES_K(22), 0, /* not used */ RES_K(470), CAP_U(0.01), CAP_U(0.01), 0, /* not used */ GALAGA_VREF, /* vRef */ 5, /* vP */ 0, /* vN */ }; static const discrete_mixer_desc galaga_final_mixer = { DISC_MIXER_IS_OP_AMP, { RES_K(33), RES_K(33), RES_K(10)}, {0}, /* no rNode{} */ {0}, /* no c{} */ 0, /* no rI */ RES_K(3.3), 0, /* no cF */ CAP_U(0.1), GALAGA_VREF, /* vRef */ 40800, /* gain */ }; DISCRETE_SOUND_START(galaga_discrete) /************************************************ * Input register mapping ************************************************/ DISCRETE_INPUT_DATA(NAMCO_54XX_0_DATA(NODE_01)) DISCRETE_INPUT_DATA(NAMCO_54XX_1_DATA(NODE_01)) DISCRETE_INPUT_DATA(NAMCO_54XX_2_DATA(NODE_01)) /************************************************ * CHANL1 sound ************************************************/ DISCRETE_DAC_R1(NODE_20, NAMCO_54XX_2_DATA(NODE_01), 4, /* 4V - unmeasured*/ &galaga_54xx_dac) DISCRETE_OP_AMP_FILTER(GALAGA_CHANL1_SND, 1, /* ENAB */ NODE_20, /* INP0 */ 0, /* INP1 - not used */ DISC_OP_AMP_FILTER_IS_BAND_PASS_1M, &galaga_chanl1_filt) /************************************************ * CHANL2 sound ************************************************/ DISCRETE_DAC_R1(NODE_30, NAMCO_54XX_1_DATA(NODE_01), 4, /* 4V - unmeasured*/ &galaga_54xx_dac) DISCRETE_OP_AMP_FILTER(GALAGA_CHANL2_SND, 1, /* ENAB */ NODE_30, /* INP0 */ 0, /* INP1 - not used */ DISC_OP_AMP_FILTER_IS_BAND_PASS_1M, &galaga_chanl2_filt) /************************************************ * CHANL3 sound ************************************************/ DISCRETE_DAC_R1(NODE_40, NAMCO_54XX_0_DATA(NODE_01), 4, /* 4V - unmeasured*/ &galaga_54xx_dac) DISCRETE_OP_AMP_FILTER(GALAGA_CHANL3_SND, 1, /* ENAB */ NODE_40, /* INP0 */ 0, /* INP1 - not used */ DISC_OP_AMP_FILTER_IS_BAND_PASS_1M, &galaga_chanl3_filt) /************************************************ * Output ************************************************/ DISCRETE_MIXER3(NODE_90, 1, /* ENAB */ GALAGA_CHANL1_SND, /* IN0 */ GALAGA_CHANL2_SND, /* IN1 */ GALAGA_CHANL3_SND, /* IN2 */ &galaga_final_mixer /* INFO */) DISCRETE_OUTPUT(NODE_90, 1) DISCRETE_SOUND_END