#!/usr/bin/env python3 """Обычный запуск Sprinter в MAME с локальным образом приложения.""" from __future__ import annotations import argparse from pathlib import Path import shutil import subprocess import sys import tempfile from mame_profile import add_arguments, from_arguments, write_keyboard_config def main() -> int: parser = argparse.ArgumentParser(description=__doc__) add_arguments(parser) parser.add_argument("--floppy", help="локальный образ приложения для A:") parser.add_argument("--hdd", help="локальный образ приложения для D:") parser.add_argument("--video", default="soft") parser.add_argument("--script", help="Lua-сценарий запуска/теста") parser.add_argument("--snapshot-dir", help="постоянный каталог снимков") parser.add_argument("--timeout", type=float, help="лимит работы MAME в секундах") parser.add_argument("--dry-run", action="store_true") args = parser.parse_args() try: profile = from_arguments(args) profile.validate(dss=True) if not args.floppy and not args.hdd: raise ValueError("для запуска укажите --floppy или --hdd") media = {name: Path(value).resolve() for name, value in (("floppy", args.floppy), ("hdd", args.hdd)) if value} for name, path in media.items(): if not path.is_file(): raise ValueError(f"локальный образ {name} не найден: {path}") script = Path(args.script).resolve() if args.script else None if script and not script.is_file(): raise ValueError(f"Lua-сценарий не найден: {script}") except ValueError as error: print(f"run_sprinter_mame: {error}", file=sys.stderr) return 2 with tempfile.TemporaryDirectory(prefix="sprinter-mame-run-") as directory: state = Path(directory) for name in ("cfg", "nvram", "diff", "snapshot"): (state / name).mkdir() # Настройки и NVRAM установленной среды берутся копией: MAME # перезаписывает их при выходе, а MAME_HOME должен остаться нетронутым. for name in ("cfg", "nvram"): source = profile.home / name if profile.home else None if source and source.is_dir(): shutil.copytree(source, state / name, dirs_exist_ok=True) snapshots = Path(args.snapshot_dir).resolve() if args.snapshot_dir else state / "snapshot" snapshots.mkdir(parents=True, exist_ok=True) write_keyboard_config(state / "cfg") command = [str(profile.binary), "sprinter", "-noreadconfig", "-rompath", str(profile.rompath), "-bios", profile.bios, "-kbd", "ms_naturl,bios=sp2k", "-video", args.video, "-window", "-skip_gameinfo", "-beta:wd179x:0", "35hd", "-beta:wd179x:1", "35hd", "-flop2", str(profile.dss_image), "-hard1", str(profile.system_hdd_image)] if "floppy" in media: command += ["-flop1", str(media["floppy"])] if "hdd" in media: command += ["-hard2", str(media["hdd"])] if script: command += ["-autoboot_script", str(script)] for name in ("cfg", "nvram", "diff"): command += ["-" + name + "_directory", str(state / name)] command += ["-snapshot_directory", str(snapshots)] print("MAME:", profile.binary, "ROM:", profile.rompath, "DSS:", profile.dss_image, "BIOS:", profile.bios, flush=True) if args.dry_run: print("Команда:", command) return 0 try: return subprocess.run(command, cwd=state, timeout=args.timeout).returncode except subprocess.TimeoutExpired: print("run_sprinter_mame: истёк лимит времени", file=sys.stderr) return 124 if __name__ == "__main__": raise SystemExit(main())