From 5db1c2fc0b5ba63994afe93a84e8301a8a1e354e Mon Sep 17 00:00:00 2001 From: AJR Date: Sun, 18 Feb 2018 21:20:32 -0500 Subject: msm6242: Deassert interrupt output when the IRQ flag is cleared --- src/devices/machine/msm6242.cpp | 35 ++++++++++++++++++++++++++--------- src/devices/machine/msm6242.h | 1 + src/mame/drivers/ddenlovr.cpp | 2 +- src/mame/drivers/dynax.cpp | 18 +----------------- src/mame/includes/dynax.h | 2 -- 5 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/devices/machine/msm6242.cpp b/src/devices/machine/msm6242.cpp index 63742faa087..62cb24b641f 100644 --- a/src/devices/machine/msm6242.cpp +++ b/src/devices/machine/msm6242.cpp @@ -129,8 +129,7 @@ void msm6242_device::device_start() void msm6242_device::device_reset() { - if (!m_out_int_handler.isnull()) - m_out_int_handler(CLEAR_LINE); + set_irq(false); } @@ -180,6 +179,21 @@ void msm6242_device::device_timer(emu_timer &timer, device_timer_id id, int para } +//------------------------------------------------- +// set_irq - set the IRQ flag and output +//------------------------------------------------- + +void msm6242_device::set_irq(bool active) +{ + if (active) + m_reg[0] |= 0x04; + else + m_reg[0] &= 0x0b; + + if (!m_out_int_handler.isnull()) + m_out_int_handler(active ? ASSERT_LINE : CLEAR_LINE); +} + //------------------------------------------------- // irq @@ -194,8 +208,7 @@ void msm6242_device::irq(uint8_t irq_type) LOGIRQ("%s: MSM6242 logging IRQ #%u\n", machine().describe_context(), irq_type); // ...and assert the output line - if (!m_out_int_handler.isnull()) - m_out_int_handler(ASSERT_LINE); + set_irq(true); } } @@ -515,10 +528,15 @@ WRITE8_MEMBER( msm6242_device::write ) { case MSM6242_REG_CD: // x--- 30s ADJ - // -x-- IRQ FLAG - // --x- BUSY + // -x-- IRQ FLAG (software can only clear this) + // --x- BUSY (read-only) // ---x HOLD - m_reg[0] = data & 0x0f; + if (!BIT(data, 2) && BIT(m_reg[0], 2)) + { + LOGIRQENABLE("%s: MSM6242 acknowledging irq\n", machine().describe_context()); + set_irq(false); + } + m_reg[0] = (data & 0x09) | (m_reg[0] & 0x06); break; case MSM6242_REG_CE: @@ -536,8 +554,7 @@ WRITE8_MEMBER( msm6242_device::write ) else { m_irq_flag = 0; - if ( !m_out_int_handler.isnull() ) - m_out_int_handler( CLEAR_LINE ); + set_irq(false); LOGIRQENABLE("%s: MSM6242 disabling irq\n", machine().describe_context()); } diff --git a/src/devices/machine/msm6242.h b/src/devices/machine/msm6242.h index 0a1ee9b1863..2c99b9eada3 100644 --- a/src/devices/machine/msm6242.h +++ b/src/devices/machine/msm6242.h @@ -93,6 +93,7 @@ private: // methods void rtc_timer_callback(); uint64_t current_time(); + void set_irq(bool active); void irq(uint8_t irq_type); uint64_t bump(int rtc_register, uint64_t delta, uint64_t register_min, uint64_t register_range); void update_rtc_registers(); diff --git a/src/mame/drivers/ddenlovr.cpp b/src/mame/drivers/ddenlovr.cpp index 1cce6aea702..2daf04e9e75 100644 --- a/src/mame/drivers/ddenlovr.cpp +++ b/src/mame/drivers/ddenlovr.cpp @@ -4353,7 +4353,6 @@ MACHINE_CONFIG_START(ddenlovr_state::htengoku) MCFG_CPU_PROGRAM_MAP(htengoku_mem_map) MCFG_CPU_IO_MAP(htengoku_io_map) MCFG_CPU_VBLANK_INT_DRIVER("screen", ddenlovr_state, sprtmtch_vblank_interrupt) /* IM 0 needs an opcode on the data bus */ - MCFG_CPU_PERIODIC_INT_DRIVER(ddenlovr_state, yarunara_clock_interrupt, 60) // RTC MCFG_CPU_IRQ_ACKNOWLEDGE_DEVICE("mainirq", rst_pos_buffer_device, inta_cb) MCFG_DEVICE_ADD("bankdev", ADDRESS_MAP_BANK, 0) @@ -4403,6 +4402,7 @@ MACHINE_CONFIG_START(ddenlovr_state::htengoku) /* devices */ MCFG_DEVICE_ADD("rtc", MSM6242, XTAL(32'768)) + MCFG_MSM6242_OUT_INT_HANDLER(DEVWRITELINE("mainirq", rst_pos_buffer_device, rst1_w)) MACHINE_CONFIG_END diff --git a/src/mame/drivers/dynax.cpp b/src/mame/drivers/dynax.cpp index 4d392e992e5..ede6a78500b 100644 --- a/src/mame/drivers/dynax.cpp +++ b/src/mame/drivers/dynax.cpp @@ -4060,7 +4060,6 @@ MACHINE_START_MEMBER(dynax_state,dynax) save_item(NAME(m_resetkludge)); save_item(NAME(m_toggle)); save_item(NAME(m_toggle_cpu1)); - save_item(NAME(m_yarunara_clk_toggle)); save_item(NAME(m_rombank)); save_item(NAME(m_tenkai_p5_val)); save_item(NAME(m_tenkai_6c)); @@ -4087,7 +4086,6 @@ MACHINE_RESET_MEMBER(dynax_state,dynax) m_resetkludge = 0; m_toggle = 0; m_toggle_cpu1 = 0; - m_yarunara_clk_toggle = 0; m_rombank = 0; m_tenkai_p5_val = 0; m_tenkai_6c = 0; @@ -4488,20 +4486,6 @@ MACHINE_CONFIG_END Yarunara / Quiz TV Q&Q / Mahjong Angels ***************************************************************************/ -/* the old code here didn't work.. - what was it trying to do? - set an irq and clear it before its even taken? */ - -INTERRUPT_GEN_MEMBER(dynax_state::yarunara_clock_interrupt) -{ - m_yarunara_clk_toggle ^= 1; - - if (m_yarunara_clk_toggle == 1) - m_mainirq->rst1_w(0); - else - m_mainirq->rst1_w(1); -} - MACHINE_CONFIG_START(dynax_state::yarunara) hnoridur(config); @@ -4509,7 +4493,6 @@ MACHINE_CONFIG_START(dynax_state::yarunara) MCFG_CPU_MODIFY("maincpu") MCFG_CPU_PROGRAM_MAP(yarunara_mem_map) MCFG_CPU_IO_MAP(yarunara_io_map) - MCFG_CPU_PERIODIC_INT_DRIVER(dynax_state, yarunara_clock_interrupt, 60) // RTC MCFG_DEVICE_MODIFY("bankdev") MCFG_DEVICE_PROGRAM_MAP(yarunara_banked_map) @@ -4523,6 +4506,7 @@ MACHINE_CONFIG_START(dynax_state::yarunara) /* devices */ MCFG_DEVICE_ADD("rtc", MSM6242, XTAL(32'768)) + MCFG_MSM6242_OUT_INT_HANDLER(DEVWRITELINE("mainirq", rst_pos_buffer_device, rst1_w)) MACHINE_CONFIG_END MACHINE_CONFIG_START(dynax_state::mjangels) diff --git a/src/mame/includes/dynax.h b/src/mame/includes/dynax.h index 0c45319d24c..f93f264415e 100644 --- a/src/mame/includes/dynax.h +++ b/src/mame/includes/dynax.h @@ -127,7 +127,6 @@ public: int m_resetkludge; int m_toggle; int m_toggle_cpu1; - int m_yarunara_clk_toggle; int m_rombank; uint8_t m_tenkai_p5_val; int m_tenkai_6c; @@ -257,7 +256,6 @@ public: INTERRUPT_GEN_MEMBER(sprtmtch_vblank_interrupt); INTERRUPT_GEN_MEMBER(jantouki_vblank_interrupt); INTERRUPT_GEN_MEMBER(jantouki_sound_vblank_interrupt); - INTERRUPT_GEN_MEMBER(yarunara_clock_interrupt); void tenkai_update_rombank(); -- cgit v1.2.3