summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/dirom.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/dirom.cpp')
-rw-r--r--src/emu/dirom.cpp285
1 files changed, 0 insertions, 285 deletions
diff --git a/src/emu/dirom.cpp b/src/emu/dirom.cpp
deleted file mode 100644
index 6440fa2cfc6..00000000000
--- a/src/emu/dirom.cpp
+++ /dev/null
@@ -1,285 +0,0 @@
-// license:BSD-3-Clause
-// copyright-holders:Olivier Galibert
-
-#include "emu.h"
-
-
-device_rom_interface::device_rom_interface(const machine_config &mconfig, device_t &device, u8 addrwidth, endianness_t endian, u8 datawidth) :
- device_memory_interface(mconfig, device),
- m_rom_tag(device.basetag()),
- m_rom_config("rom", endian, datawidth, addrwidth),
- m_bank(nullptr),
- m_cur_bank(-1)
-{
-}
-
-device_rom_interface::~device_rom_interface()
-{
-}
-
-device_memory_interface::space_config_vector device_rom_interface::memory_space_config() const
-{
- return space_config_vector {
- std::make_pair(0, &m_rom_config)
- };
-}
-
-void device_rom_interface::rom_bank_updated()
-{
-}
-
-void device_rom_interface::set_rom_bank(int bank)
-{
- if(!m_bank)
- emu_fatalerror("%s: device_rom_interface::set_rom_bank called without banking setup", device().tag());
-
- if(bank >= m_bank_count) {
- device().logerror("Warning: requested bank %x higher than actual bank count %x\n", bank, m_bank_count);
- bank = bank % m_bank_count;
- }
-
- if (m_cur_bank != bank) {
- m_cur_bank = bank;
- m_bank->set_entry(bank);
- rom_bank_updated();
- }
-}
-
-void device_rom_interface::interface_post_load()
-{
- if(m_bank)
- m_bank->set_entry(m_cur_bank);
-}
-
-void device_rom_interface::set_rom(const void *base, u32 size)
-{
- u32 mend = m_rom_config.addr_width() == 32 ? 0xffffffff : (1 << m_rom_config.addr_width()) - 1;
- u32 rend = size-1;
- m_bank_count = mend == 0xffffffff ? 1 : (rend+1) / (mend+1);
- if(m_bank_count < 1)
- m_bank_count = 1;
-
- if(rend >= mend) {
- space().install_read_bank(0, mend, device().tag());
- m_bank = device().machine().memory().banks().find(device().tag())->second.get();
- m_bank->configure_entries(0, m_bank_count, const_cast<void *>(base), mend+1);
- m_cur_bank = 0;
-
- } else {
- // Round up to the nearest power-of-two-minus-one
- u32 rmask = rend;
- rmask |= rmask >> 1;
- rmask |= rmask >> 2;
- rmask |= rmask >> 4;
- rmask |= rmask >> 8;
- rmask |= rmask >> 16;
- if(rmask != rend)
- space().unmap_read(0, mend);
- // Mirror over the high bits. mend and rmask are both
- // powers-of-two-minus-one, so the xor works
- space().install_rom(0, rend, mend ^ rmask, const_cast<void *>(base));
- }
-}
-
-void device_rom_interface::interface_pre_start()
-{
- if(!has_space(0))
- return;
-
- switch(space().data_width()) {
- case 8:
- if(space().endianness() == ENDIANNESS_LITTLE) {
- auto cache = space().cache<0, 0, ENDIANNESS_LITTLE>();
- m_r8 = [cache] (offs_t byteaddress) -> u8 { return cache->read_byte(byteaddress); };
- m_r16 = [cache] (offs_t byteaddress) -> u16 { return cache->read_word(byteaddress); };
- m_r32 = [cache] (offs_t byteaddress) -> u32 { return cache->read_dword(byteaddress); };
- m_r64 = [cache] (offs_t byteaddress) -> u64 { return cache->read_qword(byteaddress); };
- } else {
- auto cache = space().cache<0, 0, ENDIANNESS_BIG>();
- m_r8 = [cache] (offs_t byteaddress) -> u8 { return cache->read_byte(byteaddress); };
- m_r16 = [cache] (offs_t byteaddress) -> u16 { return cache->read_word(byteaddress); };
- m_r32 = [cache] (offs_t byteaddress) -> u32 { return cache->read_dword(byteaddress); };
- m_r64 = [cache] (offs_t byteaddress) -> u64 { return cache->read_qword(byteaddress); };
- }
- break;
-
- case 16:
- switch(space().addr_shift()) {
- case 3:
- if(space().endianness() == ENDIANNESS_LITTLE) {
- auto cache = space().cache<1, 3, ENDIANNESS_LITTLE>();
- m_r8 = [cache] (offs_t byteaddress) -> u8 { return cache->read_byte(byteaddress); };
- m_r16 = [cache] (offs_t byteaddress) -> u16 { return cache->read_word(byteaddress); };
- m_r32 = [cache] (offs_t byteaddress) -> u32 { return cache->read_dword(byteaddress); };
- m_r64 = [cache] (offs_t byteaddress) -> u64 { return cache->read_qword(byteaddress); };
- } else {
- auto cache = space().cache<1, 3, ENDIANNESS_BIG>();
- m_r8 = [cache] (offs_t byteaddress) -> u8 { return cache->read_byte(byteaddress); };
- m_r16 = [cache] (offs_t byteaddress) -> u16 { return cache->read_word(byteaddress); };
- m_r32 = [cache] (offs_t byteaddress) -> u32 { return cache->read_dword(byteaddress); };
- m_r64 = [cache] (offs_t byteaddress) -> u64 { return cache->read_qword(byteaddress); };
- }
- break;
- case 0:
- if(space().endianness() == ENDIANNESS_LITTLE) {
- auto cache = space().cache<1, 0, ENDIANNESS_LITTLE>();
- m_r8 = [cache] (offs_t byteaddress) -> u8 { return cache->read_byte(byteaddress); };
- m_r16 = [cache] (offs_t byteaddress) -> u16 { return cache->read_word(byteaddress); };
- m_r32 = [cache] (offs_t byteaddress) -> u32 { return cache->read_dword(byteaddress); };
- m_r64 = [cache] (offs_t byteaddress) -> u64 { return cache->read_qword(byteaddress); };
- } else {
- auto cache = space().cache<1, 0, ENDIANNESS_BIG>();
- m_r8 = [cache] (offs_t byteaddress) -> u8 { return cache->read_byte(byteaddress); };
- m_r16 = [cache] (offs_t byteaddress) -> u16 { return cache->read_word(byteaddress); };
- m_r32 = [cache] (offs_t byteaddress) -> u32 { return cache->read_dword(byteaddress); };
- m_r64 = [cache] (offs_t byteaddress) -> u64 { return cache->read_qword(byteaddress); };
- }
- break;
- case -1:
- if(space().endianness() == ENDIANNESS_LITTLE) {
- auto cache = space().cache<1, -1, ENDIANNESS_LITTLE>();
- m_r8 = nullptr;
- m_r16 = nullptr;
- m_r32 = [cache] (offs_t byteaddress) -> u32 { return cache->read_dword(byteaddress); };
- m_r64 = [cache] (offs_t byteaddress) -> u64 { return cache->read_qword(byteaddress); };
- } else {
- auto cache = space().cache<1, -1, ENDIANNESS_BIG>();
- m_r8 = nullptr;
- m_r16 = nullptr;
- m_r32 = [cache] (offs_t byteaddress) -> u32 { return cache->read_dword(byteaddress); };
- m_r64 = [cache] (offs_t byteaddress) -> u64 { return cache->read_qword(byteaddress); };
- }
- break;
- }
- break;
-
- case 32:
- switch(space().addr_shift()) {
- case 0:
- if(space().endianness() == ENDIANNESS_LITTLE) {
- auto cache = space().cache<2, 0, ENDIANNESS_LITTLE>();
- m_r8 = [cache] (offs_t byteaddress) -> u8 { return cache->read_byte(byteaddress); };
- m_r16 = [cache] (offs_t byteaddress) -> u16 { return cache->read_word(byteaddress); };
- m_r32 = [cache] (offs_t byteaddress) -> u32 { return cache->read_dword(byteaddress); };
- m_r64 = [cache] (offs_t byteaddress) -> u64 { return cache->read_qword(byteaddress); };
- } else {
- auto cache = space().cache<2, 0, ENDIANNESS_BIG>();
- m_r8 = [cache] (offs_t byteaddress) -> u8 { return cache->read_byte(byteaddress); };
- m_r16 = [cache] (offs_t byteaddress) -> u16 { return cache->read_word(byteaddress); };
- m_r32 = [cache] (offs_t byteaddress) -> u32 { return cache->read_dword(byteaddress); };
- m_r64 = [cache] (offs_t byteaddress) -> u64 { return cache->read_qword(byteaddress); };
- }
- break;
- case -1:
- if(space().endianness() == ENDIANNESS_LITTLE) {
- auto cache = space().cache<2, -1, ENDIANNESS_LITTLE>();
- m_r8 = nullptr;
- m_r16 = [cache] (offs_t byteaddress) -> u16 { return cache->read_word(byteaddress); };
- m_r32 = [cache] (offs_t byteaddress) -> u32 { return cache->read_dword(byteaddress); };
- m_r64 = [cache] (offs_t byteaddress) -> u64 { return cache->read_qword(byteaddress); };
- } else {
- auto cache = space().cache<2, -1, ENDIANNESS_BIG>();
- m_r8 = nullptr;
- m_r16 = [cache] (offs_t byteaddress) -> u16 { return cache->read_word(byteaddress); };
- m_r32 = [cache] (offs_t byteaddress) -> u32 { return cache->read_dword(byteaddress); };
- m_r64 = [cache] (offs_t byteaddress) -> u64 { return cache->read_qword(byteaddress); };
- }
- break;
- case -2:
- if(space().endianness() == ENDIANNESS_LITTLE) {
- auto cache = space().cache<2, -2, ENDIANNESS_LITTLE>();
- m_r8 = nullptr;
- m_r16 = nullptr;
- m_r32 = [cache] (offs_t byteaddress) -> u32 { return cache->read_dword(byteaddress); };
- m_r64 = [cache] (offs_t byteaddress) -> u64 { return cache->read_qword(byteaddress); };
- } else {
- auto cache = space().cache<2, -2, ENDIANNESS_BIG>();
- m_r8 = nullptr;
- m_r16 = nullptr;
- m_r32 = [cache] (offs_t byteaddress) -> u32 { return cache->read_dword(byteaddress); };
- m_r64 = [cache] (offs_t byteaddress) -> u64 { return cache->read_qword(byteaddress); };
- }
- break;
- }
- break;
-
- case 64:
- switch(space().addr_shift()) {
- case 0:
- if(space().endianness() == ENDIANNESS_LITTLE) {
- auto cache = space().cache<3, 0, ENDIANNESS_LITTLE>();
- m_r8 = [cache] (offs_t byteaddress) -> u8 { return cache->read_byte(byteaddress); };
- m_r16 = [cache] (offs_t byteaddress) -> u16 { return cache->read_word(byteaddress); };
- m_r32 = [cache] (offs_t byteaddress) -> u32 { return cache->read_dword(byteaddress); };
- m_r64 = [cache] (offs_t byteaddress) -> u64 { return cache->read_qword(byteaddress); };
- } else {
- auto cache = space().cache<3, 0, ENDIANNESS_BIG>();
- m_r8 = [cache] (offs_t byteaddress) -> u8 { return cache->read_byte(byteaddress); };
- m_r16 = [cache] (offs_t byteaddress) -> u16 { return cache->read_word(byteaddress); };
- m_r32 = [cache] (offs_t byteaddress) -> u32 { return cache->read_dword(byteaddress); };
- m_r64 = [cache] (offs_t byteaddress) -> u64 { return cache->read_qword(byteaddress); };
- }
- break;
- case -1:
- if(space().endianness() == ENDIANNESS_LITTLE) {
- auto cache = space().cache<3, -1, ENDIANNESS_LITTLE>();
- m_r8 = nullptr;
- m_r16 = [cache] (offs_t byteaddress) -> u16 { return cache->read_word(byteaddress); };
- m_r32 = [cache] (offs_t byteaddress) -> u32 { return cache->read_dword(byteaddress); };
- m_r64 = [cache] (offs_t byteaddress) -> u64 { return cache->read_qword(byteaddress); };
- } else {
- auto cache = space().cache<3, -1, ENDIANNESS_BIG>();
- m_r8 = nullptr;
- m_r16 = [cache] (offs_t byteaddress) -> u16 { return cache->read_word(byteaddress); };
- m_r32 = [cache] (offs_t byteaddress) -> u32 { return cache->read_dword(byteaddress); };
- m_r64 = [cache] (offs_t byteaddress) -> u64 { return cache->read_qword(byteaddress); };
- }
- break;
- case -2:
- if(space().endianness() == ENDIANNESS_LITTLE) {
- auto cache = space().cache<3, -2, ENDIANNESS_LITTLE>();
- m_r8 = nullptr;
- m_r16 = nullptr;
- m_r32 = [cache] (offs_t byteaddress) -> u32 { return cache->read_dword(byteaddress); };
- m_r64 = [cache] (offs_t byteaddress) -> u64 { return cache->read_qword(byteaddress); };
- } else {
- auto cache = space().cache<3, -2, ENDIANNESS_BIG>();
- m_r8 = nullptr;
- m_r16 = nullptr;
- m_r32 = [cache] (offs_t byteaddress) -> u32 { return cache->read_dword(byteaddress); };
- m_r64 = [cache] (offs_t byteaddress) -> u64 { return cache->read_qword(byteaddress); };
- }
- break;
- case -3:
- if(space().endianness() == ENDIANNESS_LITTLE) {
- auto cache = space().cache<3, -3, ENDIANNESS_LITTLE>();
- m_r8 = nullptr;
- m_r16 = nullptr;
- m_r32 = nullptr;
- m_r64 = [cache] (offs_t byteaddress) -> u64 { return cache->read_qword(byteaddress); };
- } else {
- auto cache = space().cache<3, -3, ENDIANNESS_BIG>();
- m_r8 = nullptr;
- m_r16 = nullptr;
- m_r32 = nullptr;
- m_r64 = [cache] (offs_t byteaddress) -> u64 { return cache->read_qword(byteaddress); };
- }
- break;
- }
- break;
- }
-
- device().save_item(NAME(m_cur_bank));
- device().save_item(NAME(m_bank_count));
-
- if(!has_configured_map(0)) {
- memory_region *reg = device().owner()->memregion(m_rom_tag);
- if(reg)
- set_rom(reg->base(), reg->bytes());
- else {
- device().logerror("ROM region '%s' not found\n", m_rom_tag);
- u32 end = m_rom_config.addr_width() == 32 ? 0xffffffff : (1 << m_rom_config.addr_width()) - 1;
- space().unmap_read(0, end);
- }
- }
-}