This commit is contained in:
RobertoFresca 2017-12-20 23:57:22 -03:00
commit 7e992e512e
9 changed files with 70 additions and 11 deletions

View File

@ -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;

View File

@ -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];

View File

@ -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

View File

@ -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)

View File

@ -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 )

View File

@ -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

View File

@ -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

View File

@ -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)

View File

@ -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;