Реализовать двухпанельный Commander от платформенного PoC до этапов P6-P20: EMM-каталог, сортировку и выбор, операции с файлами и деревьями, транзакционное копирование, метаданные, политику конфликтов и предварительную проверку свободного места. Добавить проектную документацию, HDD/MAME-сценарии и проверенные артефакты. Расширить libc операцией bank_write_page, исправлением режима O_RDONLY и связанными регрессионными проверками.
8.9 KiB
Sprinter Commander: результаты файловых панелей P3
Дата: 7 сентября 2026 года.
Статус: PASS в MAME для навигации, независимых панелей, EMM-store на
границе 640/641, сортировки и явной обработки предела каталога DSS 1.71.
Связанные документы: требования, архитектура, roadmap, большие каталоги DSS
1. Проверенная граница
В P3 синтетические записи заменены настоящим источником F_FIRST/F_NEXT.
Каждая панель имеет собственные путь, cursor/top и физическую EMM-страницу.
Запись панели занимает 24 байта, поэтому одна 16-КБ страница вмещает
жёсткий продуктовый предел 640 записей и оставляет 1024 байта запаса.
Реализованы и проверены:
- шаблон перечисления
*.*и имена DOS 8.3; - синтетическая
..в некорневом каталоге без дублей./..от DSS; - каталоги перед файлами и сортировка имён без учёта регистра ASCII;
- вход в каталог, возврат через
../Ctrl+PgUp, refresh и независимость пассивной панели; - навигация
Up/Down/PgUp/PgDn/Home/Endбез повторного scan; - частичный результат при ошибке DSS 35 и отдельная виртуальная запись
>>> MORE....
2. Сборка
Основная команда: make.
Конфигурация: --memory big --safe --max-allocs 3000.
| Область | Значение |
|---|---|
_CODE |
7728 байт (0x8100..0x9F30) |
| данные | 2281 байт (конец 0xA819) |
| свободная куча W2 | 4839 байт |
| стек | 1279 байт |
_BANK1 — scan/sort |
2299 / 16384 байт (14,0%) |
_BANK2 — renderer |
2902 / 16384 байт (17,7%) |
| EXE | 41305 байт |
check_bank_calls.py не нашёл прямых вызовов в чужой банк или публикации
указателей на данные банка.
3. Прямая диагностика DSS
Образ содержит BIGDIR из 680 обычных файлов. Исправленная проба P3DIR
получила:
count=512
errno=35
511=B0000598.DAT
512=B0000599.DAT
513=
Это подтверждает границу стабильного DSS и отсутствие продолжения за ней.
Конкретные последние имена отражают физический порядок записей, созданный
mcopy, и сами по себе не являются контрактом теста.
Артефакт: экран P3DIR.
4. Диагностика общего пути Commander
Проба P3SCAN использует те же sc_source_fs, sc_store и sc_sort, что
основная программа. Получен результат:
scan: rc=0 errno=35 count=512 trunc=1
first: .. attr=10 flags=01
last : >>> MORE... attr=00 flags=04
Ошибка 35 сознательно остаётся в errno как причина усечения, но scan
возвращает успешный частичный снимок. Красный маркер занимает последний
элемент снимка и сортируется после файлов.
Артефакт: экран P3SCAN.
5. Интеграционный сценарий Commander
Исторические артефакты ниже сняты в MAME 0.287 с FDD A:. Текущий
регрессионный сценарий предельного каталога переведён на HDD D::
make hdd-stress создаёт build/hdd/p3_stress.chd, а
tests/mame_p3_stress.lua сначала переключает DSS на D:. FDD-сборщик
tests/make_p3_stress_floppy.sh оставлен только для smoke-совместимости.
| Действие | Подтверждённое наблюдение | Результат |
|---|---|---|
| Корень | обе панели независимо открыли один реальный каталог | PASS |
Вход и .. |
левая панель вошла в TESTDIR и вернулась в корень |
PASS, возврат |
Ctrl+R |
после refresh сохранён выбор INNER.TXT |
PASS |
Tab и навигация справа |
пути и cursor/top панелей не смешиваются | PASS |
Ctrl+PgUp слева |
изменена только активная левая панель | PASS |
Вход в EMPTY |
единственная запись — синтетическая .., count=1 |
PASS |
Вход в MANY, PgDn, Down |
cursor/top меняются до 28/2 без rescan, рамки и соседняя панель сохраняются | PASS |
Вход в BIGDIR |
показан частичный снимок, count=512 и признак entries+ |
PASS |
End |
выбран последний красный >>> MORE..., info показывает <DSS LIMIT> |
PASS |
Enter на маркере |
выведено сообщение о недоступном остатке DSS; переход или EXEC не выполнен | PASS |
F10 |
открыт диалог выхода поверх текущего состояния | PASS |
Enter в диалоге |
выполнен cleanup и возврат в A:\> |
PASS |
Скриншот фиксирует только состояние изображения в конкретный момент и не используется в одиночку для вывода о причине возможного дефекта. Подозрение на ошибку должно дополнительно подтверждаться соседними кадрами, ожидаемым состоянием сценария и, при необходимости, отдельной диагностической пробой.
6. Синтетическая граница EMM-store
Проба tests/p3_store_probe/p3store.c не вызывает DSS и поэтому достигает
продуктового предела, который нельзя получить из реального каталога DSS
1.71. Сборка выполнена с --max-allocs 3000.
entry=24 capacity=640 bytes=15360 reserve=1024
write: count=640 first=1 middle=1 last=1
guard: put640=1 get640=1 tail=1
cleanup: free_after=222 restored=1
PASS: store boundary is intact.
Проверены записи 0, 319 и 639. Запись и чтение индекса 640 отклонены, байты в начале и конце 1024-байтового резерва не изменились, EMM-страница освобождена без утечки.
Артефакт: граница 640/641.
7. Итог и следующая граница
Функциональный gate файловых панелей P3 закрыт в MAME. Аппаратный прогон на реальном Sprinter ещё нужен, но не блокирует начало P4.
Следующая работа PoC:
- копирование одного файла через отдельную EMM-страницу в W3;
- безопасный временный файл, обработка ошибок и cleanup;
- запуск
.EXEчерез ESTEX с восстановлением экрана после child; - регрессионный MAME-сценарий для копирования, файлов больше 64 КБ и EXEC.