Здесь Вы найдете описание только особенностей встроенного отладчика от подобного рода отладчиков, и если Вы можете совладать с Turbo Debugger'ом, AFD или, наконец, с SoftIce'ом, то Вы без труда освоите все возможности этого отладчика.
Встроенный в эмулятор отладчик имеет весьма разнообразные возможности по трассировке кода, механизму ловушек, снятию дампов с памяти и модификации памяти. Правда из-за ориентации отладчика на особенности РК и на работу с программами для РК, Вы не найдете в нем функций поиска и сравнения если очень надо, то выйдите в Монитор и воспользуйтесь его командами для этого.
Отладчик вызывается из эмулятора клавишей F12 (только если Вы запустили вариант эмулятора СО встроенным отладчиком).
Вот примерный вид экрана встроенного отладчика:
Окно регистров (0) | ||
Окно последней команды (1) | ||
Окно дизассемблера (2)
|
Окно ловушек (3) | |
Окно данных (4) |
Окно
|
|
Окно ввода (6) | ||
Строка подсказки (7) |
По основным клавишам этот отладчик очень похож на Turbo Debugger.
Краткое описание клавиш:
F1
--
Принудительная передача управления на адрес f800h (рестарт Монитора). Сделано
для выхода из зацикливания при выполнении процессором bad opcode (глава
"Исключительные ситуации").
F2
--
Установка ловушки (EXEC,P) на текущий адрес (глава "Ловушки").
F4
--
Выполнение программы до текущего адреса. Выполняется установкой ловушки (EXEC,T)
на текущий адрес и передачей управления программе (глава "Ловушки").
F5
--
Экран эмулятора.
F6
--
Ввод задержки (глава "Задержка").
F7
--
Выполнение ОДНОЙ текущей команды программы и ГАРАНТИРОВАННОЕ возвращение в отладчик.
F8
--
Выполнение ОДНОЙ текущей команды программы без входа в подпрограмму командами
CALL/Cxx. Если текущая команда не является одной из серии команд CALL/Cxx, то
возвращение в отладчик гарантировано, иначе (при выполнении одной из команд
CALL/Cxx) возвращение в отладчик после выполнения этой команды может и не последовать,
если вызванная подпрограмма корректно не закончит работу одной из команд RET/Rxx.
Такое поведение связано с тем, что обход вызова подпрограммы производится установкой
ловушки типа (EXEC,T) на команду, следующую за командой вызова подпрограммы
со всеми вытекающими последствиями. Поэтому, если возврата в отладчик после
выполнения команды CALL/Cxx не последовало, то в списке активных ловушек может
остаться установленная ловушка.
F9
--
Передача управления программе.
F10
--
Выполнение программы по первой команды RET. Выполняется установкой ловушки 0000C900(INSTR,T)
и передачей управления программе.
ВНИМАНИЕ: условные команды Rxx не обрабатываются, что следует из формата ловушки
000C900(INSTR,T).
G
--
Переход на введенный адрес в окне кода (глава "Ввод чисел")
D
--
Переход на введенный адрес в окне данных (глава "Ввод
чисел")
R
--
Редактирование байтовых регистров (глава "Редактирование
регистров")
W
--
Редактирование регистровых пар (глава "Редактирование
регистров")
F
--
Редактирование флагов (глава "Редактирование регистров")
E
--
Редактирование памяти в окне данных (4) (глава "Редактирование
памяти")
B
--
Редактирование ловушек (глава "Редактирование ловушек")
Grey '*'
------
Загрузка фрагмента памяти из файла (глава "Загрузка и
снятие дампов памяти")
Grey '-'
------
Запись фрагмента памяти в файл (глава "Загрузка и снятие
дампов памяти")
Grey '+'
------
Вывод таблицы символов РК.
NumLock
------
Вывод помощи по раскладке клавиатуры и состоянию эмулятора
ALT-X
----
Немедленный выход из эмулятора
При запросе на ввод любой числовой информации в окне ввода Вы можете вводить числа в интервале от 0 до 0xffffffff, которые будут урезаться в зависимости от смысла вводимого числа. Числа вводятся ТОЛЬКО в шестнадцатеричной системе. Клавиша ESC отменяет результат редактирования и прерывает его процесс. Клавиша ENTER тоже прекращает редактирование, но изменения вступают в силу.
При редактировании, нажав PGUP, можно восстановить начальное значение редактируемого числа. При вводе можно подставлять значения регистровых пар PC, SP, HL, DE, BC или AF. Для этого надо ввести имя регистровой пары, предварив ее символом '#' (например, #DE), и нажать ENTER для завершения редактирования. Еще можно подставлять значение слова (WORD) из памяти, адресуемого регистровыми парами (хотя для регистровой пары AF вряд ли это будет иметь смысл). Для этого тоже вводится имя регистровой пары, предваренное символом '&' (например, &BC).
Наконец, можно подставить значение указанной ловушки. Для этого введите символ
'.' и затем введите номер ловушки (например .4). Если ловушка с таким номером
пуста, то результат ввода останется неизмененным.
Ну и самая последняя возможная подстановка значения это использования адреса
последней выполненной операции (окно 1). Для этого используйте слово 'last'.
Это слово надо использовать по аналогии с регистровыми парами, то есть либо
как #last для непосредственной подстановки и &last для косвенной.
Редактирование регистров вызывается из отладчика кнопками
В первых двух случаях Вы выбираете регистр и затем вводите его значение. При выборе регистров можно использовать "горячие" клавиши цифры от '1' и далее в зависимости от номера регистра или регистровой пары в меню. Не забывайте, что при вводе чисел можно пользоваться подстановками значений других регистров и памяти, адресуемой регистрами. При редактировании же отдельных флагов Вы просто выбираете флаг и затем его значение инвертируется. При выборе флагов можно пользоваться "горячими" клавишами первыми буквами названий флагов C, N, S и Z соответственно.
Нажав 'E', Вы можете редактировать память либо в HEX-режиме, либо в символьном, переключаясь между ними клавишей TAB. Выход из редактирования ESCAPE.
Клавишами Grey '*' и Grey '-' можно записывать фрагменты памяти на диск и
считывать их обратно.
При записи фрагмента памяти Вы вводите имя файла или выбираете уже существующий
(он перезапишется), затем вводите начальный и конечный адреса записываемого
фрагмента. После этого Вы выбираете тип файла для
записываемого фрагмента. Если это 'Dump', то это будет просто точная байтовая
копия указанного куска памяти, которую затем можно будет загрузить через Grey
'-'. А при 'Monitor file' фрагмент будет записан в формате
Монитора (глава "Эмуляция записи") и пригоден
для дальнейшей загрузки и РК командой Монитора 'I'. При загрузке фрагмента памяти
(например, после сохранения в режиме 'Dump') Вы просто выбираете файл и вводите
стартовый адрес загрузки.
На данный момент единственной исключительной ситуацией является попытка выполнения
эмулятором недопустимой команды (bad opcode). Если в меню настроек флаг 'КОНТРОЛЬ
bad opcodes' в состоянии ВКЛ, то
при выполнении недопустимой команды получает управление отладчик и далее Вы
сами решаете, что делать (можно, например, нажать F1 и перезапустить "Монитор").
Если отладчик недоступен (Вы запустили эмулятор без встроенного отладчика),
то поведение эмулятора будет аналогично выполнению команды HLT. Перезапустить
эмулятор в этом случае можно, например, клавишей RESET (F11). Если 'КОНТРОЛЬ
bad opcodes' в состоянии ВЫКЛ, то эмулятор просто игнорирует этот 'bad opcode'
и начинает выполнение следующей за ним инструкции.
Через клавишу F6 в отладчике Вы можете вводить задержку работы эмулятора (также
Вы можете менять эту задержку в меню настроек эмулятора).
По умолчанию это 1. Задержка 1 является минимальной, при которой сохраняется
"растактовка" команд i8080 (по tick'ам).
При 0 Вы получите максимальную скорость, но время выполнения команд будет не
сбалансировано относительно документации на i8080. Увеличивая задержку, Вы можете
замедлять эмулятор. На моем p200/mmx при задержке 1 эмулятор работает в ~2.5
раза быстрее "родного" РК.
Нажав 'B', Вы выбираете ловушку. Затем Вы можете изменить режим ловушки (поле mode) Empty (этим Вы просто стираете ловушку и редактирование заканчивается), Permanent или Temp. В меню изменения режима ловушки можно пользоваться горячими клавишами E, P и T соответственно.
После, Вы выбираете тип ловушки (поле type) EXEC, ACCESS, READ, WRITE,
INSTR, IO/IN, IO/OUT. Здесь горячие клавиши E, A, R, W, I, N и T соответственно.
Ну и в конце, Вы вводите данные ловушки (поле info) число от 0 до ffffffffh.
Сокращенно, данные о ловушке (в окне ловушек или в окне кода) представляются
в виде:
XXXXXXXX(type, mode) | | | | | +> поле mode (P-Permanent, T-Temp) | +> поле type (INSTR, EXEC, ACCESS, READ, | WRITE, IO/IN, IO/OUT) +> поле info от 0 до 0xffffffff
Пример: 0000F836(EXEC, T)
Ловушки были введены в эмулятор для его собственной отладки и ломания игрушек.
Редактировать ловушки можно клавишей 'B' в отладчике.
Каждая ловушка (всего их 10 к чему больше?) имеет 3 поля данных:
cond = op & ~(info & 0xff)) == info>>8
cond==0
, то ловушка НЕ сработала, иначе сработала. 1. Команда RET (C9) info=С900, 0000C900(INSTR, T)
2. Команда MOV r1, r2 info=403F, 0000403F(INSTR, T)
3. Команда LXI rp, xxxx info=0130, 00000130(INSTR, T)
Значение старшего слова поля info для ловушки типа INSTR на имеет
значения.
Ловушки типа INSTR срабатывают ДО исполнения инструкции.
Для остальных типов ловушек, задавая info, Вы просто задаете адрес
срабатывания для ловушек по памяти (от 0 до 0ffffh) или номер порта для
ловушек на ввод/вывод (от 0 до 00ffh).
Если старшее слово поля info (кроме ловушек типа INSTR) равно нулю, то
ловушка срабатывает прb ТОЧНОМ совпадении текущего анализируемого адреса
или номера порта, по которому идет обращение.
Если старшее полуслово поля info не 0, то ловушка срабатывает по
диапазону адресов. Вот условие срабатывания в этом случае (addr
анализируемый адрес памяти или порта) в нотации языка C:
cond = addr >= (info & 0xffff) && addr <= info>>16
Если cond == 0, то ловушка НЕ сработала, иначе сработала.
В общем, здесь Вы задаете начальный адрес диапазона срабатывания во
младшем cлове поля info и конечный в старшем.
Примеры (пусть здесь режим будет Temp):
1. 0000F836(EXEC, T) исполнение по адресу F836
2. 00000020(IO/OUT, T) вывод в порт 20
3. 2FFF1000(WRITE, T) запись по адресам от 1000 до 2FFF
4. 00400020(IO/IN, T) чтение из портов от 20 до 40
Все ловушки (кроме типа INSTR) срабатывают ПОСЛЕ найденной команды.
Если Вы хотите узнать о том, как ломать РК'шные игры этим отладчикам, то смотрите сюда.