diff --git a/.gitattributes b/.gitattributes index f178a9f51ea..175000de3a9 100644 --- a/.gitattributes +++ b/.gitattributes @@ -4447,6 +4447,7 @@ src/mame/layout/s3.lay svneol=native#text/plain src/mame/layout/s4.lay svneol=native#text/plain src/mame/layout/s6.lay svneol=native#text/plain src/mame/layout/s6a.lay svneol=native#text/plain +src/mame/layout/s8.lay svneol=native#text/plain src/mame/layout/saiyukip.lay svneol=native#text/plain src/mame/layout/sbrkout.lay svneol=native#text/plain src/mame/layout/sc1_vfd.lay svneol=native#text/plain diff --git a/src/mame/drivers/s3.c b/src/mame/drivers/s3.c index 6ad3965319e..e8611714fb9 100644 --- a/src/mame/drivers/s3.c +++ b/src/mame/drivers/s3.c @@ -282,14 +282,14 @@ WRITE8_MEMBER( s3_state::sol1_w ) { if (BIT(data, 0)) m_samples->start(1, 1); // 10 chime - //else + if (BIT(data, 1)) m_samples->start(2, 2); // 100 chime - //else + if (BIT(data, 2)) m_samples->start(3, 3); // 1000 chime + // we don't have a 10k chime in samples yet - //else //if (BIT(data, 3)) //m_samples->start(1, x); // 10k chime } diff --git a/src/mame/drivers/s4.c b/src/mame/drivers/s4.c index f4ba794e534..3d8881137ac 100644 --- a/src/mame/drivers/s4.c +++ b/src/mame/drivers/s4.c @@ -6,7 +6,7 @@ No schematics have been located as yet. Phoenix and Pokerino are listed as System 4 systems, but use System 3 roms. - They have been moved to s4.c, and are working there. + They have been moved to s3.c, and are working there. Only Flash and Stellar Wars are pinball machines. The remainder are so-called "Shuffle", which is a flat board with an air-driven puck and 10 bowling pins. diff --git a/src/mame/drivers/s8.c b/src/mame/drivers/s8.c index 8d144e1837b..01b8a0d345c 100644 --- a/src/mame/drivers/s8.c +++ b/src/mame/drivers/s8.c @@ -3,77 +3,537 @@ Pinball Williams System 8 + Only 2 games used this system. + + - Pennant Fever, which isn't a true pinball, it is a baseball game where you aim + for targets at the top of the playfield, and the players advance towards a + home run. There are no bumpers or other 'usual' pinball items. + + - Still Crazy, a novelty game where the playfield is completely vertical. It has + 4 flippers and the idea is to get the ball up to the alcohol 'still' before + the 'revenuers' do. The idea didn't catch on, and the game was not officially + released. + +ToDo: +- Everything +- Identify devices at 200x and 210x +- Pennant Fever maincpu goes into lala-land after a rti. + ************************************************************************************/ -#include "emu.h" +#include "machine/genpin.h" #include "cpu/m6800/m6800.h" +#include "machine/6821pia.h" +#include "sound/dac.h" +#include "s8.lh" -class williams_s8_state : public driver_device + +class s8_state : public genpin_class { public: - williams_s8_state(const machine_config &mconfig, device_type type, const char *tag) - : driver_device(mconfig, type, tag), - m_maincpu(*this, "maincpu") + s8_state(const machine_config &mconfig, device_type type, const char *tag) + : genpin_class(mconfig, type, tag), + m_maincpu(*this, "maincpu"), + m_audiocpu(*this, "audiocpu"), + m_dac(*this, "dac"), + m_pia0(*this, "pia0"), + m_pia1(*this, "pia1"), + m_pia2(*this, "pia2"), + m_pia3(*this, "pia3"), + m_pia4(*this, "pia4") { } + DECLARE_READ8_MEMBER(dac_r); + DECLARE_WRITE8_MEMBER(dac_w); + DECLARE_WRITE8_MEMBER(dig0_w); + DECLARE_WRITE8_MEMBER(dig1_w); + DECLARE_WRITE8_MEMBER(lamp0_w); + DECLARE_WRITE8_MEMBER(lamp1_w); + DECLARE_WRITE8_MEMBER(sol0_w); + DECLARE_WRITE8_MEMBER(sol1_w); + DECLARE_READ8_MEMBER(dips_r); + DECLARE_READ8_MEMBER(switch_r); + DECLARE_WRITE8_MEMBER(switch_w); + DECLARE_READ_LINE_MEMBER(pia2_ca1_r); + DECLARE_READ_LINE_MEMBER(pia2_cb1_r); + DECLARE_READ_LINE_MEMBER(pia4_cb1_r); + DECLARE_WRITE_LINE_MEMBER(pia0_ca2_w) { }; //ST5 + DECLARE_WRITE_LINE_MEMBER(pia0_cb2_w) { }; //ST-solenoids enable + DECLARE_WRITE_LINE_MEMBER(pia1_ca2_w) { }; //ST2 + DECLARE_WRITE_LINE_MEMBER(pia1_cb2_w) { }; //ST1 + DECLARE_WRITE_LINE_MEMBER(pia2_ca2_w) { }; //diag leds enable + DECLARE_WRITE_LINE_MEMBER(pia2_cb2_w) { }; //ST6 + DECLARE_WRITE_LINE_MEMBER(pia3_ca2_w) { }; //ST4 + DECLARE_WRITE_LINE_MEMBER(pia3_cb2_w) { }; //ST3 + TIMER_DEVICE_CALLBACK_MEMBER(irq); + DECLARE_INPUT_CHANGED_MEMBER(main_nmi); + DECLARE_INPUT_CHANGED_MEMBER(audio_nmi); + DECLARE_MACHINE_RESET(s8); + DECLARE_MACHINE_RESET(s8a); protected: // devices required_device m_maincpu; - - // driver_device overrides - virtual void machine_reset(); -public: - DECLARE_DRIVER_INIT(williams_s8); + optional_device m_audiocpu; + optional_device m_dac; + required_device m_pia0; + required_device m_pia1; + required_device m_pia2; + required_device m_pia3; + optional_device m_pia4; +private: + UINT8 m_t_c; + UINT8 m_sound_data; + UINT8 m_strobe; + UINT8 m_kbdrow; + bool m_cb1; + bool m_data_ok; + bool m_chimes; }; - -static ADDRESS_MAP_START( williams_s8_map, AS_PROGRAM, 8, williams_s8_state ) +static ADDRESS_MAP_START( s8_main_map, AS_PROGRAM, 8, s8_state ) ADDRESS_MAP_GLOBAL_MASK(0x7fff) AM_RANGE(0x0000, 0x07ff) AM_RAM - //AM_RANGE(0x2100, 0x2103) AM_WRITE - //AM_RANGE(0x2200, 0x2200) AM_WRITE - //AM_RANGE(0x2400, 0x2403) AM_WRITE - //AM_RANGE(0x2800, 0x2803) AM_WRITE - //AM_RANGE(0x3000, 0x3003) AM_WRITE - AM_RANGE(0x5000, 0x7fff) AM_ROM + //AM_RANGE(0x0100, 0x01ff) AM_RAM AM_SHARE("nvram") + AM_RANGE(0x2200, 0x2203) AM_DEVREADWRITE("pia0", pia6821_device, read, write) // solenoids + AM_RANGE(0x2400, 0x2403) AM_DEVREADWRITE("pia1", pia6821_device, read, write) // lamps + AM_RANGE(0x2800, 0x2803) AM_DEVREADWRITE("pia2", pia6821_device, read, write) // display + AM_RANGE(0x3000, 0x3003) AM_DEVREADWRITE("pia3", pia6821_device, read, write) // inputs + AM_RANGE(0x6000, 0x7fff) AM_ROM ADDRESS_MAP_END -static ADDRESS_MAP_START( williams_s8_sub_map, AS_PROGRAM, 8, williams_s8_state ) +static ADDRESS_MAP_START( s8_audio_map, AS_PROGRAM, 8, s8_state ) AM_RANGE(0x0000, 0x00ff) AM_RAM - //AM_RANGE(0x4000, 0x4003) AM_WRITE + AM_RANGE(0x4000, 0x4003) AM_MIRROR(0x8000) AM_DEVREADWRITE("pia4", pia6821_device, read, write) // sounds AM_RANGE(0x8000, 0xffff) AM_ROM ADDRESS_MAP_END -static INPUT_PORTS_START( williams_s8 ) +static INPUT_PORTS_START( s8 ) + PORT_START("X0") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_Q) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_W) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_E) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_R) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_Y) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_U) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_I) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_O) + + PORT_START("X1") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_TILT ) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_START ) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_COIN3 ) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_COIN2 ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_COIN1 ) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) + + PORT_START("X2") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_A) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_S) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_D) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_F) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_G) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_H) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_J) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_K) + + PORT_START("X4") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_L) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_Z) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_C) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_V) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_B) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_N) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_M) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_COMMA) + + PORT_START("X8") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_STOP) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_SLASH) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_COLON) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_QUOTE) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_X) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_MINUS) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_EQUALS) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_BACKSPACE) + + PORT_START("X10") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_OPENBRACE) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_CLOSEBRACE) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_BACKSLASH) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_ENTER) + PORT_BIT( 0x10, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_LEFT) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_RIGHT) + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_UP) + PORT_BIT( 0x80, IP_ACTIVE_LOW, IPT_OTHER ) PORT_CODE(KEYCODE_DOWN) + + PORT_START("X20") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("X40") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("X80") + PORT_BIT( 0xff, IP_ACTIVE_LOW, IPT_UNKNOWN ) + + PORT_START("SND") + PORT_BIT( 0x9f, IP_ACTIVE_LOW, IPT_UNUSED ) + PORT_BIT( 0x20, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Music1") PORT_CODE(KEYCODE_3) PORT_TOGGLE + PORT_BIT( 0x40, IP_ACTIVE_LOW, IPT_OTHER ) PORT_NAME("Music2") PORT_CODE(KEYCODE_4) PORT_TOGGLE + + PORT_START("DIAGS") + PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Audio Diag") PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, s8_state, audio_nmi, 1) + PORT_BIT( 0x02, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Main Diag") PORT_CODE(KEYCODE_F2) PORT_CHANGED_MEMBER(DEVICE_SELF, s8_state, main_nmi, 1) + PORT_BIT( 0x04, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Advance") PORT_CODE(KEYCODE_0) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Manual/Auto") PORT_CODE(KEYCODE_9) + PORT_BIT( 0x10, IP_ACTIVE_HIGH, IPT_OTHER) PORT_NAME("Enter") PORT_CODE(KEYCODE_8) + + PORT_START("DSW0") + PORT_DIPNAME( 0x01, 0x01, "SW01" ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPNAME( 0x02, 0x02, "SW02" ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPNAME( 0x04, 0x04, "SW03" ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPNAME( 0x08, 0x08, "SW04" ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPNAME( 0x10, 0x10, "SW05" ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPNAME( 0x20, 0x20, "SW06" ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPNAME( 0x40, 0x40, "SW07" ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPNAME( 0x80, 0x80, "SW08" ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) + + PORT_START("DSW1") + PORT_DIPNAME( 0x01, 0x01, "SW11" ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPSETTING( 0x01, DEF_STR( Off ) ) + PORT_DIPNAME( 0x02, 0x02, "SW12" ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPSETTING( 0x02, DEF_STR( Off ) ) + PORT_DIPNAME( 0x04, 0x04, "SW13" ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPSETTING( 0x04, DEF_STR( Off ) ) + PORT_DIPNAME( 0x08, 0x08, "SW14" ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPSETTING( 0x08, DEF_STR( Off ) ) + PORT_DIPNAME( 0x10, 0x10, "SW15" ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPSETTING( 0x10, DEF_STR( Off ) ) + PORT_DIPNAME( 0x20, 0x20, "SW16" ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPSETTING( 0x20, DEF_STR( Off ) ) + PORT_DIPNAME( 0x40, 0x40, "SW17" ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPSETTING( 0x40, DEF_STR( Off ) ) + PORT_DIPNAME( 0x80, 0x80, "SW18" ) + PORT_DIPSETTING( 0x00, DEF_STR( On ) ) + PORT_DIPSETTING( 0x80, DEF_STR( Off ) ) INPUT_PORTS_END -void williams_s8_state::machine_reset() +MACHINE_RESET_MEMBER( s8_state, s8 ) +{ + m_t_c = 0; + m_chimes = 1; +} + +MACHINE_RESET_MEMBER( s8_state, s8a ) +{ + m_t_c = 0; + m_chimes = 0; +} + +INPUT_CHANGED_MEMBER( s8_state::main_nmi ) +{ + // Diagnostic button sends a pulse to NMI pin + if (newval==CLEAR_LINE) + m_maincpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); +} + +INPUT_CHANGED_MEMBER( s8_state::audio_nmi ) +{ + // Diagnostic button sends a pulse to NMI pin + if ((newval==CLEAR_LINE) && !m_chimes) + m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); +} + +WRITE8_MEMBER( s8_state::sol0_w ) +{ + if (BIT(data, 4)) + m_samples->start(2, 5); // outhole +} + +WRITE8_MEMBER( s8_state::sol1_w ) +{ + if (m_chimes) + { + if (BIT(data, 0)) + m_samples->start(1, 1); // 10 chime + + if (BIT(data, 1)) + m_samples->start(2, 2); // 100 chime + + if (BIT(data, 2)) + m_samples->start(3, 3); // 1000 chime + + // we don't have a 10k chime in samples yet + //if (BIT(data, 3)) + //m_samples->start(1, x); // 10k chime + } + else + {printf("%X ",data); + m_sound_data = ioport("SND")->read(); + if (BIT(data, 0)) + m_sound_data &= 0xfe; + + if (BIT(data, 1)) + m_sound_data &= 0xfd; + + if (BIT(data, 2)) + m_sound_data &= 0xfb; + + if (BIT(data, 3)) + m_sound_data &= 0xf7; + + if (BIT(data, 4)) + m_sound_data &= 0x7f; + + m_cb1 = ((m_sound_data & 0x7f) != 0x7f); + + m_pia4->cb1_w(m_cb1); + } + + if (BIT(data, 5)) + m_samples->start(0, 6); // knocker +} + +static const pia6821_interface pia0_intf = +{ + DEVCB_NULL, /* port A in */ + DEVCB_NULL, /* port B in */ + DEVCB_LINE_GND, /* line CA1 in */ + DEVCB_LINE_GND, /* line CB1 in */ + DEVCB_NULL, /* line CA2 in */ + DEVCB_NULL, /* line CB2 in */ + DEVCB_DRIVER_MEMBER(s8_state, sol0_w), /* port A out */ + DEVCB_DRIVER_MEMBER(s8_state, sol1_w), /* port B out */ + DEVCB_DRIVER_LINE_MEMBER(s8_state, pia0_ca2_w), /* line CA2 out */ + DEVCB_DRIVER_LINE_MEMBER(s8_state, pia0_cb2_w), /* line CB2 out */ + DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */ + DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */ +}; + +WRITE8_MEMBER( s8_state::lamp0_w ) +{ + m_maincpu->set_input_line(M6800_IRQ_LINE, CLEAR_LINE); +} + +WRITE8_MEMBER( s8_state::lamp1_w ) { } -DRIVER_INIT_MEMBER(williams_s8_state,williams_s8) +static const pia6821_interface pia1_intf = { + DEVCB_NULL, /* port A in */ + DEVCB_NULL, /* port B in */ + DEVCB_LINE_GND, /* line CA1 in */ + DEVCB_LINE_GND, /* line CB1 in */ + DEVCB_NULL, /* line CA2 in */ + DEVCB_NULL, /* line CB2 in */ + DEVCB_DRIVER_MEMBER(s8_state, lamp0_w), /* port A out */ + DEVCB_DRIVER_MEMBER(s8_state, lamp1_w), /* port B out */ + DEVCB_DRIVER_LINE_MEMBER(s8_state, pia1_ca2_w), /* line CA2 out */ + DEVCB_DRIVER_LINE_MEMBER(s8_state, pia1_cb2_w), /* line CB2 out */ + DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */ + DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */ +}; + +READ_LINE_MEMBER( s8_state::pia2_ca1_r ) +{ + return BIT(ioport("DIAGS")->read(), 2); // advance button } -static MACHINE_CONFIG_START( williams_s8, williams_s8_state ) +READ_LINE_MEMBER( s8_state::pia2_cb1_r ) +{ + return BIT(ioport("DIAGS")->read(), 3); // auto/manual switch +} + +READ8_MEMBER( s8_state::dips_r ) +{ + if (BIT(ioport("DIAGS")->read(), 4) ) + { + switch (m_strobe) + { + case 0: + return ioport("DSW0")->read() & 15; + break; + case 1: + return ioport("DSW0")->read() << 4; + break; + case 2: + return ioport("DSW1")->read() & 15; + break; + case 3: + return ioport("DSW1")->read() << 4; + break; + } + } + return 0xff; +} + +WRITE8_MEMBER( s8_state::dig0_w ) +{ + m_strobe = data & 15; + m_data_ok = true; + output_set_value("led0", BIT(data, 4)); + output_set_value("led1", BIT(data, 5)); +} + +WRITE8_MEMBER( s8_state::dig1_w ) +{ + static const UINT8 patterns[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67, 0, 0, 0, 0, 0, 0 }; // MC14558 + if (m_data_ok) + { + output_set_digit_value(m_strobe+16, patterns[data&15]); + output_set_digit_value(m_strobe, patterns[data>>4]); + } + m_data_ok = false; +} + +static const pia6821_interface pia2_intf = +{ + DEVCB_DRIVER_MEMBER(s8_state, dips_r), /* port A in */ + DEVCB_NULL, /* port B in */ + DEVCB_DRIVER_LINE_MEMBER(s8_state, pia2_ca1_r), /* line CA1 in */ + DEVCB_DRIVER_LINE_MEMBER(s8_state, pia2_cb1_r), /* line CB1 in */ + DEVCB_NULL, /* line CA2 in */ + DEVCB_NULL, /* line CB2 in */ + DEVCB_DRIVER_MEMBER(s8_state, dig0_w), /* port A out */ + DEVCB_DRIVER_MEMBER(s8_state, dig1_w), /* port B out */ + DEVCB_DRIVER_LINE_MEMBER(s8_state, pia2_ca2_w), /* line CA2 out */ + DEVCB_DRIVER_LINE_MEMBER(s8_state, pia2_cb2_w), /* line CB2 out */ + DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */ + DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */ +}; + +READ8_MEMBER( s8_state::switch_r ) +{ + char kbdrow[8]; + sprintf(kbdrow,"X%X",m_kbdrow); + return ioport(kbdrow)->read(); +} + +WRITE8_MEMBER( s8_state::switch_w ) +{ + m_kbdrow = data; +} + +static const pia6821_interface pia3_intf = +{ + DEVCB_DRIVER_MEMBER(s8_state, switch_r), /* port A in */ + DEVCB_NULL, /* port B in */ + DEVCB_LINE_GND, /* line CA1 in */ + DEVCB_LINE_GND, /* line CB1 in */ + DEVCB_NULL, /* line CA2 in */ + DEVCB_NULL, /* line CB2 in */ + DEVCB_NULL, /* port A out */ + DEVCB_DRIVER_MEMBER(s8_state, switch_w), /* port B out */ + DEVCB_DRIVER_LINE_MEMBER(s8_state, pia3_ca2_w), /* line CA2 out */ + DEVCB_DRIVER_LINE_MEMBER(s8_state, pia3_cb2_w), /* line CB2 out */ + DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */ + DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */ +}; + +READ_LINE_MEMBER( s8_state::pia4_cb1_r ) +{ + return m_cb1; +} + +READ8_MEMBER( s8_state::dac_r ) +{printf("%X ",m_sound_data); + return m_sound_data; +} + +WRITE8_MEMBER( s8_state::dac_w ) +{ + m_dac->write_unsigned8(data); +} + +static const pia6821_interface pia4_intf = +{ + DEVCB_NULL, /* port A in */ + DEVCB_DRIVER_MEMBER(s8_state, dac_r), /* port B in */ + DEVCB_NULL, /* line CA1 in */ + DEVCB_DRIVER_LINE_MEMBER(s8_state, pia4_cb1_r), /* line CB1 in */ + DEVCB_NULL, /* line CA2 in */ + DEVCB_NULL, /* line CB2 in */ + DEVCB_DRIVER_MEMBER(s8_state, dac_w), /* port A out */ + DEVCB_NULL, /* port B out */ + DEVCB_NULL, /* line CA2 out */ + DEVCB_NULL, /* line CB2 out */ + DEVCB_CPU_INPUT_LINE("audiocpu", M6800_IRQ_LINE), /* IRQA */ + DEVCB_CPU_INPUT_LINE("audiocpu", M6800_IRQ_LINE) /* IRQB */ +}; + +TIMER_DEVICE_CALLBACK_MEMBER( s8_state::irq) +{ + if (m_t_c > 0x70) + m_maincpu->set_input_line(M6800_IRQ_LINE, ASSERT_LINE); + else + m_t_c++; +} + +static MACHINE_CONFIG_START( s8, s8_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", M6800, 1000000) - MCFG_CPU_PROGRAM_MAP(williams_s8_map) - MCFG_CPU_ADD("cpu2", M6800, 1000000) - MCFG_CPU_PROGRAM_MAP(williams_s8_sub_map) + MCFG_CPU_ADD("maincpu", M6802, 4000000) + MCFG_CPU_PROGRAM_MAP(s8_main_map) + MCFG_TIMER_DRIVER_ADD_PERIODIC("irq", s8_state, irq, attotime::from_hz(1000)) + MCFG_MACHINE_RESET_OVERRIDE(s8_state, s8) + + /* Video */ + MCFG_DEFAULT_LAYOUT(layout_s8) + + /* Sound */ + MCFG_FRAGMENT_ADD( genpin_audio ) + + /* Devices */ + MCFG_PIA6821_ADD("pia0", pia0_intf) + MCFG_PIA6821_ADD("pia1", pia1_intf) + MCFG_PIA6821_ADD("pia2", pia2_intf) + MCFG_PIA6821_ADD("pia3", pia3_intf) + //MCFG_NVRAM_ADD_1FILL("nvram") + /* Add the soundcard */ + MCFG_CPU_ADD("audiocpu", M6808, 3580000) + MCFG_CPU_PROGRAM_MAP(s8_audio_map) + MCFG_MACHINE_RESET_OVERRIDE(s8_state, s8a) + MCFG_SPEAKER_STANDARD_MONO("mono") + MCFG_SOUND_ADD("dac", DAC, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "mono", 1.00) + MCFG_PIA6821_ADD("pia4", pia4_intf) MACHINE_CONFIG_END -/*-------------------- -/ Pennant Fever (#526) -/--------------------*/ +/*------------------------------ +/ Pennant Fever (#526) 05/1984 +/-------------------------------*/ ROM_START(pfevr_l2) ROM_REGION(0x10000, "maincpu", 0) ROM_LOAD("pf-rom1.u19", 0x5000, 0x1000, CRC(00be42bd) SHA1(72ca21c96e3ffa3c43499165f3339b669c8e94a5)) ROM_LOAD("pf-rom2.u20", 0x6000, 0x2000, CRC(7b101534) SHA1(21e886d5872104d71bb528b9affb12230268597a)) - ROM_REGION(0x10000, "cpu2", 0) + ROM_REGION(0x10000, "audiocpu", 0) ROM_LOAD("cpu_u49.128", 0xc000, 0x4000, CRC(b0161712) SHA1(5850f1f1f11e3ac9b9629cff2b26c4ad32436b55)) ROM_RELOAD(0x8000, 0x4000) ROM_END @@ -83,23 +543,23 @@ ROM_START(pfevr_p3) ROM_LOAD("cpu_u19.732", 0x5000, 0x1000, CRC(03796c6d) SHA1(38c95fcce9d0f357a74f041f0df006b9c6f6efc7)) ROM_LOAD("cpu_u20.764", 0x6000, 0x2000, CRC(3a3acb39) SHA1(7844cc30a9486f718a556850fc9cef3be82f26b7)) - ROM_REGION(0x10000, "cpu2", 0) + ROM_REGION(0x10000, "audiocpu", 0) ROM_LOAD("cpu_u49.128", 0xc000, 0x4000, CRC(b0161712) SHA1(5850f1f1f11e3ac9b9629cff2b26c4ad32436b55)) ROM_RELOAD(0x8000, 0x4000) ROM_END -/*-------------------- -/ Still Crazy -/--------------------*/ +/*---------------------------- +/ Still Crazy (#534) 06/1984 +/-----------------------------*/ ROM_START(stillcra) ROM_REGION(0x10000, "maincpu", 0) ROM_LOAD("ic20.bin", 0x6000, 0x2000, CRC(b0df42e6) SHA1(bb10268d7b820d1de0c20e1b79aba558badd072b) ) - ROM_REGION(0x10000, "cpu2", 0) + ROM_REGION(0x10000, "audiocpu", 0) ROM_LOAD("ic49.bin", 0xc000, 0x4000, CRC(bcc8ccc4) SHA1(2312f9cc4f5a2dadfbfa61d13c31bb5838adf152) ) ROM_RELOAD(0x8000, 0x4000) ROM_END -GAME(1984,pfevr_l2, 0, williams_s8, williams_s8, williams_s8_state, williams_s8, ROT0, "Williams", "Pennant Fever (L-2)", GAME_IS_SKELETON_MECHANICAL) -GAME(1984,pfevr_p3, pfevr_l2, williams_s8, williams_s8, williams_s8_state, williams_s8, ROT0, "Williams", "Pennant Fever (P-3)", GAME_IS_SKELETON_MECHANICAL) -GAME(1984,stillcra, 0, williams_s8, williams_s8, williams_s8_state, williams_s8, ROT0, "Williams", "Still Crazy", GAME_IS_SKELETON_MECHANICAL) +GAME(1984,pfevr_l2, 0, s8, s8, driver_device, 0, ROT0, "Williams", "Pennant Fever (L-2)", GAME_IS_SKELETON_MECHANICAL) +GAME(1984,pfevr_p3, pfevr_l2, s8, s8, driver_device, 0, ROT0, "Williams", "Pennant Fever (P-3)", GAME_IS_SKELETON_MECHANICAL) +GAME(1984,stillcra, 0, s8, s8, driver_device, 0, ROT0, "Williams", "Still Crazy", GAME_IS_SKELETON_MECHANICAL) diff --git a/src/mame/layout/s8.lay b/src/mame/layout/s8.lay new file mode 100644 index 00000000000..85ca2b84a38 --- /dev/null +++ b/src/mame/layout/s8.lay @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/mame/mame.mak b/src/mame/mame.mak index b730cc2bba9..227d770a8dc 100644 --- a/src/mame/mame.mak +++ b/src/mame/mame.mak @@ -2232,6 +2232,8 @@ $(DRIVERS)/s6.o: $(LAYOUT)/s6.lh $(DRIVERS)/s6a.o: $(LAYOUT)/s6a.lh +$(DRIVERS)/s8.o: $(LAYOUT)/s8.lh + $(DRIVERS)/sbrkout.o: $(LAYOUT)/sbrkout.lh $(DRIVERS)/sderby.o: $(LAYOUT)/sderby.lh \