В тексте данного документа применяются следующие обозначения для клавиш: пробелом разделяются клавиши, которые нужно нажимать последовательно, а плюсом — одновременно.
Программа представляет собой экранный отладчик программ, написанных на ассемблере Z80. Этот отладчик может использоваться на ПЭВМ MSX2 и MSX, оснащенных VDP 9938 (Yamaha YIS-503IIR), под управлением операционной системы MSX-DOS (в том числе в варианте Ю.В.Галутина).
Команда вызова отладчика DBG:
A>Dbg [имя-программы]
Команда вызова отладчика XDBG:
A>XDbg[/p[/s]][/M] [имя-программы]
После XDbg
в команде запуска можно указать от одного до трёх флажков, которые определяют, в каком слоте памяти должен располагаться собственно отладчик. Первые два флажка определяют номера первичного и вторичного слота соответственно:
XDbg/3/0 | слот 3-0 |
XDbg/1 | слот 1 (нерасширенный) |
Флажок /M предписывает использование маппера (отладчик располагается в страницах FF, FE и FD). При переносе отладчика максимально возможный размер загружаемой и отлаживаемой программы может достигать 48 Kбайт.
При отсутствии флажков отладчик размещается в основной оперативной памяти, оставляя для программы пользователя вместе с таблицей символических имён только 32 Кбайт. Однако
перенести отладчик в параллельную память можно и в процессе работы посредством команды Esc U (см. ниже).
Примеры отображения на экране:
Режим листинга ассемблера
окно заголовка
┌──────────────────────────────────────────────────┐
┌02000┬───────────────────────────────────────────────────────┬────────────────┐
│List │ X-DEBUGGER Version 1.0 Help:<Esc>? Visual:Trace │ EI PC=D827 I=00│
├─────┼──────────────────────────────────────────────────┬────┤8B/02/8B/8B R=58│
│ │ 7FF8:60 LD H,B │ │--/--/--/-- │
│ │ 7FF9:4B LD C,E │ │T=838B:CE6B/89C3│
│00~00│ 7FFA:03 INC BC │ ├────────────────┤
│ │ 7FFB:1A LD A,(DE) │ │ A=00 . sZxHxpNC│
│ │ 7FFC:FE 38 CP 38 │ │ BC=0240: 00 . │
│ │ 7FFE:FF RST 38 │ │ DE=0000: C3 "ц"│
│ │ 7FFF:FF RST 38 │ │ HL=7FFD: 38 "8"│
│ │MEM80@:8000:00 NOP │0078│ IX=1377: 2A "*"│
│C0-C0│ 8001:00 NOP │ │ IY=0A00: 53 "S"│
│ │ 8002:00 NOP │ ├────────────────┤
│20+1A│ 8003:20 FB JR NZ,MEM80@:8000 │ │A'=00 . szxhxpnc│
│ │ 8005:DD 2A 08 80 LD IX,(PRED:8008) │ │BC'=0120: E1 "А"│
│00+00│ 8009:C1 POP BC │ │DE'=0A00: 53 "S"│
│ │ 800A:CD CD D9 CALL D9CD │ │HL'=1100: 0E . │
├─┬───┴──────────────────────────────────────────────────┴────┼────────────────┤
│ │ 3FC0:E7 38 EB 2A E9 38 7D 93 6F 7C 9A 67 22 EB 38 2A│Г8К*И8}.o|.g"К8*│
│-│ 3FD0:E7 38 EB 21 18 39 C3 0A 1F CD 36 11 22 E9 38 EB│Г8К!.9ц..м6."И8К│
│ │ 3FE0:2A E7 38 7B 95 6F 7A 9C 67 22 EB 38 2A E9 38 EB│*Г8{.oz.g"К8*И8К│
│+│ 3FF0:21 1E 39 C3 0A 1F 0E 07 25 3D 20 03 E9 3C 32 03│!.9ц....%= .И<2.│
│ │DRIVER:4000:41 42 6F 57 76 65 00 00 00 00 00 00 00 00 00 00│ABoWve..........│
│ │ 4010:C3 F5 74 C3 86 78 C3 09 79 C3 23 79 C3 50 79 C3│цУtц.xц.yц#yцPyц│
│~│ 4020:82 78 C3 35 5B 37 C3 AC 60 C3 14 62 00 C3 AE 5F│.xц5[7ц∞`ц.b.ц∈_│
│ │ 4030:2A 4B F3 C9 DD E5 DD 21 B7 00 CD AB 40 DD E1 30│*KСищЕщ!≈.мδ@щА0│
└─┴───────────────────────────────────────────────────────────┴────────────────┘
Режим загрузки программы
окно запроса
(дополнительное окно файлов)
┌──────────────────────────────────────────────────┐
┌1F000┬───────────────────────────────────────────────────────┬────────────────┐
│Input│ File:B:prog .COM Area:07F0-BEFC Reloc:0100->07F0 │ EI PC=0100 I=00│
├─────┼──────────────────────────────────────────────────┬────┤8B/8B/8B/8B R=7B│
│ │ 012F:CB 16 RL (HL) │ │FB/FA/F9/F8 │
│ │ 0131:30 0F JR NC,0142 │ │T=BEFB:CE6B/89C3│
│ │ 0133:E5 PUSH HL │ ├────────────────┤
│ │ 0134:DD 66 00 LD H,(IX+00) │ │ A=00 . szxhxpnc│
│ │ 0137:DD 6E FF LD L,(IX-01) │ │ BC=0000: C3 "ц"│
│ │ 013A:19 ADD HL,DE │ │ DE=0000: C3 "ц"│
│ │ 013B:DD 74 00 LD (IX+00),H │ │ HL=0000: C3 "ц"│
│ │ 013E:DD 75 FF LD (IX-01),L │ │ IX=0000: C3 "ц"│
│ │ 0141:E1 POP HL │ │ IY=0000: C3 "ц"│
│ │ 0142:DD 23 INC IX │ ├────────────────┤
│ │ 0144:0B DEC BC │ │A'=00 . szxhxpnc│
│ │ 0145:78 LD A,B │ │BC'=0000: C3 "ц"│
│ │ 0146:B1 OR C │ │DE'=0000: C3 "ц"│
│ │ 0147:20 DF JR NZ,0128 │ │HL'=0000: C3 "ц"│
├─┬───┴──────────────────────────────────────────────────┴────┼────────────────┤
│V│ 1F020:17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17│................│
│V│ 1F030:17 17 17 17 17 17 17 17 17 17 17 17 17 17 12 17│................│
│V│ 1F040:17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 19│................│
│V│ 1F050:16 49 6E 70 75 74 16 20 46 69 6C 65 3A 20 70 72│.Input. File:B:P│
│V│ 1F060:6F 67 20 20 20 20 20 20 20 20 41 72 65 61 3A 20│ROG .COM Are│
│V│ 1F070:30 37 46 30 2D 38 41 31 42 20 20 52 65 6C 6F 63│a:07F0-8A1B Rel│
│V│ 1F080:3A 20 30 31 30 30 2D 3E 30 37 46 30 20 20 16 20│oc:0100->07F0 . │
│V│ 1F090:45 49 20 50 43 3D 30 31 30 30 20 52 3D 37 42 16│EI PC=0100 .│
└─┴───────────────────────────────────────────────────────────┴────────────────┘
Режим листинга
окно заголовка
┌──────────────────────────────────────────────────┐
┌02000┬───────────────────────────────────────────────────────┬────────────────┐
│List │ DEBUGGER Version 5.2 Help:<Esc>? Visual:Trace │ EI PC=D827 I=00│
├─────┼──────────────────────────────────────────────────┬────┤32/2-/32/32 R=58│
│ │ 7FF8:60 LD H,B │ │FB/FA/F9/F8 +MAP│
│ │ 7FF9:4B LD C,E │ │T=882B:D0C1/323C│
│00~00│ 7FFA:03 INC BC │ ├────────────────┤
│ │ 7FFB:1A LD A,(DE) │ │ A=00 . sZxHxpNC│
│ │ 7FFC:FE 38 CP 38 │ │ BC=0240: 00 . │
│ │ 7FFE:FF RST 38 │ │ DE=0000: C3 "ц"│
│ │ 7FFF:FF RST 38 │ │ HL=7FFD: 38 "8"│
│ │MEM80@:8000:00 NOP │0078│ IX=1377: 2A "*"│
│C0-C0│ 8001:00 NOP │ │ IY=0A00: 53 "S"│
│ │ 8002:00 NOP │ ├────────────────┤
│20+1A│ 8003:20 FB JR NZ,MEM80@:8000 │ │A'=00 . szxhxpnc│
│ │ 8005:DD 2A 08 80 LD IX,(PRED:8008) │ │BC'=0120: E1 "А"│
│00+00│ 8009:C1 POP BC │ │DE'=0A00: 53 "S"│
│ │ 800A:CD CD D9 CALL D9CD │ │HL'=1100: 0E . │
├─┬───┴──────────────────────────────────────────────────┴────┼────────────────┤
│ │ 3FC0:E7 38 EB 2A E9 38 7D 93 6F 7C 9A 67 22 EB 38 2A│Г8К*И8}.o|.g"К8*│
│-│ 3FD0:E7 38 EB 21 18 39 C3 0A 1F CD 36 11 22 E9 38 EB│Г8К!.9ц..м6."И8К│
│ │ 3FE0:2A E7 38 7B 95 6F 7A 9C 67 22 EB 38 2A E9 38 EB│*Г8{.oz.g"К8*И8К│
│+│ 3FF0:21 1E 39 C3 0A 1F 0E 07 25 3D 20 03 E9 3C 32 03│!.9ц....%= .И<2.│
│ │DRIVER:4000:41 42 6F 57 76 65 00 00 00 00 00 00 00 00 00 00│ABoWve..........│
│ │ 4010:C3 F5 74 C3 86 78 C3 09 79 C3 23 79 C3 50 79 C3│цУtц.xц.yц#yцPyц│
│~│ 4020:82 78 C3 35 5B 37 C3 AC 60 C3 14 62 00 C3 AE 5F│.xц5[7ц∞`ц.b.ц∈_│
│ │ 4030:2A 4B F3 C9 DD E5 DD 21 B7 00 CD AB 40 DD E1 30│*KСищЕщ!≈.мδ@щА0│
└─┴───────────────────────────────────────────────────────────┴────────────────┘
Режим загрузки программы
окно запроса
(дополнительное окно файлов)
┌──────────────────────────────────────────────────┐
┌1F000┬───────────────────────────────────────────────────────┬────────────────┐
│Input│ File:B:prog .COM Area:07F0-8A1B Reloc:0100->07F0 │ EI PC=0100 I=00│
├─────┼──────────────────────────────────────────────────┬────┤32/32/32/32 R=7B│
│ │ 012F:CB 16 RL (HL) │ │--/--/--/-- -MAP│
│ │ 0131:30 0F JR NC,0142 │ │T=8A1A:CFC5/75C3│
│ │ 0133:E5 PUSH HL │ ├────────────────┤
│ │ 0134:DD 66 00 LD H,(IX+00) │ │ A=00 . szxhxpnc│
│ │ 0137:DD 6E FF LD L,(IX-01) │ │ BC=0000: C3 "ц"│
│ │ 013A:19 ADD HL,DE │ │ DE=0000: C3 "ц"│
│ │ 013B:DD 74 00 LD (IX+00),H │ │ HL=0000: C3 "ц"│
│ │ 013E:DD 75 FF LD (IX-01),L │ │ IX=0000: C3 "ц"│
│ │ 0141:E1 POP HL │ │ IY=0000: C3 "ц"│
│ │ 0142:DD 23 INC IX │ ├────────────────┤
│ │ 0144:0B DEC BC │ │A'=00 . szxhxpnc│
│ │ 0145:78 LD A,B │ │BC'=0000: C3 "ц"│
│ │ 0146:B1 OR C │ │DE'=0000: C3 "ц"│
│ │ 0147:20 DF JR NZ,0128 │ │HL'=0000: C3 "ц"│
├─┬───┴──────────────────────────────────────────────────┴────┼────────────────┤
│V│ 1F020:17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17│................│
│V│ 1F030:17 17 17 17 17 17 17 17 17 17 17 17 17 17 12 17│................│
│V│ 1F040:17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 19│................│
│V│ 1F050:16 49 6E 70 75 74 16 20 46 69 6C 65 3A 20 70 72│.Input. File:B:P│
│V│ 1F060:6F 67 20 20 20 20 20 20 20 20 41 72 65 61 3A 20│ROG .COM Are│
│V│ 1F070:30 37 46 30 2D 38 41 31 42 20 20 52 65 6C 6F 63│a:07F0-8A1B Rel│
│V│ 1F080:3A 20 30 31 30 30 2D 3E 30 37 46 30 20 20 16 20│oc:0100->07F0 . │
│V│ 1F090:45 49 20 50 43 3D 30 31 30 30 20 52 3D 37 42 16│EI PC=0100 .│
└─┴───────────────────────────────────────────────────────────┴────────────────┘
Отладчик обеспечивает:
загрузку в память и запись на диск программ и таблиц символов (файлов <имя>.<тип>
и <имя>.SYM
);
просмотр и корректировку содержимого оперативной памяти в символьном и шестнадцатиричном формате, а также в виде команд ассемблера;
просмотр и корректировку содержимого видеопамяти в символьном и шестнадцатиричном формате;
просмотр и изменение содержимого регистров отлаживаемой программы;
использование имён, введённых вместе с программой, а также добавление новых имён и удаление имеющихся (имена используются и в командах ассемблера); имена можно настроить на начальный адрес программы;
выдачу на печать содержимого текущего окна отладчика;
установку и снятие точек приостанова (со счётчиками);
установку и снятие контроля изменения байтов памяти;
покомандное и непрерывное выполнение программы (в том числе и в режиме мультипликации, с обходом и без обхода команд CALL
);
возврат управления отладчику: при достижении точки приостанова с нулевым счётчиком, при изменении одного из контролируемых байтов памяти, при нормальном завершении программы, при нажатии клавиши Stop;
пересылку и заполнение областей памяти, поиск символьного или шестнадцатиричного образца.
выполнение арифметических действий над шестнадцатиричными числами;
получение на экране краткой информации о средствах, имеющихся в отладчике.
При запуске отладчик переводит систему в 80–символьный режим и загружает в оперативную память программу, если ее имя указано в команде (имя указывается без уточнения; загружаются файлы <имя>.<тип>
и <имя>.SYM
).
В процессе работы на экране выделяются поля разметки и поля данных. Курсор всегда находится в одном из полей данных, и только в такие поля можно вносить изменения. При выходе курсора из текущего поля его новое содержимое проверяется и заносится в память машины; все остальные поля экрана при этом приводятся (по возможности) в соответствие с содержимым изменённого поля. Например, для изменения байта или слова данных в любом поле достаточно просто набрать его новое значение и выйти из поля. Аналогично, для того, чтобы передвинуть окно листинга или дампа на другие адреса памяти, достаточно в любой строке набрать нужное имя в поле имени или нужный адрес в поле адреса. Для создания нового имени достаточно набрать его в соответствующем поле, а для удаления существующего — заменить его на новое или заполнить поле имени пробелами.
Все поля данных, имеющиеся на экране, сгруппированы в окна: три основных («дампа», «листинга» и «регистров») и одно дополнительное («заголовка», «файлов» или «памяти»).
Курсор перемещается в пределах одного окна с помощью стрелок, клавиш Ввод ⏎, Tab и Ctrl+F. Листание осуществляется по клавишам Ctrl+J (вверх) и Ctrl+Q (вниз). Редактирование информации выполняется символьными клавишами, а также клавишами Ins, Del и Bs. Переход в другое окно (и установка дополнительного окна) выполняются по одной из следующих команд:
Esc L | Работа в окне листинга.
Левая колонка содержит точки приостанова (для них указывается максимальный счётчик, признак активности (+ - активна, ~ - активна в параллельном банке памяти, - - неактивна) и текущее значение счётчика). В основной части каждой строки окна располагаются поля имени, адреса, байтов, образующих команду, и самого текста команды.
Правая колонка окна содержит значения счётчиков профилей выполнения программы (в строках команд с символическими именами).
Имена во всех полях (в том числе и в текстах команд) должны заканчиваться двоеточием. Например, команды могут записываться в следующем виде: LD A,(name:3000)
LD A,(name:)
LD A,(3000)
Команда RST 30 (Inter-Slot Call) дополняется в качестве операндов номером слота и адресом вызова.
|
Esc D | Работа в окне дампа.
Левая колонка содержит признаки контроля изменения байта памяти с указанием активности контроля (+/-/~). В основной части каждой строки окна имеются поля имени, адреса, 6 полей байтов в шестнадцатиричном виде и 16 полей тех же байтов в символьном виде. |
Esc V | Работа в окне дампа видеопамяти.
Содержимое видеопамяти отображается так же, как и в режиме Esc D, однако левая колонка заполняется буквами V (для VRAM) или E (для ERAM). При просмотре VRAM поле адреса дополняется слева еще одним разрядом, чтобы охватить все 128Kбайт. |
Esc R | Работа в окне регистров.
Окно содержит поля значений всех регистров, а также байтов или слов, на которые указывают шестнадцатибитные регистры. Одновременно с шестнадцатиричными значениями байтов выдаётся их символьное представление.
Кроме того, имеются поля счётчика команд (PC ), состояния обработки прерывания (EI/DI) и выбранного банка памяти (с указанием слота и страницы маппера) для всех четырех 16 Kбайтных страниц.
DBG: Установка конфигурации маппера может быть отключена.
XDBG: Наличие или отсутствие маппера распознаётся автоматически. |
Esc Y | Показ символических имён.
Окно листинга заполняется строками, соответствующими символическим именам. |
Esc B | Показ точек приостанова.
Окно листинга заполняется строками, соответствующими точкам приостанова. |
Esc H | Показ контролируемых байтов.
Окно дампа заполняется строками, соответствующими адресам байтов, изменение которых контролируется. |
Esc I | Чтение файлов.
В дополнительном окне располагаются поля имени файла и интервала адресов для размещения программы. После нажатия клавиши перевода строки файл с именем <имя>.<тип> считывается в память (конфигурация слотов и маппера определяется соответствующими полями в окне регистров).
Кроме того, к таблице имён присоединяются имена из файла <имя>.SYM , если он есть. С помощью полей Reloc: можно указать настройку символических имён на нестандартный начальный адрес программы. |
Esc O | Запись файлов.
В дополнительном окне располагаются поля имени файла и интервала адресов. После нажатия клавиши перевода строки указанная область памяти записывается в файл <имя>.<тип> , а все символические имена — в файл <имя>.SYM (конфигурация слотов и маппера определяется соответствующими полями в окне регистров). |
Esc P | Выдача на печать содержимого текущего окна отладчика (печать прерывается при нажатии Ctrl+Stop). |
Esc M | Пересылка информации.
В дополнительном окне располагаются поля запроса двух интервалов адресов: откуда и куда требуется переслать информацию. При изменении начального адреса в одном из интервалов соответствующий конечный адрес автоматически изменяется так, чтобы длины интервалов совпали. При изменении конечного адреса таким же образом меняется конечный адрес другого интервала. |
Esc F | Заполнение области памяти.
В дополнительном окне располагаются поля запроса интервала адресов и образца для заполнения. Образец для заполнения может быть набран в символьном или шестнадцатиричном виде (вид определяется полем, содержащим букву C или X соответственно). Размер образца определяется положением курсора в момент нажатия клавиши Ввод ⏎. |
Esc S | Поиск образца.
В дополнительном окне располагаются поля запроса интервала адресов и образца для поиска. Образец для поиска может быть набран в символьном или шестнадцатиричном виде (вид определяется полем, содержащим букву C или X соответственно). Размер образца определяется положением курсора в момент нажатия клавиши <перевод строки>. Поиск можно прервать нажатием Ctrl+Stop. |
Esc E | Начальная установка регистров.
Все регистры устанавливаются в 0, счётчик команд PC устанавливается на 100h, состояние прерываний — разрешены (EI), всем страницам памяти сопоставлены основные банки памяти (установленные при запуске отладчика). |
Esc Z | Начальная установка текущих счётчиков точек приостанова (они устанавливаются равными максимальным счётчикам). |
Esc C | Шестнадцатиричный калькулятор.
В дополнительном окне располагаются два поля операндов (четырёхзначные шестнадцатиричные числа), поле знака операции (+, -, *, /, %) и поле показа результата. Поле результата заполняется при смене любого операнда или знака операции. |
Esc T | Установка базового адреса PNT и PGT отладчика.
Поле базового адреса располагается в левом верхнем углу рамки. При вводе нового значения в этом поле PNT и PGT переносятся на указанный адрес и автоматически инициализируются.
Таблицы PNT и PGT занимают 1000h байт VRAM, начиная с указанного адреса. |
Esc Q | Завершение работы отладчика и выход в среду операционной системы с восстановлением исходного режима экрана (40/80 символов). |
Esc U | Только в XDBG
Перенос отладчика в параллельную память.
Программы и данные самого отладчика переносятся в ту память, которая задана полями слотов и маппера в окне регистров. При этом для загрузки и отладки программ пользователя становится доступным около 48 Кбайт памяти.
Перенос в параллельную память не может быть выполнен, если хотя бы одна из трех страниц (0000…3FFF,4000…7FFF, 8000…BFFF) совпадает с первоначальной по слотовому адресу. Кроме того, если при запуске отладчика или в процессе работы перенос выполнен, его нельзя ни отменить, ни изменить; можно только выйти из отладчика и загрузить его снова. |
Esc ? | Показ страницы с подсказкой. |
Ctrl+G | Запуск программы.
Программа начинает выполняться с адреса, находящегося в счётчике команд PC . Устанавливается заданное пользователем распределение банков памяти.
Если режим мультипликации выключен (Visual:No ), на время работы программы экран переключается на обычную страницу системы (0000h). Если же режим мультипликации включён (Visual:Exec или Trace ), системная страница не включается, зато после каждой исполненной команды обновляется содержимое экрана отладчика. В режиме Visual:Exec исполняется отдельно каждая команда, а в режиме Visual:Trace взамен одной команды Call исполняется вся вызываемая подпрограмма.
Все точки приостанова устанавливаются в основных банках памяти (которые были включены при запуске отладчика).
При достижении одной из активных точек приостанова (с признаком «+» или «~») либо выполняется уменьшение счётчика (если он ненулевой), либо приостанавливается выполнение программы и управление передаётся отладчику. Аналогично выполнение программы приостанавливается при изменении содержимого одного из активных контролируемых байтов. Следует иметь в виду, что выполнение программы значительно замедляется при установке контроля изменения байтов.
Выполнение программы можно приостановить нажатием клавиши Stop (если прерывания в этот момент разрешены). При выполнении команды RET с начальным состоянием стека или команды RST 0 управление также передаётся отладчику; при этом считается, что программа успешно завершена.
Обработка точек приостанова организуется с помощью RST 0 , поэтому все остальные команды RST могут использоваться в отлаживаемой программе без ограничений. После возврата управления отладчику в окне листинга первая строка устанавливается на команду, с которой начиналось выполнение, а вторая — на ту, которая вызвала приостанов (в ней устанавливается курсор).
Передача управления отладчику при достижении точки приостанова или при завершении программы возможна только при условии, что странице 0000h…3FFFh в этот момент сопоставлен основной банк памяти (тот же, что и при запуске отладчика).
При выполнении программы ведётся подсчёт профилей по всем символическим именам (при каждом прерывании и при трассировке отдельной команды увеличивается на единицу счётчик профиля ближайшего символического имени с адресом, меньшим текущего PC ). Значения счётчиков профиля отображаются в правой колонке окна листинга. |
Ctrl+X (SELECT) | Выполнение одной команды.
Выполняются те же действия, что и по указанию Ctrl+G, но исполняется только одна команда (расположенная по адресу из счётчика команд PC ). Можно исполнять также команды, находящиеся в ПЗУ (однако точки приостанова в ПЗУ устанавливать нельзя). |
Ctrl+T | Выполнение команды с обходом подпрограммы.
Выполняется аналогично Ctrl+X, но для команды CALL управление возвращается отладчику только после выполнения вызываемой подпрограммы. При выполнении подпрограммы выполняется обычная обработка точек приостанова (как в Ctrl+G). |
Ctrl+P | Установка счётчика команд PC на ту команду, против которой находится курсор. |
Ctrl+V | Выбор режима мультипликации.
Устанавливается один из режимов Visual:No , Exec или Trace . |
Распределение видеопамяти:
0000h | PNT системы и программы. |
1000h | PGT системы и программы. |
2000h | PNT отладчика. |
2800h | PGT отладчика. |
3000h | PNT подсказки. |