Как написать игру на ассемблере для ZX Spectrum/Глава 03

Материал из Emuverse
Данный материал защищён авторскими правами!

Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей.

Автор: А. Евдокимов, А. Капульцевич, И. Капульцевич, ИД «Питер»

ГЛАВА ТРЕТЬЯ,
обучающая вводу и редактированию игровых программ в ассемблере GENS4

Существует несколько версий программы GENS, но для определенности мы будем рассматривать GENS4. Тем не менее, почти все, о чем пойдет речь в нашей книге, справедливо и для других версий ассемблера фирмы HISOFT, поэтому мы не всегда станем уточнять версию, а чаще будем писать просто GENS.

ЗАГРУЗКА GENS4

Для начала нужно сказать несколько слов о самой программе. Ее часто можно встретить в пакете с монитором-отладчиком MONS под общим названием DEVPAC. Этот пакет состоит из трех файлов:

  • Загрузчик на Бейсике (изначально пакет DEVPAC не содержал загрузчика на Бейсике, а появился он там благодаря Н. Родионову [2] — Примеч. ред.);
  • Ассемблер GENS4 (или GENS3);
  • Монитор-отладчик MONS4 (MONS3).

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

LOAD "GENS4"CODE 25000

После этого (или до) опустите RAMTOP на один байт ниже адреса загрузки ассемблера, выполнив оператор

CLEAR 24999

и теперь, чтобы GENS можно было запустить командой RUN, введите строку

10 RANDOMIZE USR 25000

Если вас по какой-то причине не вполне устраивает предложенный адрес, можете заменить его на любой другой. Помните только, что он не должен быть слишком низким (чтобы не повредить бейсик-систему) или слишком высоким (чтобы поместился не только сам GENS, но и текст будущей программы, который расположится следом за кодами ассемблера). Допустимый диапазон адресов загрузки лежит примерно в пределах от 24500 до 54000.

СТРУКТУРА АССЕМБЛЕРНОЙ СТРОКИ

Как и в любом другом языке, программа на ассемблере начинается с набора исходного текста. Наверное, нет надобности говорить, что для этих целей редактор Бейсика, встроенный в компьютер, совершенно непригоден. Посему в первую очередь необходимо освоить специальный редактор ассемблерных текстов, в который вы попадаете сразу после запуска GENS. В этой главе мы научим вас вводить строки программы, просматривать полученный текст и, наконец, транслировать готовую программу.

Прежде всего нужно сказать о структуре строк исходного текста программы на ассемблере. Они состоят из нескольких полей и имеют следующий формат:

       Номер Поле меток Поле мнемоник Поле операндов
       12345 LABEL      LD            BC,1000

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

Рассмотрим назначение каждого их этих полей.

Хотя строки в программах для GENS и нумеруются, но в ассемблере ссылки на номера строк, в отличие от Бейсика, нигде не применяются. Нумерация нужна исключительно для определения очередности следования строк, вывода листинга на экран или принтер и для вызова строк на редактирование. Допустимые значения этого поля — от 1 до 32767.

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

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

Если у команды имеются какие-либо операнды, они записываются в следующем и последнем поле строки — в поле операндов. Таким образом полная команда может занимать в строке программы одно или два поля.

ВВОД СТРОКИ

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

Вводить строки можно двумя способами: так же, как и в Бейсике, то есть каждый раз набирать номер и текст, или воспользоваться автоматической нумерацией, что на наш взгляд несравненно удобнее. Для автоматической нумерации строк нужно на подсказку редактора (символ > с курсором C или L) ввести команду I (Insert — режим вставки строк) и нажать Enter. Первая строка будет иметь номер 10 и последующие номера будут увеличиваться с шагом 10. Если вы пожелаете изменить порядок нумерации строк, введите ту же команду I, но с двумя параметрами, разделенными запятой: первое число — начальный номер, второе — шаг. Например, I100,5.

Итак, введите команду I с параметрами или без — после старта GENS оба параметра по умолчанию равны 10, поэтому в самом начале работы их можно и не указывать.

Так как в первой строке метки нам не понадобятся, сразу перейдем к полю мнемоник. Переход к следующему полю строки осуществляется вводом символа табуляции, который получается при одновременном нажатии клавиш Caps Shift и 8. (Вместо символов табуляции можно вводить просто один или несколько пробелов — после окончательного ввода строки они автоматически будут заменены кодами табуляции, и при просмотре листинга текст будет выглядеть аккуратно выровненным по границам полей.) Нажмите эту комбинацию клавиш и увидите, как курсор перескочит вправо сразу на несколько позиций печати. Теперь можно набрать какую-нибудь инструкцию.

Как правило, программы на ассемблере начинаются с указания начального адреса, то есть того адреса, с которого полученная программа будет загружаться в память. Это достигается включением в программу директивы ORG (от англ. Origin — начало), следом за которой пишется десятичный или шестнадцатеричный адрес. (При записи шестнадцатеричных чисел они должны начинаться с символа #, например, #3FC.) Наберите в первой строке эту директиву и укажите после символа табуляции адрес 60000. Если вы случайно нажмете не ту клавишу, удалить последний введенный символ можно обычным образом, нажав клавиши Caps Shift/0 или Delete. Но вот переместить курсор к любому символу строки стандартными методами не удастся: ведь клавиши Caps Shift/8, как вы уже знаете, отвечают за ввод табуляции, а Caps Shift/5 удалит весь текст строки и переместит курсор в самое ее начало. Закончите ввод нажатием клавиши Enter, после чего строка должна принять вид

10     ORG   60000

а ниже появится номер следующей строки с курсором.

Аналогичным образом введите еще две строки:

20     LD    BC,1000
30     RET

Теперь нам нужно вернуться в строчный редактор GENS. Для этого достаточно нажать клавишу Edit или Caps Shift/1. На экране снова появится подсказка, на которую можно вводить команды редактора.

ПРОСМОТР ТЕКСТА

После ввода достаточно больших программ часто возникает необходимость просмотра полученного текста. Команда L позволяет вывести на экран листинг программы с любой строки по любую. Если команда введена без параметров, листинг будет выводиться с самой первой строки и до конца порциями по 15 строк. После вывода очередной порции будет ожидаться нажатие любой клавиши кроме Edit, которая прервет вывод и вернет управление редактору. Общий вид команды такой:

L[начальная строка[,конечная строка]]

Квадратные скобки указывают на необязательность параметров.

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

ТРАНСЛЯЦИЯ ПРОГРАММЫ

Оттранслируйте теперь полученный исходный текст. Введите команду A безо всяких параметров. На экране должна появиться примерно такая надпись:

       HiSoft GEN Assembler ZX Spectrum
       ZX Microdrive Version 4.1b

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

       Pass 1 errors: 00

       Pass 2 errors: 00

       Table used: 13 from 104

Текст «шапки», естественно, может быть и другим, все зависит от версии, которой вы пользуетесь. Здесь нам важно, в общем-то, одно — то, что ни в первом, ни во втором проходе ассемблирования (Pass) ошибок (errors) не обнаружено. Надо сказать, что ассемблер обрабатывает исходный текст в два прохода: на первом проверяются синтаксические ошибки и выстраивается таблица меток (ее размер показывает самая нижняя строка сообщения Table used); во втором проходе генерируется машинный код программы.

ВЫХОД ИЗ GENS

Убедившись, что ошибок нет (по крайней мере, грубых), неплохо было бы проверить работоспособность получившейся программы. Работая с GENS вы в любой момент можете временно попрощаться с ассемблером и выйти в Бейсик, дав редактору команду B (Bye — «до встречи» или Basic, если вам так легче запомнить).

После выхода из GENS4 мы рекомендуем вам прежде всего очищать экран оператором CLS или простым нажатием клавиши Enter. Дело в том, что эта версия пользуется для вывода на экран встроенным драйвером, позволяющим выводить в строке до 51 символа мелким шрифтом, и при выходе стандартный канал вывода по каким-то причинам не сразу восстанавливается. Поэтому до очистки экрана оператор PRINT может не дать ожидаемых результатов.

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

FOR n=60000 TO 60003: PRINT PEEK n: NEXT n

и увидите столбик чисел, совпадающих с теми, которые мы вводили ранее вручную.

Снова вызовите редактор GENS и введите команду L. Как видите, текст набранной программки никуда не исчез.

ВНЕСЕНИЕ В ТЕКСТ ИЗМЕНЕНИЙ

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

Начнем со способов внесения правок в уже имеющийся текст. Для вызова строки на редактирование служит команда E (Edit) с номером нужной строки (рис. 3.1). Давайте в нашей программке подправим, например, строку 20, изменив число, загружаемое в регистровую пару BC. Введите команду E20. То, что вы увидели, возможно, несколько удивило вас. На экране появилась вызванная строка, но курсор на ней не задержался, а проскочил ниже, напечатав только номер. Весь остальной текст куда-то подевался. Может создаться такое впечатление, что теперь необходимо набирать весь текст заново. Однако, это только впечатление, и на самом деле строка сейчас готова к редактированию.

Рис. 3.1. Редактирование строки в GENS4

Вы можете вносить изменения в текст строки двумя способами: в режиме вставки, в котором вновь введенные символы «раздвигают» строку и не затирают имеющийся текст, и в режиме замены, в котором новые символы ложатся поверх прежних. В любом случае сначала необходимо подвести курсор к тому месту строки, где требуются какие-либо изменения. Вправо курсор можно перемещать по одной позиции, нажимая пробел, или разом перескакивать к следующему полю при нажатии Caps Shift/8. Перемещая курсор, вы увидите появляющийся под ним текст строки. Возврат на одну позицию влево происходит при нажатии клавиши Delete (Caps Shift/0)(обратите внимание на тот факт, что пока еще ничего не удаляется — вы просто перемещаете курсор, а верхняя строка нужна для подсказки).

Подведите курсор к числу 1000 так, чтобы он находился точно под единицей. Затем нажмите клавишу C для перехода в режим замены символов (в режим вставки можно перейти, нажав клавишу I, но это — на будущее). Обратите внимание, что курсор при этом изменяет свой вид. Теперь он выглядит как инвертированный символ + (в режиме вставки курсор имеет вид символа *, и это тоже — на будущее). Замените цифру 1 на 5, а следующий ноль, скажем, на 3. Затем выйдите из режима замены, нажав Enter и, наконец, введите строку в программу, еще раз нажав Enter. Редактирование строки закончено, и сейчас она должна иметь вид

20     LD    BC,5300

Можете ассемблировать новый текст и, выйдя в Бейсик, выполнить получившуюся программку оператором

PRINT USR 60000

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

  • L (List) — показать на экране текущий вид строки;
  • K (Kill) — удалить символ в позиции курсора;
  • Z (Zap) — удалить весь текст от курсора до конца строки;
  • X (eXpand) — переместить курсор в конец строки и войти в режим вставки;
  • Q (Quit) — отменить все сделанные правки и закончить редактирование строки;
  • R (Reload) — отменить все исправления и начать редактирование заново.

Все эти команды выполняются до включения режимов вставки или замены символов (команды I или C). Если же один из этих режимов уже включен, следует прежде выйти из него, нажав Enter.

СОХРАНЕНИЕ И ЗАГРУЗКА ТЕКСТОВ И ПРОГРАММ

Разобравшись с методами редактирования строк, пора узнать, как сохраняются результаты. В отличие от Бейсика, редактор GENS позволяет сохранить не только весь текст целиком, но и произвольную его часть, для чего в команде P (Put text) прежде указывается начальная строка сохраняемого фрагмента, а затем — конечная. Самым последним параметром команды служит имя, под которым вы хотите сохранить текст. (У строчного редактора есть одно полезное, но в некоторых случаях опасное свойство: часть команд, будучи введенными без параметров, выполняется с параметрами предыдущей команды. Поэтому, на первых порах будьте особо внимательны.) Поскольку в этой команде нет необязательных параметров, то для записи всего текста можно задать границы номеров сохраняемых строк «с запасом» и ввести, например, такую строчку:

P1,20000,ASMTEXT

Если вы работаете с дисководом и имеете в своем распоряжении дисковую версию ассемблера GENS4D или gens4b, то можете записать исходный текст на дискету. Формат команды в этом случае останется, в общем-то, тем же самым, только имя файла должно начинаться с указания номера дисковода, к которому вы собираетесь обратиться. Например, для записи на дисковод A нужно ввести

P1,20000,1:ASMTEXT

Заметьте, что двоеточие между номером дисковода и именем обязательно.

Обратное действие — загрузка ранее созданного исходного текста — осуществляется с помощью команды редактора G (Get text). Формат ее похож на формат предыдущей команды, правда, значение имеет только последний параметр — имя файла. Поэтому для загрузки программы GAME с магнитофона следует ввести

G,,GAME

а для загрузки одноименного файла с дисковода B эта же команда примет вид

G,,2:GAME

По сравнению с оператором Бейсика LOAD у команды G есть одно существенное отличие: она не уничтожает уже имеющийся в памяти текст, а добавляет новый в конец. После объединения строки программы будут перенумерованы с номера 1 и с единичным шагом. Часто такая особенность команды G бывает не только полезна, но и просто необходима, однако если вы собираетесь поработать над новой программой, прежде чем ее загружать, надо убедиться, что редактор свободен от какого бы то ни было текста, а если нет, то удалить его (как это сделать, мы скажем чуть позже).

Для сохранения полученного машинного кода (нередко называемого объектным, хотя это и не совсем верно) можно воспользоваться командой O (Object). Она имеет синтаксис, аналогичный команде G, то есть для записи оттранслированной программы в файл MYPROG при работе с лентой нужно ввести строку

O,,MYPROG

а при работе с дисководом A эта команда запишется как

O,,1:MYPROG

Записывая тексты и программы на диск, вы иногда можете увидеть на экране надпись

File exists Delete (Y/N)?

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

УДАЛЕНИЕ ТЕКСТА

Для удаления ненужных строк исходного текста в редакторе GENS имеется несколько возможностей. Первая из них в точности повторяет способ избавления от лишних строк в Бейсике: достаточно набрать номер удаляемой строки и нажать Enter.

Но, как вы понимаете, такой способ приемлем для удаления двух-трех строчек, когда же требуется ликвидировать значительную часть текста, подобная методика превращается в настоящую пытку. Фирма HISOFT учла интересы программистов и включила в редактор возможность удаления произвольной группы строк. Для этих целей служит команда D (Delete — удалить) с двумя параметрами, разделенными запятой. Первым указывается номер начальной строки удаляемого фрагмента, а затем — номер последней удаляемой строки. Например, для исключения из текста строк, начиная с сотой и по стопятидесятую включительно, нужно ввести команду

D100,150

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

В редакторе GENS есть еще одна полезная команда, предназначенная для удаления текста. Это команда Z. С ее помощью можно быстро уничтожить сразу весь текст. Она не требует никаких параметров, а после ввода просит подтвердить ваши намерения запросом

Delete text (Y/N)?

Если вы не передумали стирать текст, нажмите клавишу Y, в противном случае — любую другую клавишу.