Игровые программы 1989 г.

Системные программы - описание GENS4.


15. GENS4
(HISOFT GENS4)

Раздел i. Запуск
1.1. Введение и инструкции загрузки

GENS4 - это мощный и легкий в использовании ассемблер
для Z80, который очень близок к стандартному ассемблеру
ZILOG по определению. В отличии от многих других ассембле-
ров. Пригодный для компьютеров "SPECTRUM", GENS4 является
обширной, профессиональной частью программного обеспечения и
побуждает Вас очень тщательно изучать следующие разделы
вместе с примером приложения 3 перед Попытками использования
ассемблера.

Если Вы еще навичок, то вначале проработайте примечание
денных в библиографии.

У нас есть версии систем DEVPAC 4 на диске, для DISCIPLE
& OPUS DISCOVERI дисковой системы и для компьютеров
SRECTRUM PLUS 3. Эти версии работают точно так жеЛ как опи-
сано в этом документе, просто заменяйте^ слово "микропри-
вод", там где оно встречается, на слова "ДИСК OPUS", "ДИСК
PLUS 3" или "DISCIPLE ДИСК" в соответствии с Вашей системой.
Существует несколько внешних особенностей для версии PLUS 3,
которые описаны на дополнительном листке.

GENS4 занимает приблизительно 10к в памяти и использует
свой внешний стек, так что это - замкнутая часть программно-
го обеспечения. Она содержит собственный строчный редактор,
который помещает текстовой файл сразу за кодами GENS4, в то
время как таблица символов ассемблера создается за текстовым
файлом, поэтому Вы должны предоставить достаточное простран-
ство, чтобы поместить сам ассемблер, таблицу символов макси-
мального размера и текстовой файл, который Вы, вероятно, бу-
дете использовать в текущем сеансе. Поэтому загружать GEN54
часто удобнее в нижние адреса памяти.

Существует 2 версии ассемблера на кассете, обе на сторо-
не 1. Сначала помещена версия с 51 символом в строке, за ней
следует рассматриваемая версия с 32 символами. Их именами на
ленте являются соответственно GENS4-51 и GENS4 и Вы должны
использовать ту версию, которая больше Вам подходит. Версия
GENS4-51 на 400 байт длиннее, чем GENS4.

Для загрузки GENS4 поместите магнитную ленту с ним в
кассетный магнитофон и введите:

LOAD "" CODE ХХХХХ CENTER]
и нажмите клавишу "воспроизведение" магнитофона.

Или:

LOAD "GENS4" CODE ХХХХХ CENTER] или:

LOAD "GENS4-51" CODE ХХХХХ CENTER] где:

ХХХХХ - десятичный адрес, с которого Вы хотите загрузить
GENS4.

Только после того, как Вы загрузите коды GENS4 в компь-
ютер, Вы можете войти в ассемблер, набрав:

RANDOMIZE USR ХХХХХ, где

ХХХХХ - адрес, с которого загружены коды ассемблера.

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

Например, Вы хотите загрузить ассемблер с десятичного
адреса 12600W. Для этого наберите:

LOAD "" CODE 26000 CENTER]
RANDOMIZE USE 26000 CENTER]

Для перезапуска ассемблера используйте*.

RANDOMIZE USE 26000 в пределах бейсика.

Только после ввода GENS4 на экране возникнет подсказка в
виде символа ">" (подсказка команд редактора).

Раздел 3 содержит информацию о том, как нужно вводить и
редактировать текст, а раздел 2 - о том, что нужно вводить.

1.2. Получение копии системы

После загрузки GENS4 в память Вашего SPECTRUMa Вы може-
те получить копию ассемблера следующим образом:

SAVE "GENS4-51" CODE ХХХХХ,11392 CENTER] или для

SAVE "GENS4" CODE ХХХХХ,11010 CENTER] кассеты

SAVE * "M";i;"GENS4-51" CODE ХХХХХ,11392 CENTER] или
SAVE * 1;"GENS4" CODE ХХХХХ,11392 CENTER для микро-

драйвера ,

гд§: ХХХХХ - адрес, с которого Вы загрузили GENS4.

Вы должны сделать эту копию перед входом в GENS4 для то-
го, чтобы сохранить перемещаемую информацию внутри програм-
мы .

Инструкции получения копии для DEVPAC серии PLUS смотри-
те на дополнительном листке.

Пожалуйста, заметьте, что мы разрешаем Вам сделать копию
GENS4 для Вашего собственного пользования, чтобы Вы могли
уверенно программировать. Пожалуйста, не делайте копии GENS4
для передачи (или, что еще хуже", для продажи) Вашим друзьям.
Мы выпускаем программное обеспечение по очень разумной цене
и полной послепродажной поддержкой, но если люди сами начнут
копировать наше программное обеспечение, то мы перестанем
продолжать это делать.. Пожалуйста, покупайте, но не крадите!

Раздел 2. Подробности GENS4

2.0. Принцип работы GENS4, ключи ассемблера, формат листинга

GENS4 является быстрым двухпроходным ассемблером для
Z80, который ассемблирует всю стандартную мнемонику для Z80
и содержит следующие особенности! макросы, условное ассемб-
лирование, множество команд ассемблера и таблицу символов в
виде двоичных троек.

Когда Вы вызываете ассемблирование, то Вы используете
команду "А":

А4,2000,i:TEST CENTER]

Первый код (4 - см. выше) после а определяет условия
трансляции, которые Вы хотите иметь в данный момент. Эти
условия трансляции и их ключи будут перечислены ниже. Если
Вы не хотите использовать ключи,то номер набирать не надо,
поставьте только запятую.

Второй код (2000 - см. выше) - это десятичный размер
символов в байтах. По умолчанию (при простом использовании
запятой без кодов), GENS4 будет выбирать размер таблицы сим-
волов, подходящих к размеру исходного файла - обычно это бы-
вает вполне приемлемо. Однако, при использовании ключа "вклю-
чить" Вы можете задать размер таблицы символов больше обыч-
ного, ассемблер вэтом случае не будет определять размер таб-
лицы символов, которая^ будет построена.

После указания размера таблицы символов Вы можете ввести
имя файла, например, HTEST, как указано выше. Если Вы это
сделаете, то результирующий обьектный код, полученный в ре-
зультате ассемблирования будет сохранен автоматически, неза-
висимо от размера генерируемого кода. Если Вы не хотите ис-
пользовать такую возможность, то имя файла не вводите. Не
вводите вторую запятую, иначе GENS4 будет считатьЛ что Вы
вводите пустое имя файла! Более подробно с командой "А" мож-
но познакомиться в приложении 3.

Ключи ассемблирования!

1 - выдает листинг таблицы символов в конце второго прохода

ассемблирования;

2 - запрет на генерацию объектного кода;

4 - производит листинг ассемблирования (отметим, что в ран-
них версиях ассемблера такой возможности не было);

8 - направить листинг ассемблирования на печать;

16 - просто помещает обьектный код, если он, конечно, полу-
чен, после таблицы символов. Счетчик адресов обновляет-
ся таким образом, что обьектный код может быть помещен
в одну область памяти, а работать - в какой-либо другой;

32 - исключение проверки того, куда помещается обьектный код
(это бывает полезно для ускорения ассемблирования );

Для того, чтобы скомбинировать ключи, просто складывайте
их один с другим. Так, код 'АЗЗ" производит быстрое ассемб-

дарование - не выдается листинг, не производится провес
«пробы увидеть, куда в настоящий момент помещают обье??««л
КОД» при этом в конце выдается листинг таблицы символов

Отметим, что при использовании ключа "А16" директива
"ENT" не будет иметь эффекта. Если использован ключ "А16",
tq Вы можете определить, где находится объектный код, ис-
пользуя команду редактора "Y". По этой команде можно опреде-
лить конец текста (его называет второй номер) и затем доба-
вить к нему назначенный размер таблицы +2.

Ассемблирование происходит за два прохода.' в течение
первого прохода GENS4 -ищет ошибки и собирает таблицу симво-
лов, второй проход генерирует объектный код (если не указан
ключ 2). В течение первого прохода на экране и принтере ни-
чего не отображается, пока не встретится ошибка. В случае
ошибки будет выдано сообщение об ошибке с номером ошибки за
ним (см. Приложение 1). Ассемблирование приостанавливается -
нажмите клавишу "Е" для возврата в редактор или любую другую
клавишу для продолжения ассемблирования следующей строки.

В конце первого прохода будет выдано сообщение:

PASS i ERRORS: NN

Если хоть одна ошибка будет обнаружена, то ассемблирова-
ние затем будет остановлено и перехода ко второму просмотру
не произойдет. Если какие-нибудь метки были обнаружены в по-
ле операнда, но не объявлены в поле метка, то последует со-
общение :

*WARNING* LABEL ABSENT

В течение второго прохода генерируется объектный код
(если генерация не запрещена ключом 2 (см. выше)). Во время
второго прохода листинг ассемблера не производится, кроме
случая, когда указан ключ 4 или команда ассемблера L+.

В 32-х символьной версии листинг ассемблера состоит
обычно из двух строк в следующей форме:

C000 210100 25 LABEL

LD HL,1

16 11 21...26

Тогда как в 51-символьной версии листинг печатается в
одну строку. Если листинг не помещается в одну строку, то он
завершается на следующей.

На первом месте в строке стоит значение счетчика адре-
сов, который соответствует данной строке. Если в строке вст-
речаются инструкции ORG, EQU или ENT (см. 2.7.), то на перв-
ом месте будет стоять значение поля операнда инструкции.
Эта запись обычно отображается в шестнадцатеричном виде,
хотя используя команду "*D+" ее можно отобразить и в неу-
добном десятичном виде (см. 2.9.).

Следующая запись с позиции 6 занимает до 8 символов в
строке (представляет до 4-х байтов) и является объектным ко-
дом текущей инструкции (см. ниже команду *С).

Затем следует номер строки - целое число в диапазоне
1. ..32767.

Позиции 21...26 первой строки содержат 6-символьную мет-
ку, определенную в этой строке.

После метки следует мнемоника инструкции, которая зани-
мает поз 21...24. (в 32-символьной версии это будет новая
строка, если только не использовать команду *С).

Затем, с позиции 26, следует поле операндов; и завершают
строку комментарии, которые при необходимости можно продол-
жить на другой строке.

Команда *С ассемблера может быть использована для полу-
чения короткой строки листинга ассемблирования - ее вво-
дят, чтобы не включать 9 символов, представляющих обьектный
код инструкции. Это дает возможность отобразить большинство
строк ассемблера в виде, удобном для экрана со строкой в 32
позиции (см. ниже разд. 2.8.).

Изменение формата листинга
(только для 32-символьной версии)

С помощью команды "РОКЕ" Вы можете модифицировать форму,
по которой каждая строка листинга разбивается внутри 32-сим-
вольной версии GENS4 на 3 части. Указания, как это сделать,
приведены ниже. Мы отличаем понятие "сорока ассемблера", ко-
торая является текущей строкой листинга ассемблера и хранит-
ся во внешнем буфере, от понятия "экранная строка", которая
является строкой, действительно возникающей на дисплее. Стро-
ка ассемблера обычно порождает более одной экранной строки.

1. 51 (#33#)-й байт от начала GENS4 содержит значение, опре-
деляющее позицию, до которой будет отображаться строка
листинга на экране. Циклически меняя этот байт от 0 до
любого другого значения (<256) можно заканчивать первую
экранную строку в необходимом месте (это особенно полезно
при использовании мйкроформатного принтера).

2. 52-й (#34) байт от начала GENS4 дает номер позиции, с ко-
торой должна начинаться каждая последующая экранная стро-
ка .

3. 53-й (835) байт от начала GENS4 указывает количество сим-
волов остатка строки ассемблера, который будет выведен во
второй экранной строке после первой.

Например, Вы хотите, чтобы каждая первая экранная строка
содержала 20 символов (т.е. не включала бы поле метка) и за-
тем каждая последующая экранная строка начиналась с позиции
1 и занимала бы всю строку. Также предположим, что Вы загру-
зили GENS4 с десятичного адреса 26000. Чтобы получить вышеу-
казанные изменения, надо из бейсика ввести следующие инст-
рукции:

РОКЕ 26051,20
РОКЕ 26052,1
РОКЕ 26053,31

Вышеприведенные модификации возможны только в том слу-
чае, когда не была использована команда *С.

Листинг может быть приостановлен в конце строки нажатием
[CAPS SHIFT] и CSPACE] вместе. В последующем нажимайте кла-
вишу "Е" для возврата в редактор или любую другую клавишу
для продолжения листинга.

Единственными ошибками, которые могут появиться во вто-
ром проходе, являются ошибки типа "*ERRAR*10" (см. прил.1) и
'BAD ORG!" (которая появляется, когда обьектный файл накла-
дывается на GENS4, исходный файл или на таблицу символов -
это может быть предотвращено использованием другого форма-
та). *ERROR*10 - это не фатальная ошибка, поэтому Вы можете

продолжать ассемблирование, как и на первом проходе, тогда
как ошибка "BAD ORG!" Является фатальной и сразу же возвра-
щает управление редактору.

В конце второго прохода на дисплее будет отображено со-
общение, следуя за предупреждением об отсутствующих метках!

PASS 2 ERRORS:NN

затем появится следующее сообщение:
TABLE USED: ХХХХХ FROM YYYYY

Это сообщение информирует о том, какая часть таблицы
символов была заполнена. В этом случае, если была правильно
использована директива "ENT", выдается сообщение:

EXECUTER: 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 EQ 81234

LB A,LABEL

Будет выдано *ERROR*10, когда во время второго прохода
будет проходить обработка второго оператора. Метка может со-
держать любое количество символов (см. ниже) хотя только
первые 6 символов - значащие. Эти первые 6 символов должны
быть уникальными, иначе метка будет повторно определена
(*ERR0R*4). Метка не должна образовывать зарезервированное
слово, хотя зарезервированное слово можно внедрить как часть
метки.

В метках можно использовать символы 0...Э, A...Z и S.
Можно использовать как большие, так и малые буквы, символы
С, » 8, и Метка должна начинаться с буквы. Некото-

рые примеры возможных меток представлены ниже!

LOOP

A-LONG-LABEL

LC13

LC2]

А_

LDIR - это незарезирвированная инструкция

TUCTS

2.3. Счетчик адресов

Ассемблер содержит счетчик адресов так, что имя в поле
метки ассациируется с адресом и заносится в таблицу симво-
лов. Этот счетчик адресов может быть установлен в любое зна-
чение директивой "ORG" (см. п. 2.7.).

Символ $ может использоваться для передачи текущего зна-
чения счетчика адресов, например, команда

LD HL,S+5

генерирует код, загружающий регистровую пару HL значением,
равным текущему значению счетчика +5.

2.4. Таблица символов

Когда метка встречается в первый раз, ее помещают в таб-
лицу вместе с двумя признаками, которые позже показывают,
как эту метку соотносят по алфавиту с другими, находящимися
внутри таблицы. Если в первый раз метка появляется в поле
меток, то ее значение (данное счетчиком адресов или значение
выражения директивы "EQU") заносят в таблицу символов. В
другом случае значения заносятся, когда бы ни встретилось
имя метки в последующем в поле метки.

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

Запись в таблице занимает от 8 до 13 бит, в зависимости
от длины имени.

Если за время первого прохода имя встречается более одно-
го раза, то будет выдано сообщение об ошибке (*ERRQR*4), так
как ассемблер не знает, какое значение должно соответство-
вать имени метки.

Если значение для имени не найдено, то в конце ассембли-
рования будет выдано сообщение:

«WARNING* SYMBOL ABSENT

Отсутствие определения имени не мешает продолжению ас-
семблирования .

Отметим, что только первые 6 символов метки вводятся в
таблицу символов, что определяется ее размером. В конце ас-
семблирования Вам могут быть выданы сообщения статистики, о
том, как много памяти было использовано таблицей символов в
течение трансляции - Вы можете изменить максимальный размер
памяти, отведенный под таблицу символов.

2.5. Выражения

Выражения - это запись операндов, образованная или прос-
тым термом, или комбинацией термов, разделенных оператором.
Ниже определены понятия терма и оператора:

терм:

десятичная костанта например: 1024

шестнадцатиричная константа например: $4а5

двоичная константа например: X100101

символьная константа например: "А"

метка например *. L1029

Может также использоваться $ для обозначения текущего
значения счетчика адресов.

Оператор:

* + - сложение;
- - вычитание;
& - логическое "AND" (и);
@ - логическое "OR" (или);
! - Логическое "XDR"(HCKAi>4HeAbHoe или);
* - алгебраическое умножение;
/ - алгебраическое деление;
? - HDD-функция (А?В=А-(А/В)*В;

Замечание Г

й - используют для того, чтобы отметить начало 16-тирич-
ного числа

У. - используют для того, чтобы отметить начало двоичного
числа " - символьная константа.

При считывании числа (десятичного, шестнадцатиричного
или двоичного) GENS4 выбирает последние значащие 16 бит чис-
ла (т.е. MOD 65536), например, 70016 станет 4480, и #5А2С4
становится #А2С4.

Обеспечивается широкий набор операторов, но их приоретет
не соблюдается: выражения вычисляются строго слева направо.
Операторы *, / и ? Приведены для версии с дополнительными
возможностями и не являются частью данного набора выраже-
ний, который мог бы увеличить размер GENS4. Если выражение
заключено в круглые скобки, то его представляют как содержи-
мое адреса памяти. Так, в инструкции LD HL, (L0C+5) в регис-
тровую пару HL загружается 16~ти битовой значение, содержа-
щееся в ячейке памяти с адресом L0C+5.

Некоторые инструкции Z80 (JR и DLNZ) предполагают one-

?анды, которые предполагают 8-ми битовые значения, а не
6-ти битовые - это называется относительной адресацией. Koi—
да имеет место относительная адресация, GENS4 автоматически
выделяет значение счетчика адресов следующей инструкции из
значения, представленного в поле операндов текущей инструк-
ции для того, чтобы получить относительный адрес для текущей
инструкции. Область допустимых значений относительного адре-
са простирается от -12о+значение счетчика адресов следующей
инструкции до значения счетчика адресов следующей инструк-
ции+127.

Если же Вы желаете определить относительный переход от
значения счетчика адресов текущей инструкции, то Вы должны
использовать символ $ (резервную инструкцию), за которым
следует требуемое смещение. Относительно значения счетчика
адресов текущей инструкции смещение должно находиться в диа-
пазоне от -126 до +12У включительно.

Примеры выражений!
5000 - LABEL

Х1001101!Х1011 - дает 1000110

#3456?#1000 - дает #456

4+5*3-8 - дает 19

S-LABEL+8

2345/7-1 - дает 334

"Y"-";"+7

(5*LABEL-П1000&Х1111)

170X1000 - дает 25

Отметим| что пробелы могут быть помещены между термами и
операторами и наоборот, но не внутри термов.

Если операция умножения получит ответ с абсолютным зна-
чением, большим чем 32767, то появится ошибка *ERRQR*i5,
тогда как при делении на 0 - ошибка *ERRQR*14, в противном
случае переполнение игнорируется.

Вся арифметика использует вторую дополнительную форму,
где любое число, большее чем 32767, представляется как отри-
цательное , например:

60000=-5536 (60000-65536)

2.6.. Макроопределения

Макроопределения позволяют Вам писать более плотные, бо-
лее значимые ассемблерные программы, но они должны использо-
ваться осторожно и не должны конфликтовать с подпрограммами.

Макроопределение состоит из набора инструкций ассемблера
вместе с именем макроопределения. Когда это имя в последую-
щем используется в поле кода операции, то оно будет заменено
на все инструкции ассемблера, составляющие это макроопреде-
ление.

Так, макроопределение NSUB может быть определено следую-
щим образом:

NSUB MAC

OR А
SBC HL,DE
ADD HL,DE
ENDM

Когда бы мы в дальнейшем ни применили NSUB как код опе-
рации, оно будет генерировать три инструкции ассемблера: OR
A; SBC HL,DE и ADD HL,DE.

Это спасает Вас от лишнего печатания и сделает Вашу
программу легче для понимания, но Вы должны помнить, что при
каждом появлении NSUB генерируется обьектный код, и, может
быть, эффективнее использовать CALL для вызова вместо нее
подпрограммы. Ниже мы приводим формат макроопределения и его
вызов вместе с некоторыми примерами. Изучите их, пожалуйста,
внимательно. Макроопределение имеет следующую форму:

имя MAC

Тело макроопределения
ENDM

По имени макроопределения будет вызываться его текст
когда это имя в последующем встретится в поле кода операции.
"MAC" показывает начало макроопределения, a "ENDM" указывает
на его конец.

Параметры макроопределения могут упоминаться внутри мак-
роопределения путем использования знака равенства, за кото-
рым следует номер параметра (0...31) включительно.

Таким образом, макроопределение

MOVE MAC

LD HL,=0
LD DE,=1
LD ВС,=2
LDIR
ENDM

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

MOVE 16384,16385,4096

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

MOVE START,START+1, LENGTH

Подумайте, являются ли вышеприведенные примеры хорошим
использованием макроопределения? Не могли ли Вы использовать
подпрограмму?

Внутри макроопределения параметры могут появляться в лю-
бом возможном выражении, например I

НМС . MAC

LD HL,=0*3600
LD DE,=1*60
ADD HL ,DE
LD DE,=2
ADD HL,DE
ENDM

Это макроопределение имеет три параметра: часы, минуты,
секунды. Макроопределение вычисляет общее количество се-
кунд, определяемое параметрами, и помещает его в регистр
HL. Вы можете использовать его следующим образом:

HOURS EOU 2

MINUTES EOU 30

SECONDS EOU 12

START EQU 0

HMC HOURS,MINUTES,SECONDS

LD DE,START

ADD HL,DE :HL - окончательное время.

Макроопределения не могут быть вложенными, так что Вы не
сможете ни определить макроопределение внутри макроопределе-
ния , ни вызвать макроопределение из макроопределения.

Во время ассемблирования, как только имя макроопределе-
ния встречается в поле команды, ассемблируется его текст.
Обычно этот текст тела макроопределения не попадает в ассем-
блерный листинг и печатается только для макроопределения.
Однако Вы можете усилить листинг расширением макроопределе-
ния, используя команду ассемблера *М+, а, используя *М-,

запретить распечатывать текст макроопределения.

Если Вы вышли за пределы пространства, отведенного под
буфер макро, то будет выдано сообщение и прервется ассембли-
рование. Используйте команду редактора "С' для резервирова-
ния буфера больших размеров.

2.7. Директивы ассемблера

GENS4 распознает определенные псевдокоманды - так назы-
ваемые директивы ассемблера. Они не влияют на процессор Z80
при прогоне, т.е. не декодируются, а просто заставляют ассем-
блер выполнять определенные действия во время трансляции.
Эти действия определенным образом изменяют код, генерируем-
мый GENS4.

Псевдокоманды ассемблера точно такие же, как и выполняе-
мые инструкции: они могут помещаться за меткой (необходимо
для EQU) и за ними может следовать комментарий.

Возможные директивы:

ORG <выражение> - устанавливает счетчик адресов равным
значению выражения. Если ключи 2 и 16 оба не указаны
и результат ORG попадает в область GENS4, текстового
файла или таблицы символов, то появляется выражение
"BAD ORG!" и прекращается трансляция, см. п.2.0. Для
более детального ознакомления с тем, как ключи 2 и
16 влияют на использование ORG. см. команду "А" в
разделе 3 для некоторых предосторожностей в исполь-
зовании ORG, когда автоматически сохраняется объект-
ный код.

EQU <выражение> - этой директиве должна предшествовать
метка, значению метки присваивается значение выраже-
ния. Выражение не должно содержать имен, которым еще
не присвоено значение. В противном случае ассемблер
выдаст Вам сообщение об ошибке - *ERR0R*13.

DEFB <выражение>,<выражение>... - каждое выражение должно
оценивать 8 бит; байт, адрес которого в настоящий
момент содержится в счетчике адресов.

СОВ принимает значение выражения и счетчик адресов
увеличивается на 1. Все вышеуказанное повторяется
для каждого выражения.

DEFW <выражение>,<выражение>... - дополняет слово (2 байта),
адрес которого указан счетчиком адресов, значением
выраженияи увеличивает счетчик адресов на 2. Младший
байт помещается сначала, за ним следует старший
байт. Повторяется для каждого выражения.

DEFS <выражение> - увеличивает счетчик адресов на значение
выражения. Эквивалент резервирования области памяти
размером, равным значению выражения.

DEFM "S" - определяет, что последовательность N байтов
памяти бедет равна представлению строки "S" в коде
ASC11 , где N - длина строки. Теоретически, длина
стро ки может быть от 1 до 255 включителтно, но прак-
тически она ограничена длиной строки, которую можно

ввести редактором. Первый символ в поле операндов ",
как ^ показано выше, является ограничителем и стро-
ка "S" определяется только символами, лежащими жежду
двумя ограничителями! символ конца строки также дейс-
твует как ограничитель строки.

ENT <выражение> - эта директива никак не влияет на ге-
нерируемый обьектный код, она просто используется
для определения адреса, на который осуществляется
переход по команде редактора "R". Выражение ENT уста-
навливает этот адрес равным значению выражения. Ис-
пользуется совместно с командой редактора
"R"(cm. разд.З). Для выполнимого адреса нет умолча-
ния .

2.8. Команды условной трансляции

Команды условной трансляции обеспечивают программисту
возможность включения или невключения определенных секций
исходного текста в процесс ассемблирования. Это возможно при
использовании команд IF, ELSE, END.

IF <выражение> - эта команда оценивает выражение. Если
результат равен нулю, то прекращается ассемблирование
следующих линий до тех пор, пока не встретится ELSE или
END. Если значение выражений отлично от нуля, то ассемб-
лирование происходит нормально.

ELSE - эта команда просто переключает ассемблирование. Если
перед появлением ELSE было ассемблирование, то в после-
дующем оно выключается и наоборот.

END - просто включает ассемблирование.

Отметим, что команды условной трансляции не могут быть
вложенными, на вложенность "IF" не сделано никаких проверок
и любая попытка вложения может привести к непредсказуемым
результатам.

2.9. Команды ассемблера

Команды ассемблера подобно директивам ассемблера не
влияют на работу процессора Z80 т.к. они не декодируются в
объектные коды. Однако, в отличие от директив ассемблера,
они не влияют на обьектный код, производимый ассемблером -
команды ассемблера просто модифицируют формат листинга. Ко-
манда ассемблера - это строка исходного текста, которая на-
чинается с символа *.

Надпись после звездочки определяет тип команды и должна
быть выполнена заглавными буквами. Ограничителем строки мо-
жет быть любой текст. Исключение составляют команды L и
D, предполагающие знаки "+" или "-" после команды. В распоря-
жении программиста имеются следующие команды:

*Е - выдает 3 пустые строки на экран или принтер - это
полезно для разделения модулей.

*HS - выдает строку "S" - заголовок, который будет печа-

таться после каждого вывода "*Е". *Н автоматически
выполняет *Е.

*S - указывает, что с данной строки листинг должен быть
остановлен. Листинг может быть продолжен нажатием
любой клавиши. Полезно для чтения адресов в середине
листинга.

Примечание : если "S появляется после *L-,

то листинг не останавливается.

*L+ - прекращает листинг и печать, начиная с данной строки.

*L- - начинает листинг и печать, с данной строки.

*D+ - указывает, что значение счетчика адресов в начале
каждой строки должно выдаваться в десятичном виде
вместо обычного 16-ичного.

*D~ - возвращает к использованию шестнадцатиричного вида
значения счетчика адресов в начале каждой строки.

*С- - укорачивает листинг ассемблера, начиная со следующей
строки. Листинг характеризуется тем, что он не содер-
жит объектного кода, генерируемого текущей строки -
это укорачивает строку листинга на 9 символов и де-
лает строку ассемблера более удобной для дисплея с
32~мя символами в строке, что улучшает читаемость.

*С+ - возвращает к полному листингу, как описано в
разделе 2.0.

*М+ - включает печать макроопределения.

*М- - выключает печать макроопределения.

*F (имя файла) - это очень мощная команда, позволяющая Вам
ассемблировать текст с ленты или дисковода - этот
текст читается с ленты или дисковода в буфер, блоки-
руется там на время и затем ассемблируется из этого
буфера: это позволяет создавать обьектный код боль-
шого размера, только если исходный ассемблируемый
текст не занимает много места в памяти. Имя тексто-
вого файла (до 10 символов), который Вы желаете про-
ассемблировать таким образом, не обязательно должно
быть определено и ему должен предшествовать про-
бел. Если файл находится на кассете, то Вы указыва-
ете это, набивая перед именем файла номер привода с
двоеточием:

*F 2:TEST - для файла на микроприводе N2;

*F TEST - для файла на ленте.

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

Если файл находится на ленте, то Вы должны предваритель-
но загрузить его с ленты при помощи команды редактора "Т", а

не "Р" - это необходимо, так как текстовой файл, содержащий-
ся на ленте, должен быть преобразован в блоки с достаточным
размером межблочных интервалов, что позволяет ассемблировать
текущий блок перед тем, как следующий начнет грузиться с
ленты. Размер блока, используемого данной командой 'и коман- i

дой редактора **Т"), устанавливается с помощью команды редак-
тора "С" (см. следующий раздел). Возможность выбора размера i
этого буфера позволяет Вам оптимизировать отношение раз- i
мер/скорость для любых выводов текстов с ленты. Например,
если Вы не собираетесь использовать команду "F" во время ас-
семблирования, то полезно будет определить размер буфера i
равным 1 для минимизации пространства, занимаемого bENb4 и
минимизации рабочего дространства.

Где бы ни встретил ассемблер конмаду "F", он опреде-
лит, откуда нужно считывать файлы, с дискеты или с ленты. i
Это происходит на обоих просмотрах, так как на каждом прос- i
мотре необходимо сканировать текс если считывается лента, i
то на ней ищется файл с требуемым именем или первый файл. i

Если имя файла во время его поиска на ленте не соответс- i

твует заданному, то выдается сообщение! "FOUND FILE" и
поиск продолжается, в другом случае выдается сообщение i

"USING FILENAME", файл загружается блок за блоком и обраба- i

тывается. Подробнее ознакомиться с "F" Вам поможет пример i

приложения 3.

Остальные команды ассемблера обрабатываются только на
втором просмотре.

Если ассемблирование было прервано одной из команд ус- i

ловной трансляции, то и работа любой команды ассемблера так-
же прерывается.

Замечание: описанные возможности не годятся для сис-
тем DISCIPLE, OPUS и PLUS 3 DEVPAC 4. Быст-
рее и легче вместо ленты использовать диск. i
Следствием этого является то, что в этих
версиях команда "С" не позволяет Вам опре-
делить размер быфера загрузки и команда 'Т"
не сеществует.

Раздел 3. Строчный редактор

3.1. Введение в редактор

Редактор, поставляемый со всеми версиями GENS4, является
простым строчным редактором, разработанным для обслуживания
всех операционных систем, сделанных для Z80. Редактор прост
в использовании и дает возможность редактировать программы
просто и эффективно.

Для уменьшения размера текстового файла редактор выпол-
няет определенное сжатие пробелов. Это просходит по следую-
щей схеме! когда вводится строка с клавиатуры, она символ за
символом заносится во внешний относительно ассемблера быфер
и затем, в конце строки (когда Вы нажимаете клавишу <ENTER>;
строка перемещается из буфера текстовой файл Во время этого
перемещения происходит определенное сжатие пробелов: если
первый символ строки - пробел, то в текстовой файл вводится
символ табуляции, и все последующие пробелы пропускаются.
Если первый символ в строке не пробел, то символы заносятся
из буфера в текстовой файл, пока не встретится пробел, после
чего обработка ведется также, как если бы следующий символ
был бы первым символом в строке, это продолжается и в даль-
нейшем. В результате символы табуляции включаются в начале
строки или между меткой и кодом операции, а так же между ко-
дом операции, операндами и комментариями. Конечно, если код
возврата каретки <ENTER> встречается в любое другое время,
то преобразование завершается и управление передается редак-
тору.

Этот процесс сжатия понятен, и Вы можете просто исполь-
зовать клавишу "—>" для того, Чтобы получить кратко протабу-
лированный файл, который также экономичней для хранения. За-
метим, что пробелы не сжимаются внутри комментариев и что
пробелы не должны присутствовать в полях меток, кодов опера-
ций и оперендах.

Режим редактора включается автоматически при запуске
GENS4jn^3a вспомогательным текстом следует подсказка редак-
тоа ">". В ответ на подсказку Вы можете ввести командную
строку следующего формата:

С N1,N2,S1,S2 <ENTER> где:

"С" - мнемоника команды, которую необходимо выполнить;
N1 - число в пределах от 1 до 32767 включительно,*
N2 - число в пределах от 1 до 32767 включительно;
51,S2 - строка не более чем из 20 символов.

Запятая используется для разделения различных аргумен-
тов, хотя это можно изменить - см. команду "S" пробелы игно-
рируются во всех случаях кроме тех, когда они находятся внут-
ри строк, накакой из аргументов не является обязательным,
хотя, некоторые команды, например, команда "DELETE", не
будут работать, если опущены аргументы N1 и N2

Редактор помнит ранее введенное число и строки и ис-
пользует сформированное значение для применения, если Вы не
определили другие значения внутри командной строки. Первона-
чально значения N1,N2 устанавливаются равными 10, а строки -
пустыми.

Если Вы имели неправильную командную строку, например,
F - 1,100,HELLO, то эта команда будет проигнорирована и

появится сообщение "PARDON?". При этом Вы должны ввести
командную строку правильно«например - F1,100,HELLO.

Это же сообщение появится, если длина строки S2 превыша-
ет 20 символов. Если более 20 символов содержит строка S1,
то лишние символы игнорируются.

Команды могут вводиться как на верхнем, так и на нижнем
регистрах.

При вводе команды определенные комбинации ключей могут
использоваться для ее редактирования. Так, клавиша "<—" ис-
пользуется для стирания символов в направлении начала стро-
ки, '—>" - для продвижения курсора в следующую позицию та-
буляции, "CAPS SHIFT 0 " или "DELETE" - для уничтожения пре-
дыдущего символа.

Следующий раздел представляет команды, используемые ре-
дактором. Заметим, что если аргумент заключен в квадратные
скобки, то такой аргумент обязателен для данной команды.

3.2. Команды редактора

3.2.1. Вставка текста.

Текст может быть введен в текстов0й файл или указанием
номера строки, пробела и требуемого текста, или посредством
команды "1". Заметим, что если сразу за номером строки Вы
введете <ENTER>, то эта строка будет удалена из текста, ес-
ли, конечно он существует. Где бы не вводился текст, можно
применять клавиши "<—"—>" и <eDIT> (возврат к метке ко-
манды ).

Клавиша <DELETE> будет уничтожать предыдущий символ (но
не далее начала строки текста).

Текст вводится во внешний буфер внутри GENS4 и Вы должны
оградить его от переполнения использованием клавиш <DELETE>
или "<—" для освобождения свободного пространства. Если во
время ввода текста редактор определит, что конец текста пе-
рекрывает вершину адресуемой памяти, то выдается сообщение
<BAD MEMORY!>. Это показывает,что далее текст вводить нельзя
и что текстовой файл или последняя его часть должна быть
сохранена на кассете для дальнейшего восстановления.

Команда " I N,M "

Использование этой команды переводит ввод в автоматичес-
кий режим: Вам подсказываются номера строк, начиная С N С
приращением м на каждом шагу. После высвечивающегося номера
строки Вы вводите нужный текс, по желанию используя нужные
клавиши, и завершаете строку текста вводом <ENTER>. Для выхо-
да из этого режима используются <EDIT>.

Если Вы вводите строку с уже существующим номером, то
строка текста с этим номером удаляется и заменяется на вновь
введенную после нажатия <ENTER>.

Если автоматическое увеличение номера строки дает значе-
ние, большее 32767, то происходит автоматический выход из
режима ввода.

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

3.2.2. Распечатка текста

Текст может быть проверен с помощью команды "L", номер
строки,постоянно отображенный при выполнении данной команды,
устанавливается заранее, но он может быть изменен с помощью
команды "К".

Команда " L N,M "

Эта команда выводит листинг со строки N до строки М
включительно на терминал. По умолчанию N присваивается зна-
чение 1, М - 32767, т*е. значениями по умолчанию не являются
ранее введеннные аргументы.

Для листинга целого файла просто используйте команду "L"
без аргументов. Строки на экране форматируются по левой гра-
нице экрана, так что номер строки отображается ясно. Строка
протабулирована автоматически. В результате чего получаем
четкое разделение полей в строке. Номер отображаемой на эк-
ране строки может быть проконтролирован с помощью команды
К" - после листинга определенного количества строк листинг
будет приостановлен (даже если это еше не строка М). Для
возврата в точку входа в редактор нажмите клавишу <EDIT> или
любую другую клавишу для продолжения.

Команда " К N "

"К" устанавливает количество экранных линий, которые
должны отображаться на терминале перед паузой, как это было
описано выше (см. команду "L"). Значение N (не более 256)
хранится в памяти. Например, если Вы хотите при последующем
использовании "L" выдавать на экране по 5 строк, то введите
команду "К5".

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

Однажды созданный текст неизбежно будет нуждаться в ре-
дактировании некоторых строк. В GENS4 имеются команды, поз-
воляющие исправлять, стирать, перемещать и перенумеровывать
строки.

Команда "D CN,M3 "

все линии от N до М включтельно удаляются из текстового фай-
ла. Если M<N или определено менее двух аргументов то команда
игнорируется. Это сделано для предотвращения ошибок из-за
небрежности. Одиночная строка может быть уничтожена указани-
ем N=M. Этого же можно достичь простым введением номера
строки, за которым следует <ENTER>.

Команда " М N,M "

Эта команда помещает текст строки с номером N в строку
И, уничтожая текст, уже существующий там. Т.е. эта команда
позволяет Вам перемещать строки текста внутри текстового
файла. Если строки с номером Nf не существует, то команда иг-
норируется .

Команда " N CN.H3 "

Команда "N" перенумеровывает М строк текстового файла,
начиная со строки N. N и М должны быть реальными и если но-

мер линии превышает 32767, то остается первоначальная нуме-
рация .

Команда " F N,M,F,S "

Текст со строки N до строки М исследуется на появление
строки F. Если такая строка найдена, то она отбражается на
терминале и включается режим "EDIT" (см. ниже).

Вы можете использовать команды внутри режима EDIT для
нахождения последующих появлений строки F в пределах опреде-
ленной области строк или для замещения строкой S текущего
появления строки F и затем продолжить поиск строки F. Отме-
тим, что диапазоны строк Г и S могут быть установлены ранее
другой командой, так что возможно вводить только F для ини-
циализации поиска (см. пример в разделе 3.3).

Команда " Е N "

Редактирует строку с номером N. Если строки N не сущест-
вует , то команда игнорируется; в противном случае строка ко-
пируется в буфер и отображается на терминале вместе с номе-
ром строки. Номер строки вновь отображается под строкой и
включается режим редактирования. Все последующее редактирова-
ние происходит внутри буфера, а не внутри самого текста, так
что первоначальная строка может быть получена в любой мо-
мент .

В этом режиме курсор отображается движущимся по строке
(начиная с первого символа) подддерживая различные подкоман-
ды, позволяющие редактировать строку. В Вашем распоряжении
имеются следующие подкоманды*.

<SPACE> - перемещает курсор на одну позицию к следующиму
символу в строке. Вы не можете шагнуть за конец
строки.

<DELETE> - возвращает курсор на предыдущий символ в строке.

Невозможно шагнуть левее первого символа строки.

< —> > - Перемещает курсор на следующую позицию табуляции
в каждой экранной строке.

<ENTER> - конец редактирования данной строки. Сохраняет все
сделанные изменения.

<Q> - выход из режима редактирования данной строки, т.е.

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

<R> - перезагружает буфер редактирования текстом, т.е.

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

<L> - распечатывает остаток строки, который должен быть

отредактирован, т.е. остаток строки за текущей по-
зицией курсора. Вы остаетесь в режиме редактиро-
вания с указателем, перепозиционированным в нача-
ло строки.

<К> - уничтожает символ в указываемой курсором позиции.

<Z> - уничтожает все символы, начиная с указанного кур-

сором и до конца строки.

<F> - ищет следующее появление строки "F", ранее^ опре-

деленной в командной строке (см. команду "F" вы-
ше ). Эта подкоманда будет автоматически выводить
систему из режима редактирования текущей строки
(сохраняя все изменения) даже если цепь символов
"F" в текущей строке не встретилась. Если цепочка
"F" встретится в последующих строках текста внут-
ри первоначально определенного диапазона, то бу-
дет включен режим редактирования для строки, в
которой найдена заданная последовательность сим-
волов "F". Отметим, что курсор всегда устанавли-
вается в начало найденной строки.

<S> - замещает ранее орределенной строкой "S" текущее

появление цепи символов "F" и затем выполняет
подкоманду "F", т.е. осуществляет поиск следующей
строки "F '. Так, вместе с вышеупомянутой командой
" г " она используется для пошаговой замены строк
символов "F" строками "S". См. разд. 3.3 для при-
мера .

<1> - вводоит символ в указанную курсором позицию. Вы

будете оставаться в этом режиме до тех пор, пока
не нажмете <ENTER>. По этой клавише Вы возвращае-
тесь в основной режим редактирования с указываю-
щим на последний введенный символ. Используя
<DELETE> внутри этого режима, Вы уничтожите сим-
вол в буфере слева от курсора,тогда как,исполь-
зуя <—>> переместите курсор в следующую позицию
та буляции, включая пробелы внутри буфера.

<Х> - перемещает курсор в конец строки и включает опи-

санный подрежим.

<С> - изменяет подрежим. Это позволяет перезаписать

символ в текущей позиции затем передвигать курсор
через одну позицию. Вы останетесь в измененном
подрежиме до тех пор, пока не нажмете клавишу
<ENtER>, нажатие которой возвратит Вас в основной
режим редактирования с курсором, указывающим на
последний измененный символ. <DELETE> просто
сдвигает через одну позицию курсор влево, а
<—>> не имеет эффекта.

3.2.4. Команды дисковода и магнитной ленты.

Текст может быть сохранен на магнитной ленте/дисководе
или загружен с них с помощью команд P,Q и Т. Объектный код
может быть сохранен на магнитной ленте с использованием ко-
манды 0. Имена файла не должны содержать более 10 символов.

Команда " Р N,M,S "

Строки с номерами от N до м сохраняются на ленте/диске в
файле с именем, заданным строкой 5. Текст будет записан на
диск, если перед именем файла через двоеточие стоит номер
дисковода. Помните что эти аргументы могут быть установлены
предыдущей командой.

Примеры:

Р 10,200,EXAMPLE - записать линии 10...200 на маг-
нитофон в файл с именем
"EXAMPLE".

Р 500,900,1:TEST - записать линии 500...900 на дис-
ковод 1.

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

Если Вы заносите на диск файл с уже имеющимся на диске
именем, то Вас спросят:

FILE EXIST DELETE (Y/N)? (Сущуствующий файл удалять?)

Отвечайте "Y" для удаления файла и продолжения записи
или нажмите любую другую клавишу для возврата в редактор без
записи файла.

Команда " G,,S "

На ленте или дискете производится поиск файла с именем
"S". Когда файл найден, он загружается в конец текущего тек-
ста. Если строка "S" пустая, то загружается первый файл q
кассеты. Для дисковода обязательно надо указать имя файла и
номер дисковода.

При работе с касетой, после того как Вы ввели команду
"G", появится сообщение .*

START ТАРЕ

Вы должны нажать клавишу "воспроизведение" своего магни-
тофона. Ведется поиск файла с указанным иенем или первого
файла по умолчанию. Когда нужный файл найден, появляется со-
общение :

USING FILENAME

В противном случае высветится сообщение:
FOUND FILENAME

и поиск на ленте продолжается. При использовании дисковода и
в том случае, если не найден искомый файл, то появится сооб-
щение "ABSENT".

Заметим, что если в памяти уже находится текстовой
файл, то файл, загружаемый с ленты, будет добавлен к сущест-
вующему и строки всего совокупного файла будут перенумерова-
ны , начиная с первого, с шагом 1.

Команда Т N,M,S

выводит блок текста между строками N и М включительно на
ленту в формате, подходящем для дальнейшей работы под управ-
лением директивы ассемблера *F - см. раздел 2.9. обрабатыва-
ется файл с именем "S". Вывод начинается сразу после нажатия
клавиши <ENTER>, так что Вы должны убедиться, что Ваш магни-
тофон готов к записи перед вводом этой командной линии. Если

Вы намерены осуществлять ввод с дисковода, то используйте
лучше команду "Р ', а не "Т". Отметим, что эта команда должна
использоваться только в том случае, если Вы хотите позднее
ассемблировать текст с ленты. Это неприменимо для диска -
только в версиях DEVPAC 4.

Команда "О ,,S "

выводит Ваш объектный код на кассету или дисковод. Имя файла
может иметь длину более 8 символов и должно начинаться с но-
мера привода (1...8) И двоеточия, если Вы хотите сохранить
объектный код на дискете.

Только последний блок кода, произведенный ассеблиром,
может быть сохранен этим способом, т.е. если у Вас более од-
ной директивы 'ORG" в исходной программе, то сохранится толь-
ко код, произведенный после последней директивы 'ORG".

Код должен быть получен в памяти перед тем, как он может
быть сохранен с помощью команды "О". Часто удобнее использо-
вать команду "A", "FILENAME" для автаматического получения
файла. Эта команда работает быстрее "О" - см. ниже.

3.2.5. Ассемблирование и запуск из редактора.

Команда " A 0,S,F "

Эта команда ассемблирует текст с первой строки текстово-
го файла. Команда "О" позволяет Вам задать ключи,которые
должны использоваться во время этой трансляции. Обычно доста-
точно использовать значения ключей по умолчанию, просто
употребляя запятые.

S - дает возможность изменить размер таблицы символов для
этой трансляции. Размер таблицы по умолчанию обычно бы-
вает достаточным, за исключением режима ввода
(INCLUDING).

F - имя файла, имеющегося на дискете. Имя файла должно начи-
наться с <D:>, где D - номер дисковода, на котором разме-
щен файл. Имя файла не должно содержать более 10 симво-
лов. Присутствие имени файла здесь побуждает ассемблер
производить трансляцию иным способом.

Вместо простого ассемблирования объектного кода в память
и остановки по достижении вершины памяти, ассемблер не будет
транслировать в память до тех пор, пока не достигнет ее вер-
шины (верхнюю границу памяти Вы можете установить командой
"U") и затем полученный обьектный код будет сохранен на дис-
ке в указанном Вами файле. Затем ассемблирование будет вновь
продолжено с нижних адресов памяти и этот процесс будет про-
должаться до тех пор, пока вся программа не будет проассемб-
лирована и сохранена на дискете.

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

Пара важных замечаний относительно использования дирек-
тивы "ORG" для данных средств:

1 - директива "ORG" будет помещать обьектный код по адресам,
указанным в данной директиве первоначально и каждый раз
после помещения обьектного кода в обьектный файл (если

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

2 - Вы должны избегать использования более одной директивы
"ORG" в Вашей программе, если только Вы не введете нули
в память между двумя этими директивами с помощью "DEF

Например:

ORG 56000
; некоторые коды
RET

ORG 60000
;еще коды

Этот фрагмент не будет сохранен на ленте правильно,
т.к. вторая директива "ORG" переопределяет начало буфера
обьектного кода. Но!

ORG 50000
; некоторые коды
RET

; добиваем нулями до 60000
DEFS 60000-S
; еще коды

Фрагмент будет сохранен правильно, т.к. DEF-S произведет
достаточное количество нулей, чтобы последующий код начинал-
ся с адреса 60000.

Очевидно, это неэффективно применительно к качеству ко-
да, сохраняемого на дискете, но простота этого действия сох-
раняет ассемблер небольшим и быстрым.

Примеры использования команды "А":

А20,,1:TEST <ENTER>

ассемблирует с листингом, помещает обьектный код сразу после
таблицы символов (это увеличивает размер буфера обьектного
кода в памяти), использует размер таблицы символов по умол-
чанию и сохраняет обьектный код на дисководе 1 под именем
"TEST".

А,3000 <ENTER>

ассемблирует программу, используя ключи по умолчанию, с раз-
меров таблицы символов 3000 байт. см. раздел 2 для дольней-
шей детализации того, что может случиться при ассемблирова-
нии.

Команда "R",

если исходная программа была проассемблирована без ошибок и
рабочие адреса были определены с помощью директивы "ENT", то
может быть использована команда R для выполнения обьектной
программы. Объектная программа может использовать инструкцию
RET (#С9) для возврата в редактор сколько угодно раз если
стек в конце выполнения программы будет таким же, каким он
был в ее начале.

Заметим, что директива "ENT" не будет действовать, если
для ассемблирования использовался ключ 16.

Прерывания перед вводом кода разрешены и регистр IY заг-
ружен значениями fc 5СЗА, важным для подпрограммы ослуживания
прерываний SPECTRUM RDM.

3.2.6. Другие команды

Команда "В"

просто возвращает управление операционной системе. Для пере-
запуска ассемблера используйте

RANDOMIZE USR ХХХХХ
где .* ХХХХХ - адрес, с которого был загружен GENS4 .

Команда "С"

Позволяет Вам изменить размер входного буфера и буфера
макроопределений (только для версий DEVPAC на магнитной
ленте).

Входной буфер - это буфер, в котором содержится
текст, когда происходит трансляция непосредственно с кассеты
или дискеты - чем больше этот буфер, тем боьлшой текст может
быть считан с кассеты или дискеты и, следовательно, тем быс-
трее будет происходить трансляция. Но, с другой стороны, ис-
пользуется большая память. Однако возможен компромисс между
скоростью трансляции и используемой памятью, команда "С '
позволит Вам управлять этим процессом, предоставляя Вам воз~
можнлсть установки размера входного буфера.

Буфер макроопределений используется для хранения текста
макроопределений, которые Вы могли использовать.

Команда "С" печатает подсказку на ввод размера входного
быфера, а затем - на ввод размера быфера макроопределений. В
обоих случаях вводить надо просто число десятичное байтов,
которое Вы желаете зарезервировать, и <ENTER>. Если Вы нажа-
ли <ENTER> без ввода числа, то опереция игнорируется. Опре-
деляемый Вами размер входного буфера не должен быть меньше
256 байт. Вы можете прервать команду с помощью <CAPS SHIFT>1.

Отметим, что для дисковых версий DEVPAC 4 Вы можете ме-
нять только размер буфера макроопределений.

Команда 'С" не уничтожает Ваш текст, она просто сдвигает
его вверх и вниз в памяти в зависимости от размера буфе-
ра. Лучше зарезирвировать буферы такого размера, какой нужен
в начале сеанса.

Команда "S,,D"

Эта команда позволяет Вам изменить символ-разделитель
аргументов в командной строке. На входе редактора таким раз-
делителем является запятая, это может быть изменено с по-
мощью команды "S" на первый символ орпеделяющей строки "D".

Помните, что однажды определив новый разделитель, Вы
должны его использовать до тех пор, пока не определите но-
вый, даже внутри команды "S". Заметьте, что разделителем не
может быть пробел.

Команда "UN"

Позволяет установить верхнюю границу памяти равной N. Если N

не указать (т.е. ввести только U и <ENTER>), то отображается
текущая верхняя граница памяти.

GENS4 не позволяет Вашему текстовому файлу или объектно-
му коду распространяться выше верхней границы памяти и будет
выдавать сообщение об ошибке при приближении к этой границе.

По умолчанию верхняя граница памяти принимается равной
вершине стека памяти системы SPECTRUM.

Команда " V "

выдает на дисплей полезную информацию: значение параметров
команды N1 и N2 по умолчанию;симэол-разделитель команды по
умолчанию; десятичное значение начала и конца текста и зна-
чение первой командной строки S1.

Команда " W N,M "

выводит строки текста С N пО М включительно на принтер. Если
ни Nf ни Мне указаны, то быдет напечатан весь файл. Печать
будет приостановлена после вывода некоторого числа линий,
определенного командой "К" - нажмите любую клавишу для про-
должения печати.

Команда " X N "

выдает каталог диска. В версии с 51-м символом перед выдачей
каталога происходит очистка экрана. Каталог всегда распеча-
тывается в строку из 32-х позиций.

Команда " Z "

Эффективно уничтожает весь Ваш текст, но перед этим она
спрашивает, уверены ли Вы в необходимости этого. Отвечайте
"у для уничтожения текста.

Кроме быстрого уничтожения командой D 1,32767 команда "7."
позволяет Вам очистить Ваш текстовый файл, если он каким-ли-
бо образом был испорчен.

Команда "Z" устраняет неоходимость для стартовой точки i

входа GENS4.

Команда " Н "

выдает подсказку на экран: список возможных команд в 2 стол-
бца с заглавной буквой,»обозначающий команду и отображающий
текущее значение определенных важных параметров.

3.3. Пример использования редактора

Предположим, что Вы ввели следующую программу (используя
110,10):

10 *Н 16 BIT RANDOM NUMBERS
20

30 ;INPUT: HL CONTAINS PREVIOUS RANDOM NUMBER
40 lOUTRUT: HL CONTAINS NEW RANDoN OR SEED NUMBER
50

60 RANDOM PUSH AF ; SAVE REGISTERS
70 PUSH ВС
80 PUSH HL

90 ADD HL,HL ; *2

100 ADD HL ,HL ; *4

140 ADD"HL.;HL":'*64

150 PIP ВС ; OLD RANDOM NUMBER

160 ADD HL,DE

170 LD DE,L1

180 ADD HL,DE

190 POP ВС : RESTORE REGISTERS

200 POP AF

210 REY

Эта программа содержит несколько ошибок:

строка 40: вместо "RANDOM" набрано "RANDON";

строка 70: PUSH ВС начинается с поля метки;

строка 150: PIP вместо POP;

строка 160: требуется комментарий

(это не ошибка, а недостаток);

строка 210: вместо REY должно быть RET.

Также должны быть добавлены две команды ADD HL,HL между
строками 140 и 150. Кроме того, все ссылки на пару регистров
DE в строках 160...180 Должны быть ссылками на ВС

Для внесения этих исправлений мы должны выполнить следу-
ющее :

F40,40,RANDON,RANDOM <ENTER>
затем подкоманду "S"

Е70 <ENTER> затем I (режим вставки),

один пробел и <ENTERXENTER>

I142,2<ENTER> 142 ADD HL,HL ; *128
144 ADD HL,HL ; *256
<EDIT>

F150,150,PIP,POP <ENTER>

затем подкоманду "S"

Е160 <ENTER> затем X,2 пробела; *257 +L1 <ENTER><ENTER>

Е160,180,DE,ВС <ENTER>

затем повторное использование подкоманды "S"

Е210 <ENTER> затем 2 пробела,С,Т <ENTERXENTER>

N10,10 <ENTER>, чтобы перенумеровать текст.

Рекомендуем Вам хорошенько проработать вышеприведенный
пример, используя редактор.

Приложение 1. Коды ошибок и их значения.
*ERRDR*1 - ошибка в контексте этой строки;
*ERRQR*2 - мнемоника не распознана;
*ERR0R*3 - утверждение плохо сформировано;
*ERR0R*4 - символ определен более 1 раза;

*ERR0R*5 - строка содержит неверный символ (т.е. ничего не
значащий в данном случае);

*ERR0R*6 - один из операндов в строке - незаконный;

*ERRDR*7 - символ в строке является резервной инструкцией;

*ERR0R*8 - ошибочная пара регистров;

*ERR0R*9 - слишком много регистров в строке;

*ERRDR*10 - выражение, которое должно занимать не более
8 бит, занимает больше;

*ERRDR*li - неверные инструкции JRUX+N) и JP(IY+N);

*ERR0R*12 - ошибка в директиве ассемблера;

*ERRQR*13 - незаконная ссылка вперед, т.е. EQU ссылается на
символ, который еще не был определен;

*ERRQR*14 - деление на ноль;

*ERR0R*15 - переполнение в операции умножения;
*eRR0R*16 - вложенное макроопределение;
*ERR0R*17 - этот идентификатор - не макро;
*ERR0R*i8 - вложенный макровызов;
*ERR0R*19 - вложенный условный оператор.

BAD ORG! - Деректива ORG работает с адресом, который может
испортить GENS4, текстовой файл или таблицу сим-
волов . Управление возвращается в редактор.

OUT OF TABLE SPACE! - Появляется во время первого прохода,
если на таблицу символов выделено недостаточно

памяти. Управление возвращается редактору.

BAD MEMORY! - Нет места для ввода текста, т.е. конец текста
близок к вершине ОЗУ памяти. Вы должны спасти
текущий текстовой файл или его часть.

Приложение 2. Резервирование слов, мнемоника и т.д.

Список резервных инструкций внутри GENS4. Эти символы не
могут использоваться как метки, хотя они могут быть частью
меток. Все резервные инструкции состоят из заглавных букв:

ABCDEHL I RS

AF АГ ВС DE HL IX

IY SP NC Z NZ М
Р РЕ РО

Ниже приводится список мнемоники Z80, директив ассемблера
и его команд. Они также должны состоять из заглавных букв.

ADC ADD AND BIT CALL

CCF CP CPD CPDR SPI

CPIR CPL DAA DEC DI

DJNZ EI EX EXX HALT

IM IN INC IND INDR

INI INIR JP JR LD

LDD LDDR LDI LDIR NEG

NOP OR OUTDR OTIR OUI

OUtD OUT I POP PUSH RES

RET RET I RETN PL RRA

RLC RLCA RLD RR RLA

RRC RRCA RRD RST SBC

SCF SET SLA SRA SRL

DEFB DEFM DEFS DEFW ELSE
END ENT EQU IF ORG

MAC ENDM

*D *E *H *L *S

*C *F *M

Приложение 3. Рабочий пример

Ниже приводится пример типичного сеанса работы с исполь-
зованием GENS4. Если Вы новичок по части использования ас-
семблерных программ или Вы немного не уверены в том, как ис-
пользовать ассемблер/редактор GENS4, то мы настоятельно сове-
туем Вам тщательно проработать этот пример. Лишний раз заме-
тим, что <ENTER> означает, что Вы должны нажать клавишу
"ENTER" на клавиатуре.

Цель примера:

Написать и проверить программу целочисленного умножения,

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

Последовательность работы!

1 - напишите программу умножения как подпрограмму и запишите

ее на ленту, используя команду редактора "Р", чтобы ее
можно легко восстановить и отредактировать во время се-
анса при наличии ошибок.

2 - Отладьте подрограмму умножения, редактируя ее, если это

необходимо.

3 - Запишете отлаженную программу на ленту,используя команду

"Т" так, чтобы эта подпрограмма могла быть помещена с
ленты в другие программы.

Перед стартом мы должны загрузить GENS4 в компьютер.
Делайте так:

LOAD " " CODE 26000 <ENTER>,

чтобы загрузить ассемблер с адреса 26000. Затем введите!

RANDOMIZE USR 26000 <ENTER>

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

1-Я стадия! запись программы целочисленного умножения.

Мы используем команду ркдактора I, чтобы ввести текст,
используя < —> > (символ табуляции) для получения табулиро-
ванного листинга.

Ниже мы не указываем, где используется табуляция. Но Вы
можете предположить, что табуляция используется между мнемо-
никой команды и между мнемоникой и операндом. Заметим, что
адреса, показанные в ассемблерном листинге примера, который
следует, могут не соответствовать полученным в Вашем компь-
ютере, они служат только для иллюстрации!

>110,10 <ENTER>

10 ;А FAST INTEGER MULTIPLY <ENTER>
20 ; ROUTINE.MULTIPLIES HL <ENTER>
30 ;BY DE.RETURN THE RESULT <ENTER>
40 ;IN HL.C FLAG SET ON AN <ENTER>
50 ;OVERFLOW.<ENTER>
60 ;<ENTER>

70 ORG #7F00 <ENTER>

80 <ENTER>

90 MULT OR A <ENTER>

100 SBC HL,DE;HL>DE? <ENTER>

110 ADD HL.DE <ENTER>

120 JR NC,MU1;YES <ENTER>

130 EX DE,HL <ENTER>

140 MUi OR D <ENTER>

150 SCF;OVERFLOM IT <ENTER>

160 RET NZ;DE >255 <ENTER>

170 OR E;TIMES 0? <ENTER>

180 LD E.D <ENTER>

190 JR NZ,MV4;NO <ENTER>

200 EX DE,HL;0 <ENTER>

210 RET <ENTER>

220 <ENTER>

230 ;MAIN ROUTINE <ENTER>
240 <ENTER>

250 MU2 EX DE,HL <ENTER>
260 ADD HL,DE <ENTER>

270 EX DE,HL <ENTER>

280 MU3 ADD HL,HL <ENTER>
290 RET С .'OVERFLOW <ENTER>

300 MU4 RRA <ENTER>
310 JR NC,MU3 <ENTER>

320 OR A <ENTER>

330 JR NZ,MU2 *<ENTER>

340 ADD HL.DE <ENTER>

350 RET <ENTER>

360 <EDIT>

Вышеприведенные команды создадут текст программы. Сохра-
ним его на ленте» используя:

>Р10,350,MULT <ENTER>

Помните, что Вы должны включить свой магнитофон в режим
записи перед использованием команды "Р".

2-Я стадия: отладка программы.

Сначала убедитесь в правильном ассемблировании исходного
текста. Мы будем использовать ключ 2, чтобы не производить
листинг и обьектный код.

>А2 <ENTER>

*НISOFT GENS4 ASSEMBLER*

COPYRIGHT HISOFT 1983,84,87

ALL RIGHT RESERVED

PASS1 ERROR:00

PASS2 ERROR:00

* WARNING* MV4 ABSENT TABLE USED: 74 FROM 161

>

Мы видим из этой трансляции, что сделали ошибку в строке
190, набрав MV4 вместо MU4, которая является меткой, на ко-
торую мы желаем перейти. Редактируем строку 190:

>F190,190,MV4,MU4 <ENTER>
190 JR NZ, (сейчас используйте подкоманду "S")

Теперь ассемблируйте текст вновь. Он должен ассемблиро-
ваться без ошибок. Мы должхы написать некоторый текст для
проверки подпрограммы:

>N300,10 <ENTER> (перенумеруем для того, чтобы мы могли на-
писать больше текста)

>110,10 <ENTER>
10 ;SOME CODE ТО TEST <ENTER>
20 ;THE MULT ROUTINE <ENTER>
30 <ENTER>

40 LD HL ,50 <ENTER>

50 LD DE,20 <ENTER>

60 CALL MULT; MULT I PLY <ENTER>

70 LD A,H;0/P RESULT <ENTER>

80 CALL AOUT <ENTER>

90 LD A,L <ENTER>

100 CALL AOUT <ENTER>

110 RET; RETURN TO EDITOR <ENTER>

120 <ENTER>

130 .'ROUTINE TO O/P A IN HEX <ENTER>
140 <ENTER>

150 AOUT PUSH AF <ENTER>

160 RRCA <ENTER>

170 RRCA <ENTER>

180 RRCA <ENTER>

190 RECA <ENTER>

200 CALL NIBBLE <ENTER>

210 POP AF <ENTER>

220 NIBBLE AND Xllll <ENTER>

230 ADD A,#90 <ENTER>

240 DAA <ENTER>

250 ADC A.#40 <ENTER>

260 DAA <ENTER>

270 LD IY,#5C3A;F0R ROM <ENTER>

280 RST #10; ROM CALL <ENTER>

290 RET <ENTER>

300 <EDIT>

>

Теперь ассемблируйте текстовую программу совместно с
программой MULT:

>а2 <ENTER>

*HISOFT GENS4 ASSEMBLER*
COPYRIGHT HI SOFT 1983,84,87
ALL RIGHT RESERVED

7EAC 190 RECA

*ERROR* 02 (нажмите любую клавишу для продолжения)

PASS 1 ERROR: 01
TABLE USED: 88 FROM 210

В нашей программе есть ошибка: вместо RECA в строке 190
должно быть RRCA. Делаем:

>е190
190 RECA

190 >,один пробел,С,R <ENTER>>,<ENTER>

>

Теперь проассемблируйте вновь, используя ключи по умол-
чанию (только a <ENTFR^;, и текст должен проассемблироваться
правильно.

Мы уже в состоянии проверить работу нашей программы
MULT, следовательно, нам нужно сообщить редактору, откуда он
может выполнить код. Мы делаем это директивой "ENT":

>35 ENT S <ENTER>

Теперь вновь проассемблируйте текст, и трансляция должна

завершиться правильно с сообщениями:

TABLE USED: 88 FROM 211

EXECUTES: 32416

>

или подобными этим. Теперь можно запустить наш код на выпол-
нение, используя команду редактора "К". Помножив 50 на 20 мы
должны получить 1000, что равно &3е8 в шестнадцатиричном ко-
де:

>R <ENTER>
0032>

Не работает! Почему? Распечатайте строки с 380 по 500
(L380,500). Вы увидете,что в строке 430 находится инструкция
OR D, за которой следует RET NZ. Все, что она делает - это
логическую операцию "или" между регистром D и аккумулятором
А и возвращает установленный флаг ошибки <С-флаг>, если ре-
зультат не равен 0. Целью этого действия является возмож-
ность убедиться, что DE<256 и, следовательно, что операция
умножения не вызвала переполнения - это делается проверкой
того, что в регистре D находится 0. Но "или" будет работать
правильно только в том случае, когда в аккумуляторе изна-
чально находится 0, а у нас нет гарантий, что это будет так.

Мы должны убедиться, что А=0 перед выполнением ORD, в
противном случае мы получим переполнение со старшими разря-
дами в качеств результата. Для проверки кода OR а в строке
380 можно изменить на XQR а, которая установит флаги для SBC
HL, DE инструкции и установит а=0. Следовательно:

>Е380 <ENTER>

380 MULT OR A <ENTER>

у380 —> I (вход в режим вставки) X <ENTERXENTER>

Теперь вновь проассемблируйте и запустите код, используя
R. Теперь ответ должен быть правильным: #ЗЕ8. Мы можем про-
верять программу дальше, отредактировав строки 40 и 50, что-
бы перемножать различные числа. Ассемблируя и запуская Вы
увидете, что программа работает. Теперь, закончив программу,
мы можем сохранить ее на магнитной ленте в формате
"INCLUDE":

УГ300,999,MULT <ENTER>

Не забудьте включить магнитофон в режим записи перед на-
жатием <ENTER>. Если Вы хотите сохранить программу на диске-
те, то не нужно использовать команду "Т". Программа, сохра-
ненная обычной командой "Р", может быть запущена с дисково-
да.

Однажды записанная подобным образом подпрограмма может
быть вставлена в программу как показана ниже:

500 RET

510

520 ;INCLUDE TNE MULT ROUTINE HERE (включаем здесь MULT)

530

540 *F MULT

550

560 ;THE NEXT ROUTINE (следующая подпрограмма)

Когда вышеприведенный текст будет транслироваться, ас-
семблер спросит Вас "START ТАРЕ..." Когда он доберется до
строки 540 во время как первого, так и второго проходов. Сле-
довательно, Вы должны направить MULT на вывод с ленты в обо-
их случаях. Для этого обычно нужно будет перемотать ленту
после первого прохода. Вы можете записать два дубля програм-
мы MULT на ленту один за другим, и один использовать во вре-
мя первого прохода, а второй - во время второго.

Когда происходит ввод с дисковода, никаких сообщений не
появляется, все работает автоматически.

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




СОДЕРЖАНИЕ:


  Оставте Ваш отзыв:

  НИК/ИМЯ
  ПОЧТА (шифруется)
  КОД



Темы: Игры, Программное обеспечение, Пресса, Аппаратное обеспечение, Сеть, Демосцена, Люди, Программирование

Похожие статьи:
Вступление - Пермская компьютерная газета.
Послание от Kaktus`a - Без названия.
Party Zone - обзор демо с ascii'2002.
Авторское описание - Описание MMD v2.21
Interviews - Интервью с музыкантом TDM/K3L.

В этот день...   20 апреля