Элтрис |
Главная / ЭКВМ / Программы для ЭКВМ / Игры |
Полностью заполненная квадратами горизонтальная линия автоматически очищается, вышележащие квадраты сдвигаются в сторону автоматического движения фигур. Целью игры является максимально долговременное поддержание верхней части поля в незаполненном состоянии. Расширенные возможностиНеоднократно отмечалось, что распространённые аналоги программы обладают рядом досадных неудобств, которые приводят к быстрому утомлению пользователя (для их обнаружения проводились эксперименты, состоящие в сравнительном изучении существующих программ персональных ЭВМ). Благодаря проделанной работе в представленной игровой программе "Элтрис" ряд типичных недостатков был устранён путём добавления расширенных возможностей, среди которых:
Реализация на ЭКВМИгра выполнена с использованием графического интерфейса пользователя.
Текст игровой программы "Элтрис" приведён ниже и снабжён комментариями. Файл программы 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 (многоканальный) |
||||||||||||||||||||||