diff options
Diffstat (limited to 'src/devices/bus/ti99/peb/tn_ide.cpp')
-rw-r--r-- | src/devices/bus/ti99/peb/tn_ide.cpp | 57 |
1 files changed, 26 insertions, 31 deletions
diff --git a/src/devices/bus/ti99/peb/tn_ide.cpp b/src/devices/bus/ti99/peb/tn_ide.cpp index 2a31a86dd6a..52c30daa262 100644 --- a/src/devices/bus/ti99/peb/tn_ide.cpp +++ b/src/devices/bus/ti99/peb/tn_ide.cpp @@ -122,15 +122,15 @@ #include "emu.h" #include "tn_ide.h" -#define LOG_WARN (1U<<1) -#define LOG_CRU (1U<<2) -#define LOG_RTC (1U<<3) -#define LOG_XRAM (1U<<4) -#define LOG_SRAM (1U<<5) -#define LOG_ATA (1U<<6) -#define LOG_SRAMH (1U<<7) +#define LOG_WARN (1U << 1) +#define LOG_CRU (1U << 2) +#define LOG_RTC (1U << 3) +#define LOG_XRAM (1U << 4) +#define LOG_SRAM (1U << 5) +#define LOG_ATA (1U << 6) +#define LOG_SRAMH (1U << 7) -#define VERBOSE ( LOG_GENERAL | LOG_WARN ) +#define VERBOSE (LOG_GENERAL | LOG_WARN) #include "logmacro.h" @@ -529,20 +529,7 @@ void nouspikel_ide_card_device::crureadz(offs_t offset, uint8_t *value) bit = m_srammap? 1:0; break; case 2: - if (m_rtctype==RTC65) - bit = (m_rtc65->intrq_r()==ASSERT_LINE)? 0:1; - else - { - if (m_rtctype==RTC47) - bit = (m_rtc47->intrq_r()==ASSERT_LINE)? 0:1; - else - { - if (m_rtctype==RTC42) - bit = (m_rtc42->intrq_r()==ASSERT_LINE)? 0:1; - else - bit = (m_rtc52->intrq_r()==ASSERT_LINE)? 0:1; - } - } + bit = BIT(m_rtc_int, m_rtctype); break; case 3: bit = 1; @@ -606,18 +593,25 @@ void nouspikel_ide_card_device::cruwrite(offs_t offset, uint8_t data) } } -WRITE_LINE_MEMBER(nouspikel_ide_card_device::clock_interrupt_callback) +template<int rtctype> +void nouspikel_ide_card_device::rtc_int_callback(int state) { - m_slot->set_inta(state); + if (state) + m_rtc_int |= 1 << rtctype; + else + m_rtc_int &= ~(1 << rtctype); + + if (rtctype == m_rtctype) + m_slot->set_inta(state ? CLEAR_LINE : ASSERT_LINE); } -WRITE_LINE_MEMBER(nouspikel_ide_card_device::ide_interrupt_callback) +void nouspikel_ide_card_device::ide_interrupt_callback(int state) { m_ideint = (state==ASSERT_LINE); if (m_crulatch->q6_r()==1) m_slot->set_inta(state); } -WRITE_LINE_MEMBER(nouspikel_ide_card_device::resetdr_callback) +void nouspikel_ide_card_device::resetdr_callback(int state) { if (m_crulatch->q6_r()==1 && (state==0)) // not implemented @@ -632,10 +626,10 @@ void nouspikel_ide_card_device::device_add_mconfig(machine_config &config) BQ4842(config, m_rtc42, 0); BQ4852(config, m_rtc52, 0); - m_rtc65->interrupt_cb().set(FUNC(nouspikel_ide_card_device::clock_interrupt_callback)); - m_rtc47->interrupt_cb().set(FUNC(nouspikel_ide_card_device::clock_interrupt_callback)); - m_rtc42->interrupt_cb().set(FUNC(nouspikel_ide_card_device::clock_interrupt_callback)); - m_rtc52->interrupt_cb().set(FUNC(nouspikel_ide_card_device::clock_interrupt_callback)); + m_rtc65->interrupt_cb().set(FUNC(nouspikel_ide_card_device::rtc_int_callback<RTC65>)).invert(); + m_rtc47->int_handler().set(FUNC(nouspikel_ide_card_device::rtc_int_callback<RTC47>)); + m_rtc42->interrupt_cb().set(FUNC(nouspikel_ide_card_device::rtc_int_callback<RTC42>)).invert(); + m_rtc52->interrupt_cb().set(FUNC(nouspikel_ide_card_device::rtc_int_callback<RTC52>)).invert(); ATA_INTERFACE(config, m_ata).options(ata_devices, "hdd", nullptr, false); m_ata->irq_handler().set(FUNC(nouspikel_ide_card_device::ide_interrupt_callback)); @@ -658,6 +652,7 @@ void nouspikel_ide_card_device::device_start() { save_item(NAME(m_ideint)); save_item(NAME(m_page)); + save_item(NAME(m_rtc_int)); } void nouspikel_ide_card_device::device_reset() @@ -677,7 +672,7 @@ void nouspikel_ide_card_device::device_reset() m_sram->set_buffered(m_rtctype == RTC47); // Only activate the selected RTC - m_rtc47->connect_osc(ioport("RTC")->read()==1); + m_rtc47->set_unscaled_clock((ioport("RTC")->read()==1) ? 32768 : 0); m_rtc42->connect_osc(ioport("RTC")->read()==2); m_rtc52->connect_osc(ioport("RTC")->read()==3); } |