78 lines
3.6 KiB
Python
78 lines
3.6 KiB
Python
#!/usr/bin/env python3
|
|
"""Обычный запуск Sprinter в MAME с локальным образом приложения."""
|
|
from __future__ import annotations
|
|
|
|
import argparse
|
|
from pathlib import Path
|
|
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()
|
|
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",
|
|
"-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())
|