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