Искра-226/Графический буфер BASIC 02

Материал из Emuverse
Версия от 18:37, 26 августа 2026; Panther (обсуждение | вклад) (Новая страница: «{{emuverse}} '''Графический буфер BASIC 02''' — формат хранения рисунка в памяти Искра-226. Буфер представляет собой '''обычный символьный массив Бейсика''': оператор <code>¤OPEN</code> объявляет массив буфером, графические операторы дописывают в него записи, оператор <code...»)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)
Этот документ создан для Emuverse и распространяется на условиях лицензии CC-BY-SA-3.0.

Графический буфер BASIC 02 — формат хранения рисунка в памяти Искра-226. Буфер представляет собой обычный символьный массив Бейсика: оператор ¤OPEN объявляет массив буфером, графические операторы дописывают в него записи, оператор ¤COPY /<адрес> выкладывает всё разом на устройство. Собственной памяти под графику у машины нет.

Буфер можно записать на диск и прочитать обратно как обычное символьное значение: см. Файловая система и Файлы данных BASIC 02. Токены графических операторов описаны в статье Кодирование BASIC-файлов.

Документация[1] графических операторов не описывает.

Растр

Графическое поле — 560 × 256 дискрет, начало координат в левом нижнем углу, точка квадратная.

Устройства вывода (адреса по таблице ФАУ[1]):

Адрес Устройство
10 блок отображения графической информации (экран)
14 графопостроитель
34 телекоммуникационный интерфейс

Группа PLOT таблицы устройств по умолчанию указывает на адрес 10.

Символьное и графическое поля — два разных устройства на одной трубке. Знаки рисует аппаратный знакогенератор, знакоместо 7 × 10 точек; 80 × 24 знакоместа занимают 560 × 240 и оставляют поля по 8 точек сверху и снизу.

Заголовок

Первые 43 байта буфера. Нумерация байт с единицы, как в операторе STR(.

Байт Значение
1–2 длина занятого, считая сам заголовок
3–4 текущая точка, X
5–6 текущая точка, Y
7–39 не установлены
40–43 не установлены; прикладные программы используют как своё место

Числа заголовка лежат младшим байтом вперёд — в обратном порядке относительно координат в самих записях.

Пустой буфер: 2B 00 00 00 00 00 и дальше нули, то есть длина 43, текущая точка 0,0. Первая запись потока ложится в байт 44.

Записи потока

Записи идут подряд начиная с байта 44, разделителей нет: длину каждой задаёт её код.

Код Оператор Запись
80 NPLOT 5 байт: код и точка
81 NDRAW то же
82 NLAB. как 86
83 не установлен
84 DOT 5 байт: код и точка
85 DRAW то же
86 LABEL код, длина, приращение, признаки, текст

Координаты — двухбайтовые двоичные, старший байт первым. Знака не имеют: отрицательных координат у растра нет.

Бит 04 кода записи — признак «рисовать». Коды 80, 81 и 82 — это стёртые 84, 85 и 86: запись остаётся в потоке и двигает текущую точку, но следа не оставляет. Стирание элемента выполняется как AND(<код>,FB), восстановление — как XOR(<код>,04). Буква N в именах означает «не рисуя».

Видимая Стёртая Действие стёртой
84 DOT 80 NPLOT перевести точку, не рисуя
85 DRAW 81 NDRAW то же
86 LABEL 82 NLAB. сдвинуть точку на приращение

Оператор ¤COPY чистит растр перед выводом: иначе стёртый элемент остался бы на экране.

Точка и приращение

Четвёрка байт после кода читается по-разному:

  • у рисующих записей (80, 81, 84, 85) это новая текущая точка, абсолютная;
  • у надписей (82, 86) это приращение к текущей точке, число со знаком.

Запись надписи

86 <длина> <приращение X: 2 байта> <приращение Y: 2 байта> <3 байта признаков> <текст в КОИ-8>

Байт длины считает сам себя. Приращение равно семи дискретам на знак — ширине знакоместа.

86 09 | 00 07 00 00 | 01 02 00 | 59            "Y"
86 0A | 00 0E 00 00 | 01 02 00 | 2D 31         "-1"

Первый байт признаков — множитель размера знака; в тексте он пишется вплотную к имени буфера (LABEL B¤()3,,,"Q") и по умолчанию равен единице. Смысл двух остальных не установлен; на дисковых образах они всегда 02 00.

Операторы

Все графические операторы — двухбайтовые, с префиксом 06.

Подкод Оператор Действие
00 PLOT вывод прямо на устройство, минуя буфер
0F ¤OPEN объявить символьный массив буфером
13 DOT поставить точку по координате
14 DDRAW отрезок по приращению от текущей точки
15 DRAW отрезок до координаты
19 NPLOT перевести текущую точку по координате, не рисуя
1A ¤MOVE сдвинуть картинку
1B TURN повернуть картинку вокруг точки
1C STRETCH растянуть картинку относительно точки
1D FRAME задать окно буфера в пользовательских единицах
1E LABEL надпись
1F ¤COPY вывести буфер на устройство
22 ¤LET присваивание буфера
23 WINDOW задать окно устройства в дискретах

Три способа задать точку: NPLOT, DRAW, DOT и LABEL берут координату; DDRAW — приращение от текущей точки; PLOT — тоже приращение, но кладёт результат не в буфер, а на устройство.

Имена ORIGIN, DNPLOT и NDRAW встречаются в текстовых листингах, но подкодов не имеют: все подкоды, встречающиеся в оттранслированных файлах, уже опознаны. DNPLOT по смыслу — приращение без следа.

Преобразования

Операторы ¤MOVE, TURN и STRETCH переписывают уже лежащие в буфере записи, новых не добавляя.

Оператор Операнды
¤MOVE буфер, сдвиг по X, сдвиг по Y
TURN буфер, X и Y точки, угол поворота
STRETCH буфер, X и Y точки, масштаб по X, масштаб по Y

Названная точка у TURN и STRETCH неподвижна. Единица измерения угла — общая с тригонометрическими функциями, задаётся операторами SELECT D, SELECT R и SELECT G.

Три оператора обратимы: последовательность из растяжения, поворота и обратного растяжения возвращает картинку на место.

Выход за пределы растра — ошибка машины, перехватываемая оператором ON ERROR.

Присваивание буфера

¤LET <буфер> = <буфер>        копирование картинки
¤LET <буфер> = 0              опустошение буфера

В известных программах первая форма встречается только присваиванием буфера самому себе, что записей не меняет; побочное действие такого оператора не установлено.

Система координат

Оператор Операнды Что задаёт
WINDOW <x0>,<x1>,<y0>,<y1> область на устройстве, в дискретах; имени буфера в операндах нет — область общая
FRAME <буфер>,<x0>,<x1>,<y0>,<y1> ту же область в пользовательских единицах, своя у каждого буфера
ORIGIN <буфер>,<dx>,<dy> смещение начала координат

Границы WINDOW — целые дискреты, границы FRAME бывают дробными и отрицательными: это диапазон самих данных.

В записях буфера лежат дискреты устройства, а не пользовательские единицы. Перевод выполняется при добавлении записи, а FRAME с ORIGIN его и задают. Ни FRAME, ни ORIGIN ничего не рисуют.

По умолчанию отображение тождественное: программы, работающие прямо в дискретах экрана, WINDOW и FRAME не вызывают вовсе.

Где машина хранит это отображение, не установлено. В заголовке буфера на него остаются непрочитанные байты 7–39.

Оператор PLOT

Единственный графический оператор, который рисует прямо на устройстве группы PLOT, минуя буфер. Буфера в операндах нет.

PLOT <x,y,перо>,<x,y,перо>,…

Группа ограничена токенами D7 и D4 (< и >), группы и элементы внутри группы разделяются DE. Элементов ровно три, любой может быть пуст.

Координаты — приращения, а не точки. Первая группа серии отсчитывается от начала координат.

Третий элемент — перо, отдельные однобайтовые метки:

Байт Буква Смысл
E5 U перо поднято: сдвиг без следа
E6 D перо опущено: отрезок
E7 R сброс: перо в начало координат, размеры по умолчанию
E8 S шаг знака по X и Y
E9 C размер знака

Те же байты в позиции операнда означают константы и унарный минус; метка узнаётся по месту — третий элемент группы, за которым сразу стоит DE или D4. Третьим элементом бывают также выражение, строковый литерал и вырезка STR(…).

Буквы S и C — законные имена переменных, и различает их тоже только место в группе.

Управляющие коды устройства 10

Графическое устройство принимает короткие управляющие последовательности оператором PRINT /10,HEX(…). Коды соответствуют документации на Wang 2282 Graphic CRT[2]:

Код Действие
03 гасит поле, точка встаёт в начало координат, перо поднимается
04 выбрать принтер
06 выбрать графическую трубку
0A шаг между знаками, из предшествующего вектора
0D размер знака 1…15, из ΔX предшествующего вектора
0E перо поднято
0F перо опущено
E0 длинный двоичный вектор: ΔX и ΔY по два байта, дополнительный код
E1E3 перо 1…3; перо 2 гасит точки
E4 задать начало координат
E5 сброс: начало координат в левый нижний угол
E6 короткий двоичный вектор: ΔX и ΔY по байту
E7 скопировать поле на принтер
FA вернуть точку в начало координат

Рисуют из них только векторы E0 и E6; остальное задаёт состояние.

Три кода, встречающиеся в программах Искры, в таблицу 2282 не попадают: 01, пара 01 02 и последовательность 08 0B 09 06. Значит блок отображения Искры повторяет Wang не полностью.

Перевод строки, который оператор PRINT дописывает сам, на графическое устройство не уходит: у графического поля строк нет.

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

  1. Байты заголовка 7–39 — где хранится отображение WINDOW/FRAME/ORIGIN.
  2. Байты заголовка 40–43. Прикладные программы держат там пару чисел, к которым прибавляется сдвиг ¤MOVE, и требуют неотрицательного итога; читаются они старшим байтом вперёд, в отличие от остального заголовка.
  3. Код записи 83.
  4. Смысл второго и третьего байта признаков надписи.
  5. Подкоды операторов ORIGIN, DNPLOT, NDRAW.
  6. Побочное действие оператора ¤LET.
  7. Управляющие коды устройства 10: 01, 01 02, 08 0B 09 06.
  8. Код ошибки, который получает ON ERROR при выходе преобразования за пределы растра.

Примечания

  1. 1,0 1,1 Баласанян В. Э., Богдюкевич С. В., Шахвердов В. А. Программирование на микроЭВМ «Искра 226». — М.: Финансы и статистика, 1987. — 264 с.: ил.
  2. 2282 Graphic CRT Plotter User Manual. — Wang Laboratories, 700-4627A, 10-81. — разд. 3.2 «Control Codes».

Источники

  • Баласанян В. Э., Богдюкевич С. В., Шахвердов В. А. Программирование на микроЭВМ «Искра 226». — М.: Финансы и статистика, 1987.
  • 2282 Graphic CRT Plotter User Manual — управляющие коды графического устройства.
  • Реконструкция по программам SLIDE (редактор графических объектов), SIG, EDITOR, VICT, STAT01, FAN01 и по готовой картинке с дискового образа — 196 записей потока.