summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/isa/isa.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/isa/isa.cpp')
-rw-r--r--src/devices/bus/isa/isa.cpp92
1 files changed, 39 insertions, 53 deletions
diff --git a/src/devices/bus/isa/isa.cpp b/src/devices/bus/isa/isa.cpp
index 92ead5df95b..417e354180c 100644
--- a/src/devices/bus/isa/isa.cpp
+++ b/src/devices/bus/isa/isa.cpp
@@ -111,10 +111,11 @@ isa8_device::isa8_device(const machine_config &mconfig, device_type type, const
m_io_config("ISA 8-bit I/O", ENDIANNESS_LITTLE, 8, 16, 0, address_map_constructor()),
m_mem16_config("ISA 16-bit mem", ENDIANNESS_LITTLE, 16, 24, 0, address_map_constructor()),
m_io16_config("ISA 16-bit I/O", ENDIANNESS_LITTLE, 16, 16, 0, address_map_constructor()),
- m_memspace(*this, finder_base::DUMMY_TAG, -1),
- m_iospace(*this, finder_base::DUMMY_TAG, -1),
- m_memwidth(0),
+ m_maincpu(*this, finder_base::DUMMY_TAG),
+ m_iospace(nullptr),
+ m_memspace(nullptr),
m_iowidth(0),
+ m_memwidth(0),
m_allocspaces(false),
m_out_irq2_cb(*this),
m_out_irq3_cb(*this),
@@ -125,6 +126,7 @@ isa8_device::isa8_device(const machine_config &mconfig, device_type type, const
m_out_drq1_cb(*this),
m_out_drq2_cb(*this),
m_out_drq3_cb(*this),
+ m_nmi_enabled(false),
m_write_iochck(*this)
{
std::fill(std::begin(m_dma_device), std::end(m_dma_device), nullptr);
@@ -200,27 +202,10 @@ void isa8_device::remap(int space_id, offs_t start, offs_t end)
}
//-------------------------------------------------
-// device_config_complete - - perform any
-// operations now that the configuration is
-// complete
-//-------------------------------------------------
-
-void isa8_device::device_config_complete()
-{
- if (m_allocspaces)
- {
- m_memspace.set_tag(*this, DEVICE_SELF, AS_ISA_MEM);
- m_iospace.set_tag(*this, DEVICE_SELF, AS_ISA_IO);
- }
-}
-
-//-------------------------------------------------
-// device_resolve_objects - resolve objects that
-// may be needed for other devices to set
-// initial conditions at start time
+// device_start - device-specific startup
//-------------------------------------------------
-void isa8_device::device_resolve_objects()
+void isa8_device::device_start()
{
// resolve callbacks
m_write_iochck.resolve_safe();
@@ -235,16 +220,20 @@ void isa8_device::device_resolve_objects()
m_out_drq2_cb.resolve_safe();
m_out_drq3_cb.resolve_safe();
- m_iowidth = m_iospace->data_width();
- m_memwidth = m_memspace->data_width();
-}
-
-//-------------------------------------------------
-// device_start - device-specific startup
-//-------------------------------------------------
-
-void isa8_device::device_start()
-{
+ if (m_allocspaces)
+ {
+ m_iospace = &space(AS_ISA_IO);
+ m_memspace = &space(AS_ISA_MEM);
+ m_iowidth = m_iospace->data_width();
+ m_memwidth = m_memspace->data_width();
+ }
+ else // use host CPU's program and I/O spaces directly
+ {
+ m_iospace = &m_maincpu->space(AS_IO);
+ m_iowidth = m_maincpu->space_config(AS_IO)->data_width();
+ m_memspace = &m_maincpu->space(AS_PROGRAM);
+ m_memwidth = m_maincpu->space_config(AS_PROGRAM)->data_width();
+ }
}
//-------------------------------------------------
@@ -263,12 +252,12 @@ template<typename R, typename W> void isa8_device::install_space(int spacenum, o
if (spacenum == AS_ISA_IO)
{
- space = m_iospace.target();
+ space = m_iospace;
buswidth = m_iowidth;
}
else if (spacenum == AS_ISA_MEM)
{
- space = m_memspace.target();
+ space = m_memspace;
buswidth = m_memwidth;
}
else
@@ -389,18 +378,12 @@ uint8_t isa8_device::dack_r(int line)
return 0xff;
}
-void isa8_device::dack_w(int line, uint8_t data)
+void isa8_device::dack_w(int line,uint8_t data)
{
if (m_dma_device[line])
return m_dma_device[line]->dack_w(line,data);
}
-void isa8_device::dack_line_w(int line, int state)
-{
- if (m_dma_device[line])
- m_dma_device[line]->dack_line_w(line, state);
-}
-
void isa8_device::eop_w(int channel, int state)
{
if (m_dma_eop[channel] && m_dma_device[channel])
@@ -409,9 +392,18 @@ void isa8_device::eop_w(int channel, int state)
void isa8_device::nmi()
{
- // active low pulse
- m_write_iochck(0);
- m_write_iochck(1);
+ if (m_write_iochck.isnull())
+ {
+ if (m_nmi_enabled)
+ {
+ m_maincpu->pulse_input_line(INPUT_LINE_NMI, attotime::zero);
+ }
+ }
+ else
+ {
+ m_write_iochck(0);
+ m_write_iochck(1);
+ }
}
//**************************************************************************
@@ -446,15 +438,9 @@ uint8_t device_isa8_card_interface::dack_r(int line)
{
return 0;
}
-
-void device_isa8_card_interface::dack_w(int line, uint8_t data)
+void device_isa8_card_interface::dack_w(int line,uint8_t data)
{
}
-
-void device_isa8_card_interface::dack_line_w(int line, int state)
-{
-}
-
void device_isa8_card_interface::eop_w(int state)
{
}
@@ -607,7 +593,7 @@ uint16_t isa16_device::dack16_r(int line)
return 0xffff;
}
-void isa16_device::dack16_w(int line, uint16_t data)
+void isa16_device::dack16_w(int line,uint16_t data)
{
if (m_dma_device[line])
return dynamic_cast<device_isa16_card_interface *>(m_dma_device[line])->dack16_w(line,data);
@@ -661,6 +647,6 @@ uint16_t device_isa16_card_interface::dack16_r(int line)
return 0;
}
-void device_isa16_card_interface::dack16_w(int line, uint16_t data)
+void device_isa16_card_interface::dack16_w(int line,uint16_t data)
{
}