Подготовить автономную сборку и запуск перед разделением проектов
This commit is contained in:
+29
-27
@@ -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']},
|
||||
|
||||
Reference in New Issue
Block a user