Эта книга адресована в первую очередь тем, кого уже перестал удовлетворять несколько ограниченный и неповоротливый Бейсик и кто мечтает наконец научиться писать программы на ассемблере. Книга рассчитана на достаточно подготовленного читателя, прошедшего «боевое крещение» Бейсиком, а новичкам в программировании мы можем порекомендовать первую книгу из серии «Как написать игру для ZX Spectrum». Надеемся также, что и профессионалы смогут найти здесь для себя некоторые зерна истины.
Как и в предшествующей книге, речь здесь пойдет преимущественно об игровых программах, однако хотим вас предупредить заранее, что ассемблер - штука серьезная и нам не раз придется погружаться в пучины мудреных понятий и терминов. Но со своей стороны мы обещаем сделать эти погружения не слишком головокружительными, смягчив суровую необходимость занимательными примерами.
Возможно, вас несколько смутили только что прочитанные строки, да и раньше вам, быть может, не раз приходилось слышать, мол, писать программы на ассемблере невероятно сложно. Но, право, не так страшен ассемблер, как его малюют, а что касается сложностей, так вспомните свои первые шаги в том же Бейсике.
Конечно, между этими двумя языками существуют различия, причем принципиальные. Так, действие почти каждого оператора Бейсика можно сразу увидеть на экране [1], чего не скажешь об ассемблере. Здесь, если вы хотите получить какой-то видимый невооруженным глазом результат, нужно, засучив рукава, создавать целую программу. И если в Бейсике достаточно только набрать текст программы, чтобы она заработала, то ассемблерный текст нужно еще специальным образом обработать - оттранслировать (трансляция исходных текстов на ассемблере в принципе очень похожа на обработку бейсик-программ с помощью компиляторов.) Однако надеемся, что после внимательного изучения данного пособия обозначенные выше сложности не покажутся вам серьезным препятствием.
Вообще же, основная сложность ассемблера заключается, пожалуй, в одном: текст программы получается очень длинным из-за того, что каждая инструкция выполняет какое-то одно элементарное действие типа сложения или вычитания, поэтому для получения ощутимого результата приходится писать длинный ряд инструкций. Зато, в отличие от Бейсика, понять смысл каждой команды, как нам кажется, значительно проще. Во всяком случае, мы попытаемся и вам передать нашу уверенность в этом.
Поскольку исходные тексты программ на ассемблере получаются весьма громоздкими, мы не смогли поместить в книге ни одной полноценной игры, компенсировав этот недостаток массой небольших, но очень полезных примеров и фрагментов игровых программ. И если вы уже имеете некоторый опыт в создании компьютерных игрушек, то вам не составит большого труда собрать свою собственную программу из приведенных в книге «кирпичиков».
Еще одна сложность ассемблера состоит в том, что в нем отсутствуют привычные сообщения об ошибках. Ассемблер будет «ругаться» только тогда, когда вы попытаетесь подсунуть ему несуществующую инструкцию или еще что-нибудь в этом роде. А так можно шутки ради написать заведомо неработоспособную программу и ассемблер ничтоже сумняшеся оттранслирует ее, да еще подбодрит вас сообщением, мол, ошибок нет, программа получилась - просто блеск. Но вот что любопытно: этот, казалось бы, неприятный недостаток обращается в несравненное достоинство, совершенно недоступное никакому другому языку! Освоив ассемблер, вы наверняка в один прекрасный момент почувствуете, что значит истинная свобода. Ведь теперь вы не будете скованы никакими условностями, и никто не рявкнет вдруг из-за спины: «это нельзя, то нельзя!» Отныне все условности для себя будете создавать вы сами и никто не помешает в любой момент отбросить их в сторону.
Теперь по сложившейся традиции необходимо сказать несколько слов о структуре книги. Будем исходить из предположения, что вам уже известны составные части игровой программы и способы их создания, и мы лишь мельком «пробежимся» по этому материалу, сосредоточив основное внимание на средствах достижения той или иной цели. Вначале мы продемонстрируем, как можно получить те же результаты, что и при использовании операторов Бейсика, а затем все чаще станем применять методы, недоступные языкам высокого уровня и дающие совершенно уникальные эффекты.
Первая глава вводит вас в мир игровых программ, показывает, из каких основных частей они состоят: заставки, игрового пространства, блока взаимодействия с играющим, блока оценки игровой ситуации и блока музыкального сопровождения игры. В ней дается общее представление о каждой из этих частей и их функциях, приводятся примеры и рисунки.
Как вы понимаете, прежде чем приступать к изучению нового языка, необходимо четко уяснить, что он собой представляет, усвоить несколько новых понятий и на самых элементарных примерах научиться писать исходные тексты. Поэтому во второй главе рассказывается о том, что такое машинные коды и ассемблер, чем они отличаются друг от друга и каковы преимущества и недостатки ассемблера. Вы познакомитесь с организацией памяти ZX Spectrum, с регистрами и регистровыми парами, то есть со всем тем, без чего невозможно написать даже самую маленькую ассемблерную программку.
В третьей главе, шаг за шагом, мы научим вас вводить и редактировать программы в ассемблере GENS4, расскажем о структуре строки исходного текста, трансляции программ, о сохранении и удалении текстов, и о многом другом, с чем вы столкнетесь буквально в первые минуты знакомства с ассемблером.
Четвертая глава показывает, как подготовить экран к работе, то есть установить его атрибуты, бордюр, а при необходимости очистить от ненужных символов; как сделать на нем разные надписи, вывести числа и создать простейшие изображения. При этом каждый, даже самый маленький шаг, сопровождается программой и подробными комментариями к ней. После нескольких уроков приводится вполне самостоятельная программа статической заставки, на примере которой вы узнаете, как создаются блоки данных для вывода на экран простейших спрайтов, всевозможных рамок и различных надписей не только латинскими, но и русскими буквами.
В пятой главе мы обсудим вопрос о том, как заставить двигаться по экрану отдельные символы, целые строки и небольшие спрайты. Особое внимание уделено принципам организации циклов, составлению и использованию подпрограмм, в соответствии с которыми разработано несколько полезных для вашего будущего творчества процедур. Показано, как сформировать и заставить двигаться окна, «растворить» изображение на экране, сделать настоящую мультипликационную картинку.
Шестая глава посвящена многокадровой заставке и проблемам, которые возникают при ее создании. В частности, приводятся программки, формирующие простые звуки, а также делающие из стандартного набора символов высокие и широкие буквы. Если же вы не чувствуете в себе особых способностей к рисованию, мы предложим простой способ создания изображения названия игры. Значительное внимание уделено скроллингу окон во всех направлениях даются примеры и пояснения к их использованию. В конце главы приводится полноценная многокадровая заставка, которую с небольшими изменениями или без таковых, вы сможете использовать в своих игровых программах.
Из сказанного может создаться впечатление, что мы слишком уж много внимания уделяем заставкам, но на это есть по меньшей мере две причины: во-первых, заставка, как-никак - это лицо любой игровой программы, а во-вторых, на этих примерах проще всего изучать команды машинного языка. Поэтому к концу шестой главы вы усвоите большую их часть и когда в следующей, седьмой главе, перейдете к изучению игрового пространства, можно будет заняться чистым творчеством, не отвлекаясь на техническую сторону программирования.
В седьмой главе мы познакомим вас с основой основ любой игровой программы - игровым пространством и детально рассмотрим круг вопросов, связанных с формированием и быстрым выводом на экран пейзажей и спрайтов. Чтобы облегчить их создание, предлагается простая программа, которая позволяет легко получить готовые к использованию спрайты и даже целые спрайт-файлы. Подробно изложена проблема восстановления фона при движении спрайтов в игровом пространстве и описаны пять наиболее употребительных способов, каждый из которых проиллюстрирован примером. В заключительном разделе показано, что элементы игрового пространства можно формировать не только непосредственно на экране, но и в памяти компьютера, и после окончания построения изображения быстро выводить его на экран, создавая многоплановые мультипликационные картинки.
Восьмая глава показывает, как управлять спрайтами во время игры, перемещая их во всех направлениях, в том числе по диагонали. В зависимости от сюжета и цели игры вы получаете возможность остановить свой выбор на управлении от клавиатуры или одном из типов джойстиков. Но можете воспользоваться и универсальной процедурой, благодаря которой спрайты одинаково реагируют как на клавиши, так и на повороты ручки джойстика.
В следующей, девятой главе, речь идет о том, как оценивать действия играющего и его противников на протяжении всей игры: начислять очки, следить за количеством «жизней» и оставшимися ресурсами, и вообще за всем тем, что поддается подсчету. А для того, чтобы вычисления не вызывали больших проблем, показано, как воспользоваться услугами «зашитой» в ПЗУ компьютера программой, называемой калькулятором. С ее помощью можно выполнять математические действия не только над целыми, но и над дробными числами. Наконец, детально рассмотрена такая малопонятная для многих начинающих программистов вещь, как прерывания. Показано, как написать свою собственную процедуру обработки прерываний на примере контроля оставшегося до конца игры времени.
Из десятой главы вы узнаете о нескольких различных способах извлечения звуков. В ней мы покажем, как получить отдельные акустические эффекты для звукового оформления игры, а также, как заставить компьютер проигрывать целые музыкальные фразы. Обладатели компьютеров ZX Spectrum 128 и Scorpion ZS 256 получат представление о работе с трехканальным музыкальным сопроцессором. В последнем разделе главы приводится краткое описание второй версии музыкального редактора Wham - Wham FX, предназначенного для программирования мелодий, исполняемых музыкальным сопроцессором.
Завершает книгу глава одиннадцатая, в которой будут обсуждены некоторые «профессиональные» возможности ассемблера GENS4. К ним относится работа с макросами, условная трансляция, методика ассемблирования программ больших размеров, состоящих, возможно, из нескольких исходных файлов.
Изначально мы планировали включить в книгу подробное описание популярной игры Tetris и на ее примере показать, как создается полноценная программа на ассемблере, с чего нужно начать и чем закончить. Но увы, ограничение объема не позволило сделать этого. Тем не менее, мы все же надеемся, что данная книга не последняя в серии «Как написать игру» и позже удастся опубликовать не только упомянутую программу, но и многие другие, не вошедшие в настоящее издание.