From 47a8a4e437c12dc080a8218c8004b73210c61a60 Mon Sep 17 00:00:00 2001 From: AJR Date: Sat, 18 Mar 2023 19:10:06 -0400 Subject: mc68hc11: Use standard interrupt handling for RESET vector; add XIRQ input --- src/devices/cpu/mc68hc11/mc68hc11.cpp | 25 +++++++++++++++++-------- src/devices/cpu/mc68hc11/mc68hc11.h | 3 +-- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/src/devices/cpu/mc68hc11/mc68hc11.cpp b/src/devices/cpu/mc68hc11/mc68hc11.cpp index ab0da72880e..253927ed71c 100644 --- a/src/devices/cpu/mc68hc11/mc68hc11.cpp +++ b/src/devices/cpu/mc68hc11/mc68hc11.cpp @@ -1013,8 +1013,7 @@ void mc68hc11_cpu_device::device_reset() } } - m_pc = READ16(0xfffe); // TODO: vectors differ in bootstrap and special test modes - m_wait_state = 0; + m_wait_state = 1; m_stop_state = 0; m_ccr = CC_X | CC_I | CC_S; init_w(m_init_value); @@ -1028,7 +1027,7 @@ void mc68hc11_cpu_device::device_reset() m_tflg2 = 0; m_tmsk2 = 3; // timer prescale m_pactl = 0; - m_irq_state = 0; + m_irq_state = 0x80000000 | (m_irq_state & 0x04000000); if (m_irq_asserted) set_irq_state(0x06, true); m_frc_base = m_reset_time = total_cycles(); @@ -1155,9 +1154,12 @@ void mc68hc11_cpu_device::check_irq_lines() } } - if (m_irq_state != 0 && (!(m_ccr & CC_I))) + uint32_t irq_state = m_irq_state; + if (m_ccr & CC_X) + irq_state &= ~0x04000000; // mask XIRQ out + if (irq_state != 0 && (!(m_ccr & CC_I) || (irq_state >= 0x04000000))) { - int level = count_leading_zeros_32(m_irq_state); // TODO: respect HPRIO setting + int level = count_leading_zeros_32(irq_state); // TODO: respect HPRIO setting standard_irq_callback(level, m_pc); if(m_wait_state == 0) @@ -1169,13 +1171,16 @@ void mc68hc11_cpu_device::check_irq_lines() PUSH8(REG_B); PUSH8(m_ccr); } + // TODO: vectors differ in bootstrap and special test modes uint16_t pc_vector = READ16(0xfffe - level * 2); SET_PC(pc_vector); m_ccr |= CC_I; //irq taken, mask the flag - if(m_wait_state == 1) { m_wait_state = 2; } + if (level < 0x06) + m_ccr |= CC_X; + if(m_wait_state == 1) { m_wait_state = level == 0 ? 0 : 2; } if(m_stop_state == 1) { m_stop_state = 2; } - if (level == 0x06 && BIT(m_option, 5)) - set_irq_state(0x06, false); // auto-ack edge-triggered IRQ + if (level < 0x05 || (level == 0x06 && BIT(m_option, 5))) + set_irq_state(level, false); // auto-ack edge-triggered IRQ } } @@ -1200,6 +1205,10 @@ void mc68hc11_cpu_device::execute_set_input(int inputnum, int state) m_irq_asserted = state != CLEAR_LINE; break; + case MC68HC11_XIRQ_LINE: + set_irq_state(0x05, state != CLEAR_LINE); + break; + default: logerror("Unknown input %d = %d\n", inputnum, state); break; diff --git a/src/devices/cpu/mc68hc11/mc68hc11.h b/src/devices/cpu/mc68hc11/mc68hc11.h index f5577ecaf62..964ab90fefe 100644 --- a/src/devices/cpu/mc68hc11/mc68hc11.h +++ b/src/devices/cpu/mc68hc11/mc68hc11.h @@ -8,8 +8,7 @@ enum { MC68HC11_IRQ_LINE = 0, - MC68HC11_TOC1_LINE = 1, - MC68HC11_RTI_LINE = 2 + MC68HC11_XIRQ_LINE = 1 }; DECLARE_DEVICE_TYPE(MC68HC11A1, mc68hc11a1_device) -- cgit v1.2.3