Тренировка памяти


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

Тренировка памяти - игра, основанная на запоминании расположения карт, выложенных на поле.

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

Особенности программы для ЭКВМ

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

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

Сложность игры изменяется в широких пределах в зависимости от размера группы.

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

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

Каналы 1 и 2 подключенного к ЭКВМ внешнего устройства могут использоваться в целях отображения текущего хода игры или установления обратной связи с тренирующимся.




Главное меню

Главное меню выводится на экран после запуска игры. Оно состоит из пунктов "Новая игра", "Настройка", "О программе" и "Выход". Назначение пунктов определяется их наименованием. Выбор производится клавишами "ВЫБОР" (стрелками), подтверждение - клавишей "ВВОД".

Пункт "Новая игра" позволяет инициализировать поле и приступить к тренировке.

В меню "Настройка" устанавливаются параметры игры, основные из которых - набор используемых карт и количество игроков.

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

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

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




Настройка

Тренировка памяти - настройка

Вход в меню "Настройка" выполяется выбором соответствующего пункта в главном меню.

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

Пункт "Игроки" - их количество, от 1 до 3 включительно.

Пункт "Звук" разрешает или запрещает звуковые сигналы.

Пункт "ВУ" определяет возможность использования каналов внешнего устройства.

Набор карт

Тренировка памяти - набор карт

Для набора карт определяются его тип, номер и изображение.

Тип выбирается при помощи соответствующего пункта из следующих перечисленных: "Из набора", "Случайный 1", "Случайный 2", Случайный 3".

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

Разновидности карт различаются обозначением групп. Разновидность "1" имеет обозначение из одного символа - цифры от '1' до '9' или латинской буквы от 'A' до 'I', а "2" и "3" - из двух символов, латинской буквы 'A' или 'B' (для "3" добавляется вариант 'C') и цифры от '1' до '9'.

Для случайных типов номер обозначает максимально возможное количество групп каждой разновидности. Тип "Случайный 1" использует карты разновидности "1". Для случайных типов "2" и "3" количество групп и карт в них одинаково для каждой из разновидностей.

Пункт "Изображение" позволяет выбрать обозначение для неоткрытой ("перевёрнутой") карты. Для удобства выбора одновременно с условным номером изображения выводится также и его вид.




Тренировка

Тренировка памяти - игровое поле

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

Карта, которая может быть выбрана игроком, отмечается прямоугольником (курсором).

Перемещение курсора по полю выполняется клавишами "ВЫБОР" (стрелками). Переворачивание закрытой карты - нажатием клавиши "ВВОД".

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

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

Если открытая карта не принадлежит к той же группе, что и первая перевёрнутая игроком, то открытые карты переворачиваются в исходное положение. Если игроков несколько, то очередь хода переходит к следующему, номер которого кратковременно выводится в виде сообщения "Ход игрока ..." в середине экрана.

При разрешении использования внешних устройств (ВУ), успешное открытие всех карт группы вызывает импульс в линии канала 1 присоединённого внешнего устройства (ВУ), неуспешное - канала 2 ВУ.

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

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

Нажатие клавиши "ВЫХОД" не приводит к прекращению игры, а лишь выводит справочное сообщение о необходимости нажатия "Cx" для её завершения.

Для досрочного выхода из текущей игры требуется нажать красную клавишу "Cx" в нижней правой части клавиатуры. Дополнительных подтверждений не требуется - игра завершается немедленно.

Результаты

Тренировка памяти - результаты

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

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

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

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

Для перехода из экрана результатов в главное меню необходимо нажать клавишу "ВВОД" или "ВЫХОД".




Программа

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

Файл программы memory-0_6.mkp на ЯМК - 6163 байта, КС 392451/109

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



.CHARSET 1251

; Программа "Тренировка памяти".
; Для одного, двух или трёх игроков.
; Цель игры - очистка поля от карточек.
; Карточки удаляются с поля группами.
; Для переворачивания в режиме игры 
; используются клавиши "ВЫБОР" и "ВВОД".
; Выход из режима игры - клавиша "Cx"
; (без дополнительных запросов).
; Звук и выход на ВУ.

; v0.1 - 01.07.14
; v0.2 - 02.07.14
; v0.3 - 28.07.14 
; Изменён ГИ
; v0.4 - 20.10.14 
; Удалены режимы "джокеров"
; v0.5 - 12.01.15 
; Расширены возможности настройки
; Выбор рисунка закрытой карточки
; v0.6 - 18.02.15
; Мультипликация в главном меню

; НПП "СЕМИКО", GPL2+

NPL	.EQU 	20	; номер игры
KPL	.EQU	21	; количество участников 1-3
KGR	.EQU	22	; количество элементов в группе (от 2 до 4; 0-произвольное)
KGRT	.EQU 	23	; количество элементов данной группа при KGR==0 (v0.5)
MPOS	.EQU	24	; позиция маркера (1...36) 0-нет
TPL	.EQU	25	; текущий игрок (TPL <= KPL)
SHAG	.EQU	26	; текущий шаг 
TOTKR	.EQU	27	; первая открытая
T2OTKR	.EQU	28	; не первая открытая
XPL	.EQU	29 	; тип игры: 0-набор из предопределённых, 1-3-случайный для 1-3
ADPOLE	.EQU	30	; указатель на POLE-1
TPEREM	.EQU	31	; текущая таблица для перемещения маркера (передача параметров в п/п)
NOTK1	.EQU	40	; количество открытых первым (от 0 до 28)
NOTK2	.EQU	41	; -"- 2-м
NOTK3	.EQU	42	; -"- 3-м
TIME1	.EQU	45	; момент начала для 1 участника
TIME2	.EQU	46	; момент окончания для 1 участника
TIMEDM	.EQU	47	; разность - минуты
TIMEDS	.EQU	48	; разность - секунды
FKON	.EQU	49	; признак окончания !=0
FZVUK	.EQU	50	; звук 1-есть 0-нет
FVU	.EQU	51	; срабатывание ВУ 1-есть 0-нет
IPL	.EQU	52	; изображение реверса (0...)

; ----- не разрывать
SOTK1	.EQU	53	; очки 1-го
SOTK2	.EQU	54	; очки 2-го
SOTK3	.EQU	55	; очки 3-го
KOTK1	.EQU	56	; карты 1-го
KOTK2	.EQU	57	; карты 2-го
KOTK3	.EQU	58	; карты 3-го
; -----

FL1	.EQU	60	; флаг наличия одного (при ==0)
FL2	.EQU	61	; флаг наличия 2-го (при ==0)
FL3	.EQU	62	; флаг наличия 3-го (при ==0)
KOTKX	.EQU	63	; для подсчёта количества карт и очков
KOTKY	.EQU	64	; для подсчёта количества карт и очков
TIME	.EQU	65	; текущее время

POLE	.EQU 	100	; поле 0-нет, 1...N - открыто, -1...-N=закрыто

STR	.EQU	1000	; строка
STR1	.EQU	1050	; строка 1
OTK1	.EQU	1100	; строка открытий 1-го
OTK2	.EQU	1130	; -"- 2-го
OTK3	.EQU	1160	; -"- 3-го
STR1A	.EQU	1200	; строка 1 вывода при выходе для 1
STR1B	.EQU	1230	; строка 2 вывода при выходе для 1
STR2A	.EQU	1260	; строка 1 вывода при выходе для 2
STR2B	.EQU	1290	; строка 2 вывода при выходе для 2
STR3A	.EQU	1320	; строка 1 вывода при выходе для 3
STR3B	.EQU	1350	; строка 2 вывода при выходе для 3
KRUB	.EQU	1400	; данные изображения реверса

; ---- изображение заставки - не разрывать (до +250)
ZAST	.EQU	1500	; генерируемое изображение заставки
ZASTF	.EQU	1700	; состояние позиций (для инверсии)
; ----

;==============================
.ORG 0
	P GSB INIT
	1 PP M 9202
	0 PP M 9203	; F1E0

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

A3:	PP RM 9029
	MA		; В RA - код клавиши
	K NOT
	F X!=0 A4
	RMA
	GOTO A2		; Передать клавишу в меню
	
A4:	PP RM 9055
	P RM TIME
	-
	F X!=0 A2
	P GSB SEC
	F X=0 A1
	GOTO A2
	

;============================================= п/п Проверка результата выполнения формы

; при выходе 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
	7 - 
	P X>=0 PROV3
	8		; >=7 - неизвестная ошибка 8
	MB
PROV3:	; Определить ошибку интерфейса 2-6, вывести сообщение в строку и остановить программу
	; (При работе отлаженной программы эта ситуация возникнуть не может)
	.NUM TPROVE
	PP M 9026
	0
	PP M 9048	; разрешить останов
	PP RM 9202	; RZ = форма
	PP RM 9203	; RY = элемент
	RMB		; RX = ошибка
	R/S	
	P GOTO 0

TPROVE:	.TEXT "ГИ: ошибка X в Z - Y\0"

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

	.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	; обработка команды "ввод"
	.END

TOBRVVOD:
 	.DA 0,TOBRF1, TOBRF2, TOBRF3
						;F0
TOBRF1:	.DA OF1E0,0,0,OF1E3			;F1
TOBRF2:	.DA OF2E0,OF2E1,OF2E2,OF2E3		;F2
TOBRF3:	.DA OF3E0,OF3E1,OF3E2			;F3


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

;----------------------------------------------------- F1-E0
OF1E0:

	; перейти к основному циклу игры
	P GSB OSNIGRA

	; после завершения вернуться в меню 4
	4 PP M 9202
	0 PP M 9203
	1
	RTN

;----------------------------------------------------- F1-E3
OF1E3:
	; выход

	255 PP M 9092	; выключить ВУ
	0 PP M 9090	; отключить параллельный порт

	; Cохранить параметры в ЭСППЗУ
	9047 MA

	1 KMA
	P RM FZVUK
	P M FZVUK

	1 KMA
	P RM FVU
	P M FVU

	1 KMA
	P RM KPL
	P M KPL

	1 KMA
	P RM XPL
	P M XPL

	1 KMA
	P RM NPL
	P M NPL

	1 KMA
	P RM IPL
	P M IPL

	; Вывести строку и очистить стек
	.NUM TOF1E3
	PP M 9026

	0 PP M 9048	; отмена блокировки С/П
	ENT ENT ENT

	R/S
	P GOTO 0	; на случай перезапуска без В/О 

TOF1E3:	.TEXT "\nТренировка завершена\0"

;----------------------------------------------------- F2-E0

OF2E0:	; Набор

	P RM XPL
	P X=0 OF2E0A
	P GSB NPLS

OF2E0A: 
	P GSB MEM2KRUB

	3 PP M 9202	; F3E0
	0 PP M 9203
	1 RTN


;----------------------------------------------------- F2-E1
OF2E1:
	; Кол-во игроков

	; Набор
	P RM KPL
	1 +
	P M KPL	
	4 -
	P X>=0 OF2E1A
	1
	P M KPL
OF2E1A:
	1
	RTN
;----------------------------------------------------- F2-E2
OF2E2:
	; звук вкл/выкл
	P RM FZVUK
	P X=0 OF2E2A
	1
	P GOTO OF2E2B
OF2E2A:
	CX
OF2E2B: P M FZVUK
	1
	RTN

;----------------------------------------------------- F2-E3
OF2E3:
	; ВУ вкл/выкл
	P RM FVU
	P X=0 OF2E3A
	1
	P GOTO OF2E3B
OF2E3A:
	CX
OF2E3B: P M FVU
	1
	RTN

;----------------------------------------------------- F3-E0
OF3E0:
	; Набор - тип
	P RM XPL
	1 +
	P M XPL	
	4 -
	P X>=0 OF3E0A
	CX
	P M XPL
OF3E0A:
	P RM XPL
	P X!=0 OF3E0C
	; Для XPL!=0 проверить if (NPL>18) NPL=18
	P RM NPL
	19 -
	P X>=0 OF3E0B
	18
	P M NPL
OF3E0B:
	P GSB NPLS
OF3E0C:
	1
	RTN

;----------------------------------------------------- F3-E1
OF3E1:
	; Набор - номер
	P RM NPL
	1 +
	P M NPL

	P RM XPL
	P X=0 OF3E1B
	; для XPL==0: NPL<=20
	P RM NPL
	21 -
	P X>=0 OF3E1C
OF3E1A:
	1
	P M NPL
	P GOTO OF3E1C
OF3E1B:
	; Для XPL!=0: NPL<=18
	P RM NPL
	19 -
	P X<0 OF3E1A

OF3E1C:	P RM XPL
	P X=0 OF3E1D
	P GSB NPLS

OF3E1D:	1
	RTN

;----------------------------------------------------- F3-E2
OF3E2:
	; Набор - изображение
	P RM IPL
	1 +
	P M IPL	
	19 -
	P X>=0 OF3E2A
	CX
	P M IPL
OF3E2A:
	P GSB MEM2KRUB

	1
	RTN



; ============================= Основной цикл игры
OSNIGRA:

	; сброс набранных ранее
	CX
	P M NOTK1	
	P M NOTK2
	P M NOTK3

	P M SOTK1	
	P M SOTK2
	P M SOTK3

	P M KOTK1	
	P M KOTK2
	P M KOTK3

	PP M STR1A
	PP M STR1B
	PP M STR2A
	PP M STR2B
	PP M STR3A
	PP M STR3B

	.NUMD OTK1
	M4
	100 M0
	CX
OSNIGRA0:
	KM4		; обнуление строк открытия OTK
	PFL0 OSNIGRA0

	P GSB MEM2KRUB	


	P GSB ZAP	; заполнение поля 

	P GSB RISPOLE
	1
	P GSB MARK
	K GRPH


	CX 
	PP M 9029	; очистка буфера клавиатуры
OSNIGRA1:	
	PP RM 9029
	K NOT
	P X!=0 OSNIGRA1	
	K NOT
	MC
	.NUM TKLAV
	PP M 9042
	RMC
	PP M 9213	; адрес по индексу
	MC
	P X>=0 OSNIGRA1		; не найден код клавиши
	P X!=0 OSNIGRA1		; нет обработчика
	K GSB C 		; подпрограмма обработки клавиши
	P RM FKON
	P X!=0 OSNIGRA1
	RTN	

;=========================

TKLAV:
	.DB 34
	.DA K_R		; вправо
	.DB 35
	.DA K_L		; влево
	.DB 36
	.DA K_U		; вверх
	.DB 37
	.DA K_D		; вниз
	.DB 33
	.DA K_ENT	; ввод
	.DB 32
	.DA K_EXIT	; выход
	.DB 13
	.DA K_CX	; Cx

	.END

;====================== 
K_R:	.NUM TRPEREM
	P GOTO K_PER
K_L:	.NUM TLPEREM
	P GOTO K_PER
K_U:	.NUM TUPEREM
	P GOTO K_PER
K_D:	.NUM TDPEREM

K_PER:	P M TPEREM	; сохранить адрес таблицы
	P GSB MPEREM	; перемещение маркера
	K GRPH		; обновить графику
	RTN

;======================
K_EXIT:
	; нажата клавиша "ВЫХОД"
	5 PP M 9202
	0 PP M 9203
	64 PP M 9208
	P GSB PAUZA
	P GSB RISSRPOLE
	1
	P GSB MARK
	K GRPH
	RTN

;======================
K_CX:
	; нажата клавиша "Cx"
	P GOTO VYVODAB

;======================

K_ENT:	P RM ADPOLE
	P RM MPOS
	+
	MA	; адрес значения
	KRMA
	P X>=0 K_ENT1
	RTN	; >=0 - ничего не делать: открыта или отсутствует

K_ENT1:	+/-	; изменить знак и перевернуть
	KMA
	P M T2OTKR

	P RM MPOS
	P GSB PCARD	; была закрыта - открыть
	K GRPH		

	P RM SHAG
	P X=0 K_ENT2
	; шаг 0 - первая открытая

	P RM T2OTKR
	P M TOTKR 	; записать текущее значение 
	1 
	P M SHAG	; следующий шаг	

			; v0.5 - проверка KGR и запись KGRT
	P RM KGR
	P M KGRT
	P X=0 K_ENT1C ; выход при KGR!=0
	; KGR==0 - определить KGRT

	36 M0
	.NUMD POLE 
	M4
K_ENT1A:
	KRM4
	K ABS
	P RM T2OTKR
	-
	P X=0 K_ENT1B
	P RM KGRT
	1 +
	P M KGRT
K_ENT1B:
	PFL0 K_ENT1A
	; Проверка на KGRT==1
	P RM KGRT
	1 -
	P X!=0 K_ENT2A	; KGRT==1 т.е. первая - она же последняя
K_ENT1C:
	RTN		; выход

K_ENT2:	; не первая открытая
	P RM T2OTKR
	P RM TOTKR
	-
	P X=0 K_ENT3
	; ОК - значения совпадают

	P RM SHAG
	1 +
	P M SHAG
	P RM KGRT
	-
	P X=0 K_ENTE	; выход если не последняя в группе
	; последняя карта в группе
K_ENT2A:
	CX
	P M SHAG

	; добавить к количеству и списку открытий
	.NUM OTK1
	P RM TPL
	1 -
	30 *
	+	; начало строки текущего игрока
	MA

	.NUMD NOTK1
	P RM TPL
	+
	MB
	KRMB
	RMA + MA	; смещение на количество ранее открытых
	P RM TOTKR	; значение
	KMA		; сохранить открытое в строку открытий

	KRMB 1 + KMB	; увеличить на 1 количество открытий

	P RM FVU
	P X!=0 K_ENT2B
	; включить канал 1 ВУ
	5 PP M 9092
K_ENT2B:
	; Звук 1
	P RM FZVUK
	P X!=0 K_ENT2C
	1000 ENT 20 
	PP M 9052
K_ENT2C:
	; обнулить все ранее открытые
	P GSB UDAL
	P RM FKON
	P X!=0 K_ENT4	; перейти к выводу следующего, если не конец игры
	RTN

K_ENT3: ; значения не совпадают
	P RM FVU
	P X!=0 K_ENT3A
	; включить канал 2 ВУ
	3 PP M 9092
K_ENT3A:
	; Звук 2
	P RM FZVUK
	P X!=0 K_ENT3B
	200 ENT 20 
	PP M 9052
K_ENT3B:
	P GSB PAUZA
	P GSB ZAKR

	CX
	P M SHAG	; обнулить номер шага

	; переключить игрока если их два и больше
	P RM KPL
	2 -
	P X>=0 K_ENTE

	P RM TPL
	1 +
	P M TPL	
	P RM KPL 
	1 +
	-		; TPL-KPL
	F X>=0 K_ENT4
	; номер больше допустимого
	1
	P M TPL

K_ENT4:
	; если один игрок - не выводить
	P RM KPL
	1 -
	P X!=0 K_ENTE

	; обработать строку для игрока
	P RM TPL	; номер
	P GSB VYVOTK	; OTK -> STR

	; вывести информацию о переключении игрока, 
	12 PP M 9202
	0 PP M 9203
	64 PP M 9208

	P GSB PAUZA
	P GSB RISSRPOLE
K_ENTE:
	1
	P GSB MARK
	K GRPH

	; выключить каналы ВУ
	255 PP M 9092
	RTN


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

	1 PP M 9090	; Статический режим параллельного порта

	;1 
	PP M 9200	; 1 - разрешение интерфейса

	0 
	PP M 9202	; о программе - F0 
	;0 
	PP M 9203	; активный элемент - F0E0
	.NUM TFORM
	PP M 9201	; главная таблица форм TFORM

	.NUMD POLE
	P M ADPOLE

	; генерация заставки 
	P GSB GENZAST
	CX
	P M TIME
	
	; Проверка и преобразование сохраняемых настроек
	P RM FZVUK
	K SGN
	K ABS
	P M FZVUK

	P RM FVU
	K SGN
	K ABS
	P M FVU

	; проверка и коррекция KPL (количество игроков)
	P RM KPL
	K ABS
	K INT
	P M KPL
	1 -
	P X<0 INIT01
	1
	P GOTO INIT02
INIT01:	3 -
	P X>=0 INIT03
	3
INIT02:	P M KPL
INIT03:	

	; проверка и коррекция XPL (тип)
	P RM XPL
	K ABS
	K INT
	P M XPL
	4 -
	P X>=0 INIT04
	CX
	P M XPL
INIT04:	

	; проверка и коррекция NPL (набор)
	P RM XPL
	P X=0 INIT05
	21 
	P GOTO INIT06
INIT05:
	19	
INIT06: MA

	P RM NPL
	K ABS
	K INT
	P M NPL
	1 -
	P X<0 INIT07
	1
	P GOTO INIT08
INIT07:	RMA -
	P X>=0 INIT09
	CX
INIT08:	P M NPL
INIT09:	


	P RM IPL
	K ABS
	K INT
	P M IPL
	21 -
	P X>=0 INIT0A
	CX
	P M IPL
INIT0A:	

	RTN

;======================== Перенос изображения в ОЗУ
; в IPL - номер от 0 до ...
MEM2KRUB:
	.NUMD KRUB
	M4
	P RM IPL
	22 *
	.NUM KPUST
	+
	PP M 9042	
	22 M0
MEM2KRUB1:
	PP RM 9044
	KM4
	PFL0 MEM2KRUB1

	RTN

;=========================
PEREV:
; RX= значение карты для переворота
; Используются R0,R6...RE

	M6
	; поиск
	P RM ADPOLE
	M7
	36 M0
PEREV1: RM7
	RM0
	+
	M8
	KRM8
	; проверить
	RM6 +
	P X=0 PEREV2
	; перевернуть закрытую
	RM6
	KM8
	; сохранить и перерисовать, если перевернулась
	RM0
	P GSB PCARD	; вывести
PEREV2: PFL0 PEREV1
	RTN


;============================
UDAL:
; удалить все открытые
; R0,R6,R7,R8,R9,RA

	P RM ADPOLE
	M7
	CX 
	P M KOTKX	; открытые карты
	P M KOTKY	; оставшиеся карты	

	36 M0
UDAL1:	RM7
	RM0
	+
	M8
	KRM8
	P X>=0 UDAL1A
	P X!=0 UDAL2
	; обнулить, сохранить и перерисовать, если была открыта
	P RM KOTKX	
	1 + 
	P M KOTKX	; открытых +1
	CX
	KM8
	RM0
	P GSB PCARD	; вывести
UDAL1A:
	P RM KOTKY	
	1 + 
	P M KOTKY	; оставшихся +1

UDAL2: 	PFL0 UDAL1
	K GRPH

	CX
	P M SHAG	; обнулить номер шага

	; количество открытых карт^2 * количество оставшихся включая открытые
	P RM KOTKX
	FX^2
	P RM KOTKY
	*
	P M KOTKY
	; Добавить сумму очков игроку
	.NUMD SOTK1
	P RM TPL 
	+
	MB
	KRMB 
	P RM KOTKY
	+
	KMB	; SOTKn += очки 
	RMB 3 + MB
	KRMB 
	P RM KOTKX
	+ 
	KMB	; KOTKn += открытые карты

	; проверить наличие оставшихся карт
	P RM ADPOLE
	M7
	36 M0
UDAL3:	RM7
	RM0
	+
	M8
	KRM8
	P X=0 UDALE	; Есть обычная карта - выйти	
UDAL4:
	PFL0 UDAL3

	; карт нет - конец 
	P GOTO VYVODAB
UDALE:
	RTN

; =========================
ZAKR:
; перевернуть все, ранее открытые
; R0,R7,R8

	P RM ADPOLE
	M7
	36 M0
ZAKR1:  RM7
	RM0
	+
	M8
	KRM8
	; перевернуть
	+/-
	P X<0 ZAKR2
	; сохранить и перерисовать, если перевернулась
	KM8
	RM0
	P GSB PCARD	; вывести
ZAKR2: 	PFL0 ZAKR1
	; K GRPH
	RTN

; ========================= Заполнение поля случайное
;                           для одного (TPL==1, NPL от 1 до 18)
ZAPSL:	
	CX
	P M KGR

	P RM NPL	
	MA
ZAPSL0:
	P RM ADPOLE
	M4

	36 M0
ZAPSL1:	K RAN
	RMA *
	1 +
	K INT
	+/-
	KM4
	PFL0 ZAPSL1
	; продолжить через п/п ZAP
	P GOTO ZAP1A

; ========================= Заполнение поля случайное
;                           для двух (TPL==2, NPL от 1 до 9)
ZAPSLL:	
	CX
	P M KGR

	P RM NPL	
	MA
	P RM ADPOLE
	M4

	18 M0
ZAPSLL1:
	K RAN
	RMA *
	K INT
	MB
	21 +
	+/-
	KM4
	RMB
	31 +
	+/-
	KM4	

	PFL0 ZAPSLL1
	; продолжить через п/п ZAP
	P GOTO ZAP1A

; ========================= Заполнение поля случайное
;                           для трёх (TPL==3, NPL от 1 до 9)
ZAPSLLL:
	CX
	P M KGR

	P RM NPL	
	MA

	P RM ADPOLE
	M4

	12 M0
ZAPSLLL1:

	K RAN
	RMA *
	K INT
	MB
	21 +
	+/-
	KM4

	RMB
	31 +
	+/-
	KM4	

	RMB
	41 +
	+/-
	KM4	

	PFL0 ZAPSLLL1
	; продолжить через п/п ZAP
	P GOTO ZAP1A

; ========================= Заполнение поля из таблиц

ZAP:	P RM XPL	; тип игры
	P X!=0 ZAP0A
	1 -
	P X!=0 ZAPSL	; тип 1 - случайный 1
	1 -
	P X!=0 ZAPSLL	; тип 2 - случайный 2
	P GOTO ZAPSLLL	; тип 3 - случайный 3

ZAP0A:	; тип 0 - из набора
	; заполнение поля и переменных игры (NPL= 1-20)
	.NUM TZAP
	PP M 9042
	P RM NPL
	PP M 9211	; адрес по номеру
	M5		; адрес нужной таблицы -1
	P RM ADPOLE
	M4

	RM5
	K PRGM
	P M KGR		;  первый байт - количество элементов в группе
	KRM5

	36 M0		; для поля 36
ZAP1:
	RM 5
	K PRGM
	+/-		; отрицательные элементы - закрыты, положительные - открыты
	K M 4
	K RM 5
	P FL0 ZAP1

ZAP1A:
	; запомнить время начала
	PP RM 9055
	P M TIME1
	CX
	P M FKON	; обнулить признак окончания
	P M SHAG	; текущий шаг = 0
	1
	P M TPL		; игрок 1	

	; вывод маркера в случайном месте при запуске
	K RAN
	36 *
	K INT
	P M MPOS

	; RTN - выход без перемешивания

	; поле заполнено - перемешать
	.NUM POLE
	MA
	MB

	36 M0
ZAP2:	K RAN
	36 *
	K INT
	RMB +
	MC
	
	K RM C
	MD
	K RM A
	K M C
	RMD
	K M A
	RMA 1 + MA
	
	P FL0 ZAP2
	RTN


TZAP:	.DA 0, TZAP1, TZAP2, TZAP3, TZAP4, TZAP5
	.DA TZAP6, TZAP7, TZAP8, TZAP9, TZAP10, TZAP11
	.DA TZAP12, TZAP13, TZAP14, TZAP15, TZAP16
	.DA TZAP17, TZAP18, TZAP19, TZAP20
	

TZAP1:	; 1*(18*2)
	.DB 2
	.DB 1, 2, 3, 4, 5, 6, 7, 8, 9
	.DB 10, 11, 12, 13, 14, 15, 16, 17, 18
	.DB 1, 2, 3, 4, 5, 6, 7, 8, 9
	.DB 10, 11, 12, 13, 14, 15, 16, 17, 18

TZAP2:	; 1*(12*3)
	.DB 3
	.DB 1, 2, 3, 4, 5, 6
	.DB 7, 8, 9, 10, 11, 12
	.DB 1, 2, 3, 4, 5, 6
	.DB 7, 8, 9, 10, 11, 12
	.DB 1, 2, 3, 4, 5, 6
	.DB 7, 8, 9, 10, 11, 12

TZAP3:	; 1*(9*4)
	.DB 4
	.DB 1, 2, 3, 4, 5, 6, 7, 8, 9
	.DB 1, 2, 3, 4, 5, 6, 7, 8, 9
	.DB 1, 2, 3, 4, 5, 6, 7, 8, 9
	.DB 1, 2, 3, 4, 5, 6, 7, 8, 9

TZAP4:	; 1*(7*5)
	.DB 5
	.DB 1, 2, 3, 4, 5, 6, 7
	.DB 1, 2, 3, 4, 5, 6, 7
	.DB 1, 2, 3, 4, 5, 6, 7
	.DB 1, 2, 3, 4, 5, 6, 7
	.DB 1, 2, 3, 4, 5, 6, 7
	.DB 0

TZAP5:	; 1*(6*6)
	.DB 5
	.DB 1, 2, 3, 4, 5, 6
	.DB 1, 2, 3, 4, 5, 6
	.DB 1, 2, 3, 4, 5, 6
	.DB 1, 2, 3, 4, 5, 6
	.DB 1, 2, 3, 4, 5, 6
	.DB 1, 2, 3, 4, 5, 6

TZAP6:	; 1*(5*7)
	.DB 5
	.DB 1, 2, 3, 4, 5
	.DB 1, 2, 3, 4, 5
	.DB 1, 2, 3, 4, 5
	.DB 1, 2, 3, 4, 5
	.DB 1, 2, 3, 4, 5
	.DB 1, 2, 3, 4, 5
	.DB 1, 2, 3, 4, 5
	.DB 0

TZAP7:	; 2*(9*2)
	.DB 2
	.DB 21, 22, 23, 24, 25, 26, 27, 28, 29
	.DB 31, 32, 33, 34, 35, 36, 37, 38, 39
	.DB 21, 22, 23, 24, 25, 26, 27, 28, 29
	.DB 31, 32, 33, 34, 35, 36, 37, 38, 39

TZAP8:	; 2*(6*3)
	.DB 3
	.DB 21, 22, 23, 24, 25, 26
	.DB 31, 32, 33, 34, 35, 36
	.DB 21, 22, 23, 24, 25, 26
	.DB 31, 32, 33, 34, 35, 36
	.DB 21, 22, 23, 24, 25, 26
	.DB 31, 32, 33, 34, 35, 36

TZAP9:	; 2*(4*4)
	.DB 4
	.DB 21, 22, 23, 24
	.DB 31, 32, 33, 34
	.DB 21, 22, 23, 24
	.DB 31, 32, 33, 34
	.DB 21, 22, 23, 24
	.DB 31, 32, 33, 34
	.DB 21, 22, 23, 24
	.DB 31, 32, 33, 34
	.DB 0, 0, 0, 0

TZAP10:	; 3*(6*2)
	.DB 2
	.DB 21, 22, 23, 24, 25, 26
	.DB 31, 32, 33, 34, 35, 36
	.DB 41, 42, 43, 44, 45, 46
	.DB 21, 22, 23, 24, 25, 26
	.DB 31, 32, 33, 34, 35, 36
	.DB 41, 42, 43, 44, 45, 46

TZAP11:	; 3*(4*3)
	.DB 3
	.DB 21, 22, 23, 24
	.DB 31, 32, 33, 34
	.DB 41, 42, 43, 44
	.DB 21, 22, 23, 24
	.DB 31, 32, 33, 34
	.DB 41, 42, 43, 44
	.DB 21, 22, 23, 24
	.DB 31, 32, 33, 34
	.DB 41, 42, 43, 44

TZAP12:	; 3*(3*4)
	.DB 4
	.DB 21, 22, 23
	.DB 31, 32, 33
	.DB 41, 42, 43
	.DB 21, 22, 23
	.DB 31, 32, 33
	.DB 41, 42, 43
	.DB 21, 22, 23
	.DB 31, 32, 33
	.DB 41, 42, 43
	.DB 21, 22, 23
	.DB 31, 32, 33
	.DB 41, 42, 43



TZAP13:	; 1*(3*1+6*2+7*3)
	.DB 0
	.DB 1, 2, 3, 4, 4, 5, 5, 6, 6
	.DB 7, 7, 8, 8, 9, 9, 10, 10, 10
	.DB 11, 11, 11, 12, 12, 12, 13, 13, 13
	.DB 14, 14, 14, 15, 15, 15, 16, 16, 16

TZAP14:	; 2*(3*1+2*2+2*3+1*5)
	.DB 0
	.DB 21, 22, 23, 24, 24, 25, 25, 26, 26
	.DB 26, 27, 27, 27, 28, 28, 28, 28, 28
	.DB 31, 32, 33, 34, 34, 35, 35, 36, 36
	.DB 36, 37, 37, 37, 38, 38, 38, 38, 38

TZAP15:	; 2*(2*2+2*3+2*4)
	.DB 0
	.DB 21, 21, 22, 22, 23, 23, 23
	.DB 24, 24, 24, 25, 25, 25, 25, 26, 26, 26, 26
	.DB 31, 31, 32, 32, 33, 33, 33
	.DB 34, 34, 34, 35, 35, 35, 35, 36, 36, 36, 36

TZAP16:	; 2*(2*2+2*3+1*4)
	.DB 0
	.DB 21, 21, 22, 22, 23, 23, 23
	.DB 24, 24, 24, 25, 25, 25, 25, 0, 0, 0, 0
	.DB 31, 31, 32, 32, 33, 33, 33
	.DB 34, 34, 34, 35, 35, 35, 35, 0, 0, 0, 0

TZAP17:	; 3*(2*1+2*2+2*3)
	.DB 0
	.DB 21, 22, 23, 23, 24, 24
	.DB 25, 25, 25, 26, 26, 26
	.DB 31, 32, 33, 33, 34, 34
	.DB 35, 35, 35, 36, 36, 36
	.DB 41, 42, 43, 43, 44, 44
	.DB 45, 45, 45, 46, 46, 46

TZAP18:	; 3*(3*2+2*3)
	.DB 0
	.DB 21, 21, 22, 22, 23, 23
	.DB 24, 24, 24, 25, 25, 25
	.DB 31, 31, 32, 32, 33, 33
	.DB 34, 34, 34, 35, 35, 35
	.DB 41, 41, 42, 42, 43, 43
	.DB 44, 44, 44, 45, 45, 45

TZAP19:	; 3*(1*1+1*2+3*3)
	.DB 0
	.DB 21, 22, 22, 23, 23, 23
	.DB 24, 24, 24, 25, 25, 25
	.DB 31, 32, 32, 33, 33, 33
	.DB 34, 34, 34, 35, 35, 35
	.DB 41, 42, 42, 43, 43, 43
	.DB 44, 44, 44, 45, 45, 45

TZAP20:	; 3*(1*1+1*2+2*3)
	.DB 0
	.DB 21, 22, 22, 23, 23, 23
	.DB 24, 24, 24, 0, 0, 0
	.DB 31, 32, 32, 33, 33, 33
	.DB 34, 34, 34, 0, 0, 0
	.DB 41, 42, 42, 43, 43, 43
	.DB 44, 44, 44, 0, 0, 0

; =========================== Заполнение STR по NPL для вывода
NPLS:
	.NUMD STR
	M4
	.NUM TNPLS
	PP M 9042	; таблица строк
	
	P RM NPL
	PP M 9211	; адрес по номеру
	P X!=0 NPLSE	; нет строки
	PP M 9042

NPLS1:			; цикл переноса строки до '\0' включительно
	PP RM 9044
	KM4
	P X=0 NPLS1

NPLSE:	RTN


TNPLS:	.DA 0, TNPLS1, TNPLS2, TNPLS3, TNPLS4
	.DA TNPLS5, TNPLS6, TNPLS7, TNPLS8, TNPLS9
	.DA TNPLS10, TNPLS11, TNPLS12, TNPLS13, TNPLS14
	.DA TNPLS15, TNPLS16, TNPLS17, TNPLS18, TNPLS19
	.DA TNPLS20

TNPLS1:		.TEXT "1*(18*2)\0"
TNPLS2:		.TEXT "1*(12*3)\0"
TNPLS3:		.TEXT "1*(9*4)\0"
TNPLS4:		.TEXT "1*(7*5)\0"
TNPLS5:		.TEXT "1*(6*6)\0"
TNPLS6:		.TEXT "1*(5*7)\0"
TNPLS7:		.TEXT "2*(9*2)\0"
TNPLS8:		.TEXT "2*(6*3)\0"
TNPLS9:		.TEXT "2*(4*4)\0"
TNPLS10:	.TEXT "3*(6*2)\0"
TNPLS11:	.TEXT "3*(4*3)\0"
TNPLS12:	.TEXT "3*(3*4)\0"
TNPLS13:	.TEXT "1*(3*1+6*2+7*3)\0"
TNPLS14:	.TEXT "2*(3*1+2*2+2*3+1*5)\0"
TNPLS15:	.TEXT "2*(2*2+2*3+2*4)\0"
TNPLS16:	.TEXT "2*(2*2+2*3+1*4)\0"
TNPLS17:	.TEXT "3*(2*1+2*2+2*3)\0"
TNPLS18:	.TEXT "3*(3*2+2*3)\0"
TNPLS19:	.TEXT "3*(1*1+1*2+3*3)\0"
TNPLS20:	.TEXT "3*(1*1+1*2+2*3)\0"

; ============================ Вывод карты
; вход : RX - номер карты от 1 до 36
; регистры 9,A,B,C,D,E
PCARD:
	ME ; позиция

	.NUM TPOS
	PP M 9042
	RME
	1 -
	PP M 9210	; значение по индексу

	256 /
	MB
	K INT
	MA		; координата Y
	RMB
	K FRAC
	256 *
	MB		; координата X

	RMA
	RMB
	PP M 9000	; координаты вывода карты 

	RME	
	P RM ADPOLE	; POLE-1
	+		; +RX (==1...36)
	M9
	KRM9
	MC	; RC - значение

	P X!=0 PCARD0	; ==0 - нет карты, очистка и выход
	; есть карта
	P X<0 PCARD1
	; закрыта
	.NUM KRUB
	PP M 9016	; вывод рубашки
	RTN

PCARD0:
	4
	PP M 9001	; NOT
	; прямоугольник
	14 ENT 10
	PP M 9013
	CX
	PP M 9001	; восстановить атрибуты вывода
	RTN

PCARD1:
	RMC
	K ABS
	MC

	; >0 есть открытая карта
	.NUM KPUST
	PP M 9015	; вывод прямоугольника

	; адрес таблицы символов
	.NUM TPCHAR
	PP M 9042
	RMC
	PP M 9212	; значение по индексу

	256 /
	M9
	K INT
	MC		; верхний символ
	RM9
	K FRAC
	256 *
	MD		; нижний символ

	.NUM FONTM
	PP M 9009	; адрес загружаемого шрифта
	254
	PP M 9003	; номер шрифта

	RMC
	P X!=0 PCARD2
	; есть оба символа

	RMA 2 +
	RMB 2 +
	PP M 9000
	RMC
	PP M 9020
	
	RMA 7 +
	RMB 5 +
	P GOTO PCARD3

PCARD2: ; есть один символ
	RMA 3 +		
	RMB 3 +
PCARD3:	
	PP M 9000
	RMD
	PP M 9020
	
	CX
	PP M 9003
PCARDE:
	RTN

;============================== Вывод маркера
; вход :
; RX ==0 - убрать, ==1 - поставить

MARK:	
	MD ; действие

	.NUM TPOS
	PP M 9042
	P RM MPOS	; позиция маркера
	P X!=0 MARKE	; ==0 - выход
	1 -
	PP M 9210	; значение по индексу

	256 /
	MB
	K INT
	MA		; координата Y
	RMB
	K FRAC
	256 *
	MB		; координата X

	RMA 1 -
	RMB 1 -
	PP M 9000	; координаты вывода маркера

	RMD
	P X=0 MARK1
	; убрать рамку
	4
	PP M 9001	; NOT

MARK1:	; поставить рамку
	16 ENT 12
	PP M 9014
	CX
	PP M 9001	; восстановить атрибуты вывода
MARKE:	RTN

;==================================== Перемещение маркера
; перемещение по содержимому TPEREM
; позиция маркера из MPOS


MPEREM:	
	CX
	P GSB MARK	; удалить старый маркер
	P RM TPEREM
	1 -
	P RM MPOS
	+
	K PRGM	; считать байт из памяти программ	
	P M MPOS	; новая позиция маркера
	1
	P GOTO MARK	; выйти через вывод новой позиции

TUPEREM: ; перемещение вверх
	.DB 28, 29, 30, 31, 32, 33, 34, 35, 36
	.DB 1, 2, 3, 4, 5, 6, 7, 8, 9
TDPEREM: ; перемещение вниз (таблица связана с предыдущей - не разрывать)
	.DB 10, 11, 12, 13, 14, 15, 16, 17, 18
	.DB 19, 20, 21, 22, 23, 24, 25, 26, 27
	.DB 28, 29, 30, 31, 32, 33, 34, 35, 36
	.DB 1, 2, 3, 4, 5, 6, 7, 8, 9

TRPEREM: ; перемещение вправо
	.DB 2, 3, 4, 5, 6, 7, 8, 9, 1
	.DB 11, 12, 13, 14, 15, 16, 17, 18, 10
	.DB 20, 21, 22, 23, 24, 25, 26, 27, 19
	.DB 29, 30, 31, 32, 33, 34, 35, 36, 28

TLPEREM: ; перемещение влево
	.DB 9, 1, 2, 3, 4, 5, 6, 7, 8
	.DB 18, 10, 11, 12, 13, 14, 15, 16, 17
	.DB 27, 19, 20, 21, 22, 23, 24, 25, 26
	.DB 36, 28, 29, 30, 31, 32, 33, 34, 35

;====================== Рисунок поля
RISPOLE:
	2 PP M 9010	; очистка экрана
	36 M0
RISPOLE1:
	RM0
	P GSB PCARD
	PFL0 RISPOLE1
	RTN


;====================== Восстановление середины поля
RISSRPOLE:
	11 PP M 9202	; F11 - очистка
	CX PP M 9203
	64 PP M 9208	

	18 M0
	9 M4
RISSRPOLE1:
	KRM4
	RM4
	P GSB PCARD
	PFL0 RISSRPOLE1
	RTN

;===================== Пауза
PAUZA:
	; пауза 1,5 сек.
	150
	PP M 9050
	CX
	PP M 9029	; очистка буфера клавиатуры

PAUZA2:	PP RM 9050	; время задержки
	P X!=0 PAUZA3

	PP RM 9029	
	K NOT
	P X!=0 PAUZA2	; выход по нажатию клавиши

PAUZA3:
	RTN

;====================== Вывод строки ОТК в STR и STR1
VYVOTK:
	MB	; на входе - номер игрока
	1 -
	30 *
	.NUM OTK1 
	+
	MA	; адрес начала строки OTK

	.NUMD NOTK1
	RMB +
	MB	; адрес регистра NOTK

	.NUMD STR
	M4		; адрес строки STR
	.NUM TPCHAR	; таблица символьных кодов
	PP M 9042	

	KRMB		; количество
	P X!=0 VYVOTK2	; если нет данных - закрыть строки
	M0
	9 -
	P X>=0 VYVOTK1
	; если чисел больше 9 - то остальные поместить в STR1
	9 M0
VYVOTK1:
	P GSB SVYVOTK

	; Если чисел больше 9 - заполнить STR1
	.NUMD STR1
	M4		; адрес строки STR1

	KRMB
	9 -
	M0	
	P X>=0 VYVOTK3
	P X!=0 VYVOTK3

	; заполнить STR1 при необходимости
	; и выйти через п/п
	P GOTO SVYVOTK

VYVOTK2:
	; закрыть STR
	CX KM4
VYVOTK3:
	; очистить и закрыть STR1
	.NUMD STR1
	M4
	CX KM4

	RTN

; ====
; Подпрограмма цикла вывода для VYVOTK
; На входе заполнены R0 R4 RA
SVYVOTK:
	; цикл по всем открытиям
	KRMA	; код
	PP M 9212	; чтение значения по индексу
	P X>=0 SVYVOTK3	; неизвестный символ

	256 /
	M9
	K INT
	F X!=0 SVYVOTK2
	; если не 0 - напечатать
	KM4		; "верхний" символ
SVYVOTK2:
	RM9
	K FRAC
	256 *
	KM4		; "нижний" символ

	P GOTO SVYVOTK4
SVYVOTK3:
	63	; '?'
	KM4
SVYVOTK4:
	RMA 1 + MA
	KRMA		
	P X!=0 SVYVOTK5
	; если есть следующий символ строки ОТК
	44 KM4	; ','
SVYVOTK5:
	PFL0 SVYVOTK	; конец цикла открытий
SVYVOTK6:
	CX KM4		; закрыть строку 

	RTN

;====================== Вывод строки ОТК в строки STRnA STRnB
VYVOTKAB:
	MB	; на входе - номер игрока
	1 -
	30 *
	.NUM OTK1 
	+
	MA	; адрес начала строки OTK

	.NUMD NOTK1
	RMB +
	MC	; адрес регистра NOTK

	RMB 
	1 -
	60 *
	.NUMD STR1A
	+
	M4		; адрес строки STRnA

	.NUM TPCHAR	; таблица символьных кодов
	PP M 9042	

	KRMC		; количество
	P X!=0 VYVOTKAB2	; если нет данных - закрыть строки
	M0
	9 -
	P X>=0 VYVOTKAB1
	; если чисел больше 9 - то остальные поместить в STRnB
	9 M0
VYVOTKAB1:
	P GSB SVYVOTK

	; Если чисел больше 9 - заполнить STRnB
	RMB 
	1 -
	60 *
	.NUMD STR1B
	+
	M4		; адрес строки STRnB

	KRMC
	9 -
	M0	
	P X>=0 VYVOTKAB3
	P X!=0 VYVOTKAB3

	; заполнить STRnB при необходимости
	; и выйти через п/п
	P GOTO SVYVOTK

VYVOTKAB2:
	; закрыть STRn
	CX KM4
VYVOTKAB3:
	; очистить и закрыть STRnB
	RMB 
	1 -
	60 *
	.NUMD STR1B
	+
	M4
	CX KM4
	RTN

;=========================================== Вывод результатов для F4
; 
VYVODAB:
	; записать время окончания
	PP RM 9055	
	P M TIME2

	P RM KPL
	1 -
	P X=0 VYVODAB2

	; Один участник
	; Рассчитать TIMEDM и TIMEDS
	P RM TIME2
	K MS->D
	P RM TIME1
	K MS->D
	-
	P X<0 VYVODAB1
	24 +
VYVODAB1:
	60 *	
	MA
	K INT
	P M TIMEDM	; разность - минуты
	RMA
	K FRAC
	60 *	
	K INT
	P M TIMEDS	; разность - секунды

	CX
	P M FL1
	1
	P M FL2
	P M FL3
	P GSB VYVOTKAB
	P GOTO VYVODABE

VYVODAB2: 1 -
	P X=0 VYVODAB3
	; Два участника

	CX
	P M FL2
	1 
	P M FL1
	P M FL3
	P GSB VYVOTKAB
	
	2 
	P GSB VYVOTKAB
	P GOTO VYVODABE

VYVODAB3:	; Три участника

	CX
	P M FL2
	P M FL3
	1 
	P M FL1
	P GSB VYVOTKAB
	2 
	P GSB VYVOTKAB
	3 
	P GSB VYVOTKAB

VYVODABE:
	1
	P M FKON	; установить признак окончания
	RTN

;===================================== Генерация заставки
GENZAST:
	.NUMD	ZAST
	M4
	46
	KM4
	32
	KM4	; изображение X=45, Y=32 (187 байт)
	250	; перекрыть и ZASTF 
	M0
	CX
GENZAST1:
	KM4
	PFL0 GENZAST1

	36
	M0
GENZAST2:
	P GSB GZAST
	PFL0 GENZAST2
	RTN

;====================== Замена случайной карты в заставке
GZAST:
	K RAN
	36 *
	K INT
	MA

	RMA 
	4 /
	K INT 
	MB

	RMA
	4 /
	K FRAC
	4 *
	
	RMB
	20 *
	+

	2 +
	.NUM ZAST
	+
	MC
	
	RMA	
	.NUM ZASTF
	+
	MB
	KRMB
	P X=0 GZAST1
	; в позиции RA было пусто
	1
	KMB	 

	126 KMC
	RMC 4 + MC
	66 KMC
	RMC 4 + MC
	66 KMC
	RMC 4 + MC
	126 KMC

	P GOTO GZASTE
GZAST1:
	; в позиции RA была карта
	0
	KMB	 

	CX KMC
	RMC 4 + MC
	CX KMC
	RMC 4 + MC
	CX KMC
	RMC 4 + MC
	CX KMC

GZASTE:	1
	RTN

;======================= Обработка секунды
SEC:	PP RM 9055
	P M TIME	
	
	PP RM 9202
	1 -
	P X!=0 SEC1
	CX
	RTN		; Выход если не F1
SEC1:
	P GSB GZAST
	P GOTO GZAST	
	; Перейти к GZAST при F1 (и выйти через неё)


; ====================== Главная таблица форм
TFORM:
	.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 6		; Форма 6 "О программе"
	.DA F6

	.DB 11		; Форма 11 "Очистка середины" 
	.DA F11

	.DB 12		; Форма 12 "Переключение игрока" 
	.DA F12

	.END

; =========================================================== F1 "Основной экран"
F1:	.FORM 3, F1DE, F1PI, F1PO, F1PL, F1PR, F1RI, F1KM

F1DE:	;таблица флагов действий
	.DB 29, 21, 21, 29 

F1PI:	.DB 1,0,2,0,6,0,1,3
F1PO:	.DB 1,0,1,1,1,2,1,3

F1PL:	.DB 3, 0
F1PR:	.DB 1, 2, 3, 0 

F1RI:	
	.TYPE 0			; шрифт 0
	.TAB 20, 0 
	.TXTP 16, F1TZ
	.TAB 0, 10
	.SQU 0, 127, 1
	.TAB 48 ,14
	.SQU 0, 1, 48


	.TAB 56, 16 
	.TXTP 16, F1T0
	.TAB 56, 28 
	.TXTP 16, F1T1
	.TAB 56, 40 
	.TXTP 16, F1T2
	.TAB 56, 52 
	.TXTP 16, F1T3

	.TAB 0, 16
	.DRAWB 16, ZAST

	.END

F1KM:	.DBB F1KM0, F1KM1, F1KM2, F1KM3

F1KM0:	.TAB 50, 14 
	.JM F1KME
F1KM1:	.TAB 50, 26 
	.JM F1KME
F1KM2:	.TAB 50, 38 
	.JM F1KME
F1KM3:	.TAB 50, 50 
F1KME:  .SQU 3, 76, 12		; XOR прямоугольник
	.END

F1TZ: 	.TEXT "Тренировка памяти\0"
F1T0: 	.TEXT "Новая игра\0"
F1T1: 	.TEXT "Настройка\0"
F1T2: 	.TEXT "О программе\0"
F1T3: 	.TEXT "Выход\0"

; =========================================================== F2 "Настройка"
F2:	.FORM 3, F2DE, F2PI, F2PO, F2PL, F2PR, F2RI, F2KM

F2DE:	;таблица флагов действий
	.DB 29, 29, 29, 29 

F2PI:	.DB 3,0,2,1,2,2,2,3
F2PO:	.DB 1,1,1,1,1,1,1,1

F2PL:	.DB 3, 0
F2PR:	.DB 1, 2, 3, 0 

F2RI:	
	.TYPE 0			; шрифт 0
	.TAB 40, 0 
	.TXTP 16, F1T1		; "Настройка"

	.TAB 0,10
	.SQU 0, 127, 1

	.TAB 4, 16 
	.TXTP 16, F2T0

	.TAB 4, 28 
	.TXTP 16, F2T1
	.TAB 64, 28
	.PREXP 16, KPL

	.TAB 4, 40 
	.TXTP 16, F2T2
	.TAB 64, 40
	.JNEZ FZVUK, F2RI1
	.TXTP 16, F2TN
	.JM F2RI2
F2RI1:	.TXTP 16, F2TY
F2RI2:	.TAB 4, 52 
	.TXTP 16, F2T3
	.TAB 64, 52
	.JNEZ FVU, F2RI3
	.TXTP 16, F2TN
	.JM F2RI4
F2RI3:	.TXTP 16, F2TY
F2RI4:	.END

F2KM:	.DBB F2KM0, F2KM1, F2KM2, F2KM3

F2KM0:	.TAB 2, 14 
	.JM F2KME
F2KM1:	.TAB 2, 26 
	.JM F2KME
F2KM2:	.TAB 2, 38 
	.JM F2KME
F2KM3:	.TAB 2, 50 
F2KME:  .SQU 3, 60, 12		; XOR прямоугольник
	.END

F2T0: 	.TEXT "Набор карт\0"
F2T1: 	.TEXT "Игроки\0"
F2T2: 	.TEXT "Звук\0"
F2T3: 	.TEXT "ВУ\0"
F2TY: 	.TEXT "есть\0"
F2TN: 	.TEXT "нет\0"

; =========================================================== F3 "Набор"
F3:	.FORM 2, F3DE, F3PI, F3PO, F3PL, F3PR, F3RI, F3KM

F3DE:	;таблица флагов действий
	.DB 29, 29, 29 

F3PI:	.DB 3,0,3,1,3,2
F3PO:	.DB 2,0,2,0,2,0

F3PL:	.DB 2, 0
F3PR:	.DB 1, 2, 0 

F3RI:	
	.TYPE 0			; шрифт 0
	.TAB 40, 0 
	.TXTP 16, F2T0		; "Набор"

	.TAB 0,10
	.SQU 0, 127, 1

	.TAB 4, 16 
	.TXTP 16, F3T0

	.TAB 64, 16
	.JNEZ XPL, F3RI1

	.TXTP 16, F3T3
	.TAB 4, 40
	.TXTP 16, F3T5
	.TXTB 16, STR	; описание

	.JM F3RI2
F3RI1:
	.TXTP 16, F3T4
	.PREXP 16, XPL
F3RI2:
	.TAB 4, 28 
	.TXTP 16, F3T1
	.TAB 64, 28
	.PREXP 16, NPL

	.TAB 4, 54 
	.TXTP 16, F3T2
	.TAB 64, 54
	.PREXP 16, IPL
	.TAB 100, 50
	.DRAWB 16, KRUB

	.END

F3KM:	.DBB F3KM0, F3KM1, F3KM2

F3KM0:	.TAB 2, 14 
	.JM F3KME
F3KM1:	.TAB 2, 26 
	.JM F3KME
F3KM2:	.TAB 2, 52 
F3KME:  .SQU 3, 60, 12		; XOR прямоугольник
	.END

F3T0: 	.TEXT "Тип\0"
F3T1: 	.TEXT "Номер\0"
F3T2: 	.TEXT "Изображение\0"

F3T3: 	.TEXT "Из набора\0"
F3T4: 	.TEXT "Случайный \0"
F3T5: 	.TEXT "> \0"


; =========================================================== F4 "Очки"
F4:	.FORM 0, F4DE, F4PI, F4PO, F4PL, F4PR, F4RI, F4KM

F4DE:	;таблица флагов действий
	.DB 21

F4PI:	
F4PO:	.DB 1	; (1,0)

F4PL:	
F4PR:	.DB 0 

F4RI:	
	.TYPE 254		; шрифт 254
	.ATYPE FONTM

	.TAB 0, 0 
	.TXTP 16, F4T1
	.PREXP 16, NOTK1
	.TXTP 16, F4T4
	.PREXP 16, KOTK1
	.TXTP 16, F4T4
	.PREXP 16, SOTK1

	.TAB 10, 7 
	.TXTB 16, STR1A
	.TAB 10, 14 
	.TXTB 16, STR1B

	.JNEZ FL1, F4RI1

	.TAB 0, 28 
	.TXTP 16, F4T5
	.PREXP 16, TIMEDM 
	.TXTP 16, F4T6
	.PREXP 16, TIMEDS
	.TXTP 16, F4T7
	.JM F4RI2

F4RI1:
	.JNEZ FL2, F4RI2

	.TAB 0, 21 
	.TXTP 16, F4T2
	.PREXP 16, NOTK2
	.TXTP 16, F4T4
	.PREXP 16, KOTK2
	.TXTP 16, F4T4
	.PREXP 16, SOTK2

	.TAB 10, 28 
	.TXTB 16, STR2A
	.TAB 10, 35 
	.TXTB 16, STR2B

	.JNEZ FL3, F4RI2

	.TAB 0, 42 
	.TXTP 16, F4T3
	.PREXP 16, NOTK3
	.TXTP 16, F4T4
	.PREXP 16, KOTK3
	.TXTP 16, F4T4
	.PREXP 16, SOTK3

	.TAB 10, 49 
	.TXTB 16, STR3A
	.TAB 10, 56 
	.TXTB 16, STR3B

F4RI2:
	.TYPE 0
F4KM0:
	.END

F4KM:	.DBB F4KM0

F4T1: 	.TEXT "1: \0"
F4T2: 	.TEXT "2: \0"
F4T3: 	.TEXT "3: \0"
F4T4: 	.TEXT " -- \0"
F4T5: 	.TEXT "Время: \0"
F4T6: 	.TEXT " мин \0"
F4T7: 	.TEXT " сек \0"

; =========================================================== F5 "Выход"
F5:	.FORM 0, F5DE, F5PI, F5PO, F5PL, F5PR, F5RI, F5KM

F5DE:	;таблица флагов действий
	.DB 128			; без очистки


F5PI:	
F5PO:	
F5PL:	
F5PR:	.DB 0,0

F5RI:	
	.TYPE 0			; шрифт 0
	.TAB 2, 16 		; позиция
	.SQU 4, 124, 32		; инверсный прямоугольник
	.TAB 2, 16 		; позиция
	.FRAME 0, 124, 32	; рамка
	.TAB 16, 24
	.TXTP 16, F5T1
	
F5KM0:	.END

F5KM:	.DBB F5KM0

F5T1: 	.TEXT "Выход - клавиша [Cx]\0"

; =========================================================== F6 "О программе"
F6:	.FORM 0, F6DE, F6PI, F6PO, F6PL, F6PR, F6RI, F6KM

F6DE:	;таблица флагов действий
	.DB 21

F6PI:	
F6PO:	.DB 1,2

F6PL:	
F6PR:	.DB 0 

F6RI:	.TYPE 0			; шрифт 0
	.TAB 20, 0 
	.TXTP 16, F1TZ
	.TAB 0, 10
	.SQU 0, 127, 1

	.TAB 0, 16 
	.TXTP 16, F6T0
	.TAB 0, 24 
	.TXTP 16, F6T1
	.TAB 0, 32 
	.TXTP 16, F6T2
	.TAB 0, 40 
	.TXTP 16, F6T3
	.TAB 0, 48 
	.TXTP 16, F6T4
	.TAB 0, 56 
	.TXTP 16, F6T5
F6KM0:
	.END

F6KM:	.DBB F6KM0

F6T0: 	.TEXT "Цель игры - очистка поля\0"
F6T1: 	.TEXT "от карточек, сбрасываемых\0"
F6T2: 	.TEXT "группами. Для 1-3 игроков.\0"
F6T3: 	.TEXT "Выбор и переворачивание -\0"
F6T4: 	.TEXT "клавишами ВЫБОР и ВВОД.\0"
F6T5: 	.TEXT "Версия 0.6 от 18.02.2015\0"


; =========================================================== F11 "Очистка середины"
F11:	.FORM 0, F11DE, F11PI, F11PO, F11PL, F11PR, F11RI, F11KM

F11DE:	;таблица флагов действий
	.DB 128			; без очистки


F11PI:	
F11PO:	
F11PL:	
F11PR:	.DB 0,0

F11RI:	.TAB 2, 16 		; позиция
	.SQU 4, 124, 32		; инверсный прямоугольник
F11KM0:	.END

F11KM:	.DBB F11KM0

; =========================================================== F12 "Номер игрока"
F12:	.FORM 0, F12DE, F12PI, F12PO, F12PL, F12PR, F12RI, F12KM

F12DE:	;таблица флагов действий
	.DB 128			; без очистки


F12PI:	
F12PO:	
F12PL:	
F12PR:	.DB 0,0

F12RI:	
	.TYPE 0			; шрифт 0
	.TAB 2, 16 		; позиция
	.SQU 4, 124, 32		; инверсный прямоугольник
	.TAB 2, 16 		; позиция
	.FRAME 0, 124, 32	; рамка
	.TAB 32, 18
	.TXTP 16, F12T1
	.PREXP 16, TPL
	
	.TYPE 254
	.ATYPE FONTM		; шрифт 5
	.TAB 8, 28
	.TXTB 16, STR		; вывод строки OTK из STR
	.TAB 8, 36
	.TXTB 16, STR1		; вывод строки OTK из STR1
	.TYPE 0			; шрифт 0

F12KM0:	.END

F12KM:	.DBB F12KM0

F12T1: 	.TEXT "Ход игрока \0"

;=================================================
TPCHAR:
	.DB 1, 0, 49	; " 1"
	.DB 2, 0, 50	; " 2"
	.DB 3, 0, 51	; " 3"
	.DB 4, 0, 52	; " 4"
	.DB 5, 0, 53	; " 5"
	.DB 6, 0, 54	; " 6"
	.DB 7, 0, 55	; " 7"
	.DB 8, 0, 56	; " 8"
	.DB 9, 0, 57	; " 9"
	.DB 10, 0, 65	; " A"
	.DB 11, 0, 66	; " B"
	.DB 12, 0, 67	; " C"
	.DB 13, 0, 68	; " D"
	.DB 14, 0, 69	; " E"
	.DB 15, 0, 70	; " F"
	.DB 16, 0, 71	; " G"
	.DB 17, 0, 72	; " H"
	.DB 18, 0, 73	; " I"

	.DB 21, 65, 49	; "A1"
	.DB 22, 65, 50	; "A2"
	.DB 23, 65, 51	; "A3"
	.DB 24, 65, 52	; "A4"
	.DB 25, 65, 53	; "A5"
	.DB 26, 65, 54	; "A6"
	.DB 27, 65, 55	; "A7"
	.DB 28, 65, 56	; "A8"
	.DB 29, 65, 57	; "A9"
	
	.DB 31, 66, 49	; "B1"
	.DB 32, 66, 50	; "B2"
	.DB 33, 66, 51	; "B3"
	.DB 34, 66, 52	; "B4"
	.DB 35, 66, 53	; "B5"
	.DB 36, 66, 54	; "B6"
	.DB 37, 66, 55	; "B7"
	.DB 38, 66, 56	; "B8"
	.DB 39, 66, 57	; "B9"

	.DB 41, 67, 49	; "C1"
	.DB 42, 67, 50	; "C2"
	.DB 43, 67, 51	; "C3"
	.DB 44, 67, 52	; "C4"
	.DB 45, 67, 53	; "C5"
	.DB 46, 67, 54	; "C6"
	.DB 47, 67, 55	; "C7"
	.DB 48, 67, 56	; "C8"
	.DB 49, 67, 57	; "C9"

	.END

TPOS:	; позиции вывода
	.DB 1, 3	; для 1 и т.д.
	.DB 1, 17
	.DB 1, 31
	.DB 1, 45
	.DB 1, 59
	.DB 1, 73
	.DB 1, 87
	.DB 1, 101
	.DB 1, 115

	.DB 17, 3
	.DB 17, 17
	.DB 17, 31
	.DB 17, 45
	.DB 17, 59
	.DB 17, 73
	.DB 17, 87
	.DB 17, 101
	.DB 17, 115

	.DB 33, 3
	.DB 33, 17
	.DB 33, 31
	.DB 33, 45
	.DB 33, 59
	.DB 33, 73
	.DB 33, 87
	.DB 33, 101
	.DB 33, 115

	.DB 49, 3
	.DB 49, 17
	.DB 49, 31
	.DB 49, 45
	.DB 49, 59
	.DB 49, 73
	.DB 49, 87
	.DB 49, 101
	.DB 49, 115


;================================
; изображения, начиная с пустой

KPUST:
	.DB 10,14
	.DB 0FFh, 3Fh 
	.DB 1, 20h, 1, 20h
	.DB 1, 20h, 1, 20h
	.DB 1, 20h, 1, 20h
	.DB 1, 20h, 1, 20h
	.DB 0FFh, 3Fh 
;1
        .DB 0Ah, 0Eh
        .DB 0FFh, 3Fh
        .DB 0C9h, 24h
        .DB 25h, 29h
        .DB 13h, 32h
        .DB 0D5h, 2Ah
        .DB 0D5h, 2Ah
        .DB 13h, 32h
        .DB 25h, 29h
        .DB 0C9h, 24h
        .DB 0FFh, 3Fh
;2
        .DB 0Ah, 0Eh
        .DB 0FFh, 3Fh
        .DB 9, 24h
        .DB 35h, 2Bh
        .DB 0C3h, 30h
        .DB 15h, 2Ah
        .DB 15h, 2Ah
        .DB 0C3h, 30h
        .DB 35h, 2Bh
        .DB 9, 24h
        .DB 0FFh, 3Fh
;3
        .DB 0Ah, 0Eh
        .DB 0FFh, 3Fh
        .DB 29h, 25h
        .DB 0C5h, 28h
        .DB 2Bh, 35h
        .DB 0D5h, 2Ah
        .DB 0D5h, 2Ah
        .DB 2Bh, 35h
        .DB 0C5h, 28h
        .DB 29h, 25h
        .DB 0FFh, 3Fh
;4
        .DB 0Ah, 0Eh
        .DB 0FFh, 3Fh
        .DB 0C9h, 24h
        .DB 0FDh, 2Fh
        .DB 17h, 3Ah
        .DB 0D5h, 2Ah
        .DB 0D5h, 2Ah
        .DB 17h, 3Ah
        .DB 0FDh, 2Fh
        .DB 0C9h, 24h
        .DB 0FFh, 3Fh
;5
        .DB 0Ah, 0Eh
        .DB 0FFh, 3Fh
        .DB 0C3h, 30h
        .DB 39h, 27h
        .DB 0CDh, 2Ch
        .DB 35h, 2Bh
        .DB 35h, 2Bh
        .DB 0CDh, 2Ch
        .DB 39h, 27h
        .DB 0C3h, 30h
        .DB 0FFh, 3Fh
;6
        .DB 0Ah, 0Eh
        .DB 0FFh, 3Fh
        .DB 1, 20h
        .DB 0CDh, 2Ch
        .DB 0CDh, 2Ch
        .DB 31h, 23h
        .DB 31h, 23h
        .DB 0CDh, 2Ch
        .DB 0CDh, 2Ch
        .DB 1, 20h
        .DB 0FFh, 3Fh
;7
        .DB 0Ah, 0Eh
        .DB 0FFh, 3Fh
        .DB 11h, 22h
        .DB 2Dh, 2Dh
        .DB 0D5h, 2Ah
        .DB 23h, 31h
        .DB 23h, 31h
        .DB 0D5h, 2Ah
        .DB 2Dh, 2Dh
        .DB 11h, 22h
        .DB 0FFh, 3Fh
;8
        .DB 0Ah, 0Eh
        .DB 0FFh, 3Fh
        .DB 1, 20h
        .DB 19h, 26h
        .DB 39h, 27h
        .DB 0C1h, 20h
        .DB 0C1h, 20h
        .DB 39h, 27h
        .DB 19h, 26h
        .DB 1, 20h
        .DB 0FFh, 3Fh
;9
        .DB 0Ah, 0Eh
        .DB 0FFh, 3Fh
        .DB 1, 20h
        .DB 0E1h, 21h
        .DB 0F1h, 23h
        .DB 0F1h, 23h
        .DB 0F1h, 23h
        .DB 0F1h, 23h
        .DB 0E1h, 21h
        .DB 1, 20h
        .DB 0FFh, 3Fh
;10
        .DB 0Ah, 0Eh
        .DB 0FFh, 3Fh
        .DB 1, 20h
        .DB 0E5h, 29h
        .DB 15h, 2Ah
        .DB 0D5h, 2Ah
        .DB 0D5h, 2Ah
        .DB 15h, 2Ah
        .DB 0E5h, 29h
        .DB 1, 20h
        .DB 0FFh, 3Fh
;11
        .DB 0Ah, 0Eh
        .DB 0FFh, 3Fh
        .DB 0C1h, 20h
        .DB 0FDh, 2Fh
        .DB 0E5h, 29h
        .DB 0Fh, 3Ch
        .DB 0Fh, 3Ch
        .DB 0E5h, 29h
        .DB 0FDh, 2Fh
        .DB 0C1h, 20h
        .DB 0FFh, 3Fh
;12
        .DB 0Ah, 0Eh
        .DB 0FFh, 3Fh
        .DB 1, 20h
        .DB 11h, 22h
        .DB 0E9h, 25h
        .DB 5, 28h
        .DB 5, 28h
        .DB 0E9h, 25h
        .DB 11h, 22h
        .DB 1, 20h
        .DB 0FFh, 3Fh
;13
        .DB 0Ah, 0Eh
        .DB 0FFh, 3Fh
        .DB 1, 20h
        .DB 25h, 29h
        .DB 0F9h, 27h
        .DB 5, 28h
        .DB 5, 28h
        .DB 0F9h, 27h
        .DB 25h, 29h
        .DB 1, 20h
        .DB 0FFh, 3Fh
;14
        .DB 0Ah, 0Eh
        .DB 0FFh, 3Fh
        .DB 1, 20h
        .DB 0A1h, 2Ah
        .DB 0A9h, 2Ah
        .DB 0A9h, 2Ah
        .DB 0A9h, 2Ah
        .DB 0A9h, 2Ah
        .DB 0A1h, 2Ah
        .DB 1, 20h
        .DB 0FFh, 3Fh
;15
        .DB 0Ah, 0Eh
        .DB 0FFh, 3Fh
        .DB 1, 20h
        .DB 1, 22h
        .DB 61h, 24h
        .DB 1, 25h
        .DB 1, 25h
        .DB 61h, 24h
        .DB 1, 22h
        .DB 1, 20h
        .DB 0FFh, 3Fh
;16
        .DB 0Ah, 0Eh
        .DB 0FFh, 3Fh
        .DB 0E1h, 21h
        .DB 71h, 23h
        .DB 0D9h, 26h
        .DB 0F9h, 26h
        .DB 0F9h, 26h
        .DB 0D9h, 26h
        .DB 71h, 23h
        .DB 0E1h, 21h
        .DB 0FFh, 3Fh
;17
        .DB 0Ah, 0Eh
        .DB 0FFh, 3Fh
        .DB 1, 20h
        .DB 41h, 20h
        .DB 95h, 21h
        .DB 1Dh, 22h
        .DB 0E9h, 2Fh
        .DB 1Dh, 24h
        .DB 15h, 23h
        .DB 1, 20h
        .DB 0FFh, 3Fh
;18
        .DB 0Ah, 0Eh
        .DB 0FFh, 3Fh
        .DB 1, 20h
        .DB 31h, 20h
        .DB 39h, 20h
        .DB 9, 2Bh
        .DB 89h, 2Bh
        .DB 0F9h, 20h
        .DB 71h, 20h
        .DB 1, 20h
        .DB 0FFh, 3Fh

;==================================	
; Шрифт 5

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

	.DB 32,2
	.DWB CHAR32

	; 48-57 цифры 

	.DB 48,3
	.DWB CHAR48

	.DB 49,3
	.DWB CHAR49

	.DB 50,3
	.DWB CHAR50

	.DB 51,3
	.DWB CHAR51

	.DB 52,3
	.DWB CHAR52

	.DB 53,3
	.DWB CHAR53

	.DB 54,3
	.DWB CHAR54

	.DB 55,3
	.DWB CHAR55

	.DB 56,3
	.DWB CHAR56

	.DB 57,3
	.DWB CHAR57

	; русские буквы

	.DB 128,3
	.DWB CHAR128

	.DB 160,3
	.DWB CHAR128

	.DB 129,3
	.DWB CHAR129

	.DB 161,3
	.DWB CHAR129

	.DB 130,4
	.DWB CHAR130

	.DB 162,4
	.DWB CHAR130

	.DB 131,3
	.DWB CHAR131

	.DB 163,3
	.DWB CHAR131

	.DB 132,5
	.DWB CHAR132

	.DB 164,5
	.DWB CHAR132

	.DB 133,3
	.DWB CHAR133

	.DB 165,3
	.DWB CHAR133

	.DB 134,5
	.DWB CHAR134

	.DB 166,5
	.DWB CHAR134

	.DB 135,3
	.DWB CHAR135

	.DB 167,3
	.DWB CHAR135

	.DB 136,4
	.DWB CHAR136

	.DB 168,4
	.DWB CHAR136

	.DB 137,5
	.DWB CHAR137

	.DB 169,5
	.DWB CHAR137

	.DB 138,4
	.DWB CHAR138

	.DB 170,4
	.DWB CHAR138

	.DB 139,4
	.DWB CHAR139

	.DB 171,4
	.DWB CHAR139

	.DB 140,5
	.DWB CHAR140

	.DB 172,5
	.DWB CHAR140

	.DB 141,3
	.DWB CHAR141

	.DB 173,3
	.DWB CHAR141

	.DB 142,4
	.DWB CHAR142

	.DB 174,4
	.DWB CHAR142

	.DB 143,3
	.DWB CHAR143

	.DB 175,3
	.DWB CHAR143

	.DB 144,3
	.DWB CHAR144

	.DB 224,3
	.DWB CHAR144

	.DB 145,3
	.DWB CHAR145

	.DB 225,3
	.DWB CHAR145

	.DB 146,3
	.DWB CHAR146

	.DB 226,3
	.DWB CHAR146

	.DB 147,3
	.DWB CHAR147

	.DB 227,3
	.DWB CHAR147

	.DB 148,5
	.DWB CHAR148

	.DB 228,5
	.DWB CHAR148

	.DB 149,3
	.DWB CHAR149

	.DB 229,3
	.DWB CHAR149

	.DB 150,4
	.DWB CHAR150

	.DB 230,4
	.DWB CHAR150

	.DB 151,4
	.DWB CHAR151

	.DB 231,4
	.DWB CHAR151

	.DB 152,5
	.DWB CHAR152

	.DB 232,5
	.DWB CHAR152

	.DB 153,6
	.DWB CHAR153

	.DB 233,6
	.DWB CHAR153

	.DB 154,4
	.DWB CHAR154

	.DB 234,4
	.DWB CHAR154

	.DB 155,5
	.DWB CHAR155

	.DB 235,5
	.DWB CHAR155

	.DB 156,3
	.DWB CHAR156

	.DB 236,3
	.DWB CHAR156

	.DB 157,3
	.DWB CHAR157

	.DB 237,3
	.DWB CHAR157

	.DB 158,5
	.DWB CHAR158

	.DB 238,5
	.DWB CHAR158

	.DB 159,4
	.DWB CHAR159

	.DB 239,4
	.DWB CHAR159

	.DB 240,5
	.DWB CHAR240

	.DB 241,5
	.DWB CHAR240

	; латинские буквы

	.DB 65,3
	.DWB CHAR128

	.DB 97,3
	.DWB CHAR128

	.DB 66,4
	.DWB CHAR130

	.DB 98,4
	.DWB CHAR130

	.DB 67,3
	.DWB CHAR145

	.DB 99,3
	.DWB CHAR145

	.DB 68,4
	.DWB CHAR68
	
	.DB 100,4
	.DWB CHAR68

	.DB 69,3
	.DWB CHAR133

	.DB 101,3
	.DWB CHAR133

	.DB 70,3
	.DWB CHAR70

	.DB 102,3
	.DWB CHAR70

	.DB 71,3
	.DWB CHAR71

	.DB 103,3
	.DWB CHAR71

	.DB 72,3
	.DWB CHAR141

	.DB 104,3
	.DWB CHAR141

	.DB 73,3
	.DWB CHAR73

	.DB 105,3
	.DWB CHAR73

	.DB 74,4
	.DWB CHAR74

	.DB 106,4
	.DWB CHAR74

	.DB 75,4
	.DWB CHAR138

	.DB 107,4
	.DWB CHAR138

	.DB 76,3
	.DWB CHAR76

	.DB 108,3
	.DWB CHAR76

	.DB 77,5
	.DWB CHAR140

	.DB 109,5
	.DWB CHAR140

	.DB 78,4
	.DWB CHAR78

	.DB 110,4
	.DWB CHAR78

	.DB 79,4
	.DWB CHAR142

	.DB 111,4
	.DWB CHAR142

	.DB 80,3
	.DWB CHAR144

	.DB 112,3
	.DWB CHAR144

	.DB 81,5
	.DWB CHAR81

	.DB 113,5
	.DWB CHAR81

	.DB 82,4
	.DWB CHAR82

	.DB 114,4
	.DWB CHAR82

	.DB 83,4
	.DWB CHAR83

	.DB 115,4
	.DWB CHAR83

	.DB 84,3
	.DWB CHAR146

	.DB 116,3
	.DWB CHAR146

	.DB 85,4
	.DWB CHAR85

	.DB 117,4
	.DWB CHAR85

	.DB 86,5
	.DWB CHAR86

	.DB 118,5
	.DWB CHAR86

	.DB 87,5
	.DWB CHAR87

	.DB 119,5
	.DWB CHAR87

	.DB 88,3
	.DWB CHAR149

	.DB 120,3
	.DWB CHAR149

	.DB 89,3
	.DWB CHAR147

	.DB 121,3
	.DWB CHAR147

	.DB 90,4
	.DWB CHAR90

	.DB 122,4
	.DWB CHAR90

	; 33-47

	.DB 33,1
	.DWB CHAR33

	.DB 34,3
	.DWB CHAR34

	.DB 35,5
	.DWB CHAR35

	.DB 36,5
	.DWB CHAR36

	.DB 37,5
	.DWB CHAR37

	.DB 38,5
	.DWB CHAR38

	.DB 39,1
	.DWB CHAR39

	.DB 40,2
	.DWB CHAR40

	.DB 41,2
	.DWB CHAR41

	.DB 42,3
	.DWB CHAR42

	.DB 43,3
	.DWB CHAR43

	.DB 44,2
	.DWB CHAR44

	.DB 45,3
	.DWB CHAR45

	.DB 46,1
	.DWB CHAR46

	.DB 47,5
	.DWB CHAR47

	; 58-64, 91-96

	.DB 58,1
	.DWB CHAR58

	.DB 59,2
	.DWB CHAR59

	.DB 60,3
	.DWB CHAR60

	.DB 61,3
	.DWB CHAR61

	.DB 62,3
	.DWB CHAR62

	.DB 63,3
	.DWB CHAR63

	.DB 64,4
	.DWB CHAR64

	; 91-96

	.DB 91,2
	.DWB CHAR91

	.DB 92,5
	.DWB CHAR92

	.DB 93,2
	.DWB CHAR93

	.DB 94,3
	.DWB CHAR94

	.DB 95,3
	.DWB CHAR95

	.DB 96,2
	.DWB CHAR96

	; 123-127
	.DB 123,3
	.DWB CHAR123

	.DB 124,1
	.DWB CHAR124

	.DB 125,3
	.DWB CHAR125

	.DB 126,4
	.DWB CHAR126

	.DB 127,5
	.DWB CHAR127

	.DB 255

CHAR32:	.DB 0,0
CHAR33:	.DB 17h
CHAR34:	.DB 3,0,3
CHAR35:	.DB 0Ah,1Fh,0Ah,1Fh,0Ah
CHAR36:	.DB 17h,15h,1Fh,15h,1Dh
CHAR37:	.DB 13h,0Bh,4,1Ah,19h
CHAR38:	.DB 1Ch,13h,17h,8,14h
CHAR39:	.DB 3
CHAR40:	.DB 0Eh,11h
CHAR41:	.DB 11h,0Eh
CHAR42:	.DB 0Ah,4,0Ah
CHAR43:	.DB 4,0Eh,4
CHAR44:	.DB 10h,8
CHAR45:	.DB 4,4,4
CHAR46:	.DB 10h
CHAR47:	.DB 10h,8,4,2,1
CHAR48:	.DB 1Fh,11h,1Fh
CHAR49:	.DB 12h,1Fh,10h
CHAR50:	.DB 19h,15h,13h
CHAR51:	.DB 11h,15h,1Fh
CHAR52:	.DB 7,4,1Fh
CHAR53:	.DB 17h,15h,1Dh
CHAR54:	.DB 1Eh,15h,1Dh
CHAR55:	.DB 1,1Dh,3
CHAR56:	.DB 1Bh,15h,1Bh
CHAR57:	.DB 17h,15h,0Fh
CHAR58:	.DB 0Ah
CHAR59:	.DB 10h,0Ah
CHAR60:	.DB 4,0Ah,11h
CHAR61:	.DB 0Ah,0Ah,0Ah
CHAR62:	.DB 11h,0Ah,4
CHAR63:	.DB 1,15h,3
CHAR64:	.DB 0Eh,11h,17h,17h

CHAR91:	.DB 1Fh,11h
CHAR92:	.DB 1,2,4,8,10h
CHAR93:	.DB 11h,1Fh
CHAR94:	.DB 2,1,2
CHAR95:	.DB 10h,10h,10h
CHAR96:	.DB 1,2

CHAR123:	.DB 4,1Bh,11h
CHAR124:	.DB 1Fh
CHAR125:	.DB 11h,1Bh,4
CHAR126:	.DB 2,1,2,1
CHAR127:	.DB 1Ch,12h,11h,12h,1Ch

CHAR128:	.DB 1Eh,9,1Eh
CHAR129:	.DB 1Fh,15h,1Dh
CHAR130:	.DB 1Fh,15h,15h,0Ah
CHAR131:	.DB 1Fh,1,1
CHAR132:	.DB 10h,1Eh,11h,1Fh,10h
CHAR133:	.DB 1Fh,15h,11h
CHAR134:	.DB 1Bh,4,1Fh,4,1Bh
CHAR135:	.DB 11h,15h,1Bh
CHAR136:	.DB 1Fh,8,4,1Fh
CHAR137:	.DB 1Fh,10h,9,4,1Fh
CHAR138:	.DB 1Fh,4,0Ah,11h
CHAR139:	.DB 10h,1Eh,1,1Fh
CHAR140:	.DB 1Fh,2,4,2,1Fh
CHAR141:	.DB 1Fh,4,1Fh
CHAR142:	.DB 0Eh,11h,11h,0Eh
CHAR143:	.DB 1Fh,1,1Fh
CHAR144:	.DB 1Fh,5,7
CHAR145:	.DB 1Fh,11h,11h
CHAR146:	.DB 1,1Fh,1
CHAR147:	.DB 17h,14h,1Fh
CHAR148:	.DB 7,5,1Fh,5,7
CHAR149:	.DB 1Bh,4,1Bh
CHAR150:	.DB 1Fh,10h,1Fh,10h
CHAR151:	.DB 3,4,4,1Fh
CHAR152:	.DB 1Fh,10h,1Fh,10h,1Fh
CHAR153:	.DB 1Fh,10h,1Fh,10h,1Fh,10h
CHAR154:	.DB 1,1Fh,14h,1Ch
CHAR155:	.DB 1Fh,14h,1Ch,0,1Fh
CHAR156:	.DB 1Fh,14h,1Ch
CHAR157:	.DB 11h,15h,0Eh
CHAR158:	.DB 1Fh,4,0Eh,11h,0Eh
CHAR159:	.DB 16h,0Dh,5,1Fh
CHAR240:	.DB 1Eh,17h,16h,17h,12h

CHAR68:		.DB 11h,1Fh,11h,0Eh
CHAR70:		.DB 1Fh,5,1
CHAR71:		.DB 0Eh,11h,19h
CHAR73:		.DB 11h,1Fh,11h
CHAR74:		.DB 8,11h,1Fh,1
CHAR76:		.DB 1Fh,10h,10h
CHAR78:		.DB 1Fh,2,4,1Fh
CHAR81:		.DB 0Eh,11h,19h,0Eh,10h
CHAR82:		.DB 1Fh,5,0Dh,16h
CHAR83:		.DB 12h,15h,15h,9
CHAR85:		.DB 0Fh,10h,10h,0Fh
CHAR86:		.DB 7,8,10h,8,7
CHAR87:		.DB 0Fh,10h,8,10h,0Fh
CHAR90:		.DB 19h,15h,15h,13h

.ENDP

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