mirror of
https://github.com/holub/mame
synced 2025-04-23 00:39:36 +03:00
bus/ata: Do slot output signals the sensible way (fixes GitHub #11346).
This commit is contained in:
parent
f9002c38ee
commit
a3e4ece95e
@ -20,10 +20,7 @@
|
||||
|
||||
device_ata_interface::device_ata_interface(const machine_config &mconfig, device_t &device) :
|
||||
device_interface(device, "ata"),
|
||||
m_irq_handler(device),
|
||||
m_dmarq_handler(device),
|
||||
m_dasp_handler(device),
|
||||
m_pdiag_handler(device)
|
||||
m_slot(dynamic_cast<ata_slot_device *>(device.owner()))
|
||||
{
|
||||
}
|
||||
|
||||
@ -42,6 +39,10 @@ DEFINE_DEVICE_TYPE(ATA_SLOT, ata_slot_device, "ata_slot", "ATA Connector")
|
||||
ata_slot_device::ata_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
|
||||
device_t(mconfig, ATA_SLOT, tag, owner, clock),
|
||||
device_single_card_slot_interface<device_ata_interface>(mconfig, *this),
|
||||
m_irq_handler(*this),
|
||||
m_dmarq_handler(*this),
|
||||
m_dasp_handler(*this),
|
||||
m_pdiag_handler(*this),
|
||||
m_dev(nullptr)
|
||||
{
|
||||
}
|
||||
|
@ -13,14 +13,43 @@
|
||||
|
||||
#pragma once
|
||||
|
||||
class device_ata_interface;
|
||||
|
||||
// ======================> device_ata_interface
|
||||
|
||||
class ata_interface_device;
|
||||
class ata_slot_device :
|
||||
public device_t,
|
||||
public device_single_card_slot_interface<device_ata_interface>
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
ata_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
|
||||
|
||||
auto irq_handler() { return m_irq_handler.bind(); }
|
||||
auto dmarq_handler() { return m_dmarq_handler.bind(); }
|
||||
auto dasp_handler() { return m_dasp_handler.bind(); }
|
||||
auto pdiag_handler() { return m_pdiag_handler.bind(); }
|
||||
|
||||
device_ata_interface *dev() { return m_dev; }
|
||||
|
||||
protected:
|
||||
// device_t implementation
|
||||
virtual void device_config_complete() override;
|
||||
virtual void device_start() override;
|
||||
|
||||
private:
|
||||
devcb_write_line m_irq_handler;
|
||||
devcb_write_line m_dmarq_handler;
|
||||
devcb_write_line m_dasp_handler;
|
||||
devcb_write_line m_pdiag_handler;
|
||||
|
||||
device_ata_interface *m_dev;
|
||||
|
||||
friend class device_ata_interface;
|
||||
};
|
||||
|
||||
|
||||
class device_ata_interface : public device_interface
|
||||
{
|
||||
friend class abstract_ata_interface_device;
|
||||
public:
|
||||
virtual uint16_t read_dma() = 0;
|
||||
virtual uint16_t read_cs0(offs_t offset, uint16_t mem_mask = 0xffff) = 0;
|
||||
@ -38,33 +67,17 @@ public:
|
||||
protected:
|
||||
device_ata_interface(const machine_config &mconfig, device_t &device);
|
||||
|
||||
devcb_write_line m_irq_handler;
|
||||
devcb_write_line m_dmarq_handler;
|
||||
devcb_write_line m_dasp_handler;
|
||||
devcb_write_line m_pdiag_handler;
|
||||
};
|
||||
|
||||
// ======================> ata_slot_device
|
||||
|
||||
class ata_slot_device : public device_t,
|
||||
public device_single_card_slot_interface<device_ata_interface>
|
||||
{
|
||||
public:
|
||||
// construction/destruction
|
||||
ata_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock = 0);
|
||||
|
||||
device_ata_interface *dev() { return m_dev; }
|
||||
|
||||
protected:
|
||||
// device-level overrides
|
||||
virtual void device_start() override;
|
||||
virtual void device_config_complete() override;
|
||||
void set_irq(int state) { m_slot->m_irq_handler(state); }
|
||||
void set_dmarq(int state) { m_slot->m_dmarq_handler(state); }
|
||||
void set_dasp(int state) { m_slot->m_dasp_handler(state); }
|
||||
void set_pdiag(int state) { m_slot->m_pdiag_handler(state); }
|
||||
|
||||
private:
|
||||
device_ata_interface *m_dev;
|
||||
ata_slot_device *const m_slot;
|
||||
};
|
||||
|
||||
// device type definition
|
||||
|
||||
// device type declaration
|
||||
DECLARE_DEVICE_TYPE(ATA_SLOT, ata_slot_device)
|
||||
|
||||
void ata_devices(device_slot_interface &device);
|
||||
|
@ -40,8 +40,8 @@ enum
|
||||
#define DEVICE1_PDIAG_TIME (attotime::from_msec(2))
|
||||
#define DIAGNOSTIC_TIME (attotime::from_msec(2))
|
||||
|
||||
ata_hle_device::ata_hle_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock)
|
||||
: device_t(mconfig, type, tag, owner, clock),
|
||||
ata_hle_device::ata_hle_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
|
||||
device_t(mconfig, type, tag, owner, clock),
|
||||
device_ata_interface(mconfig, *this),
|
||||
m_buffer_offset(0),
|
||||
m_buffer_size(0),
|
||||
@ -396,9 +396,9 @@ void ata_hle_device::write_data(uint16_t data)
|
||||
void ata_hle_device::update_irq()
|
||||
{
|
||||
if (device_selected() && (m_device_control & IDE_DEVICE_CONTROL_NIEN) == 0)
|
||||
m_irq_handler(m_irq);
|
||||
device_ata_interface::set_irq(m_irq);
|
||||
else
|
||||
m_irq_handler(CLEAR_LINE);
|
||||
device_ata_interface::set_irq(CLEAR_LINE);
|
||||
}
|
||||
|
||||
void ata_hle_device::set_irq(int state)
|
||||
@ -417,7 +417,7 @@ void ata_hle_device::set_dmarq(int state)
|
||||
{
|
||||
m_dmarq = state;
|
||||
|
||||
m_dmarq_handler(state);
|
||||
device_ata_interface::set_dmarq(state);
|
||||
}
|
||||
}
|
||||
|
||||
@ -427,7 +427,7 @@ void ata_hle_device::set_dasp(int state)
|
||||
{
|
||||
m_daspout = state;
|
||||
|
||||
m_dasp_handler(state);
|
||||
device_ata_interface::set_dasp(state);
|
||||
}
|
||||
}
|
||||
|
||||
@ -437,7 +437,7 @@ void ata_hle_device::set_pdiag(int state)
|
||||
{
|
||||
m_pdiagout = state;
|
||||
|
||||
m_pdiag_handler(state);
|
||||
device_ata_interface::set_pdiag(state);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -237,26 +237,9 @@ void abstract_ata_interface_device::device_start()
|
||||
m_dasp[i] = 0;
|
||||
m_pdiag[i] = 0;
|
||||
|
||||
device_ata_interface *dev = m_slot[i]->dev();
|
||||
device_ata_interface *const dev = m_slot[i]->dev();
|
||||
if (dev)
|
||||
{
|
||||
if (i == 0)
|
||||
{
|
||||
dev->m_irq_handler.bind().set(*this, FUNC(abstract_ata_interface_device::irq0_write_line));
|
||||
dev->m_dmarq_handler.bind().set(*this, FUNC(abstract_ata_interface_device::dmarq0_write_line));
|
||||
dev->m_dasp_handler.bind().set(*this, FUNC(abstract_ata_interface_device::dasp0_write_line));
|
||||
dev->m_pdiag_handler.bind().set(*this, FUNC(abstract_ata_interface_device::pdiag0_write_line));
|
||||
}
|
||||
else
|
||||
{
|
||||
dev->m_irq_handler.bind().set(*this, FUNC(abstract_ata_interface_device::irq1_write_line));
|
||||
dev->m_dmarq_handler.bind().set(*this, FUNC(abstract_ata_interface_device::dmarq1_write_line));
|
||||
dev->m_dasp_handler.bind().set(*this, FUNC(abstract_ata_interface_device::dasp1_write_line));
|
||||
dev->m_pdiag_handler.bind().set(*this, FUNC(abstract_ata_interface_device::pdiag1_write_line));
|
||||
}
|
||||
|
||||
dev->write_csel(i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -267,6 +250,15 @@ void abstract_ata_interface_device::device_start()
|
||||
|
||||
void abstract_ata_interface_device::device_add_mconfig(machine_config &config)
|
||||
{
|
||||
for (size_t slot = 0; slot < SLOT_COUNT; slot++)
|
||||
ATA_SLOT(config, m_slot[slot]);
|
||||
ATA_SLOT(config, m_slot[0]);
|
||||
m_slot[0]->irq_handler().set(FUNC(abstract_ata_interface_device::irq0_write_line));
|
||||
m_slot[0]->dmarq_handler().set(FUNC(abstract_ata_interface_device::dmarq0_write_line));
|
||||
m_slot[0]->dasp_handler().set(FUNC(abstract_ata_interface_device::dasp0_write_line));
|
||||
m_slot[0]->pdiag_handler().set(FUNC(abstract_ata_interface_device::pdiag0_write_line));
|
||||
|
||||
ATA_SLOT(config, m_slot[1]);
|
||||
m_slot[1]->irq_handler().set(FUNC(abstract_ata_interface_device::irq1_write_line));
|
||||
m_slot[1]->dmarq_handler().set(FUNC(abstract_ata_interface_device::dmarq1_write_line));
|
||||
m_slot[1]->dasp_handler().set(FUNC(abstract_ata_interface_device::dasp1_write_line));
|
||||
m_slot[1]->pdiag_handler().set(FUNC(abstract_ata_interface_device::pdiag1_write_line));
|
||||
}
|
||||
|
@ -861,6 +861,7 @@ devcb_read<Result, DefaultMask>::devcb_read(device_t &owner, Result dflt)
|
||||
template <typename Result, std::make_unsigned_t<Result> DefaultMask>
|
||||
typename devcb_read<Result, DefaultMask>::binder devcb_read<Result, DefaultMask>::bind()
|
||||
{
|
||||
assert(m_functions.empty());
|
||||
return binder(*this);
|
||||
}
|
||||
|
||||
@ -2380,6 +2381,7 @@ devcb_write<Input, DefaultMask>::devcb_write(device_t &owner)
|
||||
template <typename Input, std::make_unsigned_t<Input> DefaultMask>
|
||||
typename devcb_write<Input, DefaultMask>::binder devcb_write<Input, DefaultMask>::bind()
|
||||
{
|
||||
assert(m_functions.empty());
|
||||
return binder(*this);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user