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,98 @@
# Sprinter Commander: результаты двухпанельного skeleton P2
Дата: 6 сентября 2026 года.
Статус: многоцветный skeleton `PASS` в MAME; файловая система и аппаратная
проверка ожидаются.
Связанные документы:
[архитектура](commander-architecture.md),
[roadmap](commander-roadmap.md),
[экранный backend](p2-screen-backend.md),
[результаты P2.1](p2-screen-probe-results.md)
## 1. Реализованная граница
`build/sprcmd.exe` — первая запускаемая форма Commander, а не очередная
платформенная проба. В ней уже разделены:
- `ScApp`, инициализация, главный цикл и идемпотентное состояние cleanup;
- три EMM-страницы: левая панель, правая панель и screen model;
- `sc_screen` — единственный владелец модели 80x32 `(char, attr)`;
- `sc_video_system``WINREST` и прямоугольный `SCROLL` без BIOS-окон;
- renderer двух панелей, status и строки функциональных клавиш;
- нормализованные `ScKeyEvent` и `ScCommand`;
- навигация по синтетическим P2-записям, включая системный scroll;
- единая модальная поверхность для сообщений и подтверждения выхода.
Синтетические строки нужны только для проверки cursor/top и scroll. Они не
являются подменой каталога: `ffirst/fnext` skeleton не вызывает, настоящий
источник файлов добавляется в P3.
## 2. Сборка
Команда: `make`, конфигурация `--memory big --safe`.
| Область | Значение |
|---|---:|
| `_CODE` | 7 129 байт (`0x8100..0x9CD9`) |
| данные | 443 байта (конец `0x9E94`) |
| EXE | 7 675 байт |
| heap после статики | 7 276 байт |
| стек | 1 279 байт |
Банков кода skeleton пока не требует. Контракты уже рассчитаны на `big`, а
холодные функции будут переноситься в W1 по мере появления P3/P4-кода.
## 3. MAME-сценарий
Окружение: MAME 0.287 (`b0c4527c`), машина `sprinter`, BIOS `v3.06`.
Сценарий воспроизводится файлом `tests/mame_p2_skeleton.lua`.
| Действие | Наблюдение | Результат |
|---|---|---|
| Первый экран | две многоцветные панели 80x32, левая `[ACTIVE]`, cursor/top `0/0` | [PASS](../artifacts/mame-p2/skeleton-color/initial-left-active.png) |
| `Tab` | `[ACTIVE]` и `>` перешли на правую панель | [PASS](../artifacts/mame-p2/skeleton-color/tab-right-active.png) |
| `PgDn`, `Down` | правая панель показывает строки 002028, cursor/top `28/2`; сосед и рамки неподвижны | [PASS](../artifacts/mame-p2/skeleton-color/navigation-scroll.png) |
| `F10` | красный диалог подтверждения поверх модели | [PASS](../artifacts/mame-p2/skeleton-color/quit-dialog.png) |
| `N` | обе панели и тема полностью восстановлены из EMM | [PASS](../artifacts/mame-p2/skeleton-color/quit-cancelled-restored.png) |
| `F1`, `Esc` | общий message dialog открылся и восстановил экран | [PASS](../artifacts/mame-p2/skeleton-color/reserved-command-dialog.png), [после закрытия](../artifacts/mame-p2/skeleton-color/message-closed-restored.png) |
| повторный `F10`, `Enter` | палитра восстановлена, штатный выход в DSS | [PASS](../artifacts/mame-p2/skeleton-color/clean-exit-dos.png) |
| второй запуск после выхода | приложение снова инициализировало EMM и тему | [PASS](../artifacts/mame-p2/skeleton-color/repeat-second-launch.png) |
| второй cleanup | возврат в DSS без сообщения об утечке EMM | [PASS](../artifacts/mame-p2/skeleton-color/repeat-second-clean-exit.png) |
## 4. Проверка ресурсов
В начале `sc_app_init()` сохраняет `mem_info.total/free`, затем выделяет один
блок из трёх страниц. `sc_app_cleanup()` освобождает блок, повторяет
`mem_info()` и возвращает ошибку, если оба значения не восстановились. При
ошибке основной модуль печатает отдельное сообщение и возвращает код 4.
В MAME этого сообщения не было ни после первого, ни после второго процесса.
Второй процесс успешно выделил тот же объём и полностью отрисовался. Таким
образом, проверка включает и внутреннее сравнение счётчиков, и повторный
запуск с чистого состояния.
## 5. Экран и палитра
Skeleton не открывает BIOS window descriptors и не обращается к VRAM
напрямую. Панели и диалоги — прямоугольники в собственной EMM-модели.
Системные BIOS/ESTEX-вызовы палитры **не запрещены**. Первый зафиксированный
skeleton намеренно отображал все semantic attributes системным `0x30`, чтобы
изолировать проверку приложения. После успешной отдельной пробы P2.2 добавлен
`sc_theme`: разные смысловые атрибуты, save/set всех четырёх планов и restore
при cleanup. Renderer и формат экранной модели при этом не изменились.
Интеграционный MAME-сценарий прошёл с белыми/жёлтыми/светло-голубыми
элементами на синем фоне, чёрным на cyan/lightgray и белыми красными
диалогами. Второй запуск подтвердил повторную инициализацию темы после её
восстановления первым процессом.
## 6. Следующие работы
- повторить палитровую пробу P2.2 на реальном Sprinter;
- повторная инициализация `sc_video` после child, сменившего видеорежим;
- измерение full/row/scroll present;
- аппаратный прогон P2.1 и skeleton;
- P3: заменить синтетические строки настоящими независимыми каталогами.