summaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--src/devices/machine/amigafdc.cpp22
-rw-r--r--src/devices/machine/amigafdc.h20
-rw-r--r--src/mame/drivers/alg.cpp4
-rw-r--r--src/mame/drivers/amiga.cpp16
-rw-r--r--src/mame/drivers/arsystems.cpp4
-rw-r--r--src/mame/drivers/cubo.cpp4
-rw-r--r--src/mame/drivers/mquake.cpp4
-rw-r--r--src/mame/drivers/upscope.cpp4
-rw-r--r--src/mame/includes/amiga.h3
9 files changed, 70 insertions, 11 deletions
diff --git a/src/devices/machine/amigafdc.cpp b/src/devices/machine/amigafdc.cpp
index 8f8fc47c337..ce3dc5e7c00 100644
--- a/src/devices/machine/amigafdc.cpp
+++ b/src/devices/machine/amigafdc.cpp
@@ -8,7 +8,6 @@
#include "emu.h"
-#include "includes/amiga.h"
#include "formats/ami_dsk.h"
#include "amigafdc.h"
@@ -21,6 +20,10 @@ FLOPPY_FORMATS_END
amiga_fdc_device::amiga_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
device_t(mconfig, AMIGA_FDC, tag, owner, clock),
m_write_index(*this),
+ m_read_dma(*this),
+ m_write_dma(*this),
+ m_write_dskblk(*this),
+ m_write_dsksyn(*this),
floppy(nullptr), t_gen(nullptr), dsklen(0), pre_dsklen(0), dsksync(0), dskbyt(0), adkcon(0), dmacon(0), dskpt(0), dma_value(0), dma_state(0)
{
}
@@ -28,6 +31,10 @@ amiga_fdc_device::amiga_fdc_device(const machine_config &mconfig, const char *ta
void amiga_fdc_device::device_start()
{
m_write_index.resolve_safe();
+ m_read_dma.resolve_safe(0);
+ m_write_dma.resolve_safe();
+ m_write_dskblk.resolve_safe();
+ m_write_dsksyn.resolve_safe();
static const char *names[] = { "0", "1", "2", "3" };
for(int i=0; i != 4; i++) {
@@ -62,20 +69,18 @@ void amiga_fdc_device::device_reset()
void amiga_fdc_device::dma_done()
{
- amiga_state *state = machine().driver_data<amiga_state>();
if(dskbyt & 0x2000) {
dskbyt &= ~0x2000;
cur_live.pll.stop_writing(floppy, cur_live.tm);
}
dma_state = DMA_IDLE;
- state->custom_chip_w(REG_INTREQ, INTENA_SETCLR | INTENA_DSKBLK);
+ m_write_dskblk(1);
}
void amiga_fdc_device::dma_write(uint16_t value)
{
- amiga_state *state = machine().driver_data<amiga_state>();
- state->chip_ram_w(dskpt, value);
+ m_write_dma(dskpt, value, 0xffff);
dskpt += 2;
dsklen--;
@@ -88,8 +93,7 @@ void amiga_fdc_device::dma_write(uint16_t value)
uint16_t amiga_fdc_device::dma_read()
{
- amiga_state *state = machine().driver_data<amiga_state>();
- uint16_t res = state->chip_ram_r(dskpt);
+ uint16_t res = m_read_dma(dskpt, 0xffff);
dskpt += 2;
dsklen--;
@@ -175,8 +179,6 @@ void amiga_fdc_device::live_abort()
void amiga_fdc_device::live_run(const attotime &limit)
{
- amiga_state *state = machine().driver_data<amiga_state>();
-
if(cur_live.state == IDLE || cur_live.next_state != -1)
return;
@@ -258,7 +260,7 @@ void amiga_fdc_device::live_run(const attotime &limit)
cur_live.bit_counter = 0;
}
dskbyt |= 0x1000;
- state->custom_chip_w(REG_INTREQ, INTENA_SETCLR | INTENA_DSKSYN);
+ m_write_dsksyn(1);
} else
dskbyt &= ~0x1000;
diff --git a/src/devices/machine/amigafdc.h b/src/devices/machine/amigafdc.h
index b0e18debc69..065ed590176 100644
--- a/src/devices/machine/amigafdc.h
+++ b/src/devices/machine/amigafdc.h
@@ -10,11 +10,27 @@
#define MCFG_AMIGA_FDC_INDEX_CALLBACK(_write) \
devcb = &amiga_fdc_device::set_index_wr_callback(*device, DEVCB_##_write);
+#define MCFG_AMIGA_FDC_READ_DMA_CALLBACK(_read) \
+ devcb = &amiga_fdc_device::set_dma_rd_callback(*device, DEVCB_##_read);
+
+#define MCFG_AMIGA_FDC_WRITE_DMA_CALLBACK(_write) \
+ devcb = &amiga_fdc_device::set_dma_wr_callback(*device, DEVCB_##_write);
+
+#define MCFG_AMIGA_FDC_DSKBLK_CALLBACK(_write) \
+ devcb = &amiga_fdc_device::set_dskblk_wr_callback(*device, DEVCB_##_write);
+
+#define MCFG_AMIGA_FDC_DSKSYN_CALLBACK(_write) \
+ devcb = &amiga_fdc_device::set_dsksyn_wr_callback(*device, DEVCB_##_write);
+
class amiga_fdc_device : public device_t {
public:
amiga_fdc_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock);
template <class Object> static devcb_base &set_index_wr_callback(device_t &device, Object &&cb) { return downcast<amiga_fdc_device &>(device).m_write_index.set_callback(std::forward<Object>(cb)); }
+ template <class Object> static devcb_base &set_dma_rd_callback(device_t &device, Object &&cb) { return downcast<amiga_fdc_device &>(device).m_read_dma.set_callback(std::forward<Object>(cb)); }
+ template <class Object> static devcb_base &set_dma_wr_callback(device_t &device, Object &&cb) { return downcast<amiga_fdc_device &>(device).m_write_dma.set_callback(std::forward<Object>(cb)); }
+ template <class Object> static devcb_base &set_dskblk_wr_callback(device_t &device, Object &&cb) { return downcast<amiga_fdc_device &>(device).m_write_dskblk.set_callback(std::forward<Object>(cb)); }
+ template <class Object> static devcb_base &set_dsksyn_wr_callback(device_t &device, Object &&cb) { return downcast<amiga_fdc_device &>(device).m_write_dsksyn.set_callback(std::forward<Object>(cb)); }
DECLARE_WRITE8_MEMBER(ciaaprb_w);
@@ -87,6 +103,10 @@ private:
};
devcb_write_line m_write_index;
+ devcb_read16 m_read_dma;
+ devcb_write16 m_write_dma;
+ devcb_write_line m_write_dskblk;
+ devcb_write_line m_write_dsksyn;
floppy_image_device *floppy;
floppy_image_device *floppy_devices[4];
diff --git a/src/mame/drivers/alg.cpp b/src/mame/drivers/alg.cpp
index ee7b82c5401..5c807aa22cb 100644
--- a/src/mame/drivers/alg.cpp
+++ b/src/mame/drivers/alg.cpp
@@ -344,6 +344,10 @@ static MACHINE_CONFIG_START( alg_r1 )
/* fdc */
MCFG_DEVICE_ADD("fdc", AMIGA_FDC, amiga_state::CLK_7M_NTSC)
MCFG_AMIGA_FDC_INDEX_CALLBACK(DEVWRITELINE("cia_1", mos8520_device, flag_w))
+ MCFG_AMIGA_FDC_READ_DMA_CALLBACK(READ16(amiga_state, chip_ram_r))
+ MCFG_AMIGA_FDC_WRITE_DMA_CALLBACK(WRITE16(amiga_state, chip_ram_w))
+ MCFG_AMIGA_FDC_DSKBLK_CALLBACK(WRITELINE(amiga_state, fdc_dskblk_w))
+ MCFG_AMIGA_FDC_DSKSYN_CALLBACK(WRITELINE(amiga_state, fdc_dsksyn_w))
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/amiga.cpp b/src/mame/drivers/amiga.cpp
index eca879d10b0..7919ed3b982 100644
--- a/src/mame/drivers/amiga.cpp
+++ b/src/mame/drivers/amiga.cpp
@@ -827,7 +827,17 @@ WRITE32_MEMBER( a4000_state::motherboard_w )
logerror("motherboard_w(%06x): %08x & %08x\n", offset, data, mem_mask);
}
-WRITE_LINE_MEMBER( cd32_state::akiko_int_w )
+WRITE_LINE_MEMBER(amiga_state::fdc_dskblk_w)
+{
+ set_interrupt(INTENA_SETCLR | INTENA_DSKBLK);
+}
+
+WRITE_LINE_MEMBER(amiga_state::fdc_dsksyn_w)
+{
+ set_interrupt(INTENA_SETCLR | INTENA_DSKSYN);
+}
+
+WRITE_LINE_MEMBER(cd32_state::akiko_int_w)
{
set_interrupt(INTENA_SETCLR | INTENA_PORTS);
}
@@ -1346,6 +1356,10 @@ static MACHINE_CONFIG_START( amiga_base )
// floppy drives
MCFG_DEVICE_ADD("fdc", AMIGA_FDC, amiga_state::CLK_7M_PAL)
+ MCFG_AMIGA_FDC_READ_DMA_CALLBACK(READ16(amiga_state, chip_ram_r))
+ MCFG_AMIGA_FDC_WRITE_DMA_CALLBACK(WRITE16(amiga_state, chip_ram_w))
+ MCFG_AMIGA_FDC_DSKBLK_CALLBACK(WRITELINE(amiga_state, fdc_dskblk_w))
+ MCFG_AMIGA_FDC_DSKSYN_CALLBACK(WRITELINE(amiga_state, fdc_dsksyn_w))
MCFG_FLOPPY_DRIVE_ADD("fdc:0", amiga_floppies, "35dd", amiga_fdc_device::floppy_formats)
MCFG_FLOPPY_DRIVE_SOUND(true)
MCFG_FLOPPY_DRIVE_ADD("fdc:1", amiga_floppies, nullptr, amiga_fdc_device::floppy_formats)
diff --git a/src/mame/drivers/arsystems.cpp b/src/mame/drivers/arsystems.cpp
index 9bc03bdf0e7..3c87838ed64 100644
--- a/src/mame/drivers/arsystems.cpp
+++ b/src/mame/drivers/arsystems.cpp
@@ -335,6 +335,10 @@ static MACHINE_CONFIG_START( arcadia )
/* fdc */
MCFG_DEVICE_ADD("fdc", AMIGA_FDC, amiga_state::CLK_7M_NTSC)
MCFG_AMIGA_FDC_INDEX_CALLBACK(DEVWRITELINE("cia_1", mos8520_device, flag_w))
+ MCFG_AMIGA_FDC_READ_DMA_CALLBACK(READ16(amiga_state, chip_ram_r))
+ MCFG_AMIGA_FDC_WRITE_DMA_CALLBACK(WRITE16(amiga_state, chip_ram_w))
+ MCFG_AMIGA_FDC_DSKBLK_CALLBACK(WRITELINE(amiga_state, fdc_dskblk_w))
+ MCFG_AMIGA_FDC_DSKSYN_CALLBACK(WRITELINE(amiga_state, fdc_dsksyn_w))
MACHINE_CONFIG_END
static MACHINE_CONFIG_DERIVED( argh, arcadia )
diff --git a/src/mame/drivers/cubo.cpp b/src/mame/drivers/cubo.cpp
index bc80310d5ff..0c330435f5c 100644
--- a/src/mame/drivers/cubo.cpp
+++ b/src/mame/drivers/cubo.cpp
@@ -1089,6 +1089,10 @@ static MACHINE_CONFIG_START( cubo )
/* fdc */
MCFG_DEVICE_ADD("fdc", AMIGA_FDC, amiga_state::CLK_7M_PAL)
MCFG_AMIGA_FDC_INDEX_CALLBACK(DEVWRITELINE("cia_1", mos8520_device, flag_w))
+ MCFG_AMIGA_FDC_READ_DMA_CALLBACK(READ16(amiga_state, chip_ram_r))
+ MCFG_AMIGA_FDC_WRITE_DMA_CALLBACK(WRITE16(amiga_state, chip_ram_w))
+ MCFG_AMIGA_FDC_DSKBLK_CALLBACK(WRITELINE(amiga_state, fdc_dskblk_w))
+ MCFG_AMIGA_FDC_DSKSYN_CALLBACK(WRITELINE(amiga_state, fdc_dsksyn_w))
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/mquake.cpp b/src/mame/drivers/mquake.cpp
index c58c420aa0e..d318b2225bc 100644
--- a/src/mame/drivers/mquake.cpp
+++ b/src/mame/drivers/mquake.cpp
@@ -353,6 +353,10 @@ static MACHINE_CONFIG_START( mquake )
/* fdc */
MCFG_DEVICE_ADD("fdc", AMIGA_FDC, amiga_state::CLK_7M_NTSC)
MCFG_AMIGA_FDC_INDEX_CALLBACK(DEVWRITELINE("cia_1", mos8520_device, flag_w))
+ MCFG_AMIGA_FDC_READ_DMA_CALLBACK(READ16(amiga_state, chip_ram_r))
+ MCFG_AMIGA_FDC_WRITE_DMA_CALLBACK(WRITE16(amiga_state, chip_ram_w))
+ MCFG_AMIGA_FDC_DSKBLK_CALLBACK(WRITELINE(amiga_state, fdc_dskblk_w))
+ MCFG_AMIGA_FDC_DSKSYN_CALLBACK(WRITELINE(amiga_state, fdc_dsksyn_w))
MACHINE_CONFIG_END
diff --git a/src/mame/drivers/upscope.cpp b/src/mame/drivers/upscope.cpp
index ab10bdd9dd9..c7cdc89494c 100644
--- a/src/mame/drivers/upscope.cpp
+++ b/src/mame/drivers/upscope.cpp
@@ -304,6 +304,10 @@ static MACHINE_CONFIG_START( upscope )
/* fdc */
MCFG_DEVICE_ADD("fdc", AMIGA_FDC, amiga_state::CLK_7M_NTSC)
MCFG_AMIGA_FDC_INDEX_CALLBACK(DEVWRITELINE("cia_1", mos8520_device, flag_w))
+ MCFG_AMIGA_FDC_READ_DMA_CALLBACK(READ16(amiga_state, chip_ram_r))
+ MCFG_AMIGA_FDC_WRITE_DMA_CALLBACK(WRITE16(amiga_state, chip_ram_w))
+ MCFG_AMIGA_FDC_DSKBLK_CALLBACK(WRITELINE(amiga_state, fdc_dskblk_w))
+ MCFG_AMIGA_FDC_DSKSYN_CALLBACK(WRITELINE(amiga_state, fdc_dsksyn_w))
// i/o extension
MCFG_DEVICE_ADD("ppi", I8255, 0)
diff --git a/src/mame/includes/amiga.h b/src/mame/includes/amiga.h
index 43432720cbb..75100fb7ef4 100644
--- a/src/mame/includes/amiga.h
+++ b/src/mame/includes/amiga.h
@@ -459,6 +459,9 @@ public:
DECLARE_READ16_MEMBER( rom_mirror_r );
DECLARE_READ32_MEMBER( rom_mirror32_r );
+ DECLARE_WRITE_LINE_MEMBER(fdc_dskblk_w);
+ DECLARE_WRITE_LINE_MEMBER(fdc_dsksyn_w);
+
// standard clocks
static const int CLK_28M_PAL = XTAL_28_37516MHz;
static const int CLK_7M_PAL = CLK_28M_PAL / 4;