summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author cracyc <cracyc@users.noreply.github.com>2021-05-28 21:49:29 -0500
committer cracyc <cracyc@users.noreply.github.com>2021-05-28 21:49:29 -0500
commit29001b426791912947f62a41129c97c5111adb53 (patch)
treee2ba2f4a931ba79d9c97d7f442a2296c83bf023f
parent050db64a961203600c71a9671bbebb2a5a0b1999 (diff)
hd63450: add linked array chaining
-rw-r--r--src/devices/machine/hd63450.cpp13
-rw-r--r--src/mame/video/x68k_crtc.cpp2
2 files changed, 13 insertions, 2 deletions
diff --git a/src/devices/machine/hd63450.cpp b/src/devices/machine/hd63450.cpp
index 43732eee666..5787dde4b3b 100644
--- a/src/devices/machine/hd63450.cpp
+++ b/src/devices/machine/hd63450.cpp
@@ -62,6 +62,7 @@ void hd63450_device::device_start()
save_item(STRUCT_MEMBER(m_reg, mar));
save_item(STRUCT_MEMBER(m_reg, dar));
save_item(STRUCT_MEMBER(m_reg, btc));
+ save_item(STRUCT_MEMBER(m_reg, bar));
save_item(STRUCT_MEMBER(m_reg, niv));
save_item(STRUCT_MEMBER(m_reg, eiv));
save_item(STRUCT_MEMBER(m_reg, mfc));
@@ -452,7 +453,7 @@ void hd63450_device::single_transfer(int x)
{
// End of transfer
LOG("DMA#%i: End of transfer\n",x);
- if ((m_reg[x].ocr & 0x0c) != 0 && m_reg[x].btc > 0)
+ if ((m_reg[x].ocr & 0x0c) == 0x08 && m_reg[x].btc > 0)
{
m_reg[x].btc--;
m_reg[x].bar+=6;
@@ -461,6 +462,16 @@ void hd63450_device::single_transfer(int x)
m_reg[x].mtc = space.read_word(m_reg[x].bar+4);
return;
}
+ else if ((m_reg[x].ocr & 0x0c) == 0x0c && m_reg[x].bar)
+ {
+ u32 bar = m_reg[x].bar;
+ m_reg[x].mar = space.read_word(bar) << 16;
+ 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);
+ return;
+ }
else if (m_reg[x].ccr & 0x40)
{
m_reg[x].mar = m_reg[x].bar;
diff --git a/src/mame/video/x68k_crtc.cpp b/src/mame/video/x68k_crtc.cpp
index 3792ae68b4a..5fa05e74499 100644
--- a/src/mame/video/x68k_crtc.cpp
+++ b/src/mame/video/x68k_crtc.cpp
@@ -172,7 +172,7 @@ void x68k_crtc_device::refresh_mode()
rectangle visiblescr(m_hbegin, m_hend, m_vbegin, m_vend);
if ((visiblescr.max_y > m_height) || (visiblescr.max_x > m_width))
- logerror("visarea larger then reg[20]: %dx%d, %dx%d", visiblescr.max_x, visiblescr.max_y, m_width, m_height);
+ logerror("visarea larger then reg[20]: %dx%d, %dx%d\n", visiblescr.max_x, visiblescr.max_y, m_width, m_height);
// bounds check
if (visiblescr.min_x < 0)