ZX-Ревю 1994 №3 1993 г.

Adventure games - Блеск и Нищита Пятого Поколения или Ностальгия по Прошлому.


ОТ РЕДАКЦИИ

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

Конечно, мы не имеем в виду, что Вы за пару дней освоите G.A.C. и сразу создадите некий шедевр, от которого все будут без ума. Попробуйте понять нас правильно и сделать для себя правильные выводы, а мы обратимся

к фактам и предлагаем Вам прочитать следующую статью в этом выпуске ZX-РЕВЮ.

* * *

туштш

тш

Эта статья подготовлена одновременно для трех изданий: PC-REVIEW, ZX-РЕВЮ и для электронного журнала SPECTROFON. Правда, для каждого из этих изданий версии статьи незначительно отличаются, т.к. у читателей этих разных изданий - разная предыстория. Наиболее полный текст - здесь, в "ZX-РЕВЮ ".

Блеск и Нищита Пятого Поколения или Ностальгия по Прошлому.

© Сергей Симонович, 1994.

1. Введение.

Занимаясь исследованием игр жанра "Adventure", мы выделили четыре основных этапа их эволюции. Этому вопросу была посвящена статья "Adventure Games: Эволюция Интерфейса". В настоящий момент вполне можно говорить и о пятом этапе - интерактивном видео. Во всяком случае, такие программы, как "7-th Guest" и "11-th Hour" уже не укладываются в обычное представление о компьютерных играх.

Для тех, кто не знаком с нашими предыдущими исследованиями, напомним кратко основные положения.

1-ое поколение.

Игры исключительно текстового содержания. Графика в них не использовалась по чисто техническим соображениям. 0сновными задачами пользователя были:

• установление диалога с машиной;

• исследование словарного запаса программы;

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

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

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

2-ое поколение.

Ранняя графика в адвентюрных играх носила иллюстративный характер. И хотя она имела примитивный вид (векторная графика с заливкой) и не занимала много места, уже тогда у нее появились противники, предсказывавшие "закат жанра". Первые дискуссии о целесообразности применения графики в адвентюрах относятся к 1983-1984 годам и, как и следовало ожидать, сторонники графики победили. Их основной аргумент был: "Ничего в этом страшного нет, поскольку с одной стороны игры становятся привлекательнее, а расход памяти на графику компенсируется тем, что можно сэкономить на текстовом описании локаций".

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

3-е поколение.

Дальнейшее развитие графических средств дало основу для дальнейшего прогресса. Прежде всего, с появлением высокого разрешения и поддержкой манипуляторов типа "мышь" появились интерактивные интерфейсы. Теперь героям не надо было давать команды типа "GO NORTH". Достаточно было ткнуть мышкой в верхнюю часть экрана и нажать левую кнопку и герой отправлялся по заданному маршруту. Отпала необходимость и в описании локаций. Пройдясь "мышкой" по экрану и "перещелкав" все нарисованные на экране объекты, можно было получить сообщения о том, что это такое: "Это шкаф., это стул., это дверь, и т.п.

4-ое поколение.

С началом девяностых годов те адвентюры, к которым мы привыкли много лет назад, практически полностью перестали существовать. Забота программистов об упрощении интерфейса привела к тому, что все управление игрой выполняется "мышью" с двумя кнопками. От всего многообразия глаголов, ранее использовавшихся в играх, остались только: GO TO, TAKE, GIVE, TALK TO, USE. Научились даже обходиться без команды DROP. Все многообразие жизненных ситуаций "вогнали" в одну команд USE. Принять аспирин - USE ASPIRIN. Открыть дверь - USE KEY ON DOOR. Застрелить инопланетянина - USE LASER ON ALIEN. Даже для того, чтобы заправить автомобиль бензином, достаточно сначала сделать USE шлангу на автомобиль, а потом USE бензину на шланг.

Конечно, играть стало проще, но ведь при этом была утрачена конечная цель первых классических адвентюр -"УСТАНОВЛЕНИЕ КОНТАКТА С ПРОГРАММОЙ И ИССЛЕДОВАНИЕ ЕЁ СЛОВАРЯ".

Ах, если бы знали гениальные программисты из фирмы LEVEL 9, которые в 1984-м году писали адвентюры, способные распознавать и адекватно реагировать на 1000 слов, что через десять лет их потомки будут обходиться пятью командами!!! Вам это не напоминает Эллочку Щукину (см. И.Ильф, Е.Петров "Двенадцать стульев"), словарный запас которой был беднее, чем у людоеда из племени Мумбу-Юмбу и которая вполне обходилась во всех случаях жизни тридцатью словами?

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

Все чаще и все шире логическое решение заменяют иным, например аркадным. Приведем пример из программы "Indiana Jones and the Fate of Atlantis" (фирма Lucasarts - лучший производитель адвентюр на сегодняшний день).

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

■ выключить свет;

■ надеть на голову простыню;

■ включить фонарик и изобразить из себя привидение;

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

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

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

Пятое поколение.

А жизнь, между тем продолжается, и дальнейшее развитие аппаратных средств ведет к тому, что сегодняшние адвентюрные игры разрабатывают уже в концепции "мультимедиа". Что это означает? Прежде всего, широкое внедрение современных звуковых и видео-технологий. Современная адвентюра типа "7-th Guest" - это получасовой интерактивный видеофильм. Разумеется, такие игры распространяют на лазерных дисках. Чтобы записать эту игру на обычных дискетах DS/DD потребовалось бы 3000 дискет (более 1 Гигабайта). Это количество, которое с трудом можно перевезти на "Жигулях".

К озвучиванию игр привлекают профессиональных актеров. Для той же игры "Indiana Jones and the Fate of Atlantis" в версии для CD-ROM были приглашены 50 исполнителей. Звук и музыка стали как бы неотъемлемыми атрибутами игр. И если теперь Ваш герой идет по бетонным плитам, то его каблуки цокают совсем не так, как на скрипучих досках заброшенного замка.

2. Ностальгия по прошлому.

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

Но, с другой стороны, почему бы и не отделить злаки от плевел и не понять, что прогресс - прогрессом, а адвентюры - адвентюрами. Пусть прогресс развивается, как ему положено, но зачем же игры-то доводить до уровня Эллочки Щукиной? В конце концов, если кому-то трудно работать с программой, интеллект которой выше, чем несколько слов, для него ведь есть видеоприствки типа "Денди", "SEGA", "NINTENDO" и еще десяток разных других наименований.

Вернемся к ранним адвентюрам. Само понятие ADVENTURE переводится как ПРИКЛЮЧЕНИЕ (ПУТЕШЕСТВИЕ). В этих играх Вы, то есть герой, оказываетесь в некотором новом для себя мире и должны исследовать законы, которые этим миром управляют, а во-вторых, должны сами научиться управлять этими законами. Основная побудительная сила, которая ведет Вас от локации к локации - это жажда познания, желание узнать, а что же там, за этой дверью, что за этим поворотом, что будет, если отсюда пойти не на юг, а на север.

Именно эти же самые мотивы двигали и Магелланом и Колумбом и доктором Ливингстоном и хорошо известным у нас путешественником Пржевальским. Они тоже шли по неизвестной для себя местности и изучали, изучали ... изучали. Они изучали среду, людей, языки. От привала к привалу (от локации к локации) они двигались шаг за шагом, каждый раз находя новых проводников и где жестами, а где еще как-то налаживали с ними контакт.

Вы чувствуете, как характер ADVENTURE закладывался в ранних играх, как ИССЛЕДОВАНИЕ ПРОСТРАНСТВА И УСТАНОВЛЕНИЕ КОНТАКТА?

Что мы имеем теперь? Прекрасные интерактивные красочные и озвученные игры, но причем здесь ADVENTURE? Они так же близки к ADVENTURE, как клуб кинопутешественников, к реальным путешествиям в джунглях Амазонии. Конечно, приятно управлять интерактивным фильмом и направлять героя хочешь направо, а хочешь налево, но если честно, то тогда самой интерактивной игрой можно было бы назвать многоканальный телевизор с пультом дистанционного управления. Хочешь, включил мультик, а хочешь - футбол. Можешь новости включить или заседание парламента, а не понравится депутат - выключи его! ОТЛИЧНАЯ ИНТЕРАКТИВНАЯ ИГРА. Только где в ней ИССЛЕДОВАНИЕ неизведанного пространства?

3. Что из всего этого следует?

Критиковать, как известно, просто, а вот предложить позитивное решение - тоже, наверное надо. И оно не за горами. Ведь с чем мы имеем сейчас дело: фактически проблема сводится к тому, что НА НЫНЕШНЕМ РЫНКЕ

ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ освободилась значительная ниша, которую без особых проблем и без многомиллионных (в долларах) затрат в состоянии занять энергичная фирма, под крылом которой есть талантливые сценаристы и писатели. Правда, в настоящее время таких людей еще поискать надо. Но они есть, просто никто пока об этом не думал. Мы ведь живем в России, где удельный вес интеллигенции высок, как нигде в мире. Нас с Вами окружают миллионы учителей, инженеров, студентов, работников научно-исследовательских учреждений. И если хотя бы сотая доля процента из них в свободное от основной работы время приложила бы усилия к созданию интересных сценариев, то индустрию этого направления можно было бы поднять до мирового уровня за пару лет.

Мы не выдумали "ностальгию" по классическим адвентюрам. Она реально существует и не у нас, а в мире. Сейчас об этом начинают писать зарубежные журналы. (Невероятно, но факт - только начинают!!!). Можно даже считать и так, что в большей мере эта ностальгия существует в Европе, чем в Америке. Американцы как-то быстро шагнули от 8-разрядных "Эпплов" к 16-тиразрядным полупрофессиональным IBM-PC и "Макинтошам" и пропустили тот огромный пласт, который переваривала Европа с 82-го по 88-ой год на "Спектрумах", "Коммодорах", "Атари" и "Амстрадах".

Сегодня есть фирма Legend Entertainment, которая успешно продолжает работу в этом направлении. Конечно, все лучшее от современной техники она берет - и графику и звук, но сам дух классической адвентюры воспроизводит прекрасно (см. фрагмент программы на рисунке).

Программы этой фирмы высоко ценятся, считаются трудными, их предпочитают рафинированные интеллектуалы. Эллочке Щукиной такая игра была бы противопоказана. Но, как бы там ни было, а одна фирма погоду в мире не сделает. При всем своем желании ей трудно выпускать более, чем пару программ в год.

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

Да, не удивляйтесь, Россия один из немногих уголков мира, где старина ZX-Spectrum обрел второе дыхание, пережил возрождение (современный "Спектрум" типа "Профи" или "АТМ-Турбо" покруче будет, чем 286-ая IBM PC/AT, хотя бы по цене) и сохранил при себе весь парк классических адвентюр. А ведь в западном мире про них забыли (если еще немного помнят, то только в Англии). А если честно, то и у нас уже многие не знают, что это такое. Спросите современного пользователя IBM-PC, не имевшего опыта жизни со "Спектрумом" о том, что такое адвентюра? Мало кто из них знает об истинном содержании классической адвентюры, поскольку не видел он ни одной ни разу (их там просто нет). Всевозможные "квесты" - не в счет - это уже не то, что мы имеем в виду.

К

9;EEp Mm

¥ou are dangling fron the massiue neck of founder's statue. The view is as stupendous as the perch is precarious. Delouj the ivy-clad halls of campus spread out like a picture book. Beyond, the blue finger of the river stretches west anions the hills toward the congested toners arid smokestacks of Balmoral City, there's a goad chance that you could still climb down off the statue without testing the abilities of the University infirmary.

ШШХМТШш '1ns1'

all

arts section BIP spell blueprint cloak

Сloch Touer DEFLUtill spell dianond

editorial sect

FRIHP spell hill

Ivorytower Hall| ladder

lollipop pack lump of iron ..„-.., , 'me

Apply I> moustache |fi;)|

4. Экономические аспекты.

Россия, как известно, - родина "Тетриса". И это не случайно. Где же еще появляться логическим и активно-логическим играм, как не в России?! Здесь ведь все просто. Все дело в экономике. Современные графические адвентюры и RPG требуют многих тысяч часов трудозатрат художников. Имитаторы - не меньших тысяч часов особоквалифицированных программистов и консультантов-экспертов. И только логические и настольные игры да обучающие программы, ценность которых зависит не от того, сколько художников их рисовали и сколько актеров озвучивали, а прежде всего от оригинальности идеи, да от интеллектуальной ценности содержания, остались доступными для малых коллективов (от одного до пяти человек), не располагающих многомиллионными субсидиями. А именно такими коллективами и живет сейчас Россия ("НИКИТА", "GAMOS Ltd.", "LUNA", "MEDOX" и др.). А сколько сотен программистов работают вообще в-одиночку или в паре?

Для разработки хорошего имитатора или графической адвентюры сейчас на Западе привлекают до 30-50 человек и стоит разработка такой игры до нескольких миллионов долларов. А классические адвентюры - как будто специально созданы для России. Они не требуют ни огромных миллионных затрат, ни раздутых штатов. Все, что для них нужно - только талант сценаристов. Программистские же проблемы не превышают по сложности класс обыкновенных баз данных. Быстродействие не требуется. Аппаратная платформа может быть самой демократичной.

5. С чего начать.

Итак, основной проблемой в адвентюрных играх является талантливый сценарий с оригинальными логическими головоломками, неожиданными ходами и поворотами игры. Что нужно для подготовки всего этого?

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

Нет таких идей, которые нельзя было бы испытать на простейших моделях с помощью того же G.A.C. или системы ABS (Adventure Building System), которую мы давали в ZX-РЕВЮ в конце прошлого года (№ 9-10, стр. 210, № 11-12, стр. 247). Так что думайте, пробуйте, в общем, двигайтесь вперед. Поверьте, не каждый день на мировом рынке появляется неосвоенная ниша для программных продуктов. Западные фирмы тратят громадные деньги, чтобы протолкнуть свой продукт на рынок, а тут рынок жаждет получить продукт, но никто не спешит его производить.

То же и на отечественном рынке. Пришла пора нашим программистам взяться за его освоение (на первых порах хотя бы на "Спектруме", потом можно перейти и на IBM). Как Вы знаете, мы понемногу начинаем дистрибуцию программ отечественных авторов. Время покажет, как дело пойдет, хотя первые мысли уже есть (см. статью "Вопросы дистрибуции" в этом номере "ZX-РЕВЮ").

В общем, перед Вами уникальная возможность начать осваивать новую нишу с тем оборудованием и обеспечением, которое у Вас уже давно есть. Не надо ждать, когда придет богатый дядя с Запада и выдаст Вам десяток тысяч долларов для "раскрутки". Все равно не дождетесь. Не было такого и не будет. Лучше засучить рукава и начать эксперименты. Если все пройдет успешно, то либо Вы сами организуете свою фирму, либо Вас пригласят в процветающую команду. (Отечественные программопроизводители пока еще не преодолели собственных проблем становления и развития, но скоро преодолеют и будут активно искать талантливых сценаристов и game-дизайнеров. Для справки: в четвертом и пятом выпусках PC-REVIEW мы публикуем обширную серию материалов о том, как

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

* * *

Когда верстался номер:

Когда этот материал был уже сверстан, нам стало известно об одном интересном и перспективном проекте, который готовит группа MAT & SHISOFT (издатели электронного журнала "Спектрофон"). Готовится интересная программа под названием "Звездное Наследие" (Star Inheritance). Программа готовится в смешанном жанре ADVENTURE/D&D. Возможно, в ней будут и элементы RPG. До выхода программы в свет еще пройдет несколько месяцев, но её "раскрутку" мы уже начинаем. И начинаем её с небольшой новеллы, которая должна дать Вам первое представление о сюжете будущей программы. А в ближайшее время в "Спектрофоне" появится её демо-версия.

© M.H. Стинов, г. Хабаровск,1994.

Когда невозможно использование калькулятора ZX-Spectrum...

В одну из разрабатываемых программ мне потребовалось включить процедуру, с помощью которой отслеживается количество оставшихся свободных секторов на диске. На первый взгляд это не вызывало особых затруднений, так как я имел некоторое представление об особенностях построения дисковой операционной системы TR-DOS, поэтому пошел стандартным путем: (ниже под NN следует понимать некоторый условный двухбайтный адрес).

1. В HL - начальный адрес области ОЗУ, куда отгружается системная информация с диска. Чаще всего используется область буфера принтера с начальным адресом #5В00 (23296).

2. В DE - соответственно номер дорожки и сектора (ноль и восемь) с системной информацией.

3. В ВС - соответственно количество читаемых секторов (один) и код дисковой операции (#05 для чтения).

4. Аккумулятор очищается 5B LD HL,#5B00

00 LD DE,#0008

01 LD BC,#0105 XOR A

13 3D CALL #3D13

5. Регистровая пара ВС "заряжается" информацией о свободных секторах (байты #Е5 и #Е6) системного

сектора.

6. Устанавливается начальная позиция печати в основном экране с помощью подпрограммы CL-SET (#0DD9). При этом номера колонки и знакоряда, в которых производится печать, помещаются в регистровую пару ВС. Но есть одна особенность: самой левой колонке соответствует константа 33 (#21), а самому верхнему знакоряду константа 24 (#18). Поэтому, если позиция печати X,Y, то в регистре B=>RR=#18-Y, а в С=>СС=#21-Х.

7. В заключение содержимое ВС обрабатывается калькулятором, и результат в десятичной форме выводится на экран:

NN+13 DD 21 E5 5B LD IX,#5BE5

NN+17 DD 4E 00 LD C, (IX)

NN+20 DD 46 01 LD B,(IX+1)

NN+23 C5 PUSH BC

NN+24 01 CC RR LD BC,#RRCC

NN+2 7 CD D9 0D CALL #0DD9 NN+30 C1 POP BC

NN+31 CD 2B 2D CALL #2D2B NN+34 CD E3 2D CALL #2DE3 NN+37 C9 RET

Программа с вышеуказанной процедурой работала достаточно хорошо, но.

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

Я все же привел её в порядок, но для этого потребовалось полностью отказаться от услуг встроенного калькулятора. Я попросту добавил собственные подпрограммы. Позитивным результатом работы стала не только

вполне работоспособная программа, но и следующее правило._

Использование встроенного калькулятора ZX-Spectrum во вновь разрабатываемых программах в машинных кодах возможно только тогда, когда верхний адрес калькуляторного стека STKBOT (расположен по адресам 5С63Н и 5С64Н) находится ниже системного адреса RAMTOP (по адресам 5СВ2Н и 5СВ3Н), а между RAMTOP и STKBOT - достаточный промежуток.

Это не касается BASIC-программ, так как при ином раскладе работа BASIC-системы делается немыслимой.

Увы, при всем анархизме, присущем нашим хакерам, приходится подчиняться правилам игры, установленным сэром Клайвом Синклером.

Что же касается подпрограмм, позволяющих исключить калькулятор, то ввиду ограниченности "наличных ресурсов" (я мог рассчитывать только на 4 кБайта экранной области ОЗУ) они, в целях минимизации потребной памяти, написаны в упрощенном виде. Тем не менее, этого оказалось вполне достаточно, так как, во-первых максимальное обрабатываемое число не может превышать 2544 (или немного более - максимальное количество секторов с двойной плотностью), то-есть можно ограничиться четырьмя десятичными разрядами. Во-вторых, мы имеем дело только с целыми положительными числами.

Текст подпрограммы HEX/DEC, переводящей 16-тиричную форму количества свободных секторов в десятичную приведен в Листинге_1.

Алгоритм работы программы крайне прост и сводится к подсчету целого числа десятков тысяч (10000 => #2710), тысяч (1000 => #03Е8), сотен (100 => #0064), десятков (10 => 000А) и единиц, составляющих 16-ричный адрес в регистре ВС.

Теперь исходная процедура изменится, начиная с адреса NN+23 (Листинг_2).

В Листинге_1 подпрограмма HEX/DEC организована с адреса С000Н, но она может быть размещена в любой области ОЗУ, то-есть C000H мной был выбран для хранения её в личной библиотеке стандартных процедур в виде текстового файла (C000H расположен значительно выше ассемблера GENS-4D).

NN+0 NN+3 NN+6 NN+9 NN+10

21 11 01 AF

CD

00

05

В Листинге_3 привожу текст процедуры, выполняющей обратную задачу, то-есть сводящей пятиразрядное десятичное число в регистровую пару. При этом происходит преобразование DEC/HEX, то-есть число в регистровой паре представляется в 16-ричной форме.

Листинг_1.

HiSoft GEN Assembler ZX Spectrum 1990 MOA B-Disk version Copyright (C) HiSoft 1987 V4.1 All rights reserved

*************************************

* (C) SpySoft PROGRAM "HEX/DEC" *

* Written by M.N.Stinov *

* KHABAROVSK - 1992 * *************************************

Pass 1 errors:

00 10 20 30 40 50

C000

70

ORG

#C000

C000

C5

80 H_D

PUSH

BC

C001

E1

90

POP

HL

C002

010000

100

LD

DC,#0000

C005

C5

110

PUSH

BC

C006

111027

120

LD

DE,#2710

C009

A7

130

ALD

A

C00A

ED52

140 L1

SBC

HL, DE

C00C

0C

150

INC

C

C00D

30FB

160

JR

NC, L1

C00F

ED5A

170

ADC

HL, DE

C011

0D

180

DEC

C

C012

11E803

190

LD

DE,#03EB

C015

ED52

200 L2

SBC

HL, DE

C017

04

210

INC

B

C018

30FB

220

JR

NC, L2

C01A

ED5A

230

ADC

HL, DE

C01C

05

240

DEC

B

C01D

ED433FCO

250

LD

(CHAR),BC

C021

C1

260

POP

BC

C022

116400

270

LD

DE,#0064

C025

ED52

280 L3

SBC

HL, DE

C027

0C

290

INC

C

C028

30FB

300

JR

NC, L3

C02A

ED5A

310

ADC

HL, DE

C02C

0D

320

DEC

C

C02D

110A00

330

LD

DE,#00 0A

C030

ED52

340 L4

SBC

HL, DE

C032

04

350

INC

B

C033

30FB

360

JR

NC, L4

C035

19

370

ADD

HL, DE

CO36

05

380

DEC

B

CO37

ED4 341C0

390

LD

(CHAR+2) ,:

CO3B

2243C0

400

LD

(CHAR+4) ,:

CO3E

C9

410

RET

C03F

00000000

420 CHAR

DEFW

0000,0000

Pass

2 errors:

00

CHAR

C03F

H_D

C000

L1

C00A

L2

C015

L3

C025

L4

C030

Table used:

70 from

183

Листинг 2.

CALL H_D ;вызов HEX/DEC

RES 0, (IY + 2) ;открыть канал "S"

LD BC,#RRCC ;RR=#18-Y, CC=#21-X

NN+23 CD 00 C0 NN+2 6 FD CB 02 8 6 NN+30 01 CC RR

NN+33

CD

D9

0D

CALL

# 0DD 9

NN+3 6

21

3F

C0

LD

HL,CHAR

NN+3 9

06

05

LD

B, #05

NN+41

7E

LOOP LD

A,(HL)

NN+42

C6

30

ADD

A, #30

NN+44

D7

RST

#10

NN+45

23

INC

HL

NN+4 6

10

F9

DJNZ

LOOP

NN+4 8

C9

RET

Copyright (C) HiSoft 1987 V4.1 All rights reserved

выполнить AT y,x 5 разрядов (десятичных) CHR$ - код цифры

Листинг_3.

Pass 1 errors:

*************************************

* (C) SpySoft PROGRAM "DEX/HEC" *

* Written by M.N.Stinov *

* KHABAROVSK - 1992 * *************************************

C000

70

ORG

#C000

C000

2122C0

80 D

_H

LD

HL,CHAR

C003

110000

90

LD

DE,#0000

C006

0605

100

LD

B, #05

C008

7E

110

LOOP

LD

A,(HL)

C009

E60F

120

AND

#0F

C00B

4F

130

LD

C,A

C00C

E5

140

PUSH

HL

C00D

EB

150

EX

DE, HL

C00E

29

160

ADD

HL, HL

C00F

E5

170

PUSH

HL

C010

D1

180

POP

DE

C011

29

190

ADD

HL, HL

C012

29

200

ADD

HL, HL

C013

19

210

ADD

HL, DE

C014

59

220

LD

E, C

C015

1600

230

LD

D, #00

CO17

19

240

ADD

HL, DE

C018

EB

250

EX

DE, HL

C019

E1

260

POP

HL

C01A

23

270

INC

HL

CO1B

10EB

280

DJNZ

LOOP

C01D

EB

290

EX

DE, HL

CO1E

2222CO

300

LD

(CHAR),HL

C021

C9

310

RET

C022

00000000

320

CHAR

DEFW

0000,0000,0000

Pass 2 errors: 00

CHAR C022 D_H C000

LOOP C008

Table used: 45 from 166

Процедура (Листинг_3) достаточно проста и не требует комментариев. Здесь я ничего нового не предлагаю, создано достаточное количество преобразователей DEC/HEX, отличающихся разве что последовательностью умножения на 10 и используемыми регистровыми парами. Однако приводимый вариант очень прост (соответственно занимает меньше памяти), так как исключена обработка знакового разряда. Как уже говорилось, мы имеем дело только с целыми положительными числами.

В заключение следует отметить, что для обеих процедур поле констант CHAR общее, но в одном случае оно используется при вводе десятичных чисел с клавиатуры с последующим преобразованием DEC/ HEX, а во втором случае - для хранения (с последующим выводом на печать) десятичных чисел в результате преобразования HEX/DEC. Кроме того, все, что здесь предлагается, может быть использовано только для некоторых конкретных программ и не может рассматриваться даже близкой альтернативой мощному встроенному калькулятору ZX-Spectrum с набором из 66 программ.

Некоторые приемы повышения эффективности машинного кода.

Предлагаемая здесь информация - это некоторые идеи более эффективного программирования на ассемблере для ZX-Spectrum. Они не являются результатом заимствования из какого-либо источника. Скорее, это результат "вскрытия", "декодирования", аналитического исследования и обобщения информации из ряда современных фирменных системных программ, плюс результаты собственных разработок.

00 10 20 30 40 50

При написании достаточно емких ассемблерных программ для компьютеров ZX-Spectrum, многие наверняка сталкивались с тем, что в ряде программ отдельные процедуры отличаются друг от друга подчас в очень незначительных деталях. Если при этом сами процедуры велики по объему, то остается сожалеть о тех косвенных потерях оперативной памяти компьютера, которые при этом возникают. Здесь понятие "процедура" имеет более широкое толкование, чем "подпрограмма", так как процедура может включить в себя целый ряд подпрограмм, объединенных общим функциональным назначением (например, процедура вывода символа на экран, процедура скроллирования экрана и т.д. включают в себя ряд подпрограмм). Вместе с тем, в отдельных случаях понятия "процедура" и " подпрограмма" могут и совпадать. Очевидно избежать подобных потерь, то-есть сделать программы более компактными и простыми, возможно за счет перестройки внутренних состояний самих процедур в зависимости от условий решаемой задачи. Конечно, имеют смысл только такие перестроения, которые требуют существенно меньшего объема дополнительной памяти по сравнению с объемом, занимаемым самой процедурой.

Для того, чтобы понять смысл сказанного, удобнее всего рассматривать процедуру в виде некоего гипотетического процессора p, имеющего i - входов (X1, X2, ... Xi), j - выходов (Y1, Y2, ... Yj) и k - шин управления (S1, S2, ... Sk), c помощью которых в зависимости от задачи устанавливаются внутренние переключатели процессора (см.рисунок).

X

Si Sji ! Sh

i i " " + + "

Xi .

Yi

-----i

-----i

Xl .

Y: >

-----

-----

Yh

Y

Для каждого конкретного положения переключателей процессор p имеет вполне определенный вход и один или несколько выходов, то есть по-существу переключатели коммутируют входы и выходы. Реально в качестве переключателей чаще всего используются системные флаги, хотя подчас ими могут становиться и некоторые константы, устанавливаемые в регистрах перед входом в процедуру. Не исключается возможность применения сочетаний системных флагов и констант.

Под системные флаги на этапе разработки программы отводится одна (в случае необходимости и несколько) ячейка памяти, каждый из восьми битов которой в сущности является одиночным переключателем S^ включенным -если бит установлен, и выключенным - если бит сброшен. При этом количество возможных комбинаций битов для одной ячейки составит 256, что соответствует максимально возможному количеству внутренних состояний гипотетического процессора. Итак, перед вызовом процедуры следует таким образом замаскировать биты (установить флаги) в системной ячейке памяти, чтобы получить в процедуре необходимую комбинацию переключателей.

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

1. При вводе десятичных значений начального и стартового адреса, а также длины файла. Во всех случаях вводимый код - это блок из пяти десятичных символов. Завершение ввода очередного блока и переход на следующую позицию печати происходит только после ввода всех пяти символов. Ограничить количество символов в блоке, например с помощью <ENTER>, невозможно.

2. При формировании заголовка файла в случае работы с магнитной лентой. При этом заголовок может содержать от одного до десяти любых символов. Выход из процедуры происходит либо по команде <ENTER> (если введен хотя бы один символ), либо после ввода десятого символа.

3. При формировании заголовка файла в случае работы с диском. Заголовок может содержать от одного до восьми произвольных символов. Все остальное - как и в предыдущем пункте.

Итак, в процессе использования процедуры опроса клавиатуры во-первых требуется установить необходимую константу переполнения #05, #0A или #08 соответственно для первого, второго и третьего случая, а во-вторых: в 1-м случае - блокируется ключ <ENTER> и ограничиваются коды вводимых символов только цифровым полем, во 2-м и 3-м случаях допускается ввод любого символа при разблокированном <ENTER>. Все необходимые коммутации реализуются за счет двух системных флагов:

С помощью первого:

S флаг сброшен, блокируется <ENTER> и допускается ввод только цифрового кода;

S флаг установлен, нет ограничений на вводимый код, <ENTER> разблокируется.

С помощью второго:

S флаг сброшен, разрешается работа с магнитной лентой;

S флаг установлен - работа с дисковым накопителем. При этом обязательно вызывается подпрограмма

контроля свободного пространства на дискете.

Под системные флаги задействована базовая (начальная) ячейка системной области программы, её адрес установлен в индексном регистре IX. Первый флаг - это бит 0 в ячейке (IX), второй флаг это бит 2 в ячейке (IX). Собственно BOARD - процедура опроса клавиатуры, включает в себя подпрограммы: CURSOR - вывод мерцающего курсора в позицию печати; SOUND - выдача звукового сигнала при нажатии клавиши.

Ниже производится листинг процедуры BOARD (Листинг_4) вместе со всеми входящими в нее подпрограммами.

Листинг_4.

HiSoft GEN Assembler ZX Spectrum 1990 MOA B-Disk version. Copyright (C) Hisoft 1987 V4.1 All rights reserved Pass 1 errors: 00

10 ******************************************* 20 * Copyright (C) SpySoft KHABAROVSK-1993 * 30 * - Compression RAM - Written By M.Stinov * 40 ******************************************* 50

4800

60

ORG

#4800

4982

D9

1660

SOUND

EXX

альтернативный блок

4983

218000

1670

LD

HL,#0080

длительность звучания

4986

111616

1680

LD

DE,#1616

высота тона

4989

7B

1690

L9

LD

A, E

активный полупериод

498A

CB984 9

1700

CALL

TONE ;

498D

7A

1710

LD,

A, D

пассивный полупериод

498E

CD9849

1720

CALL

TONE ;

4991

2D

1730

DEC

HL

длительность уменьшить

4992

7C

1740

LD

A, H

4993

B5

1750

OR

L

достигла ли нуля?

4994

20F3

1760

JR

NZ,L9

нет - продолжить.

4996

D9

1770

EXX

основной блок

4997

C9

1780

RET

4998

47

1790

TONE

LD

B, A

перенести в счетчик

4999

3E00

1800

TO

LD

A, #00

пауза в звуке

499B

F5

1810

PUSH

AF

4 99C

2F

1820

CPL

для активного полупериода

4 99D

E610

1830

AND

#10 ;

маскировка бита "ТАРЕ"

499F

4F

1840

LD

C,A ;

и сохранить

4 9A0

3AFF5A

1850

LD

A,(#5AFF)

атрибуты экрана

4 9A3

E638

1860

AND

#38 ;

маскировка битов "PAPER"

4 9A5

OF

1870

RRCA

4 9A6

OF

1880

RRCA

эти же биты - в "BORDER"

4 9A7

OF

1890

RRCA

4 9A8

B1

1900

OR

C

соединить с битом "TAPE"

4 9A9

D3FE

1910

OUT

(#FE),A

вывод "BORDER" и "SOUND"

4 9AB

10FE

1920

L10

DJNZ

L10 ;

задержка (длительность)

4 9AD

F1

1930

POP

AF

4 9AE

2F

1940

CPL

осуществляется чередо

4 9AF

32 9A4 9

1950

LD

(TO+1),A

вание "активный"-"пауза"

4 9B2

C9

1960

RET

4 9B3

C5

1970

BOARD

PUSH

BC

константы переполнения

4 9B4

3E2A

1980

L6

LD

A, #2A

код курсора

49B6

CD274A

1990

CALL

CURSOR ;

49B9

CB1A4A

2000

CALL

PRESS ;

4 9BC

#A085C

2010

LD

A, (#5C08)

код нажатой клавиши

4 9BF

FE80

2020

CP

#80 ;

исключить коды токенов

49C1

30F1

2030

JR

NC, L 6

49C3

FE08

2040

CP

#08 ;

код "курсора влево"?

49C5

2823

2050

JK

Z, DEL

да - удалить символ

49C7

FE0D

2060

CP

#0D

код <ENTER>?

4 9C9

2832

2070

JR

Z, ENT

да - на обработку

4 9CB

DDCB0046

2080

BIT

0, (IX)

первый флаг?

4 9CF

2008

2090

JR

NZ, L7

49D1

FE3A

2100

CP

#3A

4 9D3

30DF

2110

JR

NC, L 6

4 9D5

FE30

2120

CP

#30

4 9D7

38DB

2130

JR

C, L6

4 9D9

FE20

2140

L7

CP

#20

4 9DB

38D7

2150

JB

C, L6

4 9DD

12

2160

LD

(DE),A

4 9DE

CD274A

2170

CALL

CURSOR

49E1

CD8249

2180

CALL

SOUND

49E4

13

2190

INC

DE

49E5

24

2200

INC

H

49E6

C1

2210

POP

BC

49E7

10 СА

2220

DJNZ

BOARD

49E9

C9

2230

RET

4 9EA

C1

2240

DEL

POP

BC

4 9EB

79

2250

LD

A, C

4 9EC

90

2260

SUB

B

4 9ED

2 8C4

2270

JR

Z,BOARD

4 9EF

3E20

2280

LD

A, #20

49F1

12

2290

LD

(DE),A

4 9F2

CD274A

2300

CALL

CURSOR

49F5

CD8249

2310

CALL

SOUND

49F8

1B

2320

DEC

DE

49F9

25

2330

DEC

H

4 9FA

04

2340

INC

B

4 9FB

18B6

2350

JR

BOARD

4 9FD

C1

2360

ENT

POP

BC

4 9FE

79

2370

LD

A, C

4 9FF

90

2380

SUB

B

4A00

28B1

2390

JR

Z,BOARD

4A02

DDCB0046

2400

BIT

0, (IX)

4A0 6

CO

2410

RET

NZ

4A07

47

2420

LD

B, A

4A08

3E20

2430

LD

A, #20

4A0A

12

2440

L11

LD

(DE),A

4A0B

F5

2450

PUSH

AF

4A0C

CD274A

2460

CALL

CURSOR

4A0F

F1

2470

POP

AF

4А10

2480

DEC

DE

4A11

25

2490

DEC

H

4A12

10F6

2500

DJNZ

L11

4A14

CD8249

2510

CALL

SOUND

4A17

41

2520

LD

B, C

4A18

1899

2530

JR

BOARD

4A1A

FB

2540

PRESS

EI

4A1B

FDCB01AE

2550

RES

5,(IY+1

4A1F

FDCB016E

2560

L5

BIT

5,(IY+1

4A2 3

2 8FA

2570

JR

Z, L5

4A2 5

F3

2580

DI

4A2 6

C9

2590

RET

4A2 7

F5

2600

CURSOR

PUSH

AF

4A2 8

3E16

2610

LD

A, #16

4A2A

D7

2620

RST

#10

4A2B

7D

2630

LD

A, L

4A2C

D7

2640

RST

#10

4A2D

7C

2650

LD

A, H

4A2E

D7

2660

RST

#10

4A2F

3E10

2670

LD

A, #10

4A31

D7

2680

RST

#10

4A32

AF

2690

XOR

A

4A33

D7

2700

RST

#10

4A34

F1

2710

POP

AF

4A35

FE2A

2720

CP

#2A

да - все коды иначе ограничить старший код символом "9", а младший - кодом символа "0"

ограничить коды младше пробела

подготовить к выводу код вместо кода курсора

переход в следующую позицию

достигнут ли код переполнения? Нет - в цикл.

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

вернуться на шаг влево

увеличим позиции печати

сделано позиций печати код переполнения осталось позиций печати если не сделано ни одной первый флаг?

не нуль - выход разрешен сделано шагов в счетчик подготовить к выводу код пробела

вывод

смещение позиции печати влево

цикл до начальной позиции

восстановить константу переполнения и рестарт разрешить прерывание сбросить "клавиша нажата" проверка флага на предмет очередного нажатия если нажатие-запретить прерывание и выход сохранить код

печать позиции "AT"

установка позиции "Y"

установка позиции "X"

цвет чернил (INK)

черный

текущий код

это код курсора?

4A37

200A

2730

JR

NZ, L8

нет - вперед

4A3 9

F5

2740

PUSH

AF ;

иначе сохранить код

4A3A

3E12

2750

LD

A, #12

4A3C

D7

2760

RST

#10 ;

эффект мерцания (FLASH)

4A3D

3E01

2770

LD

A, #01

4A3F

D7

2780

RST

#10 ;

включить мерцание

4A4 0

F1

2790

POP

AF ;

код курсора на печать

4A41

D7

2800

RST

#10 ;

4A42

C9

2810

RET

4A4 3

3E12

2820 L8

LD

A, #12

если не код курсора, то

4A4 5

D7

2830

RST

#10 ;

вновь установить FLASH

4A4 6

AF

2840

XOR

A ;

4A4 7

D7

2850

RST

#10 ;

выключить мерцание

4A4 8

1A

2860

LD

A,(DE)

4A4 9

D7

2870

RST

#10 ;

печать символа

4A4A

C9

2880

RET

NN+0

LD

HL,XXYY

XX и YY - начальная позиция печати на экране (счет сверху слева). Начальный адрес ОЗУ под хранение вводимых кодов.

Cброс первого системного флага. Константа переполнения, копировать её в счетчик. :Вызов процедуры опроса клавиатуры.

В Листинге_5 привожу пример реализации процедуры ввода пятибайтовых десятичных кодовых блоков (NN-некоторый текущий двухбайтовый шестнадцатеричный адрес).

Изменяя константу переполнения, можно задавать блоки произвольной длины (от 1 до 255 байт), а устанавливая системный флаг командой SET 0,(IX) и вводя константу переполнения #FF, можно получать блоки произвольной длины.

Для дальнейшего рассмотрения возможностей процедуры BOARD в Листинге_6 привожу подпрограмму формирования заголовка файла HEADER, причем в нее входит лишь часть команд формирования, но общих и для ленты, и для диска. Дальнейшее происходит уже непосредственно в процедурах TAPE или DISK.

Листинг_5

NN+3

NN+6 NN+10 NN+12 NN+13

LD

RES

LD

LD

CALL

DE,ADDR

0, (IX)

C, #05 B, C BOARD

Листинг 6.

NN+0

4DA8

E5

7390

CLEAR

PUSH

HL ;

скопировать адрес HL в

4DA9

D1

7400

POP

DE ;

DE (в HL - код пробела)

4DAA

13

7410

INC

DE ;

сдвинуть DE вперед

4DAB

EDBO

7420

LDIR

тогда LDIR - это очистка

4DAD

C9

7430

RET

(заполнение кодом пробела)

4DDF

214E51

7620

HEADER

LD

HL, L[9]

начало буфера заголовка

4DE2

011000

7630

LD

bc,#0010

длина буфера

4DE5

E5

7640

PUSH

HL ;

сохранить адрес начала

4DE 6

3620

7650

LD

(HL),#20

код пробела - очистки

4DE8

CDA84D

7660

CALL

CLEAR ;

очистка буфера

4DEB

11BD51

7670

LD

DE,L[E]

вывод на экран пригла

4DEE

011D00

7680

LD

BC,L[F]-L[E]

шения: "FILE NAME:"

4DF1

CD3C20

7690

CALL

#203C

4DF4

CD8249

7700

CALL

SOUND ;

готовность - звук

4DF7

DDCB00C6

7710

SET

0, (IX)

разблокировать <ENTER>

4DFB

DDCB0056

7720

BIT

2, (IX)

лента или диск?

4DFF

0E08

7730

LD

C, #08

диск - до 8 символов

4E01

2001

7740

JR

NZ,L57

если диск - то вперед

4E03

0E0A

7750

LD

C, #0A

лента - до 10 символов

4E05

41

7760

L57

LD

B, C

в счетчик код переполнения

4E06

21010F

7770

LD

HL,#0F01

начало вывода имени на экр

4E09

D1

7780

POP

DE ;

начало буфера заголовка

4E0A

CDB349

7790

CALL

BOARD ;

ввод заголовка

4E0D

3A4E51

7800

LD

A, (L[9] )

самый первый символ?

4E10

FE21

7810

CP

#21 ;

исключается код пробела

4E12

38CB

7820

JR

C,HEADER

пробел - повторить ввод

4E14

C9

7830

RET

Листинг 7

RES 2, (IX) ;подготовка режима "ТАРЕ"

NN+4 CALL HEADER ;формирование заголовка

MM+0 SET 2, (IX) ;подготовка режима "DISK"

MM+4 CALL HEADER ;формирование заголовка

В подпрограмме HEADER (Листпнг_7) производится как деблокирование <ENTER>, так и установка констант переполнения, поэтому вызов её не требует дополнительных программ, происходит непосредственно.

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

В заключение отмечу, что метод управления процедурами с помощью системных флагов - не есть что-то уникальное. Его широко использовали при создании фирменных программ "GENS-4D", "MONITOR-48K" и т.д. Я же считал своей задачей показать практически, на основании одной из своих разработок, как это можно реализовать и что при этом получается. Следует предупредить, что подобные программы делаются более трудночитаемыми и тем, кто делают первые шаги в машинном кодировании, лучше пока от применения подобных приемов воздерживаться.

* * *




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Хит - ТОП 10 игра для Спектрума.
Новости - riskej, ADSL, Вasil/i8, Т(с)S/i8, Slash, Dissоnatоr, Ldir.
Содержание - содержание номера.
CODING - Вращение спрайтов.
Обо всём - как раскрасить унылый IS-DOS.

В этот день...   21 ноября