Volkov: добавить Sprinter Commander
Реализовать двухпанельный Commander от платформенного PoC до этапов P6-P20: EMM-каталог, сортировку и выбор, операции с файлами и деревьями, транзакционное копирование, метаданные, политику конфликтов и предварительную проверку свободного места. Добавить проектную документацию, HDD/MAME-сценарии и проверенные артефакты. Расширить libc операцией bank_write_page, исправлением режима O_RDONLY и связанными регрессионными проверками.
This commit is contained in:
@@ -0,0 +1,77 @@
|
||||
# Sprinter Commander: локальный rename 0.2/P10
|
||||
|
||||
Дата: 8 сентября 2026 года.
|
||||
|
||||
Статус: `PASS` в MAME 0.288 / BIOS 3.06 / DSS 1.71.57 на HDD `D:`.
|
||||
|
||||
## Реализованный срез F6
|
||||
|
||||
`F6` переименовывает одну текущую обычную запись внутри активного каталога.
|
||||
Поддержаны как файлы, так и каталоги. Диалог начинает с текущего имени и
|
||||
использует общий редактор; новое имя проходит тот же строгий validator одного
|
||||
компонента DOS 8.3, что и F7.
|
||||
|
||||
Это пока локальный `Rename`, а не полный VC `Move/Rename`:
|
||||
|
||||
- межкаталожный move в пассивную панель ещё не выполняется;
|
||||
- если в панели есть неоднозначная группа, команда явно отказывается от
|
||||
операции; единственная выбранная текущая запись допустима;
|
||||
- `..` и маркер предела DSS никогда не передаются файловой системе;
|
||||
- совпадающее без учёта ASCII-регистра имя считается no-op.
|
||||
|
||||
Низкоуровневый `sc_rename_local()` учитывает подтверждённое ограничение DSS
|
||||
1.71: `RENAME` принимает два basename относительно CWD. Helper сохраняет CWD,
|
||||
временно входит в активный каталог, проверяет отсутствие target через
|
||||
`F_FIRST`, выполняет `rename()` и восстанавливает CWD. Таким образом
|
||||
существующая запись не перезаписывается даже при иной семантике конкретной
|
||||
версии DSS.
|
||||
|
||||
## Проверка
|
||||
|
||||
`RENRT.EXE` вызывает тот же helper и проверяет:
|
||||
|
||||
- rename файла с побайтно неизменным содержимым;
|
||||
- отказ при существующем target и сохранность обоих файлов;
|
||||
- rename непустого каталога с сохранностью вложенного файла;
|
||||
- CWD после успеха, collision и ошибки входа в каталог.
|
||||
|
||||
После UI-сценария внешний checker извлекает HDD и подтверждает окончательные
|
||||
имена и содержимое:
|
||||
|
||||
```text
|
||||
PASS: file/dir rename, no-overwrite, CWD restore и UI F6.
|
||||
```
|
||||
|
||||
Контрольные состояния UI:
|
||||
|
||||
- [диалог с исходным именем](../artifacts/mame-p10/rename/dialog-default.png);
|
||||
- [`FINAL.BIN` создан и остался под cursor](../artifacts/mame-p10/rename/renamed-focused.png);
|
||||
- [неизменное имя обработано как no-op](../artifacts/mame-p10/rename/unchanged-name.png);
|
||||
- [существующий target отвергнут](../artifacts/mame-p10/rename/collision.png);
|
||||
- [`..` не переименовывается](../artifacts/mame-p10/rename/virtual-guard.png);
|
||||
- [неоднозначная группа не превращается в rename cursor](../artifacts/mame-p10/rename/group-guard.png);
|
||||
- [штатный возврат в DSS](../artifacts/mame-p10/rename/clean-dss-return.png).
|
||||
|
||||
## Размер
|
||||
|
||||
Конфигурация `--memory big --safe --max-allocs 3000`:
|
||||
|
||||
| Область | После P9 + UI footer | После P10 | Изменение |
|
||||
|---|---:|---:|---:|
|
||||
| `_CODE` W2 | 9449 | 9463 | +14 |
|
||||
| данные W2 | 3256 | 3256 | 0 |
|
||||
| свободная куча W2 | 2143 | 2129 | -14 |
|
||||
| BANK1 | 6477 | 6477 | 0 |
|
||||
| BANK2 | 8303 | 10008 | +1705 |
|
||||
| `SPRCMD.EXE` | 43026 | 43040 | +14 |
|
||||
|
||||
В BANK2 остаётся 6376 байт, в BANK1 — 9907 байт. Межбанковый аудит чист.
|
||||
|
||||
## Воспроизведение
|
||||
|
||||
```sh
|
||||
make hdd-p10-rename ALLOCS=3000
|
||||
tests/run_mame_hdd.sh build/hdd/p10_rename.chd \
|
||||
tests/mame_p10_rename.lua artifacts/mame-p10/local 65
|
||||
tests/check_p10_rename_hdd.sh build/hdd/p10_rename.chd
|
||||
```
|
||||
Reference in New Issue
Block a user