summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/am9519.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/am9519.cpp')
-rw-r--r--src/devices/machine/am9519.cpp135
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);
}