summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author hap <happppp@users.noreply.github.com>2025-01-11 16:01:34 +0100
committer hap <happppp@users.noreply.github.com>2025-01-11 16:02:24 +0100
commit4142cc168ad4a0e1143b96df45200c7d35a1ebce (patch)
tree7a2bdd0232f474030465af7f2482909325149d58
parentae9bafdeef14a618f67cf910b2ebf8d8a22a1db4 (diff)
elf2: update note about dma
-rw-r--r--src/mame/netronics/elf.cpp24
-rw-r--r--src/mame/netronics/elf.h3
2 files changed, 12 insertions, 15 deletions
diff --git a/src/mame/netronics/elf.cpp b/src/mame/netronics/elf.cpp
index a3601e66871..9416061f60e 100644
--- a/src/mame/netronics/elf.cpp
+++ b/src/mame/netronics/elf.cpp
@@ -9,8 +9,9 @@
/*
TODO:
- - problem with DMA: open MAME debugger to see RAM, set LOAD, input a value,
- and it will write twice
+ - 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
*/
@@ -95,7 +96,7 @@ void elf2_state::elf2_io(address_map &map)
INPUT_CHANGED_MEMBER(elf2_state::input_w)
{
- if (newval)
+ if (newval && ~m_sc & 2)
{
/* assert DMAIN */
m_maincpu->set_input_line(COSMAC_INPUT_LINE_DMAIN, ASSERT_LINE);
@@ -142,7 +143,7 @@ INPUT_PORTS_END
int elf2_state::wait_r()
{
- return LOAD;
+ return !LOAD;
}
int elf2_state::clear_r()
@@ -162,17 +163,11 @@ uint8_t elf2_state::dma_r()
void elf2_state::sc_w(uint8_t data)
{
- switch (data)
- {
- case COSMAC_STATE_CODE_S2_DMA:
- case COSMAC_STATE_CODE_S3_INTERRUPT:
- /* clear DMAIN */
+ /* DMAIN is reset while SC1 is high */
+ if (data & 2)
m_maincpu->set_input_line(COSMAC_INPUT_LINE_DMAIN, CLEAR_LINE);
- break;
- default:
- break;
- }
+ m_sc = data;
}
/* MM74C923 Interface */
@@ -206,6 +201,7 @@ void elf2_state::machine_start()
/* register for state saving */
save_item(NAME(m_data));
+ save_item(NAME(m_sc));
}
/* Machine Driver */
@@ -230,7 +226,7 @@ void elf2_state::elf2(machine_config &config)
CDP1802(config, m_maincpu, XTAL(3'579'545)/2);
m_maincpu->set_addrmap(AS_PROGRAM, &elf2_state::elf2_mem);
m_maincpu->set_addrmap(AS_IO, &elf2_state::elf2_io);
- m_maincpu->wait_cb().set(FUNC(elf2_state::wait_r)).invert();
+ m_maincpu->wait_cb().set(FUNC(elf2_state::wait_r));
m_maincpu->clear_cb().set(FUNC(elf2_state::clear_r));
m_maincpu->ef4_cb().set(FUNC(elf2_state::ef4_r));
m_maincpu->q_cb().set_output("led0");
diff --git a/src/mame/netronics/elf.h b/src/mame/netronics/elf.h
index 326da7a87e6..11e00cb24a3 100644
--- a/src/mame/netronics/elf.h
+++ b/src/mame/netronics/elf.h
@@ -69,8 +69,9 @@ private:
required_device<ram_device> m_ram;
required_ioport m_special;
- // display state
+ // internal state
uint8_t m_data = 0;
+ uint8_t m_sc = 0;
};
#endif // MAME_NETRONICS_ELF_H