Элтрис


Главная / ЭКВМ / Программы для ЭКВМ / Игры
О программе

Игра заключается в плотной укладке тетрамино - фигур, состоящих из четырёх квадратов, соединённых сторонами - на игровом поле, представляющим собой прямоугольник. Фигуры перемещаются по полю сверху-вниз автоматически или вручную, в зависимости от настроек. Горизонтальное перемещение, вращение и иные преобразования текущей фигуры производятся по командам пользователя.

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

Расширенные возможности

Неоднократно отмечалось, что распространённые аналоги программы обладают рядом досадных неудобств, которые приводят к быстрому утомлению пользователя (для их обнаружения проводились эксперименты, состоящие в сравнительном изучении существующих программ персональных ЭВМ). Благодаря проделанной работе в представленной игровой программе "Элтрис" ряд типичных недостатков был устранён путём добавления расширенных возможностей, среди которых:

  • Регулирование скорости автоматического передвижения фигур в большую или меньшую сторону.
    • Позволяет произвести гармоничную настройку параметров игры, исходя из индивидуальных психофизических особенностей, сложившихся предпочтений и текущего состояния здоровья оператора.
    • Снижает требования к скорости реакции оператора, а также к быстродействию устройств ввода и вывода используемого технического средства.
  • Пошаговый режим с ручным управлением движением фигуры при установке нулевой скорости игры.
    • Снижает уровень стрессового воздействия на оператора, уменьшает количество допускаемых ошибок.
    • Переводит игровую модель на качественно иной уровень взаимодействия с пользователем.
  • Трансформация текущей фигуры путём зеркального отражения.
    • Снимает теоретический предел продолжительности работы программы, устанавливаемый постепенным переполнением поля при получении определённой входной последовательности фигур, которая неизбежно возникает при длительной работе качественного генератора случайных чисел. Возможность дополнительной трансформации в каждом случае позволяет заменить указанную последовательность какой-либо иной, не приводящей к переполнению.
  • Сброс текущей фигуры и ручной выбор следующей.
    • Не являются обязательными функциями, но существенно улучшают пользовательские качества игры.
  • Текстовый интерфейс пользователя.
    • Даёт возможность портировать игру на средства вычислительной техники предназначенные для работы в терминальном режиме, в том числе не использующие визуальные каналы передачи информации, что особенно актуально для лиц с ограниченными физическими возможностями.
    • Позволяет усовершенствовать навыки обработки текстовой информации.
  • Управление внешними устройствами.
    • Позволяет разнообразить игровой процесс дополнительными эффектами, а также использовать программу при проведении различных биологических экспериментов.
    • Раздельные каналы управления, активизирующиеся при сбросе очередной горизонтальной линии и полном заполнении поля позволяют подключать функционально отличающиеся внешние устройства, как автоматически поощряющие успешные паттерны, так и закрепляющие реакцию избегания.

Реализация на ЭКВМ

Игра выполнена с использованием графического интерфейса пользователя.

главное меню

После запуска на экран выводится заставка и меню из пунктов "Новая игра", "Настройка", "О программе" и "Выход". Управление осуществляется клавишами ВВОД, ВЫБОР и ВЫХОД.

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

Пункт "О программе" выводит краткую информацию о назначении и версии, вид экрана приведён выше.

Пункт "Выход" позволяет завершить программу. Останов нажатием клавиши "С/П" запрещён из-за возможности пребывания подключенных внешних устройств в активном состоянии.

При выходе из программы в строке комментариев сохраняется соответствующее сообщение.

Повторный запуск программы выполняется командами "В/О", "С/П".

настройка

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

Настраиваемый параметр отмечается прямоугольной фигурой слева от элемента экранной формы. Переключение производится клавишей ВВОД.

Режим интерфейса определяет вид игрового поля при запуске: текстовый или графический. В процессе игры допускается многократное переключение.

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

Переключатель "Звук" включает или отключает звуковое сопровождение. Для этого параметра доступна оперативная настройка в процессе игры.

Переключатель "Внешние устройства" разрешает или запрещает выдачу импульсов длительностью не менее 0,5 с в каналы устройства УСОМК-2 или аналогичного, которое должно быть подключено к разъёму "ВУ" ЭКВМ. Канал 1 в процессе игры активизируется при удалении содержимого очередной горизонтальной строки, канал 2 - однократно, при заполнении поля.

игровое поле - графический режим

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

Увеличение скорости выполняется клавишей "ШГ вправо".

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

Уменьшение скорости выполняется клавишей "ШГ влево".

Включение и отключение звука - клавишей "/-/".

Переключение режима отображения - клавишей "ВП".

Удаление текущей фигуры - клавишей "Cx".

Зеркальное отражение текущей фигуры относительно вертикальной оси - клавишей "↔"

Включение и отключение отображения следующей фигуры - клавишей "B↑".

Выбор следующей фигуры - клавишами от "1" до "7".

пауза или выход

Нажатие клавиши ВЫХОД позволяет сделать перерыв и впоследствии вернуться к игре или завершить текущую игру и перейти в главное меню. Требуемое действие выбирается в дополнительном меню из двух пунктов: "Продолжить" и "Завершить".

игра окончена

При заполнении верхней части поля игра завершается автоматически. Если разрешено использование ВУ, в этот момент на 0,5 с активизируется канал 2.

игровое поле - текстовый режим

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

текстовый режим - игра окончена

Управление фигурами, выход из программы и окончание игры в текстовом режиме выполняются так же, как и в графическом.

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



Файл программы eltris-1_4.mkp на ЯМК - 3987 байт, КС 282305/33

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



.CHARSET 1251
; Файл eltris
; Игра Элтрис - укладка тетрамино
; особенности:
; - текстовый режим;
; - пошаговый режим;
; - управление внешними устройствами.
; версия 1.4 - 14.09.12

; требуемая версия ПО МК-152 (МК-152М) от 1.24

; Лицензия GPL
; НПП "СЕМИКО", г. Новосибирск, 2012
; mail@semico.ru

; Команды экранных форм:
TAB	.EQU	96
LDX	.EQU	104
LDY	.EQU	105
TYPE	.EQU	101
ATYPE	.EQU	78
LDADR	.EQU	77
SQU	.EQU	89
FRAME	.EQU	91
DRAWP	.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


FTIMER	.EQU	20
FIGX	.EQU	21	; координата Х (слева-направо) от 0
FIGY	.EQU	22	; координата Y (сверху-вниз) от 0
FIGN	.EQU	23	; номер тек. фигуры, 0 - сгенерировать
FIGNF	.EQU	24	; флаг новой фигуры (при !=0)
FIGNRES	.EQU	25	; номер фигуры до вращения
FIGNEXT	.EQU	26	; номер след фигуры 

FIGRA	.EQU	27	; флаг автоматической игры
FZV	.EQU	28	; флаг звука (0-нет, 1- есть)

FREGIM	.EQU	29	; режим изменения скорости (0- ручн, 1 - автомат)

FIGM	.EQU	30-39	; массив адресов в памяти
FIGMN	.EQU	40-49	; массив новых адресов в памяти

PTIMER	.EQU	50	; текущий период таймера, в 10 мс (0 - откл)
SPEED	.EQU	52	; текущая скорость игры (усл)
LINE	.EQU	53	; количество линий
SUMMA	.EQU	54	; набранные очки
PPTIMER	.EQU	55	; номинальный период таймера по установленной скорости
FNEXT	.EQU	56	; флаг необходимости вывода следующей фигуры (0-вывод, 1 - нет)
RTXTK1	.EQU	57	; регистр для TXTK
RTXTK2	.EQU	58	; регистр для TXTK

FTEXT	.EQU	59	; режим отображения (0-текст, 1-графика)
FVU	.EQU	60	; флаг ВУ (0-нет, 1-используются)
DEMON	.EQU	61	; номер фигуры на заставке (1-7)
DEMOX	.EQU	62	; фигура на заставке, координата X
DEMOY	.EQU	63	; фигура на заставке, координата Y
DEMOY1	.EQU	64	; фигура на заставке, координата Y+1


; Двоичные данные
STR0	.EQU	1000	; текстовая строка поля вывода
STR1	.EQU	1020	; 
STR2	.EQU	1040	;
STR3	.EQU	1060	;
STR4	.EQU	1080	;
STR5	.EQU	1100	;
STR6	.EQU	1120	;
STR7	.EQU	1140	;
STR8	.EQU	1160	;
STR9	.EQU	1180	;
STR10	.EQU	1200	;
STR11	.EQU	1220	;

RFIGST0	.EQU	1250
RFIGST1	.EQU	1255
RFIGST2	.EQU	1260
RFIGST3	.EQU	1265
RFIGST4	.EQU	1270
RFIGST5	.EQU	1275
RFIGST6	.EQU	1280
RFIGST7	.EQU	1285


; ====================================================== Начало программы
.ORG 0	
A0:	
	P GSB INITPROG	; инициализация структур

A1:	64
A2:	PP M 9208	; Отрисовать меню
	P GSB PROV	; Проверка результата выполнения формы
	P X=0 A1	; RX!=0 перерисовать форму заново

A3:	PP RM 9029
	MA		; В RA - код клавиши
	K NOT
	P X!=0 A4
	P GSB KLAVA	; Независимая обработка клавиатуры
	P X=0 A1	; !=0 - клавиша уже обработана
	RMA
	P GOTO A2

A4:	P RM FTIMER
	P X!=0 A1
	P GSB OTIMER	; сработал таймер
	P GOTO A1

;============================================= п/п Проверка результата выполнения формы
; при выходе 0 - не перерисовывать, 1 - перерисовать заново 

PROV:	PP RM 9209	; Результат выполнения программы формы
	P X=0 PROV1
			; RX=0 - не перерисовывать форму
	RTN		; OK
PROV1:	MB
	1 - 
	P X=0 PROV2
	; 1 - Требуется обработка при выходе из формы
	P GOTO OBRF
		
PROV2:	RMB
	8 - 	
	P X>=0 PROV3
			; результат 7 - окончание ввода числа - не используется
	8		; >7 - неизвестная ошибка 8
	MB
PROV3:	; Определить ошибку интерфейса 2-6 (7), вывести f252-0 и уйти в бесконечный цикл
	; (При работе отлаженной программы эта ситуация возникнуть не может)
	RMB
	.NUM TPROV
	+
	K PRGM
	.NUM TPROVE2 
	+
	PP M 9042	; Здесь начало строки описания ошибки
	.NUM STR1
	MC
PROV11:
	PP RM 9044
	KMC
	P X!=0 PROVE
	RMC 1 + MC
	P GOTO PROV11

PROVE:	PP RM 9202
	MB	; текущая форма с ошибкой
	PP RM 9203
	MC	; активный элемент
	252	; форма 252
	PP M 9202
	0	; элемент 0
	PP M 9203
	64
	PP M 9208	; вывести форму ошибки интерфейса
	; Разрешить С/П
PROVEE:	GOTO PROVEE	; и зациклить программу

	.BASE
TPROVE2:	.TEXT "Нет формы\0"
TPROVE3:	.TEXT "Нет элемента в форме\0"
TPROVE4:	.TEXT "Нет команды\0"
TPROVE5:	.TEXT "Нет шрифта\0"
TPROVE6:	.TEXT "Нет символа в шрифте\0"
TPROVE7:	.TEXT "Ввод\0"
TPROVE8:	.TEXT "Неизвестная ошибка\0"

TPROV:	.DB	0, 0	; для результатов 0 и 1
	.DBB TPROVE2, TPROVE3, TPROVE4, TPROVE5, 
	.DBB TPROVE6, TPROVE7, TPROVE8	; начальные адреса сообщений 


;==================================================== Обработка данных формы
OBRF:	
; RA,

	.NUM TMOBRF
	PP M 9042	; таблица обработчиков команд
	
	PP RM 9208
	PP M 9213	; адрес по индексу
	P X>=0 OBRFE	; нет обработчика этой команды
	PP M 9042

	PP RM 9208	; код обрабатываемой команды
	32 -		; команду "выход" обработать отдельно 
	P X!=0 OBRF1

	PP RM 9202
	PP M 9211	; считать адрес таблицы форм
	P X!=0 OBRFE	; нет обработки в этой форме

	PP M 9042
	PP RM 9203
	PP M 9211	; считать адрес подпрограммы для нужного элемента
	MA
	P X!=0 OBRFE	; нет обработки этого события

	K GOTO A		; перейти к подпрограмме RA

OBRF1:	; обработка команды "выход" не содержит различий по номеру элемента
	; используется только номер формы

	PP RM 9202
	PP M 9211	; считать адрес таблицы форм
	P X!=0 OBRFE	; нет обработки выхода в этой форме

	MA
	K GOTO A		; перейти к подпрограмме RA
	
OBRFE:	CX
	RTN	; при RX=0

TMOBRF: ; таблица таблиц обработчиков команд
	.DB 33
	.DA TOBRVVOD	; обработка команды "ввод"
	.DB 32
	.DA TOBRVYHOD	; обработка команды "выход"
	.DB 36
	.DA TOBRVYBU	; обработка команды "вверх"
	.DB 37
	.DA TOBRVYBD	; обработка команды "вниз"
	.DB 34
	.DA TOBRVYBR	; обработка команды "вправо"
	.DB 35
	.DA TOBRVYBL	; обработка команды "влево"
	.DB END

TOBRVVOD:
 	.DA TOBRF0,TOBRF1, TOBRF2, TOBRF3, TOBRF4, TOBRF5



TOBRF0:	.DA OF0E0, 0,0, OF0E3			;F0
TOBRF1:	.DA OF1E0			;F1 
TOBRF2:	.DA OF1E0			;F2 (аналогично F1)
TOBRF3:	.DA OF5E1			;F3E0=F5E1
TOBRF4:	.DA OF4E0,OF4E1,OF4E2,OF4E3,OF4E4,OF4E5
TOBRF5:	.DA OF5E0, OF5E1		; F5


;----------------------------------------------------- Команда ВВОД

;----------------------------------------------------- F0-E0
OF0E0:
	; форма 0 элемент 0
	; новая игра
	P GSB ZAPSTR

	CX
	P M LINE	; число линий
	P M SUMMA	; очки
	P M FIGN	; фигура 0

	P RM FIGNEXT
	P X=0 OF0E0D	; если есть - не генерировать
	7 
	K RAN *
	K INT
	1 +
	P M FIGNEXT	; след фигура

OF0E0D:
	.NUM TSPEED
	PP M 9042
	1
	P M SPEED	; скорость 1

	PP M 9211
	P M PTIMER
	P M PPTIMER
OF0E0V:			; вход для перезапуска
	P X!=0 OF0E0A
	PP M 9050	; запустить таймер если не 0
OF0E0A:
	P RM FTEXT
	P X=0 OF0E0B
	2		; F2E0 - текстовый
	P GOTO OF0E0C
OF0E0B:
	1 		; F1E0 - графический
OF0E0C:
	PP M 9202
	CX 
	PP M 9203	
	1
	RTN

TSPEED:	.DA 0,252,168,112,75,50,33,22,15,10,1,0	; скорость игры

;----------------------------------------------------- F0-E3
OF0E3: ; выход

	; сохранение настроек
	1 PP M 9047	; разрешение записи в ЭСППЗУ
	P RM FTEXT
	P M FTEXT
	1 PP M 9047
	P RM FREGIM
	P M FREGIM
	1 PP M 9047
	P RM FZV
	P M FZV
	1 PP M 9047
	P RM FVU
	P M FVU

	255
	PP M 9092	; выключение всех линий порта
	CX
	PP M 9090	; отключение параллельного порта

	CX
	PP M 9130	; запрещение прерываний
	1
	PP M 9148	; сброс всех прерываний

	0 
	PP M 9048	; разрешить С/П, убрать автозапуск

	.NUM TOF0E3
	PP M 9026	; вывод в строку комментариев
	CX
	ENT
	ENT
	ENT
	R/S	; отладка

TOF0E3:	.TEXT "Выход из игры ЭЛТРИС\0"

;----------------------------------------------------- F1-E0
OF1E0:
	; форма 1 элемент 0

	P GSB RISFIG	; отладка
	1
	RTN

;----------------------------------------------------- F3-E0
; аналог OF5E1


;----------------------------------------------------- F4-E0
OF4E0:	; текстовый режим
	CX
	P M FTEXT
	1
	RTN

;----------------------------------------------------- F4-E1
OF4E1:	; графический режим
	1
	P M FTEXT
	RTN

;----------------------------------------------------- F4-E2
OF4E2:	; режим скорости - ручной
	CX
	P M FREGIM
	1
	RTN

;----------------------------------------------------- F4-E3
OF4E3:	; режим скорости - автоматический
	1
	P M FREGIM
	RTN

;----------------------------------------------------- F4-E4
OF4E4:	; звук - вкл/откл
	P RM FZV
	P X=0 OF4E4A
	1
	P M FZV
	RTN
OF4E4A:
	CX
	P M FZV
	1
	RTN

;----------------------------------------------------- F4-E5
OF4E5:	; ВУ - вкл/откл
	P RM FVU
	P X=0 OF4E5A
	1
	P M FVU
	RTN
OF4E5A:
	CX
	P M FVU
	1
	RTN

;----------------------------------------------------- F5-E0
OF5E0:	; продолжить игру
	P RM PPTIMER
	P M PTIMER	; восстановить режим таймера
	P GOTO OF0E0V	; перезапуск игры

;----------------------------------------------------- F5-E1
OF5E1:	; завершить игру
	P GSB DEMO	; подготовка заставки
	CX
	PP M 9202
	PP M 9203	; F0E0
	1
	RTN	


;--------------------------------------------------------- Команда ВЫХОД
TOBRVYHOD:
; содержит адреса п/п обработчиков для форм, независимо от номера элемента 

 	.DA 0,OBRVYH1,OBRVYH1,OF5E1,0,OF5E0		; F3 и F5 - аналогично вводу

;----------------------------------------------------- F1 - выход
OBRVYH1:
	CX
	P M PTIMER	; остановить таймер
	5
	PP M 9202
	0
	PP M 9203	; к F5E0
	1
	RTN

;--------------------------------------------------------- Команда ВЫБОР ВНИЗ
TOBRVYBD:
 	.DA 0,TOBRVYBD1,TOBRVYBD1

TOBRVYBD1: 
	.DA OBRVYBD1E0				; F1+F2

;------------------------------------------------------ F1+F2 выбор вниз
OBRVYBD1E0:
	P RM FIGN
	P X!=0 OBRVYBD1E0B	; если нет фигуры - сначала нарисовать

	P RM SPEED
	P X!=0 OBRVYBD1E0A
	; если скорость ненулевая, то уронить фигуру, иначе пошаговый режим
	6 
	P M PTIMER	; установить период 0,06 с
	PP M 9050	; и сразу перезапустить таймер
OBRVYBD1E0A:
	P RM FIGY
	1 +
	P M FIGY
OBRVYBD1E0B:
	P GSB RISFIG
	1
	RTN

;--------------------------------------------------------- Команда ВЫБОР ВПРАВО
TOBRVYBR:
 	.DA 0,TOBRVYBR1,TOBRVYBR1

TOBRVYBR1: 
	.DA OBRVYBR1E0					; F1+F2

;------------------------------------------------------ F1+F2 выбор вправо
OBRVYBR1E0:
	P RM PPTIMER
	P M PTIMER	; остановить спуск

	P RM FIGX
	1 +
	P M FIGX
	P GSB RISFIG

	1
	RTN


;--------------------------------------------------------- Команда ВЫБОР ВВЕРХ
TOBRVYBU:
 	.DA 0,TOBRVYBU1,TOBRVYBU1


TOBRVYBU1: 
	.DA OBRVYBU1E0				; F1+F2

;------------------------------------------------------ F1+F2 - выбор вверх
OBRVYBU1E0:
	P RM PPTIMER
	P M PTIMER	; остановить спуск

	P RM FIGN
	P M FIGNRES
	P X=0 OBRVYBU1E0A
	RTN	; выход RX=0 - нечего вращать

OBRVYBU1E0A:
	2 -	; проверить на фигуру 2 (гориз 1x4)
	P X=0	OBRVYBU1E0A1
	P RM FIGX 	; сдвинуть вправо
	1 + 	
	P M FIGX
	P RM FIGY	; и вверх
	1 -
	P M FIGY

	P GOTO OBRVYBU1E0A2

OBRVYBU1E0A1:
	6 -	; проверить на фигуру 8 (верт 1x4)
	P X=0 OBRVYBU1E0A2
	P RM FIGX
	1 -
	P M FIGX

OBRVYBU1E0A2:
	P RM FIGN
	.NUM FIGR
	+
	K PRGM	; считать байт косвенно по RX из памяти программ
	P M FIGN
	P GSB RISFIG

	P X!=0 OBRVYBU1E0B
	; RX==1 ход невозможен - вернуть номер фигуры до поворота
	P RM FIGNRES
	P M FIGN

OBRVYBU1E0B:
	1
	RTN

;--------------------------------------------------------- Команда ВЫБОР ВЛЕВО
TOBRVYBL:
 	.DA 0,TOBRVYBL1,TOBRVYBL1

TOBRVYBL1: 
	.DA OBRVYBL1E0				; F1+F2

;------------------------------------------------------ F1+F2 - выбор влево
OBRVYBL1E0:
	P RM PPTIMER
	P M PTIMER	; остановить спуск

	P RM FIGX
	1 -
	P M FIGX
	P GSB RISFIG

	1
	RTN

;==================================================== KLAVA

; Обработка нажатия на клавишу в зависимости от текущей формы
; RA - код клавиши
; RB
KLAVA:	.NUM TKLAVA
	PP M 9042
	PP RM 9202	; номер формы
	PP M 9213
	P X>=0 KLAVAE
	MB

	K GOTO B		; перейти к подпрограмме обработки

KLAVAE:	CX
	RTN		; при RX=0

TKLAVA:	.DB 1
	.DA OKLF1
	
	.DB 2
	.DA OKLF1	; F2 аналогично F1

	.DB END

;-------------------------------- OKLF1

OKLF1:	.NUM	TOKLF1
	PP M 9042
	RMA	; код клавиши
	PP M 9213
	P X>=0 OKLF1E

	MA
	K GOTO A	

OKLF1E:	CX
	RTN

TOKLF1:
	.DB 23	; ШГ вправо - скорость ++
	.DA OKLF1_23

	.DB 24	; ШГ влево - скорость --
	.DA OKLF1_24

	.DB 19	; <-> - зеркальное отражение ;)	
	.DA OKLF1_19

	.DB 14	; B^ - отображение следующей
	.DA OKLF1_14

	.DB 13	; Cx - удаление текущей фигуры ;)
	.DA OKLF1_13

	.DB 12	; ВП - текст/графика ;)
	.DA OKLF1_12

	.DB 11	; /-/ - вкл/откл звук
	.DA OF4E4	;  (аналогично F4E4)

	.DB 7	; 1-7 цифры - ввод следующей фигуры
	.DA OKLF1_7	

	.DB 6 
	.DA OKLF1_6

	.DB 5 
	.DA OKLF1_5

	.DB 4 
	.DA OKLF1_4	

	.DB 3	 
	.DA OKLF1_3	

	.DB 2	 
	.DA OKLF1_2	

	.DB 1	 
	.DA OKLF1_1	

	.DB END

OKLF1_12:	; ВП - выбор режима тектовый/графический :-)
	P RM FREGIM
	P X=0 OKLF1_12E	; только при ручном выборе скорости

	P RM FTEXT
	P X=0 OKLF1_12A
	; был текст
	1 PP M FTEXT
	1 PP M 9202
	CX PP M 9203	; F1E0
	1 RTN
OKLF1_12A:
	; была графика
	CX PP M FTEXT
	2 PP M 9202
	CX PP M 9203	; F2E0
	1 RTN

OKLF1_12E:
	CX RTN


OKLF1_13:	; Cx - сброс фигуры :-)
	P RM FREGIM
	P X=0 OKLF1_13E	; только при ручном выборе скорости

	4 M0
	.NUMD FIGM
	M5
OKLF1_13A:
	KRM5 MA
	1 KMA 		; стираем все старые координаты (=1)
	PFL0 OKLF1_13A

	CX
	P M FIGN	; FIG0
OKLF1_13E:
	CX
	RTN

OKLF1_14:	; B^ показ следующей фигуры
	P RM FNEXT
	P X=0 OKLF1_14A
	1
	P M FNEXT
	RTN
OKLF1_14A:
	CX
	P M FNEXT
	1
	RTN

OKLF1_19:	; <-> - зеркальное отражение фигуры :-)
	P RM FREGIM
	P X=0 OKLF1_19E	; только при ручном выборе скорости

	P RM FIGN
	.NUM TOKLF1_19
	+
	K PRGM	; считать байт косвенно по RX из памяти программ
	P M FIGN
	P GSB RISFIG
	1
	RTN
OKLF1_19E:
	CX
	RTN

TOKLF1_19:
	.DB	0,1,2,4,3,6,5,7,8,14,13,12,11,10,9,16,15,19,18,17,0


OKLF1_23:	; ШГ вправо (увеличение скорости)
	P RM SPEED
	1 +
	K INT
	P M SPEED
	11 -
	P X>=0 OKLF1_23A
	10
	P M SPEED
OKLF1_23A:	
	.NUM TSPEED
	PP M 9042
	P RM SPEED
	PP M 9211
	P M PTIMER	 
	P M PPTIMER

	P RM SPEED
	1 -
	P X=0 OKLF1_23B
	P RM PTIMER
	PP M 9050	; перезапустить таймер после останова до 0 скорости
OKLF1_23B:
	1
	RTN

OKLF1_24:		; ШГ влево (уменьшение скорости)
	P RM FREGIM
	P X=0 OKLF1_24E	; только при ручном выборе скорости

	P RM SPEED
	1 -
	K INT
	P M SPEED
	P X<0 OKLF1_23A
	CX
	P M SPEED
	P GOTO OKLF1_23A

OKLF1_24E:
	CX
	RTN

OKLF1_1: 
	1 
	P GOTO OKLF1_7A
OKLF1_2: 
	2 
	P GOTO OKLF1_7A
OKLF1_3: 
	3 
	P GOTO OKLF1_7A
OKLF1_4: 
	4 
	P GOTO OKLF1_7A
OKLF1_5: 
	5 
	P GOTO OKLF1_7A
OKLF1_6: 
	6 
	P GOTO OKLF1_7A
OKLF1_7: 
	7 
OKLF1_7A:
	MA
	P RM FREGIM
	P X=0 OKLF1_7E	; только при ручном выборе скорости

	RMA
	P M FIGNEXT	; заменить следующую фигуру

	P RM FTEXT
	P X!=0 OKLF1_7E	; отрисовать только при графическом выводе
	P GSB RISNEXT

OKLF1_7E:
	CX
	RTN

;======================================================= Подпрограммы

;===================================================
DEMO:	; заполнение STR0-STR11 значениями
	; для вывода при демонстрации
	
	12 M0
	.NUMD STR0
	MA

DEMO1:	RMA M4
	14 M1
	2	; RX=2
DEMO2:
	KM4	; кубик  (=2)
		
	PFL1 DEMO2
	CX KM4	; конец очередной строки

	K RAN 14 *
	K INT
	RMA + 1 + MB
	1 KMB	; как минимум одна дырка в строке

	RMA 20 + MA

	PFL0 DEMO1

	; добавить ещё одну дырку к STR1
	K RAN
	13 *
	K INT
	.NUM STR1
	+	
	MA
	1 KMA

	; добавить ещё одну дырку к STR0
	K RAN
	13 *
	K INT
	.NUM STR0
	+	
	MA
	1 KMA

	; пройти по двум верхним строкам
	; чтобы удалить висящие кубики
	14 M1 
	.NUMD STR0
	M4
	.NUMD STR1
	M5
DEMO5:	KRM5
	1 -
	P X=0 DEMO6
	1
	KM4
	P GOTO DEMO7
DEMO6:	KRM4	; выровнять адрес
DEMO7:	PFL1 DEMO5	

	; подготовка падающей фигуры
	7
	K RAN
	*
	K INT
	1 +
	P M FIGNEXT
	P GSB RISNEXT1

	K RAN
	10 *
	K INT
	3 *
	82 +
	P M DEMOX	; координата X фигуры

	K RAN
	5 *
	K INT
	3 *
	P M DEMOY	; координата Y фигуры
	3 +
	P M DEMOY1	; координата Y+3 фигуры

	RTN

;===================================================
ZAPSTR:	; заполнение STR0-STR11 начальными значениями 
	; для новой игры
	
	12 M0
	.NUMD STR0
	MA

ZAPSTR1:
	RMA M4

	9 M1
	1	; RX=1
ZAPSTR2:	; фон поля (=1)
	KM4	
	PFL1 ZAPSTR2
	CX KM4	; конец строки

	RMA 20 + MA

	PFL0 ZAPSTR1
	RTN

;=================================================== 
RISFIG:	; вывод фигуры в текущем расположении с проверками

	P RM FZV
	P X!=0 RISFIG00
	100 ENT 1
	PP M 9052	; звук

RISFIG00:
	P RM FIGN
	P X=0 RISFIG0	; проверить наличие фигуры

	P RM FIGNEXT
	P M FIGN	; новый номер фигуры

	; сгенерировать
	7		; 7 - всего базовых фигур
	K RAN
	*
	K INT
	1 +
	P M FIGNEXT

	P GSB RISNEXT	; подготовка к выводу  

	CX
	P M FIGY
	3
	P M FIGX	; вывести в позиции (3,0)
	1
	P M FIGNF	; флаг новой фигуры !=0

RISFIG0:
	P RM FIGN
	10 *		
	.NUM FIG0	; начало нулевой фигуры	
	+
	PP M 9042
	
	4 M0
	.NUMD FIGMN	; массив новых адресов
	M4
RISFIG1:
	P RM FIGX
	P X>=0 RISFIG6	; X<0 выход влево
	PP RM 9044
	+
	MA	
	9 -
	P X<0 RISFIG7	; X>8 выход вправо
	P RM FIGY
	PP RM 9044
	+
	MB
	12 -
	P X<0 RISFIG3	; Y>11 - дно

	RMB
	20 *		; длина строки
	RMA +
	.NUM STR0
	+		; адрес в двоичной памяти
	KM4		; занести в массив новых адресов
	MA
	KRMA		; проанализировать текущее содержимое
	3 -
	P X!=0 RISFIG3	; =3 - наткнулись на заполненную клетку	
	; клетка свободна
	PFL0 RISFIG1
	
	; все клетки свободны - можно перемещать

	P RM FIGNF
	P X=0 RISFIG2A	; если новая фигура - не стирать

	4 M0
	.NUMD FIGM
	M5
RISFIG2:
	KRM5	; адрес старой
	MA
	1	; стираем все старые (=1)
	KMA
	PFL0 RISFIG2

RISFIG2A:
	4 M0
	.NUMD FIGMN
	M4
	.NUMD FIGM
	M5
RISFIG2B:
	KRM4	; адрес новой
	MA
	KM5	; замещаем адрес старой
	2	; ставим новую (=2)
	KMA
	PFL0 RISFIG2B

	CX
	P M FIGNF	; шаг сделан - обнуляем флаг новой фигуры
	RTN	; выход RX=0

RISFIG3: ; замораживаем фигуру в предыдущем положении
	P RM FIGNF
	P X=0 RISFIG5	; если это новая фигура - выход из игры
	
	4 M0
	.NUMD FIGM
	M5
RISFIG4:
	KRM5
	MA
	3	; стационарно (=3)
	KMA
	PFL0 RISFIG4
	
	P GSB PROVLINE	; проверка наличия заполненных линий

	CX
	P M FIGN	; обнуляем номер текущей фигуры
	RTN		; выход RX=0

RISFIG5:
	; выход из игры
	3
	PP M 9202
	CX
	PP M 9203
	P M PTIMER	; остановить таймер 0
	3 PP M 9092	; включить канал 2 ВУ
	50 PP M 9051	; запустить таймер 1
	1		; выход RX=-1
	+/-
	RTN

RISFIG6:
	CX
	P M FIGX	; при FIGX<0 - обнулить
	1
	RTN		; выход RX=1 - не исполнено

RISFIG7:
	P RM FIGX	; при выходе за границу вправо - откорректировать
	1 -
	P M FIGX
	1		; выход RX=1 - не исполнено
	RTN

;========================================= Проверка заполненности линий
PROVLINE:
	P RM PPTIMER
	P M PTIMER	; остановить быстрый спуск

	CX
	ME	; временный счётчик очков

	12 M0
	.NUMD STR11
	MA
PROVLINE1:	
	9 M1
	RMA M4
PROVLINE2:
	KRM4
	3 - 
	P X=0 PROVLINE6
	PFL1 PROVLINE2
	; линия целиком заполнена
	P RM LINE
	1 +
	P M LINE	; увеличить счётчик

	; звук
	P RM FZV
	P X!=0 PROVLINE2A
	75 ENT 5
	PP M 9052
PROVLINE2A:
	; ВУ
	P RM FVU
	P X!=0 PROVLINE2B
	5 PP M 9092	; включить канал 1 ВУ
	50 PP M 9051	; запустить таймер 1 - 0,5 сек
PROVLINE2B:
	; скорость - автоматически
	P RM FREGIM
	P X!=0 PROVLINE2C
	P RM LINE
	7 /		; каждую 7-ю линию увеличить скорость
	K FRAC
	P X=0 PROVLINE2C
	P GSB OKLF1_23	; п/п увеличения скорости

PROVLINE2C:
	RME 		; правило начисления очков
	2 
	P RM FNEXT +	; получаем 2 или 3
	*
	P RM SPEED	; добавляем скорость
	+
	ME

	RM0 
	1 -
	M1	; сдвинуть оставшиеся линии
	RMA MB
	20 - MC

PROVLINE3:	
	9 M2
	RMB M4
	RMC M5
PROVLINE4:
	KRM5
	KM4

	PFL2 PROVLINE4
	
	RMB 20 - MB
	RMC 20 - MC
	PFL1 PROVLINE3
	
	; очистить верхнюю строку
	.NUMD STR0
	M4
	9 M1
PROVLINE5:
	1 KM4
	PFL1 PROVLINE5
	CX KM4	
	; не изменять RA при повторной проверке
	P GOTO PROVLINE7
PROVLINE6: 
	RMA 20 - MA
PROVLINE7:
	; к проверке следующей линии
	PFL0 PROVLINE1
	
	P RM SUMMA
	RME +
	P M SUMMA

	P RM FZV
	P X!=0 PROVLINEE
	50 ENT 5
	PP M 9052

PROVLINEE:
	RTN
;======================================================= 
; Подготовка к выводу следующей фигуры
RISNEXT:
	P RM FNEXT
	P X=0 RISNEXTE
	; ==0 - вывод разрешён

RISNEXT1: ; вход для безусловной подготовки

	.NUM TRISNEXT
	PP M 9042

	P RM FIGNEXT
	2 *
	MA
	PP M 9211
	P M RTXTK1
	RMA 1 +
	PP M 9211
	P M RTXTK2
RISNEXTE:
	RTN

TRISNEXT: ; адреса строк в памяти двоичных данных
	.DA	RFIGST0, RFIGST0
	.DA	RFIGST2, RFIGST2	; FIG1
	.DA	RFIGST4, RFIGST0	; FIG2
	.DA	RFIGST3, RFIGST7	; FIG3
	.DA	RFIGST3, RFIGST1	; FIG4
	.DA	RFIGST2, RFIGST6	; FIG5
	.DA	RFIGST6, RFIGST2	; FIG6
	.DA	RFIGST3, RFIGST5	; FIG7


;======================================================= Обработчики флагов прерываний
OTIMER: ; прерывание таймера
	CX
	P M FTIMER

	P RM FIGRA
	P X!=0 OTIMERE
	; перезапустить таймер 0
	P RM PTIMER
	P X!=0 OTIMERE
	; период !=0
	PP M 9050

	; подвинуть вниз фигуру
	P RM FIGY
	1 +
	P M FIGY
	P GSB RISFIG
OTIMERE:
	RTN


;======================================================= Инициализация структур программы
INITPROG:
	CX
	2 PP M 9048	; 1- автоматический запуск, 2 - с блокировкой С/П
	2 PP M 9010	; инициализация графического экрана

	1 PP M 9200	; 1 - разрешение интерфейса
	.NUM TFORM
	PP M 9201	; главная таблица форм TFORM

	;0 PP M 9202	; стартовое меню - 0
	;0 PP M 9203	; активный элемент - 0
	; 64 PP M 9208	; нарисовать форму при старте 

	1
	PP M 9148	; сброс всех прерываний
	PP M 9130	; разрешение прерываний

	.NUM TIMER
	ENT
	1
	PP M 9131	; Прерывание 1, приоритет 1, вектор TIMER
	PP M 9150	; Разрешить аппаратное прерывание таймера 0 

	.NUM TIMER1
	ENT
	2
	PP M 9132	; Прерывание 2, приоритет 2, вектор TIMER1
	PP M 9151	; Разрешить аппаратное прерывание таймера 1 



	CX
	PP M 9171	; отключение мультиплексора АЦП (если он есть)
	1
	PP M 9090	; режим параллельного порта - статический
	1 
	PP M 9093	; тип операции

	1 
	P M FIGRA	; отладка

	0
	P M FZV		; звук - нет
	0
	P M FNEXT	; вывод следующей - есть
	0
	P M FREGIM	; режим скорости - ручн (отладка)
	1
	P M FTEXT	; режим отображения - графический (отладка)

	; перенос строк в область двоичных данных
	40 M0
	.NUMD RFIGST0
	M4
	.NUM FIGST0
	PP M 9042
INITPROG1:
	PP RM 9044
	KM4
	PFL0 INITPROG1

	P GSB DEMO	; подготовка заставки

	CX
	PP M 9202	; стартовое меню - 0
	PP M 9203	; активный элемент - 0
	64 PP M 9208	; нарисовать форму при старте 

	RTN

;======================================================= Прерывание 1 - таймер 0
TIMER:	1
	P M FTIMER	; установить флаг срабатывания таймера
	PP RTN

;======================================================= Прерывание 2 - таймер 1
TIMER1:	
	15
	PP M 9092	; отключить все выходы параллельного порта на ВУ
	PP RTN

; ====================================================== Главная таблица форм
TFORM:
	.DB 0		; Форма 0  - Стартовое меню
	.DA F0

	.DB 1		; Форма 1  - игра графическая
	.DA F1

	.DB 2		; Форма 2  - игра текстовая
	.DA F2

	.DB 3		; Форма 3  - конец игры
	.DA F3

	.DB 4		; Форма 4  - настройка
	.DA F4

	.DB 5		; Форма 5  - выйти?
	.DA F5

	.DB 10		; Форма 10 - о программе, часть 1
	.DA F10

	.DB 252		; Форма 252 - ошибка формы
	.DA F252

	.DB END

; F0 ====================================================== Стартовое меню, Форма 0
	.BASE
F0:	.DB 3		;максимальный номер элемента 
	.DBB F0DE, F0PI, F0PO, F0PL, F0PR, F0RI, F0KM

F0DE:	;таблица флагов действий
	.DB 13,5,5,13	; 00 00 01 01 = выбор + ввод, 13- с признаком ввода

F0PI:	.DB 1,0,4,0,10,0,0,3

F0PO:	.DB 0,0,0,0,0,0,0,0

F0PL:	.DB 3,0

F0PR:	.DB 1,2,3,0

F0RI:	; рисунок экранной формы

	.DB TAB, 0, 17
	.DB SQU, 0, 80, 1
	.DB TAB, 0, 19
	.DB SQU, 0, 80, 1
	.DB TAB, 80, 0
	.DB SQU, 0, 1, 63
	.DB TAB, 78, 0
	.DB SQU, 0, 1, 40

	.DB TAB, 80, 63
	.DB SQU, 0, 46, 1
	.DB TAB, 125, 0
	.DB SQU, 0, 1, 63

	.DB TYPE, 254 			; шрифт 254 - загружаемый
	.DB ATYPE
	.DA FONTT

	.DB TAB, 0, 0 	
	.DB TXTP, 0
	.DA F0Z0
	.DB TAB, 0, 3 	
	.DB TXTP, 0
	.DA F0Z1
	.DB TAB, 0, 6 	
	.DB TXTP, 0
	.DA F0Z2		
	.DB TAB, 0, 9 	
	.DB TXTP, 0
	.DA F0Z3
	.DB TAB, 0, 12 	
	.DB TXTP, 0
	.DA F0Z4

	.DB LCALL
	.DA F0SL0	; к подпрограмме вывода демонстрационного изображения


	.DB TYPE, 0h 			; шрифт 0
	.DB TAB, 10, 24 
	.DB TXTP, 16
	.DA F0T0
	.DB TAB, 10, 34 
	.DB TXTP, 16
	.DA F0T1
	.DB TAB, 10, 44 
	.DB TXTP, 16
	.DA F0T2
	.DB TAB, 10, 54 
	.DB TXTP, 16
	.DA F0T3

	.DB END

F0KM:	.DBB F0KM0, F0KM1, F0KM2, F0KM3

F0KM0:	.DB TAB, 0, 23
	.DB MCALL
	.DBB F0S1
	.DB TAB, 0, 26
	.DB MCALL
	.DBB F0S2
	.DB TAB, 0, 29
	.DB JM
	.DBB F0KME

F0KM1:	.DB TAB, 0, 33
	.DB MCALL
	.DBB F0S1
	.DB TAB, 0, 36
	.DB MCALL
	.DBB F0S2
	.DB TAB, 0, 39
	.DB JM
	.DBB F0KME

F0KM2:	.DB TAB, 0, 43
	.DB MCALL
	.DBB F0S1
	.DB TAB, 0, 46
	.DB MCALL
	.DBB F0S2
	.DB TAB, 0, 49
	.DB JM
	.DBB F0KME

F0KM3:	.DB TAB, 0, 53
	.DB MCALL
	.DBB F0S1
	.DB TAB, 0, 56
	.DB MCALL
	.DBB F0S2
	.DB TAB, 0, 59
F0KME:
	.DB MCALL
	.DBB F0S1
	.DB END

F0S1:	
	.DB TYPE, 254 			; шрифт 254 - загружаемый
	.DB ATYPE
	.DA FONTT

	.DB TXTP, 0
	.DA F0TK1
	.DB RETUM

F0S2:	.DB TXTP, 0
	.DA F0TK2
	.DB RETUM

F0SL0:	; подпрограмма вывода демонстрационного изображения
	.BASE

	.DB TYPE, 254 			; шрифт 254 - загружаемый
	.DB ATYPE
	.DA FONTT

	.DB LDX
	.DA DEMOX
	.DB LDY
	.DA DEMOY
	.DB TXTK,0
	.DA RTXTK1

	.DB LDX
	.DA DEMOX
	.DB LDY
	.DA DEMOY1
	.DB TXTK,0
	.DA RTXTK2

	.DB TAB, 82, 26
	.DB TXTB, 0
	.DA STR0
	.DB TAB, 82, 29
	.DB TXTB, 0
	.DA STR1
	.DB TAB, 82, 32
	.DB TXTB, 0, 
	.DA STR2
	.DB TAB, 82, 35
	.DB TXTB, 0
	.DA STR3
	.DB TAB, 82, 38
	.DB TXTB, 0
	.DA STR4
	.DB TAB, 82, 41
	.DB TXTB, 0
	.DA STR5
	.DB TAB, 82, 44
	.DB TXTB, 0
	.DA STR6
	.DB TAB, 82, 47
	.DB TXTB, 0
	.DA STR7
	.DB TAB, 82, 50
	.DB TXTB, 0
	.DA STR8
	.DB TAB, 82, 53
	.DB TXTB, 0
	.DA STR9
	.DB TAB, 82, 56
	.DB TXTB, 0
	.DA STR10
	.DB TAB, 82, 59
	.DB TXTB, 0
	.DA STR11

	.DB RETUL


F0T0:	.TEXT "Новая игра\0"
F0T1:	.TEXT "Настройка\0"
F0T2:	.TEXT "О программе\0"
F0T3:	.TEXT "Выход\0"

F0Z0:	.DB 2,2,1,1,1,1,2,1,2,2,2,1,2,2,2,1,2,1,1,2,1,1,2,2,0
F0Z1:	.DB 1,1,2,1,1,2,2,1,1,2,1,1,2,1,2,1,2,1,1,2,1,2,1,1,0
F0Z2:	.DB 1,2,2,1,2,1,2,1,1,2,1,1,2,2,2,1,2,1,2,2,1,2,1,1,0
F0Z3:	.DB 1,1,2,1,2,1,2,1,1,2,1,1,2,1,1,1,2,2,1,2,1,2,1,1,0
F0Z4:	.DB 2,2,1,1,2,1,2,1,1,2,1,1,2,1,1,1,2,1,1,2,1,1,2,2,0

F0TK1:	.DB 2,0
F0TK2:	.DB 2,2,0


; F1 ====================================================== Поле, Форма 1
	.BASE
F1:	.DB 0		;максимальный номер элемента 
	.DBB F1DE, F1PI, F1PO, F1PL, F1PR, F1RI, F1KM

F1DE:	;таблица флагов действий
	.DB 63		; 00 11 11 11 = обрвыход + обрввод + обрвыбор

F1PI:	
F1PO:	
F1PL:	
F1PR:	.DB 0,0

F1RI:	; рисунок экранной формы

	.DB TAB, 0, 0 		; позиция 0,0
	.DB SQU, 0, 1, 63
	.DB TAB, 48, 0 		; позиция 0,0
	.DB SQU, 0, 1, 63
	.DB TAB, 0, 63 		; позиция 0,0
	.DB SQU, 0, 49, 1


	.DB TYPE, 254 			; шрифт 254 - загружаемый
	.DB ATYPE
	.DA FONTZ

	.DB TAB, 2, 2
	.DB TXTB, 0
	.DA STR0
	.DB TAB, 2, 7
	.DB TXTB, 0
	.DA STR1
	.DB TAB, 2, 12
	.DB TXTB, 0, 
	.DA STR2
	.DB TAB, 2, 17
	.DB TXTB, 0
	.DA STR3
	.DB TAB, 2, 22
	.DB TXTB, 0
	.DA STR4
	.DB TAB, 2, 27
	.DB TXTB, 0
	.DA STR5
	.DB TAB, 2, 32
	.DB TXTB, 0
	.DA STR6
	.DB TAB, 2, 37
	.DB TXTB, 0
	.DA STR7
	.DB TAB, 2, 42
	.DB TXTB, 0
	.DA STR8
	.DB TAB, 2, 47
	.DB TXTB, 0
	.DA STR9
	.DB TAB, 2, 52
	.DB TXTB, 0
	.DA STR10
	.DB TAB, 2, 57
	.DB TXTB, 0
	.DA STR11

	.DB JNEZ
	.DA FNEXT
	.DBB F1RI1	; перейти, если нет вывода следующей фигуры

	.DB TAB, 56, 7
	.DB TXTK, 0
	.DA RTXTK1

	.DB TAB, 56, 12
	.DB TXTK, 0
	.DA RTXTK2

F1RI1:
	.DB TYPE, 0 			; шрифт 0

	.DB TAB, 56, 32
	.DB TXTP, 16
	.DA F1T1
	.DB TAB, 100, 32
	.DB PREXP, 16
	.DA SPEED

	.DB TAB, 56, 40
	.DB TXTP, 16
	.DA F1T2
	.DB TAB, 100, 40
	.DB PREXP, 16
	.DA LINE

	.DB TAB, 56, 48
	.DB TXTP, 16
	.DA F1T3
	.DB TAB, 100, 48
	.DB PREXP, 16
	.DA SUMMA

	.DB END

F1KM:	.DBB F1KM0

F1KM0:	.DB END			

F1T1:	.TEXT "Скорость\0"
F1T2:	.TEXT "Линии\0"
F1T3:	.TEXT "Очки\0"


; F2 ====================================================== Поле текстовое, Форма 2
	.BASE
F2:	.DB 0		;максимальный номер элемента 
	.DBB F2DE, F2PI, F2PO, F2PL, F2PR, F2RI, F2KM

F2DE:	;таблица флагов действий
	.DB 63		; 00 11 11 11 = обрвыход + обрввод + обрвыбор

F2PI:	
F2PO:	
F2PL:	
F2PR:	.DB 0,0

F2RI:	; рисунок экранной формы

	.DB TYPE, 0 			; шрифт 0

	.DB TAB, 0,0
	.DB SQU, 0, 1, 63
	.DB TAB, 0,21
	.DB SQU, 0, 127, 1


	.DB TAB, 4, 2
	.DB TXTP, 16
	.DA F2T0
	.DB PREXP, 16
	.DA FIGN

	.DB TAB, 4, 12
	.DB TXTP, 16
	.DA F2T1
	.DB PREXP, 16
	.DA FIGX

	.DB TXTP, 16
	.DA F2T2
	.DB PREXP, 16
	.DA FIGY


	.DB JNEZ
	.DA FNEXT
	.DBB F2RI1	; перейти, если нет вывода следующей фигуры

	.DB TAB, 4, 24
	.DB TXTP, 16
	.DA F2T3
	.DB PREXP, 16
	.DA FIGNEXT

F2RI1:

	.DB TAB, 4, 34
	.DB TXTP, 16
	.DA F2T4
	.DB PREXP, 16
	.DA SPEED

	.DB TAB, 4, 44
	.DB TXTP, 16
	.DA F2T5
	.DB PREXP, 16
	.DA LINE

	.DB TAB, 4, 54
	.DB TXTP, 16
	.DA F2T6
	.DB PREXP, 16
	.DA SUMMA

	.DB END

F2KM:	.DBB F2KM0
F2KM0:	.DB END			

F2T0:	.TEXT "Фигура: \0"
F2T1:	.TEXT "Координаты: X=\0"
F2T2:	.TEXT ", Y=\0"
F2T3:	.TEXT "Следующая: \0"
F2T4:	.TEXT "Cкорость: \0"
F2T5:	.TEXT "Линии: \0"
F2T6:	.TEXT "Очки: \0"

; F3 ====================================================== "Игра окончена", Форма 3
	.BASE
F3:	.DB 0		;максимальный номер элемента 
	.DBB F3DE, F3PI, F3PO, F3PL, F3PR, F3RI, F3KM

F3DE:	;таблица флагов действий
	.DB 188			; 10 11 11 00 = 148 = запроч + обрвыход + обрввод
				; 1-выбор, 2-обр выбор, 4-ввод, 8-обр ввод, 16-выход, 32-обр выход
				; 64 - периодическое обновление, 128 - запрет очистки
				; 189 - с обр ввода и выхода, с запретом очистки
				

F3PI:	
F3PO:	
F3PL:	
F3PR:	.DB 0,0			; F0E0

F3RI:	; рисунок экранной формы

	.DB TAB, 13, 9
	.DB SQU, 4, 102, 18 		; вывод инверсного прямоугольника
	.DB TAB, 14, 10
	.DB FRAME, 0, 100, 16 		; вывод рамки

	.DB TYPE, 0			; шрифт 0
	.DB TAB, 30, 14
	.DB TXTP, 16
	.DA F3T0
	.DB END

F3KM:	.DBB F3KM0
F3KM0:	.DB END

F3T0:	.TEXT "Игра окончена\0"	

; F4 ====================================================== Настройка, Форма 4
	.BASE
F4:	.DB 5		;максимальный номер элемента 
	.DBB F4DE, F4PI, F4PO, F4PL, F4PR, F4RI, F4KM

F4DE:	;таблица флагов действий
	.DB 29,29,29,29,29,29		; 00 01 11 01 = выход + обрввод + выбор

F4PI:	
F4PO:	.DB 0,1,0,1,0,1,0,1,0,1,0,1
F4PL:	.DB 5,0
F4PR:	.DB 1,2,3,4,5,0

F4RI:	; рисунок экранной формы

	.DB TAB, 0,0
	.DB SQU, 0, 1, 63
	.DB TAB, 124,0
	.DB SQU, 0, 1, 63
	.DB TAB, 92,4
	.DB SQU, 0, 35, 1

	.DB TYPE, 0 			; шрифт 0

	.DB TAB, 4, 0
	.DB TXTP, 16
	.DA F4T1

	.DB TAB, 14, 8
	.DB TXTP, 16
	.DA F4T1A

	.DB TAB, 14, 16
	.DB TXTP, 16
	.DA F4T1B

	.DB TAB, 4, 24
	.DB TXTP, 16
	.DA F4T2

	.DB TAB, 14, 32
	.DB TXTP, 16
	.DA F4T2A

	.DB TAB, 14, 40
	.DB TXTP, 16
	.DA F4T2B

	.DB TAB, 4, 48
	.DB TXTP, 16
	.DA F4T3

	.DB TAB, 4, 56
	.DB TXTP, 16
	.DA F4T4

	.DB TYPE, 254
	.DB ATYPE
	.DA FONTZ

	.DB TAB, 110, 10

	.DB JNEZ
	.DA FTEXT
	.DBB F4RI1	; перейти, если графический режим

	.DB TXTP, 16
	.DA F4TK3
	.DB TAB, 110, 18
	.DB TXTP, 16
	.DA F4TK2
	.DB JM
	.DBB F4RI2

F4RI1:	.DB TXTP, 16
	.DA F4TK2
	.DB TAB, 110, 18
	.DB TXTP, 16
	.DA F4TK3

F4RI2:	.DB TAB, 110, 34

	.DB JNEZ
	.DA FREGIM
	.DBB F4RI3	; перейти, если автоматически

	.DB TXTP, 16
	.DA F4TK3
	.DB TAB, 110, 42
	.DB TXTP, 16
	.DA F4TK2
	.DB JM
	.DBB F4RI4

F4RI3:	.DB TXTP, 16
	.DA F4TK2
	.DB TAB, 110, 42
	.DB TXTP, 16
	.DA F4TK3

F4RI4:	.DB TAB, 110, 50

	.DB JNEZ
	.DA FZV
	.DBB F4RI5	; перейти, если есть звук

	.DB TXTP, 16
	.DA F4TK0
	.DB JM
	.DBB F4RI6

F4RI5:	.DB TXTP, 16
	.DA F4TK1

F4RI6:	.DB TAB, 110, 58

	.DB JNEZ
	.DA FVU
	.DBB F4RI7	; перейти, если используются ВУ

	.DB TXTP, 16
	.DA F4TK0
	.DB JM
	.DBB F4RI8

F4RI7:	.DB TXTP, 16
	.DA F4TK1

F4RI8:	.DB END

F4KM:	.DBB F4KM0,F4KM1,F4KM2,F4KM3,F4KM4,F4KM5

F4KM0:	.DB TAB, 117,11
	.DB JM
	.DBB F4KME
F4KM1:	.DB TAB, 117,19
	.DB JM
	.DBB F4KME
F4KM2:	.DB TAB, 117,35
	.DB JM
	.DBB F4KME
F4KM3:	.DB TAB, 117,43
	.DB JM
	.DBB F4KME
F4KM4:	.DB TAB, 117,51
	.DB JM
	.DBB F4KME
F4KM5:	.DB TAB, 117,59
F4KME:	.DB ATYPE
	.DA FONTT
	.DB TXTP,0
	.DA F4TK5
	.DB END			

F4T1:	.TEXT "Режим:\0"
F4T1A:	.TEXT "- текстовый\0"
F4T1B:	.TEXT "- графический\0"

F4T2:	.TEXT "Изменение скорости:\0"
F4T2A:	.TEXT "- вручную\0"
F4T2B:	.TEXT "- автоматически\0"

F4T3:	.TEXT "Звук\0"
F4T4:	.TEXT "Внешние устройства\0"

F4TK0:	.DB	10,0
F4TK1:	.DB	11,0
F4TK2:	.DB	12,0
F4TK3:	.DB	13,0
F4TK5:	.DB	2,2,0

; F5 ====================================================== "Выйти?", Форма 5
	.BASE
F5:	.DB 1		;максимальный номер элемента 
	.DBB F5DE, F5PI, F5PO, F5PL, F5PR, F5RI, F5KM

F5DE:	;таблица флагов действий
	.DB 189,189			; 10 11 11 01 = 157 = запроч + обрвыход+ обрввод + выбор
				; 1-выбор, 2-обр выбор, 4-ввод, 8-обр ввод, 16-выход, 32-обр выход
				; 64 - периодическое обновление, 128 - запрет очистки
				; 189 - с обр ввода и выхода, с запретом очистки
				

F5PI:	
F5PO:	.DB 0,0,0,0		; F0E0
F5PL:	
F5PR:	.DB 1,0	

F5RI:	; рисунок экранной формы

	.DB TAB, 13, 9
	.DB SQU, 4, 102, 28 		; вывод инверсного прямоугольника
	.DB TAB, 14, 10
	.DB FRAME, 0, 100, 26 		; вывод рамки

	.DB TYPE, 0			; шрифт 0
	.DB TAB, 39, 14
	.DB TXTP, 16
	.DA F5T0
	
	.DB TAB, 42, 24
	.DB TXTP, 16
	.DA F5T1

	.DB TYPE, 254
	.DB ATYPE 
	.DA FONTT

	.DB END

F5KM:	.DBB F5KM0, F5KM1

F5KM0:	.DB TAB, 22, 18
	.DB TXTP, 0
	.DA F5TK1
	.DB TAB, 97, 18
	.DB JM
	.DBB F5KME
F5KM1:	.DB TAB, 22, 28
	.DB TXTP, 0
	.DA F5TK1
	.DB TAB, 97, 28
F5KME:	
	.DB TXTP, 0
	.DA F5TK1

	.DB END

F5T0:	.TEXT "Продолжить\0"	
F5T1:	.TEXT "Завершить\0"	

F5TK1:	.DB 2,2,2,0

; F10 ============================= Информация о программе, форма 10

	.BASE
F10:	.DB 0		;максимальный номер элемента 
	.DBB F10DE, F10PI, F10PO, F10PL, F10PR, F10RI, F10KM

F10DE:	;таблица флагов действий
	.DB 20	; 00 01 01 00 = выбор + выход

F10PI:

F10PO:	.DB 0,2 ; выход F0E2

F10PL:
F10PR:	.DB 0

F10RI:	; рисунок экранной формы
	.DB TAB, 0,0
	.DB SQU, 0, 1,63 
	.DB TAB, 127,0
	.DB SQU, 0, 1,63 

	.DB TYPE, 0h 		; шрифт 0
	.DB TAB, 32, 0 
	.DB TXTP, 16
	.DA F10T0
	.DB TAB, 8, 8
	.DB TXTP, 16
	.DA F10T1
	.DB TAB, 8, 16 
	.DB TXTP, 16
	.DA F10T2
	.DB TAB, 8, 24 
	.DB TXTP, 16
	.DA F10T3
	.DB TAB, 8, 32 
	.DB TXTP, 16
	.DA F10T4
	.DB TAB, 8, 40 
	.DB TXTP, 16
	.DA F10T5
	.DB TAB, 8, 52 
	.DB TXTP, 16
	.DA F10T6

	.DB END

F10KM:	.DBB F10KM0
F10KM0:	.DB END			

F10T0:	.TEXT "Игра ЭЛТРИС\0"	
F10T1:	.TEXT " Цель - плотная укладка\0"
F10T2:	.TEXT "фигур на игровое поле.\0"
F10T3:	.TEXT " Заполненные линии\0"
F10T4:	.TEXT "удаляются. Управление - \0"
F10T5:	.TEXT "клавишами выбора.\0"

F10T6:	.TEXT "Версия 1.4 от 14.09.12\0"

;============================================= Ошибка интерфейса - форма 252
; Сообщение об ошибке STR1 в форме RB элемент RC
; В отлаженной программе эта форма не вызывается

	.BASE
F252:	.DB 0		;максимальный номер элемента 
	.DBB F252DE, F252PI, F252PO, F252PL, F252PR, F252RI, F252KM

F252DE:	;таблица флагов действий
	.DB 20	; 00 01 01 00 = выбор + выход

F252PI:	.DB 0,2,	

F252PO:	.DB 0,2,

F252PL:	.DB 0

F252PR:	.DB 0

F252RI:	; рисунок экранной формы
	.DB TYPE, 0h 			; шрифт 0
	.DB TAB, 12, 0 		; позиция 
	.DB TXTP, 16
	.DA F252T0
	.DB TAB, 0, 16 		; позиция
	.DB TXTP, 16
	.DA F252T1
	.DB TAB, 0, 24 		; позиция
	.DB TXTP, 16
	.DA F252T2

	.DB TAB, 60, 16 	; позиция
	.DB PRFORM, 16
	.DB 0, 11		; RB формат 3.0 - форма
	.DB 3, 0

	.DB TAB, 60, 24 	; позиция
	.DB PRFORM, 16
	.DB 0, 12		; RС формат 3.0 - элемент
	.DB 3, 0

	.DB TAB, 0, 48 		; позиция
	.DB TXTB, 16
	.DA STR1		; текст из STR1

	.DB END

F252KM:	.DBB F252KM0

F252KM0:	.DB END			

F252T0:	.TEXT "ОШИБКА ИНТЕРФЕЙСА\0"	
F252T1:	.TEXT "Форма\0"	
F252T2:	.TEXT "Элемент\0"	


;======================================= Изображения

ZVRIS3: 
        .DB 8, 8
        .DB 0
        .DB 20h
        .DB 7Ch
        .DB 3Eh
        .DB 3Ch
        .DB 20h
        .DB 0
        .DB 0


;======================================= Фигуры
; (нижние слои вперёд для ускорения проверки)
FIG0:	.DB	0,0,0,0,0,0,0,0,0,0	; пустая фигура для выравнивания
FIG1:	.DB	0,1,1,1,0,0,1,0,0,0	; блок 2x2	
FIG2:	.DB	0,0,1,0,2,0,3,0,0,0	; 4x1 горизонталь 
FIG3:	.DB	2,1,0,0,1,0,2,0,0,0	; и т.д.
FIG4:	.DB	0,1,0,0,1,0,2,0,0,0	; 
FIG5:	.DB	1,1,2,1,0,0,1,0,0,0	; 
FIG6:	.DB	0,1,1,1,1,0,2,0,0,0	; 
FIG7:	.DB	1,1,0,0,1,0,2,0,0,0	; 

FIG8:	.DB	0,3,0,2,0,1,0,0,0,0	; fig2 rot1

FIG9:	.DB	0,2,1,2,1,1,1,0,0,0	; fig3 rot1
FIG10:	.DB	0,1,1,1,2,1,0,0,0,0	; fig3 rot2
FIG11:	.DB	0,2,0,1,0,0,1,0,0,0	; fig3 rot3

FIG12:	.DB	1,2,1,1,0,0,1,0,0,0	; fig4 rot1
FIG13:	.DB	0,1,1,1,2,1,2,0,0,0	; fig4 rot2
FIG14:	.DB	0,2,1,2,0,1,0,0,0,0	; fig4 rot3

FIG15:	.DB	0,2,0,1,1,1,1,0,0,0	; fig5 rot1
FIG16:	.DB	1,2,0,1,1,1,0,0,0,0	; fig6 rot1

FIG17:	.DB	1,2,0,1,1,1,1,0,0,0	; fig7 rot1
FIG18:	.DB	0,1,1,1,2,1,1,0,0,0	; fig7 rot2
FIG19:	.DB	0,2,0,1,1,1,0,0,0,0	; fig7 rot3

FIGR:	.DB	0,1,8,9,12,15,16,17,2,10,11,3,13,14,4,5,6,18,19,7,0	; таблица вращений


FIGST0:	.DB	0,0,0,0,0
FIGST1:	.DB	4,0,0,0,0
FIGST2:	.DB	4,4,0,0,0
FIGST3:	.DB	4,4,4,0,0
FIGST4:	.DB	4,4,4,4,0
FIGST5:	.DB	32,4,0,0,0
FIGST6:	.DB	32,4,4,0,0
FIGST7:	.DB	32,32,4,0,0

;======================================= Загружаемый шрифт Z

	.BASE
FONTZ:	.DB 5	; высота шрифта

	.DB 1,5	; символ 1 ширина 5
	.DWB CHARZ01

	.DB 2,5	; символ 2 ширина 5
	.DWB CHARZ02

	.DB 3,5	; символ 3 ширина 5
	.DWB CHARZ03

	.DB 4,5	; символ 4 ширина 5
	.DWB CHARZ04

	.DB 32,5	; символ 32 ширина 5
	.DWB CHARZ32

	.DB 10,5	; символ 10 ширина 5
	.DWB CHARZ10

	.DB 11,7	; символ 11 ширина 7
	.DWB CHARZ11

	.DB 12,5	; символ 12 ширина 5
	.DWB CHARZ12

	.DB 13,5	; символ 13 ширина 5
	.DWB CHARZ13

	.DB END

CHARZ01:	.DB 0,0,4,0,0
CHARZ02:	.DB 1Fh,11h,11h,11h,1Fh
CHARZ03:	.DB 1Fh,1Fh,1Fh,1Fh,1Fh
CHARZ04:	.DB 1Bh,15h,0Eh,15h,1Bh

;CHARZ04:	.DB 11h,0Ah,04h,0Ah,11h
;CHARZ05:	.DB 1Fh,11h,11h,11h,1Fh
;CHARZ06:	.DB 1Bh,11h,0h,11h,1Bh
;CHARZ07:	.DB 1Bh,15h,0Eh,15h,1Bh
;CHARZ08:	.DB 1Bh,1Bh,04h,1Bh,1Bh
;CHARZ09:	.DB 1Fh,15h,1Fh,15h,1Fh

CHARZ10:	.DB 1Fh,11h,11h,11h,1Fh
CHARZ11:	.DB 1Fh,15h,19h,15h,1Fh,2,1
CHARZ12:	.DB 0Eh,11h,11h,11h,0Eh
CHARZ13:	.DB 0Eh,15h,1Fh,15h,0Eh



CHARZ32:	.DB 0,0,0,0,0

;======================================= Загружаемый шрифт T

	.BASE
FONTT:	.DB 3	; высота шрифта

	.DB 1,3	; символ 1 ширина 3
	.DWB CHART01

	.DB 2,3	; символ 2 ширина 3
	.DWB CHART02

	.DB 4,3	; символ 4 ширина 3
	.DWB CHART02

	.DB 32,3 ; символ 32 ширина 3
	.DWB CHART01

	.DB END

CHART01:	.DB 0,0,0
CHART02:	.DB 7,5,7

.END

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