Реализовать двухпанельный Commander от платформенного PoC до этапов P6-P20: EMM-каталог, сортировку и выбор, операции с файлами и деревьями, транзакционное копирование, метаданные, политику конфликтов и предварительную проверку свободного места. Добавить проектную документацию, HDD/MAME-сценарии и проверенные артефакты. Расширить libc операцией bank_write_page, исправлением режима O_RDONLY и связанными регрессионными проверками.
4.5 KiB
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:
- Считает выбранные обычные файлы и отдельно выбранные каталоги.
- Последовательно копирует только файлы в порядке текущей сортировки панели.
- Для каждого файла использует прежний crash-safe
temp -> commitи общую 4-КБ EMM-страницу W3. - Проверяет Esc между блоками и файлами.
- При cancel/error удаляет только незавершённый temp; уже завершённые файлы сохраняются.
- Останавливается на первой ошибке и сообщает
copied/total, число пропущенных каталогов и errno. - Перечитывает passive panel один раз после завершённых копий.
Выбранные каталоги намеренно игнорируются до появления рекурсивной job. Это
не меняет их флаг выбора и согласуется с правилом: групповые +, -, *
работают только над файлами.
Overwrite по-прежнему запрещён. Повторный запуск поверх уже скопированных
файлов останавливается на первом EEXIST; существующие targets не меняются.
Проверка
HDD-fixture содержит выбранный вручную ADIR и три файла размером 10, 4097
и 0 байт. После первого F5 внешний checker подтверждает три побайтно точные
копии, отсутствие каталога и temp. Второй F5 проверяет управляемую остановку
на существующем A.BIN.
PASS: 3 selected files copied; selected directory skipped; no temp.
Контрольные состояния:
- каталог и три файла выбраны;
- скопировано 3/3, один каталог пропущен;
- повтор остановлен на EEXIST;
- passive panel перечитана;
- штатный возврат в DSS.
Компоновка и размер
Конфигурация --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 байт запаса, а размер файла не вырос. Межбанковый аудит чист.
Воспроизведение
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