.CHARSET 1251 ; Файл primgui1 ; Пример работы с графическим интерфейсом пользователя ; Пример простого меню из шести пунктов ; Версия 1.1 от 04.07.12 ; Команды языка ГИ: TAB .EQU 96 LDX .EQU 104 LDY .EQU 105 TYPE .EQU 101 ATYPE .EQU 78 LDADR .EQU 77 SQU .EQU 89 FRAME .EQU 91 DRAWR .EQU 84 DRAWB .EQU 86 TXTP .EQU 83 TXTB .EQU 85 TXTK .EQU 87 PREXP .EQU 92 PRFORM .EQU 93 PRHEX .EQU 94 MCALL .EQU 102 RETUM .EQU 103 LCALL .EQU 112 RETUL .EQU 113 JNEZ .EQU 1 JM .EQU 56 END .EQU 255 ; Регистры памяти ; RA - для временного хранения данных ; ====================================================== Начало программы .ORG 0 A0: CX ; Обнулить RX и сбросить признак ввода числа 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: 64 ; Код принудительной перерисовки формы A2: PP M 9208 ; Перерисовать форму PP RM 9209 ; Результат выполнения формы MA ; Сохранить в RA P X!=0 A5 ; Перейти, если не требуется обработки 1 - P X!=0 A4 ; Перейти, если требуется обработка ; Далее простейшая обработка ошибки интерфейса ; при этом RX содержит число от 2 до 6 ; или 7 - ввод числа, который здесь не используется ; и функций таблиц ; при этом RX содержит минус 1 A3: .NUM STR1 ; Вывести "Ошибка" в строку комментариев PP M 9026 CX ENT ENT ENT ; Очистить стек RMA ; Вывести код в RX R/S ; Останов A4: ; Обработка результата выполнения формы .NUMT TOF0 ; Загрузить таблицу обработки элементов формы 0 PP M 9042 ; в регистр 9042 для последующей работы с функциями таблиц PP RM 9203 ; форма единственная, обрабатывается только ВВОД ; поэтому проверяется только номер активного элемента PP M 9211 ; считать адрес подпрограммы обработки действия из таблицы ; по номеру элемента ; внимание - действие выполняется по команде записи в регистр MA ; Сохранить в RA P X!=0 A5 ; Обработчик не определён (содержит нулевой адрес) - ничего не делать ; Эта проверка здесь лишняя, но полезна для примера ; Таким образом можно исключать ненужные элементы в таблице K GSB A ; Перейти к подпрограмме обработки P GOTO A1 ; Вернуться к перерисовке формы, поскольку подпрограмма может изменять её вид A5: ; Опрос клавиатуры ; Других причин для перерисовки формы здесь нет, иначе следовало проверить их ; и перейти к A1 при необходимости PP RM 9029 ; Считать код клавиши MA ; Сохранить в RA K NOT ; инверсия (0FFh -> 0) P X!=0 A5 ; если нет нажатия - продолжать опрос RMA P GOTO A2 ; Передать код нажатой клавиши в форму STR1: .TEXT "\nОшибка\0" TOF0: ; адреса подпрограмм для обработки нажатия ВВОД при активном элементе 0-5 .DA OF0E0, OF0E1, OF0E2, OF0E3, OF0E4, OF0E5 OF0E0: ; Обработка команды ВВОД для элемента 0 110 ; частота OF0E0A: ENT 50 ; продолжительность 0,5 сек PP M 9052 ; звук - как пример действия RTN ; выйти из подпрограммы OF0E1: ; Обработка команды ВВОД для элемента 1 220 P GOTO OF0E0A OF0E2: ; Обработка команды ВВОД для элемента 2 440 P GOTO OF0E0A OF0E3: ; Обработка команды ВВОД для элемента 3 880 P GOTO OF0E0A OF0E4: ; Обработка команды ВВОД для элемента 4 1760 P GOTO OF0E0A OF0E5: ; Обработка команды ВВОД для элемента 5 3520 P GOTO OF0E0A ;===== Главная таблица форм TFORM: .DB 0 ; в этой программе только одна форма (с номером 0) .DA F0 ; адрес начала формы 0 .DB END ; конец таблицы ;===== Форма 0 .BASE ; смещения в таблицах и переходах указываются относительно начала формы F0: ; Заголовок формы .DB 5 ; максимальный номер элемента 5 (хотя всего их 6, считая нулевой) .DBB F0DE, F0PI, F0PO, F0PL, F0PR, F0RI, F0KM ; таблица смещений ; Примечание: расположение остальных полей структуры в пределах формы ; может быть произвольным F0DE: ;таблица флагов действий .DB 13,13,13,13,13,13 ; В двоичном виде 13 это 00 00 11 01 - установлены флаги "выбор" + "ввод с обработкой" ; См. описание в документации. ; Примечание: в общем случае значения могут быть различными для каждого элемента формы, ; но здесь это не требуется F0PI: F0PO: ; Таблицы перехода по выходу и входу здесь объединены ; и заполнены формальными значениями ; поскольку команда ВЫХОД не обрабатывается, ; а ВВОД обрабатывается отдельно (см. флаги действий). ; Для экономии места можно было вообще не использовать значений, даже формальных, ; а записать в заголовке, например, нулевые смещения для этих таблиц. ; Но это менее наглядно в примере и чревато труднораспознаваемыми ошибками ; при указании неверных значений флагов действий. .DB 0,0,0,1,0,2,0,3,0,4,0,5 ; В общем же случае по командам ВВОД и ВЫХОД возможен переход между формами, ; первый байт пары значений - номер формы, второй - элемента F0PL: ; Таблица переходов по команде "Выбор влево" (и вверх) .DB 5,0,1,2,3,4 ; это номера элементов внутри формы - куда перейти с текущего ; например, с 0 на 5, с 1 на 0 и т.д. F0PR: ; Таблица переходов по команде "Выбор вправо" (и вниз) .DB 1,2,3,4,5,0 ; это номера элементов внутри формы - куда перейти с текущего ; например, с 0 на 1, с 1 на 2 и т.д. F0RI: ; основная программа экранной формы .DB TYPE, 0 ; шрифт 0 .DB TAB, 32, 0 ; позиция (X=32,Y=0), координата Y - сверху-вниз .DB TXTP, 16 ; TXTP - вывести строку из области памяти программ ; атрибут 16 - перерисовка, расстояние между символами 1 .DA F0TZ ; адрес строки с наименованием формы .DB TAB, 0, 9 ; позиция (0,9) .DB SQU, 0, 127, 1 ; прямоугольник (127,1) - это линия .DB TAB, 2, 10 ; позиция (2,10) .DB TXTP, 16 ; TXTP - вывести строку из области памяти программ ; атрибут 16 - перерисовка, расстояние между символами 1 .DA F0T0 ; адрес строки с описанием первого пункта (т.е. нулевого элемента) ; далее аналогично .DB TAB, 2, 19 .DB TXTP, 16 .DA F0T1 .DB TAB, 2, 28 .DB TXTP, 16 .DA F0T2 .DB TAB, 2, 37 .DB TXTP, 16 .DA F0T3 .DB TAB, 2, 46 .DB TXTP, 16 .DA F0T4 .DB TAB, 2, 55 .DB TXTP, 16 .DA F0T5 .DB END ; конец основной программы F0KM: ; Таблица смещений программ элементов команды ; Эти программы выполняются после основной программы формы ; и указывают на точку входа для активного элемента .DBB F0KM0, F0KM1, F0KM2, F0KM3, F0KM4, F0KM5 F0KM0: .DB TAB, 0, 10 ; установить позицию (0,10) для элемента 0 .DB JM ; перейти к F0KME - общей части программ .DBB F0KME ; далее аналогично F0KM1: .DB TAB, 0, 19 .DB JM .DBB F0KME F0KM2: .DB TAB, 0, 28 .DB JM .DBB F0KME F0KM3: .DB TAB, 0, 37 .DB JM .DBB F0KME F0KM4: .DB TAB, 0, 46 .DB JM .DBB F0KME F0KM5: .DB TAB, 0, 55 ; из последнего элемента переходить не требуется ; далее общая часть программ F0KME: .DB SQU, 3, 64, 9 ; в указанной ранее позиции нарисовать ; прямоугольник размером 64 на 9 ; с атрибутами 3 - XOR ; в итоге - инверсия текста сообщения .DB END ; конец программ элементов ;======= Тексты строк к структуре формы не относятся ; и могут располагаться в произвольном месте памяти F0TZ: .TEXT "Пример меню\0" F0T0: .TEXT "Пункт 1\0" F0T1: .TEXT "Пункт 2\0" F0T2: .TEXT "Пункт 3\0" F0T3: .TEXT "Пункт 4\0" F0T4: .TEXT "Пункт 5\0" F0T5: .TEXT "Пункт 6\0" .END