Искра-226/Файловая система

Материал из Emuverse
Этот документ создан для Emuverse и распространяется на условиях лицензии CC-BY-SA-3.0.

Файловая система Искры 226 — способ хранения файлов на дисках Искра-226. Унаследована от Wang 2200 и совпадает с ней побайтово; содержимое файлов — оригинальное и с Wang несовместимо.

Статья описывает файловую систему, указатель каталога и текстовое представление программ. Отдельно вынесены:


Диск

Физический сектор — 128 байт; 77 дорожек по 26 секторов, одна сторона. Физические сектора попарно объединены в логические по 256 байт со сквозной нумерацией. Далее везде подразумеваются логические сектора. Полный объём тома — 1001 сектор, 256 256 байт.

Типы файлов:

  • ПФ — программный файл: программа на Бейсике в текстовом либо оттранслированном виде;
  • ФД — файл данных.

Файлу выделяется непрерывный диапазон секторов, границы записаны в указателе каталога.

Сектор Содержимое
первый заголовок файла
следующие N поток содержимого
резерв, нули
последний выделенный концевая запись

Размер файла на диске не меняется, поэтому при перезаписи более коротким содержимым хвост не затирается: там остаются фрагменты предыдущих версий, иногда в другом представлении. Обработку следует прекращать на первой встреченной концевой записи.

Диски прямого доступа (запись по абсолютным адресам секторов) указателя каталога не имеют; формат содержимого таких дисков задаёт программа пользователя. Загрузочные диски с интерпретатором имеют собственный формат: нулевой сектор начинается сигнатурой 06 90 09 90 07 90, за ней 18 знаков имени и даты версии.

Указатель каталога

Начинается с сектора 0. Первые 16 байт нулевого сектора — параметры диска:

Смещение Размер Значение
0–1 2 размер указателя каталога в секторах (LS), старший байт первым
2–3 2 текущий конец каталога — первый свободный сектор
4–5 2 конец области каталога
6–15 10 нули

Размер указателя задаётся при создании каталога оператором SCRATCH DISK параметром LS=, по умолчанию 24, допустимо 1…255; в дальнейшем не меняется. В нулевом секторе помещается 15 записей, в остальных 16. Неиспользованные записи заполнены нулями.

Записи не сгруппированы в начале указателя и не упорядочены по секторам файлов: номер сектора, в который попадает запись, вычисляется хешированием имени. Для чтения каталога надо пройти все его секторы, пропуская нулевые записи.

Хеш имени файла

Номер сектора указателя вычисляется по «старому» хешу Wang 2200:

имя дополнить пробелами до восьми байт
tmp = 0
для каждого байта имени:  tmp = tmp XOR байт
tmp = 3 × tmp
tmp = (tmp mod 256) + (tmp div 256)
сектор = tmp mod LS

Свёртка выполняется исключающим ИЛИ, не сложением. «Новый» хеш Wang, введённый в MVP OS 2.5, на Искре не применяется.

Хеш вырождается при LS, кратном трём: после умножения на 3 и складывания половинок результат всегда кратен трём, поэтому занятыми оказываются только каждый третий сектор указателя. При LS = 24 все записи попадают в секторы 0, 12, 15 и 18.

Запись кладётся в первый свободный слот своего сектора, слоты заполняются подряд от начала. Правило переполнения сектора неизвестно.

Освобождение слота выполняется обнулением первых восьми байт записи; имя при этом остаётся на диске. Оператор SCRATCH запись не обнуляет, а помечает.

Запись каталога

16 байт, совпадает с Wang 2200.

Смещение Размер Значение
0 1 статус, битовое поле; бит 0 — файл вычеркнут
1 1 тип файла: 80 — программа, 00 — данные
2–3 2 первый сектор файла, старший байт первым
4–5 2 последний сектор файла, старший байт первым
6–7 2 не используются
8–15 8 имя файла, дополнено пробелами справа

Наблюдаемые значения статуса: 10 — активна, 11 и 21 — вычеркнута, 00 — свободна. Сравнивать статус на точное равенство нельзя, значим только бит 0. Бит 5 (значение 21) предположительно помечает переименование.

Байт типа не различает текстовое и оттранслированное представление программы: у обоих 80.

Оператор LIST DC выводит типы как P (программный), D (данные), SP и SD (вычеркнутые), что соответствует сочетанию байта статуса и байта типа.[1]

Тип «данные» ничего не говорит о внутреннем устройстве файла: он может содержать как логические записи, так и сырые блоки, записанные оператором DATA SAVE BA.

Пример

 0  1  2  3  4  5  6  7  8  9  A  B  C  D  E  F
10 80 00 31 00 3F 00 00 44 49 47 20 44 45 4D 20
└───┘ └───┘ └───┘       └─────────────────────┘

Активная запись, программа, секторы 49…63, имя DIG DEM.

Размещение файлов

  • Файлы лежат подряд в порядке создания, диапазоны секторов не пересекаются.
  • Место вычеркнутого файла заново не занимается: SCRATCH только помечает запись.
  • Первый файл начинается с сектора LS, сразу за указателем.
  • Поле «текущий конец» равно последнему занятому сектору плюс единица, но обрезается по концу области каталога; при разборе границу надёжнее брать по записям каталога.

Заголовочный сектор

Смещение Значение
0 01
1–8 имя файла, дополнено пробелами
9 признак формата записи
10–255 нули

Байт 9 (в справочнике[2] назван «признак защиты») — битовое поле, единственный признак, различающий два представления программы: бит 0 — программа оттранслирована (параметр T оператора SAVE DC), бит 2 — защищена (параметр P); оба вместе соответствуют параметру G.

Значение Символ Защита Представление
20 пробел нет текстовое
21 ! нет оттранслированное
24 ¤ есть текстовое
25 % есть оттранслированное

Значения 22 и 23 не используются. Текстовое представление — режим по умолчанию, оттранслированное включается явным параметром T.

Защищённая программа после загрузки может только выполняться; режим снимается оператором CLEAR.

Секторы потока

Первые два байта каждого сектора программного потока — служебные, в содержимое не входят. У секторов файла данных служебный заголовок занимает один байт.

Байт 0 — позиция сектора:

Код Смысл
02 первый сектор потока
03 последний сектор потока
1C концевая запись
8B запись целиком в одном секторе (только файлы данных)
8F промежуточный сектор

В оттранслированных программах все секторы потока идут с маркером 02. Позиционная разметка 02/8F/03 наблюдается в текстовых файлах и в потоках данных.

Байт 1 программных секторов равен 80. Как признак «программа или данные» он непригоден: у секторов данных на позиции 1 стоит первый байт идентификатора значения. Надёжные признаки — байт 9 заголовочного сектора и байт типа записи каталога.

Концевая запись

1C <длина: 2 байта, старший первым>

Остаток сектора — нули. Соответствует по роли байту 20 в Wang.

Счётчик равен собственной позиции записи от начала файла, считая с единицы, то есть числу занятых секторов вместе с заголовком. Он же — графа «Использовано» в выдаче LIST DC.

  • У программных файлов концевую запись пишет сам оператор SAVE DC; она есть всегда.
  • У файлов данных её пишет прикладная программа оператором DATA SAVE DC END. Если признак конца не записан, в графе «Использовано» стоит 00001.
  • Оператор DATA SAVE DC OPEN пишет в последний сектор файла запись 1C 00 01 — единственный случай, когда счётчик не равен позиции.

Запись лежит не обязательно в последнем выделенном секторе: если файлу дали запас или его положили на место вычеркнутого файла большего размера, за ней остаётся нулевой хвост.

Счётчик — не инвариант файловой системы и при разборе ненадёжен: у файлов, записанных не операторами DATA SAVE DC, он произволен. Границы файла следует брать из каталога.

Текстовое представление

Программа хранится плоским текстом. Кодировка — КОИ-8 (ГОСТ 19768-74): прописная кириллица в E0FF, строчная в C0DF. Номера строк записаны обычными цифрами.

  • Разделитель строк — байт 85.
  • Строка не пересекает границу сектора; хвост сектора заполняется нулями.
  • Байт 24 ($) отображается на экране Искры как ¤.

Байт 85 свободен потому, что диапазон 809F в КОИ-8 не занят. Тем же байтом машина разделяет строки в символьном буфере операторов SAVE и LOAD и выдаёт нажатие клавиши CR/LF.

Разбор: склеить содержимое секторов, отбрасывая по два служебных байта, разбить по 85, отбросить нули.

Пример

02 80 35 20 52 45 4D 20 F0 E5 F4 F2 E5 EE EB EF … 85 38 20 50 52 49 4E 54 …

Заголовок сектора, затем 5 REM ПЕТРЕНКО …, разделитель, 8 PRINT ….

Виды дисков

Вид Признак
с каталогом байты 0–1 нулевого сектора — разумный LS, дальше 16-байтовые записи
загрузочный сектор 0 начинается с 06 90 09 90 07 90
пакет ассемблера сектор 0 начинается с 7E E1 F3 ED E2 (~АСМБ)
прямого доступа каталога нет, есть заголовочные секторы 01 <имя> <признак>
пустой нули

Отличия от Wang 2200

Wang 2200 Искра-226
Запись каталога 16 байт совпадает побайтово
Хеш имени «старый» и «новый» только «старый»
Маркер концевой записи 20 1C
Маркер заголовка 40 (50 для защищённых) 01
Маркеры секторов битовое поле в старшей тетраде отдельные значения 02/8F/03
Представление программы ключевые слова в токенах, остальное ASCII несовместимо, см. Оттранслированное представление BASIC 02

Совпадает только уровень файловой системы. Инструментарий Wang для разбора самих программ непригоден.

Примечания

  1. Баласанян В. Э., Богдюкевич С. В., Шахвердов В. А. Программирование на микроЭВМ «Искра 226». — М.: Финансы и статистика, 1987. — 264 с.: ил.
  2. Аладьев В. З. и др. Персональный компьютер «Искра-226». Архитектура и программное обеспечение: справочное руководство. — Киев, 1988.

Источники

  • Баласанян В. Э., Богдюкевич С. В., Шахвердов В. А. Программирование на микроЭВМ «Искра 226». — М.: Финансы и статистика, 1987.
  • Аладьев В. З. и др. Персональный компьютер «Искра-226». Архитектура и программное обеспечение. — Киев, 1988.
  • Wang 2200 Disk Organization — файловая система и хеш имени для сопоставления.
  • Реконструкция по 42 образам дисков: 303 записи каталога, 94 файла программ.