Из множества ассемблеров и дизассемблеров, существующих для ZX Spectrum, в Союзе наиболее
популярен пакет фирмы Hisoft — DEVPAC4 (ассемблер GENS4 и отладчик MONS4). Этому способство-
вали не только несомненные достоинства пакета, но и появление его версий, работающих с дис-
ководом в среде TR-DOS.
Ассемблер GENS4 отличают следующие положительные свойства:
— относительно небольшой объем занимаемой самим транслятором памяти — около 10К;
— перемещаемость;
— наличие встроенного редактора;
— возможность работы в 51 -символьном текстовом режиме;
— наличие макрокоманд и директив условной трансляции;
— возможность подгрузки исходных файлов с кассеты или диска в процессе трансляции, что по-
зволяет обрабатывать файлы практически неограниченного размера;
— высокая скорость трансляции;
— возможность записи на диск объектных файлов в процессе трансляции, что позволяет полу-
чать программы, занимающие всю доступную память.
Мы предлагаем Вам описание исходной версии GENS4, а также версии, адаптированной одним из
авторов этой книги для работы с дисководом в системе TR-DOS. Выяснить, с каким накопителем
работает конкретная модификация GENS4, можно в процессе трансляции. Рассматриваемая версия
выводит на экран следующее сообщение: 1990 МОА B-Disk version
Различные варианты GENS4 отличаются также количеством символов в экранной строке: сущест-
вуют версии с 51 -символьной строкой и с 32-символьной. Имена этих модификаций для работы с
магнитофоном соответственно GENS4-51 и GENS4. Дисковая версия известна только 51 -
символьная, чаще всего она встречается с именем GENS4B.
ЗАГРУЗКА GENS4
Ассемблер GENS4 является перемещаемой программой, то есть он может быть загружен и запущен
с произвольного адреса. Как правило, наиболее удобно располагать GENS4 с адреса около 25000
— в этом случае Вам предоставляется наибольший объем памяти для текста редактируемой про-
граммы и рабочих таблиц (текстовый файл и таблицы размещаются непосредственно за GENS4).
Максимальный адрес, с которого может быть загружен GENS4 — около 54000.
Для загрузки GENS4 с ленты выполните один из следующих операторов:
LOAD ""CODE XXXXX
LOAD "name"CODE XXXXX
Здесь и ниже XXXXX — десятичный адрес, с которого Вы хотите загрузить GENS4, a name — имя
версии.
Для загрузки с диска войдите в TR-DOS (RANDOMIZE USR 15 616) и выполните оператор
LOAD "GENS4B"CODE XXXXX
Чтобы предотвратить возможные коллизии с интерпретатором Бейсика, перед загрузкой GENS4
полезно выполнить оператор CLEAR XXXXX-1
Запускается GENS4 оператором RANDOMIZE USR XXXXX, который используется также и для переза-
пуска ассемблера после выхода из него в Бейсик.
Для загрузки и запуска часто применяют программу-загрузчик на Бейсике. Один из ее вариан-
тов приведен в конце описания GENS4.
После запуска GENS4 на экране появляется список команд редактора и подсказка в виде симво-
ла >.
ПРОГРАММИРОВАНИЕ НА АССЕМБЛЕРЕ GENS4
Текст рабочей программы на языке ассемблер вводится в GENS4 либо непосредственно с клавиа-
туры (команда редактора I), либо подгружается с магнитного носителя (команда G). Программа
состоит из пронумерованных с произвольным шагом строк, в которые записаны инструкции (коман-
ды) языка, метки, комментарии. Кроме команд процессора Z80, представленных в стандартной
мнемонике (см. «Система команд Z80»), при написании программ используются специальные инст-
рукции GENS4: директивы ассемблера, команды условной трансляции, макрокоманды, команды ас-
семблера. Набор, загрузка, редактирование, сохранение и другие операции над текстом ассемб-
лерной программы осуществляются в строчном редакторе. Для получения объектного кода* ассемб-
лерный текст
*)На самом деле GENS4 производит не объектный, а непосредственно исполняемый код.
необходимо оттранслировать (проассемблировать) с помощью команды редактора А. Во время
трансляции GENS4 выдает сообщения о найденных ошибках, которые исправляются затем в строчном
редакторе. После создания объектного кода его можно сохранить на магнитном носителе (команды
ассемблера О или А), а также выполнить, не выходя из GENS4 (команда R). А теперь обо всем
подробно.
_Формат строки ассемблера
Строка исходного текста программы для GENS4 имеет следующий формат:
Номер метка мнемоника операнды комментарий
35 START LD HL, LABEL ;загрузка регистра
Номер строки определяет место расположения строки в тексте ассемблерной программы и необ-
ходим только для работы строчного редактора.
При наборе строки переход к следующему полю формата осуществляется нажатием клавиш табуля-
ции (Caps Shift/8) или пробела (Space). Строчный редактор автоматически заменяет пробел на
табуляцию. Комментарии отделяются символом «точка с запятой» (;) и могут располагаться, на-
чиная с любого поля. Длина строки программы не может превышать 80 символов.
_Метки
Метка — это имя, присваиваемое строке текста программы. Она используется для указания ад-
реса передачи управления или для определения констант.
Метка может содержать любое количество символов, но значащими являются только первые
шесть, которые, во избежание конфликтных ситуаций, не должны совпадать с первыми шестью сим-
волами других меток. В качестве меток нельзя использовать зарезервированные слова (см. соот-
ветствующий раздел в конце описания GENS4).
Метка может быть составлена из символов 0...9,A...Z,a...z, ,[,,],#. Однако первым симво-
лом метки непременно должна быть буква. Некоторые примеры возможных меток:
;сложение 8-разрядного числа с 16-разрядным
ADD A, L ;сложение младших разрядов
LD L,A ;запись результата
JR NC,SKIP ;если в результате не возникло переполнение, то следующая инструк-
ция будет пропущена, и управление передано строке с меткой
SKIP INC Н
_Счетчик адресов
В процессе трансляции счетчик адресов указывает адрес текущей команды и используется для
присвоения значений меткам, операндам и т. п. Значение счетчика адресов обозначается симво-
лом $.
С применением счетчика адресов предыдущий пример можно переписать без использования метки:
;сложение 8-разрядного числа с 16-разрядным
ADD A,L
LD L,A
JR NC,$ + 3 ;инструкция JR занимает два байта,
;a INC H - один, т. о. 2+1=3 байта
INC H
_Выражения
В поле операндов могут записываться как отдельные операнды, так и выражения, которыми за-
дается последовательность алгебраических и логических операций над константами, метками,
счетчиком адресов. В выражения, обрабатываемые GENS4, можно включать следующие константы (с
примерами):
десятичная константа (38);
шестнадцатиричная константа (#26);
двоичная константа (%10110);
символьная константа ("$");
и операторы:
+ сложение;
— вычитание;
& логическое «И» (AND);
@ логическое «ИЛИ» (OR) ;
! логическое «исключающее-ИЛИ» (XOR);
* алгебраическое умножение;
/ алгебраическое деление;
? функция MOD: A?B=A-(INT(A/B))*B.
В выражениях нельзя использовать скобки, так как они являются признаком метода адресации.
Вычисление значения выражения производится слева направо — приоритет операторов не соблюда-
ется. При записи выражений допускается использование пробелов.
Примеры выражений (при условии, что метка TWIN имеет значение 2):
%01100101%0100 результат %110110;
#2BFF?#1040 результат #B7F;
1+2*3-4 результат 5;
#12А2+%111?256 результат #А9;
"А"-10+13 результат "D";
TWIN+12 результат 14.
При вычислении значений выражений значащими являются только младшие 16 бит числа (числа от
0 до 65535), например, число 114688 (#1С000) будет интерпретироваться как 49152 (#С000).
Если в результате умножения будет получено число больше 32767, GENS4 выдаст сообщение об
ошибке *ERROR* 15 (переполнение). При делении на ноль появится сообщение *ERROR* 14. В ос-
тальных случаях переполнение игнорируется.
_Директивы ассемблера
Работая в GENS4, Вы получаете возможность, кроме стандартных команд микропроцессора Z80,
использовать в программах и так называемые директивы ассемблера.
Мнемоники директив ассемблера записываются в поле мнемоник, операнды директив соответст-
венно в поле операндов.
ORG <выражение>
Присвоить значение выражения счетчику адресов*.
EQU <выражение>
Присвоить значение выражения метке, которой обозначена данная строка. Выражение не должно
содержать не определенных ранее меток, в противном случае будет выдано сообщение об ошибке
*ERROR* 13.
DEFB <выражение>[,<выражение>...]*
Последовательно разместить в памяти 8-разрядные значения выражений,
начиная с адреса, указанного счетчиком адресов.
DEFW <выражение>[,<выражение>...]
Последовательно разместить в памяти 16-разрядные значения выражений, начиная с адреса,
указанного счетчиком адресов.
DEFS <выражение>
Зарезервировать область памяти длиной, равной значению выражения, начиная с адреса, ука-
занного счетчиком адресов. Содержимое выделенной области не определяется.
DEFM "string"
Записать символьную строку siring в память, начиная с адреса, указанного счетчиком адре-
сов.
ENT <выражение>
Установить адрес запуска программы равным значению выражения. Программа будет запускаться
по этому адресу командой редактора R._
*)Если предполагается сохранить созданный объектный код на магнитном носителе средствами GENS4, то
директива ORG не должна встречаться в программе более одного раза.
_Макроопределения
Если в Вашей программе одна и та же последовательность инструкций ассемблера используется
несколько раз, то нет необходимости каждый раз ее переписывать. Достаточно при первом появ-
лении в тексте этой последовательности выделить ее соответствующими директивами и присвоить
имя (метку), а в дальнейшем вместо других включений записывать в поле мнемоник эту метку.
Такая последовательность инструкций называется макроопределением, метка — макрокомандой.
Во время трансляции текст макроопределения заносится в специально предназначенный для это-
го буфер и в последующем вставляется в исходный текст программы на место строки с макроко-
мандой.
Если текст макроопределения не помещается в буфер, то выдается сообщение No Macro Space.
Изменить размер буфера макроопределений можно с помощью команды редактора С. В дисковой вер-
сии размер буфера по умолчанию установлен равным нулю.
Макроопределение задается директивами ассемблера MAC и ENDM, первая из которых указывает
на начало макроопределения, вторая — на конец, например:
После включения в текст программы этого макроопределения для сложения аккумулятора с реги-
стровой парой HL можно применять макрокоманду ADDNUM.
В макроопределение можно включать до 16 параметров, которым присваивается значение сле-
дующих за макрокомандой выражений:
ИМЯ_МАКРООПРЕДЕЛЕНИЯ [параметр1 [....[.параметр 16]]]
В качестве параметров разрешается передавать только числовые значения.
В теле макроопределения параметр вызывается указанием его номера следования в макрокоман-
де, перед которым ставится знак =. При этом номер задается четырьмя младшими битами кода
символа, расположенного сразу за знаком равенства. Например, ссылка на первый параметр может
выглядеть как =0, =@ или =Р; на второй — =1, =А или =а. Обратите внимание, что ссылка на ше-
стнадцатый параметр будет выглядеть как = ?, =О или =о, а не =16, Правда, из-за ограничения
длины строки 80-ю символами использовать все 16 параметров довольно затруднительно._
*)Аргументы в квадратных скобках являются необязательными.
В следующем примере задано макроопределение, заполняющее область памяти некоторым значени-
ем и имеющее три параметра: адрес начала области, длину и значение байта-заполнителя:
FILL MAC
LD HL,=0
LD DE,=0 + 1
LD BC,=1 - 1
LD (HL),=2
LDIR
ENDM
Это макроопределение вызывается, например, такой макрокомандой:
FILL 16384,22528-16384, %01011010
Учтите, что макроопределения не могут быть вложенными или рекурсивными. Не пытайтесь также
в текст макроопределения включать строки с метками — ассемблер размножит эти метки столько
раз, сколько раз будет вызвано макроопределение, что приведет к неминуемым ошибкам трансля-
ции.
Если для Вас более значимым является минимизация объема программы, а не удобства, предос-
тавляемые макроопределениями, то вместо них лучше пользоваться подпрограммами. Однако обра-
тите внимание, что использование макроопределений может несколько увеличить скорость работы
программы.
Разрешать или запрещать включение текста макроопределения в листинг ассемблирования можно
командами ассемблера *М+ и *М— (см. ниже).
_Команды условной трансляции
Иногда бывает необходимо, в зависимости от выполнения тех или иных условий, получать раз-
личные варианты объектного кода программы. Работая в GENS4, Вы сможете добиться этого, ис-
пользуя команды условной трансляции IF, ELSE и END . С их помощью можно устанавливать или
сбрасывать флаг разрешения трансляции, чем соответственно разрешать или запрещать ассембли-
рование фрагментов текста программы.
IF <выражение>
Сбросить флаг разрешения трансляции при нулевом значении выражения — следующие за командой
строки программы не ассемблировать*. Если значение выражения отлично от нуля, то ассемблиро-
вание продолжить нормально.
ELSE
Инвертировать флаг разрешения трансляции. Если перед появлением ELSE ассемблирование было
разрешено, то запретить его, и наоборот.
END
Установить флаг разрешения трансляции. После этой команды-
*)Обратите внимание, что проверка синтаксиса программы осуществляется и при запрещенной трансляции.
ранее прерванное ассемблирование продолжается нормально.
Вложенность команд условной трансляции не допускается. Обратите внимание, что флаг разре-
шения трансляции по завершению первою прохода ассемблирования не восстанавливается, и если в
конце программы он был сброшен, то на втором проходе могут возникнуть самые удивительные эф-
фекты. Поэтому пользоваться условной трансляцией необходимо с вниманием (полезно, например,
завершать программу командой END).
_Команды ассемблера
В исходный текст программы можно вставить так называемые команды ассемблера, которые в хо-
де трансляции будут управлять выводом листинга ассемблирования.
Команды ассемблера записываются в поле метки и не должны содержать разделителей (табуля-
ций). В командах *Н и *F операнд необходимо отделить пробелом.
Напечатать заголовок. В листинг включается строка string. Она будет выводиться также после каж-
дого выполнения команды *Е.
*S
Приостановить выдачу листинга ассемблирования. Продолжить трансляцию можно, нажав любую
клавишу.
*L+
Разрешить выдачу листинга.
*L-
Запретить выдачу листинга.
*D+
Выводить значение счетчика адресов в десятичном виде.
*D-
Выводить значение счетчика адресов в шестнадцатиричном виде.
*C-
Выводить сокращенный листинг ассемблирования. Строки сокращенного листинга не содержат
объектного кода. Таким образом, они укорачиваются на 9 символов, что делает листинг более
удобным для чтения. Команда используется преимущественно в 32-символьной версии GENS4.
*С+
Выводить полный листинг ассемблирования.
*M+
Разрешить распечатку текста макроопределений.
*M-
Запретить распечатку текста макроопределений.
*F filename
Включить в процесс трансляции фрагмент программы, записанный на ленте или диске. Из файла
с указанным именем считываются и ассемблируются блоки текста. Использование команды *F по-
зволяет значительно сократить объем текстового файла, находящегося в памяти, и, следователь-
но, дает возможность создавать объектный код, занимающий почти всю доступную память. При ра-
боте с магнитофоном файл необходимо предварительно записать на ленту с помощью команды ре-
дактора Т.
СТРОЧНЫЙ РЕДАКТОР
Встроенный в GENS4 строчный редактор позволяет вводить и редактировать текст программы на
языке ассемблера. Управление редактором осуществляется с помощью команд редактора, которые
вводятся на подсказку > и имеют следующий формат:
C[N1],[N2],[S1],[S2]
где С — собственно команда;
N1,N2 — числа в пределах от 1 до 65535 включительно;
S1,S2 — строки, состоящие не более чем из 20 символов.
Команды редактора могут вводиться как в верхнем, так и в нижнем регистрах клавиатуры. Если
в числовом параметре будет встречен нечисловой символ, не являющийся разделителем, то текст
командной строки, начиная с этого места и до конца строки, будет проигнорирован.
Редактор запоминает введенные параметры и может затем использовать их для некоторых команд
в качестве значений, устанавливаемых по умолчанию.
Если введена некорректная командная строка, например:
РР1,20000,G.WINDOWS
то команда выполнена не будет, а редактор сделает Вам замечание: Pardon?. Исправьте ошибку
и введите команду правильно:
P1,20000,G.WINDOWS