From 3d7bf5a17683ef7e1d1677c5c0d80ef251061c97 Mon Sep 17 00:00:00 2001 From: Lord-Nightmare Date: Mon, 29 Jun 2020 00:59:53 -0400 Subject: [PATCH] Switch William system 11/11a/11b/11c pinballs to use input_merger for the maincpu and audiocpu IRQ inputs, and rewrote the timer IRQ generator to be more accurate vs hardware. Fixes the advance and up/down operator inputs, and may make certain games more stable. [Lord Nightmare] --- src/mame/drivers/s11.cpp | 94 ++++++++++++++++++++++----------------- src/mame/drivers/s11a.cpp | 31 +++++++------ src/mame/drivers/s11b.cpp | 44 +++++++++--------- src/mame/drivers/s11c.cpp | 28 ++++++------ src/mame/drivers/s7.cpp | 5 +-- src/mame/includes/s11.h | 23 ++++++++-- 6 files changed, 128 insertions(+), 97 deletions(-) diff --git a/src/mame/drivers/s11.cpp b/src/mame/drivers/s11.cpp index 8c18bcd52c8..db197cb79c6 100644 --- a/src/mame/drivers/s11.cpp +++ b/src/mame/drivers/s11.cpp @@ -10,7 +10,6 @@ ToDo: - Can coin up but not start -- Doesn't react to the Advance button very well Known keys necessary to get games to start (so the proper number of balls are detected): - Road Kings: press 'Up' (the direction key) and Q, and press "1" after inserting 1 or more credits. @@ -140,26 +139,30 @@ void s11_state::device_timer(emu_timer &timer, device_timer_id id, int param, vo switch(id) { case TIMER_IRQ: - if(param == 1) + // handle the cd4020 14-bit timer irq counter; this timer fires on the rising and falling edges of Q5, every 32 clocks + m_timer_count += 0x20; + m_timer_count &= 0x3fff; + // handle the reset case (happens on the high level of Eclock, so supersedes the firing of the timer int) + if (BIT(m_timer_count, 5) && (m_timer_irq_active || m_pia_irq_active)) { - m_maincpu->set_input_line(M6802_IRQ_LINE, ASSERT_LINE); - m_irq_timer->adjust(attotime::from_ticks(32,E_CLOCK),0); - if(m_pias) - 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 + m_timer_count = 0; + m_timer_irq_active = false; } - else + else // handle the timer int firing case { - m_maincpu->set_input_line(M6802_IRQ_LINE, CLEAR_LINE); - m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,E_CLOCK),1); - if(m_pias) - m_pias->cb1_w(1); - m_irq_active = false; - m_pia28->ca1_w(1); - m_pia28->cb1_w(1); +#ifndef S11_W15 + // W14 jumper present (Q7), W15 absent (Q10) + m_timer_irq_active = (BIT(m_timer_count, 7) && BIT(m_timer_count, 8) && BIT(m_timer_count, 9)); +#else + // W14 jumper absent (Q7), W15 present (Q10) + m_timer_irq_active = (BIT(m_timer_count, 10) && BIT(m_timer_count, 8) && BIT(m_timer_count, 9)); +#endif } + + m_mainirq->in_w<0>(m_timer_irq_active); + if(m_pias) + m_pias->cb1_w(m_timer_irq_active); + m_irq_timer->adjust(attotime::from_ticks(32,E_CLOCK),0); break; } } @@ -187,19 +190,24 @@ INPUT_CHANGED_MEMBER( s11_state::audio_nmi ) WRITE_LINE_MEMBER( s11_state::pia_irq ) { + m_pia_irq_active = state; + m_mainirq->in_w<1>(state); +} + +WRITE_LINE_MEMBER( s11_state::main_irq ) +{ + // handle the fact that the Advance and Up/Down switches are gated by the combined timer/pia irq signal if(state == CLEAR_LINE) { - // restart IRQ timer - m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,E_CLOCK),1); - m_irq_active = false; + m_pia28->ca1_w(1); + m_pia28->cb1_w(1); } 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; + m_pia28->ca1_w(BIT(ioport("DIAGS")->read(), 2)); // Advance + m_pia28->cb1_w(BIT(ioport("DIAGS")->read(), 3)); // Up/Down } + m_maincpu->set_input_line(M6802_IRQ_LINE, state); } void s11_state::sol3_w(uint8_t data) @@ -222,7 +230,6 @@ WRITE_LINE_MEMBER( s11_state::pia21_ca2_w ) void s11_state::lamp0_w(uint8_t data) { - m_maincpu->set_input_line(M6802_IRQ_LINE, CLEAR_LINE); } void s11_state::dig0_w(uint8_t data) @@ -382,9 +389,11 @@ void s11_state::init_s11() membank("bank1")->configure_entries(0, 2, &ROM[0x18000], 0x4000); membank("bank0")->set_entry(0); membank("bank1")->set_entry(0); + m_timer_count = 0; m_irq_timer = timer_alloc(TIMER_IRQ); - m_irq_timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,E_CLOCK),1); - m_irq_active = false; + m_irq_timer->adjust(attotime::from_ticks(32,E_CLOCK),0); + m_timer_irq_active = false; + m_pia_irq_active = false; } void s11_state::s11(machine_config &config) @@ -393,6 +402,8 @@ void s11_state::s11(machine_config &config) M6802(config, m_maincpu, XTAL(4'000'000)); m_maincpu->set_addrmap(AS_PROGRAM, &s11_state::s11_main_map); MCFG_MACHINE_RESET_OVERRIDE(s11_state, s11) + INPUT_MERGER_ANY_HIGH(config, m_mainirq).output_handler().set(FUNC(s11_state::main_irq)); + INPUT_MERGER_ANY_HIGH(config, m_piairq).output_handler().set(FUNC(s11_state::pia_irq)); /* Video */ config.set_default_layout(layout_s11); @@ -408,15 +419,15 @@ void s11_state::s11(machine_config &config) m_pia21->writepb_handler().set(FUNC(s11_state::sol2_w)); m_pia21->ca2_handler().set(FUNC(s11_state::pia21_ca2_w)); m_pia21->cb2_handler().set(FUNC(s11_state::pia21_cb2_w)); - m_pia21->irqa_handler().set(FUNC(s11_state::pia_irq)); - m_pia21->irqb_handler().set(FUNC(s11_state::pia_irq)); + m_pia21->irqa_handler().set(m_mainirq, FUNC(input_merger_device::in_w<1>)); + m_pia21->irqb_handler().set(m_piairq, FUNC(input_merger_device::in_w<2>)); PIA6821(config, m_pia24, 0); m_pia24->writepa_handler().set(FUNC(s11_state::lamp0_w)); m_pia24->writepb_handler().set(FUNC(s11_state::lamp1_w)); m_pia24->cb2_handler().set(FUNC(s11_state::pia24_cb2_w)); - m_pia24->irqa_handler().set(FUNC(s11_state::pia_irq)); - m_pia24->irqb_handler().set(FUNC(s11_state::pia_irq)); + m_pia24->irqa_handler().set(m_piairq, FUNC(input_merger_device::in_w<3>)); + m_pia24->irqb_handler().set(m_piairq, FUNC(input_merger_device::in_w<4>)); PIA6821(config, m_pia28, 0); m_pia28->readpa_handler().set(FUNC(s11_state::pia28_w7_r)); @@ -425,35 +436,36 @@ void s11_state::s11(machine_config &config) m_pia28->writepb_handler().set(FUNC(s11_state::dig1_w)); m_pia28->ca2_handler().set(FUNC(s11_state::pia28_ca2_w)); m_pia28->cb2_handler().set(FUNC(s11_state::pia28_cb2_w)); - m_pia28->irqa_handler().set(FUNC(s11_state::pia_irq)); - m_pia28->irqb_handler().set(FUNC(s11_state::pia_irq)); + m_pia28->irqa_handler().set(m_piairq, FUNC(input_merger_device::in_w<5>)); + m_pia28->irqb_handler().set(m_piairq, FUNC(input_merger_device::in_w<6>)); PIA6821(config, m_pia2c, 0); m_pia2c->writepa_handler().set(FUNC(s11_state::pia2c_pa_w)); m_pia2c->writepb_handler().set(FUNC(s11_state::pia2c_pb_w)); - m_pia2c->irqa_handler().set(FUNC(s11_state::pia_irq)); - m_pia2c->irqb_handler().set(FUNC(s11_state::pia_irq)); + m_pia2c->irqa_handler().set(m_piairq, FUNC(input_merger_device::in_w<7>)); + m_pia2c->irqb_handler().set(m_piairq, FUNC(input_merger_device::in_w<8>)); PIA6821(config, m_pia30, 0); m_pia30->readpa_handler().set(FUNC(s11_state::switch_r)); m_pia30->set_port_a_input_overrides_output_mask(0xff); m_pia30->writepb_handler().set(FUNC(s11_state::switch_w)); m_pia30->cb2_handler().set(FUNC(s11_state::pia30_cb2_w)); - m_pia30->irqa_handler().set(FUNC(s11_state::pia_irq)); - m_pia30->irqb_handler().set(FUNC(s11_state::pia_irq)); + m_pia30->irqa_handler().set(m_piairq, FUNC(input_merger_device::in_w<9>)); + m_pia30->irqb_handler().set(m_piairq, FUNC(input_merger_device::in_w<10>)); PIA6821(config, m_pia34, 0); m_pia34->writepa_handler().set(FUNC(s11_state::pia34_pa_w)); m_pia34->writepb_handler().set(FUNC(s11_state::pia34_pb_w)); m_pia34->cb2_handler().set(FUNC(s11_state::pia34_cb2_w)); - m_pia34->irqa_handler().set(FUNC(s11_state::pia_irq)); - m_pia34->irqb_handler().set(FUNC(s11_state::pia_irq)); + m_pia34->irqa_handler().set(m_piairq, FUNC(input_merger_device::in_w<11>)); + m_pia34->irqb_handler().set(m_piairq, FUNC(input_merger_device::in_w<12>)); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_0); /* Add the soundcard */ M6808(config, m_audiocpu, XTAL(4'000'000)); m_audiocpu->set_addrmap(AS_PROGRAM, &s11_state::s11_audio_map); + INPUT_MERGER_ANY_HIGH(config, m_audioirq).output_handler().set_inputline(m_audiocpu, M6808_IRQ_LINE); SPEAKER(config, "speaker").front_center(); MC1408(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.5); @@ -471,8 +483,8 @@ void s11_state::s11(machine_config &config) m_pias->writepb_handler().set("dac", FUNC(dac_byte_interface::data_w)); m_pias->ca2_handler().set(m_hc55516, FUNC(hc55516_device::clock_w)); m_pias->cb2_handler().set(m_hc55516, FUNC(hc55516_device::digit_w)); - m_pias->irqa_handler().set_inputline(m_audiocpu, M6808_IRQ_LINE); - m_pias->irqb_handler().set_inputline(m_audiocpu, M6808_IRQ_LINE); + m_pias->irqa_handler().set(m_audioirq, FUNC(input_merger_device::in_w<0>)); + m_pias->irqb_handler().set(m_audioirq, FUNC(input_merger_device::in_w<1>)); /* Add the background music card */ MC6809E(config, m_bgcpu, 8000000 / 4); // MC68B09E diff --git a/src/mame/drivers/s11a.cpp b/src/mame/drivers/s11a.cpp index 4d5ceb7a60c..362a3138abe 100644 --- a/src/mame/drivers/s11a.cpp +++ b/src/mame/drivers/s11a.cpp @@ -176,6 +176,8 @@ void s11a_state::s11a(machine_config &config) M6808(config, m_maincpu, XTAL(4'000'000)); m_maincpu->set_addrmap(AS_PROGRAM, &s11a_state::s11a_main_map); MCFG_MACHINE_RESET_OVERRIDE(s11a_state, s11a) + INPUT_MERGER_ANY_HIGH(config, m_mainirq).output_handler().set(FUNC(s11_state::main_irq)); + INPUT_MERGER_ANY_HIGH(config, m_piairq).output_handler().set(FUNC(s11_state::pia_irq)); /* Video */ config.set_default_layout(layout_s11a); @@ -191,15 +193,15 @@ void s11a_state::s11a(machine_config &config) m_pia21->writepb_handler().set(FUNC(s11_state::sol2_w)); m_pia21->ca2_handler().set(FUNC(s11_state::pia21_ca2_w)); m_pia21->cb2_handler().set(FUNC(s11_state::pia21_cb2_w)); - m_pia21->irqa_handler().set(FUNC(s11_state::pia_irq)); - m_pia21->irqb_handler().set(FUNC(s11_state::pia_irq)); + m_pia21->irqa_handler().set(m_mainirq, FUNC(input_merger_device::in_w<1>)); + m_pia21->irqb_handler().set(m_mainirq, FUNC(input_merger_device::in_w<2>)); PIA6821(config, m_pia24, 0); m_pia24->writepa_handler().set(FUNC(s11_state::lamp0_w)); m_pia24->writepb_handler().set(FUNC(s11_state::lamp1_w)); m_pia24->cb2_handler().set(FUNC(s11_state::pia24_cb2_w)); - m_pia24->irqa_handler().set(FUNC(s11_state::pia_irq)); - m_pia24->irqb_handler().set(FUNC(s11_state::pia_irq)); + m_pia24->irqa_handler().set(m_mainirq, FUNC(input_merger_device::in_w<3>)); + m_pia24->irqb_handler().set(m_mainirq, FUNC(input_merger_device::in_w<4>)); PIA6821(config, m_pia28, 0); m_pia28->readpa_handler().set(FUNC(s11_state::pia28_w7_r)); @@ -208,29 +210,29 @@ void s11a_state::s11a(machine_config &config) m_pia28->writepb_handler().set(FUNC(s11_state::dig1_w)); m_pia28->ca2_handler().set(FUNC(s11_state::pia28_ca2_w)); m_pia28->cb2_handler().set(FUNC(s11_state::pia28_cb2_w)); - m_pia28->irqa_handler().set(FUNC(s11_state::pia_irq)); - m_pia28->irqb_handler().set(FUNC(s11_state::pia_irq)); + m_pia28->irqa_handler().set(m_mainirq, FUNC(input_merger_device::in_w<5>)); + m_pia28->irqb_handler().set(m_mainirq, FUNC(input_merger_device::in_w<6>)); PIA6821(config, m_pia2c, 0); m_pia2c->writepa_handler().set(FUNC(s11_state::pia2c_pa_w)); m_pia2c->writepb_handler().set(FUNC(s11_state::pia2c_pb_w)); - m_pia2c->irqa_handler().set(FUNC(s11_state::pia_irq)); - m_pia2c->irqb_handler().set(FUNC(s11_state::pia_irq)); + m_pia2c->irqa_handler().set(m_mainirq, FUNC(input_merger_device::in_w<7>)); + m_pia2c->irqb_handler().set(m_mainirq, FUNC(input_merger_device::in_w<8>)); PIA6821(config, m_pia30, 0); m_pia30->readpa_handler().set(FUNC(s11_state::switch_r)); m_pia30->set_port_a_input_overrides_output_mask(0xff); m_pia30->writepb_handler().set(FUNC(s11_state::switch_w)); m_pia30->cb2_handler().set(FUNC(s11_state::pia30_cb2_w)); - m_pia30->irqa_handler().set(FUNC(s11_state::pia_irq)); - m_pia30->irqb_handler().set(FUNC(s11_state::pia_irq)); + m_pia30->irqa_handler().set(m_mainirq, FUNC(input_merger_device::in_w<9>)); + m_pia30->irqb_handler().set(m_mainirq, FUNC(input_merger_device::in_w<10>)); PIA6821(config, m_pia34, 0); m_pia34->writepa_handler().set(FUNC(s11_state::pia34_pa_w)); m_pia34->writepb_handler().set(FUNC(s11_state::pia34_pb_w)); m_pia34->cb2_handler().set(FUNC(s11_state::pia34_cb2_w)); - m_pia34->irqa_handler().set(FUNC(s11_state::pia_irq)); - m_pia34->irqb_handler().set(FUNC(s11_state::pia_irq)); + m_pia34->irqa_handler().set(m_mainirq, FUNC(input_merger_device::in_w<11>)); + m_pia34->irqb_handler().set(m_mainirq, FUNC(input_merger_device::in_w<12>)); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); @@ -238,6 +240,7 @@ void s11a_state::s11a(machine_config &config) M6802(config, m_audiocpu, XTAL(4'000'000)); m_audiocpu->set_ram_enable(false); m_audiocpu->set_addrmap(AS_PROGRAM, &s11a_state::s11a_audio_map); + INPUT_MERGER_ANY_HIGH(config, m_audioirq).output_handler().set_inputline(m_audiocpu, M6802_IRQ_LINE); SPEAKER(config, "speaker").front_center(); MC1408(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); @@ -254,8 +257,8 @@ void s11a_state::s11a(machine_config &config) m_pias->writepa_handler().set(FUNC(s11_state::sound_w)); m_pias->writepb_handler().set("dac", FUNC(dac_byte_interface::data_w)); m_pias->cb2_handler().set(FUNC(s11_state::pia40_cb2_w)); - m_pias->irqa_handler().set_inputline(m_audiocpu, M6802_IRQ_LINE); - m_pias->irqb_handler().set_inputline(m_audiocpu, M6802_IRQ_LINE); + m_pias->irqa_handler().set(m_audioirq, FUNC(input_merger_device::in_w<0>)); + m_pias->irqb_handler().set(m_audioirq, FUNC(input_merger_device::in_w<1>)); /* Add the background music card */ MC6809E(config, m_bgcpu, XTAL(8'000'000) / 4); // MC68B09E diff --git a/src/mame/drivers/s11b.cpp b/src/mame/drivers/s11b.cpp index bad7139fc6a..28755accd16 100644 --- a/src/mame/drivers/s11b.cpp +++ b/src/mame/drivers/s11b.cpp @@ -5,17 +5,16 @@ Known issues: - Background music is not working in some games - - Black Knight 2000 randomly goes nuts or resets - (some bug possibly relating to the 'lighting draws the "Ball 1"' animation???); + - Black Knight 2000 sometimes goes nuts or resets, although this is largely dependent on + whether the 'ball 1' animation was played or not. if you insert 2 or more credits and hit start 2 times quickly so it doesn't - play the animation, the game seems more stable afterwards; original - game bug or 6802 core bug or something else? - This bug behaves slightly differently in the different sets, depending on whether - nvram is cleared beforehand or not, and whether the last reset was soft or hard. + play the animation, the game seems more stable afterwards; is this an original + game bug or 6802 core bug or something else? Activating a switch ('x' for instance) after + the ball 1 animation makes it significantly more stable, so this could be an original code bug, + or a code bug which is hit if the motor drawbridge limit sensors are not working/emulated, as in MAME. Proximate cause is smashing the stack, after which the RTS at 61DE (in bk2k_l4) transfers to 0000 (where no valid code exists). - Black Knight 2000 LG-1 set reports U26 ROM FAILURE. Bad/hacked dump or original bug? - - Advance button doesn't seem to work well (TODO: check if this may have been fixed with the irq and diagnostic button masking changes) - Jokerz has an entirely different "Pin Sound '88" stereo audio board (D-12338-567) Known keys necessary to get games to start (so the proper number of balls are detected): @@ -252,6 +251,8 @@ void s11b_state::s11b(machine_config &config) M6808(config, m_maincpu, XTAL(4'000'000)); m_maincpu->set_addrmap(AS_PROGRAM, &s11b_state::s11b_main_map); MCFG_MACHINE_RESET_OVERRIDE(s11b_state, s11b) + INPUT_MERGER_ANY_HIGH(config, m_mainirq).output_handler().set(FUNC(s11_state::main_irq)); + INPUT_MERGER_ANY_HIGH(config, m_piairq).output_handler().set(FUNC(s11_state::pia_irq)); /* Video */ config.set_default_layout(layout_s11b); @@ -267,15 +268,15 @@ void s11b_state::s11b(machine_config &config) m_pia21->writepb_handler().set(FUNC(s11_state::sol2_w)); m_pia21->ca2_handler().set(FUNC(s11_state::pia21_ca2_w)); m_pia21->cb2_handler().set(FUNC(s11_state::pia21_cb2_w)); - m_pia21->irqa_handler().set(FUNC(s11_state::pia_irq)); - m_pia21->irqb_handler().set(FUNC(s11_state::pia_irq)); + m_pia21->irqa_handler().set(m_mainirq, FUNC(input_merger_device::in_w<1>)); + m_pia21->irqb_handler().set(m_mainirq, FUNC(input_merger_device::in_w<2>)); PIA6821(config, m_pia24, 0); m_pia24->writepa_handler().set(FUNC(s11_state::lamp0_w)); m_pia24->writepb_handler().set(FUNC(s11_state::lamp1_w)); m_pia24->cb2_handler().set(FUNC(s11_state::pia24_cb2_w)); - m_pia24->irqa_handler().set(FUNC(s11_state::pia_irq)); - m_pia24->irqb_handler().set(FUNC(s11_state::pia_irq)); + m_pia24->irqa_handler().set(m_mainirq, FUNC(input_merger_device::in_w<3>)); + m_pia24->irqb_handler().set(m_mainirq, FUNC(input_merger_device::in_w<4>)); PIA6821(config, m_pia28, 0); m_pia28->readpa_handler().set(FUNC(s11_state::pia28_w7_r)); @@ -284,29 +285,29 @@ void s11b_state::s11b(machine_config &config) m_pia28->writepb_handler().set(FUNC(s11b_state::dig1_w)); m_pia28->ca2_handler().set(FUNC(s11_state::pia28_ca2_w)); m_pia28->cb2_handler().set(FUNC(s11_state::pia28_cb2_w)); - m_pia28->irqa_handler().set(FUNC(s11_state::pia_irq)); - m_pia28->irqb_handler().set(FUNC(s11_state::pia_irq)); + m_pia28->irqa_handler().set(m_mainirq, FUNC(input_merger_device::in_w<5>)); + m_pia28->irqb_handler().set(m_mainirq, FUNC(input_merger_device::in_w<6>)); PIA6821(config, m_pia2c, 0); m_pia2c->writepa_handler().set(FUNC(s11b_state::pia2c_pa_w)); m_pia2c->writepb_handler().set(FUNC(s11b_state::pia2c_pb_w)); - m_pia2c->irqa_handler().set(FUNC(s11_state::pia_irq)); - m_pia2c->irqb_handler().set(FUNC(s11_state::pia_irq)); + m_pia2c->irqa_handler().set(m_mainirq, FUNC(input_merger_device::in_w<7>)); + m_pia2c->irqb_handler().set(m_mainirq, FUNC(input_merger_device::in_w<8>)); PIA6821(config, m_pia30, 0); m_pia30->readpa_handler().set(FUNC(s11_state::switch_r)); m_pia30->set_port_a_input_overrides_output_mask(0xff); m_pia30->writepb_handler().set(FUNC(s11_state::switch_w)); m_pia30->cb2_handler().set(FUNC(s11_state::pia30_cb2_w)); - m_pia30->irqa_handler().set(FUNC(s11_state::pia_irq)); - m_pia30->irqb_handler().set(FUNC(s11_state::pia_irq)); + m_pia30->irqa_handler().set(m_mainirq, FUNC(input_merger_device::in_w<9>)); + m_pia30->irqb_handler().set(m_mainirq, FUNC(input_merger_device::in_w<10>)); PIA6821(config, m_pia34, 0); m_pia34->writepa_handler().set(FUNC(s11b_state::pia34_pa_w)); m_pia34->writepb_handler().set(FUNC(s11_state::pia34_pb_w)); m_pia34->cb2_handler().set(FUNC(s11_state::pia34_cb2_w)); - m_pia34->irqa_handler().set(FUNC(s11_state::pia_irq)); - m_pia34->irqb_handler().set(FUNC(s11_state::pia_irq)); + m_pia34->irqa_handler().set(m_mainirq, FUNC(input_merger_device::in_w<11>)); + m_pia34->irqb_handler().set(m_mainirq, FUNC(input_merger_device::in_w<12>)); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); @@ -314,6 +315,7 @@ void s11b_state::s11b(machine_config &config) M6802(config, m_audiocpu, XTAL(4'000'000)); m_audiocpu->set_ram_enable(false); m_audiocpu->set_addrmap(AS_PROGRAM, &s11b_state::s11b_audio_map); + INPUT_MERGER_ANY_HIGH(config, m_audioirq).output_handler().set_inputline(m_audiocpu, M6802_IRQ_LINE); SPEAKER(config, "speaker").front_center(); MC1408(config, "dac", 0).add_route(ALL_OUTPUTS, "speaker", 0.25); @@ -331,8 +333,8 @@ void s11b_state::s11b(machine_config &config) m_pias->writepb_handler().set("dac", FUNC(dac_byte_interface::data_w)); m_pias->ca2_handler().set("hc55516", FUNC(hc55516_device::clock_w)); m_pias->cb2_handler().set("hc55516", FUNC(hc55516_device::digit_w)); - m_pias->irqa_handler().set_inputline("audiocpu", M6802_IRQ_LINE); - m_pias->irqb_handler().set_inputline("audiocpu", M6802_IRQ_LINE); + m_pias->irqa_handler().set(m_audioirq, FUNC(input_merger_device::in_w<0>)); + m_pias->irqb_handler().set(m_audioirq, FUNC(input_merger_device::in_w<1>)); /* Add the background music card */ MC6809E(config, m_bgcpu, XTAL(8'000'000) / 4); // MC68B09E diff --git a/src/mame/drivers/s11c.cpp b/src/mame/drivers/s11c.cpp index a31d8ca2d48..32cf7befe4b 100644 --- a/src/mame/drivers/s11c.cpp +++ b/src/mame/drivers/s11c.cpp @@ -146,7 +146,7 @@ void s11c_state::init_s11c() // membank("bgbank")->set_entry(0); set_invert(true); set_timer(timer); - timer->adjust(attotime::from_ticks(S11_IRQ_CYCLES,E_CLOCK),1); + timer->adjust(attotime::from_ticks(32,E_CLOCK),0); } void s11c_state::s11c(machine_config &config) @@ -154,6 +154,8 @@ void s11c_state::s11c(machine_config &config) /* basic machine hardware */ M6808(config, m_maincpu, XTAL(4'000'000)); m_maincpu->set_addrmap(AS_PROGRAM, &s11c_state::s11c_main_map); + INPUT_MERGER_ANY_HIGH(config, m_mainirq).output_handler().set(FUNC(s11_state::main_irq)); + INPUT_MERGER_ANY_HIGH(config, m_piairq).output_handler().set(FUNC(s11_state::pia_irq)); /* Video */ config.set_default_layout(layout_s11c); @@ -169,15 +171,15 @@ void s11c_state::s11c(machine_config &config) m_pia21->writepb_handler().set(FUNC(s11_state::sol2_w)); m_pia21->ca2_handler().set(FUNC(s11_state::pia21_ca2_w)); m_pia21->cb2_handler().set(FUNC(s11_state::pia21_cb2_w)); - m_pia21->irqa_handler().set(FUNC(s11_state::pia_irq)); - m_pia21->irqb_handler().set(FUNC(s11_state::pia_irq)); + m_pia21->irqa_handler().set(m_mainirq, FUNC(input_merger_device::in_w<1>)); + m_pia21->irqb_handler().set(m_mainirq, FUNC(input_merger_device::in_w<2>)); PIA6821(config, m_pia24, 0); m_pia24->writepa_handler().set(FUNC(s11_state::lamp0_w)); m_pia24->writepb_handler().set(FUNC(s11_state::lamp1_w)); m_pia24->cb2_handler().set(FUNC(s11_state::pia24_cb2_w)); - m_pia24->irqa_handler().set(FUNC(s11_state::pia_irq)); - m_pia24->irqb_handler().set(FUNC(s11_state::pia_irq)); + m_pia24->irqa_handler().set(m_mainirq, FUNC(input_merger_device::in_w<3>)); + m_pia24->irqb_handler().set(m_mainirq, FUNC(input_merger_device::in_w<4>)); PIA6821(config, m_pia28, 0); m_pia28->readpa_handler().set(FUNC(s11_state::pia28_w7_r)); @@ -186,29 +188,29 @@ void s11c_state::s11c(machine_config &config) m_pia28->writepb_handler().set(FUNC(s11b_state::dig1_w)); m_pia28->ca2_handler().set(FUNC(s11_state::pia28_ca2_w)); m_pia28->cb2_handler().set(FUNC(s11_state::pia28_cb2_w)); - m_pia28->irqa_handler().set(FUNC(s11_state::pia_irq)); - m_pia28->irqb_handler().set(FUNC(s11_state::pia_irq)); + m_pia28->irqa_handler().set(m_mainirq, FUNC(input_merger_device::in_w<5>)); + m_pia28->irqb_handler().set(m_mainirq, FUNC(input_merger_device::in_w<6>)); PIA6821(config, m_pia2c, 0); m_pia2c->writepa_handler().set(FUNC(s11b_state::pia2c_pa_w)); m_pia2c->writepb_handler().set(FUNC(s11b_state::pia2c_pb_w)); - m_pia2c->irqa_handler().set(FUNC(s11_state::pia_irq)); - m_pia2c->irqb_handler().set(FUNC(s11_state::pia_irq)); + m_pia2c->irqa_handler().set(m_mainirq, FUNC(input_merger_device::in_w<7>)); + m_pia2c->irqb_handler().set(m_mainirq, FUNC(input_merger_device::in_w<8>)); PIA6821(config, m_pia30, 0); m_pia30->readpa_handler().set(FUNC(s11_state::switch_r)); m_pia30->set_port_a_input_overrides_output_mask(0xff); m_pia30->writepb_handler().set(FUNC(s11_state::switch_w)); m_pia30->cb2_handler().set(FUNC(s11_state::pia30_cb2_w)); - m_pia30->irqa_handler().set(FUNC(s11_state::pia_irq)); - m_pia30->irqb_handler().set(FUNC(s11_state::pia_irq)); + m_pia30->irqa_handler().set(m_mainirq, FUNC(input_merger_device::in_w<9>)); + m_pia30->irqb_handler().set(m_mainirq, FUNC(input_merger_device::in_w<10>)); PIA6821(config, m_pia34, 0); m_pia34->writepa_handler().set(FUNC(s11b_state::pia34_pa_w)); m_pia34->writepb_handler().set(FUNC(s11b_state::pia34_pb_w)); m_pia34->cb2_handler().set(FUNC(s11b_state::pia34_cb2_w)); - m_pia34->irqa_handler().set(FUNC(s11_state::pia_irq)); - m_pia34->irqb_handler().set(FUNC(s11_state::pia_irq)); + m_pia34->irqa_handler().set(m_mainirq, FUNC(input_merger_device::in_w<11>)); + m_pia34->irqb_handler().set(m_mainirq, FUNC(input_merger_device::in_w<12>)); NVRAM(config, "nvram", nvram_device::DEFAULT_ALL_1); diff --git a/src/mame/drivers/s7.cpp b/src/mame/drivers/s7.cpp index 69448e4d29a..8e737b7d501 100644 --- a/src/mame/drivers/s7.cpp +++ b/src/mame/drivers/s7.cpp @@ -29,13 +29,10 @@ Note that T is also a tilt, but it may take 3 hits to activate it. A number of games are multiball therefore they either cannot start or the outhole is ineffective/unknown. All games can coin up. -Note: fpwr2_l2 can be started by holding down D (left ball ramp) and F (ball shooter trough) when pressing start. - - Game Outhole Tilt Notes ---------------------------------------------------------------------------------- Black Knight L Z C U To start, hold down LZC and press 1. -Firepower II S D To start, hold down SD and press 1. +Firepower II S D [D F] To start, hold down SD or DF and press 1. Defender rs I O To start, hold down IO and Right-Shift, then press 1. Pharoah Right Up To start, hold down Right and Down, and press 1 Starlight S D To start, hold down SD and press 1. diff --git a/src/mame/includes/s11.h b/src/mame/includes/s11.h index 5e577008726..fe378dfd1e5 100644 --- a/src/mame/includes/s11.h +++ b/src/mame/includes/s11.h @@ -13,6 +13,7 @@ #include "audio/s11c_bg.h" #include "machine/6821pia.h" #include "machine/genpin.h" +#include "machine/input_merger.h" #include "sound/dac.h" #include "sound/hc55516.h" #include "sound/ym2151.h" @@ -23,9 +24,14 @@ // 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 0x380 +// IRQ pulse width is always 32 cycles +// All machines I've looked at so far have W14 present and W15 absent +// which makes the timer int fire every 0x380 E-clocks (1MHz/0x380, ~1.116KHz) +// It is possible to have W15 present and W14 absent instead, +// which makes the timer fire every 0x700 E-clocks (1MHz/0x700, ~558Hz) +// but I am unaware of any games which make use of this feature. +// define the define below to enable the W15-instead-of-W14 feature. +#undef S11_W15 class s11_state : public genpin_class { @@ -33,7 +39,10 @@ public: s11_state(const machine_config &mconfig, device_type type, const char *tag) : genpin_class(mconfig, type, tag) , m_maincpu(*this, "maincpu") + , m_mainirq(*this, "mainirq") + , m_piairq(*this, "piairq") , m_audiocpu(*this, "audiocpu") + , m_audioirq(*this, "audioirq") , m_bgcpu(*this, "bgcpu") , m_hc55516(*this, "hc55516") , m_pias(*this, "pias") @@ -85,6 +94,7 @@ public: 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); + DECLARE_WRITE_LINE_MEMBER(main_irq); uint8_t switch_r(); void switch_w(uint8_t data); @@ -98,7 +108,10 @@ protected: // devices required_device m_maincpu; + required_device m_mainirq; + required_device m_piairq; optional_device m_audiocpu; + optional_device m_audioirq; optional_device m_bgcpu; optional_device m_hc55516; optional_device m_pias; @@ -137,8 +150,10 @@ private: uint8_t m_diag; uint32_t m_segment1; uint32_t m_segment2; + uint32_t m_timer_count; emu_timer* m_irq_timer; - bool m_irq_active; + bool m_timer_irq_active; + bool m_pia_irq_active; }; #endif // MAME_INCLUDES_S11_H