diff options
Diffstat (limited to 'src/devices/machine/am9519.cpp')
-rw-r--r-- | src/devices/machine/am9519.cpp | 135 |
1 files changed, 68 insertions, 67 deletions
diff --git a/src/devices/machine/am9519.cpp b/src/devices/machine/am9519.cpp index be0b8c3da10..9a5eb100773 100644 --- a/src/devices/machine/am9519.cpp +++ b/src/devices/machine/am9519.cpp @@ -4,14 +4,74 @@ //TODO: rotating priority, cascade #include "emu.h" -#include "machine/am9519.h" - -#define LOG_GENERAL (1U << 0) +#include "am9519.h" //#define VERBOSE (LOG_GENERAL) #include "logmacro.h" -void am9519_device::device_timer(emu_timer &timer, device_timer_id id, int param, void *ptr) + +DEFINE_DEVICE_TYPE(AM9519, am9519_device, "am9519", "AMD AM9519 Universal Interrupt Controller") + +am9519_device::am9519_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) + : device_t(mconfig, AM9519, tag, owner, clock) + , m_out_int_func(*this) + , m_irr(0) + , m_irq_lines(0) + , m_irq_check_timer(nullptr) +{ +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void am9519_device::device_start() +{ + // Register save state items + save_item(NAME(m_isr)); + save_item(NAME(m_irr)); + save_item(NAME(m_prio)); + save_item(NAME(m_imr)); + save_item(NAME(m_irq_lines)); + save_item(NAME(m_mode)); + save_item(NAME(m_count)); + save_item(NAME(m_resp)); + save_item(NAME(m_aclear)); + save_item(NAME(m_cmd)); + + m_irq_check_timer = timer_alloc(FUNC(am9519_device::check_irqs), this); + m_irq_check_timer->adjust(attotime::never); +} + + +//------------------------------------------------- +// device_reset - device-specific reset +//------------------------------------------------- + +void am9519_device::device_reset() +{ + m_isr = 0; + m_irr = 0; + m_irq_lines = 0; + m_prio = 0; + m_imr = 0xff; + m_mode = 0; + m_aclear = 0; + m_cmd = 0; + m_curcnt = 0; + for(int i = 0; i < 8; i++) + { + m_count[i] = 0; + m_resp[i][0] = 0; + m_resp[i][1] = 0; + m_resp[i][2] = 0; + m_resp[i][3] = 0; + } +} + + +TIMER_CALLBACK_MEMBER(am9519_device::check_irqs) { if(!BIT(m_mode, 7)) // chip disabled return; @@ -61,9 +121,8 @@ void am9519_device::set_irq_line(int irq, int state) LOG("am9519_device::set_irq_line(): UIC cleared IRQ line #%d\n", irq); m_irq_lines &= ~mask; - m_irr &= ~mask; } - set_timer(); + m_irq_check_timer->adjust(attotime::zero); } @@ -82,7 +141,7 @@ u32 am9519_device::acknowledge() m_isr |= mask; m_irr &= ~mask; - set_timer(); + m_irq_check_timer->adjust(attotime::zero); u32 ret = 0; int irqr = BIT(m_mode, 1) ? 0 : irq; @@ -219,7 +278,7 @@ void am9519_device::cmd_w(u8 data) m_curcnt = 0; break; } - set_timer(); + m_irq_check_timer->adjust(attotime::zero); } void am9519_device::data_w(u8 data) @@ -246,63 +305,5 @@ void am9519_device::data_w(u8 data) } m_cmd = 0; } - set_timer(); -} - -//------------------------------------------------- -// device_start - device-specific startup -//------------------------------------------------- - -void am9519_device::device_start() -{ - // resolve callbacks - m_out_int_func.resolve_safe(); - - // Register save state items - save_item(NAME(m_isr)); - save_item(NAME(m_irr)); - save_item(NAME(m_prio)); - save_item(NAME(m_imr)); - save_item(NAME(m_irq_lines)); - save_item(NAME(m_mode)); - save_item(NAME(m_count)); - save_item(NAME(m_resp)); - save_item(NAME(m_aclear)); - save_item(NAME(m_cmd)); -} - - -//------------------------------------------------- -// device_reset - device-specific reset -//------------------------------------------------- - -void am9519_device::device_reset() -{ - m_isr = 0; - m_irr = 0; - m_irq_lines = 0; - m_prio = 0; - m_imr = 0xff; - m_mode = 0; - m_aclear = 0; - m_cmd = 0; - m_curcnt = 0; - for(int i = 0; i < 8; i++) - { - m_count[i] = 0; - m_resp[i][0] = 0; - m_resp[i][1] = 0; - m_resp[i][2] = 0; - m_resp[i][3] = 0; - } -} - -DEFINE_DEVICE_TYPE(AM9519, am9519_device, "am9519", "AMD AM9519 Universal Interrupt Controller") - -am9519_device::am9519_device(const machine_config &mconfig, const char *tag, device_t *owner, u32 clock) - : device_t(mconfig, AM9519, tag, owner, clock) - , m_out_int_func(*this) - , m_irr(0) - , m_irq_lines(0) -{ + m_irq_check_timer->adjust(attotime::zero); } |