GENS-4
1.1 ВВЕДЕНИЕ И ИНСТРУКЦИИ ЗАГРУЗКИ
GENS-4 — это мощный и легкий в использовании ассемблер для Z80, который
очень близок к стандартному ассемблеру ZILOG по определению. В отличии от
многих других ассемблеров пригодных для компьютеров "SPECTRUM", GENS-4
является обширной, профессиональной частью программного обеспечения и
побуждает вас очень тщательно изучать следующие разделы вместе с примером
приложения 3 перед попытками использования ассемблера.
Если вы еще новичок, то вначале проработайте приложение 3 или
проконсультируйтесь в одной из отличных книг, приведенных в библиографии.
У нас есть версии систем D EVP AC 4 на диске, для DISCIPLE DISCOVERY
дисковой системы и для компьютеров SPECTRUM PLUS 3. Эти версии работают
точно так же, как описано в этом документе, просто заменяйте слово
"микропривод", там где оно встречается, на слова "ДИСК OPUS", "ДИСК PLUS 3"
или "DISCIPLE ДИСК" в соответствии с вашей системой. Существует несколько
внешних особенностей для версии PLUS 3, которые описаны на дополнительном
листке.
GENS-4 занимает приблизительно 10 К памяти и использует свой внешний
стек, так что это — замкнутая часть программного обеспечения. Она содержит
собственный строчный редактор который помещает текстовой файл сразу за
кодами GENS-4, в то время как таблица символов ассемблера создается за
текстовым файлом, поэтому вы должны предоставить достаточное пространство,
чтобы поместить сам ассемблер, таблицу символов максимального размера и
текстовой файл, который вы, вероятно, будете использовать в текущем сеансе.
Поэтому загружать GENS-4 часто удобнее в нижние адреса памяти.
Существует 2 версии ассемблера на кассете, обе на стороне 1. Сначала
помещена версия с 51 символом в строке, за ней следует рассматриваемая версия с
32 символами. Их имена на ленте являются соответственно GENS4-51 и GENS4 и вы
должны использовать ту версию, которая больше вам подходит. Версия GENS4-51
на 400 байт длиннее, чем GENS4. Для загрузки GENS4 поместите магнитную ленту с
ним в кассетный магнитофон и введите:
LOAD ""CODE XXXXX [ENTER]
и нажмите клавишу "воспроизведение" магнитофона. Или:
LOAD "GENS4" CODE XXXXX [ENTER]
или:
LOAD "GENS4-51" CODE XXXXX [ENTER],
где: XXXXX — десятичный адрес с которого вы хотите загрузить GENS4.
Только после того, как вы загрузите коды GENS4 в компьютер, вы сможете
войти в ассемблер, набрав:
RANDOMIZE USR XXXXX,
где ХХХХХ — адрес, с которого загружены коды ассемблера.
Если в любой последующий момент вы вновь пожелаете войти в ассемблер, то
вы должны просто адресоваться к ячейке ХХХХХ, которая хранит предварительно
созданный файл информации.
Например, вы хотите загрузить ассемблер с десятичного адреса 26000. Для
этого наберите:
LOAD "" CODE 26000 [ENTER] RANDOMIZE USR 26000 [ENTER] 1
Для перезапуска ассемблера используйте:
RANDOMIZE USR 2 6000 в пределах БЕЙСИКА.
Только после ввода GENS4 на экране возникает подсказка в виде символа " "
(подсказка команд редактора).
Раздел 3 содержит информацию о том, как нужно вводить и редактировать
текст, а раздел 2 — о том, что нужно вводить.
1.2 ПОЛУЧЕНИЕ КОПИИ СИСТЕМЫ/
После загрузки GENS4 в память вашего SPECTRUM'a вы можете получить
копию ассемблера следующим образом:
SAVE "GENS4-51- CODE ХХХХХ, 113 92 [ENTER] ИЛИ
SAVE "GENS4-2 CODE ХХХХХ, 113 92 [ENTER]
для кассеты,
SAVE * "M";1;"GEHS4-51" CODE ХХХХХ, 11392 [ENTER]
или
SAVE * "M";1;'GENS4" CODE XXXXX, 11392 [ENTER]
для микродрайва, где: XXXXX — адрес, с которого вы загрузили GENS4.
Вы должны сделать эту копию перед входом в GENS4 для того, чтобы сохранить
перемещаемую информацию внутри программы.
Пожалуйста, заметьте, что мы разрешаем вам сделать копию GENS4 для вашего
собственного пользования, чтобы вы могли уверенно программировать.
Пожалуйста, не делайте копий GENS4 для передачи (или, что еще хуже, для
продажи) вашим друзьям. Мы выпускаем программное обеспечение по очень
разумной цене и полной послепродажной поддержкой, но если люди сами начнут
копировать наше программное обеспечение, то мы перестанем продолжать это
делать. Пожалуйста, покупайте но не крадите!
РАЗДЕЛ 2
2.0 ПРИНЦИП РАБОТЫ/ GENS4, КЛЮЧИ АССЕМБЛЕРА, ФОРМАТ
ЛИСТИНГА
GENS4 является быстрым двухпроходным ассемблером для Z80, который
ассемблирует всю стандартную мнемонику для Z80 и содержит следующие
особенности: макросы, условное ассемблирование, множество команд ассемблера
и таблицу символов в виде двоичных троек.
Когда вы вызываете ассемблирование, то вы используете команду "А":
A4,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-ой проход генерирует объектный код
(если не указан ключ 2). В течение первого прохода на экране и на принтере ничего
не отражается, пока не встретится ошибка. В случае ошибки будет выдано
сообщение об ошибке с номером ошибки за ним (см. приложение 1).
Ассемблирование приостанавливается — нажмите клавишу "Е" для возврата в
редактор или любую другую клавишу для продолжения ассемблирования
следующей строки.
В конце первого прохода будет выдано сообщение:
PASS 1 ERRORS:NN
Если хоть одна ошибка будет обнаружена, то ассемблирование затем будет
остановлено и перехода ко второму просмотру не произойдет. Если какие-нибудь
метки были обнаружены в поле операнда, но не объявлены в поле метки, то
последует сообщение:
*WARNING* LABEL ABSENT
B течение второго прохода генерируется объектный код (если генерация не
запрещена ключом 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-символьную метку, определенную в
этой строке.
После метки следует мнемоника инструкции, которая занимает поз. 31...34 (в
32символьной версии это будет новая строка, если только не использовать команду
*С).
Затем, с позиции 2, следует поле операндов; и завершают строку комментарии,
которые при необходимости можно продолжить на другой строке.
Команда *С ассемблера может быть использована для получения короткой
строки листинга ассемблирования — ее вводят, чтобы не включать 9 символов,
представляющих объектный код инструкции. Это дает возможность отобразить
большинство Строк ассемблера в виде, удобном для экрана со строкой в 32 позиции
(см. ниже разд.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 I
РОКЕ 26052,1 1
РОКЕ 26053,31
Вышеприведенные модификации возможны только в том случае, когда не была
использована команда *С.
Листинг может быть приостановлен в конце строки нажатием [CAPS SHIFT] и
[SPACE] вместе. В последующем, нажимайте клавишу "Е" для возврата в редактор
или любую другую клавишу для продолжения листинга.
Единственными ошибками, которые могут появиться во втором проходе,
являются ошибки типа "*ERROR*10" (см. приложение 1) и "BAD ORG!" (которая
появляется, когда объектный файл накладывается на GENS4, исходный файл или
на таблицу) символов — это может быть предотвращено использованием другого
формата). *ERROR* 10—это не фатальная ошибка, поэтому вы можете продолжать
ассемблирование, как и на первом проходе, тогда как ошибка "BAD ORG!" является
фатальной и сразу же возвращает управление редактору.
В конце второго прохода на дисплее будет отображено сообщение, следуя за
предыдущим об отсутствующих метках:
PASS 2 ERRORS:NN
Затем появится следующее сообщение:
TABLE USED: XXXXX FROM YYYYY
Это сообщение информирует о том, какая часть таблицы символов была
заполнена. В этом случае, если была правильно использована директива "ENT",
выдается сообщение:
EXECUTES: NNNNN IS DISPLAYED
Это показывает стартовый адрес задачи. Вы можете выполнить задачу,
используя команду редактора "R". Будьте осторожны при использовании команды
"R" в том случае, когда вы не »а вершили успешно ассемблирование и не увидели
сообщения "EXECUTES: NNNNN".
Итак, если указан ключ "1", то используется список меток в алфавитном
порядке и будут напечатаны соответствующие им значения. Количество
информации, отражаемой в одной строке, может быть изменено директивой
"РОКЕ" с адреса "НАЧАЛО GENS4 + 50" помещением в эту ячейку уместного
значения, по умолчанию заносится 2.
Контролируйте возврат в редактор.
2.1. ФОРМАТ ОПЕРАТОРА АССЕМБЛЕРА
Каждая строка текста, которая будет обрабатываться GENS4, должна иметь
следующий формат, где определение поля необязательно:
метка код команды операнды комментарий
START LD HL, LABEL /получение метки
Пробелы и табуляция обычно игнорируется. Строка обрабатывается
следующим образом:
первый символ строки проверяют и последующие действия зависят от его
сущности:
; — целую строку трактуют как комментарий, т.е. просто игнорируют;
* — предполагается, что следующий символ (символы) образуют команду
ассемблера (см. пункт 2.8). Все символы после команды трактуются как
комментарии;
<CR> — символ конца строки. Линия просто игнорируется;
— пробел или табуляция, то GENS4 предполагает, что следующий отличный от
пробела или табуляции символ будет началом кода команды Z80.
Если первый символ строки отличается от вышеприведенных, то в строке
должна быть метка — см.п. 2.2.
После обработки присутствующей метки (или если первый символ в строке —
пробел или табуляция) ассемблер исследует следующий значащий символ и
предполагает, что он будет или символом конца строки, или началом команды Z80
(см. прил.2), состоящей из 4-х символов и ограниченной пробелом (табуляцией или
<CR>).
Иногда присутствует код команды и требуется один или более операндов, тогда
поле операндов следует после набора пробелов (табуляции).
Оператор может состоять только из одной, это бывает полезно для улучшения
читаемости листинга.
Комментарии могут следовать в любом месте после поля операндов или поля
кода команды (если у нее нет аргументов).
2.2. МЕТКИ
Метка — это символьное имя, представляющее 16 бит информации. Метка
может быть использована для выделения адреса особенной инструкции, или для
выделения области данных, или может быть использована как константа для
директивы "EQU" (см.п.2.7).
Если метку представить значением более 8 битов и она затем используется в
контексте применительно к 8-битовой константе, то ассемблер будет выдавать
сообщение об ошибке:
LABEL EQU #12 3 4
LD A,LABEL
Будет выдано *ERROR*10, когда во время второго прохода обработка второго
операнда. Метка может содержать любое количество символов (см. ниже), хотя
только первые 6 символов — значащие. Эти первые 6 символов должны быть
уникальными иначе метка будет повторно определена (*ERROR*). Метка не должна
образовывать зарезервированное слово, хотя зарезервированное слово можно
внедрить как часть метки.
В метках можно использовать символы 0...9, A...Z и можно использовать как
большие, так и малые буквы, символы ,#, _. Метка должна начинаться с буквы.
Некоторые примеры возможных меток представлены ниже:
LOOP
A_LONG_LABEL
L1 L2 А_
LDIR — это незарезервированная инструкция
TWO_S
2.3 ТАБЛИЦА СИМВОЛОВ
Когда метка встречается в первый раз ее помещают в таблицу вместе с двумя
признаками, которые позже показывают, как эту метку соотносят по алфавиту с
другими, находящимися внутри таблицы. Если в первый раз метка появляется в
поле меток, то се значение (данное счетчиком адресов или значение выражения "
EQU") заносят в таблицу символов. В другом случае значения заносятся, когда бы
ни встретилось имя метки в последующем в поле метки.
Данный тип таблицы символов называется таблицей символов типа двоичного
дерева и ее структура дает возможность заносить имена и извлекать их за очень
короткое время — это существенно для больших программ.
Запись в таблице занимает от 8 до 13 байт, в зависимости от длины имени.
Если за время первого прохода имя встречается более одного раза, то будет
выдано сообщение об ошибке (*ERROR*4), так как ассемблер не знает, какое
значение должно соответствовать имени метки.
Если значение для имени не найдено, то в конце ассемблирования будет
выдано сообщение:
*WARNING* SYMBOL ABSENT
Отсутствие определения имени не мешает продолжению ассемблирования.
Отметим, что только первые 6 символов метки вводятся в таблицу символов,
что определяется ее размером. В конце ассемблирования вам могут быть выданы
сообщения статистики, о том, как много памяти было использовано таблицей
символов в течение трансляции — вы можете изменить максимальный размер
памяти, отведенный под таблицу символов.
2.4. ВЫРАЖЕНИЯ
Выражения — это запись операндов, образованная или простым термом или
комбинацией термов, разделенных операндом. Ниже определены понятия терма и
операнда:
терм:
десятичная константа например: 1024
шестнадцатиричная константа Например: #4А5
двоичная константа например: % 100101
символьная константа например: "А"
метка например: L1029
Может также использоваться для обозначения текущего значения счетчика
адресов. Оператор; + — сложение;
- — вычитание; & логическое "И" (AND); @ —логическое "ИЛИ" (OR); ! —
логическое "XOR";
* — алгебраическое умножение;
/ — алгебраическое деление;
? — MOD-функция (А?В = А-(А/В)*В
Замечание:
# — используют для того, чтобы отметить начало 16-ричного числа;
% —используют для того, чтобы отметить начало двоичного числа;
" — символьная константа.
При считывании числа (десятичного, шестнадцатиричного или двоичного)
GENS4 выбирает последние значения 16 бит числа (т.е. MOD 65536), например,
70016 станет 4480 и #5А2С4 становится #А2С4.
Обеспечивается широкий набор операндов, но их приоритет не соблюдается:
выражения вычисляются строго слева направо. Операторы *, / и ? приведены для
версий с дополнительными возможностями и не являются частью данного набора
выражений, который мог бы увеличить размер GENS4. Если выражение заключено
в круглые скобки, то его представляют как содержимое адреса памяти. Так, в
инструкции LD HL,(LOG +5) в регистровую пару HL загружается 16-ти битовое
значение, содержащееся в ячейке памяти с адресом LOG + 5.
Некоторые инструкции Z80 (JR и DJNZ) предполагают операнды, которые
предполагают 8-ми битовые значения, а не 16-ти битовые — это называется
относительной адресацией. Когда имеет место относительная адресация, GENS4
автоматически выдает значение счетчика адресов следующей инструкции из
значения, представленного в поле операндов текущей инструкции для того, чтобы
получить относительный адрес для текущей инструкции. Область допустимых
значений относительного адреса простирается от -128 + значение счетчика
адресов следующей инструкции до значения счетчика адресов следующей
инструкции +127.
Если же вы желаете определить относительный переход от значения счетчика
адресов текущей инструкции, то вы должны использовать символ $ (резервную
инструкцию), за которым следует требуемое смещение. Относительно значения
счетчика адресов текущей инструкции смещение должно находиться в диапазоне
от -126 до +129 включительно.
Примеры выражений:
50 0 0 - LABEL
%1001101!%1011 -дает 1000110
#3456?#1000 - дает 456
4+5*3-8 - дает 19
$-LABEL+8
2345/7-1 -дает 334
"Y"-";"+7 (5*LABEL-*1000&%1111)
17&%1000 - дает 25
Отметим, что пробелы могут быть помещены между термами и операторами и
наоборот, но не внутри термов.
Если операция умножения получит ответ с абсолютным значением, большим
чем 32767, то появится ошибка *ERROR*15, тогда как при делении на 0 — ошибка
*ERROR*14, в противном случае переполнение игнорируется.
Вся арифметика использует вторую дополнительную форму, где любое число,
большее чем 32767, представляется как отрицательное, например:
60000-5536 (60000-65536).