diff --git a/src/emu/devimage.c b/src/emu/devimage.c index 67e2ccba8cf..361b25207b6 100644 --- a/src/emu/devimage.c +++ b/src/emu/devimage.c @@ -76,9 +76,6 @@ legacy_image_device_base::legacy_image_device_base(const machine_config &mconfig void legacy_image_device_base::device_config_complete() { - const device_image_interface *image = NULL; - int count = 0; - int index = -1; image_device_format **formatptr; image_device_format *format; formatptr = &m_formatlist; @@ -107,22 +104,8 @@ void legacy_image_device_base::device_config_complete() } } - for (bool gotone = device_t::m_machine_config.devicelist().first(image); gotone; gotone = image->next(image)) - { - if (this == image) - index = count; - if (image->image_type() == image_type()) - count++; - } - if (count > 1) { - m_instance_name.printf("%s%d", device_typename(image_type()), index + 1); - m_brief_instance_name.printf("%s%d", device_brieftypename(image_type()), index + 1); - } - else - { - m_instance_name = device_typename(image_type()); - m_brief_instance_name = device_brieftypename(image_type()); - } + update_names(); + // Override in case of hardcoded values if (strlen(get_legacy_string(DEVINFO_STR_IMAGE_INSTANCE_NAME))>0) { m_instance_name = get_legacy_string(DEVINFO_STR_IMAGE_INSTANCE_NAME); diff --git a/src/emu/diimage.c b/src/emu/diimage.c index ad85df70ff1..773d215cd81 100644 --- a/src/emu/diimage.c +++ b/src/emu/diimage.c @@ -702,13 +702,13 @@ bool device_image_interface::load_software(char *swlist, char *swname, rom_entry { for (software_info *swinfo = software_list_find(software_list_ptr, swname, NULL); swinfo != NULL; ) { - if (swinfo != NULL) { astring tmp(swinfo->shortname); locationtag.cat(tmp); locationtag.cat(breakstr); //printf("%s\n", locationtag.cstr()); } + const char *parentname = software_get_clone(device().machine().options(), swlist, swinfo->shortname); if (parentname != NULL) swinfo = software_list_find(software_list_ptr, parentname, NULL); @@ -1005,3 +1005,31 @@ void device_image_interface::unload() clear(); clear_error(); } + +/*------------------------------------------------- + update_names - update brief and instance names +-------------------------------------------------*/ + +void device_image_interface::update_names() +{ + const device_image_interface *image = NULL; + int count = 0; + int index = -1; + + for (bool gotone = device().mconfig().devicelist().first(image); gotone; gotone = image->next(image)) + { + if (this == image) + index = count; + if (image->image_type() == image_type()) + count++; + } + if (count > 1) { + m_instance_name.printf("%s%d", device_typename(image_type()), index + 1); + m_brief_instance_name.printf("%s%d", device_brieftypename(image_type()), index + 1); + } + else + { + m_instance_name = device_typename(image_type()); + m_brief_instance_name = device_brieftypename(image_type()); + } +} \ No newline at end of file diff --git a/src/emu/diimage.h b/src/emu/diimage.h index bd82fc19f79..47c81fac8d3 100644 --- a/src/emu/diimage.h +++ b/src/emu/diimage.h @@ -164,15 +164,15 @@ public: virtual void device_compute_hash(hash_collection &hashes, const void *data, size_t length, const char *types) const; - virtual bool call_load() = 0; - virtual bool call_softlist_load(char *swlist, char *swname, rom_entry *start_entry) = 0; - virtual bool call_create(int format_type, option_resolution *format_options) = 0; - virtual void call_unload() = 0; - virtual void call_display() = 0; - virtual void call_display_info() = 0; - virtual void call_get_devices() = 0; - virtual void *get_device_specific_call() = 0; - virtual device_image_partialhash_func get_partial_hash() const = 0; + virtual bool call_load() { return FALSE; } + virtual bool call_softlist_load(char *swlist, char *swname, rom_entry *start_entry) { return FALSE; } + virtual bool call_create(int format_type, option_resolution *format_options) { return FALSE; } + virtual void call_unload() { } + virtual void call_display() { } + virtual void call_display_info() { } + virtual void call_get_devices() { } + virtual void *get_device_specific_call() { return NULL; } + virtual device_image_partialhash_func get_partial_hash() const { return NULL; } virtual iodevice_t image_type() const = 0; virtual bool is_readable() const = 0; virtual bool is_writeable() const = 0; @@ -267,6 +267,7 @@ protected: int read_hash_config(const char *sysname); void run_hash(void (*partialhash)(hash_collection &, const unsigned char *, unsigned long, const char *), hash_collection &hashes, const char *types); void image_checkhash(); + void update_names(); // derived class overrides // configuration diff --git a/src/emu/imagedev/printer.c b/src/emu/imagedev/printer.c index ab256b00c92..9137583931d 100644 --- a/src/emu/imagedev/printer.c +++ b/src/emu/imagedev/printer.c @@ -10,6 +10,60 @@ #include "printer.h" +// device type definition +const device_type PRINTER = &device_creator; + +//------------------------------------------------- +// printer_image_device - constructor +//------------------------------------------------- + +printer_image_device::printer_image_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock) + : device_t(mconfig, PRINTER, "Printer", tag, owner, clock), + device_image_interface(mconfig, *this) +{ + +} + +//------------------------------------------------- +// printer_image_device - destructor +//------------------------------------------------- + +printer_image_device::~printer_image_device() +{ +} + +//------------------------------------------------- +// device_config_complete - perform any +// operations now that the configuration is +// complete +//------------------------------------------------- + +void printer_image_device::device_config_complete() +{ + // inherit a copy of the static data + const printer_interface *intf = reinterpret_cast(static_config()); + if (intf != NULL) + *static_cast(this) = *intf; + + // or initialize to defaults if none provided + else + { + memset(&m_online, 0, sizeof(m_online)); + } + + // set brief and instance name + update_names(); +} + + +//------------------------------------------------- +// device_start - device-specific startup +//------------------------------------------------- + +void printer_image_device::device_start() +{ + m_online_func.resolve(m_online, *this); +} /*************************************************************************** IMPLEMENTATION @@ -20,11 +74,9 @@ is ready -------------------------------------------------*/ -int printer_is_ready(device_t *printer) +int printer_image_device::is_ready() { - device_image_interface *image = dynamic_cast(printer); - /* if there is a file attached to it, it's online */ - return image->exists() != 0; + return exists() != 0; } @@ -33,12 +85,11 @@ int printer_is_ready(device_t *printer) printer_output - outputs data to a printer -------------------------------------------------*/ -void printer_output(device_t *printer, UINT8 data) +void printer_image_device::output(UINT8 data) { - device_image_interface *image = dynamic_cast(printer); - if (image->exists()) + if (exists()) { - image->fwrite(&data, 1); + fwrite(&data, 1); } } @@ -46,14 +97,11 @@ void printer_output(device_t *printer, UINT8 data) /*------------------------------------------------- DEVICE_IMAGE_LOAD( printer ) -------------------------------------------------*/ - -static DEVICE_IMAGE_LOAD( printer ) +bool printer_image_device::call_load() { - const printer_config *conf = (const printer_config *)downcast(image.device()).inline_config(); - /* send notify that the printer is now online */ - if (conf != NULL && conf->online != NULL) - conf->online(image, TRUE); + if (!m_online_func.isnull()) + m_online_func(TRUE); /* we don't need to do anything special */ return IMAGE_INIT_PASS; @@ -63,54 +111,10 @@ static DEVICE_IMAGE_LOAD( printer ) /*------------------------------------------------- DEVICE_IMAGE_UNLOAD( printer ) -------------------------------------------------*/ - -static DEVICE_IMAGE_UNLOAD( printer ) +void printer_image_device::call_unload() { - const printer_config *conf = (const printer_config *)downcast(image.device()).inline_config(); - /* send notify that the printer is now offline */ - if (conf != NULL && conf->online != NULL) - conf->online(image, FALSE); + if (!m_online_func.isnull()) + m_online_func(FALSE); } - -/*------------------------------------------------- - DEVICE_START(printer) --------------------------------------------------*/ - -static DEVICE_START(printer) -{ -} - - - -/*------------------------------------------------- - DEVICE_GET_INFO(printer) --------------------------------------------------*/ - -DEVICE_GET_INFO(printer) -{ - switch(state) - { - /* --- the following bits of info are returned as 64-bit signed integers --- */ - case DEVINFO_INT_TOKEN_BYTES: info->i = 1; break; - case DEVINFO_INT_INLINE_CONFIG_BYTES: info->i = sizeof(printer_config); break; - case DEVINFO_INT_IMAGE_TYPE: info->i = IO_PRINTER; break; - case DEVINFO_INT_IMAGE_READABLE: info->i = 0; break; - case DEVINFO_INT_IMAGE_WRITEABLE: info->i = 1; break; - case DEVINFO_INT_IMAGE_CREATABLE: info->i = 1; break; - - /* --- the following bits of info are returned as pointers to data or functions --- */ - case DEVINFO_FCT_START: info->start = DEVICE_START_NAME(printer); break; - case DEVINFO_FCT_IMAGE_LOAD: info->f = (genf *) DEVICE_IMAGE_LOAD_NAME(printer); break; - case DEVINFO_FCT_IMAGE_UNLOAD: info->f = (genf *) DEVICE_IMAGE_UNLOAD_NAME(printer); break; - - /* --- the following bits of info are returned as NULL-terminated strings --- */ - case DEVINFO_STR_NAME: strcpy(info->s, "Printer"); break; - case DEVINFO_STR_FAMILY: strcpy(info->s, "Printer"); break; - case DEVINFO_STR_SOURCE_FILE: strcpy(info->s, __FILE__); break; - case DEVINFO_STR_IMAGE_FILE_EXTENSIONS: strcpy(info->s, "prn"); break; - } -} - -DEFINE_LEGACY_IMAGE_DEVICE(PRINTER, printer); diff --git a/src/emu/imagedev/printer.h b/src/emu/imagedev/printer.h index 2c937d7aef5..b2b03750fa6 100644 --- a/src/emu/imagedev/printer.h +++ b/src/emu/imagedev/printer.h @@ -9,40 +9,69 @@ #ifndef __PRINTER_H__ #define __PRINTER_H__ -#include "image.h" +#include "diimage.h" /*************************************************************************** TYPE DEFINITIONS ***************************************************************************/ -typedef void (*online_func)(device_t *device, int state); +// ======================> printer_interface -typedef struct _printer_config printer_config; -struct _printer_config +struct printer_interface { - online_func online; + devcb_write_line m_online; +}; + +// ======================> printer_image_device + +class printer_image_device : public device_t, + public printer_interface, + public device_image_interface +{ +public: + // construction/destruction + printer_image_device(const machine_config &mconfig, const char *tag, device_t *owner, UINT32 clock); + virtual ~printer_image_device(); + + // image-level overrides + virtual bool call_load(); + virtual void call_unload(); + + virtual iodevice_t image_type() const { return IO_PRINTER; } + + virtual bool is_readable() const { return 0; } + virtual bool is_writeable() const { return 1; } + virtual bool is_creatable() const { return 1; } + virtual bool must_be_loaded() const { return 0; } + virtual bool is_reset_on_load() const { return 0; } + virtual const char *image_interface() const { return NULL; } + virtual const char *file_extensions() const { return "prn"; } + virtual const option_guide *create_option_guide() const { return NULL; } + + // specific implementation + + /* checks to see if a printer is ready */ + int is_ready(); + /* outputs data to a printer */ + void output(UINT8 data); +protected: + // device-level overrides + virtual void device_config_complete(); + virtual void device_start(); + + devcb_resolved_write_line m_online_func; }; -DECLARE_LEGACY_IMAGE_DEVICE(PRINTER, printer); +// device type definition +extern const device_type PRINTER; #define MCFG_PRINTER_ADD(_tag) \ MCFG_DEVICE_ADD(_tag, PRINTER, 0) \ #define MCFG_PRINTER_ONLINE(_online) \ - MCFG_DEVICE_CONFIG_DATAPTR(printer_config, online, _online) - - -/*************************************************************************** - FUNCTION PROTOTYPES -***************************************************************************/ - -/* checks to see if a printer is ready */ -int printer_is_ready(device_t *printer); - -/* outputs data to a printer */ -void printer_output(device_t *printer, UINT8 data); + MCFG_DEVICE_CONFIG_DATAPTR(printer_interface, m_online, _online) #endif /* __PRINTER_H__ */ diff --git a/src/emu/machine/ctronics.c b/src/emu/machine/ctronics.c index 8d6acbe7b64..78f35f3da98 100644 --- a/src/emu/machine/ctronics.c +++ b/src/emu/machine/ctronics.c @@ -25,7 +25,7 @@ static TIMER_CALLBACK( busy_callback ); typedef struct _centronics_state centronics_state; struct _centronics_state { - device_t *printer; + printer_image_device *printer; devcb_resolved_write_line out_ack_func; devcb_resolved_write_line out_busy_func; @@ -97,7 +97,7 @@ static DEVICE_START( centronics ) centronics->strobe = TRUE; /* get printer device */ - centronics->printer = device->subdevice("printer"); + centronics->printer = device->subdevice("printer"); /* resolve callbacks */ centronics->out_ack_func.resolve(intf->out_ack_func, *device); @@ -173,7 +173,7 @@ static TIMER_CALLBACK( ack_callback ) if (param == FALSE) { /* data is now ready, output it */ - printer_output(centronics->printer, centronics->data); + centronics->printer->output(centronics->data); /* ready to receive more data, return BUSY to low */ machine.scheduler().timer_set(attotime::from_usec(7), FUNC(busy_callback), FALSE, ptr);