mirror of
https://github.com/holub/mame
synced 2025-04-22 16:31:49 +03:00
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:
parent
0f221ab8d7
commit
3d7bf5a176
@ -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
|
||||
|
@ -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
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
||||
|
@ -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.
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user