Искра-226/Графический буфер BASIC 02
| Этот документ создан для 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 по два байта, дополнительный код |
E1–E3 |
перо 1…3; перо 2 гасит точки |
E4 |
задать начало координат |
E5 |
сброс: начало координат в левый нижний угол |
E6 |
короткий двоичный вектор: ΔX и ΔY по байту |
E7 |
скопировать поле на принтер |
FA |
вернуть точку в начало координат |
Рисуют из них только векторы E0 и E6; остальное задаёт состояние.
Три кода, встречающиеся в программах Искры, в таблицу 2282 не попадают: 01, пара 01 02 и последовательность 08 0B 09 06. Значит блок отображения Искры повторяет Wang не полностью.
Перевод строки, который оператор PRINT дописывает сам, на графическое устройство не уходит: у графического поля строк нет.
Не установлено
- Байты заголовка 7–39 — где хранится отображение
WINDOW/FRAME/ORIGIN. - Байты заголовка 40–43. Прикладные программы держат там пару чисел, к которым прибавляется сдвиг
¤MOVE, и требуют неотрицательного итога; читаются они старшим байтом вперёд, в отличие от остального заголовка. - Код записи
83. - Смысл второго и третьего байта признаков надписи.
- Подкоды операторов
ORIGIN,DNPLOT,NDRAW. - Побочное действие оператора
¤LET. - Управляющие коды устройства
10:01,01 02,08 0B 09 06. - Код ошибки, который получает
ON ERRORпри выходе преобразования за пределы растра.
Примечания
Источники
- Баласанян В. Э., Богдюкевич С. В., Шахвердов В. А. Программирование на микроЭВМ «Искра 226». — М.: Финансы и статистика, 1987.
- 2282 Graphic CRT Plotter User Manual — управляющие коды графического устройства.
- Реконструкция по программам
SLIDE(редактор графических объектов),SIG,EDITOR,VICT,STAT01,FAN01и по готовой картинке с дискового образа — 196 записей потока.