mirror of
https://github.com/holub/mame
synced 2025-04-16 13:34:55 +03:00

ui: Added some missing functionality: * Added an option to copy input device IDs to the relevant menus. * Added an item for setting the software lists files path (-hashpath) to the folder setup menu. * Allow pasting text from clipboard in most places that allow typing (searching, entering filenames, entering barcodes). * Changed the software selection menu heading to be a bit less misleading. * Made barcode menu less eager to rebuild itself unnecessarily, and removed some confusing and apparently pointless code. Exposed more Lua bindings: * Added low-level palette objects. * Added indexed bitmap types. * Added a bitmap method for extracting pixels from a rectangular area as a packed binary string. * Changed screen device pixels method to return width and height in addition to the pixels. osd: Added some functionality and cleaned up a little: * Added a function for copying text to the clipboard. * Moved function for converting Windows error codes to standard error conditions to winutil.cpp so it can be used from more places. * Removed duplicate declaration of osd_get_clipboard_text and made the function noexcept (including fixing implementations). * Made macOS implementation of osd_get_clipboard_text skip the encoding conversion if it finds UTF-8 text first. * Changed the default -uimodekey setting so it doesn't lose the "not shift" that stops the default from interfering with UI paste. Various bug fixes: * util/unicode.cpp: Fixed the version of utf8_from_uchar that returns std::string blowing up on invalid codepoints. * util/bitmap.h: Fixed wrapping constructors for indexed bitmaps taking the wrong parameter type (nothing was using them before). * util/bitmap.cpp: Fixed potential use-after-free issues with bitmap palettes. * emu/input.cpp, emu/inputdev.cpp: Log 1-based device numbers, matching what's shown in the internal UI and used in tokens in CFG files. * emu/emumem.cpp: Added the bank tag to a fatal error message where it was missing. docs: Reworked and expanded documentation on configuring stable controller IDs. For translators, the changes are quite minor: * There's a menu item for copying a device ID to the clipboard, and associated success/failure messages. * There's the menu item for setting the software list file search path. * One of the lines in the software selection menu heading has changes as it could be interpreted as implying it showed a software list name.
262 lines
10 KiB
ReStructuredText
262 lines
10 KiB
ReStructuredText
.. _ctrlrcfg:
|
||
|
||
Controller Configuration Files
|
||
==============================
|
||
|
||
.. contents:: :local:
|
||
|
||
|
||
.. _ctrlrcfg-intro:
|
||
|
||
Introduction
|
||
------------
|
||
|
||
Controller configuration files can be used to modify MAME’s default input
|
||
settings. Controller configuration files may be supplied with an input device
|
||
to provide more suitable defaults, or used as profiles that can be selected for
|
||
different situations. MAME includes a few sample controller configuration files
|
||
in the **ctrlr** folder, designed to provide useful defaults for certain
|
||
arcade-style controllers.
|
||
|
||
Controller configuration files are an XML application, using the ``.cfg``
|
||
filename extension. MAME searches for controller configuration files in the
|
||
directories specified using the ``ctrlrpath`` option. A controller
|
||
configuration file is selected by setting the ``ctrlr`` option to its filename,
|
||
excluding the ``.cfg`` extension (e.g. set the ``ctrlr`` option to
|
||
``scorpionxg`` to use **scorpionxg.cfg**). It is an error if the specified
|
||
controller configuration file does not exist, or if it contains no sections
|
||
applicable to the emulated system.
|
||
|
||
Controller configuration files use implementation-dependent input tokens. The
|
||
values available and their precise meanings depend on the exact version of MAME
|
||
used, the input devices connected, the selected input provider modules
|
||
(``keyboardprovider``, ``mouseprovider``, ``lightgunprovider`` and
|
||
``joystickprovider`` options), and possibly other settings.
|
||
|
||
|
||
.. _ctrlrcfg-structure:
|
||
|
||
Basic structure
|
||
---------------
|
||
|
||
Controller configuration files follow a similar format to the system
|
||
configuration files that MAME uses to save things like input settings and
|
||
bookkeeping data (created in the folder specified using the
|
||
:ref:`cfg_directory option <mame-commandline-cfgdirectory>`). This example
|
||
shows the overall structure of a controller configuration file:
|
||
|
||
.. code-block:: XML
|
||
|
||
<?xml version="1.0"?>
|
||
<mameconfig version="10">
|
||
<system name="default">
|
||
<input>
|
||
<!-- settings affecting all emulated systems go here -->
|
||
</input>
|
||
</system>
|
||
<system name="neogeo">
|
||
<input>
|
||
<!-- settings affecting neogeo and clones go here -->
|
||
</input>
|
||
</system>
|
||
<system name="intellec4.cpp">
|
||
<input>
|
||
<!-- settings affecting all systems defined in intellec4.cpp go here -->
|
||
</input>
|
||
</system>
|
||
</mameconfig>
|
||
|
||
The root of a controller configuration file must be a ``mameconfig`` element,
|
||
with a ``version`` attribute specifying the configuration format version
|
||
(currently ``10`` – MAME will not load a file using a different version). The
|
||
``mameconfig`` element contains one or more ``system`` elements, each of which
|
||
has a ``name`` attribute specifying the system(s) it applies to. Each
|
||
``system`` element contains an ``input`` element which holds the actual
|
||
``remap`` and ``port`` configuration elements, which will be described later.
|
||
|
||
When launching an emulated system, MAME will apply configuration from ``system``
|
||
elements where the value of the ``name`` attribute meets one of the following
|
||
criteria:
|
||
|
||
* If the ``name`` attribute has the value ``default``, it will always be applied
|
||
(including for the system/software selection menus).
|
||
* If the value of the ``name`` attribute matches the system’s short name, the
|
||
short name of its parent system, or the short name of its BIOS system (if
|
||
applicable).
|
||
* If the value of the ``name`` attribute matches the name of the source file
|
||
where the system is defined.
|
||
|
||
For example, for the game “DaeJeon! SanJeon SuJeon (AJTUE 990412 V1.000)”,
|
||
``system`` elements will be applied if their ``name`` attribute has the value
|
||
``default`` (applies to all systems), ``sanjeon`` (short name of the system
|
||
itself), ``sasissu`` (short name of the parent system), ``stvbios`` (short
|
||
name of the BIOS system), or ``stv.cpp`` (source file where the system is
|
||
defined).
|
||
|
||
As another example, a ``system`` element whose ``name`` attribute has the value
|
||
``zac2650.cpp`` will be applied for the systems “The Invaders”, “Super Invader
|
||
Attack (bootleg of The Invaders)”, and “Dodgem”.
|
||
|
||
Applicable ``system`` elements are applied in the order they appear in the
|
||
controller configuration file. Settings from elements that appear later in the
|
||
file may modify or override settings from elements that appear earlier. Within
|
||
a ``system`` element, ``remap`` elements are applied before ``port`` elements.
|
||
|
||
|
||
.. _ctrlrcfg-substitute:
|
||
|
||
Substituting default controls
|
||
-----------------------------
|
||
|
||
You can use a ``remap`` element to substitute one host input for another in
|
||
MAME’s default input configuration. For example, this substitutes keys on the
|
||
numeric keypad for the cursor direction keys:
|
||
|
||
.. code-block:: XML
|
||
|
||
<input>
|
||
<remap origcode="KEYCODE_UP" newcode="KEYCODE_8PAD" />
|
||
<remap origcode="KEYCODE_DOWN" newcode="KEYCODE_2PAD" />
|
||
<remap origcode="KEYCODE_LEFT" newcode="KEYCODE_4PAD" />
|
||
<remap origcode="KEYCODE_RIGHT" newcode="KEYCODE_6PAD" />
|
||
</input>
|
||
|
||
The ``origcode`` attribute specifies the token for the host input to be
|
||
substituted, and the ``newcode`` attribute specifies the token for the
|
||
replacement host input. In this case, assignments using the cursor up, down,
|
||
left and right arrows will be replaced with the numeric 8, 2, 4 and 6 keys on
|
||
the numeric keypad, respectively.
|
||
|
||
Note that substitutions specified using ``remap`` elements only apply to inputs
|
||
that use MAME’s default assignment for the input type. That is, they only apply
|
||
to default assignments for control types set in the “Input Assignments
|
||
(general)” menus. They *do not* apply to default control assignments set in
|
||
driver/device I/O port definitions (using the ``PORT_CODE`` macro).
|
||
|
||
MAME applies ``remap`` elements found inside any applicable ``system`` element.
|
||
|
||
|
||
.. _ctrlrcfg-typeoverride:
|
||
|
||
Overriding defaults by input type
|
||
---------------------------------
|
||
|
||
Use ``port`` elements with ``type`` attributes but without ``tag`` attributes to
|
||
override the default control assignments for emulated inputs by type:
|
||
|
||
.. code-block:: XML
|
||
|
||
<input>
|
||
<port type="UI_CONFIGURE">
|
||
<newseq type="standard">KEYCODE_TAB OR KEYCODE_1 KEYCODE_5</newseq>
|
||
</port>
|
||
<port type="UI_CANCEL">
|
||
<newseq type="standard">KEYCODE_ESC OR KEYCODE_2 KEYCODE_6</newseq>
|
||
</port>
|
||
|
||
<port type="P1_BUTTON1">
|
||
<newseq type="standard">KEYCODE_C OR JOYCODE_1_BUTTON1</newseq>
|
||
</port>
|
||
<port type="P1_BUTTON2">
|
||
<newseq type="standard">KEYCODE_LSHIFT OR JOYCODE_1_BUTTON2</newseq>
|
||
</port>
|
||
<port type="P1_BUTTON3">
|
||
<newseq type="standard">KEYCODE_Z OR JOYCODE_1_BUTTON3</newseq>
|
||
</port>
|
||
<port type="P1_BUTTON4">
|
||
<newseq type="standard">KEYCODE_X OR JOYCODE_1_BUTTON4</newseq>
|
||
</port>
|
||
</input>
|
||
|
||
This sets the following default input assignments:
|
||
|
||
Config Menu (User Interface)
|
||
Tab key, or 1 and 2 keys pressed simultaneously
|
||
UI Cancel (User Interface)
|
||
Escape key, or 2 and 6 keys pressed simultaneously
|
||
P1 Button 1 (Player 1 Controls)
|
||
C key, or joystick 1 button 1
|
||
P1 Button 2 (Player 1 Controls)
|
||
Left Shift key, or joystick 1 button 2
|
||
P1 Button 3 (Player 1 Controls)
|
||
Z key, or joystick 1 button 3
|
||
P1 Button 4 (Player 1 Controls)
|
||
X key, or joystick 1 button 4
|
||
|
||
Note that this will only apply for inputs that use MAME’s default assignment for
|
||
the input type. That is, ``port`` elements without ``tag`` attributes only
|
||
override default assignments for control types set in the “Input Assignments
|
||
(general)” menus. They *do not* override default control assignments set in
|
||
driver/device I/O port definitions (using the ``PORT_CODE`` macro).
|
||
|
||
MAME applies ``port`` elements without ``tag`` attributes found inside any
|
||
applicable ``system`` element.
|
||
|
||
|
||
.. _ctrlrcfg-ctrloverride:
|
||
|
||
Overriding defaults for specific inputs
|
||
---------------------------------------
|
||
|
||
Use ``port`` elements with ``tag``, ``type``, ``mask`` and ``defvalue``
|
||
attributes to override defaults for specific inputs. These ``port`` elements
|
||
should only occur inside ``system`` elements that apply to particular systems or
|
||
source files (i.e. they should not occur inside ``system`` elements where the
|
||
``name`` attribute has the value ``default``). The default control assignments
|
||
can be overridden, as well as the toggle setting for digital inputs.
|
||
|
||
The ``tag``, ``type``, ``mask`` and ``defvalue`` are used to identify the
|
||
affected input. You can find out the values to use for a particular input by
|
||
changing its control assignment, exiting MAME, and checking the values in the
|
||
system configuration file (created in the folder specified using the
|
||
:ref:`cfg_directory option <mame-commandline-cfgdirectory>`). Note that these
|
||
values are not guaranteed to be stable, and may change between MAME versions.
|
||
|
||
Here’s an example that overrides defaults for 280-ZZZAP:
|
||
|
||
.. code-block:: XML
|
||
|
||
<system name="280zzzap">
|
||
<input>
|
||
<port tag=":IN0" type="P1_BUTTON2" mask="16" defvalue="0" toggle="no" />
|
||
<port tag=":IN1" type="P1_PADDLE" mask="255" defvalue="127">
|
||
<newseq type="increment">KEYCODE_K</newseq>
|
||
<newseq type="decrement">KEYCODE_J</newseq>
|
||
</port>
|
||
</input>
|
||
</system>
|
||
|
||
This sets the controls to steer left and right to the K and J keys,
|
||
respectively, and disables the toggle setting for the gear shift input.
|
||
|
||
|
||
.. _ctrlrcfg-mapdevice:
|
||
|
||
Assigning input device numbers
|
||
------------------------------
|
||
|
||
Use ``mapdevice`` elements with ``device`` and ``controller`` attributes to
|
||
assign stable numbers to input devices. Note that all devices explicitly
|
||
configured in this way must be connected when MAME starts for this to work as
|
||
expected.
|
||
|
||
Set the ``device`` attribute to the device ID of the input device, and set the
|
||
``controller`` attribute to the desired input device token (device type and
|
||
number).
|
||
|
||
Here’s an example numbering two light guns and two XInput game controllers:
|
||
|
||
.. code-block:: XML
|
||
|
||
<system name="default">
|
||
<input>
|
||
<mapdevice device="VID_D209&PID_1601" controller="GUNCODE_1" />
|
||
<mapdevice device="VID_D209&PID_1602" controller="GUNCODE_2" />
|
||
<mapdevice device="XInput Player 1" controller="JOYCODE_1" />
|
||
<mapdevice device="XInput Player 2" controller="JOYCODE_2" />
|
||
</input>
|
||
</system>
|
||
|
||
MAME applies ``mapdevice`` elements found inside any applicable ``system``
|
||
element.
|