■ АССЕМБЛЕР GENS4
1. Запуск
1.1. Введение и инструкции загрузки
GEN"S4 - это мощный и легкий в использовании ассемблер для
Z80, который очень близок к стандартному ассемблеру ZILOG по
определению. В отличии от многих других ассемблеров, пригодных
для компьютеров "SPECTRUM", GENS4 является обширной, про-
фессиональной частью программного обеспечения и побуждает вас
очень тщательно изучать следующие разделы вместе с примером
приложения 3 перед попытками использования ассемблера.
Если вы еще новичок, то вначале проработайте примечание 3
или прочтите одну из книг, приведенных в библиографии.
У нас есть версий систем DEVPAC 4 на диске, для DISCIPLE $
DISCOVERY дисковой системы и для компьютеров SPECTRUM
PLUS 3. Эти версии работают точно так же, как описано в этом
документе, просто заменяйте слово "микропривод", там где оно
встречается, на слова "диск OPUS", "диск PLUS 3м или "DISCIPLE
диск" в соответствии свашей системой. Существует несколько внеш-
них особенностей для версии PLUS 3, которые описаны на дополни-
тельном листке.
GENS4 занимает приблизительно 10К в памяти и использует
свой внешний стек, так что это - замкнутая часть программного
обеспечения. Она содержит собственный строчный редактор, кото-
рый помещает текстовый файл сразу за кодами GENS4, в то время
как таблица символов ассемблера создается за текстовым файлом,
поэтому вы должны предоставить достаточное пространство, чтобы
поместить сам ассемблер, таблицу символов максимального размера
и текстовый файл, который вы, вероятно, будуте использовать в
текущем сеансе. Поэтому загружать GENS4 часто удобнее в нижние
адреса памяти.
Существуют 2 версии ассемблера на кассете, обе на стороне 1.
Сначала помещена версия с 51 символом в строке, за ней следует
рассматриваемая версия с 32 символами. Их имена на ленте являются
соответственно GENS4-51 и GENS4 и вы должны использовать ту
версию, которая больше вам подходит. Версия GENS4-51 на 400 байт
длиннее, чем GENS4.
Для загрузки GENS4 поместите магнитную ленту с ним в кас-
сетный магнитофон и введите:
LOAD ""CODE ХХХХХ [ENTER ] и нажмите клавишу "воспро-
изведение" магнитофона. Или:
LOAD "GENS4" CODE ХХХХХ [ENTER ] или:
LOAD "GENS4-51" CODE ХХХХХ [ENTER ],
где: ХХХХХ - десятичный адрес, с которого вы хотите загрузить
GENS4.
Только после того, как вы загрузите коды GENS4 в компьютер,
вы можете войти в ассемблер, набрав:
RANDOMIZE USR ХХХХХ, где
ХХХХХ - адрес, с которого загружены коды ассемблера.
Если в любой последующий момент вы вновь пожелаете войти в
ассемблер, то вы должны просто адресоваться к ячейке ХХХХХ,
которая хранит предварительно созданный файл информации.
Например, вы хотите загрузить ассемблер с десятичного адреса
26000. Для этого наберите:
LOAD "" CODE 2600 [ENTER ]
RANDOMIZE USR 2600 [ENTER ]
Для перезапуска ассемблера используйте:
RANDOMIZE USR 2600 в пределах Бейсика.
Только после ввода GENS4 на экране возникнет подсказка в
виде символа "" (подсказка команд редактора).
Раздел 3 содержит информацию о том, как нужно вводить и
редактировать текст, а раздел 2 - о том, что нужно вводить.
1.2. Получение копии системы
После загрузки GENS4 в память вашего SPECTRUM'a вы мо-
жете получить копию ассемблера следующим образом:
SAVE "GENS4-51" CODE ХХХХХ, 11392 [ENTER ] или
SAVE "GENS4"2 CODE ХХХХХ, 11010 [ENTER ] для кассеты
SAVE *"M";l;"GENS4-5r CODE ХХХХХ, 11392 [ENTER]iuih
SAVE * ,,MM;1;,,GENS4M CODEXXXXX, 11392 [ENTER] для
микродрайвера,
где: ХХХХХ - адрес, с которого вы загрузили GENS4.
Вы должны сделать эту копию перед входом в GENS4 для того,
чтобы сохранить перемещаемую информацию внутри программы.
Инструкции получения копий для DEVPAC серии PLUS смот-
рите на дополнительном листке.
Пожалуйста, заметьте, что мы разрешаем вам сделать копию
GENS4 для вашего собственного пользования, чтобы вы могли уве-
ренно программировать. Пожалуйста, не делайте копии GENS4 для
передачи (или, что еще хуже, для продажи) вашим друзьям. Мы
выпускаем программное обеспечение по очень разумной цене и пол-
ной послепродажной поддержкой, но если люди сами начнут копиро-
вать наше программное обеспечение, то мы перестанем продолжать
это делать. Пожалуйста, покупайте, но не крадите!
2. Подробности GENS4
2.0. Принцип работы GENS4, ключи ассемблера,
формат листинга.
GENS4 является быстрым двухпроходным ассемблером для Z80,
который ассемблирует всю стандартную мнемонику для Z80 и содер-
жит следующие особенности: макросы, условное ассемблирование,
множество команд ассемблера и таблицу символов в виде двоичных
троек.
Когда вы вызываете ассемблирование, то вы используете коман-
ду "А": А4, 2000, 1:TEST [ENTER ]
Первый код (4 - см. Выше) после А определяет условия трансля-
ции, которые вы хотите иметь в данный момент. Эти условия транс-
ляции и их ключи будут перечислены ниже. Если вы не хотите
использовать ключи, то номер набирать не надо, поставьте только
запятую.
Второй код (2000 - см. Выше) - это десятичный размер символов
в байтах. По умолчанию (при простом использовании запятой без
кодов), GENS4 будет выбирать размер таблицы символов, подходя-
щий к размеру исходного файла - обычно это бывает вполне прием-
лемо. Однако, при использовании ключа "включить" вы можете за-
дать размер таблицы символов больше обычного, ассемблер в этом
случае не будет определять размер таблицы символов, которая будет
построена.
После указания размера таблицы символов вы можете ввести
имя файла, например, 1:TEST, как указано выше, Если вы это сде-
лаете, то результирующий объектный код, полученный в результате
ассемблирования, будет сохранен автоматически, независимо от раз-
мера генерируемого кода. Если вы не хотите использовать такую
возможность, то имя файла не вводите. Не вводите вторую запятую,
иначе GENS4 будет считать, что вы вводите пустое имя файла! Более
подробно с командой "А" можно познакомиться в приложении 3.
Ключи ассемблирования:
1 - выдает листинг таблицы символов в конце второго прохода
ассемблирования;
2 - запрет на генерацию объектного кода;
4 - производит листинг ассемблирования (отметим, что в ранних
версиях ассемблера такой возможности не было);
8 - направить листинг ассемблирования на печать;
16 - просто помещает объектный код, если он, конечно, получен,
после таблицы символов. Счетчик адресов обновляется таким обра-
зом, что объектный код может быть помещен в одну область памяти,
а работать - в какой-либо другой;
32 - исключение проверки того, куда помещается объектный код
(это бывает полезно для ускорения ассемблирования);
Для того, чтобы скомбинировать ключи, просто складывайте их
один с другим. Так, код "ФЗЗ" производит быстрое ассемблирование
- не выдается листинг, не производится проверка, чтобы увидеть,
куда в настоящий момент помещают объектный код, при этом в конце
выдается листинг таблицы символов.
Отметим, что при использовании ключа "А 16" директива "ENT"
не будет иметь эффекта. Если использован ключ "А 16", то вы можете
определить, где находится объектный код, используя команду редак-
тора "Y". По этой команде можно определить конец текста (его назы-
вают второй номер) и затем добавить к нему назначенный размер
таблицы +2.
Ассемблирование происходит за два прохода: в течение 1-го
прохода GENS4 ищет ошибки и собирает таблицу символов, второй
проход генерирует объектный код (если не указан ключ 2). В течение
первого прохода на экране и принтере ничего не отображается, пока
не встретится ошибка. В случае ошибки будет выдано сообщение об
ошибке с номером ошибки за ним (см. Приложение 1). Ассемблиро-
вание приостанавливается - нажмите клавишу "Е" для возврата в
редактор или любую другую клавишу для продолжения ассемблиро-
вания следующей строки.
В конце первого прохода будет выдано сообщение:
PASS 1 ERRORS: NN
Если хоть одна ошибка будет обнаружена, то ассемблирование
затем будет остановлено и перехода ко второму просмотру не про-
изойдет. Если какие-нибудь метки были обнаружены в поле операн-
да, но не объявлены в поле метки, то последует сообщение:
♦WARNING* LABEL ABSENT
В течение второго прохода генерируется объектный код (если
генерация не запрещена ключом 2 (см. выше)).
Во время второго прохода листинг ассемблера не производится,
кроме случая, когда указан ключ 4 или команда ассемблера L+.
В 32-х символьной версии листинг ассемблера состоит обычно из
двух строк в следующей форме:
С000 210100 25 LABEL
LD HL, 1
1 6 11 21...26,
тогда как в 51-символьной версии листинг печатается в одну
строку. Если листинг не помещается в одну строку, то он завершается
на следующей.
На первом месте в строке стоит значение счетчика адресов,
который соответствует данной строке. Если в строке встречаются
инструкции ORG, EQU или ENT (см.2.7), то на первом месте будет
стоять значение поля операнда инструкции. Эта запись обычно ото-
бражается в шестнадцатиричном виде, хотя используя команду "*D+"
ее можно отобразить и в неудобном десятичном виде (см.2.9).
Следующая запись с позиции 6 занимает до 8 символов в строке
(представляет до 4-х байтов) и является объектным кодом текущей
инструкции (см. ниже команду *с).
Затем следует номер строки - целое число в диапазоне 1 ...32767.
Позиции 21...26 первой строки содержат 6-символьную метку,
определенную в этой строке.
После метки следует мнемоника инструкции, которая занимает
поз. 21...24. (В 32-символьной версии это будет новая строка, если
только не использовать команду *С).
Затем, с позиции 2, следует поле операндов; и завершают строку
комментарии, которые при необходимости можно продолжить на
другой строке.
Команда *С ассемблера может быть использована для получе-
ния короткой строки листинга ассемблирования - ее вводят, чтобы не
включать 9 символов, представляющих объектный код инструкции.
Это дает возможность отобразить большинство строк ассемблера в
виде, удобном для экрана со строкой в 3 позиции (см. Ниже разд.2.8.).
Изменение формата листинга.
(Только для 32-символьной версии)
С помощью команды "РОКЕ" вы можете модифицировать фор-
му, по которой каждая строка листинга разбивается внутри 32-сим-
вольной версии GENS4 на 3 части. Указания, как это сделать,
приведены ниже. Мы отличаем понятие "строка ассемблера", которая
является текущей строкой листинга ассемблер и хранится во внеш-
нем буфере, от понятия "экранная строка", которая является стро-
кой, действительно возникающей на дисплее. Строка ассемблера
обычно порождает более одной экранной строки.
1. 51-й (#33) байт от начала GENS4 содержит значение, опре-
деляющее позицию, до которой будет отображаться строка листинга
на экране. Циклически меняя этот байт от 0 до любого другого зна-
чения (256) можно заканчивать первую экранную строку в необхо-
димом месте (это особенно полезно при использовании
микроформатного принтера).
2. 52-й (#34) байт от начала GENS4 дает номер позиции, с
которой должна начинаться каждая последующая экранная строка.
3. 53-й (#35) байт от начала GENS4 указывает количество сим-
волов остатка строки ассемблера, который будет выведен во второй
экранной строке после первой.
Например, вы хотите, чтобы каждая первая экранная строка
содержала 20 символов (т.е. не включала бы поле метки) и затем
каждая последующая экранная строка начиналась с позиции 1 и
занимала бы всю строку. Также предположим, что вы загрузили
GENS4 с десятичного адреса 26000. Чтобы получить вышеуказанные
изменения, надо из Бейсика ввести следующие инструкции:
РОКЕ 26051, 20
РОКЕ 26052, 1
РОКЕ 26053, 31
Вышеприведенные модификации возможны только в том слу-
чае, когда не была использована команда 1С.
Листинг может быть приостановлен в конце строки нажатием
[CAPS SHIFT ] и [SPACE ] вместе. В последующем нажимайте кла-
вишу "Е" для возврата в редактор или любую другую клавишу для
продолжения листинга.
Единственными ошибками, которые могут появиться во втором
проходе, являются ошибки типа "*ERROR*10" (см. Прил. 1) "BAD
ORG!" (которая появляется, когда объектный файл накладывается на
GENS4, исходный файл или на таблицу символов - это может быть
предотвращено использованием другого формата) *ERROR* 10 - это
не фатальная ошибка, поэтому вы можете продолжать ассемблиро-
вание, как и на первом проходе, тогда как ошибка "BAD ORG!"
является фатальной и сразу же возвращает управление редактору.
В конце второго прохода на дисплее будет отображено сообще-
ние, следуя за предыдущим об отсутствующих метках:
PASS 2 ERRORS:NN
Затем появится следующее сообщение:
TABLE USED: ХХХХХ FROM YYYYY
Это сообщение информирует о том, какая часть таблицы симво-
лов была заполнена. В этом случае, если была правильно использо-
вана директива "ENT", выдается сообщение:
EXECUTES: NNNNN IS DISPLAYED
Это показывает стартовый адрес задачи. Вы можете выполнить
задачу, используя команду редактора "R". Будьте осторожны при
использовании команды "R" в том случае, когда вы не завершили
успешно ассемблирование и не увидели сообщение
"EXECUTES:NNNNN".
Итак, если указан ключ "Iм, то используется список меток в
алфавитном порядке и будут напечатаны соответствующие им зна-
чения. Количество информации, отражаемой в одной строке, может
быть изменено директивой "РОКЕ" с адреса "начало GENS4 + 50"
помещением в эту ячейку уместного значения, по умолчанию зано-
сится 2.
Контролируйте возврат в редактор.
2.1. Формат оператора ассемблера.
команды Z80. Если первый символ строки отличается от вышеприве-
денных, то в строке должна быть метка - см.п.2.2.
После обработки присутствующей метки (или если первый сим-
вол в строке - пробел или табуляция) ассемблер исследует следую-
щий значащий символ и предполагает, что он будет или символом
конца строки, или началом команды Z80 (см. Прил. 2), состоящий из
4-х символов и ограниченный пробелом (табуляцией или <CR>).
Иногда присутствует код команды и требуется один или более
операндов, тогда поле операндов следует после набора пробелов (та-
буляции) .
Оператор может состоять только из одной, это бывает полезно
для улучшения читаемости листинга.
Комментарии могут следовать в любом месте после поля операн-
дов или поля кода команды (если у нее нет аргументов).
2.2. Метки
Метка - это символьное имя, представляющее 16 бит информа-
ции. Метка может быть использована для выделения адреса особен-
ной инструкции, или для выделения области данных, или может быть
использована как константа для директивы "EQU" (См. п.2. 7).
Если метку представить значением более 8 битов и она затем
используется в контексте применительно к 8-битовой константе, то
ассемблер будет выдавать сообщение об ошибке:
LABEL EQ #1234
LD A, LABEL
Будет выдано *ERROR*l(), когда во время второго прохода об-
работка второго операнда. Метка может содержать любое количество
символов (см. Ниже), хотя только первые 6 символов - значащие. Эти
первые 6 символов должны быть уникальными, иначе метка будет
повторно определена (*ERROR*). Метка не должна образовывать
зарезервированное слово, хотя зарезервированное слово можно внед-
рить как часть метки.
В метках можно использовать символы 0...9, A...Z и $. Можно
использовать как большие, так и малые буквы, символы [, , ], , #,
и -. Метка должна начинаться с буквы. Некоторые примеры возмож-
ных меток представлены ниже:
LOOP
A-LONG-LABEL
L[l]
L[2]
А
LDIR - это незарезервированная инструкция
TWOS
2.3. Счетчик адресов
Когда метка встречается в первый раз, ее помещают в таблицу
вместе с двумя признаками, которые позже показывают как эту мет-
ку соотносят по алфавиту с другими, находящимися внутри таблицы.
Если в первый раз метка появляется в поле меток, то ее значение
(данное счетчиком адресов или значение выражения директивы
"EQU") заносят в таблицу символов. В другом случае значения зано-
сятся, когда бы не встретилось имя метки в последующем в поле
метки.
Данный тип таблицы символов называется таблицей символов
типа двоичного дерева и ее структура дает возможность заносить
имена и извлекать их за очень короткое время - это существенно для
больших программ.
Запись в таблице занимает от 8 до 13 бит, в зависимости от
длины имени.
Если за время первого прохода имя встречается более одного
раза, то будет выдано сообщение об ошибке (*ERROR*4), так как
ассемблер не знает, какое значение должно соответствовать имени
метки.
Если значение для имени не найдено, то в конце ассемблирова-
ния будет выдано сообщение:
♦WARNING* SYMBOL ABSENT
Отсутствие определения имени не мешает продолжению ассем-
блирования.
Отметим, что только первые 6 символов метки вводятся в таб-
лицу символов, что определяется ее размером. В конце ассемблиро-
вания вам могут быть выданы сообщения статистики о том, как много
памяти было использовано таблицей символов в течение трансляции
- вы можете изменить максимальный размер памяти, отведенный под
таблицу символов.
2.4. Таблица символов
Когда метка встречается в первый раз, ее помещают в таблицу
вместе с двумя признаками, которые позже показывают как эту мет-
ку соотносят по алфавиту с другими, находящимися внутри таблицы.
Если в первый раз метка появляется в поле меток, то ее значение
(данное счетчиком адресов или значение выражения "EQU") заносят
в таблицу символов. В другом случае значения заносятся, когда бы
не встретилось имя метки в последующем в поле метки.
Данный тип таблицы символов называется таблицей символов
типа двоичного дерева и ее структура дает возможность заносить
имена и извлекать их за очень короткое время - это существенно для
больших программ.
Запись в таблице занимает от 8 до 13 бит, в зависимости от
длины имени.
Если за время первого прохода имя встречается более одного
раза, то будет выдано сообщение об ошибке (2ERROR*4), так как
ассемблер не знает, какое значение должно соответствовать имени
метки.
Если значение для имени не найдено, то в конце ассемблирова-
ния будет выдано сообщение:
♦WARNING* SYMBOL ABSENT
Отсутствие определения имени не мешает продолжению ассем-
блирования.
Отметим, что только первые 6 символов метки вводятся в таб-
лицу символов, что определяется ее размером. В конце ассемблиро-
вания вам могут быть выданы сообщения статистики о том, как много
памяти было использовано таблицей символов в течение трансляции
- вы можете изменить максимальный размер памяти, отведенный под
таблицу символов.
2.5. Выражения
" - символьная константа при считывании числа (десятичного,
шестнадцатиричного или двоичного) GENS4 выбирает последние
значения 16 бит числа (т.е. MOD 65536), например, 70016 станет 4480
и #5А2С4 становится #А2С4.
Обеспечивается широкий набор операндов, но их приоритет не
соблюдается: выражения вычисляются строго слева направо. Опера-
торы *, / и ? приведены для версий с дополнительными возможностя-
ми и не являются частью данного набора выражений, который мог бы
увеличить размер GENS4. Если выражение заключено в круглые
скобки, то его представляют как содержимое адреса памяти. Так, в
инструкции LD HL, (LOC+5) в регистровую пару HL загружается
16-ти битовое значение, содержащееся в ячейке памяти с адресом
LOC+5.
Некоторые инструкции Z80 (ZR и DJNZ) предполагают операн-
ды, которые предполагают 8-ми битовые значения, а не 16-ти бито-
вые - это называется относительной адресацией. Когда имеет место
относительная адресация, GENS4 автоматически выдает значение
счетчика адресов следующей инструкции из значения, представлен-
ного в поле операндов текущей инструкции для того, чтобы получить
относительный адрбс для текущей инструкции. Область допустимых
значений относительного адреса простирается от -128+значение
счетчика адресов следующей инструкции до значения счетчика адре-
сов следующей инструкции +127.
Если же вы желаете определить относительный переход от зна-
чения счетчика адресов текущей инструкции, то вы должны исполь-
зовать символ $ (резервную инструкцию), за которым следует
требуемое смещение. Относительно значения счетчика адресов теку-
щей инструкции смещение должно находиться в диапазоне от -126 до
+129 включительно.
Примеры выражений:
5000 - LABEL
% Ю01101! % Ю11 - дает 1000110
#3456?#1000 - дает 456
4+5*3-8 - дает 19
$-LABEL+8
2345/7-1 - дает 334
..у»
(5*LABEL-# 1000$ % 1111)
17$% 1000-дает 25
Отметим, что пробелы могут быть помещены между термами и
операторами и наоборот, но не внутри термов.
Если операция умножения получит ответ с абсолютным значе-
нием, большим, чем 32767, то появится ошибка *ERROR*15 тогда
как при делении на 0 - ошибка *ERROR*14, в противном случае
переполнение игнорируется.
Вся арифметика использует вторую дополнительную форму, где
любое число, большее чем 32767, представляется как отрицательное,
например: