mw8080bw.cpp: fix clowns, move desertgu out of giant class, reduce

runtime tag lookups, use blend modes for spcenctr layout (nw)

boothill, dplay, spacwalk and dogpatch are probably broken - I'll fix
them later
This commit is contained in:
Vas Crabb 2019-10-10 13:53:52 +11:00
parent b94b14469e
commit b33785affb
5 changed files with 455 additions and 391 deletions

View File

@ -16,62 +16,6 @@
namespace {
/*************************************
*
* Implementation of tone generator used
* by a few of these games
*
*************************************/
#define MIDWAY_TONE_EN NODE_100
#define MIDWAY_TONE_DATA_L NODE_101
#define MIDWAY_TONE_DATA_H NODE_102
#define MIDWAY_TONE_SND NODE_103
#define MIDWAY_TONE_TRASFORM_OUT NODE_104
#define MIDWAY_TONE_BEFORE_AMP_SND NODE_105
#define MIDWAY_TONE_GENERATOR(discrete_op_amp_tvca_info) \
/* bit 0 of tone data is always 0 */ \
/* join the L & H tone bits */ \
DISCRETE_INPUT_LOGIC(MIDWAY_TONE_EN) \
DISCRETE_INPUT_DATA (MIDWAY_TONE_DATA_L) \
DISCRETE_INPUT_DATA (MIDWAY_TONE_DATA_H) \
DISCRETE_TRANSFORM4(MIDWAY_TONE_TRASFORM_OUT, MIDWAY_TONE_DATA_H, 0x40, MIDWAY_TONE_DATA_L, 0x02, "01*23*+") \
DISCRETE_NOTE(MIDWAY_TONE_BEFORE_AMP_SND, 1, (double)MW8080BW_MASTER_CLOCK/10/2, MIDWAY_TONE_TRASFORM_OUT, 0xfff, 1, DISC_CLK_IS_FREQ) \
DISCRETE_OP_AMP_TRIG_VCA(MIDWAY_TONE_SND, MIDWAY_TONE_BEFORE_AMP_SND, MIDWAY_TONE_EN, 0, 12, 0, &discrete_op_amp_tvca_info)
// most common values based on clowns schematic
discrete_op_amp_tvca_info const midway_music_tvca_info =
{
RES_M(3.3), // r502
RES_K(10) + RES_K(680), // r505 + r506
0,
RES_K(680), // r503
RES_K(10), // r500
0,
RES_K(680), // r501
0,
0,
0,
0,
CAP_U(.001), // c500
0,
0, 0,
12, // v1
0, // v2
0, // v3
12, // vP
DISC_OP_AMP_TRIGGER_FUNCTION_TRG0,
DISC_OP_AMP_TRIGGER_FUNCTION_NONE,
DISC_OP_AMP_TRIGGER_FUNCTION_TRG1,
DISC_OP_AMP_TRIGGER_FUNCTION_NONE,
DISC_OP_AMP_TRIGGER_FUNCTION_NONE,
DISC_OP_AMP_TRIGGER_FUNCTION_NONE
};
/*************************************
*
* Implementation of the common
@ -613,8 +557,9 @@ discrete_mixer_desc const invaders_mixer =
*
*************************************/
DEFINE_DEVICE_TYPE(SEAWOLF_AUDIO, seawolf_audio_device, "seawolf_audio", "Nutting Sea Wolf Audio")
DEFINE_DEVICE_TYPE(GUNFIGHT_AUDIO, gunfight_audio_device, "gunfight_audio", "Nutting Gun Fight Audio")
DEFINE_DEVICE_TYPE(SEAWOLF_AUDIO, seawolf_audio_device, "seawolf_audio", "Midway Sea Wolf Audio")
DEFINE_DEVICE_TYPE(GUNFIGHT_AUDIO, gunfight_audio_device, "gunfight_audio", "Midway Gun Fight Audio")
DEFINE_DEVICE_TYPE(DESERTGU_AUDIO, desertgu_audio_device, "desertgu_audio", "Midway Desert Gun Audio")
DEFINE_DEVICE_TYPE(GMISSILE_AUDIO, gmissile_audio_device, "gmissile_audio", "Midway Guided Missile Audio")
DEFINE_DEVICE_TYPE(M4_AUDIO, m4_audio_device, "m4_audio", "Midway M-4 Audio")
DEFINE_DEVICE_TYPE(CLOWNS_AUDIO, clowns_audio_device, "clowns_audio", "Midway Clowns Audio")
@ -624,6 +569,83 @@ DEFINE_DEVICE_TYPE(INVADERS_AUDIO, invaders_audio_device, "invaders_audio", "Tai
DEFINE_DEVICE_TYPE(INVAD2CT_AUDIO, invad2ct_audio_device, "invad2ct_audio", "Midway Space Invaders II Audio")
/*************************************
*
* Implementation of tone generator used
* by a few of these games
*
*************************************/
#define MIDWAY_TONE_EN NODE_100
#define MIDWAY_TONE_DATA_L NODE_101
#define MIDWAY_TONE_DATA_H NODE_102
#define MIDWAY_TONE_SND NODE_103
#define MIDWAY_TONE_TRASFORM_OUT NODE_104
#define MIDWAY_TONE_BEFORE_AMP_SND NODE_105
#define MIDWAY_TONE_GENERATOR(discrete_op_amp_tvca_info) \
/* bit 0 of tone data is always 0 */ \
/* join the L & H tone bits */ \
DISCRETE_INPUT_LOGIC(MIDWAY_TONE_EN) \
DISCRETE_INPUT_DATA (MIDWAY_TONE_DATA_L) \
DISCRETE_INPUT_DATA (MIDWAY_TONE_DATA_H) \
DISCRETE_TRANSFORM4(MIDWAY_TONE_TRASFORM_OUT, MIDWAY_TONE_DATA_H, 0x40, MIDWAY_TONE_DATA_L, 0x02, "01*23*+") \
DISCRETE_NOTE(MIDWAY_TONE_BEFORE_AMP_SND, 1, (double)MW8080BW_MASTER_CLOCK/10/2, MIDWAY_TONE_TRASFORM_OUT, 0xfff, 1, DISC_CLK_IS_FREQ) \
DISCRETE_OP_AMP_TRIG_VCA(MIDWAY_TONE_SND, MIDWAY_TONE_BEFORE_AMP_SND, MIDWAY_TONE_EN, 0, 12, 0, &discrete_op_amp_tvca_info)
// most common values based on clowns schematic
static discrete_op_amp_tvca_info const midway_music_tvca_info =
{
RES_M(3.3), // r502
RES_K(10) + RES_K(680), // r505 + r506
0,
RES_K(680), // r503
RES_K(10), // r500
0,
RES_K(680), // r501
0,
0,
0,
0,
CAP_U(.001), // c500
0,
0, 0,
12, // v1
0, // v2
0, // v3
12, // vP
DISC_OP_AMP_TRIGGER_FUNCTION_TRG0,
DISC_OP_AMP_TRIGGER_FUNCTION_NONE,
DISC_OP_AMP_TRIGGER_FUNCTION_TRG1,
DISC_OP_AMP_TRIGGER_FUNCTION_NONE,
DISC_OP_AMP_TRIGGER_FUNCTION_NONE,
DISC_OP_AMP_TRIGGER_FUNCTION_NONE
};
midway_tone_generator_device_base::midway_tone_generator_device_base(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, u32 clock) :
device_t(mconfig, type, tag, owner, clock),
m_discrete(*this, "discrete")
{
}
void midway_tone_generator_device_base::tone_generator_lo_w(u8 data)
{
m_discrete->write(MIDWAY_TONE_EN, (data >> 0) & 0x01);
m_discrete->write(MIDWAY_TONE_DATA_L, (data >> 1) & 0x1f);
// D6 and D7 are not connected
}
void midway_tone_generator_device_base::tone_generator_hi_w(u8 data)
{
m_discrete->write(MIDWAY_TONE_DATA_H, data & 0x3f);
// D6 and D7 are not connected
}
/*************************************
*
* Sea Wolf
@ -748,6 +770,255 @@ void gunfight_audio_device::device_start()
}
/*************************************
*
* Desert Gun
*
* Discrete sound emulation: Jan 2007, D.R.
*
*************************************/
// nodes - inputs
#define DESERTGU_GAME_ON_EN NODE_01
#define DESERTGU_RIFLE_SHOT_EN NODE_02
#define DESERTGU_BOTTLE_HIT_EN NODE_03
#define DESERTGU_ROAD_RUNNER_HIT_EN NODE_04
#define DESERTGU_CREATURE_HIT_EN NODE_05
#define DESERTGU_ROADRUNNER_BEEP_BEEP_EN NODE_06
#define DESERTGU_TRIGGER_CLICK_EN NODE_07
// nodes - sounds
#define DESERTGU_NOISE NODE_08
#define DESERTGU_RIFLE_SHOT_SND NODE_09
#define DESERTGU_BOTTLE_HIT_SND NODE_10
#define DESERTGU_ROAD_RUNNER_HIT_SND NODE_11
#define DESERTGU_CREATURE_HIT_SND NODE_12
#define DESERTGU_ROADRUNNER_BEEP_BEEP_SND NODE_13
#define DESERTGU_TRIGGER_CLICK_SND DESERTGU_TRIGGER_CLICK_EN
// nodes - adjusters
#define DESERTGU_MUSIC_ADJ NODE_15
static discrete_op_amp_tvca_info const desertgu_rifle_shot_tvca_info =
{
RES_M(2.7),
RES_K(680),
0,
RES_K(680),
RES_K(10),
0,
RES_K(680),
0,
0,
0,
0,
CAP_U(0.47),
0,
0, 0,
12, // v1
0, // v2
0, // v3
12, // vP
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 discrete_mixer_desc const desertgu_filter_mixer =
{
DISC_MIXER_IS_RESISTOR,
{ RES_K(2),
RES_K(27),
RES_K(2) + RES_K(1) },
{ 0 },
{ 0 },
0,
0,
0,
0,
0,
1
};
static discrete_op_amp_filt_info const desertgu_filter =
{
1.0 / ( 1.0 / RES_K(2) + 1.0 / RES_K(27) + 1.0 / (RES_K(2) + RES_K(1))),
0,
68,
0,
RES_K(39),
CAP_U(0.033),
CAP_U(0.033),
0,
0,
12,
0
};
static const discrete_mixer_desc desertgu_mixer =
{
DISC_MIXER_IS_OP_AMP,
{ RES_K(12) + RES_K(68) + RES_K(30),
RES_K(56),
RES_K(180),
RES_K(47),
RES_K(30) },
{ 0,
0,
0,
0,
DESERTGU_MUSIC_ADJ },
{ CAP_U(0.1),
CAP_U(0.1),
CAP_U(0.1),
CAP_U(0.1),
CAP_U(0.1) },
0,
RES_K(100),
0,
CAP_U(0.1),
0,
6000 // final gain
};
static DISCRETE_SOUND_START(desertgu_discrete)
/************************************************
* Input register mapping
************************************************/
DISCRETE_INPUT_LOGIC(DESERTGU_GAME_ON_EN)
DISCRETE_INPUT_LOGIC(DESERTGU_RIFLE_SHOT_EN)
DISCRETE_INPUT_LOGIC(DESERTGU_BOTTLE_HIT_EN)
DISCRETE_INPUT_LOGIC(DESERTGU_ROAD_RUNNER_HIT_EN)
DISCRETE_INPUT_LOGIC(DESERTGU_CREATURE_HIT_EN)
DISCRETE_INPUT_LOGIC(DESERTGU_ROADRUNNER_BEEP_BEEP_EN)
DISCRETE_INPUTX_LOGIC(DESERTGU_TRIGGER_CLICK_SND, 12, 0, 0)
// The low value of the pot is set to 75000. A real 1M pot will never go to 0 anyways.
// This will give the control more apparent volume range.
// The music way overpowers the rest of the sounds anyways.
DISCRETE_ADJUSTMENT(DESERTGU_MUSIC_ADJ, RES_M(1), 75000, DISC_LOGADJ, "MUSIC_ADJ")
/************************************************
* Tone generator
************************************************/
MIDWAY_TONE_GENERATOR(midway_music_tvca_info)
/************************************************
* Rifle shot sound
************************************************/
// Noise clock was breadboarded and measured at 7515Hz
DISCRETE_LFSR_NOISE(DESERTGU_NOISE, 1, 1, 7515, 12.0, 0, 12.0/2, &midway_lfsr)
DISCRETE_OP_AMP_TRIG_VCA(NODE_30, DESERTGU_RIFLE_SHOT_EN, 0, 0, DESERTGU_NOISE, 0, &desertgu_rifle_shot_tvca_info)
DISCRETE_RCFILTER(NODE_31, NODE_30, RES_K(12), CAP_U(.01))
DISCRETE_CRFILTER(DESERTGU_RIFLE_SHOT_SND, NODE_31, RES_K(12) + RES_K(68), CAP_U(.0022))
/************************************************
* Bottle hit sound
************************************************/
DISCRETE_CONSTANT(DESERTGU_BOTTLE_HIT_SND, 0) // placeholder for incomplete sound
/************************************************
* Road Runner hit sound
************************************************/
DISCRETE_CONSTANT(DESERTGU_ROAD_RUNNER_HIT_SND, 0) // placeholder for incomplete sound
/************************************************
* Creature hit sound
************************************************/
DISCRETE_CONSTANT(DESERTGU_CREATURE_HIT_SND, 0) // placeholder for incomplete sound
/************************************************
* Beep-Beep sound
************************************************/
DISCRETE_CONSTANT(DESERTGU_ROADRUNNER_BEEP_BEEP_SND, 0) // placeholder for incomplete sound
/************************************************
* Mix and filter
************************************************/
DISCRETE_MIXER3(NODE_80, 1, DESERTGU_BOTTLE_HIT_SND, DESERTGU_ROADRUNNER_BEEP_BEEP_SND, DESERTGU_TRIGGER_CLICK_SND, &desertgu_filter_mixer)
DISCRETE_OP_AMP_FILTER(NODE_81, 1, NODE_80, 0, DISC_OP_AMP_FILTER_IS_BAND_PASS_1, &desertgu_filter)
/************************************************
* Combine all sound sources.
************************************************/
DISCRETE_MIXER5(NODE_91, DESERTGU_GAME_ON_EN, DESERTGU_RIFLE_SHOT_SND, DESERTGU_ROAD_RUNNER_HIT_SND, DESERTGU_CREATURE_HIT_SND, NODE_81, MIDWAY_TONE_SND, &desertgu_mixer)
DISCRETE_OUTPUT(NODE_91, 1)
DISCRETE_SOUND_END
INPUT_PORTS_START(desertgu_audio)
PORT_START("MUSIC_ADJ") // 3
PORT_ADJUSTER( 60, "Music Volume" )
INPUT_PORTS_END
desertgu_audio_device::desertgu_audio_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock) :
midway_tone_generator_device_base(mconfig, DESERTGU_AUDIO, tag, owner, clock),
m_ctrl_sel_out(*this),
m_recoil(*this, "Player1_Gun_Recoil"),
m_p2(0U)
{
}
void desertgu_audio_device::p1_w(u8 data)
{
// D0 and D1 are not connected
machine().bookkeeping().coin_counter_w(0, BIT(data, 2));
m_discrete->write(DESERTGU_GAME_ON_EN, (data >> 3) & 0x01);
m_discrete->write(DESERTGU_RIFLE_SHOT_EN, (data >> 4) & 0x01);
m_discrete->write(DESERTGU_BOTTLE_HIT_EN, (data >> 5) & 0x01);
m_discrete->write(DESERTGU_ROAD_RUNNER_HIT_EN, (data >> 6) & 0x01);
m_discrete->write(DESERTGU_CREATURE_HIT_EN, (data >> 7) & 0x01);
}
void desertgu_audio_device::p2_w(u8 data)
{
u8 const changed(data ^ m_p2);
m_p2 = data;
m_discrete->write(DESERTGU_ROADRUNNER_BEEP_BEEP_EN, (data >> 0) & 0x01);
m_discrete->write(DESERTGU_TRIGGER_CLICK_EN, (data >> 1) & 0x01);
m_recoil = BIT(data, 2);
if (BIT(changed, 3)) m_ctrl_sel_out(BIT(data, 3));
// D4-D7 are not connected
}
void desertgu_audio_device::device_add_mconfig(machine_config &config)
{
SPEAKER(config, "mono").front_center();
DISCRETE(config, m_discrete, desertgu_discrete);
m_discrete->add_route(ALL_OUTPUTS, "mono", 0.8);
}
ioport_constructor desertgu_audio_device::device_input_ports() const
{
return INPUT_PORTS_NAME(desertgu_audio);
}
void desertgu_audio_device::device_start()
{
m_ctrl_sel_out.resolve();
m_recoil.resolve();
m_p2 = 0U;
save_item(NAME(m_p2));
}
/*************************************
*
* Guided Missile
@ -1103,10 +1374,14 @@ static DISCRETE_SOUND_START(clowns_discrete)
DISCRETE_OUTPUT(NODE_91, 11000)
DISCRETE_SOUND_END
static INPUT_PORTS_START(clowns_audio)
PORT_START("R507")
PORT_ADJUSTER( 40, "R507 - Music Volume" )
INPUT_PORTS_END
clowns_audio_device::clowns_audio_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock) :
device_t(mconfig, CLOWNS_AUDIO, tag, owner, clock),
midway_tone_generator_device_base(mconfig, CLOWNS_AUDIO, tag, owner, clock),
m_samples(*this, "samples"),
m_discrete(*this, "discrete"),
m_ctrl_sel_out(*this),
m_p1(0U),
m_p2(0U)
@ -1161,6 +1436,11 @@ void clowns_audio_device::device_add_mconfig(machine_config &config)
m_discrete->add_route(ALL_OUTPUTS, "mono", 0.25);
}
ioport_constructor clowns_audio_device::device_input_ports() const
{
return INPUT_PORTS_NAME(clowns_audio);
}
void clowns_audio_device::device_start()
{
m_ctrl_sel_out.resolve_safe();
@ -2973,234 +3253,6 @@ WRITE8_MEMBER(mw8080bw_state::checkmat_audio_w)
/*************************************
*
* Desert Gun
*
* Discrete sound emulation: Jan 2007, D.R.
*
*************************************/
/* nodes - inputs */
#define DESERTGU_GAME_ON_EN NODE_01
#define DESERTGU_RIFLE_SHOT_EN NODE_02
#define DESERTGU_BOTTLE_HIT_EN NODE_03
#define DESERTGU_ROAD_RUNNER_HIT_EN NODE_04
#define DESERTGU_CREATURE_HIT_EN NODE_05
#define DESERTGU_ROADRUNNER_BEEP_BEEP_EN NODE_06
#define DESERTGU_TRIGGER_CLICK_EN NODE_07
/* nodes - sounds */
#define DESERTGU_NOISE NODE_08
#define DESERTGU_RIFLE_SHOT_SND NODE_09
#define DESERTGU_BOTTLE_HIT_SND NODE_10
#define DESERTGU_ROAD_RUNNER_HIT_SND NODE_11
#define DESERTGU_CREATURE_HIT_SND NODE_12
#define DESERTGU_ROADRUNNER_BEEP_BEEP_SND NODE_13
#define DESERTGU_TRIGGER_CLICK_SND DESERTGU_TRIGGER_CLICK_EN
/* nodes - adjusters */
#define DESERTGU_MUSIC_ADJ NODE_15
static const discrete_op_amp_tvca_info desertgu_rifle_shot_tvca_info =
{
RES_M(2.7),
RES_K(680),
0,
RES_K(680),
RES_K(10),
0,
RES_K(680),
0,
0,
0,
0,
CAP_U(0.47),
0,
0, 0,
12, /* v1 */
0, /* v2 */
0, /* v3 */
12, /* vP */
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 desertgu_filter_mixer =
{
DISC_MIXER_IS_RESISTOR,
{ RES_K(2),
RES_K(27),
RES_K(2) + RES_K(1) },
{ 0 },
{ 0 },
0,
0,
0,
0,
0,
1
};
static const discrete_op_amp_filt_info desertgu_filter =
{
1.0 / ( 1.0 / RES_K(2) + 1.0 / RES_K(27) + 1.0 / (RES_K(2) + RES_K(1))),
0,
68,
0,
RES_K(39),
CAP_U(0.033),
CAP_U(0.033),
0,
0,
12,
0
};
static const discrete_mixer_desc desertgu_mixer =
{
DISC_MIXER_IS_OP_AMP,
{ RES_K(12) + RES_K(68) + RES_K(30),
RES_K(56),
RES_K(180),
RES_K(47),
RES_K(30) },
{ 0,
0,
0,
0,
DESERTGU_MUSIC_ADJ },
{ CAP_U(0.1),
CAP_U(0.1),
CAP_U(0.1),
CAP_U(0.1),
CAP_U(0.1) },
0,
RES_K(100),
0,
CAP_U(0.1),
0,
6000 /* final gain */
};
static DISCRETE_SOUND_START(desertgu_discrete)
/************************************************
* Input register mapping
************************************************/
DISCRETE_INPUT_LOGIC(DESERTGU_GAME_ON_EN)
DISCRETE_INPUT_LOGIC(DESERTGU_RIFLE_SHOT_EN)
DISCRETE_INPUT_LOGIC(DESERTGU_BOTTLE_HIT_EN)
DISCRETE_INPUT_LOGIC(DESERTGU_ROAD_RUNNER_HIT_EN)
DISCRETE_INPUT_LOGIC(DESERTGU_CREATURE_HIT_EN)
DISCRETE_INPUT_LOGIC(DESERTGU_ROADRUNNER_BEEP_BEEP_EN)
DISCRETE_INPUTX_LOGIC(DESERTGU_TRIGGER_CLICK_SND, 12, 0, 0)
/* The low value of the pot is set to 75000. A real 1M pot will never go to 0 anyways. */
/* This will give the control more apparent volume range. */
/* The music way overpowers the rest of the sounds anyways. */
DISCRETE_ADJUSTMENT(DESERTGU_MUSIC_ADJ, RES_M(1), 75000, DISC_LOGADJ, "MUSIC_ADJ")
/************************************************
* Tone generator
************************************************/
MIDWAY_TONE_GENERATOR(midway_music_tvca_info)
/************************************************
* Rifle shot sound
************************************************/
/* Noise clock was breadboarded and measured at 7515Hz */
DISCRETE_LFSR_NOISE(DESERTGU_NOISE, 1, 1, 7515, 12.0, 0, 12.0/2, &midway_lfsr)
DISCRETE_OP_AMP_TRIG_VCA(NODE_30, DESERTGU_RIFLE_SHOT_EN, 0, 0, DESERTGU_NOISE, 0, &desertgu_rifle_shot_tvca_info)
DISCRETE_RCFILTER(NODE_31, NODE_30, RES_K(12), CAP_U(.01))
DISCRETE_CRFILTER(DESERTGU_RIFLE_SHOT_SND, NODE_31, RES_K(12) + RES_K(68), CAP_U(.0022))
/************************************************
* Bottle hit sound
************************************************/
DISCRETE_CONSTANT(DESERTGU_BOTTLE_HIT_SND, 0) /* placeholder for incomplete sound */
/************************************************
* Road Runner hit sound
************************************************/
DISCRETE_CONSTANT(DESERTGU_ROAD_RUNNER_HIT_SND, 0) /* placeholder for incomplete sound */
/************************************************
* Creature hit sound
************************************************/
DISCRETE_CONSTANT(DESERTGU_CREATURE_HIT_SND, 0) /* placeholder for incomplete sound */
/************************************************
* Beep-Beep sound
************************************************/
DISCRETE_CONSTANT(DESERTGU_ROADRUNNER_BEEP_BEEP_SND, 0) /* placeholder for incomplete sound */
/************************************************
* Mix and filter
************************************************/
DISCRETE_MIXER3(NODE_80, 1, DESERTGU_BOTTLE_HIT_SND, DESERTGU_ROADRUNNER_BEEP_BEEP_SND, DESERTGU_TRIGGER_CLICK_SND, &desertgu_filter_mixer)
DISCRETE_OP_AMP_FILTER(NODE_81, 1, NODE_80, 0, DISC_OP_AMP_FILTER_IS_BAND_PASS_1, &desertgu_filter)
/************************************************
* Combine all sound sources.
************************************************/
DISCRETE_MIXER5(NODE_91, DESERTGU_GAME_ON_EN, DESERTGU_RIFLE_SHOT_SND, DESERTGU_ROAD_RUNNER_HIT_SND, DESERTGU_CREATURE_HIT_SND, NODE_81, MIDWAY_TONE_SND, &desertgu_mixer)
DISCRETE_OUTPUT(NODE_91, 1)
DISCRETE_SOUND_END
void mw8080bw_state::desertgu_audio(machine_config &config)
{
SPEAKER(config, "mono").front_center();
DISCRETE(config, m_discrete, desertgu_discrete);
m_discrete->add_route(ALL_OUTPUTS, "mono", 0.8);
}
WRITE8_MEMBER(mw8080bw_state::desertgu_audio_1_w)
{
/* D0 and D1 are not connected */
machine().bookkeeping().coin_counter_w(0, (data >> 2) & 0x01);
m_discrete->write(DESERTGU_GAME_ON_EN, (data >> 3) & 0x01);
m_discrete->write(DESERTGU_RIFLE_SHOT_EN, (data >> 4) & 0x01);
m_discrete->write(DESERTGU_BOTTLE_HIT_EN, (data >> 5) & 0x01);
m_discrete->write(DESERTGU_ROAD_RUNNER_HIT_EN, (data >> 6) & 0x01);
m_discrete->write(DESERTGU_CREATURE_HIT_EN, (data >> 7) & 0x01);
}
WRITE8_MEMBER(mw8080bw_state::desertgu_audio_2_w)
{
m_discrete->write(DESERTGU_ROADRUNNER_BEEP_BEEP_EN, (data >> 0) & 0x01);
m_discrete->write(DESERTGU_TRIGGER_CLICK_EN, (data >> 1) & 0x01);
output().set_value("Player1_Gun_Recoil", (data >> 2) & 0x01);
m_desertgun_controller_select = (data >> 3) & 0x01;
/* D4-D7 are not connected */
}
/*************************************
*
* Double Play / Extra Inning

View File

@ -16,6 +16,19 @@
#include "sound/sn76477.h"
class midway_tone_generator_device_base : public device_t
{
public:
void tone_generator_lo_w(u8 data);
void tone_generator_hi_w(u8 data);
protected:
midway_tone_generator_device_base(machine_config const &mconfig, device_type type, char const *tag, device_t *owner, u32 clock);
required_device<discrete_sound_device> m_discrete;
};
class seawolf_audio_device : public device_t
{
public:
@ -49,6 +62,27 @@ private:
};
class desertgu_audio_device : public midway_tone_generator_device_base
{
public:
auto ctrl_sel_out() { return m_ctrl_sel_out.bind(); }
desertgu_audio_device(machine_config const &mconfig, char const *tag, device_t *owner, u32 clock = 0);
void p1_w(u8 data);
void p2_w(u8 data);
protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual ioport_constructor device_input_ports() const override;
virtual void device_start() override;
private:
devcb_write_line m_ctrl_sel_out;
output_finder<> m_recoil;
u8 m_p2;
};
class gmissile_audio_device : public device_t
{
@ -90,7 +124,7 @@ private:
};
class clowns_audio_device : public device_t
class clowns_audio_device : public midway_tone_generator_device_base
{
public:
auto ctrl_sel_out() { return m_ctrl_sel_out.bind(); }
@ -102,11 +136,11 @@ public:
protected:
virtual void device_add_mconfig(machine_config &config) override;
virtual ioport_constructor device_input_ports() const override;
virtual void device_start() override;
private:
required_device<samples_device> m_samples;
required_device<discrete_sound_device> m_discrete;
devcb_write_line m_ctrl_sel_out;
u8 m_p1;
u8 m_p2;
@ -202,6 +236,7 @@ private:
DECLARE_DEVICE_TYPE(SEAWOLF_AUDIO, seawolf_audio_device)
DECLARE_DEVICE_TYPE(GUNFIGHT_AUDIO, gunfight_audio_device)
DECLARE_DEVICE_TYPE(DESERTGU_AUDIO, desertgu_audio_device)
DECLARE_DEVICE_TYPE(GMISSILE_AUDIO, gmissile_audio_device)
DECLARE_DEVICE_TYPE(M4_AUDIO, m4_audio_device)
DECLARE_DEVICE_TYPE(CLOWNS_AUDIO, clowns_audio_device)

View File

@ -395,7 +395,7 @@ static INPUT_PORTS_START( seawolf )
// 2 fake ports for the 'Reset High Score' input, which has a DIP to enable it
PORT_START(SEAWOLF_ERASE_SW_PORT_TAG)
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_OTHER ) PORT_NAME("Reset High Score") PORT_CODE(KEYCODE_F2)
PORT_BIT( 0x01, IP_ACTIVE_HIGH, IPT_MEMORY_RESET ) PORT_NAME("Reset High Score")
PORT_BIT( 0xfe, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START(SEAWOLF_ERASE_DIP_PORT_TAG)
@ -1178,69 +1178,52 @@ void mw8080bw_state::checkmat(machine_config &config)
*
*************************************/
#define DESERTGU_DIP_SW_0_1_SET_1_TAG ("DIPSW01SET1")
#define DESERTGU_DIP_SW_0_1_SET_2_TAG ("DIPSW01SET2")
MACHINE_START_MEMBER(mw8080bw_state,desertgu)
void desertgu_state::machine_start()
{
mw8080bw_state::machine_start();
/* setup for save states */
save_item(NAME(m_desertgun_controller_select));
m_controller_select = 0U;
save_item(NAME(m_controller_select));
}
CUSTOM_INPUT_MEMBER(mw8080bw_state::desertgu_gun_input_r)
CUSTOM_INPUT_MEMBER(desertgu_state::gun_input_r)
{
uint32_t ret;
if (m_desertgun_controller_select)
ret = ioport(DESERTGU_GUN_X_PORT_TAG)->read();
else
ret = ioport(DESERTGU_GUN_Y_PORT_TAG)->read();
return ret;
return m_gun_port[m_controller_select]->read();
}
CUSTOM_INPUT_MEMBER(mw8080bw_state::desertgu_dip_sw_0_1_r)
CUSTOM_INPUT_MEMBER(desertgu_state::dip_sw_0_1_r)
{
uint32_t ret;
if (m_desertgun_controller_select)
ret = ioport(DESERTGU_DIP_SW_0_1_SET_2_TAG)->read();
else
ret = ioport(DESERTGU_DIP_SW_0_1_SET_1_TAG)->read();
return ret;
return m_dip_sw_0_1[m_controller_select]->read();
}
void mw8080bw_state::desertgu_io_map(address_map &map)
void desertgu_state::io_map(address_map &map)
{
map.global_mask(0x7);
map(0x00, 0x00).mirror(0x04).r(FUNC(mw8080bw_state::mw8080bw_shift_result_rev_r));
map(0x00, 0x00).mirror(0x04).r(FUNC(desertgu_state::mw8080bw_shift_result_rev_r));
map(0x01, 0x01).mirror(0x04).portr("IN0");
map(0x02, 0x02).mirror(0x04).portr("IN1");
map(0x03, 0x03).mirror(0x04).r(m_mb14241, FUNC(mb14241_device::shift_result_r));
map(0x01, 0x01).w(m_mb14241, FUNC(mb14241_device::shift_count_w));
map(0x02, 0x02).w(m_mb14241, FUNC(mb14241_device::shift_data_w));
map(0x03, 0x03).w(FUNC(mw8080bw_state::desertgu_audio_1_w));
map(0x03, 0x03).w("soundboard", FUNC(desertgu_audio_device::p1_w));
map(0x04, 0x04).w(m_watchdog, FUNC(watchdog_timer_device::reset_w));
map(0x05, 0x05).w(FUNC(mw8080bw_state::midway_tone_generator_lo_w));
map(0x06, 0x06).w(FUNC(mw8080bw_state::midway_tone_generator_hi_w));
map(0x07, 0x07).w(FUNC(mw8080bw_state::desertgu_audio_2_w));
map(0x05, 0x05).w("soundboard", FUNC(desertgu_audio_device::tone_generator_lo_w));
map(0x06, 0x06).w("soundboard", FUNC(desertgu_audio_device::tone_generator_hi_w));
map(0x07, 0x07).w("soundboard", FUNC(desertgu_audio_device::p2_w));
}
static INPUT_PORTS_START( desertgu )
PORT_START("IN0")
PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(mw8080bw_state, desertgu_gun_input_r)
PORT_BIT( 0xff, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(desertgu_state, gun_input_r)
PORT_START("IN1")
PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(mw8080bw_state, desertgu_dip_sw_0_1_r)
PORT_BIT( 0x03, IP_ACTIVE_HIGH, IPT_CUSTOM ) PORT_CUSTOM_MEMBER(desertgu_state, dip_sw_0_1_r)
PORT_DIPNAME( 0x0c, 0x00, DEF_STR( Language ) ) PORT_CONDITION("IN1", 0x30, NOTEQUALS, 0x30) PORT_DIPLOCATION("C2:5,6")
PORT_DIPSETTING( 0x00, DEF_STR( English ) )
PORT_DIPSETTING( 0x04, DEF_STR( German ) )
@ -1278,28 +1261,23 @@ static INPUT_PORTS_START( desertgu )
PORT_DIPSETTING( 0x02, "60 seconds + 30 extended" )
PORT_DIPSETTING( 0x03, "70 seconds + 30 extended" )
PORT_BIT( 0xfc, IP_ACTIVE_HIGH, IPT_UNUSED )
PORT_START("MUSIC_ADJ") /* 3 */
PORT_ADJUSTER( 60, "Music Volume" )
INPUT_PORTS_END
void mw8080bw_state::desertgu(machine_config &config)
void desertgu_state::desertgu(machine_config &config)
{
mw8080bw_root(config);
/* basic machine hardware */
m_maincpu->set_addrmap(AS_IO, &mw8080bw_state::desertgu_io_map);
MCFG_MACHINE_START_OVERRIDE(mw8080bw_state,desertgu)
// basic machine hardware
m_maincpu->set_addrmap(AS_IO, &desertgu_state::io_map);
WATCHDOG_TIMER(config, m_watchdog).set_time(255 * attotime::from_hz(MW8080BW_60HZ));
/* add shifter */
// add shifter
MB14241(config, m_mb14241);
/* audio hardware */
desertgu_audio(config);
// audio hardware
DESERTGU_AUDIO(config, "soundboard").ctrl_sel_out().set([this] (int state) { m_controller_select = state ? 1U : 0U; });
}
@ -1741,8 +1719,8 @@ void mw8080bw_state::clowns_io_map(address_map &map)
map(0x02, 0x02).w(m_mb14241, FUNC(mb14241_device::shift_data_w));
map(0x03, 0x03).w("soundboard", FUNC(clowns_audio_device::p1_w));
map(0x04, 0x04).w(m_watchdog, FUNC(watchdog_timer_device::reset_w));
map(0x05, 0x05).w(FUNC(mw8080bw_state::midway_tone_generator_lo_w));
map(0x06, 0x06).w(FUNC(mw8080bw_state::midway_tone_generator_hi_w));
map(0x05, 0x05).w("soundboard", FUNC(clowns_audio_device::tone_generator_lo_w));
map(0x06, 0x06).w("soundboard", FUNC(clowns_audio_device::tone_generator_hi_w));
map(0x07, 0x07).w("soundboard", FUNC(clowns_audio_device::p2_w));
}
@ -1790,9 +1768,6 @@ static INPUT_PORTS_START( clowns )
PORT_START(CLOWNS_CONTROLLER_P2_TAG)
PORT_BIT( 0xff, 0x7f, IPT_PADDLE ) PORT_MINMAX(0x01,0xfe) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_CENTERDELTA(0) PORT_PLAYER(2)
PORT_START("R507")
PORT_ADJUSTER( 40, "R507 - Music Volume" )
INPUT_PORTS_END
@ -1837,9 +1812,6 @@ static INPUT_PORTS_START( clowns1 )
PORT_START(CLOWNS_CONTROLLER_P2_TAG)
PORT_BIT( 0xff, 0x7f, IPT_PADDLE ) PORT_MINMAX(0x01,0xfe) PORT_SENSITIVITY(100) PORT_KEYDELTA(10) PORT_CENTERDELTA(0) PORT_PLAYER(2)
PORT_START("R507")
PORT_ADJUSTER( 40, "R507 - Music Volume" )
INPUT_PORTS_END
@ -3171,8 +3143,8 @@ ROM_END
/* 611 */ GAMEL( 1976, maze, 0, maze, maze, mw8080bw_state, empty_init, ROT0, "Midway", "Amazing Maze", MACHINE_SUPPORTS_SAVE, layout_maze )
/* 612 */ GAME( 1977, boothill, 0, boothill, boothill, mw8080bw_state, empty_init, ROT0, "Dave Nutting Associates / Midway", "Boot Hill", MACHINE_SUPPORTS_SAVE )
/* 615 */ GAME( 1977, checkmat, 0, checkmat, checkmat, mw8080bw_state, empty_init, ROT0, "Dave Nutting Associates / Midway", "Checkmate", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
/* 618 */ GAME( 1977, desertgu, 0, desertgu, desertgu, mw8080bw_state, empty_init, ROT0, "Dave Nutting Associates / Midway", "Desert Gun", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
/* 618 */ GAME( 1977, roadrunm, desertgu, desertgu, desertgu, mw8080bw_state, empty_init, ROT0, "Midway", "Road Runner (Midway)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
/* 618 */ GAME( 1977, desertgu, 0, desertgu, desertgu, desertgu_state, empty_init, ROT0, "Dave Nutting Associates / Midway", "Desert Gun", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
/* 618 */ GAME( 1977, roadrunm, desertgu, desertgu, desertgu, desertgu_state, empty_init, ROT0, "Midway", "Road Runner (Midway)", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )
/* 619 */ GAME( 1977, dplay, 0, dplay, dplay, mw8080bw_state, empty_init, ROT0, "Midway", "Double Play", MACHINE_SUPPORTS_SAVE )
/* 622 */ GAMEL( 1977, lagunar, 0, zzzap, lagunar, mw8080bw_state, empty_init, ROT90, "Midway", "Laguna Racer", MACHINE_NO_SOUND | MACHINE_SUPPORTS_SAVE, layout_lagunar )
/* 623 */ GAME( 1977, gmissile, 0, gmissile, gmissile, mw8080bw_state, empty_init, ROT0, "Midway", "Guided Missile", MACHINE_IMPERFECT_SOUND | MACHINE_SUPPORTS_SAVE )

View File

@ -62,7 +62,6 @@ public:
void bowler(machine_config &config);
void checkmat(machine_config &config);
void clowns(machine_config &config);
void desertgu(machine_config &config);
void dogpatch(machine_config &config);
void dplay(machine_config &config);
void gmissile(machine_config &config);
@ -84,8 +83,6 @@ public:
DECLARE_CUSTOM_INPUT_MEMBER(tornbase_pitch_left_input_r);
DECLARE_CUSTOM_INPUT_MEMBER(tornbase_pitch_right_input_r);
DECLARE_CUSTOM_INPUT_MEMBER(tornbase_score_input_r);
DECLARE_CUSTOM_INPUT_MEMBER(desertgu_gun_input_r);
DECLARE_CUSTOM_INPUT_MEMBER(desertgu_dip_sw_0_1_r);
DECLARE_CUSTOM_INPUT_MEMBER(dplay_pitch_left_input_r);
DECLARE_CUSTOM_INPUT_MEMBER(dplay_pitch_right_input_r);
DECLARE_CUSTOM_INPUT_MEMBER(clowns_controller_r);
@ -130,7 +127,6 @@ private:
uint16_t m_phantom2_cloud_counter;
uint8_t m_rev_shift_res;
uint8_t m_maze_tone_timing_state; // output of IC C1, pin 5
uint8_t m_desertgun_controller_select;
uint8_t m_clowns_controller_select;
// timers
@ -157,7 +153,6 @@ private:
DECLARE_WRITE8_MEMBER(bowler_audio_6_w);
DECLARE_MACHINE_START(maze);
DECLARE_MACHINE_START(boothill);
DECLARE_MACHINE_START(desertgu);
DECLARE_MACHINE_START(gmissile);
DECLARE_MACHINE_START(m4);
DECLARE_MACHINE_START(clowns);
@ -172,8 +167,6 @@ private:
DECLARE_WRITE8_MEMBER(tornbase_audio_w);
DECLARE_WRITE8_MEMBER(boothill_audio_w);
DECLARE_WRITE8_MEMBER(checkmat_audio_w);
DECLARE_WRITE8_MEMBER(desertgu_audio_1_w);
DECLARE_WRITE8_MEMBER(desertgu_audio_2_w);
DECLARE_WRITE8_MEMBER(dplay_audio_w);
DECLARE_WRITE8_MEMBER(spacwalk_audio_1_w);
DECLARE_WRITE8_MEMBER(spacwalk_audio_2_w);
@ -194,7 +187,6 @@ private:
void boothill_audio(machine_config &config);
void bowler_audio(machine_config &config);
void checkmat_audio(machine_config &config);
void desertgu_audio(machine_config &config);
void dogpatch_audio(machine_config &config);
void dplay_audio(machine_config &config);
void maze_audio(machine_config &config);
@ -208,7 +200,6 @@ private:
void bowler_io_map(address_map &map);
void checkmat_io_map(address_map &map);
void clowns_io_map(address_map &map);
void desertgu_io_map(address_map &map);
void dogpatch_io_map(address_map &map);
void dplay_io_map(address_map &map);
void gmissile_io_map(address_map &map);
@ -284,6 +275,39 @@ private:
};
#define DESERTGU_GUN_X_PORT_TAG ("GUNX")
#define DESERTGU_GUN_Y_PORT_TAG ("GUNY")
#define DESERTGU_DIP_SW_0_1_SET_1_TAG ("DIPSW01SET1")
#define DESERTGU_DIP_SW_0_1_SET_2_TAG ("DIPSW01SET2")
class desertgu_state : public mw8080bw_state
{
public:
desertgu_state(machine_config const &mconfig, device_type type, char const *tag) :
mw8080bw_state(mconfig, type, tag),
m_gun_port(*this, { DESERTGU_GUN_Y_PORT_TAG, DESERTGU_GUN_X_PORT_TAG }),
m_dip_sw_0_1(*this, { DESERTGU_DIP_SW_0_1_SET_1_TAG, DESERTGU_DIP_SW_0_1_SET_2_TAG })
{
}
void desertgu(machine_config &config);
DECLARE_CUSTOM_INPUT_MEMBER(gun_input_r);
DECLARE_CUSTOM_INPUT_MEMBER(dip_sw_0_1_r);
protected:
virtual void machine_start() override;
private:
void io_map(address_map &map);
required_ioport_array<2> m_gun_port;
required_ioport_array<2> m_dip_sw_0_1;
u8 m_controller_select;
};
class spcenctr_state : public mw8080bw_state
{
public:
@ -318,9 +342,6 @@ private:
#define TORNBASE_CAB_TYPE_UPRIGHT_NEW (1)
#define TORNBASE_CAB_TYPE_COCKTAIL (2)
#define DESERTGU_GUN_X_PORT_TAG ("GUNX")
#define DESERTGU_GUN_Y_PORT_TAG ("GUNY")
#define INVADERS_CAB_TYPE_PORT_TAG ("CAB")
#define INVADERS_P1_CONTROL_PORT_TAG ("CONTP1")
#define INVADERS_P2_CONTROL_PORT_TAG ("CONTP2")

View File

@ -1,45 +1,29 @@
<?xml version="1.0"?>
<!--
license:CC0
copyright-holders:Vas Crabb
Midway Space Encounters layout
-->
<mamelayout version="2">
<element name="reflection" defstate="0"><rect state="1" /></element>
<element name="lamp_red" defstate="0">
<rect state="0">
<color red="0" green="0" blue="0" />
</rect>
<rect state="1">
<color red="1.0" green="0.25" blue="0.1" />
</rect>
</element>
<element name="lamp_strobe" defstate="0">
<rect state="0">
<color red="0" green="0" blue="0" />
</rect>
<rect state="1">
<color red="1" green="1" blue="1" />
</rect>
</element>
<!-- NOTE: color overlay is known, -->
<!-- but as of yet (10-2012) can't be created with internal .lay -->
<view name="Lamps Reflection">
<!-- left and right edges are stripped on the cabinet -->
<view name="Lamp/Strobe Reflection">
<!-- left and right edges are stripped on the cabinet -->
<bounds left="0" top="0" right="376" bottom="300" />
<screen index="0">
<bounds left="-8" top="0" right="392" bottom="300" />
</screen>
<!-- lamp and strobe reflect onto the inner bezel (and screen) -->
<bezel name="LAMP" element="lamp_red">
<bounds left="0" top="0" right="376" bottom="300" />
<color alpha="0.2" />
</bezel>
<bezel name="STROBE" element="lamp_strobe">
<bounds left="0" top="0" right="376" bottom="300" />
<color alpha="0.4" />
</bezel>
<!-- NOTE: color overlay is known, but as of yet (10-2012) can't be created with internal .lay -->
<!-- lamp and strobe reflect onto the inner bezel (and screen) -->
<element ref="reflection" name="LAMP" blend="add">
<color red="0.5" green="0.125" blue="0.05" />
<bounds left="0" top="0" right="376" bottom="300" />
</element>
<element ref="reflection" name="STROBE" blend="add">
<color red="0.7" green="0.7" blue="0.7" />
<bounds left="0" top="0" right="376" bottom="300" />
</element>
</view>
</mamelayout>