dogpatch - added shot sounds [Derrick Renaud, iritis]

This commit is contained in:
Derrick Renaud 2011-09-11 22:48:54 +00:00
parent d57eb095b5
commit b3239b944a
3 changed files with 150 additions and 36 deletions

View File

@ -2580,52 +2580,167 @@ WRITE8_DEVICE_HANDLER( shuffle_audio_2_w )
*
* Dog Patch
*
* We don't have the schematics, so this is all questionable.
* This game is most likely stereo as well.
* Discrete sound emulation:
* Sept 2011, D.R.
*
*************************************/
/* nodes - inputs */
#define DOGPATCH_GAME_ON_EN NODE_01
#define DOGPATCH_LEFT_SHOT_EN NODE_02
#define DOGPATCH_RIGHT_SHOT_EN NODE_03
#define DOGPATCH_HIT_EN NODE_04
#define DOGPATCH_PAN_DATA NODE_05
/* nodes - sounds */
#define DOGPATCH_NOISE NODE_06
#define DOGPATCH_L_SHOT_SND NODE_07
#define DOGPATCH_R_SHOT_SND NODE_08
#define DOGPATCH_HIT_SND NODE_09
#define DOGPATCH_L_HIT_SND NODE_10
#define DOGPATCH_R_HIT_SND NODE_11
static const discrete_op_amp_tvca_info dogpatch_shot_tvca_info =
{
RES_M(2.7),
RES_K(510),
0,
RES_K(510),
RES_K(10),
0,
RES_K(510),
0,
0,
0,
0,
CAP_U(0.22),
0,
0, 0,
12,
0,
0,
12,
DISC_OP_AMP_TRIGGER_FUNCTION_NONE,
DISC_OP_AMP_TRIGGER_FUNCTION_NONE,
DISC_OP_AMP_TRIGGER_FUNCTION_TRG0,
DISC_OP_AMP_TRIGGER_FUNCTION_NONE,
DISC_OP_AMP_TRIGGER_FUNCTION_NONE,
DISC_OP_AMP_TRIGGER_FUNCTION_NONE
};
static const discrete_mixer_desc dogpatch_l_mixer =
{
DISC_MIXER_IS_OP_AMP,
{ RES_K(12) + RES_K(68) + RES_K(33),
RES_K(33) },
{ 0 },
{ 0 },
0,
RES_K(100),
0,
CAP_U(0.1),
0,
1 /* final gain */
};
static const discrete_mixer_desc dogpatch_r_mixer =
{
DISC_MIXER_IS_OP_AMP,
{ RES_K(12) + RES_K(68) + RES_K(33),
RES_K(33),
RES_K(510) + RES_K(33) },
{ 0 },
{ 0 },
0,
RES_K(100),
0,
CAP_U(0.1),
0,
1 /* final gain */
};
static DISCRETE_SOUND_START(dogpatch)
/************************************************
* Input register mapping
************************************************/
DISCRETE_INPUT_LOGIC(DOGPATCH_GAME_ON_EN)
DISCRETE_INPUT_LOGIC(DOGPATCH_LEFT_SHOT_EN)
DISCRETE_INPUT_LOGIC(DOGPATCH_RIGHT_SHOT_EN)
DISCRETE_INPUT_LOGIC(DOGPATCH_HIT_EN)
/************************************************
* Tone generator
************************************************/
MIDWAY_TONE_GENERATOR(midway_music_tvca_info)
/************************************************
* Filter it to be AC.
************************************************/
DISCRETE_CRFILTER(NODE_91, MIDWAY_TONE_SND, RES_K(100), CAP_U(0.1))
/* Noise clock was breadboarded and measured at 7700Hz */
DISCRETE_LFSR_NOISE(DOGPATCH_NOISE, 1, 1, 7700, 12.0, 0, 12.0/2, &midway_lfsr)
DISCRETE_OUTPUT(NODE_91, 5000)
/************************************************
* Shot sounds
************************************************/
DISCRETE_OP_AMP_TRIG_VCA(NODE_20, DOGPATCH_LEFT_SHOT_EN, 0, 0, DOGPATCH_NOISE, 0, &dogpatch_shot_tvca_info)
DISCRETE_RCFILTER(NODE_21, NODE_20, RES_K(12), CAP_U(.01))
DISCRETE_RCFILTER(DOGPATCH_L_SHOT_SND, NODE_21, RES_K(12) + RES_K(68), CAP_U(.0022))
DISCRETE_OP_AMP_TRIG_VCA(NODE_30, DOGPATCH_RIGHT_SHOT_EN, 0, 0, DOGPATCH_NOISE, 0, &dogpatch_shot_tvca_info)
DISCRETE_RCFILTER(NODE_31, NODE_30, RES_K(12), CAP_U(.01))
DISCRETE_RCFILTER(DOGPATCH_R_SHOT_SND, NODE_31, RES_K(12) + RES_K(68), CAP_U(.0033))
/************************************************
* Target hit sounds
************************************************/
DISCRETE_CONSTANT(DOGPATCH_L_HIT_SND, 0)
DISCRETE_CONSTANT(DOGPATCH_R_HIT_SND, 0)
/************************************************
* Combine all sound sources.
************************************************/
/* There is a 1uF cap on the input to the amp that I was too lazy to simulate.
* It is just a DC blocking cap needed by the Norton amp. Doing the extra
* work to simulate it is not going to make a difference to the waveform
* or to how it sounds. Also I use a regular amp in place of the Norton
* for the same reasons. Ease of coding/simulation. */
DISCRETE_MIXER2(NODE_91, DOGPATCH_GAME_ON_EN, DOGPATCH_L_SHOT_SND, DOGPATCH_L_HIT_SND, &dogpatch_l_mixer)
/* Music is only added to the right channel per schematics */
/* This should be verified on the real game */
DISCRETE_MIXER3(NODE_92, DOGPATCH_GAME_ON_EN, DOGPATCH_R_SHOT_SND, DOGPATCH_R_HIT_SND, MIDWAY_TONE_SND, &dogpatch_r_mixer)
DISCRETE_OUTPUT(NODE_91, 32760.0 / 5.8)
DISCRETE_OUTPUT(NODE_92, 32760.0 / 5.8)
DISCRETE_SOUND_END
MACHINE_CONFIG_FRAGMENT( dogpatch_audio )
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SPEAKER_STANDARD_STEREO("lspeaker", "rspeaker")
MCFG_SOUND_ADD("discrete", DISCRETE, 0)
MCFG_SOUND_CONFIG_DISCRETE(dogpatch)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.3)
MCFG_SOUND_ROUTE(0, "lspeaker", 1.0)
MCFG_SOUND_ROUTE(1, "rspeaker", 1.0)
MACHINE_CONFIG_END
WRITE8_HANDLER( dogpatch_audio_w )
WRITE8_DEVICE_HANDLER( dogpatch_audio_w )
{
/* D0 and D1 are most likely not used */
/* D0, D1 and D7 are not used */
coin_counter_w(space->machine(), 0, (data >> 2) & 0x01);
coin_counter_w(device->machine(), 0, (data >> 2) & 0x01);
space->machine().sound().system_enable((data >> 3) & 0x01);
device->machine().sound().system_enable((data >> 3) & 0x01);
discrete_sound_w(device, DOGPATCH_GAME_ON_EN, (data >> 3) & 0x01);
/* if (data & 0x10) enable LEFT SHOOT sound */
discrete_sound_w(device, DOGPATCH_LEFT_SHOT_EN, (data >> 4) & 0x01);
/* if (data & 0x20) enable RIGHT SHOOT sound */
discrete_sound_w(device, DOGPATCH_RIGHT_SHOT_EN, (data >> 5) & 0x01);
/* if (data & 0x40) enable CAN HIT sound */
/* D7 is most likely not used */
discrete_sound_w(device, DOGPATCH_HIT_EN, (data >> 6) & 0x01);
}

View File

@ -1292,7 +1292,7 @@ static MACHINE_CONFIG_DERIVED( desertgu, mw8080bw_root )
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_IO_MAP(desertgu_io_map)
MCFG_MACHINE_START(desertgu)
MCFG_WATCHDOG_TIME_INIT(attotime::from_usec(255000000 / (MW8080BW_PIXEL_CLOCK / MW8080BW_HTOTAL / MW8080BW_VTOTAL)))
MCFG_WATCHDOG_TIME_INIT(attotime::from_hz(MW8080BW_60HZ/255))
/* add shifter */
MCFG_MB14241_ADD("mb14241")
@ -1491,7 +1491,7 @@ static MACHINE_CONFIG_DERIVED( dplay, mw8080bw_root )
/* basic machine hardware */
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_IO_MAP(dplay_io_map)
MCFG_WATCHDOG_TIME_INIT(attotime::from_usec(255000000 / (MW8080BW_PIXEL_CLOCK / MW8080BW_HTOTAL / MW8080BW_VTOTAL)))
MCFG_WATCHDOG_TIME_INIT(attotime::from_hz(MW8080BW_60HZ/255))
/* add shifter */
MCFG_MB14241_ADD("mb14241")
@ -1681,7 +1681,7 @@ static MACHINE_CONFIG_DERIVED( m4, mw8080bw_root )
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_IO_MAP(m4_io_map)
MCFG_MACHINE_START(m4)
MCFG_WATCHDOG_TIME_INIT(attotime::from_usec(255000000 / (MW8080BW_PIXEL_CLOCK / MW8080BW_HTOTAL / MW8080BW_VTOTAL)))
MCFG_WATCHDOG_TIME_INIT(attotime::from_hz(MW8080BW_60HZ/255))
/* add shifter */
MCFG_MB14241_ADD("mb14241")
@ -1851,7 +1851,7 @@ static MACHINE_CONFIG_DERIVED( clowns, mw8080bw_root )
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_IO_MAP(clowns_io_map)
MCFG_MACHINE_START(clowns)
MCFG_WATCHDOG_TIME_INIT(attotime::from_usec(255000000 / (MW8080BW_PIXEL_CLOCK / MW8080BW_HTOTAL / MW8080BW_VTOTAL)))
MCFG_WATCHDOG_TIME_INIT(attotime::from_hz(MW8080BW_60HZ/255))
/* add shifter */
MCFG_MB14241_ADD("mb14241")
@ -1945,7 +1945,7 @@ static MACHINE_CONFIG_DERIVED( spacwalk, mw8080bw_root )
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_IO_MAP(spacwalk_io_map)
MCFG_MACHINE_START(clowns)
MCFG_WATCHDOG_TIME_INIT(attotime::from_usec(255000000 / (MW8080BW_PIXEL_CLOCK / MW8080BW_HTOTAL / MW8080BW_VTOTAL)))
MCFG_WATCHDOG_TIME_INIT(attotime::from_hz(MW8080BW_60HZ/255))
/* add shifter */
MCFG_MB14241_ADD("mb14241")
@ -2025,7 +2025,7 @@ static MACHINE_CONFIG_DERIVED( shuffle, mw8080bw_root )
/* basic machine hardware */
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_IO_MAP(shuffle_io_map)
MCFG_WATCHDOG_TIME_INIT(attotime::from_usec(255000000 / (MW8080BW_PIXEL_CLOCK / MW8080BW_HTOTAL / MW8080BW_VTOTAL)))
MCFG_WATCHDOG_TIME_INIT(attotime::from_hz(MW8080BW_60HZ/255))
/* add shifter */
MCFG_MB14241_ADD("mb14241")
@ -2052,7 +2052,7 @@ static ADDRESS_MAP_START( dogpatch_io_map, AS_IO, 8 )
AM_RANGE(0x01, 0x01) AM_DEVWRITE("mb14241", mb14241_shift_count_w)
AM_RANGE(0x02, 0x02) AM_DEVWRITE("mb14241", mb14241_shift_data_w)
AM_RANGE(0x03, 0x03) AM_WRITE(dogpatch_audio_w)
AM_RANGE(0x03, 0x03) AM_DEVWRITE("discrete", dogpatch_audio_w)
AM_RANGE(0x04, 0x04) AM_WRITE(watchdog_reset_w)
AM_RANGE(0x05, 0x05) AM_DEVWRITE("discrete", midway_tone_generator_lo_w)
AM_RANGE(0x06, 0x06) AM_DEVWRITE("discrete", midway_tone_generator_hi_w)
@ -2110,9 +2110,7 @@ static MACHINE_CONFIG_DERIVED( dogpatch, mw8080bw_root )
/* basic machine hardware */
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_IO_MAP(dogpatch_io_map)
/* the watch dog time is unknown, but all other */
/* Midway boards of the era used the same circuit */
MCFG_WATCHDOG_TIME_INIT(attotime::from_usec(255000000 / (MW8080BW_PIXEL_CLOCK / MW8080BW_HTOTAL / MW8080BW_VTOTAL)))
MCFG_WATCHDOG_TIME_INIT(attotime::from_hz(MW8080BW_60HZ/255))
/* add shifter */
MCFG_MB14241_ADD("mb14241")
@ -2276,7 +2274,7 @@ static MACHINE_CONFIG_DERIVED( spcenctr, mw8080bw_root )
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_IO_MAP(spcenctr_io_map)
MCFG_MACHINE_START(spcenctr)
MCFG_WATCHDOG_TIME_INIT(attotime::from_usec(255000000 / (MW8080BW_PIXEL_CLOCK / MW8080BW_HTOTAL / MW8080BW_VTOTAL)))
MCFG_WATCHDOG_TIME_INIT(attotime::from_hz(MW8080BW_60HZ/255))
/* timers */
MCFG_TIMER_ADD_PERIODIC("strobeon", spcenctr_strobe_timer_callback, attotime::from_hz(SPCENCTR_STROBE_FREQ))
@ -2372,7 +2370,7 @@ static MACHINE_CONFIG_DERIVED( phantom2, mw8080bw_root )
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_IO_MAP(phantom2_io_map)
MCFG_MACHINE_START(phantom2)
MCFG_WATCHDOG_TIME_INIT(attotime::from_usec(255000000 / (MW8080BW_PIXEL_CLOCK / MW8080BW_HTOTAL / MW8080BW_VTOTAL)))
MCFG_WATCHDOG_TIME_INIT(attotime::from_hz(MW8080BW_60HZ/255))
/* video hardware */
MCFG_SCREEN_MODIFY("screen")
@ -2511,7 +2509,7 @@ static MACHINE_CONFIG_DERIVED( bowler, mw8080bw_root )
/* basic machine hardware */
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_IO_MAP(bowler_io_map)
MCFG_WATCHDOG_TIME_INIT(attotime::from_usec(255000000 / (MW8080BW_PIXEL_CLOCK / MW8080BW_HTOTAL / MW8080BW_VTOTAL)))
MCFG_WATCHDOG_TIME_INIT(attotime::from_hz(MW8080BW_60HZ/255))
/* add shifter */
MCFG_MB14241_ADD("mb14241")
@ -2728,7 +2726,7 @@ MACHINE_CONFIG_DERIVED( invaders, mw8080bw_root )
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_IO_MAP(invaders_io_map)
MCFG_MACHINE_START(invaders)
MCFG_WATCHDOG_TIME_INIT(attotime::from_usec(255000000 / (MW8080BW_PIXEL_CLOCK / MW8080BW_HTOTAL / MW8080BW_VTOTAL)))
MCFG_WATCHDOG_TIME_INIT(attotime::from_hz(MW8080BW_60HZ/255))
/* video hardware */
MCFG_SCREEN_MODIFY("screen")
@ -2810,7 +2808,7 @@ static MACHINE_CONFIG_DERIVED( blueshrk, mw8080bw_root )
/* basic machine hardware */
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_IO_MAP(blueshrk_io_map)
MCFG_WATCHDOG_TIME_INIT(attotime::from_usec(255000000 / (MW8080BW_PIXEL_CLOCK / MW8080BW_HTOTAL / MW8080BW_VTOTAL)))
MCFG_WATCHDOG_TIME_INIT(attotime::from_hz(MW8080BW_60HZ/255))
/* add shifter */
MCFG_MB14241_ADD("mb14241")
@ -2910,7 +2908,7 @@ static MACHINE_CONFIG_DERIVED( invad2ct, mw8080bw_root )
/* basic machine hardware */
MCFG_CPU_MODIFY("maincpu")
MCFG_CPU_IO_MAP(invad2ct_io_map)
MCFG_WATCHDOG_TIME_INIT(attotime::from_usec(255000000 / (MW8080BW_PIXEL_CLOCK / MW8080BW_HTOTAL / MW8080BW_VTOTAL)))
MCFG_WATCHDOG_TIME_INIT(attotime::from_hz(MW8080BW_60HZ/255))
/* add shifter */
MCFG_MB14241_ADD("mb14241")

View File

@ -9,7 +9,7 @@
#include "sound/samples.h"
#define MW8080BW_MASTER_CLOCK (19968000)
#define MW8080BW_MASTER_CLOCK (19968000.0)
#define MW8080BW_CPU_CLOCK (MW8080BW_MASTER_CLOCK / 10)
#define MW8080BW_PIXEL_CLOCK (MW8080BW_MASTER_CLOCK / 4)
#define MW8080BW_HTOTAL (0x140)
@ -24,6 +24,7 @@
#define MW8080BW_INT_TRIGGER_VBLANK_1 (0)
#define MW8080BW_INT_TRIGGER_COUNT_2 MW8080BW_VCOUNTER_START_VBLANK
#define MW8080BW_INT_TRIGGER_VBLANK_2 (1)
#define MW8080BW_60HZ (MW8080BW_PIXEL_CLOCK / MW8080BW_HTOTAL / MW8080BW_VTOTAL)
/* +4 is added to HBSTART because the hardware displays that many pixels after
setting HBLANK */
@ -189,7 +190,7 @@ WRITE8_DEVICE_HANDLER( shuffle_audio_1_w );
WRITE8_DEVICE_HANDLER( shuffle_audio_2_w );
MACHINE_CONFIG_EXTERN( dogpatch_audio );
WRITE8_HANDLER( dogpatch_audio_w );
WRITE8_DEVICE_HANDLER( dogpatch_audio_w );
MACHINE_CONFIG_EXTERN( spcenctr_audio );
WRITE8_DEVICE_HANDLER( spcenctr_audio_1_w );