Volkov: добавить Sprinter Commander

Реализовать двухпанельный Commander от платформенного PoC до этапов P6-P20: EMM-каталог, сортировку и выбор, операции с файлами и деревьями, транзакционное копирование, метаданные, политику конфликтов и предварительную проверку свободного места.

Добавить проектную документацию, HDD/MAME-сценарии и проверенные артефакты. Расширить libc операцией bank_write_page, исправлением режима O_RDONLY и связанными регрессионными проверками.
This commit is contained in:
2026-09-10 10:45:30 +03:00
parent 05bcd8197e
commit 8e389c03f8
870 changed files with 21310 additions and 25 deletions
@@ -0,0 +1,751 @@
# 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 не расширялись
неуправляемо.