s2650: Get the vector from the ack reqeust, remove use of set_input_line_and_vector and HOLD_MODE [O. Galibert]

This commit is contained in:
Olivier Galibert 2020-04-02 19:49:45 +02:00
parent 40bd4325e8
commit 06f16e4793
13 changed files with 27 additions and 24 deletions

View File

@ -209,17 +209,15 @@ inline int s2650_device::check_irq_line()
{
if( (m_psu & II) == 0 )
{
int vector;
if (m_halt)
{
m_halt = 0;
m_iar = (m_iar + 1) & PMSK;
}
vector = standard_irq_callback(0) & 0xff;
standard_irq_callback(0);
/* Say hi */
m_intack_handler(true);
int vector = m_intack_handler();
/* build effective address within first 8K page */
m_ea = S2650_relative[vector] & PMSK;
if (vector & 0x80) /* indirect bit set ? */
@ -824,7 +822,7 @@ void s2650_device::device_start()
{
m_sense_handler.resolve();
m_flag_handler.resolve_safe();
m_intack_handler.resolve_safe();
m_intack_handler.resolve_safe(0x00);
m_cache = space(AS_PROGRAM).cache<0, 0, ENDIANNESS_BIG>();

View File

@ -68,7 +68,7 @@ private:
devcb_read_line m_sense_handler;
devcb_write_line m_flag_handler;
devcb_write_line m_intack_handler;
devcb_read8 m_intack_handler;
uint16_t m_ppc; /* previous program counter (page + iar) */
uint16_t m_page; /* 8K page select register (A14..A13) */

View File

@ -87,7 +87,7 @@ WRITE_LINE_MEMBER(galaxia_state::vblank_irq)
{
if (state)
{
m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0x03); // S2650
m_maincpu->set_input_line(0, ASSERT_LINE);
cvs_scroll_stars();
}
}
@ -309,6 +309,7 @@ void galaxia_state::galaxia(machine_config &config)
m_maincpu->set_addrmap(AS_DATA, &galaxia_state::galaxia_data_map);
m_maincpu->sense_handler().set("screen", FUNC(screen_device::vblank));
m_maincpu->flag_handler().set(FUNC(galaxia_state::write_s2650_flag));
m_maincpu->intack_handler().set([this]() { m_maincpu->set_input_line(0, CLEAR_LINE); return 0x03; });
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);
@ -351,6 +352,7 @@ void galaxia_state::astrowar(machine_config &config)
m_maincpu->set_addrmap(AS_DATA, &galaxia_state::galaxia_data_map);
m_maincpu->sense_handler().set("screen", FUNC(screen_device::vblank));
m_maincpu->flag_handler().set(FUNC(galaxia_state::write_s2650_flag));
m_maincpu->intack_handler().set([this]() { m_maincpu->set_input_line(0, CLEAR_LINE); return 0x03; });
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);

View File

@ -208,17 +208,14 @@ INTERRUPT_GEN_MEMBER( instruct_state::t2l_int )
{
uint8_t switches = ioport("SW")->read();
// Set vector from INDIRECT sw
uint8_t vector = BIT(switches, 0) ? 0x87 : 0x07;
// Check INT sw & key
if (BIT(switches, 1))
device.execute().set_input_line_and_vector(0, BIT(hwkeys, 1) ? ASSERT_LINE : CLEAR_LINE, vector); // S2650
device.execute().set_input_line(0, BIT(hwkeys, 1) ? ASSERT_LINE : CLEAR_LINE);
else
// process ac input
{
m_irqstate ^= 1;
device.execute().set_input_line_and_vector(0, m_irqstate ? ASSERT_LINE : CLEAR_LINE, vector); // S2650
device.execute().set_input_line(0, m_irqstate ? ASSERT_LINE : CLEAR_LINE);
}
}
}
@ -430,6 +427,8 @@ void instruct_state::instruct(machine_config &config)
m_maincpu->set_periodic_int(FUNC(instruct_state::t2l_int), attotime::from_hz(120));
m_maincpu->sense_handler().set(FUNC(instruct_state::sense_r));
m_maincpu->flag_handler().set(FUNC(instruct_state::flag_w));
// Set vector from INDIRECT sw
m_maincpu->intack_handler().set([this]() { return BIT(ioport("SW")->read(), 0) ? 0x87 : 0x07; });
/* video hardware */
config.set_default_layout(layout_instruct);

View File

@ -409,7 +409,7 @@ GFXDECODE_END
INTERRUPT_GEN_MEMBER(laserbat_state_base::laserbat_interrupt)
{
device.execute().set_input_line_and_vector(0, HOLD_LINE, 0x0a); // S2650
m_maincpu->set_input_line(0, ASSERT_LINE);
}
void laserbat_state_base::init_laserbat()
@ -470,6 +470,7 @@ void laserbat_state_base::laserbat_base(machine_config &config)
m_maincpu->set_addrmap(AS_IO, &laserbat_state_base::laserbat_io_map);
m_maincpu->set_vblank_int("screen", FUNC(laserbat_state_base::laserbat_interrupt));
m_maincpu->sense_handler().set(m_screen, FUNC(screen_device::vblank));
m_maincpu->intack_handler().set([this]() { m_maincpu->set_input_line(0, CLEAR_LINE); return 0x0a; });
// video hardware
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);

View File

@ -201,7 +201,7 @@ WRITE8_MEMBER(meadows_state::meadows_audio_w)
INPUT_CHANGED_MEMBER(meadows_state::coin_inserted)
{
m_maincpu->set_input_line_and_vector(0, (newval ? ASSERT_LINE : CLEAR_LINE), 0x82); // S2650
m_maincpu->set_input_line(0, (newval ? ASSERT_LINE : CLEAR_LINE));
}
@ -626,6 +626,7 @@ void meadows_state::meadows(machine_config &config)
/* basic machine hardware */
S2650(config, m_maincpu, MASTER_CLOCK/8); /* 5MHz / 8 = 625 kHz */
m_maincpu->set_addrmap(AS_PROGRAM, &meadows_state::meadows_main_map);
m_maincpu->intack_handler().set([]() { return 0x82; });
S2650(config, m_audiocpu, MASTER_CLOCK/8); /* 5MHz / 8 = 625 kHz */
m_audiocpu->set_addrmap(AS_PROGRAM, &meadows_state::audio_map);

View File

@ -727,7 +727,7 @@ READ8_MEMBER(pacman_state::bigbucks_question_r)
WRITE_LINE_MEMBER(pacman_state::s2650_interrupt)
{
if (state)
m_maincpu->set_input_line_and_vector(0, HOLD_LINE, 0x03); // S2650
m_maincpu->set_input_line(0, ASSERT_LINE);
}
WRITE8_MEMBER(pacman_state::porky_banking_w)
@ -3773,6 +3773,7 @@ void pacman_state::s2650games(machine_config &config)
maincpu.set_addrmap(AS_PROGRAM, &pacman_state::s2650games_map);
maincpu.set_addrmap(AS_DATA, &pacman_state::s2650games_dataport);
maincpu.sense_handler().set("screen", FUNC(screen_device::vblank)).invert();
maincpu.intack_handler().set([this]() { m_maincpu->set_input_line(0, CLEAR_LINE); return 0x03; });
m_mainlatch->q_out_cb<0>().set_nop();
m_mainlatch->q_out_cb<1>().set_nop();

View File

@ -272,7 +272,7 @@ GFXDECODE_END
INTERRUPT_GEN_MEMBER(quasar_state::quasar_interrupt)
{
device.execute().set_input_line_and_vector(0, HOLD_LINE, 0x03); // S2650
m_maincpu->set_input_line(0, ASSERT_LINE);
}
// ****************************************
@ -307,6 +307,7 @@ void quasar_state::quasar(machine_config &config)
m_maincpu->set_addrmap(AS_DATA, &quasar_state::quasar_data);
m_maincpu->set_vblank_int("screen", FUNC(quasar_state::quasar_interrupt));
m_maincpu->sense_handler().set("screen", FUNC(screen_device::vblank));
m_maincpu->intack_handler().set([this]() { m_maincpu->set_input_line(0, CLEAR_LINE); return 0x03; });
i8035_device &soundcpu(I8035(config, "soundcpu", 6000000)); /* 6MHz crystal divide by 15 in CPU */
soundcpu.set_addrmap(AS_PROGRAM, &quasar_state::sound_map);

View File

@ -449,7 +449,7 @@ void seabattl_state::machine_reset()
INTERRUPT_GEN_MEMBER(seabattl_state::seabattl_interrupt)
{
device.execute().set_input_line_and_vector(0, HOLD_LINE, 0x03); // S2650
m_maincpu->set_input_line(0, ASSERT_LINE);
}
static const gfx_layout tiles32x16x3_layout =
@ -489,7 +489,7 @@ void seabattl_state::seabattl(machine_config &config)
m_maincpu->set_addrmap(AS_DATA, &seabattl_state::seabattl_data_map);
m_maincpu->set_vblank_int("screen", FUNC(seabattl_state::seabattl_interrupt));
m_maincpu->sense_handler().set("screen", FUNC(screen_device::vblank));
m_maincpu->intack_handler().set([this]() { m_maincpu->set_input_line(0, CLEAR_LINE); return 0x03; });
S2636(config, m_s2636, 0);
m_s2636->set_offsets(-13, -29);
m_s2636->add_route(ALL_OUTPUTS, "mono", 0.10);

View File

@ -124,7 +124,7 @@ void subhuntr_state::machine_reset()
INTERRUPT_GEN_MEMBER(subhuntr_state::subhuntr_interrupt)
{
device.execute().set_input_line_and_vector(0, HOLD_LINE, 0x03); // S2650
m_maincpu->set_input_line(0, ASSERT_LINE);
}
static const gfx_layout tiles8x8_layout =
@ -152,6 +152,7 @@ void subhuntr_state::subhuntr(machine_config &config)
m_maincpu->set_addrmap(AS_DATA, &subhuntr_state::subhuntr_data_map);
m_maincpu->set_vblank_int("screen", FUNC(subhuntr_state::subhuntr_interrupt));
m_maincpu->sense_handler().set("screen", FUNC(screen_device::vblank));
m_maincpu->intack_handler().set([this]() { m_maincpu->set_input_line(0, CLEAR_LINE); return 0x03; });
//s2636_device &s2636(S2636(config, "s2636", 0));
//s2636.set_offsets(3, -21);

View File

@ -534,6 +534,7 @@ void vc4000_state::vc4000(machine_config &config)
m_maincpu->set_addrmap(AS_PROGRAM, &vc4000_state::vc4000_mem);
m_maincpu->sense_handler().set(FUNC(vc4000_state::vc4000_vsync_r));
m_maincpu->set_periodic_int(FUNC(vc4000_state::vc4000_video_line), attotime::from_hz(312*53)); // GOLF needs this exact value
m_maincpu->intack_handler().set([]() { return 0x03; });
/* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER);

View File

@ -223,10 +223,7 @@ void zac_1_state::machine_reset()
TIMER_DEVICE_CALLBACK_MEMBER(zac_1_state::zac_1_inttimer)
{
if (m_t_c > 0x40)
{
uint8_t vector = (ioport("TEST")->read() ) ? 0x10 : 0x18;
m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, ASSERT_LINE, vector); // S2650
}
m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE);
else
m_t_c++;
}
@ -268,6 +265,7 @@ void zac_1_state::zac_1(machine_config &config)
m_maincpu->set_addrmap(AS_DATA, &zac_1_state::zac_1_data);
m_maincpu->sense_handler().set(FUNC(zac_1_state::serial_r));
m_maincpu->flag_handler().set(FUNC(zac_1_state::serial_w));
m_maincpu->intack_handler().set([this]() { return (ioport("TEST")->read() ) ? 0x10 : 0x18; });
NVRAM(config, "ram", nvram_device::DEFAULT_ALL_0);

View File

@ -641,7 +641,7 @@ INTERRUPT_GEN_MEMBER(vc4000_state::vc4000_video_line)
(m_video.sprites[1].finished_now) |
(m_video.sprites[0].finished_now)) && (!m_irq_pause))
{
m_maincpu->set_input_line_and_vector(0, ASSERT_LINE, 3); // S2650
m_maincpu->set_input_line(0, ASSERT_LINE);
m_irq_pause=1;
}
}