# Разделение Sprinter-CC, MAME и приложений Статус: план, без переноса файлов. Дата: 2026-09-15. ## Цель и границы Тулкит, эмулятор, примеры и реальные приложения должны разрабатываться и версионироваться независимо. Приложение собирается из собственного клона, если ему указан только путь к установленному Sprinter-CC. Для запуска в эмуляторе дополнительно указывается путь к подготовленной среде MAME либо необходимые отдельные пути. Ни соседний репозиторий Examples, ни исходники MAME приложению не нужны. Предлагаемая раскладка на машине разработчика: ```text ~/Projects/DIY/Z80/Sprinter/ ├── C-Compiler/ # Sprinter-CC ├── MAME/ # fork MAME, сборки и локальная среда запуска ├── Examples/ # один Git-репозиторий примеров ├── Applications/ # каталог без собственного Git │ ├── SprPoP/ # самостоятельный Git-репозиторий │ ├── Volkov/ # самостоятельный Git-репозиторий │ └── PoP-Archive/ # архивный проект, если история нужна отдельно └── VSCode-Sprinter/ # Git-репозиторий расширения VS Code ``` Имена `C-Compiler`, `Volkov` и `PoP-Archive` здесь рабочие; адреса Git remote новых репозиториев и окончательные имена фиксируются до миграции. Папка `Applications/` не становится общим репозиторием: каждый продукт имеет свою историю, релизы, игнорируемые ресурсы и тесты. Физическое расположение рядом удобно, но не входит в контракт сборки. ## Что принадлежит каждому проекту | Проект | Что остаётся/переходит | Причина | |---|---|---| | Sprinter-CC | `bin/`, `runtime/`, `libc/`, `libbgi/`, `lib/`, общие `toolchain/`, `tests/`, `testkit/`, `app.mk`, справочник API, платформенные исследования, `release_docs/`, рецепт SDCC в `third_party/` | Это target SDK, его ABI, инструменты и собственные регрессионные тесты. libc/libbgi пока остаются вместе: их версия и ABI тесно связаны с `sprinter-cc`; дальнейшее выделение возможно после стабильного интерфейса. | | MAME | Нынешний `mame/sources/MAME` со своим Git, изменения драйвера/OSD, патч debugger backend, общие `mamebridge` и `mame_mcp.py`, рецепты stock/sdbg сборок | Изменения ядра и общий транспорт MCP должны проверяться и выпускаться вместе с конкретной ревизией MAME. | | Examples | Нынешние `examples/balls`, `mdview`, `mdview2`, `rpgwalk`, `scroll`, `space` и относящиеся к ним ресурсы/документы | Это демонстрации SDK с общей версией. Один репозиторий избегает множества мелких релизов. | | SprPoP | Всё `applications/SprPoP/`: исходники, конверторы, тесты, собственные ресурсы и планы | Уже почти автономное приложение; оригинальные ресурсы и дальше остаются внешними. | | Volkov | Всё `applications/Volkov/`: исходники, сценарии MAME, собственные тестовые носители и документы | Продукт и его проверки должны развиваться без дерева тулкита. | | PoP-Archive | `applications/PoP/` как архив прежних PoC/roomtest и исследований | Не смешивать прежнюю историю с активным SprPoP. Если архив не нужен как рабочий клон, сохранить Git-историю и документы в отдельном архивном репозитории. | | VSCode-Sprinter | Нынешний `toolchain/vscode-sprinter-debug`: extension, задачи сборки, конфигурации и тесты клиентской части | У расширения свои версии, упаковка VSIX и цикл обновления. Отладочный Python backend остаётся в SDK. | `applications/DN/DosNavigator` и вложенные чужие клоны в PoP/Volkov — референсы, не Sprinter-приложения. Их не превращать в продуктовые репозитории и не коммитить вместе с портами. Локально их можно хранить в `References/` или получать по воспроизводимой инструкции с указанием upstream и revision. `docs/sources/`, `docs/extra/` и скачанный SDCC также не являются новым проектом: это игнорируемые справочные/загруженные материалы. Отдельно проверить, какие tracked файлы `third_party/16x16-RPG-characters` нужны `rpgwalk` и старому PoP; каждый потребитель получает собственный ресурс или явный рецепт его загрузки. Лицензии и происхождение сохранить. ## Контракт сборки и запуска приложения `SPRINTER_ROOT` указывает на готовый Sprinter-CC. Это единственный внешний путь, обязательный для сборки `.exe`, host-тестов и собственных генераторов ресурсов. В `app.mk` убрать вывод MAME из `PROJ_ROOT`; оставить совместимый alias `PROJ_ROOT := $(SPRINTER_ROOT)` там, где это необходимо на переходный период. Приложения проверяют, что по пути существуют `bin/sprinter-cc`, `app.mk` и нужные библиотеки, и сообщают ошибку до начала сборки. При отсутствии `SPRINTER_ROOT` не угадывать прежнее `../..`: после переноса такой путь может случайно указывать на чужой каталог. `MAME_HOME` — необязательный для сборки путь к подготовленной **среде запуска** MAME, а не к его исходникам. Стандартные пути соответствуют нынешнему `mame/v306` и допускают переопределение из окружения, аргументов `make` или локального игнорируемого файла настроек. Если `MAME_HOME` не задан, необходимые пути можно указать отдельно; отсутствие обоих источников диагностировать в цели запуска, не превращая пустое значение в `/mame.arm`: ```make MAME_BIN ?= $(MAME_HOME)/mame.arm MAME_ROMPATH ?= $(MAME_HOME)/roms MAME_DSS_IMAGE ?= $(MAME_HOME)/IMG/dss171u.img MAME_SYSTEM_HDD_IMAGE ?= $(MAME_HOME)/IMG/sp_hdd_sys.chd MAME_BIOS ?= v3.06 ``` `MAME_BIOS` — имя варианта для аргумента `-bios`; ROM-файлы MAME ищет в `MAME_ROMPATH`. `MAME_SYSTEM_HDD_IMAGE` добавлен потому, что системный CHD нужен существующим сценариям. Если используется CD, NeoGS или второй системный носитель, пути к ним сделать отдельными необязательными настройками профиля запуска; не прибивать их к Makefile каждого приложения. Уточнить по фактическим сценариям, когда нужен `MAME_DSS_IMAGE`: обычный `run`, тест и DAP-launch должны брать один источник настройки, даже если конкретный профиль не монтирует DSS-дискету. `MAME_HOME/mame.arm` — стандартный установленный бинарник, а stock/sdbg сборки находятся отдельно и выбираются явным `MAME_BIN`. Сборка одного варианта не перезаписывает другой и не меняет молча активный бинарник. Для запуска с нетипичной установкой можно переопределить каждый путь, не копируя ROM/CHD в каталог приложения. Все цели запуска валидируют свои фактически используемые файлы и выводят проверенный путь в диагностике. Собственный `.img`/`.chd`, результаты сценариев, снимки, Lua-скрипты и журнал приложения лежат в его `build/` (или другом локальном выходном каталоге). MAME получает готовый образ аргументом `-flop1`/`-hard2`. Общие `IMG/mc.img` и `IMG/test_hdd.chd` больше не являются выходами сборки приложения. `make hdd` готовит локальный образ; `make run` запускает его без `mame-link`. Для нескольких сценариев создавать отдельные носители и state-каталоги, чтобы параллельный запуск не перезаписывал чужой тест. Конфигурация разработчика не содержит абсолютных личных путей в Git. Для `.img` нужен упаковщик из SDK; для `.chd` нынешний `make_hdd.sh` дополнительно использует внешние `mtools` и `chdman`. Зафиксировать эти host-зависимости и проверять их перед упаковкой. `chdman` можно находить через `PATH` либо переопределяемый `CHDMAN_BIN`; путь к исходникам MAME или полная установка эмулятора для самой сборки `.exe` не нужны. Временное состояние MAME (`cfg`, `nvram`, `diff`, `snapshot`, IPC) создаётся в отдельном каталоге сессии. Обычный запуск, автотест и DAP используют одну функцию/профиль разрешения путей, но разные режимы жизненного цикла и разные локальные диски. Не требовать закрывать все чужие процессы MAME по общему шаблону: предотвращать конфликт только за конкретный изменяемый носитель/IPC-сеанс. Закрытие MAME не должно терять лог и снимки теста. ## Граница MAME и отладки В репозитории MAME держать точную базовую ревизию fork, stock сборку и патченный `sdbg` backend как явную ветку/патч с рецептом сборки. Локальный checkout уже имеет отдельный `.git` и remote `https://git.snark13.com/snark13/MAME.git`; переносить его как источник, не копировать `.git` внутрь нового репозитория тулкита. ROM, DSS, CHD, скачанные assets, исполняемые файлы и пользовательский state игнорировать. Инструкция установки создаёт стандартный `MAME_HOME`; она проверяет наличие/версию файлов, но не распространяет их через Git без отдельной проверки лицензий и источника. В Sprinter-CC остаются `--src-debug`, C/asm-карта, debug package, `toolchain/sdbg*`, Python DAP, launcher и Sprinter-специфичный плагин `sdbgbridge`. Приложение знает только debug build и свои файлы. Launcher принимает `MAME_HOME` и все переопределяемые пути из общего профиля; `-pluginspath`, IPC, ожидание DSS, установка точек и `sdbg` протокол — его внутренняя работа. Сочетание с родным окном MAME остаётся опцией: `osx` на macOS, `qt`/`imgui` на Linux по возможностям сборки. Stock MAME можно выбрать для поддержанного штатного backend; режим `sdbg` требует соответствующей патченной сборки и должен проверять её до запуска. Native Windows launch/attach пока не обещать: текущий host transport зависит от Unix sockets/`fcntl` и не прошёл полный Windows сценарий. Общий `mamebridge` и `mame_mcp.py` остаются с fork MAME, пока используются как общие инструменты MAME. Sprinter-специфичному `sdbgbridge` отдельный Git репозиторий сейчас не нужен: он версионируется с DAP-протоколом в SDK и загружается через `-pluginspath`. Текущий `toolchain/run-mame-mcp.sh` и `.codex/config.toml` убрать от предположения `mame/sources/MAME` внутри тулкита; для общего MCP использовать путь к установленному MCP-серверу MAME, а для Sprinter C-уровня — DAP/session server SDK. Зафиксировать версию протокола bridge и совместимость SDK ↔ MAME; несовпадение показывать как ошибку, а не как зависание отладки. Репозиторий VSCode-Sprinter содержит только extension и клиентские тесты. По умолчанию он обнаруживает DAP-инструмент из `SPRINTER_ROOT` либо получает явную настройку пути; не ищет `toolchain/sdbg_dap.py` в открытом workspace. Build task выполняет `make SRC_DEBUG=1 SPRINTER_ROOT=...` в каталоге приложения, F5 передаёт debug package, MAME-профиль и собственные data файлы адаптеру SDK. Поиск проектов не должен зависеть только от буквального `include $(PROJ_ROOT)/app.mk`: определить простой стабильный признак проекта или явный каталог в `launch.json`. Версии VSIX, SDK и поддержанной ревизии MAME документируются вместе; extension не копирует Python backend. ## Известные связи, которые нужно заменить | Сейчас | Замена и причина | |---|---| | Корневые `Makefile` и `app.mk` собирают examples/MAME и пишут общую floppy/HDD под `mame/v306` | В SDK оставить `make`/`size-check`/собственные тесты; упаковщик принимает выходной путь и MAME-профиль. Примеры собираются в Examples, MAME — в MAME. Удаление корневых целей без замены лишило бы пользователя привычного run: документировать новые команды и при необходимости оставить переходные targets с явной подсказкой. | | `make host-tests` SDK запускает `applications/SprPoP/tests/host` | Тесты игры вызываются из SprPoP по `SPRINTER_ROOT`; SDK тестирует только SDK. При этом общий `testkit` остаётся SDK. | | SprPoP `mame-link` меняет `MAME_HOME/IMG/test_hdd.chd` | `make run` передаёт `build/hdd/sprpop.chd` как `-hard2`; состояние установки MAME не меняется. | | Volkov `hdd-p5-viewer` собирает `examples/mdview2` | Перенести внутрь Volkov небольшой viewer fixture либо зафиксированный тестовый EXE/исходник с лицензией. Предпочтение — локальный fixture, потому что тест проверяет запуск дочерней программы, а не функциональность mdview2. Проверить, какие свойства реального viewer обязательны, перед заменой. | | Volkov `tests/run_mame_hdd.sh` и другие сценарии считают MAME `../../mame/v306` | Принять общие переменные MAME и локальный образ, не менять сценарные Lua-файлы без необходимости. | | PoP `roomtest`, `bgtest`, `poc` ищут собственные `toolchain/` и `SDLPoP` через корень SDK | Ввести `POP_ROOT`/`APP_ROOT` внутри PoP и локальные пути к референсам; общие SDK-инструменты оставить по `SPRINTER_ROOT`. Не переносить чужие источники и оригинальные игровые данные в Git. | | Examples Makefiles и `rpgwalk/conv_sprites.py` рассчитаны на `../..` и тулкитский `third_party/` | Подключать SDK по `SPRINTER_ROOT`, resource fixture держать рядом с примером либо получать по зафиксированному рецепту. | | `toolchain/mame_interactive.py`, `tests/sdbg/run_mame_probe.py`, `sdbg_launcher.py` выводят MAME из `PROJECT_ROOT` | Ввести общий профиль путей, локальные образы и явные аргументы; offline `sdbg-tests` не должен требовать MAME. | | `toolchain/make_release.sh` включает `examples/` в архив SDK, а README описывает общий диск | Выпускать Examples отдельно либо собирать составной release по зафиксированной версии Examples; сначала определить контракт релиза, затем изменить архив и обе документации. | | Исследовательские docs и код библиотек ссылаются на `applications/PoP/...` и `mame/sources/...` | Сохранять контекст исследования, но заменять рабочие инструкции и относительные ссылки ссылками на соответствующий репозиторий/revision. Архивные наблюдения не удалять. | ## История Git, внешние ресурсы и совместимость До выделения репозиториев инвентаризировать незакоммиченные/неотслеживаемые файлы в корне и отдельный dirty checkout MAME. Среди новых файлов сейчас находятся DAP, extension, MCP-плагин, MAME patch и документы: простое `git subtree split` по старому HEAD их потеряет. Сначала сохранить работу в подходящих коммитах/ветках или проверенных патчах; не сбрасывать и не перезаписывать пользовательские изменения. Затем выделить историю `examples/`, `applications/SprPoP/`, `applications/Volkov/` и PoP через `git subtree split` либо `git filter-repo`, проверяя состав каждого нового Git дерева. Для MAME использовать его существующую историю, а не историю родительского SDK, где `mame/` игнорируется. Новый `.gitignore` каждого проекта покрывает собственные `.exe`, объекты, debug packages, носители, снимки, внешние источники и секреты локального конфига. Не переносить автоматически вложенные сторонние `.git` как gitlinks или submodules. Для ресурсов, которые не входят в Git, указать источник, контрольную сумму/revision и способ восстановления; релиз и CI не должны молча зависеть от файлов конкретной машины. Если приложению нужен SDK с определённым ABI, фиксировать поддерживаемый релиз/commit SDK в его README или manifest, не пытаться угадывать его по соседнему каталогу. Во время перехода обеспечить минимальный период совместимости старой структуры: сначала добавить переменные и альтернативные пути, проверить старые вызовы, затем переносить деревья. После миграции убрать fallback на старые относительные пути и диагностировать устаревшие команды. Это не должно оставлять два параллельных способа записи в общий носитель. ## Порядок работ и критерии готовности 1. **Зафиксировать текущую базу.** Список tracked/untracked файлов, отдельный Git MAME, лицензии/внешние ресурсы, базовые результаты сборок и smoke-тестов. Сохранить незавершённую отладочную и прикладную работу. Критерий: никакой исходник не теряется при выделении истории. 2. **Стабилизировать контракт SDK.** В `app.mk` разделить build и run, реализовать `SPRINTER_ROOT`, `MAME_HOME` и переопределения, упаковку локального образа с проверкой `mtools`/`chdman`, общий профиль путей и диагностику отсутствующих файлов. Перевести автотесты/launcher без переноса дерева. Критерий: приложение собирается без MAME и запускается с нестандартным `MAME_BIN`/ROM/DSS/System HDD. 3. **Подготовить MAME отдельно.** Сохранить fork с точной baseline-revision, stock/sdbg сборки и проверенным способом подготовки `MAME_HOME`. Перенести MAME patch/общий MCP к их владельцу, проверить обоих провайдеров. Критерий: два бинарника существуют одновременно, ROM/CHD и state не коммитятся, patched DAP launch проверен. 4. **Выделить Examples.** Переписать относительные пути и источник RPG графики, определить формат релиза SDK+Examples. Критерий: каждый пример собирается из собственного клона Examples при одном `SPRINTER_ROOT`, локальные диски не затрагивают MAME или соседние проекты. 5. **Выделить приложения по одному.** Сначала SprPoP как наиболее близкий к автономному контракту, затем Volkov с локальным viewer fixture, затем архив PoP с его референсами. Переписать тесты и run-скрипты, сохраняя их документы и историю. Критерий: каждый продукт собирается и проходит доступные host/MAME проверки из изолированного клона без Examples и других приложений. 6. **Выделить extension.** Научить VS Code находить SDK DAP независимо от workspace, запускать build/run/debug приложения и показывать ошибки разрешения путей/версий. Проверить VSIX в отдельном workspace SprPoP или Volkov, а не только в `C-Compiler`. Критерий: F5 строит debug package, ждёт DSS, доходит до `main`, принимает breakpoint/logpoint и клавиатуру; опция родного окна MAME работает на macOS. Windows остаётся явно ограниченной до отдельной реализации host transport. 7. **Очистить SDK и документы.** Заменить корневые цели, release-скрипт, README, `AGENTS.md`, инструкции автотеста/отладки и рабочие ссылки. Проверить `make`, `make -C libc`, `make -C libbgi`, `make size-check`, SDK host/sdbg tests и отдельные проекты. Критерий: в SDK нет tracked приложений/примеров и игнорируемого вложенного MAME; инструкции используют новые пути, а архивные исследования остаются доступны. Каждый этап заканчивается проверкой в отдельном клоне и просмотром Git diff, а не одним успешным запуском в старом общем дереве. Реальные переносы, новые Git remote и публикация релизов выполняются отдельной задачей после согласования этого плана.