summaryrefslogtreecommitdiffstatshomepage
path: root/src
diff options
context:
space:
mode:
author Dirk Best <mail@dirk-best.de>2015-06-07 03:19:14 +0200
committer Dirk Best <mail@dirk-best.de>2015-06-07 03:21:13 +0200
commitcf7eb6a3963fd7d3b1052015dab919410d5f8ae0 (patch)
tree5c53a354c016d5619b877f86e87cf4dca5904141 /src
parent3db351f5c914a4b904fd03dd3c376e14666579f0 (diff)
i8089: add support for DMA_WAIT_FOR_SOURCE_DRQ
Diffstat (limited to 'src')
-rw-r--r--src/emu/cpu/i8089/i8089_channel.c16
-rw-r--r--src/emu/cpu/i8089/i8089_channel.h1
2 files changed, 13 insertions, 4 deletions
diff --git a/src/emu/cpu/i8089/i8089_channel.c b/src/emu/cpu/i8089/i8089_channel.c
index 171a7ce0d24..eb5d49823c7 100644
--- a/src/emu/cpu/i8089/i8089_channel.c
+++ b/src/emu/cpu/i8089/i8089_channel.c
@@ -51,10 +51,13 @@ const device_type I8089_CHANNEL = &device_creator<i8089_channel>;
i8089_channel::i8089_channel(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) :
device_t(mconfig, I8089_CHANNEL, "Intel 8089 I/O Channel", tag, owner, clock, "i8089_channel", __FILE__),
m_write_sintr(*this),
+ m_iop(NULL),
m_icount(0),
m_xfer_pending(false),
m_dma_value(0),
- m_dma_state(DMA_IDLE)
+ m_dma_state(DMA_IDLE),
+ m_drq(0),
+ m_prio(PRIO_IDLE)
{
}
@@ -74,6 +77,7 @@ void i8089_channel::device_start()
save_item(NAME(m_xfer_pending));
save_item(NAME(m_dma_value));
save_item(NAME(m_dma_state));
+ save_item(NAME(m_drq));
save_item(NAME(m_prio));
for (int i = 0; i < ARRAY_LENGTH(m_r); i++)
@@ -246,11 +250,13 @@ int i8089_channel::execute_run()
break;
case DMA_WAIT_FOR_SOURCE_DRQ:
- fatalerror("%s('%s'): wait for source drq not supported\n", shortname(), tag());
+ if (m_drq)
+ m_dma_state = DMA_FETCH;
+ break;
case DMA_FETCH:
if (VERBOSE_DMA)
- logerror("%s('%s'): entering state: DMA_FETCH", shortname(), tag());
+ logerror("%s('%s'): entering state: DMA_FETCH\n", shortname(), tag());
// source is 16-bit?
if (BIT(m_r[PSW].w, 1))
@@ -834,5 +840,7 @@ WRITE_LINE_MEMBER( i8089_channel::ext_w )
WRITE_LINE_MEMBER( i8089_channel::drq_w )
{
if (VERBOSE)
- logerror("%s('%s'): ext_w: %d\n", shortname(), tag(), state);
+ logerror("%s('%s'): drq_w: %d\n", shortname(), tag(), state);
+
+ m_drq = state;
}
diff --git a/src/emu/cpu/i8089/i8089_channel.h b/src/emu/cpu/i8089/i8089_channel.h
index 9b4034603e5..7c1f5a6e445 100644
--- a/src/emu/cpu/i8089/i8089_channel.h
+++ b/src/emu/cpu/i8089/i8089_channel.h
@@ -186,6 +186,7 @@ private:
bool m_xfer_pending;
UINT16 m_dma_value;
int m_dma_state;
+ bool m_drq;
// dma state
enum