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]

This commit is contained in:
Lord-Nightmare 2020-06-29 00:59:53 -04:00
parent 0f221ab8d7
commit 3d7bf5a176
6 changed files with 128 additions and 97 deletions

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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);

View File

@ -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.

View File

@ -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<cpu_device> m_maincpu;
required_device<input_merger_device> m_mainirq;
required_device<input_merger_device> m_piairq;
optional_device<m6802_cpu_device> m_audiocpu;
optional_device<input_merger_device> m_audioirq;
optional_device<cpu_device> m_bgcpu;
optional_device<hc55516_device> m_hc55516;
optional_device<pia6821_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