ZX-Forum №3 1995 г.

Читатель-читателю - Краткое описание Laser Genius ASSEMBLER/MONITOR.


ЧИТАТЕЛЬ-ЧИТАТЕЛЮ

Краткое описание LASER GENIUS ASSEMBLER/MONITOR

© Илья Фомин, С-Петербург, 1995.

Часть 0. Вместо предисловия.

Пара слов об этом описании. Прежде всего, сообщу, что его мне любезно предоставил Владимир Ларьков).

Заинтересовавшись Laser Genius ассемблером я долго тыкал пальцем в грудь каждому встречному с целью выудить у счастливца описание данного ассемблера. Долго никто не сознавался, наконец, попали мне в руки неизвестно кем созданные бумажки, текст которых я и набрал (в текстовом редакторе iS-EDIT к слову). Так что за полную достоверность не отвечаю, все проверяйте сами, но хоть список команд и их параметры появились. В известной мне версии Laser Genius-а (адаптация МОА для TR-DOS) все связанное с микродрайвом следует понимать как дисковод (вместо MDRV пишите DISK).

Ну, а если кто имеет более полное описание, сей программы, то не жмитесь, поделитесь с остальными.

Часть 1. Ассемблер.

ЗАГРУЗКА АССЕМБЛЕРА

Для загрузки инсталлятора ассемблера необходимо ввести команду: LOAD "GENASM". GENASM - загрузчик на бейсике. После запуска он выдает меню опций, по которым Вы можете выбрать рабочую структуру ассемблера. К стандартным возможностям можно добавить специальные инструментальные команды (см. 2. "Команды ассемблера") и/или ХЭШ-расширения (см. 6. "ХЭШ-расширения, язык программирования Феникс.). Так же есть возможность выгрузки ассемблера на микродрайв. Инсталлятор так же позволяет установить цвета фона, тона, значения кода символа перевода строки для работы с принтером (установление этого значения в ноль позволяет избежать проблем двойного перевода строки на некоторых моделях принтеров), а также позволяет выбрать тип подключения принтера (последовательный или параллельный).

РЕДАКТОР

Редактор делит экран на текстовые блоки, которые мы далее будем называть предложениями. Любой текст, набираемый на экране, будет введён в текущее предложение, указываемое курсором. Когда экран очищен, каждая его строка представляет собой одно предложение. Тем не менее, предложение может быть длиннее, чем одна строка. Если длина напечатанного текста превысит длину экранной строки, редактор поставит в конце строки знак продолжения и переведет курсор на следующую строку. Такие строки также объединяются в одно предложение.

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

ПРИЛОЖЕНИЯ 1. СПИСОК КОМАНД АССЕМБЛЕРА.

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

ASSEM - очищает таблицу имен и ассемблирует текущий текст.

ASSEMC - сохраняет текущую таблицу имен и ассемблирует текущий текст.

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

BASE <2,8,10,16> - устанавливает умолчание базы в PRINT и UPRINT.

CAT - каталог с ленты/микродрайва.

CLEAR - очищает текущую таблицу имён.

CLS - очищает экранный буфер и физический экран.

CODE "<имя>" <выр1>,<выр2> - записывает область памяти от адреса <выр1> до адреса <выр2> в двоичный файл с именем "<имя>".

COPY <стр1>,<стр2> - копирует <стр1> в <стр2>.

DELETE - стирает весь текущий текст.

DELETE <спец. стр .> - стирает группу строк из текущего текста.

ERA "<имя>" - удаляет файл(ы) (микродрайв).

EXECUTE <выр>,<пар> - вызывает коды с адреса <выр>, посылая параметры (список параметров: <пар>=<пар1>,<пар2>,...,<пар^) таким образом, что IX содержит начало списка, причём параметры записываются в обратном порядке.

1-й параметр IX+2*(n-i) (мл. байт) 1+IX+2*(n-i) (ст. байт) для числового выражения; или дескриптор строки длиной три байта:

длина строки IX+2*(n-i)

адрес (мл) 1+IX+2*(n-i) (ст) 2+ IX+2*(n-i)

Замечание: т.к. EXECUTE вызывает коды командой CALL микропроцессора Z80, эти коды должны заканчиваться RET для нормального возврата в Genius.

EXPORT "<имя>" - записывает текущую таблицу имён на ленту/микродрайв.

EXIT - RET к программе, вызвавшей ассемблер или к ассемблеру из среды HOUSEWORK. Примечание: Если при работе с Genius-ом Вы воспользовались EXIT или Вас выкинуло из ассемблера в BASIC и Вы желаете вернуться в Genius без перезагрузки, сохранив текст программы, наберите: RANDOMIZE USR 65533.

FIND "<имя>",<спец. стр> - найти строку "<имя>".

FORM - новая страница на принтер.

HOUSEWORK - переход к среде работы с внешними носителями, поддерживает команды: CAT ERA

TAPE MDRV

TAPE, IN MDRV, IN

TAPE, OUT MDRV, OUT

а также команду

COPY "<имя1>", "<имя2>", которая копирует файл "<имя2>" в новый файл "<имя1>".

IMPORT "<имя>" - присоединяет предыдущую экспортированную таблицу символов к текущей.

LENGTH - устанавливает страницу на принтере длиной 65536 строк.

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

строк.

LIST - распечатывает весь исходный текст.

LIST <спец. стр> - распечатывает строки текста под номерами <спец.стр> LMISSING - распечатать на принтере имена, на которые была ссылка, но которые не были определены. (Длина поля 16).

LMISSING <дес. число> - см. выше, но длина поля <дес. число>. LOAD "<имя>" - загрузить исходный текст с ленты/микродрайва с именем "<имя>". LOAD "<имя>" <спец. стр> - то же, но загружаются строки <спец.стр> из файла "<имя>". LOAD ASCII "<имя>" - загрузка "чистого" ASCII файла с именем "<имя>". LOAD ASCII "<имя>" <опции> - загрузить файл-источник с именем "<имя>", тип которого показывает <опции>. Строки нумеруются с 0 по 10; опции:

1 - файл "чисто" ASCII (не содержит нумерации строк).

2 - строки файла заканчиваются на CR (0Dh). 4 - файл не содержит колонок после меток.

8 - пропускает первые 4 байта файла.

LOAD ASII "<имя>",<опции> <дес. число> - то же, но регулируемая нумерация строк.

LLIST - вывод всего текста на принтер.

LLIST <спец. стр> - вывод на принтер группы строк.

LTABLE - вывод на принтер текущей таблицы символов (Длина поля 16), отсортированной в ASCII порядке.

LTABLE <дес. число> - то же, но длина поля <дес.число>. LTABLEN - то же, что и LTABLE, но в числовом порядке. LTABLEN <дес.число> - то же, но с <дес.число>.

LUNUSED - вывод на принтер определенных, но неиспользованных символов (длина поля 16).

LUNUSED <дес. число> - то же, но длина поля <дес.число>.

MARGIN - установка левой границы в ноль.

MARGIN <дес. число> - установка левой границы.

MDRV - переключает I/O ассемблера на микродрайв (по умолчанию #1).

MDRV <дес. число> - выбор микродрайва.

MDRV.IN - переключить ввод ассемблера с микродрайва.

MDRV.OUT - переключить вывод ассемблера на микродрайв.

MISSING - вывод на экран имен, на которые есть ссылка в программе, и которые не определены (Длина поля 16).

MISSING <дес. число> - то же, но длина поля <дес.число>. MOVE <стр1>,<стр2> - перемещение группы строк. NEXT - продолжение поиска/замены после ESC.

PRINT <выражен> - вывод значения выражения <выражен> в текущем базисе со знаком. PRINT <выражен>,<база> - вывод значения выражения <выражен> в базисе <база> со знаком.

REDUCE - удаление всех имен, которые не были специфицированы как CARGO во время предыдущего ассемблирования.

RENUM <нов . стр>,<шаг>,<от стр> - перенумерация параграфов. REPLACE "<имя1>", "<имя2>", <спец.стр> - контекстуальная замена.

SAVE "<имя>" - запись исходного текста на ленту/микродрайв в файл "<имя>". SAVE" <имя>",<спец. стр> - то же, но фрагмента текста. SET SPACE <дес. число> - установка памяти редактора. (сначала около 10 кб). STATS - информация распределения памяти.

TABLE - вывод на экран текущей таблицы символов (Длина записи 16) В порядке ASCII.

TABLE <дес. число> - то же, но длина записи <дес.число>. TABLEN - то же, что и TABLE, но в числовом порядке. TABLEN <дес. число> - то же, но длина записи <дес.число>. TAPE - переключает I/O ассемблера на ленту. TAPE.IN - переключает ввод ассемблера с ленты. TAPE.OUT - переключает вывод ассемблера на ленту.

UNUSED - вывод на экран определенных, но неиспользованных символов (Длина поля 16). UNUSED <дес. число> - то же, но длина поля <дес.число>.

UPRINT <выражен> - вывод значения выражения <выражен> в текущем базисе без знака. UPRINT <выражен>,<база> - вывод значения выражения <выражен> в базисе <база> без

знака.

VERIFY "<имя>" - сравнить текущий текст с файлом "<имя>". VERIFY "<имя>",<спец. стр> - то же, но группу строк <спец.стр>. WIDTH - устанавливает ширину страницы принтера 65536.

WIDTH <дес. число> - устанавливает ширину страницы принтера в <дес.число>. Замечания:

1. Команды SAVE, LOAD, EXPORT, IMPORT, CAT, COPY (HOUSEWORK), VERIFY, а так же некоторые опции ассемблера работают с файлами, которые обычный загрузчик ZX-Specrum-а не распознает.

2. Команда CODE генерирует байтовый файл, загружаемый обычным загрузчиком ZX-Spectrum. Служит для создания небольших кодовых файлов, объектный код которых помещается в памяти вместе с Genius-ом.

3. Для создания больших кодовых файлов используют опции ассемблирования, генерирующие объектные файлы в формате Genius-а, и с помощью утилиты TRANSFER их конвертируют в Спектрумовские.

4. Ваша библиотека может содержать ограниченное число меток на которые Вы будете ссылаться в Ваших программах. EXPORT, как правило, записывает все имена, в т.ч. и те, которые не нужны. В Genius-е предусмотрена возможность записи только желаемых имен. Для этого имена, которые надо записать, помечаются псевдо операцией CARGO: <label>: CARGO и после ассемблирования таблица символов обрабатывается командой REDUCE. После этого можно записать желаемую таблицу символов на внешний носитель командой EXPORT.

2. СПИСОК ОПЦИЙ АССЕМБЛИРОВАНИЯ. В скобках указаны опции, устанавливаемые по умолчанию.

*screen on / *screen off - разрешает/запрещает какой-либо вывод на экран (в т.ч. сообщения об ошибках). (on)

*printer on / *printer off - разрешает/запрещает вывод на принтер (сообщения об ошибках и сообщения конца прохода ассемблера). (off)

*list on / *list off - включает/выключает вывод листинга на экран. (on) *llist on / *llist off - то же для принтера. (off) *form - "новая страница" на принтер.

* title "<имя>",<выраж> - устанавливает заголовок страницы для принтера. Если присутствует <выраж>, то устанавливает текущий номер страницы.

*maclist on / *maclist off - разрешает/запрещает выводить листинг генерации кодов макроопределений. (off)

*include "<имя>" - включение в исходный текст с внешнего носителя строк, которые необходимо ассемблировать.

*openout "<имя>" - создание результата ассемблирования - объектного кода - на внешнем носителе. Адресация согласно ORG PUT - игнорируется.

*closeout - прекращение генерации на внешний носитель.

*prompts on / *prompts off - разрешение/запрещение запросов при работе с микродрайвом. (on)

*count on / *count off - выводит на экран в случае, когда выключен листинг номера ассемблирующихся в данный момент строк. (off)

*report on / *report off - включает/выключает ожидание нажатия клавиши после вывода сообщения об ошибке во время ассемблирования. (on)

*code on / *code off - разрешает/запрещает генерацию кода во время ассемблирования.

(on)

*print "<строка>" - выводит на экран и принтер сообщение <строка>. *pause - останавливает ассемблирование и ждёт нажатия клавиши. *while <выражен> *endw

- цикл с пред-условием: делать пока <выражен> не равно 0.

*repeat

*until <выражен>

- цикл с пост-условием: делать пока <выражен> равно 0.

3. ПСЕВДООПЕРАЦИИ АССЕМБЛЕРА.

DB <список определения байтов> - DEFB, DEFM - инициализирует байты памяти во время ассемблирования.

F.e. (for example):

DB 1,2,3,0Fh,@77 => 01 02 03 0F 3F

DB "Hello!13" =>...... 20 0D

DW <список определения слов> - DEFW - инициализирует слова (пары байтов) в памяти во время ассемблирования. F.e.:

DW #12 34,0EFDAH => 34 12 DA EF DS <выражение> - DEFS - освобождает место в объектном коде длиной <выражение> байтов.

<label>: EQU <выражение> - используется для определения и инициализации нового имени <label> значением <выражение>.

<label>: DL <выражение> - DEFL - то же, что и EQU, но может использоваться для переопределения слова <label>. F.e.:

cnt :EQU 1

*WHILE cnt <= 10 DB cnt * cnt

cnt :DL cnt + 1

*ENDW

данный пример генерирует таблицу квадратов чисел от 1 до 10 в памяти. COND <выражение> ELSE

ENDC

- ассемблер вычисляет <выражение> и, если оно не ноль, ассемблирование продолжается с COND до ELSE а потом пропускается до ENDC. В противном случае пропускается до ELSE и ассемблируется до ENDC. После ENDC ассемблирование происходит в обычном порядке.

ORG <выражение> - устанавливает счётчик размещения значением <выражение> (относительно счётчика размещения генерируются адреса в ассемблеровской программе). Замечание: объектный код, ассемблируемый в память НЕ будет записан по адресу, указанному в ORG, а, следовательно, не может быть выполнен без псевдооперации PUT (см. ниже).

PUT <выражение> - устанавливает адрес размещения объектного кода в памяти, которое будет происходить во время ассемблирования.

<label>: MACRO <список параметров> - макроопределение. Определяет имя <label> как имя макроса, который описывается ниже слова MACRO до слова ENDM. <список параметров> - список имён через запятую, перед каждым именем обязательно ставится символ "".

F.e.: макрос обмена между регистровыми парами через стек:

exg: MACRO p1, p2 PUSH p1

PUSH p2

POP p1

POP p2

ENDM

Вызов осуществляется следующим образом:

exg BC,DE => PUSH BC : PUSH DE : POP BC : POP DE т.е перед именем макроса также ставят "". (NB принцип макроопределения заключается в подстановке готовых строк в исходный текст ассемблером во время трансляции, т. е. макрос ни в коем случае не является подпрограммой!).

4. ЯЗЫК ПРОГРАММИРОВАНИЯ PHOENIX.

Вычисление выражений

#DSE <компилирующее выражение> - "Определить выражение со знаком".

#DUE <компилирующее выражение> - "Определить выражение без знака".

Эти псевдооперации во время ассемблирования преобразуют <компилирующее выражение> в выполняемые коды. Вычисления во время выполнения программы происходят с сохранением временных результатов в стеке. Арифметические операции определены в специальной библиотеке Genius-а, и доступ к ним осуществляется командами CALL из программы (см. #LIB).

Присвоение

Присвоение переменным значения происходит во время выполнения программы. Genius сам во время трансляции заботится о резервировании памяти под переменные.

F.e.:

#DUE state=1 => 1->(state)

#DSE x=y=0 => 0->(x) 0->(y)

#DSE y=(z=x*x)+x-20 => (x)*(x)->(z)+(x)-20->(y) где x, y и z - переменные, а (x),(y) и (z) - значения ячеек памяти, соответствующих этим переменным.

Массивы

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

F.e.: xcoord: #DS INT, 10 определяет место для 10 целых (20 байтов). Первое целое - переменная с именем xcoord, доступ к остальным осуществляется следующим образом:

xcoord [<компилируемое выражение>] где <компилируемое выражение> может принимать значения от 0 до 9, что соответствует с xcoord[0] (или xcoord) по xcoord[9].

F.e.: (присвоение значения) #DSE xcoord[2] = 100

Определение переменных

Команда определения переменной без инициализации: <label>:#DS <тип>,<ассемблируемое выражение> где: <label> - имя определяемой переменной; <тип> - тип переменной; INT - целый CHAR - символьный PINT - поинтер целой PCHAR - поинтер символьной <ассемблируемое выражение> - значение является количеством переменных типа <тип>. Команда определения переменной с инициализацией: <label>:#DI <тип>, <список ассемблируемых выражений> Здесь переменных типа <тип> будет столько, сколько указано элементов в <список ассемблируемых выражений>, причем каждой переменной будет присваиваться значение соответствующего элемента списка.

Функции

В Phoenix-е возможно определение функций так, как это происходит в языках высокого уровня. Обращение к функции <имя> имеет вид:

<имя> (<список параметров>) - если есть параметры <имя> () - если нет параметров.

Определение

<label>:#FNC <тип> - объявляет тип функции <label>, выполняемые операции этой функции должны находиться между #BEGIN и #END.

<label>:#PRM <тип> - объявляет параметр <label> типа <тип>. Количество объявлений #PRM должно совпадать с количеством элементов в списке вызывающей команды. Так же должен совпадать порядок следования. Параметров может быть до 60. #PRM должны находиться после #FNC и до #BEGIN.

#BEGIN - начало выполняемых команд функции. #END - конец выполняемых команд функции и возврат.

#RETURN - возврат из функции. (Перед #END не ставится).

F.e.: функция sumsq (x,y)=x*x+y*y - сумма квадратов. sumsq : #FNC INT

x : #PRM INT

y : #PRM INT

#BEGIN

#DUE x*x + y*y

#END

#DUE z= sumsq (3,4)

Вернет в HL значение 25.

ВНИМАНИЕ: Совместимость Phoenix-а с ассемблером достигается за счёт работы со стеком. НО результаты вычислений посылаются в регистровую пару HL (в т.ч. при вызове пользовательских функций). Об этом ниже, в "Компиляции выражений".

Принтерные переменные

Поинтер - адрес записанной в памяти переменной. Адрес переменной находится добавлением префикса "&" к имени переменной. Доступ к данным, на которые указывает поинтер происходит с использованием оператора "*". F.e.:

begin :#DI CHAR. "There was no possibility of..."

; определили и инициировали строку rewrite :#DS CHAR, 80

; зарезервировали место

p_str :#DS PCHAR, 1

p_spc :#DS PCHAR, 1

; определили поинтерные переменные ; далее p_str будет указывать на begin, а ; а p_spc будет указывать на rewrite.

#DUE p_str = &begin #DUE p_spc = &rewrite

; присвоили поинтерам указатели на начала строк ;

; А теперь пример работы ;

#WHILE * p_srt !=0

#DUE * p_spc = * p_str #DUE p_spc = p_spc + 1

#DUE p_str = p_str + 1

#ENDW

#DUE * p_spc = 0

; копия строки begin в rewrite

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

Компиляция выражений

Покажем на примере:

x :#DS INT, 1

x :#DS INT, 1

#DUE x = y = 0 => LD HL, 0

LD (<Addr, x>), HL LD (<Addr, y>), HL

#DUE x + y => LD HL, (<Addr, x>)

PUSH HL

LD HL, (<Addr, y>) PUSH HL

CALL <Genius Library> POP HL

Арифметические процедуры могут диагностировать некоторые ошибки, используя для отображения информации об ошибке ячейку памяти, резервируемую командой #STACK (см. ниже). Эта ячейка находится по адресу (IX-1). В случае ошибки в этой ячейке устанавливаются соответствующие биты:

- переполнение bit 0 (соответствует С флагу Z80)

- деление на 0 bit 2 (соответствует P/V флагу Z80)

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

Условный оператор

#IF <компилируемое выражение> - Помечает начало кодов, которые необходимо выполнить в случае, если <компилируемое выражение> ИСТИНА (и не ноль). Выполнение происходит до #ELSE. В противном случае от #ELSE до #ENDIF. Далее выполнение продолжается после #ENDIF.

F.e.: (функция возвращает максимальное значение)

max

: #FNC

INT

x

: #PRM

INT

y

: #PRM

INT

#BEGIN

#IF

x > y

#DSE

x

#ELSE

#DSE

y

#ENDIF

#END

Циклы

С пред-условием:

#WHILE <компилируемое выражение> - начало цикла. Выполнение продолжается пока <компилируемое выражение> истинно (не ноль). #ENDW - конец цикла.

С пост-условием: #REPEAT - начало цикла.

#UNTIL <компилируемое выражение> - конец цикла. Выполнение продолжается пока <компилируемое выражение> ложно (ноль).

Управление стеком

#STACK <ассемблируемое выражение> - псевдооперация генерирует коды, устанавливающие IX значением SP. Можно также задать новый указатель стека, он будет равен Ассемблируемое выражение>. (LD SP, word) Эта команда необходима для определения стека Phoenix-а, самое лучшее место для ее размещения - начало ассемблируемого текста (первый выполняемый оператор).

Замечание: Эта операция генерирует DEC SP для резервирования байта, используемого как флаговое пространство Phoenix-а, поэтому возврат из процедуры должен выглядеть так: LD SP,IX или INC SP

RET RET

Псевдооперация #LIB.

#LIB - должна быть размещена в конце ассемблерного текста. Перемещает Genius Arithmetic Library в конец выполняемого кода, т.е. создает законченный продукт. Genius Arithmetic Library - библиотека арифметических операций для Phoenix-а.

5. ОПЕРАЦИИ (ЛОГИКА И АРИФМЕТИКА).

Унарные операции (префиксы):

- минус

! логическое НЕ

л побитное инвертирование

* поинтерная ссылка & адрес переменной

++ инкрементирует переменную и возвращает новое значение

-- декрементирует переменную и возвращает новое значение Бинарные операции:

+ сложение

- вычитание

* умножение / деление

% остаток Сдвиги: (x << n - x влево на n)

<< сдвиг влево

>> сдвиг вправо

@< сдвиг циклический влево

@> сдвиг циклический вправо Сравнение: (Устанавливает 1 или 0)

> больше

< меньше

>= больше либо равно

<= меньше либо равно

Логические операции: && логическое И || логическое ИЛИ Побитные логические операции: & побитное И | побитное ИЛИ

л побитное ИСКЛЮЧАЮЩЕЕ ИЛИ Операции суффиксы:

++ инкрементирует переменную и возвращает старое значение -- декрементирует переменную и возвращает старое значение.

6. КЛАВИАТУРА.

CS+7 -

курсор вверх

CS+6 -

курсор вниз

CS+5 -

курсор влево

CS+8 -

курсор вправо

CS+4 -

табулятор назад

SS+E -

табулятор вперед

SS+0 -

стереть символ под курсором

CS+0 -

забой

CS+3 -

стирание предложения

SS+F -

стирание до конца предложения

CS+1 -

режим вставки/замены

SS+I -

вставка предложения

SS+W -

вставка одного пробела

SS+G -

очистка экрана

CS+2 -

смена регистра

SS+Y -

м [м

SS+U -

SS+S -

м |"

SS+D -

SS+A -

ESC клавиша

Часть 2: Монитор-отладчик.

1. РАЗМЕЩЕНИЕ МОНИТОРА В ПАМЯТИ (НИЖНЯЯ И ВЕРХНЯЯ ВЕРСИИ).

начало конец конец вход в вход в

анализатора монитора монитор анал/монит

Нижняя: 25000 40589 37924 25000 25003

Верхняя: 49946 52610 65535 52611 52614

2. КОМАНДЫ МОНИТОРА.

<рег8>=<байт> - запись байта <байт> в регистр <рег8>, где <рег8> может быть: F, A, B, C, D, E, H или L.

<рег16>=<слово> - запись слова <слово> в регистровую пару <рег16>, где <рег16> может быть: AF, BC, DE, HL, IX, IY, PC или SP.

EXX - выполняет эквивалент команды Z80 "EXX" для копии значений регистров на экране, происходит обмен BC, DE, HL на альтернативные BC', DE', HL' (только на экране - без физического обмена).

EX AF - то же, что и EXX, но по команде Z80 "EX AF, AF'".

MEM = <адрес> - устанавливает указатель памяти монитора на адрес <адрес> и обновляет дамп памяти на экране.

DATA <список байтов>.<список байтов> - размещает в памяти байты <список байтов> начиная с адреса MEM.

EXIT - выход из монитора в BASIC. Уничтожает всю пользовательскую информацию в т.ч. программы анализатора.

FILL <нач.адр>,<кон.адр>,<байт> - заполняет область памяти от <нач.адр> до <кон.адр> байтом <байт>.

DUMP [<нач. адр>,<кон. адр>] - выводит на полный экран дамп памяти от <нач.адр> до <кон.адр>.

LDUMP [<нач. адр>,<кон. адр>] - то же, но на принтер.

MOVE <нач. адр1>,<кон. адр1>,<нач. адр2> - переслать блок памяти от <нач.адр1> до <кон.адр2> в область памяти начиная с <нач.адр2>.

CHECK <нач. адр1>,<кон. адр1>,<нач. адр2> - сравнить блок памяти от <нач.адр1> до <кон.адр2> и область памяти начиная с <нач.адр2>.

SEARCH <нач. адр>,<кон. адр>,<список байтов> - найти байты <список байтов> в области памяти от <нач.адр> до <кон.адр>.

NEXT - продолжить поиск после обнаружения искомых байтов.

JUMP [<адрес>] - выполнение инструкций Z80 с нормальной скоростью, начиная с адреса <адрес>. Если <адрес> отсутствует, то с адреса, находящегося в PC. Замечание: Единственная возможность вернуться из такого выполнения в монитор - это точка прерывания (см. ниже). Т.к. эта команда аналог команды JMP процессора Z80.

? <слово> - распечатывает значение <слово> в различных системах исчисления.

PUSH <слово> - значение <слово> кладется в стек и SP декрементируется на 2 (нормальная эмуляция команды PUSH процессора Z80).

POP <слово> - значение SP инкрементируется на 2 как в команде POP процессора Z80.

OPTION <номер опции>,<флаг> - позволяет включить/выключить (используя <флаг> ON - включить; OFF - выключить).

Список опций:

1. OFF - шестнадцатиричные числа. ON - десятичные; в дизассемблировании и некоторых операциях при выводе.

2. Если OFF, то в случае вывода на принтер выводимая информация отображается на

экране.

3. ON - во время третьего прохода дизассемблирования командой FLIST генерируемый файл параллельно выводится на экран. OFF - выводятся только текущие адреса.

4. OFF - во время медленного или пошагового выполнения программ если происходит обращение JMP или CALL в область ROM, то ROM процедура будет выполняться с нормальной скоростью.

5. OFF - при выполнении команды FLIST генерируется файл, содержащий метки, что позволяет переассемблировать его. ON - файл содержит адреса.

6. OFF - очищает экран при командах JUMP, CALL и SLOW. ON - выполнение начинается с экраном монитора.

7. вывод на принтер: OFF - ZXPrinter. ON - Kempston Centronics Interface.

8. OFF - на принтер посылается перевод строки с каждым возвратом каретки. ON - только возврат каретки.

CAT - каталог микродрайва.

ERA "<имя>" - удаление файла с именем "<имя>".

DI - запрещение прерываний.

EI - разрешение прерываний.

ROM <флаг> - работа с теневой ROM Interface 1. Если <флаг> = ON то разрешен режим работы с процедурами теневой ROM т.е. обращение к ROM от адреса #0008 до #1708 заменяется обращением к теневой ROM.

MAP - информация об использовании памяти.

MDRV [<номер>] - переключает ввод/вывод на микродрайв с номером <номер>.

TAPE - переключает ввод/вывод на ленту.

LOAD "<имя>",[<адрес>] - загружает файл "<имя>" с адреса <адрес>, если адрес отсутствует, файл загружается с адреса MEM.

SAVE "<имя>",<нач. адр>,<кон. адр> - запись файла "<имя>" байтами памяти с адреса <нач. адр> по <кон.адр>.

SCRN - отобразить виртуальный экран (возврат при нажатии любой клавиши).

SCRN <флаг> - разрешить/запретить виртуальный экран. <флаг> = ON / OFF (1/0).

SCRN = <адрес> - базовый адрес для сохранения виртуального экрана в памяти. (длина 6912 байт).

Замечание: Отображение всей информации, выводимой пользовательской (отлаживаемой) программой во время SLOW, CALL, JUMP осуществляется на экран, который сохраняется при возврате в монитор (при точке прерывания (для всех трех), ESC (для SLOW) или RET (для CALL)) в определенной Вами области памяти и может вызываться командой SCRN. Пошаговое выполнение также обновляет виртуальный экран.

DISS [<нач.адр>,[<кон.адр>]] - дизассемблер, выводящий листинг в левую верхнюю область экрана. Дизассемблирование происходит с адреса <нач.адр> до <кон.адр>.

LIST [<нач. адр>,[<кон. адр>]] - то же, но листинг дизассемблера выводится на весь

экран.

LLIST [<нач. адр>,[<кон. адр>]] - то же, но листинг дизассемблера выводится на

принтер.

DB [<db номер>,[<нач. адр>,<кон. адр>]] - позволяет определить при дизассемблировании области байтов (псевдооперация DB для ассемблера). Можно определить 8 областей - на номер области указывает <db номер>. Область начинается с <нач.адр> по <кон.адр>. Если аргументы отсутствуют, в DB область переводится весь процесс дизассемблирования.

FLIST "<имя>",<нач.адр>,<кон.адр> - то же, что и LIST, но вывод происходит в файл с именем "<имя>", вывод зависит от опций 3, 5. Дизассемблирование происходит в три прохода и нуждается в резервировании памяти.

WORK = <нач. адр>,<кон. адр> - резервирование области памяти для FLIST от <нач. адр> до <кон.адр>. Эта память используется также для SLOW/TRACE.

WIDTH = <слово> - ширина страницы принтера.

LENGTH = <слово> - длина страницы принтера.

3. КОМАНДЫ ОТЛАДКИ.

Пошаговое выполнение

Нажатие следующих клавиш позволяет производить пошаговое выполнение программ в памяти Spectrum-а:

CS & "6" - инкрементация PC. CS & "7" - декрементация PC.

SS & "G" - переход к следующей инструкции без выполнения текущей, значение PC устанавливается на адрес следующей инструкции.

SS & "D" - переход к следующей инструкции с выполнением текущей, значение PC устанавливается на адрес следующей инструкции.

SS & "F" - то же, но не происходит заход в подпрограммы по командам CALL и RST. Эти подпрограммы выполняются с обычной скоростью микропроцессора Z80.

Замечание: Если процедура нуждается в параметрах, передаваемых через область кодов. F.e.: как RST8 или так: CALL SUBROUTINE

DB PARI, PAR2 ,..., PARN

необходимо переключить опцию 4 в состояние ON для избежания ошибок при отладке.

Медленное выполнение

SLOW <режим> - запускает программу на медленное выполнение с адреса, хранящегося в

PC.

Список режимов:

0 - экран не обновляется после каждой инструкции;

1 - обновляется только дамп памяти;

2 - обновляется только дисплей регистров;

3 - 1 и 2 вместе;

Режимы 4-7 повторяют режимы 0-3, но 0-3 - для SS & "D"; 4-7 - для SS & "F";

Остановка медленного выполнения происходит по нажатии ESC или при совпадении PC с точкой прерывания.

TRACE [<количество инструкций>] - во время медленного выполнения значения PC при выполнении каждой инструкции заносится в память, определенную командой WORK. В память должно занестись <количество инструкций> адресов, или столько, сколько позволяет зарезервированная память.

LTRACE [<количество инструкций>] - то же, но на принтер. Точки прерываний

Здесь и ниже <тип> это тип точки прерывания, список типов:

0 - продолжать в медленном режиме 0.

1 - продолжать в медленном режиме 1.

2 - продолжать в медленном режиме 2.

3 - продолжать в медленном режиме 3.

4 - продолжать в медленном режиме 4.

5 - продолжать в медленном режиме 5.

6 - продолжать в медленном режиме 6.

7 - продолжать в медленном режиме 7.

8 - декрементировать счётчик, стоп если ноль, иначе продолжение в медленном режиме 0.

9 - декрементировать счётчик, стоп если ноль, иначе продолжение в медленном режиме 1.

10 - декрементировать счётчик, стоп если ноль, иначе продолжение в медленном режиме 2.

11 - декрементировать счётчик, стоп если ноль, иначе продолжение в медленном режиме 3.

12 - декрементировать счётчик, стоп если ноль, иначе продолжение в медленном режиме 4.

13 - декрементировать счётчик, стоп если ноль, иначе продолжение в медленном режиме 5.

14 - декрементировать счётчик, стоп если ноль, иначе продолжение в медленном режиме 6.

15 - декрементировать счётчик, стоп если ноль, иначе продолжение в медленном режиме 7.

16 - продолжать в быстром режиме.

Все эти типы являются типами особых точек прерывания, в общем простая точка прерывания вызывает остановку выполнения и возврат в монитор.

Команды работы с точками прерываний

BREAK <номер>,<флаг>,<адрес> - определяет точку прерывания с номером <номер> по адресу <адрес> в состоянии <флаг>, где <флаг> показывает запрещена эта точка или разрешена (ON/OFF).

DEFBRK <номер>,<тип>,<адрес>,[<счётчик>] - определяет особую точку прерывания с номером <номер> по адресу <адрес> типа <тип>. После определения в состоянии ON. <счётчик> используется в типах 8-15.

BRK <номер>,<флаг> - устанавливает состояние точки прерывания <номер> в ON или

OFF.

DELETE <номер> - уничтожает точку прерывания <номер>. LBRK - выводит список точек прерывания.

4. АНАЛИЗАТОР.

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

Для начала работы с анализатором необходимо определить его рабочую область командой:

PROG = <нач.адр>, <кон.адр> (объем не менее 250 байтов).

Для выполнения Forth-овских операций используется команда EVAL

F.e.: (занесение двух чисел в стек (не программный стек Z80, а именно стек языка Forth))

EVAL 2 3 (и ENTER), тогда на экране появится:

STATE OF STACK: #3 #2

ENTER COMMAND

Команды анализатора PROG = <нач. адр>,<кон. адр> - смотри выше.

CLEAR - стирает программное пространство, определенное командой PROG и все определенные слова.

ANALYSER<флаг> - если <флаг> = OFF не происходит проверка во время медленного выполнения.

WORD <имя слова><определение>

$ <имя слова><определение>

- определение слова <имя слова> как выполняемой последовательности <определение>.

Замечание: <имя слова>,имеющее вид STOP#, где # - число от 0 до 9 F.e.: STOP1

обязывает анализатор во время медленного выполнения после выполнения каждой инструкции выполнять слова STOP#. Слова STOP# должны оставлять в стеке флаг, по которому в случае, если флаг ноль медленное выполнение продолжается, иначе прекращается. EVAL <определение> - вычисление определения. LDEF - список определенных слов на экран. PDEF - то же на принтер.

DEFSAVE" <имя>" - запись определенных слов в файл "<имя>". DEFLOAD "<имя>" -загрузка ранее определенных слов.

EDIT <имя слова> - редактирование слова.

Зарезервированные Forth-ом слова

Слово

Действие

Стек

AF, BC, DE, HL, IX,

Помещает значение регистровой пары в стек.

> n1

IY, SP, PC

A, B, C, D, E, H, L, F

Значение регистра в стек

> n1

CF, PVF, NF,

Значение флага в стек

>f1

HF, ZF, SF

Где: CF перенос

PVF четность/переполнение

NF сложение/вычитание

HF полуперенос

ZF ноль

SF знак

I

Расположение значения флага на стеке:

> n1

0 - для сброса

1 - для установки

ADDR

Значение последнего адреса доступа к памяти в

> n1

стек. Если инструкция не пишет или не читает

память устанавливает 0 на стек (в т.ч. для блоковых

пересылок, сравнений, ввода/вывода и при стековых

операциях).

RD

Признак доступа-чтения в стек

> f1

WR

Признак доступа-записи в стек

> f1

ACF

Признак доступа-просто в стек

> f1

Эти три команды устанавливают в стеке флаг = 1 если был доступ к памяти нужного

режима. Замечание: ACF, RD и WR сбрасывают на начало медленное выполнение.

+ - */ 5 5 5'

Арифметика

n1 n2 > n3

AND, OR, XOR

Логика побитовая

n1 n2 > n3

NOT

n1 > n2

=

n1 равно n2 ?

n1 n2 > f1

> < 5

Стандартное сравнение

n1 n2 > f1

>=, <=, <> 5 5

n1 и n2

0=

n1 равно 0 ?

n1 > f1

0>

n1 не равно 0 ?

n1 > f1

&

Логическое И

f1 f2 > f3

?SCR1

Обновление дампа памяти если флаг на вершине

f1 >

стека истина

?SCR2

то же для регистров

f1 >

!

Запись слова n1 по адресу n2

n1 n2 >

C!

то же, но запись байта

n1 n2 >

MEM

Значение мониторовского MEM в стек.

> n1

MEM!

Установка MEM из стека

n1 >

?PAUSE

Для истинного флага анализатор ждет нажатия

f1 >

клавиши

IF

Если флаг на вершине стека ложь, то интерпретация

f1 >

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

C@

Выдать байт, на который указывает адрес на

n1 > n2

вершине стека(т.е. (n1) -> n2)

@

то же, но для слова

n1 > n2

BIT

Текст бита n2 в байте/слове

n1 n1 n2 > f1

DUP

Дупликация вершины

n1 > n1 n1

SWAP

Обмен

n1 n2 > n2 n1

OVER

Второй через первый

n1 n2 > n1 n2 n1

ROT

Ротация вершины

n1 n2 n3 > n2 n3 n1

ON

> 1

OFF

> 0

DROP

Скидывание вершины

n1 >

NOP

Как NOP для Z80

>

KEY

Значение последней нажатой клавиши

> n1

CALL

Вызов процедуры по адресу n1

n1 >

Похожа на CALL для Z80, но как параметры в

процедуру передается:

HL: Адрес процедуры анализатора выталкивающей

вершину Forth- стека в регистровую пару BC.

DE: то же, но процедура кладет BC на вершину

стека.

IX: Адрес таблицы регистров:

IX + 0 SP

IX + 2 IX

IX + 4 IY

IX + 6 PC

IX + 8 BC

IX + 10 DE

IX + 12 HL

IX + 14 байт флагов F

IX + 15 A

IX + 16 BC'

IX + 18 DE'

IX + 20 HL'

IX + 22 байт флагов F'

IX + 23 A'

Полезные определения (заодно примеры)

$RANCE: ROT SWAP OVER >= ROT ROT <= & RANCE - проверка входит ли n1 в диапазон n1 n2 n3 > f1 от n2 до n3 ?

$MEMWR: ADDR >= SWAP OVER ADDR <= & WR & MEMWR - защита области памяти от n1 до n2 n1 n2 > от записи. пример использования:

$STOP9: #8000 #8FFF MEMWR #0 #1FF MEMWR OR защищает от записи области #8000 - #8FFF и #0 - #1FF.

$LXOR: 0 > SWAP 0 > XOR LXOR - логическое исключающее ИЛИ f1 f2 > f3

SIGN:

Ещё одно полезное определение

Печать значения с вершины стека в шестнадцатиричном виде. Часть на ассемблере (ручное кодирование или ассемблирование на Genius ассемблере).

TETRA:

ORG

#ABE0

CALL

DROPBC

LD

A, 22

RST

#10

XOR

A

RST

#10

RST

#10

LD

A, B

CALL

SIGN

LD

A, C

PUSH

AF

RLCA

RLCA

RLCA

RLCA

CALL

TETRA

POP

AF

AND

#0F

ADD

A,#90

DAA

ADC

A,#40

DAA

RST

10H

RET

JP

(HL)

DROPBC:

; Для правильной работы убедитесь, ; что перед запуском IY = #5C3A

Часть на Forth-е $PRINT: #ABE0 CALL

PRINT Печать вершины стека n1 n1 >

ЗАПОМНИТЕ: Команды анализатора могут выполняться ТОЛЬКО при медленном выполнении для использования слов STOP#.

Edit by -=LV=- St-Petersburg




СОДЕРЖАНИЕ:


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

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



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

Похожие статьи:
Message - Обращение ко всему Speccy-народу г. Коврова.
Dreamzzz - Солнце.
Обзор - и вновь разговор о новосибирской версии игры "ELITE-3".
News - In September, Nikolay Grivin came to my job, and I started to teach him assembler.
Игроскоп - О играх: Звёздное Наследие.

В этот день...   21 ноября