summaryrefslogtreecommitdiffstatshomepage
path: root/src/emu/devlegcy.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/emu/devlegcy.h')
-rw-r--r--src/emu/devlegcy.h583
1 files changed, 583 insertions, 0 deletions
diff --git a/src/emu/devlegcy.h b/src/emu/devlegcy.h
new file mode 100644
index 00000000000..2632dccbfd7
--- /dev/null
+++ b/src/emu/devlegcy.h
@@ -0,0 +1,583 @@
+/***************************************************************************
+
+ devlegcy.h
+
+ Legacy device helpers.
+
+****************************************************************************
+
+ Copyright Aaron Giles
+ All rights reserved.
+
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions are
+ met:
+
+ * Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+ * Neither the name 'MAME' nor the names of its contributors may be
+ used to endorse or promote products derived from this software
+ without specific prior written permission.
+
+ THIS SOFTWARE IS PROVIDED BY AARON GILES ''AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ DISCLAIMED. IN NO EVENT SHALL AARON GILES BE LIABLE FOR ANY DIRECT,
+ INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
+ IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ POSSIBILITY OF SUCH DAMAGE.
+
+***************************************************************************/
+
+#pragma once
+
+#ifndef __DEVLEGCY_H__
+#define __DEVLEGCY_H__
+
+
+
+//**************************************************************************
+// CONSTANTS
+//**************************************************************************
+
+// state constants passed to the device_get_config_func
+enum
+{
+ // --- the following bits of info are returned as 64-bit signed integers ---
+ DEVINFO_INT_FIRST = 0x00000,
+
+ DEVINFO_INT_TOKEN_BYTES = DEVINFO_INT_FIRST, // R/O: bytes to allocate for the token
+ DEVINFO_INT_INLINE_CONFIG_BYTES, // R/O: bytes to allocate for the inline configuration
+
+ DEVINFO_INT_ENDIANNESS, // R/O: either ENDIANNESS_BIG or ENDIANNESS_LITTLE
+ DEVINFO_INT_DATABUS_WIDTH, // R/O: data bus size for each address space (8,16,32,64)
+ DEVINFO_INT_DATABUS_WIDTH_0 = DEVINFO_INT_DATABUS_WIDTH + 0,
+ DEVINFO_INT_DATABUS_WIDTH_1 = DEVINFO_INT_DATABUS_WIDTH + 1,
+ DEVINFO_INT_DATABUS_WIDTH_2 = DEVINFO_INT_DATABUS_WIDTH + 2,
+ DEVINFO_INT_DATABUS_WIDTH_3 = DEVINFO_INT_DATABUS_WIDTH + 3,
+ DEVINFO_INT_DATABUS_WIDTH_LAST = DEVINFO_INT_DATABUS_WIDTH + ADDRESS_SPACES - 1,
+ DEVINFO_INT_ADDRBUS_WIDTH, // R/O: address bus size for each address space (12-32)
+ DEVINFO_INT_ADDRBUS_WIDTH_0 = DEVINFO_INT_ADDRBUS_WIDTH + 0,
+ DEVINFO_INT_ADDRBUS_WIDTH_1 = DEVINFO_INT_ADDRBUS_WIDTH + 1,
+ DEVINFO_INT_ADDRBUS_WIDTH_2 = DEVINFO_INT_ADDRBUS_WIDTH + 2,
+ DEVINFO_INT_ADDRBUS_WIDTH_3 = DEVINFO_INT_ADDRBUS_WIDTH + 3,
+ DEVINFO_INT_ADDRBUS_WIDTH_LAST = DEVINFO_INT_ADDRBUS_WIDTH + ADDRESS_SPACES - 1,
+ DEVINFO_INT_ADDRBUS_SHIFT, // R/O: shift applied to addresses each address space (+3 means >>3, -1 means <<1)
+ DEVINFO_INT_ADDRBUS_SHIFT_0 = DEVINFO_INT_ADDRBUS_SHIFT + 0,
+ DEVINFO_INT_ADDRBUS_SHIFT_1 = DEVINFO_INT_ADDRBUS_SHIFT + 1,
+ DEVINFO_INT_ADDRBUS_SHIFT_2 = DEVINFO_INT_ADDRBUS_SHIFT + 2,
+ DEVINFO_INT_ADDRBUS_SHIFT_3 = DEVINFO_INT_ADDRBUS_SHIFT + 3,
+ DEVINFO_INT_ADDRBUS_SHIFT_LAST = DEVINFO_INT_ADDRBUS_SHIFT + ADDRESS_SPACES - 1,
+
+ DEVINFO_INT_CLASS_SPECIFIC = 0x04000, // R/W: device-specific values start here
+ DEVINFO_INT_DEVICE_SPECIFIC = 0x08000, // R/W: device-specific values start here
+ DEVINFO_INT_LAST = 0x0ffff,
+
+ // --- the following bits of info are returned as pointers ---
+ DEVINFO_PTR_FIRST = 0x10000,
+
+ DEVINFO_PTR_ROM_REGION = DEVINFO_PTR_FIRST, // R/O: pointer to device-specific ROM region
+ DEVINFO_PTR_MACHINE_CONFIG, // R/O: pointer to device-specific machine config
+
+ DEVINFO_PTR_INTERNAL_MEMORY_MAP, // R/O: const addrmap_token *map
+ DEVINFO_PTR_INTERNAL_MEMORY_MAP_0 = DEVINFO_PTR_INTERNAL_MEMORY_MAP + 0,
+ DEVINFO_PTR_INTERNAL_MEMORY_MAP_1 = DEVINFO_PTR_INTERNAL_MEMORY_MAP + 1,
+ DEVINFO_PTR_INTERNAL_MEMORY_MAP_2 = DEVINFO_PTR_INTERNAL_MEMORY_MAP + 2,
+ DEVINFO_PTR_INTERNAL_MEMORY_MAP_3 = DEVINFO_PTR_INTERNAL_MEMORY_MAP + 3,
+ DEVINFO_PTR_INTERNAL_MEMORY_MAP_LAST = DEVINFO_PTR_INTERNAL_MEMORY_MAP + ADDRESS_SPACES - 1,
+
+ DEVINFO_PTR_DEFAULT_MEMORY_MAP, // R/O: const addrmap_token *map
+ DEVINFO_PTR_DEFAULT_MEMORY_MAP_0 = DEVINFO_PTR_DEFAULT_MEMORY_MAP + 0,
+ DEVINFO_PTR_DEFAULT_MEMORY_MAP_1 = DEVINFO_PTR_DEFAULT_MEMORY_MAP + 1,
+ DEVINFO_PTR_DEFAULT_MEMORY_MAP_2 = DEVINFO_PTR_DEFAULT_MEMORY_MAP + 2,
+ DEVINFO_PTR_DEFAULT_MEMORY_MAP_3 = DEVINFO_PTR_DEFAULT_MEMORY_MAP + 3,
+ DEVINFO_PTR_DEFAULT_MEMORY_MAP_LAST = DEVINFO_PTR_DEFAULT_MEMORY_MAP + ADDRESS_SPACES - 1,
+
+ DEVINFO_PTR_CLASS_SPECIFIC = 0x14000, // R/W: device-specific values start here
+ DEVINFO_PTR_DEVICE_SPECIFIC = 0x18000, // R/W: device-specific values start here
+ DEVINFO_PTR_LAST = 0x1ffff,
+
+ // --- the following bits of info are returned as pointers to functions ---
+ DEVINFO_FCT_FIRST = 0x20000,
+
+ DEVINFO_FCT_START = DEVINFO_FCT_FIRST, // R/O: device_start_func
+ DEVINFO_FCT_STOP, // R/O: device_stop_func
+ DEVINFO_FCT_RESET, // R/O: device_reset_func
+ DEVINFO_FCT_EXECUTE, // R/O: device_execute_func
+ DEVINFO_FCT_NVRAM, // R/O: device_nvram_func
+
+ DEVINFO_FCT_CLASS_SPECIFIC = 0x24000, // R/W: device-specific values start here
+ DEVINFO_FCT_DEVICE_SPECIFIC = 0x28000, // R/W: device-specific values start here
+ DEVINFO_FCT_LAST = 0x2ffff,
+
+ // --- the following bits of info are returned as NULL-terminated strings ---
+ DEVINFO_STR_FIRST = 0x30000,
+
+ DEVINFO_STR_NAME = DEVINFO_STR_FIRST, // R/O: name of the device
+ DEVINFO_STR_FAMILY, // R/O: family of the device
+ DEVINFO_STR_VERSION, // R/O: version of the device
+ DEVINFO_STR_SOURCE_FILE, // R/O: file containing the device implementation
+ DEVINFO_STR_CREDITS, // R/O: credits for the device implementation
+
+ DEVINFO_STR_CLASS_SPECIFIC = 0x34000, // R/W: device-specific values start here
+ DEVINFO_STR_DEVICE_SPECIFIC = 0x38000, // R/W: device-specific values start here
+ DEVINFO_STR_LAST = 0x3ffff
+};
+
+
+
+//**************************************************************************
+// MACROS
+//**************************************************************************
+
+#define DEVICE_GET_INFO_NAME(name) device_get_config_##name
+#define DEVICE_GET_INFO(name) void DEVICE_GET_INFO_NAME(name)(const device_config *device, UINT32 state, deviceinfo *info)
+#define DEVICE_GET_INFO_CALL(name) DEVICE_GET_INFO_NAME(name)(device, state, info)
+
+#define DEVICE_START_NAME(name) device_start_##name
+#define DEVICE_START(name) void DEVICE_START_NAME(name)(device_t *device)
+#define DEVICE_START_CALL(name) DEVICE_START_NAME(name)(device)
+
+#define DEVICE_STOP_NAME(name) device_stop_##name
+#define DEVICE_STOP(name) void DEVICE_STOP_NAME(name)(device_t *device)
+#define DEVICE_STOP_CALL(name) DEVICE_STOP_NAME(name)(device)
+
+#define DEVICE_RESET_NAME(name) device_reset_##name
+#define DEVICE_RESET(name) void DEVICE_RESET_NAME(name)(device_t *device)
+#define DEVICE_RESET_CALL(name) DEVICE_RESET_NAME(name)(device)
+
+#define DEVICE_EXECUTE_NAME(name) device_execute_##name
+#define DEVICE_EXECUTE(name) INT32 DEVICE_EXECUTE_NAME(name)(device_t *device, INT32 clocks)
+#define DEVICE_EXECUTE_CALL(name) DEVICE_EXECUTE_NAME(name)(device, clocks)
+
+#define DEVICE_NVRAM_NAME(name) device_nvram_##name
+#define DEVICE_NVRAM(name) void DEVICE_NVRAM_NAME(name)(device_t *device, mame_file *file, int read_or_write)
+#define DEVICE_NVRAM_CALL(name) DEVICE_NVRAM_NAME(name)(device, file, read_or_write)
+
+
+// defined types and such for a standard legacy device
+#define DECLARE_LEGACY_DEVICE(name, basename) \
+ DEVICE_GET_INFO( basename ); \
+ typedef legacy_device< \
+ DEVICE_GET_INFO_NAME(basename), \
+ legacy_device_base \
+ > basename##_device; \
+ typedef legacy_device_config< \
+ DEVICE_GET_INFO_NAME(basename), \
+ legacy_device_config_base, \
+ basename##_device \
+ > basename##_device_config; \
+ const device_type name = basename##_device_config::static_alloc_device_config
+
+
+// defined types and such for a sound legacy device
+#define DECLARE_LEGACY_SOUND_DEVICE(name, basename) \
+ DEVICE_GET_INFO( basename ); \
+ typedef legacy_device< \
+ DEVICE_GET_INFO_NAME(basename), \
+ legacy_sound_device_base \
+ > basename##_sound_device; \
+ typedef legacy_device_config< \
+ DEVICE_GET_INFO_NAME(basename), \
+ legacy_sound_device_config_base, \
+ basename##_sound_device \
+ > basename##_sound_device_config; \
+ const device_type SOUND_##name = basename##_sound_device_config::static_alloc_device_config
+
+
+// defined types and such for a memory legacy device
+#define DECLARE_LEGACY_MEMORY_DEVICE(name, basename) \
+ DEVICE_GET_INFO( basename ); \
+ typedef legacy_device< \
+ DEVICE_GET_INFO_NAME(basename), \
+ legacy_memory_device_base \
+ > basename##_device; \
+ typedef legacy_device_config< \
+ DEVICE_GET_INFO_NAME(basename), \
+ legacy_memory_device_config_base, \
+ basename##_device \
+ > basename##_device_config; \
+ const device_type name = basename##_device_config::static_alloc_device_config
+
+
+// defined types and such for a memory legacy device
+#define DECLARE_LEGACY_NVRAM_DEVICE(name, basename) \
+ DEVICE_GET_INFO( basename ); \
+ typedef legacy_device< \
+ DEVICE_GET_INFO_NAME(basename), \
+ legacy_nvram_device_base \
+ > basename##_device; \
+ typedef legacy_device_config< \
+ DEVICE_GET_INFO_NAME(basename), \
+ legacy_nvram_device_config_base, \
+ basename##_device \
+ > basename##_device_config; \
+ const device_type name = basename##_device_config::static_alloc_device_config
+
+
+
+//**************************************************************************
+// DEVICE_CONFIGURATION_MACROS
+//**************************************************************************
+
+// inline device configurations that require 32 bits of storage in the token
+#define MDRV_DEVICE_CONFIG_DATA32_EXPLICIT(_size, _offset, _val) \
+ TOKEN_UINT32_PACK3(MCONFIG_TOKEN_DEVICE_CONFIG_DATA32, 8, _size, 4, _offset, 12), \
+ TOKEN_UINT32((UINT32)(_val)),
+
+#define MDRV_DEVICE_CONFIG_DATA32(_struct, _field, _val) \
+ MDRV_DEVICE_CONFIG_DATA32_EXPLICIT(structsizeof(_struct, _field), offsetof(_struct, _field), _val)
+
+#define MDRV_DEVICE_CONFIG_DATA32_ARRAY(_struct, _field, _index, _val) \
+ MDRV_DEVICE_CONFIG_DATA32_EXPLICIT(structsizeof(_struct, _field[0]), offsetof(_struct, _field) + (_index) * structsizeof(_struct, _field[0]), _val)
+
+#define MDRV_DEVICE_CONFIG_DATA32_ARRAY_MEMBER(_struct, _field, _index, _memstruct, _member, _val) \
+ MDRV_DEVICE_CONFIG_DATA32_EXPLICIT(structsizeof(_memstruct, _member), offsetof(_struct, _field) + (_index) * structsizeof(_struct, _field[0]) + offsetof(_memstruct, _member), _val)
+
+#define MDRV_NEW_DEVICE_CONFIG_DATA32(_struct, _field, _val) \
+ MDRV_DEVICE_CONFIG_DATA32_EXPLICIT(DEVCONFIG_SIZEOF(_struct, _field), DEVCONFIG_OFFSETOF(_struct, _field), _val)
+
+#define MDRV_NEW_DEVICE_CONFIG_DATA32_ARRAY(_struct, _field, _index, _val) \
+ MDRV_DEVICE_CONFIG_DATA32_EXPLICIT(DEVCONFIG_SIZEOF(_struct, _field[0]), DEVCONFIG_OFFSETOF(_struct, _field) + (_index) * DEVCONFIG_SIZEOF(_struct, _field[0]), _val)
+
+#define MDRV_NEW_DEVICE_CONFIG_DATA32_ARRAY_MEMBER(_struct, _field, _index, _memstruct, _member, _val) \
+ MDRV_DEVICE_CONFIG_DATA32_EXPLICIT(DEVCONFIG_SIZEOF(_memstruct, _member), DEVCONFIG_OFFSETOF(_struct, _field) + (_index) * DEVCONFIG_SIZEOF(_struct, _field[0]) + DEVCONFIG_OFFSETOF(_memstruct, _member), _val)
+
+
+// inline device configurations that require 32 bits of fixed-point storage in the token
+#define MDRV_DEVICE_CONFIG_DATAFP32_EXPLICIT(_size, _offset, _val, _fixbits) \
+ TOKEN_UINT32_PACK4(MCONFIG_TOKEN_DEVICE_CONFIG_DATAFP32, 8, _size, 4, _fixbits, 6, _offset, 12), \
+ TOKEN_UINT32((INT32)((float)(_val) * (float)(1 << (_fixbits)))),
+
+#define MDRV_DEVICE_CONFIG_DATAFP32(_struct, _field, _val, _fixbits) \
+ MDRV_DEVICE_CONFIG_DATAFP32_EXPLICIT(structsizeof(_struct, _field), offsetof(_struct, _field), _val, _fixbits)
+
+#define MDRV_DEVICE_CONFIG_DATAFP32_ARRAY(_struct, _field, _index, _val, _fixbits) \
+ MDRV_DEVICE_CONFIG_DATAFP32_EXPLICIT(structsizeof(_struct, _field[0]), offsetof(_struct, _field) + (_index) * structsizeof(_struct, _field[0]), _val, _fixbits)
+
+#define MDRV_DEVICE_CONFIG_DATAFP32_ARRAY_MEMBER(_struct, _field, _index, _memstruct, _member, _val, _fixbits) \
+ MDRV_DEVICE_CONFIG_DATAFP32_EXPLICIT(structsizeof(_memstruct, _member), offsetof(_struct, _field) + (_index) * structsizeof(_struct, _field[0]) + offsetof(_memstruct, _member), _val, _fixbits)
+
+#define MDRV_DEVICE_NEW_CONFIG_DATAFP32(_struct, _field, _val, _fixbits) \
+ MDRV_DEVICE_CONFIG_DATAFP32_EXPLICIT(DEVCONFIG_SIZEOF(_struct, _field), DEVCONFIG_OFFSETOF(_struct, _field), _val, _fixbits)
+
+#define MDRV_DEVICE_NEW_CONFIG_DATAFP32_ARRAY(_struct, _field, _index, _val, _fixbits) \
+ MDRV_DEVICE_CONFIG_DATAFP32_EXPLICIT(DEVCONFIG_SIZEOF(_struct, _field[0]), DEVCONFIG_OFFSETOF(_struct, _field) + (_index) * DEVCONFIG_SIZEOF(_struct, _field[0]), _val, _fixbits)
+
+#define MDRV_DEVICE_NEW_CONFIG_DATAFP32_ARRAY_MEMBER(_struct, _field, _index, _memstruct, _member, _val, _fixbits) \
+ MDRV_DEVICE_CONFIG_DATAFP32_EXPLICIT(DEVCONFIG_SIZEOF(_memstruct, _member), DEVCONFIG_OFFSETOF(_struct, _field) + (_index) * DEVCONFIG_SIZEOF(_struct, _field[0]) + DEVCONFIG_OFFSETOF(_memstruct, _member), _val, _fixbits)
+
+
+// inline device configurations that require 64 bits of storage in the token
+#define MDRV_DEVICE_CONFIG_DATA64_EXPLICIT(_size, _offset, _val) \
+ TOKEN_UINT32_PACK3(MCONFIG_TOKEN_DEVICE_CONFIG_DATA64, 8, _size, 4, _offset, 12), \
+ TOKEN_UINT64((UINT64)(_val)),
+
+#define MDRV_DEVICE_CONFIG_DATA64(_struct, _field, _val) \
+ MDRV_DEVICE_CONFIG_DATA64_EXPLICIT(structsizeof(_struct, _field), offsetof(_struct, _field), _val)
+
+#define MDRV_DEVICE_CONFIG_DATA64_ARRAY(_struct, _field, _index, _val) \
+ MDRV_DEVICE_CONFIG_DATA64_EXPLICIT(structsizeof(_struct, _field[0]), offsetof(_struct, _field) + (_index) * structsizeof(_struct, _field[0]), _val)
+
+#define MDRV_DEVICE_CONFIG_DATA64_ARRAY_MEMBER(_struct, _field, _index, _memstruct, _member, _val) \
+ MDRV_DEVICE_CONFIG_DATA64_EXPLICIT(structsizeof(_memstruct, _member), offsetof(_struct, _field) + (_index) * structsizeof(_struct, _field[0]) + offsetof(_memstruct, _member), _val)
+
+#define MDRV_DEVICE_NEW_CONFIG_DATA64(_struct, _field, _val) \
+ MDRV_DEVICE_CONFIG_DATA64_EXPLICIT(DEVCONFIG_SIZEOF(_struct, _field), DEVCONFIG_OFFSETOF(_struct, _field), _val)
+
+#define MDRV_DEVICE_NEW_CONFIG_DATA64_ARRAY(_struct, _field, _index, _val) \
+ MDRV_DEVICE_CONFIG_DATA64_EXPLICIT(DEVCONFIG_SIZEOF(_struct, _field[0]), DEVCONFIG_OFFSETOF(_struct, _field) + (_index) * DEVCONFIG_SIZEOF(_struct, _field[0]), _val)
+
+#define MDRV_DEVICE_NEW_CONFIG_DATA64_ARRAY_MEMBER(_struct, _field, _index, _memstruct, _member, _val) \
+ MDRV_DEVICE_CONFIG_DATA64_EXPLICIT(DEVCONFIG_SIZEOF(_memstruct, _member), DEVCONFIG_OFFSETOF(_struct, _field) + (_index) * DEVCONFIG_SIZEOF(_struct, _field[0]) + DEVCONFIG_OFFSETOF(_memstruct, _member), _val)
+
+
+// inline device configurations that require a pointer-sized amount of storage in the token
+#ifdef PTR64
+#define MDRV_DEVICE_CONFIG_DATAPTR_EXPLICIT(_struct, _size, _offset) MDRV_DEVICE_CONFIG_DATA64_EXPLICIT(_struct, _size, _offset)
+#define MDRV_DEVICE_CONFIG_DATAPTR(_struct, _field, _val) MDRV_DEVICE_CONFIG_DATA64(_struct, _field, _val)
+#define MDRV_DEVICE_CONFIG_DATAPTR_ARRAY(_struct, _field, _index, _val) MDRV_DEVICE_CONFIG_DATA64_ARRAY(_struct, _field, _index, _val)
+#define MDRV_DEVICE_CONFIG_DATAPTR_ARRAY_MEMBER(_struct, _field, _index, _memstruct, _member, _val) MDRV_DEVICE_CONFIG_DATA64_ARRAY_MEMBER(_struct, _field, _index, _memstruct, _member, _val)
+#define MDRV_DEVICE_NEW_CONFIG_DATAPTR(_struct, _field, _val) MDRV_DEVICE_NEW_CONFIG_DATA64(_struct, _field, _val)
+#define MDRV_DEVICE_NEW_CONFIG_DATAPTR_ARRAY(_struct, _field, _index, _val) MDRV_DEVICE_NEW_CONFIG_DATA64_ARRAY(_struct, _field, _index, _val)
+#define MDRV_DEVICE_NEW_CONFIG_DATAPTR_ARRAY_MEMBER(_struct, _field, _index, _memstruct, _member, _val) MDRV_DEVICE_NEW_CONFIG_DATA64_ARRAY_MEMBER(_struct, _field, _index, _memstruct, _member, _val)
+#else
+#define MDRV_DEVICE_CONFIG_DATAPTR_EXPLICIT(_struct, _size, _offset) MDRV_DEVICE_CONFIG_DATA32_EXPLICIT(_struct, _size, _offset)
+#define MDRV_DEVICE_CONFIG_DATAPTR(_struct, _field, _val) MDRV_DEVICE_CONFIG_DATA32(_struct, _field, _val)
+#define MDRV_DEVICE_CONFIG_DATAPTR_ARRAY(_struct, _field, _index, _val) MDRV_DEVICE_CONFIG_DATA32_ARRAY(_struct, _field, _index, _val)
+#define MDRV_DEVICE_CONFIG_DATAPTR_ARRAY_MEMBER(_struct, _field, _index, _memstruct, _member, _val) MDRV_DEVICE_CONFIG_DATA32_ARRAY_MEMBER(_struct, _field, _index, _memstruct, _member, _val)
+#define MDRV_DEVICE_CONFIG_NEW_DATAPTR(_struct, _field, _val) MDRV_DEVICE_NEW_CONFIG_DATA32(_struct, _field, _val)
+#define MDRV_DEVICE_CONFIG_NEW_DATAPTR_ARRAY(_struct, _field, _index, _val) MDRV_DEVICE_NEW_CONFIG_DATA32_ARRAY(_struct, _field, _index, _val)
+#define MDRV_DEVICE_CONFIG_NEW_DATAPTR_ARRAY_MEMBER(_struct, _field, _index, _memstruct, _member, _val) MDRV_DEVICE_NEW_CONFIG_DATA32_ARRAY_MEMBER(_struct, _field, _index, _memstruct, _member, _val)
+#endif
+
+
+
+//**************************************************************************
+// TYPE DEFINITIONS
+//**************************************************************************
+
+union deviceinfo;
+
+char *get_temp_string_buffer(void);
+resource_pool &machine_get_pool(running_machine &machine);
+
+
+// device interface function types
+typedef void (*device_get_config_func)(const device_config *device, UINT32 state, deviceinfo *info);
+
+typedef void (*device_start_func)(device_t *device);
+typedef void (*device_stop_func)(device_t *device);
+typedef INT32 (*device_execute_func)(device_t *device, INT32 clocks);
+typedef void (*device_reset_func)(device_t *device);
+typedef void (*device_nvram_func)(device_t *device, mame_file *file, int read_or_write);
+
+
+// the actual deviceinfo union
+union deviceinfo
+{
+ INT64 i; // generic integers
+ void * p; // generic pointers
+ genf * f; // generic function pointers
+ char * s; // generic strings
+
+ device_start_func start; // DEVINFO_FCT_START
+ device_stop_func stop; // DEVINFO_FCT_STOP
+ device_reset_func reset; // DEVINFO_FCT_RESET
+ device_execute_func execute; // DEVINFO_FCT_EXECUTE
+ device_nvram_func nvram; // DEVINFO_FCT_NVRAM
+ const rom_entry * romregion; // DEVINFO_PTR_ROM_REGION
+ const machine_config_token *machine_config; // DEVINFO_PTR_MACHINE_CONFIG
+ const addrmap8_token * internal_map8; // DEVINFO_PTR_INTERNAL_MEMORY_MAP
+ const addrmap16_token * internal_map16; // DEVINFO_PTR_INTERNAL_MEMORY_MAP
+ const addrmap32_token * internal_map32; // DEVINFO_PTR_INTERNAL_MEMORY_MAP
+ const addrmap64_token * internal_map64; // DEVINFO_PTR_INTERNAL_MEMORY_MAP
+ const addrmap8_token * default_map8; // DEVINFO_PTR_DEFAULT_MEMORY_MAP
+ const addrmap16_token * default_map16; // DEVINFO_PTR_DEFAULT_MEMORY_MAP
+ const addrmap32_token * default_map32; // DEVINFO_PTR_DEFAULT_MEMORY_MAP
+ const addrmap64_token * default_map64; // DEVINFO_PTR_DEFAULT_MEMORY_MAP
+};
+
+
+// ======================> legacy_device_config_base
+
+// legacy_device_config_base describes a base configuration class for legacy devices
+class legacy_device_config_base : public device_config
+{
+ friend class legacy_device_base;
+ friend class legacy_nvram_device_base;
+
+protected:
+ // construction/destruction
+ legacy_device_config_base(const machine_config &mconfig, device_type type, const char *tag, const device_config *owner, UINT32 clock, device_get_config_func get_config);
+ virtual ~legacy_device_config_base();
+
+ // allocators - defined in derived classes
+
+ // basic information getters
+public:
+ virtual const char *name() const { return get_legacy_config_string(DEVINFO_STR_NAME); }
+ virtual const rom_entry *rom_region() const { return reinterpret_cast<const rom_entry *>(get_legacy_config_ptr(DEVINFO_PTR_ROM_REGION)); }
+ virtual const machine_config_token *machine_config_tokens() const { return reinterpret_cast<const machine_config_token *>(get_legacy_config_ptr(DEVINFO_PTR_MACHINE_CONFIG)); }
+
+ // access to legacy inline configuartion
+ void *inline_config() const { return m_inline_config; }
+
+protected:
+ // access to legacy configuration info
+ INT64 get_legacy_config_int(UINT32 state) const;
+ void *get_legacy_config_ptr(UINT32 state) const;
+ genf *get_legacy_config_fct(UINT32 state) const;
+ const char *get_legacy_config_string(UINT32 state) const;
+
+ // internal state
+ device_get_config_func m_get_config_func;
+ void * m_inline_config;
+};
+
+
+
+// ======================> legacy_device_base
+
+// legacy_device_base serves as a common base class for legacy devices
+class legacy_device_base : public device_t
+{
+protected:
+ // construction/destruction
+ legacy_device_base(running_machine &_machine, const device_config &config);
+ virtual ~legacy_device_base();
+
+public:
+ // access to legacy token
+ void *token() const { return m_token; }
+
+protected:
+ // device-level overrides
+ virtual void device_start();
+ virtual void device_reset();
+
+ // internal state
+ const legacy_device_config_base & m_config;
+ void * m_token;
+};
+
+
+
+// ======================> legacy_sound_device_config_base
+
+// legacy_sound_device_config is a device_config with a sound interface
+class legacy_sound_device_config_base : public legacy_device_config_base,
+ public device_config_sound_interface
+{
+protected:
+ // construction/destruction
+ legacy_sound_device_config_base(const machine_config &mconfig, device_type type, const char *tag, const device_config *owner, UINT32 clock, device_get_config_func get_config);
+};
+
+
+
+// ======================> legacy_sound_device_base
+
+// legacy_sound_device is a legacy_device_base with a sound interface
+class legacy_sound_device_base : public legacy_device_base,
+ public device_sound_interface
+{
+protected:
+ // construction/destruction
+ legacy_sound_device_base(running_machine &machine, const device_config &config);
+};
+
+
+
+// ======================> legacy_memory_device_config_base
+
+// legacy_memory_device_config is a device_config with a memory interface
+class legacy_memory_device_config_base : public legacy_device_config_base,
+ public device_config_memory_interface
+{
+protected:
+ // construction/destruction
+ legacy_memory_device_config_base(const machine_config &mconfig, device_type type, const char *tag, const device_config *owner, UINT32 clock, device_get_config_func get_config);
+
+ // device_config overrides
+ virtual void device_config_complete();
+
+ // device_config_memory_interface overrides
+ virtual const address_space_config *memory_space_config(int spacenum = 0) const { return (spacenum == 0) ? &m_space_config : NULL; }
+
+ // internal state
+ address_space_config m_space_config;
+};
+
+
+
+// ======================> legacy_memory_device_base
+
+// legacy_memory_device is a legacy_device_base with a memory interface
+class legacy_memory_device_base : public legacy_device_base,
+ public device_memory_interface
+{
+protected:
+ // construction/destruction
+ legacy_memory_device_base(running_machine &machine, const device_config &config);
+};
+
+
+
+// ======================> legacy_nvram_device_config
+
+// legacy_nvram_device_config is a device_config with a nvram interface
+class legacy_nvram_device_config_base : public legacy_device_config_base,
+ public device_config_nvram_interface
+{
+protected:
+ // construction/destruction
+ legacy_nvram_device_config_base(const machine_config &mconfig, device_type type, const char *tag, const device_config *owner, UINT32 clock, device_get_config_func get_config);
+};
+
+
+
+// ======================> legacy_nvram_device
+
+// legacy_nvram_device is a legacy_device_base with a nvram interface
+class legacy_nvram_device_base : public legacy_device_base,
+ public device_nvram_interface
+{
+protected:
+ // construction/destruction
+ legacy_nvram_device_base(running_machine &machine, const device_config &config);
+
+ // device_nvram_interface overrides
+ virtual void nvram_default();
+ virtual void nvram_read(mame_file &file);
+ virtual void nvram_write(mame_file &file);
+};
+
+
+// ======================> legacy_device_config
+
+// legacy_device_config template describes a new device_config derivative that implements
+// the old device callbacks
+template<
+ device_get_config_func _get_config,
+ class _config_base,
+ class _running_class
+>
+class legacy_device_config : public _config_base
+{
+ // construction/destruction
+ legacy_device_config(const machine_config &mconfig, device_type type, const char *tag, const device_config *owner, UINT32 clock)
+ : _config_base(mconfig, type, tag, owner, clock, _get_config)
+ {
+ }
+
+public:
+ // allocators
+ static device_config *static_alloc_device_config(const machine_config &mconfig, const char *tag, const device_config *owner, UINT32 clock)
+ {
+ return global_alloc(legacy_device_config(mconfig, static_alloc_device_config, tag, owner, clock));
+ }
+
+ virtual device_t *alloc_device(running_machine &machine) const
+ {
+ return pool_alloc(machine_get_pool(machine), _running_class(machine, *this));
+// return auto_alloc(&machine, device_t(machine, *this));
+ }
+};
+
+
+
+// ======================> legacy_device
+
+// legacy_device template describes a new device_t derivative that implements
+// the old device callbacks
+template<
+ device_get_config_func _get_config,
+ class _device_base
+>
+class legacy_device : public _device_base
+{
+ template<
+ device_get_config_func __get_config,
+ class __config_base,
+ class __running_class
+ >
+ friend class legacy_device_config;
+
+ legacy_device(running_machine &_machine, const legacy_device_config_base &config)
+ : _device_base(_machine, config)
+ {
+ }
+};
+
+
+
+#endif /* __DEVLEGCY_H__ */