# Носители для тестов Commander Дата: 8 сентября 2026 года. ## Решение Стандартный носитель интеграционных и нагрузочных тестов Commander — отдельный FAT16 HDD-образ, подключаемый к MAME как `hard2`. DSS видит его как диск `D:`; системный `hard1` остаётся диском `C:`. MAME качественно эмулирует механические задержки FDD. Это полезно для проверки совместимости, но делает повторяющиеся scan/copy-прогоны на порядок медленнее и не даёт пользы большинству функциональных тестов. Поэтому FDD `A:` сохраняется только для отдельных smoke-тестов чтения/запуска с дискеты. ## Образы Все рабочие образы Commander лежат локально в `build/hdd/` и не подменяют общий `mame/v306/IMG/test_hdd.chd`: ```sh make hdd # только SPRCMD.EXE -> build/hdd/sprcmd.chd make hdd-stress # P3: EMPTY/MANY/BIGDIR -> build/hdd/p3_stress.chd make hdd-copy # P4: COPYFROM/COPYTO -> build/hdd/p4_copy.chd make hdd-exec # P4: EXECLEFT/EXECRGHT -> build/hdd/p4_exec.chd make hdd-p5 # P5: 20 copy + resource cycles -> p5_stability.chd make hdd-p5-enospc # P5: почти полный HDD -> p5_enospc.chd make hdd-p5-panels # P5: 27/28 записей -> p5_panel_edges.chd make hdd-p5-copy-faults # P5: copy/EXEC fault matrix -> p5_copy_faults.chd make hdd-p5-viewer # P5: SPRCMD + реальный mdview2 -> p5_viewer.chd make hdd-p5-media # P5: hot-unplug hard2 во время F5 -> p5_media.chd make hdd-p6-sort # 0.2: target/UI сортировки -> p6_sort.chd make hdd-p7-select # 0.2: target/UI выбора -> p7_select.chd make hdd-p8-masks # 0.2: расширение того же образа масками +/− make hdd-p9-mkdir # 0.2: validator и UI F7 mkdir -> p9_mkdir.chd make hdd-p10-rename # 0.2: file/dir rename и UI F6 -> p10_rename.chd make hdd-p11-delete # 0.2: confirm/cancel и UI F8 -> p11_delete.chd make hdd-p12-group-copy # 0.2: выбранные файлы -> p12_group_copy.chd make hdd-p13-group-delete # 0.2: выбранные файлы -> p13_group_delete.chd make hdd-p14-default-colors # UI: dir/EXE/file -> p14_default_colors.chd make hdd-p15-tree-copy # 0.2: recursive current dir -> p15_tree_copy.chd make hdd-p15-tree-cancel # 0.2: cancel/cleanup -> p15_tree_cancel.chd make hdd-p15-tree-self # 0.2: self-target guard -> p15_tree_self.chd make hdd-p16-group-tree-copy # 0.2: multi-root F5 -> p16_group_tree_copy.chd make hdd-p17-tree-delete # 0.2: recursive group F8 -> p17_tree_delete.chd make hdd-p17-tree-delete-cancel # runtime Esc -> p17_tree_delete_cancel.chd make hdd-p18-metadata # exact FAT metadata F5 -> p18_metadata.chd make hdd-p19-overwrite # backup/rollback probe -> p19_overwrite.chd make hdd-p19-policy # UI conflict policy -> p19_policy.chd ``` Сборщик `toolchain/make_hdd.sh` принимает как отдельные файлы, так и готовые деревья каталогов. Рекурсивное копирование дерева одной командой особенно важно для `BIGDIR`: 680 файлов не требуют 680 отдельных запусков `mcopy`. ## Запуск и проверка Lua-сценарий сначала вводит `D:`, а затем запускает `SPRCMD.EXE`. Благодаря этому текущий диск DSS и оба относительных контекста панелей находятся на тестовом HDD, а не на системном `C:` или медленном `A:`. Пример полного теста F5: ```sh make hdd-copy ALLOCS=3000 tests/run_mame_hdd.sh \ build/hdd/p4_copy.chd tests/mame_p4_copy_hdd.lua \ artifacts/mame-p4/copy-hdd-local 75 tests/check_p4_copy_hdd.sh build/hdd/p4_copy.chd ``` После пересборки CHD MAME требуется полностью перезапустить. Нельзя извлекать или проверять образ во время работающего MAME: окончательное состояние валидируется только после чистого выхода эмулятора. Скриншоты подтверждают состояние интерфейса, но не заменяют файловую проверку. Для copy-теста после MAME CHD преобразуется обратно в RAW, файлы извлекаются через mtools и сравниваются с детерминированными шаблонами. Для EXEC-теста аналогичная тройка команд использует `tests/mame_p4_exec_hdd.lua` и `tests/check_p4_exec_hdd.sh`. Все имена, которые должен открыть DSS, задаются в формате 8.3: VFAT long name на образе не является доступным DSS-именем и может отображаться как alias с `~1`. Сценарий смены носителя управляет только тестовым `hard2`. Перед запуском любой автоматизации проверяется, что другого экземпляра MAME Sprinter нет: одновременный доступ двух процессов к CHD запрещён. После физического unload DSS может ожидать возврата устройства внутри системного вызова; Lua возвращает тот же образ, после чего Commander получает управляемую ошибку и продолжает работу.