Н Монитор MONS4
1. Запуск.
MONS4 поставляется в перемещаемой форме. Вы просто загру-
жаете его с желаемого адреса, и затем вызываете с этого же адреса.
Если необходимо запустить MONS4 вновь (вернувшись из MONS4 в
BASIC), то вы должны ввести адрес, с которого первоначально загру-
зили отладчик.
Пример:
Пусть вы хотите загрузить M0NS4 с адреса #СООО (49152
десятичный).
Для этого выполните следущие операции:
LOAD ""CODE 49152 <ENTER>
RANDOMIZE USR 49152 <ENTER>
Для повторного входа используйте:
RANDOMIZE USR 49152 <ENTER>
Монитор MONS4 занимает в ОЗУ приблизительно 6К. Однако
для загрузки MONS4 необходима непрерывная область 7К, т.к. после
основных кодов размещается таблица перемещаемых адресов.
MONS4 содержит собственный внешний стек, так что он явля-
ется самообслуживающейся программой.
MONS4 по умолчанию загружается с адреса 55000, хотя вы
можете загрузить его с любого приемлемого адреса. Обычно удобно
загружать MONS4 в верхние адреса памяти.
1.1. Получение копии.
Загрузив MONS4 в память вашего SPECTRUM"a, вы можете
сделать его копию, проделав следующие операции:
SAVE "MONS4"CODE ХХХХХ, 6656 <ENTER> - на кассету
SAVE *"М", 1, "MONS4"CODE ХХХХХ, 6656 <ENTER> - на
дискету
SAVE *"М", 1, ,,MONS4,,CODE ХХХХХ, 6780 <ENTER> - на
диск OPUS
Где ХХХХХ - адрес, с которого вы загрузили MONS4.
Заметьте, пожалуйста, что мы позволяем вам делать копии
MONS4 только для вашего пользования, так что вы можете програм-
мировать уверенно. Пожалуйста, не делайте копий MONS. Для пере-
дачи (или, что еще хуже, для продажи) вашим друзьям. Мы
поставляем программное обеспечение по разумным ценам с полной
послепродажной поддержкой. Покупайте, а не крадите!
Когда вы войдете в MONS4, вам представится изображение так
называемой фронтальной панели (в дальнейшем - Ф.П.). (См. при-
мечание с примером). Оно состоит из регистра Z Z80 флагов вместе с
их содержимым плюс 24-х байтовая секция памяти, сосредоточенная
вокруг указателя памяти, первоначально указывающего на нулевой
адрес. В верхней части экрана находится дизассемблированная инс-
трукция, на которую указывает указатель памяти. (В дальнейшем -
MP).
На входе MONS все адреса, отображаемые внутри Ф.П., пред-
ставлены в шестнадцатиричном формате. Вы можете изменить*это с
помощью команды:
<SYMBOL SHIFT> 3
и адреса будут представлены в десятичном формате (см. следу-
ющий раздел). Заметим, однако, что адреса всегда должны вводиться
в шестнадцатиричном формате. Команды вводятся с клавиатуры в
соответствии с подсказкой "" как с верхнего, так и с нижнего регист-
ров.
Некоторые команды, эффект от которых может быть гибельным
в случае их ошибочного использования, требуют нажатия клавиши
<SYMBOL SHIFT>. Это ручное нажатие клавиши <SYMBOL SHIFT>
будем представлять знаком " ", т.е. запись " Z" означает нажатие
<SYMBOL SHIFT> и "Z" вместе.
Команды выполняются немедленно и не требуют после себя
ввода <ENTER>. Неверные команды просто игнорируются.
Многие команды требуют ввода 16-ричного числа. При вводе
такого числа вы можете ввести любое количество 16-ричных цифр
(0...9 и A...F) и закончить ввод любым отличным от 16-ричного числа
символом. Если ограничителем является значащая команда, то эта
команда выполняется после того, как будет выполнена предыдущая.
Если ограничителем является знак "-", то введенное отрицательное
число будет возвращено в двойном дополнительном коде: "1800-"
дает "Е800". Если при вводе 16-ричного числа вы ввели более 4-х
цифр, то только 4 последние введенные цифры сохраняются и отобра-
жаются на экране.
Для возврата из MONS4 в BASIC просто нажмите (т.е. " А").
2. Команды MONS4.
В MONS4 используются нижеприведенные команды. В этом раз-
деле <ENTER> употребляется в качестве ограничителя 16-ричного
числа. Фактически это может быть любой не 16-ричный символ (см.
Раздел 1). Для обозначения пробела используется символ
1. <SYMBOL SHIFT> 3 или #
переключает систему счисления, в которой отображаются адре-
са, с 1 6-ричной на десятичную и обратно. На входе MONS4 все адреса
показываются в 16-ричном виде, для десятиричного отображения
используйте " 3" и вновь " 3" для возврата в 16-ричную форму. Это
влияет на все адреса, отображаемые MONS4, включая адреса, пол-
учаемые дизассемблером, но это не меняет отображения содержимо-
го памяти, которое всегда выдается в 16-ричном виде.
2. <SYMBOL SHIFT> 4 или $
отображает дизассемблированную страницу, начиная с адреса,
указанного MP. Полезно посмотреть и следующие инструкции. На-
жмите "4" вновь или <EDIT> для возврата к отображению Ф.П. Или
другую клавишу для получения следующей дизассемблированной
страницы.
3. <ENTER>
наращивает счетчик адресов на 1, так что 24-х байтовая область
памяти сдвигается на 1 байт вперед.
4. Стрелка вверх
уменьшает MP (указатель памяти) на 1.
5. Стрелка влево
уменьшает значение MP на 8. Используется для быстрого про-
смотра.
6. Стрелка вправо
увеличивает значение MP на 8. Используется для быстрого про-
смотра.
7. <,> (Запятая)
заменяет MP адресом, находящимся в стеке (SP). Это полезно,
когда вы хотите посмотреть адрес возврата вызванной подпрограммы.
8. <G>
поиск по образцу введенной строки. Сначала высвечивается
подсказка на ввод первого байта, который необходимо найти. За
байтом следует <ENTER>. Затем вводите следующий байт (и
<ENTER>) в ответ на до тех пор пока вы не определите всю строку
образа. После этого введите только <ENTER>, это ограничит строку
образа. Будет произведен поиск образа, начиная с текущего адреса до
первого появления введенной строки. Когда эта строка будет найде-
на, обновится Ф.П. Так, что Ф.П. Будет указывать на первый символ
строки.
Например:
Пусть необходимо исследовать память, начиная с адреса #80000
на появление образа #ЗЕ #FF (2 байта). Последовательность дейст-
вий должна быть следующей:
M:80000<ENTER> -устанавливает MP
G:3E<ENTER> -определяет 1-й байт строки
FF <ENTER> - определяет 2-й байт строки
<ENTER> -ограничивает строку
После последнего <ENTER> (или любого не 16-ричного симво-
ла) G начинает поиск с адреса #80000 первого появления #3 #FF.
Когда будет найдена строка, то обновится изображение на Ф.П. Для
поиска дальнейших появлений строки используйте команду N.
9. <Н>
Вам выводится подсказка ":" на ввод десятичного числа, ограни-
ченного не цифрой (любым символом, кроме 0.. . 9). Как только вы
введете число и ограничитель, в той же строке высветится знак "=" и
16-ричный эквивалент введенного десятичного числа. Теперь на-
жмите любую клавишу для возврата в командный режим.
Например:
Н:441472-=а200 - пробел использован как ограничитель
10. <1>
Используется для копирования блока памяти из одного места в
другое, причем блок памяти может быть скопирован в ячейки с пере-
крытием своего первоначального местоположения. <1> выдает под-
сказки на ввод стартового и конечного адресов блока, который
должен быть скопирован (<FIRST:>,<LAST:>) затем для адресов, по
которым он должен быть помещен (то:) введите в ответ на каждую
подсказку 16-ричные числа. Если стартовый адрес больше конечного,
то команда прерывается, в противном случае блок перемещается как
указано.
11.<J>
Выполняет задачу с определенного адреса. Эта команда выдает
подсказку для 16-ричного числа, после введения которого сбрасы-
вается внешний стек, экран очищается и выполнение перемещается
в область определенного адреса. Если вы желаете вернуться к Ф.П.
После выполнения, то установите точку останова (см. Команду W) в
месте, где вы желаете вернуться к отображению.
Например:
J:B0000 <ENTER> - выполняет программу с адреса #В0000
Вы можете прервать программу перед концом ввода адреса ис-
пользуя <EDIT>. Отметим, что выполнение команды <J> портит со-
держимое регистров Z80, поэтому программа в машинных кодах не
должна делать присвоений значений, содержащихся в регистрах.
Если вы желаете выполнять программу с регистрами, то нужно ис-
пользовать "К".
12. <SYMBOL SHIFT> К
Продолжает выполнение с адреса, находящегося в счетчике ин-
струкций. Эта команда, вероятнее всего, будет использоваться со-
вместно с командой W - пример пояснит это.
Скажем, вы в пошаговом режиме (используя " Z") проходите
через коды, приведенные ниже, и вы дошли до адреса #90000, но вы
хотите увидеть, как выставляются флаги после вызова подпрограммы
в #8800.
891Е 3EFF LD А,-1
8920 CD0090 CALL 39000
8923 2А0080 LD HL, (#8000)
8926 7Е LD A, (HL)
8927 111488 LD DE,#8814
892A CD0088 CALL #8800
892D 2003 JR NZABEL
892F 320280 LD (#8002), A
8932 211488 LABEL LDHL,#8814
Действуйте в следующем порядке:
Установите точку останова, используя W, по адресу #892 (на-
помним, что сначало нужно использовать "М" для установки (MP) и
затем вводите команду "К". Выполнение будет продолжаться до тех
пор, пока не дойдем до адреса, указанного в точке останова, затем
будет обновлен экран и вы сможете проверить состояние флагов и т.п.
после вызова процедуры адреса #88000. Затем можно возобновить
пошаговый режим. "К" полезна для выполнения кода без первона-
чального сброса стека или без разрушения содержимого регистров,
что делает.
13. <L>
Распечатывает блок памяти, начиная с адреса, находящегося в
данный момент в MP.
<L> очищает экран и отображает 16-ричное представление и
ASCII эквиваленты 80 байтов памяти, начиная с текущего адреса, на
который указывает MP. Адреса будут указаны в 16-ричном или деся-
тичном виде, в зависимости от текущего состояния Ф.П. (См. "3").
Отображение состоит из 20 рядов по 4 байта в каждом, ASCII эквива-
ленты показаны в конце каждого ряда. Применительно к ASCII от
отображения любого значения выше 127 отнимается код 128 и любые
значения между 0...31 включительно показаны как
В конце страницы листинга вы можете вернуться к основному
отображению Ф.П. нажатием <EDIT> или продолжать со следующей
страницы из 80 байтов нажатием любой другой клавиши.
14. <М>
Заносит в MP определенный адрес. Выдается подсказка на
ввод 16-ричного адреса (см. Раздел 1). MP обновляется введенным
адресом и соответственно на экране меняется отображение области
памяти.
15. <N>
Находит следующее появление строки, определенной в про-
шлый раз командой G. G позволяет вам определить строку и затем
осуществить поиск ее первого появления. Если вы хотите найти сле-
дующее появление строки, используйте <N>. <N> начинает поиск с
адреса, указанного в MP и обновляет отображение памяти, когда
искомая строка будет вновь найдена.
16. <0>
Команда берет байт, адресуемый в данный момент MP, и пред-
ставляет его как относительное смещение, соответственно обновляя
отображение.
Например:
Допустим, MP установлен в #6800 и содержимое ячеек #67FF и
#6800 равны #20 и #16 соответственно (это может быть представлено
как JR NS, $+24). Чтобы выяснить, куда будет переход по ненулевому
условию, просто нажмите, тогда MP адресуется на назначенный байт
#16, экран будет обновлен и отобразится область памяти с #6817,
требуемого значения перехода.
Помните, что относительные перемещения выше #7FF (127)
трактуются процессором как отрицательные, принимает это в рас-
чет.
См. также команду <U> в связи с <0>.
17. <Р>
Заполняет память между определенными границами нужным
байтом. <Р> выдает подсказки <FIRST:>, <LAST:>, <WITH:>. Введите
16-ричные числа в соответствии с этими подсказками (соответствен-
но: начальный и конечный адреса (включительно) блока, который вы
желаете заполнить, и байт заполнитель).
Например:
<Р>
FIRST: 7000 <ENTER>
LAST: 77FF <ENTER>
WITH: 55 <ENTER>
Ячейки с #7000 no #77FF будут заполнены байтом #55. Если
стартовый адрес больше конечного, то <Р> будет оборвана.
18. <Q>
Переключение наборов регистров. На входе Ф.П. Отображается
стандартный набор регистров (AF, HL, DE, ВС). При использовании
<Q> будет отображаться альтернативный набор регистров (AFM, HL",
DE", ВС"), который отличается от стандартного штрихом......после
имени регистра. Если <Q> используется, когда отображается альтер-
нативный набор регистров, то на экран будет выдан стандартный
набор.
19. <SYMBOL SHIFT> Т
Устанавливает точку останова после текущей инструкции и
продолжает выполнение.
Например:
9000 В7 OR А
9001 С20098 CALL NZ,#9800
9004 010000 LD BC,0
9800 21FFFF LD HL,-1
Вы в пошаговом режиме продвигаетесь по кодам и достигли
адреса #9001 с ненулевым значением в регистре А, так что флаг
"ZERO" будет в состоянии NZ после инструкции OR А.
Если вы сейчас используете "Z" для продолжения пошагового
режима, то выполнение продолжится с адреса #9800 подпрограммы.
Если вы не желаете шагать по подпрограмме, то используйте команду
"Т", тогда инструкции с #9800 и вызов будут пройдены автоматиче-
ски и выполнение остановится на адресе #9004 для дальнейшего
продолжения в пошаговом режиме помните, что "Т" устанавливает
точку останова после текущей инструкции и затем использует ко-
манду "К" (см. Команду "Z" с расширенным примером пошагового
прохода).
20. <Т>
Дизассемблирование дизассемблирует блок кодов на принтер
и/или дискету (по ключу). Сначала выдается подсказка на ввод
начального (<FIRST:>) и конечного (<LAST:>) адресов кодов, кото-
рые вы желаете дизассемблировать. Введите их в 16-ричном виде
(как описано в разделе 1).
Если начальный адрес больше конечного, то команда аннулиру-
ется. После ввода адресов выдается подсказка (<PRINTER?>). Для
направления результатов дизассемблирования на принтер отвечайте
"Y". При наборе любого другого символа результат будет выведен на
терминал. Затем выдается подсказка, <техт:> на ввод 16-ричного
начального адреса текстового файла, который будет являться резуль-
татом дизассемблирования. Если вы не хотите, чтобы был сгенериро-
ван текстовый файл, то просто нажмите <ENTER> после этой
подсказки если вы определили адрес, то дизассемблированный файл
будет получен, начиная с этого адреса, в форме, пригодной для ис-
пользования GENS4. Если вы хотите загрузить этот файл с помощью
GENS4, то вы должны заметить его конечный и начальный адреса,
вернуться в BASIC и сохранить текст как файл типа "CODE". Затем
вы можете загрузить код в редактор GENS4 прямо с помощью коман-
ды <G>.
Вместо ввода адреса в ответ на <ТЕХТ:> вы можете ввести имя
файла на дискете и на ней текст будет сохранен, как только пройдет
дизассемблирование.
Например:
Техт: 2: DCODE <ENTER>
Результат дизассемблирования будет сохранен на 2-м дисководе
под именем DCODE. Если вы дизассемблируете на дисковод, то лис-
тинг на экран выдаваться не будет. Файл, полученный на дисководе,
является самозагружающимся с помощью команды <G> если на не-
которой стадии генерации текстового файла текст будет перекрывать
MONS4, то дизассемблирование будет прекращено - нажмите любую
клавишу для возврата к Ф.П.
Если вы определили адрес текстового файла, то вас попросят
определить "WORKSPACE:" - начальный адрес свободной области
памяти, которая используется как примитивная таблица символов
для любых меток, которые производит ассемблер. Требуется по два
байта на каждую метку. По умолчанию (когда вы просто нажимаете
<ENTER>) резервируется 4К пространства ниже MONS4.
После этого повторно появляются запросы на начальный и ко-
нечный адреса любых областей данных, существующих внутри бло-
ка, который вы желаете дизассемблировать. Области данных - это
области, скажем, текста, который вы не желаете представлять как
инструкцию Z80 - вместо этих областей дизассемблером должны быть
сгенерированы директивы DEFB.
Если значение байта данных лежит между 32 и 127 (#20 #7F)
включительно, то дается интерпритация байта в коде ASCII, т.е. #41
заменяется на а после DEFB. Когда вы закончили определение обла-
стей данных, или вы не желаете их определять, то просто нажмите
<ENTER> в ответ на обе подсказки. Команда <Т> определяет область
в конце MONS4 для хранения адресов областей данных и, таким
образом, вы можете определять столько областей данных, сколько
позволяет память. Каждая область данных требует 4 байта простран-
ства. Отметим, что использование <Т> уничтожает любые точки
останова, которые первоначально были установлены (см. Команду
W).
Байт после выполнения инструкции RST 8 дизассемблируется
как DEFN, т.к. этот байт собирается ПЗУ SPECTRUM'a и никогда не
выполняется.
Экран будет очищен. Если будет запрос на создание текстового
файла, то произойдет короткая задержка (в зависимости от размеров
секции памяти, которую вы хотите дизассемблировать) пока созда-
ется таблица символов во время первого просмотра. Когда это будет
сделано, на экране (или принтере) появится листинг дизассемблиро-
вания, если только вы не дизассемблируете на дискету - в этом случае
листинг не производится. Вы можете остановить листинг в конце
строки нажатием <ENTER> или <SPACE>, последующее нажатие
<EDIT> возвращает к отображению Ф.П. Любой другой ключ про-
должает дизассемблирование.
Если встречается неверный код, то он дизассемблируется как
<NOP> и отмечается звездочкой после кода в листинге. В конце
дизассемблирования изображение будет приостановлено и, если был
запрос на создание текстового файла, то возникнет сообщение:
END OF THE TEXT XXXXX
Метки генерируются там, где это уместно (т.е. в С30078) в
форме ХХХХХ, где ХХХХХ - абсолютный 16-ричный адрес метки, но
только если их адреса попадают внутрь границ дизассемблирования.
В противном случае метки не генерируются, а просто даются 16-рич-
ные или десятиричные адреса.
Например, если вы проассемблировали область между #7000 и
#8000, то затем инструкция С30078 может быть дизассемблирована
как JP L7800; с другой стороны, если вы дизассемблируете с #9000 по
#9800, то эта же инструкция может быть дизассемблирована как JP
#7800 или JP #30720, если используется десятиричное отображение.
Если особый адрес отнесен к инструкции внутри дизассембли-
рования, то его метка появится в поле метки (перед мнемоникой)
дизассемблированной конструкции этого адреса, но только если лис-
тинг направляется в файл.
Например:
Т
FIRST: 8В <ENTER>
LAST: 9Е <ENTER>
PRINTER: Y <ENTER>
Техт: <ENTER>
FIRST: 95 <ENTER>
LAST: 9E <ENTER>
FIRST: <ENTER>
LAST: <ENTER>
Может быть произведено нечто подобное:
008В FE16 CP #16
008D 3801 JR С, L0090
008F 23 INC HL
0090 37 SCF
0091 225D5C LD (5C5D),HL
0094 С9 RET
0095 BF524E DEFB #BF, "R", "N"
0098 C4494E DEFB #C4,TV'NM
009В 4B4559 DEFB "KVEVY"
009E A4 DEFB #A4
21. <U>
Используется совместно с командой <0>. Помните, что она об-
новляет отображение памятй в соответствии с относительным смеще-
нием, т.е. показывает эффект инструкций JR или DJNZ. <U>
используется для возврата к отображению, которое было при послед-
нем использовании.
Например: |
|
|
7200 А7 |
71F3 |
77 |
7201 20 |
71F4 |
С9 |
7202 F2 |
71F5 |
F5 |
7203 06 |
71F6 |
С5 |
Картинка 1 |
Картинка2 |
На вашем терминале - картинка 1 и вы хотите узнать, когда
будет относительный переход 20 F2. Нажмите клавишу <0> и поя-
вится картинка 2 - обновленное отображение памяти.
Итак, вы нажимаете <0>, и появляется картинка 2. Теперь вы
исследуете код по адресу #71F5 и затем хотите вернуться к кодам,
соответствующим первоначальному относительному смещению для
того, чтобы увидеть, что происходит, если установлен флаг нуля.
Нажмите <U>, и отображение памяти вернется к картинке 1. Отме-
тим, что вы можете использовать <U> только для возврата к послед-
нему проявлению команды <0>, все предыдущие проявления <0>
утеряны.
22. <V>
Используется совместно с командой <Х> и подобна команде <U>
по эффекту, с той разницей, что она обновляет отображение памяти
на картинку, которая была перед последней командой <Х>.
Например:
8702 AF 842D 18
8703 CD 842Е А2
8704 2F 842F Е5
8705 44 8430 21
Картинка 1 Картинка 2
На вашем экране - картинка 1 и вы хотите посмотреть подпрог-
рамму с адреса #842F. Для этого вы нажимаете <Х>. При данной
картинке отображение памяти обновляется на картинке.
2. Вы просматриваете эту подпрограмму, и затем хотите вер-
нуться к кодам первоначального вызова подпрограммы. Для этого
нажмите <V> и вновь появится картинка 1.
Как и в случае с <U>, используя эту команду, вы можете достичь
только адресов, при которых была введена последняя команда <Х>.
Все предыдущие адреса, в которых использовалась команда <Х>,
будут утеряны.
23. <W>
Установка точки останова. Точка останова для MONS4 это про-
сто инструкция вызова внутри MONS4 подпрограммы, которая ото-
бражает Ф.П. так, что программисту дается возможность остановить
выполнение программы и проверить регистр Z80, флаги и любые
значащие ячейки памяти.
Таким образом, если вы хотите остановить выполнение про-
граммы в #9876, то используйте команду <W> для установки MP на
#9876 и затем используйте <W> для установки точки останова по
этому адресу. 3 Байта кода, которые были первоначально по адресу
#9876, заменяются инструкцией CALL, которая останавливает вы-
полнение, когда на нее выходят. Когда достигается эта инструкция
CALL, то она восстанавливает три первоначальные байта по адресу
#9876 и высвечивает Ф.П. Со всеми регистрами и флагами в состоя-
нии, в котором они находились перед выполнением точки останова.
Теперь вы можете использовать любые возможности MONS4 обыч-
ным способом.