Реализовать двухпанельный Commander от платформенного PoC до этапов P6-P20: EMM-каталог, сортировку и выбор, операции с файлами и деревьями, транзакционное копирование, метаданные, политику конфликтов и предварительную проверку свободного места. Добавить проектную документацию, HDD/MAME-сценарии и проверенные артефакты. Расширить libc операцией bank_write_page, исправлением режима O_RDONLY и связанными регрессионными проверками.
6.5 KiB
DSS: большие каталоги и F_FIRST/F_NEXT
Вывод
Стабильный DSS 1.71 не может перечислить каталог за пределами первых 512
физических FAT-записей. Это ограничение внутреннего 16-КБ кэша DSS, а не
размера ffblk_t, адреса DTA, W2, W3 или EMM-хранилища Commander.
Commander хранит до 640 элементов в EMM, но на стабильном DSS источник
может закончиться раньше. Код ошибки 35 принимается как частичный успех:
полученные элементы сохраняются, а последней добавляется красная виртуальная
строка >>> MORE....
Подтверждение исходниками DSS
Исходники находятся в ../../docs/sources/Estex-DSS и закодированы в CP866.
Для чтения комментариев они просматривались через iconv, без изменения
оригинальных файлов.
Стабильная ветка master, релизный срез 6078563:
DSS/defines.inc:DIRPAGE.buffer = 0xC000;DSS/FS/FAT.asm:LOADDIR: за один раз читается ровно0x4000байт;- размер
FAT_DIRECTORY_RECORDравен 32 байтам; SEARCH.Customначинает сIX=0xC000и прибавляет 32;- после 512 записей IX переходит через
0xFFFF, аSEARCH.error_too_many_filesвозвращаетDSS_Error.sys.TOO_MANY_FILES_IN_DIR; DSS/API/Find.asm:F_NEXTотдельно проверяетIX==0и направляет выполнение на ту же ошибку;- комментарии
TODOпрямо требуют record index и загрузку другой части каталога размером более0x4000байт.
В системном SYSTEM.DOS, реально используемом MAME, найдены обе характерные
последовательности стабильной реализации: проверка LD IX,0 и цикл
ADD IX,32 до переноса. Бинарник на HDD и dss171u.img совпадают по SHA-256.
Почему старый тест показывал 682
Один ранний экран P3DIR показывал count=682, errno=0, но поле last
содержало B0000599.DAT. Проверка физического порядка тестового FAT-образа
показала:
- записи 0 и 1 —
.и..; B0000599.DAT— запись 511, то есть 512-я физическая запись;- запись 512 уже имеет другое имя.
Следовательно, DSS завершил реальный перебор точно на системной границе, а
старый диагностический .EXE исказил локальный счётчик и errno. Этот экран
не является доказательством чтения 682 записей. Исправленная проба хранит
счётчик и контрольные имена 511/512/513 в статической памяти.
Матрица tests/p3_enum_matrix независимо получила для всех проверенных
вариантов count=512, end_errno=35: обычный wrapper, wrapper и цикл в W1,
чтение W3 и запись в EMM.
Семантика Commander 0.1–1.0
При fnext() == -1 && errno == 35:
- Ошибка не откатывает уже прочитанный каталог.
panel.truncatedустанавливается в 1.- В конец добавляется
ScDirEntryс флагомSC_ENTRY_DSS_LIMITи именем>>> MORE.... - Маркер всегда сортируется после файлов, рисуется красным и занимает один из 640 слотов панели.
Enterи файловые команды не трактуют маркер как файл или каталог.
Число видимых файлов может быть меньше 510: в 512 физических записей входят
./.., удалённые записи и служебные записи длинных имён, которые DSS или
Commander отфильтровывают.
Расширенная ветка DSS
В origin/beta_cdfs существует незавершённая реализация больших каталогов:
B=0x80— короткое имя и обход без старого предела;B=0x81— DOS-имя и обход без старого предела;- хранится record index;
- при окончании страницы вызывается
LOAD_NEXT_DIR_PART_TO_DIR_CACHE; - старые режимы
B=0/1намеренно ограничиваются 512 результатами для совместимости.
Это хороший upstream-прототип для версии 2.0, но не контракт стабильного DSS 1.71. До отдельной сборки и тестирования Commander не должен зависеть от него.
Следствие для логических страниц Commander
Предложенные <<< PAGE n/>>> PAGE n реализуемы без дополнительной памяти,
если DSS способен продолжить физический перебор после первой 16-КБ части.
На стабильном DSS повторный F_FIRST/F_NEXT снова остановится на тех же 512
записях, поэтому настоящее переключение на PAGE2 требует одного из вариантов:
- стабилизировать расширенный режим
B=0x80/0x81; - добавить эквивалентный API DSS с record index/offset;
- как нежелательный запасной путь — реализовать raw FAT source вне DSS.
Выбор делается после релиза 1.0; текущий красный маркер уже имеет отдельный
тип и сможет позднее стать переходом без изменения формата ScDirEntry.