From ec177d66bc7e15eba9453e8dc8e663eb2bc2fc6f Mon Sep 17 00:00:00 2001 From: mahlemiut Date: Fri, 28 Dec 2012 05:23:42 +0000 Subject: [PATCH] s11, s11a, s11b: Changed main IRQ timing based on schematics. Removed YM2151 reset from s11 and s11a, as this is not hooked up on background music boards used on these systems. Made background board communications two-way. Added HC55516 to s11b background music hardware. [Barry Rodewald] --- src/mame/drivers/s11.c | 117 +++++++++++++++++++------------ src/mame/drivers/s11a.c | 130 ++++++++++++++++++++++------------ src/mame/drivers/s11b.c | 152 +++++++++++++++++++++++++++++----------- 3 files changed, 270 insertions(+), 129 deletions(-) diff --git a/src/mame/drivers/s11.c b/src/mame/drivers/s11.c index c315ed202cc..ceec1e35371 100644 --- a/src/mame/drivers/s11.c +++ b/src/mame/drivers/s11.c @@ -23,6 +23,11 @@ ToDo: #include "sound/dac.h" #include "s11.lh" +// Length of time in cycles between IRQs on the main 6808 CPU +// This length is determined by the settings of the W14 and W15 jumpers +// It can be 0x300, 0x380, 0x700 or 0x780 cycles long. +// IRQ length is always 32 cycles +#define S11_IRQ_CYCLES 0x700 class s11_state : public genpin_class { @@ -62,7 +67,6 @@ public: DECLARE_WRITE8_MEMBER(pia34_pb_w); DECLARE_WRITE_LINE_MEMBER(pia34_cb2_w); DECLARE_WRITE8_MEMBER(pia40_pa_w); - DECLARE_WRITE_LINE_MEMBER(pia40_ca2_w); DECLARE_WRITE_LINE_MEMBER(pia40_cb2_w); DECLARE_READ8_MEMBER(dips_r); DECLARE_READ8_MEMBER(switch_r); @@ -70,8 +74,6 @@ public: DECLARE_READ_LINE_MEMBER(pias_ca1_r); DECLARE_READ_LINE_MEMBER(pia21_ca1_r); DECLARE_READ8_MEMBER(pia28_w7_r); - DECLARE_READ_LINE_MEMBER(pia28_ca1_r); - DECLARE_READ_LINE_MEMBER(pia28_cb1_r); DECLARE_WRITE_LINE_MEMBER(pias_ca2_w); DECLARE_WRITE_LINE_MEMBER(pias_cb2_w); DECLARE_WRITE_LINE_MEMBER(pia21_ca2_w); @@ -81,13 +83,12 @@ public: DECLARE_WRITE_LINE_MEMBER(pia28_cb2_w) { }; // comma1&2 DECLARE_WRITE_LINE_MEMBER(pia30_cb2_w) { }; // dummy to stop error log filling up DECLARE_WRITE_LINE_MEMBER(ym2151_irq_w); - TIMER_DEVICE_CALLBACK_MEMBER(irq); + DECLARE_WRITE_LINE_MEMBER(pia_irq); DECLARE_INPUT_CHANGED_MEMBER(main_nmi); DECLARE_INPUT_CHANGED_MEMBER(audio_nmi); DECLARE_MACHINE_RESET(s11); DECLARE_DRIVER_INIT(s11); protected: - // devices required_device m_maincpu; required_device m_audiocpu; @@ -104,6 +105,8 @@ protected: required_device m_pia34; required_device m_pia40; required_device m_ym; + + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); private: UINT8 m_sound_data; UINT8 m_strobe; @@ -112,6 +115,10 @@ private: UINT32 m_segment1; UINT32 m_segment2; bool m_ca1; + emu_timer* m_irq_timer; + bool m_irq_active; + + static const device_timer_id TIMER_IRQ = 0; }; static ADDRESS_MAP_START( s11_main_map, AS_PROGRAM, 8, s11_state ) @@ -221,6 +228,33 @@ static INPUT_PORTS_START( s11 ) PORT_CONFSETTING( 0x10, "English" ) INPUT_PORTS_END +void s11_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + switch(id) + { + case TIMER_IRQ: + if(param == 1) + { + m_maincpu->set_input_line(M6800_IRQ_LINE,ASSERT_LINE); + m_irq_timer->adjust(attotime::from_ticks(32,4000000/2),0); + m_pias->cb1_w(0); + m_irq_active = true; + m_pia28->ca1_w(BIT(ioport("DIAGS")->read(), 2)); // Advance + m_pia28->cb1_w(BIT(ioport("DIAGS")->read(), 3)); // Up/Down + } + else + { + m_maincpu->set_input_line(M6800_IRQ_LINE,CLEAR_LINE); + m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1); + m_pias->cb1_w(1); + m_irq_active = false; + m_pia28->ca1_w(1); + m_pia28->cb1_w(1); + } + break; + } +} + MACHINE_RESET_MEMBER( s11_state, s11 ) { membank("bank0")->set_entry(0); @@ -241,6 +275,23 @@ INPUT_CHANGED_MEMBER( s11_state::audio_nmi ) m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); } +WRITE_LINE_MEMBER( s11_state::pia_irq ) +{ + if(state == CLEAR_LINE) + { + // restart IRQ timer + m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1); + m_irq_active = false; + } + else + { + // disable IRQ timer while other IRQs are being handled + // (counter is reset every 32 cycles while a PIA IRQ is handled) + m_irq_timer->adjust(attotime::zero); + m_irq_active = true; + } +} + WRITE8_MEMBER( s11_state::sol3_w ) { @@ -271,8 +322,8 @@ static const pia6821_interface pia21_intf = DEVCB_DRIVER_MEMBER(s11_state, sol2_w), /* port B out */ DEVCB_DRIVER_LINE_MEMBER(s11_state, pia21_ca2_w), /* line CA2 out */ DEVCB_DRIVER_LINE_MEMBER(s11_state, pia21_cb2_w), /* line CB2 out */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */ + DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq), /* IRQA */ + DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq) /* IRQB */ }; WRITE8_MEMBER( s11_state::lamp0_w ) @@ -292,20 +343,10 @@ static const pia6821_interface pia24_intf = DEVCB_DRIVER_MEMBER(s11_state, lamp1_w), /* port B out */ DEVCB_NULL, /* line CA2 out */ DEVCB_DRIVER_LINE_MEMBER(s11_state, pia24_cb2_w), /* line CB2 out */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */ + DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq), /* IRQA */ + DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq) /* IRQB */ }; -READ_LINE_MEMBER( s11_state::pia28_ca1_r ) -{ - return BIT(ioport("DIAGS")->read(), 2) ? 1 : 0; // advance button -} - -READ_LINE_MEMBER( s11_state::pia28_cb1_r ) -{ - return BIT(ioport("DIAGS")->read(), 3) ? 1 : 0; // up/down switch -} - WRITE8_MEMBER( s11_state::dig0_w ) { static const UINT8 patterns[16] = { 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7c, 0x07, 0x7f, 0x67, 0x58, 0x4c, 0x62, 0x69, 0x78, 0 }; // 7447 @@ -345,16 +386,16 @@ static const pia6821_interface pia28_intf = { DEVCB_DRIVER_MEMBER(s11_state, pia28_w7_r), /* port A in */ DEVCB_NULL, /* port B in */ - DEVCB_DRIVER_LINE_MEMBER(s11_state, pia28_ca1_r), /* line CA1 in */ - DEVCB_DRIVER_LINE_MEMBER(s11_state, pia28_cb1_r), /* line CB1 in */ + DEVCB_NULL, /* line CA1 in */ + DEVCB_NULL, /* line CB1 in */ DEVCB_NULL, /* line CA2 in */ DEVCB_NULL, /* line CB2 in */ DEVCB_DRIVER_MEMBER(s11_state, dig0_w), /* port A out */ DEVCB_DRIVER_MEMBER(s11_state, dig1_w), /* port B out */ DEVCB_DRIVER_LINE_MEMBER(s11_state, pia28_ca2_w), /* line CA2 out */ DEVCB_DRIVER_LINE_MEMBER(s11_state, pia28_cb2_w), /* line CB2 out */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */ + DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq), /* IRQA */ + DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq) /* IRQB */ }; WRITE8_MEMBER( s11_state::pia2c_pa_w ) @@ -391,8 +432,8 @@ static const pia6821_interface pia2c_intf = DEVCB_DRIVER_MEMBER(s11_state, pia2c_pb_w), /* port B out */ DEVCB_NULL, /* line CA2 out */ DEVCB_NULL, /* line CB2 out */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */ + DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq), /* IRQA */ + DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq) /* IRQB */ }; READ8_MEMBER( s11_state::switch_r ) @@ -419,8 +460,8 @@ static const pia6821_interface pia30_intf = DEVCB_DRIVER_MEMBER(s11_state, switch_w), /* port B out */ DEVCB_NULL, /* line CA2 out */ DEVCB_DRIVER_LINE_MEMBER(s11_state, pia30_cb2_w), /* line CB2 out */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */ + DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq), /* IRQA */ + DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq) /* IRQB */ }; WRITE8_MEMBER( s11_state::pia34_pa_w ) @@ -456,8 +497,8 @@ static const pia6821_interface pia34_intf = DEVCB_DRIVER_MEMBER(s11_state, pia34_pb_w), /* port B out */ DEVCB_NULL, /* line CA2 out */ DEVCB_DRIVER_LINE_MEMBER(s11_state, pia34_cb2_w), /* line CB2 out */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */ + DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq), /* IRQA */ + DEVCB_DRIVER_LINE_MEMBER(s11_state, pia_irq) /* IRQB */ }; WRITE8_MEMBER( s11_state::bank_w ) @@ -522,12 +563,6 @@ WRITE_LINE_MEMBER( s11_state::ym2151_irq_w) m_pia40->ca1_w(0); } -WRITE_LINE_MEMBER( s11_state::pia40_ca2_w) -{ - if(state == ASSERT_LINE) - m_ym->reset(); -} - WRITE_LINE_MEMBER( s11_state::pia40_cb2_w) { m_pia34->cb1_w(state); // To Widget MCB1 through CPU Data interface @@ -543,7 +578,7 @@ static const pia6821_interface pia40_intf = DEVCB_NULL, /* line CB2 in */ DEVCB_DRIVER_MEMBER(s11_state, pia40_pa_w), /* port A out */ DEVCB_DRIVER_MEMBER(s11_state, dac_w), /* port B out */ - DEVCB_DRIVER_LINE_MEMBER(s11_state, pia40_ca2_w), /* line CA2 out */ + DEVCB_NULL, /* line CA2 out */ DEVCB_DRIVER_LINE_MEMBER(s11_state, pia40_cb2_w), /* line CB2 out */ DEVCB_CPU_INPUT_LINE("bgcpu", M6809_FIRQ_LINE), /* IRQA */ DEVCB_CPU_INPUT_LINE("bgcpu", INPUT_LINE_NMI) /* IRQB */ @@ -556,19 +591,15 @@ DRIVER_INIT_MEMBER( s11_state, s11 ) membank("bank1")->configure_entries(0, 2, &ROM[0x18000], 0x4000); membank("bank0")->set_entry(0); membank("bank1")->set_entry(0); -} - -TIMER_DEVICE_CALLBACK_MEMBER( s11_state::irq) -{ - m_maincpu->set_input_line(M6800_IRQ_LINE, HOLD_LINE); - m_pias->cb1_w(0); + m_irq_timer = timer_alloc(TIMER_IRQ); + m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1); + m_irq_active = false; } static MACHINE_CONFIG_START( s11, s11_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6802, 4000000) MCFG_CPU_PROGRAM_MAP(s11_main_map) - MCFG_TIMER_DRIVER_ADD_PERIODIC("irq", s11_state, irq, attotime::from_hz(1000)) MCFG_MACHINE_RESET_OVERRIDE(s11_state, s11) /* Video */ diff --git a/src/mame/drivers/s11a.c b/src/mame/drivers/s11a.c index ecec2a08d55..87842e8b3f9 100644 --- a/src/mame/drivers/s11a.c +++ b/src/mame/drivers/s11a.c @@ -9,7 +9,6 @@ ToDo: - Doesn't react to the Advance button very well - Some LEDs flicker -- Diagnostic LED blinks constantly Note: To start a game, certain switches need to be activated. You must first press and hold one of the trough switches (usually the left) and the ball shooter switch for @@ -28,6 +27,11 @@ Note: To start a game, certain switches need to be activated. You must first pr #include "sound/dac.h" #include "s11a.lh" +// Length of time in cycles between IRQs on the main 6808 CPU +// This length is determined by the settings of the W14 and W15 jumpers +// It can be 0x300, 0x380, 0x700 or 0x780 cycles long. +// IRQ length is always 32 cycles +#define S11_IRQ_CYCLES 0x700 class s11a_state : public genpin_class { @@ -68,15 +72,13 @@ public: DECLARE_WRITE8_MEMBER(pia34_pb_w); DECLARE_WRITE_LINE_MEMBER(pia34_cb2_w); DECLARE_WRITE8_MEMBER(pia40_pa_w); - DECLARE_WRITE_LINE_MEMBER(pia40_ca2_w); + DECLARE_WRITE8_MEMBER(pia40_pb_w); DECLARE_WRITE_LINE_MEMBER(pia40_cb2_w); DECLARE_READ8_MEMBER(dips_r); DECLARE_READ8_MEMBER(switch_r); DECLARE_WRITE8_MEMBER(switch_w); DECLARE_READ_LINE_MEMBER(pias_ca1_r); DECLARE_READ_LINE_MEMBER(pia21_ca1_r); - DECLARE_READ_LINE_MEMBER(pia28_ca1_r); - DECLARE_READ_LINE_MEMBER(pia28_cb1_r); DECLARE_READ8_MEMBER(pia28_w7_r); DECLARE_WRITE_LINE_MEMBER(pias_ca2_w); DECLARE_WRITE_LINE_MEMBER(pias_cb2_w); @@ -87,6 +89,7 @@ public: DECLARE_WRITE_LINE_MEMBER(pia28_cb2_w) { }; // comma1&2 DECLARE_WRITE_LINE_MEMBER(pia30_cb2_w) { }; // dummy to stop error log filling up DECLARE_WRITE_LINE_MEMBER(ym2151_irq_w); + DECLARE_WRITE_LINE_MEMBER(pia_irq); TIMER_DEVICE_CALLBACK_MEMBER(irq); DECLARE_INPUT_CHANGED_MEMBER(main_nmi); DECLARE_INPUT_CHANGED_MEMBER(audio_nmi); @@ -110,6 +113,8 @@ protected: required_device m_pia34; required_device m_pia40; required_device m_ym; + + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); private: UINT8 m_sound_data; UINT8 m_strobe; @@ -118,6 +123,10 @@ private: UINT32 m_segment1; UINT32 m_segment2; bool m_ca1; + emu_timer* m_irq_timer; + bool m_irq_active; + + static const device_timer_id TIMER_IRQ = 0; }; static ADDRESS_MAP_START( s11a_main_map, AS_PROGRAM, 8, s11a_state ) @@ -222,12 +231,39 @@ static INPUT_PORTS_START( s11a ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Audio Diag") PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, s11a_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, s11a_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("Up/Down") PORT_CODE(KEYCODE_9) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Up/Down") PORT_CODE(KEYCODE_9) PORT_TOGGLE PORT_CONFNAME( 0x10, 0x10, "Language" ) PORT_CONFSETTING( 0x00, "German" ) PORT_CONFSETTING( 0x10, "English" ) INPUT_PORTS_END +void s11a_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + switch(id) + { + case TIMER_IRQ: + if(param == 1) + { + m_maincpu->set_input_line(M6800_IRQ_LINE,ASSERT_LINE); + m_irq_timer->adjust(attotime::from_ticks(32,4000000/2),0); + m_pias->cb1_w(0); + m_irq_active = true; + m_pia28->ca1_w(BIT(ioport("DIAGS")->read(), 2)); // Advance + m_pia28->cb1_w(BIT(ioport("DIAGS")->read(), 3)); // Up/Down + } + else + { + m_maincpu->set_input_line(M6800_IRQ_LINE,CLEAR_LINE); + m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1); + m_pias->cb1_w(1); + m_irq_active = false; + m_pia28->ca1_w(1); + m_pia28->cb1_w(1); + } + break; + } +} + MACHINE_RESET_MEMBER( s11a_state, s11a ) { membank("bank0")->set_entry(0); @@ -249,6 +285,23 @@ INPUT_CHANGED_MEMBER( s11a_state::audio_nmi ) m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); } +WRITE_LINE_MEMBER( s11a_state::pia_irq ) +{ + if(state == CLEAR_LINE) + { + // restart IRQ timer + m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1); + m_irq_active = false; + } + else + { + // disable IRQ timer while other IRQs are being handled + // (counter is reset every 32 cycles while a PIA IRQ is handled) + m_irq_timer->adjust(attotime::zero); + m_irq_active = true; + } +} + WRITE8_MEMBER( s11a_state::sol3_w ) { @@ -279,8 +332,8 @@ static const pia6821_interface pia21_intf = DEVCB_DRIVER_MEMBER(s11a_state, sol2_w), /* port B out */ DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia21_ca2_w), /* line CA2 out */ DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia21_cb2_w), /* line CB2 out */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */ + DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq), /* IRQA */ + DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq) /* IRQB */ }; WRITE8_MEMBER( s11a_state::lamp0_w ) @@ -300,20 +353,10 @@ static const pia6821_interface pia24_intf = DEVCB_DRIVER_MEMBER(s11a_state, lamp1_w), /* port B out */ DEVCB_NULL, /* line CA2 out */ DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia24_cb2_w), /* line CB2 out */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */ + DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq), /* IRQA */ + DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq) /* IRQB */ }; -READ_LINE_MEMBER( s11a_state::pia28_ca1_r ) -{ - return BIT(ioport("DIAGS")->read(), 2) ? 1 : 0; // advance button -} - -READ_LINE_MEMBER( s11a_state::pia28_cb1_r ) -{ - return BIT(ioport("DIAGS")->read(), 3) ? 1 : 0; // up/down switch -} - WRITE8_MEMBER( s11a_state::dig0_w ) { data &= 0x7f; @@ -354,16 +397,16 @@ static const pia6821_interface pia28_intf = { DEVCB_DRIVER_MEMBER(s11a_state, pia28_w7_r), /* port A in */ DEVCB_NULL, /* port B in */ - DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia28_ca1_r), /* line CA1 in */ - DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia28_cb1_r), /* line CB1 in */ + DEVCB_NULL, /* line CA1 in */ + DEVCB_NULL, /* line CB1 in */ DEVCB_NULL, /* line CA2 in */ DEVCB_NULL, /* line CB2 in */ DEVCB_DRIVER_MEMBER(s11a_state, dig0_w), /* port A out */ DEVCB_DRIVER_MEMBER(s11a_state, dig1_w), /* port B out */ DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia28_ca2_w), /* line CA2 out */ DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia28_cb2_w), /* line CB2 out */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */ + DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq), /* IRQA */ + DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq) /* IRQB */ }; WRITE8_MEMBER( s11a_state::pia2c_pa_w ) @@ -400,8 +443,8 @@ static const pia6821_interface pia2c_intf = DEVCB_DRIVER_MEMBER(s11a_state, pia2c_pb_w), /* port B out */ DEVCB_NULL, /* line CA2 out */ DEVCB_NULL, /* line CB2 out */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */ + DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq), /* IRQA */ + DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq) /* IRQB */ }; READ8_MEMBER( s11a_state::switch_r ) @@ -428,8 +471,8 @@ static const pia6821_interface pia30_intf = DEVCB_DRIVER_MEMBER(s11a_state, switch_w), /* port B out */ DEVCB_NULL, /* line CA2 out */ DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia30_cb2_w), /* line CB2 out */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */ + DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq), /* IRQA */ + DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq) /* IRQB */ }; WRITE8_MEMBER( s11a_state::pia34_pa_w ) @@ -465,8 +508,8 @@ static const pia6821_interface pia34_intf = DEVCB_DRIVER_MEMBER(s11a_state, pia34_pb_w), /* port B out */ DEVCB_NULL, /* line CA2 out */ DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia34_cb2_w), /* line CB2 out */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */ + DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq), /* IRQA */ + DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia_irq) /* IRQB */ }; WRITE8_MEMBER( s11a_state::bank_w ) @@ -507,12 +550,6 @@ WRITE8_MEMBER( s11a_state::dac_w ) m_dac->write_unsigned8(data); } -WRITE_LINE_MEMBER( s11a_state::pia40_ca2_w) -{ - if(state == ASSERT_LINE) - m_ym->reset(); -} - WRITE_LINE_MEMBER( s11a_state::pia40_cb2_w) { m_pia34->cb1_w(state); // To Widget MCB1 through CPU Data interface @@ -528,7 +565,7 @@ static const pia6821_interface pias_intf = DEVCB_NULL, /* line CB2 in */ DEVCB_DRIVER_MEMBER(s11a_state, sound_w), /* port A out */ DEVCB_DRIVER_MEMBER(s11a_state, dac_w), /* port B out */ - DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia40_ca2_w), /* line CA2 out */ + DEVCB_NULL, /* line CA2 out */ DEVCB_DRIVER_LINE_MEMBER(s11a_state, pia40_cb2_w), /* line CB2 out */ DEVCB_CPU_INPUT_LINE("audiocpu", M6800_IRQ_LINE), /* IRQA */ DEVCB_CPU_INPUT_LINE("audiocpu", M6800_IRQ_LINE) /* IRQB */ @@ -539,6 +576,11 @@ WRITE8_MEMBER( s11a_state::pia40_pa_w ) m_dac1->write_unsigned8(data); } +WRITE8_MEMBER( s11a_state::pia40_pb_w ) +{ + m_pia34->portb_w(data); +} + WRITE_LINE_MEMBER( s11a_state::ym2151_irq_w) { if(state == CLEAR_LINE) @@ -556,7 +598,7 @@ static const pia6821_interface pia40_intf = DEVCB_LINE_VCC, /* line CA2 in */ DEVCB_NULL, /* line CB2 in */ DEVCB_DRIVER_MEMBER(s11a_state, pia40_pa_w), /* port A out */ - DEVCB_DRIVER_MEMBER(s11a_state, dac_w), /* port B out */ + DEVCB_DRIVER_MEMBER(s11a_state, pia40_pb_w), /* port B out */ DEVCB_DRIVER_LINE_MEMBER(s11a_state, pias_ca2_w), /* line CA2 out */ DEVCB_DRIVER_LINE_MEMBER(s11a_state, pias_cb2_w), /* line CB2 out */ DEVCB_CPU_INPUT_LINE("bgcpu", M6809_FIRQ_LINE), /* IRQA */ @@ -573,19 +615,15 @@ DRIVER_INIT_MEMBER( s11a_state, s11a ) membank("bank0")->set_entry(0); membank("bank1")->set_entry(0); membank("bgbank")->set_entry(0); -} - -TIMER_DEVICE_CALLBACK_MEMBER( s11a_state::irq) -{ - m_maincpu->set_input_line(M6800_IRQ_LINE, HOLD_LINE); - m_pias->cb1_w(0); + m_irq_timer = timer_alloc(TIMER_IRQ); + m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1); + m_irq_active = false; } static MACHINE_CONFIG_START( s11a, s11a_state ) /* basic machine hardware */ - MCFG_CPU_ADD("maincpu", M6802, 4000000) + MCFG_CPU_ADD("maincpu", M6808, 4000000) MCFG_CPU_PROGRAM_MAP(s11a_main_map) - MCFG_TIMER_DRIVER_ADD_PERIODIC("irq", s11a_state, irq, attotime::from_hz(1000)) MCFG_MACHINE_RESET_OVERRIDE(s11a_state, s11a) /* Video */ @@ -604,7 +642,7 @@ static MACHINE_CONFIG_START( s11a, s11a_state ) MCFG_NVRAM_ADD_1FILL("nvram") /* Add the soundcard */ - MCFG_CPU_ADD("audiocpu", M6808, 3580000) + MCFG_CPU_ADD("audiocpu", M6802, 3580000) MCFG_CPU_PROGRAM_MAP(s11a_audio_map) MCFG_SPEAKER_STANDARD_MONO("mono") diff --git a/src/mame/drivers/s11b.c b/src/mame/drivers/s11b.c index 1b69b56cb31..6793ccef758 100644 --- a/src/mame/drivers/s11b.c +++ b/src/mame/drivers/s11b.c @@ -17,6 +17,11 @@ #include "sound/dac.h" #include "s11b.lh" +// Length of time in cycles between IRQs on the main 6808 CPU +// This length is determined by the settings of the W14 and W15 jumpers +// It can be 0x300, 0x380, 0x700 or 0x780 cycles long. +// IRQ length is always 32 cycles +#define S11_IRQ_CYCLES 0x700 class s11b_state : public genpin_class { @@ -29,6 +34,7 @@ public: m_dac(*this, "dac"), m_dac1(*this, "dac1"), m_hc55516(*this, "hc55516"), + m_bg_hc55516(*this, "hc55516_bg"), m_pias(*this, "pias"), m_pia21(*this, "pia21"), m_pia24(*this, "pia24"), @@ -51,12 +57,15 @@ public: DECLARE_WRITE8_MEMBER(sol2_w) { }; // solenoids 8-15 DECLARE_WRITE8_MEMBER(sol3_w); // solenoids 0-7 DECLARE_WRITE8_MEMBER(sound_w); + DECLARE_WRITE8_MEMBER(bg_speech_clock_w); + DECLARE_WRITE8_MEMBER(bg_speech_digit_w); DECLARE_WRITE8_MEMBER(pia2c_pa_w); DECLARE_WRITE8_MEMBER(pia2c_pb_w); DECLARE_WRITE8_MEMBER(pia34_pa_w); DECLARE_WRITE8_MEMBER(pia34_pb_w); DECLARE_WRITE_LINE_MEMBER(pia34_cb2_w); DECLARE_WRITE8_MEMBER(pia40_pa_w); + DECLARE_WRITE8_MEMBER(pia40_pb_w); DECLARE_WRITE_LINE_MEMBER(pia40_ca2_w); DECLARE_WRITE_LINE_MEMBER(pia40_cb2_w); DECLARE_READ8_MEMBER(dips_r); @@ -64,8 +73,6 @@ public: DECLARE_WRITE8_MEMBER(switch_w); DECLARE_READ_LINE_MEMBER(pias_ca1_r); DECLARE_READ_LINE_MEMBER(pia21_ca1_r); - DECLARE_READ_LINE_MEMBER(pia28_ca1_r); - DECLARE_READ_LINE_MEMBER(pia28_cb1_r); DECLARE_READ8_MEMBER(pia28_w7_r); DECLARE_WRITE_LINE_MEMBER(pias_ca2_w); DECLARE_WRITE_LINE_MEMBER(pias_cb2_w); @@ -76,7 +83,7 @@ public: DECLARE_WRITE_LINE_MEMBER(pia28_cb2_w) { }; // comma1&2 DECLARE_WRITE_LINE_MEMBER(pia30_cb2_w) { }; // dummy to stop error log filling up DECLARE_WRITE_LINE_MEMBER(ym2151_irq_w); - TIMER_DEVICE_CALLBACK_MEMBER(irq); + DECLARE_WRITE_LINE_MEMBER(pia_irq); DECLARE_INPUT_CHANGED_MEMBER(main_nmi); DECLARE_INPUT_CHANGED_MEMBER(audio_nmi); DECLARE_MACHINE_RESET(s11b); @@ -91,6 +98,7 @@ protected: required_device m_dac; required_device m_dac1; required_device m_hc55516; + required_device m_bg_hc55516; required_device m_pias; required_device m_pia21; required_device m_pia24; @@ -100,6 +108,8 @@ protected: required_device m_pia34; required_device m_pia40; required_device m_ym; + + virtual void device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr); private: UINT8 m_sound_data; UINT8 m_strobe; @@ -109,6 +119,10 @@ private: UINT32 m_segment2; bool m_ca1; bool m_invert; // later System 11B games start expecting inverted data to the display LED segments. + emu_timer* m_irq_timer; + bool m_irq_active; + + static const device_timer_id TIMER_IRQ = 0; }; static ADDRESS_MAP_START( s11b_main_map, AS_PROGRAM, 8, s11b_state ) @@ -132,9 +146,11 @@ static ADDRESS_MAP_START( s11b_audio_map, AS_PROGRAM, 8, s11b_state ) ADDRESS_MAP_END static ADDRESS_MAP_START( s11b_bg_map, AS_PROGRAM, 8, s11b_state ) - AM_RANGE(0x0000, 0x07ff) AM_MIRROR(0x1800) AM_RAM + AM_RANGE(0x0000, 0x07ff) AM_RAM AM_RANGE(0x2000, 0x2001) AM_MIRROR(0x1ffe) AM_DEVREADWRITE("ym2151", ym2151_device, read, write) AM_RANGE(0x4000, 0x4003) AM_MIRROR(0x1ffc) AM_DEVREADWRITE("pia40", pia6821_device, read, write) + AM_RANGE(0x6000, 0x67ff) AM_WRITE(bg_speech_digit_w) + AM_RANGE(0x6800, 0x6fff) AM_WRITE(bg_speech_clock_w) AM_RANGE(0x7800, 0x7fff) AM_WRITE(bgbank_w) AM_RANGE(0x8000, 0xffff) AM_ROMBANK("bgbank") ADDRESS_MAP_END @@ -213,12 +229,39 @@ static INPUT_PORTS_START( s11b ) PORT_BIT( 0x01, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Audio Diag") PORT_CODE(KEYCODE_F1) PORT_CHANGED_MEMBER(DEVICE_SELF, s11b_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, s11b_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("Up/Down") PORT_CODE(KEYCODE_9) + PORT_BIT( 0x08, IP_ACTIVE_LOW, IPT_OTHER) PORT_NAME("Up/Down") PORT_CODE(KEYCODE_9) PORT_TOGGLE PORT_CONFNAME( 0x10, 0x10, "Language" ) PORT_CONFSETTING( 0x00, "German" ) PORT_CONFSETTING( 0x10, "English" ) INPUT_PORTS_END +void s11b_state::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) +{ + switch(id) + { + case TIMER_IRQ: + if(param == 1) + { + m_maincpu->set_input_line(M6800_IRQ_LINE,ASSERT_LINE); + m_irq_timer->adjust(attotime::from_ticks(32,4000000/2),0); + m_pias->cb1_w(0); + m_irq_active = true; + m_pia28->ca1_w(BIT(ioport("DIAGS")->read(), 2)); // Advance + m_pia28->cb1_w(BIT(ioport("DIAGS")->read(), 3)); // Up/Down + } + else + { + m_maincpu->set_input_line(M6800_IRQ_LINE,CLEAR_LINE); + m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1); + m_pias->cb1_w(1); + m_irq_active = false; + m_pia28->ca1_w(1); + m_pia28->cb1_w(1); + } + break; + } +} + MACHINE_RESET_MEMBER( s11b_state, s11b ) { membank("bank0")->set_entry(0); @@ -243,6 +286,23 @@ INPUT_CHANGED_MEMBER( s11b_state::audio_nmi ) m_audiocpu->set_input_line(INPUT_LINE_NMI, PULSE_LINE); } +WRITE_LINE_MEMBER( s11b_state::pia_irq ) +{ + if(state == CLEAR_LINE) + { + // restart IRQ timer + m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1); + m_irq_active = false; + } + else + { + // disable IRQ timer while other IRQs are being handled + // (counter is reset every 32 cycles while a PIA IRQ is handled) + m_irq_timer->adjust(attotime::zero); + m_irq_active = true; + } +} + WRITE8_MEMBER( s11b_state::sol3_w ) { @@ -253,6 +313,18 @@ WRITE8_MEMBER( s11b_state::sound_w ) m_sound_data = data; } +WRITE8_MEMBER( s11b_state::bg_speech_clock_w ) +{ + hc55516_clock_w(m_bg_hc55516, data); + popmessage("BG HC55516 Clock write %02x",data); +} + +WRITE8_MEMBER( s11b_state::bg_speech_digit_w ) +{ + hc55516_digit_w(m_bg_hc55516, data); + popmessage("BG HC55516 Digit write %02x",data); +} + WRITE_LINE_MEMBER( s11b_state::pia21_ca2_w ) { // sound ns @@ -273,8 +345,8 @@ static const pia6821_interface pia21_intf = DEVCB_DRIVER_MEMBER(s11b_state, sol2_w), /* port B out */ DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia21_ca2_w), /* line CA2 out */ DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia21_cb2_w), /* line CB2 out */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */ + DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq), /* IRQA */ + DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq) /* IRQB */ }; WRITE8_MEMBER( s11b_state::lamp0_w ) @@ -294,27 +366,17 @@ static const pia6821_interface pia24_intf = DEVCB_DRIVER_MEMBER(s11b_state, lamp1_w), /* port B out */ DEVCB_NULL, /* line CA2 out */ DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia24_cb2_w), /* line CB2 out */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */ + DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq), /* IRQA */ + DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq) /* IRQB */ }; -READ_LINE_MEMBER( s11b_state::pia28_ca1_r ) -{ - return BIT(ioport("DIAGS")->read(), 2) ? 1 : 0; // advance button -} - -READ_LINE_MEMBER( s11b_state::pia28_cb1_r ) -{ - return BIT(ioport("DIAGS")->read(), 3) ? 1 : 0; // up/down switch -} - WRITE8_MEMBER( s11b_state::dig0_w ) { data &= 0x7f; m_strobe = data & 15; m_diag = (data & 0x70) >> 4; output_set_digit_value(60, 0); // not connected to PA5 or PA6? - output_set_digit_value(61, m_diag & 0x01); // connected to PA4 + output_set_digit_value(61, m_diag & 0x01); // connected to PA4, normal behaviour is to be continually blinking output_set_digit_value(62, 0); m_segment1 = 0; m_segment2 = 0; @@ -351,16 +413,16 @@ static const pia6821_interface pia28_intf = { DEVCB_DRIVER_MEMBER(s11b_state, pia28_w7_r), /* port A in */ DEVCB_NULL, /* port B in */ - DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia28_ca1_r), /* line CA1 in */ - DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia28_cb1_r), /* line CB1 in */ + DEVCB_NULL, /* line CA1 in */ + DEVCB_NULL, /* line CB1 in */ DEVCB_NULL, /* line CA2 in */ DEVCB_NULL, /* line CB2 in */ DEVCB_DRIVER_MEMBER(s11b_state, dig0_w), /* port A out */ DEVCB_DRIVER_MEMBER(s11b_state, dig1_w), /* port B out */ DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia28_ca2_w), /* line CA2 out */ DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia28_cb2_w), /* line CB2 out */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */ + DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq), /* IRQA */ + DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq) /* IRQB */ }; WRITE8_MEMBER( s11b_state::pia2c_pa_w ) @@ -403,8 +465,8 @@ static const pia6821_interface pia2c_intf = DEVCB_DRIVER_MEMBER(s11b_state, pia2c_pb_w), /* port B out */ DEVCB_NULL, /* line CA2 out */ DEVCB_NULL, /* line CB2 out */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */ + DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq), /* IRQA */ + DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq) /* IRQB */ }; READ8_MEMBER( s11b_state::switch_r ) @@ -431,8 +493,8 @@ static const pia6821_interface pia30_intf = DEVCB_DRIVER_MEMBER(s11b_state, switch_w), /* port B out */ DEVCB_NULL, /* line CA2 out */ DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia30_cb2_w), /* line CB2 out */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */ + DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq), /* IRQA */ + DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq) /* IRQB */ }; WRITE8_MEMBER( s11b_state::pia34_pa_w ) @@ -471,8 +533,8 @@ static const pia6821_interface pia34_intf = DEVCB_DRIVER_MEMBER(s11b_state, pia34_pb_w), /* port B out */ DEVCB_NULL, /* line CA2 out */ DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia34_cb2_w), /* line CB2 out */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE), /* IRQA */ - DEVCB_CPU_INPUT_LINE("maincpu", M6800_IRQ_LINE) /* IRQB */ + DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq), /* IRQA */ + DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia_irq) /* IRQB */ }; WRITE8_MEMBER( s11b_state::bank_w ) @@ -494,7 +556,10 @@ READ_LINE_MEMBER( s11b_state::pias_ca1_r ) WRITE_LINE_MEMBER( s11b_state::pias_ca2_w ) { // speech clock - hc55516_clock_w(m_hc55516, state); + if(state == CLEAR_LINE) + hc55516_clock_w(m_hc55516, 0); + else + hc55516_clock_w(m_hc55516, 1); } WRITE_LINE_MEMBER( s11b_state::pias_cb2_w ) @@ -534,6 +599,11 @@ WRITE8_MEMBER( s11b_state::pia40_pa_w ) m_dac1->write_unsigned8(data); } +WRITE8_MEMBER( s11b_state::pia40_pb_w ) +{ + m_pia34->portb_w(data); +} + WRITE_LINE_MEMBER( s11b_state::ym2151_irq_w) { if(state == CLEAR_LINE) @@ -562,7 +632,7 @@ static const pia6821_interface pia40_intf = DEVCB_LINE_VCC, /* line CA2 in */ DEVCB_NULL, /* line CB2 in */ DEVCB_DRIVER_MEMBER(s11b_state, pia40_pa_w), /* port A out */ - DEVCB_DRIVER_MEMBER(s11b_state, dac_w), /* port B out */ + DEVCB_DRIVER_MEMBER(s11b_state, pia40_pb_w), /* port B out */ DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia40_ca2_w), /* line CA2 out */ DEVCB_DRIVER_LINE_MEMBER(s11b_state, pia40_cb2_w), /* line CB2 out */ DEVCB_CPU_INPUT_LINE("bgcpu", M6809_FIRQ_LINE), /* IRQA */ @@ -580,6 +650,9 @@ DRIVER_INIT_MEMBER( s11b_state, s11b ) membank("bank1")->set_entry(0); membank("bgbank")->set_entry(0); m_invert = false; + m_irq_timer = timer_alloc(TIMER_IRQ); + m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1); + m_irq_active = false; } DRIVER_INIT_MEMBER( s11b_state, s11b_invert ) @@ -593,19 +666,15 @@ DRIVER_INIT_MEMBER( s11b_state, s11b_invert ) membank("bank1")->set_entry(0); membank("bgbank")->set_entry(0); m_invert = true; -} - -TIMER_DEVICE_CALLBACK_MEMBER( s11b_state::irq) -{ - m_maincpu->set_input_line(M6800_IRQ_LINE, HOLD_LINE); - m_pias->cb1_w(0); + m_irq_timer = timer_alloc(TIMER_IRQ); + m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,4000000/2),1); + m_irq_active = false; } static MACHINE_CONFIG_START( s11b, s11b_state ) /* basic machine hardware */ MCFG_CPU_ADD("maincpu", M6808, 4000000) MCFG_CPU_PROGRAM_MAP(s11b_main_map) - MCFG_TIMER_DRIVER_ADD_PERIODIC("irq", s11b_state, irq, attotime::from_hz(1000)) MCFG_MACHINE_RESET_OVERRIDE(s11b_state, s11b) /* Video */ @@ -645,11 +714,14 @@ static MACHINE_CONFIG_START( s11b, s11b_state ) MCFG_SPEAKER_STANDARD_MONO("bg") MCFG_YM2151_ADD("ym2151", 3580000) MCFG_YM2151_IRQ_HANDLER(WRITELINE(s11b_state, ym2151_irq_w)) - MCFG_SOUND_ROUTE(ALL_OUTPUTS, "bg", 0.50) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "bg", 0.25) MCFG_DAC_ADD("dac1") MCFG_SOUND_ROUTE(ALL_OUTPUTS, "bg", 0.50) + MCFG_SOUND_ADD("hc55516_bg", HC55516, 0) + MCFG_SOUND_ROUTE(ALL_OUTPUTS, "speech", 0.50) + MCFG_PIA6821_ADD("pia40", pia40_intf) MACHINE_CONFIG_END