# Sprinter Commander: групповое копирование файлов 0.2/P12 Дата: 9 сентября 2026 года. Статус: `PASS` в MAME 0.288 / BIOS 3.06 / DSS 1.71.57 на HDD `D:`. Примечание: документ фиксирует исторический срез P12, где directory roots ещё пропускались. Начиная с P16 текущий F5 копирует их рекурсивно; fixture и checker P12 обновлены как регрессия нового контракта, а исходные кадры ниже оставлены для истории этапа. ## Контракт первого группового среза Если в активной панели нет выбора, F5 сохраняет проверенное поведение однофайлового PoC. При ненулевом выборе F5: 1. Считает выбранные обычные файлы и отдельно выбранные каталоги. 2. Последовательно копирует только файлы в порядке текущей сортировки панели. 3. Для каждого файла использует прежний crash-safe `temp -> commit` и общую 4-КБ EMM-страницу W3. 4. Проверяет Esc между блоками и файлами. 5. При cancel/error удаляет только незавершённый temp; уже завершённые файлы сохраняются. 6. Останавливается на первой ошибке и сообщает `copied/total`, число пропущенных каталогов и errno. 7. Перечитывает passive panel один раз после завершённых копий. Выбранные каталоги намеренно игнорируются до появления рекурсивной job. Это не меняет их флаг выбора и согласуется с правилом: групповые `+`, `-`, `*` работают только над файлами. Overwrite по-прежнему запрещён. Повторный запуск поверх уже скопированных файлов останавливается на первом `EEXIST`; существующие targets не меняются. ## Проверка HDD-fixture содержит выбранный вручную `ADIR` и три файла размером 10, 4097 и 0 байт. После первого F5 внешний checker подтверждает три побайтно точные копии, отсутствие каталога и temp. Второй F5 проверяет управляемую остановку на существующем `A.BIN`. ```text PASS: 3 selected files copied; selected directory skipped; no temp. ``` Контрольные состояния: - [каталог и три файла выбраны](../artifacts/mame-p12/group-copy/selected-files-and-dir.png); - [скопировано 3/3, один каталог пропущен](../artifacts/mame-p12/group-copy/copied-and-skipped-dir.png); - [повтор остановлен на EEXIST](../artifacts/mame-p12/group-copy/repeat-stops-eexist.png); - [passive panel перечитана](../artifacts/mame-p12/group-copy/passive-refreshed.png); - [штатный возврат в DSS](../artifacts/mame-p12/group-copy/clean-dss-return.png). ## Компоновка и размер Конфигурация `--memory big --safe --max-allocs 3000`: | Область | После P11 | После P12 | Изменение | |---|---:|---:|---:| | `_CODE` W2 | 9496 | 9496 | 0 | | данные W2 | 3256 | 3256 | 0 | | свободная куча W2 | 2096 | 2096 | 0 | | BANK1 | 6477 | 6477 | 0 | | BANK2 | 10942 | 12256 | +1314 | | `SPRCMD.EXE` | 43073 | 43073 | 0 | Пробный перенос обработчика в новый BANK3 увеличивал EXE ровно на 16384 байта при 2823 байтах полезного кода. Поэтому P12 оставлен в BANK2: там ещё 4128 байт запаса, а размер файла не вырос. Межбанковый аудит чист. ## Воспроизведение ```sh make hdd-p12-group-copy ALLOCS=3000 tests/run_mame_hdd.sh build/hdd/p12_group_copy.chd \ tests/mame_p12_group_copy.lua artifacts/mame-p12/local 57 tests/check_p12_group_copy_hdd.sh build/hdd/p12_group_copy.chd ```