Volkov: добавить Sprinter Commander
Реализовать двухпанельный Commander от платформенного PoC до этапов P6-P20: EMM-каталог, сортировку и выбор, операции с файлами и деревьями, транзакционное копирование, метаданные, политику конфликтов и предварительную проверку свободного места. Добавить проектную документацию, HDD/MAME-сценарии и проверенные артефакты. Расширить libc операцией bank_write_page, исправлением режима O_RDONLY и связанными регрессионными проверками.
This commit is contained in:
@@ -0,0 +1,100 @@
|
||||
# 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.
|
||||
Reference in New Issue
Block a user