diff options
Diffstat (limited to 'src/devices/machine/am9517a.cpp')
-rw-r--r-- | src/devices/machine/am9517a.cpp | 93 |
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; |