ПРОФЕССИОНАЛЬНЫЙ ДВУХПРОХОДНОЙ
АССЕМБЛЕР
I. ВВЕДЕНИЕ
В настоящее время профессиональный, быстрый двухпроходной ассемблер GENS3
является лучшим из ассемблеров для ZX SPECTRUM и компьютеров на процессоре
Z80. Он хорошо себя зарекомендовал в работе и получил самые лестные отзывы
пользователей компьютеров на процессоре Z80. Руководство пользователя по про-
граммированию на ассемблере GENS3 написано с учетом пожеланий и советов обла-
дателей компьютера ZX SPECTRUM и является редакцией ренее изданной книги.
Тщательно изучите все разделы данной книги и примеры в приложении и только
затем приступайте к работе с GENS3.
GENS3 занимает около 8 Кбайт, он использует свой внутренний стек и является
независимым от содержимого памяти компьютера и имеет встроенный редактор.
Перед загрузкой ассемблера необходимо зарезервировать для GENS3 достаточный
обьем памяти. Наиболее рационально GENS3 размещать в нижней части памяти.
GENS3 загружается в компьютер при помощи команды LOAD:
LOAD"GENS3" CODE ХХХХХ
(XXXXX - небходимый адрес загрузки, например 24064).
Для инициализации программы ввести:
RANDOMIZE USR XXXXX
Если в процессе работы необходимо переинициализировать программу, введите
для холодного старта (разрушаются результаты предыдущей работы):
RANDOMIZE USR XXXXX + 56
Для теплого старта (сохранение ранее созданных файлов):
RANDOMIZE USR XXXXX + 61
Необходимо помниить, что GENS3 один раз инициализируется по адресу ХХХХХ.
Например, если вы ввели и инициализировали GENS3 по адресу 24064, то для
холодного старта используется адрес 24120 и для теплого старта 24125.
После инициализации по адресу ХХХХХ появится вопрос:
BUFFER SIDE ?
Введите число от 0 до 9 (по умолчнию принимается 4. 1 единица - 256 байт). Это
число устанавливает величину включающего С INCLUDE ") буфера (см. раздел 2.8
для детализации). Величина 0 устанавливает размер буфера равный 64 байтам.
После ответа на "BUFFER SIDE ?" появится указатель команд редактора ">" (см.
части 2 и 3 этой книги.
Внимание ! GENS3 запрещает прерывания, и поэтому, когда они вам нужны, то
разрешите их командой "EI", кроме того, GENS3 портит "IR" регистр.
2. АССЕМБЛЕР
2.1. КАК РАБОТАЕТ GENS3
GENS3 - быстрый двухпроходной ассемблер, который ассемблирует стандартную
Z80 мнемонику, добавляя условное ассемблирование и много полезных команд.
При ассемблировании (пользуйтесь командой редактора "А" - см. главу 3. сначала
необходимо ответить на вопрос об определении размера таблицы ("TABLE SIDE ?") в
десятичных целых числах. Это пространство будет закреплено за таблицей символов
во время ассемблирования. По умолчанию GENS3 выбирает столько, сколько считает
нужным. Обычно это оказывается вполне достаточно.
Внимание! Когда используется режим "INCLUDE", необходимо выделять больше
места для таблицы, т.к. ассемблер не может предсказать размер файла, который будет
вами выбран.
После определения размеров таблицы необходимо выбрать требуемый режим -
введите коды режимов ("OPTIONS"), просуммировать их, если необходима комбина-
ция режимов:
Режим 1 *распечатка таблицы символов в конце 2 прохода*
Режим 2 *отказ от распечатки кодов команд*
Режим 4 *отказ от генирации листинга*
Режим 8 *вьдвод листинга на принтер*
Режим 32 *включение проверки, куда направляются
коды команд*. Полезен для ускорения ассемблирования
Режим 16 размещение кодов команд (если они вырабатываются) после таблицы
символов. Счетчик размещения (LOCATION COUNTER) продолжает корректиро-
ваться ORG так, что коды команд можно помещать в одну секцию памяти и программа
будет работоспособна влюбом месте памяти.
Например:
Режим 36 производит быстрое ассемблирование: при этом не генерируется листинг
и не производится проверки размещения кодов команд.
гГ
Внимание ! Если используется режим 16, то директива ассемблера ' END" не
вызовет никакой реакции, чтобы выяснить, куда помещенны коды команд, использу-
ется команда редактора "X" - для определения конца текста (второе число, выводимое
на экран) - и затем добавляем к нему размер таблицы символов + 2.
Ассемблирование производится в 2 прохода:
1 проход: выявляются ошибки и составляется таблица символов.
2 проход: генирируются коды команд и данных, (если не используется режим 2).
Во время первого прохода на экран (принтер) ничего не выводится, если не было
обнаружено ошибок. В противном случае неверная строка будет отображена на экране
с номером ошибки под ней (см. приложение А). После этого нажмите "Е" для возврата
в редактор или любую другую клавишу для продолжения ассемблирования со следу-
ющей строки.
В конце первого прохода выводится сообщение:
PASS I ERRORS: NN
При обнаружении ошибок ассемблирование останавливается и переход к 2 прохо-
ду не производится. Если в поле операнда были ссылки и метки, не обьявленные в поле
меток, то для каждого недостающего обьявления метки выводится предупреждение:
* WARNING * LABEL ABSENT (метка отсутствует)
Во время второго прохода генеририруются коды команд (если это не было за ripe-
щенно выбором режима 2). Листинг ассемблера генирируется в том случае, если он
не был выключен выбором режима 4 или командой ассемблера * L -.
Обычная форма листинга:
С000 210100 25 LABEL
LD HL,1
16 15 21 26
Первым отображается значение счетчика памяти, если только мнемоника в этой
строке не является одной из псевдомнемоник ORG, EQU или ENT (ст. раздел 2.6) - в
этом случае первым будет представленно значение в поле операнда инструкции.
Эта часть обычно выводится в шестнадцатиричном виде, но может быть представ-
ленна в десятичном, если используется команда ассемблера * D + (ст. раздел 2.8).
Следующая часть (от позиции 6, до 8 символов длинной, т.е. до 4 байт ) является
кодами команд или данных, полученными текущей инструкцией (см. команду
GENS3 " • С ").
Затем идет номер строки - число в диапазоне от 1 до 32767 включительно.
Позиции 21-26 первой строки содержат первые 6 символов любой метки, обьяв-
ленной в этой строке.
Следующие 2 части относятся только к системам с узким экраном - при ширине
экрана большей чем 40 позиций, каждая экранная строка листинга ассемблера содер-
1 жится целиком на одной строке экрана.
После какой - либо метки идет новая строка - в ней показана мнемоника в позициях
21 - 24, и в конце - коментарии, которые были использованны в конце строки.
Такой формат выбран для улучшения читаемости листинга на экранах, как у ZX
SPECTRUM. GENS3 не определяет ширину экрана, потому что это увеличит обьем
памяти и будет ограничивать использование стандартных программ ROM ZX
SPECTRUM.
Команда * С ассемблера может использоваться для получения более короткой
строки листинга ассемблера - ее результатом будете исключение 9 символов кодов
команд и данных, что позволяет разместиь большинство строк листинга в одной
экранной строке (см. раздел 2.8).
Существует возможность модифицировать размещение частей в листинге. Для
этого необходимо внести изменения по 3-м адресам GENS3. Как это сделать показанно
ниже.
Мы делаем различие между строкой ассемблера, являющейся текущей строкой
листинга, содержащейся во внутреннем буфере и экранной строкой - строкой, появ-
ляющейся на экране, обычно строка ассемблера вырабатывает более чем одну экран-
ную строку.
Содержимое байта START-OF-GENS3 + 51 (#33) указывает, с какой позиции (по
умолчанию 5) будет определена первая экранная строка для текущей строки ассемб-
лера. Измените этот байт на 0, чтобы развернуть строку (полезно при наличии при-
нтера полной ширины) или на любое другое значение ( < 256 ) для другой позиции.
Байт по адресу START-OF-GENS3 + 52 ( #34 ) определяет позицию (начиная с 1
), с которой будет начинаться каждая последующая строка - продолжение.
Байт по адресу START-OF-GENS3 + 53 ( # 35 ) указывает, сколько символов из
остатка строки ассемблера будет размещено на экранной строке после 1 экранной
строки.
Например: вы хотите, чтобы первая экранная строка каждой строки ассемблера
содержала 20 символов (т.е. не включала поле меток) и чтобы каждая последующая
экранная строка начиналась с позиции 1 и заполняла всю строку. Допустим, что вы
загрузили GENS3 С #5Е00 (24064 десятичное), тогда для получения требуемого
выполните:
РОКЕ 24115,20: РОКЕ 24116,1: РОКЕ 24117,34
(должен быть минимум один пробел в начале каждой последующей экранной
строки).
Вышеуказанная модификация приемлема, если не использовалась команда * С (ее
применение заставляет строки ассемблера располагаться в листинге, как необходи-
мо).
Листинг ассемблера может быть представлен в конце строки одновременным на-
жатием CAPS SI IIFT и SPACE, затем нажмите " Е " для возврата в редактор или любую
другую клавишу для продолжения листинга.
Во время второго прохода могут встретится ошибки это
* ERROR 10 * (см. приложение А)
и
BAD ORG
В конце второго прохода выводится сообщение :
PASS 2 ERRORS: NN
с последующем предупреждением об отсутствующих метках (см. выше). Затем
выводится сообщение:
TABLE USED: ХХХХХ FROM YYYYY
которое информирует об использовании символьной таблицы и ее максимальном
размене. Затем, если директива ENT была использованна правильно появится сооб-
щение:
EXECUTES: NNNNN
которое показывает текущий адрес обьектного кода. Вы можете выполнить код,
используя команду редактора " R ". Будьте внимательны, не используйте ее, пока
успешно не завершили ассемблирование и не получили сообщение:
EXECUTES: NNNNN
В конце, если был заказан первый режим, появится алфавитный список меток и
связанных с ним значений, число значений, отображаемых в одной строке, может
быть изменено посредством команды:
POKE START-OF-GENS3 + 50 (необходимое значение)
По умолчанию это значение равно 2. После этого управление передается редакто-
ру-
2.2. ФОРМАТ УТВЕРЖДЕНИЙ АССЕМБЛЕРА
Каждая строка текста, обрабатываемого GENS3, должна иметь следующий фор-
мат, где некоторые поля необязательны:
LABEL MNEMONIC OPERAND COMMENT
START LD HL, LABEL "PICK UP" LABfcL
Пробелы и знаки табуляции (вставляемые редактором) обычно игнорируются.
Строка рассматривается так: определяется первый символ и последующие действия
зависят от его значения:
" ; " - вся строка рассматривается как коментарий, т.е. игнорируется.
" * " - ожидается следующий символ, с которым образуется команда ассемблера
(см. раздел 2.8). Все символы после команды воспринимаются как коментарии.
" " - знак конца строки, просто игнорируется.
" " - (пробел или табуляция). Если первый знак - пробел или табуляция, то GENS3
ожидает следующий, отличный от пробела или табуляции (значений), символ и
считает его началом мнемоники процессора Z80.
Если первый символ строки - любой другой знак, то GENS3 считает его началом
метки (см. раздел 2.2.). После обработки метки или, если перпый символ был пробел
или табуляция, ассемблер ищет значащий символ и ожидает, что это должен быть
символ " конец строки " или начало мнемоники Z80 ( см. приложение в ) до четырех
символов длиной и ограниченный знаками " пробел/табуляция " или " конец строки
". Если мнемоника пригодна и требует одного или нескольких операндов, то находится
и обрабатывается поле операндов. В поле операнда могут присутствовать одни метки,
это полезно для улучшения читаемости листинга. Коментарии могут находиться в
любом месте после поля операндов или, если мнемоника не требует операндов, после
поля мнемоники.
2.3. МЕТКИ
Метки - это символ, заменяющий собою до i 6 бит информации. Метка может быть
использована для указания адреса отдельной инструкции или области данных, или
как константа (посредством директивы EQU. (ст. раздел 2.7.).
Если метка, ассациируется с величиной, превышающей максимальную 8 битовую
, константу, будет использована в качестве однобайтовой константы, то ассемблер
выдает сообщение об ошибке:
LABEL EQU #1234
LD A, LABEL
и вызовет во время второго прохода ассемблера ошибку:
♦ERRORS 10*
Метка может содержать любое количество допустимых символов (см. ниже), хотя
ассемблер различает метки только по первым 6 символам. Метка не должна совпадать
с зарезервированным словом (см. приложение В), хотя зарезервированные слова
могут входить в метку как часть ее.
Символы, которые допустимы в метке:
0...9, $ и A...Z, [i , ], , a...z
Примеры меток:
LOOP, AJLONGJLABEL, L[l], L[2], В, LDIR (LDIR не зарезервированной
TWO~5
2.4. LOCATION COUNTER
(СЧЕТЧИК РАЗМЕЩЕНИЯ)
Ассемблер обслуживвает счетчик размещения так, что символ метки может быть
ассоциирован с адресом или числом и введен в таблицу символов. Значение символа
(символов) задается при помощи директивы ORG (см. раздел 2.6.). символ * $ * может
быть использован для ссылки на текущую величину счетчика, например: LD HL, $+5
вырабатывает код, который загрузит регистровую пару HL значением, на 5 больше,
чем текущее значение счетчика.
2.5. ТАБЛИЦА СИМВОЛОВ
Когда метка встречается в первый раз, она вводится в таблицу символов вместе с
двумя указателями, которые указывают в дальнейшем, как эта метка относится (в
смысле лексиграфического упорядочивания) к другим меткам в таблице. Числовое
значение метки (также вводимое в таблицу), определяется счетчиком размещения
(метка встретилась в поле меток) или директивой ассемблера EQU.
Такая таблица, называемая таблицей символов в виде двоичного дерева, позволяет
вводить символы и получать ик назад из таблицы за очень короткое время, что
необходимо для трансляции больших программ. Размер эквивалента таблицы симво-
лов колеблется от 8 до 13 байт, в зависимости от длины символа. Если в течение
первого прохода ассемблер обнаружит, что символ определен более одного раза,
выдается ошибка, так как неизвестно, какое из значений ассоциировать с символом:
* ERRORS 4 *
Если символ не ассоциируется со значением вообще, тогда в конце ассемблирова-
ния будет выданно сообщение:
* WARNING * SIMBOL ABSENT
Отсутствие определения символа не прекращает ассемблирования.
Внимание! Только первые 6 знаков вводятся в таблицу символов. Это сделано для
уменьшения размера таблицы. В конце ассемблирования выдается сообщение, пока-
зывающее сколько использовано из отведенной для таблицы символов памяти. Для
изменения обьема памяти, отводимой под таблицу, укажите необходимое число в
ответ на вопрос:
" TABLE:" (см. раздел 2.8.)
2.6. ВЫРАЖЕНИЯ
Выражение - это часть операнда, состоящая из одного терма или их комбинации,
разделенных операторами.
ТЕРМ
-десятичная константа, например 1988;
- шестнадцатиричная константа, например #496;
-двоичная константа, например % 101010;
- символьная константа, например "А";
- метка, например L1234;
- символ "$" - обозначение текущего значения счетчика размещения
ОПЕРАТОР
Примечание: символ " # " используется для обозначения шестнадцатиричного
числа, " % " - двоичного числа, " " - для символьных констант.
GENS3 усекает числовые константы до величины их шестнадцати младших битов
(т.е. по модулю 65536). Так, например, 70016 станет 4480, а #5а2с4 станет #а2с4.
Внимание ! Приоритет операций не поддерживается, т.е. вычисление значения
выражения осуществляется слева на право.
Если выражение заключено в скобки, это означает, что оно дает значение адреса,
по которому хранится операнд, например: LD HL, (LOC+5) загрузит регистровую
пару HL шестнадцатибитовым числом, хранящимся в ячейках памяти с адресами LOC
+ 5 и LOC + 6. Некоторые инструкции Z80 (например, JR и DJNZ) требуют восьми
битовых операндов в качестве смещения относительной адресации. GENS3 автомати-
чески вычисляет это смещение (значение LOCATION COUNTER следующей инст-
рукции минус значение выражения в поле операнда текущей инструкции). При этом
значение смещения должно находится в диапазоне от - 127 до + 127
Допускается указывать относительное смещение от текущей инструкции. Для
этого в поле операнда должно присутствовать выражение : $ + <смсщенис>, а смеще-
ние может принимать значения от - 126 до + 129.
Примеры правильных выражений:
Выражение Результат
#5000 - LABEL Адрес
%1001101 ! %1011 % 1000110
#3456? #1000 #456
4 + 5*3-8 19
$ - LABEL + 8 Адрес
2347 / 7 - 1 334
"A" + 128
..у* «♦.»• | <y
(5* LABEL- %1000<& %1111)
17 @% 1000
Внимание! Пробелы могут быть вставлены между термами и операторами, но не
внутри термов.
Если результат умножения превысит по абсолютной величине 32767, тогда поя-
вится сообщение
* ERRORS * 14
Операнды прим вычислении выражения представляются в форме дополнения до
2, где любое число, т.е. 60000 - - 5536 (60000 - 65536).
2.7. ДИРЕКТИВЫ АССЕМБЛЕРА
GENS3 распознает некоторые мнемоники, называемые директивами ассемблера.
Они не оказывают воздействия на процессор Z80 во время выполнения оттранслиро-
ванной программы, т.е. не транслируются в выполняемые команды, они только уп-
равляют процессом трансляции и влияют на результирующий обьектный код.
ORG <выражение>
Присваивает значение выражения указателю размещения (LOCATION
COUNTER). Если не выбраны режимы 2 и / или 16, то результатом выполнения
директивы ORG будет запись результирующих в указанные адреса, при этом возмож-
но возникновение ситуации " BAD ORG " и ассемблирование прекратится (см. раздел
2.0. для детализации воздействия режимов 2 и 16 на использование ORG).
EQU <выражение>
Директива должна предворяться меткой. Устанавливает значение метки равным
значению выражения. Выражение не должно содержать символов, значения которых
еще не определены.
DEFB <выражение>, <выражение>,...
Каждое выражение должно определять 8 бит. Байту с текущим адресом присваи-
вается значение выражения. LOCATION COUNTER увеличивается на 1. Действие
повторяется для каждого выражения. *
DEFW <выражение>, <выражение>,...
Слову (2 байта) с текущим адресом присваивается значение выражения.
LOCATION COUNTER увеличивается на 2. В памяти размещается сначала младший
байт, а затем старший. Действие повторяется для каждого выражения.
DEFS <выражение>
Увеличивает LOCATION COUNTER на величину выражения - эквивалент резер-
вирования блока памяти размером, равным значению выражения.
DEFV <строка>
Записывает N байт ASCII - представления строки. N может изменяться от 1 до 255,
хотя на практике длина строки ограничена редактором.
Первый знак в поле операнда трактуется как ограничитель строки и в память
записываются ASCII - коды символов, расположенных между ограничителями. Знак
" конец линии " (END-OF-LINE) также является ограничителем.
ENT <выражение>
Устанавливает исполнительный адрес ассемблированного кода равным значению
выражения. Используется в команде редактора " R " (см. главу 3). Нельзя задавать
ENT без указателя исполнительнлго адреса.
2.8. ДИРЕКТИВЫ УСЛОВНОЙ ТРАНСЛЯЦИИ
Директивы условной трансляции позволяют программисту включать в программу
секции текста, в зависимости от выполнения заданных условий. Это достигается
использованием директив: IF, ELSE, END
IF <выражение>
Если значение выражения равно нулю, ассемблирование прекращается до тех пор,
пока не встретится директива ELSE или END.
ELSE
Эта директива " включает " ассемблирование, если оно было " выключен но и
наоборот - " выключает если было " включено
END
I
Завершает блок условной трансляции, т.е." включает" ассемблирование, если оно
было " выключено " директивами IF или ELSE.
Примечание: вложенность директив условной трансляции не допускается и не
контролируется программой, поэтому попытки использования вложенных директив
могут привести к непредсказуемым результатам.
2.9. КОМАНДЫ АССЕМБЛЕРА
Команды ассемблера, как и его директивы, не переводятся в коды и не влияют на
результирующий обьектный код. Они только управляюит форматом листинга.
*Е Вызывает включение в листинг трех пустых строк, что полезно
для разделения модулей.
*Н <строка> Строка, указанная в команде, считается заголовком и после
команды *Е ассемблер помещает этот заголовок в листинг.
Команда *Н автоматически осуществляет *Е.
*S Вызывает приостановку выдачи листинга на экран (но не на
принтер). Вывод листинга возобновляется после нажатия лю-
4 бой клавиши.
*L - Прекращает выдачу листинга, начиная с текущей строки.
*L + Возобновляет выдачу листинга, начиная с текущей строки.
•D + Вызывает выдачу значения LOCATION COUNTER в десяти-
чной системе счисления вместо шестнадцатиричной. Значения
выводятся без отметки системы счисления.
*D - Вызывает выдачу значения LOCATION COUNTER в шестнад-
цатиричной системе счисления.
*С - 1 Прекращает включение в листинг полученных кодов команд,
сокращая длину строки листинга на 9 символов. Позволяет
размещать большинство ассемблированных строк на одной 32
- X символьной экранной строке.
*С+ Возвращает к полному листингу ассемблера, описанному в раз-
деле 2.0..
*F <имя файла> Это очень мощная команда, позволяющая ассемблировать про-
граммы, записанные на магнитной ленте. Производит считыв-
вание ленты в буфер (1 блок за 1 раз) и затем ассемблирует из
буфера, что позволяет транслировать большие программы, т.к.
текстовый файл не хранится в памяти машины.
Имя файла (до 10 символов), подлежащего ассемблированию,
указывается через пробел после *F. Бели имя опущено, то
обрабатывается первый встреченный файл на ленте.
Текстовый файл, включаемый таким образом, должен быть записан на ленту при
помощи команды редактора *Т (а не *Р), т.к. запись должна производится с достаточ-
ной величиной межблочного промежутка, что позволяет транслировать текст из бу-
фера перед загрузкой следующего блока с ленты.
Размер блока, используемого этой командой (а также командой редактора *Т),
определяется при первоначальном входе в GENS3 из ответа на вопрос:
BUFFER SIDE ? (см. главу I)
Число введенное вами и умноженное на 256, дает размер блока в байтах (значение
по умолчанию равно 4x256 байт).
Возможность влиять на размер буфера позволяет оптимизировать отношение: раз-
мер/скорость для любого обрабатываемого файла на ленте. Например, если вы не
будете использовать команду *F во время ассемблирования, тогда, возможно, будет
полезно специфицировать размер буфера нулем для минимизации пространства,
занимаемого GENS3 и его рабочей областью.
Внимание! Размер буфера, указанный во время использования команды *F, дол-
жен совпадать с размером буфера при записи программы на ленту.
Когда ассемблер обнаружит команду *F, будет выведено сообщение:
START THE ТАРЕ
Это будет и на первом и на втором проходах, т.к. включаемый текст должен быть
скопирован в обоих проходах. Лента просматривается для включения файла с указан-
ным именем или до первого встречаемого на ленте. Если найден файл с несоответст-
вующим именем, то выводится сообщение:
* FOUND <имя файла>
и поиск продолжается.
В противном случае появляется:
USING <имя файла>
и файл загружается и обрабатывается блок за блоком. Пример использования этой
команды смотри в приложении С.
Все команды, кроме * F, обрабатываются ассемблером во время второго прохода.
Если ассемблирование было "включено" одной из директив условной, то команды,
находящиеся в не транслируемой секции текста, не обрабатываются ассемблером.
3. РЕДАКТОР
3.1. ВВЕДЕНИЕ В РЕДАКТОР
Редактор, поставляемый со всеми версиями GENS3, прост, предназначен для
работы со всеми операционными системами для Z80, обеспечивает возможность бы-
строго и эффективного редактирования программ.
Для уменьшения размеров текстового файла, редактор осуществляет сжатие ис-
ходного текста за счет удаления пробелов по следующему алгоритму:
При вводе строки с клавиатуры, символы строки записываются во внутренний
буфер редактора, откуда после окончания ввода текущей строки (ввод ENTER), она
переписывается в текстовый файл с заменой подряд идущих пробелов (в том числе и
единственного) на знак табуляции TAB. В результате получается строка где все поля
ассемблированной программы разделены знаками табуляции.
Процесс сжатия прозрачен для пользователя, который может испоьзовать знаки
управления TAB 9 ( CI - см. ниже ) для получения аккуратно табулированного
текстового файла, который к тому же экономичен при хранении.
Примечание: внутри комментариев сжатие пробелов не осуществляется. Должно
быть обеспечено отсутствие пробелов внутри символов метТси, мнемоники команд и
операндов.
В этом разделе для обозначения отдельных управляющих кодов применяется абб-
ревиатура:
ENTER - клавиша "ENTER" клавиатуры.
СС - "CAPS SI IIFT" и " 1" одновремено нажатые клавиши
клавиатуры используются для прекращения ввода.
СН - клавиша "DELETE".
CI - "CAPS SI IIFT" и "8". Продвигают к следующей позиции
табуляции.
СХ - "CAPS SI IIFT" и "5". Стирание вводимой строки.
Редактор готов к работе сразу же после запуска GENS3 и появления па экране
строки:
COPYRIGTH HISOFT 1983. ALL RIGHTS RESERVED.
После этого могут вводится команды редактора, имеющие следующий формат.
С N1, N2, SI, S2 ENTER
С : команда редактора ( см. Раздел 3.2.)
N1 : число в пределах 1 - 32767
N2 : число в пределах 1 - 32767
51 : строка длинной до 20 символов
52 : строка длинной до 20 символов
Запятая используется для разделения аргументов (это можно изменить, см. коман-
ду S), пробелы игнорируются, кроме входящих в состав строки. 11и один из аргументов
не является обязательным, хотя некоторые из команд (например, DELETE) не выпол-
няются без указания N1 и N2. Редактор хранит предыдущие аргументы и использует
их значения, если вы не указали аргументы в командной строке.
Первоначально N1, N2 - 10, a SI, S2 - пустые строки. При вводе неверной коман-
дной строки, например:
PI 100, HELLO
Редактор ее игнорирует и выводит сообщение:
PARDON ?
В этом случае вводите строку снова: (F1, 10, HELLO). Сообщение об ошибке
выводится также в случае, если строка S1 больше 20 символов. В строке S2 лишние
символы игнорируются. Команды можно вводить как строчными так и прописными
буквами. Могут быть использованны все описанные выше символы управления ( CI,
СХ и т.д.).
В следующем разделе подробно описываются команды редактора. Аргументы,
заключенные в круглые скобки, должны присутствовать.
3.2. КОМАНДЫ РЕДАКТОРА
3.2.1. ВСТАВКА ТЕКСТА
Текст может быть записан в текстовый файл либо вводом номера строки, пробела
и затем требуемого текста, либо с использованием команды I. Если вы введете номер
стоки и сразу же ENTER (т.е. без текста), то строка с данным номером будет удалена
из текстового файла, если она есть.
Во время ввода текста допускается использовать управляющие функции: СХ (уда-
ление до начала строки), CI (переход к следующей позиции табуляции) и СС (выход
в командный режим), клавишу DELETE (СН) для удаления предыдущего символа
строки (но не за ее пределами).
Текст выводится во внутренний буфер GENS3 и, если он полон, ввод прекращается
- вы должны использовать СН или СХ для освобождения места в буфере.
Если в процессе занесения текста в текстовый файл, редактор обнаружит, что
конец текста приближается к вершине RAM, появится сообщение:
BAD MEMORY
Оно говорит о том, что текст больше вводить нельзя и что текущий текстовый файл
(или часть его) должен быть записан на ленту.
КОМАНДА ВСТАВКИ:
I N, М - команда переводит редактор в режим вставки с автоматической нумера-
цией строк и с заданным шагом нумерации. (N - номер первой вводимой строки, М -
шаг нумерации).
Текст должен вводиться после того, как редактор выведет номер очередной строки.
При вводе допускается использование управляющих кодов, ENTER заканчивает ввод
строки.
Для выхода из этого режима используется управляющая функция СС. Если вы
^ вводите строку с уже существующим номером, то прежняя строка будет заменена с
нажатием ENTER.
Если автоматически формируемый номер превысит величину 32767, режим встав-
ки выключается.
Если при вводе достигается конец экранной строки (при условии, что введено
меньше 64 символов - размер буфера), содержимое экрана сдвигается вверх и вы
можете продолжать ввод на следующей строке - автоматическая нумерация эффек-
тивно разделит текст.
3.2.2. ЛИСТИНГ ТЕКСТА
Текст может быть проверен при помощи команды и L и.
L, N, М - вывод листинга текущего текста на экран от строки с строки с номером N
по м включительно. По умолчанию N -1, М - 32767 (т.е. значения по умолчанию не
берутся из предыдущей команды).
Для листинга всего текстового файла используйте и L и без аргументов. Экранные
строки имеют поле слева и поэтому номер строки хорошо выделен.
Табуляция полей автоматическая, дающая четкое разделение полей.
Числом экранных строк листинга можно управлять командой и К и после указан-
ного в этой команде числа строк. Вывод приостанавливается ( если номер строки М
еще не достигнут ). Ввод управляющей функции СС вернет редактор в командный
режим, нажатие любой клавиши продолжит вывод листинга.
К N - команда устанавливает число экранных строк листинга перед паузой (как
описано выше), значение N (N по мол дулю 256) вычисляется и хранится. Например,
используйте " К 5 если желаете, чтобы следующая команда и L и выводила по 5
экранных строк за раз.
3.2.3. РЕДАКТИРОВАНИЕ ТЕКСТА
Первоначально введенный текст, как правило, требует последующего редактиро-
вания. Редактор GENS3 предоставляет различные команды, облегчающие этот про-
цесс.
D (N, М) Строки от N до М удаляются из текстового файла. Если N > М, или
указанно меньше двух аргументов, команда не выполняется, что
предотвращает случайную ошибку. Одну строку можно удалить,
указав N > М, этого же можно достичь, введя номер строки и ENTER.
М N, М Вызывает замену текста строки с номером М текстом из строки N.
Строка с номером N перестанет существовать. Если N отсутствует,
никаких действий не предпринимается. Использование команды М
вызывает перенумерацию текстового файла, начиная со строки N
(99999 должна присутствовать в файле) с шагом М. Если в процессе
перенумерации номер строки превысит значение 32767, нумерация
останется без изменения.
F N, М, F, S Текст в диапазоне строк с номерами N < X < М проверяется на
наличие образца F. Если он будет найден, выводится эта строка
текстового файла и редактор перейдет в режим EDIT (см. ниже).
Тогда, используя команду данного режима, можно продолжать по-
иск следующего вхождения в указанном диапазоне номеров строк
вхождения или произвести замену строки F на строку S и продол-
жать поиск (см. ниже более подробно). Параметры команды F могут
быть заданны ранее другой командой, в таком случае достаточно
ввести просто F для инициализации поиска (см. пример в разделе
3.3.).
Е N Редактирует строку с номером N. Если такой строки не существует,
никаких действий не предпринимается. В противном случае строка
копируется в буфер и отображается на экране вместе со своим номе-
ром. Номер дублируется под отображенной строкой и происходит
переход в режим EDIT.
Все последующее редактирование производится в буфере, а не в
тексте. Таким образом, первоначальное содержимое строки в любое
время может быть восстановлено. В этом режиме указатель движется
вдоль текста строки, начиная с первого символа и предоставляются
различные подкоманды для редактирования строки:
" " (пробел) - Сдвигает указатель текста на следующий символ.
За пределы строки символ сдвинуть невозможно.
СН (DELETE) - Сдвигает указатель текста на предыдущий
символ. За пределы строки символ сдвинуть невозможно.
ENTER - Конец редактирования строки.
CI (упр.функция) - Смещение указателя текста вперед до сле-
дующей позиции табуляции.
Q (QUIT) - Отменить редактирование строки, т.е. игнориро-
вать все изменения и оставить ее в прежнем виде.
R (RELOAD) - Перегрузить буфер режима EDIT йз текста, т.е.
отменить все изменения, сделанные в строке и восстановить ее
для редактирования в исходном виде.
L (LIST) - Вывести остаток редактируемой строки за пределы
указателя. Сохраняется режим редактирования. Указатель
расположен в начале строки.
К (KILL) - Удаляет символ в текущей позиции указателя.
Z - Стирает остаток строки, начиная с позиции указателя.
F (FIN) - Ищет ранее заданный образец в строках программы
(см. команду редактора "F"). Если в текущей строке не най-
дено вхождение образца, она автоматически записывается в
текстовый файл. Если в диапазоне строк поиска команды " F "
находится вхождение указанного образца, то строка, содержа-
щая образец, становится текущей для режима EDIT. Указатель
текста всегда располагается в начале найденного образца.
S (SUBSTITUTE) - Заменяет найденный образец на второй
аргумент команды " F и и ищет следующее вхождение образца
- выполняет подкоманду " F " (см. пример раздела 3.3.).
I (INSERT) - Вставляет символ в текущую позицию указателя.
Редактор остается в режиме вставки, пока не будет введен
ENTER, после чего производится возврат к режиму EDIT с
указателем, расположенным за последним вставленным сим-
волом. Используя СН ( DELETE ) в этом подрежиме, можно
удалять из буфера символы слева от указателя, a CI (управля-
ющая функция) продвинет указатель на следующую позицию
табуляции, вставляя в буфер пробелы.
X - Сдвигает указатель на конец строки и осуществляет пере-
ход в подрежим " I
С - Изменяет подрежим, позволяя заменять символ в текущей
позиции указателя и затем сдвинуться на следующий символ.
Выход из этого подрежима - нажатие ENTER, что возвращаеит
в EDIT с указателем, расположенным за последним изменен-
ным символом. СН в этом режиме просто сдвигает указатель на
одну позицию влево. CI не дает никакого эффекта.
3.2.4. КОМАНДЫ МАГНИТОФОНА
Текст программы может быть записан на магнитную ленту или загружен с ленты
при помощи команд редактора и р"," G " и " т
Р N, М, S На ленту записываются строки с номерами из диапазона N < X < М
под именем, указанным параметром S. Помните, что эти аргументы
могут быть установлены предыдущей командой. Перед выполнени-
ем команды убедитесь,что магнитофон включен в режиме "запись".
Не применяйте данную команду, если на следующих этапах вы
будете "включать" этот файл - используйте команду * F ассемблера.
Для этого предназначена команда" Т".
G ,, S На ленте производится поиск файла с именем S. Когда файл найден,
информация из него записывается в конец текущего текста.при пу-
стом имени файла, с ленты загружается первый встретившийся
файл. После ввода команды G появляется сообщение:
START ТАРЕ.......
Нажмите клавишу магнитофона "воспроизведение", если файл най-
ден, появится " USING < имя файла > ", и поиск будет продолжен.
При загрузке с ленты, файл записывается в конец существующего
те кетового файла (если он есть) и выполняется перенумерация всего
с номера строки равного 1, с шагом 1.
Т N, М, S На ленту записываются строки с номерами из диапазона N < X < М
под именем, указанным параметром S в формате, пригодном для
"включения" на следующей стадии с использованием команды ас-
семблера * F ( см. раздел 2.8.). Запись на ленту выполняется сразу
после ввода ENTER, поэтому предварительно надо убедиться, что
магнитофон готов к записи.
3.2.5. АССЕМБЛИРОВАНИЕ И ВЫХОД ИЗ РЕДАКТОРА
А Команда выполняет ассемблирование, начиная с первой строки тек -
стовогофайла (см. главу 2).
R Если программа была ассемблирована без ошибок и был указан
исполнительный адрес (при помощи директивы ENT), тогда данная
команда может быть использован на для запуска программы на вы-
полнение. Программа может использовать инструкцию GENS3 RET
( С9 ) для возврата в редактор после выполнения при условии, что
стек находится в том же состоянии, что и до запуска программы.
Внимание ! Директива ENT не оказывает влияния при режиме ассемблирования
16.
3.2.6. ДРУГИЕ КОМАНДЫ
В Команда возвращает управление операционной системе. Для пере-
запуска ассемблера используйте либо" холодный ", либо" теплый "
старт ( см. главу 1 ).
С Команда позволяет преобразовать текстовые файлы, созданные
GENS1 в формат GENS3. Для этого введите файл при помощи ко-
манды " G " и преобразуйте его с помощью команды " С а затем
снова запишите на ленту.
Внимание ! Команда не требует аргументов и может занять сущест-
венное время для преобразования.
S „ D Команда позволяет изменить символ, используемый в качестве раз-
делителей аргументов командной строки. В исходном состоянии
функцию разделителя выполняет запятая.
Внимание ! Новый разделитель должен использоваться везде (даже
в команде " S ") до тех пор, пока не будет заново переопределен.
Внимание ! Разделитель не может быть пробелом.
V Команда выводит текущее значения N1, N2, и SI, S2, сохраненные
при выполнении предыдущих команд. Это может быть полезно пе-
ред вводом новых команд при использовании в качестве их аргумен-
тов сохраненных значений.
W N, М Команда выводит на принтер строки текстового файла от N до М.
Если N и М не указаны, выводится полностью текстовый файл.
Печать приостанавливается после ввода указанного в команде " К "
количества строк. Для продолжения печати нажмите любую клави-
шу.
X Команда выводит начальный и конечный адрес текстового файла в
десятичных единицах. Это может быть полезно при записи файла
средствами языка BASIC или при выяснении количества свободной
памяти, оставшейся за текстовым файлом. CENS3 всегда считает,
что его текстовый файл расположен от адреса, выдаваемого коман-
дой "X" и до адреса, содержащегося в ячейке " TEXTEND которая
расположена по адресу START-OF-CENS3+54. Так, если вы хотите,
поправить текстовый файл (возможно, полученный при помощи
MONS3), вы должны разместить этот файл начиная с адреса, выда-
ваемого командой " X ", соответствующем образом поправить значе-
ния " TEXT END " и выполнить теплый старт. Скажем, например,
что вы создали текстовый файл в правильном месте и он кончается
(адрес после последнего маркера конца линии) адресом #9А02.
Принимая во внимание, что CENS3 загружен с адреса 24064, вы
должны выполнить из языка BASIC:
РОКЕ 24064 + 54, 2 (#02)
РОКЕ 24064 + 55, 154 ( #9А )
и затем ввести CENS3 командой :
RANDOMIZE USR 24125
после чего с текстовым файлом можно работать средствами редакто-
ра.
3.2.7. ПРИМЕР ИСПОЛЬЗОВАНИЯ РЕДАКТОРА
Допустим вы ввели следующую программу ( используя: I 10, 10 ):
10 ;DII RANDOM NUMBERS
20
30 ;INPUT: HL CONTAIN PREVIOS RANDOM NUMBERS OF SEED
40 ;OUTPUT: HL CONTAIN NEW RANDON NUMBER
50
60 RANDOMS PUSH AF ; SAVE REGISTERS
70 PUSH ВС
80 PUSH HL
90 ADD HL, HL ; • 2
100 ADD HL, HL ;*4
110 ADD HL, HL ;*8
120 ADD HL, HL ;M6
130 ADD HL, HL ; * 32
140 ADD HL, HL ; * 64
150 PIP ВС ; OLD RANDOM NUMBER
160 ADD HL, DE
170 LD DE, 41
180 ADD HL, DE
190 POP ВС ; RESTORE REGISTERS
200 POP AF
210 REV
Эта программа имеет следующие ошибки:
40 : " RANDON и, должно быть и RANDOM и ;
70 : и PUSH ВС и начинается в поле меток ;
150 : вместои PIPи должно бытьи POPи;
160 : нуждается в коментарии (это не ошибка, просто стиль) ;
210: вместо " REV и должно быть и RET и.
Необходимо также добавить две дополнительные строки :
145 ADD HL, HL
и все ссылки в строках 160 - 180 на регистровую пару " DE " должны быть заменены
на регистровую пару " ВС и.
Для того, чтобы внести эти исправления, поступаем следующим образом :
F40, 40, RANDON, RANDOM и ENTER и
затем и S и подкоманда Е70и ENTER и
I (режим вставки) (7 пробелов) " ENTER " ENTER "
I 142, 2 " ENTER и
142 ADD HL, HL ; * 128
144 ADD HL, HL ; * 256
F150, 150, PIP, POP " ENTER
затем " S " подкоманда El60 " ENTER "
затем и X " ; • 256 + 41 " ENTER и, " ENTER
F160, 180, DE, DC " ENTER и
затем 3 раза " S " подкоманда E210 и ENTER "
и CI и, и CI и ' С ** (изменение режима)
Т и ENTER " ENTER "
N 10,10 перенумерация текста
Внимание ! Настоятельно рекомендуем проработать на практике приведенный
вьцие пример использования редактора.
Внимательно изучи приложения, а затем приступай к работе
ПРИЛОЖЕНИЕ А
Список ошибок трансляции
* ERORRS * 1 : ошибка в строке текста программы
* ERRORS * 2 : мнемоника не распознана
* ERRORS * 3 : недопустимое выражение
* ERRORS * 4 : повторное определение символа
* ERRORS * 5 : строка содержит непригодный для данного контекста
знак
* ERRORS * 6 : один из операндов в данной строке не пригоден
* ERRORS * 7 : использование зарезервированного слова в качестве
символа
* ERRORS * 8 : неверный символ регистра
* ERRORS * 9 : в строке слишком много обозначений регистров
* ERRORS * 10 : превышено максимально допустимое значение выра-
жения
* ERRORS ♦ 11 : неверная инструкция JP (IX + D ) или JP (IY + D )
* ERRORS * 12 : ошибка в директиве ассемблера
* ERRORS * 13 : недопустимая ссылка вперед,т.е. В директиве EQU
использован неопределенный символ
* ERRORS * 14 : деление на ноль
* ERRORS * 15 : переполнение в операнде умножения
BAD MEMORY! : для дальнейшего ввода текста не хватает памяти, не-
обходимо записать текстовый файл или его часть на
ленту
BAD ORG! : использование в качестве параметра директивы ORG
адреса приходящегося на коды GENS3, текстовый
файл или таблицу символов. Управление возвращает-
ся редактору.
OUT OF TABLE SPACE : возни к ae во время первого прохода при нехватке па-
мяти, выделенной для таблицы символов, управление
возвращается редактору.
ПРИЛОЖЕНИЕ В
Список зарезервированных слов, мнемоник, команд и директив GENS3
Внимание! Применение прописных букв в приведенных ниже зарезервированных
словах, мнемониках, командах и директивах недопустимо !
ЗАРЕЗЕРВИРОВАННЫЕ СЛОВА
А |
В |
С |
D |
Е |
Н |
L |
J |
R |
S |
AF |
AF' |
ВС |
DE |
IIL |
IX |
IY |
SP |
NC |
Z |
NZ |
М |
РЕ |
РО |
|
|
|
|
|
|
МНЕМОНИЧЕСКИЕ ОБОЗНАЧЕНИЯ КОМАНД Z80
ADC |
ADD |
AND |
BIT |
CALL |
CCF |
CP |
CPD |
CPDR |
CPI |
CPIR |
CPL |
DAA |
DEC |
DI |
DJNZ |
EI |
EX |
ЕХХ |
HALT |
IM |
IN |
INC |
IND |
INDR |
INI |
INIR |
JP |
IR |
LD |
LDD |
LDDR |
LDI |
LDIR |
NEG |
NOP |
OTDR |
OTIR |
OUT |
OUTD |
OOT |
I |
POP |
PUSH |
REG |
RET |
RETI |
REIN |
RL |
RLA |
RLC |
RLCA |
RLD |
RR |
RRA |
RRC |
RRCA |
RRD |
RST |
SBC |
SCF |
SET |
SLA |
SPA |
SRL |
SUB |
XOR |
|
|
|
|
|
ДИРЕКТИВЫ АССЕМБЛЕРА
DEFB DEFM DEFS DEFW ELSE END ENT EQU IF ORG
КОМАНДЫ АССЕМБЛЕРА
*D *E *H *L *S *C *F
ПРИЛОЖЕНИЕ С
РАБОЧИЙ ПРИМЕР
Если вы новичок в программировании на ассемблере, внимательно проработайте
приведенный ниже пример. Запомните, что " ENTER " используется для обозначения
нажатия клавиши ENTER на клавиатуре.
Рабочий план:
1. Написать подпрограмму умножения и записать ее на ленту, используя команду
редактора " Р " так, чтобы легко было исправлять все возможные ошибки.
2. Отладить подпрограмму умножения, редактируя ее при необходимости.
3. Записать отлаженную подпрограмму на ленту, используя команду редактора "
Т чтобы эта подпрограмма могла включаться в другие программы.
* Вы готовы ? Тогда поехали! *
Сначала введите:
GENS3: LOAD""CODE 24064
и на запрос:
BUFFER SIDE?
ответьте:
Iм ENTER м
тем самым создав буфер размером 256 байт. Указатель " > " говорит, что вы
находитесь в режиме редактора и можете приступать к вводу текста программы.
НАПИСАНИЕ ПРОГРАММЫ УМНОЖЕНИЯ
Для ввода текста программы используется команда редактора " I управляющая
функция " CI " ( знак табуляции ) применяется для получения табулированного
листинга.
Внимание ! Адреса, указываемые в этом приложении, могут не соответствовать
адресам в вашем компьютере, они даны только для примера.
110,10м ENTER-
10 ; A FAST INTEGER MULTIPLY "ENTER"
20 ; ROUTINE. MULTIPLIES IIL " ENTERи
30 ; BY DE. RETURN TI IE RESULT " ENTER "
40 ; IN HL. С 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.MUL ; YES "ENTER"
130 EX DE, HL "ENTER"
140 ; MUL OR D " ENTER"
150 SCF ; OVERFLOW IF " ENTER и
160 RET NZ ; DE > 255 " ENTER "
170 OR E ; TIMES 0 " ENTER "
180 LD E, D "ENTER"
190 JR NZ, MU5 ; 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 HK, DE " ENTER"
270 EX DE, HL " ENTER"
280 MU3 ADD HL, HL " ENTER"
290 RET С ; OVERFLOF" ENTER"
300 MU4 RRA "ENTER"
310 JR NC.MU3 "ENTER"
320 OR A " ENTER"
330 JR NZ.MU2 "ENTER"
340 ADD I IL, DE " ENTER"
350 RET " ENTER"
360 " CC "
>P 10, 350 w ENTER "
>
В результате текст программы будет создан и сохранен на ленте.
Не забудьте включить магнитофон в режим " запись " перед выполнением команды
" Р".
ОТЛАДКА ПРОГРАММЫ
Сначала проверим, нет ли в программе ошибок трансляции, для это1Ч) используем
режим ассемблера 6 (трансляция без выдачи листинга и генерации обьектных кодов).
> А " ENTER "
TABLE SIDE:" ENTER " (размер таблицы символов - по умолчанию)
OPTIONS: 6
♦ HISOFT GENS3 ASSEMBLER ♦
COPYRIGHT HISOFT 1983
ALL RIGHTS RESERVED
PASS 1 ERRORS : 00
PASS 2 ERRORS: 00
♦ WARNING * MU5 ABSENT
TABLE USED 74 FROM 161
>
В строке 190 имеются ошибки: вместо MU4 набрано MU5, исправим эту ошибку:
> F 190,190, MU5, MU4
190 JR NZ
(теперь используем подкоманду " S " )
>
Проассемблировав программу вторично, убедимся в отсутствии ошибок.
Теперь необходимо написать программу для проверки правильности работы под-
программы умножения.
> N 300,10 (перенумерация) " ENTER "
> 110,10 " ENTER "
10 ; THE MULT ROUTINE " ENTERи
20 ; TEST CODES " ENTER"
30 "ENTER и
40 LD HL, 50 "ENTER"
50 LD DE, 20 "ENTER"
60 CALL MULT ; MULTIPLY " ENTER "
70 LD A, N ; О / 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 О / 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 NIBLE H ENTER"
210 POP AF "ENTER"
220 NIBLE AND %U11 "ENTER"
230 ADD A, #90 "ENTER"
240 DAA "ENTER"
250 ADC A, #40 "ENTER"
260 DAA " ENTER"
270 LD IY, #5C3A ; FOR ROM" ENTER"
280 RST #10 ; ROM CALL" ENTER"
290 RET " ENTER"
300 " CC H
>
Теперь проассемблируем проверочную программу вместе с подпрограммой умно-
жения :
> А " ENTER w
TABLE SIDE: " ENTER "
OPTIONS: 6 w ENTER "
ЗАСТАВКА CENS3
7EAC 190 RECA
* ERROR * 02 ( нажмите любую клавишу для продолжения )
PASS 1 ERRORS : 01
TABLE USED: 88 FROM 210
>
В программе одна ошибка - в строке 190 вместо RRCA набрано RECA. Исправим
эту ошибку:
>Е 190 "ENTER"
190 RECA
190 С (указание режима замены ) " ENTER " ENTER "
>
Теперь ассемблируем снова, используя режим 4 (без листинга), программа будет
оттранслирована верно. Допустим, что это так, и мы можем проверить подпрограмму,
а для этого необходимо сообщить редактору адрес начала выполнения программы. Это
достигается при помощи директивы ENT:
> ENT <адрес> " ENTER "
Теперь проассемблируем снова и получим :
TABLE USIDE 88 FROM 211
EXECUIES: 32416
>
Или что нибудь подобное, после чего можно загрузить программу, используя
команду редактора " R и. В результате выполнения программы (умножения 20 на 50
) ожидаем получить 1000 или ОЗве в шестнад - цатиричной системе счисления.
> R
0032 >
Не работает ! Почему ? Посмотрите строки 380 - 500 (L 380, 500). Вы увидите в
строке 430 инструкцию и OR D за которой следует " RET NZ Когда выполняется
логическое OR между аккумулятором и регистром D в случае не нулевого результата
устанавливается флаг" С Цель этих действий - убедиться, что DE < 256, чтобы при
умножении не произошло переполнения. Это условие выполняется, если D - 0, но "
OR и работает правильно только в том случае, если и А " также равен 0. Поэтому
необходимо предварительно очистить аккумулятор, иначе получим непредсказуемое
переполнение. Просматривая программу, заметим, что в строке 380 и OR А " можно
заменить на " XOR А установив флаги для инструкции " SBC HL, DE " и обнулив
аккумулятор.
> Е 380 " ENTER "
380 MULT OR А
380 Т ( режим вставки ) X " ENTER " ENTER м
Ассемблируем снова (режим 4). Запускаем программу, используя " R Ответ будет
правильный: #ЗЕ8. Вы можете убедится в правильной работе профаммы, редактируя
строки 20 и 40 для умножения различных чисел и затем транслируя и запуская се. В
завершении вы можете записать программу на ленту в формате, допускающем даль-
нейшее " включение" текста в другие программы.
> Т 300, 999, MULT " ENTER "
Внимание ! Запускать магнитофон в режиме " запись " необходимо до нажатия "
ENTER