summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author holub <andrei.holub@gmail.com>2023-05-26 23:34:26 -0400
committer GitHub <noreply@github.com>2023-05-26 23:34:26 -0400
commit72bf441850ec9a119135e7cef829d138043bf6b8 (patch)
tree4593cb509ec2a0db7cecc0d56e6b063f3a9c071e /src
parent2fb9b7c0e49fee644b09ca90d742485a6612a0ba (diff)
sinclair/tsconfdma.cpp: fix burst (#11277)
Diffstat (limited to 'src')
-rw-r--r--src/mame/sinclair/tsconf_m.cpp4
-rw-r--r--src/mame/sinclair/tsconfdma.cpp26
-rw-r--r--src/mame/sinclair/tsconfdma.h2
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)