Завершить разделение SDK и внешних проектов

This commit is contained in:
Александр Петров
2026-09-16 10:01:43 +03:00
parent 0e74aaa7ee
commit 2e7ffd64a4
1965 changed files with 373 additions and 201393 deletions
+39 -33
View File
@@ -17,21 +17,21 @@ make -C tests/bgitest
# запустить в MAME, снять экран, выйти по таймауту
python3 toolchain/mame_interactive.py tests/bgitest/bgitest.exe \
--snap 12,14 --timeout 16
--mame-home /путь/к/MAME/runtime --snap 12,14 --timeout 16
```
Инструмент сам:
1. проверит, что нет висящих копий MAME;
2. положит `.exe` на дискету A: (`mame/v306/IMG/mc.img`);
1. соберёт отдельную временную FAT12-дискету с `.exe`;
2. создаст отдельные каталоги MAME для cfg/NVRAM/diff/snapshot;
3. запустит MAME с драйвером `sprinter`;
4. дождётся приглашения `C:\>` и **напечатает `a:\bgitest.exe` + Enter**
(эмулируя нажатия клавиш);
4. в момент `--launch-at` **напечатает `a:\bgitest.exe` + Enter**
(эмулируя нажатия клавиш); выбирайте время после загрузки DSS;
5. снимет скриншоты в указанные секунды эмулированного времени;
6. завершит сессию по таймауту;
7. выведет пути к PNG-скриншотам.
Скриншоты лежат в `mame/v306/snap_auto/sprinter/` (`0000.png`, `0001.png`,
…). Их читает Claude визуально (инструментом Read) — текст с экрана
Скриншоты лежат в `build/mame-autotest/<session>/sprinter/` (`0000.png`,
`0001.png`, …) относительно каталога запуска. Их можно читать визуально — текст с экрана
программно НЕ распознаётся.
---
@@ -40,7 +40,8 @@ python3 toolchain/mame_interactive.py tests/bgitest/bgitest.exe \
```
python3 toolchain/mame_interactive.py [exe] [--data f ...] \
[--launch-at T] [--step "T:TEXT" ...] [--snap t1,t2,...] [--timeout N]
[--mame-home DIR] [--mame-bin FILE] [--launch-at T] \
[--step "T:TEXT" ...] [--snap t1,t2,...] [--timeout N]
```
| Аргумент | Назначение |
@@ -51,6 +52,9 @@ python3 toolchain/mame_interactive.py [exe] [--data f ...] \
| `--step "T:TEXT"` | в момент `T` сек напечатать `TEXT`. Можно много раз — диалог с уже запущенной программой. В `TEXT`: `\n`=Enter, `\t`=Tab; заглавные и символы через Shift — автоматически. |
| `--snap t1,t2,...` | секунды эмуляции для скриншотов. По умолчанию: `launch_at+4` и `+6` (для `exe`), либо сразу после последнего ввода. |
| `--timeout N` | секунд эмуляции до принудительного выхода. По умолчанию — чуть позже последнего скриншота. |
| `--mame-home DIR` | установленная среда MAME; можно задать переменной `MAME_HOME`. |
| `--mame-bin`, `--mame-rompath`, `--mame-dss-image`, `--mame-system-hdd-image`, `--mame-bios` | выбор отдельных частей профиля; соответствуют `MAME_*` из окружения. |
| `--snapshot-dir DIR` | локальный каталог кадров вместо `build/mame-autotest`. |
**Важно:** все времена — это **секунды эмулированного времени от старта
машины** (не от нажатий, их «нет»). Загрузка DSS до `C:\>` занимает
@@ -72,7 +76,7 @@ python3 toolchain/mame_interactive.py tests/menu/menu.exe \
--step "13:2\n" --snap 15 --timeout 17
# 4. Тест с файлом-данными на дискете
python3 toolchain/mame_interactive.py examples/mdview2/mdview2.exe \
python3 toolchain/mame_interactive.py /путь/к/Examples/mdview2/mdview2.exe \
--data doc.md --step "13:mdview2 doc.md\n" --snap 16 --timeout 18
```
@@ -82,11 +86,12 @@ python3 toolchain/mame_interactive.py examples/mdview2/mdview2.exe \
### 3.1 Запуск MAME
Нативный `mame.arm` (arm64) в `mame/v306/`, драйвер `sprinter`, BIOS
v3.06. Полный набор аргументов зашит в `COMMON_ARGS` внутри скрипта:
две дискеты (A: наш `mc.img`, B: DSS 1.71u), два HDD-образа (система +
медиа), CD-ROM, ZX-Bus карта NeoGS, `-video opengl -window`,
`-snapshot_directory`, `-autoboot_script <сгенерированный .lua>`.
Профиль `MAME_HOME` выбирает `mame.arm`, `roms/`, DSS-дискету и системный
CHD. A: — временная дискета этого запуска; B: — DSS. При наличии в
установленной среде CD/NeoGS/медиа скрипт подключает их как необязательные
устройства. `-cfg_directory`, `-nvram_directory`, `-diff_directory` и
`-snapshot_directory` указывают в изолированный каталог сессии;
`-autoboot_script` получает сгенерированный Lua-файл.
### 3.2 Ввод с клавиатуры — ключевой момент
@@ -118,7 +123,7 @@ AT-клавиатуре есть (поле `P2.1`/0x4) — путь `a:\name.exe
### 3.3 Тайминг (Lua)
Генерируется `_interactive_gen.lua`, который через
Временный Lua-файл через
`emu.register_periodic` на каждом кадре сверяет **эмулированное время** и
проигрывает события ввода, снимает скриншоты и завершает сессию.
@@ -132,32 +137,33 @@ AT-клавиатуре есть (поле `P2.1`/0x4) — путь `a:\name.exe
### 3.4 Скриншоты
`manager.machine.video:snapshot()` пишет PNG в каталог из
`-snapshot_directory` (`mame/v306/snap_auto/sprinter/`). Скрипт перед
запуском чистит этот каталог, потом печатает пути к готовым файлам.
Claude открывает их инструментом Read (визуальный анализ).
`-snapshot_directory` внутри `build/mame-autotest/<session>/sprinter/`.
Каждый запуск создаёт свой каталог и печатает пути к PNG; другие сессии не
затрагиваются.
### 3.5 Завершение сессии
Два рубежа, чтобы MAME гарантированно не «завис»:
Два рубежа, чтобы MAME гарантированно завершился:
- в Lua: при `elapsed >= timeout``manager.machine:exit()` (чистый
выход);
- снаружи: shell-обёртка `timeout <N+8> ./mame.arm …` как страховка.
- снаружи: `subprocess` ожидает с ограничением wall-clock времени, затем
завершает только собственный процесс MAME.
---
## 4. Предпосылки (окружение)
- **MAME**: `mame/v306/mame.arm` + образы в `mame/v306/IMG/`
(`mc.img` — наш перезаписываемый A:, `dss171u.img`, HDD `.chd`, CD
`.iso`). Каталог `mame/` целиком в `.gitignore` — поэтому инструмент
живёт в `toolchain/`, а не рядом с MAME.
- **MAME**: задайте `MAME_HOME=/путь/к/MAME/runtime` с бинарником,
`roms/`, `IMG/dss171u.img` и `IMG/sp_hdd_sys.chd`. Исходники fork не нужны.
- **Загрузка должна доходить до `C:\>`.** `system.bat` на системном
диске НЕ должен автоматически запускать Flex Navigator или приложение —
иначе мы не попадём на командную строку и ввод уйдёт в чужую программу.
(Это файл на HDD-образе, вне репозитория; правится один раз.)
- **Нет висящих копий MAME.** Несколько одновременных инстансов пишут в
один `mc.img` и дают недостоверный результат. Скрипт проверяет это сам
(`pgrep`), но при ручных запусках MAME — проверяйте `ps aux | grep mame`.
- **Одновременный запуск нескольких MAME не проверялся.** Автотест создаёт
отдельные A:, state и снимки и при необходимости копирует системный CHD,
но это ещё не доказывает корректность параллельной работы. Особенно не
гарантируется работа нескольких процессов через MCP bridge: выбор процесса,
идентификатор сессии и арбитраж требуют отдельной проверки.
---
@@ -237,14 +243,14 @@ end
анимацией/звуком, где скриншотов мало. Пока не подключено к скрипту.
- **Ручная отладка ввода.** Запуск MAME с `-console` даёт интерактивный
Lua-REPL — удобно нащупывать поля/тайминги вживую перед скриптованием.
- **Второй видеорежим/варианты BIOS** — при необходимости менять
`COMMON_ARGS`.
- **Второй видеорежим/варианты BIOS** — выбирать `MAME_BIOS` или отдельные
аргументы профиля.
## 10. Тайминги MCP-моста (run_bridge.sh) — НЕ ждать дольше
## 10. Архивные тайминги старого MCP-моста
Запуск через `mame/v306/run_bridge.sh` + `bridge_cmd.sh` / MCP `mame-z80`.
Паузы ниже — измеренные на этой машине; ждать дольше бессмысленно, а
привычка ставить `sleep 30..60` съедает минуты на каждый прогон:
Ниже сохранены измерения прежнего ручного запуска через `run_bridge.sh` и
`bridge_cmd.sh`. Они не задают таймауты нового автотеста и DAP: автотест
использует изолированные носители, а DAP ждёт стабильный prompt DSS в VRAM.
| шаг | пауза ПОСЛЕ шага |
|-----|------------------|