Короткий огляд дебагерів, з якими зіткнувся, поки експериментував із асемблерами – не прагнучи до повноти.
SID – Symbolic debugger
Цей дебагер виявився, враховуючи епоху, на диво потужним.
Вміє завантажувати, поміж іншого, .COM та .HEX файли1.
Представляється SID, що йде із Osborne Executive як
CP/M 3 SID - Version 3.0
, всередині має стрічкуCP/M Version 3.0COPYRIGHT 1982, DIGITAL RESEARCH
. Розмір – 7936 байт.
Завантаження – або так:
SID HEZ80.COM
або інтерактивно:
D0>sid
CP/M 3 SID - Version 3.0
# E HEZ80.COM
Подивитися вміст пам’яті: D
– по байтах, DW
– по словах, D<addr>
– починаючи з цієї адреси, D<from>,<to>
– у вказаному інтервалі.
#D100,120
0100: 0E 09 11 09 01 CD 05 00 C9 0D 0A 48 65 6C 6C 6F ...........Hello
0110: 2C 20 57 6F 72 6C 64 21 0D 0A 24 00 00 00 00 00 , World!..$......
0120: 00 .
A<addr>
– асемблювати. Не знає про Z80, і досить жорсткий щодо формату – пробілів між операндами не розуміє, числа – в HEX за замовчуванням, щоб в десятковій – спереду ставиться #, але можна використовувати як малі, так і великі літери.
#A100
0100 ld C,09
?
0100 mvi c,09
0102 mvi c, 09
?
#a
0102 mvi c,09
0104 mvi c,#10
0106 mvi C,10
0108
G
– виконувати, має багато варіантів. G,<to>
– створює тимчасову точку зупинки (breakpoint) за адресою to
, виконується з поточного PC. G<from>,<to>
– те ж, але розпочинає з from
. Інші варіанти – див. документацію2.
S<addr>
– записати значення в пам’ять побайтово, SW<addr>
– по словах. Окрім числових значень, можна передати "text string
(зауважте – лапки тільки на початку, далі їх просто зберігатиме в пам’ять). Завершити – .
, або невірний ввід.
T
– Trace, виконати команду, TW
– те ж, але не заходити у функції. T5
– виконати 5 команд:
#t5
----- A=00 B=0000 D=0000 H=0000 S=0100 P=0100 MVI C,09
----- A=00 B=0009 D=0000 H=0000 S=0100 P=0102 LXI D,0109
----- A=00 B=0009 D=0109 H=0000 S=0100 P=0105 CALL 0005
----- A=00 B=0009 D=0109 H=0000 S=00FE P=0005 JMP E200
----- A=00 B=0009 D=0109 H=0000 S=00FE P=E200 JMP E8A4
*E8A4
#T
----- A=00 B=0009 D=0109 H=0000 S=00FE P=E8A4 XTHL
*E8A5
#T
----- A=00 B=0009 D=0109 H=0108 S=00FE P=E8A5 SHLD FBF2
*E8A8
#T
----- A=00 B=0009 D=0109 H=0108 S=00FE P=E8A8 XTHL
*E8A9
X
– вивести стан процесора:
#X
----- A=00 B=0009 D=011B H=0000 S=0100 P=0108 RET
X<reg-or-flag>
– переглянути або змінити регістр чи прапорець. Прапорці вказуються кодами C,Z,M,E, I, регістри – A,B,D,H,S та P.
#XA
A=00 5
#X
----- A=05 B=0009 D=011B H=0000 S=0100 P=0108 RET
P<addr>[,count]
– pass point
, встановити точку зупинки (breakpoint). Додатково можна вказати – на якій ітерації зупинитися. Зупиняється на команді після тієї, якої стосується точка зупинки.
W<filename>,<from>,<to>
– записати вміст пам’яті у файл.
Інші команди:
F<from>,<to>,<byte>
– заповнити байтом.С<addr>
– викликати підпрограму.C<addr>[,<BC>[,DE]]
– встановлює відповідні пари регістрів перед викликом.H<a>,<b>
– обчислює суму та різницю a i b.L[<from>,<to>]
– вивести дизасембльований код за вказаними адресами.M<block_start>,<block-end>,<dest>
– копіює (Move) блок пам’яті.- Підтримує своєрідні плагіни – Utility. В комплект входить, наприклад, HIST – побудова гістограми частоти виконання фрагментів програми. Детальніше – див. документацію.
U
– команда, аналогічнаT
, не виводить регістри, але дозволяє працювати утилітам.
DDT – Dynamic debugging tool
Це старіший, більш простий, але, в цілому – схожий на SID, зневаджувач. Місцями, більш ‘‘заморочений’’, скажімо – завантажити програму включає виконати команду I, а поті ще R – read. Подробиці – див. документацію3.
D0>ddt hez80.com
DDT VERS 2.2
NEXT PC
0180 0100
-t
C0Z0M0E0I0 A=00 B=0000 D=0000 H=0000 S=0100 P=0100 MVI C,09*0102
-t
C0Z0M0E0I0 A=00 B=0009 D=0000 H=0000 S=0100 P=0102 LXI D,0109*0105
-t
C0Z0M0E0I0 A=00 B=0009 D=0109 H=0000 S=0100 P=0105 CALL 0005*0005
-g
Hello, World!
<Зависає>
D0>ddt
DDT VERS 2.2
-ihez80.com
-R
NEXT PC
0180 0100
-t5
C0Z0M0E0I0 A=00 B=0000 D=0000 H=0000 S=0100 P=0100 MVI C,09
C0Z0M0E0I0 A=00 B=0009 D=0000 H=0000 S=0100 P=0102 LXI D,0109
C0Z0M0E0I0 A=00 B=0009 D=0109 H=0000 S=0100 P=0105 CALL 0005
C0Z0M0E0I0 A=00 B=0009 D=0109 H=0000 S=00FE P=0005 JMP ED00
C0Z0M0E0I0 A=00 B=0009 D=0109 H=0000 S=00FE P=ED00 JMP F3A2*F3A2
-G,109
⌂
Hello, World!
<Зависає>
Виноски
-
Враховуючи, що багато інструментів CP/M генерують саме HEX-файли, які потрім потрібно конвертувати – корисна можливість. ↩