summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
author Brian Johnson <brijohn@gmail.com>2021-04-22 22:11:36 -0400
committer Vas Crabb <cuavas@users.noreply.github.com>2021-04-24 04:05:29 +1000
commitd7b759a280d4bbe97d4f738a4cd75dfa0fe9567c (patch)
tree0b5f0a58e3d730c87d0449a1591a6c3901e4c72c
parentcf00ff3a9603778095a90e1121eea02dbf259dfc (diff)
upd7220: fix copy paste bug in DMA handling
-rw-r--r--src/devices/video/upd7220.cpp90
1 files changed, 51 insertions, 39 deletions
diff --git a/src/devices/video/upd7220.cpp b/src/devices/video/upd7220.cpp
index 0d20e578cc4..94e3c7a4672 100644
--- a/src/devices/video/upd7220.cpp
+++ b/src/devices/video/upd7220.cpp
@@ -466,7 +466,6 @@ inline uint16_t upd7220_device::read_vram()
inline void upd7220_device::rdat(uint8_t type, uint8_t mod)
{
- uint16_t data;
if (type == 1)
{
LOG("uPD7220 invalid type 1 RDAT parameter\n");
@@ -478,6 +477,7 @@ inline void upd7220_device::rdat(uint8_t type, uint8_t mod)
while (m_figs.m_dc && m_fifo_ptr < (type ? 15 : 14))
{
+ uint16_t data;
data = read_vram();
switch(type)
{
@@ -1546,27 +1546,32 @@ void upd7220_device::write(offs_t offset, uint8_t data)
uint8_t upd7220_device::dack_r()
{
uint8_t result = 0;
- switch(m_dma_type) {
- case 0:
- if (m_dma_transfer_length % 2 == 0) {
+ switch(m_dma_type)
+ {
+ case 0:
+ if (m_dma_transfer_length % 2 == 0)
+ {
+ m_dma_data = read_vram();
+ result = m_dma_data & 0xff;
+ }
+ else
+ {
+ result = (m_dma_data >> 8) & 0xff;
+ }
+ break;
+ case 2:
m_dma_data = read_vram();
result = m_dma_data & 0xff;
- } else {
+ break;
+ case 3:
+ m_dma_data = read_vram();
result = (m_dma_data >> 8) & 0xff;
- }
- break;
- case 2:
- m_dma_data = read_vram();
- result = m_dma_data & 0xff;
- break;
- case 3:
- m_dma_data = read_vram();
- result = (m_dma_data >> 8) & 0xff;
- break;
- default:
- logerror("uPD7220 Invalid DMA Transfer Type\n");
+ break;
+ default:
+ logerror("uPD7220 Invalid DMA Transfer Type\n");
}
- if (--m_dma_transfer_length == 0) {
+ if (--m_dma_transfer_length == 0)
+ {
stop_dma();
}
return result;
@@ -1579,34 +1584,40 @@ uint8_t upd7220_device::dack_r()
void upd7220_device::dack_w(uint8_t data)
{
- switch(m_dma_type) {
- case 0:
- if (m_dma_transfer_length % 2) {
- m_dma_data = ((m_dma_data & 0xff) | data << 8) & m_mask;
+ switch(m_dma_type)
+ {
+ case 0:
+ if (m_dma_transfer_length % 2)
+ {
+ m_dma_data = ((m_dma_data & 0xff) | data << 8) & m_mask;
+ write_vram(m_dma_type, m_dma_mod, m_dma_data);
+ }
+ else
+ {
+ m_dma_data = (m_dma_data & 0xff00) | data;
+ }
+ break;
+ case 2:
+ m_dma_data = data & (m_mask & 0xff);
write_vram(m_dma_type, m_dma_mod, m_dma_data);
- } else {
- m_dma_data = (m_dma_data & 0xff00) | data;
- }
- break;
- case 2:
- m_dma_data = data & (m_mask & 0xff);
- write_vram(m_dma_type, m_dma_mod, m_dma_data);
- break;
- case 3:
- m_dma_data = (data << 8) & (m_mask & 0xff);
- write_vram(m_dma_type, m_dma_mod, m_dma_data);
- break;
- default:
- logerror("uPD7220 Invalid DMA Transfer Type\n");
+ break;
+ case 3:
+ m_dma_data = (data << 8) & (m_mask & 0xff00);
+ write_vram(m_dma_type, m_dma_mod, m_dma_data);
+ break;
+ default:
+ logerror("uPD7220 Invalid DMA Transfer Type\n");
}
- if (--m_dma_transfer_length == 0) {
+ if (--m_dma_transfer_length == 0)
+ {
stop_dma();
}
}
void upd7220_device::start_dma()
{
- if ((m_sr & UPD7220_SR_DMA_EXECUTE) == 0) {
+ if ((m_sr & UPD7220_SR_DMA_EXECUTE) == 0)
+ {
m_write_drq(ASSERT_LINE);
m_sr |= UPD7220_SR_DMA_EXECUTE;
}
@@ -1614,7 +1625,8 @@ void upd7220_device::start_dma()
void upd7220_device::stop_dma()
{
- if ((m_sr & UPD7220_SR_DMA_EXECUTE) == UPD7220_SR_DMA_EXECUTE) {
+ if ((m_sr & UPD7220_SR_DMA_EXECUTE) == UPD7220_SR_DMA_EXECUTE)
+ {
m_write_drq(CLEAR_LINE);
m_sr &= ~UPD7220_SR_DMA_EXECUTE;
reset_figs_param();