ГИ ЭКВМ, форма c условными переходами


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

В графическом интерфейсе (ГИ) ЭКВМ имеется команда условного перехода JNEZ внутри программы экранной формы. Это позволяет изменять вид отображаемой формы в зависимости от содержимого регистров памяти данных.

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

Для примера рассмотрим программу, которая в зависимости от некоего кода устанавливает в наборе регистров значения 1 или 0 для команды JNEZ экранной формы. В зависимости от этого на экране в дополнение к основному изображению цветка появляются дополнительные изображения окрашенных лепестков.

Программа состоит из единственной формы, содержащей команды условного перехода. Реакция на команды интерфейса (ВВОД, ВЫХОД и ВЫБОР) блокирована установкой нулевых флагов действий в структуре формы. Программа элемента формы отсутствует за ненадобностью.

Все действия в программе выполняются после анализа кода нажатой кнопки. ГИ здесь используется только для вывода изображения на графический экран ЭКВМ.

Дополнительно, в качестве примера использования команд TYPE и PREXP, на экран шрифтом 1 выводится числовое значение кода.

Кроме того, в программе используется обращение к функциям работы с упорядоченными и ассоциативными таблицами при помощи регистров R9211 и R9213.

код 0

После запуска программы устанавливается нулевой код.

Кнопка ВЫХОД позволяет выйти из программы. При этом можно продолжить её выполнение, нажав "С/П", или перезапустить с нулевого кода по "В/О", "С/П".

код 6

Кнопками ВЫБОР и некоторыми другими можно увеличить или уменьшить код на единицу. При этом один из лепестков цветка изменяет свою окраску на противоположную.

код 25

Кнопка ВВОД вызывает установку случайного кода и сопровождается звуковым сигналом. Кнопки от 1 до 5 устанавливают значение кода, соответствующее окрашиванию только одного из лепестков

код 21

Кнопки 0 и Cx записывают нулевой код и сбрасывают окраску. Кнопка B↑ записывает код, окрашивающий все лепестки.

Текст программы примера приведён ниже и снабжён необходимыми комментариями.


Файл программы primgui30.mkp на ЯМК - 1472 байта, КС 106737/149

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



.CHARSET 1251
; Файл primgui30
; Работа с ГИ
; Проверка условия при выводе

; Регистры памяти
; R0 - цикл
; R4,R5,RA - временное хранение данных
; RB - код (значение 0-31)
; регистры флагов для перехода по JNEZ в формах
FLAG_0	.EQU	100
FLAG_1	.EQU	101
FLAG_2	.EQU	102
FLAG_3	.EQU	103
FLAG_4	.EQU	104

; ====================================================== Начало программы
.ORG 0	
A0:	
	CX		; Обнулить RX и сбросить признак ввода числа
	MB		; Обнулить код RB при запуске
	2 PP M 9010	; Инициализировать графический экран, 
	1 PP M 9200	; 1 - разрешение графического интерфейса
	0 PP M 9202	; текущая форма - 0 
	PP M 9203	; активный элемент - 0
	.NUMT TFORM
	PP M 9201	; главная таблица форм TFORM

A1:	; установка флагов по коду в RB
	.NUMT TABL1	; Загрузить таблицу адресов наборов флагов
	PP M 9042
	RMB
	PP M 9211	; Считать адрес начала набора флагов в памяти программ
	PP M 9042	; Сохранить  в R9042 
	.NUMD FLAG_0	; Адрес начала регистров флагов в памяти данных -1
	M4		; Сохранить в R4 для косвенной адресации
	5 M0		; Количество циклов соответствует количеству регистров
A2:
	PP RM 9044	; Считать значение очередного флага с автоинкрементом
	KM4		; Записать значение косвенно с автоинкрементом индекса 
			; в очередной регистр группы флагов
	PFL0 A2		; цикл по R0

	64		; Код принудительной перерисовки формы
	PP M 9208	; Перерисовать форму
	PP RM 9209	; Результат выполнения формы

	MA		; Сохранить в RA
	P X!=0	A3	; Перейти, если не требуется обработки	
	
	; Обработка ошибки интерфейса 
	; при этом RX содержит число от 2 до 6 
	; или 7 - ввод числа, который здесь не используется 

	.NUMT STR1	; Вывести "Ошибка" в строку комментариев
	PP M 9026
	CX ENT ENT ENT	; Очистить стек
	RMA		; Вывести код в RX
	R/S		; Останов

A3:	; Опрос клавиатуры
	; все действия в примере происходят при нажатии кнопок
	PP RM 9029	; Считать код клавиши
	MA		; Сохранить в RA
	K NOT		; инверсия (0FFh -> 0)
	P X!=0 A3	; если нет нажатия - продолжать опрос
	.NUMT KL	; Загрузить таблицу перехватываемых кодов клавиш
	PP M 9042	; в регистр 9042 для последующей работы с функциями таблиц

	RMA		; Загрузить код клавиши
	PP M 9213	; Загрузить адрес обработчика ассоциативно по коду клавиши
	P X>=0 A3	; Если код не найден - продолжить опрос клавиатуры
	
	MA		; Сохранить адрес в RA
	K GSB A		; Перейти к подпрограмме обработчика

	P GOTO A1	; Перерисовать форму

KL:	; клавиши для обработки
	.DB 34 ; выбор вправо
	.DA VYBR
	.DB 35 ; выбор влево
	.DA VYBL
	.DB 36 ; выбор вверх
	.DA VYBL
	.DB 37 ; выбор вниз
	.DA VYBR

	.DB 15 ; плюс
	.DA VYBR
	.DB 16 ; минус
	.DA VYBL
	.DB 23 ; шаг вправо
	.DA VYBR
	.DB 24 ; шаг влево
	.DA VYBL

	.DB 0	; клавиша 0
	.DA KL_0
	.DB 1	; клавиша 1
	.DA KL_1
	.DB 2	; клавиша 2
	.DA KL_2
	.DB 3	; клавиша 3
	.DA KL_3
	.DB 4	; клавиша 4
	.DA KL_4
	.DB 5	; клавиша 5
	.DA KL_5

	.DB 13	; Cx
	.DA KL_0 ; то же, что и клавиша 0

	.DB 14	; клавиша В со стрелкой вверх
	.DA KL_ENT

	.DB 32	; выход
	.DA VYHOD

	.DB 33	; ввод
	.DA VVOD

	.END


TABL1:	; таблица указателей на наборы флагов
	.DA FLAGI0, FLAGI1, FLAGI2, FLAGI3
	.DA FLAGI4, FLAGI5, FLAGI6, FLAGI7
	.DA FLAGI8, FLAGI9, FLAGI10, FLAGI11
	.DA FLAGI12, FLAGI13, FLAGI14, FLAGI15
	.DA FLAGI16, FLAGI17, FLAGI18, FLAGI19
	.DA FLAGI20, FLAGI21, FLAGI22, FLAGI23
	.DA FLAGI24, FLAGI25, FLAGI26, FLAGI27
	.DA FLAGI28, FLAGI29, FLAGI30, FLAGI31

; наборы флагов (инверсный циклический код)
FLAGI0:		.DB 1,1,1,1,1
FLAGI1:		.DB 1,1,1,1,0
FLAGI2:		.DB 1,1,1,0,0
FLAGI3:		.DB 1,1,1,0,1
FLAGI4:		.DB 1,1,0,0,1
FLAGI5:		.DB 1,1,0,0,0
FLAGI6:		.DB 1,1,0,1,0
FLAGI7:		.DB 1,1,0,1,1
FLAGI8:		.DB 1,0,0,1,1
FLAGI9:		.DB 1,0,0,1,0
FLAGI10:	.DB 1,0,0,0,0
FLAGI11:	.DB 1,0,0,0,1
FLAGI12:	.DB 1,0,1,0,1
FLAGI13:	.DB 1,0,1,0,0
FLAGI14:	.DB 1,0,1,1,0
FLAGI15:	.DB 1,0,1,1,1

FLAGI16:	.DB 0,0,1,1,1
FLAGI17:	.DB 0,0,1,1,0
FLAGI18:	.DB 0,0,1,0,0
FLAGI19:	.DB 0,0,1,0,1
FLAGI20:	.DB 0,0,0,0,1
FLAGI21:	.DB 0,0,0,0,0
FLAGI22:	.DB 0,0,0,1,0
FLAGI23:	.DB 0,0,0,1,1
FLAGI24:	.DB 0,1,0,1,1
FLAGI25:	.DB 0,1,0,1,0
FLAGI26:	.DB 0,1,0,0,0
FLAGI27:	.DB 0,1,0,0,1
FLAGI28:	.DB 0,1,1,0,1
FLAGI29:	.DB 0,1,1,0,0
FLAGI30:	.DB 0,1,1,1,0
FLAGI31:	.DB 0,1,1,1,1


VYBR:	; выбор вправо и т.п.
	RMB 1 + MB	; инкремент кода
	32 -		; сравнить с 32
	P X>=0 VYBR1	; если <32 - выйти
KL_0:	CX MB		; иначе обнулить и сохранить
			; здесь же точка входа для клавиши 0
VYBR1:	RTN		; выход из п/п

VYBL:	; выбор влево и т.п.
	RMB 1 - MB	; декремент кода
	P X<0 VYBL1	; если больше 0 - выйти
KL_5:	31 MB		; иначе записать 31
			; здесь же точка входа для клавиши 5
VYBL1:	RTN		; выход из п/п

KL_1:	1 MB		; клавиша 1 - записать код 1
	RTN

KL_2:	3 MB		; клавиша 2 - записать код 3
	RTN

KL_3:	7 MB		; клавиша 3 - записать код 7
	RTN

KL_4:	15 MB		; клавиша 4 - записать код 15
	RTN

KL_ENT: 21 MB		; клавиша B со стрелкой вверх
			; код 21 - все лепестки
	RTN

VVOD:	; ввод
	KRAN		; случайное сисло от 0 до 1
	32 *		
	KINT		; целая часть (СЧ от 0 до 31)
	MB		; записать в код
	50 *
	50 +		; (СЧ от 50 до 1600) высота, Гц
	10		; продолжительность 0,1 с
	PP M 9052	; звук
	RTN		; выход из п/п

VYHOD:  .NUM STR2	; Вывести "Выход" в строку комментариев
	PP M 9026
	CX ENT ENT ENT	; Очистить стек
	R/S		; Останов
	RTN		; Для корректного выхода из п/п 
			; при повторном запуске без В/О

STR1:	.TEXT "\nОшибка\0"
STR2:	.TEXT "\nВыход\0"

;===== Главная таблица форм
TFORM:
	.DB 0	; в этой программе только одна форма (с номером 0)
	.DA F0	; адрес начала формы 0

	.END	; конец таблицы

;===== Форма 0
F0:	; Заголовок формы
	.FORM 0, F0DE, F0PI, F0PO, F0PL, F0PR, F0RI, F0KM ; таблица смещений
			; максимальный номер элемента 0
F0DE:	;таблица флагов действий
	.DB 0
	; Флаги отсутствуют
F0PI:	
F0PO:	
F0PL:
F0PR:	.DB 0,0	; формальные значения, эти функции ГИ в примере не используются

F0RI:	; основная программа экранной формы 
	.TYPE 1			; шрифт 1
	.TAB 90,20		; позиция
	.PREXP 16, 11		; вывести число
				; из RB (0Bh=11)

	.TAB 0, 0 		; позиция (X=0,Y=0), координата Y - сверху-вниз 
	.DRAWP 0, IL0

	.JNEZ FLAG_4, F0RI1	; если FLAG_4 не равен 0
				; перейти на F0RI1

	.TAB 4, 2		; позиция
	.DRAWP 2, IL1		; вывести рисунок IL1 - лепесток 1
				; с атрибутами 2 (ИЛИ)

F0RI1:	.JNEZ FLAG_3, F0RI2	; если FLAG_3 не равен 0
				; перейти на F0RI2

	.TAB 31, 1		; позиция
	.DRAWP 2, IL2		; вывести рисунок IL2 - лепесток 2
				; с атрибутами 2 (ИЛИ)

				; далее аналогично 
F0RI2:	.JNEZ FLAG_2, F0RI3

	.TAB 39, 24
	.DRAWP 2, IL3A
				; лепестки с 3 по 5 разбиты на два прямоугольника
	.TAB 47, 44		
	.DRAWP 2, IL3B

F0RI3:	.JNEZ FLAG_1, F0RI4

	.TAB 23, 43
	.DRAWP 2 IL4A

	.TAB 29, 39
	.DRAWP 2, IL4B

F0RI4:	.JNEZ FLAG_0, F0RI5

	.TAB 1, 30
	.DRAWP 2, IL5A

	.TAB 23, 34
	.DRAWP 2, IL5B

F0RI5:	.END			; конец основной программы

F0KM:	; Таблица смещений программ элементов
	.DBB F0RI5	; программа элемента отсутствует 
			; переход на END


;======= Графические изображения

IL0:	; основное изображение
	.DB 40h, 40h
        .DB 0, 0, 0, 0, 0FCh, 3, 0, 0
        .DB 0, 0, 0, 0, 3, 1Ch, 0, 0
        .DB 0, 0, 0, 80h, 0, 60h, 0, 0
        .DB 0, 0, 0, 40h, 0, 80h, 1, 0
        .DB 0, 0E0h, 1Fh, 40h, 0, 0, 3, 0
        .DB 0, 18h, 60h, 20h, 0, 0, 4, 0
        .DB 0, 4, 40h, 20h, 0, 0, 8, 0
        .DB 0, 3, 80h, 20h, 0, 0, 8, 0
        .DB 80h, 1, 0, 21h, 0, 0, 10h, 0
        .DB 0C0h, 0, 0, 21h, 0, 0, 30h, 0
        .DB 40h, 0, 0, 22h, 0, 0, 20h, 0
        .DB 20h, 0, 0, 22h, 0, 0, 20h, 0
        .DB 10h, 0, 0, 22h, 0, 0, 20h, 0
        .DB 10h, 0, 0, 22h, 0, 0, 20h, 0
        .DB 8, 0, 0, 24h, 0, 0, 20h, 0
        .DB 8, 0, 0, 44h, 0, 0, 10h, 0
        .DB 8, 0, 0, 44h, 0, 0, 18h, 0
        .DB 4, 0, 0, 44h, 0, 0, 8, 0
        .DB 4, 0, 0, 84h, 0, 0, 6, 0
        .DB 4, 0, 0, 84h, 0, 0, 3, 0
        .DB 8, 0, 0, 84h, 0, 0C0h, 0, 0
        .DB 8, 0, 0, 4, 1, 70h, 0, 0
        .DB 8, 0, 0, 4, 1, 0Ch, 0F8h, 7
        .DB 10h, 0, 0, 4, 82h, 3, 6, 18h
        .DB 20h, 0, 0, 4, 7Ah, 80h, 1, 30h
        .DB 0C0h, 0, 0, 84h, 7, 60h, 0, 20h
        .DB 0, 0Fh, 0, 0FFh, 7, 30h, 0, 40h
        .DB 0, 0F0h, 0FFh, 0FCh, 0Fh, 8, 0, 40h
        .DB 0, 0, 0, 1Ch, 0Eh, 6, 0, 80h
        .DB 0, 0, 0, 0Eh, 1Ch, 3, 0, 80h
        .DB 80h, 1Fh, 0, 0Eh, 09Ch, 1, 0, 80h
        .DB 70h, 0E0h, 3, 6, 0F8h, 0, 0, 80h
        .DB 0Ch, 0, 1Ch, 6, 78h, 0, 0, 80h
        .DB 4, 0, 0E0h, 6, 5Ch, 0, 0, 80h
        .DB 2, 0, 80h, 1Fh, 8Eh, 0, 0, 80h
        .DB 1, 0, 0, 3Fh, 87h, 1, 0, 80h
        .DB 1, 0, 0, 0F1h, 7, 1, 0, 80h
        .DB 1, 0, 0, 0C1h, 3, 2, 0, 80h
        .DB 1, 0, 0, 81h, 3, 4, 0, 40h
        .DB 1, 0, 0, 81h, 0Ch, 0Ch, 0, 40h
        .DB 1, 0, 80h, 40h, 30h, 8, 0, 40h
        .DB 1, 0, 80h, 20h, 60h, 10h, 0, 20h
        .DB 1, 0, 80h, 30h, 80h, 20h, 0, 20h
        .DB 3, 0, 80h, 10h, 0, 0C3h, 0, 10h
        .DB 2, 0, 40h, 8, 0, 84h, 1, 8
        .DB 2, 0, 40h, 4, 0, 8, 6, 4
        .DB 4, 0, 20h, 4, 0, 10h, 0FCh, 3
        .DB 4, 0, 20h, 2, 0, 20h, 0, 0
        .DB 8, 0, 10h, 2, 0, 60h, 0, 0
        .DB 10h, 0, 10h, 1, 0, 40h, 0, 0
        .DB 30h, 0, 8, 1, 0, 80h, 0, 0
        .DB 60h, 0, 84h, 0, 0, 80h, 0, 0
        .DB 0C0h, 0, 86h, 0, 0, 80h, 0, 0
        .DB 0, 3, 81h, 0, 0, 0, 1, 0
        .DB 0, 0FEh, 80h, 0, 0, 0, 1, 0
        .DB 0, 0, 80h, 0, 0, 80h, 0, 0
        .DB 0, 0, 80h, 0, 0, 80h, 0, 0
        .DB 0, 0, 80h, 0, 0, 80h, 0, 0
        .DB 0, 0, 80h, 0, 0, 40h, 0, 0
        .DB 0, 0, 0, 1, 0, 20h, 0, 0
        .DB 0, 0, 0, 1, 0, 18h, 0, 0
        .DB 0, 0, 0, 6, 0, 0Ch, 0, 0
        .DB 0, 0, 0, 1Ch, 80h, 3, 0, 0
        .DB 0, 0, 0, 0E0h, 7Fh, 0, 0, 0

IL1: 	; чёрный лепесток 1
	.DB 17h, 18h
        .DB 0, 0F8h, 0
        .DB 0, 0FEh, 7
        .DB 0, 0FFh, 0Fh
        .DB 80h, 0FFh, 1Fh
        .DB 0E0h, 0FFh, 3Fh
        .DB 0E0h, 0FFh, 3Fh
        .DB 0F0h, 0FFh, 7Fh
        .DB 0F8h, 0FFh, 7Fh
        .DB 0FCh, 0FFh, 7Fh
        .DB 0FCh, 0FFh, 7Fh
        .DB 0FEh, 0FFh, 0FFh
        .DB 0FEh, 0FFh, 0FFh
        .DB 0FEh, 0FFh, 0FFh
        .DB 0FEh, 0FFh, 0FFh
        .DB 0FFh, 0FFh, 0FFh
        .DB 0FFh, 0FFh, 0FFh
        .DB 0FEh, 0FFh, 0FFh
        .DB 0FEh, 0FFh, 0FFh
        .DB 0FCh, 0FFh, 0FFh
        .DB 0F8h, 0FFh, 0FFh
        .DB 0F0h, 0FFh, 0FFh
        .DB 0C0h, 0FFh, 0FFh
        .DB 0, 0FCh, 3Fh

IL2: 	; чёрный лепесток 2
	.DB 17h, 17h
        .DB 0C0h, 0Fh, 0
        .DB 0F8h, 0FFh, 1
        .DB 0FCh, 0FFh, 0Fh
        .DB 0FEh, 0FFh, 3Fh
        .DB 0FFh, 0FFh, 7Fh
        .DB 0FFh, 0FFh, 7Fh
        .DB 0FFh, 0FFh, 7Fh
        .DB 0FFh, 0FFh, 7Fh
        .DB 0FFh, 0FFh, 7Fh
        .DB 0FFh, 0FFh, 3Fh
        .DB 0FFh, 0FFh, 3Fh
        .DB 0FFh, 0FFh, 3Fh
        .DB 0FEh, 0FFh, 3Fh
        .DB 0FEh, 0FFh, 1Fh
        .DB 0FEh, 0FFh, 1Fh
        .DB 0FCh, 0FFh, 0Fh
        .DB 0FCh, 0FFh, 0Fh
        .DB 0F8h, 0FFh, 7
        .DB 0F0h, 0FFh, 7
        .DB 0E0h, 0FFh, 3
        .DB 0C0h, 0FFh, 1
        .DB 80h, 0FFh, 0
        .DB 0, 7Eh, 0

IL3A: 	; чёрный лепесток 3 (2 изображения)
	.DB 18h, 14h
        .DB 0, 3, 0
        .DB 80h, 0Fh, 0
        .DB 0C0h, 1Fh, 0
        .DB 0C0h, 7Fh, 0
        .DB 0E0h, 0FFh, 0
        .DB 0F0h, 0FFh, 3
        .DB 0F8h, 0FFh, 7
        .DB 0F8h, 0FFh, 0Fh
        .DB 0FCh, 0FFh, 0Fh
        .DB 0FCh, 0FFh, 0Fh
        .DB 0FEh, 0FFh, 0Fh
        .DB 0FEh, 0FFh, 0Fh
        .DB 0FFh, 0FFh, 0Fh
        .DB 0FFh, 0FFh, 0Fh
        .DB 0FFh, 0FFh, 0Fh
        .DB 0FFh, 0FFh, 0Fh
        .DB 0FFh, 0FFh, 0Fh
        .DB 0FFh, 0FFh, 0Fh
        .DB 0FFh, 0FFh, 0Fh
        .DB 0FFh, 0FFh, 0Fh
        .DB 0FEh, 0FFh, 0Fh
        .DB 0FEh, 0FFh, 7
        .DB 0F8h, 0FFh, 3
        .DB 0E0h, 7Fh, 0

IL3B: 	.DB 0Dh, 4
        .DB 1
        .DB 1
        .DB 3
        .DB 7
        .DB 7
        .DB 7
        .DB 0Fh
        .DB 0Fh
        .DB 7
        .DB 7
        .DB 7
        .DB 3
        .DB 1

IL4A: 	; чёрный лепесток 4 (2 изображения)
	.DB 17h, 14h
        .DB 0, 0FFh, 0
        .DB 0C0h, 0FFh, 1
        .DB 0F0h, 0FFh, 3
        .DB 0F8h, 0FFh, 7
        .DB 0FEh, 0FFh, 7
        .DB 0FFh, 0FFh, 0Fh
        .DB 0FFh, 0FFh, 0Fh
        .DB 0FFh, 0FFh, 0Fh
        .DB 0FFh, 0FFh, 0Fh
        .DB 0FFh, 0FFh, 0Fh
        .DB 0FFh, 0FFh, 0Fh
        .DB 0FFh, 0FFh, 0Fh
        .DB 0FFh, 0FFh, 0Fh
        .DB 0FFh, 0FFh, 0Fh
        .DB 0FFh, 0FFh, 0Fh
        .DB 0FFh, 0FFh, 7
        .DB 0FEh, 0FFh, 7
        .DB 0FEh, 0FFh, 7
        .DB 0FCh, 0FFh, 3
        .DB 0F8h, 0FFh, 3
        .DB 0E0h, 0FFh, 1
        .DB 0C0h, 0FFh, 0
        .DB 0, 7Fh, 0

IL4B: 	.DB 9, 4
        .DB 8
        .DB 0Ch
        .DB 0Eh
        .DB 0Fh
        .DB 0Fh
        .DB 0Eh
        .DB 0Ch
        .DB 0Ch
        .DB 8

IL5A: 	; чёрный лепесток 5 (2 изображения)
	.DB 16h, 17h
        .DB 0F0h, 0Fh, 0
        .DB 0FCh, 7Fh, 0
        .DB 0FEh, 0FFh, 1
        .DB 0FEh, 0FFh, 3
        .DB 0FFh, 0FFh, 0Fh
        .DB 0FFh, 0FFh, 1Fh
        .DB 0FFh, 0FFh, 1Fh
        .DB 0FFh, 0FFh, 3Fh
        .DB 0FFh, 0FFh, 3Fh
        .DB 0FFh, 0FFh, 7Fh
        .DB 0FFh, 0FFh, 7Fh
        .DB 0FFh, 0FFh, 7Fh
        .DB 0FFh, 0FFh, 7Fh
        .DB 0FFh, 0FFh, 7Fh
        .DB 0FEh, 0FFh, 3Fh
        .DB 0FEh, 0FFh, 1Fh
        .DB 0FEh, 0FFh, 1Fh
        .DB 0FCh, 0FFh, 7
        .DB 0FCh, 0FFh, 3
        .DB 0FCh, 0FFh, 0
        .DB 0F8h, 3Fh, 0
        .DB 0F8h, 0Fh, 0

IL5B: 	.DB 2, 5
        .DB 1Fh
        .DB 1

.ENDP


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

Возможно и обратное решение: структуру наборов можно оптимизировать, превратив в непрерывную строку байт и исключив повторяющиеся участки.

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

В некоторых случаях вместо команды условного перехода JNEZ или в дополнение к ней удобнее использовать TXTK - вывод строки символов с косвенной адресацией. Можно также предварительно копировать данные в двоичную память и выводить информацию на экран командами TXTB и DRAWB.


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