Merge memarray improvements from palette branch into trunk (nw)

This commit is contained in:
Alex W. Jackson 2014-02-22 11:01:31 +00:00
parent 887d09c71d
commit 91108d0b60
2 changed files with 45 additions and 33 deletions

View File

@ -25,8 +25,8 @@ memory_array::memory_array()
m_membits(0),
m_endianness(ENDIANNESS_LITTLE),
m_bytes_per_entry(0),
m_reader(NULL),
m_writer(NULL)
m_read_entry(NULL),
m_write_entry(NULL)
{
}
@ -53,32 +53,32 @@ void memory_array::set(void *base, UINT32 bytes, int membits, endianness_t endia
// derive data
switch (bpe*1000 + membits*10 + endianness)
{
case 1*1000 + 8*10 + ENDIANNESS_LITTLE: m_reader = &memory_array::read8_from_8; m_writer = &memory_array::write8_to_8; break;
case 1*1000 + 8*10 + ENDIANNESS_BIG: m_reader = &memory_array::read8_from_8; m_writer = &memory_array::write8_to_8; break;
case 1*1000 + 16*10 + ENDIANNESS_LITTLE: m_reader = &memory_array::read8_from_16le; m_writer = &memory_array::write8_to_16le; break;
case 1*1000 + 16*10 + ENDIANNESS_BIG: m_reader = &memory_array::read8_from_16be; m_writer = &memory_array::write8_to_16be; break;
case 1*1000 + 32*10 + ENDIANNESS_LITTLE: m_reader = &memory_array::read8_from_32le; m_writer = &memory_array::write8_to_32le; break;
case 1*1000 + 32*10 + ENDIANNESS_BIG: m_reader = &memory_array::read8_from_32be; m_writer = &memory_array::write8_to_32be; break;
case 1*1000 + 64*10 + ENDIANNESS_LITTLE: m_reader = &memory_array::read8_from_64le; m_writer = &memory_array::write8_to_64le; break;
case 1*1000 + 64*10 + ENDIANNESS_BIG: m_reader = &memory_array::read8_from_64be; m_writer = &memory_array::write8_to_64be; break;
case 1*1000 + 8*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read8_from_8; m_write_entry = &memory_array::write8_to_8; break;
case 1*1000 + 8*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read8_from_8; m_write_entry = &memory_array::write8_to_8; break;
case 1*1000 + 16*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read8_from_16le; m_write_entry = &memory_array::write8_to_16le; break;
case 1*1000 + 16*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read8_from_16be; m_write_entry = &memory_array::write8_to_16be; break;
case 1*1000 + 32*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read8_from_32le; m_write_entry = &memory_array::write8_to_32le; break;
case 1*1000 + 32*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read8_from_32be; m_write_entry = &memory_array::write8_to_32be; break;
case 1*1000 + 64*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read8_from_64le; m_write_entry = &memory_array::write8_to_64le; break;
case 1*1000 + 64*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read8_from_64be; m_write_entry = &memory_array::write8_to_64be; break;
case 2*1000 + 8*10 + ENDIANNESS_LITTLE: m_reader = &memory_array::read16_from_8le; m_writer = &memory_array::write16_to_8le; break;
case 2*1000 + 8*10 + ENDIANNESS_BIG: m_reader = &memory_array::read16_from_8be; m_writer = &memory_array::write16_to_8be; break;
case 2*1000 + 16*10 + ENDIANNESS_LITTLE: m_reader = &memory_array::read16_from_16; m_writer = &memory_array::write16_to_16; break;
case 2*1000 + 16*10 + ENDIANNESS_BIG: m_reader = &memory_array::read16_from_16; m_writer = &memory_array::write16_to_16; break;
case 2*1000 + 32*10 + ENDIANNESS_LITTLE: m_reader = &memory_array::read16_from_32le; m_writer = &memory_array::write16_to_32le; break;
case 2*1000 + 32*10 + ENDIANNESS_BIG: m_reader = &memory_array::read16_from_32be; m_writer = &memory_array::write16_to_32be; break;
case 2*1000 + 64*10 + ENDIANNESS_LITTLE: m_reader = &memory_array::read16_from_64le; m_writer = &memory_array::write16_to_64le; break;
case 2*1000 + 64*10 + ENDIANNESS_BIG: m_reader = &memory_array::read16_from_64be; m_writer = &memory_array::write16_to_64be; break;
case 2*1000 + 8*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read16_from_8le; m_write_entry = &memory_array::write16_to_8le; break;
case 2*1000 + 8*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read16_from_8be; m_write_entry = &memory_array::write16_to_8be; break;
case 2*1000 + 16*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read16_from_16; m_write_entry = &memory_array::write16_to_16; break;
case 2*1000 + 16*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read16_from_16; m_write_entry = &memory_array::write16_to_16; break;
case 2*1000 + 32*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read16_from_32le; m_write_entry = &memory_array::write16_to_32le; break;
case 2*1000 + 32*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read16_from_32be; m_write_entry = &memory_array::write16_to_32be; break;
case 2*1000 + 64*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read16_from_64le; m_write_entry = &memory_array::write16_to_64le; break;
case 2*1000 + 64*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read16_from_64be; m_write_entry = &memory_array::write16_to_64be; break;
case 4*1000 + 8*10 + ENDIANNESS_LITTLE: m_reader = &memory_array::read32_from_8le; m_writer = &memory_array::write32_to_8le; break;
case 4*1000 + 8*10 + ENDIANNESS_BIG: m_reader = &memory_array::read32_from_8be; m_writer = &memory_array::write32_to_8be; break;
case 4*1000 + 16*10 + ENDIANNESS_LITTLE: m_reader = &memory_array::read32_from_16le; m_writer = &memory_array::write32_to_16le; break;
case 4*1000 + 16*10 + ENDIANNESS_BIG: m_reader = &memory_array::read32_from_16be; m_writer = &memory_array::write32_to_16be; break;
case 4*1000 + 32*10 + ENDIANNESS_LITTLE: m_reader = &memory_array::read32_from_32; m_writer = &memory_array::write32_to_32; break;
case 4*1000 + 32*10 + ENDIANNESS_BIG: m_reader = &memory_array::read32_from_32; m_writer = &memory_array::write32_to_32; break;
case 4*1000 + 64*10 + ENDIANNESS_LITTLE: m_reader = &memory_array::read32_from_64le; m_writer = &memory_array::write32_to_64le; break;
case 4*1000 + 64*10 + ENDIANNESS_BIG: m_reader = &memory_array::read32_from_64be; m_writer = &memory_array::write32_to_64be; break;
case 4*1000 + 8*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read32_from_8le; m_write_entry = &memory_array::write32_to_8le; break;
case 4*1000 + 8*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read32_from_8be; m_write_entry = &memory_array::write32_to_8be; break;
case 4*1000 + 16*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read32_from_16le; m_write_entry = &memory_array::write32_to_16le; break;
case 4*1000 + 16*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read32_from_16be; m_write_entry = &memory_array::write32_to_16be; break;
case 4*1000 + 32*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read32_from_32; m_write_entry = &memory_array::write32_to_32; break;
case 4*1000 + 32*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read32_from_32; m_write_entry = &memory_array::write32_to_32; break;
case 4*1000 + 64*10 + ENDIANNESS_LITTLE: m_read_entry = &memory_array::read32_from_64le; m_write_entry = &memory_array::write32_to_64le; break;
case 4*1000 + 64*10 + ENDIANNESS_BIG: m_read_entry = &memory_array::read32_from_64be; m_write_entry = &memory_array::write32_to_64be; break;
default: throw emu_fatalerror("Illegal memory bits/bus width combo in memory_array");
}

View File

@ -45,15 +45,17 @@ public:
// construction/destruction
memory_array();
memory_array(void *base, UINT32 bytes, int membits, endianness_t endianness, int bpe) { set(base, bytes, membits, endianness, bpe); }
template <typename _Type> memory_array(dynamic_array<_Type> &array, endianness_t endianness, int bpe) { set(array, endianness, bpe); }
memory_array(const address_space &space, void *base, UINT32 bytes, int bpe) { set(space, base, bytes, bpe); }
memory_array(const memory_share &share, int bpe) { set(share, bpe); }
memory_array(const memory_array &helper) { set(helper); }
memory_array(const memory_array &array) { set(array); }
// configuration
void set(void *base, UINT32 bytes, int membits, endianness_t endianness, int bpe);
template <typename _Type> void set(dynamic_array<_Type> &array, endianness_t endianness, int bpe) { set(&array[0], array.count(), 8*sizeof(_Type), endianness, bpe); }
void set(const address_space &space, void *base, UINT32 bytes, int bpe);
void set(const memory_share &share, int bpe);
void set(const memory_array &helper);
void set(const memory_array &array);
// getters
void *base() const { return m_base; }
@ -62,9 +64,19 @@ public:
endianness_t endianness() const { return m_endianness; }
int bytes_per_entry() const { return m_bytes_per_entry; }
// readers and writers
UINT32 read(int index) { return (this->*m_reader)(index); }
void write(int index, UINT32 data) { (this->*m_writer)(index, data); }
// entry-level readers and writers
UINT32 read(int index) { return (this->*m_read_entry)(index); }
void write(int index, UINT32 data) { (this->*m_write_entry)(index, data); }
// byte/word/dword-level readers and writers
UINT8 read8(offs_t offset) { return reinterpret_cast<UINT8 *>(m_base)[offset]; }
UINT16 read16(offs_t offset) { return reinterpret_cast<UINT16 *>(m_base)[offset]; }
UINT32 read32(offs_t offset) { return reinterpret_cast<UINT32 *>(m_base)[offset]; }
UINT64 read64(offs_t offset) { return reinterpret_cast<UINT64 *>(m_base)[offset]; }
void write8(offs_t offset, UINT8 data) { reinterpret_cast<UINT8 *>(m_base)[offset] = data; }
void write16(offs_t offset, UINT16 data) { reinterpret_cast<UINT16 *>(m_base)[offset] = data; }
void write32(offs_t offset, UINT32 data) { reinterpret_cast<UINT32 *>(m_base)[offset] = data; }
void write64(offs_t offset, UINT64 data) { reinterpret_cast<UINT64 *>(m_base)[offset] = data; }
private:
// internal read/write helpers for 1 byte entries
@ -100,8 +112,8 @@ private:
int m_membits;
endianness_t m_endianness;
int m_bytes_per_entry;
UINT32 (memory_array::*m_reader)(int);
void (memory_array::*m_writer)(int, UINT32);
UINT32 (memory_array::*m_read_entry)(int);
void (memory_array::*m_write_entry)(int, UINT32);
};