Искра-226/Файловая система
| Этот документ создан для Emuverse и распространяется на условиях лицензии CC-BY-SA-3.0. |
Файловая система Искры 226 — способ хранения файлов на дисках Искра-226. Унаследована от Wang 2200 и совпадает с ней побайтово; содержимое файлов — оригинальное и с Wang несовместимо.
Статья описывает файловую систему, указатель каталога и текстовое представление программ. Отдельно вынесены:
- Искра-226/Кодирование BASIC-файлов — токенизированная запись программы;
- Искра-226/Файлы данных BASIC 02 — записи, значения и способы доступа;
- Искра-226/Графический буфер BASIC 02 — формат рисунка.
Диск
Физический сектор — 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 для разбора самих программ непригоден.
Примечания
Источники
- Баласанян В. Э., Богдюкевич С. В., Шахвердов В. А. Программирование на микроЭВМ «Искра 226». — М.: Финансы и статистика, 1987.
- Аладьев В. З. и др. Персональный компьютер «Искра-226». Архитектура и программное обеспечение. — Киев, 1988.
- Wang 2200 Disk Organization — файловая система и хеш имени для сопоставления.
- Реконструкция по 42 образам дисков: 303 записи каталога, 94 файла программ.