From 72bf441850ec9a119135e7cef829d138043bf6b8 Mon Sep 17 00:00:00 2001 From: holub Date: Fri, 26 May 2023 23:34:26 -0400 Subject: sinclair/tsconfdma.cpp: fix burst (#11277) --- src/mame/sinclair/tsconf_m.cpp | 4 ++-- src/mame/sinclair/tsconfdma.cpp | 26 ++++++++++++++------------ src/mame/sinclair/tsconfdma.h | 2 ++ 3 files changed, 18 insertions(+), 14 deletions(-) diff --git a/src/mame/sinclair/tsconf_m.cpp b/src/mame/sinclair/tsconf_m.cpp index b667b239331..f017d14bfeb 100644 --- a/src/mame/sinclair/tsconf_m.cpp +++ b/src/mame/sinclair/tsconf_m.cpp @@ -373,7 +373,7 @@ void tsconf_state::ram_page_write(u8 page, offs_t offset, u8 data) u16 tsconf_state::ram_read16(offs_t offset) { - return ((m_ram->read(offset & ~offs_t(1))) << 8) | m_ram->read(offset | 1); + return (m_ram->read(offset & ~offs_t(1)) << 8) | m_ram->read(offset | 1); } void tsconf_state::ram_write16(offs_t offset, u16 data) @@ -399,7 +399,7 @@ void tsconf_state::cram_write(u16 offset, u8 data) void tsconf_state::cram_write16(offs_t offset, u16 data) { - cram_write(offset & 0xfffe, data >> 8); + cram_write(offset & 0x1fe, data >> 8); cram_write(offset | 1, data & 0xff); }; diff --git a/src/mame/sinclair/tsconfdma.cpp b/src/mame/sinclair/tsconfdma.cpp index eaf68f508a3..467778225e6 100644 --- a/src/mame/sinclair/tsconfdma.cpp +++ b/src/mame/sinclair/tsconfdma.cpp @@ -39,6 +39,8 @@ void tsconfdma_device::device_start() save_item(NAME(m_align_s)); save_item(NAME(m_align_d)); save_item(NAME(m_align)); + save_item(NAME(m_m1)); + save_item(NAME(m_m2)); save_item(NAME(m_asz)); save_item(NAME(m_task)); } @@ -110,6 +112,8 @@ void tsconfdma_device::start_tx(u8 dev, bool s_align, bool d_align, bool align_o m_align_d = d_align; m_asz = align_opt; m_align = m_asz ? 512 : 256; + m_m1 = m_asz ? 0x3ffe00 : 0x3fff00; + m_m2 = m_asz ? 0x0001ff : 0x0000ff; m_ready = CLEAR_LINE; // TODO Transfers 2 byte/cycle at 7MHz @@ -128,8 +132,8 @@ TIMER_CALLBACK_MEMBER(tsconfdma_device::dma_clock) for (u16 len = 0; len <= m_block_len; len++) { m_out_mreq_cb(d_addr, m_in_mreq_cb(s_addr)); - s_addr = (s_addr + 2) & 0x3fffff; - d_addr = (d_addr + 2) & 0x3fffff; + s_addr = m_align_s ? ((s_addr & m_m1) | ((s_addr + 2) & m_m2)) : ((s_addr + 2) & 0x3fffff); + d_addr = m_align_d ? ((d_addr & m_m1) | ((d_addr + 2) & m_m2)) : ((d_addr + 2) & 0x3fffff); } m_address_s = m_align_s ? (m_address_s + m_align) : s_addr; m_address_d = m_align_d ? (m_address_d + m_align) : d_addr; @@ -142,10 +146,8 @@ TIMER_CALLBACK_MEMBER(tsconfdma_device::dma_clock) auto d_addr = m_address_d; for (u16 len = 0; len <= m_block_len; len++) { - if (d_addr == 3801154) - printf("!"); m_out_mreq_cb(d_addr, m_in_mspi_cb()); - d_addr = (d_addr + 2) & 0x3fffff; + d_addr = m_align_d ? ((d_addr & m_m1) | ((d_addr + 2) & m_m2)) : ((d_addr + 2) & 0x3fffff); } m_address_d = m_align_d ? (m_address_d + m_align) : d_addr; } @@ -159,7 +161,7 @@ TIMER_CALLBACK_MEMBER(tsconfdma_device::dma_clock) for (u16 len = 0; len <= m_block_len; len++) { m_out_mreq_cb(d_addr, data); - d_addr = (d_addr + 2) & 0x3fffff; + d_addr = m_align_d ? ((d_addr & m_m1) | ((d_addr + 2) & m_m2)) : ((d_addr + 2) & 0x3fffff); } m_address_d = m_align_d ? (m_address_d + m_align) : d_addr; } @@ -187,8 +189,8 @@ TIMER_CALLBACK_MEMBER(tsconfdma_device::dma_clock) d_val = (d_val & 0x0fff) | (((s_val & 0xf000) ? s_val : d_val) & 0xf000); } m_out_mreq_cb(d_addr, d_val); - s_addr = (s_addr + 2) & 0x3fffff; - d_addr = (d_addr + 2) & 0x3fffff; + s_addr = m_align_s ? ((s_addr & m_m1) | ((s_addr + 2) & m_m2)) : ((s_addr + 2) & 0x3fffff); + d_addr = m_align_d ? ((d_addr & m_m1) | ((d_addr + 2) & m_m2)) : ((d_addr + 2) & 0x3fffff); } m_address_s = m_align_s ? (m_address_s + m_align) : s_addr; m_address_d = m_align_d ? (m_address_d + m_align) : d_addr; @@ -203,8 +205,8 @@ TIMER_CALLBACK_MEMBER(tsconfdma_device::dma_clock) for (u16 len = 0; len <= m_block_len; len++) { m_out_cram_cb(d_addr, m_in_mreq_cb(s_addr)); - s_addr = (s_addr + 2) & 0x3fffff; - d_addr = (d_addr + 2) & 0x3fffff; + s_addr = m_align_s ? ((s_addr & m_m1) | ((s_addr + 2) & m_m2)) : ((s_addr + 2) & 0x3fffff); + d_addr = m_align_d ? ((d_addr & m_m1) | ((d_addr + 2) & m_m2)) : ((d_addr + 2) & 0x3fffff); } m_address_s = m_align_s ? (m_address_s + m_align) : s_addr; m_address_d = m_align_d ? (m_address_d + m_align) : d_addr; @@ -219,8 +221,8 @@ TIMER_CALLBACK_MEMBER(tsconfdma_device::dma_clock) for (u16 len = 0; len <= m_block_len; len++) { m_out_sfile_cb(d_addr, m_in_mreq_cb(s_addr)); - s_addr = (s_addr + 2) & 0x3fffff; - d_addr = (d_addr + 2) & 0x3fffff; + s_addr = m_align_s ? ((s_addr & m_m1) | ((s_addr + 2) & m_m2)) : ((s_addr + 2) & 0x3fffff); + d_addr = m_align_d ? ((d_addr & m_m1) | ((d_addr + 2) & m_m2)) : ((d_addr + 2) & 0x3fffff); } m_address_s = m_align_s ? (m_address_s + m_align) : s_addr; m_address_d = m_align_d ? (m_address_d + m_align) : d_addr; diff --git a/src/mame/sinclair/tsconfdma.h b/src/mame/sinclair/tsconfdma.h index d76471f95ab..843ee84bcde 100644 --- a/src/mame/sinclair/tsconfdma.h +++ b/src/mame/sinclair/tsconfdma.h @@ -63,6 +63,8 @@ private: bool m_align_d; bool m_asz; u16 m_align; + u32 m_m1; + u32 m_m2; }; DECLARE_DEVICE_TYPE(TSCONF_DMA, tsconfdma_device) -- cgit v1.2.3