diff --git a/src/emu/imagedev/cartslot.c b/src/emu/imagedev/cartslot.c index a31bb77bafd..bc5c7444b9a 100644 --- a/src/emu/imagedev/cartslot.c +++ b/src/emu/imagedev/cartslot.c @@ -9,7 +9,6 @@ #include #include "emu.h" #include "cartslot.h" -#include "multcart.h" /*************************************************************************** CONSTANTS @@ -27,14 +26,6 @@ typedef enum _process_mode process_mode; INLINE FUNCTIONS ***************************************************************************/ -INLINE cartslot_t *get_token(device_t *device) -{ - assert(device != NULL); - assert(device->type() == CARTSLOT); - return (cartslot_t *) downcast(device)->token(); -} - - INLINE const cartslot_config *get_config(const device_t *device) { assert(device != NULL); @@ -42,7 +33,6 @@ INLINE const cartslot_config *get_config(const device_t *device) return (const cartslot_config *) downcast(device)->inline_config(); } - /*************************************************************************** IMPLEMENTATION ***************************************************************************/ @@ -194,95 +184,19 @@ static int process_cartridge(device_image_interface *image, process_mode mode) return IMAGE_INIT_PASS; } - -/*------------------------------------------------- - cartslot_get_pcb --------------------------------------------------*/ - -device_t *cartslot_get_pcb(device_t *device) -{ - cartslot_t *cart = get_token(device); - return cart->pcb_device; -} - - -/*------------------------------------------------- - cartslot_get_socket --------------------------------------------------*/ - -void *cartslot_get_socket(device_t *device, const char *socket_name) -{ - cartslot_t *cart = get_token(device); - device_image_interface *image = dynamic_cast(device); - void *result = NULL; - - if (cart->mc != NULL) - { - const multicart_socket *socket; - for (socket = cart->mc->sockets; socket != NULL; socket = socket->next) - { - if (!strcmp(socket->id, socket_name)) - break; - } - result = socket ? socket->ptr : NULL; - } - else if (socket_name[0] == '\0') - { - result = image->ptr(); - } - return result; -} - -/*------------------------------------------------- - cartslot_get_resource_length --------------------------------------------------*/ - -int cartslot_get_resource_length(device_t *device, const char *socket_name) -{ - cartslot_t *cart = get_token(device); - int result = 0; - - if (cart->mc != NULL) - { - const multicart_socket *socket; - - for (socket = cart->mc->sockets; socket != NULL; socket = socket->next) - { - if (!strcmp(socket->id, socket_name)) { - break; - } - } - if (socket != NULL) - result = socket->resource->length; - } - else - result = 0; - - return result; -} - - /*------------------------------------------------- DEVICE_START( cartslot ) -------------------------------------------------*/ static DEVICE_START( cartslot ) { - cartslot_t *cart = get_token(device); const cartslot_config *config = get_config(device); /* if this cartridge has a custom DEVICE_START, use it */ if (config->device_start != NULL) { (*config->device_start)(device); - goto done; } - - /* find the PCB (if there is one) */ - cart->pcb_device = device->subdevice(TAG_PCB); - -done: - return; } @@ -292,28 +206,15 @@ done: static DEVICE_IMAGE_LOAD( cartslot ) { - int result; device_t *device = &image.device(); - cartslot_t *cart = get_token(device); const cartslot_config *config = get_config(device); /* if this cartridge has a custom DEVICE_IMAGE_LOAD, use it */ if (config->device_load != NULL) return (*config->device_load)(image); - /* try opening this as if it were a multicart */ - multicart_open(device->machine().options(), image.filename(), device->machine().system().name, MULTICART_FLAGS_LOAD_RESOURCES, &cart->mc); - if (cart->mc == NULL) - { - - - /* otherwise try the normal route */ - result = process_cartridge(&image, PROCESS_LOAD); - if (result != IMAGE_INIT_PASS) - return result; - } - - return IMAGE_INIT_PASS; + /* otherwise try the normal route */ + return process_cartridge(&image, PROCESS_LOAD); } @@ -324,7 +225,6 @@ static DEVICE_IMAGE_LOAD( cartslot ) static DEVICE_IMAGE_UNLOAD( cartslot ) { device_t *device = &image.device(); - cartslot_t *cart = get_token(device); const cartslot_config *config = get_config(device); /* if this cartridge has a custom DEVICE_IMAGE_UNLOAD, use it */ @@ -333,82 +233,9 @@ static DEVICE_IMAGE_UNLOAD( cartslot ) (*config->device_unload)(image); return; } - - if (cart->mc != NULL) - { - multicart_close(device->machine().options(), cart->mc); - cart->mc = NULL; - } - process_cartridge(&image, PROCESS_CLEAR); } - -/*------------------------------------------------- - identify_pcb --------------------------------------------------*/ - -static const cartslot_pcb_type *identify_pcb(device_image_interface &image) -{ - const cartslot_config *config = get_config(&image.device()); - astring pcb_name; - const cartslot_pcb_type *pcb_type = NULL; - multicart_t *mc; - int i; - - if (image.exists()) - { - /* try opening this as if it were a multicart */ - multicart_open_error me = multicart_open(image.device().machine().options(), image.filename(), image.device().machine().system().name, MULTICART_FLAGS_DONT_LOAD_RESOURCES, &mc); - if (me == MCERR_NONE) - { - /* this was a multicart - read from it */ - astring_cpyc(&pcb_name, mc->pcb_type); - multicart_close(image.device().machine().options(), mc); - } - else - { - if (me != MCERR_NOT_MULTICART) - fatalerror("multicart error: %s", multicart_error_text(me)); - } - - /* look for PCB type with matching name */ - for (i = 0; (i < ARRAY_LENGTH(config->pcb_types)) && (config->pcb_types[i].name != NULL); i++) - { - if ((config->pcb_types[i].name[0] == '\0') || !strcmp(astring_c(&pcb_name), config->pcb_types[i].name)) - { - pcb_type = &config->pcb_types[i]; - break; - } - } - - /* check for unknown PCB type */ - if ((mc != NULL) && (pcb_type == NULL)) - fatalerror("Unknown PCB type \"%s\"", astring_c(&pcb_name)); - } - else - { - /* no device loaded; use the default */ - pcb_type = (config->pcb_types[0].name != NULL) ? &config->pcb_types[0] : NULL; - } - return pcb_type; -} - -/*------------------------------------------------- - DEVICE_IMAGE_GET_DEVICES(cartslot) --------------------------------------------------*/ -static DEVICE_IMAGE_GET_DEVICES(cartslot) -{ - const cartslot_pcb_type *pcb_type; - device_t *device = &image.device(); - - pcb_type = identify_pcb(image); - if (pcb_type != NULL) - { - image_add_device_with_subdevices(device,pcb_type->devtype,TAG_PCB,0); - } -} - /*------------------------------------------------- DEVICE_IMAGE_SOFTLIST_LOAD(cartslot) -------------------------------------------------*/ @@ -427,7 +254,7 @@ DEVICE_GET_INFO( cartslot ) switch(state) { /* --- the following bits of info are returned as 64-bit signed integers --- */ - case DEVINFO_INT_TOKEN_BYTES: info->i = sizeof(cartslot_t); break; + case DEVINFO_INT_TOKEN_BYTES: info->i = 0; break; case DEVINFO_INT_INLINE_CONFIG_BYTES: info->i = sizeof(cartslot_config); break; case DEVINFO_INT_IMAGE_TYPE: info->i = IO_CARTSLOT; break; case DEVINFO_INT_IMAGE_READABLE: info->i = 1; break; @@ -446,7 +273,6 @@ DEVICE_GET_INFO( cartslot ) case DEVINFO_FCT_START: info->start = DEVICE_START_NAME(cartslot); break; case DEVINFO_FCT_IMAGE_LOAD: info->f = (genf *) DEVICE_IMAGE_LOAD_NAME(cartslot); break; case DEVINFO_FCT_IMAGE_UNLOAD: info->f = (genf *) DEVICE_IMAGE_UNLOAD_NAME(cartslot); break; - case DEVINFO_FCT_IMAGE_GET_DEVICES: info->f = (genf *) DEVICE_IMAGE_GET_DEVICES_NAME(cartslot); break; case DEVINFO_FCT_IMAGE_SOFTLIST_LOAD: info->f = (genf *) DEVICE_IMAGE_SOFTLIST_LOAD_NAME(cartslot); break; case DEVINFO_FCT_IMAGE_PARTIAL_HASH: if ( device && downcast(device)->inline_config() && get_config(device)->device_partialhash) { @@ -487,40 +313,3 @@ DEVICE_GET_INFO( cartslot ) } DEFINE_LEGACY_IMAGE_DEVICE(CARTSLOT, cartslot); - - -//************************************************************************** -// DEVICE CARTSLOT INTERFACE -//************************************************************************** - -//------------------------------------------------- -// device_cart_slot_interface - constructor -//------------------------------------------------- - -device_cart_slot_interface::device_cart_slot_interface(const machine_config &mconfig, device_t &device) - : device_interface(device) -{ -} - - -//------------------------------------------------- -// ~device_cart_slot_interface - destructor -//------------------------------------------------- - -device_cart_slot_interface::~device_cart_slot_interface() -{ -} - -//************************************************************************** -// LIVE LEGACY cart_slot DEVICE -//************************************************************************** - -//------------------------------------------------- -// legacy_cart_slot_device_base - constructor -//------------------------------------------------- - -legacy_cart_slot_device_base::legacy_cart_slot_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock, device_get_config_func get_config) - : legacy_device_base(mconfig, type, tag, owner, clock, get_config), - device_cart_slot_interface(mconfig, *this) -{ -} diff --git a/src/emu/imagedev/cartslot.h b/src/emu/imagedev/cartslot.h index b7ef371f47b..2b31a3beb01 100644 --- a/src/emu/imagedev/cartslot.h +++ b/src/emu/imagedev/cartslot.h @@ -8,14 +8,11 @@ #define __CARTSLOT_H__ #include "image.h" -#include "multcart.h" /*************************************************************************** MACROS ***************************************************************************/ -#define TAG_PCB "pcb" - #define ROM_CART_LOAD(tag,offset,length,flags) \ { NULL, tag, offset, length, ROMENTRYTYPE_CARTRIDGE | (flags) }, @@ -33,22 +30,6 @@ DECLARE_LEGACY_IMAGE_DEVICE(CARTSLOT, cartslot); TYPE DEFINITIONS ***************************************************************************/ -typedef struct _cartslot_t cartslot_t; -struct _cartslot_t -{ - device_t *pcb_device; - multicart_t *mc; -}; - - -typedef struct _cartslot_pcb_type cartslot_pcb_type; -struct _cartslot_pcb_type -{ - const char * name; - device_type devtype; -}; - - typedef struct _cartslot_config cartslot_config; struct _cartslot_config { @@ -60,24 +41,9 @@ struct _cartslot_config device_image_unload_func device_unload; device_image_partialhash_func device_partialhash; device_image_display_info_func device_displayinfo; - cartslot_pcb_type pcb_types[16]; }; -/*************************************************************************** - FUNCTION PROTOTYPES -***************************************************************************/ - -/* accesses the PCB associated with this cartslot */ -device_t *cartslot_get_pcb(device_t *device); - -/* accesses a particular socket */ -void *cartslot_get_socket(device_t *device, const char *socket_name); - -/* accesses a particular socket; gets the length of the associated resource */ -int cartslot_get_resource_length(device_t *device, const char *socket_name); - - /*************************************************************************** DEVICE CONFIGURATION MACROS ***************************************************************************/ @@ -112,44 +78,7 @@ int cartslot_get_resource_length(device_t *device, const char *socket_name); #define MCFG_CARTSLOT_PARTIALHASH(_partialhash) \ MCFG_DEVICE_CONFIG_DATAPTR(cartslot_config, device_partialhash, _partialhash) -#define MCFG_CARTSLOT_PCBTYPE(_index, _pcb_type_name, _pcb_devtype) \ - MCFG_DEVICE_CONFIG_DATAPTR_ARRAY_MEMBER(cartslot_config, pcb_types, _index, cartslot_pcb_type, name, _pcb_type_name) \ - MCFG_DEVICE_CONFIG_DATAPTR_ARRAY_MEMBER(cartslot_config, pcb_types, _index, cartslot_pcb_type, devtype, _pcb_devtype) - #define MCFG_CARTSLOT_INTERFACE(_interface) \ MCFG_DEVICE_CONFIG_DATAPTR(cartslot_config, interface, _interface ) -#define DECLARE_LEGACY_CART_SLOT_DEVICE(name, basename) _DECLARE_LEGACY_DEVICE(name, basename, basename##_device, legacy_cart_slot_device_base) -#define DEFINE_LEGACY_CART_SLOT_DEVICE(name, basename) _DEFINE_LEGACY_DEVICE(name, basename, basename##_device, legacy_cart_slot_device_base) - - -// ======================> device_cart_slot_interface - -// class representing interface-specific live cart_slot -class device_cart_slot_interface : public device_interface -{ -public: - // construction/destruction - device_cart_slot_interface(const machine_config &mconfig, device_t &device); - virtual ~device_cart_slot_interface(); -}; - - -// ======================> legacy_cart_slot_device - -// legacy_cart_slot_device is a legacy_device_base with a cart_slot interface -class legacy_cart_slot_device_base : public legacy_device_base, - public device_cart_slot_interface -{ -protected: - // construction/destruction - legacy_cart_slot_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock, device_get_config_func get_config); - -public: - using legacy_device_base::get_legacy_int; - using legacy_device_base::get_legacy_fct; - using legacy_device_base::get_legacy_ptr; - - // device_cart_slot_interface overrides -}; #endif /* __cart_slot_H__ */ diff --git a/src/emu/imagedev/multcart.c b/src/emu/imagedev/multcart.c index 2af0be651b1..506e1231126 100644 --- a/src/emu/imagedev/multcart.c +++ b/src/emu/imagedev/multcart.c @@ -61,10 +61,161 @@ const char *multicart_error_text(multicart_open_error error) return error_text[(int)error]; } +/*************************************************************************** + INLINE FUNCTIONS +***************************************************************************/ + +INLINE multicartslot_t *get_token(device_t *device) +{ + assert(device != NULL); + assert(device->type() == MULTICARTSLOT); + return (multicartslot_t *) downcast(device)->token(); +} + + +INLINE const multicartslot_config *get_config(const device_t *device) +{ + assert(device != NULL); + assert(device->type() == MULTICARTSLOT); + return (const multicartslot_config *) downcast(device)->inline_config(); +} + + /*************************************************************************** IMPLEMENTATION ***************************************************************************/ +/*------------------------------------------------- + cartslot_get_pcb +-------------------------------------------------*/ + +device_t *cartslot_get_pcb(device_t *device) +{ + multicartslot_t *cart = get_token(device); + return cart->pcb_device; +} + + +/*------------------------------------------------- + cartslot_get_socket +-------------------------------------------------*/ + +void *cartslot_get_socket(device_t *device, const char *socket_name) +{ + multicartslot_t *cart = get_token(device); + device_image_interface *image = dynamic_cast(device); + void *result = NULL; + + if (cart->mc != NULL) + { + const multicart_socket *socket; + for (socket = cart->mc->sockets; socket != NULL; socket = socket->next) + { + if (!strcmp(socket->id, socket_name)) + break; + } + result = socket ? socket->ptr : NULL; + } + else if (socket_name[0] == '\0') + { + result = image->ptr(); + } + return result; +} + +/*------------------------------------------------- + cartslot_get_resource_length +-------------------------------------------------*/ + +int cartslot_get_resource_length(device_t *device, const char *socket_name) +{ + multicartslot_t *cart = get_token(device); + int result = 0; + + if (cart->mc != NULL) + { + const multicart_socket *socket; + + for (socket = cart->mc->sockets; socket != NULL; socket = socket->next) + { + if (!strcmp(socket->id, socket_name)) { + break; + } + } + if (socket != NULL) + result = socket->resource->length; + } + else + result = 0; + + return result; +} +/*------------------------------------------------- + identify_pcb +-------------------------------------------------*/ + +static const multicartslot_pcb_type *identify_pcb(device_image_interface &image) +{ + const multicartslot_config *config = get_config(&image.device()); + astring pcb_name; + const multicartslot_pcb_type *pcb_type = NULL; + multicart_t *mc; + int i; + + if (image.exists()) + { + /* try opening this as if it were a multicart */ + multicart_open_error me = multicart_open(image.device().machine().options(), image.filename(), image.device().machine().system().name, MULTICART_FLAGS_DONT_LOAD_RESOURCES, &mc); + if (me == MCERR_NONE) + { + /* this was a multicart - read from it */ + astring_cpyc(&pcb_name, mc->pcb_type); + multicart_close(image.device().machine().options(), mc); + } + else + { + if (me != MCERR_NOT_MULTICART) + fatalerror("multicart error: %s", multicart_error_text(me)); + } + + /* look for PCB type with matching name */ + for (i = 0; (i < ARRAY_LENGTH(config->pcb_types)) && (config->pcb_types[i].name != NULL); i++) + { + if ((config->pcb_types[i].name[0] == '\0') || !strcmp(astring_c(&pcb_name), config->pcb_types[i].name)) + { + pcb_type = &config->pcb_types[i]; + break; + } + } + + /* check for unknown PCB type */ + if ((mc != NULL) && (pcb_type == NULL)) + fatalerror("Unknown PCB type \"%s\"", astring_c(&pcb_name)); + } + else + { + /* no device loaded; use the default */ + pcb_type = (config->pcb_types[0].name != NULL) ? &config->pcb_types[0] : NULL; + } + return pcb_type; +} + +/*------------------------------------------------- + DEVICE_IMAGE_GET_DEVICES(cartslot) +-------------------------------------------------*/ +static DEVICE_IMAGE_GET_DEVICES(multicartslot) +{ + const multicartslot_pcb_type *pcb_type; + device_t *device = &image.device(); + + pcb_type = identify_pcb(image); + if (pcb_type != NULL) + { + image_add_device_with_subdevices(device,pcb_type->devtype,TAG_PCB,0); + } +} + + /*------------------------------------------------- find_file -------------------------------------------------*/ @@ -606,3 +757,132 @@ void multicart_close(emu_options &options, multicart_t *cart) save_ram_resources(options, cart); pool_free_lib(cart->data->pool); } + +/*------------------------------------------------- + DEVICE_START( multicartslot ) +-------------------------------------------------*/ + +static DEVICE_START( multicartslot ) +{ + const multicartslot_config *config = get_config(device); + + /* if this cartridge has a custom DEVICE_START, use it */ + if (config->device_start != NULL) + { + (*config->device_start)(device); + } +} + + +/*------------------------------------------------- + DEVICE_IMAGE_LOAD( cartslot ) +-------------------------------------------------*/ + +static DEVICE_IMAGE_LOAD( multicartslot ) +{ + device_t *device = &image.device(); + const multicartslot_config *config = get_config(device); + + /* if this cartridge has a custom DEVICE_IMAGE_LOAD, use it */ + if (config->device_load != NULL) + return (*config->device_load)(image); + + /* otherwise try the normal route */ + return IMAGE_INIT_PASS; +} + + +/*------------------------------------------------- + DEVICE_IMAGE_UNLOAD( multicartslot ) +-------------------------------------------------*/ + +static DEVICE_IMAGE_UNLOAD( multicartslot ) +{ + device_t *device = &image.device(); + const multicartslot_config *config = get_config(device); + + /* if this cartridge has a custom DEVICE_IMAGE_UNLOAD, use it */ + if (config->device_unload != NULL) + { + (*config->device_unload)(image); + return; + } +} +/*------------------------------------------------- + DEVICE_GET_INFO( multicartslot ) +-------------------------------------------------*/ + +DEVICE_GET_INFO( multicartslot ) +{ + switch(state) + { + /* --- the following bits of info are returned as 64-bit signed integers --- */ + case DEVINFO_INT_TOKEN_BYTES: info->i = sizeof(multicartslot_t); break; + case DEVINFO_INT_INLINE_CONFIG_BYTES: info->i = sizeof(multicartslot_config); break; + case DEVINFO_INT_IMAGE_TYPE: info->i = IO_CARTSLOT; break; + case DEVINFO_INT_IMAGE_READABLE: info->i = 1; break; + case DEVINFO_INT_IMAGE_WRITEABLE: info->i = 0; break; + case DEVINFO_INT_IMAGE_CREATABLE: info->i = 0; break; + case DEVINFO_INT_IMAGE_RESET_ON_LOAD: info->i = 1; break; + case DEVINFO_INT_IMAGE_MUST_BE_LOADED: info->i = 0; break; + + /* --- the following bits of info are returned as pointers to functions --- */ + case DEVINFO_FCT_START: info->start = DEVICE_START_NAME(multicartslot); break; + case DEVINFO_FCT_IMAGE_LOAD: info->f = (genf *) DEVICE_IMAGE_LOAD_NAME(multicartslot); break; + case DEVINFO_FCT_IMAGE_UNLOAD: info->f = (genf *) DEVICE_IMAGE_UNLOAD_NAME(multicartslot); break; + case DEVINFO_FCT_IMAGE_GET_DEVICES: info->f = (genf *) DEVICE_IMAGE_GET_DEVICES_NAME(multicartslot); break; + + /* --- the following bits of info are returned as NULL-terminated strings --- */ + case DEVINFO_STR_NAME: strcpy(info->s, "MultiCartslot"); break; + case DEVINFO_STR_FAMILY: strcpy(info->s, "MultiCartslot"); break; + case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break; + case DEVINFO_STR_IMAGE_FILE_EXTENSIONS: + if ( device && downcast(device)->inline_config() && get_config(device)->extensions ) + { + strcpy(info->s, get_config(device)->extensions); + } + else + { + strcpy(info->s, "bin"); + } + break; + } +} + +DEFINE_LEGACY_IMAGE_DEVICE(MULTICARTSLOT, multicartslot); + +//************************************************************************** +// DEVICE CARTSLOT INTERFACE +//************************************************************************** + +//------------------------------------------------- +// device_cart_slot_interface - constructor +//------------------------------------------------- + +device_cart_slot_interface::device_cart_slot_interface(const machine_config &mconfig, device_t &device) + : device_interface(device) +{ +} + + +//------------------------------------------------- +// ~device_cart_slot_interface - destructor +//------------------------------------------------- + +device_cart_slot_interface::~device_cart_slot_interface() +{ +} + +//************************************************************************** +// LIVE LEGACY cart_slot DEVICE +//************************************************************************** + +//------------------------------------------------- +// legacy_cart_slot_device_base - constructor +//------------------------------------------------- + +legacy_cart_slot_device_base::legacy_cart_slot_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock, device_get_config_func get_config) + : legacy_device_base(mconfig, type, tag, owner, clock, get_config), + device_cart_slot_interface(mconfig, *this) +{ +} diff --git a/src/emu/imagedev/multcart.h b/src/emu/imagedev/multcart.h index ddaea9e7ff1..a14c09a88d3 100644 --- a/src/emu/imagedev/multcart.h +++ b/src/emu/imagedev/multcart.h @@ -11,6 +11,9 @@ #include "osdcore.h" +#define TAG_PCB "pcb" + +DECLARE_LEGACY_IMAGE_DEVICE(MULTICARTSLOT, multicartslot); /*************************************************************************** TYPE DEFINITIONS @@ -65,6 +68,31 @@ struct _multicart_t multicart_private * data; }; +typedef struct _multicartslot_t multicartslot_t; +struct _multicartslot_t +{ + device_t *pcb_device; + multicart_t *mc; +}; + + +typedef struct _multicartslot_pcb_type multicartslot_pcb_type; +struct _multicartslot_pcb_type +{ + const char * name; + device_type devtype; +}; + + +typedef struct _multicartslot_config multicartslot_config; +struct _multicartslot_config +{ + const char * extensions; + device_start_func device_start; + device_image_load_func device_load; + device_image_unload_func device_unload; + multicartslot_pcb_type pcb_types[16]; +}; enum _multicart_open_error { @@ -97,4 +125,70 @@ multicart_open_error multicart_open(emu_options &options, const char *filename, /* closes a multicart */ void multicart_close(emu_options &options, multicart_t *cart); +/* accesses the PCB associated with this cartslot */ +device_t *cartslot_get_pcb(device_t *device); + +/* accesses a particular socket */ +void *cartslot_get_socket(device_t *device, const char *socket_name); + +/* accesses a particular socket; gets the length of the associated resource */ +int cartslot_get_resource_length(device_t *device, const char *socket_name); + +#define DECLARE_LEGACY_CART_SLOT_DEVICE(name, basename) _DECLARE_LEGACY_DEVICE(name, basename, basename##_device, legacy_cart_slot_device_base) +#define DEFINE_LEGACY_CART_SLOT_DEVICE(name, basename) _DEFINE_LEGACY_DEVICE(name, basename, basename##_device, legacy_cart_slot_device_base) + +#define MCFG_MULTICARTSLOT_ADD(_tag) \ + MCFG_DEVICE_ADD(_tag, MULTICARTSLOT, 0) \ + +#define MCFG_MULTICARTSLOT_MODIFY(_tag) \ + MCFG_DEVICE_MODIFY(_tag) \ + +#define MCFG_MULTICARTSLOT_PCBTYPE(_index, _pcb_type_name, _pcb_devtype) \ + MCFG_DEVICE_CONFIG_DATAPTR_ARRAY_MEMBER(multicartslot_config, pcb_types, _index, multicartslot_pcb_type, name, _pcb_type_name) \ + MCFG_DEVICE_CONFIG_DATAPTR_ARRAY_MEMBER(multicartslot_config, pcb_types, _index, multicartslot_pcb_type, devtype, _pcb_devtype) + +#define MCFG_MULTICARTSLOT_START(_start) \ + MCFG_DEVICE_CONFIG_DATAPTR(multicartslot_config, device_start, DEVICE_START_NAME(_start)) + +#define MCFG_MULTICARTSLOT_LOAD(_load) \ + MCFG_DEVICE_CONFIG_DATAPTR(multicartslot_config, device_load, DEVICE_IMAGE_LOAD_NAME(_load)) + +#define MCFG_MULTICARTSLOT_UNLOAD(_unload) \ + MCFG_DEVICE_CONFIG_DATAPTR(multicartslot_config, device_unload, DEVICE_IMAGE_UNLOAD_NAME(_unload)) + +#define MCFG_MULTICARTSLOT_EXTENSION_LIST(_extensions) \ + MCFG_DEVICE_CONFIG_DATAPTR(multicartslot_config, extensions, _extensions) + + +// ======================> device_cart_slot_interface + +// class representing interface-specific live cart_slot +class device_cart_slot_interface : public device_interface +{ +public: + // construction/destruction + device_cart_slot_interface(const machine_config &mconfig, device_t &device); + virtual ~device_cart_slot_interface(); +}; + + +// ======================> legacy_cart_slot_device + +// legacy_cart_slot_device is a legacy_device_base with a cart_slot interface +class legacy_cart_slot_device_base : public legacy_device_base, + public device_cart_slot_interface +{ +protected: + // construction/destruction + legacy_cart_slot_device_base(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, UINT32 clock, device_get_config_func get_config); + +public: + using legacy_device_base::get_legacy_int; + using legacy_device_base::get_legacy_fct; + using legacy_device_base::get_legacy_ptr; + + // device_cart_slot_interface overrides +}; + + #endif /* __MULTCART_H__ */