diff options
Diffstat (limited to 'src/devices/machine/hd63450.cpp')
-rw-r--r-- | src/devices/machine/hd63450.cpp | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/src/devices/machine/hd63450.cpp b/src/devices/machine/hd63450.cpp index 5787dde4b3b..27ef55487f1 100644 --- a/src/devices/machine/hd63450.cpp +++ b/src/devices/machine/hd63450.cpp @@ -279,7 +279,7 @@ void hd63450_device::dma_transfer_start(int channel) m_reg[channel].csr &= ~0xe0; m_reg[channel].csr |= 0x08; // Channel active m_reg[channel].csr &= ~0x30; // Reset Error and Normal termination bits - if ((m_reg[channel].ocr & 0x0c) != 0x00) // Array chain or Link array chain + if ((m_reg[channel].ocr & 0x0c) == 0x08) // Array chain { m_reg[channel].mar = space.read_word(m_reg[channel].bar) << 16; m_reg[channel].mar |= space.read_word(m_reg[channel].bar+2); @@ -287,6 +287,15 @@ void hd63450_device::dma_transfer_start(int channel) if (m_reg[channel].btc > 0) m_reg[channel].btc--; } + else if ((m_reg[channel].ocr & 0x0c) == 0x0c) // Link array chain + { + u32 bar = m_reg[channel].bar; + m_reg[channel].mar = space.read_word(bar) << 16; + m_reg[channel].mar |= space.read_word(bar+2); + m_reg[channel].mtc = space.read_word(bar+4); + m_reg[channel].bar = space.read_word(bar+6) << 16; + m_reg[channel].bar |= space.read_word(bar+8); + } // Burst transfers will halt the CPU until the transfer is complete if ((m_reg[channel].dcr & 0xc0) == 0x00) // Burst transfer @@ -469,7 +478,7 @@ void hd63450_device::single_transfer(int x) m_reg[x].mar |= space.read_word(bar+2); m_reg[x].mtc = space.read_word(bar+4); m_reg[x].bar = space.read_word(bar+6) << 16; - m_reg[x].bar |= space.read_word(bar+10); + m_reg[x].bar |= space.read_word(bar+8); return; } else if (m_reg[x].ccr & 0x40) |