diff options
Diffstat (limited to 'src/devices/cpu/z80/z80daisy_generic.cpp')
-rw-r--r-- | src/devices/cpu/z80/z80daisy_generic.cpp | 117 |
1 files changed, 117 insertions, 0 deletions
diff --git a/src/devices/cpu/z80/z80daisy_generic.cpp b/src/devices/cpu/z80/z80daisy_generic.cpp new file mode 100644 index 00000000000..57d08c13066 --- /dev/null +++ b/src/devices/cpu/z80/z80daisy_generic.cpp @@ -0,0 +1,117 @@ +// license: BSD-3-Clause +// copyright-holders: Dirk Best +/*************************************************************************** + + Generic Z80 daisy chain device + +***************************************************************************/ + +#include "emu.h" +#include "z80daisy_generic.h" + + +//************************************************************************** +// DEVICE DEFINITIONS +//************************************************************************** + +DEFINE_DEVICE_TYPE(Z80DAISY_GENERIC, z80daisy_generic_device, "z80daisy_generic", "Generic Z80 daisy chain device") + + +//************************************************************************** +// LIVE DEVICE +//************************************************************************** + +//------------------------------------------------- +// z80daisy_generic_device - constructor +//------------------------------------------------- + +z80daisy_generic_device::z80daisy_generic_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) : + device_t(mconfig, Z80DAISY_GENERIC, tag, owner, clock), + device_z80daisy_interface(mconfig, *this), + m_int_handler(*this), + m_int(0), m_mask(0), m_vector(0xff) +{ +} + +//------------------------------------------------- +// static_set_vector - static configuration +//------------------------------------------------- + +void z80daisy_generic_device::static_set_vector(device_t &device, uint8_t vector) +{ + z80daisy_generic_device &dev = downcast<z80daisy_generic_device &>(device); + dev.m_vector = vector; +} + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void z80daisy_generic_device::device_start() +{ + // resolve callbacks + m_int_handler.resolve_safe(); + + // register for save states + save_item(NAME(m_int)); + save_item(NAME(m_mask)); + save_item(NAME(m_vector)); +} + +//------------------------------------------------- +// z80daisy_irq_state - return the overall IRQ +// state for this device +//------------------------------------------------- + +int z80daisy_generic_device::z80daisy_irq_state() +{ + if (m_int & ~m_mask) + return Z80_DAISY_INT; + + return 0; +} + +//------------------------------------------------- +// z80daisy_irq_ack - acknowledge an IRQ and +// return the appropriate vector +//------------------------------------------------- + +int z80daisy_generic_device::z80daisy_irq_ack() +{ + return m_vector; +} + +//------------------------------------------------- +// z80daisy_irq_reti - clear the interrupt +// pending state to allow other interrupts through +//------------------------------------------------- + +void z80daisy_generic_device::z80daisy_irq_reti() +{ +} + +//------------------------------------------------- +// update_interrupt() - check interrupt status +//------------------------------------------------- + +void z80daisy_generic_device::update_interrupt() +{ + m_int_handler(m_int & ~m_mask ? ASSERT_LINE : CLEAR_LINE); +} + + +//************************************************************************** +// INTERFACE +//************************************************************************** + +WRITE_LINE_MEMBER( z80daisy_generic_device::int_w ) +{ + m_int = state; + update_interrupt(); +} + +WRITE_LINE_MEMBER( z80daisy_generic_device::mask_w ) +{ + m_mask = state; + update_interrupt(); +} |