diff options
author | ajrhacker <ajrhacker@users.noreply.github.com> | 2018-10-18 10:31:01 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-10-18 10:31:01 -0400 |
commit | 89e260781c9ddadc573485c2c5a65105f4766402 (patch) | |
tree | 5c6d3d777a743de88fa8c18652652baf8d8141cc | |
parent | 7a55e4159a80e50635563558b96abe6acae72e1a (diff) | |
parent | dd3f118257d788b70b1be1d61563797ba78526ce (diff) |
Merge pull request #4155 from hp9k/hp98620_fixes
hp98620: add channel control/status register
-rw-r--r-- | src/devices/bus/hp_dio/hp98620.cpp | 27 | ||||
-rw-r--r-- | src/devices/bus/hp_dio/hp98620.h | 24 |
2 files changed, 40 insertions, 11 deletions
diff --git a/src/devices/bus/hp_dio/hp98620.cpp b/src/devices/bus/hp_dio/hp98620.cpp index e4a7aba82b6..b27857a2fd3 100644 --- a/src/devices/bus/hp_dio/hp98620.cpp +++ b/src/devices/bus/hp_dio/hp98620.cpp @@ -188,9 +188,18 @@ READ16_MEMBER(dio16_98620_device::dma_r) break; case REG0_1TQ4_STATUS: ret = 0; + if (m_regs[0].armed) + ret |= REG_1TQ4_STATUS_ARMED; + if (m_regs[0].irq) + ret |= REG_1TQ4_STATUS_INT; break; case REG1_1TQ4_STATUS: ret = 0; + if (m_regs[1].armed) + ret |= REG_1TQ4_STATUS_ARMED; + if (m_regs[1].irq) + ret |= REG_1TQ4_STATUS_INT; + break; default: LOG("%s: unknown register read: %02X\n", __FUNCTION__, offset << 1); @@ -204,7 +213,7 @@ void dio16_98620_device::update_ctrl(const int channel, const uint16_t data, con { assert(channel < 2); - m_regs[channel].control = data; + m_regs[channel].control = data & ~REG_1TQ4_CONTROL_START; m_regs[channel].ie = data & REG_CONTROL_IE; m_regs[channel].irq_level = 3 + ((data >> REG_CONTROL_INT_SHIFT) & REG_CONTROL_INT_MASK); m_regs[channel].lword = (data & REG_1TQ4_CONTROL_LWORD) && is_1tq4; @@ -288,6 +297,16 @@ WRITE16_MEMBER(dio16_98620_device::dma_w) update_ctrl(1, data, false); break; + case REG_GENERAL_CONTROL: + if (data & REG_GENERAL_CONTROL_RESET0) { + m_regs[0].armed = 0; + } + + if (data & REG_GENERAL_CONTROL_RESET1) { + m_regs[1].armed = 0; + } + break; + case REG0_1TQ4_CONTROL: update_ctrl(0, data, true); break; @@ -342,8 +361,10 @@ void dio16_98620_device::dma_transfer(int channel) if (m_regs[channel].tc-- == 0) { LOG("DMA%d done\n", channel); m_regs[channel].armed = false; - m_regs[channel].irq = true; - update_irq(); + if (m_regs[channel].ie) { + m_regs[channel].irq = true; + update_irq(); + } return; } diff --git a/src/devices/bus/hp_dio/hp98620.h b/src/devices/bus/hp_dio/hp98620.h index 3a9cfc20ef1..d4ae0192c27 100644 --- a/src/devices/bus/hp_dio/hp98620.h +++ b/src/devices/bus/hp_dio/hp98620.h @@ -65,23 +65,31 @@ private: /* general control registers */ static constexpr int REG_1TQ4_ID_LOW = 0x10; static constexpr int REG_1TQ4_ID_HIGH = 0x12; + static constexpr int REG_GENERAL_CONTROL = 0x14; + static constexpr int REG_GENERAL_CONTROL_RESET0 = 1 << 4; + static constexpr int REG_GENERAL_CONTROL_RESET1 = 1 << 5; /* channel specific registers */ - static constexpr int REG0_1TQ4_ADDRESS_LOW = 0x100; - static constexpr int REG0_1TQ4_ADDRESS_HIGH = 0x102; - static constexpr int REG0_1TQ4_TRANSFER_COUNT_LOW = 0x104; - static constexpr int REG0_1TQ4_TRANSFER_COUNT_HIGH = 0x106; + static constexpr int REG0_1TQ4_ADDRESS_HIGH = 0x100; + static constexpr int REG0_1TQ4_ADDRESS_LOW = 0x102; + static constexpr int REG0_1TQ4_TRANSFER_COUNT_HIGH = 0x104; + static constexpr int REG0_1TQ4_TRANSFER_COUNT_LOW = 0x106; + static constexpr int REG0_1TQ4_CONTROL = 0x108; static constexpr int REG0_1TQ4_STATUS = 0x10a; static constexpr uint16_t REG_1TQ4_CONTROL_LWORD = 1 << 8; static constexpr uint16_t REG_1TQ4_CONTROL_START = 1 << 15; + static constexpr uint16_t REG_1TQ4_STATUS_ARMED = 1 << 0; + static constexpr uint16_t REG_1TQ4_STATUS_INT = 1 << 1; + /* registers */ - static constexpr int REG1_1TQ4_ADDRESS_LOW = 0x200; - static constexpr int REG1_1TQ4_ADDRESS_HIGH = 0x202; - static constexpr int REG1_1TQ4_TRANSFER_COUNT_LOW = 0x204; - static constexpr int REG1_1TQ4_TRANSFER_COUNT_HIGH = 0x206; + static constexpr int REG1_1TQ4_ADDRESS_HIGH = 0x200; + static constexpr int REG1_1TQ4_ADDRESS_LOW = 0x202; + static constexpr int REG1_1TQ4_TRANSFER_COUNT_HIGH = 0x204; + static constexpr int REG1_1TQ4_TRANSFER_COUNT_LOW = 0x206; + static constexpr int REG1_1TQ4_CONTROL = 0x208; static constexpr int REG1_1TQ4_STATUS = 0x20a; |