diff options
Diffstat (limited to 'src/emu/emumem_heu.cpp')
-rw-r--r-- | src/emu/emumem_heu.cpp | 320 |
1 files changed, 224 insertions, 96 deletions
diff --git a/src/emu/emumem_heu.cpp b/src/emu/emumem_heu.cpp index 8a62d8aa5e2..ada5d56d63a 100644 --- a/src/emu/emumem_heu.cpp +++ b/src/emu/emumem_heu.cpp @@ -7,8 +7,8 @@ #include "emumem_heu.h" -template<int Width, int AddrShift, int Endian> handler_entry_read_units<Width, AddrShift, Endian>::handler_entry_read_units(const memory_units_descriptor<Width, AddrShift, Endian> &descriptor, u8 ukey, address_space *space) : - handler_entry_read<Width, AddrShift, Endian>(space, inh::F_UNITS), +template<int Width, int AddrShift> handler_entry_read_units<Width, AddrShift>::handler_entry_read_units(const memory_units_descriptor<Width, AddrShift> &descriptor, u8 ukey, address_space *space) : + handler_entry_read<Width, AddrShift>(space, handler_entry_read_units::F_UNITS), m_subunits(0) { const auto &entries = descriptor.get_entries_for_key(ukey); @@ -16,8 +16,8 @@ template<int Width, int AddrShift, int Endian> handler_entry_read_units<Width, A std::sort(m_subunit_infos, m_subunit_infos + m_subunits, [](const subunit_info &a, const subunit_info &b) { return a.m_offset < b.m_offset; }); } -template<int Width, int AddrShift, int Endian> handler_entry_read_units<Width, AddrShift, Endian>::handler_entry_read_units(const memory_units_descriptor<Width, AddrShift, Endian> &descriptor, u8 ukey, const handler_entry_read_units *src) : - handler_entry_read<Width, AddrShift, Endian>(src->m_space, inh::F_UNITS), +template<int Width, int AddrShift> handler_entry_read_units<Width, AddrShift>::handler_entry_read_units(const memory_units_descriptor<Width, AddrShift> &descriptor, u8 ukey, const handler_entry_read_units *src) : + handler_entry_read<Width, AddrShift>(src->m_space, handler_entry_read_units::F_UNITS), m_subunits(0) { uX fullmask = 0; @@ -36,32 +36,49 @@ template<int Width, int AddrShift, int Endian> handler_entry_read_units<Width, A std::sort(m_subunit_infos, m_subunit_infos + m_subunits, [](const subunit_info &a, const subunit_info &b) { return a.m_offset < b.m_offset; }); } -template<int Width, int AddrShift, int Endian> handler_entry_read_units<Width, AddrShift, Endian>::~handler_entry_read_units() +template<int Width, int AddrShift> handler_entry_read_units<Width, AddrShift>::handler_entry_read_units(const handler_entry_read_units *src) : + handler_entry_read<Width, AddrShift>(src->m_space, handler_entry_read_units::F_UNITS), + m_subunits(src->m_subunits) +{ + for(u32 i=0; i != src->m_subunits; i++) { + m_subunit_infos[i] = src->m_subunit_infos[i]; + m_subunit_infos[i].m_handler = static_cast<handler_entry_write<Width, AddrShift> *>(m_subunit_infos[i].m_handler)->dup(); + } +} + +template<int Width, int AddrShift> handler_entry_read_units<Width, AddrShift>::~handler_entry_read_units() { for(u32 i=0; i != m_subunits; i++) m_subunit_infos[i].m_handler->unref(); } -template<int Width, int AddrShift, int Endian> void handler_entry_read_units<Width, AddrShift, Endian>::enumerate_references(handler_entry::reflist &refs) const +template<int Width, int AddrShift> handler_entry_read<Width, AddrShift> *handler_entry_read_units<Width, AddrShift>::dup() +{ + return new handler_entry_read_units<Width, AddrShift>(this); +} + +template<int Width, int AddrShift> void handler_entry_read_units<Width, AddrShift>::enumerate_references(handler_entry::reflist &refs) const { for(u32 i=0; i != m_subunits; i++) refs.add(m_subunit_infos[i].m_handler); } -template<int Width, int AddrShift, int Endian> void handler_entry_read_units<Width, AddrShift, Endian>::fill(const memory_units_descriptor<Width, AddrShift, Endian> &descriptor, const std::vector<typename memory_units_descriptor<Width, AddrShift, Endian>::entry> &entries) +template<int Width, int AddrShift> void handler_entry_read_units<Width, AddrShift>::fill(const memory_units_descriptor<Width, AddrShift> &descriptor, const std::vector<typename memory_units_descriptor<Width, AddrShift>::entry> &entries) { handler_entry *handler = descriptor.get_subunit_handler(); handler->ref(entries.size()); for(const auto &e : entries) - m_subunit_infos[m_subunits++] = subunit_info{ handler, e.m_amask, e.m_dmask, e.m_ashift, e.m_offset, e.m_dshift, descriptor.get_subunit_width(), descriptor.get_subunit_endian() }; - m_unmap = inh::m_space->unmap(); + m_subunit_infos[m_subunits++] = subunit_info{ handler, e.m_amask, e.m_dmask, e.m_ashift, e.m_offset, e.m_dshift, descriptor.get_subunit_width() }; + m_unmap = this->m_space->unmap(); for(int i = 0; i < m_subunits; i++) m_unmap &= ~m_subunit_infos[i].m_dmask; } -template<int Width, int AddrShift, int Endian> typename emu::detail::handler_entry_size<Width>::uX handler_entry_read_units<Width, AddrShift, Endian>::read(offs_t offset, uX mem_mask) +template<int Width, int AddrShift> emu::detail::handler_entry_size_t<Width> handler_entry_read_units<Width, AddrShift>::read(offs_t offset, uX mem_mask) const { + this->ref(); + uX result = m_unmap; for (int index = 0; index < m_subunits; index++) { const subunit_info &si = m_subunit_infos[index]; @@ -69,32 +86,92 @@ template<int Width, int AddrShift, int Endian> typename emu::detail::handler_ent offs_t aoffset = (si.m_ashift >= 0 ? offset >> si.m_ashift : offset << si.m_ashift) + si.m_offset; switch(si.m_width) { case 0: - if(si.m_endian == ENDIANNESS_LITTLE) - result |= uX(static_cast<handler_entry_read<0, 0, ENDIANNESS_LITTLE> *>(si.m_handler)->read(aoffset, mem_mask >> si.m_dshift)) << si.m_dshift; - else - result |= uX(static_cast<handler_entry_read<0, 0, ENDIANNESS_BIG > *>(si.m_handler)->read(aoffset, mem_mask >> si.m_dshift)) << si.m_dshift; + result |= uX(static_cast<handler_entry_read<0, 0> *>(si.m_handler)->read(aoffset, mem_mask >> si.m_dshift)) << si.m_dshift; break; case 1: - if(si.m_endian == ENDIANNESS_LITTLE) - result |= uX(static_cast<handler_entry_read<1, -1, ENDIANNESS_LITTLE> *>(si.m_handler)->read(aoffset, mem_mask >> si.m_dshift)) << si.m_dshift; - else - result |= uX(static_cast<handler_entry_read<1, -1, ENDIANNESS_BIG > *>(si.m_handler)->read(aoffset, mem_mask >> si.m_dshift)) << si.m_dshift; + result |= uX(static_cast<handler_entry_read<1, -1> *>(si.m_handler)->read(aoffset, mem_mask >> si.m_dshift)) << si.m_dshift; break; case 2: - if(si.m_endian == ENDIANNESS_LITTLE) - result |= uX(static_cast<handler_entry_read<2, -2, ENDIANNESS_LITTLE> *>(si.m_handler)->read(aoffset, mem_mask >> si.m_dshift)) << si.m_dshift; - else - result |= uX(static_cast<handler_entry_read<2, -2, ENDIANNESS_BIG > *>(si.m_handler)->read(aoffset, mem_mask >> si.m_dshift)) << si.m_dshift; + result |= uX(static_cast<handler_entry_read<2, -2> *>(si.m_handler)->read(aoffset, mem_mask >> si.m_dshift)) << si.m_dshift; break; default: abort(); } } } + + this->unref(); return result; } -template<int Width, int AddrShift, int Endian> std::string handler_entry_read_units<Width, AddrShift, Endian>::m2r(typename emu::detail::handler_entry_size<Width>::uX mask) +template<int Width, int AddrShift> emu::detail::handler_entry_size_t<Width> handler_entry_read_units<Width, AddrShift>::read_interruptible(offs_t offset, uX mem_mask) const +{ + return read(offset, mem_mask); +} + +template<int Width, int AddrShift> std::pair<emu::detail::handler_entry_size_t<Width>, u16> handler_entry_read_units<Width, AddrShift>::read_flags(offs_t offset, uX mem_mask) const +{ + this->ref(); + + uX result = m_unmap; + u16 flags = 0; + for (int index = 0; index < m_subunits; index++) { + const subunit_info &si = m_subunit_infos[index]; + if (mem_mask & si.m_amask) { + offs_t aoffset = (si.m_ashift >= 0 ? offset >> si.m_ashift : offset << si.m_ashift) + si.m_offset; + std::pair<uX, u16> pack; + switch(si.m_width) { + case 0: + pack = static_cast<handler_entry_read<0, 0> *>(si.m_handler)->read_flags(aoffset, mem_mask >> si.m_dshift); + break; + case 1: + pack = static_cast<handler_entry_read<1, -1> *>(si.m_handler)->read_flags(aoffset, mem_mask >> si.m_dshift); + break; + case 2: + pack = static_cast<handler_entry_read<2, -2> *>(si.m_handler)->read_flags(aoffset, mem_mask >> si.m_dshift); + break; + default: + abort(); + } + result |= uX(pack.first) << si.m_dshift; + flags |= pack.second; + } + } + + this->unref(); + return std::make_pair(result, flags); +} + +template<int Width, int AddrShift> u16 handler_entry_read_units<Width, AddrShift>::lookup_flags(offs_t offset, uX mem_mask) const +{ + this->ref(); + + u16 flags = 0; + for (int index = 0; index < m_subunits; index++) { + const subunit_info &si = m_subunit_infos[index]; + if (mem_mask & si.m_amask) { + offs_t aoffset = (si.m_ashift >= 0 ? offset >> si.m_ashift : offset << si.m_ashift) + si.m_offset; + switch(si.m_width) { + case 0: + flags |= static_cast<handler_entry_read<0, 0> *>(si.m_handler)->lookup_flags(aoffset, mem_mask >> si.m_dshift); + break; + case 1: + flags |= static_cast<handler_entry_read<1, -1> *>(si.m_handler)->lookup_flags(aoffset, mem_mask >> si.m_dshift); + break; + case 2: + flags |= static_cast<handler_entry_read<2, -2> *>(si.m_handler)->lookup_flags(aoffset, mem_mask >> si.m_dshift); + break; + default: + abort(); + } + } + } + + this->unref(); + return flags; +} + +template<int Width, int AddrShift> std::string handler_entry_read_units<Width, AddrShift>::m2r(emu::detail::handler_entry_size_t<Width> mask) { constexpr u32 mbits = 8*sizeof(uX); u32 start, end; @@ -105,7 +182,7 @@ template<int Width, int AddrShift, int Endian> std::string handler_entry_read_un return util::string_format("%d-%d", end, start); } -template<int Width, int AddrShift, int Endian> std::string handler_entry_read_units<Width, AddrShift, Endian>::name() const +template<int Width, int AddrShift> std::string handler_entry_read_units<Width, AddrShift>::name() const { std::string result; @@ -122,8 +199,8 @@ template<int Width, int AddrShift, int Endian> std::string handler_entry_read_un -template<int Width, int AddrShift, int Endian> handler_entry_write_units<Width, AddrShift, Endian>::handler_entry_write_units(const memory_units_descriptor<Width, AddrShift, Endian> &descriptor, u8 ukey, address_space *space) : - handler_entry_write<Width, AddrShift, Endian>(space, inh::F_UNITS), +template<int Width, int AddrShift> handler_entry_write_units<Width, AddrShift>::handler_entry_write_units(const memory_units_descriptor<Width, AddrShift> &descriptor, u8 ukey, address_space *space) : + handler_entry_write<Width, AddrShift>(space, handler_entry_write_units::F_UNITS), m_subunits(0) { const auto &entries = descriptor.get_entries_for_key(ukey); @@ -131,8 +208,8 @@ template<int Width, int AddrShift, int Endian> handler_entry_write_units<Width, std::sort(m_subunit_infos, m_subunit_infos + m_subunits, [](const subunit_info &a, const subunit_info &b) { return a.m_offset < b.m_offset; }); } -template<int Width, int AddrShift, int Endian> handler_entry_write_units<Width, AddrShift, Endian>::handler_entry_write_units(const memory_units_descriptor<Width, AddrShift, Endian> &descriptor, u8 ukey, const handler_entry_write_units<Width, AddrShift, Endian> *src) : - handler_entry_write<Width, AddrShift, Endian>(src->m_space, inh::F_UNITS), +template<int Width, int AddrShift> handler_entry_write_units<Width, AddrShift>::handler_entry_write_units(const memory_units_descriptor<Width, AddrShift> &descriptor, u8 ukey, const handler_entry_write_units<Width, AddrShift> *src) : + handler_entry_write<Width, AddrShift>(src->m_space, handler_entry_write_units::F_UNITS), m_subunits(0) { uX fullmask = 0; @@ -151,60 +228,133 @@ template<int Width, int AddrShift, int Endian> handler_entry_write_units<Width, std::sort(m_subunit_infos, m_subunit_infos + m_subunits, [](const subunit_info &a, const subunit_info &b) { return a.m_offset < b.m_offset; }); } -template<int Width, int AddrShift, int Endian> handler_entry_write_units<Width, AddrShift, Endian>::~handler_entry_write_units() +template<int Width, int AddrShift> handler_entry_write_units<Width, AddrShift>::handler_entry_write_units(const handler_entry_write_units *src) : + handler_entry_write<Width, AddrShift>(src->m_space, handler_entry_write_units::F_UNITS), + m_subunits(src->m_subunits) +{ + for(u32 i=0; i != src->m_subunits; i++) { + m_subunit_infos[i] = src->m_subunit_infos[i]; + m_subunit_infos[i].m_handler = static_cast<handler_entry_write<Width, AddrShift> *>(m_subunit_infos[i].m_handler)->dup(); + } +} + +template<int Width, int AddrShift> handler_entry_write_units<Width, AddrShift>::~handler_entry_write_units() { for(u32 i=0; i != m_subunits; i++) m_subunit_infos[i].m_handler->unref(); } -template<int Width, int AddrShift, int Endian> void handler_entry_write_units<Width, AddrShift, Endian>::enumerate_references(handler_entry::reflist &refs) const +template<int Width, int AddrShift> handler_entry_write<Width, AddrShift> *handler_entry_write_units<Width, AddrShift>::dup() +{ + return new handler_entry_write_units<Width, AddrShift>(this); +} + +template<int Width, int AddrShift> void handler_entry_write_units<Width, AddrShift>::enumerate_references(handler_entry::reflist &refs) const { for(u32 i=0; i != m_subunits; i++) refs.add(m_subunit_infos[i].m_handler); } -template<int Width, int AddrShift, int Endian> void handler_entry_write_units<Width, AddrShift, Endian>::fill(const memory_units_descriptor<Width, AddrShift, Endian> &descriptor, const std::vector<typename memory_units_descriptor<Width, AddrShift, Endian>::entry> &entries) +template<int Width, int AddrShift> void handler_entry_write_units<Width, AddrShift>::fill(const memory_units_descriptor<Width, AddrShift> &descriptor, const std::vector<typename memory_units_descriptor<Width, AddrShift>::entry> &entries) { handler_entry *handler = descriptor.get_subunit_handler(); handler->ref(entries.size()); for(const auto &e : entries) - m_subunit_infos[m_subunits++] = subunit_info{ handler, e.m_amask, e.m_dmask, e.m_ashift, e.m_offset, e.m_dshift, descriptor.get_subunit_width(), descriptor.get_subunit_endian() }; + m_subunit_infos[m_subunits++] = subunit_info{ handler, e.m_amask, e.m_dmask, e.m_ashift, e.m_offset, e.m_dshift, descriptor.get_subunit_width() }; +} + +template<int Width, int AddrShift> void handler_entry_write_units<Width, AddrShift>::write(offs_t offset, uX data, uX mem_mask) const +{ + this->ref(); + + for (int index = 0; index < m_subunits; index++) { + const subunit_info &si = m_subunit_infos[index]; + if (mem_mask & si.m_amask) { + offs_t aoffset = (si.m_ashift >= 0 ? offset >> si.m_ashift : offset << si.m_ashift) + si.m_offset; + switch(si.m_width) { + case 0: + static_cast<handler_entry_write<0, 0> *>(si.m_handler)->write(aoffset, data >> si.m_dshift, mem_mask >> si.m_dshift); + break; + case 1: + static_cast<handler_entry_write<1, -1> *>(si.m_handler)->write(aoffset, data >> si.m_dshift, mem_mask >> si.m_dshift); + break; + case 2: + static_cast<handler_entry_write<2, -2> *>(si.m_handler)->write(aoffset, data >> si.m_dshift, mem_mask >> si.m_dshift); + break; + default: + abort(); + } + } + } + + this->unref(); +} + +template<int Width, int AddrShift> void handler_entry_write_units<Width, AddrShift>::write_interruptible(offs_t offset, uX data, uX mem_mask) const +{ + write(offset, data, mem_mask); } -template<int Width, int AddrShift, int Endian> void handler_entry_write_units<Width, AddrShift, Endian>::write(offs_t offset, uX data, uX mem_mask) +template<int Width, int AddrShift> u16 handler_entry_write_units<Width, AddrShift>::write_flags(offs_t offset, uX data, uX mem_mask) const { + this->ref(); + + u16 flags = 0; for (int index = 0; index < m_subunits; index++) { const subunit_info &si = m_subunit_infos[index]; if (mem_mask & si.m_amask) { offs_t aoffset = (si.m_ashift >= 0 ? offset >> si.m_ashift : offset << si.m_ashift) + si.m_offset; switch(si.m_width) { case 0: - if(si.m_endian == ENDIANNESS_LITTLE) - static_cast<handler_entry_write<0, 0, ENDIANNESS_LITTLE> *>(si.m_handler)->write(aoffset, data >> si.m_dshift, mem_mask >> si.m_dshift); - else - static_cast<handler_entry_write<0, 0, ENDIANNESS_BIG > *>(si.m_handler)->write(aoffset, data >> si.m_dshift, mem_mask >> si.m_dshift); + flags |= static_cast<handler_entry_write<0, 0> *>(si.m_handler)->write_flags(aoffset, data >> si.m_dshift, mem_mask >> si.m_dshift); break; case 1: - if(si.m_endian == ENDIANNESS_LITTLE) - static_cast<handler_entry_write<1, -1, ENDIANNESS_LITTLE> *>(si.m_handler)->write(aoffset, data >> si.m_dshift, mem_mask >> si.m_dshift); - else - static_cast<handler_entry_write<1, -1, ENDIANNESS_BIG > *>(si.m_handler)->write(aoffset, data >> si.m_dshift, mem_mask >> si.m_dshift); + flags |= static_cast<handler_entry_write<1, -1> *>(si.m_handler)->write_flags(aoffset, data >> si.m_dshift, mem_mask >> si.m_dshift); break; case 2: - if(si.m_endian == ENDIANNESS_LITTLE) - static_cast<handler_entry_write<2, -2, ENDIANNESS_LITTLE> *>(si.m_handler)->write(aoffset, data >> si.m_dshift, mem_mask >> si.m_dshift); - else - static_cast<handler_entry_write<2, -2, ENDIANNESS_BIG > *>(si.m_handler)->write(aoffset, data >> si.m_dshift, mem_mask >> si.m_dshift); + flags |= static_cast<handler_entry_write<2, -2> *>(si.m_handler)->write_flags(aoffset, data >> si.m_dshift, mem_mask >> si.m_dshift); break; default: abort(); } } } + + this->unref(); + return flags; +} + +template<int Width, int AddrShift> u16 handler_entry_write_units<Width, AddrShift>::lookup_flags(offs_t offset, uX mem_mask) const +{ + this->ref(); + + u16 flags = 0; + for (int index = 0; index < m_subunits; index++) { + const subunit_info &si = m_subunit_infos[index]; + if (mem_mask & si.m_amask) { + offs_t aoffset = (si.m_ashift >= 0 ? offset >> si.m_ashift : offset << si.m_ashift) + si.m_offset; + switch(si.m_width) { + case 0: + flags |= static_cast<handler_entry_write<0, 0> *>(si.m_handler)->lookup_flags(aoffset, mem_mask >> si.m_dshift); + break; + case 1: + flags |= static_cast<handler_entry_write<1, -1> *>(si.m_handler)->lookup_flags(aoffset, mem_mask >> si.m_dshift); + break; + case 2: + flags |= static_cast<handler_entry_write<2, -2> *>(si.m_handler)->lookup_flags(aoffset, mem_mask >> si.m_dshift); + break; + default: + abort(); + } + } + } + + this->unref(); + return flags; } -template<int Width, int AddrShift, int Endian> std::string handler_entry_write_units<Width, AddrShift, Endian>::m2r(typename emu::detail::handler_entry_size<Width>::uX mask) +template<int Width, int AddrShift> std::string handler_entry_write_units<Width, AddrShift>::m2r(emu::detail::handler_entry_size_t<Width> mask) { constexpr u32 mbits = 8*sizeof(uX); u32 start, end; @@ -215,7 +365,7 @@ template<int Width, int AddrShift, int Endian> std::string handler_entry_write_u return util::string_format("%d-%d", end, start); } -template<int Width, int AddrShift, int Endian> std::string handler_entry_write_units<Width, AddrShift, Endian>::name() const +template<int Width, int AddrShift> std::string handler_entry_write_units<Width, AddrShift>::name() const { std::string result; @@ -230,52 +380,30 @@ template<int Width, int AddrShift, int Endian> std::string handler_entry_write_u } -template class handler_entry_read_units<0, 1, ENDIANNESS_LITTLE>; -template class handler_entry_read_units<0, 1, ENDIANNESS_BIG>; -template class handler_entry_read_units<0, 0, ENDIANNESS_LITTLE>; -template class handler_entry_read_units<0, 0, ENDIANNESS_BIG>; -template class handler_entry_read_units<1, 3, ENDIANNESS_LITTLE>; -template class handler_entry_read_units<1, 3, ENDIANNESS_BIG>; -template class handler_entry_read_units<1, 0, ENDIANNESS_LITTLE>; -template class handler_entry_read_units<1, 0, ENDIANNESS_BIG>; -template class handler_entry_read_units<1, -1, ENDIANNESS_LITTLE>; -template class handler_entry_read_units<1, -1, ENDIANNESS_BIG>; -template class handler_entry_read_units<2, 0, ENDIANNESS_LITTLE>; -template class handler_entry_read_units<2, 0, ENDIANNESS_BIG>; -template class handler_entry_read_units<2, -1, ENDIANNESS_LITTLE>; -template class handler_entry_read_units<2, -1, ENDIANNESS_BIG>; -template class handler_entry_read_units<2, -2, ENDIANNESS_LITTLE>; -template class handler_entry_read_units<2, -2, ENDIANNESS_BIG>; -template class handler_entry_read_units<3, 0, ENDIANNESS_LITTLE>; -template class handler_entry_read_units<3, 0, ENDIANNESS_BIG>; -template class handler_entry_read_units<3, -1, ENDIANNESS_LITTLE>; -template class handler_entry_read_units<3, -1, ENDIANNESS_BIG>; -template class handler_entry_read_units<3, -2, ENDIANNESS_LITTLE>; -template class handler_entry_read_units<3, -2, ENDIANNESS_BIG>; -template class handler_entry_read_units<3, -3, ENDIANNESS_LITTLE>; -template class handler_entry_read_units<3, -3, ENDIANNESS_BIG>; - -template class handler_entry_write_units<0, 1, ENDIANNESS_LITTLE>; -template class handler_entry_write_units<0, 1, ENDIANNESS_BIG>; -template class handler_entry_write_units<0, 0, ENDIANNESS_LITTLE>; -template class handler_entry_write_units<0, 0, ENDIANNESS_BIG>; -template class handler_entry_write_units<1, 3, ENDIANNESS_LITTLE>; -template class handler_entry_write_units<1, 3, ENDIANNESS_BIG>; -template class handler_entry_write_units<1, 0, ENDIANNESS_LITTLE>; -template class handler_entry_write_units<1, 0, ENDIANNESS_BIG>; -template class handler_entry_write_units<1, -1, ENDIANNESS_LITTLE>; -template class handler_entry_write_units<1, -1, ENDIANNESS_BIG>; -template class handler_entry_write_units<2, 0, ENDIANNESS_LITTLE>; -template class handler_entry_write_units<2, 0, ENDIANNESS_BIG>; -template class handler_entry_write_units<2, -1, ENDIANNESS_LITTLE>; -template class handler_entry_write_units<2, -1, ENDIANNESS_BIG>; -template class handler_entry_write_units<2, -2, ENDIANNESS_LITTLE>; -template class handler_entry_write_units<2, -2, ENDIANNESS_BIG>; -template class handler_entry_write_units<3, 0, ENDIANNESS_LITTLE>; -template class handler_entry_write_units<3, 0, ENDIANNESS_BIG>; -template class handler_entry_write_units<3, -1, ENDIANNESS_LITTLE>; -template class handler_entry_write_units<3, -1, ENDIANNESS_BIG>; -template class handler_entry_write_units<3, -2, ENDIANNESS_LITTLE>; -template class handler_entry_write_units<3, -2, ENDIANNESS_BIG>; -template class handler_entry_write_units<3, -3, ENDIANNESS_LITTLE>; -template class handler_entry_write_units<3, -3, ENDIANNESS_BIG>; +template class handler_entry_read_units<0, 1>; +template class handler_entry_read_units<0, 0>; +template class handler_entry_read_units<1, 3>; +template class handler_entry_read_units<1, 0>; +template class handler_entry_read_units<1, -1>; +template class handler_entry_read_units<2, 3>; +template class handler_entry_read_units<2, 0>; +template class handler_entry_read_units<2, -1>; +template class handler_entry_read_units<2, -2>; +template class handler_entry_read_units<3, 0>; +template class handler_entry_read_units<3, -1>; +template class handler_entry_read_units<3, -2>; +template class handler_entry_read_units<3, -3>; + +template class handler_entry_write_units<0, 1>; +template class handler_entry_write_units<0, 0>; +template class handler_entry_write_units<1, 3>; +template class handler_entry_write_units<1, 0>; +template class handler_entry_write_units<1, -1>; +template class handler_entry_write_units<2, 3>; +template class handler_entry_write_units<2, 0>; +template class handler_entry_write_units<2, -1>; +template class handler_entry_write_units<2, -2>; +template class handler_entry_write_units<3, 0>; +template class handler_entry_write_units<3, -1>; +template class handler_entry_write_units<3, -2>; +template class handler_entry_write_units<3, -3>; |