mirror of
https://github.com/holub/mame
synced 2025-05-17 11:15:06 +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_machine_config(mconfig),
|
||||
m_static_config(NULL),
|
||||
m_input_defaults(NULL),
|
||||
m_name(name),
|
||||
m_tag(tag),
|
||||
m_config_complete(false)
|
||||
|
@ -108,6 +108,8 @@ device_t *_ConfigClass::alloc_device(running_machine &machine) const \
|
||||
#define MCFG_DEVICE_CLOCK(_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 emu_timer;
|
||||
typedef union _input_port_token input_port_token;
|
||||
typedef struct _input_device_default input_device_default;
|
||||
|
||||
|
||||
// exception classes
|
||||
@ -289,6 +292,7 @@ public:
|
||||
const char *tag() const { return m_tag; }
|
||||
const void *static_config() const { return m_static_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
|
||||
void config_complete();
|
||||
@ -297,6 +301,7 @@ public:
|
||||
// configuration helpers
|
||||
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_input_default(device_config *device, const input_device_default *config) { device->m_input_defaults = config; }
|
||||
|
||||
//------------------- begin derived class overrides
|
||||
|
||||
@ -327,6 +332,7 @@ protected:
|
||||
|
||||
const machine_config & m_machine_config; // reference to the machine's 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_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_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
|
||||
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);
|
||||
if (curfield != NULL)
|
||||
field_config_insert(curfield, &maskbits, errorbuf, errorbuflen);
|
||||
defval = port_default_value(fulltag,mask,defval,owner);
|
||||
curfield = field_config_alloc(curport, IPT_DIPSWITCH, defval, mask);
|
||||
cursetting = NULL;
|
||||
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);
|
||||
if (curfield != NULL)
|
||||
field_config_insert(curfield, &maskbits, errorbuf, errorbuflen);
|
||||
defval = port_default_value(fulltag,mask,defval,owner);
|
||||
curfield = field_config_alloc(curport, IPT_CONFIG, defval, mask);
|
||||
cursetting = NULL;
|
||||
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);
|
||||
if (curfield != NULL)
|
||||
field_config_insert(curfield, &maskbits, errorbuf, errorbuflen);
|
||||
defval = port_default_value(fulltag,mask,defval,owner);
|
||||
curfield = field_config_alloc(curport, IPT_CATEGORY, defval, mask);
|
||||
cursetting = NULL;
|
||||
curfield->name = input_port_string_from_token(*ipt++);
|
||||
|
@ -723,7 +723,14 @@ struct _input_field_user_settings
|
||||
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 */
|
||||
class input_port_config
|
||||
{
|
||||
@ -1024,6 +1031,20 @@ struct _inp_header
|
||||
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
|
||||
|
Loading…
Reference in New Issue
Block a user