Ресурсы УКНЦ/Глава 4

Материал из Emuverse

Глава 4. Встроенная графика

  • Стандартные задачи графики
  • Стандартный доступ (% ! 0)
  • Код АЦЭ
  • Нестандартный доступ, переменные.
  • Многоэкранная графика
  • Алгоритмы графики, переменные.
  • Инициализация графики

Мы не случайно выделили графику в отдельную главу. Вшитая в ПЗУ УК, она занимает более одной пятой постоянной памяти машины и выполняет весьма полезные вещи.

Встроенная графика позволяет выполнять следующие функции:

  • рисование точки заданным цветом
  • рисование отрезка заданным цветом
  • рисование прямоугольника заданным цветом
  • заполнение контура заданным цветом
  • заполнение области заданным цветом

Процедуры графики могут вызываться как со стороны ЦП (по каналу К0), так и стороны ПП (прямое обращение к процедурам). То есть можно считать, что графика может быть вызвана как стандартным так и нестандартным способом.

Оба эти способа подробно описаны в этой главе. Начнем со стандартного.

§ 11. Стандартное обращение к графике

Графический режим и его включение.

Итак, мы работаем с канал К0, из ЦП, либо с буфером из ПП. Работа с графикой сводится к тому, что мы посылаем на терминал команды (коды). Эти команды принимаются программой управления графикой, а та в свою очередь, запускает нужные процедуры с нужными параметрами.

Вообще у терминала УК-НЦ 2 режима - символьный и графический. Первый разобран в главе "Стандартный экранный вывод" и включает в себя вывод на экран символов и запуск спецфункций.

Второй - графический - включается спецфункцией 45 ("%""). После его включения коды, посланные на терминал, анализируются особым образом и к программе экранного вывода отношения уже не имеют. Они обрабатываются программой управления графикой. Она запускается последовательностью кодов:

Символ: <33> % ! 0 Код: 33 45 41 60.

Это и есть включение графического режима.

Первые два кода вызывают СФ-45, третий ("!") здесь поставлен, видимо, для пущей серьезности, а четвертый ("0") означает, что вызывается программа управления графикой.

Вообще последний код может быть любым, и к сведению принимаются лишь два младших его бита. Если они нулевые - это графика, выключается курсор и вызывается наша программа. Если же они ненулевые (младшая цифра кода - 1,2,3, или 5,6,7), просто идет вызов СФ-27, которая, как известно включает систему команд №1. Всё это можно проследить по блок схеме СФ-45 (схема 11.0) <- [47,48]

Система координат графического режима стандартная: точка (0,0) - это левый нижний угол экрана.

11.1 Операции графического режима

После того, как был включен графический режим, ПП ожидает поступления кодов, которые будут интерпретироваться как команды графики.

Общий формат таких посылок таков:

<33> <Команда> <Литера> [Параметры].

Здесь <Команды> и <Литера> - это коды, представляющие ту или иную операцию, а [Параметры] - последовательность байт в особом формате, которая может означать цвет либо координаты. В зависимости от операции, количество байт параметров может быть различным - от нуля до 13.

Такая форма вызова операций (через 33(8)) похожа на вызов спецфукнций. Однако ещё раз отметим, что в спецфункциям графические команды не относятся.

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

TODO: Табл. 11.1. Вызов операций графического режима.

11.2 Форматы представления данных

В таблице 11.1 в графе "Параметры" в угловых скобках обозначены данные, передаваемые через буфер.

Эти данные могут означать либо 1 число (цвет), либо пару чисел (координаты).

Число в формате АЦЭ.

Число в этом формате трансформируется в 3 байта.

Это делается следующим образом:

1) 16 битное слово разбивается на 3 част - две шестибитные и одну четырехбитное.

TODO: иллюстрация

2) каждая часть дополняется до 8 бит обязательной приставкой, а 3 часть - ещё и знаком.

TODO: иллюстрация

В результате у нас появляются 3 байта.

Пара координат в формате АЦЭ

В этом случае два 12-битных числа представляются в виде 5-байт. Стратегия та же - каждое число разбиваем на части, а затем компонуем эти части вместе с приставками.

TODO: иллюстрация

Такое "интересное" представление данных введено, по-видимому, для совместимости с более ранними версиями терминальной системы команд. Для графики УК-НЦ эти преобразования на пользу не пошли: для того чтобы запустить операцию с параметрами из ЦП, приходится сначала зашифровать данные в код АЦЭ, послать в таком виде в канал, а затем ПП расшифровывает их в обычный формат, рассовывая их по ячейкам-переменным (в нормально формате). Разумеется это долго!

Далее, в следующем параграфе, мы покажем, где в ОЗУ ПП хранятся графические переменные и как напрямую вызывать графические процедуры.

Сейчас же любители покопаться в недрах машины могут посмотреть, как работает программа управления графикой (остальные смело листайте к П.12).

11.3 Работа управляющей программы

Итак, действие СФ-45 привело к тому, что после выключения курсора (CALL 111632) была вызвана программа управления графикой (CALL 135436). На схеме 11.3 представлено "ядро" этой программы.

Запустившись, система сохраняет R5 в стеке и присваивает R5 значение SP. Затем идёт вызов директора начальной таблицы (CALL 136274), а по выходе из него анализируется R0.

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

Что такое директор начальной таблицы? Вспомним, что все управляющие последовательностями графики начинаются с кода 33(8). Директор, приняв этот код, запускает директор команд. Тот, в свою очередь, анализирует второй поступивший код и т.д.

Вообще работа директора сводится к следующему:

В специальной таблице (например, в начальной таблице или в таблице команд) хранятся коды и адреса, соответствующие этим кодам. Все очень просто: директор, найдя поступивший код в таблице, отправляется по соответствующему адресу. В случае если такого кода в таблице нет, идёт переход на адрес, по которому просто R0 присваивается 1 и идёт возврат в предыдущий директор.

Имеется 3 "слоя" директоров:

1-й - верхний, это директор начальной таблицы, он распознает код 33 и запускает директор команд.

2-й слой состоит из одного директора команд. Этот анализирует команду (2-й поступивший код) и запускает литерные директоры.

3-й слой - это 6 литерных директоров.

каждой команде соответствует свой литерный директор. Он распределяет управление уже непосредственно в зависимости от литеры (3-е кода)

На схемах 11.3 приведены блок-схемы литерных директоров. Все они идентичны, за исключением одной цифры - адреса литерной таблицы, с которой эти директоры работают. Литерные таблицы показаны тут же.

Резюме к § 11

- У терминала УК 2 режима - символьный и графический.

- Графический режим заключается в том, что коды, посланные на терминал, анализируются особым образом и ни к символам, ни к спецфункциям отношения не имеют. Он включается последовательностью кодов:

<33> % ! 0.

- Операции графического режима вызываются последовательностью кодов. Каждая последовательность состоит из 3 байт и параметров:

  1 байт - 33(8)
  2 байт - код команды
  3 байт - код литеры
  У некоторых операций параметры отсутствуют.

- Каждая операция однозначно определяется командой и литерой.

- Параметрами графических операций могут быть числа со знаком, означающие цвет, либо пара координат - (X,Y).

- Эти параметры передаются по каналу К0 в закодированном виде. Число преобразуется в 3 байта, а пара координат - в в 5 байт.

- Анализом кодов команд и литер занимается программа управляющая графикой, которая каждой дозволенной комбинации кодов ставит в соответствие адрес и отправляется на него. Так запускается графическая операция.


§ 12 Работа графических операций

12.0 Ненужные операции

Мы остановились на том, что "правильная" комбинация кодов команд и литер вызывает операцию. К имеющимся в таблице 11.1 операциям можно присовокупить ещё несколько, практической пользы не имеющих, то есть ничего не делающих. Это:

R U
R D
U E
U D 
Хотя управляющая программа на них откликается, все они пустые.
Есть ещё 2 операции, смысл коих до конца не ясен.
M M
M V 

Теперь все существующие операции мы рассмотрим по порядке.

На схеме 12.1 показано их действие.

12.1 Действие стандартных операций

L I

Установка цветов символьного режима

Начальный адрес - 136414

Параметры: <Цс> <Цз> <Цэ> (цвет символа, знакоместа и экрана)

Действие: В текущую экранную карту пишет цвет символа, знакоместа и экрана. Цвета символа и знакоместа пишет в РТ и РФ соответственно.

Работа. С помощью подпрограммы 143756 число из формата АЦЭ преобразуется к нормальному формату и записывается в ячейку 23424. Оттуда цвет переписывается в соответствующую ячейку. Это повторяется 3 раза. Цвета пишутся в ячейки:

23456 - символа 23460 - знакоместа 23462 - экрана.

Эти ячейки заталкиваются в стек и вызывается процедура 117026. В ней из стека цвета переписываются в экранную карту и в ячейки 7160, 7162, 7164, а затем в РТ и ТФ. По выходе из процедуры восстанавливается стек и происходит стандартный выход из операции.

M L

Установка цвета для прямой

Начальный адрес - 136542

Параметр - <Цп> (цвет для прямой и точки).

Действие: в ячейку 23442 переписывается цвет прямой.

Работа. Используется процедура 143756 для преобразования в нормальный формат.

M M

Установка цвета чего-то

Начальный адрес - 136562

Параметр - <Ц?>

Действие: в ячейку 23446 пишется число (цвет, наверное).

Работа: Аналогична ML.

M P

Установка цвета заполнения.

Начальный адрес - 136602

Параметр - <Цf>

Действие: а ячейку 23450 пишется цвет заполнения *отрицательное число 0...7 в дополнительном коде).

Работа: Аналогична ML.

M V

Установка цвета чего-то

Начальный адрес - 136622

Параметр - <Ц?>

Действие: в ячейку 23444 пишется поступившее число

Работа: Аналогична ML

R D

Пустое действие

R U

Пустое действие

R R

BOX

Начальный адрес - 136706

Параметры: <X1 Y1> <X2 Y2> <Цв>

Действие: Рисует закрашенный цветом Цв прямоугольник с координатами диагонали (X1, Y1) - (X2, Y2).

Работа. Процедура 144104 преобразует первую пару координат (X1, Y1) в нормальный формат и пишет их в ячейки 23420 и 23422:

X -> (23420)
Y -> (23422).

Затем эти значения сравниваются с максимальными:

Xmax = (23412)
Ymax = (22664),

и, если меньше их, то берется вторая пара координат и преобразуется в обычный формат. Также проверяются их значения, и, если они не выходят за установленные пределы, считывается цвет и преобразуется к нормальному виду. Получившиеся 5 слов:

Цв, Y2, X2, Y1, X1

заталкиваются в стек и выполняется процедура 144666, которая, собственно, и рисует BOX.

Затем восстанавливается указатель стека и управление возвращается в управляющую программу.

T D

Установка цвета курсора

Начальный адрес - 137122

Параметры - <Ц1> <Ц2>

Действие: Устанавливает цвет курсора рабочего экрана.

Работа. Принимается первый цвет процедурой 143756 и пишется в ячейку 23452, затем второй - он пишется в ячейку 23454. Первый байт через стек передается в процедуру 117004, где из него выделяется 4 младших бита. Они пишутся в ячейку 7166, а также в ЭК рабочего экрана - в ячейку 22742. Второй цвет никуда не пишется, он так и сидит в (23454). Заканчивается всё традиционно - R0=1, JMP 136046.

U A

Управление цветом точки

Начальный адрес - 137222

Параметры - отсутствуют

Действие: цвет текущей точки посылается по K0 в формате АЦЭ. Посылка завершается кодом 15(8) ("ВК").

Работа: РА - (1770?0) загружается из переменной (23430), которая содержит адрес текущей точки в ВОЗУ. Считывается РО (177024), при этом РО - (177020) и (177022) - загружается содержимым планов по этому адресу. Затем проверяется позиция точки в октете (23440), и, в зависимости от того, в какой половине октета покоится искомая точка, R0 загружается либо первым (177020), либо вторым (177022) словом РФ. Дальше, после некоторых хитрых манипуляция цвет текущей точки оказывается-таки в стеке, и с помощью процедуры 144304 он отправляется в канал в весьма зашифрованном виде. Затем в канал посылается код 15, и операция заканчивается.

U B

Fill

Начальный адрес - 137334

Параметры - отсутствуют

Действие: Начиная с текущей точки (её координаты хранятся в паре ячеек:

X = (23414)
Y = (23416)),

начинается заполнение цветом Цf (ячейка (23450)) экрана. Точки, закрашенные цветом Цп (ячейка (23442)), заполнению не подлежат. А поскольку заполнение осуществляется последовательно, точка за точкой, без скачков, то замкнутый контур нарисованный цветом прямой, будет заполнен изнутри (если текущая точка находится у него внутри) или будет "окружен" цветом Цf снаружи (если точка снаружи).

Работа. Ячейки (23414) и (23416) - X и Y - меняются местами, затем вызывается процедура 151714, по выходе X и Y восстанавливается первоначальными значениями.

Процедура 151714 делает следующее. В стек записываются регистры (CALL 147662), делается начальная установка переменных (CALL 151756), устанавливается режим закрашивания ((23634)=0), запускается сама процедура заполнения, затем восстанавливаются переменные (CALL 176300) и регистры (CALL 147706).

U C

Refill

Начальный адрес - 137334

Параметры - отсутствуют

Действия: функция зеркальная операции U B (в прямом и переносном смысле). Во-первых эта операция перекрашивает область, окрашенную цветом Цп, в цвет Цf (а "U B" делает наоборот - не трогает точки с цветом Цп). Во-вторых, координаты текущей точки меняются местами: X - это Y, а Y - это X. Иными словами, от точки с координатами (X,Y) идет перекрашивание точек, сообщающихся с текущей, окрашенных в Цп.

Работа. Аналогична "U B", но ячейки (23414) и (23416) не меняются местами (отсюда и зеркальность), и ячейка (23632) устанавливается в 177777 (режим перекрашивания).

U D

Бездействует

U E

Бездействует

U F

Установка координат тек. точки

Начальный адрес - 137442

Параметры - <XY>

Действие - принимает пару координат в коде АЦЭ и делает текущей точку с этими координатами. Однако точку на экран не ставит.

Работа. С помощью процедуры 144104 пара координат преобразуется в удобоваримый вид:

X = (23420)
Y = (23422).

Затем проверяется их попадание в габариты экрана, и, если все в порядке, выполняются необходимые манипуляции с графическими переменными.

Смысл используемых здесь переменных таков:

(23414) - X текущее (23416) - Y текущее (23420) - X требуемое (23422) - Y требуемое (23426) - позиция октета в строке (X/8) (23430) - текущий адрес ВОЗУ (23432) - адрес нижней видеостроки в таблице строк (23434) - адрес текущей видеостроки в таблице строк (23436) - октет (23440) - позиция точки в октете (0...7).

U G 

Рисование отрезка

Начальный адрес - 137620

Параметры - <XY>

Действие: Рисует отрезок прямой от текущей точки до заданной параметрами. Цвет Цп. Точка (X,Y) становится текущей.

Работа. После приёма координат и их проверки ставится первая точка, а затем рисуется весь отрезок (CALL 141330).

H H

Рисование точки

Начальный адрес - 137722

Параметры - <XY>

Действие: Рисует точку с цветом Цп с заданными координатами. Эта точка становится текущей.

Работа. Аналогична работе "U F", но в конце точка всё же ставится:

Загрузка РТ: (177016)=(23422) Загрузка РА: (177010)=(23430) Загрузка РФ: (177024)

            (177010)=(23430)

Наложение октета: (177024)=(23436)

U I

Чтение координат.

Начальный асдрес - 140140

Параметры - отсутствуют

Действие: Отправляет в канал координаты текущей точки в коде АЦЭ. Посылка завершается кодом 15(8) (ВК).

Работа. В стек отправляется содержимое ячеек (23416) и (23414), вызывается процедура 144454, которая кодирует координаты и отправляет их в канал, затем в стек идёт код 15(8) и также отправляется в канал.

% !

Режим

Начальный адрес - 140232

Параметры - № режима (1 байт)

Действие: Анализируется байт, идущий за литерой. Если он равен 60, ничего не происходит (остается графический режим). Иначе идет переключение на режим, указанный в 1-х младших битах. Если они не нулевые, идёт возврат в символьный режим.

Работа. См. "Действие".

12.2 Прямое управление графическими процедурами

Громоздкость стандартного вызова графики приводит к замедлению и усложнению графических программ. Однако для управления графикой и ПП имеется неплохая возможность - параметры писать непосредственно в ячейки, и вызывать необходимые процедуры также непосредственно. Здесь мы расскажем, как удобнее всего это делать.

Графические переменные

1. Координаты

Координаты задаются в обычном формате, т.е. одному числу соответствует слово, паре координат - 2 слова.

Пара ячеек содержит текущие координаты:

  X тек. = (23414)
  Y тек. = (23416).

Именно эти координаты считываются в канал при чтении через операцию «U I».

Ещё 2 ячейки содержат задаваемые (требуемые) координаты:

  X тр. = (23420)
  Y тр. = (23422).

Различие между этими координатами следующее. Текущие меняются графическими процедурами в процессе их работы (изнутри, а требуемые меняются лишь извне, (при задании координат для процедур.

Еще одна пара ячеек используются под максимальные значения:

  X max = (23412)
  Y max = (22664).

Ячейка (22664) - из экранной карты рабочего экрана. Она означает количество видеострок на рабочем экране.

2. Цвета

Для задания цвета предназначены 2 ячейки.

Цвет линии и точки:

  C line = (23442)

Цвет заполнения:

  C fill = (23450)

C fill имеет знач "-": цвету 7 соответствует число 177771, и 0 соответствует 0.

Эти переменные используются процедурами рисования точки и отрезка, а также заполнения. Процедура заполнения прямоугольника (box) не использует эти ячейки, цвет прямоугольника задается в стеке (см.ниже).

Три ячейки (23444), (23446) и (23454), задаваемые операциями "M V", "M M" и "T D" соответственно, не используются процедурами графики. Они могут использоваться в ваших собственных процедурах.

3. Другие переменные

Графические процедуры используют несколько ячеек под свои процедурные нужды:

- Позиция текущего октета в видео строке - (23426)
- Текущий адрес в ВОЗУ                   - (23430)
- Адрес нижней видеостроки в ТС          - (23432)
- Адрес верхней видеостроки в ТС         - (23434)
- Октет                                  - (23436)
- Позиция точки в октете (0...7)         - (23440)

Ещё одна ячейка - (23424) используется под преобразованное из АЦЭ-формата число.

Милости просим использовать эти переменные под свои нужды.

Графика в различных экранах

Графика не связана с экранными картами, поэтому операции не обязательно будут работать в текущем экране. Менять экраны весьма просто: достаточно поменять значение ячейки (23432), означающую адрес в таблице строк той строки, которую принимаем за нижнюю (Y=0). Значение этой ячейки для 4-х стандартных экранов показана в табл. 12.2

Экран (23432) верхняя инфо-строка 2460 рабочий экран 4534 служебный экран 6604 нижняя инфо-строка 7024

Номинальное значение (по умолчанию) * - 4534 - рабочий экран.

Прямой вызов графических процедур

Теперь мы подходим непосредственно к графическим процедурам, к самым полезным подпрограммам.

Их вызов, передаваемые параметры, а также действие приведены в табл. 12.3

Обращение к графическим процедурам

Название | Параметры | Вызов | Действие

"Пустая"" точка

Точка

Отрезок без точки

Отрезок

Закрашенный прямоугольник

Закрашивание

Заполнение

Такое "странное" обращение к процедурам, как для точки, например, связано с тем, что некоторые процедуры осуществляют выход не сразу через RETURN, а используют заглушку 136046.

Резюме к § 12

- Разрешенных комбинация команд и литер т.е. операций - 19. Из них 4 пустые, т.е. не выполняют никаких полезных действий. Ещё две операции не нужны для графики УК. Итого остается 13 полезных операций.

- Из этих операция 5 работают с экранами: рисуют точки, отрезки, прямоугольники, закрашивают и заполняют области.

- Остальные выполняют вспомогательные задачи: записывают считывают координаты и цвета, и одна позволяет выйти из графического режима.

- Для программ, работающих в ОЗУ ПП, вызов графических процедур можно сильно упростить: координаты и цвета писать непосредственно в ячейки - переменные графики и вызывать графические процедуры напрямую (через CALL).

- Пользоваться графикой можно в любом экране. Для смены экрана, в котором будут работать все стандартные графические процедуры, достаточно изменить содержимое всего одной ячейки - (23432).