From 9512e9be9b5847609b194a658ca35cf6827b710f Mon Sep 17 00:00:00 2001 From: cracyc Date: Sun, 11 Feb 2018 22:03:18 -0600 Subject: [PATCH] upd71071: disable channel at tc (nw) fmtowns: rerevise brandish cp (nw) --- hash/fmtowns_flop.xml | 4 ++-- src/devices/machine/upd71071.cpp | 12 ++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/hash/fmtowns_flop.xml b/hash/fmtowns_flop.xml index 4cac96609cf..371c485ffc0 100644 --- a/hash/fmtowns_flop.xml +++ b/hash/fmtowns_flop.xml @@ -515,8 +515,8 @@ Zurukamashi Ver 2.0 Nikkonren Kikaku 日本ファルコム (Nihon Falcom) - - + + diff --git a/src/devices/machine/upd71071.cpp b/src/devices/machine/upd71071.cpp index 9ee03b77aac..bbd79dc3f6a 100644 --- a/src/devices/machine/upd71071.cpp +++ b/src/devices/machine/upd71071.cpp @@ -35,6 +35,7 @@ But the FM-Towns definitely uses reg 7 as bits 24-31. The documentation on the V53A manual doesn't show these bits either, maybe it's an external connection on the FMT? might be worth checking overflow behavior etc. + The Towns manual confirms the top 8 bits are external to the DMAC and there's no carry into them. 0x08: 0x09: Device Control register (16-bit) @@ -195,6 +196,11 @@ TIMER_CALLBACK_MEMBER(upd71071_device::dma_transfer_timer) m_reg.address_current[channel] = m_reg.address_base[channel]; m_reg.count_current[channel] = m_reg.count_base[channel]; } + else + { + m_timer[channel]->adjust(attotime::never); + m_reg.mask |= (0x01 << channel); // END or TC + } // TODO: send terminal count set_eop(ASSERT_LINE); m_reg.status |= (0x01 << channel); // END or TC @@ -234,6 +240,11 @@ TIMER_CALLBACK_MEMBER(upd71071_device::dma_transfer_timer) m_reg.address_current[channel] = m_reg.address_base[channel]; m_reg.count_current[channel] = m_reg.count_base[channel]; } + else + { + m_timer[channel]->adjust(attotime::never); + m_reg.mask |= (0x01 << channel); // END or TC + } // TODO: send terminal count set_eop(ASSERT_LINE); m_reg.status |= (0x01 << channel); // END or TC @@ -295,6 +306,7 @@ int upd71071_device::dmarq(int state, int channel) { m_dmarq[channel] = 0; // clear DMARQ line m_reg.status &= ~(0x10 << channel); + m_timer[channel]->adjust(attotime::never); } return 0; }