From dd19e512c03c58a100ae5025c9fd7624387667fd Mon Sep 17 00:00:00 2001 From: Aaron Giles Date: Thu, 19 Aug 2010 06:57:51 +0000 Subject: Massive memory system change. This is another step along the path toward supporting cleaner implementations of drivers in the explicitly OO world. Expect a follow-on of several more changes to clean up from this one, which deliberately tried to avoid touching much driver code. Converted address_space to a class, and moved most members behind accessor methods, apart from space->machine and space->cpu. Removed external references to 8le/8be/16le/16be/32le/32be/64le/64be. All external access is now done via virtual functions read_byte()/read_word()/etc. Moved differentiation between the endianness and the bus width internal to memory.c, and also added a new axis to support small/large address spaces, which allows for faster lookups on spaces smaller than 18 bits. Provided methods for most global memory operations within the new address_space class. These will be bulk converted in a future update, but for now there are inline wrappers to hide this change from existing callers. Created new module delegate.h which implements C++ delegates in a form that works for MAME. Details are in the opening comment. Delegates allow member functions of certain classes to be used as callbacks, which will hopefully be the beginning of the end of fetching the driver_data field in most callbacks. All classes that host delegates must derive from bindable_object. Today, all devices and driver_data do implicitly via their base class. Defined delegates for read/write handlers. The new delegates are always passed an address_space reference, along with offset, data, and mask. Delegates can refer to methods either in the driver_data class or in a device class. To specify a callback in an address map, just use AM_READ_MEMBER(class, member). In fact, all existing AM_ macros that take read/write handlers can now accept delegates in their place. Delegates that are specified in an address map are proto-delegates which have no object; they are bound to their object when the corresponding address_space is created. Added machine->m_nonspecific_space which can be passed as the required address_space parameter to the new read/write methods in legacy situations where the space is not provided. Eventually this can go away but we will need it for a while yet. Added methods to the new address_space class to dynamically install delegates just like you can dynamically install handlers today. Delegates installed this way must be pre-bound to their object. Moved beathead's read/write handlers into members of beathead_state as an example of using the new delegates. This provides examples of both static (via an address_map) and dynamic (via install_handler calls) mapping using delegates. Added read/write member functions to okim6295_device as an example of using delegates to call devices. Updated audio/williams.c as a single example of calling the device via its member function callbacks. These will be bulk updated in a future update, and the old global callbacks removed. Changed the DIRECT_UPDATE_CALLBACKs into delegates as well. Updated all users to the new function format. Added methods on direct_read_data for configuring the parameters in a standard way to make the implementation clearer. Created a simple_list template container class for managing the common singly-linked lists we use all over in the project. Many other internal changes in memory.c, mostly involving restructuring the code into proper classes. --- src/emu/addrmap.h | 326 +++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 227 insertions(+), 99 deletions(-) (limited to 'src/emu/addrmap.h') diff --git a/src/emu/addrmap.h b/src/emu/addrmap.h index 2a397bd1afa..24cfcde5919 100644 --- a/src/emu/addrmap.h +++ b/src/emu/addrmap.h @@ -60,8 +60,10 @@ enum map_handler_type AMH_ROM, AMH_NOP, AMH_UNMAP, - AMH_HANDLER, - AMH_DEVICE_HANDLER, + AMH_DRIVER_DELEGATE, + AMH_DEVICE_DELEGATE, + AMH_LEGACY_SPACE_HANDLER, + AMH_LEGACY_DEVICE_HANDLER, AMH_PORT, AMH_BANK }; @@ -72,67 +74,25 @@ enum map_handler_type // TYPE DEFINITIONS //************************************************************************** -// address map constructors are functions generated by tokens -typedef void (*address_map_constructor)(address_map &map, const device_config &devconfig); - - -// read_handler is a union of all the different read handler types -union read_handler -{ - genf * generic; // generic function pointer - read8_space_func shandler8; // 8-bit space read handler - read16_space_func shandler16; // 16-bit space read handler - read32_space_func shandler32; // 32-bit space read handler - read64_space_func shandler64; // 64-bit space read handler - read8_device_func dhandler8; // 8-bit device read handler - read16_device_func dhandler16; // 16-bit device read handler - read32_device_func dhandler32; // 32-bit device read handler - read64_device_func dhandler64; // 64-bit device read handler -}; - - -// write_handler is a union of all the different write handler types -union write_handler -{ - genf * generic; // generic function pointer - write8_space_func shandler8; // 8-bit space write handler - write16_space_func shandler16; // 16-bit space write handler - write32_space_func shandler32; // 32-bit space write handler - write64_space_func shandler64; // 64-bit space write handler - write8_device_func dhandler8; // 8-bit device write handler - write16_device_func dhandler16; // 16-bit device write handler - write32_device_func dhandler32; // 32-bit device write handler - write64_device_func dhandler64; // 64-bit device write handler -}; - - -// memory_handler is a union of all read and write handler types -union memory_handler -{ - genf * generic; // generic function pointer - read_handler read; // read handler union - write_handler write; // write handler union -}; - - // address map handler data class map_handler_data { public: map_handler_data() - : type(AMH_NONE), - bits(0), - mask(0), - name(NULL), - tag(NULL) { handler.generic = NULL; } - - map_handler_type type; // type of the handler - UINT8 bits; // width of the handler in bits, or 0 for default - UINT8 mask; // mask for which lanes apply - memory_handler handler; // a memory handler - const char * name; // name of the handler - const char * tag; // tag pointing to a reference - astring derived_tag; // string used to hold derived names + : m_type(AMH_NONE), + m_bits(0), + m_mask(0), + m_name(NULL), + m_tag(NULL) { } + + map_handler_type m_type; // type of the handler + UINT8 m_bits; // width of the handler in bits, or 0 for default + UINT64 m_mask; // mask for which lanes apply + const char * m_name; // name of the handler + const char * m_tag; // tag pointing to a reference + astring m_derived_tag; // string used to hold derived names + + void set_tag(const device_config &devconfig, const char *tag); }; @@ -145,11 +105,14 @@ class address_map_entry public: // construction/destruction address_map_entry(address_map &map, offs_t start, offs_t end); + + // getters + address_map_entry *next() const { return m_next; } // simple inline setters void set_mirror(offs_t _mirror) { m_addrmirror = _mirror; } - void set_read_type(map_handler_type _type) { m_read.type = _type; } - void set_write_type(map_handler_type _type) { m_write.type = _type; } + void set_read_type(map_handler_type _type) { m_read.m_type = _type; } + void set_write_type(map_handler_type _type) { m_write.m_type = _type; } void set_region(const char *tag, offs_t offset) { m_region = tag; m_rgnoffs = offset; } void set_share(const char *tag) { m_share = tag; } void set_sizeptr(size_t *_sizeptr) { m_sizeptr = _sizeptr; } @@ -172,31 +135,59 @@ public: void set_readwrite_bank(const device_config &devconfig, const char *tag); // public state - address_map_entry * m_next; // pointer to the next entry - address_map & m_map; // reference to our owning map - astring m_region_string; // string used to hold derived names - - offs_t m_addrstart; // start address - offs_t m_addrend; // end address - offs_t m_addrmirror; // mirror bits - offs_t m_addrmask; // mask bits - map_handler_data m_read; // data for read handler - map_handler_data m_write; // data for write handler - const char * m_share; // tag of a shared memory block - void ** m_baseptr; // receives pointer to memory (optional) - size_t * m_sizeptr; // receives size of area in bytes (optional) - UINT32 m_baseptroffs_plus1; // offset of base pointer within driver_data, plus 1 - UINT32 m_sizeptroffs_plus1; // offset of size pointer within driver_data, plus 1 - UINT32 m_genbaseptroffs_plus1; // offset of base pointer within generic_pointers, plus 1 - UINT32 m_gensizeptroffs_plus1; // offset of size pointer within generic_pointers, plus 1 - const char * m_region; // tag of region containing the memory backing this entry - offs_t m_rgnoffs; // offset within the region - - void * m_memory; // pointer to memory backing this entry - offs_t m_bytestart; // byte-adjusted start address - offs_t m_byteend; // byte-adjusted end address - offs_t m_bytemirror; // byte-adjusted mirror bits - offs_t m_bytemask; // byte-adjusted mask bits + address_map_entry * m_next; // pointer to the next entry + address_map & m_map; // reference to our owning map + astring m_region_string; // string used to hold derived names + + // basic information + offs_t m_addrstart; // start address + offs_t m_addrend; // end address + offs_t m_addrmirror; // mirror bits + offs_t m_addrmask; // mask bits + map_handler_data m_read; // data for read handler + map_handler_data m_write; // data for write handler + const char * m_share; // tag of a shared memory block + void ** m_baseptr; // receives pointer to memory (optional) + size_t * m_sizeptr; // receives size of area in bytes (optional) + UINT32 m_baseptroffs_plus1; // offset of base pointer within driver_data, plus 1 + UINT32 m_sizeptroffs_plus1; // offset of size pointer within driver_data, plus 1 + UINT32 m_genbaseptroffs_plus1; // offset of base pointer within generic_pointers, plus 1 + UINT32 m_gensizeptroffs_plus1; // offset of size pointer within generic_pointers, plus 1 + const char * m_region; // tag of region containing the memory backing this entry + offs_t m_rgnoffs; // offset within the region + + // handlers + read8_proto_delegate m_rproto8; // 8-bit read proto-delegate + read16_proto_delegate m_rproto16; // 16-bit read proto-delegate + read32_proto_delegate m_rproto32; // 32-bit read proto-delegate + read64_proto_delegate m_rproto64; // 64-bit read proto-delegate + read8_space_func m_rspace8; // 8-bit legacy address space handler + read16_space_func m_rspace16; // 16-bit legacy address space handler + read32_space_func m_rspace32; // 32-bit legacy address space handler + read64_space_func m_rspace64; // 64-bit legacy address space handler + read8_device_func m_rdevice8; // 8-bit legacy device handler + read16_device_func m_rdevice16; // 16-bit legacy device handler + read32_device_func m_rdevice32; // 32-bit legacy device handler + read64_device_func m_rdevice64; // 64-bit legacy device handler + write8_proto_delegate m_wproto8; // 8-bit write proto-delegate + write16_proto_delegate m_wproto16; // 16-bit write proto-delegate + write32_proto_delegate m_wproto32; // 32-bit write proto-delegate + write64_proto_delegate m_wproto64; // 64-bit write proto-delegate + write8_space_func m_wspace8; // 8-bit legacy address space handler + write16_space_func m_wspace16; // 16-bit legacy address space handler + write32_space_func m_wspace32; // 32-bit legacy address space handler + write64_space_func m_wspace64; // 64-bit legacy address space handler + write8_device_func m_wdevice8; // 8-bit legacy device handler + write16_device_func m_wdevice16; // 16-bit legacy device handler + write32_device_func m_wdevice32; // 32-bit legacy device handler + write64_device_func m_wdevice64; // 64-bit legacy device handler + + // information used during processing + void * m_memory; // pointer to memory backing this entry + offs_t m_bytestart; // byte-adjusted start address + offs_t m_byteend; // byte-adjusted end address + offs_t m_bytemirror; // byte-adjusted mirror bits + offs_t m_bytemask; // byte-adjusted mask bits protected: // internal base pointer setting (derived classes provide typed versions) @@ -205,10 +196,13 @@ protected: // internal handler setters for 8-bit functions void internal_set_handler(read8_space_func func, const char *string, UINT64 mask); void internal_set_handler(write8_space_func func, const char *string, UINT64 mask); - void internal_set_handler(read8_space_func rfunc, const char *rstring,write8_space_func wfunc, const char *wstring, UINT64 mask); + void internal_set_handler(read8_space_func rfunc, const char *rstring, write8_space_func wfunc, const char *wstring, UINT64 mask); void internal_set_handler(const device_config &devconfig, const char *tag, read8_device_func func, const char *string, UINT64 mask); void internal_set_handler(const device_config &devconfig, const char *tag, write8_device_func func, const char *string, UINT64 mask); void internal_set_handler(const device_config &devconfig, const char *tag, read8_device_func rfunc, const char *rstring, write8_device_func wfunc, const char *wstring, UINT64 mask); + void internal_set_handler(const device_config &devconfig, const char *tag, read8_proto_delegate func, UINT64 mask); + void internal_set_handler(const device_config &devconfig, const char *tag, write8_proto_delegate func, UINT64 mask); + void internal_set_handler(const device_config &devconfig, const char *tag, read8_proto_delegate rfunc, write8_proto_delegate wfunc, UINT64 mask); // internal handler setters for 16-bit functions void internal_set_handler(read16_space_func func, const char *string, UINT64 mask); @@ -217,6 +211,9 @@ protected: void internal_set_handler(const device_config &devconfig, const char *tag, read16_device_func func, const char *string, UINT64 mask); void internal_set_handler(const device_config &devconfig, const char *tag, write16_device_func func, const char *string, UINT64 mask); void internal_set_handler(const device_config &devconfig, const char *tag, read16_device_func rfunc, const char *rstring, write16_device_func wfunc, const char *wstring, UINT64 mask); + void internal_set_handler(const device_config &devconfig, const char *tag, read16_proto_delegate func, UINT64 mask); + void internal_set_handler(const device_config &devconfig, const char *tag, write16_proto_delegate func, UINT64 mask); + void internal_set_handler(const device_config &devconfig, const char *tag, read16_proto_delegate rfunc, write16_proto_delegate wfunc, UINT64 mask); // internal handler setters for 32-bit functions void internal_set_handler(read32_space_func func, const char *string, UINT64 mask); @@ -225,6 +222,9 @@ protected: void internal_set_handler(const device_config &devconfig, const char *tag, read32_device_func func, const char *string, UINT64 mask); void internal_set_handler(const device_config &devconfig, const char *tag, write32_device_func func, const char *string, UINT64 mask); void internal_set_handler(const device_config &devconfig, const char *tag, read32_device_func rfunc, const char *rstring, write32_device_func wfunc, const char *wstring, UINT64 mask); + void internal_set_handler(const device_config &devconfig, const char *tag, read32_proto_delegate func, UINT64 mask); + void internal_set_handler(const device_config &devconfig, const char *tag, write32_proto_delegate func, UINT64 mask); + void internal_set_handler(const device_config &devconfig, const char *tag, read32_proto_delegate rfunc, write32_proto_delegate wfunc, UINT64 mask); // internal handler setters for 64-bit functions void internal_set_handler(read64_space_func func, const char *string, UINT64 mask); @@ -233,6 +233,9 @@ protected: void internal_set_handler(const device_config &devconfig, const char *tag, read64_device_func func, const char *string, UINT64 mask); void internal_set_handler(const device_config &devconfig, const char *tag, write64_device_func func, const char *string, UINT64 mask); void internal_set_handler(const device_config &devconfig, const char *tag, read64_device_func rfunc, const char *rstring, write64_device_func wfunc, const char *wstring, UINT64 mask); + void internal_set_handler(const device_config &devconfig, const char *tag, read64_proto_delegate func, UINT64 mask); + void internal_set_handler(const device_config &devconfig, const char *tag, write64_proto_delegate func, UINT64 mask); + void internal_set_handler(const device_config &devconfig, const char *tag, read64_proto_delegate rfunc, write64_proto_delegate wfunc, UINT64 mask); private: // helper functions @@ -257,6 +260,9 @@ public: void set_handler(const device_config &devconfig, const char *tag, read8_device_func func, const char *string) { internal_set_handler(devconfig, tag, func, string, 0); } void set_handler(const device_config &devconfig, const char *tag, write8_device_func func, const char *string) { internal_set_handler(devconfig, tag, func, string, 0); } void set_handler(const device_config &devconfig, const char *tag, read8_device_func rfunc, const char *rstring, write8_device_func wfunc, const char *wstring) { internal_set_handler(devconfig, tag, rfunc, rstring, wfunc, wstring, 0); } + void set_handler(const device_config &devconfig, const char *tag, read8_proto_delegate func) { internal_set_handler(devconfig, tag, func, 0); } + void set_handler(const device_config &devconfig, const char *tag, write8_proto_delegate func) { internal_set_handler(devconfig, tag, func, 0); } + void set_handler(const device_config &devconfig, const char *tag, read8_proto_delegate rfunc, write8_proto_delegate wfunc) { internal_set_handler(devconfig, tag, rfunc, wfunc, 0); } }; @@ -277,6 +283,9 @@ public: void set_handler(const device_config &devconfig, const char *tag, read16_device_func func, const char *string) { internal_set_handler(devconfig, tag, func, string, 0); } void set_handler(const device_config &devconfig, const char *tag, write16_device_func func, const char *string) { internal_set_handler(devconfig, tag, func, string, 0); } void set_handler(const device_config &devconfig, const char *tag, read16_device_func rfunc, const char *rstring, write16_device_func wfunc, const char *wstring) { internal_set_handler(devconfig, tag, rfunc, rstring, wfunc, wstring, 0); } + void set_handler(const device_config &devconfig, const char *tag, read16_proto_delegate func) { internal_set_handler(devconfig, tag, func, 0); } + void set_handler(const device_config &devconfig, const char *tag, write16_proto_delegate func) { internal_set_handler(devconfig, tag, func, 0); } + void set_handler(const device_config &devconfig, const char *tag, read16_proto_delegate rfunc, write16_proto_delegate wfunc) { internal_set_handler(devconfig, tag, rfunc, wfunc, 0); } // 8-bit handlers void set_handler(read8_space_func func, const char *string, UINT16 mask) { internal_set_handler(func, string, mask); } @@ -285,6 +294,9 @@ public: void set_handler(const device_config &devconfig, const char *tag, read8_device_func func, const char *string, UINT16 mask) { internal_set_handler(devconfig, tag, func, string, mask); } void set_handler(const device_config &devconfig, const char *tag, write8_device_func func, const char *string, UINT16 mask) { internal_set_handler(devconfig, tag, func, string, mask); } void set_handler(const device_config &devconfig, const char *tag, read8_device_func rfunc, const char *rstring, write8_device_func wfunc, const char *wstring, UINT16 mask) { internal_set_handler(devconfig, tag, rfunc, rstring, wfunc, wstring, mask); } + void set_handler(const device_config &devconfig, const char *tag, read8_proto_delegate func, UINT16 mask) { internal_set_handler(devconfig, tag, func, mask); } + void set_handler(const device_config &devconfig, const char *tag, write8_proto_delegate func, UINT16 mask) { internal_set_handler(devconfig, tag, func, mask); } + void set_handler(const device_config &devconfig, const char *tag, read8_proto_delegate rfunc, write8_proto_delegate wfunc, UINT16 mask) { internal_set_handler(devconfig, tag, rfunc, wfunc, mask); } }; @@ -305,6 +317,9 @@ public: void set_handler(const device_config &devconfig, const char *tag, read32_device_func func, const char *string) { internal_set_handler(devconfig, tag, func, string, 0); } void set_handler(const device_config &devconfig, const char *tag, write32_device_func func, const char *string) { internal_set_handler(devconfig, tag, func, string, 0); } void set_handler(const device_config &devconfig, const char *tag, read32_device_func rfunc, const char *rstring, write32_device_func wfunc, const char *wstring) { internal_set_handler(devconfig, tag, rfunc, rstring, wfunc, wstring, 0); } + void set_handler(const device_config &devconfig, const char *tag, read32_proto_delegate func) { internal_set_handler(devconfig, tag, func, 0); } + void set_handler(const device_config &devconfig, const char *tag, write32_proto_delegate func) { internal_set_handler(devconfig, tag, func, 0); } + void set_handler(const device_config &devconfig, const char *tag, read32_proto_delegate rfunc, write32_proto_delegate wfunc) { internal_set_handler(devconfig, tag, rfunc, wfunc, 0); } // 16-bit handlers void set_handler(read16_space_func func, const char *string, UINT32 mask) { internal_set_handler(func, string, mask); } @@ -313,6 +328,9 @@ public: void set_handler(const device_config &devconfig, const char *tag, read16_device_func func, const char *string, UINT32 mask) { internal_set_handler(devconfig, tag, func, string, mask); } void set_handler(const device_config &devconfig, const char *tag, write16_device_func func, const char *string, UINT32 mask) { internal_set_handler(devconfig, tag, func, string, mask); } void set_handler(const device_config &devconfig, const char *tag, read16_device_func rfunc, const char *rstring, write16_device_func wfunc, const char *wstring, UINT32 mask) { internal_set_handler(devconfig, tag, rfunc, rstring, wfunc, wstring, mask); } + void set_handler(const device_config &devconfig, const char *tag, read16_proto_delegate func, UINT32 mask) { internal_set_handler(devconfig, tag, func, mask); } + void set_handler(const device_config &devconfig, const char *tag, write16_proto_delegate func, UINT32 mask) { internal_set_handler(devconfig, tag, func, mask); } + void set_handler(const device_config &devconfig, const char *tag, read16_proto_delegate rfunc, write16_proto_delegate wfunc, UINT32 mask) { internal_set_handler(devconfig, tag, rfunc, wfunc, mask); } // 8-bit handlers void set_handler(read8_space_func func, const char *string, UINT32 mask) { internal_set_handler(func, string, mask); } @@ -321,6 +339,9 @@ public: void set_handler(const device_config &devconfig, const char *tag, read8_device_func func, const char *string, UINT32 mask) { internal_set_handler(devconfig, tag, func, string, mask); } void set_handler(const device_config &devconfig, const char *tag, write8_device_func func, const char *string, UINT32 mask) { internal_set_handler(devconfig, tag, func, string, mask); } void set_handler(const device_config &devconfig, const char *tag, read8_device_func rfunc, const char *rstring, write8_device_func wfunc, const char *wstring, UINT32 mask) { internal_set_handler(devconfig, tag, rfunc, rstring, wfunc, wstring, mask); } + void set_handler(const device_config &devconfig, const char *tag, read8_proto_delegate func, UINT32 mask) { internal_set_handler(devconfig, tag, func, mask); } + void set_handler(const device_config &devconfig, const char *tag, write8_proto_delegate func, UINT32 mask) { internal_set_handler(devconfig, tag, func, mask); } + void set_handler(const device_config &devconfig, const char *tag, read8_proto_delegate rfunc, write8_proto_delegate wfunc, UINT32 mask) { internal_set_handler(devconfig, tag, rfunc, wfunc, mask); } }; @@ -341,6 +362,9 @@ public: void set_handler(const device_config &devconfig, const char *tag, read64_device_func func, const char *string) { internal_set_handler(devconfig, tag, func, string, 0); } void set_handler(const device_config &devconfig, const char *tag, write64_device_func func, const char *string) { internal_set_handler(devconfig, tag, func, string, 0); } void set_handler(const device_config &devconfig, const char *tag, read64_device_func rfunc, const char *rstring, write64_device_func wfunc, const char *wstring) { internal_set_handler(devconfig, tag, rfunc, rstring, wfunc, wstring, 0); } + void set_handler(const device_config &devconfig, const char *tag, read64_proto_delegate func) { internal_set_handler(devconfig, tag, func, 0); } + void set_handler(const device_config &devconfig, const char *tag, write64_proto_delegate func) { internal_set_handler(devconfig, tag, func, 0); } + void set_handler(const device_config &devconfig, const char *tag, read64_proto_delegate rfunc, write64_proto_delegate wfunc) { internal_set_handler(devconfig, tag, rfunc, wfunc, 0); } // 32-bit handlers void set_handler(read32_space_func func, const char *string, UINT64 mask) { internal_set_handler(func, string, mask); } @@ -349,6 +373,9 @@ public: void set_handler(const device_config &devconfig, const char *tag, read32_device_func func, const char *string, UINT64 mask) { internal_set_handler(devconfig, tag, func, string, mask); } void set_handler(const device_config &devconfig, const char *tag, write32_device_func func, const char *string, UINT64 mask) { internal_set_handler(devconfig, tag, func, string, mask); } void set_handler(const device_config &devconfig, const char *tag, read32_device_func rfunc, const char *rstring, write32_device_func wfunc, const char *wstring, UINT64 mask) { internal_set_handler(devconfig, tag, rfunc, rstring, wfunc, wstring, mask); } + void set_handler(const device_config &devconfig, const char *tag, read32_proto_delegate func, UINT64 mask) { internal_set_handler(devconfig, tag, func, mask); } + void set_handler(const device_config &devconfig, const char *tag, write32_proto_delegate func, UINT64 mask) { internal_set_handler(devconfig, tag, func, mask); } + void set_handler(const device_config &devconfig, const char *tag, read32_proto_delegate rfunc, write32_proto_delegate wfunc, UINT64 mask) { internal_set_handler(devconfig, tag, rfunc, wfunc, mask); } // 16-bit handlers void set_handler(read16_space_func func, const char *string, UINT64 mask) { internal_set_handler(func, string, mask); } @@ -357,6 +384,9 @@ public: void set_handler(const device_config &devconfig, const char *tag, read16_device_func func, const char *string, UINT64 mask) { internal_set_handler(devconfig, tag, func, string, mask); } void set_handler(const device_config &devconfig, const char *tag, write16_device_func func, const char *string, UINT64 mask) { internal_set_handler(devconfig, tag, func, string, mask); } void set_handler(const device_config &devconfig, const char *tag, read16_device_func rfunc, const char *rstring, write16_device_func wfunc, const char *wstring, UINT64 mask) { internal_set_handler(devconfig, tag, rfunc, rstring, wfunc, wstring, mask); } + void set_handler(const device_config &devconfig, const char *tag, read16_proto_delegate func, UINT64 mask) { internal_set_handler(devconfig, tag, func, mask); } + void set_handler(const device_config &devconfig, const char *tag, write16_proto_delegate func, UINT64 mask) { internal_set_handler(devconfig, tag, func, mask); } + void set_handler(const device_config &devconfig, const char *tag, read16_proto_delegate rfunc, write16_proto_delegate wfunc, UINT64 mask) { internal_set_handler(devconfig, tag, rfunc, wfunc, mask); } // 8-bit handlers void set_handler(read8_space_func func, const char *string, UINT64 mask) { internal_set_handler(func, string, mask); } @@ -365,6 +395,9 @@ public: void set_handler(const device_config &devconfig, const char *tag, read8_device_func func, const char *string, UINT64 mask) { internal_set_handler(devconfig, tag, func, string, mask); } void set_handler(const device_config &devconfig, const char *tag, write8_device_func func, const char *string, UINT64 mask) { internal_set_handler(devconfig, tag, func, string, mask); } void set_handler(const device_config &devconfig, const char *tag, read8_device_func rfunc, const char *rstring, write8_device_func wfunc, const char *wstring, UINT64 mask) { internal_set_handler(devconfig, tag, rfunc, rstring, wfunc, wstring, mask); } + void set_handler(const device_config &devconfig, const char *tag, read8_proto_delegate func, UINT64 mask) { internal_set_handler(devconfig, tag, func, mask); } + void set_handler(const device_config &devconfig, const char *tag, write8_proto_delegate func, UINT64 mask) { internal_set_handler(devconfig, tag, func, mask); } + void set_handler(const device_config &devconfig, const char *tag, read8_proto_delegate rfunc, write8_proto_delegate wfunc, UINT64 mask) { internal_set_handler(devconfig, tag, rfunc, wfunc, mask); } }; @@ -396,11 +429,7 @@ public: UINT8 m_databits; // data bits represented by the map UINT8 m_unmapval; // unmapped memory value offs_t m_globalmask; // global mask - address_map_entry * m_entrylist; // list of entries - -private: - // internal data - address_map_entry ** m_tailptr; + simple_list m_entrylist; // list of entries }; @@ -419,6 +448,8 @@ private: #define ADDRESS_MAP_START(_name, _space, _bits) \ void ADDRESS_MAP_NAME(_name)(address_map &map, const device_config &devconfig) \ { \ + typedef read##_bits##_proto_delegate read_proto_delegate; \ + typedef write##_bits##_proto_delegate write_proto_delegate; \ address_map_entry##_bits *curentry = NULL; \ (void)curentry; \ map.configure(_space, _bits); \ @@ -458,7 +489,7 @@ void ADDRESS_MAP_NAME(_name)(address_map &map, const device_config &devconfig) \ curentry->set_mirror(_mirror); \ -// space reads +// legacy space reads #define AM_READ(_handler) \ curentry->set_handler(_handler, #_handler); \ @@ -472,7 +503,7 @@ void ADDRESS_MAP_NAME(_name)(address_map &map, const device_config &devconfig) \ curentry->set_handler(_handler, #_handler, _unitmask); \ -// space writes +// legacy space writes #define AM_WRITE(_handler) \ curentry->set_handler(_handler, #_handler); \ @@ -486,7 +517,7 @@ void ADDRESS_MAP_NAME(_name)(address_map &map, const device_config &devconfig) \ curentry->set_handler(_handler, #_handler, _unitmask); \ -// space reads/writes +// legacy space reads/writes #define AM_READWRITE(_rhandler, _whandler) \ curentry->set_handler(_rhandler, #_rhandler, _whandler, #_whandler); \ @@ -500,7 +531,7 @@ void ADDRESS_MAP_NAME(_name)(address_map &map, const device_config &devconfig) \ curentry->set_handler(_rhandler, #_rhandler, _whandler, #_whandler, _unitmask); \ -// device reads +// legacy device reads #define AM_DEVREAD(_tag, _handler) \ curentry->set_handler(devconfig, _tag, _handler, #_handler); \ @@ -514,7 +545,7 @@ void ADDRESS_MAP_NAME(_name)(address_map &map, const device_config &devconfig) \ curentry->set_handler(devconfig, _tag, _handler, #_handler, _unitmask); \ -// device writes +// legacy device writes #define AM_DEVWRITE(_tag, _handler) \ curentry->set_handler(devconfig, _tag, _handler, #_handler); \ @@ -528,7 +559,7 @@ void ADDRESS_MAP_NAME(_name)(address_map &map, const device_config &devconfig) \ curentry->set_handler(devconfig, _tag, _handler, #_handler, _unitmask); \ -// device reads/writes +// legacy device reads/writes #define AM_DEVREADWRITE(_tag, _rhandler, _whandler) \ curentry->set_handler(devconfig, _tag, _rhandler, #_rhandler, _whandler, #_whandler); \ @@ -542,6 +573,90 @@ void ADDRESS_MAP_NAME(_name)(address_map &map, const device_config &devconfig) \ curentry->set_handler(devconfig, _tag, _rhandler, #_rhandler, _whandler, #_whandler, _unitmask); \ +// driver data reads +#define AM_READ_MEMBER(_class, _handler) \ + curentry->set_handler(devconfig, NULL, read_proto_delegate::_create_member<_class, &_class::_handler>(#_class "::" #_handler)); \ + +#define AM_READ8_MEMBER(_class, _handler, _unitmask) \ + curentry->set_handler(devconfig, NULL, read8_proto_delegate::_create_member<_class, &_class::_handler>(#_class "::" #_handler), _unitmask); \ + +#define AM_READ16_MEMBER(_class, _handler, _unitmask) \ + curentry->set_handler(devconfig, NULL, read16_proto_delegate::_create_member<_class, &_class::_handler>(#_class "::" #_handler), _unitmask); \ + +#define AM_READ32_MEMBER(_class, _handler, _unitmask) \ + curentry->set_handler(devconfig, NULL, read32_proto_delegate::_create_member<_class, &_class::_handler>(#_class "::" #_handler), _unitmask); \ + + +// driver data writes +#define AM_WRITE_MEMBER(_class, _handler) \ + curentry->set_handler(devconfig, NULL, write_proto_delegate::_create_member<_class, &_class::_handler>(#_class "::" #_handler)); \ + +#define AM_WRITE8_MEMBER(_class, _handler, _unitmask) \ + curentry->set_handler(devconfig, NULL, write8_proto_delegate::_create_member<_class, &_class::_handler>(#_class "::" #_handler), _unitmask); \ + +#define AM_WRITE16_MEMBER(_class, _handler, _unitmask) \ + curentry->set_handler(devconfig, NULL, write16_proto_delegate::_create_member<_class, &_class::_handler>(#_class "::" #_handler), _unitmask); \ + +#define AM_WRITE32_MEMBER(_class, _handler, _unitmask) \ + curentry->set_handler(devconfig, NULL, write32_proto_delegate::_create_member<_class, &_class::_handler>(#_class "::" #_handler), _unitmask); \ + + +// driver data reads/writes +#define AM_READWRITE_MEMBER(_class, _rhandler, _whandler) \ + curentry->set_handler(devconfig, NULL, read_proto_delegate::_create_member<_class, &_class::_rhandler>(#_class "::" #_rhandler), write_proto_delegate::_create_member<_class, &_class::_whandler>(#_class "::" #_whandler)); \ + +#define AM_READWRITE8_MEMBER(_class, _rhandler, _whandler, _unitmask) \ + curentry->set_handler(devconfig, NULL, read8_proto_delegate::_create_member<_class, &_class::_rhandler>(#_class "::" #_rhandler), write8_proto_delegate::_create_member<_class, &_class::_whandler>(#_class "::" #_whandler), _unitmask); \ + +#define AM_READWRITE16_MEMBER(_class, _rhandler, _whandler, _unitmask) \ + curentry->set_handler(devconfig, NULL, read16_proto_delegate::_create_member<_class, &_class::_rhandler>(#_class "::" #_rhandler), write16_proto_delegate::_create_member<_class, &_class::_whandler>(#_class "::" #_whandler), _unitmask); \ + +#define AM_READWRITE32_MEMBER(_class, _rhandler, _whandler, _unitmask) \ + curentry->set_handler(devconfig, NULL, read32_proto_delegate::_create_member<_class, &_class::_rhandler>(#_class "::" #_rhandler), write32_proto_delegate::_create_member<_class, &_class::_whandler>(#_class "::" #_whandler), _unitmask); \ + + +// device reads +#define AM_DEVREAD_MEMBER(_tag, _class, _handler) \ + curentry->set_handler(devconfig, _tag, read_proto_delegate::_create_member<_class, &_class::_handler>(#_class "::" #_handler)); \ + +#define AM_DEVREAD8_MEMBER(_tag, _class, _handler, _unitmask) \ + curentry->set_handler(devconfig, _tag, read8_proto_delegate::_create_member<_class, &_class::_handler>(#_class "::" #_handler), _unitmask); \ + +#define AM_DEVREAD16_MEMBER(_tag, _class, _handler, _unitmask) \ + curentry->set_handler(devconfig, _tag, read16_proto_delegate::_create_member<_class, &_class::_handler>(#_class "::" #_handler), _unitmask); \ + +#define AM_DEVREAD32_MEMBER(_tag, _class, _handler, _unitmask) \ + curentry->set_handler(devconfig, _tag, read32_proto_delegate::_create_member<_class, &_class::_handler>(#_class "::" #_handler), _unitmask); \ + + +// device writes +#define AM_DEVWRITE_MEMBER(_tag, _class, _handler) \ + curentry->set_handler(devconfig, _tag, write_proto_delegate::_create_member<_class, &_class::_handler>(#_class "::" #_handler)); \ + +#define AM_DEVWRITE8_MEMBER(_tag, _class, _handler, _unitmask) \ + curentry->set_handler(devconfig, _tag, write8_proto_delegate::_create_member<_class, &_class::_handler>(#_class "::" #_handler), _unitmask); \ + +#define AM_DEVWRITE16_MEMBER(_tag, _class, _handler, _unitmask) \ + curentry->set_handler(devconfig, _tag, write16_proto_delegate::_create_member<_class, &_class::_handler>(#_class "::" #_handler), _unitmask); \ + +#define AM_DEVWRITE32_MEMBER(_tag, _class, _handler, _unitmask) \ + curentry->set_handler(devconfig, _tag, write32_proto_delegate::_create_member<_class, &_class::_handler>(#_class "::" #_handler), _unitmask); \ + + +// device reads/writes +#define AM_DEVREADWRITE_MEMBER(_tag, _class, _rhandler, _whandler) \ + curentry->set_handler(devconfig, _tag, read_proto_delegate::_create_member<_class, &_class::_rhandler>(#_class "::" #_rhandler), write_proto_delegate::_create_member<_class, &_class::_whandler>(#_class "::" #_whandler)); \ + +#define AM_DEVREADWRITE8_MEMBER(_tag, _class, _rhandler, _whandler, _unitmask) \ + curentry->set_handler(devconfig, _tag, read8_proto_delegate::_create_member<_class, &_class::_rhandler>(#_class "::" #_rhandler), write8_proto_delegate::_create_member<_class, &_class::_whandler>(#_class "::" #_whandler), _unitmask); \ + +#define AM_DEVREADWRITE16_MEMBER(_tag, _class, _rhandler, _whandler, _unitmask) \ + curentry->set_handler(devconfig, _tag, read16_proto_delegate::_create_member<_class, &_class::_rhandler>(#_class "::" #_rhandler), write16_proto_delegate::_create_member<_class, &_class::_whandler>(#_class "::" #_whandler), _unitmask); \ + +#define AM_DEVREADWRITE32_MEMBER(_tag, _class, _rhandler, _whandler, _unitmask) \ + curentry->set_handler(devconfig, _tag, read32_proto_delegate::_create_member<_class, &_class::_rhandler>(#_class "::" #_rhandler), write32_proto_delegate::_create_member<_class, &_class::_whandler>(#_class "::" #_whandler), _unitmask); \ + + // special-case accesses #define AM_ROM \ curentry->set_read_type(AMH_ROM); \ @@ -624,12 +739,25 @@ void ADDRESS_MAP_NAME(_name)(address_map &map, const device_config &devconfig) \ #define AM_ROMBANK(_bank) AM_READ_BANK(_bank) #define AM_RAMBANK(_bank) AM_READWRITE_BANK(_bank) #define AM_RAM_READ(_read) AM_READ(_read) AM_WRITEONLY +#define AM_RAM_READ_MEMBER(_class, _read) AM_READ_MEMBER(_class, _read) AM_WRITEONLY #define AM_RAM_WRITE(_write) AM_READONLY AM_WRITE(_write) -#define AM_RAM_DEVREAD(_tag, _read) AM_DEVREAD(_tag, _read) AM_WRITEONLY -#define AM_RAM_DEVWRITE(_tag, _write) AM_READONLY AM_DEVWRITE(_tag, _write) +#define AM_RAM_WRITE_MEMBER(_class, _write) AM_READONLY AM_WRITE_MEMBER(_class, _write) +#define AM_RAM_DEVREAD(_tag, _read) AM_DEVREAD(_tag, _read) AM_WRITEONLY +#define AM_RAM_DEVREAD_MEMBER(_tag, _class, _read) AM_DEVREAD_MEMBER(_tag, _class, _read) AM_WRITEONLY +#define AM_RAM_DEVWRITE(_tag, _write) AM_READONLY AM_DEVWRITE(_tag, _write) +#define AM_RAM_DEVWRITE_MEMBER(_tag, _class, _write) AM_READONLY AM_DEVWRITE_MEMBER(_tag, _class, _write) #define AM_BASE_SIZE_MEMBER(_struct, _base, _size) AM_BASE_MEMBER(_struct, _base) AM_SIZE_MEMBER(_struct, _size) #define AM_BASE_SIZE_GENERIC(_member) AM_BASE_GENERIC(_member) AM_SIZE_GENERIC(_member) + +//************************************************************************** +// GLOBAL VARIABLES +//************************************************************************** + +// use this to refer to the owning device when providing a device tag +static const char DEVICE_SELF[] = ""; + + #endif /* __ADDRMAP_H__ */ -- cgit v1.2.3-70-g09d2