mirror of
https://github.com/holub/mame
synced 2025-05-09 15:51:48 +03:00
Converted printer image device to modern (no whatsnew)
This commit is contained in:
parent
1f516b966d
commit
733d00f28e
@ -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);
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
@ -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
|
||||
|
@ -10,6 +10,60 @@
|
||||
#include "printer.h"
|
||||
|
||||
|
||||
// device type definition
|
||||
const device_type PRINTER = &device_creator<printer_image_device>;
|
||||
|
||||
//-------------------------------------------------
|
||||
// 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<const printer_interface *>(static_config());
|
||||
if (intf != NULL)
|
||||
*static_cast<printer_interface *>(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<device_image_interface *>(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<device_image_interface *>(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<const legacy_image_device_base &>(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<const legacy_image_device_base &>(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);
|
||||
|
@ -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__ */
|
||||
|
@ -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_image_device>("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);
|
||||
|
Loading…
Reference in New Issue
Block a user