Volkov: добавить Sprinter Commander

Реализовать двухпанельный Commander от платформенного PoC до этапов P6-P20: EMM-каталог, сортировку и выбор, операции с файлами и деревьями, транзакционное копирование, метаданные, политику конфликтов и предварительную проверку свободного места.

Добавить проектную документацию, HDD/MAME-сценарии и проверенные артефакты. Расширить libc операцией bank_write_page, исправлением режима O_RDONLY и связанными регрессионными проверками.
This commit is contained in:
2026-09-10 10:45:30 +03:00
parent 05bcd8197e
commit 8e389c03f8
870 changed files with 21310 additions and 25 deletions
@@ -0,0 +1,72 @@
# Sprinter Commander: рекурсивный group F5 0.2/P16
Дата: 9 сентября 2026 года.
Статус: `PASS` в MAME 0.288 / BIOS 3.06 / DSS 1.71.57 на HDD `D:`.
## Реализованный контракт
При групповом F5 Commander сначала последовательно копирует выбранные файлы,
а затем добавляет все выбранные каталоги текущего уровня как независимые
roots в одну traversal queue P15. Для каждого root действует тот же контракт:
- breadth-first обход и пустые каталоги;
- crash-safe temp/commit для файлов;
- cancel между файлами, каталогами и 4-КБ блоками;
- no-overwrite и self-target guard;
- один динамический EMM-блок очереди на всю группу;
- один refresh passive panel после операции.
Если top-level файл даёт ошибку или cancel до запуска обхода, directory roots
остаются `unprocessed`. При ошибке одного tree root операция останавливается;
уже committed-файлы и созданные каталоги сохраняются.
Это не меняет семантику `+`, `-`, `*`: групповые команды выделения по-прежнему
игнорируют каталоги. Каталог может попасть в F5-группу только после отдельного
`Insert`.
## Проверка
В active panel вручную выбраны `ADIR`, `BDIR` и `ROOT.BIN`; `KEEP.TXT`
оставлен невыбранным. Два root-каталога содержат по файлу, а `ADIR` — ещё и
пустой вложенный каталог. UI сообщил:
```text
Tree copied: 3 files; 3 dirs.
```
Внешний checker сравнил target с точным ожидаемым множеством и подтвердил
отсутствие `KEEP.TXT` и temp:
```text
PASS: selected file and two directory roots copied exactly.
```
Контрольные состояния:
- [два каталога и файл выбраны](../artifacts/mame-p16/group-tree/selected-roots.png);
- [группа скопирована](../artifacts/mame-p16/group-tree/copied.png);
- [passive panel перечитана](../artifacts/mame-p16/group-tree/passive-refreshed.png);
- [чистый возврат в DSS](../artifacts/mame-p16/group-tree/clean-dss-return.png).
## Компоновка
`_CODE` W2, DATA, BANK1 и размер EXE не изменились относительно P15. BANK2
вырос с 14547 до 14918 байт (+371); остаётся 1466 байт. Итоговая сборка:
```text
_CODE 9503; DATA 3524; heap 1821
BANK1 9687/16384; BANK2 14918/16384
SPRCMD.EXE 43080
```
Межбанковый аудит чист.
## Воспроизведение
```sh
make hdd-p16-group-tree-copy ALLOCS=3000
tests/run_mame_hdd.sh build/hdd/p16_group_tree_copy.chd \
tests/mame_p16_group_tree_copy.lua artifacts/mame-p16/local 60
tests/check_p16_group_tree_copy_hdd.sh build/hdd/p16_group_tree_copy.chd
```