Added discrete mixing and filtering to irem games using m52-sound-c boards: mpatrol, travrusa

This commit is contained in:
Couriersud 2008-04-25 23:51:15 +00:00
parent 7590822c23
commit 5ac45d5a80
5 changed files with 132 additions and 18 deletions

View File

@ -10,6 +10,7 @@
#include "cpu/m6800/m6800.h" #include "cpu/m6800/m6800.h"
#include "sound/ay8910.h" #include "sound/ay8910.h"
#include "sound/msm5205.h" #include "sound/msm5205.h"
#include "sound/discrete.h"
static UINT8 port1, port2; static UINT8 port1, port2;
@ -120,10 +121,12 @@ static WRITE8_HANDLER( ay8910_0_portb_w )
{ {
/* bits 2-4 select MSM5205 clock & 3b/4b playback mode */ /* bits 2-4 select MSM5205 clock & 3b/4b playback mode */
MSM5205_playmode_w(0, (data >> 2) & 7); MSM5205_playmode_w(0, (data >> 2) & 7);
if (sndti_exists(SOUND_MSM5205, 1))
MSM5205_playmode_w(1, ((data >> 2) & 4) | 3); /* always in slave mode */ MSM5205_playmode_w(1, ((data >> 2) & 4) | 3); /* always in slave mode */
/* bits 0 and 1 reset the two chips */ /* bits 0 and 1 reset the two chips */
MSM5205_reset_w(0, data & 1); MSM5205_reset_w(0, data & 1);
if (sndti_exists(SOUND_MSM5205, 1))
MSM5205_reset_w(1, data & 2); MSM5205_reset_w(1, data & 2);
} }
@ -153,7 +156,7 @@ static WRITE8_HANDLER( m52_adpcm_w )
{ {
if (offset & 1) if (offset & 1)
MSM5205_data_w(0, data); MSM5205_data_w(0, data);
if (offset & 2) if ((offset & 2) && sndti_exists(SOUND_MSM5205, 1))
MSM5205_data_w(1, data); MSM5205_data_w(1, data);
} }
@ -176,8 +179,11 @@ static void adpcm_int(int data)
cpunum_set_input_line(Machine, 1, INPUT_LINE_NMI, PULSE_LINE); cpunum_set_input_line(Machine, 1, INPUT_LINE_NMI, PULSE_LINE);
/* the first MSM5205 clocks the second */ /* the first MSM5205 clocks the second */
if (sndti_exists(SOUND_MSM5205, 1))
{
MSM5205_vclk_w(1,1); MSM5205_vclk_w(1,1);
MSM5205_vclk_w(1,0); MSM5205_vclk_w(1,0);
}
} }
@ -188,10 +194,14 @@ static void adpcm_int(int data)
* *
*************************************/ *************************************/
/* All 6 (3*2) AY-3-8910 outputs are tied together
* and put with 470 KOhm to gnd.
* The following is a approximation */
static const struct AY8910interface irem_ay8910_interface_1 = static const struct AY8910interface irem_ay8910_interface_1 =
{ {
AY8910_LEGACY_OUTPUT, AY8910_SINGLE_OUTPUT,
AY8910_DEFAULT_LOADS, {470, 0, 0},
soundlatch_r, soundlatch_r,
NULL, NULL,
NULL, NULL,
@ -200,8 +210,8 @@ static const struct AY8910interface irem_ay8910_interface_1 =
static const struct AY8910interface irem_ay8910_interface_2 = static const struct AY8910interface irem_ay8910_interface_2 =
{ {
AY8910_LEGACY_OUTPUT, AY8910_SINGLE_OUTPUT,
AY8910_DEFAULT_LOADS, {470, 0, 0},
NULL, NULL,
NULL, NULL,
ay8910_1_porta_w, ay8910_1_porta_w,
@ -220,7 +230,91 @@ static const struct MSM5205interface irem_msm5205_interface_2 =
MSM5205_SEX_4B /* default to 4KHz, but can be changed at run time, slave */ MSM5205_SEX_4B /* default to 4KHz, but can be changed at run time, slave */
}; };
/*
* http://newsgroups.derkeiler.com/Archive/Rec/rec.games.video.arcade.collecting/2006-06/msg03108.html
*
* mentions, that moon patrol does work on moon ranger hardware.
* There is no MSM5250, but a 74LS00 producing white noise for explosions
*/
/* Certain values are different from schematics
* I did my test to verify against pcb pictures of "tropical angel"
*/
#define M52_R12 RES_K(10)
#define M52_R13 RES_K(10)
#define M52_R14 RES_K(10)
#define M52_R15 RES_K(2.2) /* schematics RES_K(22) */
#define M52_R19 RES_K(10)
#define M52_R22 RES_K(4.7) /* schematics RES_K(47) */
#define M52_R23 RES_K(2.2)
#define M52_R25 RES_K(10)
#define M52_VR1 RES_K(50)
#define M52_C30 CAP_U(0.022)
#define M52_C32 CAP_U(0.022)
#define M52_C35 CAP_U(47)
#define M52_C37 CAP_U(0.1)
#define M52_C38 CAP_U(0.0068)
/*
* C35 is disabled, the mixer would just deliver
* no signals if it is enabled.
* TODO: Check discrete mixer
*
*/
static const discrete_mixer_desc m52_sound_c_stage1 =
{DISC_MIXER_IS_RESISTOR,
{M52_R19, M52_R22 },
{ 0, 0 }, /* variable resistors */
{M52_C37, 0 }, /* node capacitors */
0, M52_R23, /* rI, rF */
M52_C35*0, /* cF */
0, /* cAmp */
0, 1};
static const discrete_op_amp_filt_info m52_sound_c_sallen_key =
{ M52_R13, M52_R14, 0, 0, 0,
M52_C32, M52_C38, 0
};
static const discrete_mixer_desc m52_sound_c_mix1 =
{DISC_MIXER_IS_RESISTOR,
{M52_R25, M52_R15 },
{ 0, 0 }, /* variable resistors */
{ 0, 0 }, /* node capacitors */
0, M52_VR1, /* rI, rF */
0, /* cF */
CAP_U(1), /* cAmp */
0, 1};
static DISCRETE_SOUND_START( m52_sound_c )
/* Chip AY8910/1 */
DISCRETE_INPUTX_STREAM(NODE_01, 0, 1.0, 0)
/* Chip AY8910/2 */
DISCRETE_INPUTX_STREAM(NODE_02, 1, 1.0, 0)
/* Chip MSM5250 */
DISCRETE_INPUTX_STREAM(NODE_03, 2, 1.0, 0)
/* Just mix the two AY8910s */
DISCRETE_ADDER2(NODE_09, 1, NODE_01, NODE_02)
DISCRETE_DIVIDE(NODE_10, 1, NODE_09, 2.0)
/* Mix in 5 V to MSM5250 signal */
DISCRETE_MIXER2(NODE_20, 1, NODE_03, 32767.0, &m52_sound_c_stage1)
/* Sallen - Key Filter */
/* TODO: R12, C30: This looks like a band pass */
DISCRETE_SALLEN_KEY_FILTER(NODE_30, 1, NODE_20, DISC_SALLEN_KEY_LOW_PASS, &m52_sound_c_sallen_key)
/* Mix signals */
DISCRETE_MIXER2(NODE_40, 1, NODE_10, NODE_30, &m52_sound_c_mix1)
DISCRETE_OUTPUT(NODE_40, 18.0)
DISCRETE_SOUND_END
/************************************* /*************************************
* *
@ -293,15 +387,35 @@ static MACHINE_DRIVER_START( irem_audio_base )
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80) MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 0.80)
MACHINE_DRIVER_END MACHINE_DRIVER_END
MACHINE_DRIVER_START( m52_sound_c_audio )
MACHINE_DRIVER_START( m52_small_audio ) MDRV_SOUND_START(irem_audio)
MDRV_IMPORT_FROM(irem_audio_base)
/* basic machine hardware */ /* basic machine hardware */
MDRV_CPU_MODIFY("iremsound") MDRV_CPU_ADD_TAG("iremsound", M6803, XTAL_3_579545MHz) /* verified on pcb */
MDRV_CPU_IO_MAP(irem_sound_portmap,0)
MDRV_CPU_PROGRAM_MAP(m52_small_sound_map,0) MDRV_CPU_PROGRAM_MAP(m52_small_sound_map,0)
MACHINE_DRIVER_END
/* sound hardware */
MDRV_SPEAKER_STANDARD_MONO("mono")
MDRV_SOUND_ADD_TAG("ay8910.0", AY8910, XTAL_3_579545MHz/4) /* verified on pcb */
MDRV_SOUND_CONFIG(irem_ay8910_interface_1)
MDRV_SOUND_ROUTE_EX(0, "filtermix", 1.0, 0)
MDRV_SOUND_ADD_TAG("ay8910.0", AY8910, XTAL_3_579545MHz/4) /* verified on pcb */
MDRV_SOUND_CONFIG(irem_ay8910_interface_2)
MDRV_SOUND_ROUTE_EX(0, "filtermix", 1.0, 1)
MDRV_SOUND_ADD_TAG("msm5250", MSM5205, XTAL_384kHz) /* verified on pcb */
MDRV_SOUND_CONFIG(irem_msm5205_interface_1)
MDRV_SOUND_ROUTE_EX(0, "filtermix", 1.0, 2)
MDRV_SOUND_ADD_TAG("filtermix", DISCRETE, 0)
MDRV_SOUND_CONFIG_DISCRETE(m52_sound_c)
MDRV_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.0)
MACHINE_DRIVER_END
MACHINE_DRIVER_START( m52_large_audio ) /* 10 yard fight */ MACHINE_DRIVER_START( m52_large_audio ) /* 10 yard fight */
MDRV_IMPORT_FROM(irem_audio_base) MDRV_IMPORT_FROM(irem_audio_base)

View File

@ -4,7 +4,7 @@
****************************************************************************/ ****************************************************************************/
MACHINE_DRIVER_EXTERN( m52_small_audio ); MACHINE_DRIVER_EXTERN( m52_sound_c_audio );
MACHINE_DRIVER_EXTERN( m52_large_audio ); MACHINE_DRIVER_EXTERN( m52_large_audio );
MACHINE_DRIVER_EXTERN( m62_audio ); MACHINE_DRIVER_EXTERN( m62_audio );

View File

@ -401,7 +401,7 @@ static MACHINE_DRIVER_START( m52 )
MDRV_VIDEO_UPDATE(m52) MDRV_VIDEO_UPDATE(m52)
/* sound hardware */ /* sound hardware */
MDRV_IMPORT_FROM(m52_small_audio) MDRV_IMPORT_FROM(m52_sound_c_audio)
MACHINE_DRIVER_END MACHINE_DRIVER_END

View File

@ -244,7 +244,7 @@ static MACHINE_DRIVER_START( m57 )
MDRV_VIDEO_UPDATE(m57) MDRV_VIDEO_UPDATE(m57)
/* sound hardware */ /* sound hardware */
MDRV_IMPORT_FROM(m52_small_audio) MDRV_IMPORT_FROM(m52_sound_c_audio)
MACHINE_DRIVER_END MACHINE_DRIVER_END

View File

@ -349,7 +349,7 @@ static MACHINE_DRIVER_START( travrusa )
MDRV_VIDEO_UPDATE(travrusa) MDRV_VIDEO_UPDATE(travrusa)
/* sound hardware */ /* sound hardware */
MDRV_IMPORT_FROM(m52_small_audio) MDRV_IMPORT_FROM(m52_sound_c_audio)
MACHINE_DRIVER_END MACHINE_DRIVER_END
static MACHINE_DRIVER_START( shtrider ) static MACHINE_DRIVER_START( shtrider )