summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/devfind.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/devfind.h')
-rw-r--r--src/emu/devfind.h37
1 files changed, 24 insertions, 13 deletions
diff --git a/src/emu/devfind.h b/src/emu/devfind.h
index 44a5532b6a8..98599e4a6e9 100644
--- a/src/emu/devfind.h
+++ b/src/emu/devfind.h
@@ -47,6 +47,7 @@ public:
// getters
virtual bool findit(bool isvalidation = false) = 0;
+ const char *finder_tag() const { return m_tag; }
// setter for setting the object
void set_tag(const char *tag) { m_tag = tag; }
@@ -54,8 +55,9 @@ public:
protected:
// helpers
void *find_memregion(UINT8 width, size_t &length, bool required) const;
- void *find_memshare(UINT8 width, size_t &bytes, bool required);
- bool report_missing(bool found, const char *objname, bool required);
+ bool validate_memregion(size_t bytes, bool required) const;
+ void *find_memshare(UINT8 width, size_t &bytes, bool required) const;
+ bool report_missing(bool found, const char *objname, bool required) const;
void printf_warning(const char *format, ...) ATTR_PRINTF(2,3);
@@ -104,7 +106,7 @@ class device_finder : public object_finder_base<_DeviceClass>
{
public:
// construction/destruction
- device_finder(device_t &base, const char *tag)
+ device_finder(device_t &base, const char *tag = FINDER_DUMMY_TAG)
: object_finder_base<_DeviceClass>(base, tag) { }
// make reference use transparent as well
@@ -148,7 +150,7 @@ class memory_region_finder : public object_finder_base<memory_region>
{
public:
// construction/destruction
- memory_region_finder(device_t &base, const char *tag)
+ memory_region_finder(device_t &base, const char *tag = FINDER_DUMMY_TAG)
: object_finder_base<memory_region>(base, tag) { }
// make reference use transparent as well
@@ -157,7 +159,7 @@ public:
// finder
virtual bool findit(bool isvalidation = false) override
{
- if (isvalidation) return true;
+ if (isvalidation) return this->validate_memregion(0, _Required);
m_target = m_base.memregion(m_tag);
return this->report_missing(m_target != nullptr, "memory region", _Required);
}
@@ -186,7 +188,7 @@ class memory_bank_finder : public object_finder_base<memory_bank>
{
public:
// construction/destruction
- memory_bank_finder(device_t &base, const char *tag)
+ memory_bank_finder(device_t &base, const char *tag = FINDER_DUMMY_TAG)
: object_finder_base<memory_bank>(base, tag) { }
// make reference use transparent as well
@@ -224,7 +226,7 @@ class ioport_finder : public object_finder_base<ioport_port>
{
public:
// construction/destruction
- ioport_finder(device_t &base, const char *tag)
+ ioport_finder(device_t &base, const char *tag = FINDER_DUMMY_TAG)
: object_finder_base<ioport_port>(base, tag) { }
// make reference use transparent as well
@@ -319,14 +321,20 @@ class region_ptr_finder : public object_finder_base<_PointerType>
{
public:
// construction/destruction
- region_ptr_finder(device_t &base, const char *tag)
+ region_ptr_finder(device_t &base, const char *tag, size_t length = 0)
: object_finder_base<_PointerType>(base, tag),
- m_length(0) { }
+ m_length(length) { }
+ region_ptr_finder(device_t &base, size_t length = 0)
+ : object_finder_base<_PointerType>(base, FINDER_DUMMY_TAG),
+ m_length(length) { }
// operators to make use transparent
_PointerType operator[](int index) const { assert(index < m_length); return this->m_target[index]; }
_PointerType &operator[](int index) { assert(index < m_length); return this->m_target[index]; }
+ // setter for setting the object and its length
+ void set_target(_PointerType *target, size_t length) { this->m_target = target; m_length = length; }
+
// getter for explicit fetching
UINT32 length() const { return m_length; }
UINT32 bytes() const { return m_length * sizeof(_PointerType); }
@@ -335,7 +343,7 @@ public:
// finder
virtual bool findit(bool isvalidation = false) override
{
- if (isvalidation) return true;
+ if (isvalidation) return this->validate_memregion(sizeof(_PointerType) * m_length, _Required);
this->m_target = reinterpret_cast<_PointerType *>(this->find_memregion(sizeof(_PointerType), m_length, _Required));
return this->report_missing(this->m_target != nullptr, "memory region", _Required);
}
@@ -350,7 +358,8 @@ template<class _PointerType>
class optional_region_ptr : public region_ptr_finder<_PointerType, false>
{
public:
- optional_region_ptr(device_t &base, const char *tag = FINDER_DUMMY_TAG) : region_ptr_finder<_PointerType, false>(base, tag) { }
+ optional_region_ptr(device_t &base, const char *tag, size_t length = 0) : region_ptr_finder<_PointerType, false>(base, tag, length) { }
+ optional_region_ptr(device_t &base, size_t length = 0) : region_ptr_finder<_PointerType, false>(base, FINDER_DUMMY_TAG, length) { }
};
// required region pointer finder
@@ -358,10 +367,12 @@ template<class _PointerType>
class required_region_ptr : public region_ptr_finder<_PointerType, true>
{
public:
- required_region_ptr(device_t &base, const char *tag = FINDER_DUMMY_TAG) : region_ptr_finder<_PointerType, true>(base, tag) { }
+ required_region_ptr(device_t &base, const char *tag, size_t length = 0) : region_ptr_finder<_PointerType, true>(base, tag, length) { }
+ required_region_ptr(device_t &base, size_t length = 0) : region_ptr_finder<_PointerType, true>(base, FINDER_DUMMY_TAG, length) { }
};
+
// ======================> shared_ptr_finder
// shared pointer finder template
@@ -370,7 +381,7 @@ class shared_ptr_finder : public object_finder_base<_PointerType>
{
public:
// construction/destruction
- shared_ptr_finder(device_t &base, const char *tag, UINT8 width = sizeof(_PointerType) * 8)
+ shared_ptr_finder(device_t &base, const char *tag = FINDER_DUMMY_TAG, UINT8 width = sizeof(_PointerType) * 8)
: object_finder_base<_PointerType>(base, tag),
m_bytes(0),
m_width(width) { }