diff options
author | Vas Crabb <vas@vastheman.com> | 2020-11-09 03:55:50 +1100 |
---|---|---|
committer | Vas Crabb <vas@vastheman.com> | 2020-11-09 03:55:50 +1100 |
commit | 538221861b3fa38da4df2e75c0809e594693beba (patch) | |
tree | 3c9b9838212297b5fc37ce1e30b000a29c5bb338 /src/emu | |
parent | 0f2e755432411f6971fd4de9b2666ac188e8806f (diff) |
-emu/dirom.{h,ipp}: Cleaned up and made it stricter.
* Made it an error to specify address map and explicit ROM region.
* Made it an error if explicitly specified ROM region is not found.
* Made the ROM region tag apply relative to the current device.
-Cleaned up formatting for a couple more documentation pages.
Diffstat (limited to 'src/emu')
-rw-r--r-- | src/emu/dimemory.cpp | 5 | ||||
-rw-r--r-- | src/emu/dirom.h | 21 | ||||
-rw-r--r-- | src/emu/dirom.ipp | 62 |
3 files changed, 63 insertions, 25 deletions
diff --git a/src/emu/dimemory.cpp b/src/emu/dimemory.cpp index 206235a48ce..da6116248ef 100644 --- a/src/emu/dimemory.cpp +++ b/src/emu/dimemory.cpp @@ -50,9 +50,10 @@ device_memory_interface::~device_memory_interface() void device_memory_interface::set_addrmap(int spacenum, address_map_constructor map) { + assert(0 <= spacenum); if (spacenum >= int(m_address_map.size())) - m_address_map.resize(spacenum+1); - m_address_map[spacenum] = map; + m_address_map.resize(spacenum + 1); + m_address_map[spacenum] = std::move(map); } diff --git a/src/emu/dirom.h b/src/emu/dirom.h index c5dd94fedae..8243400c547 100644 --- a/src/emu/dirom.h +++ b/src/emu/dirom.h @@ -7,11 +7,11 @@ Interface to a rom, either through a memory map or a region ***************************************************************************/ +#ifndef MAME_EMU_DIROM_H +#define MAME_EMU_DIROM_H #pragma once -#ifndef MAME_EMU_DIROM_H -#define MAME_EMU_DIROM_H // Beware, DataWidth is 0-3 template<int AddrWidth, int DataWidth = 0, int AddrShift = 0, endianness_t Endian = ENDIANNESS_LITTLE> class device_rom_interface : public device_memory_interface @@ -20,12 +20,13 @@ public: device_rom_interface(const machine_config &mconfig, device_t &device); virtual ~device_rom_interface() = default; - void set_device_rom_tag(const char *tag) { m_rom_tag = tag; } + template <typename... T> void set_map(T &&... args) { set_addrmap(0, std::forward<T>(args)...); } + template <typename T> void set_device_rom_tag(T &&tag) { m_rom_region.set_tag(std::forward<T>(tag)); } - inline u8 read_byte(offs_t byteaddress) { return m_rom_cache.read_byte(byteaddress); } - inline u16 read_word(offs_t byteaddress) { return m_rom_cache.read_word(byteaddress); } - inline u32 read_dword(offs_t byteaddress) { return m_rom_cache.read_dword(byteaddress); } - inline u64 read_qword(offs_t byteaddress) { return m_rom_cache.read_qword(byteaddress); } + u8 read_byte(offs_t addr) { return m_rom_cache.read_byte(addr); } + u16 read_word(offs_t addr) { return m_rom_cache.read_word(addr); } + u32 read_dword(offs_t addr) { return m_rom_cache.read_dword(addr); } + u64 read_qword(offs_t addr) { return m_rom_cache.read_qword(addr); } void set_rom(const void *base, u32 size); void set_rom_bank(int bank); @@ -37,14 +38,16 @@ protected: void override_address_width(u8 width); private: - const char *m_rom_tag; + optional_memory_region m_rom_region; address_space_config m_rom_config; typename memory_access<AddrWidth, DataWidth, AddrShift, Endian>::cache m_rom_cache; memory_bank_creator m_bank; - int m_cur_bank, m_bank_count; + u32 m_cur_bank, m_bank_count; + virtual void interface_validity_check(validity_checker &valid) const override; virtual void interface_pre_start() override; + virtual void interface_post_start() override; virtual void interface_post_load() override; }; diff --git a/src/emu/dirom.ipp b/src/emu/dirom.ipp index 42904bf27fd..24697a0fbba 100644 --- a/src/emu/dirom.ipp +++ b/src/emu/dirom.ipp @@ -1,10 +1,14 @@ // license:BSD-3-Clause // copyright-holders:Olivier Galibert +#ifndef MAME_EMU_DIROM_IPP +#define MAME_EMU_DIROM_IPP + +#pragma once template<int AddrWidth, int DataWidth, int AddrShift, endianness_t Endian> device_rom_interface<AddrWidth, DataWidth, AddrShift, Endian>::device_rom_interface(const machine_config &mconfig, device_t &device) : device_memory_interface(mconfig, device), - m_rom_tag(device.basetag()), + m_rom_region(device, DEVICE_SELF), m_rom_config("rom", Endian, 8 << DataWidth, AddrWidth, AddrShift), m_bank(device, "bank"), m_cur_bank(-1) @@ -33,7 +37,7 @@ template<int AddrWidth, int DataWidth, int AddrShift, endianness_t Endian> void device_rom_interface<AddrWidth, DataWidth, AddrShift, Endian>::set_rom_bank(int bank) { if(!m_bank) - emu_fatalerror("%s: device_rom_interface::set_rom_bank called without banking setup", device().tag()); + throw 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); @@ -50,6 +54,8 @@ void device_rom_interface<AddrWidth, DataWidth, AddrShift, Endian>::set_rom_bank template<int AddrWidth, int DataWidth, int AddrShift, endianness_t Endian> void device_rom_interface<AddrWidth, DataWidth, AddrShift, Endian>::interface_post_load() { + device_memory_interface::interface_post_load(); + if(m_bank) m_bank->set_entry(m_cur_bank); } @@ -57,9 +63,9 @@ void device_rom_interface<AddrWidth, DataWidth, AddrShift, Endian>::interface_po template<int AddrWidth, int DataWidth, int AddrShift, endianness_t Endian> void device_rom_interface<AddrWidth, DataWidth, AddrShift, Endian>::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); + const u32 mend = make_bitmask<u32>(m_rom_config.addr_width()); + const u32 rend = size-1; + m_bank_count = (mend == 0xffffffff) ? 1 : (rend+1) / (mend+1); if(m_bank_count < 1) m_bank_count = 1; @@ -86,24 +92,52 @@ void device_rom_interface<AddrWidth, DataWidth, AddrShift, Endian>::set_rom(cons } template<int AddrWidth, int DataWidth, int AddrShift, endianness_t Endian> +void device_rom_interface<AddrWidth, DataWidth, AddrShift, Endian>::interface_validity_check(validity_checker &valid) const +{ + device_memory_interface::interface_validity_check(valid); + + if(has_configured_map(0)) { + const auto rom_target = m_rom_region.finder_target(); + if((&rom_target.first != &device()) || strcmp(rom_target.second, DEVICE_SELF)) + osd_printf_error("Address map and ROM region both specified\n"); + } +} + +template<int AddrWidth, int DataWidth, int AddrShift, endianness_t Endian> void device_rom_interface<AddrWidth, DataWidth, AddrShift, Endian>::interface_pre_start() { + device_memory_interface::interface_pre_start(); + if(!has_space(0)) return; space().cache(m_rom_cache); - 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()); + if(m_rom_region.found()) + set_rom(m_rom_region->base(), m_rom_region->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); + const auto rom_target = m_rom_region.finder_target(); + if((&rom_target.first != &device()) || strcmp(rom_target.second, DEVICE_SELF)) + throw emu_fatalerror("%s: device_rom_interface ROM region '%s' not found", device().tag(), rom_target.first.subtag(rom_target.second)); + + device().logerror("ROM region '%s' not found\n", rom_target.first.subtag(rom_target.second)); + space().unmap_read(0, make_bitmask<offs_t>(m_rom_config.addr_width())); } + } else { + const auto rom_target = m_rom_region.finder_target(); + if((&rom_target.first != &device()) || strcmp(rom_target.second, DEVICE_SELF)) + throw emu_fatalerror("%s: device_rom_interface has configured address map and ROM region", device().tag()); } } + +template<int AddrWidth, int DataWidth, int AddrShift, endianness_t Endian> +void device_rom_interface<AddrWidth, DataWidth, AddrShift, Endian>::interface_post_start() +{ + device_memory_interface::interface_post_start(); + + device().save_item(NAME(m_cur_bank)); + device().save_item(NAME(m_bank_count)); +} + +#endif // MAME_EMU_DIROM_IPP |