Охота на Вампуса |
Главная / ЭКВМ / Программы для ЭКВМ / Игры |
ПещераПещера в которой обитает Вампус состоит из 20 пронумерованных комнат, каждая из которых соединена тоннелями с тремя другими. В какой-то из комнат, которая выбирается случайным образом, спит Вампус. Там имеются и другие опасности. В начале игры персонаж случайным образом оказывается в одной из комнат пещеры. За ход он может выстрелить из лука или перейти в одну из трёх соседних комнат. Расположение комнат в пещере не изменяется, однако не будем лишать игроков удовольствия, приводя схему лабиринта. ОружиеИгрок имеет лук с пятью стрелами. Для убийства Вампуса достаточно и одной стрелы. Если стрела попала в Вампуса, то игрок победил и игра окончена. Стрелы у игрока не простые, а волшебные — они могут делать повороты во время полёта. Каждая стрела может пролететь от 1 до 5 соседних комнат. Путешествуя по лабиринту, игрок в ходе игры составляет представление о том, как связаны друг с другом комнаты в пещере. Стреляя, игрок должен указать номера комнат, через которые пролетит его стрела. Если он ошибётся с номерами комнат и, к примеру, укажет комнаты, не связанные общим тоннелем, то стрела начнёт летать по пещере случайным образом и может даже попасть в самого игрока. Если это произошло, то он проиграл. Игрок проигрывает и в том случае, если он истратит все 5 стрел, но так и не убьёт Вампуса. ОпасностиПопав в какую-либо комнату, игрок мог почувствовать отвратительный запах, услышать шум или почувствовать сквозняк. Источником отвратительного запаха является спящий Вампус. Запах чувствуется, если Вампус находится в какой-то из соседних комнат. Сквозняк и шум всегда доносятся из соседней комнаты, но неизвестно, из какой именно. В комнатах, откуда идёт сквозняк, находятся бездонные ямы, попав в которые, игрок погибает и, соответственно, проигрывает. Из 20 комнат в пещере две имеют ямы. В комнатах, откуда доносится шум (таких комнат в пещере тоже две), обитают гигантские летучие мыши. Если игрок зашёл в комнату к этим мышам, то они хватают его и случайным образом переносят в любую другую комнату в пещере. В том числе, не исключён вариант, что мыши перенесут игрока в комнату с ямой или сбросят его на голову Вампусу. Вампус
Проснувшись, Вампус может либо заснуть снова (с вероятностью 0,25), либо перейти спать в одну из соседних комнат. Кстати, комнаты с ямами и летучими мышами Вампусу не страшны. У него на ногах есть присоски, с помощью которых он выбирается из любой ямы, а его огромный вес не даёт гигантским летучим мышам его переносить. Если Вампус отправляется спать в комнату, где находится игрок, то игрок проигрывает, а Вампус получает обед. История игры"Охота на Вампуса" — первая в истории текстовая, а также первая приключенческая игра. Она была чрезвычайно популярна в 1970—1980-е годы. Программистам эта игра так полюбилась, что, пользуясь её размером (около 200 строк кода, половину из которых занимают вывод на экран и комментарии), они встраивали её в различные программы. Известно, что в корпоративной операционной системе R&D была системная команда "to Wumpus", запускавшая игру. "Hunt the Wumpus" — это и первая игра, в которой используется строение карты по принципу графов (в отличие от простой прямоугольной сетки как в более старых играх). В этом отношении, а также по размещению ловушек и тем остроумным сообщениям, которые используются в этой игре, она послужила прототипом для ADVENT и Zork (Zork, в частности, унаследовал от неё колонии гигантских летучих мышей). Позже появились и графические версии этой игры, отличающиеся от оригинальной другими лабиринтами и ловушками. В настоящее время версии "Hunt the Wumpus" доступны в Интернете для большинства операционных систем и устройств. Реализация на ЭКВМВ программе для ЭКВМ сохранено большинство особенностей оригинальной игры, текст которой на языке BASIC приведён ниже. Разумеется, игру можно было значительно усовершенствовать, но тогда исходный код нельзя было бы использовать для сравнения подходов. Игра выполнена с использованием графического интерфейса пользователя и может быть использована как набор типичных приёмов его использования - интересный для разбора и ознакомления, в отличие от более полезных программ.
Текст программы примера приведён ниже и снабжён комментариями. Файл программы wumpus.mkp на ЯМК - 6615 байт, КС 546075/173 Текст программы wumpus.mkl для кросс-компилятора .CHARSET 1251 ; Файл wumpus ; Текстовая игра "Охота на Вампуса" ; По мотивам "Hunt of Wumpus" [Gregory Yob, 1972] ; Пример использования графического интерфейса ; пользователя ЭКВМ ЭЛЕКТРОНИКА МК ; НПП "СЕМИКО", 2012, GPL 2+ ; Версия 1.0 от 05.07.12 ; Версия 1.1 от 13.07.12 ; Команды языка ГИ: TAB .EQU 96 LDX .EQU 104 LDY .EQU 105 TYPE .EQU 101 ATYPE .EQU 78 LDADR .EQU 77 SQU .EQU 89 FRAME .EQU 91 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 ; Регистры памяти ; R0,R1 - циклы ; R4,R5 - косвенное обращение к регистрам ; RA-RD - временное хранение данных NK0 .EQU 21 ; левая дорога NK1 .EQU 22 ; средняя дорога NK2 .EQU 23 ; правая дорога NK .EQU 24 ; номер текущей комнаты - HtW L(1) NW .EQU 25 ; Пещера с Вампусом - HtW L(2) NP1 .EQU 26 ; Первая пещера с пропастью - HtW L(3) NP2 .EQU 27 ; Вторая пещера с пропастью - HtW L(4) NB1 .EQU 28 ; Первая пещера с летучими мышами - HtW L(5) NB2 .EQU 29 ; Вторая пещера с летучими мышами - HtW L(6) ARR .EQU 30 ; Запас стрел - HtW A ; резервная копия данных для повтора игры - HtW M() ; регистры от 34 до 39 включительно NKR .EQU 34 ; NWR .EQU 35 ; NP1R .EQU 36 ; NP2R .EQU 37 ; NB1R .EQU 38 ; NB2R .EQU 39 ; FSTR1 .EQU 41 ; значение 0 - признак наличия текста в STR1 FSTR2 .EQU 42 ; -"- STR2 FSTR3 .EQU 43 ; -"- STR3 YSTR1 .EQU 44 ; вертикальная координата текста в STR1 YSTR2 .EQU 45 ; -"- STR2 YSTR3 .EQU 46 ; -"- STR3 ARRJ9 .EQU 47 ; дальность стрельбы (HtW - J9) ARRK .EQU 48 ; для цикла по маршруту стрелы (HtW - K) ARRERR .EQU 49 ; 0- ошибка маршрута ARRP1 .EQU 50 ; маршрут стрелы комната 1 (HtW - P(1)) и т.д. ARRP2 .EQU 51 ARRP3 .EQU 52 ARRP4 .EQU 53 ARRP5 .EQU 54 STR1 .EQU 1000 ; строка 1 STR2 .EQU 1050 ; строка 2 STR3 .EQU 1100 ; строка 3 ; ====================================================== Начало программы .ORG 0 A0: CX ; Обнулить RX и сбросить признак ввода числа 2 PP M 9010 ; Инициализировать графический экран 1 PP M 9200 ; 1 - разрешение графического интерфейса 1 PP M 9202 ; текущая форма - 1 0 PP M 9203 ; активный элемент - 0 .NUM TFORM PP M 9201 ; главная таблица форм TFORM A1: 64 ; Код принудительной перерисовки формы A2: PP M 9208 ; Перерисовать форму PP RM 9209 ; Результат выполнения формы MA ; Сохранить в RA P X!=0 A5 ; Перейти, если не требуется обработки 1 - P X!=0 A4 ; Перейти, если требуется обработка ; Далее простейшая обработка ошибки интерфейса ; при этом RX содержит число от 2 до 6 ; или 7 - ввод числа, который в программе не используется A3: .NUM STRER ; Вывести "Ошибка" в строку комментариев A31: PP M 9026 CX ENT ENT ENT ; Очистить стек RMA R/S ; Останов A4: ; Обработка результата выполнения формы .NUM TOBR ; таблица адресов обработчиков PP M 9042 ; в R9042 PP RM 9208 ; команда для обработки PP M 9213 ; считать из ассоциативной таблицы P X>=0 A5 ; обработчик команды не найден - перейти к опросу PP M 9042 ; адреса форм для обработчика команд в R9042 PP RM 9202 ; номер текущей формы PP M 9211 ; считать из упорядоченной таблицы P X!=0 A5 ; Адрес 0 - обработчик команды для данной формы отсутствует ; перейти к опросу клавиатуры MA ; сохранить адрес в RA PP RM 9208 ; код команды 33 - P X=0 A41 ; для всех команд кроме Ввод перейти непосредственно к подпрограмме ; для команды Ввод - считать и обработать номер активного элемента RMA PP M 9042 PP RM 9203 PP M 9211 ; считать адрес из упорядоченной таблицы P X!=0 A5 ; если адрес нулевой (обработчик отсутствует) ; перейти к опросу клавиатуры MA ; иначе записать адрес подпрограммы обработчика в RA A41: K GSB A ; и перейти к ней P X!=0 A5 ; если RX==0 перейти к опросу клавиатуры без перерисовки P X<0 A42 ; если RX>0 перерисовать с учётом номеров формы и элемента CX MA ; Очистить RA перед выходом из программы .NUM STREX P GOTO A31 A42: RMB ; новый номер формы (устанавливается в подпрограммах обработки) PP M 9202 RMC ; новый номер элемента (устанавливается в подпрограммах) PP M 9203 P GOTO A1 ; Вернуться к перерисовке формы A5: ; Опрос клавиатуры PP RM 9029 ; Считать код клавиши MA ; Сохранить в RA K NOT ; инверсия (0FFh -> 0) P X!=0 A5 ; если нет нажатия - продолжать опрос RMA P GOTO A2 ; Передать код нажатой клавиши в форму STRER: .TEXT "\nОшибка\0" STREX: .TEXT "\nВыход из программы\0" ;======= ассоциативная таблица адресов таблиц обработчиков команд TOBR: .DB 33 ; ввод .DA TOBRVVOD .DB 32 ; выход .DA TOBRVYH .DB 34 ; выбор вправо .DA TOBRVYB .DB 35 ; выбор влево .DA TOBRVYB .DB 36 ; выбор вверх .DA TOBRVYB .DB 37 ; выбор вниз .DA TOBRVYB .DB END ; Упорядоченные таблицы адресов подпрограмм и адресов таблиц TOBRVYB: ; Обработка команды Выбор - адреса подпрограмм .DA 0 ; Не требуется .DA 0 .DA 0 .DA 0 .DA 0 .DA 0 .DA 0 .DA VYBF7 .DA 0 .DA 0 .DA 0 .DA 0 .DA 0 .DA 0 .DA 0 .DA 0 .DA 0 TOBRVYH: ; Обработка команды Выход - адреса подпрограмм .DA 0 ; Не требуется .DA VVODF1E3 ; Выход - для обработки нужно разрешить в форме .DA VVODF2E0 ; Аналогично команде Ввод .DA VVODF3E0 .DA VVODF4E0 .DA VVODF5E0 .DA VVODF6E0 .DA VVODF7E0 .DA VVODF8E0 .DA VVODF9E1 ; Отставить выстрел .DA VVODF10E0 .DA VVODF11E0 .DA VVODF12E0 .DA VVODF13E0 .DA 0 .DA 0 .DA 0 TOBRVVOD: ; Обработка команды Ввод - адреса таблиц .DA TVVODF0 .DA TVVODF1 .DA TVVODF2 .DA TVVODF3 .DA TVVODF4 .DA TVVODF5 .DA TVVODF6 .DA TVVODF7 .DA TVVODF8 .DA TVVODF9 .DA TVVODF10 .DA TVVODF11 .DA TVVODF12 .DA TVVODF13 .DA 0 .DA 0 .DA 0 ; Адреса подпрограмм обработки команды Ввод для каждого элемента формы TVVODF0: .DA VVODF0E0, VVODF0E1, VVODF0E2, VVODF0E3 TVVODF1: .DA VVODF1E0, VVODF1E1, VVODF1E2, VVODF1E3 TVVODF2: .DA VVODF2E0 TVVODF3: .DA VVODF3E0 TVVODF4: .DA VVODF4E0 TVVODF5: .DA VVODF5E0 TVVODF6: .DA VVODF6E0, VVODF6E0, VVODF6E0, VVODF6E0, VVODF6E0 ; все одинаковы TVVODF7: .DA VVODF7E0, VVODF7E0, VVODF7E0, VVODF7E0, VVODF7E0 ; все одинаковы .DA VVODF7E0, VVODF7E0, VVODF7E0, VVODF7E0, VVODF7E0 .DA VVODF7E0, VVODF7E0, VVODF7E0, VVODF7E0, VVODF7E0 .DA VVODF7E0, VVODF7E0, VVODF7E0, VVODF7E0, VVODF7E0 TVVODF8: .DA VVODF8E0 TVVODF9: .DA VVODF9E0, VVODF9E1 TVVODF10: .DA VVODF10E0 TVVODF11: .DA VVODF11E0 TVVODF12: .DA VVODF12E0 TVVODF13: .DA VVODF13E0 ; Подпрограммы обработки команды Ввод для каждого элемента формы VVODF0E0: ; идти влево P RM NK0 VVODF0E0A: P M NK P RM NW - P X=0 VVODF0E0B ; перейти если координаты не совпали ; угодили к Вампусу 2 MB ; F2E0 0 MC 1 RTN ; Выход с перерисовкой VVODF0E0B: P RM NK P RM NP1 - P X!=0 VVODF0E0C ; перейти если яма1 P RM NK P RM NP2 - P X=0 VVODF0E0D ; перейти если не яма2 VVODF0E0C: ; угодили в яму 3 MB 0 MC 1 RTN VVODF0E0D: P RM NK P RM NB1 - P X!=0 VVODF0E0E ; перейти если мыши1 P RM NK P RM NB2 - P X=0 VVODF0E0F ; перейти если не мыши2 VVODF0E0E: ; угодили к мышам 4 MB 0 MC 1 RTN VVODF0E0F: P GSB LOCNK P GSB PROVNK CX MB ; оставить форму 0 PP RM 9203 MC ; сохранить направление движения 1 RTN VVODF0E1: ; идти прямо P RM NK1 P GOTO VVODF0E0A VVODF0E2: ; идти вправо P RM NK2 P GOTO VVODF0E0A VVODF0E3: ; стрелять 6 MB ; перейти к F6E0 0 MC 1 RTN VVODF1E0: ; начать игру P GSB INIT VVODF1E0A: 0 MB 1 MC 1 RTN VVODF1E1: ; повторить ; восстановить регистры 6 M0 .NUMD NK M4 .NUMD NKR M5 VVODF1E1A: KRM5 KM4 PFL0 VVODF1E1A P GSB INIT1 P GOTO VVODF1E0A VVODF1E2: ; правила VVODF1E3: ; выход 1 +/- RTN VVODF2E0: ; попали к Вампусу P GSB FNC ; случайное число 0-4 MA 4 - P X=0 VVODF2E0A ; 4 - Вампус остался в этой же комнате и съел Вас 5 MB 0 MC 1 RTN VVODF2E0A: P RM NW 1 - 3 * RMA + ; RA=1...3 .NUMD CAVE ; -1 для диапазона 0...2 учитывается в NUMD + K PRGM ; считать байт по адресу в RX P M NW ; новая комната Вампуса P GOTO VVODF0E0B ; перейти к проверкам на ямы и мышей VVODF3E0: ; упали в яму VVODF5E0: ; съедены Вампусом VVODF10E0: ; попали в Вампуса VVODF11E0: ; попали в себя VVODF13E0: ; стрелы кончились 1 MB ; перейти к заставке 1 MC ; "повторить" 1 RTN VVODF4E0: P GSB FNA ; случайное число 1-20 P GOTO VVODF0E0A ; записать новое значение текущей комнаты ; и перепроверить полностью VVODF6E0: PP RM 9203 ; номер выбранного элемента 1 + P M ARRJ9 ; дальность стрельбы, HtW - J9 .NUMD STR1 M4 ; адрес STR1-1 62 KM4 ; '>' в строку 0 KM4 ; '\0' в строку CX P M ARRK ; начало маршрута 7 MB P RM NK ; установить выбор на текущую комнату 1 - MC 1 RTN VVODF7E0: ; маршрут P RM ARRK 2 - P X>=0 VVODF7E0A ; проверить на возврат стрелы .NUM ARRP1 ; начало массива + MA KRMA ; номер комнаты на шаге -2 PP RM 9203 1 + ; номер выбранной комнаты - ; (HtW строка 3100) P X=0 VVODF7E0A ; перейти на заполнение строки маршрута 8 MB 0 MC 1 ; иначе выйти в F8 RTN VVODF7E0A: PP RM 9203 ; номер выбранного элемента MA 10 - P X<0 VVODF7E0B ; пункты 0-9 RMA 3 * .NUM F7T1 ; в этой строке есть нужные символы + P GOTO VVODF7E0C VVODF7E0B: ; пункты 10-19 3 * ; до этого RX=RA-10 .NUM F7T2 ; в этой строке есть нужные символы + VVODF7E0C: PP M 9042 RM4 1 - M4 ; убрать '\0' P RM ARRK P X!=0 VVODF7E0D ; для первой комнаты маршрута пропустить 45 KM4 VVODF7E0D: 32 ; пробел KM4 PP RM 9044 ; первая цифра KM4 PP RM 9044 ; вторая цифра KM4 32 ; пробел KM4 CX ; '\0' KM4 P RM ARRK .NUM ARRP1 + MA PP RM 9203 1 + KMA ; занести номер выбранной комнаты в ARRP1...ARRP5 P RM ARRK 1 + P M ARRK P RM ARRJ9 - P X=0 VVODF7E0E ; последняя комната маршрута 9 MB ; перейти к F9 0 MC 1 RTN VVODF7E0E: 7 MB PP RM 9203 MC ; восстановить номер выбранного элемента 1 RTN VVODF8E0: ; неверный маршрут 7 MB ; вернуться в F7 CX MC 1 RTN VVODF9E0: ; стрелять CX ; начать маршрут P M ARRK 1 P M ARRERR ; флаг ошибки маршрута P RM ARR ; уменьшить количество стрел 1 - P M ARR P X<0 VVODF9E0A1 ; а стрелы кончились 13 MB 0 MC 1 RTN VVODF9E0A1: P RM ARRP1 MA P RM NK0 MB - P X!=0 VVODF9E0B RMA P RM NK1 MC - P X!=0 VVODF9E0B RMA P RM NK2 MD - P X!=0 VVODF9E0B VVODF9E0A: ; нет прохода на первом шаге CX P M ARRERR ; флаг ошибки маршрута P RM NK ; Текущая комната 3 * 1 - P GSB FNB ; Случайное число от 1 до 3 + .NUM CAVE + ; адрес номера случайной соседней комнаты P GOTO VVODF9E0C VVODF9E0B: P RM ARRK .NUM ARRP1 + VVODF9E0C: MA ; адрес номера комнаты KRMA ; номер комнаты MA ; записать его в RA P RM NW ; комната вампуса - ; сравнить P X=0 VVODF9E0D ; попали в Вампуса 10 MB 0 MC 1 RTN VVODF9E0D: RMA P RM NK ; наша комната - P X=0 VVODF9E0E ; попали в себя 11 MB 0 MC 1 RTN VVODF9E0E: RMA 3 * .NUM CAVE + PP M 9042 PP RM 9044 MB ; соседняя комната слева PP RM 9044 MC ; соседняя комната прямо PP RM 9044 MD ; соседняя комната справа P RM ARRK ; следующий шаг 1 + P M ARRK P RM ARRJ9 - P X=0 VVODF9E0F ; конец маршрута - промах 12 MB 0 MC 1 RTN VVODF9E0F: ; проверить следующую комнату маршрута P RM ARRK MA RMB - P X=0 VVODF9E0B ; допустимое значение - маршрут влево RMA RMC - P X=0 VVODF9E0B ; допустимое значение - маршрут прямо RMA RMD - P X=0 VVODF9E0B ; допустимое значение - маршрут направо ; неверный маршрут - выбрать одну из соседних комнат CX P M ARRERR ; флаг ошибки маршрута P GSB FNB ; случайное число от 1 до 3 10 + ; номера соседних комнат лежат в RB...RD P GOTO VVODF9E0C ; загрузить VVODF9E1: ; отставить выстрел P GSB LOCNK P GSB PROVNK 0 MB ; вернуться в F0 3 MC ; к пункту стрелять 1 RTN VVODF12E0: ; промах ; Разбудили Вампуса P GSB FNC ; случайное число 0-4 MA 4 - P X!=0 VVODF9E1 ; 4 - Вампус остался в той же комнате P RM NW 1 - 3 * RMA + ; RA=1...3 .NUMD CAVE ; -1 для диапазона 0...2 учитывается в NUMD + K PRGM ; считать байт по адресу в RX P M NW ; новая комната Вампуса P RM NK ; проверить не пришёл ли он к Вам - P X=0 VVODF9E1 ; если нет - перейти к F0 ; Если да - он Вас съел 5 MB 0 MC 1 RTN ; Подпрограммы обработки для команды Выбор VYBF7: ; В форме F7 много элементов ; и перемещение между ними можно сделать более рациональным .NUM TVYBF7 PP M 9042 PP RM 9208 ; код команды PP M 9213 ; считать адрес из ассоциативной таблицы P X>=0 VYB7B ; этой ошибки в отлаженной программе быть не может, но... PP RM 9203 ; номер активного элемента + ; получить смещение в выбранной по коду таблице K PRGM ; считать байт из памяти программ по адресу RX VYB7A: MC ; новый номер элемента 7 MB ; форма 7 - она не изменяется 1 RTN ; перерисовать VYB7B: PP RM 9203 ; при ошибке восстановить номер элемента P GOTO VYB7A TVYBF7: .DB 34 ; вправо .DA TVYBF7R .DB 35 ; влево .DA TVYBF7L .DB 36 ; вверх .DA TVYBF7U .DB 37 ; вниз .DA TVYBF7D .DB END TVYBF7L: .DB 19,0 ; далее эти таблицы пересекаются TVYBF7R: .DB 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,0 TVYBF7U: ; поскольку в форме две строки TVYBF7D: ; таблицы переходов вверх и вниз одинаковы .DB 10,11,12,13,14,15,16,17,18,19 .DB 0,1,2,3,4,5,6,7,8,9 ;========= Таблица переходов по пещере CAVE: ; HtW - массив S(J,K) - строки 0068-0160 .DB 2,5,8, 1,3,10, 2,4,12, 3,5,14, 1,4,6 .DB 5,7,15, 6,8,17, 1,7,9, 8,10,18, 2,9,11 .DB 10,12,19, 3,11,13, 12,14,20, 4,13,15, 6,14,16 .DB 15,17,20, 7,16,18, 9,17,19, 11,18,20, 13,16,19 ;========= Возврат псевдослучайных значений FNA: ; от 1 до 20 (HtW строка 0170) 20 FNA1: KRAN * K INT 1 + RTN FNB: ; от 1 до 3 (HtW строка 0180) 3 P GOTO FNA1 FNC: ; от 1 до 4 (HtW строка 0190) 4 P GOTO FNA1 ;========= Начальное заполнение LOC: ; HtW 0200-0270 6 M0 .NUMD NK ; аналог HtW L() M4 LOC1: P GSB FNA ; случайное число от 1 до 20 KM4 ; записать в переменную PFL0 LOC1 ; цикл по R0 LOC2: ; проверка пересечений ; использован алгоритм без избыточных проверок (по сравнению с HtW) 5 M0 .NUMT NB2 ; номер регистра NB2 (последнего в массиве) MA ; в RA LOC3: RM0 M1 .NUMD NK ; номер регистра NK-1 M4 ; в R4 LOC4: KRMA KRM4 - P X!=0 LOC ; если значения равны - повторить заполнение ; (см. HtW строка 0320) PFL1 LOC4 ; цикл по R1 RMA 1 - MA ; декремент RA PFL0 LOC3 ; цикл по R0 ; перенести данные в энергонезависимую память для повтора игры 6 M0 .NUMD NK ; аналог HtW L() M4 .NUMD NKR ; аналог HtW M() M5 LOC5: 1 PP M 9047 ; 1- запись в энергонезависимую память KRM4 KM5 ; эти данные записаны в энергонезависимую память PFL0 LOC5 ; цикл по R0 RTN ;======= LOCNK: P RM NK ; номер текущей комнаты 1-20 1 - 3 * .NUM CAVE + PP M 9042 PP RM 9044 P M NK0 ; номер комнаты влево PP RM 9044 P M NK1 ; номер комнаты прямо PP RM 9044 P M NK2 ; номер комнаты направо RTN ;======== Перенос строки из памяти программ R9042 в [R4+1] STRCPY: PP RM 9044 KM4 P X=0 STRCPY ; если не 0 - продолжить копирование RTN ;======== Перенос из памяти программ в строки STR1...STR3 ; последовательно, с заполнением флагов FSTR1...FSTR3 STRXCPY: P RM FSTR1 ; проверка строки 1 P X!=0 STRXCPY1 ; есть строка - перейти CX P M FSTR1 ; обнулить флаг FSTR1 .NUMD STR1 M4 ; адрес в R4 P GOTO STRCPY STRXCPY1: P RM FSTR2 ; проверка строки 2 P X!=0 STRXCPY2 ; есть строка - перейти CX P M FSTR2 ; обнулить флаг FSTR2 .NUMD STR2 M4 ; адрес в R4 P GOTO STRCPY STRXCPY2: P RM FSTR3 ; проверка строки 1 P X!=0 STRXCPY3 ; есть строка - перейти CX P M FSTR3 ; обнулить флаг FSTR3 .NUMD STR3 M4 ; адрес в R4 P GOTO STRCPY STRXCPY3: ; превышено количество строк - выйти из п/п RTN ;========= Проверка условий и заполнение строк сообщений ; временные переменные ; RA=NK0 ; RB=NK1 ; RC=NK2 ; RD - сравниваемое значение: NW,NP1,NP2,NB1,NB2 PROVNK: 1 P M FSTR1 ; нет строки STR1 P M FSTR2 ; нет строки STR2 P M FSTR3 ; нет строки STR3 ; проверка в цикле с оператором выбора (HtW строки 2000-2120) ; заменена прямыми сравнениями - для ЯМК это оптимальнее ; Для экономии памяти перепишем данные в регистры RA-RC P RM NK2 MC P RM NK1 MB P RM NK0 MA ; проверка соседства с Вампусом P RM NW MD - P X!=0 PROVNK3 RMB RMD - P X!=0 PROVNK3 RMC RMD - P X!=0 PROVNK3 ; проверка соседства с ямой PROVNK1: RMA P RM NP1 ; яма1 MD - P X!=0 PROVNK4 RMB RMD - P X!=0 PROVNK4 RMC RMD - P X!=0 PROVNK4 RMA P RM NP2 ; яма2 MD - P X!=0 PROVNK4 RMB RMD - P X!=0 PROVNK4 RMC RMD - P X!=0 PROVNK4 PROVNK2: ; проверка соседства с мышами RMA P RM NB1 ; мыши1 MD - P X!=0 PROVNK5 RMB RMD - P X!=0 PROVNK5 RMC RMD - P X!=0 PROVNK5 RMA P RM NB2 ; мыши2 MD - P X!=0 PROVNK5 RMB RMD - P X!=0 PROVNK5 RMC RMD - P X!=0 PROVNK5 RTN PROVNK3: ; Записать строку про Вампуса .NUM TXT1 PP M 9042 P GSB STRXCPY ; записать первую строку P GOTO PROVNK1 ; продолжить проверки других условий PROVNK4: ; Записать строку про сквозняк .NUM TXT2 PP M 9042 P GSB STRXCPY ; записать очередную (1 или 2) строку P GOTO PROVNK2 ; продолжить проверки других условий PROVNK5: ; Записать строку про мышей .NUM TXT3 PP M 9042 P GSB STRXCPY ; записать последнюю (1, 2 или 3) строку ; оператор перехода не требуется RTN ;========= Инициализация INIT: P GSB LOC ; начальная инициализация лабиринта INIT1: 5 P M ARR ; количество стрел (HtW строка 0360) P GSB LOCNK ; заполнить номера смежных комнат P GSB PROVNK ; заполнить строки STR1...STR2 RTN ;========= Сообщения TXT1: .TEXT "Ощущается запах Вампуса\0" TXT2: .TEXT "Чувствуется сквозняк\0" TXT3: .TEXT "Летучие мыши поблизости\0" ;===== Главная таблица форм TFORM: .DB 0 ; текущая комната пещеры .DA F0 ; адрес начала формы 0 .DB 1 ; заставка .DA F1 ; адрес начала формы 1 .DB 2 ; у Вампуса .DA F2 ; адрес начала формы 1 .DB 3 ; в яме .DA F3 ; .DB 4 ; у мышей .DA F4 ; .DB 5 ; съеден Вампусом .DA F5 ; .DB 6 ; дальность стрельбы .DA F6 ; .DB 7 ; маршрут стрелы .DA F7 ; .DB 8 ; возврат стрелы .DA F8 ; .DB 9 ; выстрел .DA F9 ; .DB 10 ; попали в Вампуса .DA F10 ; .DB 11 ; попали в себя .DA F11 ; .DB 12 ; промах .DA F12 ; .DB 13 ; стрелы закончились .DA F13 ; .DB 14 ; правила 1 .DA F14 ; .DB 15 ; правила 2 .DA F15 ; .DB 16 ; правила 3 .DA F16 ; .DB END ; конец таблицы ;===== Форма 0 - Текущая комната пещеры ; (вывод местонахождения в HtW - строки 2130-2160) .BASE ; смещения в таблицах и переходах указываются относительно начала формы F0: ; Заголовок формы .DB 3 ; максимальный номер элемента 3 (всего их 4, считая нулевой) .DBB F0DE, F0PI, F0PO, F0PL, F0PR, F0RI, F0KM ; таблица смещений ; Примечание: расположение остальных полей структуры в пределах формы ; может быть произвольным F0DE: ;таблица флагов действий .DB 29,29,29,29 ; В двоичном виде это 00 01 11 01 - установлены флаги "выход, ввод с обработкой, выбор" F0PI: .DB 0,0,0,1,0,2,0,3 F0PO: .DB 1,1,1,1,1,1,1,1 F0PL: ; Таблица переходов по команде "Выбор влево" .DB 3,0,1,2 F0PR: ; Таблица переходов по команде "Выбор вправо" .DB 1,2,3,0 F0RI: ; основная программа экранной формы .DB LCALL .DA FSFONT .DB TAB, 2, 12 .DB DRAWP, 0 .DA IFON .DB TAB, 2, 0 .DB TXTP, 16 .DA F0T1 .DB TAB, 38, 0 .DB PREXP, 16 .DA NK .DB TAB, 22, 8 .DB PREXP, 16 .DA NK0 .DB TAB, 63, 7 .DB PREXP, 16 .DA NK1 .DB TAB, 103, 6 .DB PREXP, 16 .DA NK2 .DB JNEZ .DA FSTR1 ; если FSTR1==0 вывести строку STR1 .DBB F0RI1 .DB TAB, 0, 42 .DB TXTB, 16 .DA STR1 F0RI1: .DB JNEZ .DA FSTR2 ; если FSTR2==0 вывести строку STR2 .DBB F0RI2 .DB TAB, 0, 49 .DB TXTB, 16 .DA STR2 F0RI2: .DB JNEZ .DA FSTR3 ; если FSTR3==0 вывести строку STR3 .DBB F0RI3 .DB TAB, 0, 56 .DB TXTB, 16 .DA STR3 F0RI3: .DB END ; конец основной программы F0KM: ; Таблица смещений программ элементов команды ; Эти программы выполняются после основной программы формы ; и указывают на точку входа для активного элемента .DBB F0KM0, F0KM1, F0KM2, F0KM3 F0KM0: ; идти влево .DB TAB, 22, 24 .DB DRAWP, 0 .DA IS0 .DB END F0KM1: ; идти прямо .DB TAB, 63, 22 .DB DRAWP, 0 .DA IS1 .DB END F0KM2: ; идти вправо .DB TAB, 102, 24 .DB DRAWP, 0 .DA IS2 .DB END F0KM3: ; стрелять .DB TAB, 0, 35 .DB TXTP, 16 .DA F0T2 .DB TAB, 96, 35 .DB PREXP, 16 .DA ARR ; вывести количество стрел .DB END F0T1: .TEXT "Комната\0" F0T2: .TEXT "Стрелять, запас стрел -\0" ;===== Форма 1 - Заставка .BASE F1: ; Заголовок формы .DB 3 ; максимальный номер элемента .DBB F1DE, F1PI, F1PO, F1PL, F1PR, F1RI, F1KM ; таблица смещений F1DE: ;таблица флагов действий .DB 13,13,5,13 ; 13=001101, 5=000101 ; Для элемента 2 - обычный ввод, без обработки ; Выход запрещён F1PI: F1PO: .DB 0,1,0,1,14,0,0,1 F1PL: ; Таблица переходов по команде "Выбор влево" .DB 3,0,1,2 F1PR: ; Таблица переходов по команде "Выбор вправо" .DB 1,2,3,0 F1RI: ; основная программа экранной формы .DB LCALL .DA FSFONT .DB TAB, 0, 0 .DB DRAWP, 0 .DA IWUMPUS .DB TAB, 40, 0 .DB TXTP, 16 .DA F1T0 .DB TAB, 54, 10 .DB TXTP, 16 .DA F1T1 .DB TAB, 54, 16 .DB TXTP, 16 .DA F1T2 .DB TAB, 54, 22 .DB TXTP, 16 .DA F1T3 .DB TAB, 54, 28 .DB TXTP, 16 .DA F1T4 .DB TAB, 79, 35 .DB TXTP, 16 .DA F1T5 .DB TAB, 72, 42 .DB TXTP, 16 .DA F1T6 .DB TAB, 76, 49 .DB TXTP, 16 .DA F1T7 .DB TAB, 78, 56 .DB TXTP, 16 .DA F1T8 .DB END ; конец основной программы F1KM: ; Таблица смещений программ элементов команды ; Эти программы выполняются после основной программы формы ; и указывают на точку входа для активного элемента .DBB F1KM0, F1KM1, F1KM2, F1KM3 F1KM0: .DB TAB, 56,34 .DB JM .DBB F1KME F1KM1: .DB TAB, 56,41 .DB JM .DBB F1KME F1KM2: .DB TAB, 56,48 .DB JM .DBB F1KME F1KM3: .DB TAB, 56,55 F1KME: .DB SQU, 3, 70, 7 .DB END F1T0: .TEXT "Охота на Вампуса v1.1\0" F1T1: .TEXT "по мотивам игры\0" F1T2: .DB 34 ; кавычки .TEXT "Hunt the Wumpus" .DB 34,0 ; кавычки и конец строки F1T3: .TEXT "(1972 г.), автор -\0" F1T4: .TEXT "Gregory Yob\0" F1T5: .TEXT "Начать\0" F1T6: .TEXT "Повторить\0" F1T7: .TEXT "Правила\0" F1T8: .TEXT "Выход\0" ;===== Форма 2 - В гостях у Вампуса (HtW строка 4160) .BASE F2: ; Заголовок формы .DB 0 ; максимальный номер элемента .DBB F2DE, F2PI, F2PO, F2PL, F2PR, F2RI, F2KM ; таблица смещений F2DE: ;таблица флагов действий .DB 60 ; 00111100 ввод и выход с обработкой F2PI: F2PO: .DB 1,0 F2PL: F2PR: .DB 0 F2RI: ; основная программа экранной формы .DB LCALL .DA FSFONT .DB LCALL .DA FSFRAME .DB LCALL .DA FSIWUM1 .DB TAB, 70, 20 .DB TXTP, 16 .DA F2T0 .DB TAB, 10, 40 .DB TXTP, 16 .DA F2T1 .DB END ; конец основной программы F2KM: .DBB F2KM0 F2KM0: .DB END F2T0: .TEXT "...ОПА!\0" F2T1: .TEXT "Вы наткнулись на Вампуса!\0" ;======= Форма 3 - Яма (HtW строка 4230) .BASE F3: ; Заголовок формы .DB 0 ; максимальный номер элемента .DBB F3DE, F3PI, F3PO, F3PL, F3PR, F3RI, F3KM ; таблица смещений F3DE: ;таблица флагов действий .DB 188 ; 10111100 ввод и выход с обработкой, без очистки F3PI: F3PO: .DB 1,0 F3PL: F3PR: .DB 0 F3RI: ; основная программа экранной формы .DB LCALL .DA FSFONT .DB TAB, 36, 0 .DB SQU, 4,20,7 ; очистить номер комнаты .DB TAB, 38, 0 .DB PREXP, 16 ; перерисовать номер комнаты .DA NK .DB LCALL .DA FSFRAME .DB TAB, 6, 9 .DB DRAWP, 0 .DA IPIT .DB TAB, 64, 20 .DB TXTP, 16 .DA F3T0 .DB TAB, 52, 40 .DB TXTP, 16 .DA F3T1 .DB END ; конец основной программы F3KM: .DBB F3KM0 F3KM0: .DB END F3T0: .TEXT "А-А-А-А....\0" F3T1: .TEXT "Вы упали в яму\0" ;======= Форма 4 - Мыши (HtW строка 4280) .BASE F4: ; Заголовок формы .DB 0 ; максимальный номер элемента .DBB F4DE, F4PI, F4PO, F4PL, F4PR, F4RI, F4KM ; таблица смещений F4DE: ;таблица флагов действий .DB 188 ; 188=10111100 ввод и выход с обработкой, без очистки F4PI: F4PO: .DB 1,0 F4PL: F4PR: .DB 0 F4RI: ; основная программа экранной формы .DB LCALL .DA FSFONT .DB TAB, 36, 0 .DB SQU, 4,20,7 ; очистить номер комнаты .DB TAB, 38, 0 .DB PREXP, 16 ; перерисовать номер комнаты .DA NK .DB LCALL .DA FSFRAME .DB TAB, 6, 9 .DB DRAWP, 0 .DA IBAT .DB TAB, 64, 12 .DB TXTP, 16 .DA F4T0 .DB TAB, 64, 20 .DB TXTP, 16 .DA F4T1 .DB TAB, 18, 32 .DB TXTP, 16 .DA F4T2 .DB TAB, 18, 40 .DB TXTP, 16 .DA F4T3 .DB TAB, 32, 48 .DB TXTP, 16 .DA F4T4 .DB END ; конец основной программы F4KM: .DBB F4KM0 F4KM0: .DB END F4T0: .TEXT "ЦАП!\0" F4T1: .TEXT "Вас схватили\0" F4T2: .TEXT "гигантские летучие мыши\0" F4T3: .TEXT "и затащили\0" F4T4: .TEXT "непонятно куда\0" ;======= Форма 5 - Схватил Вампус (HtW строка 3420) .BASE F5: ; Заголовок формы .DB 0 ; максимальный номер элемента .DBB F5DE, F5PI, F5PO, F5PL, F5PR, F5RI, F5KM ; таблица смещений F5DE: ;таблица флагов действий .DB 60 ; 00111100 ввод и выход с обработкой F5PI: F5PO: .DB 1,0 F5PL: F5PR: .DB 0 F5RI: ; основная программа экранной формы .DB LCALL .DA FSFONT .DB LCALL .DA FSFRAME .DB LCALL .DA FSIMM .DB TAB, 40, 20 .DB TXTP, 16 .DA F5T0 .DB TAB, 30, 30 .DB TXTP, 16 .DA F5T1 .DB TAB, 20, 40 .DB TXTP, 16 .DA F5T2 .DB END ; конец основной программы F5KM: .DBB F5KM0 F5KM0: .DB END F5T0: .TEXT "ШМЯК-ШМЯК...\0" F5T1: .TEXT "НЯМ-НЯМ-НЯМ...\0" F5T2: .TEXT "Вампус Вас поймал!\0" ;======= Форма 6 - дальность полёта стрелы (HtW строки 3040-3060) .BASE F6: ; Заголовок формы .DB 4 ; максимальный номер элемента .DBB F6DE, F6PI, F6PO, F6PL, F6PR, F6RI, F6KM ; таблица смещений F6DE: ;таблица флагов действий .DB 189,189,189,189,189 ; 10111101 выбор, ввод и выход с обработкой, без очистки F6PI: F6PO: .DB 1,0,1,0,1,0,1,0,1,0 F6PL: .DB 0,0,1,2,3 ; нет цикла: из 0 в 0 F6PR: .DB 1,2,3,4,4 ; нет цикла: из 4 в 4 F6RI: ; основная программа экранной формы .DB LCALL .DA FSFONT .DB LCALL .DA FSFRAME .DB TAB, 12, 10 .DB TXTP, 16 .DA F6T0 .DB END ; конец основной программы F6KM: .DBB F6KM0, F6KM1, F6KM2, F6KM3, F6KM4 F6KM0: .DB MCALL .DBB F6S0 .DB TAB, 40, 44 .DB TXTP, 16 .DA F6T1 .DB END F6KM1: .DB MCALL .DBB F6S1 .DB TAB, 40, 44 .DB TXTP, 16 .DA F6T2 .DB END F6KM2: .DB MCALL .DBB F6S2 .DB TAB, 40, 44 .DB TXTP, 16 .DA F6T3 .DB END F6KM3: .DB MCALL .DBB F6S3 .DB TAB, 40, 44 .DB TXTP, 16 .DA F6T4 .DB END F6KM4: .DB MCALL .DBB F6S4 .DB TAB, 40, 44 .DB TXTP, 16 .DA F6T5 .DB END F6S4: .DB TAB, 80,20 .DB SQU, 0,8,20 F6S3: .DB TAB, 70,20 .DB SQU, 0,8,20 F6S2: .DB TAB, 60,20 .DB SQU, 0,8,20 F6S1: .DB TAB, 50,20 .DB SQU, 0,8,20 F6S0: .DB TAB, 40,20 .DB SQU, 0,8,20 .DB RETUM F6T0: .TEXT "Дальность полёта стрелы\0" F6T1: .TEXT "Одна комната\0" F6T2: .TEXT "Две комнаты\0" F6T3: .TEXT "Три комнаты\0" F6T4: .TEXT "Четыре комнаты\0" F6T5: .TEXT "Пять комнат\0" ;======= Форма 7 - маршрут стрелы (HtW строки 3027-3115) .BASE F7: ; Заголовок формы .DB 19 ; максимальный номер элемента .DBB F7DE, F7PI, F7PO, F7PL, F7PR, F7RI, F7KM ; таблица смещений F7DE: ;таблица флагов действий - обязательна .DB 191,191,191,191,191 ; 10111111 выбор, ввод и выход с обработкой, без очистки .DB 191,191,191,191,191 .DB 191,191,191,191,191 .DB 191,191,191,191,191 F7PI: ; Таблицы отсутствуют для уменьшения размеров формы F7PO: ; Поскольку обработка всех команд F7PL: ; выполняется отдельно (см. флаги действий) F7PR: ; С тем же успехом можно было указать смещение 0 в заголовке F7RI: ; основная программа экранной формы .DB LCALL .DA FSFONT .DB LCALL .DA FSFRAME .DB TAB, 36, 10 .DB TXTP, 16 .DA F7T0 .DB TAB, 10, 20 .DB TXTB, 16 .DA STR1 .DB TAB, 10, 34 .DB TXTP, 16 .DA F7T1 .DB TAB, 10, 44 .DB TXTP, 16 .DA F7T2 .DB END ; конец основной программы F7KM: .DBB F7KM0, F7KM1, F7KM2, F7KM3, F7KM4 .DBB F7KM5, F7KM6, F7KM7, F7KM8, F7KM9 .DBB F7KM10, F7KM11, F7KM12, F7KM13, F7KM14 .DBB F7KM15, F7KM16, F7KM17, F7KM18, F7KM19 F7KM0: .DB TAB, 9, 33 .DB JM .DBB F7KME F7KM1: .DB TAB, 20, 33 .DB JM .DBB F7KME F7KM2: .DB TAB, 31, 33 .DB JM .DBB F7KME F7KM3: .DB TAB, 42, 33 .DB JM .DBB F7KME F7KM4: .DB TAB, 53, 33 .DB JM .DBB F7KME F7KM5: .DB TAB, 64, 33 .DB JM .DBB F7KME F7KM6: .DB TAB, 75, 33 .DB JM .DBB F7KME F7KM7: .DB TAB, 86, 33 .DB JM .DBB F7KME F7KM8: .DB TAB, 97, 33 .DB JM .DBB F7KME F7KM9: .DB TAB, 108, 33 .DB JM .DBB F7KME F7KM10:.DB TAB, 9, 43 .DB JM .DBB F7KME F7KM11: .DB TAB, 20, 43 .DB JM .DBB F7KME F7KM12: .DB TAB, 31, 43 .DB JM .DBB F7KME F7KM13: .DB TAB, 42, 43 .DB JM .DBB F7KME F7KM14: .DB TAB, 53, 43 .DB JM .DBB F7KME F7KM15: .DB TAB, 64, 43 .DB JM .DBB F7KME F7KM16: .DB TAB, 75, 43 .DB JM .DBB F7KME F7KM17: .DB TAB, 86, 43 .DB JM .DBB F7KME F7KM18: .DB TAB, 97, 43 .DB JM .DBB F7KME F7KM19: .DB TAB, 108, 43 F7KME: .DB SQU, 3,9,7 .DB END F7T0: .TEXT "Маршрут стрелы\0" F7T1: ; строка от 1 до 10 с пробелами шириной в цифру .DB 31,49,32,31,50,32,31,51,32,31,52,32,31,53,32 .DB 31,54,32,31,55,32,31,56,32,31,57,32,49,48,0 F7T2: .TEXT "11 12 13 14 15 16 17 18 19 20\0" ;======= Форма 8 - Возврат стрелы недопустим (HtW строка 3105) .BASE F8: ; Заголовок формы .DB 0 ; максимальный номер элемента .DBB F8DE, F8PI, F8PO, F8PL, F8PR, F8RI, F8KM ; таблица смещений F8DE: ;таблица флагов действий .DB 188 ; 10111100 ввод и выход с обработкой, без очистки F8PI: F8PO: .DB 1,0 F8PL: F8PR: .DB 0 F8RI: ; основная программа экранной формы .DB LCALL .DA FSFONT .DB TAB, 5,26 ; рамка меньшего размера .DB SQU, 4,118,30 ; атрибут 4 = NOT (белый прямоугольник) .DB TAB, 6,27 .DB FRAME, 0,116,28 ; атрибут 0 - замена (рамка) .DB TAB, 8, 30 .DB TXTP, 16 .DA F8T0 .DB TAB, 8, 38 .DB TXTP, 16 .DA F8T1 .DB END ; конец основной программы F8KM: .DBB F8KM0 F8KM0: .DB END F8T0: .TEXT "Так стрелы не летают\0" F8T1: .TEXT "Измените маршрут\0" ;======= Форма 9 - Выстрел .BASE F9: ; Заголовок формы .DB 1 ; максимальный номер элемента .DBB F9DE, F9PI, F9PO, F9PL, F9PR, F9RI, F9KM ; таблица смещений F9DE: ;таблица флагов действий .DB 189,189 ; 10111101 выбор,ввод и выход с обработкой, без очистки F9PI: F9PO: .DB 1,0,1,0 F9PL: F9PR: .DB 1,0 F9RI: ; основная программа экранной формы .DB LCALL .DA FSFONT .DB LCALL .DA FSFRAME .DB TAB, 6, 10 .DB TXTP, 16 .DA F9T0 .DB TAB, 6, 20 .DB TXTB, 16 .DA STR1 ; маршрут .DB TAB, 6, 30 .DB TXTP, 16 .DA F9T1 .DB TAB, 56, 30 .DB PREXP, 16 .DA ARR .DB TAB, 47, 40 .DB TXTP, 16 .DA F9T2 .DB TAB, 44, 48 .DB TXTP, 16 .DA F9T3 .DB END ; конец основной программы F9KM: .DBB F9KM0,F9KM1 F9KM0: .DB TAB, 26, 39 .DB JM .DBB F9KME F9KM1: .DB TAB, 26, 47 F9KME: .DB SQU, 3, 76, 7 .DB END F9T0: .TEXT "Маршрут:\0" F9T1: .TEXT "Запас стрел:\0" F9T2: .TEXT "Стрелять\0" F9T3: .TEXT "Отставить\0" ;======= Форма 10 - Попали в Вампуса (HtW строка 3310) .BASE F10: ; Заголовок формы .DB 0 ; максимальный номер элемента .DBB F10DE, F10PI, F10PO, F10PL, F10PR, F10RI, F10KM ; таблица смещений F10DE: ;таблица флагов действий .DB 60 ; 00111100 ввод и выход с обработкой F10PI: F10PO: .DB 1,0 F10PL: F10PR: .DB 0 F10RI: ; основная программа экранной формы .DB LCALL .DA FSFONT .DB LCALL .DA FSFRAME .DB LCALL .DA FSIWUM1 .DB JNEZ .DA ARRERR .DBB F10RI1 .DB TAB, 40, 20 .DB TXTP, 16 .DA F10T2 F10RI1: .DB TAB, 60, 30 .DB TXTP, 16 .DA F10T0 .DB TAB, 10, 40 .DB TXTP, 16 .DA F10T1 .DB END ; конец основной программы F10KM: .DBB F10KM0 F10KM0: .DB END F10T0: .TEXT "ТАК ТОЧНО!\0" F10T1: .TEXT "Вы пристрелили Вампуса!\0" F10T2: .TEXT "Ошибка маршрута\0" ;======= Форма 11 - Попали в себя (HtW строка 3350) .BASE F11: ; Заголовок формы .DB 0 ; максимальный номер элемента .DBB F11DE, F11PI, F11PO, F11PL, F11PR, F11RI, F11KM ; таблица смещений F11DE: ;таблица флагов действий .DB 60 ; 00111100 ввод и выход с обработкой F11PI: F11PO: .DB 1,0 F11PL: F11PR: .DB 0 F11RI: ; основная программа экранной формы .DB LCALL .DA FSFONT .DB LCALL .DA FSFRAME .DB LCALL .DA FSIMM .DB JNEZ .DA ARRERR .DBB F11RI1 .DB TAB, 40, 20 .DB TXTP, 16 .DA F10T2 F11RI1: .DB TAB, 60, 30 .DB TXTP, 16 .DA F11T0 .DB TAB, 10, 40 .DB TXTP, 16 .DA F11T1 .DB END ; конец основной программы F11KM: .DBB F11KM0 F11KM0: .DB END F11T0: .TEXT "ОХ!\0" F11T1: .TEXT "Стрела попала в Вас\0" ;======= Форма 12 - Промах (HtW строка 3220) .BASE F12: ; Заголовок формы .DB 0 ; максимальный номер элемента .DBB F12DE, F12PI, F12PO, F12PL, F12PR, F12RI, F12KM ; таблица смещений F12DE: ;таблица флагов действий .DB 60 ; 00111100 ввод и выход с обработкой F12PI: F12PO: .DB 1,0 F12PL: F12PR: .DB 0 F12RI: ; основная программа экранной формы .DB LCALL .DA FSFONT .DB LCALL .DA FSFRAME .DB LCALL .DA FSIWUM1 .DB JNEZ .DA ARRERR .DBB F12RI1 .DB TAB, 40, 20 .DB TXTP, 16 .DA F10T2 F12RI1: .DB TAB, 60, 30 .DB TXTP, 16 .DA F12T0 .DB TAB, 10, 40 .DB TXTP, 16 .DA F12T1 .DB END ; конец основной программы F12KM: .DBB F12KM0 F12KM0: .DB END F12T0: .TEXT "Промах...\0" F12T1: .TEXT "Вампус проснулся\0" ;======= Форма 13 - Нет стрел .BASE F13: ; Заголовок формы .DB 0 ; максимальный номер элемента .DBB F13DE, F13PI, F13PO, F13PL, F13PR, F13RI, F13KM ; таблица смещений F13DE: ;таблица флагов действий .DB 60 ; 00111100 ввод и выход с обработкой F13PI: F13PO: .DB 1,0 F13PL: F13PR: .DB 0 F13RI: ; основная программа экранной формы .DB LCALL .DA FSFONT .DB LCALL .DA FSFRAME .DB LCALL .DA FSIMM .DB TAB, 6, 30 .DB TXTP, 16 .DA F13T0 .DB TAB, 6, 40 .DB TXTP, 16 .DA F13T1 .DB END ; конец основной программы F13KM: .DBB F13KM0 F13KM0: .DB END F13T0: .TEXT "А нечем стрелять\0" F13T1: .TEXT "Стрелы закончились\0" ;======= Форма 14 - Правила 1 .BASE F14: ; Заголовок формы .DB 0 ; максимальный номер элемента .DBB F14DE, F14PI, F14PO, F14PL, F14PR, F14RI, F14KM ; таблица смещений F14DE: ;таблица флагов действий .DB 20 ; 00010100 разрешён ввод и выход F14PI: .DB 15,0 ; Ввод - F15E0 F14PO: .DB 1,2 ; Выход - перейти в F1E2 обычным образом F14PL: F14PR: .DB 0 F14RI: ; основная программа экранной формы .DB TAB, 0,2 .DB TXTP, 16 .DA F14T0 .DB TAB, 0,8 .DB TXTP, 16 .DA F14T1 .DB TAB, 0,14 .DB TXTP, 16 .DA F14T2 .DB TAB, 0,20 .DB TXTP, 16 .DA F14T3 .DB TAB, 0,26 .DB TXTP, 16 .DA F14T4 .DB TAB, 0,32 .DB TXTP, 16 .DA F14T5 .DB TAB, 0,38 .DB TXTP, 16 .DA F14T6 .DB TAB, 0,44 .DB TXTP, 16 .DA F14T7 .DB TAB, 0,50 .DB TXTP, 16 .DA F14T8 .DB TAB, 0,56 .DB TXTP, 16 .DA F14T9 .DB END ; конец основной программы F14KM: .DBB F14KM0 F14KM0: .DB END F14T0: .TEXT "Вампус - монстр, обитающий в\0" F14T1: .TEXT "пещерах. Питается людьми.\0" F14T2: .TEXT "Изрядно воняет, большую часть\0" F14T3: .TEXT "времени проводит в спячке.\0" F14T4: .TEXT "Цель игры - пристрелить его.\0" F14T5: .TEXT "Но в запасе всего пять стрел.\0" F14T6: .TEXT "В пещере есть опасные ямы.\0" F14T7: .TEXT "Из которых дует сквозняк.\0" F14T8: .TEXT "Есть и летучие мыши,\0" F14T9: .TEXT "которые могут утащить Вас.\0" ;======= Форма 15 - Правила 2 .BASE F15: ; Заголовок формы .DB 0 ; максимальный номер элемента .DBB F15DE, F15PI, F15PO, F15PL, F15PR, F15RI, F15KM ; таблица смещений F15DE: ;таблица флагов действий .DB 20 ; 00010100 разрешён ввод и выход F15PI: .DB 16,0 ; Ввод - F16E0 F15PO: .DB 1,2 ; Выход - перейти в F1E2 обычным образом F15PL: F15PR: .DB 0 F15RI: ; основная программа экранной формы .DB TAB, 0,2 .DB TXTP, 16 .DA F15T0 .DB TAB, 0,8 .DB TXTP, 16 .DA F15T1 .DB TAB, 0,14 .DB TXTP, 16 .DA F15T2 .DB TAB, 0,20 .DB TXTP, 16 .DA F15T3 .DB TAB, 0,26 .DB TXTP, 16 .DA F15T4 .DB TAB, 0,32 .DB TXTP, 16 .DA F15T5 .DB TAB, 0,38 .DB TXTP, 16 .DA F15T6 .DB TAB, 0,44 .DB TXTP, 16 .DA F15T7 .DB TAB, 0,50 .DB TXTP, 16 .DA F15T8 .DB TAB, 0,56 .DB TXTP, 16 .DA F15T9 .DB END ; конец основной программы F15KM: .DBB F15KM0 F15KM0: .DB END F15T0: .TEXT "Запах, сквозняк и шум\0" F15T1: .TEXT "исходят из соседних комнат.\0" F15T2: .TEXT "Из какой точно - неизвестно.\0" F15T3: .TEXT "Выбор идти или стрелять - \0" F15T4: .TEXT "кнопками Выбора.\0" F15T5: .TEXT "Стрела пролетает от 1 до 5\0" F15T6: .TEXT "комнат. Маршрут указывается\0" F15T7: .TEXT "перед выстрелом. При ошибке\0" F15T8: .TEXT "стрела улетает в сторону\0" F15T9: .TEXT "и может попасть в Вас.\0" ;======= Форма 16 - Правила 3 .BASE F16: ; Заголовок формы .DB 0 ; максимальный номер элемента .DBB F16DE, F16PI, F16PO, F16PL, F16PR, F16RI, F16KM ; таблица смещений F16DE: ;таблица флагов действий .DB 20 ; 00010100 разрешён ввод и выход F16PI: F16PO: .DB 1,2 ; Выход - перейти в F1E2 обычным образом F16PL: F16PR: .DB 0 F16RI: ; основная программа экранной формы .DB TAB, 0,2 .DB TXTP, 16 .DA F16T0 .DB TAB, 0,8 .DB TXTP, 16 .DA F16T1 .DB TAB, 0,14 .DB TXTP, 16 .DA F16T2 .DB TAB, 0,20 .DB TXTP, 16 .DA F16T3 .DB TAB, 0,26 .DB TXTP, 16 .DA F16T4 .DB TAB, 0,32 .DB TXTP, 16 .DA F16T5 .DB TAB, 0,44 .DB TXTP, 16 .DA F16T6 .DB TAB, 0,50 .DB TXTP, 16 .DA F16T7 .DB TAB, 0,56 .DB TXTP, 16 .DA F16T8 .DB END ; конец основной программы F16KM: .DBB F16KM0 F16KM0: .DB END F16T0: .TEXT "После каждого выстрела Вампус\0" F16T1: .TEXT "пробуждается и способен\0" F16T2: .TEXT "переползти в другую комнату,\0" F16T3: .TEXT "включая Вашу. На него можно\0" F16T4: .TEXT "и наткнуться, тогда он Вас\0" F16T5: .TEXT "съест с вероятностью 25%.\0" F16T6: .TEXT "В остальном интерфейс игры\0" F16T7: .TEXT "интуитивно понятен.\0" F16T8: .TEXT "Ни пуха, ни пера!\0" ;========== Подпрограммы экранных форм FSFONT: ; установка шрифта 5 .DB TYPE, 254 ; шрифт пользователя .DB ATYPE .DA FONT5 .DB RETUL FSFRAME: ; вывод рамки .DB TAB, 3,6 .DB SQU, 4,122,52 ; атрибут 4 = NOT (белый прямоугольник) .DB TAB, 4,7 .DB FRAME, 0,120,50 ; атрибут 0 - замена (рамка) .DB RETUL FSIMM: ; вывод рисунка IMM .DB TAB, 8, 10 .DB DRAWP,0 .DA IMM .DB RETUL FSIWUM1: ; вывод рисунка IWUM1 .DB TAB, 8, 10 .DB DRAWP, 0 .DA IWUM1 .DB RETUL ;=================================================================== IFON: .DB 80h, 14h .DB 0, 0, 0 .DB 0, 0, 8 .DB 0, 80h, 8 .DB 0, 10h, 8 .DB 40h, 2, 9 .DB 40h, 26h, 9 .DB 40h, 0C4h, 0Fh .DB 0C8h, 70h, 0Ah .DB 30h, 0DCh, 0Fh .DB 0, 77h, 0 .DB 0A0h, 1Dh, 4 .DB 90h, 66h, 3 .DB 0ECh, 0B7h, 1 .DB 20h, 73h, 0 .DB 0F0h, 1Fh, 0 .DB 0D0h, 3, 0 .DB 0F8h, 5, 0 .DB 0E8h, 2, 0 .DB 0FCh, 0, 0 .DB 0F4h, 1, 0 .DB 7Ch, 1, 0 .DB 0D4h, 0, 0 .DB 09Ch, 0, 0 .DB 94h, 0, 0 .DB 74h, 1, 0 .DB 5Ch, 1, 0 .DB 0D4h, 2, 0 .DB 0D4h, 2, 0 .DB 0BCh, 6, 0 .DB 0A8h, 0Dh, 0 .DB 68h, 9, 0 .DB 78h, 12h, 0 .DB 0D0h, 6Eh, 0 .DB 0B0h, 4Ch, 0 .DB 0ACh, 0DBh, 1 .DB 64h, 23h, 1 .DB 0C0h, 16h, 3 .DB 88h, 3Fh, 6 .DB 90h, 66h, 0 .DB 0A0h, 0DCh, 0Fh .DB 10h, 70h, 0Ah .DB 50h, 0C0h, 0Fh .DB 50h, 1Eh, 8 .DB 0D0h, 0D5h, 0Dh .DB 50h, 24h, 0Bh .DB 50h, 34h, 8 .DB 80h, 0D5h, 0Fh .DB 80h, 78h, 9 .DB 20h, 0A8h, 0Fh .DB 10h, 0EFh, 0 .DB 18h, 39h, 5 .DB 88h, 4Fh, 2 .DB 0E0h, 62h, 1 .DB 0A0h, 09Bh, 0 .DB 0F0h, 0CCh, 0 .DB 50h, 26h, 0 .DB 58h, 1Bh, 0 .DB 68h, 0Ch, 0 .DB 0BCh, 6, 0 .DB 14h, 1, 0 .DB 0F4h, 1, 0 .DB 0FCh, 0, 0 .DB 74h, 0, 0 .DB 0F4h, 0, 0 .DB 74h, 0, 0 .DB 0FCh, 0, 0 .DB 74h, 1, 0 .DB 0F4h, 0, 0 .DB 34h, 3, 0 .DB 0BCh, 6, 0 .DB 28h, 1Dh, 0 .DB 78h, 35h, 0 .DB 0D2h, 0EEh, 0 .DB 90h, 98h, 0 .DB 0F0h, 0B5h, 1 .DB 44h, 63h, 3 .DB 0C0h, 0AEh, 4 .DB 88h, 8Bh, 0Dh .DB 70h, 7Ah, 0 .DB 40h, 0CEh, 0Fh .DB 0D8h, 38h, 9 .DB 8Ch, 0E0h, 0Fh .DB 4, 9, 8 .DB 0Ch, 39h, 0Bh .DB 18h, 0A0h, 9 .DB 40h, 2Ch, 8 .DB 38h, 86h, 0Fh .DB 0, 0F3h, 0Ah .DB 44h, 09Ch, 0Fh .DB 26h, 0F7h, 0 .DB 32h, 1Dh, 4 .DB 0D2h, 85h, 2 .DB 42h, 77h, 1 .DB 0E0h, 0A1h, 0 .DB 0B0h, 0F4h, 0 .DB 0DAh, 34h, 0 .DB 68h, 2Dh, 0 .DB 39h, 15h, 0 .DB 0ABh, 1Ah, 0 .DB 0BDh, 9, 0 .DB 95h, 5, 0 .DB 0DFh, 5, 0 .DB 0D4h, 6, 0 .DB 54h, 2, 0 .DB 54h, 1, 0 .DB 0DCh, 1, 0 .DB 94h, 2, 0 .DB 0FEh, 2, 0 .DB 0F6h, 1, 0 .DB 0FEh, 3, 0 .DB 0E8h, 1, 0 .DB 0E9h, 7, 0 .DB 0FEh, 0Bh, 0 .DB 92h, 0Fh, 0 .DB 0F6h, 17h, 0 .DB 44h, 0FFh, 0 .DB 0C4h, 46h, 3 .DB 90h, 1Dh, 0Eh .DB 30h, 77h, 0 .DB 24h, 0DCh, 0Fh .DB 84h, 71h, 9 .DB 16h, 0C3h, 0Fh .DB 2, 0DEh, 9 .DB 0, 8, 0Bh .DB 20h, 6Bh, 9 .DB 0, 4Ah, 0Bh .DB 40h, 50h, 0Ah .DB 0, 0, 8 IS0: .DB 0Ah, 10h .DB 1Fh, 0 .DB 0FEh, 7 .DB 0FCh, 3 .DB 0F8h, 1 .DB 0F8h, 3 .DB 0F0h, 7 .DB 60h, 1Eh .DB 40h, 0FCh .DB 40h, 0F0h .DB 0, 0E0h IS1: .DB 6, 10h .DB 0C0h, 1 .DB 0F8h, 0 .DB 0FFh, 0FFh .DB 0FBh, 0FFh .DB 0F8h, 0 .DB 0C0h, 1 IS2: .DB 0Ah, 10h .DB 0, 0E0h .DB 0, 0F0h .DB 40h, 78h .DB 60h, 1Eh .DB 0F0h, 0Fh .DB 0F0h, 3 .DB 0F8h, 1 .DB 0FCh, 7 .DB 0FEh, 3 .DB 1Fh, 0 IWUMPUS: .DB 32h, 40h .DB 0, 0, 0, 0, 0, 0, 0, 0 .DB 0, 0, 1, 0, 0, 0, 0, 0 .DB 0, 80h, 2, 40h, 0, 0, 20h, 0 .DB 0, 40h, 2, 0, 0, 0, 0, 0 .DB 0, 7Eh, 4, 20h, 0, 0, 10h, 10h .DB 0, 1, 2, 10h, 0, 0, 0, 8 .DB 0, 0DDh, 2, 0, 0, 0, 8, 0 .DB 0C0h, 2, 1, 8, 0, 0, 4, 2 .DB 40h, 1, 0, 0, 0, 0, 0, 0 .DB 0A0h, 0, 0, 0, 0, 0, 1, 0 .DB 50h, 0, 0, 5Ch, 2, 0, 80h, 0 .DB 50h, 0, 0, 0AAh, 0BFh, 27h, 0, 0 .DB 48h, 0, 0A0h, 5Fh, 0F3h, 1Dh, 0, 0 .DB 48h, 0E0h, 0F2h, 0B6h, 19h, 50h, 80h, 0Fh .DB 48h, 0B0h, 0D7h, 1Bh, 8, 78h, 40h, 19h .DB 48h, 09Fh, 5Ah, 0Ch, 0, 70h, 40h, 16h .DB 0C8h, 4, 68h, 3, 0, 0C0h, 81h, 28h .DB 0C8h, 0CCh, 50h, 0, 0C0h, 67h, 80h, 29h .DB 8, 94h, 71h, 44h, 0, 88h, 55h, 29h .DB 8, 09Ch, 4, 84h, 1, 0C0h, 34h, 20h .DB 8, 0D8h, 68h, 88h, 0, 0C5h, 0Fh, 2Bh .DB 8, 6Ah, 0E8h, 0Bh, 1, 0Fh, 80h, 26h .DB 10h, 8Ah, 9, 1Bh, 1, 0Bh, 70h, 18h .DB 20h, 64h, 0CAh, 11h, 1, 16h, 0Eh, 0 .DB 0C0h, 0C6h, 80h, 3Fh, 7Eh, 0F6h, 1, 80h .DB 80h, 0C5h, 0F0h, 2Ch, 21h, 46h, 0, 0C0h .DB 0, 64h, 17h, 22h, 0C1h, 8, 2, 40h .DB 0, 0Ch, 5, 3, 81h, 88h, 18h, 40h .DB 0, 0F0h, 4, 33h, 0C1h, 0Ch, 0C0h, 20h .DB 0, 0, 88h, 91h, 80h, 8, 41h, 21h .DB 0, 0, 88h, 90h, 0C0h, 88h, 40h, 22h .DB 0, 0, 88h, 48h, 80h, 78h, 0F4h, 12h .DB 0, 0, 88h, 48h, 80h, 68h, 0A3h, 12h .DB 0, 0, 4Ch, 44h, 80h, 82h, 09Dh, 0Ah .DB 0, 0, 44h, 44h, 10h, 17h, 0, 0Ah .DB 0, 0, 22h, 2Fh, 10h, 0E8h, 8Eh, 0Ah .DB 0, 0, 63h, 21h, 10h, 0, 89h, 6 .DB 0, 80h, 0B3h, 3Eh, 24h, 40h, 0D0h, 2 .DB 0, 80h, 19h, 23h, 24h, 20h, 0A0h, 2 .DB 0, 40h, 0Ch, 35h, 28h, 10h, 78h, 3Dh .DB 0, 40h, 2, 2Bh, 68h, 34h, 48h, 1 .DB 0, 20h, 1, 1Ch, 48h, 36h, 8, 80h .DB 0, 0B8h, 1, 0, 48h, 4Ah, 0F8h, 8Fh .DB 0, 0ACh, 1, 0, 88h, 4Ah, 4, 40h .DB 0, 0DCh, 0, 0, 90h, 61h, 4, 40h .DB 0, 8Ah, 0, 0, 10h, 0DFh, 4, 40h .DB 0, 8Ah, 1, 0, 10h, 80h, 4, 80h .DB 0, 0D2h, 0, 0, 30h, 80h, 2, 20h .DB 0, 7Ch, 0, 0, 0F0h, 0FFh, 2, 20h .DB 0, 0, 0, 0, 90h, 0, 3, 0 IPIT: .DB 2Ch, 20h .DB 0, 0, 1Eh, 0 .DB 0, 0C0h, 0Bh, 0 .DB 0, 0F8h, 27h, 0 .DB 0F8h, 0BFh, 24h, 0 .DB 0F8h, 5Fh, 43h, 0 .DB 0D0h, 0A9h, 0F1h, 0 .DB 38h, 0B7h, 0F8h, 7 .DB 3Ch, 0, 0F8h, 7 .DB 47h, 78h, 0ECh, 7 .DB 0BCh, 48h, 0D2h, 0Fh .DB 40h, 49h, 0AEh, 0Fh .DB 80h, 4Ah, 7Eh, 0Fh .DB 0, 0C8h, 0F3h, 0Fh .DB 0C0h, 48h, 0AAh, 1Fh .DB 0, 48h, 52h, 1Fh .DB 80h, 48h, 92h, 1Eh .DB 0, 49h, 42h, 3Fh .DB 0, 78h, 8Ch, 3Fh .DB 0, 1, 0E4h, 3Fh .DB 0, 0, 0C4h, 7Fh .DB 0, 0, 0F4h, 0FFh .DB 0, 4, 0E6h, 0FFh .DB 0, 1, 0E2h, 7Fh .DB 0, 0, 0BAh, 7Fh .DB 0, 81h, 0C2h, 7Fh .DB 0, 80h, 0F2h, 1Fh .DB 0, 40h, 0C6h, 1Fh .DB 80h, 0C0h, 84h, 0 .DB 0, 40h, 0FDh, 0 .DB 80h, 0E0h, 7Ch, 0 .DB 0, 0B8h, 78h, 20h .DB 80h, 0Fh, 30h, 10h .DB 0E0h, 67h, 0, 28h .DB 0FCh, 95h, 3, 1Ch .DB 28h, 0, 0, 7 .DB 0A0h, 0, 82h, 1 .DB 40h, 1, 80h, 0 .DB 0, 7Eh, 82h, 3 .DB 0, 40h, 0, 6 .DB 0, 80h, 0Ch, 4 .DB 0, 80h, 0C4h, 7 .DB 0, 0, 41h, 0 .DB 0, 0, 73h, 0 .DB 0, 0, 30h, 0 IBAT: .DB 32h, 17h .DB 0, 0, 40h .DB 0, 0, 60h .DB 0, 0, 30h .DB 0, 0, 3Ch .DB 0, 20h, 1Fh .DB 0, 3Ch, 0Dh .DB 0, 0B4h, 0Fh .DB 0, 09Ch, 6 .DB 0, 0F4h, 7 .DB 0, 6Ah, 0Eh .DB 0, 0F7h, 3 .DB 0, 55h, 1 .DB 80h, 0B3h, 1 .DB 80h, 0FAh, 1 .DB 80h, 0E9h, 0 .DB 80h, 0ACh, 0 .DB 80h, 2Dh, 0 .DB 0C0h, 34h, 0 .DB 7Ch, 1Ch, 0 .DB 94h, 1Dh, 0 .DB 58h, 0Ah, 0 .DB 0D0h, 0Bh, 0 .DB 90h, 5, 0 .DB 8, 0Eh, 0 .DB 67h, 0Bh, 0 .DB 0DFh, 0Fh, 0 .DB 0F0h, 8, 0 .DB 0, 5, 0 .DB 80h, 5, 0 .DB 0, 5, 0 .DB 0, 3, 0 .DB 0, 0Dh, 0 .DB 0, 5, 0 .DB 0, 5, 0 .DB 0, 7, 0 .DB 80h, 2, 0 .DB 80h, 0Dh, 0 .DB 80h, 1Ah, 0 .DB 80h, 7, 0 .DB 80h, 2, 0 .DB 80h, 7, 0 .DB 80h, 4, 0 .DB 80h, 0Ah, 0 .DB 0C0h, 1Ch, 0 .DB 40h, 5, 0 .DB 40h, 6, 0 .DB 40h, 4, 0 .DB 40h, 2, 0 .DB 0C0h, 7, 0 .DB 40h, 0, 0 IMM: .DB 0Dh, 0Fh .DB 80h, 21h .DB 80h, 61h .DB 2Eh, 33h .DB 6Dh, 1Bh .DB 59h, 0Ch .DB 4Dh, 6 .DB 2Dh, 3 .DB 09Ah, 5 .DB 0C0h, 5 .DB 0E0h, 8 .DB 70h, 18h .DB 70h, 38h .DB 30h, 18h IWUM1: .DB 17h, 1Ch .DB 0, 0, 0, 0 .DB 0, 0, 0Eh, 0 .DB 0, 24h, 1Fh, 0 .DB 80h, 24h, 0Eh, 0 .DB 20h, 0D9h, 8Fh, 7 .DB 50h, 0DEh, 0C3h, 1 .DB 0E8h, 7Ah, 0E1h, 0Fh .DB 4Ch, 0E3h, 0F1h, 0 .DB 18h, 0AAh, 0F3h, 7 .DB 4Ch, 0B0h, 0F7h, 0 .DB 0CEh, 23h, 0BFh, 3 .DB 1Eh, 0E6h, 1Eh, 0 .DB 8, 51h, 0Eh, 0 .DB 1Fh, 0D6h, 1Eh, 0 .DB 0C8h, 91h, 3, 0 .DB 5Eh, 0A0h, 0, 0 .DB 0Ch, 0F8h, 3Bh, 0 .DB 64h, 0EDh, 3Fh, 0 .DB 3Ah, 53h, 1Fh, 0 .DB 64h, 57h, 1Ch, 0 .DB 0A0h, 12h, 0Ch, 0 .DB 50h, 3, 0, 0 .DB 0, 0, 0, 0 ;============================= Шрифт 5 ; Шрифт 5 - дополненный char31 .BASE FONT5: .DB 5 ; высота шрифта .DB 31,3 .DWB CHAR31 .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 CHAR31: .DB 0 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 .END Текст игры на языке BASICВ ряде мест вышеприведённой программы ЭКВМ даются ссылки на этот листинг. При сравнении размеров программ не следует забывать, что игра для ЭКВМ включает графические изображения, встроенный шрифт и систему меню. А приведённая ниже оригинальная программа имеет текстовый диалоговый интерфейс. PROGRAM LISTING 0010 REM- HUNT THE WUMPUS 0015 REM: BY GREGORY YOB 0020 PRINT "INSTRUCTIONS (Y-N)"; 0030 INPUT I$ 0040 IF I$="N" THEN 52 0050 GOSUB 1000 0052 REM- ANNOUNCE WUMPUSII FOR ALL AFICIONADOS ... ADDED BY DAVE 0054 PRINT 0056 PRINT " ATTENTION ALL WUMPUS LOVERS!!!" 0058 PRINT " THERE ARE NOW TWO ADDITIONS TO THE WUMPUS FAMILY"; 0060 PRINT " OF PROGRAMS." 0062 PRINT 0064 PRINT " WUMP2: SOME DIFFERENT CAVE ARRANGEMENTS" 0066 PRINT " WUMP3: DIFFERENT HAZARDS" 0067 PRINT 0068 REM- SET UP CAVE (DODECAHEDRAL NODE LIST) 0070 DIM S(20,3) 0080 FOR J=1 TO 20 0090 FOR K=1 TO 3 0100 READ S(J,K) 0110 NEXT K 0120 NEXT J 0130 DATA 2,5,8,1,3,10,2,4,12,3,5,14,1,4,6 0140 DATA 5,7,15,6,8,17,1,7,9,8,10,18,2,9,11 0150 DATA 10,12,19,3,11,13,12,14,20,4,13,15,6,14,16 0160 DATA 15,17,20,7,16,18,9,17,19,11,18,20,13,16,19 0170 DEF FNA(X)=INT(20*RND(0))+1 0180 DEF FNB(X)=INT(3*RND(0))+1 0190 DEF FNC(X)=INT(4*RND(0))+1 0200 REM-LOCATE L ARRAY ITEMS 0210 REM-1-YOU,2-WUMPUS,3&4-PITS,5&6-BATS 0220 DIM L(6) 0230 DIM M(6) 0240 FOR J=1 TO 6 0250 L(J)=FNA(0) 0260 M(J)=L(J) 0270 NEXT J 0280 REM-CHECK FOR CROSSOVERS (IE L(1)=L(2),ETC) 0290 FOR J=1 TO 6 0300 FOR K=J TO 6 0310 IF J=K THEN 330 0320 IF L(J)=L(K) THEN 240 0330 NEXT K 0340 NEXT J 0350 REM-SET# ARROWS 0360 A=5 0365 L=L(1) 0370 REM-RUN THE GAME 0375 PRINT "HUNT THE WUMPUS" 0380 REM-HAZARD WARNINGS & LOCATION 0390 GOSUB 2000 0400 REM-MOVE OR SHOOT 0410 GOSUB 2500 0420 GOTO O OF 440,480 0430 REM-SHOOT 0440 GOSUB 3000 0450 IF F=0 THEN 390 0460 GOTO 500 0470 REM-MOVE 0480 GOSUB 4000 0490 IF F=0 THEN 390 0500 IF F>0 THEN 550 0510 REM-LOSE 0520 PRINT "HA HA HA - YOU LOSE!" 0530 GOTO 560 0540 REM-WIN 0550 PRINT "HEE HEE HEE - THE WUMPUS'LL GETCHA NEXT TIME!!" 0560 FOR J=1 TO 6 0570 L(J)=M(J) 0580 NEXT J 0590 PRINT "SAME SET-UP (Y-N)"; 0600 INPUT I$ 0610 IF I$#"Y" THEN 240 0620 GOTO 360 1000 REM-INSTRUCTIONS 1010 PRINT "WELCOME TO 'HUNT THE WUMPUS'" 1020 PRINT " THE WUMPUS LIVES IN A CAVE OF 20 ROOMS. EACH ROOM" 1030 PRINT "HAS 3 TUNNELS LEADING TO OTHER ROOMS. (LOOK AT A" 1040 PRINT "DODECAHEDRON TO SEE HOW THIS WORKS-IF YOU DON'T KNOW" 1050 PRINT "WHAT A DODECAHEDRON IS, ASK SOMEONE)" 1060 PRINT 1070 PRINT " HAZARDS:" 1080 PRINT " BOTTOMLESS PITS - TWO ROOMS HAVE BOTTOMLESS PITS IN THEM" 1090 PRINT " IF YOU GO THERE, YOU FALL INTO THE PIT (& LOSE!)" 1100 PRINT " SUPER BATS - TWO OTHER ROOMS HAVE SUPER BATS. IF YOU" 1110 PRINT " GO THERE, A BAT GRABS YOU AND TAKES YOU TO SOME OTHER" 1120 PRINT " ROOM AT RANDOM. (WHICH MIGHT BE TROUBLESOME)" 1130 PRINT 1140 PRINT " WUMPUS:" 1150 PRINT " THE WUMPUS IS NOT BOTHERED BY THE HAZARDS (HE HAS SUCKER" 1160 PRINT " FEET AND IS TOO BIG FOR A BAT TO LIFT). USUALLY" 1170 PRINT " HE IS ASLEEP. TWO THINGS WAKE HIM UP: YOUR ENTERING" 1180 PRINT " HIS ROOM OR YOUR SHOOTING AN ARROW." 1190 PRINT " IF THE WUMPUS WAKES, HE MOVES (P=.75) ONE ROOM" 1200 PRINT " OR STAYS STILL (P=.25). AFTER THAT, IF HE IS WHERE YOU" 1210 PRINT " ARE, HE EATS YOU UP (& YOU LOSE!)" 1220 PRINT 1230 PRINT " YOU:" 1240 PRINT " EACH TURN YOU MAY MOVE OR SHOOT A CROOKED ARROW" 1250 PRINT " MOVING: YOU CAN GO ONE ROOM (THRU ONE TUNNEL)" 1260 PRINT " ARROWS: YOU HAVE 5 ARROWS. YOU LOSE WHEN YOU RUN OUT." 1270 PRINT " EACH ARROW CAN GO FROM 1 TO 5 ROOMS. YOU AIM BY TELLING" 1280 PRINT " THE COMPUTER THE ROOM#S YOU WANT THE ARROW TO GO TO." 1290 PRINT " IF THE ARROW CAN'T GO THAT WAY (IE NO TUNNEL) IT MOVES" 1300 PRINT " AT RAMDOM TO THE NEXT ROOM." 1310 PRINT " IF THE ARROW HITS THE WUMPUS, YOU WIN." 1320 PRINT " IF THE ARROW HITS YOU, YOU LOSE." 1330 PRINT 1340 PRINT " WARNINGS:" 1350 PRINT " WHEN YOU ARE ONE ROOM AWAY FROM WUMPUS OR HAZARD," 1360 PRINT " THE COMPUTER SAYS:" 1370 PRINT " WUMPUS- 'I SMELL A WUMPUS'" 1380 PRINT " BAT - 'BATS NEARBY'" 1390 PRINT " PIT - 'I FEEL A DRAFT'" 1400 PRINT "" 1410 RETURN 2000 REM-PRINT LOCATION & HAZARD WARNINGS 2010 PRINT 2020 FOR J=2 TO 6 2030 FOR K=1 TO 3 2040 IF S(L(1),K)#L(J) THEN 2110 2050 GOTO J-1 OF 2060,2080,2080,2100,2100 2060 PRINT "I SMELL A WUMPUS!" 2070 GOTO 2110 2080 PRINT "I FEEL A DRAFT" 2090 GOTO 2110 2100 PRINT "BATS NEARBY!" 2110 NEXT K 2120 NEXT J 2130 PRINT "YOU ARE IN ROOM "L(1) 2140 PRINT "TUNNELS LEAD TO "S(L,1);S(L,2);S(L,3) 2150 PRINT 2160 RETURN 2500 REM-CHOOSE OPTION 2510 PRINT "SHOOT OR MOVE (S-M)"; 2520 INPUT I$ 2530 IF I$#"S" THEN 2560 2540 O=1 2550 RETURN 2560 IF I$#"M" THEN 2510 2570 O=2 2580 RETURN 3000 REM-ARROW ROUTINE 3010 F=0 3020 REM-PATH OF ARROW 3030 DIM P(5) 3040 PRINT "NO. OF ROOMS(1-5)"; 3050 INPUT J9 3060 IF J9<1 OR J9>5 THEN 3040 3070 FOR K=1 TO J9 3080 PRINT "ROOM #"; 3090 INPUT P(K) 3095 IF K <= 2 THEN 3115 3100 IF P(K) <> P(K-2) THEN 3115 3105 PRINT "ARROWS AREN'T THAT CROOKED - TRY ANOTHER ROOM" 3110 GOTO 3080 3115 NEXT K 3120 REM-SHOOT ARROW 3130 L=L(1) 3140 FOR K=1 TO J9 3150 FOR K1=1 TO 3 3160 IF S(L,K1)=P(K) THEN 3295 3170 NEXT K1 3180 REM-NO TUNNEL FOR ARROW 3190 L=S(L,FNB(1)) 3200 GOTO 3300 3210 NEXT K 3220 PRINT "MISSED" 3225 L=L(1) 3230 REM-MOVE WUMPUS 3240 GOSUB 3370 3250 REM-AMMO CHECK 3255 A=A-1 3260 IF A>0 THEN 3280 3270 F=-1 3280 RETURN 3290 REM-SEE IF ARROW IS AT L(1) OR L(2) 3295 L=P(K) 3300 IF L#L(2) THEN 3340 3310 PRINT "AHA! YOU GOT THE WUMPUS!" 3320 F=1 3330 RETURN! 3340 IF L#L(1) THEN 3210 3350 PRINT "OUCH! ARROW GOT YOU!" 3360 GOTO 3270 3370 REM-MOVE WUMPUS ROUTINE 3380 K=FNC(0) 3390 IF K=4 THEN 3410 3400 L(2)=S(L(2),K) 3410 IF L(2)#L THEN 3440 3420 PRINT "TSK TSK TSK- WUMPUS GOT YOU!" 3430 F=-1 3440 RETURN 4000 REM- MOVE ROUTINE 4010 F=0 4020 PRINT "WHERE TO"; 4030 INPUT L 4040 IF L<1 OR L>20 THEN 4020 4050 FOR K=1 TO 3 4060 REM- CHECK IF LEGAL MOVE 4070 IF S(L(1),K)=L THEN 4130 4080 NEXT K 4090 IF L=L(1) THEN 4130 4100 PRINT "NOT POSSIBLE -"; 4110 GOTO 4020 4120 REM-CHECK FOR HAZARDS 4130 L(1)=L 4140 REM-WUMPUS 4150 IF L#L(2) THEN 4220 4160 PRINT "...OOPS! BUMPED A WUMPUS!" 4170 REM-MOVE WUMPUS 4180 GOSUB 3380 4190 IF F=0 THEN 4220 4200 RETURN 4210 REM-PIT 4220 IF L#L(3) AND L#L(4) THEN 4270 4230 PRINT "YYYIIIIEEEE . . . FELL IN PIT" 4240 F=-1 4250 RETURN 4260 REM-BATS 4270 IF L#L(5) AND L#L(6) THEN 4310 4280 PRINT "ZAP--SUPER BAT SNATCH! ELSEWHEREVILLE FOR YOU!" 4290 L=FNA(1) 4300 GOTO 4130 4310 RETURN 5000 END Использованы материалы "Википедии" и страницы "Hunt The Wumpus" (BASIC computer game, genesis of Wumpus, history), The Best of Creative Computing Vol. 1 (1976). |
||||||||||||||||||||
НПП "СЕМИКО" (383) 271-01-25 (многоканальный) |