From fd60aa276bfede339a97ec20be978f0a5353a7dd Mon Sep 17 00:00:00 2001 From: Bryan Forbes Date: Sun, 22 Feb 2026 16:24:46 -0600 Subject: [PATCH] refactor: share code between mame and lr-mame generators --- .../generators/libretro/libretroMAMEConfig.py | 273 ++----- .../configgen/generators/mame/mameCommon.py | 393 +++++++++- .../generators/mame/mameControllers.py | 162 ++-- .../generators/mame/mameGenerator.py | 213 +----- .../data/mame/atom_flop_autoload.csv | 16 - .../data/mame/atom_flop_autoload.toml | 16 + .../data/mame/camplynx_cass_autoload.csv | 66 -- .../data/mame/camplynx_cass_autoload.toml | 66 ++ .../data/mame/mameCapcom.txt | 281 ------- .../data/mame/mameControls.csv | 123 ---- .../data/mame/mameControls.toml | 154 ++++ .../data/mame/mameKInstinct.txt | 3 - .../data/mame/mameMKombat.txt | 40 - .../data/mame/mameNeogeo.txt | 261 ------- .../data/mame/mameRoms.toml | 692 ++++++++++++++++++ .../data/mame/mameRotatedstick.txt | 10 - .../data/mame/mameTwinstick.txt | 89 --- .../data/mame/messControls.csv | 208 ------ .../data/mame/messControls.toml | 255 +++++++ .../data/mame/messSystems.csv | 44 -- .../data/mame/messSystems.toml | 148 ++++ ...s_autoload.csv => coco_cass_autoload.toml} | 7 +- ...p_autoload.csv => coco_flop_autoload.toml} | 7 +- 23 files changed, 1854 insertions(+), 1673 deletions(-) delete mode 100644 package/batocera/core/batocera-configgen/data/mame/atom_flop_autoload.csv create mode 100644 package/batocera/core/batocera-configgen/data/mame/atom_flop_autoload.toml delete mode 100644 package/batocera/core/batocera-configgen/data/mame/camplynx_cass_autoload.csv create mode 100644 package/batocera/core/batocera-configgen/data/mame/camplynx_cass_autoload.toml delete mode 100755 package/batocera/core/batocera-configgen/data/mame/mameCapcom.txt delete mode 100644 package/batocera/core/batocera-configgen/data/mame/mameControls.csv create mode 100644 package/batocera/core/batocera-configgen/data/mame/mameControls.toml delete mode 100755 package/batocera/core/batocera-configgen/data/mame/mameKInstinct.txt delete mode 100755 package/batocera/core/batocera-configgen/data/mame/mameMKombat.txt delete mode 100755 package/batocera/core/batocera-configgen/data/mame/mameNeogeo.txt create mode 100644 package/batocera/core/batocera-configgen/data/mame/mameRoms.toml delete mode 100644 package/batocera/core/batocera-configgen/data/mame/mameRotatedstick.txt delete mode 100755 package/batocera/core/batocera-configgen/data/mame/mameTwinstick.txt delete mode 100644 package/batocera/core/batocera-configgen/data/mame/messControls.csv create mode 100644 package/batocera/core/batocera-configgen/data/mame/messControls.toml delete mode 100644 package/batocera/core/batocera-configgen/data/mame/messSystems.csv create mode 100644 package/batocera/core/batocera-configgen/data/mame/messSystems.toml rename package/batocera/emulators/mame/autoload/{coco_cass_autoload.csv => coco_cass_autoload.toml} (71%) mode change 100755 => 100644 rename package/batocera/emulators/mame/autoload/{coco_flop_autoload.csv => coco_flop_autoload.toml} (73%) mode change 100755 => 100644 diff --git a/package/batocera/core/batocera-configgen/configgen/configgen/generators/libretro/libretroMAMEConfig.py b/package/batocera/core/batocera-configgen/configgen/configgen/generators/libretro/libretroMAMEConfig.py index 8d0db4f0880..5de98871e8b 100644 --- a/package/batocera/core/batocera-configgen/configgen/configgen/generators/libretro/libretroMAMEConfig.py +++ b/package/batocera/core/batocera-configgen/configgen/configgen/generators/libretro/libretroMAMEConfig.py @@ -1,18 +1,22 @@ from __future__ import annotations import codecs -import csv import logging import os import shutil -import xml.etree.ElementTree as ET import zipfile from pathlib import Path from typing import TYPE_CHECKING from xml.dom import minidom from ...batoceraPaths import BIOS, CONFIGS, DEFAULTS_DIR, ROMS, SAVES, USER_DECORATIONS, mkdir_if_not_exists -from ..mame.mameCommon import is_atom_floppy +from ...exceptions import InvalidConfiguration +from ..mame.mameCommon import ( + get_autorun_command, + get_mame_control_mapping, + get_mess_system_controls, + get_mess_system_info, +) if TYPE_CHECKING: from collections.abc import Sequence @@ -83,7 +87,7 @@ def generateMAMEConfigs(playersControllers: Controllers, system: Emulator, rom: pluginsToLoad += [ "coindrop" ] if pluginsToLoad: commandLine += [ "-plugins", "-plugin", ",".join(pluginsToLoad) ] - messMode = -1 + mess_system = None messModel = '' else: # Set up command line for MESS or MAMEVirtual @@ -99,27 +103,17 @@ def generateMAMEConfigs(playersControllers: Controllers, system: Emulator, rom: softList = 'fmtowns_cd' # Determine MESS system name (if needed) - openFile = (DEFAULTS_DIR / "data" / "mame" / "messSystems.csv").open() - messSystems: list[str] = [] - messSysName: list[str] = [] - messRomType: list[str] = [] - messAutoRun: list[str] = [] - with openFile: - messDataList = csv.reader(openFile, delimiter=';', quotechar="'") - for row in messDataList: - messSystems.append(row[0]) - messSysName.append(row[1]) - messRomType.append(row[2]) - messAutoRun.append(row[3]) - messMode = messSystems.index(system.name) + mess_system = get_mess_system_info(system) + if mess_system is None: + raise InvalidConfiguration(f'Unknown MESS system: {system.name}') # Alternate system for machines that have different configs (ie computers with different hardware) - messModel = messSysName[messMode] + messModel = mess_system.name if altmodel := system.config.get("altmodel"): messModel = altmodel commandLine += [ messModel ] - if messSysName[messMode] == "": + if not mess_system.name: # Command line for non-arcade, non-system ROMs (lcdgames, plugnplay) if system.config.get_bool("customcfg"): cfgPath = CONFIGS / corePath / "custom" @@ -237,7 +231,7 @@ def generateMAMEConfigs(playersControllers: Controllers, system: Emulator, rom: else: commandLine += [ "-flop1" ] else: - commandLine += [ "-" + messRomType[messMode] ] + commandLine += [ "-" + mess_system.rom_type ] else: if boot_disk: if (altromtype == "flop1" or not altromtype) and boot_disk in [ "macos30", "macos608", "macos701", "macos75" ]: @@ -245,12 +239,12 @@ def generateMAMEConfigs(playersControllers: Controllers, system: Emulator, rom: elif altromtype: commandLine += [ "-" + altromtype ] else: - commandLine += [ "-" + messRomType[messMode] ] + commandLine += [ "-" + mess_system.rom_type ] else: if altromtype: commandLine += [ "-" + altromtype ] else: - commandLine += [ "-" + messRomType[messMode] ] + commandLine += [ "-" + mess_system.rom_type ] # Use the full filename for MESS non-softlist ROMs commandLine += [ f'"{rom}"' ] commandLine += [ "-rompath", f'"{rom.parent};/userdata/bios/"' ] @@ -296,112 +290,27 @@ def generateMAMEConfigs(playersControllers: Controllers, system: Emulator, rom: # MESS config folder if system.config.get_bool("customcfg"): - cfgPath = CONFIGS / corePath / messSysName[messMode] / "custom" + cfgPath = CONFIGS / corePath / mess_system.name / "custom" else: - cfgPath = SAVES / "mame" / "cfg" / messSysName[messMode] + cfgPath = SAVES / "mame" / "cfg" / mess_system.name if system.config.get_bool("pergamecfg"): - cfgPath = CONFIGS / corePath / messSysName[messMode] / rom.name + cfgPath = CONFIGS / corePath / mess_system.name / rom.name mkdir_if_not_exists(cfgPath) commandLine += [ '-cfg_directory', f'"{cfgPath}"' ] # Autostart via ini file - # Init variables, delete old ini if it exists, prepare ini path # lr-mame does NOT support multiple ini paths - autoRunCmd = "" - autoRunDelay = 0 mameIniDir = SAVES / "mame" / "mame" / "ini" mkdir_if_not_exists(mameIniDir) if (mameIniDir / "batocera.ini").exists(): (mameIniDir / "batocera.ini").unlink() - # bbc has different boots for floppy & cassette, no special boot for carts - if system.name == "bbcmicro": - if altromtype or softList: - if altromtype == "cass" or softList[-4:] == "cass": - autoRunCmd = '*tape\\nchain""\\n' - autoRunDelay = 2 - elif (altromtype and altromtype.startswith("flop")) or "flop" in softList: - autoRunCmd = '*cat\\n\\n\\n\\n*exec !boot\\n' - autoRunDelay = 3 - else: - autoRunCmd = '*cat\\n\\n\\n\\n*exec !boot\\n' - autoRunDelay = 3 - # fm7 boots floppies, needs cassette loading - elif system.name == "fm7": - if ( - system.config.get("altromtype") == "cass" - or (softList != "" and softList[-4:] == "cass") - ): - autoRunCmd = 'LOADM”“,,R\\n' - autoRunDelay = 5 - elif system.name == "coco": - romType = 'cart' - autoRunDelay = 2 - - # if using software list, use "usage" for autoRunCmd (if provided) - if softList != "": - softListFile = Path(f'/usr/bin/mame/hash/{softList}.xml') - if softListFile.exists(): - softwarelist = ET.parse(softListFile) - for software in softwarelist.findall('software'): - if software.attrib and software.get('name') == romDrivername: - for info in software.iter('info'): - if info.get('name') == 'usage': - autoRunCmd = f'{info.get('value')}\\n' - - # if still undefined, default autoRunCmd based on media type - if autoRunCmd == "": - if altromtype == "cass" or (softList and softList.endswith("cass")) or rom.suffix.casefold() == ".cas": - romType = 'cass' - if romDrivername.casefold().endswith(".bas"): - autoRunCmd = 'CLOAD:RUN\\n' - else: - autoRunCmd = 'CLOADM:EXEC\\n' - if altromtype == "flop1" or (softList and softList.endswith("flop")) or rom.suffix.casefold() == ".dsk": - romType = 'flop' - if romDrivername.casefold().endswith(".bas"): - autoRunCmd = f'RUN \"{romDrivername}\"\\n' - else: - autoRunCmd = f'LOADM \"{romDrivername}\":EXEC\\n' - - # check for a user override - autoRunFile = CONFIGS / 'mame' / 'autoload' / f'{system.name}_{romType}_autoload.csv' - if autoRunFile.exists(): - with autoRunFile.open() as openARFile: - autoRunList = csv.reader(openARFile, delimiter=';', quotechar="'") - for row in autoRunList: - if row and not row[0].startswith('#') and row[0].casefold() == romDrivername.casefold(): - autoRunCmd = row[1] + "\\n" - elif system.name == "atom": - autoRunDelay = 2 - autoRunCmd = messAutoRun[messMode] - if ( - (altromtype == "flop1") or - (softList and softList.endswith("flop")) or - is_atom_floppy(rom) - ): - autoRunFile = DEFAULTS_DIR / 'data' / 'mame' / 'atom_flop_autoload.csv' - if autoRunFile.exists(): - with autoRunFile.open() as openARFile: - autoRunList = csv.reader(openARFile, delimiter=';', quotechar="'") - for row in autoRunList: - if row and not row[0].startswith('#') and row[0].casefold() == rom.stem.casefold(): - autoRunCmd = row[1] + "\\n" - break - else: - # Check for an override file, otherwise use generic (if it exists) - autoRunCmd = messAutoRun[messMode] - autoRunFile = DEFAULTS_DIR / 'data' / 'mame' / f'{softList}_autoload.csv' - if autoRunFile.exists(): - with autoRunFile.open() as openARFile: - autoRunList = csv.reader(openARFile, delimiter=';', quotechar="'") - for row in autoRunList: - if row[0].casefold() == rom.stem.casefold(): - autoRunCmd = row[1] + "\\n" - autoRunDelay = 3 + autoRunCmd, autoRunDelay = get_autorun_command( + system.name, mess_system.auto_run, rom, altromtype or None, softList, atom_delay=2 + ) inipath = SAVES / 'mame' / 'mame' / 'ini' commandLine += [ '-inipath', f'"{inipath}"' ] - if autoRunCmd != "": + if autoRunCmd: if autoRunCmd.startswith("'"): autoRunCmd.replace("'", "") iniFile = (SAVES / 'mame' / 'mame' / 'ini' / 'batocera.ini').open("w") @@ -472,7 +381,7 @@ def generateMAMEConfigs(playersControllers: Controllers, system: Emulator, rom: cmdFile.close() # Call Controller Config - if messMode == -1: + if mess_system is None: generateMAMEPadConfig(cfgPath, playersControllers, system, "", rom, specialController, guns) else: generateMAMEPadConfig(cfgPath, playersControllers, system, messModel, rom, specialController, guns) @@ -579,25 +488,8 @@ def generateMAMEPadConfig( # Get controller scheme altButtons = getMameControlScheme(system, rom) - # Load standard controls from csv - controlFile = DEFAULTS_DIR / 'data' / 'mame' / 'mameControls.csv' - controlDict: dict[str, dict[str, str]] = {} - with controlFile.open() as openFile: - controlList = csv.reader(openFile) - for row in controlList: - if row[0] not in controlDict: - controlDict[row[0]] = {} - controlDict[row[0]][row[1]] = row[2] - # Common controls - mappings: dict[str, str] = {} - for controlDef in controlDict['default']: - mappings[controlDef] = controlDict['default'][controlDef] - - # Buttons that change based on game/setting - if altButtons in controlDict: - for controlDef in controlDict[altButtons]: - mappings.update({controlDef: controlDict[altButtons][controlDef]}) + mappings = get_mame_control_mapping(altButtons) xml_mameconfig = getRoot(config, "mameconfig") xml_mameconfig.setAttribute("version", "10") # otherwise, config of pad won't work at first run (batocera v33) @@ -608,7 +500,6 @@ def generateMAMEPadConfig( xml_input = config.createElement("input") xml_system.appendChild(xml_input) - messControlDict = {} if messSysName in [ "bbcb", "bbcm", "bbcm512", "bbcmc" ]: if specialController == 'none': useControls = "bbc" @@ -629,50 +520,9 @@ def generateMAMEPadConfig( # Open or create alternate config file for systems with special controllers/settings # If the system/game is set to per game config, don't try to open/reset an existing file, only write if it's blank or going to the shared cfg folder - specialControlList = [ "cdimono1", "apfm1000", "astrocde", "adam", "arcadia", "gamecom", "tutor", "crvision", "bbcb", "bbcm", "bbcm512", "bbcmc", "xegs", \ - "socrates", "vgmplay", "pdp1", "vc4000", "fmtmarty", "gp32", "apple2p", "apple2e", "apple2ee" ] - if messSysName in specialControlList: - # Load mess controls from csv - messControlFile = DEFAULTS_DIR / 'data' / 'mame' / 'messControls.csv' - with messControlFile.open() as openMessFile: - controlList = csv.reader(openMessFile, delimiter=';') - for row in controlList: - if row[0] not in messControlDict: - messControlDict[row[0]] = {} - messControlDict[row[0]][row[1]] = {} - currentEntry = messControlDict[row[0]][row[1]] - currentEntry['type'] = row[2] - currentEntry['player'] = int(row[3]) - currentEntry['tag'] = row[4] - currentEntry['key'] = row[5] - if currentEntry['type'] in [ 'special', 'main' ]: - currentEntry['mapping'] = row[6] - currentEntry['useMapping'] = row[7] - currentEntry['reversed'] = row[8] - currentEntry['mask'] = row[9] - currentEntry['default'] = row[10] - elif currentEntry['type'] == 'analog': - currentEntry['incMapping'] = row[6] - currentEntry['decMapping'] = row[7] - currentEntry['useMapping1'] = row[8] - currentEntry['useMapping2'] = row[9] - currentEntry['reversed'] = row[10] - currentEntry['mask'] = row[11] - currentEntry['default'] = row[12] - currentEntry['delta'] = row[13] - currentEntry['axis'] = row[14] - if currentEntry['type'] == 'combo': - currentEntry['kbMapping'] = row[6] - currentEntry['mapping'] = row[7] - currentEntry['useMapping'] = row[8] - currentEntry['reversed'] = row[9] - currentEntry['mask'] = row[10] - currentEntry['default'] = row[11] - if currentEntry['reversed'] == 'False': - currentEntry['reversed'] = False - else: - currentEntry['reversed'] = True + messControlDict = get_mess_system_controls(messSysName, useControls) + if messControlDict is not None: config_alt = minidom.Document() configFile_alt = cfgPath / f"{messSysName}.cfg" if configFile_alt.exists(): @@ -728,7 +578,7 @@ def generateMAMEPadConfig( for mapping in mappings_use: if mappings_use[mapping] in pad.inputs: if mapping in [ 'START', 'COIN' ]: - xml_input.appendChild(generateSpecialPortElement(pad, config, 'standard', nplayer, pad.index, mapping + str(nplayer), mappings_use[mapping], retroPad[mappings_use[mapping]], False, "", "")) + xml_input.appendChild(generateSpecialPortElement(pad, config, 'standard', nplayer, pad.index, mapping + str(nplayer), mappings_use[mapping], retroPad[mappings_use[mapping]], False)) else: xml_input.appendChild(generatePortElement(pad, config, nplayer, pad.index, mapping, mappings_use[mapping], retroPad[mappings_use[mapping]], False, altButtons)) else: @@ -738,29 +588,28 @@ def generateMAMEPadConfig( #UI Mappings if nplayer == 1: - xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_DOWN", "DOWN", mappings_use["JOYSTICK_DOWN"], retroPad[mappings_use["JOYSTICK_DOWN"]], False, "", "")) # Down - xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_LEFT", "LEFT", mappings_use["JOYSTICK_LEFT"], retroPad[mappings_use["JOYSTICK_LEFT"]], False, "", "")) # Left - xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_UP", "UP", mappings_use["JOYSTICK_UP"], retroPad[mappings_use["JOYSTICK_UP"]], False, "", "")) # Up - xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_RIGHT", "RIGHT", mappings_use["JOYSTICK_RIGHT"], retroPad[mappings_use["JOYSTICK_RIGHT"]], False, "", "")) # Right - xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_SELECT", "ENTER", 'a', retroPad['a'], False, "", "")) # Select - - if useControls in messControlDict: - for controlDef in messControlDict[useControls]: - thisControl = messControlDict[useControls][controlDef] - if nplayer == thisControl['player'] and xml_input_alt is not None and config_alt is not None: - if thisControl['type'] == 'special': - xml_input_alt.appendChild(generateSpecialPortElement(pad, config_alt, thisControl['tag'], nplayer, pad.index, thisControl['key'], thisControl['mapping'], \ - retroPad[mappings_use[thisControl['useMapping']]], thisControl['reversed'], thisControl['mask'], thisControl['default'])) - elif thisControl['type'] == 'main': - xml_input.appendChild(generateSpecialPortElement(pad, config_alt, thisControl['tag'], nplayer, pad.index, thisControl['key'], thisControl['mapping'], \ - retroPad[mappings_use[thisControl['useMapping']]], thisControl['reversed'], thisControl['mask'], thisControl['default'])) - elif thisControl['type'] == 'analog': - xml_input_alt.appendChild(generateAnalogPortElement(pad, config_alt, thisControl['tag'], nplayer, pad.index, thisControl['key'], mappings_use[thisControl['incMapping']], \ - mappings_use[thisControl['decMapping']], retroPad[mappings_use[thisControl['useMapping1']]], retroPad[mappings_use[thisControl['useMapping2']]], thisControl['reversed'], \ - thisControl['mask'], thisControl['default'], thisControl['delta'], thisControl['axis'])) - elif thisControl['type'] == 'combo': - xml_input_alt.appendChild(generateComboPortElement(pad, config_alt, thisControl['tag'], pad.index, thisControl['key'], thisControl['kbMapping'], thisControl['mapping'], \ - retroPad[mappings_use[thisControl['useMapping']]], thisControl['reversed'], thisControl['mask'], thisControl['default'])) + xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_DOWN", "DOWN", mappings_use["JOYSTICK_DOWN"], retroPad[mappings_use["JOYSTICK_DOWN"]], False)) # Down + xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_LEFT", "LEFT", mappings_use["JOYSTICK_LEFT"], retroPad[mappings_use["JOYSTICK_LEFT"]], False)) # Left + xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_UP", "UP", mappings_use["JOYSTICK_UP"], retroPad[mappings_use["JOYSTICK_UP"]], False)) # Up + xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_RIGHT", "RIGHT", mappings_use["JOYSTICK_RIGHT"], retroPad[mappings_use["JOYSTICK_RIGHT"]], False)) # Right + xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_SELECT", "ENTER", 'a', retroPad['a'], False)) # Select + + if messControlDict: + for thisControl in messControlDict.values(): + if nplayer == thisControl.player and xml_input_alt is not None and config_alt is not None: + if thisControl.type == 'special': + xml_input_alt.appendChild(generateSpecialPortElement(pad, config_alt, thisControl.tag, nplayer, pad.index, thisControl.key, thisControl.mapping, \ + retroPad[mappings_use[thisControl.useMapping]], thisControl.reversed, thisControl.mask, thisControl.default)) + elif thisControl.type == 'main': + xml_input.appendChild(generateSpecialPortElement(pad, config_alt, thisControl.tag, nplayer, pad.index, thisControl.key, thisControl.mapping, \ + retroPad[mappings_use[thisControl.useMapping]], thisControl.reversed, thisControl.mask, thisControl.default)) + elif thisControl.type == 'analog': + xml_input_alt.appendChild(generateAnalogPortElement(pad, config_alt, thisControl.tag, nplayer, pad.index, thisControl.key, mappings_use[thisControl.incMapping], \ + mappings_use[thisControl.decMapping], retroPad[mappings_use[thisControl.incUseMapping]], retroPad[mappings_use[thisControl.decUseMapping]], thisControl.reversed, \ + thisControl.mask, thisControl.default, thisControl.delta, thisControl.axis)) + elif thisControl.type == 'combo': + xml_input_alt.appendChild(generateComboPortElement(pad, config_alt, thisControl.tag, pad.index, thisControl.key, thisControl.kbMapping, thisControl.mapping, \ + retroPad[mappings_use[thisControl.useMapping]], thisControl.reversed, thisControl.mask, thisControl.default)) # save the config file @@ -772,7 +621,7 @@ def generateMAMEPadConfig( mameXml.write(dom_string) # Write alt config (if used, custom config is turned off or file doesn't exist yet) - if messSysName in specialControlList and overwriteSystem and config_alt is not None and configFile_alt is not None: + if messControlDict is not None and overwriteSystem and config_alt is not None and configFile_alt is not None: with codecs.open(str(configFile_alt), "w", "utf-8") as mameXml_alt: dom_string_alt = os.linesep.join([s for s in config_alt.toprettyxml().splitlines() if s.strip()]) # remove ugly empty lines while minicom adds them... mameXml_alt.write(dom_string_alt) @@ -799,13 +648,13 @@ def generatePortElement(pad: Controller, config: minidom.Document, nplayer: int, xml_newseq.appendChild(value) return xml_port -def generateSpecialPortElement(pad: Controller, config: minidom.Document, tag: str, nplayer: int, padindex: int, mapping: str, key: str, input: str, reversed: bool, mask: str, default: str): +def generateSpecialPortElement(pad: Controller, config: minidom.Document, tag: str, nplayer: int, padindex: int, mapping: str, key: str, input: str, reversed: bool, mask: int | None = None, default: int | None = None): # Special button input (ie mouse button to gamepad) xml_port = config.createElement("port") xml_port.setAttribute("tag", tag) xml_port.setAttribute("type", mapping) - xml_port.setAttribute("mask", mask) - xml_port.setAttribute("defvalue", default) + xml_port.setAttribute("mask", f'{mask}' if mask is not None else '') + xml_port.setAttribute("defvalue", f'{default}' if default is not None else '') xml_newseq = config.createElement("newseq") xml_newseq.setAttribute("type", "standard") xml_port.appendChild(xml_newseq) @@ -816,13 +665,13 @@ def generateSpecialPortElement(pad: Controller, config: minidom.Document, tag: s xml_newseq.appendChild(value) return xml_port -def generateComboPortElement(pad: Controller, config: minidom.Document, tag: str, padindex: int, mapping: str, kbkey: str, key: str, input: str, reversed: bool, mask: str, default: str): +def generateComboPortElement(pad: Controller, config: minidom.Document, tag: str, padindex: int, mapping: str, kbkey: str, key: str, input: str, reversed: bool, mask: int | None = None, default: int | None = None): # Maps a keycode + button - for important keyboard keys when available xml_port = config.createElement("port") xml_port.setAttribute("tag", tag) xml_port.setAttribute("type", mapping) - xml_port.setAttribute("mask", mask) - xml_port.setAttribute("defvalue", default) + xml_port.setAttribute("mask", f'{mask}' if mask is not None else '') + xml_port.setAttribute("defvalue", f'{default}' if default is not None else '') xml_newseq = config.createElement("newseq") xml_newseq.setAttribute("type", "standard") xml_port.appendChild(xml_newseq) @@ -830,14 +679,14 @@ def generateComboPortElement(pad: Controller, config: minidom.Document, tag: str xml_newseq.appendChild(value) return xml_port -def generateAnalogPortElement(pad: Controller, config: minidom.Document, tag: str, nplayer: int, padindex: int, mapping: str, inckey: str, deckey: str, mappedinput: str, mappedinput2: str, reversed: bool, mask: str, default: str, delta: str, axis: str = ''): +def generateAnalogPortElement(pad: Controller, config: minidom.Document, tag: str, nplayer: int, padindex: int, mapping: str, inckey: str, deckey: str, mappedinput: str, mappedinput2: str, reversed: bool, mask: int, default: int, delta: int, axis: str = ''): # Mapping analog to digital (mouse, etc) xml_port = config.createElement("port") xml_port.setAttribute("tag", tag) xml_port.setAttribute("type", mapping) - xml_port.setAttribute("mask", mask) - xml_port.setAttribute("defvalue", default) - xml_port.setAttribute("keydelta", delta) + xml_port.setAttribute("mask", f'{mask}') + xml_port.setAttribute("defvalue", f'{default}') + xml_port.setAttribute("keydelta", f'{delta}') xml_newseq_inc = config.createElement("newseq") xml_newseq_inc.setAttribute("type", "increment") xml_port.appendChild(xml_newseq_inc) diff --git a/package/batocera/core/batocera-configgen/configgen/configgen/generators/mame/mameCommon.py b/package/batocera/core/batocera-configgen/configgen/configgen/generators/mame/mameCommon.py index 44d407b2527..07ae832c2ef 100644 --- a/package/batocera/core/batocera-configgen/configgen/configgen/generators/mame/mameCommon.py +++ b/package/batocera/core/batocera-configgen/configgen/configgen/generators/mame/mameCommon.py @@ -1,21 +1,124 @@ from __future__ import annotations +import csv import logging import subprocess +import tomllib +import xml.etree.ElementTree as ET import zipfile +from dataclasses import dataclass from pathlib import Path -from typing import Final +from typing import TYPE_CHECKING, Any, Final, Literal, cast + +from ...exceptions import InvalidConfiguration +from .mamePaths import MAME_CONFIG, MAME_DEFAULT_DATA + +if TYPE_CHECKING: + from ...Emulator import Emulator + from .mameTypes import MameControlScheme _logger = logging.getLogger(__name__) # The comprehensive list of known floppy disk extensions for the Atom system _ATOM_FLOPPY_EXTENSIONS: Final = { - '.mfi', '.dfi', '.hfe', '.mfm', '.td0', '.imd', '.d77', '.d88', - '.1dd', '.cqm', '.cqi', '.dsk', '.40t' + '.mfi', + '.dfi', + '.hfe', + '.mfm', + '.td0', + '.imd', + '.d77', + '.d88', + '.1dd', + '.cqm', + '.cqi', + '.dsk', + '.40t', } _7Z_EXECUTABLE: Final = Path('/usr/bin/7z') +_SOFTLIST_HASH_DIR: Final = Path('/usr/bin/mame/hash') + +_SPECIAL_CONTROL_LIST: Final = [ + 'cdimono1', + 'apfm1000', + 'astrocde', + 'adam', + 'arcadia', + 'gamecom', + 'tutor', + 'crvision', + 'bbcb', + 'bbcm', + 'bbcm512', + 'bbcmc', + 'xegs', + 'socrates', + 'vgmplay', + 'pdp1', + 'vc4000', + 'fmtmarty', + 'gp32', + 'apple2p', + 'apple2e', + 'apple2ee', +] + + +@dataclass(slots=True) +class MessSystemInfo: + name: str + rom_type: str + auto_run: str | None + + +def get_mess_system_info(system: Emulator, /) -> MessSystemInfo | None: + mess_systems = tomllib.loads((MAME_DEFAULT_DATA / 'messSystems.toml').read_text()) + mess_system = mess_systems.get(system.name, None) + + # This must be an `is not None` check because the dictionary could be empty + if mess_system is not None: + return MessSystemInfo( + mess_system.get('name', system.name), + mess_system.get('rom_type', ''), + mess_system.get('auto_run'), + ) + + return None + + +def _load_csv_autorun_override(csv_path: Path, rom_name: str, /) -> str | None: + """Look up an autorun command override from a legacy CSV autoload file. -def is_atom_floppy(rom: Path, /) -> bool: + The CSV format uses semicolon delimiters, single-quote quotechar, + and lines starting with # are comments. + """ + if not csv_path.exists(): + return None + + with csv_path.open() as f: + for row in csv.reader(f, delimiter=';', quotechar="'"): + if row and not row[0].startswith('#') and row[0].casefold() == rom_name.casefold(): + return row[1] + + return None + + +def _load_autorun_override(toml_path: Path, rom_name: str, /) -> str | None: + """Look up an autorun command override from an autoload file. + + Checks for a TOML file first. If not found, falls back to a legacy CSV + file at the same path with a .csv extension. + + Returns the command string if found (case-insensitive key match), or None. + """ + if toml_path.exists(): + overrides = {k.casefold(): v for k, v in tomllib.loads(toml_path.read_text()).items()} + return overrides.get(rom_name.casefold()) + + return _load_csv_autorun_override(toml_path.with_suffix('.csv'), rom_name) + + +def _is_atom_floppy(rom: Path, /) -> bool: extension = rom.suffix.casefold() if extension in _ATOM_FLOPPY_EXTENSIONS: return True @@ -42,3 +145,285 @@ def is_atom_floppy(rom: Path, /) -> bool: _logger.error('The executable was not found at %s. Cannot inspect .7z files.', _7Z_EXECUTABLE) return False + + +def _get_coco_autorun( + rom_name: str, + rom_ext: str, + altromtype: str | None, + soft_list: str, + system_name: str, + /, +) -> tuple[str, int]: + rom_type = 'cart' + auto_run_cmd = '' + auto_run_delay = 2 + + # if using software list, use "usage" for autoRunCmd (if provided) + if soft_list: + soft_list_file = _SOFTLIST_HASH_DIR / f'{soft_list}.xml' + if soft_list_file.exists(): + softwarelist = ET.parse(soft_list_file) + for software in softwarelist.findall('software'): + if software.attrib and software.get('name') == rom_name: + for info in software.iter('info'): + if info.get('name') == 'usage': + auto_run_cmd = rf'{info.get("value")}\n' + + # if still undefined, default autoRunCmd based on media type + if not auto_run_cmd: + if altromtype == 'cass' or (soft_list and soft_list.endswith('cass')) or rom_ext.casefold() == '.cas': + rom_type = 'cass' + if rom_name.casefold().endswith('.bas'): + auto_run_cmd = r'CLOAD:RUN\n' + else: + auto_run_cmd = r'CLOADM:EXEC\n' + if altromtype == 'flop1' or (soft_list and soft_list.endswith('flop')) or rom_ext.casefold() == '.dsk': + rom_type = 'flop' + if rom_name.casefold().endswith('.bas'): + auto_run_cmd = rf'RUN "{rom_name}"\n' + else: + auto_run_cmd = rf'LOADM "{rom_name}":EXEC\n' + + # check for a user override + override = _load_autorun_override(MAME_CONFIG / 'autoload' / f'{system_name}_{rom_type}_autoload.toml', rom_name) + if override is not None: + auto_run_cmd = rf'{override}\n' + + return auto_run_cmd, auto_run_delay + + +def get_autorun_command( + system_name: str, + mess_auto_run: str | None, + rom: Path, + altromtype: str | None, + soft_list: str, + /, + *, + atom_delay: int = 1, +) -> tuple[str, int]: + """Determine the autorun command and delay for a MESS system. + + Returns (auto_run_cmd, auto_run_delay). auto_run_cmd is empty string if no autorun. + """ + rom_name = rom.stem + + # bbc has different boots for floppy & cassette, no special boot for carts + if system_name == 'bbcmicro': + if altromtype or soft_list: + if altromtype == 'cass' or soft_list.endswith('cass'): + return r'*tape\nchain""\n', 2 + if (altromtype and altromtype.startswith('flop')) or soft_list.endswith('flop'): + return r'*cat\n\n\n\n*exec !boot\n', 3 + else: + return r'*cat\n\n\n\n*exec !boot\n', 3 + return '', 0 + + # fm7 boots floppies, needs cassette loading + if system_name == 'fm7': + if altromtype == 'cass' or (soft_list and soft_list.endswith('cass')): + return r'LOADM"",,R\n', 5 + return '', 0 + + if system_name == 'coco': + return _get_coco_autorun(rom_name, rom.suffix, altromtype, soft_list, system_name) + + if system_name == 'atom': + auto_run_cmd = mess_auto_run or '' + auto_run_delay = atom_delay + if altromtype == 'flop1' or (soft_list and soft_list.endswith('flop')) or _is_atom_floppy(rom): + override = _load_autorun_override(MAME_DEFAULT_DATA / 'atom_flop_autoload.toml', rom_name) + if override is not None: + auto_run_cmd = rf'{override}\n' + return auto_run_cmd, auto_run_delay + + # Default: use mess_auto_run and check for softlist-specific override + auto_run_cmd = mess_auto_run or '' + auto_run_delay = 0 + if soft_list: + override = _load_autorun_override(MAME_DEFAULT_DATA / f'{soft_list}_autoload.toml', rom_name) + if override is not None: + auto_run_cmd = rf'{override}\n' + auto_run_delay = 3 + + return auto_run_cmd, auto_run_delay + + +def get_mame_control_scheme(system: Emulator, rom_path: Path, /) -> MameControlScheme: + # Controls for games with 5-6 buttons or other unusual controls + controller_type = system.config.get_str('altlayout', 'auto') + + if controller_type in ['default', 'neomini', 'neocd', 'twinstick', 'qbert']: + return controller_type # pyright: ignore[reportReturnType] + + roms = cast('dict[str, list[str]]', tomllib.loads((MAME_DEFAULT_DATA / 'mameRoms.toml').read_text())) + + rom_name = rom_path.stem + if rom_name in roms['capcom']: + if controller_type in ['auto', 'snes']: + return 'sfsnes' + if controller_type == 'megadrive': + return 'megadrive' + if controller_type == 'fightstick': + return 'sfstick' + elif rom_name in roms['mortal_kombat']: + if controller_type in ['auto', 'snes']: + return 'mksnes' + if controller_type == 'megadrive': + return 'mkmegadrive' + if controller_type == 'fightstick': + return 'mkstick' + elif rom_name in roms['killer_instinct']: + if controller_type in ['auto', 'snes']: + return 'kisnes' + if controller_type == 'megadrive': + return 'megadrive' + if controller_type == 'fightstick': + return 'sfstick' + elif rom_name in roms['neogeo']: + return 'neomini' + elif rom_name in roms['twin_stick']: + return 'twinstick' + elif rom_name in roms['rotated_stick']: + return 'qbert' + else: + if controller_type == 'fightstick': + return 'fightstick' + if controller_type == 'megadrive': + return 'mddefault' + + return 'default' + + +def _get_mame_controls() -> dict[str, dict[str, str]]: + return tomllib.loads((MAME_DEFAULT_DATA / 'mameControls.toml').read_text()) + + +def _get_mame_control_mapping(controls: dict[str, dict[str, str]], control_scheme: str, /) -> dict[str, str]: + # Common controls + mapping = controls['default'].copy() + + # Buttons that change based on game/setting + if alt_control_mappings := controls.get(control_scheme): + mapping.update(alt_control_mappings) + + return mapping + + +def get_mame_control_mapping(control_scheme: str, /) -> dict[str, str]: + return _get_mame_control_mapping(_get_mame_controls(), control_scheme) + + +def get_all_mame_control_mappings( + controls_scheme: str, use_guns: bool = False, use_mouse: bool = False, / +) -> tuple[dict[str, str], dict[str, str], dict[str, str]]: + controls = _get_mame_controls() + + control_mapping = _get_mame_control_mapping(controls, controls_scheme) + + # Only use gun buttons if lightguns are enabled to prevent conflicts with mouse + gun_mapping = controls['gunbuttons'].copy() if use_guns else {} + + # For a standard mouse, left, right, scroll wheel should be mapped to action buttons, and if side buttons are available, they will be coin & start + mouse_mapping = controls['mousebuttons'].copy() if use_mouse else {} + + return control_mapping, gun_mapping, mouse_mapping + + +@dataclass(slots=True) +class _BaseMessControl: + player: int + tag: str + key: str + mask: int + default: int + reversed: bool + + +@dataclass(slots=True) +class _BaseMessControlMapping(_BaseMessControl): + mapping: str + useMapping: str + + +@dataclass(slots=True) +class MessSpecialMapping(_BaseMessControlMapping): + type: Literal['special'] + + +@dataclass(slots=True) +class MessMainMapping(_BaseMessControlMapping): + type: Literal['main'] + + +@dataclass(slots=True) +class MessComboMapping(_BaseMessControlMapping): + type: Literal['combo'] + kbMapping: str + + +@dataclass(slots=True) +class MessAnalogMapping(_BaseMessControl): + type: Literal['analog'] + incMapping: str + incUseMapping: str + decMapping: str + decUseMapping: str + delta: int + axis: str + + +type MessControlMapping = MessSpecialMapping | MessMainMapping | MessComboMapping | MessAnalogMapping + + +def _dict_to_mess_control_mapping(control_dict: dict[str, Any]) -> MessControlMapping: + base: dict[str, Any] = { + 'player': control_dict['player'], + 'tag': control_dict['tag'], + 'key': control_dict['key'], + 'mask': control_dict['mask'], + 'default': control_dict['default'], + 'reversed': control_dict.get('reversed', False), + } + + match control_dict['type']: + case 'special' | 'main' | 'combo' as type: + mapping = control_dict['mapping'] + kwargs: dict[str, Any] = { + **base, + 'type': type, + 'mapping': mapping, + 'useMapping': control_dict.get('useMapping', mapping), + } + + if type == 'main': + return MessMainMapping(**kwargs) + + if type == 'special': + return MessSpecialMapping(**kwargs) + + kwargs['kbMapping'] = control_dict['kbMapping'] + return MessComboMapping(**kwargs) + case 'analog': + return MessAnalogMapping( + **base, + type='analog', + incMapping=control_dict['incMapping'], + incUseMapping=control_dict.get('incUseMapping', control_dict['incMapping']), + decMapping=control_dict['decMapping'], + decUseMapping=control_dict.get('decUseMapping', control_dict['decMapping']), + delta=control_dict['delta'], + axis=control_dict['axis'], + ) + case _: + raise InvalidConfiguration(f'Unknown control mapping type: {control_dict["type"]}') + + +def get_mess_system_controls(mess_system_name: str, control_scheme: str, /) -> dict[str, MessControlMapping] | None: + if mess_system_name not in _SPECIAL_CONTROL_LIST: + return None + + mess_controls = tomllib.loads((MAME_DEFAULT_DATA / 'messControls.toml').read_text()) + + return {key: _dict_to_mess_control_mapping(value) for key, value in mess_controls.get(control_scheme, {}).items()} diff --git a/package/batocera/core/batocera-configgen/configgen/configgen/generators/mame/mameControllers.py b/package/batocera/core/batocera-configgen/configgen/configgen/generators/mame/mameControllers.py index a14cf5dbed6..397c6ad4789 100644 --- a/package/batocera/core/batocera-configgen/configgen/configgen/generators/mame/mameControllers.py +++ b/package/batocera/core/batocera-configgen/configgen/configgen/generators/mame/mameControllers.py @@ -1,13 +1,13 @@ from __future__ import annotations import codecs -import csv import logging import os from typing import TYPE_CHECKING from xml.dom import minidom -from .mamePaths import MAME_CONFIG, MAME_DEFAULT_DATA +from .mameCommon import get_all_mame_control_mappings, get_mess_system_controls +from .mamePaths import MAME_CONFIG if TYPE_CHECKING: from collections.abc import Mapping @@ -36,39 +36,7 @@ def generatePadsConfig(cfgPath: Path, playersControllers: Controllers, sysName: else: overwriteMAME = True - # Load standard controls from csv - controlFile = MAME_DEFAULT_DATA / 'mameControls.csv' - openFile = controlFile.open('r') - controlDict: dict[str, dict[str, str]] = {} - with openFile: - controlList = csv.reader(openFile) - for row in controlList: - if row[0] not in controlDict: - controlDict[row[0]] = {} - controlDict[row[0]][row[1]] = row[2] - - # Common controls - mappings: dict[str, str] = {} - for controlDef in controlDict['default']: - mappings[controlDef] = controlDict['default'][controlDef] - - # Only use gun buttons if lightguns are enabled to prevent conflicts with mouse - gunmappings: dict[str, str] = {} - if useGuns: - for controlDef in controlDict['gunbuttons']: - gunmappings[controlDef] = controlDict['gunbuttons'][controlDef] - - # Only define mouse buttons if mouse is enabled, to prevent unwanted inputs - # For a standard mouse, left, right, scroll wheel should be mapped to action buttons, and if side buttons are available, they will be coin & start - mousemappings: dict[str, str] = {} - if useMouse: - for controlDef in controlDict['mousebuttons']: - mousemappings[controlDef] = controlDict['mousebuttons'][controlDef] - - # Buttons that change based on game/setting - if altButtons in controlDict: - for controlDef in controlDict[altButtons]: - mappings.update({controlDef: controlDict[altButtons][controlDef]}) + mappings, gunmappings, mousemappings = get_all_mame_control_mappings(altButtons, useGuns, useMouse) xml_mameconfig = getRoot(config, "mameconfig") xml_mameconfig.setAttribute("version", "10") # otherwise, config of pad won't work at first run (batocera v33) @@ -95,7 +63,6 @@ def generatePadsConfig(cfgPath: Path, playersControllers: Controllers, sysName: xml_input = config.createElement("input") xml_system.appendChild(xml_input) - messControlDict = {} if sysName in [ "bbcb", "bbcm", "bbcm512", "bbcmc" ]: if specialController == 'none': useControls = "bbc" @@ -117,51 +84,9 @@ def generatePadsConfig(cfgPath: Path, playersControllers: Controllers, sysName: # Open or create alternate config file for systems with special controllers/settings # If the system/game is set to per game config, don't try to open/reset an existing file, only write if it's blank or going to the shared cfg folder - specialControlList = [ "cdimono1", "apfm1000", "astrocde", "adam", "arcadia", "gamecom", "tutor", "crvision", "bbcb", "bbcm", "bbcm512", "bbcmc", "xegs", \ - "socrates", "vgmplay", "pdp1", "vc4000", "fmtmarty", "gp32", "apple2p", "apple2e", "apple2ee" ] - if sysName in specialControlList: - # Load mess controls from csv - messControlFile = MAME_DEFAULT_DATA / 'messControls.csv' - openMessFile = messControlFile.open('r') - with openMessFile: - controlList = csv.reader(openMessFile, delimiter=';') - for row in controlList: - if row[0] not in messControlDict: - messControlDict[row[0]] = {} - messControlDict[row[0]][row[1]] = {} - currentEntry = messControlDict[row[0]][row[1]] - currentEntry['type'] = row[2] - currentEntry['player'] = int(row[3]) - currentEntry['tag'] = row[4] - currentEntry['key'] = row[5] - if currentEntry['type'] in [ 'special', 'main' ]: - currentEntry['mapping'] = row[6] - currentEntry['useMapping'] = row[7] - currentEntry['reversed'] = row[8] - currentEntry['mask'] = row[9] - currentEntry['default'] = row[10] - elif currentEntry['type'] == 'analog': - currentEntry['incMapping'] = row[6] - currentEntry['decMapping'] = row[7] - currentEntry['useMapping1'] = row[8] - currentEntry['useMapping2'] = row[9] - currentEntry['reversed'] = row[10] - currentEntry['mask'] = row[11] - currentEntry['default'] = row[12] - currentEntry['delta'] = row[13] - currentEntry['axis'] = row[14] - if currentEntry['type'] == 'combo': - currentEntry['kbMapping'] = row[6] - currentEntry['mapping'] = row[7] - currentEntry['useMapping'] = row[8] - currentEntry['reversed'] = row[9] - currentEntry['mask'] = row[10] - currentEntry['default'] = row[11] - if currentEntry['reversed'] == 'False': - currentEntry['reversed'] = False - else: - currentEntry['reversed'] = True + messControlDict = get_mess_system_controls(sysName, useControls) + if messControlDict is not None: config_alt = minidom.Document() configFile_alt = cfgPath / f"{sysName}.cfg" if (configFile_alt.exists() and cfgPath == (MAME_CONFIG / sysName)) or configFile_alt.exists(): @@ -258,35 +183,34 @@ def generatePadsConfig(cfgPath: Path, playersControllers: Controllers, sysName: #UI Mappings if nplayer == 1: if hasStick(pad): - xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_DOWN", "DOWN", mappings_use["JOYSTICK_DOWN"], pad.inputs[mappings_use["JOYSTICK_UP"]], False, "", "")) # Down - xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_LEFT", "LEFT", mappings_use["JOYSTICK_LEFT"], pad.inputs[mappings_use["JOYSTICK_LEFT"]], False, "", "")) # Left - xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_UP", "UP", mappings_use["JOYSTICK_UP"], pad.inputs[mappings_use["JOYSTICK_UP"]], False, "", "")) # Up - xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_RIGHT", "RIGHT", mappings_use["JOYSTICK_RIGHT"], pad.inputs[mappings_use["JOYSTICK_LEFT"]], False, "", "")) # Right - xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_SELECT", "ENTER", 'b', pad.inputs['b'], False, "", "")) # Select + xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_DOWN", "DOWN", mappings_use["JOYSTICK_DOWN"], pad.inputs[mappings_use["JOYSTICK_UP"]], False)) # Down + xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_LEFT", "LEFT", mappings_use["JOYSTICK_LEFT"], pad.inputs[mappings_use["JOYSTICK_LEFT"]], False)) # Left + xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_UP", "UP", mappings_use["JOYSTICK_UP"], pad.inputs[mappings_use["JOYSTICK_UP"]], False)) # Up + xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_RIGHT", "RIGHT", mappings_use["JOYSTICK_RIGHT"], pad.inputs[mappings_use["JOYSTICK_LEFT"]], False)) # Right + xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_SELECT", "ENTER", 'b', pad.inputs['b'], False)) # Select else: - xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_DOWN", "DOWN", mappings_use["JOYSTICK_DOWN"], pad.inputs[mappings_use["JOYSTICK_DOWN"]], False, "", "")) # Down - xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_LEFT", "LEFT", mappings_use["JOYSTICK_LEFT"], pad.inputs[mappings_use["JOYSTICK_LEFT"]], False, "", "")) # Left - xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_UP", "UP", mappings_use["JOYSTICK_UP"], pad.inputs[mappings_use["JOYSTICK_UP"]], False, "", "")) # Up - xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_RIGHT", "RIGHT", mappings_use["JOYSTICK_RIGHT"], pad.inputs[mappings_use["JOYSTICK_RIGHT"]], False, "", "")) # Right - xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_SELECT", "ENTER", 'b', pad.inputs['b'], False, "", "")) # Select - - if useControls in messControlDict: - for controlDef in messControlDict[useControls]: - thisControl = messControlDict[useControls][controlDef] - if nplayer == thisControl['player'] and xml_input_alt is not None and config_alt is not None: - if thisControl['type'] == 'special': - xml_input_alt.appendChild(generateSpecialPortElement(pad, config_alt, thisControl['tag'], nplayer, pad.index, thisControl['key'], thisControl['mapping'], \ - pad.inputs[mappings_use[thisControl['useMapping']]], thisControl['reversed'], thisControl['mask'], thisControl['default'], pedalkey)) - elif thisControl['type'] == 'main': - xml_input.appendChild(generateSpecialPortElement(pad, config_alt, thisControl['tag'], nplayer, pad.index, thisControl['key'], thisControl['mapping'], \ - pad.inputs[mappings_use[thisControl['useMapping']]], thisControl['reversed'], thisControl['mask'], thisControl['default'], pedalkey)) - elif thisControl['type'] == 'analog': - xml_input_alt.appendChild(generateAnalogPortElement(pad, config_alt, thisControl['tag'], nplayer, pad.index, thisControl['key'], mappings_use[thisControl['incMapping']], \ - mappings_use[thisControl['decMapping']], pad.inputs[mappings_use[thisControl['useMapping1']]], pad.inputs[mappings_use[thisControl['useMapping2']]], thisControl['reversed'], \ - thisControl['mask'], thisControl['default'], thisControl['delta'], thisControl['axis'])) - elif thisControl['type'] == 'combo': - xml_input_alt.appendChild(generateComboPortElement(pad, config_alt, thisControl['tag'], pad.index, thisControl['key'], thisControl['kbMapping'], thisControl['mapping'], \ - pad.inputs[mappings_use[thisControl['useMapping']]], thisControl['reversed'], thisControl['mask'], thisControl['default'])) + xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_DOWN", "DOWN", mappings_use["JOYSTICK_DOWN"], pad.inputs[mappings_use["JOYSTICK_DOWN"]], False)) # Down + xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_LEFT", "LEFT", mappings_use["JOYSTICK_LEFT"], pad.inputs[mappings_use["JOYSTICK_LEFT"]], False)) # Left + xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_UP", "UP", mappings_use["JOYSTICK_UP"], pad.inputs[mappings_use["JOYSTICK_UP"]], False)) # Up + xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_RIGHT", "RIGHT", mappings_use["JOYSTICK_RIGHT"], pad.inputs[mappings_use["JOYSTICK_RIGHT"]], False)) # Right + xml_input.appendChild(generateComboPortElement(pad, config, 'standard', pad.index, "UI_SELECT", "ENTER", 'b', pad.inputs['b'], False)) # Select + + if messControlDict: + for thisControl in messControlDict.values(): + if nplayer == thisControl.player and xml_input_alt is not None and config_alt is not None: + if thisControl.type == 'special': + xml_input_alt.appendChild(generateSpecialPortElement(pad, config_alt, thisControl.tag, nplayer, pad.index, thisControl.key, thisControl.mapping, \ + pad.inputs[mappings_use[thisControl.useMapping]], thisControl.reversed, thisControl.mask, thisControl.default, pedalkey)) + elif thisControl.type == 'main': + xml_input.appendChild(generateSpecialPortElement(pad, config_alt, thisControl.tag, nplayer, pad.index, thisControl.key, thisControl.mapping, \ + pad.inputs[mappings_use[thisControl.useMapping]], thisControl.reversed, thisControl.mask, thisControl.default, pedalkey)) + elif thisControl.type == 'analog': + xml_input_alt.appendChild(generateAnalogPortElement(pad, config_alt, thisControl.tag, nplayer, pad.index, thisControl.key, mappings_use[thisControl.incMapping], \ + mappings_use[thisControl.decMapping], pad.inputs[mappings_use[thisControl.incUseMapping]], pad.inputs[mappings_use[thisControl.decUseMapping]], thisControl.reversed, \ + thisControl.mask, thisControl.default, thisControl.delta, thisControl.axis)) + elif thisControl.type == 'combo': + xml_input_alt.appendChild(generateComboPortElement(pad, config_alt, thisControl.tag, pad.index, thisControl.key, thisControl.kbMapping, thisControl.mapping, \ + pad.inputs[mappings_use[thisControl.useMapping]], thisControl.reversed, thisControl.mask, thisControl.default)) # in case there are more guns than pads, configure them if useGuns and len(guns) > len(playersControllers): @@ -317,7 +241,7 @@ def generatePadsConfig(cfgPath: Path, playersControllers: Controllers, sysName: mameXml.write(dom_string) # Write alt config (if used, custom config is turned off or file doesn't exist yet) - if sysName in specialControlList and overwriteSystem and config_alt is not None and configFile_alt is not None: + if messControlDict is not None and overwriteSystem and config_alt is not None and configFile_alt is not None: _logger.debug("Saving %s", configFile_alt) with codecs.open(str(configFile_alt), "w", "utf-8") as mameXml_alt: dom_string_alt = os.linesep.join([s for s in config_alt.toprettyxml().splitlines() if s.strip()]) # remove ugly empty lines while minicom adds them... @@ -402,13 +326,13 @@ def generateSpecialPortElementPlayer(pad: Controller, config: minidom.Document, xml_newseq.appendChild(value) return xml_port -def generateSpecialPortElement(pad: Controller, config: minidom.Document, tag: str, nplayer: int, padindex: int, mapping: str, key: str, input: Input, reversed: bool, mask: str, default: str, pedalkey: str | None): +def generateSpecialPortElement(pad: Controller, config: minidom.Document, tag: str, nplayer: int, padindex: int, mapping: str, key: str, input: Input, reversed: bool, mask: int, default: int, pedalkey: str | None): # Special button input (ie mouse button to gamepad) xml_port = config.createElement("port") xml_port.setAttribute("tag", tag) xml_port.setAttribute("type", mapping) - xml_port.setAttribute("mask", mask) - xml_port.setAttribute("defvalue", default) + xml_port.setAttribute("mask", f'{mask}') + xml_port.setAttribute("defvalue", f'{default}') xml_newseq = config.createElement("newseq") xml_newseq.setAttribute("type", "standard") xml_port.appendChild(xml_newseq) @@ -416,13 +340,13 @@ def generateSpecialPortElement(pad: Controller, config: minidom.Document, tag: s xml_newseq.appendChild(value) return xml_port -def generateComboPortElement(pad: Controller, config: minidom.Document, tag: str, padindex: int, mapping: str, kbkey: str, key: str, input: Input, reversed: bool, mask: str, default: str): +def generateComboPortElement(pad: Controller, config: minidom.Document, tag: str, padindex: int, mapping: str, kbkey: str, key: str, input: Input, reversed: bool, mask: int | None = None, default: int | None = None): # Maps a keycode + button - for important keyboard keys when available xml_port = config.createElement("port") xml_port.setAttribute("tag", tag) xml_port.setAttribute("type", mapping) - xml_port.setAttribute("mask", mask) - xml_port.setAttribute("defvalue", default) + xml_port.setAttribute("mask", f'{mask}' if mask is not None else '') + xml_port.setAttribute("defvalue", f'{default}' if default is not None else '') xml_newseq = config.createElement("newseq") xml_newseq.setAttribute("type", "standard") xml_port.appendChild(xml_newseq) @@ -430,14 +354,14 @@ def generateComboPortElement(pad: Controller, config: minidom.Document, tag: str xml_newseq.appendChild(value) return xml_port -def generateAnalogPortElement(pad: Controller, config: minidom.Document, tag: str, nplayer: int, padindex: int, mapping: str, inckey: str, deckey: str, mappedinput: Input, mappedinput2: Input, reversed: bool, mask: str, default: str, delta: str, axis: str = ''): +def generateAnalogPortElement(pad: Controller, config: minidom.Document, tag: str, nplayer: int, padindex: int, mapping: str, inckey: str, deckey: str, mappedinput: Input, mappedinput2: Input, reversed: bool, mask: int, default: int, delta: int, axis: str = ''): # Mapping analog to digital (mouse, etc) xml_port = config.createElement("port") xml_port.setAttribute("tag", tag) xml_port.setAttribute("type", mapping) - xml_port.setAttribute("mask", mask) - xml_port.setAttribute("defvalue", default) - xml_port.setAttribute("keydelta", delta) + xml_port.setAttribute("mask", f'{mask}') + xml_port.setAttribute("defvalue", f'{default}') + xml_port.setAttribute("keydelta", f'{delta}') xml_newseq_inc = config.createElement("newseq") xml_newseq_inc.setAttribute("type", "increment") xml_port.appendChild(xml_newseq_inc) diff --git a/package/batocera/core/batocera-configgen/configgen/configgen/generators/mame/mameGenerator.py b/package/batocera/core/batocera-configgen/configgen/configgen/generators/mame/mameGenerator.py index 9e1d4a6e071..3cc0366ab92 100644 --- a/package/batocera/core/batocera-configgen/configgen/configgen/generators/mame/mameGenerator.py +++ b/package/batocera/core/batocera-configgen/configgen/configgen/generators/mame/mameGenerator.py @@ -1,12 +1,10 @@ from __future__ import annotations -import csv import json import logging import os import shutil import subprocess -import xml.etree.ElementTree as ET from pathlib import Path from typing import TYPE_CHECKING from xml.dom import minidom @@ -18,7 +16,6 @@ BATOCERA_SHARE_DIR, BIOS, CONFIGS, - DEFAULTS_DIR, ROMS, SAVES, SCREENSHOTS, @@ -29,13 +26,12 @@ from ...utils import bezels as bezelsUtil, videoMode from ..Generator import Generator from . import mameControllers -from .mameCommon import is_atom_floppy -from .mamePaths import MAME_BIOS, MAME_CHEATS, MAME_CONFIG, MAME_DEFAULT_DATA, MAME_ROMS, MAME_SAVES +from .mameCommon import get_autorun_command, get_mame_control_scheme, get_mess_system_info +from .mamePaths import MAME_BIOS, MAME_CHEATS, MAME_CONFIG, MAME_ROMS, MAME_SAVES if TYPE_CHECKING: from ...Emulator import Emulator from ...types import HotkeysContext, Resolution - from .mameTypes import MameControlScheme _logger = logging.getLogger(__name__) @@ -89,24 +85,8 @@ def generate(self, system, rom, playersControllers, metadata, guns, wheels, game for checkPath in mamePaths: mkdir_if_not_exists(checkPath) - messSystems: list[str] = [] - messSysName: list[str] = [] - messRomType: list[str] = [] - messAutoRun: list[str] = [] - - with (DEFAULTS_DIR / 'data' / 'mame' / 'messSystems.csv').open() as openFile: - messDataList = csv.reader(openFile, delimiter=';', quotechar="'") - for row in messDataList: - messSystems.append(row[0]) - messSysName.append(row[1]) - messRomType.append(row[2]) - messAutoRun.append(row[3]) - # Identify the current system - try: - messMode = messSystems.index(system.name) - except ValueError: - messMode = -1 + mess_system = get_mess_system_info(system) softList = system.config.get_str("softList", "none") softList = softList if softList != "none" else "" @@ -126,7 +106,7 @@ def generate(self, system, rom, playersControllers, metadata, guns, wheels, game # skip game info at start commandArray += [ "-skip_gameinfo" ] - if messMode == -1: + if mess_system is None: commandArray += [ "-rompath", f"{romDirname};{MAME_BIOS};{BIOS}" ] else: if softList in subdirSoftList: @@ -156,7 +136,7 @@ def generate(self, system, rom, playersControllers, metadata, guns, wheels, game # Set custom config path if option is selected or default path if not customCfg = system.config.get_bool("customcfg") - if messMode == -1: + if mess_system is None: if customCfg: cfgPath = MAME_CONFIG / "custom" else: @@ -164,16 +144,16 @@ def generate(self, system, rom, playersControllers, metadata, guns, wheels, game mkdir_if_not_exists(MAME_CONFIG) else: if customCfg: - cfgPath = MAME_CONFIG / messSysName[messMode] / "custom" + cfgPath = MAME_CONFIG / mess_system.name / "custom" else: - cfgPath = MAME_CONFIG / messSysName[messMode] - mkdir_if_not_exists(MAME_CONFIG / messSysName[messMode]) + cfgPath = MAME_CONFIG / mess_system.name + mkdir_if_not_exists(MAME_CONFIG / mess_system.name) mkdir_if_not_exists(cfgPath) # MAME will create custom configs per game for MAME ROMs and MESS ROMs with no system attached (LCD games, TV games, etc.) # This will allow an alternate config path per game for MESS console/computer ROMs that may need additional config. - if system.config.get_bool("pergamecfg") and messMode != -1 and messSysName[messMode] != "": - base_path = MAME_CONFIG / messSysName[messMode] + if system.config.get_bool("pergamecfg") and mess_system is not None and mess_system.name: + base_path = MAME_CONFIG / mess_system.name mkdir_if_not_exists(base_path) cfgPath = base_path / romBasename mkdir_if_not_exists(cfgPath) @@ -258,7 +238,7 @@ def generate(self, system, rom, playersControllers, metadata, guns, wheels, game # Mouse useMouse = False - if system.config.get_bool('use_mouse') or not (messSysName[messMode] == "" or messMode == -1): + if system.config.get_bool('use_mouse') or (mess_system is not None and mess_system.name): useMouse = True commandArray += [ "-dial_device", "mouse" ] commandArray += [ "-trackball_device", "mouse" ] @@ -301,10 +281,10 @@ def generate(self, system, rom, playersControllers, metadata, guns, wheels, game # Finally we pass game name # MESS will use the full filename and pass the system & rom type parameters if needed. - if messSysName[messMode] == "" or messMode == -1: + if mess_system is None or not mess_system.name: commandArray += [ romBasename ] else: - messModel = messSysName[messMode] + messModel = mess_system.name # Alternate system for machines that have different configs (ie computers with different hardware) if altmodel := system.config.get("altmodel"): messModel = altmodel @@ -403,7 +383,7 @@ def generate(self, system, rom, playersControllers, metadata, guns, wheels, game else: commandArray += [ "-cart" ] else: - commandArray += [ f'-{messRomType[messMode]}' ] + commandArray += [ f'-{mess_system.rom_type}' ] else: if boot_disk: if (altromtype == "flop1" or not altromtype) and boot_disk in [ "macos30", "macos608", "macos701", "macos75" ]: @@ -411,12 +391,12 @@ def generate(self, system, rom, playersControllers, metadata, guns, wheels, game elif altromtype: commandArray += [ f'-{altromtype}' ] else: - commandArray += [ f'-{messRomType[messMode]}' ] + commandArray += [ f'-{mess_system.rom_type}' ] else: if altromtype: commandArray += [ f'-{altromtype}' ] else: - commandArray += [ f'-{messRomType[messMode]}' ] + commandArray += [ f'-{mess_system.rom_type}' ] # Use the full filename for MESS ROMs commandArray += [ rom ] else: @@ -460,96 +440,11 @@ def generate(self, system, rom, playersControllers, metadata, guns, wheels, game else: commandArray += [ '-flop2', targetDisk ] - autoRunCmd = "" - autoRunDelay = 0 # Autostart computer games where applicable - # bbc has different boots for floppy & cassette, no special boot for carts - if system.name == "bbcmicro": - if altromtype or softList: - if altromtype == "cass" or softList.endswith("cass"): - autoRunCmd = '*tape\\nchain""\\n' - autoRunDelay = 2 - elif (altromtype and altromtype.startswith("flop")) or softList.endswith("flop"): - autoRunCmd = '*cat\\n\\n\\n\\n*exec !boot\\n' - autoRunDelay = 3 - else: - autoRunCmd = '*cat\\n\\n\\n\\n*exec !boot\\n' - autoRunDelay = 3 - # fm7 boots floppies, needs cassette loading - elif system.name == "fm7": - if ( - altromtype == "cass" - or (softList and softList[-4:] == "cass") - ): - autoRunCmd = 'LOADM”“,,R\\n' - autoRunDelay = 5 - elif system.name == "coco": - romType = 'cart' - autoRunDelay = 2 - - # if using software list, use "usage" for autoRunCmd (if provided) - if softList != "": - softListFile = Path('/usr/bin/mame/hash') / f'{softList}.xml' - if softListFile.exists(): - softwarelist = ET.parse(softListFile) - for software in softwarelist.findall('software'): - if software.attrib and software.get('name') == romName: - for info in software.iter('info'): - if info.get('name') == 'usage': - autoRunCmd = f"{info.get('value')}\\n" - - # if still undefined, default autoRunCmd based on media type - if autoRunCmd == "": - if altromtype == "cass" or (softList and softList.endswith("cass")) or romExt.casefold() == ".cas": - romType = 'cass' - if romName.casefold().endswith(".bas"): - autoRunCmd = 'CLOAD:RUN\\n' - else: - autoRunCmd = 'CLOADM:EXEC\\n' - if (altromtype == "flop1") or (softList and softList.endswith("flop")) or romExt.casefold() == ".dsk": - romType = 'flop' - if romName.casefold().endswith(".bas"): - autoRunCmd = f'RUN \"{romName}\"\\n' - else: - autoRunCmd = f'LOADM \"{romName}\":EXEC\\n' - - # check for a user override - autoRunFile = MAME_CONFIG / 'autoload' / f'{system.name}_{romType}_autoload.csv' - if autoRunFile.exists(): - with autoRunFile.open() as openARFile: - autoRunList = csv.reader(openARFile, delimiter=';', quotechar="'") - for row in autoRunList: - if row and not row[0].startswith('#') and row[0].casefold() == romName.casefold(): - autoRunCmd = f"{row[1]}\\n" - elif system.name == "atom": - autoRunDelay = 1 - autoRunCmd = messAutoRun[messMode] - # Check if the media being used is a floppy type - if ( - (altromtype == "flop1") or - (softList and softList.endswith("flop")) or - is_atom_floppy(rom) - ): - autoRunFile = MAME_DEFAULT_DATA / 'atom_flop_autoload.csv' - if autoRunFile.exists(): - with autoRunFile.open() as openARFile: - autoRunList = csv.reader(openARFile, delimiter=';', quotechar="'") - for row in autoRunList: - if row and not row[0].startswith('#') and row[0].casefold() == romName.casefold(): - autoRunCmd = f"{row[1]}\\n" - break - else: - # Check for an override file, otherwise use generic (if it exists) - autoRunCmd = messAutoRun[messMode] - autoRunFile = MAME_DEFAULT_DATA / f'{softList}_autoload.csv' - if autoRunFile.exists(): - with autoRunFile.open() as openARFile: - autoRunList = csv.reader(openARFile, delimiter=';', quotechar="'") - for row in autoRunList: - if row[0].casefold() == romName.casefold(): - autoRunCmd = f"{row[1]}\\n" - autoRunDelay = 3 - if autoRunCmd != "": + autoRunCmd, autoRunDelay = get_autorun_command( + system.name, mess_system.auto_run, rom, altromtype or None, softList + ) + if autoRunCmd: if autoRunCmd.startswith("'"): autoRunCmd.replace("'", "") commandArray += [ "-autoboot_delay", str(autoRunDelay), "-autoboot_command", autoRunCmd ] @@ -560,16 +455,14 @@ def generate(self, system, rom, playersControllers, metadata, guns, wheels, game bezelSet = None try: - if messMode != -1: - MameGenerator.writeBezelConfig(bezelSet, system, rom, messSysName[messMode], gameResolution, system.guns_borders_size_name(guns), system.guns_border_ratio_type(guns)) - else: - MameGenerator.writeBezelConfig(bezelSet, system, rom, "", gameResolution, system.guns_borders_size_name(guns), system.guns_border_ratio_type(guns)) + messSys = mess_system.name if mess_system is not None else "" + MameGenerator.writeBezelConfig(bezelSet, system, rom, messSys, gameResolution, system.guns_borders_size_name(guns), system.guns_border_ratio_type(guns)) except Exception: MameGenerator.writeBezelConfig(None, system, rom, "", gameResolution, system.guns_borders_size_name(guns), system.guns_border_ratio_type(guns)) - buttonLayout = getMameControlScheme(system, rom) + buttonLayout = get_mame_control_scheme(system, rom) - if messMode == -1: + if mess_system is None: mameControllers.generatePadsConfig(cfgPath, playersControllers, "", buttonLayout, customCfg, specialController, bezelSet, useGuns, guns, useWheels, wheels, useMouse, multiMouse, system) else: mameControllers.generatePadsConfig(cfgPath, playersControllers, messModel, buttonLayout, customCfg, specialController, bezelSet, useGuns, guns, useWheels, wheels, useMouse, multiMouse, system) @@ -772,61 +665,3 @@ def getMameMachineSize(machine: str, tmpdir: Path): return int(iwidth), int(iheight), int(irotate) raise BatoceraException("Display element not found") - -def getMameControlScheme(system: Emulator, rom_path: Path) -> MameControlScheme: - # Game list files - mameCapcom = MAME_DEFAULT_DATA / 'mameCapcom.txt' - mameKInstinct = MAME_DEFAULT_DATA / 'mameKInstinct.txt' - mameMKombat = MAME_DEFAULT_DATA / 'mameMKombat.txt' - mameNeogeo = MAME_DEFAULT_DATA / 'mameNeogeo.txt' - mameTwinstick = MAME_DEFAULT_DATA / 'mameTwinstick.txt' - mameRotatedstick = MAME_DEFAULT_DATA / 'mameRotatedstick.txt' - - # Controls for games with 5-6 buttons or other unusual controls - controllerType = system.config.get("altlayout", "auto") - - if controllerType in [ "default", "neomini", "neocd", "twinstick", "qbert" ]: - return controllerType # pyright: ignore[reportReturnType] - - capcomList = set(mameCapcom.read_text().split()) - mkList = set(mameMKombat.read_text().split()) - kiList = set(mameKInstinct.read_text().split()) - neogeoList = set(mameNeogeo.read_text().split()) - twinstickList = set(mameTwinstick.read_text().split()) - qbertList = set(mameRotatedstick.read_text().split()) - - romName = rom_path.stem - if romName in capcomList: - if controllerType in [ "auto", "snes" ]: - return "sfsnes" - if controllerType == "megadrive": - return "megadrive" - if controllerType == "fightstick": - return "sfstick" - elif romName in mkList: - if controllerType in [ "auto", "snes" ]: - return "mksnes" - if controllerType == "megadrive": - return "mkmegadrive" - if controllerType == "fightstick": - return "mkstick" - elif romName in kiList: - if controllerType in [ "auto", "snes" ]: - return "kisnes" - if controllerType == "megadrive": - return "megadrive" - if controllerType == "fightstick": - return "sfstick" - elif romName in neogeoList: - return "neomini" - elif romName in twinstickList: - return "twinstick" - elif romName in qbertList: - return "qbert" - else: - if controllerType == "fightstick": - return "fightstick" - if controllerType == "megadrive": - return "mddefault" - - return "default" diff --git a/package/batocera/core/batocera-configgen/data/mame/atom_flop_autoload.csv b/package/batocera/core/batocera-configgen/data/mame/atom_flop_autoload.csv deleted file mode 100644 index af46538cb71..00000000000 --- a/package/batocera/core/batocera-configgen/data/mame/atom_flop_autoload.csv +++ /dev/null @@ -1,16 +0,0 @@ -chuckie;\n*DOS\n*DIR\n*RUN"runme" -egghead;\n*DOS\n*DIR\n*RUN"EHRUN" -f14;\n*DOS\n*DIR\n*RUN"F1 4RUN" -gala;\n*DOS\n*DIR\n*RUN"runme" -galxians;\n*DOS\n*DIR\n*RUN"GALAXI" -hardhath;\n*DOS\n*DIR\n*RUN"LOADER" -hypervpr;\n*DOS\n*DIR\n*RUN"LOADER" -jetsetmn;\n*DOS\n*DIR\n*RUN"LOADER" -jsw;\n*DOS\n*DIR\n*RUN"JSWRUN" -jsw2;\n*DOS\n*DIR\n*RUN"JSW2RUN" -joeblade;\n*DOS\n*DIR\n*RUN"JOE" -jungle;\n*DOS\n*DIR\n*RUN"runme" -manicmin;\n*DOS\n*DIR\n*RUN"MMRUN" -repton;\n*DOS\n*DIR\n*RUN"runme" -tetris;\n*DOS\n*DIR\n*RUN"SIDRUN" -flappy;\n*DOS\n*DIR\n*RUN"FLAPPY" \ No newline at end of file diff --git a/package/batocera/core/batocera-configgen/data/mame/atom_flop_autoload.toml b/package/batocera/core/batocera-configgen/data/mame/atom_flop_autoload.toml new file mode 100644 index 00000000000..a16400be53a --- /dev/null +++ b/package/batocera/core/batocera-configgen/data/mame/atom_flop_autoload.toml @@ -0,0 +1,16 @@ +chuckie = '\n*DOS\n*DIR\n*RUN"runme"' +egghead = '\n*DOS\n*DIR\n*RUN"EHRUN"' +f14 = '\n*DOS\n*DIR\n*RUN"F1 4RUN"' +gala = '\n*DOS\n*DIR\n*RUN"runme"' +galxians = '\n*DOS\n*DIR\n*RUN"GALAXI"' +hardhath = '\n*DOS\n*DIR\n*RUN"LOADER"' +hypervpr = '\n*DOS\n*DIR\n*RUN"LOADER"' +jetsetmn = '\n*DOS\n*DIR\n*RUN"LOADER"' +jsw = '\n*DOS\n*DIR\n*RUN"JSWRUN"' +jsw2 = '\n*DOS\n*DIR\n*RUN"JSW2RUN"' +joeblade = '\n*DOS\n*DIR\n*RUN"JOE"' +jungle = '\n*DOS\n*DIR\n*RUN"runme"' +manicmin = '\n*DOS\n*DIR\n*RUN"MMRUN"' +repton = '\n*DOS\n*DIR\n*RUN"runme"' +tetris = '\n*DOS\n*DIR\n*RUN"SIDRUN"' +flappy = '\n*DOS\n*DIR\n*RUN"FLAPPY"' diff --git a/package/batocera/core/batocera-configgen/data/mame/camplynx_cass_autoload.csv b/package/batocera/core/batocera-configgen/data/mame/camplynx_cass_autoload.csv deleted file mode 100644 index 68c916bb9e0..00000000000 --- a/package/batocera/core/batocera-configgen/data/mame/camplynx_cass_autoload.csv +++ /dev/null @@ -1,66 +0,0 @@ -3dmoncrz;MLOAD "3D MONSTER" -backgmmn;LOAD "BACKGAMMON" -battlbrk;LOAD "BATTLEBRICK" -centiped;MLOAD "CENTIPEDE" -colossal;LOAD "COLOSSAL" -dambustr;LOAD "DAM BUSTER" -deathball;LOAD "DEATHBALL" -diggerman;MLOAD "DIGGERMAN" -dungeon;LOAD "DUNGEON" -floydbank;MLOAD "FLOYDS BANK" -gamepak4;MLOAD "GEMPACK 4" -gobblspk;MLOAD "SPOOK" -hangman;LOAD "HANGMAN" -labyrinth;LOAD "LABYRINTHE" -logichess;MLOAD "ECHECS" -invaders;MLOAD "INVADERS" -mastermnd;LOAD "MASTERMIND" -mazeman;MLOAD "MAZEMAN" -minedout;LOAD "MINEDOUTGOOD" -moonfallf;LOAD "Moonfall2" -moonfall;LOAD "MOONFALL" -muncher;LOAD "MUNCHER" -nuclear;LOAD "NUCLEAR" -numerons;LOAD "NUMERONS" -asterix;LOAD "ASTERIX" -ohmummy;MLOAD "OH MUMMY" -panik;LOAD "PANIK" -pengo;MLOAD "PENGO" -pwrblastr;MLOAD "POWER BLASTER" -racer;LOAD "RACER" -rocketman;LOAD "ROCKETMAN" -spellbnd;LOAD "SPELLBOUND" -scrablynx;LOAD "SCRABLYNX" -siege;MLOAD "SIEGE ATTACK" -spactrek;LOAD "TREK" -sairraid;LOAD "SUPER AIR RAID" -treasisld;LOAD "TREASURE" -twinkle;MLOAD "TWINKLE" -worm;LOAD "THE WORM" -wormf;LOAD "THE WORM" -ynxvader;MLOAD "YNXVADERS" -zombie;LOAD "ZombiePanic" -aide;LOAD "AIDE" -cardindx;LOAD "CARD INDEX" -composer;LOAD "COMPOSER" -disassmbf;LOAD "DES.IMP" -disassmb;LOAD "DESASS" -genbasic;LOAD "GENEBASIC" -gencarac;LOAD "GENECAR" -wordproc;MLOAD "LIONTEXT" -moder80;MLOAD "CODE" -musicmstr;LOAD "MUSIC MASTER" -6845p;LOAD "6845P" -chopin;LOAD "CHOPIN" -cinema;LOAD "CINEMA" -forest;LOAD "THE FOREST" -gridtrap;LOAD "GRIDTRAP" -hilo;LOAD "CARDS" -inteltab;LOAD "INTELTABLYNX" -maximots;LOAD "MAXI-MOTS" -planets;LOAD "PLANETS" -risingmn;LOAD "CP FP" -scrndmp;LOAD "RPENROSE" -starover;LOAD "SR" -triangle;LOAD "BRUMBELOW" -tronblkr;LOAD "TRON BLOCKER" \ No newline at end of file diff --git a/package/batocera/core/batocera-configgen/data/mame/camplynx_cass_autoload.toml b/package/batocera/core/batocera-configgen/data/mame/camplynx_cass_autoload.toml new file mode 100644 index 00000000000..6c51b427998 --- /dev/null +++ b/package/batocera/core/batocera-configgen/data/mame/camplynx_cass_autoload.toml @@ -0,0 +1,66 @@ +3dmoncrz = 'MLOAD "3D MONSTER"' +backgmmn = 'LOAD "BACKGAMMON"' +battlbrk = 'LOAD "BATTLEBRICK"' +centiped = 'MLOAD "CENTIPEDE"' +colossal = 'LOAD "COLOSSAL"' +dambustr = 'LOAD "DAM BUSTER"' +deathball = 'LOAD "DEATHBALL"' +diggerman = 'MLOAD "DIGGERMAN"' +dungeon = 'LOAD "DUNGEON"' +floydbank = 'MLOAD "FLOYDS BANK"' +gamepak4 = 'MLOAD "GEMPACK 4"' +gobblspk = 'MLOAD "SPOOK"' +hangman = 'LOAD "HANGMAN"' +labyrinth = 'LOAD "LABYRINTHE"' +logichess = 'MLOAD "ECHECS"' +invaders = 'MLOAD "INVADERS"' +mastermnd = 'LOAD "MASTERMIND"' +mazeman = 'MLOAD "MAZEMAN"' +minedout = 'LOAD "MINEDOUTGOOD"' +moonfallf = 'LOAD "Moonfall2"' +moonfall = 'LOAD "MOONFALL"' +muncher = 'LOAD "MUNCHER"' +nuclear = 'LOAD "NUCLEAR"' +numerons = 'LOAD "NUMERONS"' +asterix = 'LOAD "ASTERIX"' +ohmummy = 'MLOAD "OH MUMMY"' +panik = 'LOAD "PANIK"' +pengo = 'MLOAD "PENGO"' +pwrblastr = 'MLOAD "POWER BLASTER"' +racer = 'LOAD "RACER"' +rocketman = 'LOAD "ROCKETMAN"' +spellbnd = 'LOAD "SPELLBOUND"' +scrablynx = 'LOAD "SCRABLYNX"' +siege = 'MLOAD "SIEGE ATTACK"' +spactrek = 'LOAD "TREK"' +sairraid = 'LOAD "SUPER AIR RAID"' +treasisld = 'LOAD "TREASURE"' +twinkle = 'MLOAD "TWINKLE"' +worm = 'LOAD "THE WORM"' +wormf = 'LOAD "THE WORM"' +ynxvader = 'MLOAD "YNXVADERS"' +zombie = 'LOAD "ZombiePanic"' +aide = 'LOAD "AIDE"' +cardindx = 'LOAD "CARD INDEX"' +composer = 'LOAD "COMPOSER"' +disassmbf = 'LOAD "DES.IMP"' +disassmb = 'LOAD "DESASS"' +genbasic = 'LOAD "GENEBASIC"' +gencarac = 'LOAD "GENECAR"' +wordproc = 'MLOAD "LIONTEXT"' +moder80 = 'MLOAD "CODE"' +musicmstr = 'LOAD "MUSIC MASTER"' +6845p = 'LOAD "6845P"' +chopin = 'LOAD "CHOPIN"' +cinema = 'LOAD "CINEMA"' +forest = 'LOAD "THE FOREST"' +gridtrap = 'LOAD "GRIDTRAP"' +hilo = 'LOAD "CARDS"' +inteltab = 'LOAD "INTELTABLYNX"' +maximots = 'LOAD "MAXI-MOTS"' +planets = 'LOAD "PLANETS"' +risingmn = 'LOAD "CP FP"' +scrndmp = 'LOAD "RPENROSE"' +starover = 'LOAD "SR"' +triangle = 'LOAD "BRUMBELOW"' +tronblkr = 'LOAD "TRON BLOCKER"' diff --git a/package/batocera/core/batocera-configgen/data/mame/mameCapcom.txt b/package/batocera/core/batocera-configgen/data/mame/mameCapcom.txt deleted file mode 100755 index 8cb9754bbf4..00000000000 --- a/package/batocera/core/batocera-configgen/data/mame/mameCapcom.txt +++ /dev/null @@ -1,281 +0,0 @@ -ts2 -ts2ja -ts2j -ts2ua -ts2u -kikaioh -dstlka -dstlk -dstlkh -dstlkur1 -dstlku -hsf2a -hsf2j1 -hsf2j -hsf2 -jojojr2 -jojojr1 -jojoj -jojobanr1 -jojobajr1 -jojoban -jojobaj -jojobaner1 -jojobar1 -jojobane -jojoba -jojonr2 -jojoar2 -jojonr1 -jojoar1 -jojon -jojoa -jojor2 -jojor1 -jojo -jojour2 -jojour1 -jojou -msha -mshbr1 -mshb -msh -mshh -mshjr1 -mshj -mshu -mshvsfa1 -mshvsfa -mshvsfb1 -mshvsfb -mshvsf -mshvsfh -mshvsfj2 -mshvsfj1 -mshvsfj -mshvsfu1 -mshvsfu -mvscar1 -mvsca -mvscb -mvscr1 -mvsc -mvsch -mvscjr1 -mvscj -mvscjsing -mvscur1 -mvscu -nwarra -nwarrb -nwarr -nwarrh -nwarru -plsmaswda -plsmaswd -redearthr1 -redearth -ringdesta -ringdestb -ringdest -ringdesth -rvschoola -rvschool -rvschoolu -jgakuen1 -jgakuen -stargld2 -stargladj -starglad -sfa2 -sfa2ur1 -sfa2u -sfa3b -sfa3 -sfa3hr1 -sfa3h -sfa3us -sfa3ur1 -sfa3u -sfar3 -sfar2 -sfar1 -sfa -sfau -sfexa -sfex -sfexj -sfexu -sfexpj1 -sfexpj -sfexpu1 -sfexp -sfex2a -sfex2 -sfex2h -sfex2j -sfex2u1 -sfex2u -sfex2pa -sfex2p -sfex2ph -sfex2pj -sfex2pu -sf2ja -sf2jc -sf2jf -sf2jh -sf2j -sf2j17 -sf2jl -sf2ua -sf2ub -sf2ue -sf2uc -sf2ud -sf2uf -sf2ug -sf2uh -sf2ui -sf2uk -sf2um -sf2em -sf2en -sf2ea -sf2eb -sf2ee -sf2ed -sf2ef -sf2 -sf2hfj -sf2ceja -sf2cejb -sf2cejc -sf2cet -sf2ceua -sf2ceub -sf2ceuc -sf2ceea -sf2ce -sf2hfu -sf2hf -sfiii2n -sfiii2j -sfiii2 -sfiii3r1 -sfiii3 -sfiii3nr1 -sfiii3jr1 -sfiii3n -sfiii3j -sfiii3ur1 -sfiii3u -sfiiin -sfiiina -sfiiia -sfiii -sfiiih -sfiiij -sfiiiu -sfzar1 -sfza -sfzbr1 -sfzb -sfzhr1 -sfzh -sfzjr2 -sfzjr1 -sfzj -sfz2a -sfz2br1 -sfz2b -sfz2h -sfz2jr1 -sfz2j -sfz2n -sfz2alr1 -sfz2al -sfz2alb -sfz2alh -sfz2alj -sfz3ar1 -sfz3a -sfz3jr2 -sfz3jr1 -sfz3j -smbombr1 -smbomb -ssf2ta -ssf2th -ssf2tur1 -ssf2tu -ssf2t -ssf2xjr1r -ssf2xjr1 -ssf2xj -ssf2ar1 -ssf2a -ssf2h -ssf2jr2 -ssf2jr1 -ssf2j -ssf2u -ssf2r1 -ssf2 -ssf2tba -ssf2tbh -ssf2tbj1 -ssf2tbj -ssf2tbu -ssf2tbr1 -ssf2tb -techromna -techromn -techromnu -vhunt2r1 -vhunt2 -vhuntjr2 -vhuntjr1s -vhuntjr1 -vhuntj -vsav2 -vsava -vsavb -vsav -vsavh -vsavj -vsavu -vampjr1 -vampja -vampj -warzardr1 -warzard -xmvsfar3 -xmvsfar2 -xmvsfar1 -xmvsfa -xmvsfb -xmvsfr1 -xmvsf -xmvsfh -xmvsfjr3 -xmvsfjr2 -xmvsfjr1 -xmvsfj -xmvsfur2 -xmvsfur1 -xmvsfu -xmcotaar2 -xmcotaar1 -xmcotaa -xmcotab -xmcotar1 -xmcota -xmcotahr1 -xmcotah -xmcotajr -xmcotaj3 -xmcotaj2 -xmcotaj1 -xmcotaj -xmcotau \ No newline at end of file diff --git a/package/batocera/core/batocera-configgen/data/mame/mameControls.csv b/package/batocera/core/batocera-configgen/data/mame/mameControls.csv deleted file mode 100644 index 83c1bc75a13..00000000000 --- a/package/batocera/core/batocera-configgen/data/mame/mameControls.csv +++ /dev/null @@ -1,123 +0,0 @@ -default,JOYSTICK_UP,joystick1up -default,JOYSTICK_DOWN,joystick1down -default,JOYSTICK_LEFT,joystick1left -default,JOYSTICK_RIGHT,joystick1right -default,JOYSTICKLEFT_UP,joystick1up -default,JOYSTICKLEFT_DOWN,joystick1down -default,JOYSTICKLEFT_LEFT,joystick1left -default,JOYSTICKLEFT_RIGHT,joystick1right -default,JOYSTICKRIGHT_UP,joystick2up -default,JOYSTICKRIGHT_DOWN,joystick2down -default,JOYSTICKRIGHT_LEFT,joystick2left -default,JOYSTICKRIGHT_RIGHT,joystick2right -default,BUTTON1,b -default,BUTTON2,a -default,BUTTON3,y -default,BUTTON4,x -default,BUTTON5,pageup -default,BUTTON6,pagedown -default,BUTTON7,l2 -default,BUTTON8,r2 -default,BUTTON9,l3 -default,BUTTON10,r3 -default,START,start -default,COIN,select -gunbuttons,BUTTON1,BUTTON1 -gunbuttons,BUTTON2,BUTTON2 -gunbuttons,START,BUTTON3 -gunbuttons,COIN,BUTTON4 -gunbuttons,BUTTON3,BUTTON5 -gunbuttons,BUTTON4,BUTTON6 -gunbuttons,BUTTON5,BUTTON7 -gunbuttons,BUTTON6,BUTTON8 -mousebuttons,BUTTON1,BUTTON1 -mousebuttons,BUTTON2,BUTTON2 -mousebuttons,BUTTON3,BUTTON3 -mousebuttons,START,BUTTON4 -mousebuttons,COIN,BUTTON5 -mousebuttons,BUTTON4,BUTTON6 -mousebuttons,BUTTON5,BUTTON7 -mousebuttons,BUTTON6,BUTTON8 -sfsnes,BUTTON1,y -sfsnes,BUTTON2,x -sfsnes,BUTTON3,pageup -sfsnes,BUTTON4,b -sfsnes,BUTTON5,a -sfsnes,BUTTON6,pagedown -mksnes,BUTTON1,y -mksnes,BUTTON2,pageup -mksnes,BUTTON3,x -mksnes,BUTTON4,b -mksnes,BUTTON5,a -mksnes,BUTTON6,pagedown -kisnes,BUTTON1,pageup -kisnes,BUTTON2,y -kisnes,BUTTON3,x -kisnes,BUTTON4,pagedown -kisnes,BUTTON5,b -kisnes,BUTTON6,a -sfstick,BUTTON1,y -sfstick,BUTTON2,x -sfstick,BUTTON3,pagedown -sfstick,BUTTON4,b -sfstick,BUTTON5,a -sfstick,BUTTON6,r2 -sfstick,BUTTON8,pageup -mkstick,BUTTON1,y -mkstick,BUTTON2,x -mkstick,BUTTON3,pagedown -mkstick,BUTTON4,b -mkstick,BUTTON5,r2 -mkstick,BUTTON6,a -mkstick,BUTTON7,pageup -mkstick,BUTTON8,l2 -mddefault,BUTTON1,y -mddefault,BUTTON2,b -mddefault,BUTTON3,a -mddefault,BUTTON4,pageup -mddefault,BUTTON5,x -mddefault,BUTTON6,pagedown -megadrive,BUTTON1,pageup -megadrive,BUTTON2,x -megadrive,BUTTON3,pagedown -megadrive,BUTTON4,y -megadrive,BUTTON5,b -megadrive,BUTTON6,a -mkmegadrive,BUTTON1,pageup -mkmegadrive,BUTTON2,x -mkmegadrive,BUTTON3,pagedown -mkmegadrive,BUTTON4,y -mkmegadrive,BUTTON5,a -mkmegadrive,BUTTON6,b -neomini,BUTTON1,y -neomini,BUTTON2,b -neomini,BUTTON3,x -neomini,BUTTON4,a -neocd,BUTTON1,b -neocd,BUTTON2,a -neocd,BUTTON3,y -neocd,BUTTON4,x -neostick,BUTTON1,b -neostick,BUTTON2,x -neostick,BUTTON3,pagedown -neostick,BUTTON4,pageup -neostick,BUTTON5,y -neostick,BUTTON6,a -twinstick,BUTTON1,l2 -twinstick,BUTTON2,pageup -twinstick,BUTTON3,r2 -twinstick,BUTTON4,pagedown -twinstick,BUTTON5,l3 -twinstick,BUTTON6,r3 -twinstick,BUTTON7, -twinstick,BUTTON8, -twinstick,BUTTON9, -twinstick,BUTTON10, -fightstick,BUTTON1,b -fightstick,BUTTON2,a -fightstick,BUTTON3,r2 -fightstick,BUTTON4,l2 -fightstick,BUTTON5,y -fightstick,BUTTON6,x -fightstick,BUTTON7,pagedown -fightstick,BUTTON8,pageup \ No newline at end of file diff --git a/package/batocera/core/batocera-configgen/data/mame/mameControls.toml b/package/batocera/core/batocera-configgen/data/mame/mameControls.toml new file mode 100644 index 00000000000..1f54af8ce47 --- /dev/null +++ b/package/batocera/core/batocera-configgen/data/mame/mameControls.toml @@ -0,0 +1,154 @@ +[default] +JOYSTICK_UP = "joystick1up" +JOYSTICK_DOWN = "joystick1down" +JOYSTICK_LEFT = "joystick1left" +JOYSTICK_RIGHT = "joystick1right" +JOYSTICKLEFT_UP = "joystick1up" +JOYSTICKLEFT_DOWN = "joystick1down" +JOYSTICKLEFT_LEFT = "joystick1left" +JOYSTICKLEFT_RIGHT = "joystick1right" +JOYSTICKRIGHT_UP = "joystick2up" +JOYSTICKRIGHT_DOWN = "joystick2down" +JOYSTICKRIGHT_LEFT = "joystick2left" +JOYSTICKRIGHT_RIGHT = "joystick2right" +BUTTON1 = "b" +BUTTON2 = "a" +BUTTON3 = "y" +BUTTON4 = "x" +BUTTON5 = "pageup" +BUTTON6 = "pagedown" +BUTTON7 = "l2" +BUTTON8 = "r2" +BUTTON9 = "l3" +BUTTON10 = "r3" +START = "start" +COIN = "select" + +[gunbuttons] +BUTTON1 = "BUTTON1" +BUTTON2 = "BUTTON2" +START = "BUTTON3" +COIN = "BUTTON4" +BUTTON3 = "BUTTON5" +BUTTON4 = "BUTTON6" +BUTTON5 = "BUTTON7" +BUTTON6 = "BUTTON8" + +[mousebuttons] +BUTTON1 = "BUTTON1" +BUTTON2 = "BUTTON2" +BUTTON3 = "BUTTON3" +START = "BUTTON4" +COIN = "BUTTON5" +BUTTON4 = "BUTTON6" +BUTTON5 = "BUTTON7" +BUTTON6 = "BUTTON8" + +[sfsnes] +BUTTON1 = "y" +BUTTON2 = "x" +BUTTON3 = "pageup" +BUTTON4 = "b" +BUTTON5 = "a" +BUTTON6 = "pagedown" + +[mksnes] +BUTTON1 = "y" +BUTTON2 = "pageup" +BUTTON3 = "x" +BUTTON4 = "b" +BUTTON5 = "a" +BUTTON6 = "pagedown" + +[kisnes] +BUTTON1 = "pageup" +BUTTON2 = "y" +BUTTON3 = "x" +BUTTON4 = "pagedown" +BUTTON5 = "b" +BUTTON6 = "a" + +[sfstick] +BUTTON1 = "y" +BUTTON2 = "x" +BUTTON3 = "pagedown" +BUTTON4 = "b" +BUTTON5 = "a" +BUTTON6 = "r2" +BUTTON8 = "pageup" + +[mkstick] +BUTTON1 = "y" +BUTTON2 = "x" +BUTTON3 = "pagedown" +BUTTON4 = "b" +BUTTON5 = "r2" +BUTTON6 = "a" +BUTTON7 = "pageup" +BUTTON8 = "l2" + +[mddefault] +BUTTON1 = "y" +BUTTON2 = "b" +BUTTON3 = "a" +BUTTON4 = "pageup" +BUTTON5 = "x" +BUTTON6 = "pagedown" + +[megadrive] +BUTTON1 = "pageup" +BUTTON2 = "x" +BUTTON3 = "pagedown" +BUTTON4 = "y" +BUTTON5 = "b" +BUTTON6 = "a" + +[mkmegadrive] +BUTTON1 = "pageup" +BUTTON2 = "x" +BUTTON3 = "pagedown" +BUTTON4 = "y" +BUTTON5 = "a" +BUTTON6 = "b" + +[neomini] +BUTTON1 = "y" +BUTTON2 = "b" +BUTTON3 = "x" +BUTTON4 = "a" + +[neocd] +BUTTON1 = "b" +BUTTON2 = "a" +BUTTON3 = "y" +BUTTON4 = "x" + +[neostick] +BUTTON1 = "b" +BUTTON2 = "x" +BUTTON3 = "pagedown" +BUTTON4 = "pageup" +BUTTON5 = "y" +BUTTON6 = "a" + +[twinstick] +BUTTON1 = "l2" +BUTTON2 = "pageup" +BUTTON3 = "r2" +BUTTON4 = "pagedown" +BUTTON5 = "l3" +BUTTON6 = "r3" +BUTTON7 = "" +BUTTON8 = "" +BUTTON9 = "" +BUTTON10 = "" + +[fightstick] +BUTTON1 = "b" +BUTTON2 = "a" +BUTTON3 = "r2" +BUTTON4 = "l2" +BUTTON5 = "y" +BUTTON6 = "x" +BUTTON7 = "pagedown" +BUTTON8 = "pageup" diff --git a/package/batocera/core/batocera-configgen/data/mame/mameKInstinct.txt b/package/batocera/core/batocera-configgen/data/mame/mameKInstinct.txt deleted file mode 100755 index 5641e52ab82..00000000000 --- a/package/batocera/core/batocera-configgen/data/mame/mameKInstinct.txt +++ /dev/null @@ -1,3 +0,0 @@ -kinst -kinst2 -kinst2uk \ No newline at end of file diff --git a/package/batocera/core/batocera-configgen/data/mame/mameMKombat.txt b/package/batocera/core/batocera-configgen/data/mame/mameMKombat.txt deleted file mode 100755 index 333a89f0d89..00000000000 --- a/package/batocera/core/batocera-configgen/data/mame/mameMKombat.txt +++ /dev/null @@ -1,40 +0,0 @@ -mknifty666 -mknifty -mkprot4 -mkprot8 -mkprot9 -mkrep -mkla1 -mkla2 -mkla3 -mkla4 -mkr4 -mk -mkyturboe -mkyturbo -mktturbo -mkyawdim -mkyawdim2 -mkyawdim3 -mkyawdim4 -mk3p40 -mk3r10 -mk3r20 -mk3 -mk4b -mk4a -mk4 -mk2r11 -mk2r14 -mk2r20 -mk2r21 -mk2r30 -mk2r31e -mk2 -mk2r32e -mk2r42 -mk2r91 -mk2chal -umk3r10 -umk3r11 -umk3 \ No newline at end of file diff --git a/package/batocera/core/batocera-configgen/data/mame/mameNeogeo.txt b/package/batocera/core/batocera-configgen/data/mame/mameNeogeo.txt deleted file mode 100755 index f9f3bbc5a75..00000000000 --- a/package/batocera/core/batocera-configgen/data/mame/mameNeogeo.txt +++ /dev/null @@ -1,261 +0,0 @@ -2020bb -2020bba -2020bbh -3countb -sonicwi2 -sonicwi3 -aodk -alpham2 -alpham2p -androdun -aof -aof2a -aof2 -aof3k -aof3 -b2b -bangbead -bstars2 -bstarsh -bstars -flipshot -blazstar -bjourneyh -bjourney -breakers -breakrev -burningfh -burningf -burningfpa -burningfpb -burningfp -ctomaday -ironclado -ironclad -crsword -crswd2bl -cthd2003 -ct2k3sp -ct2k3sa -cyberlip -diggerma -doubledr -dragonsh -eightman -kabukikl -fatfury1 -fatfury2 -fatfury3 -fatfursp -fatfurspa -fightfev -fightfeva -fswords -fbfrenzy -galaxyfg -ganryu -garoubl -garouha -garouh -garou -garoup -gpilotsh -gpilots -gpilotsp -ghostlop -goalx3 -gururin -karnovr -kog -kotm -kotmh -kotm2 -kotm2a -kotm2p -kizuna -kizuna4p -lans2004 -lasthope -lresort -lresortp -lbowling -legendos -magdrop2 -magdrop3 -maglordh -maglord -matrimbl -matrim -mslug -mslug2 -mslug2t -mslug3h -mslug3a -mslug3 -mslug4h -mslug4 -ms4plus -mslug5b -mslug5h -mslug5 -ms5plus -mslug3b6 -mslugx -miexchng -mutnat -nam1975 -neobombe -neodrift -neomrdo -turfmast -neocup98 -nitd -nitdbl -ncombath -ncombat -ncommand -ninjamas -overtop -samsho4k -panicbom -pgoal -pnyaaa -pnyaa -popbounc -pspikes2 -preisle2 -pulstar -pbobblenb -pbobblen -pbobbl2n -puzzledp -puzzldpr -joyjoy -rotdh -rotd -ragnagrd -rbff1a -rbff1ka -rbff1k -rbff1 -rbff2k -rbff2h -rbff2 -rbffspec -rbffspeck -ridhero -ridheroh -roboarmy -roboarmya -samshoh -samsho -samsho2 -samsho3h -samsho3 -samsho4 -samsho5b -samsho5h -samsho5 -samsho5a -samsh5spho -samsh5sph -samsh5sp -samsho2k -samsho2ka -savagere -sengokuh -sengoku -sengoku2 -sengoku3 -sengoku3a -shocktr2 -shocktro -shocktroa -svcboot -svc -svcplus -svcplusa -svcsplus -socbrawlh -socbrawl -spinmast -stakwin -stakwindev -stakwin2 -strhoop -s1945p -sbp -sdodgeb -ssideki -ssideki2 -ssideki3 -twsoc96 -irrmaze -kof94 -kof95h -kof95a -kof95 -kof96h -kof96 -kof97k -kof97h -kof97 -kof97oro -kof97pls -kof98k -kof98ka -kof98h -kof98a -kof98 -kof99e -kof99ka -kof99k -kof99h -kof99 -kof99p -kof10th -kf2k5uni -kf10thep -kof2000 -kof2000n -kof2001h -kof2001 -kof2002b -kof2002 -kf2k2mp -kf2k2mp2 -kf2k2pls -kf2k2pla -kf2k3bl -kf2k3bla -kof2003h -kof2003 -kf2k3pl -kf2k3upl -kof2k4se -lastbladh -lastblad -lastbld2 -lastsold -superspy -ssideki4 -trally -tophuntrh -tophuntr -tpgolf -twinspri -viewpoin -viewpoinp -gowcaizr -wakuwak7 -wjammers -wh1h -wh1 -wh1ha -wh2h -wh2 -wh2j -whp -zedblade -zintrckb -zupapa \ No newline at end of file diff --git a/package/batocera/core/batocera-configgen/data/mame/mameRoms.toml b/package/batocera/core/batocera-configgen/data/mame/mameRoms.toml new file mode 100644 index 00000000000..77731e40aea --- /dev/null +++ b/package/batocera/core/batocera-configgen/data/mame/mameRoms.toml @@ -0,0 +1,692 @@ +capcom = [ + "dstlk", + "dstlka", + "dstlkh", + "dstlku", + "dstlkur1", + "hsf2", + "hsf2a", + "hsf2j", + "hsf2j1", + "jgakuen", + "jgakuen1", + "jojo", + "jojoa", + "jojoar1", + "jojoar2", + "jojoba", + "jojobaj", + "jojobajr1", + "jojoban", + "jojobane", + "jojobaner1", + "jojobanr1", + "jojobar1", + "jojoj", + "jojojr1", + "jojojr2", + "jojon", + "jojonr1", + "jojonr2", + "jojor1", + "jojor2", + "jojou", + "jojour1", + "jojour2", + "kikaioh", + "msh", + "msha", + "mshb", + "mshbr1", + "mshh", + "mshj", + "mshjr1", + "mshu", + "mshvsf", + "mshvsfa", + "mshvsfa1", + "mshvsfb", + "mshvsfb1", + "mshvsfh", + "mshvsfj", + "mshvsfj1", + "mshvsfj2", + "mshvsfu", + "mshvsfu1", + "mvsc", + "mvsca", + "mvscar1", + "mvscb", + "mvsch", + "mvscj", + "mvscjr1", + "mvscjsing", + "mvscr1", + "mvscu", + "mvscur1", + "nwarr", + "nwarra", + "nwarrb", + "nwarrh", + "nwarru", + "plsmaswd", + "plsmaswda", + "redearth", + "redearthr1", + "ringdest", + "ringdesta", + "ringdestb", + "ringdesth", + "rvschool", + "rvschoola", + "rvschoolu", + "sf2", + "sf2ce", + "sf2ceea", + "sf2ceja", + "sf2cejb", + "sf2cejc", + "sf2cet", + "sf2ceua", + "sf2ceub", + "sf2ceuc", + "sf2ea", + "sf2eb", + "sf2ed", + "sf2ee", + "sf2ef", + "sf2em", + "sf2en", + "sf2hf", + "sf2hfj", + "sf2hfu", + "sf2j", + "sf2j17", + "sf2ja", + "sf2jc", + "sf2jf", + "sf2jh", + "sf2jl", + "sf2ua", + "sf2ub", + "sf2uc", + "sf2ud", + "sf2ue", + "sf2uf", + "sf2ug", + "sf2uh", + "sf2ui", + "sf2uk", + "sf2um", + "sfa", + "sfa2", + "sfa2u", + "sfa2ur1", + "sfa3", + "sfa3b", + "sfa3h", + "sfa3hr1", + "sfa3u", + "sfa3ur1", + "sfa3us", + "sfar1", + "sfar2", + "sfar3", + "sfau", + "sfex", + "sfex2", + "sfex2a", + "sfex2h", + "sfex2j", + "sfex2p", + "sfex2pa", + "sfex2ph", + "sfex2pj", + "sfex2pu", + "sfex2u", + "sfex2u1", + "sfexa", + "sfexj", + "sfexp", + "sfexpj", + "sfexpj1", + "sfexpu1", + "sfexu", + "sfiii", + "sfiii2", + "sfiii2j", + "sfiii2n", + "sfiii3", + "sfiii3j", + "sfiii3jr1", + "sfiii3n", + "sfiii3nr1", + "sfiii3r1", + "sfiii3u", + "sfiii3ur1", + "sfiiia", + "sfiiih", + "sfiiij", + "sfiiin", + "sfiiina", + "sfiiiu", + "sfz2a", + "sfz2al", + "sfz2alb", + "sfz2alh", + "sfz2alj", + "sfz2alr1", + "sfz2b", + "sfz2br1", + "sfz2h", + "sfz2j", + "sfz2jr1", + "sfz2n", + "sfz3a", + "sfz3ar1", + "sfz3j", + "sfz3jr1", + "sfz3jr2", + "sfza", + "sfzar1", + "sfzb", + "sfzbr1", + "sfzh", + "sfzhr1", + "sfzj", + "sfzjr1", + "sfzjr2", + "smbomb", + "smbombr1", + "ssf2", + "ssf2a", + "ssf2ar1", + "ssf2h", + "ssf2j", + "ssf2jr1", + "ssf2jr2", + "ssf2r1", + "ssf2t", + "ssf2ta", + "ssf2tb", + "ssf2tba", + "ssf2tbh", + "ssf2tbj", + "ssf2tbj1", + "ssf2tbr1", + "ssf2tbu", + "ssf2th", + "ssf2tu", + "ssf2tur1", + "ssf2u", + "ssf2xj", + "ssf2xjr1", + "ssf2xjr1r", + "starglad", + "stargladj", + "stargld2", + "techromn", + "techromna", + "techromnu", + "ts2", + "ts2j", + "ts2ja", + "ts2u", + "ts2ua", + "vampj", + "vampja", + "vampjr1", + "vhunt2", + "vhunt2r1", + "vhuntj", + "vhuntjr1", + "vhuntjr1s", + "vhuntjr2", + "vsav", + "vsav2", + "vsava", + "vsavb", + "vsavh", + "vsavj", + "vsavu", + "warzard", + "warzardr1", + "xmcota", + "xmcotaa", + "xmcotaar1", + "xmcotaar2", + "xmcotab", + "xmcotah", + "xmcotahr1", + "xmcotaj", + "xmcotaj1", + "xmcotaj2", + "xmcotaj3", + "xmcotajr", + "xmcotar1", + "xmcotau", + "xmvsf", + "xmvsfa", + "xmvsfar1", + "xmvsfar2", + "xmvsfar3", + "xmvsfb", + "xmvsfh", + "xmvsfj", + "xmvsfjr1", + "xmvsfjr2", + "xmvsfjr3", + "xmvsfr1", + "xmvsfu", + "xmvsfur1", + "xmvsfur2", +] +mortal_kombat = [ + "mk", + "mk2", + "mk2chal", + "mk2r11", + "mk2r14", + "mk2r20", + "mk2r21", + "mk2r30", + "mk2r31e", + "mk2r32e", + "mk2r42", + "mk2r91", + "mk3", + "mk3p40", + "mk3r10", + "mk3r20", + "mk4", + "mk4a", + "mk4b", + "mkla1", + "mkla2", + "mkla3", + "mkla4", + "mknifty", + "mknifty666", + "mkprot4", + "mkprot8", + "mkprot9", + "mkr4", + "mkrep", + "mktturbo", + "mkyawdim", + "mkyawdim2", + "mkyawdim3", + "mkyawdim4", + "mkyturbo", + "mkyturboe", + "umk3", + "umk3r10", + "umk3r11", +] +killer_instinct = ["kinst", "kinst2", "kinst2uk"] +neogeo = [ + "2020bb", + "2020bba", + "2020bbh", + "3countb", + "alpham2", + "alpham2p", + "androdun", + "aodk", + "aof", + "aof2", + "aof2a", + "aof3", + "aof3k", + "b2b", + "bangbead", + "bjourney", + "bjourneyh", + "blazstar", + "breakers", + "breakrev", + "bstars", + "bstars2", + "bstarsh", + "burningf", + "burningfh", + "burningfp", + "burningfpa", + "burningfpb", + "crswd2bl", + "crsword", + "ct2k3sa", + "ct2k3sp", + "cthd2003", + "ctomaday", + "cyberlip", + "diggerma", + "doubledr", + "dragonsh", + "eightman", + "fatfursp", + "fatfurspa", + "fatfury1", + "fatfury2", + "fatfury3", + "fbfrenzy", + "fightfev", + "fightfeva", + "flipshot", + "fswords", + "galaxyfg", + "ganryu", + "garou", + "garoubl", + "garouh", + "garouha", + "garoup", + "ghostlop", + "goalx3", + "gowcaizr", + "gpilots", + "gpilotsh", + "gpilotsp", + "gururin", + "ironclad", + "ironclado", + "irrmaze", + "joyjoy", + "kabukikl", + "karnovr", + "kf10thep", + "kf2k2mp", + "kf2k2mp2", + "kf2k2pla", + "kf2k2pls", + "kf2k3bl", + "kf2k3bla", + "kf2k3pl", + "kf2k3upl", + "kf2k5uni", + "kizuna", + "kizuna4p", + "kof10th", + "kof2000", + "kof2000n", + "kof2001", + "kof2001h", + "kof2002", + "kof2002b", + "kof2003", + "kof2003h", + "kof2k4se", + "kof94", + "kof95", + "kof95a", + "kof95h", + "kof96", + "kof96h", + "kof97", + "kof97h", + "kof97k", + "kof97oro", + "kof97pls", + "kof98", + "kof98a", + "kof98h", + "kof98k", + "kof98ka", + "kof99", + "kof99e", + "kof99h", + "kof99k", + "kof99ka", + "kof99p", + "kog", + "kotm", + "kotm2", + "kotm2a", + "kotm2p", + "kotmh", + "lans2004", + "lastblad", + "lastbladh", + "lastbld2", + "lasthope", + "lastsold", + "lbowling", + "legendos", + "lresort", + "lresortp", + "magdrop2", + "magdrop3", + "maglord", + "maglordh", + "matrim", + "matrimbl", + "miexchng", + "ms4plus", + "ms5plus", + "mslug", + "mslug2", + "mslug2t", + "mslug3", + "mslug3a", + "mslug3b6", + "mslug3h", + "mslug4", + "mslug4h", + "mslug5", + "mslug5b", + "mslug5h", + "mslugx", + "mutnat", + "nam1975", + "ncombat", + "ncombath", + "ncommand", + "neobombe", + "neocup98", + "neodrift", + "neomrdo", + "ninjamas", + "nitd", + "nitdbl", + "overtop", + "panicbom", + "pbobbl2n", + "pbobblen", + "pbobblenb", + "pgoal", + "pnyaa", + "pnyaaa", + "popbounc", + "preisle2", + "pspikes2", + "pulstar", + "puzzldpr", + "puzzledp", + "ragnagrd", + "rbff1", + "rbff1a", + "rbff1k", + "rbff1ka", + "rbff2", + "rbff2h", + "rbff2k", + "rbffspec", + "rbffspeck", + "ridhero", + "ridheroh", + "roboarmy", + "roboarmya", + "rotd", + "rotdh", + "s1945p", + "samsh5sp", + "samsh5sph", + "samsh5spho", + "samsho", + "samsho2", + "samsho2k", + "samsho2ka", + "samsho3", + "samsho3h", + "samsho4", + "samsho4k", + "samsho5", + "samsho5a", + "samsho5b", + "samsho5h", + "samshoh", + "savagere", + "sbp", + "sdodgeb", + "sengoku", + "sengoku2", + "sengoku3", + "sengoku3a", + "sengokuh", + "shocktr2", + "shocktro", + "shocktroa", + "socbrawl", + "socbrawlh", + "sonicwi2", + "sonicwi3", + "spinmast", + "ssideki", + "ssideki2", + "ssideki3", + "ssideki4", + "stakwin", + "stakwin2", + "stakwindev", + "strhoop", + "superspy", + "svc", + "svcboot", + "svcplus", + "svcplusa", + "svcsplus", + "tophuntr", + "tophuntrh", + "tpgolf", + "trally", + "turfmast", + "twinspri", + "twsoc96", + "viewpoin", + "viewpoinp", + "wakuwak7", + "wh1", + "wh1h", + "wh1ha", + "wh2", + "wh2h", + "wh2j", + "whp", + "wjammers", + "zedblade", + "zintrckb", + "zupapa", +] +twin_stick = [ + "agentx1", + "agentx2", + "agentx3", + "agentx4", + "airrace", + "aponow", + "asoccer", + "assault", + "assaultj", + "assaultp", + "bandido", + "bzone", + "bzonea", + "bzonec", + "cloak", + "cloakfr", + "cloakgr", + "cloaksp", + "complexx", + "dribling", + "driblinga", + "driblingbr", + "driblingo", + "faceoff", + "firetrap", + "firetrapa", + "firetrapbl", + "firetrapj", + "frontlin", + "frontlina", + "idsoccer", + "idsoccera", + "inferno", + "kngtmare", + "laststar", + "liblrabl", + "losttomb", + "losttombh", + "mainsnk", + "minefld", + "minefldfe", + "plygonet", + "qb3", + "rescraid", + "rescraida", + "rescue", + "rescueb", + "rescuefe", + "roishtar", + "sarge", + "screwloo", + "sheriff", + "soniccar", + "tank", + "tank8", + "tank8a", + "tank8b", + "tank8c", + "tank8d", + "tankbatl", + "tinstar", + "tinstara", + "tutankhm", + "tutankhms", + "ultratnk", + "vindctr2", + "vindctr2r1", + "vindctr2r2", + "vindictr", + "vindictr1", + "vindictr2", + "vindictr4", + "vindictre", + "vindictre3", + "vindictre4", + "vindictrg", + "von", + "von2", + "von254g", + "von2a", + "von2o", + "vonj", + "vonr", + "vonu", + "westgun2", + "wmatch", + "wmg", + "wwestern", + "wwestern1", +] +rotated_stick = [ + "congo", + "congoa", + "myqbert", + "qbert", + "qberta", + "qbertj", + "qbertqub", + "qberttst", + "qbtrktst", + "sqbert", +] diff --git a/package/batocera/core/batocera-configgen/data/mame/mameRotatedstick.txt b/package/batocera/core/batocera-configgen/data/mame/mameRotatedstick.txt deleted file mode 100644 index 5f2f4a8a767..00000000000 --- a/package/batocera/core/batocera-configgen/data/mame/mameRotatedstick.txt +++ /dev/null @@ -1,10 +0,0 @@ -qbert -myqbert -qberttst -qbertj -qberta -qbtrktst -sqbert -qbertqub -congo -congoa \ No newline at end of file diff --git a/package/batocera/core/batocera-configgen/data/mame/mameTwinstick.txt b/package/batocera/core/batocera-configgen/data/mame/mameTwinstick.txt deleted file mode 100755 index 64647127b63..00000000000 --- a/package/batocera/core/batocera-configgen/data/mame/mameTwinstick.txt +++ /dev/null @@ -1,89 +0,0 @@ -agentx1 -agentx2 -agentx3 -agentx4 -airrace -asoccer -aponow -assaultj -assault -assaultp -bandido -bzonec -bzonea -bzone -cloakfr -cloakgr -cloak -cloaksp -complexx -vonr -von -vonj -vonu -driblingbr -driblingo -dribling -driblinga -faceoff -firetrapbl -firetrapj -firetrap -firetrapa -frontlin -frontlina -idsoccer -idsoccera -inferno -kngtmare -liblrabl -losttomb -losttombh -mainsnk -minefld -minefldfe -plygonet -qb3 -rescue -rescuefe -rescraid -rescraida -sarge -screwloo -sheriff -tank8 -tank8a -tank8b -tank8c -tank8d -tankbatl -tank -laststar -roishtar -tinstar -tinstara -rescueb -tutankhm -tutankhms -ultratnk -vindictre3 -vindictre4 -vindictre -vindictrg -vindictr1 -vindictr2 -vindictr4 -vindictr -vindctr2r1 -vindctr2r2 -vindctr2 -von2o -von2a -von2 -von254g -soniccar -wmatch -westgun2 -wwestern -wwestern1 -wmg diff --git a/package/batocera/core/batocera-configgen/data/mame/messControls.csv b/package/batocera/core/batocera-configgen/data/mame/messControls.csv deleted file mode 100644 index 19d1fef3ade..00000000000 --- a/package/batocera/core/batocera-configgen/data/mame/messControls.csv +++ /dev/null @@ -1,208 +0,0 @@ -cdimono1;Button 1;special;1;:slave_hle:MOUSEBTN;P1_BUTTON1;BUTTON1;BUTTON1;False;1;0 -cdimono1;Button 2;special;1;:slave_hle:MOUSEBTN;P1_BUTTON2;BUTTON2;BUTTON2;False;2;0 -cdimono1;Button 3;special;1;:slave_hle:MOUSEBTN;P1_BUTTON3;BUTTON3;BUTTON3;False;4;0 -cdimono1;X Axis;analog;1;:slave_hle:MOUSEX;P1_MOUSE_X;JOYSTICK_RIGHT;JOYSTICK_LEFT;JOYSTICK_LEFT;JOYSTICK_LEFT;False;65535;0;10;XAXIS -cdimono1;Y Axis;analog;1;:slave_hle:MOUSEY;P1_MOUSE_Y;JOYSTICK_DOWN;JOYSTICK_UP;JOYSTICK_UP;JOYSTICK_UP;False;65535;0;10;YAXIS -apfm1000;Clear;special;1;:joy.2;OTHER;BUTTON3;BUTTON3;False;32;32 -apfm1000;Enter/Fire;special;1;:joy.3;OTHER;BUTTON1;BUTTON1;False;32;32 -apfm1000;1;special;1;:joy.0;OTHER;BUTTON4;BUTTON4;False;16;16 -apfm1000;2;special;1;:joy.3;OTHER;BUTTON2;BUTTON2;False;16;16 -apfm1000;3;special;1;:joy.2;OTHER;BUTTON6;BUTTON6;False;16;16 -apfm1000;4;special;1;:joy.0;OTHER;BUTTON5;BUTTON5;False;64;64 -apfm1000;5;special;1;:joy.3;OTHER;BUTTON8;BUTTON8;False;64;64 -apfm1000;6;special;1;:joy.2;OTHER;BUTTON7;BUTTON7;False;64;64 -apfm1000;7;special;1;:joy.0;OTHER;BUTTON10;BUTTON10;False;128;128 -apfm1000;8;special;1;:joy.3;OTHER;BUTTON9;BUTTON9;False;128;128 -apfm1000;9;special;1;:joy.2;OTHER;COIN;COIN;False;128;128 -apfm1000;0;special;1;:joy.0;OTHER;START;START;False;32;32 -apfm1000;Clear;special;2;:joy.2;TYPE_OTHER(243,1);BUTTON3;BUTTON3;False;2;2 -apfm1000;Enter/Fire;special;2;:joy.3;TYPE_OTHER(243,1);BUTTON1;BUTTON1;False;2;2 -apfm1000;1;special;2;:joy.0;TYPE_OTHER(243,1);BUTTON4;BUTTON4;False;1;1 -apfm1000;2;special;2;:joy.3;TYPE_OTHER(243,1);BUTTON2;BUTTON2;False;1;1 -apfm1000;3;special;2;:joy.2;TYPE_OTHER(243,1);BUTTON6;BUTTON6;False;1;1 -apfm1000;4;special;2;:joy.0;TYPE_OTHER(243,1);BUTTON5;BUTTON5;False;4;4 -apfm1000;5;special;2;:joy.3;TYPE_OTHER(243,1);BUTTON8;BUTTON8;False;4;4 -apfm1000;6;special;2;:joy.2;TYPE_OTHER(243,1);BUTTON7;BUTTON7;False;4;4 -apfm1000;7;special;2;:joy.0;TYPE_OTHER(243,1);BUTTON10;BUTTON10;False;8;8 -apfm1000;8;special;2;:joy.3;TYPE_OTHER(243,1);BUTTON9;BUTTON9;False;8;8 -apfm1000;9;special;2;:joy.2;TYPE_OTHER(243,1);COIN;COIN;False;8;8 -apfm1000;0;special;2;:joy.0;TYPE_OTHER(243,1);START;START;False;2;2 -astrocde;0;special;1;:KEYPAD2;KEYPAD;BUTTON1;BUTTON1;False;32;0 -astrocde;1;special;1;:KEYPAD3;KEYPAD;BUTTON4;BUTTON4;False;16;0 -astrocde;2;special;1;:KEYPAD2;KEYPAD;BUTTON2;BUTTON2;False;16;0 -astrocde;3;special;1;:KEYPAD1;KEYPAD;BUTTON6;BUTTON6;False;16;0 -astrocde;4;special;1;:KEYPAD3;KEYPAD;BUTTON5;BUTTON5;False;8;0 -astrocde;5;special;1;:KEYPAD2;KEYPAD;BUTTON8;BUTTON8;False;8;0 -astrocde;6;special;1;:KEYPAD1;KEYPAD;BUTTON7;BUTTON7;False;8;0 -astrocde;7;special;1;:KEYPAD3;KEYPAD;BUTTON10;BUTTON10;False;4;0 -astrocde;8;special;1;:KEYPAD2;KEYPAD;BUTTON9;BUTTON9;False;4;0 -astrocde;9;special;1;:KEYPAD1;KEYPAD;COIN;COIN;False;4;0 -astrocde;= (Start);special;1;:KEYPAD0;KEYPAD;START;START;False;32;0 -adam;1;special;1;:joy1:hand:KEYPAD;KEYPAD;BUTTON4;BUTTON4;False;2;2 -adam;2;special;1;:joy1:hand:KEYPAD;KEYPAD;BUTTON2;BUTTON2;False;4;4 -adam;3;special;1;:joy1:hand:KEYPAD;KEYPAD;BUTTON6;BUTTON6;False;8;8 -adam;4;special;1;:joy1:hand:KEYPAD;KEYPAD;BUTTON5;BUTTON5;False;16;16 -adam;5;special;1;:joy1:hand:KEYPAD;KEYPAD;BUTTON8;BUTTON8;False;32;32 -adam;6;special;1;:joy1:hand:KEYPAD;KEYPAD;BUTTON7;BUTTON7;False;64;64 -adam;7;special;1;:joy1:hand:KEYPAD;KEYPAD;BUTTON10;BUTTON10;False;128;128 -adam;8;special;1;:joy1:hand:KEYPAD;KEYPAD;BUTTON9;BUTTON9;False;512;512 -adam;#;special;1;:joy1:hand:KEYPAD;KEYPAD;START;START;False;1024;0 -adam;*;special;1;:joy1:hand:KEYPAD;KEYPAD;COIN;COIN;False;2048;0 -arcadia;1;special;1;:controller1_col1;KEYPAD;BUTTON3;BUTTON3;False;8;0 -arcadia;2;special;1;:controller1_col2;KEYPAD;BUTTON1;BUTTON1;False;8;0 -arcadia;3;special;1;:controller1_col3;KEYPAD;BUTTON4;BUTTON4;False;8;0 -arcadia;4;special;1;:controller1_col1;KEYPAD;BUTTON2;BUTTON2;False;4;0 -arcadia;5;special;1;:controller1_col2;KEYPAD;BUTTON6;BUTTON6;False;4;0 -arcadia;6;special;1;:controller1_col3;KEYPAD;BUTTON5;BUTTON5;False;4;0 -arcadia;7;special;1;:controller1_col1;KEYPAD;BUTTON8;BUTTON8;False;2;0 -arcadia;8;special;1;:controller1_col2;KEYPAD;BUTTON7;BUTTON7;False;2;0 -arcadia;9;special;1;:controller1_col3;KEYPAD;BUTTON10;BUTTON10;False;2;0 -arcadia;0;special;1;:controller1_col2;KEYPAD;BUTTON9;BUTTON9;False;1;0 -arcadia;1;special;2;:controller2_col1;KEYPAD;BUTTON3;BUTTON3;False;8;0 -arcadia;2;special;2;:controller2_col2;KEYPAD;BUTTON1;BUTTON1;False;8;0 -arcadia;3;special;2;:controller2_col3;KEYPAD;BUTTON4;BUTTON4;False;8;0 -arcadia;4;special;2;:controller2_col1;KEYPAD;BUTTON2;BUTTON2;False;4;0 -arcadia;5;special;2;:controller2_col2;KEYPAD;BUTTON6;BUTTON6;False;4;0 -arcadia;6;special;2;:controller2_col3;KEYPAD;BUTTON5;BUTTON5;False;4;0 -arcadia;7;special;2;:controller2_col1;KEYPAD;BUTTON8;BUTTON8;False;2;0 -arcadia;8;special;2;:controller2_col2;KEYPAD;BUTTON7;BUTTON7;False;2;0 -arcadia;9;special;2;:controller2_col3;KEYPAD;BUTTON10;BUTTON10;False;2;0 -arcadia;0;special;2;:controller2_col3;KEYPAD;BUTTON9;BUTTON9;False;1;0 -gamecom;A;special;1;:IN0;P1_BUTTON1;BUTTON2;BUTTON2;False;128;128 -gamecom;B;special;1;:IN1;P1_BUTTON2;BUTTON4;BUTTON4;False;1;1 -gamecom;C;special;1;:IN1;P1_BUTTON3;BUTTON1;BUTTON1;False;2;2 -gamecom;D;special;1;:IN2;P1_BUTTON4;BUTTON3;BUTTON3;False;2;2 -gamecom;Menu;special;1;:IN0;OTHER;COIN;COIN;False;16;16 -gamecom;Pause;special;1;:IN0;OTHER;START;START;False;32;32 -tutor;Down;special;1;:LINE4_alt;P1_JOYSTICK_DOWN;JOYSTICK_DOWN;JOYSTICK_UP;False;16;0 -tutor;Left;special;1;:LINE4_alt;P1_JOYSTICK_LEFT;JOYSTICK_LEFT;JOYSTICK_LEFT;False;32;0 -tutor;Up;special;1;:LINE4_alt;P1_JOYSTICK_UP;JOYSTICK_UP;JOYSTICK_UP;False;64;0 -tutor;Right;special;1;:LINE4_alt;P1_JOYSTICK_RIGHT;JOYSTICK_RIGHT;JOYSTICK_LEFT;False;128;0 -tutor;Enter Key;combo;1;:LINE6;KEYBOARD;ENTER;BUTTON3;BUTTON3;False;16;0 -tutor;Down Arrow;combo;1;:LINE7;KEYBOARD;DOWN;BUTTON6;BUTTON6;False;4;0 -tutor;Down;special;2;:LINE2_alt;P2_JOYSTICK_DOWN;JOYSTICK_DOWN;JOYSTICK_UP;False;16;0 -tutor;Left;special;2;:LINE2_alt;P2_JOYSTICK_LEFT;JOYSTICK_LEFT;JOYSTICK_LEFT;False;32;0 -tutor;Up;special;2;:LINE2_alt;P2_JOYSTICK_UP;JOYSTICK_UP;JOYSTICK_UP;False;64;0 -tutor;Right;special;2;:LINE2_alt;P2_JOYSTICK_RIGHT;JOYSTICK_RIGHT;JOYSTICK_LEFT;False;128;0 -crvision;P1 Button 1 (Shift);special;1;:PA1.7;P1_BUTTON1;BUTTON2;BUTTON2;False;128;128 -crvision;P1 Button 2 (Control);special;1;:PA0.7;P1_BUTTON2;BUTTON4;BUTTON4;False;128;128 -crvision;P1 Upper Right (1);special;1;:PA0.2;KEYBOARD;BUTTON6;BUTTON6;False;8;8 -crvision;P1 Lower Left (B);special;1;:PA1.1;KEYBOARD;BUTTON1;BUTTON1;False;4;4 -crvision;P1 Lower Right (6);special;1;:PA1.4;KEYBOARD;BUTTON3;BUTTON3;False;64;64 -crvision;Reset/Start;special;1;:NMI;P1_START;START;START;False;1;0 -crvision;P2 Button 1 (-/=);special;2;:PA3.7;P2_BUTTON1;BUTTON2;BUTTON2;False;128;128 -crvision;P2 Button 2 (Right);special;2;:PA2.7;P2_BUTTON2;BUTTON4;BUTTON4;False;128;128 -crvision;P2 Upper Right (Space);special;2;:PA2.2;KEYBOARD;BUTTON6;BUTTON6;False;8;8 -crvision;P2 Lower Left (7);special;2;:PA3.1;KEYBOARD;BUTTON1;BUTTON1;False;4;4 -crvision;P2 Lower Right (N);special;2;:PA3.1;KEYBOARD;BUTTON3;BUTTON3;False;64;64 -bbc;*;combo;1;:COL8;KEYBOARD;QUOTE;BUTTON2;BUTTON2;False;64;64 -bbc;?;combo;1;:COL8;KEYBOARD;SLASH;BUTTON4;BUTTON4;False;16;16 -bbc;Z;combo;1;:COL1;KEYBOARD;Z;BUTTON1;BUTTON1;False;64;64 -bbc;X;combo;1;:COL2;KEYBOARD;X;BUTTON3;BUTTON3;False;16;16 -bbc;Enter;combo;1;:COL9;KEYBOARD;ENTER;BUTTON6;BUTTON6;False;16;16 -bbc;Down;combo;1;:COL9;KEYBOARD;DOWN;JOYSTICK_DOWN;JOYSTICK_UP;False;4;4 -bbc;Left;combo;1;:COL9;KEYBOARD;LEFT;JOYSTICK_LEFT;JOYSTICK_LEFT;False;2;2 -bbc;Up;combo;1;:COL9;KEYBOARD;UP;JOYSTICK_UP;JOYSTICK_UP;False;8;8 -bbc;Right;combo;1;:COL9;KEYBOARD;RIGHT;JOYSTICK_RIGHT;JOYSTICK_LEFT;False;128;128 -bbc-acornjoy;P1 Button;special;1;:analogue:acornjoy:BUTTONS;P1_BUTTON1;BUTTON1;BUTTON1;False;16;16 -bbc-acornjoy;P1 X Axis;analog;1;:analogue:acornjoy:JOY0;P1_AD_STICK_X;JOYSTICK_RIGHT;JOYSTICK_LEFT;JOYSTICK_LEFT;JOYSTICK_LEFT;False;255;128;10;XAXIS -bbc-acornjoy;P1 Y Axis;analog;1;:analogue:acornjoy:JOY1;P1_AD_STICK_Y;JOYSTICK_DOWN;JOYSTICK_UP;JOYSTICK_UP;JOYSTICK_UP;False;255;128;10;YAXIS -bbc-acornjoy;P2 Button;special;2;:analogue:acornjoy:BUTTONS;P2_BUTTON1;BUTTON1;BUTTON1;False;32;32 -bbc-acornjoy;P2 X Axis;analog;2;:analogue:acornjoy:JOY2;P2_AD_STICK_X;JOYSTICK_RIGHT;JOYSTICK_LEFT;JOYSTICK_LEFT;JOYSTICK_LEFT;False;255;128;10;XAXIS -bbc-acornjoy;P2 Y Axis;analog;2;:analogueacornjoy:JOY3;P2_AD_STICK_Y;JOYSTICK_DOWN;JOYSTICK_UP;JOYSTICK_UP;JOYSTICK_UP;False;255;128;10;YAXIS -bbc-voltmace3b;P1 Button;special;1;:analogue:voltmace3b:BUTTONS;P1_BUTTON1;BUTTON1;BUTTON1;False;16;16 -bbc-voltmace3b;P1 X Axis;analog;1;:analogue:voltmace3b:JOY0;P1_AD_STICK_X;JOYSTICK_RIGHT;JOYSTICK_LEFT;JOYSTICK_LEFT;JOYSTICK_LEFT;False;255;128;10;XAXIS -bbc-voltmace3b;P1 Y Axis;analog;1;:analogue:voltmace3b:JOY1;P1_AD_STICK_Y;JOYSTICK_DOWN;JOYSTICK_UP;JOYSTICK_UP;JOYSTICK_UP;False;255;128;10;YAXIS -bbc-voltmace3b;P2 Button;special;2;:analogue:voltmace3b:BUTTONS;P2_BUTTON1;BUTTON1;BUTTON1;False;32;32 -bbc-voltmace3b;P2 X Axis;analog;2;:analogue:voltmace3b:JOY2;P2_AD_STICK_X;JOYSTICK_RIGHT;JOYSTICK_LEFT;JOYSTICK_LEFT;JOYSTICK_LEFT;False;255;128;10;XAXIS -bbc-voltmace3b;P2 Y Axis;analog;2;:voltmace3b:JOY3;P2_AD_STICK_Y;JOYSTICK_DOWN;JOYSTICK_UP;JOYSTICK_UP;JOYSTICK_UP;False;255;128;10;YAXIS -bbc-bitstik1;P1 Button 1;special;1;:analogue:bitstik1:BUTTONS;P1_BUTTON1;BUTTON1;BUTTON1;False;16;16 -bbc-bitstik1;P1 Button 2;special;1;:analogue:bitstik1:BUTTONS;P1_BUTTON2;BUTTON2;BUTTON2;False;32;32 -bbc-bitstik1;P1 Button 3;special;1;:analogue:bitstik1:BUTTONS;P1_BUTTON3;BUTTON3;BUTTON3;False;255;255 -bbc-bitstik1;P1 X Axis;analog;1;:analogue:bitstik1:CHANNEL0;P1_AD_STICK_X;JOYSTICK_RIGHT;JOYSTICK_LEFT;JOYSTICK_LEFT;JOYSTICK_LEFT;False;255;0;10;XAXIS -bbc-bitstik1;P1 Y Axis;analog;1;:analogue:bitstik1:CHANNEL1;P1_AD_STICK_Y;JOYSTICK_DOWN;JOYSTICK_UP;JOYSTICK_UP;JOYSTICK_UP;False;255;0;10;YAXIS -bbc-bitstik1;P1 Z Axis;analog;1;:analogue:bitstik1:CHANNEL2;P1_AD_STICK_Z;BUTTON5;BUTTON6;BUTTON5;BUTTON6;False;255;0;10;ZAXIS -bbc-bitstik2;P1 Button 1;special;1;:analogue:bitstik2:BUTTONS;P1_BUTTON1;BUTTON1;BUTTON1;False;16;16 -bbc-bitstik2;P1 Button 2;special;1;:analogue:bitstik2:BUTTONS;P1_BUTTON2;BUTTON2;BUTTON2;False;32;32 -bbc-bitstik2;P1 Button 3;special;1;:analogue:bitstik2:BUTTONS;P1_BUTTON3;BUTTON3;BUTTON3;False;255;255 -bbc-bitstik2;P1 X Axis;analog;1;:analogue:bitstik2:CHANNEL0;P1_AD_STICK_X;JOYSTICK_RIGHT;JOYSTICK_LEFT;JOYSTICK_LEFT;JOYSTICK_LEFT;False;255;0;10;XAXIS -bbc-bitstik2;P1 Y Axis;analog;1;:analogue:bitstik2:CHANNEL1;P1_AD_STICK_Y;JOYSTICK_DOWN;JOYSTICK_UP;JOYSTICK_UP;JOYSTICK_UP;False;255;0;10;YAXIS -bbc-bitstik2;P1 Z Axis;analog;1;:analogue:bitstik2:CHANNEL2;P1_AD_STICK_Z;BUTTON5;BUTTON6;BUTTON5;BUTTON6;False;255;0;10;ZAXIS -xegs;Down;special;1;:djoy_0_1;P1_JOYSTICK_DOWN;JOYSTICK_DOWN;JOYSTICK_UP;False;2;2 -xegs;Left;special;1;:djoy_0_1;P1_JOYSTICK_LEFT;JOYSTICK_LEFT;JOYSTICK_LEFT;False;4;4 -xegs;Up;special;1;:djoy_0_1;P1_JOYSTICK_UP;JOYSTICK_UP;JOYSTICK_UP;False;1;1 -xegs;Right;special;1;:djoy_0_1;P1_JOYSTICK_RIGHT;JOYSTICK_RIGHT;JOYSTICK_LEFT;False;8;8 -xegs;P1 Button 1;special;1;:djoy_b;P1_BUTTON1;BUTTON1;BUTTON1;False;1;1 -xegs;P1 Button 2;special;1;:djoy_b;P1_BUTTON2;BUTTON2;BUTTON2;False;16;16 -xegs;Down;special;2;:djoy_0_1;P2_JOYSTICK_DOWN;JOYSTICK_DOWN;JOYSTICK_UP;False;32;32 -xegs;Left;special;2;:djoy_0_1;P2_JOYSTICK_LEFT;JOYSTICK_LEFT;JOYSTICK_LEFT;False;64;64 -xegs;Up;special;2;:djoy_0_1;P2_JOYSTICK_UP;JOYSTICK_UP;JOYSTICK_UP;False;16;16 -xegs;Right;special;2;:djoy_0_1;P2_JOYSTICK_RIGHT;JOYSTICK_RIGHT;JOYSTICK_LEFT;False;128;128 -xegs;P2 Button 1;special;2;:djoy_b;P2_BUTTON1;BUTTON1;BUTTON1;False;2;2 -xegs;P2 Button 2;special;2;:djoy_b;P2_BUTTON2;BUTTON2;BUTTON2;False;32;32 -socrates;Down;combo;1;:IN5;KEYBOARD;2PAD;JOYSTICK_DOWN;JOYSTICK_UP;False;8;0 -socrates;Left;combo;1;:IN5;KEYBOARD;4PAD;JOYSTICK_LEFT;JOYSTICK_LEFT;False;4;0 -socrates;Up;combo;1;:IN5;KEYBOARD;8PAD;JOYSTICK_UP;JOYSTICK_UP;False;2;0 -socrates;Right;combo;1;:IN5;KEYBOARD;6PAD;JOYSTICK_RIGHT;JOYSTICK_LEFT;False;1;0 -socrates;P1 Button;combo;1;:IN5;KEYBOARD;ENTERPAD;BUTTON1;BUTTON1;False;256;0 -socrates;Down;combo;2;:IN5;KEYBOARD;DOWN;JOYSTICK_DOWN;JOYSTICK_UP;False;16;0 -socrates;Left;combo;2;:IN5;KEYBOARD;LEFT;JOYSTICK_LEFT;JOYSTICK_LEFT;False;32;0 -socrates;Up;combo;2;:IN5;KEYBOARD;UP;JOYSTICK_UP;JOYSTICK_UP;False;64;0 -socrates;Right;combo;2;:IN5;KEYBOARD;RIGHT;JOYSTICK_RIGHT;JOYSTICK_LEFT;False;128;0 -socrates;P2 Button;combo;2;:IN5;KEYBOARD;RALT;BUTTON1;BUTTON1;False;512;0 -vgmplay;Stop;special;1;:CONTROLS;P1_BUTTON1;BUTTON3;BUTTON3;False;1;0 -vgmplay;Pause;special;1;:CONTROLS;P1_BUTTON2;START;START;False;2;0 -vgmplay;Play;special;1;:CONTROLS;P1_BUTTON3;BUTTON1;BUTTON1;False;4;0 -vgmplay;Restart;special;1;:CONTROLS;P1_BUTTON4;BUTTON5;BUTTON5;False;8;0 -vgmplay;Loop;special;1;:CONTROLS;P1_BUTTON5;BUTTON6;BUTTON6;False;16;0 -vgmplay;Change Visualization Mode;special;1;:CONTROLS;P1_BUTTON6;BUTTON8;BUTTON8;False;32;0 -vgmplay;Rate Down;special;1;:CONTROLS;P1_BUTTON7;JOYSTICK_DOWN;JOYSTICK_UP;False;64;0 -vgmplay;Rate Up;special;1;:CONTROLS;P1_BUTTON8;JOYSTICK_UP;JOYSTICK_UP;False;128;0 -vgmplay;Rate Reset;special;1;:CONTROLS;P1_BUTTON9;BUTTON2;BUTTON2;False;256;0 -vgmplay;Rate Hold;special;1;:CONTROLS;P1_BUTTON10;BUTTON4;BUTTON4;False;512;0 -vgmplay;MAME Menu;main;1;standard;UI_CONFIGURE;COIN;COIN;False;0;0 -fmtmarty;Run;special;1;:joy1_ex;P1_START;BUTTON4;BUTTON4;False;1;0 -pdp1;Control Panel Switch;combo;1;:CSW;KEYBOARD;LCONTROL;START;START;False;1;0 -pdp1;Load Punchtape;combo;1;:CSW;KEYBOARD;ENTER;START;START;False;256;0 -pdp1;P1 Spin Left;special;1;:SPACEWAR;P1_JOYSTICK_LEFT;JOYSTICK_LEFT;JOYSTICK_LEFT;False;1;0 -pdp1;P1 Spin Right;special;1;:SPACEWAR;P1_JOYSTICK_RIGHT;JOYSTICK_RIGHT;JOYSTICK_LEFT;False;2;0 -pdp1;P1 Thrust;special;1;:SPACEWAR;P1_BUTTON1;BUTTON1;BUTTON1;False;4;0 -pdp1;P1 Fire;special;1;:SPACEWAR;P1_BUTTON2;BUTTON3;BUTTON3;False;8;0 -pdp1;P1 Hyperspace;special;1;:SPACEWAR;P1_BUTTON3;BUTTON2;BUTTON2;False;256;0 -pdp1;P2 Spin Left;special;2;:SPACEWAR;P2_JOYSTICK_LEFT;JOYSTICK_LEFT;JOYSTICK_LEFT;False;16;0 -pdp1;P2 Spin Right;special;2;:SPACEWAR;P2_JOYSTICK_RIGHT;JOYSTICK_RIGHT;JOYSTICK_LEFT;False;32;0 -pdp1;P2 Thrust;special;2;:SPACEWAR;P2_BUTTON1;BUTTON1;BUTTON1;False;64;0 -pdp1;P2 Fire;special;2;:SPACEWAR;P2_BUTTON2;BUTTON3;BUTTON3;False;128;0 -pdp1;P2 Hyperspace;special;2;:SPACEWAR;P2_BUTTON3;BUTTON2;BUTTON2;False;512;0 -vc4000;1;special;1;:KEYPAD1_1;KEYPAD;BUTTON3;BUTTON3;False;128;0 -vc4000;2/Button;special;1;:KEYPAD1_2;KEYPAD;BUTTON1;BUTTON1;False;128;0 -vc4000;3;special;1;:KEYPAD1_3;KEYPAD;BUTTON4;BUTTON4;False;128;0 -vc4000;4;special;1;:KEYPAD1_1;KEYPAD;BUTTON2;BUTTON2;False;64;0 -vc4000;5;special;1;:KEYPAD1_2;KEYPAD;BUTTON6;BUTTON6;False;64;0 -vc4000;6;special;1;:KEYPAD1_3;KEYPAD;BUTTON5;BUTTON5;False;64;0 -vc4000;7;special;1;:KEYPAD1_1;KEYPAD;BUTTON8;BUTTON8;False;32;0 -vc4000;8;special;1;:KEYPAD1_2;KEYPAD;BUTTON7;BUTTON7;False;32;0 -vc4000;Enter;special;1;:KEYPAD1_1;KEYPAD;BUTTON10;BUTTON10;False;16;0 -vc4000;Clear;special;1;:KEYPAD1_3;KEYPAD;BUTTON9;BUTTON9;False;16;0 -vc4000;Game Select;special;1;:PANEL;P1_SELECT;COIN;COIN;False;128;0 -vc4000;Start;special;1;:PANEL;P1_START;START;START;False;64;0 -vc4000;1;special;2;:KEYPAD2_1;KEYPAD;BUTTON3;BUTTON3;False;128;0 -vc4000;2/Button;special;2;:KEYPAD2_2;KEYPAD;BUTTON1;BUTTON1;False;128;0 -vc4000;3;special;2;:KEYPAD2_3;KEYPAD;BUTTON4;BUTTON4;False;128;0 -vc4000;4;special;2;:KEYPAD2_1;KEYPAD;BUTTON2;BUTTON2;False;64;0 -vc4000;5;special;2;:KEYPAD2_2;KEYPAD;BUTTON6;BUTTON6;False;64;0 -vc4000;6;special;2;:KEYPAD2_3;KEYPAD;BUTTON5;BUTTON5;False;64;0 -vc4000;7;special;2;:KEYPAD2_1;KEYPAD;BUTTON8;BUTTON8;False;32;0 -vc4000;8;special;2;:KEYPAD2_2;KEYPAD;BUTTON7;BUTTON7;False;32;0 -vc4000;Enter;special;2;:KEYPAD2_1;KEYPAD;BUTTON10;BUTTON10;False;16;0 -vc4000;Clear;special;2;:KEYPAD2_3;KEYPAD;BUTTON9;BUTTON9;False;16;0 -gp32;A;special;1;:IN0;P1_BUTTON1;BUTTON2;BUTTON2;False;16384;16384 -gp32;B;special;1;:IN0;P1_BUTTON2;BUTTON1;BUTTON1;False;8192;8192 -gp32;L;special;1;:IN0;P1_BUTTON3;BUTTON5;BUTTON5;False;4096;4096 -gp32;R;special;1;:IN0;P1_BUTTON4;BUTTON6;BUTTON6;False;32768;32768 -gp32;Select;special;1;:IN1;P1_SELECT;COIN;COIN;False;128;128 -gp32;Start;special;1;:IN1;P1_START;START;START;False;64;64 -apple2-joy;P1 X Axis;analog;1;:gameio:joy:joystick_1_x;P1_AD_STICK_X;JOYSTICK_RIGHT;JOYSTICK_LEFT;JOYSTICK_LEFT;JOYSTICK_LEFT;False;255;128;10;XAXIS -apple2-joy;P1 Y Axis;analog;1;:gameio:joy:joystick_1_y;P1_AD_STICK_Y;JOYSTICK_DOWN;JOYSTICK_UP;JOYSTICK_UP;JOYSTICK_UP;False;255;128;10;YAXIS -apple2-joy;P2 X Axis;analog;2;:gameio:joy:joystick_2_x;P2_AD_STICK_X;JOYSTICK_RIGHT;JOYSTICK_LEFT;JOYSTICK_LEFT;JOYSTICK_LEFT;False;255;128;10;XAXIS -apple2-joy;P2 Y Axis;analog;2;:gameio:joy:joystick_2_y;P2_AD_STICK_Y;JOYSTICK_DOWN;JOYSTICK_UP;JOYSTICK_UP;JOYSTICK_UP;False;255;128;10;YAXIS \ No newline at end of file diff --git a/package/batocera/core/batocera-configgen/data/mame/messControls.toml b/package/batocera/core/batocera-configgen/data/mame/messControls.toml new file mode 100644 index 00000000000..b658bad7696 --- /dev/null +++ b/package/batocera/core/batocera-configgen/data/mame/messControls.toml @@ -0,0 +1,255 @@ +[cdimono1] +"Button 1" = {type = "special", player = 1, tag = ":slave_hle:MOUSEBTN", mask = 1, default = 0, key = "P1_BUTTON1", mapping = "BUTTON1"} +"Button 2" = {type = "special", player = 1, tag = ":slave_hle:MOUSEBTN", mask = 2, default = 0, key = "P1_BUTTON2", mapping = "BUTTON2"} +"Button 3" = {type = "special", player = 1, tag = ":slave_hle:MOUSEBTN", mask = 4, default = 0, key = "P1_BUTTON3", mapping = "BUTTON3"} +"X Axis" = {type = "analog", player = 1, tag = ":slave_hle:MOUSEX", mask = 65535, default = 0, key = "P1_MOUSE_X", delta = 10, axis = "XAXIS", incMapping = "JOYSTICK_RIGHT", incUseMapping = "JOYSTICK_LEFT", decMapping = "JOYSTICK_LEFT"} +"Y Axis" = {type = "analog", player = 1, tag = ":slave_hle:MOUSEY", mask = 65535, default = 0, key = "P1_MOUSE_Y", delta = 10, axis = "YAXIS", incMapping = "JOYSTICK_DOWN", incUseMapping = "JOYSTICK_UP", decMapping = "JOYSTICK_UP"} + +[apfm1000] +# The following Player 1 entries were overwritten by duplicate Player 2 keys in the original CSV parsing code +# Clear = {type = "special", player = 1, tag = ":joy.2", mask = 32, default = 32, key = "OTHER", mapping = "BUTTON3"} +# "Enter/Fire" = {type = "special", player = 1, tag = ":joy.3", mask = 32, default = 32, key = "OTHER", mapping = "BUTTON1"} +# 1 = {type = "special", player = 1, tag = ":joy.0", mask = 16, default = 16, key = "OTHER", mapping = "BUTTON4"} +# 2 = {type = "special", player = 1, tag = ":joy.3", mask = 16, default = 16, key = "OTHER", mapping = "BUTTON2"} +# 3 = {type = "special", player = 1, tag = ":joy.2", mask = 16, default = 16, key = "OTHER", mapping = "BUTTON6"} +# 4 = {type = "special", player = 1, tag = ":joy.0", mask = 64, default = 64, key = "OTHER", mapping = "BUTTON5"} +# 5 = {type = "special", player = 1, tag = ":joy.3", mask = 64, default = 64, key = "OTHER", mapping = "BUTTON8"} +# 6 = {type = "special", player = 1, tag = ":joy.2", mask = 64, default = 64, key = "OTHER", mapping = "BUTTON7"} +# 7 = {type = "special", player = 1, tag = ":joy.0", mask = 128, default = 128, key = "OTHER", mapping = "BUTTON10"} +# 8 = {type = "special", player = 1, tag = ":joy.3", mask = 128, default = 128, key = "OTHER", mapping = "BUTTON9"} +# 9 = {type = "special", player = 1, tag = ":joy.2", mask = 128, default = 128, key = "OTHER", mapping = "COIN"} +# 0 = {type = "special", player = 1, tag = ":joy.0", mask = 32, default = 32, key = "OTHER", mapping = "START"} +Clear = {type = "special", player = 2, tag = ":joy.2", mask = 2, default = 2, key = "TYPE_OTHER(243,1)", mapping = "BUTTON3"} +"Enter/Fire" = {type = "special", player = 2, tag = ":joy.3", mask = 2, default = 2, key = "TYPE_OTHER(243,1)", mapping = "BUTTON1"} +1 = {type = "special", player = 2, tag = ":joy.0", mask = 1, default = 1, key = "TYPE_OTHER(243,1)", mapping = "BUTTON4"} +2 = {type = "special", player = 2, tag = ":joy.3", mask = 1, default = 1, key = "TYPE_OTHER(243,1)", mapping = "BUTTON2"} +3 = {type = "special", player = 2, tag = ":joy.2", mask = 1, default = 1, key = "TYPE_OTHER(243,1)", mapping = "BUTTON6"} +4 = {type = "special", player = 2, tag = ":joy.0", mask = 4, default = 4, key = "TYPE_OTHER(243,1)", mapping = "BUTTON5"} +5 = {type = "special", player = 2, tag = ":joy.3", mask = 4, default = 4, key = "TYPE_OTHER(243,1)", mapping = "BUTTON8"} +6 = {type = "special", player = 2, tag = ":joy.2", mask = 4, default = 4, key = "TYPE_OTHER(243,1)", mapping = "BUTTON7"} +7 = {type = "special", player = 2, tag = ":joy.0", mask = 8, default = 8, key = "TYPE_OTHER(243,1)", mapping = "BUTTON10"} +8 = {type = "special", player = 2, tag = ":joy.3", mask = 8, default = 8, key = "TYPE_OTHER(243,1)", mapping = "BUTTON9"} +9 = {type = "special", player = 2, tag = ":joy.2", mask = 8, default = 8, key = "TYPE_OTHER(243,1)", mapping = "COIN"} +0 = {type = "special", player = 2, tag = ":joy.0", mask = 2, default = 2, key = "TYPE_OTHER(243,1)", mapping = "START"} + +[astrocde] +0 = {type = "special", player = 1, tag = ":KEYPAD2", mask = 32, default = 0, key = "KEYPAD", mapping = "BUTTON1"} +1 = {type = "special", player = 1, tag = ":KEYPAD3", mask = 16, default = 0, key = "KEYPAD", mapping = "BUTTON4"} +2 = {type = "special", player = 1, tag = ":KEYPAD2", mask = 16, default = 0, key = "KEYPAD", mapping = "BUTTON2"} +3 = {type = "special", player = 1, tag = ":KEYPAD1", mask = 16, default = 0, key = "KEYPAD", mapping = "BUTTON6"} +4 = {type = "special", player = 1, tag = ":KEYPAD3", mask = 8, default = 0, key = "KEYPAD", mapping = "BUTTON5"} +5 = {type = "special", player = 1, tag = ":KEYPAD2", mask = 8, default = 0, key = "KEYPAD", mapping = "BUTTON8"} +6 = {type = "special", player = 1, tag = ":KEYPAD1", mask = 8, default = 0, key = "KEYPAD", mapping = "BUTTON7"} +7 = {type = "special", player = 1, tag = ":KEYPAD3", mask = 4, default = 0, key = "KEYPAD", mapping = "BUTTON10"} +8 = {type = "special", player = 1, tag = ":KEYPAD2", mask = 4, default = 0, key = "KEYPAD", mapping = "BUTTON9"} +9 = {type = "special", player = 1, tag = ":KEYPAD1", mask = 4, default = 0, key = "KEYPAD", mapping = "COIN"} +"= (Start)" = {type = "special", player = 1, tag = ":KEYPAD0", mask = 32, default = 0, key = "KEYPAD", mapping = "START"} + +[adam] +1 = {type = "special", player = 1, tag = ":joy1:hand:KEYPAD", mask = 2, default = 2, key = "KEYPAD", mapping = "BUTTON4"} +2 = {type = "special", player = 1, tag = ":joy1:hand:KEYPAD", mask = 4, default = 4, key = "KEYPAD", mapping = "BUTTON2"} +3 = {type = "special", player = 1, tag = ":joy1:hand:KEYPAD", mask = 8, default = 8, key = "KEYPAD", mapping = "BUTTON6"} +4 = {type = "special", player = 1, tag = ":joy1:hand:KEYPAD", mask = 16, default = 16, key = "KEYPAD", mapping = "BUTTON5"} +5 = {type = "special", player = 1, tag = ":joy1:hand:KEYPAD", mask = 32, default = 32, key = "KEYPAD", mapping = "BUTTON8"} +6 = {type = "special", player = 1, tag = ":joy1:hand:KEYPAD", mask = 64, default = 64, key = "KEYPAD", mapping = "BUTTON7"} +7 = {type = "special", player = 1, tag = ":joy1:hand:KEYPAD", mask = 128, default = 128, key = "KEYPAD", mapping = "BUTTON10"} +8 = {type = "special", player = 1, tag = ":joy1:hand:KEYPAD", mask = 512, default = 512, key = "KEYPAD", mapping = "BUTTON9"} +"#" = {type = "special", player = 1, tag = ":joy1:hand:KEYPAD", mask = 1024, default = 0, key = "KEYPAD", mapping = "START"} +"*" = {type = "special", player = 1, tag = ":joy1:hand:KEYPAD", mask = 2048, default = 0, key = "KEYPAD", mapping = "COIN"} + +[arcadia] +# The following Player 1 entries were overwritten by duplicate Player 2 keys in the original CSV parsing code +# 1 = {type = "special", player = 1, tag = ":controller1_col1", mask = 8, default = 0, key = "KEYPAD", mapping = "BUTTON3"} +# 2 = {type = "special", player = 1, tag = ":controller1_col2", mask = 8, default = 0, key = "KEYPAD", mapping = "BUTTON1"} +# 3 = {type = "special", player = 1, tag = ":controller1_col3", mask = 8, default = 0, key = "KEYPAD", mapping = "BUTTON4"} +# 4 = {type = "special", player = 1, tag = ":controller1_col1", mask = 4, default = 0, key = "KEYPAD", mapping = "BUTTON2"} +# 5 = {type = "special", player = 1, tag = ":controller1_col2", mask = 4, default = 0, key = "KEYPAD", mapping = "BUTTON6"} +# 6 = {type = "special", player = 1, tag = ":controller1_col3", mask = 4, default = 0, key = "KEYPAD", mapping = "BUTTON5"} +# 7 = {type = "special", player = 1, tag = ":controller1_col1", mask = 2, default = 0, key = "KEYPAD", mapping = "BUTTON8"} +# 8 = {type = "special", player = 1, tag = ":controller1_col2", mask = 2, default = 0, key = "KEYPAD", mapping = "BUTTON7"} +# 9 = {type = "special", player = 1, tag = ":controller1_col3", mask = 2, default = 0, key = "KEYPAD", mapping = "BUTTON10"} +# 0 = {type = "special", player = 1, tag = ":controller1_col2", mask = 1, default = 0, key = "KEYPAD", mapping = "BUTTON9"} +1 = {type = "special", player = 2, tag = ":controller2_col1", mask = 8, default = 0, key = "KEYPAD", mapping = "BUTTON3"} +2 = {type = "special", player = 2, tag = ":controller2_col2", mask = 8, default = 0, key = "KEYPAD", mapping = "BUTTON1"} +3 = {type = "special", player = 2, tag = ":controller2_col3", mask = 8, default = 0, key = "KEYPAD", mapping = "BUTTON4"} +4 = {type = "special", player = 2, tag = ":controller2_col1", mask = 4, default = 0, key = "KEYPAD", mapping = "BUTTON2"} +5 = {type = "special", player = 2, tag = ":controller2_col2", mask = 4, default = 0, key = "KEYPAD", mapping = "BUTTON6"} +6 = {type = "special", player = 2, tag = ":controller2_col3", mask = 4, default = 0, key = "KEYPAD", mapping = "BUTTON5"} +7 = {type = "special", player = 2, tag = ":controller2_col1", mask = 2, default = 0, key = "KEYPAD", mapping = "BUTTON8"} +8 = {type = "special", player = 2, tag = ":controller2_col2", mask = 2, default = 0, key = "KEYPAD", mapping = "BUTTON7"} +9 = {type = "special", player = 2, tag = ":controller2_col3", mask = 2, default = 0, key = "KEYPAD", mapping = "BUTTON10"} +0 = {type = "special", player = 2, tag = ":controller2_col3", mask = 1, default = 0, key = "KEYPAD", mapping = "BUTTON9"} + +[gamecom] +A = {type = "special", player = 1, tag = ":IN0", mask = 128, default = 128, key = "P1_BUTTON1", mapping = "BUTTON2"} +B = {type = "special", player = 1, tag = ":IN1", mask = 1, default = 1, key = "P1_BUTTON2", mapping = "BUTTON4"} +C = {type = "special", player = 1, tag = ":IN1", mask = 2, default = 2, key = "P1_BUTTON3", mapping = "BUTTON1"} +D = {type = "special", player = 1, tag = ":IN2", mask = 2, default = 2, key = "P1_BUTTON4", mapping = "BUTTON3"} +Menu = {type = "special", player = 1, tag = ":IN0", mask = 16, default = 16, key = "OTHER", mapping = "COIN"} +Pause = {type = "special", player = 1, tag = ":IN0", mask = 32, default = 32, key = "OTHER", mapping = "START"} + +[tutor] +# The following Player 1 entries were overwritten by duplicate Player 2 keys in the original CSV parsing code +# Down = {type = "special", player = 1, tag = ":LINE4_alt", mask = 16, default = 0, key = "P1_JOYSTICK_DOWN", mapping = "JOYSTICK_DOWN", useMapping = "JOYSTICK_UP"} +# Left = {type = "special", player = 1, tag = ":LINE4_alt", mask = 32, default = 0, key = "P1_JOYSTICK_LEFT", mapping = "JOYSTICK_LEFT"} +# Up = {type = "special", player = 1, tag = ":LINE4_alt", mask = 64, default = 0, key = "P1_JOYSTICK_UP", mapping = "JOYSTICK_UP"} +# Right = {type = "special", player = 1, tag = ":LINE4_alt", mask = 128, default = 0, key = "P1_JOYSTICK_RIGHT", mapping = "JOYSTICK_RIGHT", useMapping = "JOYSTICK_LEFT"} +Down = {type = "special", player = 2, tag = ":LINE2_alt", mask = 16, default = 0, key = "P2_JOYSTICK_DOWN", mapping = "JOYSTICK_DOWN", useMapping = "JOYSTICK_UP"} +Left = {type = "special", player = 2, tag = ":LINE2_alt", mask = 32, default = 0, key = "P2_JOYSTICK_LEFT", mapping = "JOYSTICK_LEFT"} +Up = {type = "special", player = 2, tag = ":LINE2_alt", mask = 64, default = 0, key = "P2_JOYSTICK_UP", mapping = "JOYSTICK_UP"} +Right = {type = "special", player = 2, tag = ":LINE2_alt", mask = 128, default = 0, key = "P2_JOYSTICK_RIGHT", mapping = "JOYSTICK_RIGHT", useMapping = "JOYSTICK_LEFT"} +"Enter Key" = {type = "combo", player = 1, tag = ":LINE6", mask = 16, default = 0, key = "KEYBOARD", kbMapping = "ENTER", mapping = "BUTTON3"} +"Down Arrow" = {type = "combo", player = 1, tag = ":LINE7", mask = 4, default = 0, key = "KEYBOARD", kbMapping = "DOWN", mapping = "BUTTON6"} + +[crvision] +"P1 Button 1 (Shift)" = {type = "special", player = 1, tag = ":PA1.7", mask = 128, default = 128, key = "P1_BUTTON1", mapping = "BUTTON2"} +"P1 Button 2 (Control)" = {type = "special", player = 1, tag = ":PA0.7", mask = 128, default = 128, key = "P1_BUTTON2", mapping = "BUTTON4"} +"P1 Upper Right (1)" = {type = "special", player = 1, tag = ":PA0.2", mask = 8, default = 8, key = "KEYBOARD", mapping = "BUTTON6"} +"P1 Lower Left (B)" = {type = "special", player = 1, tag = ":PA1.1", mask = 4, default = 4, key = "KEYBOARD", mapping = "BUTTON1"} +"P1 Lower Right (6)" = {type = "special", player = 1, tag = ":PA1.4", mask = 64, default = 64, key = "KEYBOARD", mapping = "BUTTON3"} +"Reset/Start" = {type = "special", player = 1, tag = ":NMI", mask = 1, default = 0, key = "P1_START", mapping = "START"} +"P2 Button 1 (-/=)" = {type = "special", player = 2, tag = ":PA3.7", mask = 128, default = 128, key = "P2_BUTTON1", mapping = "BUTTON2"} +"P2 Button 2 (Right)" = {type = "special", player = 2, tag = ":PA2.7", mask = 128, default = 128, key = "P2_BUTTON2", mapping = "BUTTON4"} +"P2 Upper Right (Space)" = {type = "special", player = 2, tag = ":PA2.2", mask = 8, default = 8, key = "KEYBOARD", mapping = "BUTTON6"} +"P2 Lower Left (7)" = {type = "special", player = 2, tag = ":PA3.1", mask = 4, default = 4, key = "KEYBOARD", mapping = "BUTTON1"} +"P2 Lower Right (N)" = {type = "special", player = 2, tag = ":PA3.1", mask = 64, default = 64, key = "KEYBOARD", mapping = "BUTTON3"} + +[bbc] +"*" = {type = "combo", player = 1, tag = ":COL8", mask = 64, default = 64, key = "KEYBOARD", kbMapping = "QUOTE", mapping = "BUTTON2"} +"?" = {type = "combo", player = 1, tag = ":COL8", mask = 16, default = 16, key = "KEYBOARD", kbMapping = "SLASH", mapping = "BUTTON4"} +Z = {type = "combo", player = 1, tag = ":COL1", mask = 64, default = 64, key = "KEYBOARD", kbMapping = "Z", mapping = "BUTTON1"} +X = {type = "combo", player = 1, tag = ":COL2", mask = 16, default = 16, key = "KEYBOARD", kbMapping = "X", mapping = "BUTTON3"} +Enter = {type = "combo", player = 1, tag = ":COL9", mask = 16, default = 16, key = "KEYBOARD", kbMapping = "ENTER", mapping = "BUTTON6"} +Down = {type = "combo", player = 1, tag = ":COL9", mask = 4, default = 4, key = "KEYBOARD", kbMapping = "DOWN", mapping = "JOYSTICK_DOWN", useMapping = "JOYSTICK_UP"} +Left = {type = "combo", player = 1, tag = ":COL9", mask = 2, default = 2, key = "KEYBOARD", kbMapping = "LEFT", mapping = "JOYSTICK_LEFT"} +Up = {type = "combo", player = 1, tag = ":COL9", mask = 8, default = 8, key = "KEYBOARD", kbMapping = "UP", mapping = "JOYSTICK_UP"} +Right = {type = "combo", player = 1, tag = ":COL9", mask = 128, default = 128, key = "KEYBOARD", kbMapping = "RIGHT", mapping = "JOYSTICK_RIGHT", useMapping = "JOYSTICK_LEFT"} + +[bbc-acornjoy] +"P1 Button" = {type = "special", player = 1, tag = ":analogue:acornjoy:BUTTONS", mask = 16, default = 16, key = "P1_BUTTON1", mapping = "BUTTON1"} +"P1 X Axis" = {type = "analog", player = 1, tag = ":analogue:acornjoy:JOY0", mask = 255, default = 128, key = "P1_AD_STICK_X", delta = 10, axis = "XAXIS", incMapping = "JOYSTICK_RIGHT", incUseMapping = "JOYSTICK_LEFT", decMapping = "JOYSTICK_LEFT"} +"P1 Y Axis" = {type = "analog", player = 1, tag = ":analogue:acornjoy:JOY1", mask = 255, default = 128, key = "P1_AD_STICK_Y", delta = 10, axis = "YAXIS", incMapping = "JOYSTICK_DOWN", incUseMapping = "JOYSTICK_UP", decMapping = "JOYSTICK_UP"} +"P2 Button" = {type = "special", player = 2, tag = ":analogue:acornjoy:BUTTONS", mask = 32, default = 32, key = "P2_BUTTON1", mapping = "BUTTON1"} +"P2 X Axis" = {type = "analog", player = 2, tag = ":analogue:acornjoy:JOY2", mask = 255, default = 128, key = "P2_AD_STICK_X", delta = 10, axis = "XAXIS", incMapping = "JOYSTICK_RIGHT", incUseMapping = "JOYSTICK_LEFT", decMapping = "JOYSTICK_LEFT"} +"P2 Y Axis" = {type = "analog", player = 2, tag = ":analogueacornjoy:JOY3", mask = 255, default = 128, key = "P2_AD_STICK_Y", delta = 10, axis = "YAXIS", incMapping = "JOYSTICK_DOWN", incUseMapping = "JOYSTICK_UP", decMapping = "JOYSTICK_UP"} + +[bbc-voltmace3b] +"P1 Button" = {type = "special", player = 1, tag = ":analogue:voltmace3b:BUTTONS", mask = 16, default = 16, key = "P1_BUTTON1", mapping = "BUTTON1"} +"P1 X Axis" = {type = "analog", player = 1, tag = ":analogue:voltmace3b:JOY0", mask = 255, default = 128, key = "P1_AD_STICK_X", delta = 10, axis = "XAXIS", incMapping = "JOYSTICK_RIGHT", incUseMapping = "JOYSTICK_LEFT", decMapping = "JOYSTICK_LEFT"} +"P1 Y Axis" = {type = "analog", player = 1, tag = ":analogue:voltmace3b:JOY1", mask = 255, default = 128, key = "P1_AD_STICK_Y", delta = 10, axis = "YAXIS", incMapping = "JOYSTICK_DOWN", incUseMapping = "JOYSTICK_UP", decMapping = "JOYSTICK_UP"} +"P2 Button" = {type = "special", player = 2, tag = ":analogue:voltmace3b:BUTTONS", mask = 32, default = 32, key = "P2_BUTTON1", mapping = "BUTTON1"} +"P2 X Axis" = {type = "analog", player = 2, tag = ":analogue:voltmace3b:JOY2", mask = 255, default = 128, key = "P2_AD_STICK_X", delta = 10, axis = "XAXIS", incMapping = "JOYSTICK_RIGHT", incUseMapping = "JOYSTICK_LEFT", decMapping = "JOYSTICK_LEFT"} +"P2 Y Axis" = {type = "analog", player = 2, tag = ":voltmace3b:JOY3", mask = 255, default = 128, key = "P2_AD_STICK_Y", delta = 10, axis = "YAXIS", incMapping = "JOYSTICK_DOWN", incUseMapping = "JOYSTICK_UP", decMapping = "JOYSTICK_UP"} + +[bbc-bitstik1] +"P1 Button 1" = {type = "special", player = 1, tag = ":analogue:bitstik1:BUTTONS", mask = 16, default = 16, key = "P1_BUTTON1", mapping = "BUTTON1"} +"P1 Button 2" = {type = "special", player = 1, tag = ":analogue:bitstik1:BUTTONS", mask = 32, default = 32, key = "P1_BUTTON2", mapping = "BUTTON2"} +"P1 Button 3" = {type = "special", player = 1, tag = ":analogue:bitstik1:BUTTONS", mask = 255, default = 255, key = "P1_BUTTON3", mapping = "BUTTON3"} +"P1 X Axis" = {type = "analog", player = 1, tag = ":analogue:bitstik1:CHANNEL0", mask = 255, default = 0, key = "P1_AD_STICK_X", delta = 10, axis = "XAXIS", incMapping = "JOYSTICK_RIGHT", incUseMapping = "JOYSTICK_LEFT", decMapping = "JOYSTICK_LEFT"} +"P1 Y Axis" = {type = "analog", player = 1, tag = ":analogue:bitstik1:CHANNEL1", mask = 255, default = 0, key = "P1_AD_STICK_Y", delta = 10, axis = "YAXIS", incMapping = "JOYSTICK_DOWN", incUseMapping = "JOYSTICK_UP", decMapping = "JOYSTICK_UP"} +"P1 Z Axis" = {type = "analog", player = 1, tag = ":analogue:bitstik1:CHANNEL2", mask = 255, default = 0, key = "P1_AD_STICK_Z", delta = 10, axis = "ZAXIS", incMapping = "BUTTON5", decMapping = "BUTTON6"} + +[bbc-bitstik2] +"P1 Button 1" = {type = "special", player = 1, tag = ":analogue:bitstik2:BUTTONS", mask = 16, default = 16, key = "P1_BUTTON1", mapping = "BUTTON1"} +"P1 Button 2" = {type = "special", player = 1, tag = ":analogue:bitstik2:BUTTONS", mask = 32, default = 32, key = "P1_BUTTON2", mapping = "BUTTON2"} +"P1 Button 3" = {type = "special", player = 1, tag = ":analogue:bitstik2:BUTTONS", mask = 255, default = 255, key = "P1_BUTTON3", mapping = "BUTTON3"} +"P1 X Axis" = {type = "analog", player = 1, tag = ":analogue:bitstik2:CHANNEL0", mask = 255, default = 0, key = "P1_AD_STICK_X", delta = 10, axis = "XAXIS", incMapping = "JOYSTICK_RIGHT", incUseMapping = "JOYSTICK_LEFT", decMapping = "JOYSTICK_LEFT"} +"P1 Y Axis" = {type = "analog", player = 1, tag = ":analogue:bitstik2:CHANNEL1", mask = 255, default = 0, key = "P1_AD_STICK_Y", delta = 10, axis = "YAXIS", incMapping = "JOYSTICK_DOWN", incUseMapping = "JOYSTICK_UP", decMapping = "JOYSTICK_UP"} +"P1 Z Axis" = {type = "analog", player = 1, tag = ":analogue:bitstik2:CHANNEL2", mask = 255, default = 0, key = "P1_AD_STICK_Z", delta = 10, axis = "ZAXIS", incMapping = "BUTTON5", decMapping = "BUTTON6"} + +[xegs] +# The following Player 1 entries were overwritten by duplicate Player 2 keys in the original CSV parsing code +# Down = {type = "special", player = 1, tag = ":djoy_0_1", mask = 2, default = 2, key = "P1_JOYSTICK_DOWN", mapping = "JOYSTICK_DOWN", useMapping = "JOYSTICK_UP"} +# Left = {type = "special", player = 1, tag = ":djoy_0_1", mask = 4, default = 4, key = "P1_JOYSTICK_LEFT", mapping = "JOYSTICK_LEFT"} +# Up = {type = "special", player = 1, tag = ":djoy_0_1", mask = 1, default = 1, key = "P1_JOYSTICK_UP", mapping = "JOYSTICK_UP"} +# Right = {type = "special", player = 1, tag = ":djoy_0_1", mask = 8, default = 8, key = "P1_JOYSTICK_RIGHT", mapping = "JOYSTICK_RIGHT", useMapping = "JOYSTICK_LEFT"} +Down = {type = "special", player = 2, tag = ":djoy_0_1", mask = 32, default = 32, key = "P2_JOYSTICK_DOWN", mapping = "JOYSTICK_DOWN", useMapping = "JOYSTICK_UP"} +Left = {type = "special", player = 2, tag = ":djoy_0_1", mask = 64, default = 64, key = "P2_JOYSTICK_LEFT", mapping = "JOYSTICK_LEFT"} +Up = {type = "special", player = 2, tag = ":djoy_0_1", mask = 16, default = 16, key = "P2_JOYSTICK_UP", mapping = "JOYSTICK_UP"} +Right = {type = "special", player = 2, tag = ":djoy_0_1", mask = 128, default = 128, key = "P2_JOYSTICK_RIGHT", mapping = "JOYSTICK_RIGHT", useMapping = "JOYSTICK_LEFT"} +"P1 Button 1" = {type = "special", player = 1, tag = ":djoy_b", mask = 1, default = 1, key = "P1_BUTTON1", mapping = "BUTTON1"} +"P1 Button 2" = {type = "special", player = 1, tag = ":djoy_b", mask = 16, default = 16, key = "P1_BUTTON2", mapping = "BUTTON2"} +"P2 Button 1" = {type = "special", player = 2, tag = ":djoy_b", mask = 2, default = 2, key = "P2_BUTTON1", mapping = "BUTTON1"} +"P2 Button 2" = {type = "special", player = 2, tag = ":djoy_b", mask = 32, default = 32, key = "P2_BUTTON2", mapping = "BUTTON2"} + +[socrates] +# The following Player 1 entries were overwritten by duplicate Player 2 keys in the original CSV parsing code +# Down = {type = "combo", player = 1, tag = ":IN5", mask = 8, default = 0, key = "KEYBOARD", kbMapping = "2PAD", mapping = "JOYSTICK_DOWN", useMapping = "JOYSTICK_UP"} +# Left = {type = "combo", player = 1, tag = ":IN5", mask = 4, default = 0, key = "KEYBOARD", kbMapping = "4PAD", mapping = "JOYSTICK_LEFT"} +# Up = {type = "combo", player = 1, tag = ":IN5", mask = 2, default = 0, key = "KEYBOARD", kbMapping = "8PAD", mapping = "JOYSTICK_UP"} +# Right = {type = "combo", player = 1, tag = ":IN5", mask = 1, default = 0, key = "KEYBOARD", kbMapping = "6PAD", mapping = "JOYSTICK_RIGHT", useMapping = "JOYSTICK_LEFT"} +Down = {type = "combo", player = 2, tag = ":IN5", mask = 16, default = 0, key = "KEYBOARD", kbMapping = "DOWN", mapping = "JOYSTICK_DOWN", useMapping = "JOYSTICK_UP"} +Left = {type = "combo", player = 2, tag = ":IN5", mask = 32, default = 0, key = "KEYBOARD", kbMapping = "LEFT", mapping = "JOYSTICK_LEFT"} +Up = {type = "combo", player = 2, tag = ":IN5", mask = 64, default = 0, key = "KEYBOARD", kbMapping = "UP", mapping = "JOYSTICK_UP"} +Right = {type = "combo", player = 2, tag = ":IN5", mask = 128, default = 0, key = "KEYBOARD", kbMapping = "RIGHT", mapping = "JOYSTICK_RIGHT", useMapping = "JOYSTICK_LEFT"} +"P1 Button" = {type = "combo", player = 1, tag = ":IN5", mask = 256, default = 0, key = "KEYBOARD", kbMapping = "ENTERPAD", mapping = "BUTTON1"} +"P2 Button" = {type = "combo", player = 2, tag = ":IN5", mask = 512, default = 0, key = "KEYBOARD", kbMapping = "RALT", mapping = "BUTTON1"} + +[vgmplay] +Stop = {type = "special", player = 1, tag = ":CONTROLS", mask = 1, default = 0, key = "P1_BUTTON1", mapping = "BUTTON3"} +Pause = {type = "special", player = 1, tag = ":CONTROLS", mask = 2, default = 0, key = "P1_BUTTON2", mapping = "START"} +Play = {type = "special", player = 1, tag = ":CONTROLS", mask = 4, default = 0, key = "P1_BUTTON3", mapping = "BUTTON1"} +Restart = {type = "special", player = 1, tag = ":CONTROLS", mask = 8, default = 0, key = "P1_BUTTON4", mapping = "BUTTON5"} +Loop = {type = "special", player = 1, tag = ":CONTROLS", mask = 16, default = 0, key = "P1_BUTTON5", mapping = "BUTTON6"} +"Change Visualization Mode" = {type = "special", player = 1, tag = ":CONTROLS", mask = 32, default = 0, key = "P1_BUTTON6", mapping = "BUTTON8"} +"Rate Down" = {type = "special", player = 1, tag = ":CONTROLS", mask = 64, default = 0, key = "P1_BUTTON7", mapping = "JOYSTICK_DOWN", useMapping = "JOYSTICK_UP"} +"Rate Up" = {type = "special", player = 1, tag = ":CONTROLS", mask = 128, default = 0, key = "P1_BUTTON8", mapping = "JOYSTICK_UP"} +"Rate Reset" = {type = "special", player = 1, tag = ":CONTROLS", mask = 256, default = 0, key = "P1_BUTTON9", mapping = "BUTTON2"} +"Rate Hold" = {type = "special", player = 1, tag = ":CONTROLS", mask = 512, default = 0, key = "P1_BUTTON10", mapping = "BUTTON4"} +"MAME Menu" = {type = "main", player = 1, tag = "standard", mask = 0, default = 0, key = "UI_CONFIGURE", mapping = "COIN"} + +[fmtmarty] +Run = {type = "special", player = 1, tag = ":joy1_ex", mask = 1, default = 0, key = "P1_START", mapping = "BUTTON4"} + +[pdp1] +"Control Panel Switch" = {type = "combo", player = 1, tag = ":CSW", mask = 1, default = 0, key = "KEYBOARD", kbMapping = "LCONTROL", mapping = "START"} +"Load Punchtape" = {type = "combo", player = 1, tag = ":CSW", mask = 256, default = 0, key = "KEYBOARD", kbMapping = "ENTER", mapping = "START"} +"P1 Spin Left" = {type = "special", player = 1, tag = ":SPACEWAR", mask = 1, default = 0, key = "P1_JOYSTICK_LEFT", mapping = "JOYSTICK_LEFT"} +"P1 Spin Right" = {type = "special", player = 1, tag = ":SPACEWAR", mask = 2, default = 0, key = "P1_JOYSTICK_RIGHT", mapping = "JOYSTICK_RIGHT", useMapping = "JOYSTICK_LEFT"} +"P1 Thrust" = {type = "special", player = 1, tag = ":SPACEWAR", mask = 4, default = 0, key = "P1_BUTTON1", mapping = "BUTTON1"} +"P1 Fire" = {type = "special", player = 1, tag = ":SPACEWAR", mask = 8, default = 0, key = "P1_BUTTON2", mapping = "BUTTON3"} +"P1 Hyperspace" = {type = "special", player = 1, tag = ":SPACEWAR", mask = 256, default = 0, key = "P1_BUTTON3", mapping = "BUTTON2"} +"P2 Spin Left" = {type = "special", player = 2, tag = ":SPACEWAR", mask = 16, default = 0, key = "P2_JOYSTICK_LEFT", mapping = "JOYSTICK_LEFT"} +"P2 Spin Right" = {type = "special", player = 2, tag = ":SPACEWAR", mask = 32, default = 0, key = "P2_JOYSTICK_RIGHT", mapping = "JOYSTICK_RIGHT", useMapping = "JOYSTICK_LEFT"} +"P2 Thrust" = {type = "special", player = 2, tag = ":SPACEWAR", mask = 64, default = 0, key = "P2_BUTTON1", mapping = "BUTTON1"} +"P2 Fire" = {type = "special", player = 2, tag = ":SPACEWAR", mask = 128, default = 0, key = "P2_BUTTON2", mapping = "BUTTON3"} +"P2 Hyperspace" = {type = "special", player = 2, tag = ":SPACEWAR", mask = 512, default = 0, key = "P2_BUTTON3", mapping = "BUTTON2"} + +[vc4000] +# The following Player 1 entries were overwritten by duplicate Player 2 keys in the original CSV parsing code +# 1 = {type = "special", player = 1, tag = ":KEYPAD1_1", mask = 128, default = 0, key = "KEYPAD", mapping = "BUTTON3"} +# "2/Button" = {type = "special", player = 1, tag = ":KEYPAD1_2", mask = 128, default = 0, key = "KEYPAD", mapping = "BUTTON1"} +# 3 = {type = "special", player = 1, tag = ":KEYPAD1_3", mask = 128, default = 0, key = "KEYPAD", mapping = "BUTTON4"} +# 4 = {type = "special", player = 1, tag = ":KEYPAD1_1", mask = 64, default = 0, key = "KEYPAD", mapping = "BUTTON2"} +# 5 = {type = "special", player = 1, tag = ":KEYPAD1_2", mask = 64, default = 0, key = "KEYPAD", mapping = "BUTTON6"} +# 6 = {type = "special", player = 1, tag = ":KEYPAD1_3", mask = 64, default = 0, key = "KEYPAD", mapping = "BUTTON5"} +# 7 = {type = "special", player = 1, tag = ":KEYPAD1_1", mask = 32, default = 0, key = "KEYPAD", mapping = "BUTTON8"} +# 8 = {type = "special", player = 1, tag = ":KEYPAD1_2", mask = 32, default = 0, key = "KEYPAD", mapping = "BUTTON7"} +# Enter = {type = "special", player = 1, tag = ":KEYPAD1_1", mask = 16, default = 0, key = "KEYPAD", mapping = "BUTTON10"} +# Clear = {type = "special", player = 1, tag = ":KEYPAD1_3", mask = 16, default = 0, key = "KEYPAD", mapping = "BUTTON9"} +1 = {type = "special", player = 2, tag = ":KEYPAD2_1", mask = 128, default = 0, key = "KEYPAD", mapping = "BUTTON3"} +"2/Button" = {type = "special", player = 2, tag = ":KEYPAD2_2", mask = 128, default = 0, key = "KEYPAD", mapping = "BUTTON1"} +3 = {type = "special", player = 2, tag = ":KEYPAD2_3", mask = 128, default = 0, key = "KEYPAD", mapping = "BUTTON4"} +4 = {type = "special", player = 2, tag = ":KEYPAD2_1", mask = 64, default = 0, key = "KEYPAD", mapping = "BUTTON2"} +5 = {type = "special", player = 2, tag = ":KEYPAD2_2", mask = 64, default = 0, key = "KEYPAD", mapping = "BUTTON6"} +6 = {type = "special", player = 2, tag = ":KEYPAD2_3", mask = 64, default = 0, key = "KEYPAD", mapping = "BUTTON5"} +7 = {type = "special", player = 2, tag = ":KEYPAD2_1", mask = 32, default = 0, key = "KEYPAD", mapping = "BUTTON8"} +8 = {type = "special", player = 2, tag = ":KEYPAD2_2", mask = 32, default = 0, key = "KEYPAD", mapping = "BUTTON7"} +Enter = {type = "special", player = 2, tag = ":KEYPAD2_1", mask = 16, default = 0, key = "KEYPAD", mapping = "BUTTON10"} +Clear = {type = "special", player = 2, tag = ":KEYPAD2_3", mask = 16, default = 0, key = "KEYPAD", mapping = "BUTTON9"} +"Game Select" = {type = "special", player = 1, tag = ":PANEL", mask = 128, default = 0, key = "P1_SELECT", mapping = "COIN"} +Start = {type = "special", player = 1, tag = ":PANEL", mask = 64, default = 0, key = "P1_START", mapping = "START"} + +[gp32] +A = {type = "special", player = 1, tag = ":IN0", mask = 16384, default = 16384, key = "P1_BUTTON1", mapping = "BUTTON2"} +B = {type = "special", player = 1, tag = ":IN0", mask = 8192, default = 8192, key = "P1_BUTTON2", mapping = "BUTTON1"} +L = {type = "special", player = 1, tag = ":IN0", mask = 4096, default = 4096, key = "P1_BUTTON3", mapping = "BUTTON5"} +R = {type = "special", player = 1, tag = ":IN0", mask = 32768, default = 32768, key = "P1_BUTTON4", mapping = "BUTTON6"} +Select = {type = "special", player = 1, tag = ":IN1", mask = 128, default = 128, key = "P1_SELECT", mapping = "COIN"} +Start = {type = "special", player = 1, tag = ":IN1", mask = 64, default = 64, key = "P1_START", mapping = "START"} + +[apple2-joy] +"P1 X Axis" = {type = "analog", player = 1, tag = ":gameio:joy:joystick_1_x", mask = 255, default = 128, key = "P1_AD_STICK_X", delta = 10, axis = "XAXIS", incMapping = "JOYSTICK_RIGHT", incUseMapping = "JOYSTICK_LEFT", decMapping = "JOYSTICK_LEFT"} +"P1 Y Axis" = {type = "analog", player = 1, tag = ":gameio:joy:joystick_1_y", mask = 255, default = 128, key = "P1_AD_STICK_Y", delta = 10, axis = "YAXIS", incMapping = "JOYSTICK_DOWN", incUseMapping = "JOYSTICK_UP", decMapping = "JOYSTICK_UP"} +"P2 X Axis" = {type = "analog", player = 2, tag = ":gameio:joy:joystick_2_x", mask = 255, default = 128, key = "P2_AD_STICK_X", delta = 10, axis = "XAXIS", incMapping = "JOYSTICK_RIGHT", incUseMapping = "JOYSTICK_LEFT", decMapping = "JOYSTICK_LEFT"} +"P2 Y Axis" = {type = "analog", player = 2, tag = ":gameio:joy:joystick_2_y", mask = 255, default = 128, key = "P2_AD_STICK_Y", delta = 10, axis = "YAXIS", incMapping = "JOYSTICK_DOWN", incUseMapping = "JOYSTICK_UP", decMapping = "JOYSTICK_UP"} diff --git a/package/batocera/core/batocera-configgen/data/mame/messSystems.csv b/package/batocera/core/batocera-configgen/data/mame/messSystems.csv deleted file mode 100644 index e1cc015a3b9..00000000000 --- a/package/batocera/core/batocera-configgen/data/mame/messSystems.csv +++ /dev/null @@ -1,44 +0,0 @@ -adam;adam;cass; -advision;advision;cart; -apfm1000;apfm1000;cart; -apple2;apple2ee;flop1; -apple2gs;apple2gs;flop3; -arcadia;arcadia;cart; -archimedes;aa4401;flop; -astrocade;astrocde;cart; -atom;atom;flop1;'\n*DOS\n*DIR\n*CAT\n*RUN"' -bbcmicro;bbcb;flop1; -camplynx;lynx48k;cass;'mload""' -loopy;casloopy;cart; -cdi;cdimono1;cdrm; -coco;coco3;cart; -crvision;crvision;cart; -electron;electron64;cass;'*T.\nCH.""\n' -fm7;fm7;flop1; -fmtowns;fmtmarty;cdrm; -gamate;gamate;cart; -gameandwatch;;; -gamecom;gamecom;cart1; -gamepock;gamepock;cart; -gmaster;gmaster;cart; -gp32;gp32;memc; -laser310;laser310;dump; -lcdgames;;; -macintosh;maclc3;flop1; -megaduck;megaduck;cart; -oricatmos;orica;cass; -pc60;pc6001;cart1; -pdp1;pdp1;ptap1; -pv1000;pv1000;cart; -samcoupe;samcoupe;flop1; -socrates;socrates;cart; -supracan;supracan;cart; -ti99;ti99_4a;cart; -tutor;tutor;cart; -tvgames;;; -uzebox;uzebox;cart; -vc4000;vc4000;cart; -vectrex;vectrex;cart; -vgmplay;vgmplay;quik; -vsmile;vsmile;cart; -xegs;xegs;cart; diff --git a/package/batocera/core/batocera-configgen/data/mame/messSystems.toml b/package/batocera/core/batocera-configgen/data/mame/messSystems.toml new file mode 100644 index 00000000000..6cdf02930c4 --- /dev/null +++ b/package/batocera/core/batocera-configgen/data/mame/messSystems.toml @@ -0,0 +1,148 @@ +[adam] +rom_type = "cass" + +[advision] +rom_type = "cart" + +[apfm1000] +rom_type = "cart" + +[apple2] +name = "apple2ee" +rom_type = "flop1" + +[apple2gs] +rom_type = "flop3" + +[arcadia] +rom_type = "cart" + +[archimedes] +name = "aa4401" +rom_type = "flop" + +[astrocade] +name = "astrocde" +rom_type = "cart" + +[atom] +rom_type = "flop1" +auto_run = '\n*DOS\n*DIR\n*CAT\n*RUN"' + +[bbcmicro] +name = "bbcb" +rom_type = "flop1" + +[camplynx] +name = "lynx48k" +rom_type = "cass" +auto_run = 'mload""' + +[loopy] +name = "casloopy" +rom_type = "cart" + +[cdi] +name = "cdimono1" +rom_type = "cdrm" + +[coco] +name = "coco3" +rom_type = "cart" + +[crvision] +rom_type = "cart" + +[electron] +name = "electron64" +rom_type = "cass" +auto_run = '*T.\nCH.""\n' + +[fm7] +rom_type = "flop1" + +[fmtowns] +name = "fmtmarty" +rom_type = "cdrm" + +[gamate] +rom_type = "cart" + +[gameandwatch] +name = "" + +[gamecom] +rom_type = "cart1" + +[gamepock] +rom_type = "cart" + +[gmaster] +rom_type = "cart" + +[gp32] +rom_type = "memc" + +[laser310] +rom_type = "dump" + +[lcdgames] +name = "" + +[macintosh] +name = "maclc3" +rom_type = "flop1" + +[megaduck] +rom_type = "cart" + +[oricatmos] +name = "orica" +rom_type = "cass" + +[pc60] +name = "pc6001" +rom_type = "cart1" + +[pdp1] +rom_type = "ptap1" + +[pv1000] +rom_type = "cart" + +[samcoupe] +rom_type = "flop1" + +[socrates] +rom_type = "cart" + +[supracan] +rom_type = "cart" + +[ti99] +name = "ti99_4a" +rom_type = "cart" + +[tutor] +rom_type = "cart" + +[tvgames] +name = "" + +[uzebox] +rom_type = "cart" + +[vc4000] +rom_type = "cart" + +[vectrex] +rom_type = "cart" + +[vgmplay] +rom_type = "quik" + +[vsmile] +rom_type = "cart" + +[xegs] +rom_type = "cart" diff --git a/package/batocera/emulators/mame/autoload/coco_cass_autoload.csv b/package/batocera/emulators/mame/autoload/coco_cass_autoload.toml old mode 100755 new mode 100644 similarity index 71% rename from package/batocera/emulators/mame/autoload/coco_cass_autoload.csv rename to package/batocera/emulators/mame/autoload/coco_cass_autoload.toml index 172aab30175..20cdd22793b --- a/package/batocera/emulators/mame/autoload/coco_cass_autoload.csv +++ b/package/batocera/emulators/mame/autoload/coco_cass_autoload.toml @@ -1,13 +1,12 @@ # coco_cass autoload (mame -autoboot_command) override file # https://github.com/batocera-linux/batocera.linux/pull/11706 # -# one rom override per line using ";" as delimiter: -# ; +# override line: +# = '' # # it is *not* necessary to escape quotes or ampersands (&) (as required in MAME software list XML) # # example: coco/roms/Grover's Number Rover (CCW).cas # result: loads BASIC (not binary) bootloader from cassette # -# Grover's Number Rover (CCW);CLOAD:RUN - +# "Grover's Number Rover (CCW)" = 'CLOAD:RUN' diff --git a/package/batocera/emulators/mame/autoload/coco_flop_autoload.csv b/package/batocera/emulators/mame/autoload/coco_flop_autoload.toml old mode 100755 new mode 100644 similarity index 73% rename from package/batocera/emulators/mame/autoload/coco_flop_autoload.csv rename to package/batocera/emulators/mame/autoload/coco_flop_autoload.toml index 4b5cd24db6b..a4c68b33a11 --- a/package/batocera/emulators/mame/autoload/coco_flop_autoload.csv +++ b/package/batocera/emulators/mame/autoload/coco_flop_autoload.toml @@ -1,8 +1,8 @@ # coco_flop autoload (mame -autoboot_command) override file # https://github.com/batocera-linux/batocera.linux/pull/11706 # -# one rom override per line using ";" as delimiter -# ; +# override line: +# = '' # # it is *not* necessary to escape quotes or ampersands (&) (as required in MAME software list XML) # @@ -10,5 +10,4 @@ # result: loads & executes machine language in "SLUTHIGH" into high memory, # then starts execution at address 0x073F after loading "SLUTHLOW" into low memory # -# Sam Sleuth;LOADM "SLUTHIGH":EXEC:LOADM "SLUTHLOW":EXEC &H073F - +# "Sam Sleuth" = 'LOADM "SLUTHIGH":EXEC:LOADM "SLUTHLOW":EXEC &H073F'