clean upp by35 - that was nasty (nw)

This commit is contained in:
Vas Crabb 2018-03-01 21:33:47 +11:00
parent 31294623a6
commit 3317533e41

View File

@ -76,6 +76,9 @@ ToDo:
#include "render.h" #include "render.h"
#include "speaker.h" #include "speaker.h"
//#define VERBOSE 1
#include "logmacro.h"
#include "by35.lh" #include "by35.lh"
#include "by35_playboy.lh" #include "by35_playboy.lh"
@ -83,8 +86,28 @@ ToDo:
class by35_state : public genpin_class class by35_state : public genpin_class
{ {
public: public:
by35_state(const machine_config &mconfig, device_type type, const char *tag) by35_state(machine_config const &mconfig, device_type type, char const *tag)
: by35_state(mconfig, type, tag, s_solenoid_features_default)
{ }
DECLARE_DRIVER_INIT(by35_6) { m_7d = 0; }
DECLARE_DRIVER_INIT(by35_7) { m_7d = 1; }
DECLARE_INPUT_CHANGED_MEMBER(activity_button);
DECLARE_INPUT_CHANGED_MEMBER(self_test);
DECLARE_CUSTOM_INPUT_MEMBER(outhole_x0);
DECLARE_CUSTOM_INPUT_MEMBER(drop_target_x0);
DECLARE_CUSTOM_INPUT_MEMBER(kickback_x3);
void by35(machine_config &config);
void nuovo(machine_config &config);
protected:
typedef uint8_t solenoid_feature_data[20][4];
by35_state(machine_config const &mconfig, device_type type, char const *tag, solenoid_feature_data const &solenoid_features)
: genpin_class(mconfig, type, tag) : genpin_class(mconfig, type, tag)
, m_solenoid_features(solenoid_features)
, m_maincpu(*this, "maincpu") , m_maincpu(*this, "maincpu")
, m_nvram(*this, "nvram") , m_nvram(*this, "nvram")
, m_pia_u10(*this, "pia_u10") , m_pia_u10(*this, "pia_u10")
@ -99,13 +122,10 @@ public:
, m_io_x2(*this, "X2") , m_io_x2(*this, "X2")
, m_io_x3(*this, "X3") , m_io_x3(*this, "X3")
, m_io_x4(*this, "X4") , m_io_x4(*this, "X4")
, m_discrete(*this, "discrete") , m_lamps(*this, "lamp%u", 0U)
, m_timer_s_freq(*this, "timer_s_freq") , m_solenoids(*this, "solenoid%u", 0U)
{ } { }
DECLARE_DRIVER_INIT(by35_6);
DECLARE_DRIVER_INIT(by35_7);
DECLARE_DRIVER_INIT(playboy);
DECLARE_READ8_MEMBER(u10_a_r); DECLARE_READ8_MEMBER(u10_a_r);
DECLARE_WRITE8_MEMBER(u10_a_w); DECLARE_WRITE8_MEMBER(u10_a_w);
DECLARE_READ8_MEMBER(u10_b_r); DECLARE_READ8_MEMBER(u10_b_r);
@ -113,7 +133,6 @@ public:
DECLARE_READ8_MEMBER(u11_a_r); DECLARE_READ8_MEMBER(u11_a_r);
DECLARE_WRITE8_MEMBER(u11_a_w); DECLARE_WRITE8_MEMBER(u11_a_w);
DECLARE_WRITE8_MEMBER(u11_b_w); DECLARE_WRITE8_MEMBER(u11_b_w);
DECLARE_WRITE8_MEMBER(u11_b_as2888_w);
DECLARE_READ8_MEMBER(nibble_nvram_r); DECLARE_READ8_MEMBER(nibble_nvram_r);
DECLARE_WRITE8_MEMBER(nibble_nvram_w); DECLARE_WRITE8_MEMBER(nibble_nvram_w);
DECLARE_READ_LINE_MEMBER(u10_ca1_r); DECLARE_READ_LINE_MEMBER(u10_ca1_r);
@ -124,47 +143,34 @@ public:
DECLARE_READ_LINE_MEMBER(u11_cb1_r); DECLARE_READ_LINE_MEMBER(u11_cb1_r);
DECLARE_WRITE_LINE_MEMBER(u11_ca2_w); DECLARE_WRITE_LINE_MEMBER(u11_ca2_w);
DECLARE_WRITE_LINE_MEMBER(u11_cb2_w); DECLARE_WRITE_LINE_MEMBER(u11_cb2_w);
DECLARE_WRITE_LINE_MEMBER(u11_cb2_as2888_w); virtual void machine_reset() override;
DECLARE_INPUT_CHANGED_MEMBER(activity_button);
DECLARE_INPUT_CHANGED_MEMBER(self_test);
DECLARE_CUSTOM_INPUT_MEMBER(outhole_x0);
DECLARE_CUSTOM_INPUT_MEMBER(drop_target_x0);
DECLARE_CUSTOM_INPUT_MEMBER(kickback_x3);
DECLARE_MACHINE_START(as2888);
DECLARE_MACHINE_RESET(by35);
TIMER_DEVICE_CALLBACK_MEMBER(timer_z_freq); TIMER_DEVICE_CALLBACK_MEMBER(timer_z_freq);
TIMER_DEVICE_CALLBACK_MEMBER(timer_z_pulse); TIMER_DEVICE_CALLBACK_MEMBER(timer_z_pulse);
TIMER_DEVICE_CALLBACK_MEMBER(u11_timer); TIMER_DEVICE_CALLBACK_MEMBER(u11_timer);
TIMER_DEVICE_CALLBACK_MEMBER(timer_d_pulse); TIMER_DEVICE_CALLBACK_MEMBER(timer_d_pulse);
TIMER_DEVICE_CALLBACK_MEMBER(timer_s);
TIMER_DEVICE_CALLBACK_MEMBER(timer_as2888);
void by35(machine_config &config);
void nuovo(machine_config &config);
void as2888(machine_config &config);
void as2888_audio(machine_config &config);
void by35_map(address_map &map); void by35_map(address_map &map);
void nuovo_map(address_map &map); void nuovo_map(address_map &map);
private:
uint8_t m_u10a; uint8_t m_u10a;
uint8_t m_u10b; uint8_t m_u10b;
uint8_t m_u11a; uint8_t m_u11a;
uint8_t m_u11b; uint8_t m_u11b;
static solenoid_feature_data const s_solenoid_features_default;
private:
bool m_u10_ca2; bool m_u10_ca2;
bool m_u10_cb1; bool m_u10_cb1;
bool m_u10_cb2; bool m_u10_cb2;
bool m_u11_ca1; bool m_u11_ca1;
bool m_u11_cb2; bool m_u11_cb2;
bool m_timer_as2888;
bool m_7d; bool m_7d;
uint8_t m_digit; uint8_t m_digit;
uint8_t m_segment[6]; uint8_t m_segment[6];
uint8_t m_lamp_decode; uint8_t m_lamp_decode;
uint8_t m_solenoid_features[20][4]; solenoid_feature_data const &m_solenoid_features;
uint8_t m_io_hold_x[6]; uint8_t m_io_hold_x[6];
uint8_t m_snd_sel;
uint8_t m_snd_tone_gen;
uint8_t m_snd_div;
uint8_t *m_snd_prom;
required_device<m6800_cpu_device> m_maincpu; required_device<m6800_cpu_device> m_maincpu;
required_shared_ptr<uint8_t> m_nvram; required_shared_ptr<uint8_t> m_nvram;
required_device<pia6821_device> m_pia_u10; required_device<pia6821_device> m_pia_u10;
@ -179,8 +185,57 @@ private:
required_ioport m_io_x2; required_ioport m_io_x2;
required_ioport m_io_x3; required_ioport m_io_x3;
required_ioport m_io_x4; required_ioport m_io_x4;
optional_device<discrete_device> m_discrete; output_finder<15 * 4> m_lamps;
optional_device<timer_device> m_timer_s_freq; output_finder<20> m_solenoids;
};
class as2888_state : public by35_state
{
public:
as2888_state(machine_config const &mconfig, device_type type, char const *tag)
: as2888_state(mconfig, type, tag, s_solenoid_features_default)
{ }
DECLARE_DRIVER_INIT(playboy);
void as2888(machine_config &config);
protected:
as2888_state(machine_config const &mconfig, device_type type, char const *tag, solenoid_feature_data const &solenoid_features)
: by35_state(mconfig, type, tag, solenoid_features)
, m_snd_prom(*this, "sound1")
, m_discrete(*this, "discrete")
, m_timer_s_freq(*this, "timer_s_freq")
{ }
DECLARE_WRITE8_MEMBER(u11_b_as2888_w);
DECLARE_WRITE_LINE_MEMBER(u11_cb2_as2888_w);
TIMER_DEVICE_CALLBACK_MEMBER(timer_s);
TIMER_DEVICE_CALLBACK_MEMBER(timer_as2888);
void as2888_audio(machine_config &config);
private:
bool m_timer_as2888;
uint8_t m_snd_sel;
uint8_t m_snd_tone_gen;
uint8_t m_snd_div;
required_region_ptr<uint8_t> m_snd_prom;
required_device<discrete_device> m_discrete;
required_device<timer_device> m_timer_s_freq;
};
class playboy_state : public as2888_state
{
public:
playboy_state(machine_config const &mconfig, device_type type, char const *tag)
: as2888_state(mconfig, type, tag, s_solenoid_features_playboy)
{ }
protected:
static solenoid_feature_data const s_solenoid_features_playboy;
}; };
@ -547,7 +602,7 @@ WRITE_LINE_MEMBER( by35_state::u10_ca2_w )
WRITE_LINE_MEMBER( by35_state::u10_cb2_w ) WRITE_LINE_MEMBER( by35_state::u10_cb2_w )
{ {
// logerror("New U10 CB2 state %01x, was %01x. PIA=%02x\n", state, m_u10_cb2, m_u10a); LOG("New U10 CB2 state %01x, was %01x. PIA=%02x\n", state, m_u10_cb2, m_u10a);
if (state == true) if (state == true)
m_lamp_decode = m_u10a & 0x0f; m_lamp_decode = m_u10a & 0x0f;
@ -576,20 +631,18 @@ WRITE_LINE_MEMBER( by35_state::u11_cb2_w )
m_u11_cb2 = state; m_u11_cb2 = state;
} }
WRITE_LINE_MEMBER( by35_state::u11_cb2_as2888_w ) WRITE_LINE_MEMBER( as2888_state::u11_cb2_as2888_w )
{ {
if (state) if (state)
{ {
address_space &space = m_maincpu->space(AS_PROGRAM);
timer_device *snd_sustain_timer = machine().device<timer_device>("timer_as2888"); timer_device *snd_sustain_timer = machine().device<timer_device>("timer_as2888");
snd_sustain_timer->adjust(attotime::from_msec(5)); snd_sustain_timer->adjust(attotime::from_msec(5));
m_timer_as2888 = true; m_timer_as2888 = true;
m_discrete->write(space, NODE_08, 11); // 11 volt pulse m_discrete->write(machine().dummy_space(), NODE_08, 11); // 11 volt pulse
} }
m_u11_cb2 = state; u11_cb2_w(state);
} }
READ8_MEMBER( by35_state::u10_a_r ) READ8_MEMBER( by35_state::u10_a_r )
@ -599,7 +652,7 @@ READ8_MEMBER( by35_state::u10_a_r )
WRITE8_MEMBER( by35_state::u10_a_w ) WRITE8_MEMBER( by35_state::u10_a_w )
{ {
// logerror("Writing %02x to U10 PIA, CB2 state is %01x, CA2 state is %01x, Lamp_Dec is %02x\n",data, m_u10_cb2, m_u10_ca2, (m_lamp_decode & 0x0f)); LOG("Writing %02x to U10 PIA, CB2 state is %01x, CA2 state is %01x, Lamp_Dec is %02x\n",data, m_u10_cb2, m_u10_ca2, (m_lamp_decode & 0x0f));
if (!m_u10_ca2) if (!m_u10_ca2)
{ {
@ -621,10 +674,10 @@ WRITE8_MEMBER( by35_state::u10_a_w )
{ {
if ((m_lamp_decode & 0x0f) < 0x0f) if ((m_lamp_decode & 0x0f) < 0x0f)
{ {
if (output().get_indexed_value("lamp", ((m_lamp_decode & 0x0f)+00) ) ==0 ) output().set_indexed_value("lamp", ((m_lamp_decode & 0x0f)+00), ((data & 0x10) ? false : true)); if (!m_lamps[(m_lamp_decode & 0x0f)+00]) m_lamps[(m_lamp_decode & 0x0f)+00] = !BIT(data, 4);
if (output().get_indexed_value("lamp", ((m_lamp_decode & 0x0f)+15) ) ==0 ) output().set_indexed_value("lamp", ((m_lamp_decode & 0x0f)+15), ((data & 0x20) ? false : true)); if (!m_lamps[(m_lamp_decode & 0x0f)+15]) m_lamps[(m_lamp_decode & 0x0f)+15] = !BIT(data, 5);
if (output().get_indexed_value("lamp", ((m_lamp_decode & 0x0f)+30) ) ==0 ) output().set_indexed_value("lamp", ((m_lamp_decode & 0x0f)+30), ((data & 0x40) ? false : true)); if (!m_lamps[(m_lamp_decode & 0x0f)+30]) m_lamps[(m_lamp_decode & 0x0f)+30] = !BIT(data, 6);
if (output().get_indexed_value("lamp", ((m_lamp_decode & 0x0f)+45) ) ==0 ) output().set_indexed_value("lamp", ((m_lamp_decode & 0x0f)+45), ((data & 0x80) ? false : true)); if (!m_lamps[(m_lamp_decode & 0x0f)+45]) m_lamps[(m_lamp_decode & 0x0f)+45] = !BIT(data, 7);
} }
else else
{ {
@ -728,7 +781,7 @@ WRITE8_MEMBER( by35_state::u11_b_w )
if ((data & 0x0f) < 0x0f) // Momentary Solenoids if ((data & 0x0f) < 0x0f) // Momentary Solenoids
{ {
if (m_solenoid_features[(data & 0x0f)][0] != 0xff) { // Play solenoid audio sample if (m_solenoid_features[(data & 0x0f)][0] != 0xff) { // Play solenoid audio sample
if (output().get_indexed_value("solenoid", (data & 0x0f)) == false) if (!m_solenoids[data & 0x0f])
m_samples->start(m_solenoid_features[(data & 0x0f)][0], m_solenoid_features[(data & 0x0f)][1]); m_samples->start(m_solenoid_features[(data & 0x0f)][0], m_solenoid_features[(data & 0x0f)][1]);
} }
@ -739,59 +792,56 @@ WRITE8_MEMBER( by35_state::u11_b_w )
} }
else // Rest output - all momentary solenoids are off else // Rest output - all momentary solenoids are off
{ {
for (int i=0; i<15; i++) std::fill_n(std::begin(m_solenoids), 15, false);
{
output().set_indexed_value( "solenoid", i, false);
}
} }
} }
if ((m_u11b & 0x10) && ((data & 0x10)==0)) if ((m_u11b & 0x10) && ((data & 0x10)==0))
{ {
output().set_value("solenoid16", true); m_solenoids[16] = true;
if (m_solenoid_features[16][0] != 0xff) if (m_solenoid_features[16][0] != 0xff)
m_samples->start(m_solenoid_features[16][0], m_solenoid_features[16][1]); m_samples->start(m_solenoid_features[16][0], m_solenoid_features[16][1]);
} }
else if ((data & 0x10) && ((m_u11b & 0x10)==0)) else if ((data & 0x10) && ((m_u11b & 0x10)==0))
{ {
output().set_value("solenoid16", false); m_solenoids[16] = false;
if (m_solenoid_features[16][0] != 0xff) if (m_solenoid_features[16][0] != 0xff)
m_samples->start(m_solenoid_features[16][0], m_solenoid_features[16][2]); m_samples->start(m_solenoid_features[16][0], m_solenoid_features[16][2]);
} }
if ((m_u11b & 0x20) && ((data & 0x20)==0)) if ((m_u11b & 0x20) && ((data & 0x20)==0))
{ {
output().set_value("solenoid17", true); // Coin Lockout Coil engage m_solenoids[17] = true; // Coin Lockout Coil engage
if (m_solenoid_features[17][0] != 0xff) if (m_solenoid_features[17][0] != 0xff)
m_samples->start(m_solenoid_features[17][0], m_solenoid_features[17][1]); m_samples->start(m_solenoid_features[17][0], m_solenoid_features[17][1]);
} }
else if ((data & 0x20) && ((m_u11b & 0x20)==0)) else if ((data & 0x20) && ((m_u11b & 0x20)==0))
{ {
output().set_value("solenoid17", false); // Coin Lockout Coil release m_solenoids[17] = false; // Coin Lockout Coil release
if (m_solenoid_features[17][0] != 0xff) if (m_solenoid_features[17][0] != 0xff)
m_samples->start(m_solenoid_features[17][0], m_solenoid_features[17][2]); m_samples->start(m_solenoid_features[17][0], m_solenoid_features[17][2]);
} }
if ((m_u11b & 0x40) && ((data & 0x40)==0)) if ((m_u11b & 0x40) && ((data & 0x40)==0))
{ {
output().set_value("solenoid18", true); // Flipper Enable Relay engage m_solenoids[18] = true; // Flipper Enable Relay engage
if (m_solenoid_features[18][0] != 0xff) if (m_solenoid_features[18][0] != 0xff)
m_samples->start(m_solenoid_features[18][0], m_solenoid_features[18][1]); m_samples->start(m_solenoid_features[18][0], m_solenoid_features[18][1]);
} }
else if ((data & 0x40) && ((m_u11b & 0x40)==0)) else if ((data & 0x40) && ((m_u11b & 0x40)==0))
{ {
output().set_value("solenoid18", false); // Flipper Enable Relay release m_solenoids[18] = false; // Flipper Enable Relay release
if (m_solenoid_features[18][0] != 0xff) if (m_solenoid_features[18][0] != 0xff)
m_samples->start(m_solenoid_features[18][0], m_solenoid_features[18][2]); m_samples->start(m_solenoid_features[18][0], m_solenoid_features[18][2]);
} }
if ((m_u11b & 0x80) && ((data & 0x80)==0)) if ((m_u11b & 0x80) && ((data & 0x80)==0))
{ {
output().set_value("solenoid19", true); m_solenoids[19] = true;
if (m_solenoid_features[19][0] != 0xff) if (m_solenoid_features[19][0] != 0xff)
m_samples->start(m_solenoid_features[19][0], m_solenoid_features[19][1]); m_samples->start(m_solenoid_features[19][0], m_solenoid_features[19][1]);
} }
else if ((data & 0x80) && ((m_u11b & 0x80)==0)) else if ((data & 0x80) && ((m_u11b & 0x80)==0))
{ {
output().set_value("solenoid19", false); m_solenoids[19] = false;
if (m_solenoid_features[19][0] != 0xff) if (m_solenoid_features[19][0] != 0xff)
m_samples->start(m_solenoid_features[19][0], m_solenoid_features[19][2]); m_samples->start(m_solenoid_features[19][0], m_solenoid_features[19][2]);
} }
@ -799,7 +849,7 @@ WRITE8_MEMBER( by35_state::u11_b_w )
m_u11b = data; m_u11b = data;
} }
WRITE8_MEMBER( by35_state::u11_b_as2888_w ) WRITE8_MEMBER( as2888_state::u11_b_as2888_w )
{ {
u11_b_w( space, offset, data ); u11_b_w( space, offset, data );
} }
@ -864,143 +914,106 @@ TIMER_DEVICE_CALLBACK_MEMBER( by35_state::timer_d_pulse )
m_pia_u11->ca1_w(m_u11_ca1); m_pia_u11->ca1_w(m_u11_ca1);
} }
TIMER_DEVICE_CALLBACK_MEMBER( by35_state::timer_s ) TIMER_DEVICE_CALLBACK_MEMBER( as2888_state::timer_s )
{ {
m_snd_tone_gen--; m_snd_tone_gen--;
if ((m_snd_tone_gen == 0) && (m_snd_sel != 0x01)) if ((m_snd_tone_gen == 0) && (m_snd_sel != 0x01))
{ {
address_space &space = m_maincpu->space(AS_PROGRAM);
m_snd_tone_gen = m_snd_sel; m_snd_tone_gen = m_snd_sel;
m_snd_div++; m_snd_div++;
m_discrete->write(space, NODE_04, ((m_snd_div & 0x04)>>2) * 1); m_discrete->write(machine().dummy_space(), NODE_04, BIT(m_snd_div, 2) * 1);
m_discrete->write(space, NODE_01, ((m_snd_div & 0x01)>>0) * 1); m_discrete->write(machine().dummy_space(), NODE_01, BIT(m_snd_div, 0) * 1);
// if (m_snd_sel == 0x01) logerror("SndSel=%02x, Tone=%02x, Div=%02x\n",m_snd_sel, m_snd_tone_gen, m_snd_div); if (m_snd_sel == 0x01) LOG("SndSel=%02x, Tone=%02x, Div=%02x\n",m_snd_sel, m_snd_tone_gen, m_snd_div);
} }
} }
TIMER_DEVICE_CALLBACK_MEMBER( by35_state::timer_as2888 ) TIMER_DEVICE_CALLBACK_MEMBER( as2888_state::timer_as2888 )
{ {
address_space &space = m_maincpu->space(AS_PROGRAM);
offs_t offs = (m_u11b & 0x0f); offs_t offs = (m_u11b & 0x0f);
if ((m_u11a & 0x02) == 0) offs |= 0x10; if ((m_u11a & 0x02) == 0) offs |= 0x10;
{ {
m_snd_sel = m_snd_prom[offs]; m_snd_sel = m_snd_prom[offs];
// logerror("SndSel read %02x from PROM addr %02x\n",m_snd_sel, offs ); LOG("SndSel read %02x from PROM addr %02x\n",m_snd_sel, offs );
m_snd_sel = bitswap<8>(m_snd_sel,0,1,2,3,4,5,6,7); m_snd_sel = bitswap<8>(m_snd_sel,0,1,2,3,4,5,6,7);
m_snd_tone_gen = m_snd_sel; m_snd_tone_gen = m_snd_sel;
// logerror("SndSel=%02x, Tone=%02x, Div=%02x\n",m_snd_sel, m_snd_tone_gen, m_snd_div); LOG("SndSel=%02x, Tone=%02x, Div=%02x\n",m_snd_sel, m_snd_tone_gen, m_snd_div);
} }
m_discrete->write(space, NODE_08, 0); m_discrete->write(machine().dummy_space(), NODE_08, 0);
timer.adjust(attotime::never); timer.adjust(attotime::never);
m_timer_as2888 = false; m_timer_as2888 = false;
// logerror("Sustain off\n"); LOG("Sustain off\n");
} }
DRIVER_INIT_MEMBER( by35_state, by35_6 ) by35_state::solenoid_feature_data const by35_state::s_solenoid_features_default =
{ {
static const uint8_t solenoid_features_default[20][4] = // This table serves two functions and is configured on a per game basis:
{ // Assign a particular sound sample corresponding to a solenoid function, and
// This table serves two functions and is configured on a per game basis: // release any switches being held closed eg. drop targets, ball in saucer/outhole, etc
// Assign a particular sound sample corresponding to a solenoid function, and
// release any switches being held closed eg. drop targets, ball in saucer/outhole, etc
// { Sound Channel, Sound Sample, Switch Strobe, Switch Return Mask } // { Sound Channel, Sound Sample, Switch Strobe, Switch Return Mask }
/*00*/ { 0x00, 0x00, 0x00, 0x00 }, /*00*/ { 0x00, 0x00, 0x00, 0x00 },
/*01*/ { 0x00, 0x00, 0x00, 0x00 }, /*01*/ { 0x00, 0x00, 0x00, 0x00 },
/*02*/ { 0x00, 0x00, 0x00, 0x00 }, /*02*/ { 0x00, 0x00, 0x00, 0x00 },
/*03*/ { 0x00, 0x00, 0x00, 0x00 }, /*03*/ { 0x00, 0x00, 0x00, 0x00 },
/*04*/ { 0x00, 0x00, 0x00, 0x00 }, /*04*/ { 0x00, 0x00, 0x00, 0x00 },
/*05*/ { 0x04, 0x06, 0x00, 0x00 }, // Knocker /*05*/ { 0x04, 0x06, 0x00, 0x00 }, // Knocker
/*06*/ { 0x01, 0x09, 0x00, 0x7f }, // Outhole /*06*/ { 0x01, 0x09, 0x00, 0x7f }, // Outhole
/*07*/ { 0x00, 0x0a, 0x00, 0x00 }, /*07*/ { 0x00, 0x0a, 0x00, 0x00 },
/*08*/ { 0x02, 0x00, 0x00, 0x00 }, /*08*/ { 0x02, 0x00, 0x00, 0x00 },
/*09*/ { 0x02, 0x00, 0x00, 0x00 }, /*09*/ { 0x02, 0x00, 0x00, 0x00 },
/*10*/ { 0x02, 0x00, 0x00, 0x00 }, /*10*/ { 0x02, 0x00, 0x00, 0x00 },
/*11*/ { 0x02, 0x07, 0x00, 0x00 }, /*11*/ { 0x02, 0x07, 0x00, 0x00 },
/*12*/ { 0x00, 0x0b, 0x00, 0x00 }, /*12*/ { 0x00, 0x0b, 0x00, 0x00 },
/*13*/ { 0x02, 0x07, 0x00, 0x00 }, /*13*/ { 0x02, 0x07, 0x00, 0x00 },
/*14*/ { 0x00, 0x00, 0x00, 0x00 }, /*14*/ { 0x00, 0x00, 0x00, 0x00 },
/*15*/ { 0xff, 0xff, 0x00, 0x00 }, // None - all momentary solenoids off /*15*/ { 0xff, 0xff, 0x00, 0x00 }, // None - all momentary solenoids off
// { Sound Channel, Sound engage, Sound release, Not Used } // { Sound Channel, Sound engage, Sound release, Not Used }
/*16*/ { 0xff, 0xff, 0xff, 0x00 }, /*16*/ { 0xff, 0xff, 0xff, 0x00 },
/*17*/ { 0x00, 0x0c, 0x0d, 0x00 }, // Coin Lockout coil /*17*/ { 0x00, 0x0c, 0x0d, 0x00 }, // Coin Lockout coil
/*18*/ { 0x00, 0x0e, 0x0f, 0x00 }, // Flipper enable relay /*18*/ { 0x00, 0x0e, 0x0f, 0x00 }, // Flipper enable relay
/*19*/ { 0xff, 0xff, 0xff, 0x00 } /*19*/ { 0xff, 0xff, 0xff, 0x00 }
}; };
for (int i=0; i<20; i++) by35_state::solenoid_feature_data const playboy_state::s_solenoid_features_playboy =
{
for (int j=0; j<4; j++)
m_solenoid_features[i][j] = solenoid_features_default[i][j];
}
m_7d = 0;
}
DRIVER_INIT_MEMBER( by35_state, playboy )
{ {
static const uint8_t solenoid_features_playboy[20][4] = // { Sound Channel, Sound Sample, Switch Strobe, Switch Return Mask }
{ /*00*/ { 0xff, 0xff, 0x00, 0x00 },
// { Sound Channel, Sound Sample, Switch Strobe, Switch Return Mask } /*01*/ { 0xff, 0xff, 0x00, 0x00 },
/*00*/ { 0xff, 0xff, 0x00, 0x00 }, /*02*/ { 0xff, 0xff, 0x00, 0x00 },
/*01*/ { 0xff, 0xff, 0x00, 0x00 }, /*03*/ { 0xff, 0xff, 0x00, 0x00 },
/*02*/ { 0xff, 0xff, 0x00, 0x00 }, /*04*/ { 0xff, 0xff, 0x00, 0x00 },
/*03*/ { 0xff, 0xff, 0x00, 0x00 }, /*05*/ { 0x04, 0x06, 0x00, 0x00 }, // Knocker
/*04*/ { 0xff, 0xff, 0x00, 0x00 }, /*06*/ { 0x01, 0x09, 0x00, 0x7f }, // Outhole
/*05*/ { 0x04, 0x06, 0x00, 0x00 }, // Knocker /*07*/ { 0x02, 0x0a, 0x03, 0x7f }, // Kickback Grotto
/*06*/ { 0x01, 0x09, 0x00, 0x7f }, // Outhole /*08*/ { 0x02, 0x00, 0x00, 0x00 }, // Pop Bumper Left
/*07*/ { 0x02, 0x0a, 0x03, 0x7f }, // Kickback Grotto /*09*/ { 0x02, 0x00, 0x00, 0x00 }, // Pop Bumper Right
/*08*/ { 0x02, 0x00, 0x00, 0x00 }, // Pop Bumper Left /*10*/ { 0x02, 0x00, 0x00, 0x00 }, // Pop Bumper Bottom
/*09*/ { 0x02, 0x00, 0x00, 0x00 }, // Pop Bumper Right /*11*/ { 0x02, 0x07, 0x00, 0x00 }, // Slingshot Left
/*10*/ { 0x02, 0x00, 0x00, 0x00 }, // Pop Bumper Bottom /*12*/ { 0x03, 0x0b, 0x00, 0xe0 }, // Drop Target Reset
/*11*/ { 0x02, 0x07, 0x00, 0x00 }, // Slingshot Left /*13*/ { 0x02, 0x07, 0x00, 0x00 }, // Slingshot Right
/*12*/ { 0x03, 0x0b, 0x00, 0xe0 }, // Drop Target Reset /*14*/ { 0xff, 0xff, 0x00, 0x00 },
/*13*/ { 0x02, 0x07, 0x00, 0x00 }, // Slingshot Right /*15*/ { 0xff, 0xff, 0x00, 0x00 }, // None - all momentary solenoids off
/*14*/ { 0xff, 0xff, 0x00, 0x00 }, // { Sound Channel, Sound engage, Sound release, Not Used }
/*15*/ { 0xff, 0xff, 0x00, 0x00 }, // None - all momentary solenoids off /*16*/ { 0xff, 0xff, 0xff, 0x00 },
// { Sound Channel, Sound engage, Sound release, Not Used } /*17*/ { 0x00, 0x0c, 0x0d, 0x00 }, // Coin Lockout coil
/*16*/ { 0xff, 0xff, 0xff, 0x00 }, /*18*/ { 0x00, 0x0e, 0x0f, 0x00 }, // Flipper enable relay
/*17*/ { 0x00, 0x0c, 0x0d, 0x00 }, // Coin Lockout coil /*19*/ { 0xff, 0xff, 0xff, 0x00 }
/*18*/ { 0x00, 0x0e, 0x0f, 0x00 }, // Flipper enable relay };
/*19*/ { 0xff, 0xff, 0xff, 0x00 }
};
DRIVER_INIT_CALL( by35_6 ); void by35_state::machine_reset()
for (int i=0; i<20; i++)
{
for (int j=0; j<4; j++)
m_solenoid_features[i][j] = solenoid_features_playboy[i][j];
}
m_7d = 0;
}
DRIVER_INIT_MEMBER( by35_state, by35_7 )
{ {
DRIVER_INIT_CALL(by35_6); genpin_class::machine_reset();
m_7d = 1;
}
MACHINE_RESET_MEMBER( by35_state, by35 )
{
render_target *target = machine().render().first_target(); render_target *target = machine().render().first_target();
target->set_view(0); target->set_view(0);
@ -1014,12 +1027,6 @@ MACHINE_RESET_MEMBER( by35_state, by35 )
m_io_hold_x[1] = m_io_hold_x[2] = m_io_hold_x[3] = m_io_hold_x[4] = m_io_hold_x[5] = 0; m_io_hold_x[1] = m_io_hold_x[2] = m_io_hold_x[3] = m_io_hold_x[4] = m_io_hold_x[5] = 0;
} }
MACHINE_START_MEMBER( by35_state, as2888 )
{
MACHINE_RESET_CALL_MEMBER( by35 );
m_snd_prom = memregion("sound1")->base();
}
static const discrete_mixer_desc as2888_digital_mixer_info = static const discrete_mixer_desc as2888_digital_mixer_info =
{ {
DISC_MIXER_IS_RESISTOR, /* type */ DISC_MIXER_IS_RESISTOR, /* type */
@ -1086,8 +1093,6 @@ MACHINE_CONFIG_START(by35_state::by35)
MCFG_CPU_ADD("maincpu", M6800, 530000) // No xtal, just 2 chips forming a multivibrator oscillator around 530KHz MCFG_CPU_ADD("maincpu", M6800, 530000) // No xtal, just 2 chips forming a multivibrator oscillator around 530KHz
MCFG_CPU_PROGRAM_MAP(by35_map) MCFG_CPU_PROGRAM_MAP(by35_map)
MCFG_MACHINE_RESET_OVERRIDE( by35_state, by35 )
MCFG_NVRAM_ADD_0FILL("nvram") // 'F' filled causes Credit Display to be blank on first startup MCFG_NVRAM_ADD_0FILL("nvram") // 'F' filled causes Credit Display to be blank on first startup
/* Video */ /* Video */
@ -1125,27 +1130,23 @@ MACHINE_CONFIG_START(by35_state::by35)
MCFG_TIMER_DRIVER_ADD("timer_d_pulse", by35_state, timer_d_pulse) // 555 Active pulse length MCFG_TIMER_DRIVER_ADD("timer_d_pulse", by35_state, timer_d_pulse) // 555 Active pulse length
MACHINE_CONFIG_END MACHINE_CONFIG_END
MACHINE_CONFIG_START(by35_state::as2888_audio) MACHINE_CONFIG_START(as2888_state::as2888_audio)
MCFG_MACHINE_START_OVERRIDE( by35_state, as2888 )
MCFG_SPEAKER_STANDARD_MONO("mono") MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("discrete", DISCRETE, 0) MCFG_SOUND_ADD("discrete", DISCRETE, 0)
MCFG_DISCRETE_INTF(as2888) MCFG_DISCRETE_INTF(as2888)
MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00)
MCFG_DEVICE_MODIFY("pia_u11") MCFG_DEVICE_MODIFY("pia_u11")
MCFG_PIA_WRITEPB_HANDLER(WRITE8(by35_state, u11_b_as2888_w)) MCFG_PIA_WRITEPB_HANDLER(WRITE8(as2888_state, u11_b_as2888_w))
MCFG_PIA_CB2_HANDLER(WRITELINE(by35_state, u11_cb2_as2888_w)) MCFG_PIA_CB2_HANDLER(WRITELINE(as2888_state, u11_cb2_as2888_w))
MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_s_freq", by35_state, timer_s, attotime::from_hz(353000)) // Inverter clock on AS-2888 sound board MCFG_TIMER_DRIVER_ADD_PERIODIC("timer_s_freq", as2888_state, timer_s, attotime::from_hz(353000)) // Inverter clock on AS-2888 sound board
MCFG_TIMER_DRIVER_ADD("timer_as2888", by35_state, timer_as2888) MCFG_TIMER_DRIVER_ADD("timer_as2888", as2888_state, timer_as2888)
MACHINE_CONFIG_END MACHINE_CONFIG_END
MACHINE_CONFIG_START(by35_state::as2888) MACHINE_CONFIG_START(as2888_state::as2888)
by35(config); by35(config);
as2888_audio(config); as2888_audio(config);
MACHINE_CONFIG_END MACHINE_CONFIG_END
@ -2414,16 +2415,16 @@ ROM_START(suprbowl)
ROM_END ROM_END
// AS-2888 sound // AS-2888 sound
GAME( 1979, sst, 0, as2888, by35, by35_state, by35_6, ROT0, "Bally", "Supersonic", MACHINE_IS_SKELETON_MECHANICAL) GAME( 1979, sst, 0, as2888, by35, as2888_state, by35_6, ROT0, "Bally", "Supersonic", MACHINE_IS_SKELETON_MECHANICAL)
GAMEL(1978, playboy, 0, as2888, playboy, by35_state, playboy, ROT0, "Bally", "Playboy", MACHINE_MECHANICAL | MACHINE_NOT_WORKING, layout_by35_playboy) GAMEL(1978, playboy, 0, as2888, playboy, playboy_state, by35_6, ROT0, "Bally", "Playboy", MACHINE_MECHANICAL | MACHINE_NOT_WORKING, layout_by35_playboy)
GAME( 1978, lostwrlp, 0, as2888, by35, by35_state, by35_6, ROT0, "Bally", "Lost World", MACHINE_IS_SKELETON_MECHANICAL) GAME( 1978, lostwrlp, 0, as2888, by35, as2888_state, by35_6, ROT0, "Bally", "Lost World", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1978, smman, 0, as2888, by35, by35_state, by35_6, ROT0, "Bally", "Six Million Dollar Man", MACHINE_IS_SKELETON_MECHANICAL) GAME( 1978, smman, 0, as2888, by35, as2888_state, by35_6, ROT0, "Bally", "Six Million Dollar Man", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1978, voltan, 0, as2888, by35, by35_state, by35_6, ROT0, "Bally", "Voltan Escapes Cosmic Doom", MACHINE_IS_SKELETON_MECHANICAL) GAME( 1978, voltan, 0, as2888, by35, as2888_state, by35_6, ROT0, "Bally", "Voltan Escapes Cosmic Doom", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1979, startrep, 0, as2888, by35, by35_state, by35_6, ROT0, "Bally", "Star Trek (Pinball)", MACHINE_IS_SKELETON_MECHANICAL) GAME( 1979, startrep, 0, as2888, by35, as2888_state, by35_6, ROT0, "Bally", "Star Trek (Pinball)", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1979, kiss, 0, as2888, by35, by35_state, by35_6, ROT0, "Bally", "Kiss", MACHINE_IS_SKELETON_MECHANICAL) GAME( 1979, kiss, 0, as2888, by35, as2888_state, by35_6, ROT0, "Bally", "Kiss", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1979, hglbtrtr, 0, as2888, by35, by35_state, by35_6, ROT0, "Bally", "Harlem Globetrotters On Tour", MACHINE_IS_SKELETON_MECHANICAL) GAME( 1979, hglbtrtr, 0, as2888, by35, as2888_state, by35_6, ROT0, "Bally", "Harlem Globetrotters On Tour", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1979, dollyptn, 0, as2888, by35, by35_state, by35_6, ROT0, "Bally", "Dolly Parton", MACHINE_IS_SKELETON_MECHANICAL) GAME( 1979, dollyptn, 0, as2888, by35, as2888_state, by35_6, ROT0, "Bally", "Dolly Parton", MACHINE_IS_SKELETON_MECHANICAL)
GAME( 1979, paragon, 0, as2888, by35, by35_state, by35_6, ROT0, "Bally", "Paragon", MACHINE_IS_SKELETON_MECHANICAL) GAME( 1979, paragon, 0, as2888, by35, as2888_state, by35_6, ROT0, "Bally", "Paragon", MACHINE_IS_SKELETON_MECHANICAL)
// AS-3022 sound // AS-3022 sound
GAME( 1980, ngndshkr, 0, by35, by35, by35_state, by35_6, ROT0, "Bally", "Nitro Ground Shaker", MACHINE_IS_SKELETON_MECHANICAL) GAME( 1980, ngndshkr, 0, by35, by35, by35_state, by35_6, ROT0, "Bally", "Nitro Ground Shaker", MACHINE_IS_SKELETON_MECHANICAL)