Искра-226/Файлы данных BASIC 02

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

Файлы данных BASIC 02 — способы записи и чтения данных программой на Искра-226: режимы доступа, устройство логической записи и форматы значений.

Файловая система, указатель каталога и концевая запись описаны в статье Файловая система. Формат рисунка, который программа записывает в файл как обычное символьное значение, — в статье Графический буфер BASIC 02.

Способы доступа

Приставка Режим Адресация
DC файл каталога последовательная, от текущего сектора файла
DA абсолютная адресация начальный сектор задан в операторе
BA блок 256 байт то же, служебной разметки нет
BT блочный обмен с устройством диск не участвует

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

Таблица устройств

Файл открывается на одну из восьми строк таблицы устройств, #0#7; строка выбирается программой оператором SELECT #n, а не выдаётся системой. У открытого файла строка содержит три адреса: начальный сектор, конечный сектор и текущий сектор.

Оператор DATA SAVE DC CLOSE обнуляет только эти три адреса; адрес самого устройства, назначенный оператором SELECT, сохраняется. Параметр ALL закрывает все открытые файлы.

Операторы

Токен Оператор Действие
1E IF END THEN <строка> переход, если последнее чтение наткнулось на концевую запись
66 DATA LOAD BT принять блок с устройства
68 DATA SAVE BT передать блок на устройство
6E DATA SAVE BA записать 256-байтовый блок по абсолютному адресу
6F DATA SAVE DA записать логическую запись по абсолютному адресу
70 DATA LOAD BA прочитать 256-байтовый блок
71 DATA LOAD DA прочитать логическую запись по абсолютному адресу
74 DATA LOAD DC прочитать логическую запись с текущего сектора
75 DATA LOAD DC OPEN открыть существующий файл
76 DATA SAVE DC записать логическую запись с текущего сектора
76 + D7 DATA SAVE DC END записать концевую запись
77 DATA SAVE DC CLOSE закрыть файл
78 DATA SAVE DC OPEN завести файл в каталоге и открыть
79 DBACKSPACE сдвинуть текущий сектор назад
7A DSKIP сдвинуть текущий сектор вперёд
7B LIMITS выдать границы файла и число занятых секторов
81 SCRATCH вычеркнуть файл из каталога
82 SCRATCH DISK создать каталог
83 VERIFY проверить читаемость области

Операнды всех перечисленных операторов описаны в статье Оттранслированное представление BASIC 02.

Последовательность работы

Запись в режиме каталога:

  1. DATA SAVE DC OPEN заводит файл в указателе и заполняет строку таблицы устройств тремя адресами. В последний сектор файла записывается 1C 00 01; больше при открытии не пишется ничего.
  2. DATA SAVE DC пишет логическую запись начиная с текущего сектора и двигает текущий за неё.
  3. DATA SAVE DC END кладёт концевую запись в текущий сектор и текущего не двигает: она помечает сектор, откуда можно продолжать запись, и следующая запись ляжет на её место.
  4. DATA SAVE DC CLOSE обнуляет адреса строки.

Чтение устроено так же, с DATA LOAD DC OPEN и DATA LOAD DC. Прочитав сектор с кодом 1C, оператор чтения ничего не делает, оставляет текущий сектор на концевой записи и взводит признак, который проверяет IF END THEN. Обычная запись признак снимает.

Параметры DSKIP и DBACKSPACE: число записей, BEG, END либо число с параметром S — в секторах.

Абсолютная адресация

Операторы DA и BA получают начальный сектор выражением в самом операторе; каталог при этом не нужен. Необязательный второй операнд — приёмник, куда возвращается адрес сектора за последним занятым; у символьного приёмника это два первых байта двоичным числом.

Диски, записанные только так, указателя каталога не имеют вовсе.

Блочный обмен

Операторы DATA SAVE BT и DATA LOAD BT передают блок байтов без всякой служебной разметки. Устройство задаётся приставкой /<адрес>, причём адрес — выражение, а не сырой байт; чаще всего это переменная.

Название группы устройств по умолчанию (TAPE) вводит в заблуждение: обмен идёт с любым устройством. Адреса из таблицы ФАУ:[1]

Адрес Устройство
05 блок отображения символьной информации
0C АЦПУ
10 блок отображения графической информации
14 графопостроитель
34, 35 телекоммуникационный интерфейс: передатчик и приёмник

Логическая запись

Сектор записи:

<код сектора> <тип> <длина> <данные> <тип> <длина> <данные> …
Код Значение
02 первый сектор многосекторной записи
03 последний сектор многосекторной записи
1C концевая запись
8B запись целиком в одном секторе
8F промежуточный сектор

Служебный заголовок сектора данных занимает один байт, а не два, как у программных секторов; под данные остаётся 255 байт.

Идентификатор значения — два байта:

Тип Длина Значение
00 всегда 08 число
40 1…253 строка символов, КОИ-8

Документация[1] описывает также целое значение длиной 2 байта, но на дисковых образах такие значения не встречаются: у типа 00 длина всегда 8.

Хвост сектора после последнего значения — нули. Значение, не помещающееся в сектор целиком, переносится в следующий сектор полностью; остаток предыдущего сектора при этом не затирается, и там остаётся копия ранее записанных значений.

Массив в списке записи и чтения разворачивается в свои элементы, строка за строкой.

Формат числа

Восемь байт, двоично-десятичный.

Байт Значение
0–5 цифры 1…12 мантиссы, BCD, старшая первой
6 порядок, знаковое двоичное (дополнительный код)
7 старшая тетрада — 13-я цифра мантиссы, младшая — знак: 0 плюс, 1 минус
значение = d1 d2 d3 . d4 … d13 × 1000 ^ порядок

Мантисса — 13 цифр с точкой после третьей, что даёт заявленные для машины 13 значащих разрядов. Порядок берётся по основанию 1000, а не 10: нормализованная мантисса лежит в диапазоне [1, 1000).

Первая значащая цифра стоит на позиции 1, 2 или 3, поэтому число значащих разрядов в записи на диск равно 13, 12 или 11 соответственно.

Примеры: 00 10 00 00 00 00 00 00 — единица, 00 80 00 00 00 00 00 00 — восьмёрка.

Десятично-упакованный формат

Операторы PACK( (токен 48) и UNPACK( (5D) укладывают числа в символьное поле по образу печати, вида [+|-] ### [.###] [^^^^].

  • Две цифры на байт, старшая тетрада первой, разряды в порядке образа.
  • Размер группы: число тетрад = знак плюс количество знаков #, округлить вверх до целого байта, плюс байт порядка при ^^^^.
  • Образ #### занимает ровно два байта.

Тетрада знака (0 плюс, 1 минус) и байт порядка со знаком на дисковых образах не встречаются и приняты по устройству восьмибайтового числа.

Поток значений переменных

Секторы, следующие за программой в оттранслированном программном файле, содержат значения переменных, записанные в том же формате логической записи. Для файла DIG DEM: сектор начинается идентификатором 02, за ним 25 записей по 10 байт (00 08 и восемь байт значения), последние 5 байт сектора не используются — 1 + 25 × 10 + 5 = 256.

Не установлено

  1. Кодирование целого значения длиной 2 байта, описанного в документации.
  2. Тетрада знака и байт порядка в десятично-упакованном формате.
  3. Токен формы DATA SAVE DA … END и приёмника адреса в скобках у BA и DA: документация их описывает, в оттранслированных файлах они не встречаются.
  4. Округляет или усекает машина разряды, не поместившиеся в восьмибайтовое число.

Примечания

  1. 1,0 1,1 Баласанян В. Э., Богдюкевич С. В., Шахвердов В. А. Программирование на микроЭВМ «Искра 226». — М.: Финансы и статистика, 1987. — 264 с.: ил. — разделы 11.5, 18.1–18.9.

Источники

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