8e389c03f8
Реализовать двухпанельный Commander от платформенного PoC до этапов P6-P20: EMM-каталог, сортировку и выбор, операции с файлами и деревьями, транзакционное копирование, метаданные, политику конфликтов и предварительную проверку свободного места. Добавить проектную документацию, HDD/MAME-сценарии и проверенные артефакты. Расширить libc операцией bank_write_page, исправлением режима O_RDONLY и связанными регрессионными проверками.
99 lines
7.1 KiB
Markdown
99 lines
7.1 KiB
Markdown
# 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` | правая панель показывает строки 002–028, 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: заменить синтетические строки настоящими независимыми каталогами.
|