Expand shared Sprinter MCP with managed launch, raw reads and key input
This commit is contained in:
+8
-5
@@ -280,13 +280,13 @@ Quick wins:
|
||||
## Прочий backlog
|
||||
|
||||
- [ ] **Довести MCP C-уровня до полного безопасного контракта.** Первый
|
||||
stdio-адаптер с 18 инструментами использует общую sdbg-сессию и
|
||||
stdio-адаптер с 26 инструментами использует общую sdbg-сессию и
|
||||
owner ID личных точек. Полный план и матрица всех 30 raw-возможностей —
|
||||
[mcp-convergence-plan.md](mcp-convergence-plan.md). Следующее:
|
||||
[mcp-convergence-plan.md](mcp-convergence-plan.md).
|
||||
control lease для DAP/MCP и cleanup точек по истечении heartbeat
|
||||
проверены живым прогоном. Далее проверка
|
||||
session ID изменяющих команд, безопасные
|
||||
input/screenshot/console API через session server, затем доказанные
|
||||
проверены живым прогоном. Привязка RPC к session/build/generation и
|
||||
экранные API и одиночный `press_key` уже добавлены. Далее очередь
|
||||
строкового ввода, управляемые поля портов и мышь, затем доказанные
|
||||
watchpoints, запись typed values, disassemble_src и batch-загрузка
|
||||
точек. Raw `mame_mcp.py` с `-plugin mamebridge` не подключать к тому же
|
||||
MAME в обход общей сессии. Старый `mame_bridge.lua` удалён из MAME.HT
|
||||
@@ -297,6 +297,9 @@ Quick wins:
|
||||
raw и C-адаптера разделены.
|
||||
Проверять конкуренцию, ошибки и lifecycle живым DAP/MCP
|
||||
пробником; см. [sdbg-mcp.md](sdbg-mcp.md).
|
||||
Автономный MCP `start_session`→DSS→`main`→DAP attach→`stop_session`
|
||||
уже проверен официальным SDK-клиентом; остаётся испытать Codex/Claude
|
||||
как реальные MCP-клиенты и передачу lease между ними и VS Code.
|
||||
- [ ] **Несколько одновременных экземпляров MAME и MCP bridge (отдельная
|
||||
задача, позже).** Проверить два изолированных процесса с разными
|
||||
дискетами/CHD/state и двумя MCP-сессиями; в протоколе явно связывать
|
||||
|
||||
@@ -125,7 +125,7 @@ stdio MCP-адаптер C-уровня. Эксклюзивное владени
|
||||
проверяет сигнатуру entry и запускает session server. Закрытие DAP
|
||||
завершает только созданные им server/MAME, удаляет временный каталог и
|
||||
свой Unix socket (с проверкой inode, чтобы не удалить новый сеанс).
|
||||
- `sdbg_mcp.py` предоставляет 18 инструментов через официальный MCP SDK
|
||||
- `sdbg_mcp.py` предоставляет 26 инструментов через официальный MCP SDK
|
||||
2.x поверх того же session server: статус, C-позиция, регистры, logical
|
||||
memory, переменные, события/логи, личные точки и команды исполнения.
|
||||
MCP-точки имеют owner ID и не могут удалить точки VS Code; при обычном
|
||||
@@ -136,6 +136,10 @@ stdio MCP-адаптер C-уровня. Эксклюзивное владени
|
||||
шага после клавиши.
|
||||
Повторный запуск на том же фиксированном socket после прежнего stale-файла
|
||||
прошёл; после Stop путь удалён.
|
||||
В автономном режиме доступны 28 инструментов: официальный MCP-клиент
|
||||
запустил `hello`, ввёл `x` через публичный `press_key` во время `getchar()`
|
||||
и остановился на следующей C-строке. Остальные raw-возможности ввода
|
||||
перечислены в [матрице](mcp-capability-matrix.md).
|
||||
Контракт запуска и ограничения — в
|
||||
[руководстве по MCP](sdbg-mcp.md).
|
||||
|
||||
@@ -286,7 +290,10 @@ commit `b0c4527c2edb1ee177fd09b3c412b65b385bf35b`:
|
||||
| MAME.HT 0.289, 2026-09-17 | Чистая сборка `make SUBTARGET=sprinter SOURCES=src/mame/sinclair/sprinter.cpp` и отдельные рецепты `stock`/`sdbg` создали `sprinter`; DAP в `sdbg` и `osx` на patched, а также `osx` на stock дождался DSS и остановился в `hello.c:17` без ложных точек. `getchar()` получил `x`, общий DAP/MCP сохранил ownership точек. Raw `mamebridge` через официальный MCP stdio-клиент перечислил 30 инструментов и ответил на `status`/`read_registers` при остановленном CPU; устаревший `resp_1.txt` не подменил ответ после перезапуска frontend |
|
||||
| Raw MCP plugin/legacy, 2026-09-17 | Все 16 команд удалённого `mame_bridge.lua` найдены в plugin dispatch; MCP stdio-прогоны проверили общий running-набор. Plugin на `hello` прошёл DSS→`main`, запись/восстановление `errno`, реальное срабатывание watchpoint, ввод `x` до строки 63 после `getchar()`, машинные over/out, снимок и пиксели. После удаления legacy-файла оба plugin-пробника повторно прошли |
|
||||
| Видимый raw MCP `hello`, 2026-09-17 | `tests/sdbg/run_raw_mcp_hello_probe.py` запустил MAME.HT с `-video soft -window`; кадр работающего `hello` показал весь текст и `Press any key to exit...`, затем ввод `x` довёл PC до `hello.c:63` |
|
||||
| Control lease DAP/MCP, 2026-09-17 | 18 C-инструментов, `claim_control`/`release_control`, 30-секундный lease с heartbeat; живой DAP+MCP-прогон подтвердил передачу управления обратно DAP и попадание в его точку. Второй видимый прогон дождался `owner_expired`, проверил удаление orphan-точки MCP и отсутствие ложной остановки; отпускание клавиш проверено unit-тестом |
|
||||
| Control lease DAP/MCP, 2026-09-17 | `claim_control`/`release_control`, 30-секундный lease с heartbeat; живой DAP+MCP-прогон подтвердил передачу управления обратно DAP и попадание в его точку. Второй видимый прогон дождался `owner_expired`, проверил удаление orphan-точки MCP и отсутствие ложной остановки; отпускание клавиш проверено unit-тестом |
|
||||
| RPC identity и экран C-MCP, 2026-09-17 | Запросы после handshake привязаны к session/build; мутации сверяют generation. 25 C-инструментов: в живом DAP+MCP-прогоне проверены raw program/logical memory, VRAM/share, порты, пиксели и PNG; при running `hello` MCP снял кадр с `Press any key to exit...`, затем `x` завершил шаг через `getchar()` |
|
||||
| Автономный MCP, 2026-09-17 | `start_session` ответил за 5–7 мс, затем официальный MCP-клиент дождался DSS→`hello.exe`→`main`; DAP attach увидел тот же PC, disconnect не завершил MAME. Повторный start отклонён, stop удалил socket и процесс MAME. Codex/Claude UI ещё не проверены |
|
||||
| Публичный MCP `press_key`, 2026-09-17 | В автономном видимом MAME официальный MCP-клиент поставил C-точку перед `getchar()`, продолжил `hello`, ввёл `x` через `press_key` и остановился на следующей строке 63. В автономном режиме доступны 28 инструментов; строковый ввод и мышь остаются в плане |
|
||||
| F10 через `getchar()`, 2026-09-15 | Асинхронный `next` ответил за 21,49 мс; при ручном `x` в окне MAME `hello.c:62` → `:63`, возврат `DE.low=0x78`; обе клавиатуры включены в изолированном cfg |
|
||||
| VS Code TaskProvider Build, 2026-09-15 | Одиннадцать Node-проверок: выбор Makefile рядом с пакетом/в `build/`, команда make с Python shim, SDCC matcher, успешный и неуспешный код задачи, pyenv вне workspace; реальный make в `tests/hello` прошёл, VS Code показал Build → MAME/DSS → `main` |
|
||||
| Ошибочная debug-сборка, 2026-09-15 | Изолированный `fault.c` вернул код 2 от make, `file:1: error 20` сохранился, Python traceback удалён; MAME не участвует |
|
||||
|
||||
@@ -536,12 +536,16 @@ console_log и загрузка набора точек. Возвращать bu
|
||||
в арбитраж, а не обходят его.
|
||||
|
||||
Первый stdio MCP-адаптер уже работает через общий session server и отдаёт
|
||||
18 проверенных C-инструментов. У личных MCP-точек owner ID; удаление чужой
|
||||
26 проверенных C-инструментов (28 при автономном start/stop). У личных MCP-точек owner ID; удаление чужой
|
||||
DAP-точки отклоняется. Совместный живой прогон подтвердил чтение состояния,
|
||||
точки и последующее срабатывание DAP-точки. Добавлен control lease для
|
||||
команд CPU и ввода; передача MCP→DAP и cleanup точки владельца без heartbeat
|
||||
проверены живым прогоном;
|
||||
проверены живым прогоном. RPC привязан к session/build/generation; экран и
|
||||
VRAM доступны через общий bridge, что подтверждено снимком работающего `hello`;
|
||||
одиночный `press_key` проверен на ожидающем `getchar()`;
|
||||
остальные интерфейсы этого раздела ещё не реализованы.
|
||||
Автономный MCP `start_session` поднимает DSS→EXE→`main` без VS Code;
|
||||
DAP attach к созданному socket и последующий `stop_session` проверены.
|
||||
Настройка и точный список — [sdbg-mcp.md](sdbg-mcp.md);
|
||||
результат удаления legacy Lua и перенос всех raw MCP-возможностей в общую сессию —
|
||||
[mcp-convergence-plan.md](mcp-convergence-plan.md).
|
||||
|
||||
@@ -0,0 +1,50 @@
|
||||
# Покрытие raw MCP в общей C-сессии
|
||||
|
||||
Эталон списка — 30 инструментов `MAME.HT/src/mame_mcp.py` с
|
||||
`-plugin mamebridge`. Столбец «C-сессия» означает инструмент
|
||||
`toolchain/sdbg_mcp.py`, который обращается к единственному `sdbg_server.py`
|
||||
через `sdbgbridge`. Сходное имя само по себе не означает одинаковую адресацию.
|
||||
|
||||
| Raw MCP | C-сессия | Состояние и отличие |
|
||||
|---|---|---|
|
||||
| `read_registers` | `read_registers` | Проверено при stop; C-ответ включает страницы банков и generation |
|
||||
| `read_memory` | `read_program_memory` | Проверено при stop: `0x10000+PC` совпал с logical Z80; raw 0..0x3ffff, до 4096 байт |
|
||||
| `read_logical_memory` | `read_memory` | Проверено при stop; предел C — 256 байт, проверяется загруженный C-код |
|
||||
| `read_vram` | `read_vram` | Проверено в живом MAME; 1..4096 байт, точный VRAM share |
|
||||
| `read_share` | `read_share` | Проверено; C требует точный tag из `list_shares`, raw принимает подстроку |
|
||||
| `list_shares` | `list_shares` | Проверено; структурированные tag/размер для shares и regions |
|
||||
| `write_memory` | — | Нужны lease, проверка адреса/банка и инвалидация C-карты |
|
||||
| `set_breakpoint` | `set_line_breakpoint`, `set_function_breakpoint` | Только проверенные C-адреса; произвольный raw-адрес и условие ещё не покрыты |
|
||||
| `clear_breakpoint` | `clear_breakpoint`, `clear_my_breakpoints` | Только логические ID текущего владельца, не MAME ID |
|
||||
| `list_breakpoints` | — | Нужен структурированный список с owner и bank guard |
|
||||
| `set_watchpoint` | — | Нужны owner, space/access, bank guard и проверка PC при попадании |
|
||||
| `clear_watchpoint` | — | Зависит от owner-модели watchpoint |
|
||||
| `step` | `step_instruction` | Один машинный шаг проверен; счётчик `count` ещё не поддержан |
|
||||
| `step_over` | `step_source(kind="over")` | Проверен C-шаг F10; raw машинный `over count` пока отличается |
|
||||
| `step_out` | `step_source(kind="out")` | Проверен C-выход; raw выход из одного машинного frame отличается |
|
||||
| `resume` | `continue_execution` | Проверено с control lease и DAP-событиями |
|
||||
| `pause` | `pause_execution` | Проверено с control lease |
|
||||
| `status` | `session_status`, `where` | Проверено; C-статус содержит session/build/generation |
|
||||
| `disassemble` | — | Нужен явный logical/raw адрес и банк; строковый debugger pass-through не используется |
|
||||
| `screenshot` | `screenshot` | Проверено на выполняющемся `hello`; только каталог сессии, до 8 МиБ, при stop кадр помечается stale |
|
||||
| `read_screen_pixels` | `read_screen_pixels` | Проверено; до 8192 pen16 пикселей, кадр/время/stale в ответе |
|
||||
| `list_ports` | `list_ports` | Проверено; структурированные tag/маска/имя, предел 512 портов и 4096 полей |
|
||||
| `press_key` | `press_key` | Проверено на `hello` через `getchar()`: один символ/enter/space/tab на 1..60 кадров, только при running CPU и с control lease; удержанные клавиши отпускаются при stop/ошибке. Имена прочих физических клавиш пока не поддержаны |
|
||||
| `type_string` | — | Нужна очередь ввода с release при stop/disconnect |
|
||||
| `type_text` | — | Нужна отдельная проверка natural keyboard и прямой физической клавиатуры |
|
||||
| `move_mouse` | — | Нужна owner-очередь относительных осей |
|
||||
| `click_mouse` | — | Нужна owner-очередь кнопок |
|
||||
| `press_input` | — | Нужен whitelist портов/масок и автоснятие удержания |
|
||||
| `set_input` | — | Нужен whitelist портов/масок и cleanup owner |
|
||||
| `debugger_command` | — | Произвольная команда обходит DAP; сначала только проверенные читающие команды |
|
||||
|
||||
Живые доказательства для текущего покрытия: `run_vscode_dap_probe.py`
|
||||
с `--mcp-python` проверяет stdio C-MCP и DAP, включая program/logical memory,
|
||||
порты, shares/VRAM/PNG;
|
||||
с `--waitkey --emulated-key --screen-mcp-python` проверяет экран работающего
|
||||
`hello` во время `getchar()` и последующий ввод. Автономный
|
||||
`run_managed_mcp_probe.py` через официальный MCP-клиент проверяет
|
||||
`press_key("x")` и остановку на строке после `getchar()`.
|
||||
`run_raw_mcp_hello_probe.py`
|
||||
проверяет отдельный raw plugin на том же приложении. Несколько процессов MAME
|
||||
с MCP одновременно не проверялись.
|
||||
@@ -11,7 +11,8 @@
|
||||
`MAME.HT/plugins/mamebridge` вместе с `src/mame_mcp.py` публикует 30
|
||||
raw-инструментов. Удалённый на этапе А `src/mame_bridge.lua` использовал тот
|
||||
же Python frontend, но обрабатывал только 16 команд и не отвечал при hard-stop.
|
||||
`toolchain/sdbg_mcp.py` публикует 18 C-инструментов через общую с DAP сессию.
|
||||
`toolchain/sdbg_mcp.py` публикует 26 C-инструментов через общую с DAP сессию
|
||||
(28 в автономном режиме с командами start/stop).
|
||||
**Цель — покрыть возможности всех 30 raw-инструментов в C-сессии, а не
|
||||
механически скопировать имена и небезопасную семантику.** Полный raw MCP
|
||||
остаётся отдельным режимом для задач без C-пакета и других машин MAME.
|
||||
@@ -107,9 +108,11 @@ control lease: команды CPU и ввод принимаются от тек
|
||||
удерживаемые клавиши после истечения heartbeat. Живой прогон с владельцем
|
||||
без heartbeat подтвердил событие `owner_expired`, удаление точки и отсутствие
|
||||
ложной остановки в `hello.c:62` после возобновления DAP.
|
||||
**Этап Б не закрыт:** ещё нужны защита
|
||||
всех мутаций, проверка session ID в каждом изменяющем запросе и безопасная
|
||||
invalidation при reset/load.
|
||||
RPC теперь привязывает последующие запросы DAP/MCP/CLI к session ID и build ID;
|
||||
мутации CPU и точек также требуют актуальную generation. Смена сессии/socket
|
||||
или устаревшая generation дают явный отказ, без автоматического повтора.
|
||||
**Этап Б не закрыт:** ещё нужны проверка reset/load на живом MAME, контроль
|
||||
новых типов мутаций и политика передачи lease между долгоживущими клиентами.
|
||||
|
||||
## В. Перенести 30 возможностей raw MCP по группам
|
||||
|
||||
@@ -132,6 +135,20 @@ invalidation при reset/load.
|
||||
pass-through и особенности адресов перечислены поимённо. Число методов C-MCP
|
||||
может быть больше 30 из-за разных адресных пространств и C-операций.
|
||||
|
||||
**Промежуточный статус В, 2026-09-17.** Через существующий `sdbgbridge`
|
||||
добавлены `list_shares`, `read_share`, `read_vram`, `read_screen_pixels`,
|
||||
`screenshot`, `read_program_memory`, `list_ports` с пределами размеров,
|
||||
точным tag share, изолированным каталогом PNG и признаком устаревшего кадра
|
||||
при stop. Живой DAP+MCP-прогон подтвердил совпадение raw program/logical Z80
|
||||
в `main`, VRAM/share, список портов и PNG; второй прогон снял экран работающего
|
||||
`hello` во время `getchar()` и затем завершил шаг клавишей `x`. Полное
|
||||
поимённое состояние — в [матрице 30 raw-инструментов](mcp-capability-matrix.md).
|
||||
Одиночный публичный `press_key` теперь требует running CPU и control lease,
|
||||
удерживает клавишу 1..60 кадров и отпускает её при stop/ошибке. Автономный
|
||||
официальный MCP-клиент ввёл `x` в ожидающий `getchar()` и попал на следующую
|
||||
C-строку. Очередь строки, другие имена физических клавиш и мышь ещё не
|
||||
реализованы; поэтому строка raw `press_key` покрыта частично.
|
||||
|
||||
## Г. Сделать запуск пригодным для Codex и Claude без VS Code
|
||||
|
||||
Сейчас `sdbg_mcp.py` подключается лишь к уже работающему socket. Сам
|
||||
@@ -157,6 +174,19 @@ pass-through и особенности адресов перечислены п
|
||||
**Выход Г:** C-отладка полностью доступна агенту без VS Code, а подключение
|
||||
агента к VS Code-сессии не создаёт второй MAME и не теряет точки DAP.
|
||||
|
||||
**Промежуточный статус Г, 2026-09-17.** `sdbg_mcp.py --build` публикует
|
||||
асинхронный `start_session`, фазовый `session_status` и `stop_session`.
|
||||
Живой официальный MCP-клиент получил ответ старта за 5–7 мс, дождался
|
||||
DSS→`hello.exe`→`main`, прочитал переменную и PNG. DAP подключился к тому же
|
||||
socket; его disconnect оставил MAME работающим. Повторный MCP start был
|
||||
отклонён, `stop_session` удалил socket и завершил свой MAME. При закрытии
|
||||
MCP-процесса supervisor также завершает принадлежащий ему launcher.
|
||||
Тем же официальным клиентом проверены установка C-точки перед `getchar()`,
|
||||
ввод `x` через публичный MCP `press_key` и остановка на следующей C-строке.
|
||||
**Этап Г не закрыт:** нужны реальные подключения из Codex и Claude,
|
||||
проверка передачи control lease между их клиентами и DAP, а также устойчивость
|
||||
к сбоям launcher/клиента на разных стадиях boot.
|
||||
|
||||
## Проверки и ограничения на всём пути
|
||||
|
||||
- Живые прогоны выполнять на `MAME.HT/sprinter`, собранном командой
|
||||
|
||||
+68
-5
@@ -44,8 +44,38 @@ pyenv exec python -m venv /tmp/sprinter-sdbg-mcp-venv
|
||||
MCP-сервер заново вместе с новой DAP-сессией. Альтернатива параметру
|
||||
`--socket` — переменная окружения `SDBG_SOCKET`.
|
||||
|
||||
Для работы **без VS Code** запустите тот же MCP-сервер с `--build`:
|
||||
|
||||
```json
|
||||
{
|
||||
"command": "/tmp/sprinter-sdbg-mcp-venv/bin/python",
|
||||
"args": [
|
||||
"/ABS/PATH/C-Compiler/toolchain/sdbg_mcp.py",
|
||||
"--build", "/ABS/PATH/C-Compiler/tests/hello/.sprinter-cc-hello",
|
||||
"--socket", "/tmp/sprinter-hello-agent.sock",
|
||||
"--mame-home", "/ABS/PATH/MAME/runtime",
|
||||
"--mame-bin", "/ABS/PATH/MAME.HT/sprinter"
|
||||
]
|
||||
}
|
||||
```
|
||||
|
||||
MCP handshake не ждёт загрузку DSS. `start_session` сразу возвращает socket и
|
||||
launch ID; `session_status` показывает `starting`, затем `ready` с build ID,
|
||||
session ID, PC и PID MAME либо `failed` с диагностикой. Повторный start при
|
||||
активном сеансе отклоняется. `stop_session` завершает только запущенный этим
|
||||
MCP-сервером MAME и удаляет socket. Закрытие самого MCP-процесса также
|
||||
завершает его автономный MAME. DAP/VS Code может подключиться к тому же socket;
|
||||
его disconnect не завершает MCP-owned MAME. Конфигурация VS Code — в
|
||||
[разделе attach](vscode-sprinter-debug.md#ручной-attach).
|
||||
Доступны также `--mame-rompath`, `--mame-dss-image`,
|
||||
`--mame-system-hdd-image`, `--mame-bios`, `--app-hdd`, `--launch-path`,
|
||||
`--data`, `--debugger`, `--launch-at`, `--dss-timeout`.
|
||||
Живой stdio MCP→DSS→`main`→DAP attach→stop прогон прошёл; подключение
|
||||
непосредственно из UI Codex и Claude ещё не проверено.
|
||||
|
||||
Доступные инструменты: `session_status`, `where`, `read_registers`,
|
||||
`read_memory`, `list_variables`, `read_variable`, `recent_events`,
|
||||
`read_memory`, `read_program_memory`, `list_ports`, `list_shares`, `read_share`, `read_vram`,
|
||||
`read_screen_pixels`, `screenshot`, `press_key`, `list_variables`, `read_variable`, `recent_events`,
|
||||
`mame_console_tail`, `set_line_breakpoint`, `set_function_breakpoint`,
|
||||
`clear_breakpoint`, `clear_my_breakpoints`, `claim_control`, `release_control`,
|
||||
`continue_execution`,
|
||||
@@ -55,7 +85,8 @@ MCP-сервер заново вместе с новой DAP-сессией. А
|
||||
`recent_events` с курсором `last`. Логи `SDBG_LOG` приходят как события
|
||||
`output`; журнал ограничен 1024 событиями и сообщает `first`/`last`/`lost`.
|
||||
|
||||
Число 16 не означает удаление возможностей более нового `-plugin mamebridge`:
|
||||
Число 26 в attach-режиме (28 в автономном с `start_session`/`stop_session`)
|
||||
не означает полного переноса более нового `-plugin mamebridge`:
|
||||
его `src/mame_mcp.py` публикует 30 raw-инструментов, ориентированных на
|
||||
машину MAME. Здесь инструменты сгруппированы по операциям C-сессии, а
|
||||
некоторые функции (C-позиция, typed global/static, журнал с generation)
|
||||
@@ -64,15 +95,16 @@ MCP-сервер заново вместе с новой DAP-сессией. А
|
||||
| Группа raw MCP | Что требуется перед переносом в общую сессию |
|
||||
|---|---|
|
||||
| `setmem`, raw `debugger_command`, watchpoints | Проверка прав, банка, диапазона и согласование с DAP-точками; произвольная debugger-команда может нарушить состояние сессии |
|
||||
| VRAM/shares, screen pixels, screenshot | Явные адресные пространства, лимиты, формат ответа и изолированный каталог снимков |
|
||||
| Клавиатура, мышь, type/press | Один владелец ввода, корректное отпускание клавиш, ожидание running CPU и проверка прямого ввода с клавиатуры |
|
||||
| VRAM/shares, screen pixels, screenshot | Реализованы через общий `sdbgbridge`; точный tag, пределы 4096 байт/8192 пикселя, PNG только в каталоге сессии |
|
||||
| Клавиатура, мышь, type/press | `list_ports` и одиночный `press_key` уже перенесены; набор строки, произвольные поля портов и мышь требуют отдельного контракта ввода |
|
||||
| Raw disassembly | Связать адрес/банк с проверенной C-картой; не выдавать физический адрес за logical |
|
||||
|
||||
Это следующий этап, а не запрет на функции raw MCP. Нельзя просто загрузить
|
||||
`mamebridge` рядом с `sdbgbridge`: два независимых обработчика начнут менять
|
||||
CPU и точки без общего owner ID и журнала.
|
||||
Результаты удаления legacy Lua и этапы переноса всех 30 возможностей в общую
|
||||
C-сессию описаны в [плане сведения MCP](mcp-convergence-plan.md).
|
||||
C-сессию описаны в [плане сведения MCP](mcp-convergence-plan.md) и
|
||||
[матрице покрытия](mcp-capability-matrix.md).
|
||||
|
||||
Чтение памяти принимает десятичный адрес или `0xHEX`, 1–256 байт logical
|
||||
Z80 memory, только при остановленном CPU, без side effects. Ответ содержит
|
||||
@@ -81,6 +113,37 @@ generation и страницы банков; диапазон не может п
|
||||
байта, только когда нужный банк отображён. Локальные, стек, watchpoints,
|
||||
запись переменных и произвольные выражения пока не поддерживаются.
|
||||
|
||||
`read_program_memory` читает raw program space 0..0x3ffff без side effects,
|
||||
до 4096 байт при остановленном CPU; это отдельный инструмент, так как
|
||||
`read_memory` означает logical Z80. `list_ports` возвращает tag, имена полей
|
||||
и битовые маски; результат ограничен 512 портами/4096 полями и помечает
|
||||
`truncated`, если достигнут предел. Оба инструмента проверены в живом MAME.
|
||||
|
||||
`list_shares` возвращает точные tag/размеры. `read_share` требует полный tag,
|
||||
`read_vram` выбирает единственный VRAM share; обе операции читают до 4096
|
||||
байт без Z80 bank mapping. `read_screen_pixels` возвращает pen16-значения
|
||||
в hex и номер кадра. `screenshot` сохраняет PNG до 8 МиБ в каталоге текущей
|
||||
сессии и возвращает путь; после завершения сессии временный каталог удаляется.
|
||||
Для обоих экранных инструментов `stale_frame=true` означает, что CPU
|
||||
остановлен и показан последний нарисованный кадр. Экран работающего `hello`
|
||||
во время `getchar()` проверен живым MCP-прогоном.
|
||||
|
||||
`press_key` принимает один символ раскладки PC или `enter`, `space`, `tab`
|
||||
и `frames` от 1 до 60 (по умолчанию 3). Он доступен только при работающем
|
||||
CPU, после запуска EXE; применяется общий control lease. Shift удерживается
|
||||
автоматически для заглавных букв и соответствующих символов. После нужного
|
||||
числа кадров или остановки CPU клавиша отпускается, включая путь ошибки.
|
||||
Ответ сообщает число прошедших кадров и признак остановки. Живой автономный
|
||||
MCP-прогон ввёл `x` в ожидающий `getchar()` и дошёл до следующей C-строки.
|
||||
Прямой физический ввод в MAME проверялся отдельно; `press_key` не заменяет
|
||||
его. Набор строки, произвольные имена клавиш, мышь и порты ввода ещё не
|
||||
публичны в C-MCP.
|
||||
|
||||
После первого `session_status` клиент отправляет session ID и build ID в
|
||||
каждом RPC; команды, меняющие CPU/точки, дополнительно сверяют generation.
|
||||
При замене сеанса или устаревшей generation команда отклоняется без
|
||||
автоматического повтора.
|
||||
|
||||
У каждой MCP-копии свой owner ID. Она может удалить только свои точки; при
|
||||
обычном закрытии stdio они очищаются. Живой тест подтвердил, что попытка
|
||||
удалить DAP-точку отвергается и точка VS Code срабатывает после выхода MCP.
|
||||
|
||||
@@ -175,7 +175,7 @@ launcher задаёт этому процессу `SDL_NO_SIGNAL_HANDLERS=1`, е
|
||||
фиксированный `"socket": "/tmp/sprinter-sdbg-hello.sock"` и подключите
|
||||
`toolchain/sdbg_mcp.py` после остановки в `main`. MCP использует тот же
|
||||
session server; его личные точки не заменяют точки VS Code. Порядок запуска,
|
||||
16 доступных инструментов и ограничения совместного управления описаны в
|
||||
26 доступных инструментов и ограничения совместного управления описаны в
|
||||
[руководстве по MCP](sdbg-mcp.md).
|
||||
|
||||
Команда палитры `Sprinter: Build Active Project` собирает приложение по
|
||||
@@ -309,7 +309,8 @@ trampoline до первой C-позиции вызывающей функци
|
||||
|
||||
## Ручной attach
|
||||
|
||||
Для общего MAME между CLI и VS Code сначала запустите `sdbg_server.py`, затем:
|
||||
Для общего MAME между CLI и VS Code сначала запустите `sdbg_server.py` либо
|
||||
автономный MCP `start_session` и дождитесь `session_status.phase=ready`, затем:
|
||||
|
||||
```json
|
||||
{
|
||||
@@ -321,7 +322,9 @@ trampoline до первой C-позиции вызывающей функци
|
||||
```
|
||||
|
||||
Команды server и диагностического CLI приведены в
|
||||
[mame-source-debug-status.md](mame-source-debug-status.md).
|
||||
[mame-source-debug-status.md](mame-source-debug-status.md). Автономный
|
||||
MCP-запуск описан в [sdbg-mcp.md](sdbg-mcp.md); DAP disconnect не завершает
|
||||
MAME, созданный MCP, а `stop_session` завершает его вместе с socket.
|
||||
|
||||
## Ограничения MVP
|
||||
|
||||
|
||||
Reference in New Issue
Block a user