mirror of
https://github.com/holub/mame
synced 2025-05-18 19:49:35 +03:00
Added possibility of altering default input port setting for devices. [Miodrag Milanovic]
This commit is contained in:
parent
5fc16d9ce3
commit
9eea2335f9
@ -293,6 +293,7 @@ device_config::device_config(const machine_config &mconfig, device_type type, co
|
|||||||
m_clock(clock),
|
m_clock(clock),
|
||||||
m_machine_config(mconfig),
|
m_machine_config(mconfig),
|
||||||
m_static_config(NULL),
|
m_static_config(NULL),
|
||||||
|
m_input_defaults(NULL),
|
||||||
m_name(name),
|
m_name(name),
|
||||||
m_tag(tag),
|
m_tag(tag),
|
||||||
m_config_complete(false)
|
m_config_complete(false)
|
||||||
|
@ -108,6 +108,8 @@ device_t *_ConfigClass::alloc_device(running_machine &machine) const \
|
|||||||
#define MCFG_DEVICE_CLOCK(_clock) \
|
#define MCFG_DEVICE_CLOCK(_clock) \
|
||||||
device_config::static_set_clock(device, _clock); \
|
device_config::static_set_clock(device, _clock); \
|
||||||
|
|
||||||
|
#define MCFG_DEVICE_INPUT_DEFAULTS(_config) \
|
||||||
|
device_config::static_set_input_default(device, DEVICE_INPUT_DEFAULTS_NAME(_config)); \
|
||||||
|
|
||||||
|
|
||||||
//**************************************************************************
|
//**************************************************************************
|
||||||
@ -128,6 +130,7 @@ struct rom_entry;
|
|||||||
class machine_config;
|
class machine_config;
|
||||||
class emu_timer;
|
class emu_timer;
|
||||||
typedef union _input_port_token input_port_token;
|
typedef union _input_port_token input_port_token;
|
||||||
|
typedef struct _input_device_default input_device_default;
|
||||||
|
|
||||||
|
|
||||||
// exception classes
|
// exception classes
|
||||||
@ -289,6 +292,7 @@ public:
|
|||||||
const char *tag() const { return m_tag; }
|
const char *tag() const { return m_tag; }
|
||||||
const void *static_config() const { return m_static_config; }
|
const void *static_config() const { return m_static_config; }
|
||||||
const machine_config &mconfig() const { return m_machine_config; }
|
const machine_config &mconfig() const { return m_machine_config; }
|
||||||
|
const input_device_default *input_ports_defaults() const { return m_input_defaults; }
|
||||||
|
|
||||||
// methods that wrap both interface-level and device-level behavior
|
// methods that wrap both interface-level and device-level behavior
|
||||||
void config_complete();
|
void config_complete();
|
||||||
@ -297,6 +301,7 @@ public:
|
|||||||
// configuration helpers
|
// configuration helpers
|
||||||
static void static_set_clock(device_config *device, UINT32 clock) { device->m_clock = clock; }
|
static void static_set_clock(device_config *device, UINT32 clock) { device->m_clock = clock; }
|
||||||
static void static_set_static_config(device_config *device, const void *config) { device->m_static_config = config; }
|
static void static_set_static_config(device_config *device, const void *config) { device->m_static_config = config; }
|
||||||
|
static void static_set_input_default(device_config *device, const input_device_default *config) { device->m_input_defaults = config; }
|
||||||
|
|
||||||
//------------------- begin derived class overrides
|
//------------------- begin derived class overrides
|
||||||
|
|
||||||
@ -327,6 +332,7 @@ protected:
|
|||||||
|
|
||||||
const machine_config & m_machine_config; // reference to the machine's configuration
|
const machine_config & m_machine_config; // reference to the machine's configuration
|
||||||
const void * m_static_config; // static device configuration
|
const void * m_static_config; // static device configuration
|
||||||
|
const input_device_default *m_input_defaults; // devices input ports default overrides
|
||||||
|
|
||||||
astring m_name; // name of the device
|
astring m_name; // name of the device
|
||||||
astring m_shortname; // short name of the device, used for potential romload
|
astring m_shortname; // short name of the device, used for potential romload
|
||||||
|
@ -2931,6 +2931,29 @@ static int frame_get_digital_field_state(const input_field_config *field, int mo
|
|||||||
PORT CONFIGURATION HELPERS
|
PORT CONFIGURATION HELPERS
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
|
|
||||||
|
/*-------------------------------------------------
|
||||||
|
port_default_value - updates default value
|
||||||
|
of port settings according to device settings
|
||||||
|
-------------------------------------------------*/
|
||||||
|
|
||||||
|
static UINT32 port_default_value(const char *fulltag, UINT32 mask, UINT32 defval, device_config *owner)
|
||||||
|
{
|
||||||
|
astring tempstring;
|
||||||
|
const input_device_default *def = NULL;
|
||||||
|
if (owner!=NULL) {
|
||||||
|
def = owner->input_ports_defaults();
|
||||||
|
if (def!=NULL) {
|
||||||
|
while (def->tag!=NULL) {
|
||||||
|
if ((strcmp(fulltag,owner->subtag(tempstring,def->tag))==0) && (def->mask == mask)) {
|
||||||
|
return def->defvalue;
|
||||||
|
}
|
||||||
|
def++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return defval;
|
||||||
|
}
|
||||||
|
|
||||||
/*-------------------------------------------------
|
/*-------------------------------------------------
|
||||||
port_config_detokenize - recursively
|
port_config_detokenize - recursively
|
||||||
detokenize a series of input port tokens
|
detokenize a series of input port tokens
|
||||||
@ -3410,6 +3433,7 @@ static void port_config_detokenize(ioport_list &portlist, const input_port_token
|
|||||||
TOKEN_GET_UINT64_UNPACK2(ipt, mask, 32, defval, 32);
|
TOKEN_GET_UINT64_UNPACK2(ipt, mask, 32, defval, 32);
|
||||||
if (curfield != NULL)
|
if (curfield != NULL)
|
||||||
field_config_insert(curfield, &maskbits, errorbuf, errorbuflen);
|
field_config_insert(curfield, &maskbits, errorbuf, errorbuflen);
|
||||||
|
defval = port_default_value(fulltag,mask,defval,owner);
|
||||||
curfield = field_config_alloc(curport, IPT_DIPSWITCH, defval, mask);
|
curfield = field_config_alloc(curport, IPT_DIPSWITCH, defval, mask);
|
||||||
cursetting = NULL;
|
cursetting = NULL;
|
||||||
curfield->name = input_port_string_from_token(*ipt++);
|
curfield->name = input_port_string_from_token(*ipt++);
|
||||||
@ -3488,6 +3512,7 @@ static void port_config_detokenize(ioport_list &portlist, const input_port_token
|
|||||||
TOKEN_GET_UINT64_UNPACK2(ipt, mask, 32, defval, 32);
|
TOKEN_GET_UINT64_UNPACK2(ipt, mask, 32, defval, 32);
|
||||||
if (curfield != NULL)
|
if (curfield != NULL)
|
||||||
field_config_insert(curfield, &maskbits, errorbuf, errorbuflen);
|
field_config_insert(curfield, &maskbits, errorbuf, errorbuflen);
|
||||||
|
defval = port_default_value(fulltag,mask,defval,owner);
|
||||||
curfield = field_config_alloc(curport, IPT_CONFIG, defval, mask);
|
curfield = field_config_alloc(curport, IPT_CONFIG, defval, mask);
|
||||||
cursetting = NULL;
|
cursetting = NULL;
|
||||||
curfield->name = input_port_string_from_token(*ipt++);
|
curfield->name = input_port_string_from_token(*ipt++);
|
||||||
@ -3519,6 +3544,7 @@ static void port_config_detokenize(ioport_list &portlist, const input_port_token
|
|||||||
TOKEN_GET_UINT64_UNPACK2(ipt, mask, 32, defval, 32);
|
TOKEN_GET_UINT64_UNPACK2(ipt, mask, 32, defval, 32);
|
||||||
if (curfield != NULL)
|
if (curfield != NULL)
|
||||||
field_config_insert(curfield, &maskbits, errorbuf, errorbuflen);
|
field_config_insert(curfield, &maskbits, errorbuf, errorbuflen);
|
||||||
|
defval = port_default_value(fulltag,mask,defval,owner);
|
||||||
curfield = field_config_alloc(curport, IPT_CATEGORY, defval, mask);
|
curfield = field_config_alloc(curport, IPT_CATEGORY, defval, mask);
|
||||||
cursetting = NULL;
|
cursetting = NULL;
|
||||||
curfield->name = input_port_string_from_token(*ipt++);
|
curfield->name = input_port_string_from_token(*ipt++);
|
||||||
|
@ -723,7 +723,14 @@ struct _input_field_user_settings
|
|||||||
UINT8 reverse; /* for analog controls */
|
UINT8 reverse; /* for analog controls */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* device defined default input settings */
|
||||||
|
typedef struct _input_device_default input_device_default;
|
||||||
|
struct _input_device_default
|
||||||
|
{
|
||||||
|
const char * tag; /* tag of port to update */
|
||||||
|
input_port_value mask; /* mask to apply to the port */
|
||||||
|
input_port_value defvalue; /* new default value */
|
||||||
|
};
|
||||||
/* a single input port configuration */
|
/* a single input port configuration */
|
||||||
class input_port_config
|
class input_port_config
|
||||||
{
|
{
|
||||||
@ -1024,6 +1031,20 @@ struct _inp_header
|
|||||||
TOKEN_STRING(_name),
|
TOKEN_STRING(_name),
|
||||||
|
|
||||||
|
|
||||||
|
/* name of table */
|
||||||
|
#define DEVICE_INPUT_DEFAULTS_NAME(_name) device_iptdef_##_name
|
||||||
|
|
||||||
|
/* start of table */
|
||||||
|
#define DEVICE_INPUT_DEFAULTS_START(_name) \
|
||||||
|
const input_device_default DEVICE_INPUT_DEFAULTS_NAME(_name)[] = {
|
||||||
|
|
||||||
|
/* end of table */
|
||||||
|
#define DEVICE_INPUT_DEFAULTS(_tag,_mask,_defval) \
|
||||||
|
{ _tag ,_mask, _defval }, \
|
||||||
|
|
||||||
|
/* end of table */
|
||||||
|
#define DEVICE_INPUT_DEFAULTS_END \
|
||||||
|
{NULL,0,0} };
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
HELPER MACROS
|
HELPER MACROS
|
||||||
|
Loading…
Reference in New Issue
Block a user