mirror of
https://github.com/holub/mame
synced 2025-10-05 16:50:57 +03:00
memory: Build a structure with all possible delegate sizes [O. Galibert]
This commit is contained in:
parent
617ca7a08a
commit
587f1db003
100
src/emu/memory.c
100
src/emu/memory.c
@ -522,6 +522,15 @@ public:
|
||||
} handler;
|
||||
};
|
||||
|
||||
struct access_handler
|
||||
{
|
||||
// Constructors mean you can't union them
|
||||
read8_delegate r8;
|
||||
read16_delegate r16;
|
||||
read32_delegate r32;
|
||||
read64_delegate r64;
|
||||
};
|
||||
|
||||
// construction/destruction
|
||||
handler_entry_read(UINT8 width, endianness_t endianness, UINT8 **rambaseptr)
|
||||
: handler_entry(width, endianness, rambaseptr)
|
||||
@ -554,10 +563,10 @@ public:
|
||||
void set_ioport(const input_port_config &ioport);
|
||||
|
||||
// read via the underlying delegates
|
||||
UINT8 read8(address_space &space, offs_t offset, UINT8 mask) const { return m_read8(space, offset, mask); }
|
||||
UINT16 read16(address_space &space, offs_t offset, UINT16 mask) const { return m_read16(space, offset, mask); }
|
||||
UINT32 read32(address_space &space, offs_t offset, UINT32 mask) const { return m_read32(space, offset, mask); }
|
||||
UINT64 read64(address_space &space, offs_t offset, UINT64 mask) const { return m_read64(space, offset, mask); }
|
||||
UINT8 read8(address_space &space, offs_t offset, UINT8 mask) const { return m_read.r8(space, offset, mask); }
|
||||
UINT16 read16(address_space &space, offs_t offset, UINT16 mask) const { return m_read.r16(space, offset, mask); }
|
||||
UINT32 read32(address_space &space, offs_t offset, UINT32 mask) const { return m_read.r32(space, offset, mask); }
|
||||
UINT64 read64(address_space &space, offs_t offset, UINT64 mask) const { return m_read.r64(space, offset, mask); }
|
||||
|
||||
private:
|
||||
// stubs for converting between address sizes
|
||||
@ -576,10 +585,7 @@ private:
|
||||
_UintType read_stub_ioport(address_space &space, offs_t offset, _UintType mask) { return input_port_read_direct(m_ioport); }
|
||||
|
||||
// internal state
|
||||
read8_delegate m_read8;
|
||||
read16_delegate m_read16;
|
||||
read32_delegate m_read32;
|
||||
read64_delegate m_read64;
|
||||
access_handler m_read;
|
||||
const input_port_config * m_ioport;
|
||||
|
||||
legacy_info m_legacy_info;
|
||||
@ -614,6 +620,15 @@ public:
|
||||
} handler;
|
||||
};
|
||||
|
||||
struct access_handler
|
||||
{
|
||||
// Constructors mean you can't union them
|
||||
write8_delegate w8;
|
||||
write16_delegate w16;
|
||||
write32_delegate w32;
|
||||
write64_delegate w64;
|
||||
};
|
||||
|
||||
// construction/destruction
|
||||
handler_entry_write(UINT8 width, endianness_t endianness, UINT8 **rambaseptr)
|
||||
: handler_entry(width, endianness, rambaseptr)
|
||||
@ -646,10 +661,10 @@ public:
|
||||
void set_ioport(const input_port_config &ioport);
|
||||
|
||||
// write via the underlying delegates
|
||||
void write8(address_space &space, offs_t offset, UINT8 data, UINT8 mask) const { m_write8(space, offset, data, mask); }
|
||||
void write16(address_space &space, offs_t offset, UINT16 data, UINT16 mask) const { m_write16(space, offset, data, mask); }
|
||||
void write32(address_space &space, offs_t offset, UINT32 data, UINT32 mask) const { m_write32(space, offset, data, mask); }
|
||||
void write64(address_space &space, offs_t offset, UINT64 data, UINT64 mask) const { m_write64(space, offset, data, mask); }
|
||||
void write8(address_space &space, offs_t offset, UINT8 data, UINT8 mask) const { m_write.w8(space, offset, data, mask); }
|
||||
void write16(address_space &space, offs_t offset, UINT16 data, UINT16 mask) const { m_write.w16(space, offset, data, mask); }
|
||||
void write32(address_space &space, offs_t offset, UINT32 data, UINT32 mask) const { m_write.w32(space, offset, data, mask); }
|
||||
void write64(address_space &space, offs_t offset, UINT64 data, UINT64 mask) const { m_write.w64(space, offset, data, mask); }
|
||||
|
||||
private:
|
||||
// stubs for converting between address sizes
|
||||
@ -668,10 +683,7 @@ private:
|
||||
void write_stub_ioport(address_space &space, offs_t offset, _UintType data, _UintType mask) { input_port_write_direct(m_ioport, data, mask); }
|
||||
|
||||
// internal state
|
||||
write8_delegate m_write8;
|
||||
write16_delegate m_write16;
|
||||
write32_delegate m_write32;
|
||||
write64_delegate m_write64;
|
||||
access_handler m_write;
|
||||
const input_port_config * m_ioport;
|
||||
|
||||
legacy_info m_legacy_info;
|
||||
@ -4427,10 +4439,10 @@ const char *handler_entry_read::name() const
|
||||
{
|
||||
switch (m_datawidth)
|
||||
{
|
||||
case 8: return m_read8.name();
|
||||
case 16: return m_read16.name();
|
||||
case 32: return m_read32.name();
|
||||
case 64: return m_read64.name();
|
||||
case 8: return m_read.r8.name();
|
||||
case 16: return m_read.r16.name();
|
||||
case 32: return m_read.r32.name();
|
||||
case 64: return m_read.r64.name();
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
@ -4449,7 +4461,7 @@ void handler_entry_read::set_delegate(read8_delegate delegate, UINT64 mask, cons
|
||||
|
||||
// make sure this is a valid size
|
||||
assert(m_datawidth >= 8);
|
||||
m_read8 = delegate;
|
||||
m_read.r8 = delegate;
|
||||
if (info)
|
||||
m_legacy_info = *info;
|
||||
|
||||
@ -4480,7 +4492,7 @@ void handler_entry_read::set_delegate(read16_delegate delegate, UINT64 mask, con
|
||||
|
||||
// make sure this is a valid size
|
||||
assert(m_datawidth >= 16);
|
||||
m_read16 = delegate;
|
||||
m_read.r16 = delegate;
|
||||
if (info)
|
||||
m_legacy_info = *info;
|
||||
|
||||
@ -4509,7 +4521,7 @@ void handler_entry_read::set_delegate(read32_delegate delegate, UINT64 mask, con
|
||||
|
||||
// make sure this is a valid size
|
||||
assert(m_datawidth >= 32);
|
||||
m_read32 = delegate;
|
||||
m_read.r32 = delegate;
|
||||
if (info)
|
||||
m_legacy_info = *info;
|
||||
|
||||
@ -4535,7 +4547,7 @@ void handler_entry_read::set_delegate(read64_delegate delegate, UINT64 mask, con
|
||||
|
||||
// make sure this is a valid size
|
||||
assert(m_datawidth >= 64);
|
||||
m_read64 = delegate;
|
||||
m_read.r64 = delegate;
|
||||
if (info)
|
||||
m_legacy_info = *info;
|
||||
}
|
||||
@ -4649,7 +4661,7 @@ UINT16 handler_entry_read::read_stub_16(address_space &space, offs_t offset, UIN
|
||||
const subunit_info &si = m_subunit_infos[index];
|
||||
UINT32 submask = (mask >> si.m_shift) & si.m_mask;
|
||||
if (submask)
|
||||
result |= m_read8(space, offset * si.m_multiplier + si.m_offset, submask) << si.m_shift;
|
||||
result |= m_read.r8(space, offset * si.m_multiplier + si.m_offset, submask) << si.m_shift;
|
||||
}
|
||||
return result;
|
||||
}
|
||||
@ -4671,10 +4683,10 @@ UINT32 handler_entry_read::read_stub_32(address_space &space, offs_t offset, UIN
|
||||
switch (si.m_size)
|
||||
{
|
||||
case 8:
|
||||
result |= m_read8(space, offset * si.m_multiplier + si.m_offset, submask) << si.m_shift;
|
||||
result |= m_read.r8(space, offset * si.m_multiplier + si.m_offset, submask) << si.m_shift;
|
||||
break;
|
||||
case 16:
|
||||
result |= m_read16(space, offset * si.m_multiplier + si.m_offset, submask) << si.m_shift;
|
||||
result |= m_read.r16(space, offset * si.m_multiplier + si.m_offset, submask) << si.m_shift;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -4698,13 +4710,13 @@ UINT64 handler_entry_read::read_stub_64(address_space &space, offs_t offset, UIN
|
||||
switch (si.m_size)
|
||||
{
|
||||
case 8:
|
||||
result |= UINT64(m_read8(space, offset * si.m_multiplier + si.m_offset, submask)) << si.m_shift;
|
||||
result |= UINT64(m_read.r8(space, offset * si.m_multiplier + si.m_offset, submask)) << si.m_shift;
|
||||
break;
|
||||
case 16:
|
||||
result |= UINT64(m_read16(space, offset * si.m_multiplier + si.m_offset, submask)) << si.m_shift;
|
||||
result |= UINT64(m_read.r16(space, offset * si.m_multiplier + si.m_offset, submask)) << si.m_shift;
|
||||
break;
|
||||
case 32:
|
||||
result |= UINT64(m_read32(space, offset * si.m_multiplier + si.m_offset, submask)) << si.m_shift;
|
||||
result |= UINT64(m_read.r32(space, offset * si.m_multiplier + si.m_offset, submask)) << si.m_shift;
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -4752,10 +4764,10 @@ const char *handler_entry_write::name() const
|
||||
{
|
||||
switch (m_datawidth)
|
||||
{
|
||||
case 8: return m_write8.name();
|
||||
case 16: return m_write16.name();
|
||||
case 32: return m_write32.name();
|
||||
case 64: return m_write64.name();
|
||||
case 8: return m_write.w8.name();
|
||||
case 16: return m_write.w16.name();
|
||||
case 32: return m_write.w32.name();
|
||||
case 64: return m_write.w64.name();
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
@ -4769,7 +4781,7 @@ const char *handler_entry_write::name() const
|
||||
void handler_entry_write::set_delegate(write8_delegate delegate, UINT64 mask, const legacy_info *info)
|
||||
{
|
||||
assert(m_datawidth >= 8);
|
||||
m_write8 = delegate;
|
||||
m_write.w8 = delegate;
|
||||
if (info)
|
||||
m_legacy_info = *info;
|
||||
|
||||
@ -4795,7 +4807,7 @@ void handler_entry_write::set_delegate(write8_delegate delegate, UINT64 mask, co
|
||||
void handler_entry_write::set_delegate(write16_delegate delegate, UINT64 mask, const legacy_info *info)
|
||||
{
|
||||
assert(m_datawidth >= 16);
|
||||
m_write16 = delegate;
|
||||
m_write.w16 = delegate;
|
||||
if (info)
|
||||
m_legacy_info = *info;
|
||||
|
||||
@ -4819,7 +4831,7 @@ void handler_entry_write::set_delegate(write16_delegate delegate, UINT64 mask, c
|
||||
void handler_entry_write::set_delegate(write32_delegate delegate, UINT64 mask, const legacy_info *info)
|
||||
{
|
||||
assert(m_datawidth >= 32);
|
||||
m_write32 = delegate;
|
||||
m_write.w32 = delegate;
|
||||
if (info)
|
||||
m_legacy_info = *info;
|
||||
|
||||
@ -4840,7 +4852,7 @@ void handler_entry_write::set_delegate(write32_delegate delegate, UINT64 mask, c
|
||||
void handler_entry_write::set_delegate(write64_delegate delegate, UINT64 mask, const legacy_info *info)
|
||||
{
|
||||
assert(m_datawidth >= 64);
|
||||
m_write64 = delegate;
|
||||
m_write.w64 = delegate;
|
||||
if (info)
|
||||
m_legacy_info = *info;
|
||||
}
|
||||
@ -4953,7 +4965,7 @@ void handler_entry_write::write_stub_16(address_space &space, offs_t offset, UIN
|
||||
const subunit_info &si = m_subunit_infos[index];
|
||||
UINT32 submask = (mask >> si.m_shift) & si.m_mask;
|
||||
if (submask)
|
||||
m_write8(space, offset * si.m_multiplier + si.m_offset, data >> si.m_shift, submask);
|
||||
m_write.w8(space, offset * si.m_multiplier + si.m_offset, data >> si.m_shift, submask);
|
||||
}
|
||||
}
|
||||
|
||||
@ -4973,10 +4985,10 @@ void handler_entry_write::write_stub_32(address_space &space, offs_t offset, UIN
|
||||
switch (si.m_size)
|
||||
{
|
||||
case 8:
|
||||
m_write8(space, offset * si.m_multiplier + si.m_offset, data >> si.m_shift, submask);
|
||||
m_write.w8(space, offset * si.m_multiplier + si.m_offset, data >> si.m_shift, submask);
|
||||
break;
|
||||
case 16:
|
||||
m_write16(space, offset * si.m_multiplier + si.m_offset, data >> si.m_shift, submask);
|
||||
m_write.w16(space, offset * si.m_multiplier + si.m_offset, data >> si.m_shift, submask);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -4998,13 +5010,13 @@ void handler_entry_write::write_stub_64(address_space &space, offs_t offset, UIN
|
||||
switch (si.m_size)
|
||||
{
|
||||
case 8:
|
||||
m_write8(space, offset * si.m_multiplier + si.m_offset, data >> si.m_shift, submask);
|
||||
m_write.w8(space, offset * si.m_multiplier + si.m_offset, data >> si.m_shift, submask);
|
||||
break;
|
||||
case 16:
|
||||
m_write16(space, offset * si.m_multiplier + si.m_offset, data >> si.m_shift, submask);
|
||||
m_write.w16(space, offset * si.m_multiplier + si.m_offset, data >> si.m_shift, submask);
|
||||
break;
|
||||
case 32:
|
||||
m_write32(space, offset * si.m_multiplier + si.m_offset, data >> si.m_shift, submask);
|
||||
m_write.w32(space, offset * si.m_multiplier + si.m_offset, data >> si.m_shift, submask);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user