Основы работы с графическим экраном


Главная / ЭКВМ / Программы / Примеры

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

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



Порядок действий

Для использования графического экрана ЭКВМ требуется выполнить ряд действий:

  • инициализировать графический экран;
  • изменить параметры графического вывода, установленные по умолчанию, если это требуется;
  • для каждого из объектов:
    • установить атрибуты вывода, если они отличаются от ранее установленных;
    • установить начальные координаты, если это необходимо;
    • вывести очередной объект;
  • вывести изображение на индикатор ЭКВМ командой "К ГРФ";
  • ожидать реакции пользователя или истечения определённого времени;
  • выйти из программы или продолжить её выполнение.



Инициализация графического экрана, изменение параметров вывода

Инициализация графического экрана выполняется записью целого числа от 0 до 3 в регистр функции R9010.

Результат при записи числа:

  • 0 - белый экран, параметры не инициализируются;
  • 1 - чёрный экран, параметры не инициализируются;
  • 2 - белый экран, параметры инициализируются значениями по умолчанию;
  • 3 - чёрный экран, параметры инициализируются значениями по умолчанию.

Использование чисел 0 и 1 не рекомендуется, они оставлены для совместимости с ранними версиями ПО ЭКВМ. При их использовании следует самостоятельно записать необходимые значения во все регистры, соответствующие параметрам вывода.

Число 2 - наиболее часто употребляемый параметр, который выполняет "сброс экрана", то есть установку белого фона и удаление всех ранее выведенных объектов.

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

При записи чисел 2 и 3 автоматически заполняются регистры:

  • R9000 - значения начальных координат X0 и Y0 обнуляются (вывод объекта будет производиться в левый верхний угол экрана);
  • R9001 - атрибуты вывода объекта устанавливаются в 0 (замена), либо в 4 (инверсия и замена) для параметров 2 и 3 соответственно;
  • R9002 - расстояние между символами при выводе текста составляет минимальный пробел (1 точка);
  • R9003 - номер шрифта 0 (системный шрифт высотой 8 точек);

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

Одной из типичных ошибок является отсутствие инициализации графического экрана в начале программы. После включения ЭКВМ не очищает содержимое буфера и оно оказывается заполнено "мусором", на фоне которого выводимые объекты могут потеряться.

Вид экрана после включения и до инициализации (можно просмотреть командой "К ГРФ") - может отличаться от приведённого, в том числе содержать части ранее выведенных изображений.

Вид при инициализации числом 2,
команды: "2", "РР П 9010", "К ГРФ".

Вид при инициализации числом 3,
команды: "3", "РР П 9010", "К ГРФ".



Установка координат вывода

Графический экран ЭКВМ имеет 128 точек по горизонтали и 64 точки по вертикали. Начало координат расположено в левом верхнем углу индикатора. Числовые значения горизонтальной координаты возрастают слева-направо (от 0 до 127), вертикальной - сверху-вниз (от 0 до 63).

Для установки координат вывода следует занести значение вертикальной координаты начальной позиции вывода объекта (Y0) в регистр Y стека, горизонтальной координаты (X0) - в регистр X стека. После этого записать указанные значения в регистр функции R9000 командой "РР П 9000". Функция R9000 переносит значения из обоих регистров стека одновременно - для установки вертикальной и горизонтальной координаты достаточно одного вызова функции.

Например, для установки координат X0=63, Y0=31 (вблизи от центра экрана) требуется ввести команды: "31", "B↑", "63", "РР П 9000". Порядок ввода связан с особенностями стека - первое число вводится в RX и поднимается в RY командой "B↑", второе число вводится в RX.

Начальные координаты отрезка - это координаты первой (начальной) точки. Для других объектов (изображений, прямоугольников, текста) - координаты верхнего левого угла.

При выводе графического объекта значение начальных координат не изменяется. Перед выводом каждого следующего объекта координаты следует задавать заново.

Единственное исключение - вывод чисел, текста и отдельных символов. При выводе очередного символа вертикальная координата Y0 не изменяется, а горизонтальная X0 автоматически увеличивается на ширину выведенного символа сложенную со значением параметра "расстояние между символами" (R9002). Между символами на экран выводится пустой прямоугольник. Таким образом, после вывода очередного символа координата X0 указывает на место вывода следующего.

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



Вывод объекта

Вывод точки (R9011)

Точка выводится при помощи регистра функции R9011. Перед этим в регистр стека X записывается горизонтальная координата точки, в регистр Y - вертикальная.

При обращении к функции учитываются атрибуты вывода из R9001. При записанном нуле - точка имеет "чёрный" цвет, при атрибуте 4 - "белый".

В примерах экран очищен командами "2", "РР П 9010" - нулевые атрибуты в R9001 устанавливаются автоматически.

Точка в (0,0), команды:

"Cx", "B↑", "РР П 9011".

Команда "Cx" заносит в регистр X число ноль. Начало координат - в верхнем левом углу.

Точки в (63,31) и (64,32), команды:

"3", "1", "B↑", "6", "3", "РР П 9011",

"3", "2", "B↑", "6", "4", "РР П 9011".

Центр экрана расположен между этими точками, поскольку общее количество точек по горизонали и вертикали - чётное.

Точка в (127,63), команды:

"6", "3", "B↑", "1", "2", "7", "РР П 9011".

Координаты правого нижнего угла (127,63) - нумерация точек начинается с нулевого значения.


Вывод линии (R9012)

Координаты начала отрезка определяются содержимым регистра R9000. Координаты конца передаются через стек, так же, как и для точки. Для рисования "чёрным" цветом устанавливаются нулевые атрибуты в R9001.

Для примера рассмотрим вывод равностороннего треугольника. Его высота относится к длине стороны, как √3/2.

Очищаем экран, устанавливаем начальные координаты верхнего угла в (63,2), команды:

"2", "РР П 9010".

"2", "B↑", "6", "3", "РР П 9000".

Проводим левую сторону до точки (29,62):

"6", "2", "B↑", "2", "9", "РР П 9012".

Проводим правую сторону до точки (98,62):

"6", "2", "B↑", "9", "8", "РР П 9012".

Переносим начальные координаты в (29,62) и проводим основание до точки (98,62):

"6", "2", "B↑", "2", "9", "РР П 9000".

"6", "2", "B↑", "9", "8", "РР П 9012".


Вывод прямоугольника (R9013)

Координаты верхнего левого угла прямоугольника определяются содержимым R9000. Через регистры стека передаётся длина стороны прямоугольника по соответствующей координате.

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

Для вывода "чёрного" прямоугольника атрибуты (R9001) должны быть равными нулю.

Очищаем экран, устанавливаем начальные координаты верхнего угла в (2,2) и выводим прямоугольник высотой 10 и длиной 124 точки:

"2", "РР П 9010",

"B↑", "РР П 9000",

"1", "0", "B↑", "1", "2", "4", "РР П 9013".

Устанавливаем начальные координаты верхнего угла в (52,2) и выводим такой же прямоугольник:

"5", "2", "B↑", "2", "РР П 9000",

"1", "0", "B↑", "1", "2", "4", "РР П 9013".

Устанавливаем начальные координаты верхнего угла в (59,27) и выводим квадрат 10×10 точек:

"2", "7", "B↑", "5", "9", "РР П 9000",

"1", "0", "B↑", "РР П 9013".


Вывод рамки (R9014)

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

Очищаем экран, устанавливаем начальные координаты верхнего угла в (2,2) и выводим рамку высотой 10 и длиной 124 точки:

"2", "РР П 9010",

"B↑", "РР П 9000",

"1", "0", "B↑", "1", "2", "4", "РР П 9014".

Устанавливаем начальные координаты верхнего угла в (52,2) и выводим ещё одну аналогичную рамку:

"5", "2", "B↑", "2", "РР П 9000",

"1", "0", "B↑", "1", "2", "4", "РР П 9014".

Устанавливаем начальные координаты верхнего угла в (59,27) и выводим квадратную рамку 10×10 точек:

"2", "7", "B↑", "5", "9", "РР П 9000",

"1", "0", "B↑", "РР П 9014".


Другие объекты

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

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



Вывод на индикатор

Вывод графического экрана на индикатор ЭКВМ выполняется командой "К ГРФ" ("K GRPH" в латинской транскрипции).

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

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

Поэтому, в зависимости от назначения программы, можно поступить различными способами, к примеру:

  • Не использовать команду "К ГРФ" в программе, а просмотреть содержимое экрана вручную после окончания её работы.
  • Сразу после команды вставить бесконечный цикл из команды "БП NN", которая передаёт управление сама на себя. В таком случае выход из программы выполняется командой "С/П".
  • Запрограммировать таймер и проверять содержимое его регистра. По достижении нуля выйти из программы или вывести следующее изображение.
  • Проверять состояние клавиатуры. При нажатии клавиши выйти из программы или вывести следующее изображение.

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



Использование атрибутов вывода

Ранее упоминались только два значения атрибутов вывода (R9001). Нулевое значение, которое выводит объект без изменений, и значение 4, которое инвертирует его перед выводом, позволяя рисовать "белым" по "чёрному".

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

Нижеприведённая программа предварительно создаёт фон, состоящий из вертикальных линий и чёрного квадрата левее и выше центра экрана. Затем изменяет атрибуты на заданное пользователем значение и дополнительно выводит графический объект, состоящий из горизонтальных линий.

Результаты представлены в таблице. Значение атрибутов вывода от 0 до 7 следует ввести в регистр стека X перед запуском программы.

0

Объект заменяет исходное изображение

1

Над каждой точкой объекта и исходного изображения проводится операция логического умножения - AND (конъюнкция, логическое "И")

2

Над каждой точкой объекта и исходного изображения проводится операция логического сложения - OR (дизъюнкция, логическое "ИЛИ")

3

Над каждой точкой объекта и исходного изображения проводится операция логического сложения по модулю 2 - XOR (исключающее "ИЛИ")

4

Объект инвертируется (над каждой точкой выполняется операция NOT, логическое "НЕ"), после чего заменяет исходное изображение

5

Объект инвертируется, после чего над каждой точкой объекта и исходного изображения проводится операция логического умножения - AND

6

Объект инвертируется, после чего над каждой точкой объекта и исходного изображения проводится операция логического сложения - OR

7

Объект инвертируется, после чего над каждой точкой объекта и исходного изображения проводится операция логического сложения по модулю 2 - XOR




Программа primgraph1.mkp (192 байта, КС 17848/98)

  0 1 2 3 4 5 6 7 8 9
0000 П A 1 П C П 4 6 3 П B П 0 2 PP П
0010 90 10 0 B↑ ИП 4 PP П 90 00 ИП B ИП C
0020 PP П 90 13 K ИП 4 K ИП 4 F L0 12 8 B↑ 4
0030 0 PP П 90 00 3 2 B↑ PP П 90 13
0040 ИП A PP П 90 01 2 3 B↑ 5 5 PP П
0050 90 00 0 0 6 2 PP П 90 15 K ГРФ
0060 БП 60 20h 20h 55h 55h 55h 55h 55h 55h
0070 55h 55h 55h 55h 55h 55h 55h 55h 55h 55h
0080 55h 55h 55h 55h 55h 55h 55h 55h 55h 55h
0090 55h 55h 55h 55h 55h 55h 55h 55h 55h 55h
0100 55h 55h 55h 55h 55h 55h 55h 55h 55h 55h
0110 55h 55h 55h 55h 55h 55h 55h 55h 55h 55h
0120 55h 55h 55h 55h 55h 55h 55h 55h 55h 55h
0130 55h 55h 55h 55h 55h 55h 55h 55h 55h 55h
0140 55h 55h 55h 55h 55h 55h 55h 55h 55h 55h
0150 55h 55h 55h 55h 55h 55h 55h 55h 55h 55h
0160 55h 55h 55h 55h 55h 55h 55h 55h 55h 55h
0170 55h 55h 55h 55h 55h 55h 55h 55h 55h 55h
0180 55h 55h 55h 55h 55h 55h 55h 55h 55h 55h
0190 55h 55h                

Перед запуском в регистр стека X записывается значение атрибутов вывода от 0 до 7. Выход из программы выполняется нажатием клавиши "С/П".

Несложно заметить, что основная программа занимает 62 байта. Остальные 130 байт - изображение размером 32x32 точки, состоящее из горизонтальных линий.

Текст программы primgraph1.mkl для кросс-компилятора:



.CHARSET 1251
; Файл primgraph1
; Лицензия GPL 2+
; НПП "СЕМИКО", г. Новосибирск, 2013
; mail@semico.ru

.ORG 0	
; Начало программы
	MA 	; сохранение введённых атрибутов
	1 MC M4	
	63 MB M0

	2 PP M 9010	; очистка экрана

; вывод вертикальных полос	
A1:	0 ENT RM4	
	PP M 9000	; начальные координаты
	RMB RMC		; эквивалентно "63 ENT 1"
	PP M 9013	; вертикальный прямоугольник 63x1
	KRM4 KRM4	; увеличение координаты X0 на 2
	FL0 A1		; цикл по R0

; вывод квадрата
	8 ENT 40
	PP M 9000
	32 ENT
	PP M 9013

; изменение атрибутов
	RMA PP M 9001

; вывод графического образа PIC
	23 ENT 55
	PP M 9000
	.NUM PIC
	PP M 9015

; вывод графического экрана на индикатор
	K GRPH
; бесконечный цикл
A2:	GOTO A2

; команда "С/П" отсутствует
; завершение программы выполняется вручную

; графический образ - горизонтальные полосы
PIC:	.DB 32,32
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
	.DB 85,85,85,85
.ENDP


НПП "СЕМИКО" (383) 271-01-25 (многоканальный)