Подготовить автономную сборку и запуск перед разделением проектов

This commit is contained in:
Александр Петров
2026-09-15 23:04:04 +03:00
parent 5323b168a7
commit 0e74aaa7ee
116 changed files with 6908 additions and 333 deletions
+29 -27
View File
@@ -4,7 +4,6 @@ from __future__ import annotations
import argparse
from contextlib import redirect_stdout
import importlib.util
import json
import os
from pathlib import Path
@@ -19,6 +18,9 @@ import uuid
ROOT = Path(__file__).resolve().parents[1]
sys.path.insert(0, str(ROOT/'toolchain'))
from mame_interactive import basename_83, build_events
from make_disk import create_floppy_image
from mame_profile import (MameProfile, add_arguments, from_arguments,
write_keyboard_config)
from sdbg.image import read_ihx
from sdbg.model import DebugMap
@@ -38,20 +40,6 @@ def disk_entries(exe: Path, data) -> list[tuple[str, str]]:
return entries
def write_keyboard_config(cfg_directory: Path) -> None:
"""Включить обе клавиатуры Sprinter для физического ввода в DSS."""
(cfg_directory/'sprinter.cfg').write_text(
'<?xml version="1.0"?>\n'
'<mameconfig version="10">\n'
' <system name="sprinter">\n'
' <input>\n'
' <keyboard tag=":" enabled="1" />\n'
' <keyboard tag=":kbd:ms_naturl" enabled="1" />\n'
' </input>\n'
' </system>\n'
'</mameconfig>\n', encoding='utf-8')
def lua_script(path, ready, main_address, signature, events, launch_at,
dss_timeout=30):
rows = ',\n'.join('{'+f'{t},"{tag}",{mask},{value}'+'}'
@@ -165,6 +153,7 @@ end)
def main():
parser=argparse.ArgumentParser(description=__doc__)
add_arguments(parser)
parser.add_argument('--build',required=True)
parser.add_argument('--socket',required=True)
parser.add_argument('--data',action='append',default=[])
@@ -172,7 +161,8 @@ def main():
help='не начинать ввод раньше этой секунды эмуляции')
parser.add_argument('--dss-timeout',type=float,default=30,
help='таймаут появления стабильного prompt DSS')
parser.add_argument('--mame',default=str(ROOT/'mame/v306/mame.arm'))
parser.add_argument('--mame',default=None,
help='совместимый alias для --mame-bin')
parser.add_argument('--debugger',default='sdbg',
help='OSD debugger provider (по умолчанию sdbg из project patch)')
args=parser.parse_args()
@@ -188,8 +178,13 @@ def main():
function['start'],min(function['end'],function['start']+24)))
if not signature:
raise ValueError('У main нет проверяемой сигнатуры')
mame=Path(args.mame).resolve()
mame_dir=mame.parent
if args.mame and not args.mame_bin:
args.mame_bin=args.mame
profile=from_arguments(args)
if profile.binary is None and (ROOT/'mame/v306/mame.arm').is_file():
profile=MameProfile.resolve({'MAME_HOME':str(ROOT/'mame/v306')})
profile.validate(dss=True)
mame=profile.binary
stopping=False
def stop(*_):
nonlocal stopping
@@ -202,13 +197,11 @@ def main():
for name in ('nvram','cfg','diff','snapshot'): (state/name).mkdir()
write_keyboard_config(state/'cfg')
system=state/'system.chd'
shutil.copyfile(mame_dir/'IMG/sp_hdd_sys.chd',system)
shutil.copyfile(profile.system_hdd_image,system)
disk_path=state/'debug.img'
spec=importlib.util.spec_from_file_location('make_disk',mame_dir/'make_disk.py')
disk=importlib.util.module_from_spec(spec);spec.loader.exec_module(disk)
files=disk_entries(exe,args.data)
with redirect_stdout(sys.stderr):
if not disk.create_floppy_image(str(disk_path),files):
if not create_floppy_image(str(disk_path),files):
raise RuntimeError('Не удалось создать debug-дискету')
command_text='a:\\'+basename_83(exe.name).replace(' ','')+'\n'
events=build_events([(0,command_text)])
@@ -218,11 +211,20 @@ def main():
args.dss_timeout)
session_id=uuid.uuid4().hex
environment=dict(os.environ,SDBG_IPC_DIR=str(ipc),SDBG_SESSION_ID=session_id)
command=[str(mame),'sprinter','-noreadconfig','-rompath',str(mame_dir/'roms'),
'-bios','v3.06','-kbd','ms_naturl,bios=sp2k','-video','soft','-window',
plugin_paths=[str(ROOT/'toolchain/mcp')]
installed_plugins=profile.home.parent/'plugins' if profile.home else None
if installed_plugins and installed_plugins.is_dir():
plugin_paths.append(str(installed_plugins))
legacy_plugins=ROOT/'mame/sources/MAME/plugins'
if legacy_plugins.is_dir():
plugin_paths.append(str(legacy_plugins))
command=[str(mame),'sprinter','-noreadconfig','-rompath',str(profile.rompath),
'-bios',profile.bios,'-kbd','ms_naturl,bios=sp2k','-video','soft','-window',
'-sound','none','-skip_gameinfo','-beta:wd179x:0','35hd',
'-flop1',str(disk_path),'-hard1',str(system),'-debug','-debugger',args.debugger,
'-plugin','sdbgbridge','-pluginspath',str(ROOT/'toolchain/mcp')+';'+str(ROOT/'mame/sources/MAME/plugins'),
'-beta:wd179x:1','35hd','-flop1',str(disk_path),
'-flop2',str(profile.dss_image),'-hard1',str(system),
'-debug','-debugger',args.debugger,
'-plugin','sdbgbridge','-pluginspath',';'.join(plugin_paths),
'-autoboot_delay','0','-autoboot_script',str(lua)]
for name in ('nvram','cfg','diff','snapshot'):
command.extend(['-'+name+'_directory',str(state/name)])
@@ -250,7 +252,7 @@ def main():
'--socket',args.socket],stdout=subprocess.PIPE,stderr=sys.stderr,text=True)
line=server.stdout.readline()
if not line:
raise RuntimeError('Session server не запустился')
raise RuntimeError('Session server не запустился'+mame_diagnostics())
server_ready=json.loads(line)
print(json.dumps({'ready':True,'socket':args.socket,'pid':mame_process.pid,
'entry':entry,'build_id':server_ready['build_id']},