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(); 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(); - 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(); - 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(); - 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 static devcb_base &set_index_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_index.set_callback(std::forward(cb)); } + template static devcb_base &set_dma_rd_callback(device_t &device, Object &&cb) { return downcast(device).m_read_dma.set_callback(std::forward(cb)); } + template static devcb_base &set_dma_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_dma.set_callback(std::forward(cb)); } + template static devcb_base &set_dskblk_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_dskblk.set_callback(std::forward(cb)); } + template static devcb_base &set_dsksyn_wr_callback(device_t &device, Object &&cb) { return downcast(device).m_write_dsksyn.set_callback(std::forward(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;