20. ПРОФЕССИОНАЛЬНЫЙ ДВУХПРОХОДНОЙ АССЕМБЛЕР
1. Введение
В настоящее время профессиональный, быстрый двухпроходной ассемблер GENS3
является лучшим из ассемблеров для ZX SPECTRUM и компьютеров на процессоре Z80. Он
хорошо себя зарекомендовал в работе и получил самые лестные отзывы пользователей
компьютеров на процессоре Z80. Руководство пользователя по программированию на
ассемблере GENS3 написано с учетом пожеланий и советов обладателей компьютера ZX
SPECTRUM и является редакцией ранее изданной книги.
Тщательно изучите все разделы данной книги и примеры в приложении и только затем
приступайте к работе с GENS3.
GENS3 занимает около 8 Кбайт, он использует свой внутренний стек и является
независимым от содержимого памяти компьютера и имеет встроенный редактор.
Перед загрузкой ассемблера необходимо зарезервировать для GENS3 достаточный объем
памяти. Наиболее рационально GENS3 размещать в нижней части памяти.
GENS3 загружается в компьютер при помощи команды LOAD:
LOAD"GENS3" CODE ХХХХХ
(ХХХХХ - необходимый адрес загрузки, например 24064).
Для инициализации программы ввести:
RANDOMIZE USR ХХХХХ
Если в процессе работы необходимо переинициализировать программу, введите для
холодного старта (разрушаются результаты предыдущей работы):
RANDOMISE USR ХХХХХ + 56
Для теплого старта (сохранение ранее созданных файлов):
RUNDOMIZE USR ХХХХХ + 61
Необходимо помнить, что GENS3 один раз инициализируется по адресу ХХХХХ. Например,
если вы ввели и инициализировали GENS3 по адресу 24064, то для холодного старта
используется адрес 24120 и для теплого старта 24125.
После инициализации по адресу ХХХХХ появится вопрос:
BUFFER SIDE?
Введите число от 0 до 9 (по умолчанию принимается 4.1 единица * 256 байт). Это число
устанавливает величину включающего ("INCLUDE") буфера (см. раздел 2.8 для детализации).
Величина 0 устанавливает размер буфера равный 64 байтам.
После ответа на "BUFFER SIDE?" появится указатель команд редактора ">" (см. части 2 и
3 этой книги.
Внимание! GENS3 запрещает прерывания, и поэтому, когда они вам нужны, то разрешите
их командой "ЕГ Кроме того, GENS3 портит "IR" регистр
2. АССЕМБЛЕР
2.1. КАК РАБОТАЕТ GENS3
GENS3 - быстрый двухпроходной ассемблер, который ассемблирует стандартную Z80
мнемонику, добавляя условное ассемблирование и много полезных команд.
При ассемблировании (пользуйтесь командой редактора "А" - см. главу 3. сначала
необходимо ответить на вопрос об определении размера таблицы ("TABLE SIDE?") в
десятичных целых числах. Это пространство будет закреплено за таблицей символов во
время ассемблирования. По yмoлчaниюGENSЗ выбирает столько, сколько считает нужным.
Обычно это оказывается вполне достаточно.
Внимание! Когда используется режим "INCLUDE", необходимо выделять больше места
для таблицы, т к. ассемблер не может предсказать размер файла, который будет вами
выбран.
После определения размеров таблицы необходимо выбрать требуемый режим - введите
коды режимов ("OPTIONS"), просуммировать их, если необходима комбинация режимов:
Режим 1 * распечатка таблицы символов в конце 2 прохода*
Режим 2 * отказ от распечатки кодов команд *
Реж*им 4 • отказ от генирации листинга *
Режим 8 • вывод листинга на принтер •
Режим 32 * включение проверки, куда направляются коды
команд*. Полезен для ускорения ассемблирования.
Режим 16 размещение кодов команд (если они вырабатываются) после таблицы символов.
Счетчик размещения (LOCATION COUNTER) продолжает корректировать ORG так, что коды
команд можно помещать в одну секцию памяти и программа будет работоспособна в любом
месте памяти.
Например:
Режим 36 производит быстрое ассемблирование: при этом не генерируется листинг и не
производится проверки размещения кодов команд.
Внимание! Если используется режим 16, то директива ассемблера "END" не вызовет
никакой реакции, чтобы выяснить, куда помещены коды команд, используется команда
редактора "Xм - для определения конца текста (второе число, выводимое на экран) - и затем
добавляем к нему размер таблицы символов + 2.
Ассемблирование производится в 2 прохода:
1 проход: выявляются ошибки и составляется таблица символов.
2 проход: генерируются коды команд и данных, (если не используется режим 2).
Во время первого прохода на экран (при нтер) н и чего не выводится, если не было обнаружено
ошибок. В противном случае неверная строка будет отображена на экране с номером
ошибки под ней (см. приложение А). После этого нажмите "Е" для возврата в редактор или
любую другую клавишу для продолжения ассемблирования со следующей строки.
В конце первого прохода выводится сообщение:
PASS 1 ERRORS: NN
При обнаружении ошибок ассемблирование останавливается и переход к 2 проходу не
производится. Если в поле операнда были ссылки и метки, не объявленные в поле меток,
то для каждого недостающего объявления метки выводится предупреждение:
* WARNING* LABEL ABSENT (метка отсутствует)
Во время второго прохода генерируются коды команд (если это не было запрещено
выбором режима 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 позиций, каждая экранная строка листинга ассемблера содержится
целиком на одной строке экрана.
После какой-либо метки идет новая строка - в ней показана мнемоника в позициях 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 SHIFT и SPACE, затем нажмите "Е" для возврата в редактор или любую другую
клавишу для продолжения листинга
Во время второго прохода могут встретится ошибки это
* ERROR 10 * (см. приложение А)
и
BAD ORQ
В конце сторого прохода выводится сообщение:
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 "PICKUP" LABEL
Пробелы и знаки табуляции (вставляемые редактором) обычно игнорируются. Строка
рассматривается так: определяется первый символ и последующие действия зависят от
его значения:
";" - вся строка рассматривается как комментарий, т.е. игнорируется.
" • " - ожидается следующий символ, с которым образуется команда ассемблера (см.
раздел 2.8). Все символы после команды воспринимаются как комментарии.
"" - знак конца строки, просто игнорируется.
"" - (пробел или табуляция). Если первый знак - пробел или табуляция, то GENS3 ожидает
следующий, отличный от пробела или табуляции (значений), символ и считает его началом
мнемоники процессора Z80.
Если первый символ строки-любой другой знак, то GENS3 считает его началом метки (см.
раздел 2.2.). После обработки метки или, если первый символ был пробел или табуляция,
ассемблер ищет значащий символ и ожидает, что это должен быть символ "конец строки"
или начало мнемоники Z60 (см. приложение В) до четырех символов длиной и ограниченный
знаками "пробел/табуляция" или "конец строки". Если мнемоника пригодна и требует
одного или нескольких операндов, то находится и обрабатывается поле операндов. В поле
операнда могут присутствовать одни метки, это полезно для улучшения читаемости
листинга. Комментарии могут находится в любом месте после поля операндов или, если
мнемоника не требует операндов, после поля мнемоники.
2.3. МЕТКИ
Метки - это символ, заменяющий собою до 16 бит информации. Метка может быть
использована для указания адреса отдельной инструкции или области данных, или как
константа (посредством директивы EQU. (см.раздел 2.7.)
Если метка, ассоциируется с величиной, превышающей максимальную 8 битовую
константу, будет использована в качестве однобайтовой константы, то ассемблер выдает
сообщение об ошибке:
LABEL EQU #1234
LD A,LABEL
и вызовет во время второго прохода ассемблера ошибку:
• ERRORS 10 *
Метка может содержать любое количество допустимых символов (см.ниже), хотя ассемблер
различает метки только по первым 6 символам. Метка не должна совпадать с
зарезервированным словом (см. приложение В), хотя зарезервированные слова могут
входить в метку как часть ее.
Символы, которые допустимы в метке:
0...9, $ и A...Z, (,,),_, A,a...z
Примеры меток:
LOOP, A. LONG. LAB EL, L[1], 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;
- символн$и - обозначение текущего значения счетчика размещения
ОПЕРАТОР
+ (плюс)
(минус)
& (логическое "И")
! (логическое "искл.ИЛИ")
* (целое умножение)
/ (целое деление)
? ( функция MOD, А?В= А - (А/В) »В)
Примечание: символн #" используется для обозначения шестнадцатиричного числа, "%
" - двоичного числа, и" - для символьных констант.
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
"А" ♦ 128
"Y" - ♦ 7
(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<CTpoKa>
Записывает N байт ASCII - представления строки. N может изменяться от 1 до 255, хотя на
практике длина строки ограничена редактором.
Первый знак в поле операнда трактуется как ограничитель строки и в память записываются
ASCII - коды символов, расположенных между ограничителями. Знак "конец линии" (END-
OF-LINE) также является ограничителем.
ENT < выражен ив>
Устанавливает исполнительный адрес ассемблированного кода равным значению
выражения. Используется в команде редактора "R" (см. главу 3). Нельзя задавать ENT без
указателя исполнительного адреса.
2.8. ДИРЕКТИВЫ УСЛОВНОЙ ТРАНСЛЯЦИИ
Директивы условной тарнсляции позволяют программисту включать в программу секции
текста, в зависимости от выполнения заданных условий. Это достигается использованием
директив: IF, ELSE, END
IF < выражение>
Если значение выражения равно нулю, ассемблирование прекращается до тех пор, пока
не встретится директива ELSE или END.
ELSE
Эта директива "включает" ассемблирование, если оно было "выключено", и наоборот -
"выключает", если было "включено".
END
Завершает блок условной трансляции, т.е. "включает" ассемблирование, если оно было
"выключено" директивами IF или ELSE.
Примечание: вложенность директив условной трансляции не допускается и не
контролируется программой, поэтому попытки использования вложенных директив могут
привести к непредсказуемым результатам.
2.9. КОМАНДЫ АССЕМБЛЕРА
Команды ассемблера, как и его директивы, не переводятся в коды и не влияют на
результирующий объектный код. Они только управляют форматом листинга.
* Е Вызывает включение в листинг трех пустых строк, что полезно
для разделения модулей.
* Н <строка> Строка, указанная в команде, считается заголовком и после
команды * Е ассемблер помещает этот заголовок в листинг.
Команда * Н автоматически осуществляет * Е.
* S Вызывает приостановку выдачи листинга на экран (но не на
принтер). Вывод листинга возобновляется после нажатия
любой клавиши.
* L - Прекращает выдачу листинга, начиная с текущей строки.
* L ♦ Возобновляет выдачу листинга, начиная с текущей строки.
* D ♦ Вызывает выдачу значения LOCATION COUNTER в деся-
тичной системе счисления вместо шестнадцатиричной. Зна-
чения выводятся без отметки системы счисления.
* D • Вызывает выдачу значения LOCATION COUNTER в шест-
надцатиричной системе счисления.
* С - Прекращает включение в листинг полученных кодов команд,
сокращая длину строки листинга на 9 символов. Позволяет
размещать большинство ассемблированных строк на одной
32 - X символьной экранной строке.
* С ♦ Возвращает к полному листингу ассемблера, описанному
в разделе 2.0..
* Р<имяфайла> Это очень мощная команда, позволяющая ассемблировать
программы, записанные на магнитной ленте. Производит счи-
тывание ленты в буфер (1 блок за 1 раз) и затем ассемблирует
из буфера, что позволяет транслировать большие программы,
т.к. текстовый файл не хранится в памяти машины.
Имя файла (до 10 символов), подлежащего ассемблированию
указывается через пробел после * F. Если имя опущено, то
обрабатывается первый встреченный файл на ленте.
Текстовый файл, включаемый таким образом, должен быть записан на ленту при помощи
команды редактора • Т(а не • Р), т.к. запись должна производится с достаточной величиной
межблочного промежутка, что позволяет транслировать текст из буфера перед загрузкой
следующего блока с ленты.
Размер блока, используемого этой командой (а также командой редактора *Т),
определяется при первоначальном входе в GENS3 из ответа на вопрос:
BUFFER SIDE? (см.главу 1)
Число введенное вами и умноженное на 256, дает размер блока в байтах (значение по
умолчанию равно 4x256 байт).
Возможность влиять -на размер буфера позволяет оптимизировать отношение:
размер/скорость для любого обрабатываемого файла на ленте. Например, если вы не
будете использовать команду *F во время ассемблирования, тогда, возможно, будет полезно
специфицировать размер буфера нулем для минимизации пространства, занимаемого
GENS3 и его рабочей областью.
Внимание! Размер буфера, указанный во время использования команды *F, должен
совпадать с размером буфера при записи программы на ленту.
Когда ассемблер обнаружит команду * F, будет выведено сообщение:
START THE ТАРЕ
Это будет и на первом и на втором проходах, т.к. включаемый текст должен быть
скопирован в обоих проходах. Лента просматривается для включения файла с указанным
именем или до первого встречаемого на ленте. Если найден файл с несоответствующим
именем, то выводится сообщение:
FOUND < имя файла>
и поиск продолжается.
В противном случае появляется:
USING < имя файла>
и файл загружается и обрабатывается блок за блоком. Пример использования этой
команды смотри в приложении С.
Все команды, кроме * F, обрабатываются ассемблером во время второго прохода
Если ассемблирование было "включено" одной из директив условной, то команды,
находящиеся в нетранслируемой секции текста, не обрабатываются ассемблером
3. РЕДАКТОР
3.1. ВВЕДЕНИЕ В РЕДАКТОР
Редактор, поставляемый со всеми версиями GENS3, прост, предназначен для работы со
всеми операционными системами для Z80, обеспечивает возможность быстрого эффектив-
ного редактирования программ.
Для уменьшения размеров текстового файла, редактор осуществляет сжатие исходного
текста за счет удаления пробелов по следующему алгоритму:
При вводе строки с клавиатуры, символы строки записываются во внутренний буфер
редактора, откуда послеокончания ввода текущей строки (ввод ENTER), она переписывается
в текстовый файл с заменой подряд идущих пробелов (в том числе и единственного) на
знак табуляции TAB. В результате получается строка, где все поля ассемблированной
программы разделены знаками табуляции.
Процесс сжатия прозрачен для пользователя, который может использовать знаки
управления TAB 9 (CI • см. ниже) для получения аккуратно табулированного текстового
файла, который к тому же экономичен при хранении.
Примечание: внутри комментариев сжатие пробелов не осуществляется Должно быть
обеспечено отсутствие пробелов внутри символов метки, мнемоники команд и операндов
В этом разделе для обозначения отдельных управляющих кодов при меняется аббревиа-
тура:
ENTER • клавиша "ENTER" клавиатуры.
СС - "CAPS SHIFT" и "1" одновременно нажатые клавиши клавиатуры используются
для прекращения ввода.
СН - клавиша "DELETE".
CI - "CAPS SHIFT" и "8". Продвигают к следующей позиции табуляции.
СХ - "CAPS SHIFT" и "5". Стирание вводимой строки.
Редактор готов к работе сразу же после запуска GENS3 и появления на экране строки:
COPYRIGTH HISOFT 1983. ALL RIGHTS RESERVED.
После этого могут вводится команды редактора, имеющие следующий формат.
CN1,N2, S1.S2 ENTER
С : команда редактора (см. Раздел 3.2.)
N1 : число в пределах 1 — 32767
N2 : число в пределах 1 — 32767
51 : строка длинной до 20 символов
52 : строка длинной до 20 символов
Запятая используется для разделения аргументов (это можно изменить, см. команду S),
пробелы игнорируются, кроме входящих в состав строки. Ни один из аргументов не является
обязательным, хотя некоторые из команд (например, DELETE) не выполняются без указания
N1 и N2. Редактор хранит предыдущие аргументы и использует их значения, если вы не
указали аргументы в командной строке.
Первоначально N1, N2 s10, а 31, S2 - пустые строки. При вводе неверной командной
строки, например:
F1-, 100, HELLO
Редактор ее игнорирует и выводит сообщение:
PARDON?
В этом случае вводите строку снова: (F1,10, HELLO) Сообщение об ошибке выводится
также в случае, если строка S1 больше 20 символов В строке S2 лишние символы иг-
норируются Команды можно вводить как строчными, так и прописными буквами. Могут
быть использованы все описанные выше символы управления (CI, СХ и т.д.).
В следующем разделе подробно описываются команды редактора. Аргументы, заклю-
ченные в круглые скобки, должны присутствовать.
3.2. КОМАНДЫ РЕДАКТОРА
3.2.1. ВСТАВКА ТЕКСТА
Тескт может быть записан в текстовый файл либо вводом номера строки, пробела и затем
требуемого текста, либо с использованием команды I. Если вы введете номер строки и сразу
же ENTER (т.е. без текста), то строка с данным номером будет удалена из текстового файла,
если она есть.
Во время ввода текста допускается использовать управляющие функции: СХ (удаление
до начала строки), CI (переход к следующей позиции табуляции) и СС (выход в командный
режим), клавишу DELETE (СН) для удаления предыдущего символа строки (но не за ее
пределами).
Текст выводится во внутренний буфер GENS3 и, если он полон, ввод прекращается - вы
должны использовать СН или СХ для освобождения места в буфере.
Если в процессе занесения текста в текстовый файл, редактор обнаружит, что конец
текста приближается к вершине RAM, появится сообщение:
BAD MEMORY
Оно говорит о том, что текст больше вводить нельзя и что текущий тестовый файл ( или
часть его) должен быть записан на ленту.
КОМАНДА ВСТАВКИ:
IN, М - команда переводит редактор в режим вставки с автоматической нумерацией строк
и с заданным шагом нумерации. (N - номер первой вводимой строки, М - шаг нумерации).
Текст должен вводиться после того, как редактор выведет номер очередной строки. При
вводе допускается использование управляющих кодов, ENTER заканчивает ввод строки.
Для выхода из этого режима используется управляющая функция СС. Если вы вводите
строку с уже существующим номером, то прежняя строка будет заменена с нажатием
ENTER.
Если автоматически формируемый номер превысит величину 32776, режим вставки
выключается.
Если при вводе достигается конец экранной строки ( при условии, что введено меньше
64 символов - размер буфера), содержимое экрана сдвигается вверх и вы можете продолжать
ввод на следующей строке - автоматическая нумерация эффективно разделит текст.
3.2.2. ЛИСТИНГ ТЕКСТА
Текст может быть проверен при помощи команды "L"
L N, М - вывод листинга текущего текста на экран от строки с строки с номером N по М вклю-
чительно. По умолчанию Nsl,Ms32767 (т.е. значения по умолчанию не берутся из предыдущей
команды).
Для листинга всего текстового файла используйте "L" без аргументов. Экранные строки
имеют поле слева и поэтому номер строки хорошо выделен.
Табуляция полей автоматическая, дающая четкое разделение полей.
Числом экранных строк листинга можно управлять командой "К" после указанного в этой
команде числа строк. Вывод приостанавливается (если номер строки М еще не достигнут).
Ввод управляющей функции СС вернет редактор в командный режим, нажатие любой
клавиши продолжит вывод листинга.
К N - команда устанавливает число экранных строк листинга перед паузой (как описано
выше), значение N (N по модулю256) вычисляется и хранится. Например, используйте "К5",
если желаете, чтобы следующая команда NL" выводила по 5 экранных строк за раз.
3.2.3. РЕДАКТИРОВАНИЕ ТЕКСТА
Первоначально введенный текст, как правило, требует последующего редактирования.
Редактор GENS3 предоставляет различные команды, облегчающие этот процесс.
D (N,M) Строки от N до М удаляются из текстового файла. Если N>M, или указано меньше
двух аргументов, команда не выполнятся, что предотвращает случайную ошибку. Одну
строку можно удалить, указав N>M, этого же можно достичь, введя номер строки и ENTER.
MN,M Вызывает замену текста строки с номером М текстом из строки N. Строка с номером
N перестанет существовать. Если N отсуствует, никаких действий не предпринимается
Использвание команды М вызывает перенумерацию текстового файла, начиная со строки
N (99999 должна присутствовать в файле) с шагом М. Если в процессе перенумерации
номер строки превысит значение 32767, нумерация останется без изменения.
F N, М, F, S Текст в диапазоне строк с номерами N<X<M проверяется на наличие образца
F Если он будет найден, выводится эта строка текстового файла и редактор перейдет в ре-
жим EDIT (см. ниже). Тогда, используя команду данного режима, можно продолжать поиск
следующего вхождения в указанном диапазоне номеров строк или произвести замену стро-
ки F на строку S и продолжать поиск (см. ниже более подробно). Параметры команды F могут
быть заданны ранее другой командой, в таком случае достаточно ввести просто F для
инициализации поиска (см. пример в разделе 3.3.).
EN Редактирует строку с номером N. Если такой строки не существует, никаких действий
не предпринимается. В противном случае строка копируется в буфер и отображается на эк-
ране вместе со своим номером. Но мер дублируется под отображенной строкой и происходит
переход в режим EDIT. Все последующее редактирование производится в буфере, а не в
тексте. Таким образом, первоначальное содержимое строки в любое время может быть вос-
становлено. В этом режиме указатель движется вдоль текста строки, начиная с первого
символа, и предоставляются различные подкоманды для редактирования строки:
" N (пробел) — Сдвигает указатель текста на следующий символ. За пределы строки
символ сдвинуть невозможно.
СН (DELETE) — Сдвигает указатель текста на предыдущий символ. За пределы
строки символ сдвинуть невозможно.
ENTER — Конец редактирования строки.
С1 (упр. функция) — Смещение указателя текста вперед до следующей позиции
табуляции.
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 — Сдвигает указатель на конец строки и осуществлят переход в подрежим "Г.
С — Изменяет подрежим,позволяя заменять символ в текущей позиции указателя и
затем сдвинуться на следующий символ. Выход из этого подрежима — нажатие
ENTER, что возвращает в EDIT с указателем, расположенным за последним изменен-
ным символом. СН в этом режиме просто сдвигает указатель на одну позицию влево.
CI не дает никакого эффекта.
3.2.4. КОМАНДЫ МАГНИТОФОНА
Текст программы может быть записан на магнитную ленту или загружен с ленты при
помощи команд редактора "р", "G" и "т".
Р N, M,S На ленту записываются строки с номерами из диапозана N<X<M под
и менем, указан ным параметром S. Пом ните, что эти аргументы могут быть установлены
предыдущей командой. Перед выполнением команды убедитесь, что магнитофон
включен в режиме "запись". Не применяйте данную команду, если на следующих
этапах вы будете "включать* этот файл — используйте команду *F ассемблера. Для
этого предназначена команда "Т".
G,, S На ленте производится поиск файла с имененм S. Когда файл найден,
информация из него записывается в конец текущего текста. При пустом имени
файла, с ленты загружается первый встретившихся файл. После ввода команды G
появляется сообщение:
START ТАРЕ.............
Нажмите клавишу магнитофона "воспроизведение". Если файл найден, появится
"USINGchmr файла>", и поиск будет продолжен. При загрузке с ленты, файл
зап исывается в конец существующего текстового файла (если он есть) и выполняется
перенумерация всего с номера строки равного 1, с шагом 1.
Т N, М, S На ленту записываются строки с номерами из диапазона N<X<M под
имененм, указанным параметром 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, и S1,S2, сохраненные при выполнении
предыдущих команд. Это может быть полезно перед вводом новых команд при
использвании в качестве их аргументов сохраненных значений.
WN,M Команда выводит на принтер строки текстового файла от N до М. Если
N и М не указаны, выводится полностью текстовый файл Печать приостанавливается
после ввода указанного в команде "К" количества строк Для продолжения печати
нажмите любую клавишу
X Команда выводит начальный и конечный адрес текстового файла в десятичных
единицах. Это может быть полезно при записи файла средствами языка BASIC или
при выяснении количества свободной памяти, оставшейся за текстовым файлом.
gens3 всегда считает, что его текстовый файл расположен от адреса, выдаваемого
командой "x" и до адреса, содержащегося в ячейке "text end", которая расположена
по адресу start-of-gens3+54. Так, если вы хотите поправить текстовый файл
(возможно, полученный при помощи mons3), вы долждны разместить этот файл,
начиная с адреса, выдаваемого команой "X". соотвествующим образом поправить
значения "text end" и выыполнить теплый старт. Скажем, например, что вы создали
текстовый файл в правильном месте и он кончается (адрес после последнего маркера
конца линии) адресом #9а02. Принимая во внимание, что gens3 загружен с адреса
24064, вы должны выполнить из языка BASIC:
роке 24064 ♦ 54, 2 («02)
роке 24064 ♦ 55, 154 («9а)
и затем ввести gens3 командой:
randomize usr 24125
после чего с текстовый файлом можно работать средствами редактора.
3.2.7. ПРИМЕР ИСПОЛЬЗОВАНИЯ РЕДАКТОРА
Допустим, вы ввели следующую программу (используя: 110, 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 ;*16
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" подкоманда E160 "ENTER";
затем "X"; * 256*41 "ENTER", "ENTER";
F160, 180, DE, DC "ENTER"
затем 3 раза "8" подкоманда E210 "ENTER"
"CI", "CI" "С" (изменение режима)
T "ENTER", "ENTER"
N 10,10 перенумерация текста
Внимание! Настоятельно рекомендуем проработать на практике приведенный выше
пример использвоания редактора.
Внимаетельно изучи приложения, а затем приступай к работе.
ПРИЛОЖЕНИЕ А
Список ошибок трансляции
* ERORRS* 1 :ошибка в строке текста программы
*ERORRS*2 :мнемоника не распознана
* ERORRS* 3 недопустимое выражение
* ERORRS*4 -.повторное определение символа
* ERORRS* 5 :строка содержит непригодный для данного контекста знак
* ERORRS* 6 :один из операндов в данной строке не пригоден
* ERORRS* 7 использование зарезервированного слова в качестве символа
* ERORRS* 8 :неверный символ регистра
* ERORRS*9 :в строке слишком ного обозначений регистров
* ERORRS* Ю:превышено максимально допустимое значение выражения
* ERORRS* 11:неверная инструкция JP (IX+D) или JP (IY+D)
* ERORRS* 12:ошибка в директиве ассемблера
* ERORRS* 13:недопустимая ссылка вперед, т.е в директиве EQU использован
неопределенный символ
* ERORRS* 14:деление на ноль
* ERORRS* 15:переполнение в операнде умножения
BAD МЕМОВУ!:для дальнейшего ввода текста не хватает памятиб необходимо
записать текстовый файл или его часть на ленту
BAD ORG! :использование в качестве параметра директивы ORG адреса
приходящегося на коды GENS3, текстовый файл или таблицу сим волов. Управление
возвращается редактору.
OUT OF TABLE SPACE возникает во время первого прохода при нехватке памяти,
выделенной для таблицы символов. Управление возвращается редактору.
ПРИЛОЖЕНИЕ В
Список зарезервированных слов, мнемоник, команд и директив GENS3
Внимание! Применение прописных букв в приведенных ниже зарезервированных
словах, мнемониках, командах и директивах недопустимо!
ЗАРЕЗЕРВИРОВАННЫЕ СЛОВА
ДИРЕКТИВЫ АССЕМБЛЕРА
DEFB DEFM DEFS DEFW ELSE END ENT EQU IF ORG
КОМАНДЫ АССЕМБЛЕРА
•D *E *H •L *S *C *F
ПРИЛОЖЕНИЕ С
РАБОЧИЙ ПРИМЕР
Если вы новичок в программировании на ассемблере, внимательно проработайте
приведенный ниже пример. Запомните, 4to"ENTER" используется для обозначения нажатия
клавиши ENTER на клавиатуре.
Рабочий план:
1. Написать подпрограмму умножения и записать ее на ленту, используя команду
редактора "Р" так, чтобы легко было исправлять все возможные ошибки.
2. Отладить подпрограмму умножения, редактируя ее при необходимости.
3. Записать отлаженную подпрограмму на ленту, используя команду редактора "Т",
чтобы эта подпрограмма могла включаться в другие программы.
* Вы готовы? Тогда поехали! *
Сначала введите:
GENS3:LOADMMCODE24064
и на запрос:
BUFFER SIDE?
ответьте:
1"ENTER"
тем самы создав буфер размером 256 байт. Указатель ">" говорит, что вы находитесь
в режиме редактора и можете приступать к вводу текста программы.
НАПИСАНИЕ ПРОГРАММЫ УМНОЖЕНИЯ
Для ввода текста программы используется команда редактора "Г, управляющая
функция "СГ (знак табуляции) применяется для получения талубированного листинга.
Внимание! Адреса, указываемые в этом приложении, могут несоотвествовать адресам
в вашем компьютере, они даны только для примера.
И 0,1 CENTER"
10 ;А FAST INTEGER MULTIPLY "ENTER"
20 ;ROUTINE. MULTIPLIES HL "ENTER"
30 ;BY DE. RETURN THE RESULT "ENTER"
40 ;IN HL. С FLAG SET ON AN "ENTER"
50 ; OVER FLOW. "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 HL, DE "ENTER"
350 RET "ENTER"
360 "CC"
>P 10, 350"ENTER"
>
В результате текст программы будет создан и сохранен на ленте
Не забудьте включить магнитофон в режим "запись" перед выполнением команды
"Р".
ОТЛАДКА ПРОГРАММЫ
Сначала проверим, нет ли в программе ошибок трансляции, для этого используем
режим ассемблера 6 (трансляция без выдачи листинга и генерации объектных кодов).
>А "ENTER"
TABLE SIDE: "ENTER"(pa3Mep таблицы символов - по умолчанию)
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, 10MENTERM
10 ;ТНЕ MULT ROUTINE "ENTER"
20 JEST CODES "ENTER"
30 "ENTER"
40 LD HL, 50 "ENTER"
50 LD DE, 20 "ENTER"
60 CALL MULT ; MULTIPLY "ENTER"
70 LD A,N ; O/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/PA 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 "ENTER"
210 POP AF "ENTER"
220 NIBLE AND %1111 "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"
>
Теперь проассемблируем проверочную программу вместе с подпрограммой умножения:
>А "ENTER"
TABLE SIDE: "ENTER"
OPTIONS:6"ENTER"
ЗАСТАВКА GENS3
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<aApec>"ENTER"
Теперь проассемблируем снова и получим:
TABLE USIDE 88 FROM 211
EXECUIES: 32416
>
Или что-нибудь подобное, после чего можно загрузить программу, используя команду
редактора "R". В резлуьтате выполнения программы (умножения 20 на50) ожидаем получить
1000 или ОЗве в шестнадцатиричной системе счисления.
>R
0032>
Не работает! Почему? Посмотрите строки 380-500 (L 380,500). Вы увидите в строке 430
инструкцию "OR D", за которой следует "RtT NZ". Когда выполняется логическое OR между
аккумулятором и регистром D в случае не нулевого результата устанавливается флаг "С".
Цель этих действий - убедиться, что De<256, чтобы при умножении не произошло
переполнения. Это условие выполняется, если DsO, но "OR" работает правильно только в
том случае, если "А" также равен 0. Поэтому необходимо предварительно очистить
аккумулятор, иначе получим непредсказуемое переполнение. Просматривая программу,
заметим, что в строке 380 "OR А" можно заменить на "XOR А", установив флаги для
инструкции "SBC HL, DE" и обнулив аккумулятор.
>E380"ENTER"
380 MULT OR А
380 Т (режим вставки) X"ENTER", "ENTER"
Ассемблируем снова (режим 4). Запускаем программу, используя "R". Ответ будет
правильный: #ЗЕ8. Вы можете убедиться в правильной работе программы, редактируя
строки 20 и 40 для умножения различных чисел и затем транслируя и запуская ее. В
завершении вы можете записать программу на ленту в формате, допускающем дальнейшее
"включение" текста в другие программы.
>Т 300, 999, MULTENTER"
Внимание! Запускать магнитофон в режиме "запись" необходимо до нажатия "ENTER".