Искра-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): прописная кириллица в E0–FF, строчная в C0–DF. Номера строк записаны обычными цифрами.

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

Байт 85 свободен потому, что диапазон 80–9F в КОИ-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 файла программ.