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.cpp51
1 files changed, 39 insertions, 12 deletions
diff --git a/src/devices/bus/isa/isa.cpp b/src/devices/bus/isa/isa.cpp
index 9537febc93c..ae5cacad4b0 100644
--- a/src/devices/bus/isa/isa.cpp
+++ b/src/devices/bus/isa/isa.cpp
@@ -152,22 +152,22 @@ device_memory_interface::space_config_vector isa16_device::memory_space_config()
};
}
-READ8_MEMBER(isa8_device::mem_r)
+uint8_t isa8_device::mem_r(offs_t offset)
{
return m_memspace->read_byte(offset);
}
-WRITE8_MEMBER(isa8_device::mem_w)
+void isa8_device::mem_w(offs_t offset, uint8_t data)
{
m_memspace->write_byte(offset, data);
}
-READ8_MEMBER(isa8_device::io_r)
+uint8_t isa8_device::io_r(offs_t offset)
{
return m_iospace->read_byte(offset);
}
-WRITE8_MEMBER(isa8_device::io_w)
+void isa8_device::io_w(offs_t offset, uint8_t data)
{
m_iospace->write_byte(offset, data);
}
@@ -545,27 +545,54 @@ void isa16_device::install16_device(offs_t start, offs_t end, read16_delegate rh
}
}
-READ16_MEMBER(isa16_device::mem16_r)
+void isa16_device::install16_device(offs_t start, offs_t end, read16s_delegate rhandler, write16s_delegate whandler)
+{
+ int buswidth = m_iowidth;
+ switch(buswidth)
+ {
+ case 16:
+ m_iospace->install_readwrite_handler(start, end, rhandler, whandler, 0);
+ break;
+ case 32:
+ m_iospace->install_readwrite_handler(start, end, rhandler, whandler, 0xffffffff);
+ if ((start % 4) == 0) {
+ if ((end-start)==1) {
+ m_iospace->install_readwrite_handler(start, end+2, rhandler, whandler, 0x0000ffff);
+ } else {
+ m_iospace->install_readwrite_handler(start, end, rhandler, whandler, 0xffffffff);
+ }
+ } else {
+ // we handle just misalligned by 2
+ m_iospace->install_readwrite_handler(start-2, end, rhandler, whandler, 0xffff0000);
+ }
+
+ break;
+ default:
+ fatalerror("ISA16: Bus width %d not supported\n", buswidth);
+ }
+}
+
+uint16_t isa16_device::mem16_r(offs_t offset, uint16_t mem_mask)
{
return m_memspace->read_word(offset<<1, mem_mask);
}
-WRITE16_MEMBER(isa16_device::mem16_w)
+void isa16_device::mem16_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
m_memspace->write_word(offset<<1, data, mem_mask);
}
-READ16_MEMBER(isa16_device::io16_r)
+uint16_t isa16_device::io16_r(offs_t offset, uint16_t mem_mask)
{
return m_iospace->read_word(offset<<1, mem_mask);
}
-WRITE16_MEMBER(isa16_device::io16_w)
+void isa16_device::io16_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
m_iospace->write_word(offset<<1, data, mem_mask);
}
-READ16_MEMBER(isa16_device::mem16_swap_r)
+uint16_t isa16_device::mem16_swap_r(offs_t offset, uint16_t mem_mask)
{
uint16_t rv;
mem_mask = (mem_mask<<8) | (mem_mask>>8);
@@ -575,14 +602,14 @@ READ16_MEMBER(isa16_device::mem16_swap_r)
return (rv<<8) | (rv>>8);
}
-WRITE16_MEMBER(isa16_device::mem16_swap_w)
+void isa16_device::mem16_swap_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
mem_mask = (mem_mask<<8) | (mem_mask>>8);
data = (data<<8) | (data>>8);
m_memspace->write_word(offset<<1, data, mem_mask);
}
-READ16_MEMBER(isa16_device::io16_swap_r)
+uint16_t isa16_device::io16_swap_r(offs_t offset, uint16_t mem_mask)
{
uint16_t rv;
mem_mask = (mem_mask<<8) | (mem_mask>>8);
@@ -592,7 +619,7 @@ READ16_MEMBER(isa16_device::io16_swap_r)
return (rv<<8) | (rv>>8);
}
-WRITE16_MEMBER(isa16_device::io16_swap_w)
+void isa16_device::io16_swap_w(offs_t offset, uint16_t data, uint16_t mem_mask)
{
mem_mask = (mem_mask<<8) | (mem_mask>>8);
data = (data<<8) | (data>>8);