summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author R. Belmont <rb6502@users.noreply.github.com>2016-12-29 16:35:46 -0500
committer GitHub <noreply@github.com>2016-12-29 16:35:46 -0500
commit2b74e4c0be91b86b408fca518af7518c1ea994c9 (patch)
treee717407aa8f98f192a2095f28909c89f3af3a8e5
parent0c81f0691be6a8a3e1cdef627accf287bb86290c (diff)
parent9a39a8709e609bdb5398727b30e7b59691b06fd1 (diff)
Merge pull request #1888 from ajrhacker/z80_intack
Z80 daisy chain stuff
-rw-r--r--src/devices/cpu/z180/z180op.hxx10
-rw-r--r--src/devices/cpu/z80/z80.cpp24
-rw-r--r--src/devices/cpu/z80/z80.h1
-rw-r--r--src/devices/cpu/z80/z80daisy.cpp20
-rw-r--r--src/devices/cpu/z80/z80daisy.h2
-rw-r--r--src/mame/machine/cedar_magnet_sound.cpp45
-rw-r--r--src/mame/machine/cedar_magnet_sound.h3
7 files changed, 39 insertions, 66 deletions
diff --git a/src/devices/cpu/z180/z180op.hxx b/src/devices/cpu/z180/z180op.hxx
index 2479479344a..fce6718f40d 100644
--- a/src/devices/cpu/z180/z180op.hxx
+++ b/src/devices/cpu/z180/z180op.hxx
@@ -306,13 +306,9 @@ int z180_device::take_interrupt(int irq)
if( irq == Z180_INT_IRQ0 )
{
- /* Daisy chain mode? If so, call the requesting device */
- if (daisy_chain_present())
- irq_vector = daisy_call_ack_device();
-
- /* else call back the cpu interface to retrieve the vector */
- else
- irq_vector = standard_irq_callback(0);
+ // retrieve the IRQ vector from the daisy chain or CPU interface
+ device_z80daisy_interface *intf = daisy_get_irq_device();
+ irq_vector = (intf != nullptr) ? intf->z80daisy_irq_ack() : standard_irq_callback_member(*this, 0);
LOG(("Z180 '%s' single int. irq_vector $%02x\n", tag(), irq_vector));
diff --git a/src/devices/cpu/z80/z80.cpp b/src/devices/cpu/z80/z80.cpp
index 7799dff84d5..cb8c0ecc8ed 100644
--- a/src/devices/cpu/z80/z80.cpp
+++ b/src/devices/cpu/z80/z80.cpp
@@ -3146,32 +3146,28 @@ void z80_device::take_nmi()
void z80_device::take_interrupt()
{
- int irq_vector;
-
PRVPC = 0xffff; // HACK: segag80r protection kludge
- /* Check if processor was halted */
+ // check if processor was halted
leave_halt();
- /* Clear both interrupt flip flops */
+ // clear both interrupt flip flops
m_iff1 = m_iff2 = 0;
- /* Daisy chain mode? If so, call the requesting device */
- if (daisy_chain_present())
- irq_vector = daisy_call_ack_device();
-
- /* else call back the cpu interface to retrieve the vector */
- else
- irq_vector = m_irq_callback(*this, 0);
-
- /* Say hi */
+ // say hi
m_irqack_cb(true);
+ // fetch the IRQ vector
+ device_z80daisy_interface *intf = daisy_get_irq_device();
+ int irq_vector = (intf != nullptr) ? intf->z80daisy_irq_ack() : standard_irq_callback_member(*this, 0);
LOG(("Z80 '%s' single int. irq_vector $%02x\n", tag(), irq_vector));
/* Interrupt mode 2. Call [i:databyte] */
if( m_im == 2 )
{
+ // Zilog's datasheet claims that "the least-significant bit must be a zero."
+ // However, experiments have confirmed that IM 2 vectors do not have to be
+ // even, and all 8 bits will be used; even $FF is handled normally.
irq_vector = (irq_vector & 0xff) | (m_i << 8);
push(m_pc);
rm16(irq_vector, m_pc);
@@ -3415,8 +3411,6 @@ void z80_device::device_start()
m_decrypted_opcodes_direct = &m_decrypted_opcodes->direct();
m_io = &space(AS_IO);
- m_irq_callback = device_irq_acknowledge_delegate(FUNC(z80_device::standard_irq_callback_member), this);
-
IX = IY = 0xffff; /* IX and IY are FFFF after a reset! */
F = ZF; /* Zero flag is set */
diff --git a/src/devices/cpu/z80/z80.h b/src/devices/cpu/z80/z80.h
index ecfd106e1c1..664e484c565 100644
--- a/src/devices/cpu/z80/z80.h
+++ b/src/devices/cpu/z80/z80.h
@@ -276,7 +276,6 @@ protected:
uint8_t m_after_ei; /* are we in the EI shadow? */
uint8_t m_after_ldair; /* same, but for LD A,I or LD A,R */
uint32_t m_ea;
- device_irq_acknowledge_delegate m_irq_callback;
int m_icount;
uint8_t m_rtemp;
diff --git a/src/devices/cpu/z80/z80daisy.cpp b/src/devices/cpu/z80/z80daisy.cpp
index 82e41c42e1a..23169dd3600 100644
--- a/src/devices/cpu/z80/z80daisy.cpp
+++ b/src/devices/cpu/z80/z80daisy.cpp
@@ -11,6 +11,8 @@
#include "emu.h"
#include "z80daisy.h"
+#define VERBOSE 0
+
//**************************************************************************
// DEVICE Z80 DAISY INTERFACE
@@ -164,25 +166,24 @@ int z80_daisy_chain_interface::daisy_update_irq_state()
//-------------------------------------------------
-// call_ack_device - acknowledge an interrupt
-// from a chained device and return the vector
+// daisy_get_irq_device - return the device
+// in the chain that requested the interrupt
//-------------------------------------------------
-int z80_daisy_chain_interface::daisy_call_ack_device()
+device_z80daisy_interface *z80_daisy_chain_interface::daisy_get_irq_device()
{
- int vector = 0;
-
// loop over all devices; dev[0] is the highest priority
for (device_z80daisy_interface *intf = m_chain; intf != nullptr; intf = intf->m_daisy_next)
{
// if this device is asserting the INT line, that's the one we want
int state = intf->z80daisy_irq_state();
- vector = intf->z80daisy_irq_ack();
if (state & Z80_DAISY_INT)
- return vector;
+ return intf;
}
- //logerror("z80daisy_call_ack_device: failed to find an device to ack!\n");
- return vector;
+
+ if (VERBOSE && daisy_chain_present())
+ device().logerror("Interrupt from outside Z80 daisy chain\n");
+ return nullptr;
}
@@ -204,7 +205,6 @@ void z80_daisy_chain_interface::daisy_call_reti_device()
return;
}
}
- //logerror("z80daisy_call_reti_device: failed to find an device to reti!\n");
}
diff --git a/src/devices/cpu/z80/z80daisy.h b/src/devices/cpu/z80/z80daisy.h
index 57d852261bc..896285516ee 100644
--- a/src/devices/cpu/z80/z80daisy.h
+++ b/src/devices/cpu/z80/z80daisy.h
@@ -97,7 +97,7 @@ protected:
// callbacks
int daisy_update_irq_state();
- int daisy_call_ack_device();
+ device_z80daisy_interface *daisy_get_irq_device();
void daisy_call_reti_device();
private:
diff --git a/src/mame/machine/cedar_magnet_sound.cpp b/src/mame/machine/cedar_magnet_sound.cpp
index d289c1ad200..2ff907658ed 100644
--- a/src/mame/machine/cedar_magnet_sound.cpp
+++ b/src/mame/machine/cedar_magnet_sound.cpp
@@ -10,20 +10,16 @@
0xe6 - from ctc0 channel 3 (vector = E0) used to drive MSM5205 through FIFO
0xee - from ctc0 channel 3 (vector = E8) ^^
- 0xf6 - drive AY (once per frame?) triggered by ctc1 channel 3? (sets vector to f0, f6 = channel3?)
- 0xff - read sound latch (triggered by write from master board)
-
- any attempts made to hook up the ctcs end up resulting in it taking an interrupt
- with vector 0xf0, which points to 0x0000 and resets the cpu?!
-
- does the device here also need to add daisychain functions in order for the 0xff vector to be used
- with the soundlatch writes?
+ 0xf6 - drive AY (once per frame?) triggered by ctc1 channel 3 (vector = F0)
+ 0xff - read sound latch (triggered by write from master board; default vector set by 5K/+5 pullups on D0-D7)
*/
#include "emu.h"
#include "cedar_magnet_sound.h"
+#include "machine/clock.h"
+
extern const device_type CEDAR_MAGNET_SOUND = &device_creator<cedar_magnet_sound_device>;
@@ -47,7 +43,7 @@ void cedar_magnet_sound_device::write_command(uint8_t data)
{
m_command = data;
// this interrupt causes it to read the soundlatch at 0x14
- m_cpu->set_input_line_and_vector(0, HOLD_LINE,0xff);
+ m_cpu->set_input_line_and_vector(0, HOLD_LINE, 0xff);
}
@@ -58,6 +54,7 @@ ADDRESS_MAP_END
static ADDRESS_MAP_START( cedar_magnet_sound_io, AS_IO, 8, cedar_magnet_sound_device )
ADDRESS_MAP_GLOBAL_MASK(0xff)
+ ADDRESS_MAP_UNMAP_HIGH
AM_RANGE(0x00, 0x03) AM_DEVREADWRITE("ctc0", z80ctc_device, read, write)
AM_RANGE(0x04, 0x07) AM_DEVREADWRITE("ctc1", z80ctc_device, read, write)
@@ -133,15 +130,12 @@ WRITE_LINE_MEMBER(cedar_magnet_sound_device::fifo_dor_w)
// combined with a clock signal and used to drive ctc0 channel 3
}
-#if 0
static const z80_daisy_config daisy_chain[] =
{
{ "ctc1" },
{ "ctc0" },
-// soundlatch from main CPU needs to be able to generate a vector too?
{ nullptr }
};
-#endif
TIMER_CALLBACK_MEMBER(cedar_magnet_sound_device::reset_assert_callback)
{
@@ -153,37 +147,31 @@ TIMER_CALLBACK_MEMBER(cedar_magnet_sound_device::reset_assert_callback)
-INTERRUPT_GEN_MEMBER(cedar_magnet_sound_device::fake_irq)
-{
- // these should be coming from the CTC...
-// if (m_fake_counter==0) m_cpu->set_input_line_and_vector(0, HOLD_LINE,0xe6);
-// if (m_fake_counter==1) m_cpu->set_input_line_and_vector(0, HOLD_LINE,0xee);
- if (m_fake_counter==2) m_cpu->set_input_line_and_vector(0, HOLD_LINE,0xf6); // drives the AY, should be from ctc1 4th counter?
-
- m_fake_counter++;
-
- if (m_fake_counter == 4) m_fake_counter = 0;
-}
-
static MACHINE_CONFIG_FRAGMENT( cedar_magnet_sound )
MCFG_CPU_ADD("topcpu", Z80, 4000000)
MCFG_CPU_PROGRAM_MAP(cedar_magnet_sound_map)
MCFG_CPU_IO_MAP(cedar_magnet_sound_io)
-// MCFG_Z80_DAISY_CHAIN(daisy_chain)
- MCFG_CPU_PERIODIC_INT_DRIVER(cedar_magnet_sound_device, fake_irq, 4*60)
+ MCFG_Z80_DAISY_CHAIN(daisy_chain)
MCFG_DEVICE_ADD("ctc0", Z80CTC, 4000000)
-// MCFG_Z80CTC_INTR_CB(INPUTLINE("topcpu", INPUT_LINE_IRQ0))
+ MCFG_Z80CTC_INTR_CB(INPUTLINE("topcpu", INPUT_LINE_IRQ0))
MCFG_Z80CTC_ZC0_CB(WRITELINE(cedar_magnet_sound_device, ctc0_z0_w))
MCFG_Z80CTC_ZC1_CB(WRITELINE(cedar_magnet_sound_device, ctc0_z1_w))
MCFG_Z80CTC_ZC2_CB(WRITELINE(cedar_magnet_sound_device, ctc0_z2_w))
MCFG_DEVICE_ADD("ctc1", Z80CTC, 4000000)
-// MCFG_Z80CTC_INTR_CB(INPUTLINE("topcpu", INPUT_LINE_IRQ0))
+ MCFG_Z80CTC_INTR_CB(INPUTLINE("topcpu", INPUT_LINE_IRQ0))
MCFG_Z80CTC_ZC0_CB(WRITELINE(cedar_magnet_sound_device, ctc1_z0_w))
MCFG_Z80CTC_ZC1_CB(WRITELINE(cedar_magnet_sound_device, ctc1_z1_w))
MCFG_Z80CTC_ZC2_CB(WRITELINE(cedar_magnet_sound_device, ctc1_z2_w))
+#if 0 // does nothing useful now
+ MCFG_DEVICE_ADD("ck1mhz", CLOCK, 4000000/4)
+ MCFG_CLOCK_SIGNAL_HANDLER(DEVWRITELINE("ctc1", z80ctc_device, trg0))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("ctc1", z80ctc_device, trg1))
+ MCFG_DEVCB_CHAIN_OUTPUT(DEVWRITELINE("ctc1", z80ctc_device, trg2))
+#endif
+
MCFG_SPEAKER_STANDARD_MONO("mono")
MCFG_SOUND_ADD("aysnd0", AY8910, 4000000/2)
@@ -216,6 +204,5 @@ void cedar_magnet_sound_device::device_start()
void cedar_magnet_sound_device::device_reset()
{
m_command = 0;
- m_fake_counter = 0;
cedar_magnet_board_device::device_reset();
}
diff --git a/src/mame/machine/cedar_magnet_sound.h b/src/mame/machine/cedar_magnet_sound.h
index ddc2f65f65a..0d1a5d0226b 100644
--- a/src/mame/machine/cedar_magnet_sound.h
+++ b/src/mame/machine/cedar_magnet_sound.h
@@ -49,9 +49,6 @@ public:
TIMER_CALLBACK_MEMBER(reset_assert_callback) override;
- int m_fake_counter;
- INTERRUPT_GEN_MEMBER(fake_irq);
-
protected:
virtual machine_config_constructor device_mconfig_additions() const override;
virtual void device_start() override;