summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/devices/cpu/cosmac/cosmac.cpp37
-rw-r--r--src/devices/cpu/cosmac/cosmac.h12
-rw-r--r--src/mame/netronics/elf.cpp18
-rw-r--r--src/mame/netronics/elf.h2
4 files changed, 53 insertions, 16 deletions
diff --git a/src/devices/cpu/cosmac/cosmac.cpp b/src/devices/cpu/cosmac/cosmac.cpp
index 11d21f64961..87b1bf3ed10 100644
--- a/src/devices/cpu/cosmac/cosmac.cpp
+++ b/src/devices/cpu/cosmac/cosmac.cpp
@@ -365,6 +365,9 @@ cosmac_device::cosmac_device(const machine_config &mconfig, device_type type, co
m_io_config("io", ENDIANNESS_LITTLE, 8, 3),
m_read_wait(*this, 0),
m_read_clear(*this, 0),
+ m_read_int(*this, 0),
+ m_read_dma_in(*this, 0),
+ m_read_dma_out(*this, 0),
m_read_ef(*this, 0),
m_write_q(*this),
m_read_dma(*this, 0),
@@ -930,6 +933,28 @@ inline void cosmac_device::sample_wait_clear()
//-------------------------------------------------
+// sample_interrupt - sample interrupt line
+//-------------------------------------------------
+
+bool cosmac_device::sample_interrupt()
+{
+ if (!m_read_int.isunset()) m_irq = m_read_int();
+ return bool(m_irq);
+}
+
+
+//-------------------------------------------------
+// sample_dma_io - sample dma in/out lines
+//-------------------------------------------------
+
+inline void cosmac_device::sample_dma_io()
+{
+ if (!m_read_dma_in.isunset()) m_dmain = m_read_dma_in();
+ if (!m_read_dma_out.isunset()) m_dmaout = m_read_dma_out();
+}
+
+
+//-------------------------------------------------
// sample_ef_lines - sample EF input lines
//-------------------------------------------------
@@ -1102,6 +1127,8 @@ inline void cosmac_device::initialize()
m_icount -= CLOCKS_INIT;
+ sample_dma_io();
+
if (m_dmain)
{
m_state = cosmac_state::STATE_2_DMA_IN;
@@ -1130,6 +1157,8 @@ inline void cosmac_device::execute_instruction()
m_icount -= CLOCKS_EXECUTE;
+ sample_dma_io();
+
if (m_state == cosmac_state::STATE_1_EXECUTE && (m_op >> 4) == 0xc) // "long" opcodes
{
m_state = cosmac_state::STATE_1_EXECUTE_2ND;
@@ -1166,6 +1195,8 @@ inline void cosmac_device::dma_input()
m_icount -= CLOCKS_DMA;
+ sample_dma_io();
+
if (m_dmain)
{
m_state = cosmac_state::STATE_2_DMA_IN;
@@ -1202,6 +1233,8 @@ inline void cosmac_device::dma_output()
m_icount -= CLOCKS_DMA;
+ sample_dma_io();
+
if (m_dmain)
{
m_state = cosmac_state::STATE_2_DMA_IN;
@@ -1239,6 +1272,8 @@ inline void cosmac_device::interrupt()
m_icount -= CLOCKS_INTERRUPT;
+ sample_dma_io();
+
if (m_dmain)
{
m_state = cosmac_state::STATE_2_DMA_IN;
@@ -1470,7 +1505,7 @@ void cosmac_device::rsxd() { RAM_W(R[X], R[N] & 0xff); R[X]--; RAM_W(R[X], R[N]
void cosmac_device::rnx() { R[X] = R[N]; }
void cosmac_device::bci() { short_branch(m_cil); m_cil = 0; }
-void cosmac_device::bxi() { short_branch(m_irq); }
+void cosmac_device::bxi() { short_branch(sample_interrupt()); }
void cosmac_device::xie() { m_xie = 1; }
void cosmac_device::xid() { m_xie = 0; }
diff --git a/src/devices/cpu/cosmac/cosmac.h b/src/devices/cpu/cosmac/cosmac.h
index ec563e75194..01b35785911 100644
--- a/src/devices/cpu/cosmac/cosmac.h
+++ b/src/devices/cpu/cosmac/cosmac.h
@@ -158,6 +158,9 @@ public:
auto wait_cb() { return m_read_wait.bind(); }
auto clear_cb() { return m_read_clear.bind(); }
+ auto int_cb() { return m_read_int.bind(); }
+ auto dma_in_cb() { return m_read_dma_in.bind(); }
+ auto dma_out_cb() { return m_read_dma_out.bind(); }
auto ef1_cb() { return m_read_ef[0].bind(); }
auto ef2_cb() { return m_read_ef[1].bind(); }
auto ef3_cb() { return m_read_ef[2].bind(); }
@@ -224,8 +227,10 @@ protected:
inline void dma_input();
inline void dma_output();
inline void interrupt();
- virtual bool check_irq() { return m_ie && m_irq; }
+ virtual bool check_irq() { return m_ie && sample_interrupt(); }
inline void sample_wait_clear();
+ bool sample_interrupt();
+ inline void sample_dma_io();
inline void sample_ef_lines();
virtual void output_state_code();
inline void set_q_flag(int state);
@@ -366,6 +371,9 @@ protected:
// device callbacks
devcb_read_line m_read_wait;
devcb_read_line m_read_clear;
+ devcb_read_line m_read_int;
+ devcb_read_line m_read_dma_in;
+ devcb_read_line m_read_dma_out;
devcb_read_line::array<4> m_read_ef;
devcb_write_line m_write_q;
devcb_read8 m_read_dma;
@@ -505,7 +513,7 @@ protected:
virtual cosmac_device::ophandler get_ophandler(uint16_t opcode) const override;
virtual bool has_extended_opcodes() override { return true; }
- virtual bool check_irq() override { return m_ie && ((m_irq && m_xie) || (m_cil && m_cie)); }
+ virtual bool check_irq() override { return m_ie && ((sample_interrupt() && m_xie) || (m_cil && m_cie)); }
virtual void reset_state() override;
private:
diff --git a/src/mame/netronics/elf.cpp b/src/mame/netronics/elf.cpp
index 9be0c506a21..75bf02eed3c 100644
--- a/src/mame/netronics/elf.cpp
+++ b/src/mame/netronics/elf.cpp
@@ -9,9 +9,6 @@
/*
TODO:
- - Problem with DMA: open MAME debugger to see RAM, set LOAD, input a value,
- and it will write twice. It is because set_input_line is delayed until
- the CPU finished execute_run after sc_w.
- proper layout
- add cassette I/O
@@ -93,14 +90,14 @@ INPUT_CHANGED_MEMBER(elf2_state::load_w)
{
/* DMAIN is reset while LOAD is off */
if (!newval)
- m_maincpu->set_input_line(COSMAC_INPUT_LINE_DMAIN, CLEAR_LINE);
+ m_dmain = 0;
}
INPUT_CHANGED_MEMBER(elf2_state::input_w)
{
/* assert DMAIN */
if (LOAD && !newval && ~m_sc & 2)
- m_maincpu->set_input_line(COSMAC_INPUT_LINE_DMAIN, ASSERT_LINE);
+ m_dmain = 1;
}
static INPUT_PORTS_START( elf2 )
@@ -141,16 +138,11 @@ INPUT_PORTS_END
/* CDP1802 Configuration */
-uint8_t elf2_state::dma_r()
-{
- return m_data;
-}
-
void elf2_state::sc_w(uint8_t data)
{
/* DMAIN is reset while SC1 is high */
if (data & 2)
- m_maincpu->set_input_line(COSMAC_INPUT_LINE_DMAIN, CLEAR_LINE);
+ m_dmain = 0;
m_sc = data;
}
@@ -187,6 +179,7 @@ void elf2_state::machine_start()
/* register for state saving */
save_item(NAME(m_data));
save_item(NAME(m_sc));
+ save_item(NAME(m_dmain));
}
/* Machine Driver */
@@ -213,9 +206,10 @@ void elf2_state::elf2(machine_config &config)
m_maincpu->set_addrmap(AS_IO, &elf2_state::elf2_io);
m_maincpu->wait_cb().set_ioport("SPECIAL").bit(1).invert();
m_maincpu->clear_cb().set_ioport("SPECIAL").bit(0);
+ m_maincpu->dma_in_cb().set([this]() { return m_dmain; });
m_maincpu->ef4_cb().set_ioport("SPECIAL").bit(3);
m_maincpu->q_cb().set_output("led0");
- m_maincpu->dma_rd_cb().set(FUNC(elf2_state::dma_r));
+ m_maincpu->dma_rd_cb().set(FUNC(elf2_state::data_r));
m_maincpu->dma_wr_cb().set(m_vdc, FUNC(cdp1861_device::dma_w));
m_maincpu->sc_cb().set(FUNC(elf2_state::sc_w));
diff --git a/src/mame/netronics/elf.h b/src/mame/netronics/elf.h
index 5ace7a8138e..d03ccbebe9b 100644
--- a/src/mame/netronics/elf.h
+++ b/src/mame/netronics/elf.h
@@ -50,7 +50,6 @@ private:
uint8_t data_r();
void data_w(uint8_t data);
void memory_w(offs_t offset, uint8_t data);
- uint8_t dma_r();
void sc_w(uint8_t data);
void da_w(int state);
@@ -70,6 +69,7 @@ private:
// internal state
uint8_t m_data = 0;
uint8_t m_sc = 0;
+ uint8_t m_dmain = 0;
};
#endif // MAME_NETRONICS_ELF_H