summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu
diff options
context:
space:
mode:
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
commit538221861b3fa38da4df2e75c0809e594693beba (patch)
tree3c9b9838212297b5fc37ce1e30b000a29c5bb338 /src/emu
parent0f2e755432411f6971fd4de9b2666ac188e8806f (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.cpp5
-rw-r--r--src/emu/dirom.h21
-rw-r--r--src/emu/dirom.ipp62
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