8e389c03f8
Реализовать двухпанельный Commander от платформенного PoC до этапов P6-P20: EMM-каталог, сортировку и выбор, операции с файлами и деревьями, транзакционное копирование, метаданные, политику конфликтов и предварительную проверку свободного места. Добавить проектную документацию, HDD/MAME-сценарии и проверенные артефакты. Расширить libc операцией bank_write_page, исправлением режима O_RDONLY и связанными регрессионными проверками.
99 lines
5.5 KiB
Markdown
99 lines
5.5 KiB
Markdown
# Sprinter Commander: сортировки 0.2/P6
|
|
|
|
Дата: 8 сентября 2026 года.
|
|
|
|
Статус: `PASS` в MAME 0.288 / BIOS 3.06 / DSS 1.71.57 на HDD `D:`.
|
|
|
|
## Реализация
|
|
|
|
Каждая `ScPanel` хранит собственные `sort_key` и `sort_descending`. Доступны
|
|
четыре ключа:
|
|
|
|
| Комбинация | Ключ |
|
|
|---|---|
|
|
| `Ctrl+F3` | имя |
|
|
| `Ctrl+F4` | расширение |
|
|
| `Ctrl+F5` | дата и время last-write |
|
|
| `Ctrl+F6` | размер |
|
|
|
|
Выбор другого ключа включает прямой порядок; повтор текущей комбинации меняет
|
|
направление. На нижней рамке каждой панели постоянно виден режим `N/E/D/S` и
|
|
знак `+`/`-`. Refresh и переходы в каталог используют сохранённый режим этой
|
|
же панели.
|
|
|
|
Порядок групп не зависит от reverse: синтетический `..` всегда первый,
|
|
затем идут каталоги, затем обычные файлы, а красный маркер ограничения DSS
|
|
остаётся последним. Направление применяется только внутри групп. При равном
|
|
основном ключе детерминированным вторичным ключом служит имя без учёта регистра.
|
|
Дата сравнивается как FAT date, затем FAT time; отдельная creation date не
|
|
имитируется, потому что текущий `F_FIRST/F_NEXT` возвращает last-write.
|
|
|
|
Shell sort по-прежнему работает непосредственно с 24-байтовыми записями EMM
|
|
через `sc_store_get/put` и не сохраняет указатели W3. Выбранная запись после
|
|
пересортировки находится по имени; cursor/top нормализуются без повторного
|
|
сканирования каталога.
|
|
|
|
## Автоматическая проверка
|
|
|
|
`SORTRT.EXE` заполняет две разные EMM-страницы намеренно перемешанными
|
|
записями и пишет `SORTRES.TXT`. Посмертный валидатор подтвердил:
|
|
|
|
```text
|
|
PASS: 4 sort keys, reverse, fixed groups, selection, two panels.
|
|
```
|
|
|
|
Проверяются восемь точных порядков, неизменность `..` и `>>> MORE...`,
|
|
сохранение `BETA.TXT` под курсором и отсутствие влияния режима первой панели
|
|
на вторую.
|
|
|
|
Затем тот же MAME-сценарий запускает Commander, открывает `SORTL` и `SORTR`,
|
|
подаёт реальные `Ctrl+F3..F6`, переключает активную панель и делает refresh.
|
|
Два полных UI-прогона дали побайтно одинаковые контрольные кадры.
|
|
|
|
- [name ascending](../artifacts/mame-p6/sort/name-ascending.png);
|
|
- [extension ascending](../artifacts/mame-p6/sort/extension-ascending.png);
|
|
- [extension descending](../artifacts/mame-p6/sort/extension-descending.png);
|
|
- [size ascending](../artifacts/mame-p6/sort/size-ascending.png);
|
|
- [size descending](../artifacts/mame-p6/sort/size-descending.png);
|
|
- [date ascending](../artifacts/mame-p6/sort/date-ascending.png);
|
|
- [date descending](../artifacts/mame-p6/sort/date-descending.png);
|
|
- [left `S-`, right `E+`](../artifacts/mame-p6/sort/independent-panels.png);
|
|
- [refresh сохранил `E+`](../artifacts/mame-p6/sort/refresh-keeps-mode.png);
|
|
- [штатный cleanup](../artifacts/mame-p6/sort/clean-dss-return.png).
|
|
|
|
В текущем общем HDD-builder файлы fixture получают одинаковую дату при
|
|
копировании дерева, поэтому точный порядок date проверяет target-проба;
|
|
UI-сценарий независимо подтверждает доставку `Ctrl+F5`, оба состояния `D+/-`
|
|
и обратный redraw. Этот предел fixture не выдаётся за проверку разных FAT-дат
|
|
по скриншоту.
|
|
|
|
## Размер
|
|
|
|
Конфигурация `--memory big --safe --max-allocs 3000`:
|
|
|
|
| Область | P5 | После сортировок | Изменение |
|
|
|---|---:|---:|---:|
|
|
| `_CODE` W2 | 8870 | 9125 | +255 |
|
|
| данные W2 | 3240 | 3244 | +4 |
|
|
| свободная куча W2 | 2738 | 2479 | -259 |
|
|
| BANK1 | 4242 | 5137 | +895 |
|
|
| BANK2 | 5973 | 6053 | +80 |
|
|
| `SPRCMD.EXE` | 42447 | 42702 | +255 |
|
|
|
|
Рост BANK1 содержит компараторы и сохранение выбора, W2 — команды и один
|
|
банковый вызов. Первоначальный вариант с восемью статусными строками давал
|
|
рост W2 на 736 байт и был сокращён до общего статуса плюс компактный индикатор
|
|
на рамке. Межбанковый аудит финальной сборки чистый.
|
|
|
|
## Воспроизведение
|
|
|
|
```sh
|
|
make hdd-p6-sort ALLOCS=3000
|
|
tests/run_mame_hdd.sh build/hdd/p6_sort.chd \
|
|
tests/mame_p6_sort.lua artifacts/mame-p6/local 90
|
|
tests/check_p6_sort_hdd.sh build/hdd/p6_sort.chd
|
|
```
|
|
|
|
Перед запуском требуется убедиться, что другого MAME Sprinter нет;
|
|
`run_mame_hdd.sh` выполняет эту проверку.
|