diff options
Diffstat (limited to 'trunk/src/mame/audio/galaga.c')
-rw-r--r-- | trunk/src/mame/audio/galaga.c | 366 |
1 files changed, 366 insertions, 0 deletions
diff --git a/trunk/src/mame/audio/galaga.c b/trunk/src/mame/audio/galaga.c new file mode 100644 index 00000000000..0293e2f56f5 --- /dev/null +++ b/trunk/src/mame/audio/galaga.c @@ -0,0 +1,366 @@ +/*************************************************************************** + 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) + + /************************************************ + * 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) + + /************************************************ + * 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 |