[an error occurred while processing this directive]

.цв

9. РАБОТА С ОТЛАДЧИКОМ.

.ов

9.1. Введение.

Отладчик предназначается, в первую очередь, для отладки или адаптации программ в машинном коде. Кроме этого, он может пригодиться для написания маленьких (до трех десятков команд) кодовых программ. Отдельные функции Отладчика (кроме упомянутых ранее, это 'V', 'M', ':' и некоторые другие) могут пригодиться для других целей, например, для просмотра и сравнения файлов, заполнения области памяти, изменения экранной палитры или просмотра графического экрана. Отладчик непосредственно доступен (как и файловая система) из диалога системы и не требует специальной команды для вызова.

В общем случае синтаксис команд Отладчика не отличается от команд системного монитора. Имя команды также чаще всего записывается после операндов, число которых также может быть от одного до трех, а для разделения операндов используются символы '<' и '.'. Но есть и отличия или, лучше сказать, расширения. При вводе данные можно представлять не только в шестнадцатеричном, но и в двоичном и символьном виде. Перед двоичным числом следует ввести символ '*', а перед символом - апостроф ('). В одной командной строке может находиться несколько команд Отладчика. Это относится к большинству командам, кроме ':' и других, осуществляющих ввод в память. Если в строке содержится символ ';', то все следующие за ним до конца строки символы игнорируются. Все остальные отличия касаются более широкого набора команд, который мы рассмотрим ниже.

9.2. Полный набор команд Отладчика.

Полностью список команд и краткую расшифровку их действий можно увидеть в таблице на следуюшей странице. Далее мы более детально рассмотрим каждую команду. Краткая сводка команд приводится также в Приложении.

Существуют две функции Отладчика, для выполнения которых не требуется ввода какой-либо команды. Это просмотр содержимого ячейки и области памяти. Первая функция вызывается набором нужного адреса и нажатием '↵', вторая набором адреса начала и конца области через '.' и также заканчивается нажатием '↵'.

.сс

===========================================================
             Список команд Отладчика.
===========================================================
 1. ':' - Ввод данных в память.
 2. 'P' - Выдать содержимое регистров.
 3. 'R' - Считать группу секторов с диска.
 4. 'W' - Записать группу секторов на диск.
 5. '/' - Команда входа в микроассемблер.
 6. ',' - Ассемблирование оператора.
 7. '!' - Логическая операция ИЛИ.
 8. '&' - Логическая операция И.
 9. '%' - Логическая операция ИСКЛЮЧАЮЩЕЕ ИЛИ.
10. '-' - Операция вычитания.
11. '+' - Операция сложения.
12. 'V' - Сравнить области памяти.
13. 'M' - Пересылка области памяти.
14. 'G' - Запуск программы, находящейся в памяти.
15. 'S' - Найти группу байт.
16. 'H' - Определение поискового критерия.
17. 'J' - Определение масок поискового критерия.
18. 'L' - Дизассемблирование содержимого памяти.
19. 'N' - Определение смещения адреса дизассемблирования.
20. 'X' - Вывод содержимого памяти в символьном виде.
21. 'Y' - Вывод в виде дампа.
22. '@' - Вывод в двоичном виде.
23. '?' - Вывод в текстовом виде.
24. '^' - Флаг оконного вывода.
25. '\' - "Отражение" байтов области памяти.
26. '¤' - Смена текущей экранной страницы.
===========================================================

С помощью команды ':' можно ввести в память любую последовательность байт. Для этого задается начальный адрес последовательности, ':' и далее вводятся байты, разделяемые 'ПРОБЕЛом'. Если адрес не вводить, то последовательность продолжится с текущего адреса, получившегося после использования последней команды ':'.

Команда 'P' выдает на экран адрес последнего останова по кооманде 'BRK' и содержимое всех регистров процессора при останове. Все регистры выводятся в шестнадцатеричном виде, регистр признаков дополнительно выводится еще и по флагам, причем заглавная буква флага означает его единичное (установленное) состояние, строчная - нулевое (сброшенное).

После выполнения команды адресный счетчик функции ':' устанавливается на ячейки, хранящие выведенную информацию. Поэтому возможен ввод желаемых значений регистров командой типа ': 1 2 3 ...' в том порядке, в котором регистры были выведены на экран.

Аналогичным свойством обладает команда 'Q' файловой системы: после ее исполнения можно изменить параметры загруженных файлов, воспользовавшись командой ':' без указания адреса.

Команды 'R' и 'W' производят чтение или запись (соответственно) интервала блоков с диска в память (и наоборот). Их формат следующий: 'addr1<addr2.addr3R' (аналогично для 'W'), где addr1 - адрес в памяти, addr2 и addr3 - трек-секторные адреса начала и конца области на диске.

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

Чтобы войти в микроассемблер, надо ввести адрес и символ '/', после чего нажать '↵'. Если адрес не вводить, то будет использоваться тот адрес, который был текущим перед последним выходом из микроассемблера. Вход в микроассемблер сопровождается выдачей на экран текущего адреса и двоеточия, после которого будет стоять курсор, приглашающий Вас ввести команду процессора. Команды вводятся в стандартном формате процессора 6502, с небольшими исключениями. При вводе операндов не надо вводить знак '¤', они сразу подразумеваются шестнадцатеричными (при вводе констант можно вводить двоичные и символьные операнды, используя '*' и апостроф), а также нельзя в командах сдвига аккумулятора ставить операнд 'A'. Этот операнд воспримется микроассемблером как адрес ячейки с адресом 000A. Заканчивается ввод каждой команды нажатием клавиши '↵', после чего предлагается ввести еще одну команду. Чтобы выйти из микроассемблера в диалог с отладчиком, надо нажать клавишу '↵' сразу после приглашения. Если во введенной строке обнаружатся какие-либо ошибки, то будет выдан звуковой сигнал, и повторится приглашение ко вводу этой же команды.

Используя команду ',', можно проассемблировать (по правилам микроассемблера) одну команду, не входя в диалог с микроассемблером. Мнемоническое представление команды процессора записывается сразу после ','. В одной строке можно разместить несколько таких команд, разделяемых самой ','. Если в команде обнаружится ошибка, управление будет передано диалоговому микроассемблеру.

Команды '!', '%', '+', '-' и '&' выполняют арифметические операции ('+', '-') на двубайтовыми и логические ('!', '%', '&') над байтовами операндами. Первый операнд пешется перед командой, второй - сразу после нее. Отметим, что операнды не могут быть представлены в текстовом или двоичном виде.

Команда 'V' позволяет сравнить две области памяти. Ее формат таков: 'addr1<addr2.addr3V', где addr1 - начальный адрес первой из сравниваемых областей, addr2 - начальный адрес второй сравниваемой области, addr3 - конечный адрес второй сравниваемой области.

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

Команда 'M' предназначена для пересылки области памяти. Чтобы выполнить пересылку, требуется указать начальный адрес области назначения (addr1), начальный адрес пересылаемой области (addr2), конечный адрес пересылаемой области (addr3): 'addr1<addr2.addr3M'.

С помощью этой же команды можно заполнить какую-либо область одним байтом. Например если требуется заполнить область 4000-5FFF байтом 00, то нужно сначала записать байт 00 по адресу 4000 и произвести следующую операцию: '4001<4000.5FFEM'. Обратите внимание не то, что конечный адрес указан на единицу меньше, чем требуется. Это не ошибка. Для точного заполнения области нужно всегда указывать конечный адрес на единицу меньше требуемого.

Команда 'G' производит запуск программы, находящейся в памяти, с адреса, указанного перед командой. Если не указать адрес, то произойдет запуск с адреса, по которому была выполнена последняя команда BRK. При запуске программы регистры процессора заполняются данными, которые можно просмотреть и изменить, используя команду 'P'.

Команда 'S' производит поиск группы байт, предварительно определенных командами 'H' и 'J', начиная с адреса, указанного перед командой. Если адрес не указан, то поиск продолжается с текущего адреса. Каждый байт памяти перед сравнением с байтом, определенным командой 'H', предварительно обрабатывается логической операцией 'И' с соответствующей маской, определенной командой 'J'. В случае совпадения всей определенной последовательности будет выдано 16 строк дизассемблированного кода. Первый байт найденной последовательности будет выделен красным цветом, после чего поиск автоматически продолжается. Чтобы прервать поиск, надо нажать клавишу 'F1'.

С помощью команд 'H' и 'J' можно задать поисковый критерий для использования команды поиска 'S'. 'H' задает константы сравнения, 'J' - маски для обработки сравниваемых байтов. Если не задано ни одного байта команды 'J', то обработка по маске производиться не будет. Формат команд аналогичен формату ':', только без задания адреса. Если используются маски, то их количество должно быть равно количеству констант сравнения, в противном случае возможны реакции на ошибочные вхождения. При использовании команды 'H' без операнда на экран будет выдан текущий поисковый критерий. Текущий поисковый критерий сохраняется на диске командой '[STATUS'.

Команда 'L' позволяет дизассемблировать объектный код, находящийся в памяти. Для ее вызова требуется ввести адрес, с которого начнется дизассмблирование и 'L', если адрес не указать, то дизассемблирование продолжится с текущего адреса. Выдаваемый на экран листинг состоит из трех полей, каждое из которых для удобства имеет свой цвет. Первое (желтое) поле содержит текущий адрес и объектный код дизассемблируемой команды, второе (голубое) - этот же объектный код, представленный в символьном виде, третье (зеленое) - мнемоническое представление команды процессора. В случае, если дизассемблируемый код не соответствует ни одной команде, вместо мнемоники будут выведены три знака вопроса '???'. После команд 'JMP', 'JMP ()', 'RTS' и 'RTI' выдается пустая срока, что несколько структурирует выводимый листинг. Прервать выдачу можно нажатием клавиши 'F1'.

Команда 'N' даст Вам возможность производить дизассемблирование со смещением относительно физических адресов. Это смещение задается для старшего байта адреса и указывается перед командой. При выполненении дизассемблирования к старшей цифре зависящих от физического расположения программы адресов будет прибавляться указанная в команде 'N' цифра. Например, если Ваша программа располагается в памяти с адреса 2000, а Вам нужно дизассемблировать ее с адреса 0000, то Вы должны ввести команду 'E0N'.

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

Команда 'Y' выводит на экран содержимое памяти в специальном формате - одновременно шестнадцатеричные байты и соответствующие им символы. В таком виде выдает распечатку редактор памяти, и во многих случаях он представляется очень удобным. Листинг выводится начиная с адреса, указанного перед командой, или с текущего, на котором предыдущий вывод был закончен. Прекращается выдача нажатием любой клавиши. Команда 'Y' работает только в режиме экрана 64*32.

Команда '@' выводит на экран содержимое памяти в двоичном виде. В поле операнда команды указывается адрес, с которого начинается вывод, и, через точку, сколько байт выводить на одной строке. При выводе в одну строку нескольких двоичных чисел, каждое из них будет отделяться от другого пробелом. Вывод прекращается после нажатия любой клавиши.

Команда '?' распечатывает участок памяти в текстовом виде от адреса, указанного перед ней, до нажатия на 'F1'. Формат вывода аналогичен формату команды '[TYPE' файловой системы.

Флаг оконного вывода '^' может понадобиться при выполнении команд, выводящих на экран много информации. Если в начале строки употребить знак '^', а уже затем команду, то вывод информации будет приостанавливаться после вывода одной экранной страницы, и возобновляться при нажатии любой клавиши. Эта команда следит за размером экранного окна, и в случае его уменьшения будет учитывать этот новый размер.

Команда '\' делает так называемое "отражение" байт, т.е. перевертывает байт, делая его 0-й бит 7-м, 1-й бит 6-м, 2-й бит 5-м и т.д. (получая как бы его зеркальное отражение). Эта операция оказывается полезной при переработке программ для ПЭВМ Apple ][, использующих графику. В команде надо задать границы области памяти, байты которой требуется перевернуть. Адрес начала (addr1) и адрес конца (addr2) задаются через точку перед командой: 'addr1.addr2\'. На Агате-9 команда практичски не нужна, ибо переработкой графики в программах для Apple ][ приходится заниматься крайне редко.

С помощью команды '¤' можно сменить текущую экранную страницу. Перед командой задается старший байт адреса страницы, например после выполнения команды 'B8¤' весь диалог системы будет производиться через страницу, начинающуюся с B800. (Вторая цифра должна быть равна 0 или 8, ибо только с такого адреса может начинаться страница.) Пользоваться командой надо с осторожностью, ибо не всякая программа будет штатно работать с переназначенным экраном. Текущая страница сохраняется в теле системы командой '[STATUS', однако заставка читается загрузчиком всегда на адрес 1000.

.сс

.стSYSTEM.DOC.6

[an error occurred while processing this directive]