Завершить разделение SDK и внешних проектов
This commit is contained in:
+39
-33
@@ -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.
|
||||
|
||||
| шаг | пауза ПОСЛЕ шага |
|
||||
|-----|------------------|
|
||||
|
||||
Reference in New Issue
Block a user