ОТ РЕДАКЦИИ
Дорогие друзья! Вы конечно обратили внимание на то, что мы продолжаем поддерживать направление 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, не имевшего опыта жизни со "Спектрумом" о том, что такое адвентюра? Мало кто из них знает об истинном содержании классической адвентюры, поскольку не видел он ни одной ни разу (их там просто нет). Всевозможные "квесты" - не в счет - это уже не то, что мы имеем в виду.
¥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
В Листинге_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 * *************************************
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 |
|
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$ - код цифры
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. Они не являются результатом заимствования из какого-либо источника. Скорее, это результат "вскрытия", "декодирования", аналитического исследования и обобщения информации из ряда современных фирменных системных программ, плюс результаты собственных разработок.
При написании достаточно емких ассемблерных программ для компьютеров 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 |
1В |
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.
NN+3
NN+6 NN+10 NN+12 NN+13
DE,ADDR
0, (IX)
C, #05 B, C BOARD
Листинг 6.
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" и т.д. Я же считал своей задачей показать практически, на основании одной из своих разработок, как это можно реализовать и что при этом получается. Следует предупредить, что подобные программы делаются более трудночитаемыми и тем, кто делают первые шаги в машинном кодировании, лучше пока от применения подобных приемов воздерживаться.
* * *