From 4ac6b54a6606e6f581090e5c89367e6dd1f962b9 Mon Sep 17 00:00:00 2001 From: waltje Date: Mon, 20 Aug 2018 01:39:27 -0400 Subject: [PATCH] Allow devices to be cloned from a master device. --- src/device.c | 42 +++++++++++++++++++++++++++++++++--------- src/device.h | 43 ++++++++++++++++++++++--------------------- 2 files changed, 55 insertions(+), 30 deletions(-) diff --git a/src/device.c b/src/device.c index cf6fe52..5f01ce6 100644 --- a/src/device.c +++ b/src/device.c @@ -9,7 +9,7 @@ * Implementation of the generic device interface to handle * all devices attached to the emulator. * - * Version: @(#)device.c 1.0.11 2018/05/24 + * Version: @(#)device.c 1.0.12 2018/08/18 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -60,6 +60,7 @@ static device_t *devices[DEVICE_MAX]; static device_t *device_current; +/* Initialize the module for use. */ void device_init(void) { @@ -67,6 +68,29 @@ device_init(void) } +/* Clone a master device for multi-instance devices. */ +const device_t * +device_clone(const device_t *master, int num) +{ + char temp[1024], *sp; + device_t *dev; + + /* Create a new device. */ + dev = (device_t *)malloc(sizeof(device_t)); + + /* Copy the master info. */ + memcpy(dev, master, sizeof(device_t)); + + /* Set up a clone. */ + sprintf(temp, "%s #%i", master->name, num); + sp = (char *)malloc(strlen(temp) + 1); + strcpy(sp, temp); + dev->name = (const char *)sp; + + return((const device_t *)dev); +} + + void * device_add(const device_t *d) { @@ -75,7 +99,7 @@ device_add(const device_t *d) void *priv = NULL; int c; - for (c=0; c<256; c++) { + for (c = 0; c < 256; c++) { if (devices[c] == (device_t *)d) { pclog("DEVICE: device already exists!\n"); return(NULL); @@ -128,7 +152,7 @@ device_add_ex(const device_t *d, void *priv) { int c; - for (c=0; c<256; c++) { + for (c = 0; c < 256; c++) { if (devices[c] == (device_t *)d) { fatal("device_add: device already exists!\n"); break; @@ -150,7 +174,7 @@ device_close_all(void) { int c; - for (c=0; cclose != NULL) devices[c]->close(device_priv[c]); @@ -165,7 +189,7 @@ device_reset_all(void) { int c; - for (c=0; creset != NULL) devices[c]->reset(device_priv[c]); @@ -179,7 +203,7 @@ device_get_priv(const device_t *d) { int c; - for (c=0; cspeed_changed != NULL) devices[c]->speed_changed(device_priv[c]); @@ -224,7 +248,7 @@ device_force_redraw(void) { int c; - for (c=0; cforce_redraw != NULL) devices[c]->force_redraw(device_priv[c]); @@ -238,7 +262,7 @@ device_add_status_info(char *s, int max_len) { int c; - for (c=0; cadd_status_info != NULL) devices[c]->add_status_info(s, max_len, device_priv[c]); diff --git a/src/device.h b/src/device.h index fd09bc9..feadb27 100644 --- a/src/device.h +++ b/src/device.h @@ -8,7 +8,7 @@ * * Definitions for the device handler. * - * Version: @(#)device.h 1.0.5 2018/04/25 + * Version: @(#)device.h 1.0.6 2018/08/18 * * Authors: Fred N. van Kempen, * Miran Grca, @@ -114,28 +114,29 @@ typedef struct _device_ { extern "C" { #endif -extern void device_init(void); -extern void *device_add(const device_t *); -extern void device_add_ex(const device_t *d, void *priv); -extern void device_close_all(void); -extern void device_reset_all(void); -extern void *device_get_priv(const device_t *); -extern int device_available(const device_t *); -extern void device_speed_changed(void); -extern void device_force_redraw(void); -extern void device_add_status_info(char *s, int max_len); +extern void device_init(void); +extern const device_t * device_clone(const device_t *master, int num); +extern void *device_add(const device_t *); +extern void device_add_ex(const device_t *d, void *priv); +extern void device_close_all(void); +extern void device_reset_all(void); +extern void *device_get_priv(const device_t *); +extern int device_available(const device_t *); +extern void device_speed_changed(void); +extern void device_force_redraw(void); +extern void device_add_status_info(char *s, int max_len); -extern int device_is_valid(const device_t *, int machine_flags); +extern int device_is_valid(const device_t *, int machine_flags); -extern int device_get_config_int(const char *name); -extern int device_get_config_int_ex(const char *s, int default_int); -extern int device_get_config_hex16(const char *name); -extern int device_get_config_hex20(const char *name); -extern int device_get_config_mac(const char *name, int default_int); -extern void device_set_config_int(const char *s, int val); -extern void device_set_config_hex16(const char *s, int val); -extern void device_set_config_hex20(const char *s, int val); -extern void device_set_config_mac(const char *s, int val); +extern int device_get_config_int(const char *name); +extern int device_get_config_int_ex(const char *s, int dflt_int); +extern int device_get_config_hex16(const char *name); +extern int device_get_config_hex20(const char *name); +extern int device_get_config_mac(const char *name, int dflt_int); +extern void device_set_config_int(const char *s, int val); +extern void device_set_config_hex16(const char *s, int val); +extern void device_set_config_hex20(const char *s, int val); +extern void device_set_config_mac(const char *s, int val); extern const char *device_get_config_string(const char *name); #ifdef __cplusplus