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