Volkov: добавить Sprinter Commander
Реализовать двухпанельный Commander от платформенного PoC до этапов P6-P20: EMM-каталог, сортировку и выбор, операции с файлами и деревьями, транзакционное копирование, метаданные, политику конфликтов и предварительную проверку свободного места. Добавить проектную документацию, HDD/MAME-сценарии и проверенные артефакты. Расширить libc операцией bank_write_page, исправлением режима O_RDONLY и связанными регрессионными проверками.
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
# 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
|
||||
```
|
||||
Reference in New Issue
Block a user