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

View File

@ -68,7 +68,7 @@ private:
devcb_read_line m_sense_handler; devcb_read_line m_sense_handler;
devcb_write_line m_flag_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_ppc; /* previous program counter (page + iar) */
uint16_t m_page; /* 8K page select register (A14..A13) */ 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) 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(); 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->set_addrmap(AS_DATA, &galaxia_state::galaxia_data_map);
m_maincpu->sense_handler().set("screen", FUNC(screen_device::vblank)); m_maincpu->sense_handler().set("screen", FUNC(screen_device::vblank));
m_maincpu->flag_handler().set(FUNC(galaxia_state::write_s2650_flag)); 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 */ /* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER); 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->set_addrmap(AS_DATA, &galaxia_state::galaxia_data_map);
m_maincpu->sense_handler().set("screen", FUNC(screen_device::vblank)); m_maincpu->sense_handler().set("screen", FUNC(screen_device::vblank));
m_maincpu->flag_handler().set(FUNC(galaxia_state::write_s2650_flag)); 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 */ /* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER); 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(); uint8_t switches = ioport("SW")->read();
// Set vector from INDIRECT sw
uint8_t vector = BIT(switches, 0) ? 0x87 : 0x07;
// Check INT sw & key // Check INT sw & key
if (BIT(switches, 1)) 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 else
// process ac input // process ac input
{ {
m_irqstate ^= 1; 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->set_periodic_int(FUNC(instruct_state::t2l_int), attotime::from_hz(120));
m_maincpu->sense_handler().set(FUNC(instruct_state::sense_r)); m_maincpu->sense_handler().set(FUNC(instruct_state::sense_r));
m_maincpu->flag_handler().set(FUNC(instruct_state::flag_w)); 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 */ /* video hardware */
config.set_default_layout(layout_instruct); config.set_default_layout(layout_instruct);

View File

@ -409,7 +409,7 @@ GFXDECODE_END
INTERRUPT_GEN_MEMBER(laserbat_state_base::laserbat_interrupt) 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() 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_addrmap(AS_IO, &laserbat_state_base::laserbat_io_map);
m_maincpu->set_vblank_int("screen", FUNC(laserbat_state_base::laserbat_interrupt)); 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->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 // video hardware
SCREEN(config, m_screen, SCREEN_TYPE_RASTER); 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) 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 */ /* basic machine hardware */
S2650(config, m_maincpu, MASTER_CLOCK/8); /* 5MHz / 8 = 625 kHz */ S2650(config, m_maincpu, MASTER_CLOCK/8); /* 5MHz / 8 = 625 kHz */
m_maincpu->set_addrmap(AS_PROGRAM, &meadows_state::meadows_main_map); 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 */ S2650(config, m_audiocpu, MASTER_CLOCK/8); /* 5MHz / 8 = 625 kHz */
m_audiocpu->set_addrmap(AS_PROGRAM, &meadows_state::audio_map); 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) WRITE_LINE_MEMBER(pacman_state::s2650_interrupt)
{ {
if (state) 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) 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_PROGRAM, &pacman_state::s2650games_map);
maincpu.set_addrmap(AS_DATA, &pacman_state::s2650games_dataport); maincpu.set_addrmap(AS_DATA, &pacman_state::s2650games_dataport);
maincpu.sense_handler().set("screen", FUNC(screen_device::vblank)).invert(); 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<0>().set_nop();
m_mainlatch->q_out_cb<1>().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) 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_addrmap(AS_DATA, &quasar_state::quasar_data);
m_maincpu->set_vblank_int("screen", FUNC(quasar_state::quasar_interrupt)); m_maincpu->set_vblank_int("screen", FUNC(quasar_state::quasar_interrupt));
m_maincpu->sense_handler().set("screen", FUNC(screen_device::vblank)); 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 */ i8035_device &soundcpu(I8035(config, "soundcpu", 6000000)); /* 6MHz crystal divide by 15 in CPU */
soundcpu.set_addrmap(AS_PROGRAM, &quasar_state::sound_map); 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) 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 = 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_addrmap(AS_DATA, &seabattl_state::seabattl_data_map);
m_maincpu->set_vblank_int("screen", FUNC(seabattl_state::seabattl_interrupt)); m_maincpu->set_vblank_int("screen", FUNC(seabattl_state::seabattl_interrupt));
m_maincpu->sense_handler().set("screen", FUNC(screen_device::vblank)); 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); S2636(config, m_s2636, 0);
m_s2636->set_offsets(-13, -29); m_s2636->set_offsets(-13, -29);
m_s2636->add_route(ALL_OUTPUTS, "mono", 0.10); 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) 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 = 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_addrmap(AS_DATA, &subhuntr_state::subhuntr_data_map);
m_maincpu->set_vblank_int("screen", FUNC(subhuntr_state::subhuntr_interrupt)); m_maincpu->set_vblank_int("screen", FUNC(subhuntr_state::subhuntr_interrupt));
m_maincpu->sense_handler().set("screen", FUNC(screen_device::vblank)); 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_device &s2636(S2636(config, "s2636", 0));
//s2636.set_offsets(3, -21); //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->set_addrmap(AS_PROGRAM, &vc4000_state::vc4000_mem);
m_maincpu->sense_handler().set(FUNC(vc4000_state::vc4000_vsync_r)); 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->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 */ /* video hardware */
SCREEN(config, m_screen, SCREEN_TYPE_RASTER); 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) TIMER_DEVICE_CALLBACK_MEMBER(zac_1_state::zac_1_inttimer)
{ {
if (m_t_c > 0x40) if (m_t_c > 0x40)
{ m_maincpu->set_input_line(INPUT_LINE_IRQ0, ASSERT_LINE);
uint8_t vector = (ioport("TEST")->read() ) ? 0x10 : 0x18;
m_maincpu->set_input_line_and_vector(INPUT_LINE_IRQ0, ASSERT_LINE, vector); // S2650
}
else else
m_t_c++; 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->set_addrmap(AS_DATA, &zac_1_state::zac_1_data);
m_maincpu->sense_handler().set(FUNC(zac_1_state::serial_r)); m_maincpu->sense_handler().set(FUNC(zac_1_state::serial_r));
m_maincpu->flag_handler().set(FUNC(zac_1_state::serial_w)); 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); 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[1].finished_now) |
(m_video.sprites[0].finished_now)) && (!m_irq_pause)) (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; m_irq_pause=1;
} }
} }