Files
Sprinter-SDCC/applications/Volkov/docs/commander-roadmap.md
T
snark13 8e389c03f8 Volkov: добавить Sprinter Commander
Реализовать двухпанельный Commander от платформенного PoC до этапов P6-P20: EMM-каталог, сортировку и выбор, операции с файлами и деревьями, транзакционное копирование, метаданные, политику конфликтов и предварительную проверку свободного места.

Добавить проектную документацию, HDD/MAME-сценарии и проверенные артефакты. Расширить libc операцией bank_write_page, исправлением режима O_RDONLY и связанными регрессионными проверками.
2026-09-10 10:45:30 +03:00

752 lines
42 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Sprinter Commander: план разработки
Статус: рабочий план
Связанные документы:
[требования](commander-requirements.md),
[архитектура](commander-architecture.md),
[клавиши и команды](commander-keymap.md),
[платформенные пробы P1](p1-platform-probes.md),
[экранный backend P2](p2-screen-backend.md),
[результаты P2.1](p2-screen-probe-results.md),
[результаты P2.2](p2-palette-results.md),
[результаты skeleton P2](p2-skeleton-results.md),
[результаты файловых панелей P3](p3-panel-results.md),
[результаты копирования P4.1](p4-copy-results.md),
[результаты запуска EXE P4.2](p4-exec-results.md),
[результаты P5](p5-stability-results.md),
[результаты F7/P9](p9-mkdir-results.md),
[результаты F6/P10](p10-rename-results.md),
[результаты F8/P11](p11-delete-results.md),
[результаты group-copy/P12](p12-group-copy-results.md),
[результаты group-delete/P13](p13-group-delete-results.md),
[результаты стандартных цветов/P14](p14-default-colors-results.md),
[результаты recursive copy/P15](p15-tree-copy-results.md),
[результаты recursive group-copy/P16](p16-group-tree-copy-results.md),
[результаты recursive group-delete/P17](p17-tree-delete-results.md),
[результаты сохранения метаданных/P18](p18-metadata-results.md),
[результаты conflict-policy/P19](p19-copy-policy-results.md),
[UI-ориентир VC](ui-reference.md)
Текущее состояние:
- P0 — завершена первая редакция документации;
- P1 — обязательные платформенные примитивы подтверждены в MAME 0.287;
проверка на реальном Sprinter ожидается;
- P2.1 — ядро координатного экранного backend прошло MAME 0.287;
- P2 — многоцветный двухпанельный skeleton прошёл полный MAME-сценарий,
включая scroll, диалоги и повторный cleanup; аппаратная проверка ожидается;
- P2.2 — системная многоцветная палитра прошла отдельный MAME-тест;
аппаратная проверка ожидается;
- P3 — реальные две панели, EMM-store с границей 640/641, сортировка,
навигация, синтетическая `..` и предел DSS 35 прошли диагностические и
интеграционные MAME-тесты; аппаратная проверка ожидается.
- P4 — безопасное однофайловое копирование через EMM/W3 и запуск `.EXE` с
полным восстановлением окружения прошли HDD-сценарии MAME; аппаратная
проверка ожидается.
- P5 — завершён в MAME: пройдены 20 последовательных copy со всеми граничными
размерами, 100 refresh, три lifecycle, ENOSPC, readonly, ошибки
read/rename/ENOENT, отмена перед commit, смена носителя, отсутствующий EXE и
реальный `mdview2`. Аппаратный smoke-тест остаётся внешней проверкой.
- 0.2 — начат: независимые сортировки name/ext/size/date и reverse, выбор
`Insert`, `*`, `+`/`-` с масками, F7 mkdir и локальный F6 rename
реализованы и прошли target/UI-сценарии MAME; следующим идёт расширение
файловой job и рекурсивная обработка каталогов. Групповые F5 и F8 уже
обрабатывают файлы и выбранные directory roots; для F8 каталоги удаляются
после файлов обратным проходом очереди. F5 сохраняет FAT date/time и
файловые атрибуты R/H/S/A. Conflict-policy overwrite/skip/rename и all,
readonly re-prompt, backup/rollback выполнены; P5/P18 повторно пройдены.
Также досрочно реализован стандартный fallback цветов имён без файла
конфигурации.
## 1. Целевые результаты
Проект делится на три продуктовых рубежа:
1. **PoC 0.1** — доказана работа архитектуры на Sprinter.
2. **Рабочая версия 0.4** — Commander пригоден для повседневных файловых
операций.
3. **Полная версия 1.0** — реализован основной набор возможностей VC 4.99 с
адаптацией к Sprinter.
Dos Navigator задаёт идеи для расширяемости, но не объём версии 1.0.
Вся линейка до 1.0 включительно использует одну EMM-страницу на панель и
жёсткий предел 640 показываемых записей. Его снятие — отдельная архитектурная
задача 2.0+.
## 2. Допущения для оценки
Оценки приведены для одного разработчика, знакомого с текущим Sprinter
C-Compiler и имеющего доступ к MAME. Один рабочий день означает день
сосредоточенной разработки, а не календарный день.
В оценку входят:
- реализация;
- целевые тесты;
- анализ `.asm`/`.map` при платформенной проблеме;
- MAME-прогон;
- обновление документации.
В оценку не входят:
- исправление неизвестных дефектов DSS;
- разработка отсутствующего архиватора;
- длительное ожидание доступа к реальному железу;
- перенос стороннего editor/viewer;
- создание графического режима интерфейса.
Ожидаемая точность оценки:
- PoC: `-20% / +40%`;
- этапы после PoC: `-25% / +60%`;
- архивы и editor: оцениваются повторно после исследования доступных программ.
## 3. Сводный план
| Этап | Результат | Оценка |
|---|---|---:|
| P0 | Спецификация и архитектура | 2–3 дня |
| P1 | Проверенные платформенные примитивы | 3–5 дней |
| P2 | Запускаемый двухпанельный skeleton | 45 дней |
| P3 | Полноценная навигация по двум панелям | 5–7 дней |
| P4 | Копирование одного файла и EXEC | 5–7 дней |
| P5 | Стабилизация PoC | 3–5 дней |
| 0.2 | Безопасное файловое ядро | 5–7 недель |
| 0.4 | Рабочая оболочка и внешние инструменты | 4–6 недель |
| 0.6 | Поиск, дерево и расширенные панели | 5–7 недель |
| 0.8 | Виртуальные источники и архивы | 6–10 недель |
| 1.0 | Надёжность, производительность, релиз | 5–8 недель |
PoC требует ориентировочно 22–32 рабочих дня. Полная версия 1.0 — примерно
29–44 рабочих недели с учётом PoC. После исследования P1 оценки должны быть
пересмотрены по фактической скорости разработки.
## 4. Зависимости этапов
```text
P0 documentation
|
v
P1 platform probes
|
+------> EXEC probe -------------------+
| |
v v
P2 app/screen/input skeleton P4 EXEC
| ^
v |
P3 panel/store/filesystem --------> P4 copy
| |
+------------------+-------------------+
v
P5 PoC hardening
|
v
0.2 safe file core
|
+----------+-----------+
v v
0.4 shell/helpers 0.6 search/tree
+----------+-----------+
v
0.8 virtual sources
|
v
1.0
|
v
2.0+ dynamic panel store
```
0.6 допускается начинать после стабилизации интерфейса панелей 0.2, но релиз
0.8 требует законченных 0.4 и 0.6.
## 5. Фаза P0 — проектирование
### Цель
Превратить общую идею Commander в набор контрактов, по которым можно писать
и проверять код без постоянного возврата к исходникам VC.
### Работы
- зафиксировать границы PoC и версии 1.0;
- определить компоновку экрана;
- определить `ScDirEntry`, `ScPanel`, события и команды;
- выбрать режим памяти и владение EMM;
- описать безопасное копирование;
- описать запуск дочерней программы;
- определить клавиши PoC и будущий keymap;
- составить acceptance tests;
- зафиксировать лицензионное правило для референсов.
### Артефакты
- `docs/commander-requirements.md`;
- `docs/commander-architecture.md`;
- `docs/commander-keymap.md`;
- `docs/commander-roadmap.md`.
### Критерий выхода
Нет неизвестного продуктового решения, мешающего начать платформенные тесты.
Непроверенные технические детали перечислены как задачи P1, а не скрыты в
предположениях архитектуры.
## 6. Фаза P1 — платформенные пробы
### Цель
Получить минимальные воспроизводимые программы для всех примитивов, от
которых зависит PoC.
### P1.1. Каталоги и пути
Проверить:
- `getcwd`, абсолютные и относительные пути;
- `chdir` между двумя каталогами и дисками;
- шаблон для перечисления всех файлов;
- возвращает ли DSS `.` и `..`;
- конец `fnext()` и значение `errno`;
- имя корня и переход к родителю;
- максимальную практическую длину пути;
- поведение при смене/отсутствии носителя.
Результат: таблица фактического поведения и тестовый `.exe`.
### P1.2. EMM
Проверить:
- выделение блока из трёх страниц;
- получение всех физических страниц;
- чтение/запись начала и конца каждой страницы;
- сохранение W3 вокруг `bank_read/bank_write`;
- повторное выделение/освобождение;
- понятную ошибку при нехватке памяти.
Результат: подтверждённая схема трёх страниц PoC.
### P1.3. Экран
На базе существующего теста `winrest` проверить app-local wrapper:
- полный экран 80x32;
- вывод с ненулевого offset;
- частичный диапазон строк;
- все используемые атрибуты;
- восстановление после смены видеорежима;
- сохранность IX и W3.
Результат: утверждённый ABI `sc_platform_winrest()`.
### P1.4. Клавиатура
Записать фактические `ascii`, `scan`, `kbd_mod_state` для клавиш из
`commander-keymap.md`. Отдельно проверить быстрое отпускание Ctrl после
`Ctrl+PgUp` и `Ctrl+R`.
Результат: тестовая таблица и список подтверждённых комбинаций.
### P1.5. EXEC
Проверить:
- формат параметров ESTEX `EXEC`;
- требуется ли отдельный `WAIT`;
- возврат к вызывающей программе;
- состояние W1/W2/W3 после возврата;
- состояние видеорежима и CWD;
- коды ошибок отсутствующего и повреждённого `.EXE`;
- взаимодействие с открытым загрузочным fd multi-bank программы.
Результат: app-local wrapper и отдельный repro.
### P1.6. Информация о диске и метаданные
`DSKINFO` подтверждён в P1. `ATTRIB`, получение и установка даты/времени не
блокируют базовый PoC и проверяются перед реализацией соответствующих
операций версии 0.2.
### Критерий выхода P1
- Все обязательные wrappers имеют воспроизводимый тест.
- Необъяснённых регистровых соглашений нет.
- Известно минимальное число требуемых страниц и fd.
- Архитектура обновлена по результатам проб.
Критерий достигнут для MAME 0.287 / BIOS 3.06. Подтверждены EMM, DSKINFO,
F_FIRST/F_NEXT, полный и частичный WINREST, клавиши PoC, EXEC обоих режимов,
WAIT=`0x5A`, восстановление W1/W2/W3 и повторный EMM-тест после child.
Фактические значения и скриншоты приведены в
[p1-platform-probes.md](p1-platform-probes.md).
Расширенные отрицательные случаи не блокируют skeleton P2 и перенесены к
этапам, где появится использующий их код:
- переходы между дисками, корень, длинный путь и смена носителя — P3/P5;
- исчерпание EMM — P5;
- отсутствующий/повреждённый EXE и multi-bank loader fd — P4/P5;
- ATTRIB и изменение даты/времени — версия 0.2.
## 7. Фаза P2 — skeleton приложения
### Цель
Получить запускаемое приложение с двумя пустыми панелями, экранной моделью и
управлением, но без чтения каталога.
### Работы
1. Создать `Makefile`, `src/`, `include/`, `banks/`, `tests/`.
2. Добавить `ScApp` и init/cleanup.
3. Настроить сборку `--memory big --safe`.
4. Выделить EMM-блок и получить три страницы.
5. Зафиксировать прошедший P2.1 coordinate-screen probe: полный и частичный
`WINREST`, `RDCHAR`, оба направления прямоугольного `SCROLL`, 1000
операций и сохранение W3.
6. Реализовать `sc_video_system` на `WINREST`/`WRCHAR`/`SCROLL`; не
использовать BIOS window descriptors и прямой доступ к VRAM.
7. Реализовать screen buffer и полный/частичный present через `sc_video`.
8. Добавить `sc_glyphs.h` с CP866-глифами и test рамок, стрелок и block-
элементов.
9. Реализовать прямоугольный scroll одной панели в обоих направлениях;
синхронно сдвигать экранную EMM-модель и проверять границы прямоугольника.
10. Нарисовать две панели и нижнюю строку клавиш.
11. Реализовать `ScKeyEvent`, `ScCommand` и главный цикл.
12. Реализовать `Tab`, навигационные команды-заглушки и подтверждение `F10`.
13. Добавить единый message dialog.
14. Настроить первый интерактивный MAME-тест со скриншотом.
15. Подключить прошедший P2.2 модуль темы: сохранить затрагиваемые записи
четырёх планов, задать одинаковые normal/FLASH-пары и восстановить их при
cleanup. Повторить тот же тест на реальном Sprinter.
### Критерий выхода P2
- `SPRCMD.EXE` собирается в `big`.
- Экран соответствует схеме 80x32.
- `Tab` меняет активную рамку.
- Однострочный scroll не двигает рамку, соседнюю панель и общие строки.
- Все соединения рамок, стрелки и block-элементы отображаются ожидаемыми
CP866-глифами.
- Экран остаётся читаемым во времени с подключённым многоцветным профилем.
- Диалог F10 работает в обоих направлениях.
- Выход освобождает EMM; повторные запуски не уменьшают свободную память.
- В `.map` есть зафиксированный запас HOME и банков.
MAME-часть этих критериев достигнута 6 сентября 2026 года. Текущий skeleton
имеет 7 276 байт heap в HOME, пока не использует W1-банки и дважды подряд
восстановил число свободных EMM-страниц после выхода. Отдельный `sc_theme`
сохранил/установил/восстановил четыре палитровых плана. Подробный сценарий и
кадры: [p2-skeleton-results.md](p2-skeleton-results.md).
Аппаратный прогон остаётся внешним gate. Многоцветная тема P2.2 прошла MAME;
на реальном Sprinter она проверяется вместе с остальными критериями P2.
## 8. Фаза P3 — панели и каталог
### Цель
Реализовать независимую навигацию по настоящей файловой системе.
### Работы
- `ScDirEntry` и build-time проверка размера 24 байта;
- EMM store get/put/clear;
- scan настоящего каталога;
- синтетический `..`;
- сортировка каталогов и файлов;
- panel renderer;
- cursor/top и постраничная навигация;
- вход в каталог, parent, refresh;
- сохранение позиции по имени;
- отдельные пути панелей;
- предупреждение о пределе 640 записей и отдельный красный маркер
ограничения DSS после ошибки 35;
- отображение ошибок носителя.
### Порядок реализации
1. Одна панель, маленький каталог.
2. Пустой каталог и корень.
3. Сортировка.
4. Прокрутка за 27 строк.
5. Вторая независимая панель.
6. Большой каталог и предел страницы.
7. Ошибки и восстановление CWD.
### Критерий выхода P3
- Выполнены `REQ-PANEL`, `REQ-NAV` и `REQ-FS` PoC.
- Сто переходов/refresh не меняют EMM free pages.
- Каталог на пределе не повреждает screen page.
- Перемещение курсора не вызывает `ffirst/fnext`.
- После ошибки обе панели остаются управляемыми.
## 9. Фаза P4 — копирование и запуск
### P4.1. Копирование
Порядок работ:
1. Проверка выбранной записи и построение путей.
2. Проверка отсутствия конечного имени.
3. Генерация temp с `O_EXCL`.
4. Зарезервировать четвёртую EMM-страницу как рабочую область copy job.
5. Добавить симметричные операции `bank_read_page()`/`bank_write_page()` для
файлового обмена через W3 без полноразмерного буфера в W2.
6. Копирование логическими блоками 4096 байт; возможное увеличение блока —
только после измерения отзывчивости и скорости.
5. 32-битный прогресс.
6. Отмена через `Esc`.
7. Cleanup на каждой точке ошибки.
8. Повторная проверка конечного имени.
9. Rename temp и refresh пассивной панели.
10. Тесты размеров и побайтовое сравнение.
### P4.2. EXEC
Порядок работ:
1. Запуск минимального дочернего `.EXE`.
2. Восстановление видеорежима и экрана.
3. Восстановление CWD.
4. Refresh панелей.
5. Обработка ошибки запуска.
6. Запуск существующего viewer как интеграционный тест.
### Критерий выхода P4
- Выполнены `REQ-COPY` и `REQ-EXEC`.
- Большой файл копируется без 16-битного переполнения.
- Cancel/error не оставляют temp.
- Существующий файл не изменяется.
- После дочерней программы Commander продолжает принимать команды.
## 10. Фаза P5 — стабилизация PoC 0.1
### Обязательная матрица
| Область | Сценарии |
|---|---|
| Каталог | пустой, один файл, 27/28, synthetic 640/641, DSS >512 физических записей |
| Навигация | границы, repeat, две разные глубины каталогов |
| Файлы | 0, 1, 4095, 4096, 65535, 65536, более 1 МБ |
| Ошибки | ENOENT, EACCES/readonly, ENOSPC, смена носителя |
| Copy cleanup | cancel в начале/середине/конце, ошибка read/write/rename |
| EXEC | успех, отсутствующий файл, плохой EXE, возврат с другим экраном |
| Ресурсы | 100 refresh, 20 copy, повторные запуск/выход |
| Экран | полный redraw, dirty rows, диалог, возврат из EXE |
### Артефакты релиза PoC
- `SPRCMD.EXE`;
- Makefile с `floppy`, `hdd` и `run`;
- MAME-тесты и контрольные скриншоты;
- test files с известными размерами/checksum;
- отчёт размеров HOME/банков;
- список известных ограничений;
- инструкция запуска.
### Release gate 0.1
Все десять критериев раздела 10 требований выполнены. Наличие известной
ошибки, способной повредить чужой файл или потерять EMM-блок, блокирует релиз.
Release gate выполнен в MAME 0.288 / BIOS 3.06 / DSS 1.71.57. Сводка,
команды воспроизведения и ограничения зафиксированы в
[p5-stability-results.md](p5-stability-results.md) и
[poc-0.1-release.md](poc-0.1-release.md). Проверка на реальном Sprinter не
подменяется MAME и остаётся обязательным последующим smoke-тестом.
## 11. Версия 0.2 — безопасное файловое ядро
### Цель
Сделать Commander пригодным для реальной работы с файлами без viewer/editor.
### Функции
- одна EMM-страница на панель и предел 640 записей сохраняются;
- `Insert`, `*`, `+`/`-` и маски выбора — выполнены;
- сортировки name/ext/size/date и reverse — выполнены и проверены в MAME;
- последовательная очередь выбранных файлов F5 — выполнена;
- рекурсивное копирование одного каталога и группы directory roots —
выполнено; traversal hardening для больших деревьев остаётся;
- F6 local rename — выполнено; межкаталожный/group move остаётся в работе;
- F7 mkdir — выполнено и проверено в MAME;
- F8 single file/empty-directory delete и recursive group delete выбранных
файлов и каталогов — выполнены, включая runtime-cancel; защитная policy
остаётся;
- cancel между файлами и блоками;
- overwrite/skip/rename и варианты all — выполнены для файлов, включая
backup/rollback и readonly re-prompt; merge существующих каталогов позже;
- проверка свободного места;
- сохранение даты, времени и атрибутов обычных файлов — выполнено и
проверено exact FAT-тестом; метаданные каталогов не входят в P18;
- защита readonly при overwrite — выполнена; delete/move policy остаётся;
- подсчёт итогов выбранной группы;
- переключение дисков минимум через диалог.
### Внутренние работы
- сохранить одностраничный store и добавить к `ScPanel` ключ и направление сортировки;
- расширить `ScJob` очередью и стеком каталогов;
- сохранить crash-safe temp/commit модель;
- добавить единый policy object для ошибок;
- определить поведение при частично успешной группе.
### Критерий выхода 0.2
- Неделя dogfood без повреждения данных.
- Рекурсивные операции проходят дерево глубиной не менее 16 уровней.
- Рекурсивная job обрабатывает более 640 файлов суммарно в нескольких
каталогах, не превращая саму панель в многостраничную.
- Cancel оставляет уже завершённые файлы в определённом документированном
состоянии и не оставляет temp.
- Все разрушительные команды требуют подтверждения.
## 12. Версия 0.4 — рабочая оболочка
### Функции
- однострочная командная строка;
- история команд и каталогов;
- интерактивный полноэкранный pseudo-shell по `Ctrl+O`;
- вставка имени/пути активной и пассивной панели;
- запуск `.EXE` с параметрами;
- file associations;
- пользовательское меню;
- F3 через отдельный viewer;
- F4 через отдельный editor;
- F9 и базовое меню;
- режимы панелей `Brief`/`Details` по образцу VC;
- конфигурационный файл;
- сохранение путей, sort mode и палитры;
- цветовые правила по расширениям; без файла: каталоги белые, EXE жёлтые,
остальные файлы светло-серые;
- `Ctrl+U`, `Ctrl+O`, root;
- полноценный drive dialog;
- краткая встроенная помощь.
### Протокол helper-программ
До реализации F3/F4 фиксируется небольшой контракт:
- полный путь передаётся аргументом;
- код возврата различает успех, отмену и ошибку;
- helper не обязан восстанавливать экран;
- Commander всегда восстанавливает режим и перечитывает затронутую панель;
- для editor предусматривается признак изменения файла.
### Критерий выхода 0.4
Commander можно использовать как основную оболочку DSS для навигации,
операций, запуска программ, просмотра и редактирования файлов.
## 13. Версия 0.6 — возможности VC-класса
### Функции
- quick search по текущей панели;
- постоянные фильтры/маски панели;
- quick-view panel;
- info panel;
- размеры каталогов;
- сравнение каталогов;
- поиск файлов по имени;
- поиск текста в файлах, если скорость приемлема;
- виртуальная панель результатов поиска;
- дерево каталогов;
- история посещённых каталогов;
- descriptions (`description.ion`/настраиваемое имя), если формат выбран;
- изменение атрибутов и времени через UI.
### Архитектурный gate
Перед началом поиска должен быть стабилен интерфейс `ScSource`. Результаты
поиска не должны притворяться настоящим каталогом с помощью специальных
проверок по всему UI: они реализуются как отдельный source kind.
### Критерий выхода 0.6
Поиск и дерево работают на объёмах, превышающих near-memory, а возврат из
виртуальной панели не теряет прежнее состояние настоящей панели.
## 14. Версия 0.8 — виртуальные источники и архивы
### Обязательные исследования
- какие архиваторы реально существуют для Sprinter;
- можно ли получить листинг без распаковки;
- достаточно ли внешнего процесса и list-файла;
- какие форматы стоит поддерживать первыми;
- сколько памяти требует нативный decoder;
- разрешает ли лицензия включать выбранную реализацию.
### Предпочтительная последовательность
1. Внешний архиватор по шаблону команды.
2. Просмотр архива как read-only `SC_SOURCE_ARCHIVE`.
3. Извлечение выбранных файлов.
4. Копирование файла в архив, если внешний инструмент поддерживает.
5. Только затем — нативный decoder для одного востребованного формата.
### Дополнительные функции
- мышь;
- локализация строк через resource file;
- расширенная помощь;
- bookmarks;
- protocol внешних plugin/helper-программ;
- сохранённые наборы конфигурации.
### Критерий выхода 0.8
Архивная и поисковая панели используют тот же panel UI без специальных
ветвей в renderer и навигации. Ошибка внешнего архиватора не повреждает
исходный архив.
## 15. Версия 1.0 — релизная стабилизация
К этому этапу уже должны быть закончены все назначенные функции 0.2–0.8.
Отдельно проверяются три обязательных релизных контракта:
- командная строка и интерактивный полноэкранный pseudo-shell по `Ctrl+O`;
- сортировка каждой панели по имени, расширению, размеру и дате, по
возрастанию и убыванию;
- подсветка по типу файла с настраиваемыми цветами и заданным поведением
при отсутствии конфигурации.
Предел панели 640 записей в 1.0 остаётся штатным документированным
ограничением.
### Надёжность
- проверка всех cleanup-path;
- защита от двойного освобождения;
- тесты нехватки EMM;
- тесты предела файловых дескрипторов;
- смена и извлечение носителя;
- read-only и disk full;
- повреждённые каталоги/архивы;
- отмена каждой длительной операции;
- безопасное обновление конфигурации через temp/rename.
### Производительность
- профилирование чтения больших каталогов;
- профилирование сортировок EMM;
- минимизация переключений W3;
- группировка dirty rows;
- размер блока copy по фактическим измерениям;
- размер HOME и каждого банка;
- время холодного запуска и возврата из helper.
### Совместимость
- MAME 0.287 / BIOS 3.06;
- реальный Sprinter Sp2000;
- DSS 1.71.57;
- floppy и HDD;
- минимум две конфигурации доступной EMM;
- CP866 и Rus/Lat состояние клавиатуры.
### Документация релиза
- руководство пользователя;
- полный keymap;
- описание конфигурации;
- восстановление после прерванной операции;
- ограничения файловой системы;
- лицензии и благодарности;
- руководство сборки;
- архитектурная памятка для добавления source/job/bank.
### Release gate 1.0
- Нет известных дефектов потери или скрытой порчи данных.
- Все обязательные функции требований 1.0 реализованы; перенос любой из них
требует нового явного решения о составе релиза.
- Пройдены автоматические MAME-тесты и ручной hardware checklist.
- Размеры HOME/банков имеют документированный запас.
- Чистая сборка воспроизводима штатной командой проекта.
## 16. Версия 2.0+
Первый архитектурный рубеж после 1.0 — просмотр каталогов, содержащих более
640 записей. Перед реализацией сравниваются два варианта.
**Вариант A: потоковые логические страницы.** Рекомендуемый первый шаг:
- в EMM по-прежнему находится только текущая страница и не более 640 строк;
- виртуальные `<<< PAGE n` и `>>> PAGE n` занимают места в этом лимите;
- при переходе каталог сканируется заново до требуемой логической позиции;
- каталоги и файлы отбираются двумя проходами, чтобы каталоги оставались
первыми во всём потоке;
- сортировка выполняется только внутри текущей страницы и так обозначается
в UI;
- изменение каталога между проходами сбрасывает просмотр на первую страницу.
Текущий DSS API `F_FIRST/F_NEXT` не принимает ключ или направление
сортировки. Незавершённые итераторы двух панелей не сохраняются: каждый
переход заканчивает перебор либо начинает новый.
Платформенная предпосылка варианта A: стабильный DSS 1.71 не умеет перейти
за 512-ю физическую FAT-запись и возвращает код 35. Потоковые страницы
становятся реализуемыми только после перехода на расширенный режим
`F_FIRST` (`B=0x80/0x81`) из экспериментальной ветки `beta_cdfs` либо после
эквивалентного исправления DSS. До этого `>>> MORE...` является только
информирующим маркером, а не переходом на страницу 2. Детали:
[dss-large-directories.md](dss-large-directories.md).
**Вариант B: динамический EMM-store.** Он нужен, только если потребуются
глобальная сортировка и произвольный переход между страницами:
- выбор модели 1024, 2048 или динамического предела по результатам замеров;
- выделение и освобождение динамической цепочки EMM-страниц;
- межстраничная сортировка или индекс без полной копии списка в W2;
- определённое поведение при нехватке EMM на части каталога;
- нагрузочные тесты многостраничных списков и отмены во время scan/sort.
Для обоих вариантов виртуальные записи имеют отдельный тип и не участвуют в
выделении, файловых операциях и сортировке. Точный номер версии после 1.0
фиксируется отдельным release gate; базовый релиз 1.0 от этого не зависит.
Прочий backlog, не влияющий на релиз 1.0:
- нативные архивные codecs;
- FTP/serial/network source при наличии транспорта;
- disk image source;
- сравнение и синхронизация деревьев;
- макросы;
- очередь нескольких jobs;
- background copy, только если появится безопасная модель многозадачности;
- интеграция viewer/editor в банки Commander;
- дополнительные режимы экрана.
DOS-специфические функции DN — CD player, modem terminal, disk recovery,
spreadsheet, games и desktop окон — остаются отдельными приложениями.
## 17. Правило изменения плана
После каждого release gate обновляются:
1. Фактическое время этапа.
2. Размер HOME и банков.
3. Число обязательных EMM-страниц.
4. Открытые платформенные риски.
5. Состав следующей версии.
Новая функция не добавляется в текущий этап без одного из решений:
- она устраняет блокирующий риск текущего release gate;
- она дешевле сейчас из-за уже изменяемого интерфейса;
- другая функция того же объёма явно исключается из этапа.
Такой обмен фиксируется в этом документе, чтобы PoC и 1.0 не расширялись
неуправляемо.