ZX Spectrum iS-DOS: ремонт каталога файловой системы
iS-DOS
Случилась у
меня неприятность, попробовал сделать непрерывный каталог SHELL
сегментированным, чтобы скопировать туда больше файлов. Но каталог
вскоре упал, погребя с собой полсистемы и мой Norton Menu Commander,
изменённые файлы которого мне терять совсем бы не хотелось.
Признаки - при открытии диска "С" повреждённый каталог SHELL сперва виден. Но стоит попытаться войти в него, или
нажать 6 (переименовать), как на экране появляется абракадабра. Данные описателя
не верны..
Поэтому тут я буду разбираться в файловой
системе iS-DOS и пытаться его восстановить со всеми
данными. Структура 32х байтовых описателей файлов и каталогов
(источник):
+--------+-----+-----------------------------------------------+ |СМЕЩЕНИЕ|ДЛИНА|ОПИСАНИЕ
| +--------+-----+-----------------------------------------------+ |0
|8 |Имя
файла
| |8
|3 |Тип
файла
| |11
|1 |Регистр состояния
файла:
| |
| |бит
(0/1)
| |
| |0 -
удалён/существует
| |
| |2 - защищён от чтения
(1)
| |
| |3 - защищён от записи
(1)
| |
| |4 - видимый/скрытый
файл
| |
| |5 - файл/каталог (корневой
файл)
| |
| |6 -
сегментированный/несегментированный
| |
| |7 - защищён от удаления
(1)
| |12
|2 |Адрес загрузки по
умолчанию
| |14
|3
|Длина
| |17
|2 |Номер Блока Описателя Сегмента или
0-го блока
| |
| |файла - если файл
непрерывен
| |19
|1
|"Special"
| |20
|6
|Резерв
| |26
|2 |Контрольная сумма
файла
| |28
|2
|Время
| |30
|2
|Дата
| +--------+-----+-----------------------------------------------+
Дата и время кодируются,как в MS-DOS. Контрольная сумма,
воз- можно, тоже. Вот что
известно про описатель внутреннего
каталога: +--------+-----+-----------------------------------------------+ |СМЕЩЕНИЕ|ДЛИНА|ОПИСАНИЕ
| +--------+-----+-----------------------------------------------+ |0
|8 |Имя текущего
каталога.
| |8
|3 |Его тип
(пробелы).
| |11
|1 |CSR (атрибуты ???)
каталога.
| |12
|2 |CBNN (похоже, начальный блок) каталога
-
| |
|
|прародителя.
| |14
|2 |Размер каталога (в
байтах).
| |16
|1 |Уровень вложенности каталога (до
6)
| |
| | [или 0 для iS-DOS
2000].
| |17
|2 |Номер блока описателя сегмента. (Это
интересно.| |
| |Каталог может быть
непрерывным, тогда здесь
| |
| |может быть и номер первого
блока. Но тогда для
| |
| |определения в CSR должны
быть биты состояния.)
| |19
|2 |Номер 0-го блока каталога (это тогда
зачем|).
| |21
|1 |Общее число
файлов.
| |
| |(включая сам каталог и
удалённые).
| |22
|1 |Число
файлов
| |
| |(без каталога и
удалённых).
| +--------+-----+-----------------------------------------------+
Ред.: Структура каталогов на дисках iS-DOS поздних версий
(к ним относятся "Open Letters" ) несколько изменилась. Плагин
xISD HalfElf'а к Far'у
понимает "новый" iS-DOS (2000) и позволяет копировать
с/на него файлы. Дополнение по исходникам
xISD: |23
|1 |levelChic (уровень вложенности
каталогов до
32)| |24
|6
|Резерв.
| |30
|2
|Дата.
| +--------+-----+-----------------------------------------------+ Цитата
из А. Леонтьева: "24.12.96 уровень вложенности
каталога перенесен из 16-го байта описателя файла в
23-ий,т.к.16-ый байт, строго говоря, является старшим байтом
длины файла и, хотя ката- логи и не бывают длиной более 16
блоков, но при отладке программ бывали случаи,когда это
совмещение изрядно вредило. <...> в ста- рой
системе через открытый как файл каталог становятся
доступны для чтения и, что самое страшное, для записи
блоки, находящиеся далеко за пределами
каталога!"
Вот
мой потерянный главным каталогом каталог SHELL, с абсолютным смещением
35 блоков по адресу #2380:
Я так полагаю, надо что-то вписать в описатель SHELL
корневого каталога? Вот пока не очень получается..
А
вот для примера исправный каталог МОИ_ДОК. Описатели из корневого и
самого каталога:
Как восстановить каталог SHELL?
Добавлено позже ночью:
Удалось починить путем замены в описателе бита 6 - сегментированный/несегментированный каталог. С #21 на #61. Как я понял, при изменении каталога на сегментированный бит изменился, а каталог остался непрерывным, отсюда и ошибка.
В целях защиты от спама, добавлять комментарии могут только зарегистрированные пользователи.
Если Вы не хотите регистрироваться под своим именем, войдите под логином: anonymous, паролем: anonymous.  
( Регистрация,   Вход).