EDITAS EDITOR/ASSEMBLER
PICTURESQUE,
6 CORKSCREW HILL,
WEST WICKHAM,
KENT
BR4 9BB.
Редактор/ассемблер — это одно ив
мощнейших средств для программирования в машинных кодах. Совместно с программой
"MONITOR" она составляет законченную систему
для работы с программами в машинных кодах.
Без программы
"MONITOR" "EDITAS" позволяет вводить и редактировать
исходный модуль и получать объектный модуль (в шестнадцатиричных кодах), а
также получать копию на принтере или на ленте. При этом обеспечена полная
независимость от Бейсика. В программе имеется встроенная система идентификации
ошибок.
"EDITAS"
работает в два этапа. Сначала "EDITAS"
позволяет создать исходный модуль посредством нумерации строк, подобно тому,
как это делается в бейсиковских программах и выполнить его редактирование. На
втором этапе исходный модуль ассемблируется в объектный код.
РЕДАКТОР.
После загрузки программы появится
запрос, будете ли вы работать с новым текстом или продолжите работу с существующим.
Отвечайте "N", поскольку пока никакого текста
в буфере нет. Программа имеет генератор символов, позволяющий писать 40
символов в строке, поэтому символы отличаются от стандартных символов Бейсика.
КЛАВИАТУРА
Поскольку набор команд ассемблера
меньше, чем в Бейсике, клавиатура работает в упрощенном режиме. Не
задействованы режимы "EXTENDED MODE",
"GRAPHICS", "CAPS LOCK". Acсемблер знает заранее,
когда потребуется ввод строчных символов, и во всех остальных случаях работает
с заглавными. Во многих случаях команды ассемблера совпадают с
соответствующими бейсик-командами. Они вызываются только тогда, когда курсор
находится в начале строки. Это команды: LIST, EDIT, SAVE, NEW,
CLEAR, RETURN.
Другие команды не имеют аналогов в
Бейсике или не являются ключевыми словами (т.е. их надо набирать по буквам),
Они также вызываются, когда курсор находится в начале строки:
"RE-NUM" /клавиша N/, "VERIFY"
/V/, "AVTO" /D/, "ASSEMBLE" /R/.
Движение курсора, а также "DELETE" и "ENTER",
как в Бейсике.
Все другие клавиши действуют как
обычно и дают соответствующие буквы и цифры. Нажатие
"SYMBOL SHIFT" совместно с клавишей дает символ, написанный
красным цветом под этой клавишей (только если это одиночный символ). Символы
Бейсика, вызываемые через режим "EXTENDED MODE",
в ассемблере не функционируют.
Единственный случай, когда вам
могут потребоваться строчные буквы — это ввод текстовых строк. Во всех
остальных случаях ассемблер пишет прописные буквы автоматически.
ЭКРАН
Экран ассемблера имеет 40 колонок и разбит на зоны. Мы
полагаем, что вы прочтете внимательно раздел "Ввод строки" и
поэкспериментируете, пока не привыкнете к работе с зонами и к использованию
курсора.
ВВОД СТРОКИ
Программы в машинных кодах
вводятся способом, похожим на то, как это делается в Бейсике. В одной строке
разрешается только одна инструкция, строка должна иметь номер от 0 до 9999 и
код команды с соответствующими операндами. Полный список мнемоник Z-80 в форме, приемлемой для ассемблера приведен в
приложении 1.
Программная строка может также
иметь метку, имя которой будет идентифицировать эту инструкцию в программе.
Экран разбит на четыре зоны:
Номер строки — первые
четыре символа + пробел;
Имя метки — следующие пять
символов + пробел;
Имя операции — следующие
четыре символа + пробел;
Операнды — остальные позиции в
строке. Переход к началу следующей зоны выполняется нажатием клавиши "SPACE". Все программы должны начинаться с
указания адреса, с которого они ассемблируются. Он называется
"ORIGIN" и сокращается как "ORG".
Например, надо набрать:
0010 ORG 6000
Адрес 6000 — это адрес первого
байта ассемблированной программы. Перед тем как выполнить
"ENTER", поперемещайте курсор вдоль этой строки. Когда курсор
находится над символом, нажатие клавиш приводит к тому, что первоначальный
символ заменяется новым, а курсор перемещается на одну позицию вправо. Нажатие
"М" или "О" переводит курсор на одну позицию в пределах
зоны, пробелы игнорируются. Если зона пустая, курсор перемещается к концу этой
зоны.
Удаление символа выполняется так:
установите курсор справа от него. Нажмите "DELETE".
Символ исчезнет, курсор займет его место, но оставшаяся часть зоны не
сдвигается. Теперь передвиньте курсор к "R" в "ORG" и
нажмите "SPACE". "RG" сотрется и
курсор установится в начале следующей зоны. Для стирания последнего символа в
строке поместите курсор на него и нажмите "SPACE".
Чтобы удалить всю строку,
установите курсор в крайнюю левую позицию строки и нажмите
"SPACE".
При вводе каждой новой строки в
программу ассемблер выполняет необходимые проверки для того, чтобы убедиться в
наличии в каждой зоне по крайней мере одного пробела. Они необходимы, чтобы
ассемблер мог различать отдельные части * строки. Если этих пробелов нет, то "ENTER" не сработают.
Ввод мнемоник должен выполняться
строго в соответствии с формой, приведенной в приложении 1.
Если в операции имеются 2
операнда, то ее поле должно остаться пустым. Например:
0020 LD А. 20
Внимательно просмотрев приложение
1, вы сможете выделить два важных момента:
1. Некоторые из арифметических
операций (ADD, ADC, SUB, SBC^AND, XOR, OR) имеют
несколько отличное написание по сравнению с описанием фирмы
"ZILOG". Так, например, в тех случаях, когда операндом должен
быть "А" (аккумулятор), данный ассемблер не требует его показывать.
Только в тех случаях, когда первый операнд не "А", надо показывать
оба операнда. Так, например, вместо ADC А,В требуется ADC В, но ADD HL.DE пишется как обычно. Инструкции JP
(IX), JP (IX) и JP (HL) можно
писать без скобок.
2. Есть некоторые инструкции, которые
понимаются ассемблером, но не были описаны фирмой "ZILOG". Так,
экспериментально установлено, что возможны операции с отдельными половинками
регистровых пар IX и IY. Их форма: ХН — для старшего
байта и XL — для младшего; аналогично:
YH и YL.
Появилась новая арифметическая
функция SLL, которая сдвигает байт влево, при этом бит
— 7 устанавливается в "CARRY", а в бит 0
помещается 1. Состояние флагов такое же, как в SRL.
В отличие от бейсикового редактора
строк здесь выполняется только прокрутка экрана. Если листинг на экране набран
не в порядке нумерации строк, автоматическая перестановка не выполняется.
Конечно можно вывести листинг в порядке нумерации, но для этого надо
воспользоваться командой "LIST".
КОМАНДЫ РЕДАКТОРА
1. "LIST'
(клавиша К). По этой команде высвечиваются десять строк программы. Последующие
блоки по десять строк подаются клавишей "SPACE"
После каждого блока может быть подана какая-либо другая команда. После "LIST" можно указать номер строки. На ZX — принтер листинг может быть выдан, если ввести после "LIST" символ — косую черту — "/".
2. "AUTO" — эта команда дает возможность автонумерации строк. Наберите
номер, с которого хотите начать, затем "ENTER". Нумерация
идете шагом по 10. Чтобы выйти из режима "AUTO", сотрите
номер текущей строки. Когда курсор достигнет крайней левой позиции, режим "AUTO" будет отключен. Повторный вход
в "AUTO" начинается с
номера, следующего за тем, с которым вы выходили из
"AUTO".
3. "EDIT'. В
отличие от Бейсика здесь нет возможности перемещать курсор по вертикали.
Поэтому, чтобы отредактировать определенную строку, надо дать ее номер после
команды "EDIT". После редактирования строка
вставляется в программу через "ENTER".
4. "NEW".
Эта команда очищает числовой буфер, затирает список меток и устанавливает "EDITOR/ASSEMBLER" в исходное положение (как после
загрузки). Появляется исходное сообщение. Если вы нажали
"NEW" по ошибке, то в ответ давайте "С", а не "N" (как вы делали в начале работы).
5. "RETURN".
Эта команда дает возможность выйти в Бейсик. Для возврата в
"EDITAS" используйте: Для 16К: RANDOMISE USR
28205. Для 48К: RANDOMISE USR 60973. Нажатие клавиши "BREAK" во время работы принтера или во время SAVE, LOAD, VERIFY также приводит к выходу в Бейсик. Возврат
в ассемблер тем же способом.
6. "RENUM". Эта команда позволяет изменять номера строк исходного
модуля. Введите величину интервала между номерами соседних строк от 1 до 99.
Нажмите "ENTER", и перенумерация будет
выполнена. Первой строке присвоен номер, равный назначенному интервалу. Если в
результате этой процедуры будет получен номер выше 9999, то программа
автоматически уменьшит интервал на 1 и т.д. Результирующий шаг будет виден по
номеру, присвоенному первой строке.
СТРОКИ КОММЕНТАРИЕВ
В тексте программы могут быть
использованы комментарии. Они выполняются аналогично строкам REM в Бейсике. Введите номер строки, переместите курсор в
зону метки и набейте там точку с запятой. Установите курсор в зоне операндов и
в кавычках напишите свой текст.
АССЕМБЛЕР
Ассемблер превращает мнемоники в
шестнадцатеричный код, необходимый для работы процессора. Мнемоники
называютсяисходным модулем, полученный шестнадцатеричный код — объектным
модулем.
Ассемблер делает два прохода по тексту программы. На первом
проходе проверяется правильность синтаксиса. Рассчитываются значения меток и
составляется таблица этих значений, создается контур объектного файла.
На втором проходе полностью
рассчитываются все числовые операнды, вычисляются адреса переходов. Разделить
эти два прохода невозможно. Результаты второго прохода выдаются на экран или
на ZX-принтер. В этом разделе руководства будет описано использование меток и
директив ассемблера. Здесь же будут рассмотрены некоторые новые команды.
КАРТА ПАМЯТИ
4000
|
PROG
|
ЭКРАН
|
АТРИБУТЫ
|
СИСТЕМНЫЕ ПЕРЕМЕННЫЕ
|
БЕЙСИК
|
|
ОБЪЕКТНЫЙ КОД
|
СВОБОДНО
|
|
STEND
|
RAMTOP
|
СВОБОДНО
|
ТЕКСТОВЫЙ БУФЕР
|
"EDITAS"
|
СТЕК
|
ГРАФИКА ПОЛЬЗОВАТЕЛЯ UDG
|
|
6700
|
|
Когда вы вводите в листинг
новую строку, текстовый буфер перемещается вниз, передвигая при этом таблицу
меток. Если текстовый и объектный буфер сойдутся и перекроют один другой, то
появится сообщение о переполнении памяти "MEMORY FULL".
ВНИМАНИЕ!!! "EDITAS", его буфера и таблицы находятся ниже RAMTOP
и не имеют защиты от Бейсика. Команда Бейсика "NEW"
уничтожит "EDITAS".
ОПЕРАНДЫ.
Числа. Ассемблер принимает
десятичные и шестнадцатеричные числа. По умолчанию принимаются десятичные,
шестнадцатеричныс на конце должны иметь суффикс "Н". Если
шестнадцатеричное число начинается с буквы, то ей должен предшествовать 0,
иначе ассемблер примет это число за имя метки.
НАПРИМЕР:
не DOOOH, a ODOOOH
не FFH, a OFFH
Символы
ASCII. Одиночные символы кода ASCII также
могут быть операндами при условии, что они вводятся в кавычках. Этот тип
операндов может быть во всех операциях, которые могут использовать числовой
операнд, кроме директив ассемблера "ORG" и "END".
После того, как вы набрали
открывающие кавычки, ассемблер автоматически переходит в нижний регистр, если
вы не используете "CAPS SHIFT". Например: — LDA "а" — дает код ЗЕ61.
Арифметические символы.
Разрешается использование операций сложения и вычитания внутри операндов.
Разрешена также сумма или разность значений меток, числовых значений символов ASCII в любой комбинации, например:
LD А,
"А"+20H —дает код 3E 81;
LD HL.LBL2-LBL1
— вычисляется значение разности
между значениями меток;
LD DE. START+100H — добавляет фиксированное значение к значению
метки.
JR/DJNZ.
Адреса перехода для этих двух инструкций могут быть заданы многими разными
способами. Нижеследующий пример охватывает все возможные способы задания
перехода. Переход должен быть в пределах от +127 до -128: Например:
5DDB 0010 ORG #
5DDB 1В02 0020 JR LOOP
5DDD ЗЕ01 0030 LD A,
1
5DDF 0602 0040 LOOP LD В. 2
5DE1 18FC 0050 JR LOOP
5DE3 1620 0060 JR 32
5DE5 1820 0070 JR 2CH
5DE7 1820 0080 JR +32
5DE9 1820 00У0 JR -+2CH
5DEB 18FC 0100 JR 0CH
5DED 18FC 0110 JR 232
5DEF 18FC 0120 JR -4
5DF1 18FC 0130 JR -4H
5DF3 10EA 0140 DJNZ LOOP
5DF3 10EE 01b0 DJNZ CEEN
5DF7
|
10EE
|
0160
|
DJNZ
|
238
|
5DF9
|
10EE
|
0170
|
DJNZ
|
-1B
|
5DFB
|
10EE
|
0180
|
D.JNZ
|
-12H
|
5DFD
|
1020
|
0190
|
DJNZ
|
32
|
5DFF
|
1020
|
0200
|
DJNZ
|
2CH
|
5Е01
|
1020
|
0210
|
DJNZ
|
+32
|
5Е03
|
1020
|
0220
|
DJNZ
|
+2CH
|
|
|
0230
|
END
|
|
LOOP
|
5DDF
|
|
|
|
#
|
5DDB
|
|
|
|
МЕТКИ
Любая метка может быть
использована в качестве операнда при условии, что ее значение находится в
пределах, допустимых для данной операции.
Метка — это средство задания точки в программе или средство
хранения значения постоянных и переменных. Все метки имеют два байта, 16-и
битное значение. Имя метки может иметь максимум до 5 символов. Они должны
начинаться с букв и не могут содержать пробелов. Все имена регистров, условные
операторы — это зарезервированные имена и их нельзя использовать в качестве
имен меток. Первый символ не может быть также точкой с запятой.
ПРОСТЫЕ МЕТКИ
Меткам, помещенным в отведенную
для них зону, за которыми следует операция, отличная от
"EQU" и "DEFL", присваивается
значение текущего программного адреса этой инструкции. Если простая метка
используется как операнд, ее значение должно быть определено где-либо в
программе.
Существуют два специальных типа
меток, задаваемых директивам ассемблера "EQU" и "DEFL". Вы
задаете значения меток как постоянные или переменные.
EQU — эта директива назначает значение метки. Она не помещает
никаких кодов в объектный буфер. После того как метке присвоено значение через
"EQU", его уже нельзя переопределить. В качестве операнда может быть
число, символ ASCII или имя другой метки, но при этом
последнее уже должно быть определено. Имя метки помещается в зону метки:
"EQU" помещается в зону операции, а операнд — в зону операнда.
DEFL — эта
директива также позволяет задать значение метке, но она позволяет
предопределять его в программе по мере необходимости. При каждом новом задании
старое значение теряется. Метка является переопределяемой, если ее первое определение
(в порядке нумерации строк) было сделано директивой "DEFL".
Последующие определения могут быть через "DEFL" или "EQU",
но она останется переопределяемой. Поскольку метки, заданные "EQU" и
"DEFL", не являются частью программы, они не имеют связанного с ними
адреса, поэтому вместо адреса на экране указывается их значение.
Существует специальный операнд "&",
который применяется только с директивами "EQU" и. "DEFL".
Он присваивает метке значение текущего программного адреса.
# — эта метка задастся
самим ассемблером и ей присваивается адрес начала буфера объектного кода. Она
не переопределяется.
ДИРЕКТИВЫ АССЕМБЛЕРА.
Это не имена операции, которые
принимаются процессором. Они введены только для упрощения процедуры написания
машинных кодов. Они используются ассемблером только при трансляции для
расчета байтов данных, генерации сообщений и т.п. Они вводятся в программу с
номером строки путем написания имени в зоне операции. Их можно помечать метками
и они все требуют операнда, за исключением END. По
крайней мере, две из них должны быть в каждой программе — это
"ORG" и "END".
ORG —
задает адрес первого байта ассемблированного кода. Эта директива должна быть
задана до любой другой инструкции. Ей могут предшествовать комментарии, но
лучше все же сначала задавать "ORG".
Шестнадцатиричный код, выдаваемый ассемблером, записывается в объектный буфер,
откуда выдается на ленту. Метка "#" определяет начало буфера, она
задается ассемблером. Операндом в "ORG" может быть число, метка
(если она была определена).
На одну программу допускается
только одна инструкция "ORG". Для защиты системных переменных адрес
"ORG" должен быть выше, чем начало бейсиковской программной области,
задаваемой переменной "PROC".
Если программа ассемблируется с "ORG #", то код в объектном буфере полностью
привязан к адресам буфера и может быть там и запущен. Любые другие адреса
"ORG" дадут код в объектном буфере, который может быть запущен в
других адресах.
END —
означает конец программы. Если после него и есть строки, ассемблер их
игнорирует.
DEFB —
приписывает определенный байт текущему адресу. Значение должно быть менее 256.
Операндом может быть число, символ или метка со значением, меньшим 256.
DEFW —
присваивает значение двум соседним байтам. Сначала идет младший байт, затем
старший.
DEFS —
заполняет адреса, начиная с текущего, нулями. Операнд — число.
DEFM — для
ввода сообщений. Операнд — строка символов "ASCII"
в кавычках. В отличие от прочих строк, которые должны
умещаться в 40 колонках, эти
строки могут быть двойными и иметь до 47 символов.
ОБЪЕКТНЫЙ БУФЕР
Ассемблер записывает
шестнадцатеричный код в объектный буфер, который всегда имеет фиксированное
положение относительно конца Бейсик области, и начинается на 256 байтов выше "STKEND" (зазор в 256 байтов необходим для того,
чтобы позволить вам вернуться в Бейсик и снова войти в ассемблер без порчи
стека калькулятора объектным кодом).
Коды в объектном буфере могут быть
запущены оттуда непосредственно, если адрес "ORG" задан меткой
"#". Оттуда они могут быть выданы на ленту, а впоследствии
загружаться в те адреса памяти, для которых они были сделаны. Преимущество
такой системы наиболее полезно для машин 16К, так как там очень ограничена
память, особенно после загрузки ассемблера.
Программа может быть разбита на
несколько малых частей, каждая из которых ассемблируется и записывается
отдельно. Инструкции "END" первого блока
дается метка, определяющая ее адрес, который используется в директиве
"ORG" следующего блока и т.д. до конца программы. Затем идет возврат
в Бейсик и загрузка частей в память через Бейсик. Все части вместе записываются
на ленту, что дает одну большую программу. Между блоками дается команда "CLEAR", которая очищает текстовый буфер, но не
трогает метки.
КОМАНДЫ
Команды, к которым обращается "EDITAS", мы уже рассмотрели. Оставшиеся команды
рассмотрим ниже. Они вызываются, когда курсор находится в крайней левой позиции
строки.
ASSEMBLE
(клавиша R). На экране появляется надпись "ASSEMBLE". При первом проходе ассемблера ничего
не выдается ни на экран, ни на принтер. Второй проход может отражаться на
Экране или принтере, а может и нет. В последнем случае скорость
ассемблирования выше.
1. Ассемблирование без дисплея.
Нажать "R", затем "ENTER". Если
ошибок нет, то будет пауза, размер которой зависит ОТ длины программы.
Ассемблирование закончится изображением на экране таблицы меток и их значений.
Метки из DEFL будут отмечены звездочкой.
2. Ассемблирование с печатью на
ZX-принтере. Нажмите "R", затем SS+V, затем "ENTER". Если принтер подключен, листинг будет
распечатан. Принтер можно остановить "BREAK",
но после этого вы возвратитесь в Бейсик.
3. Ассемблирование с выдачей на
экран. Нажмите "R", затем любой символ, кроме"/", затем "ENTER". Второй проход ассемблера будет сопровождаться
выдачей информации на экран. Экран будет выполнять "скроллинг"
автоматически, но может быть остановлен клавишей "М".
CLEAR.
Очищает текстовый буфер, но оставляет таблицу меток. Если вы ассемблируете
длинную программу по частям, метки одной части могут потребоваться в другой.
Эти метки могут быть уничтожены только командой ассемблера
"NEW". После того, как новая часть программы будет введена и
проассембли-рована, новые метки добавляются к таблице.
CONTINUE.
Строго говоря, это не команда, а ответ, который вы даете после входа в
ассемблер из Бейсика (клавиша "С"). Альтернативная операция при входе
из Бейсика — "N" (NEW).
ПРОЦЕДУРЫ ВВОДА/ВЫВОДА
SAVE — из
ассемблера напрямую можно выгрузить текстовый или объектный буфер (клавиша "S"):
1. Текстовый буфер. Форма: SAVE "ИМЯ" TEXT. Длина имени
до 10 символов, вместо "TEXT" можно дать
"Т". 2. Объектный буфер. Форма: SAVE
"ИМЯ" CODE. Здесь "CODE"
не ключевое слово. Можно просто нажимать "С".
VERIFY —
форма: VERIFY "ИМЯ". Если имя не задано; то
операция выполняется для первой записи с ленты. Мы рекомендуем не выходить в
Бейсик между "SAVE" и
"VERIFY", так как может измениться адрес
STKEND. Если это произойдет, то "VERIFY"
почти наверняка не сработает.
LOAD —
ассемблер загружает только текстовый буфер. Запись любой программы, сделанная
в Бейсике не загружается. Существуют два типа
"LOAD":
1. LOAD
"ИМЯ" N — здесь "N" означает "NEW" (новый). При этом старый текстовый буфер с
таблицей меток стирается.
2. LOAD
"ИМЯ" С — здесь "С" означает
"CLEAR" (стереть). При этом очищается старый текстовый буфер,
но таблица меток остается.
ПРИМЕЧАНИЕ: можно загрузить
текстовый буфере кассеты через Бейсик, но он испортит таблицу меток и не даст
работать ассемблеру. Текстовые файлы должны загружаться через ассемблер.
Файлы объектного буфера сделаны
так, чтобы иметь возможность загружаться в компьютер через команду Бейсика LOAD""CODE. Если вы это выполните, то имейте в
виду, что часть ассемблера может быть затерта (см. карту памяти).
Если имеется достаточный объем
памяти, текстовый файл, записанный из 48К ассемблера, может быть загружен в 16К
ассемблер и ассемблирован. Если места окажется недостаточно, то появится
сообщение "MEMORY FULL".
СООБЩЕНИЕ ОБ ОШИБКАХ
При работе с редактором наиболее
вероятным сообщением возможно "MEMORY FULL".
Оно выдается, когда строка, которую вы собираетесь ввести, приводит к
переполнению, т.е. к пересечению текстового и объектного буферов.
Другие сообщения появляются при работе ассемблера. При
этом автоматически изображается строка, содержащая ошибку.
• INVALID ORG:
1. Если адрес "ORG" меньше, чем начало области
бейсиков-ской программы, заданное значением системной переменной "PROG".
2. Если первая строка программы (исключая комментарии) не
является заданием "ORG".
3. Если в программе более, чем одна строка, задает
"ORG".
• INVALID NUMBER:
Если десятичное число содержит нечисловой символ или неправильно
заданное шестнадцатсричное число.
• INVALID ОР:
1. Если имя операции не распознается.
2. Если числовой операнд имеет значение, выходящее за пределы
допустимого.
• JUMP OUT OF RANGE:
Если переход JR или
DJNZ производится по смещению, выходящему за допустимые пределы:
-128...+127.
• MEMORY FULL
1. При вводе очередной строки, если в результате этого числовой
буфер или таблица меток затирают объектный буфер.
2. При ассемблировании, если объектный буфер затирает текстовый
буфер или таблицу меток.
МОНИТОР СПЕКТРУМА
48К версия программы "EDITAS" имеет еще одну дополнительную команду
для вызова программы "Монитор". Если вы хотите работать с обеими
программами одновременно, мы рекомендуем сначала загрузить
"MONITOR" (версию 16К), а затем 48К версию
"EDITAS". При таком подходе стек будет расположен выше
ассемблера и не будет затерт объектным буфером. Чтобы обратиться к
"Монитору" нажмите "N". После
"ENTER" вы убедитесь, что "Монитор" присутствует.
Имейте в виду, что при загрузке большой программы объектный или текстовый
буфер могут затереть программу "Монитор".