summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/am9517a.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/am9517a.cpp')
-rw-r--r--src/devices/machine/am9517a.cpp93
1 files changed, 78 insertions, 15 deletions
diff --git a/src/devices/machine/am9517a.cpp b/src/devices/machine/am9517a.cpp
index cd6955b63ed..463f1c447ef 100644
--- a/src/devices/machine/am9517a.cpp
+++ b/src/devices/machine/am9517a.cpp
@@ -52,7 +52,7 @@
//**************************************************************************
DEFINE_DEVICE_TYPE(AM9517A, am9517a_device, "am9517a", "AM9517A")
-DEFINE_DEVICE_TYPE(V53_DMAU, upd71071_v53_device, "v53_dmau", "V53 DMAU")
+DEFINE_DEVICE_TYPE(V5X_DMAU, v5x_dmau_device, "v5x_dmau", "V5X DMAU")
DEFINE_DEVICE_TYPE(PCXPORT_DMAC, pcxport_dmac_device, "pcx_dmac", "PC Transporter DMAC")
@@ -132,7 +132,7 @@ enum
// dma_request -
//-------------------------------------------------
-inline void am9517a_device::dma_request(int channel, int state)
+void am9517a_device::dma_request(int channel, int state)
{
LOG("AM9517A Channel %u DMA Request: %u\n", channel, state);
@@ -215,7 +215,7 @@ inline void am9517a_device::set_eop(int state)
//-------------------------------------------------
-// dma_read -
+// get_state1 -
//-------------------------------------------------
inline int am9517a_device::get_state1(bool msb_changed)
@@ -235,7 +235,7 @@ inline int am9517a_device::get_state1(bool msb_changed)
// dma_read -
//-------------------------------------------------
-inline void am9517a_device::dma_read()
+void am9517a_device::dma_read()
{
offs_t offset = m_channel[m_current_channel].m_address;
@@ -257,7 +257,7 @@ inline void am9517a_device::dma_read()
// dma_write -
//-------------------------------------------------
-inline void am9517a_device::dma_write()
+void am9517a_device::dma_write()
{
offs_t offset = m_channel[m_current_channel].m_address;
@@ -296,7 +296,7 @@ inline void am9517a_device::dma_advance()
{
if (MODE_ADDRESS_DECREMENT)
{
- m_channel[m_current_channel].m_address--;
+ m_channel[m_current_channel].m_address -= transfer_size(m_current_channel);
m_channel[m_current_channel].m_address &= m_address_mask;
if ((m_channel[m_current_channel].m_address & 0xff) == 0xff)
@@ -306,7 +306,7 @@ inline void am9517a_device::dma_advance()
}
else
{
- m_channel[m_current_channel].m_address++;
+ m_channel[m_current_channel].m_address += transfer_size(m_current_channel);
m_channel[m_current_channel].m_address &= m_address_mask;
if ((m_channel[m_current_channel].m_address & 0xff) == 0x00)
@@ -430,8 +430,13 @@ am9517a_device::am9517a_device(const machine_config &mconfig, const char *tag, d
{
}
-upd71071_v53_device::upd71071_v53_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
- : am9517a_device(mconfig, V53_DMAU, tag, owner, clock)
+v5x_dmau_device::v5x_dmau_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock)
+ : am9517a_device(mconfig, V5X_DMAU, tag, owner, clock)
+ , m_in_mem16r_cb(*this)
+ , m_out_mem16w_cb(*this)
+ , m_in_io16r_cb{ { *this },{ *this },{ *this },{ *this } }
+ , m_out_io16w_cb{ { *this },{ *this },{ *this },{ *this } }
+
{
}
@@ -686,12 +691,12 @@ void am9517a_device::execute_run()
m_channel[m_current_channel].m_count--;
if (MODE_ADDRESS_DECREMENT)
{
- m_channel[m_current_channel].m_address--;
+ m_channel[m_current_channel].m_address -= transfer_size(m_current_channel);
m_channel[m_current_channel].m_address &= m_address_mask;
}
else
{
- m_channel[m_current_channel].m_address++;
+ m_channel[m_current_channel].m_address += transfer_size(m_current_channel);
m_channel[m_current_channel].m_address &= m_address_mask;
}
@@ -980,11 +985,18 @@ WRITE_LINE_MEMBER( am9517a_device::dreq3_w )
// upd71071 register layouts
//-------------------------------------------------
-void upd71071_v53_device::device_start()
+void v5x_dmau_device::device_start()
{
am9517a_device::device_start();
m_address_mask = 0x00ffffff;
+ m_in_mem16r_cb.resolve_safe(0);
+ m_out_mem16w_cb.resolve_safe();
+ for (auto &cb : m_in_io16r_cb)
+ cb.resolve_safe(0);
+ for (auto &cb : m_out_io16w_cb)
+ cb.resolve_safe();
+
m_selected_channel = 0;
m_base = 0;
@@ -992,7 +1004,7 @@ void upd71071_v53_device::device_start()
save_item(NAME(m_base));
}
-void upd71071_v53_device::device_reset()
+void v5x_dmau_device::device_reset()
{
am9517a_device::device_reset();
@@ -1001,7 +1013,7 @@ void upd71071_v53_device::device_reset()
}
-READ8_MEMBER(upd71071_v53_device::read)
+READ8_MEMBER(v5x_dmau_device::read)
{
uint8_t ret = 0;
int channel = m_selected_channel;
@@ -1085,7 +1097,7 @@ READ8_MEMBER(upd71071_v53_device::read)
return ret;
}
-WRITE8_MEMBER(upd71071_v53_device::write)
+WRITE8_MEMBER(v5x_dmau_device::write)
{
int channel = m_selected_channel;
@@ -1182,6 +1194,57 @@ WRITE8_MEMBER(upd71071_v53_device::write)
}
+void v5x_dmau_device::dma_read()
+{
+ if (m_channel[m_current_channel].m_mode & 0x1)
+ {
+ offs_t const offset = m_channel[m_current_channel].m_address >> 1;
+
+ switch (MODE_TRANSFER_MASK)
+ {
+ case MODE_TRANSFER_VERIFY:
+ case MODE_TRANSFER_WRITE:
+ m_temp = m_in_io16r_cb[m_current_channel](offset);
+ break;
+
+ case MODE_TRANSFER_READ:
+ m_temp = m_in_mem16r_cb(offset);
+ break;
+ }
+ }
+ else
+ am9517a_device::dma_read();
+}
+
+void v5x_dmau_device::dma_write()
+{
+ if (m_channel[m_current_channel].m_mode & 0x1)
+ {
+ offs_t const offset = m_channel[m_current_channel].m_address >> 1;
+
+ switch (MODE_TRANSFER_MASK)
+ {
+ case MODE_TRANSFER_VERIFY:
+ {
+ u16 const v1 = m_in_mem16r_cb(offset);
+ if (0 && m_temp != v1)
+ logerror("verify error %04x vs. %04x\n", m_temp, v1);
+ }
+ break;
+
+ case MODE_TRANSFER_WRITE:
+ m_out_mem16w_cb(offset, m_temp);
+ break;
+
+ case MODE_TRANSFER_READ:
+ m_out_io16w_cb[m_current_channel](offset, m_temp);
+ break;
+ }
+ }
+ else
+ am9517a_device::dma_write();
+}
+
void pcxport_dmac_device::device_reset()
{
m_state = STATE_SI;