8e389c03f8
Реализовать двухпанельный Commander от платформенного PoC до этапов P6-P20: EMM-каталог, сортировку и выбор, операции с файлами и деревьями, транзакционное копирование, метаданные, политику конфликтов и предварительную проверку свободного места. Добавить проектную документацию, HDD/MAME-сценарии и проверенные артефакты. Расширить libc операцией bank_write_page, исправлением режима O_RDONLY и связанными регрессионными проверками.
101 lines
6.2 KiB
Markdown
101 lines
6.2 KiB
Markdown
# Sprinter Commander: результаты запуска EXE P4.2
|
||
|
||
Дата: 8 сентября 2026 года.
|
||
|
||
Статус: `PASS` в MAME 0.288 / BIOS 3.06 / DSS 1.71.57 на HDD `D:`.
|
||
Выполнены требования `REQ-EXEC-01..06`: запуск по `Enter`, возврат в
|
||
Commander после изменившей окружение программы, обработка плохого EXE и отказ
|
||
для неподдерживаемого типа файла.
|
||
|
||
Связанные документы:
|
||
[требования](commander-requirements.md),
|
||
[архитектура](commander-architecture.md),
|
||
[roadmap](commander-roadmap.md),
|
||
[носители тестов](test-media.md).
|
||
|
||
## Реализация
|
||
|
||
- `Enter` запускает только обычную запись с расширением `.EXE` без учёта
|
||
регистра; каталог, маркер предела DSS и иной тип файла не передаются EXEC;
|
||
- полный путь строится в резидентной памяти, ESTEX `EXEC $40` вызывается с
|
||
`B=1` и синхронно возвращает код завершения в диапазоне `00..FF`;
|
||
- перед запуском сохраняются текущий диск и 256-байтный CWD;
|
||
- child получает каталог активной панели как CWD, что позволяет программам
|
||
без аргументов открывать соседние файлы; затем CWD Commander возвращается;
|
||
- одновременный copy job запрещён; пути временно используют уже существующие
|
||
строковые поля `ScCopyJob`, поэтому EXEC не добавил два новых буфера в W2;
|
||
- после child восстанавливаются диск/CWD, режим 80x32 и восемь записей
|
||
палитры Commander во всех четырёх planes;
|
||
- повторная установка темы не перезаписывает снимок исходной системной
|
||
палитры, который нужен штатному cleanup;
|
||
- обе панели перечитываются, затем экран полностью строится из EMM-модели;
|
||
- успешный статус показывает код завершения, ошибка загрузчика — имя и
|
||
`errno`; Commander остаётся управляемым.
|
||
|
||
Низкоуровневая обёртка находится в `sc_platform_exec.c`, а холодная
|
||
оркестрация и форматирование статуса — в `sc_exec_ui.c` (BANK2).
|
||
|
||
## Интеграционный child
|
||
|
||
`tests/p4_exec_child/p4child.exe` намеренно создаёт неблагоприятное для
|
||
родителя состояние:
|
||
|
||
1. создаёт `EXECLEFT/CREATED.TXT` и `EXECRGHT/PASSIVE.TXT`;
|
||
2. оставляет CWD в `EXECLEFT`;
|
||
3. переключает экран в 40x32;
|
||
4. заменяет используемые Commander цвета ярко-зелёной/пурпурной палитрой;
|
||
5. ждёт `Enter` и возвращает код `5A`.
|
||
|
||
Имена каталогов теста строго соответствуют 8.3. Промежуточный вариант
|
||
`EXECRIGHT` оказался VFAT long name и был виден DSS как `EXECRI~1`; отказ
|
||
`chdir("EXECRIGHT")` был ошибкой fixture, а не доказательством дефекта DSS.
|
||
|
||
## Матрица MAME
|
||
|
||
Образ создаёт `tests/make_p4_exec_hdd.sh`, сценарий выполняет
|
||
`tests/mame_p4_exec_hdd.lua`, итоговое содержимое проверяет
|
||
`tests/check_p4_exec_hdd.sh`.
|
||
|
||
| Сценарий | Результат |
|
||
|---|---|
|
||
| `P4CHILD.EXE` | child показал `active=0 passive=0` и CWD `\\EXECLEFT` |
|
||
| возврат из child | Commander снова в 80x32 с исходной темой; статус содержит `5A` |
|
||
| refresh активной панели | появился `CREATED.TXT`, размер 19 |
|
||
| refresh пассивной панели | появился `PASSIVE.TXT`, размер 27 |
|
||
| `BROKEN.EXE` | показано `Cannot execute BROKEN.EXE (errno 17)`; приложение продолжило работу |
|
||
| `NOTE.TXT` | показано имя объекта и явный отказ: поддерживаются только `.EXE` |
|
||
| cleanup/exit | диалог работает; системная палитра восстановлена; возврат в `D:\>` |
|
||
|
||
После остановки MAME CHD был извлечён и оба marker-файла сравнены побайтно:
|
||
|
||
```text
|
||
PASS: child создал active/passive markers с ожидаемым содержимым.
|
||
```
|
||
|
||
Артефакты:
|
||
|
||
- [child после изменения режима, палитры и CWD](../artifacts/mame-p4/exec/child-mode-palette-cwd.png);
|
||
- [Commander после восстановления и refresh обеих панелей](../artifacts/mame-p4/exec/commander-restored-both-panels.png);
|
||
- [ошибка повреждённого EXE](../artifacts/mame-p4/exec/broken-exe-error.png);
|
||
- [отказ для обычного TXT](../artifacts/mame-p4/exec/unsupported-file.png);
|
||
- [диалог выхода после EXEC](../artifacts/mame-p4/exec/quit-after-exec.png);
|
||
- [чистый возврат в DSS](../artifacts/mame-p4/exec/clean-dss-return.png).
|
||
|
||
## Размер сборки
|
||
|
||
Конфигурация: `--memory big --safe --max-allocs 3000`.
|
||
|
||
| Область | Размер |
|
||
|---|---:|
|
||
| `_CODE` W2 | 8870 байт |
|
||
| данные W2 | 3240 байт |
|
||
| свободная куча W2 | 2738 байт |
|
||
| стек | 1279 байт |
|
||
| BANK1: scan/sort/copy job | 4242 / 16384 байт |
|
||
| BANK2: draw/copy/EXEC UI | 5973 / 16384 байт |
|
||
| `SPRCMD.EXE` | 42447 байт |
|
||
|
||
`check_bank_calls.py` — чисто. Таблица актуализирована по финальной сборке P5
|
||
после исправления режима `O_RDONLY` в libc; P4.1 и P4.2 вместе закрывают
|
||
критерий выхода P4.
|