docs: описать разделение тулкита, MAME и приложений
This commit is contained in:
@@ -0,0 +1,251 @@
|
||||
# Разделение 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 и публикация релизов выполняются отдельной задачей после
|
||||
согласования этого плана.
|
||||
Reference in New Issue
Block a user