Skip to content

Commit

Permalink
bus/ata: Do slot output signals the sensible way (fixes GitHub #11346).
Browse files Browse the repository at this point in the history
  • Loading branch information
cuavas committed Jun 17, 2023
1 parent f9002c3 commit a3e4ece
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 57 deletions.
9 changes: 5 additions & 4 deletions src/devices/bus/ata/atadev.cpp
Expand Up @@ -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()))
{
}

Expand All @@ -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)
{
}
Expand Down
65 changes: 39 additions & 26 deletions src/devices/bus/ata/atadev.h
Expand Up @@ -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;
Expand All @@ -38,33 +67,17 @@ class device_ata_interface : public device_interface
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);
Expand Down
14 changes: 7 additions & 7 deletions src/devices/bus/ata/atahle.cpp
Expand Up @@ -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),
Expand Down Expand Up @@ -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)
Expand All @@ -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);
}
}

Expand All @@ -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);
}
}

Expand All @@ -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);
}
}

Expand Down
32 changes: 12 additions & 20 deletions src/devices/bus/ata/ataintf.cpp
Expand Up @@ -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);
}
}
}

Expand All @@ -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));
}
2 changes: 2 additions & 0 deletions src/emu/devcb.h
Expand Up @@ -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);
}

Expand Down Expand Up @@ -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);
}

Expand Down

0 comments on commit a3e4ece

Please sign in to comment.