6.6 KiB
Sprinter Commander: conflict-policy F5 0.2/P19
Дата: 10 сентября 2026 года.
Статус: PASS в MAME 0.288 / BIOS 3.06 / DSS 1.71.57 на HDD D:.
Поведение
Если конечное имя файла существует, F5 показывает единый choice-dialog:
O— безопасно заменить только этот файл;S— пропустить только этот файл;R— ввести другое DOS 8.3-имя;A— заменить этот и все следующие конфликтующие файлы текущей группы;N— пропустить этот и все следующие конфликты текущей группы;Esc— отменить текущую операцию.
Policy all живёт только до завершения одного вызова F5 и распространяется
на top-level группу и файлы рекурсивной job. Readonly target не заменяется
молча даже после ранее выбранного overwrite all: для него снова появляется
диалог Read-only target. Групповые +/-/* по-прежнему работают только над
файлами; выбор каталогов через Insert не менялся.
Rename меняет только имя target, проверяет один компонент DOS 8.3 и не
переименовывает source. Если новое имя тоже занято, policy запрашивается
повторно.
Транзакционная замена
Существующий target не удаляется перед копированием. После полной записи и закрытия нового temp выполняется последовательность:
- выбирается отсутствующее имя
~SBxxxx.BAKв том же каталоге; - readonly временно снимается только после явного разрешения overwrite;
- старый target переименовывается в backup;
- новый temp переименовывается в target;
- новому target назначаются исходные date/time и R/H/S/A;
- backup удаляется.
Если шаг commit нового temp не проходит, старый target переименовывается
обратно и его атрибуты восстанавливаются. Заранее существующие backup-имена
пропускаются, а не перезаписываются. Ошибка после необратимого commit
помечается ScCopyJob.committed, поэтому UI не сообщает, что target якобы
отсутствует.
Проверка
Отдельная target-проба прошла на реальном DSS-пути:
PASS default still refuses existing target
PASS overwrite commits through backup
PASS explicit readonly overwrite
PASS pre-existing backup name skipped
PASS replace policy accepts vanished target
PASS distinct destination name
PASS rename failure rolls original target back
PASS EMM restored
ALL PASS
CHD-check побайтно подтвердил заменённые файлы, rollback исходного payload,
сохранность заранее созданного ~SB0000.BAK и отсутствие новых backup/temp:
PASS: transactional overwrite, readonly, collision and rollback.
Полный UI-сценарий выбрал три файла для overwrite all, получил отдельный
readonly prompt, затем применил skip all к двум файлам, скопировал
REN.BIN как NEXT.BIN и отменил конфликт CANCEL.BIN. Итоговая проверка:
PASS: overwrite-all, readonly prompt, skip-all, rename and cancel.
Контрольные кадры target-пробы:
UI policy:
- выбор overwrite all;
- повторный readonly prompt;
- три файла заменены;
- выбор skip all;
- оба файла пропущены;
- rename-conflict;
NEXT.BINсоздан;- отмена конфликта;
- диалог полностью убран после Esc;
- итог пассивной панели;
- чистый возврат в DSS.
В процессе визуальная проверка нашла и устранила stale-dialog: после
одиночных conflict error/cancel/skip теперь выполняется полный redraw, а не
обновление только двух нижних строк.
После итоговой правки повторно пройдены P5 copy-fault matrix и P18 exact FAT metadata.
Компоновка
EXEC-модуль перенесён из почти полного BANK2 в BANK1. Его строковые статусы теперь всегда копируются в W2 BSS, поэтому наружу не уходит указатель на bank-local literal. Это позволило оставить приложение двухбанковым:
_CODE 9503; DATA 3561; heap 1784
BANK1 14374/16384; BANK2 15665/16384
SPRCMD.EXE 43080
Межбанковый аудит чист. В BANK1 остаётся 2010 байт, в BANK2 — 719.
Воспроизведение
make hdd-p19-overwrite ALLOCS=3000
tests/run_mame_hdd.sh build/hdd/p19_overwrite.chd \
tests/mame_p19_overwrite.lua artifacts/mame-p19/core-local 180
tests/check_p19_overwrite_hdd.sh build/hdd/p19_overwrite.chd
make hdd-p19-policy ALLOCS=3000
tests/run_mame_hdd.sh build/hdd/p19_policy.chd \
tests/mame_p19_policy.lua artifacts/mame-p19/policy-local 200
tests/check_p19_policy_hdd.sh build/hdd/p19_policy.chd