]>
Commit | Line | Data |
---|---|---|
0c4244e5 L |
1 | \r |
2 | \r | |
3 | \r | |
4 | ***************************************\r | |
5 | ***** *****\r | |
6 | ***** DDTZ *****\r | |
7 | ***** *****\r | |
8 | ***************************************\r | |
9 | \r | |
10 | Ein Programmentwicklungs- und Fehlersuch-Werkzeug fuer Z80-\r | |
11 | Mikrocomputer\r | |
12 | \r | |
13 | \r | |
14 | Einfuehrung\r | |
15 | ===========\r | |
16 | \r | |
17 | Das DDTZ ist ein komfortables Werkzeug zum Entwickeln und\r | |
18 | Austesten von Z80-Programmen, sowie zum Ueberpruefen des Zusam-\r | |
19 | menwirkens zwischen Programm und Hardware-System.\r | |
20 | \r | |
21 | Folgende Komponenten sind im DDTZ enthalten:\r | |
22 | \r | |
23 | - Assembler zum Direkt-Eingeben von Programmaenderungen oder\r | |
24 | kleineren vollstaendigen Programmen in Z80-Assemblersprache.\r | |
25 | - Disassembler zum Rueck-Uebersetzen von Maschinenprogrammen.\r | |
26 | - Tracer zum Ausfuehren von Programmen in Einzelschritten und\r | |
27 | zur Programmausfuehrung mit vorgebbaren Abbruchbedingungen.\r | |
28 | - Disk Ein/Ausgaberoutinen erlauben das Lesen und Schreiben von\r | |
29 | Files.\r | |
30 | - Ausdruck-Interpreter erlaubt bei allen Kommandos die Verwen-\r | |
31 | dung von arithmetischen und logischen Ausdruecken mit HEX-,\r | |
32 | Dezimal-, Binaer- und ASCII-Werten, sowie Speicher- und\r | |
33 | Registerinhalten und Variablen.\r | |
34 | \r | |
35 | Das DDTZ laeuft unter dem CP/M-Betriebssystem (Digital\r | |
36 | Research, ab Version 1.4) und anderen dazu kompatiblen Sys-\r | |
37 | temen. Es benoetigt eine Z80-CPU und belegt 8,5 KBytes Spei-\r | |
38 | cher.\r | |
39 | Da Konsol-Eingaben nur ueber die CP/M-Stringeingabefunktion\r | |
40 | erfolgen, ist das DDTZ auch mit dem CP/M-Hilfsprogramm XSUB\r | |
41 | lauffaehig.\r | |
42 | \r | |
43 | Der Gebrauch des DDTZ\r | |
44 | =====================\r | |
45 | \r | |
46 | Der Aufruf\r | |
47 | ----------\r | |
48 | \r | |
49 | Auf Ihrer DDTZ-Originaldiskette befindet sich die File\r | |
50 | DDTZ.COM. Bevor Sie diese das erste Mal aufrufen, kopieren Sie\r | |
51 | bitte die File auf eine andere Diskette, die Sie dann zum\r | |
52 | Arbeiten benutzen. Bewahren Sie die Originaldiskette an einem\r | |
53 | sicheren Ort auf und benutzen Sie sie nur zum Anfertigen\r | |
54 | weiterer Arbeitsdisketten. Verwenden Sie also nie das Original\r | |
55 | als Arbeitsdiskette.\r | |
56 | \r | |
57 | Das DDTZ wird entsprechend den CP/M-Regeln folgendermassen\r | |
58 | aufgerufen:\r | |
59 | \f\r | |
60 | DDTZ\r | |
61 | oder\r | |
62 | DDTZ d:filename.ext\r | |
63 | \r | |
64 | Bei beiden Aufrufen laedt das Disk Operating System das DDTZ\r | |
65 | bei Adresse 100H beginnened in den Speicher. Das DDTZ verlagert\r | |
66 | sich danach automatisch direkt vor das BDOS und ueberschreibt\r | |
67 | dabei den CCP. Dadurch wird der Speicher ab 100H fuer das zu\r | |
68 | untersuchende Programm frei. Der Adressteil des Befehls JP BDOS\r | |
836776f5 | 69 | auf Adresse 5 wird erniedrigt, um dem Anwenderprogramm die\r |
0c4244e5 L |
70 | durch das DDTZ verringerte Speichergroesse mitzuteilen. Der\r |
71 | urspruenglich vom DDTZ belegte Speicher wird daraufhin mit\r | |
72 | Nullen geloescht.\r | |
73 | Wurde im Aufruf ein Filename angegeben, so laedt das DDTZ die\r | |
74 | File in den Speicher.\r | |
75 | Nach Ausgabe des Prompt-Zeichens '>' ist das DDTZ betriebs-\r | |
76 | bereit.\r | |
77 | \f\r | |
78 | Die Kommandos\r | |
79 | -------------\r | |
80 | \r | |
81 | Jede Taetigkeit des DDTZ, z.B. Lesen einer File, Disassemblie-\r | |
82 | ren eines Programm-Abschnittes usw. wird mit einem Kommando\r | |
836776f5 | 83 | eingeleitet. Kommandos koennen immer dann eingegeben werden,\r |
0c4244e5 L |
84 | wenn das DDTZ mit dem Prompt-Zeichen '> ' oder '>>' seine\r |
85 | Bereitschaft anzeigt.\r | |
86 | \r | |
87 | Kommandos beginnen mit einem der Zeichen '@' bis 'Z', eventuell\r | |
88 | gefolgt von weiteren optionalen Buchstaben, sowie Argumenten.\r | |
89 | Bei einigen Kommandos sind alle Argumente obligat, d.h. alle\r | |
836776f5 | 90 | Argumente muessen angegebnen werden. Bei anderen Kommandos sind\r |
0c4244e5 L |
91 | jedoch die Argumente alle oder zum Teil optional, d.h. sie\r |
92 | koennen entweder explizit angegeben werden, duerfen aber auch\r | |
93 | weggelassen werden. Wird eine optionale Anfangsadresse wegge-\r | |
94 | lassen, so wird die Adresse benutzt, bei der das Kommando\r | |
95 | zuletzt beendet wurde. Wird eine optionale Endadresse weggelas-\r | |
96 | sen, so wird das Kommando (z.B. L oder D) so lange ausgefuehrt,\r | |
97 | bis etwa ein Bildschirm vollgeschrieben ist. Ein weggelassenes\r | |
98 | optionales Argument, hinter dem weitere Argumente angegeben\r | |
99 | werden sollen, muss durch ein Komma ersetzt werden. Optionale\r | |
100 | Elemente sind in den folgenden Kommando-Beschreibungen durch\r | |
101 | eckige Klammern gekennzeichnet (die Klammern sind also nicht\r | |
102 | mit einzugeben). Zwischen zwei Argumenten muss ein Blank, ein\r | |
103 | Tab (^I) oder ein Komma stehen.\r | |
104 | \r | |
105 | Argumente werden im allgemeinen als HEX-Zahlen eingegeben,\r | |
106 | duerfen aber auch als Dezimal- und Binaerzahlen, als ASCII-\r | |
107 | Werte, Variablen oder in Form arithmetischer Ausdruecke einge-\r | |
108 | geben werden. HEX-Zahlen sind im DDTZ Zahlen, die aus den\r | |
109 | Ziffern 0 bis 9 und den Buchstaben A bis F (oder a bis f)\r | |
110 | bestehen und nicht durch weitere Zusaetze (z.B. Buchstabe H)\r | |
111 | als HEX-Zahl gekennzeichnet sein muessen. Im Gegensatz zu den\r | |
112 | meisten Assemblern sind HEX-Zahlen, deren erstes Zeichen ein\r | |
113 | Buchstabe ist, im DDTZ erlaubt. Dezimal-Zahlen werden zur\r | |
114 | Unterscheidung mit einem Punkt abgeschlossen und Binaerzahlen\r | |
115 | tragen am Ende ein doppeltes Anfuehrungszeichen. Naeheres zur\r | |
116 | Eingabe von Zahlen, Variablen und Ausdruecken finden Sie bei\r | |
117 | der Beschreibung des H-Kommandos und im Anhang.\r | |
118 | \r | |
119 | Bei Kommandos, die eine Start- und eine Endadresse erfordern,\r | |
120 | kann anstelle der Endadresse auch der Buchstabe 'S', gefolgt\r | |
121 | von einer Laengenangabe verwendet werden.\r | |
122 | z.B. bedeutet D 1000 S 100 oder D1000s100\r | |
123 | das selbe wie D 1000 10FF oder d1000,10ff\r | |
124 | \r | |
125 | Bei allen Eingaben ist es einerlei, ob Gross- oder Kleinbuch-\r | |
126 | staben verwendet werden. Die einzige Ausnahme ist die Eingabe\r | |
127 | von ASCII-Zeichen und Zeichenketten.\r | |
128 | \f\r | |
129 | Die Wiederhol-Funktion\r | |
130 | ----------------------\r | |
131 | \r | |
132 | Beim Gebrauch des DDTZ kommt es oefters vor, dass man einen\r | |
133 | Befehl nicht nur einmal benutzt und danach einen anderen Befehl\r | |
134 | anwendet, sondern das man ein und denselben Befehl mehrmals\r | |
135 | wiederholen will. Moechte man z.B. ein Programm in Einzel-\r | |
136 | schritten ausfuehren lassen, um nach jedem Schritt die Register\r | |
137 | zu inspizieren, so waere fuer jeden Schritt die Eingabe eines\r | |
138 | Trace-Kommandos ohne Argumente notwendig (also der Buchstabe\r | |
139 | 'T' und die Return-Taste). Ein weiteres Beispiel ist das Ueber-\r | |
140 | pruefen der Hardware eines Ausgabeports: Will man mit einem\r | |
141 | Oszilloskop Signale eines Ausgabeports ueberpruefen, so waere\r | |
142 | es sehr laestig, zur wiederholten Ausgabe eines Testbytes an\r | |
143 | den Port waehrend der Beobachtung des Oszilloskops immer wieder\r | |
144 | das 'O'-Kommando eingeben zu muessen.\r | |
145 | Aus diesen Gruenden besitzt das DDTZ die Wiederholfunktion.\r | |
146 | Diese bewirkt, dass bei einer leeren Eingabe (nur Return-Taste)\r | |
147 | das letzte Kommando ohne Argumente wiederholt wird. Die Bereit-\r | |
148 | schaft der Wiederhol-Funktion wird durch einen doppelten Prompt\r | |
149 | '>>' anstelle des einfachen '> ' angezeigt.\r | |
150 | \f\r | |
151 | Die Kommandos des DDTZ\r | |
152 | ======================\r | |
153 | \r | |
154 | Im Folgenden werden alle Kommandos des DDTZ erklaert und mit\r | |
155 | Beispielen verdeutlicht. Im Bereich der Computertechnik hat es\r | |
156 | sich international eingebuergert, englische Bezeichnungnen zu\r | |
157 | benutzen. Deshalb sind auch beim DDTZ die Kommandos Abkuer-\r | |
158 | zungen englischer Woerter. Diese sind neben einer deutschen\r | |
159 | Bezeichnung am Anfang jeder Kommando-Erklaerung mit angegeben.\r | |
160 | Zur Einarbeitung empfiehlt es sich, an dieser Stelle des DDTZ\r | |
161 | schon einmal zu starten und die im kommenden Abschnitt erklaer-\r | |
162 | ten Kommandos der Reihe nach auszuprobieren. Assemblieren Sie\r | |
163 | ein simples Testprogramm mit dem A-Kommando,\r | |
164 | \r | |
165 | z.B.: > A100\r | |
166 | 0100 NOP ld a,0\r | |
167 | 0102 NOP dec a\r | |
168 | 0103 NOP jp nz,102\r | |
169 | 0106 NOP jp 0\r | |
170 | 0109 NOP .\r | |
171 | \r | |
172 | Listen Sie das Programm dann mit dem L-Kommando in disassem-\r | |
173 | blierter Form aus, setzen Sie einen Breakpoint auf Adresse 0\r | |
174 | mit dem B-Kommando und starten Sie es mit dem G-Kommando usw.\r | |
175 | Nach einigem Ausprobieren und Spielen mit dem DDTZ werden Sie\r | |
176 | sicher schnell die vielen Moeglichkeiten dieses komfortablen\r | |
177 | Werkzeugs kennen und nutzen koennen.\r | |
178 | \r | |
179 | @\r | |
180 | -\r | |
181 | \r | |
182 | Anzeigen und eventuell Aendern des Displacement-Registers.\r | |
183 | (examin [substitude] displacement register @)\r | |
184 | \r | |
185 | Der derzeitige Wert wird angezeigt und ein neuer - angefor-\r | |
186 | dert. Eine leere Eingabe (nur Return-Taste) belaesst den alten\r | |
187 | Wert.\r | |
188 | \r | |
189 | Ein mit dem DDTZ zu bearbeitendes Programm kann natuerlich nur\r | |
190 | innerhalb des verfuegbaren Adressraums in den Speicher geladen\r | |
191 | werden, muss also mindestens bei Adresse 100H beginnen und darf\r | |
192 | sich nicht mit dem DDTZ oder dem System ueberlappen. Um ein\r | |
193 | Programm, das beispielsweise bei Adresse 0 oder F000H beginnt,\r | |
194 | zu bearbeiten, muss dieses entsprechend verschoben in den Spei-\r | |
195 | cher geladen werden. Damit beim Disassemblieren, Modifizieren\r | |
196 | mit Hilfe des eingebauten Assemblers, Auslisten in HEX/ASCII\r | |
197 | usw. trotzdem die korrekten Adressen angezeigt werden, ist ein\r | |
198 | Displacement-Register @ (Verschiebungsregister) vorhanden,\r | |
199 | dessen Wert auf die Differenz Solladresse minus Ladeadresse\r | |
200 | gesetzt werden kann. Ist @ ungleich Null, so zeigt das DDTZ\r | |
201 | ueberall, wo Adressen ausgelistet werden, die Adressen auch in\r | |
202 | der Form @xxxx an, wobei xxxx die Solladresse des verschobenen\r | |
203 | Programms ist.\r | |
204 | Eine andere Anwendungsmoeglichkeit des Displacement-Registers\r | |
205 | ist das Bearbeiten von Subroutinen, die mit Hilfe eines Linkers\r | |
206 | in ein Programm eingebunden wurden, und zu denen im Allgemeinen\r | |
207 | nur ein Listing beginnend ab Adresse 0 vorhanden ist. In diesem\r | |
208 | Fall wird das @-Register auf die aus der Symboltabelle des\r | |
209 | Linkers zu entnehmende Anfangsadresse der Routine gesetzt.\r | |
210 | Jeder Adresse xxxx im Listing entspricht dann die Adresse @xxxx\r | |
211 | im Speicher.\r | |
212 | Achtung: Programme, die (ohne Linker) im Speicher verschoben\r | |
213 | wurden, koennen zwar z.B. disassembliert oder modifiziert,\r | |
214 | jedoch nicht ausgefuehrt werden.\r | |
215 | \f\r | |
216 | A\r | |
217 | -\r | |
218 | Assemblieren von Z80-Befehlen.\r | |
219 | (Assemble Zilog Z80 mnemonics)\r | |
220 | \r | |
221 | Beginnend bei der optionalen Anfangsadresse werden als Z80-\r | |
222 | Mnemonics eingegebene Befehle direkt in den Speicher assem-\r | |
223 | bliert. Das DDTZ zeigt jeweils den an dem betreffenden Spei-\r | |
224 | cherplatz bereits stehenden Befehl zur Kontrolle an, worauf ein\r | |
225 | neuer Z80-Befehl eingegeben werden oder mit einer leeren Ein-\r | |
226 | gabe zum naechsten Befehl uebergegangen werden kann. Die Ein-\r | |
227 | gabe eines Minuszeichens bewirkt ein Ruecksetzen auf den vor-\r | |
228 | letzten Befehl zur Kontrolle oder Korrektur, ein Punkt beendet\r | |
229 | das Assemblieren. Die Form der Befehle ist Zilog-kompatibel mit\r | |
230 | einigen Erweiterungen:\r | |
231 | Statt ADD A,... SBC A,... usw. koennen auch Kurzformen ADD ...\r | |
232 | SBC ... usw. benutzt werden. Bei den Befehlen IN A,(ausdruck)\r | |
233 | und OUT (ausdruck),A koennen die Klammern weggelassen werden.\r | |
234 | Der Opcode ist von dem Argument durch Tabs oder Blanks ge-\r | |
235 | trennt.\r | |
236 | Auf die Adresse des Z80-Befehls kann - wie bei Assemblern\r | |
237 | ueblich - mittels des $-Zeichens Bezug genommen werden, z.B.\r | |
238 | ist der Befehl JR Z,$+4 identisch mit JR 204, wenn der Befehl\r | |
239 | bei Adresse 200 steht.\r | |
240 | Achtung: Da beim DDTZ HEX-Zahleneingaben ohne fuehrende Dezi-\r | |
241 | malziffer zulaessig sind, koennen beim Assemblieren Zweideut-\r | |
242 | igkeiten entstehen oder Fehler unerkannt bleiben, z.B. soll das\r | |
243 | Register A mit dem Hex-Wert 0B geladen werden, so ist LD A,0B\r | |
244 | einzugeben, da mit LD A,B das Register B angesprochen wird. Der\r | |
245 | Befehl LD BC,DE wird als LD BC,0DE interpretiert, da es einen\r | |
246 | Z80-Befehl, der das BC-Register aus dem DE-Register laedt,\r | |
247 | nicht gibt.\r | |
248 | \r | |
249 | B\r | |
250 | -\r | |
251 | \r | |
252 | Anzeigen aller Breakpoints.\r | |
253 | (display all breakpoints)\r | |
254 | \r | |
255 | Die Adressen, Wiederholungszaehler und Bedingungen aller ge-\r | |
256 | setzten Breakpoints werden aufgelistet.\r | |
257 | \r | |
258 | \r | |
259 | B breakp [breakp..]\r | |
260 | -------------------\r | |
261 | \r | |
262 | Breakpoints setzen.\r | |
263 | (set breakpoints)\r | |
264 | \r | |
265 | Zum Austesten eines Programms ist es erforderlich, das Programm\r | |
266 | nicht nur starten zu koennen, sondern der Ablauf des Programms\r | |
267 | muss sich auch bequem verfolgen und beobachten lassen. Neben\r | |
268 | den Tracen (siehe Kommandos T und C) ist das Setzen von Break-\r | |
269 | points (Unterbrechungspunkten) eine sehr komfortable Moeglich-\r | |
270 | keit, den Programmablauf zu verfolgen.\r | |
271 | Ein Breakpoint wird auf das erste Byte (den Opcode) eines\r | |
272 | Maschinenbefehls gesetzt und bewirkt, dass der Programmablauf\r | |
273 | unterbrochen wird, sobald der Programmzaehler bei dieser Adres-\r | |
274 | se angekommen ist. Man kann dann die Registerinhalte inspizie-\r | |
275 | ren, Speicherinhalte kontrollieren usw., um danach den Pro-\r | |
276 | grammablauf fortzusetzen oder an einer anderen Stelle fortzu-\r | |
277 | fahren.\r | |
278 | Neben der Adresse, die bestimmt, wo der Breakpoint zu setzen\r | |
279 | ist, koennen noch zusaetzliche Optionen gewaehlt werden.\r | |
280 | \f\r | |
281 | Ein Breakpoint wird in folgender Form definiert:\r | |
282 | [R] adresse [:zaehler] [I bedingung]\r | |
283 | Der optionale Buchstabe R bedeutet, dass jedesmal beim Errei-\r | |
284 | chen des Breakpoints die CPU-Registerinhalte ausgelistet werden\r | |
285 | sollen, auch dann, wenn wegen eines Zaehlers oder einer Bedin-\r | |
286 | gung der Breakpoint keinen Programmstopp bewirkt.\r | |
287 | Die Adresse ist ein beliebiger Ausdruck, der auf einen Opcode\r | |
288 | zeigen muss.\r | |
289 | Der Zaehler kann auf einen Wert n<>1 gesetzt werden und be-\r | |
290 | wirkt, dass jedesmal, wenn die Breakpointadresse durchlaufen\r | |
291 | wird, der Zaehler um Eins erniedrigt wird und erst beim n-ten\r | |
292 | Mal ein Programmstop erfolgt. Er steht dann auf 1.\r | |
293 | Eine Bedingung (der Buchstabe I fuer 'if'='wenn', gefolgt von\r | |
294 | einem Ausdruck) bestimmt, ob ein Programmstop bzw. ein Dekre-\r | |
295 | mentieren des Wiederholungs-Zaehlers erfolgen soll.\r | |
296 | z.B.: > B R 200 I ^A=0\r | |
297 | listet jedesmal, wenn Adresse 200 angelaufen wird, die\r | |
298 | Register aus und unterbricht den Programmlauf, falls das\r | |
299 | A-Register den Wert 0 hat.\r | |
300 | > B Y0:16., R $ I0\r | |
301 | setzt zwei Breakpoints:\r | |
302 | 1. Wird 16 mal die Adresse, die in der Variablen Y0\r | |
303 | steht, angelaufen, so wird das Programm unterbrochen.\r | |
304 | 2. Wird die Adresse, auf der der Programmzaehler zum\r | |
305 | Zeitpunkt der Breakpoint-Eingabe stand, durchlaufen,\r | |
306 | so werden die Register ausgelistet, aber nicht unter-\r | |
307 | brochen (Bedingung immer 'falsch').\r | |
308 | \r | |
309 | Um den Benutzer zusaetzliche Eingriffsmoeglichkeiten zu geben,\r | |
310 | werden alle Breakpoints, auch mit Zaehlern ungleich Null oder\r | |
311 | unerfuellten Bedingungen, trotzdem aktiv, wenn eine beliebige\r | |
312 | Taste an der Konsole gedrueckt wird.\r | |
313 | Wird ein Breakpoint auf eine Adresse gesetzt, auf der sich\r | |
314 | bereits ein Breakpoint befindet, so wird der bereits vorhandene\r | |
315 | automatisch geloescht.\r | |
316 | Achtung: Breakpoints koennen nur im RAM gesetzt werden; in\r | |
317 | Programmen die in ROM's oder EPROM's enthalten sind, sind\r | |
318 | Breakpoints nicht moeglich (Siehe folgenden Abschnitt).\r | |
319 | \r | |
320 | Interne Breakpointbehandlung des DDTZ:\r | |
321 | \r | |
322 | Wird ein Programm mit dem G-Kommando gestartet, so ersetzt das\r | |
323 | DDTZ alle Opcodes, auf die eine Breakpoint-Adresse zeigt, durch\r | |
324 | einen Restart-Befehl RST n und bewahrt die Opcodes auf. In die\r | |
325 | Adresse n, auf die der RST-Befehl springt, wird ein Sprungbe-\r | |
326 | fehl eingesetzt, der in den Breakpoint-Handler des DDTZ fuehrt.\r | |
327 | Nach einem Programmstop werden die Opcodes wieder eingesetzt,\r | |
328 | sodass das Programm immer dann, wenn es dem Benutzer zugaeng-\r | |
329 | lich ist, unmodifiziert ist. Als RST-Adresse ist 38H voreinge-\r | |
330 | stellt. Ist die Adresse 38H jedoch fuer andere Zwecke bereits\r | |
331 | vergeben, so kann der RST-Befehl geaendert werden, z.B. auf\r | |
332 | 30H:\r | |
333 | > AT4\r | |
334 | xxx9 RST 38 rst 30\r | |
335 | xxxA xxx .\r | |
336 | \r | |
337 | \f\r | |
338 | BX\r | |
339 | --\r | |
340 | \r | |
341 | Loeschen aller Breakpoints.\r | |
342 | (clear all breakpoints)\r | |
343 | \r | |
344 | BX adresse [adresse..]\r | |
345 | ----------------------\r | |
346 | \r | |
347 | Loeschen der Breakpoints an den angegebenen Adressen.\r | |
348 | (clear breakpoints)\r | |
349 | \r | |
350 | C[N][J] ]befehlsanzahl]\r | |
351 | C[N][J] W ausdruck\r | |
352 | C[N][J] U ausdruck\r | |
353 | ------------------\r | |
354 | \r | |
355 | Tracen ueber CALLs [ohne Ausgabe] [nue Sprungbefehle]\r | |
356 | / ..solange.. / ..bis..\r | |
357 | (trace over CALLs [No list] [Jumps only] /..While../..Until..\r | |
358 | \r | |
359 | Tracen wie mit dem T-Kommando, nur mit dem Unterschied, dass\r | |
360 | eine Subroutine wie ein einzelner Maschinenbefehl gehandhabt\r | |
361 | wird. Bei jedem CALL-Befehl wird also die aufgerufene Routine\r | |
362 | in Echtzeit abgearbeitet und erst bei Erreichen des auf den\r | |
363 | CALL-Befehl folgenden Befehls wird wieder in den Trace-Modus\r | |
364 | zurueckgekehrt. (siehe T-Kommando).\r | |
365 | Achtung: Das C-Kommando funktioniert nur dann, wenn die Subrou-\r | |
366 | tine nach ihrer Beendigung zu der auf den CALL-Befehl folgenden\r | |
367 | Adresse zurueckkehrt. Ein Programm der Form\r | |
368 | CALL SUBR\r | |
369 | DB ARG\r | |
370 | mit einer Routine SUBR, die nach Abarbeitung hinter dem Argu-\r | |
371 | ment ankommt, kann nicht mit C bearbeitet werden.\r | |
372 | \r | |
373 | \r | |
374 | D [startadr] [endadr]\r | |
375 | ---------------------\r | |
376 | \r | |
377 | Auslisten des Speichers in HEX und ASCII\r | |
378 | (Display memory in hex and ASCII)\r | |
379 | \r | |
380 | Der Speicher-Inhalt wird beginnend bei der Startadresse bis zur\r | |
381 | Endadresse in HEX und ASCII auf der Konsole ausgelistet. Die\r | |
382 | ASCII-Anzeige ignoriert das Bit 7 des jeweiligen Bytes. Ist der\r | |
383 | Wert eines Bytes nicht als ASCII-Zeichen druckbar, so wird\r | |
384 | statt dessen ein Punkt ausgegeben.\r | |
385 | \f\r | |
386 | F-Kommandozeile\r | |
387 | ---------------\r | |
388 | \r | |
389 | File-Cointrolblock und CP/M-Kommandozeile spezifizieren.\r | |
390 | (specify Filename and command line)\r | |
391 | \r | |
392 | Dieses Kommando hat zwei Anwendungen:\r | |
393 | \r | |
394 | 1. Vor einem Einlesen oder Ausschreiben einer File vom DDTZ aus\r | |
395 | wird mit dem F-Kommando der Filename angegeben.\r | |
396 | z.B. Einlesen eines zu testenden Kopier-Programms mit dem\r | |
397 | Namen 'COPY.COM' von der Diskette A:\r | |
398 | > Fa:copy.com\r | |
399 | > R\r | |
400 | 2. Soll ein Programm ausgetestet werden, das beim Aufruf vom\r | |
401 | CP/M aus eine Kommandozeile im Kommandopuffer bei 80H und\r | |
402 | File-Control-Blocks bei 5CH und 6CH erwartet, so kann mit\r | |
403 | dem F-Kommando des DDTZ der CP/M-Aufruf simuliert werden.\r | |
404 | z.B. Das im obigen Beispiel eingelesene Programm soll so ab-\r | |
405 | laufen als sei es vom CP/M aus mit dem Aufruf\r | |
406 | A>COPY A:DESTIN.*=B:SOURCE.*\r | |
407 | gestartet worden. Die Kommandozeile wird deshalb vor\r | |
408 | dem Programmablauf mit\r | |
409 | > FA:DESTIN.*=B:SOURCE.*\r | |
410 | eingegeben.\r | |
411 | \r | |
412 | \r | |
413 | G [startadr] [;breakp..]\r | |
414 | ------------------------\r | |
415 | \r | |
416 | Starte ein geladenes Programm, eventuell mit temporaeren Breakpoints.\r | |
417 | (Go [to start] [with temporary breakpoints])\r | |
418 | \r | |
419 | Wird eine Startadresse angegeben, so wird der Programmzaehler\r | |
420 | des Z80 auf diese Adresse gesetzt, andernfalls wird bei dem\r | |
421 | letzten Programmzaehlerstand fortgefahren. Im G-Kommando koen-\r | |
422 | nen temporaere Breakpoints angegeben werden. Sie werden in der\r | |
423 | gleichen Form wie die permanenten Breakpoints beim B-Kommando\r | |
424 | spezifiziert und haben auch die gleiche Wirkung mit dem Unter-\r | |
425 | schied, dass bei einem Programmstop an einem der temporaeren\r | |
426 | oder permanenten Breakpoints die temporaeren automatisch ge-\r | |
427 | loescht werden.\r | |
428 | z.B. Vollstaendiges Abarbeiten eines CP/M-Programms, das mit\r | |
429 | JP 0 endet:\r | |
430 | > GL;0\r | |
431 | \r | |
432 | H\r | |
433 | -\r | |
434 | \r | |
435 | Groesse und maximale Groesse von Files anzeigen.\r | |
436 | (display High and maximal size of files)\r | |
437 | \r | |
438 | Die hoechste von der zuletzt eingelesenen File belegte Adresse\r | |
439 | wird angezeigt, sowie die hoechste von irgendeiner der einge-\r | |
440 | lesenen Files belegte Adresse. Erstere ist auch in der Varia-\r | |
441 | blen H, letztere in der Variablen M enthalten. (Siehe auch W-\r | |
442 | und R-Kommando)\r | |
443 | \f\r | |
444 | H ausdruck\r | |
445 | H ausdruck ausdruck\r | |
446 | -------------------\r | |
447 | \r | |
448 | Berechnen eines Ausdrucks / Summe und Differenz zweier Ausdrucke.\r | |
449 | (compute expressions / Hex and other sum and difference)\r | |
450 | \r | |
451 | Wird ein Ausdruck angegeben, so zeigt das DDTZ dessen Ergebnis\r | |
452 | an, werden zwei Ausdruecke angegeben, so werden deren Summe und\r | |
453 | Differenz angezeigt. Ergebnisse werden in HEX, als negative\r | |
454 | HEX-Zahl, in Dezimal, als negative Dezimalzahl, in Binaer und\r | |
455 | das niederwertige Byte zusaetzlich als ASCII-Zeichen darge-\r | |
456 | stellt. Nicht druckbare ASCII-Zeichen werden dabei als Control-\r | |
457 | Zeichen in der Form Buchstabe minus '@' angezeigt.\r | |
458 | \r | |
459 | Wie Ausdruecke formuliert werden, ist der Uebersichtlichkeit\r | |
460 | halber im Anhang angegeben.\r | |
461 | \r | |
462 | z.B.: Was ist die Endadresse eines 17 KByte langen Programms,\r | |
463 | das bei Adresse 100H beginnt?\r | |
464 | > H17.*1024.+100\r | |
465 | 4500 -BB00 17664. -47872. 01000101"00000000" '@'-'@'\r | |
466 | Der freie Speicher beginnt also bei 4500H.\r | |
467 | z.B.: Beim Disassemblieren eines unbekannten Programms wird\r | |
468 | eine Subroutine gefunden, die nacheinander mit den Werten\r | |
469 | D8F0H, FC18H, FF9CH usw. in den Registern aufgerufen\r | |
470 | wird. Was kann das fuer eine Routine sein?\r | |
471 | > HD8F0\r | |
472 | D8F0 -2710 55536. -10000. 11011000"11110000" 'p'.\r | |
473 | > H fc18\r | |
474 | FC18 -03E8 64536. -1000 11111100"00011000" 'X'-'@'\r | |
475 | > H FF9CH\r | |
476 | FF9C -0064 65436. -100 ...\r | |
477 | Bei den Werten handelt es sich offenbar um dezimal -\r | |
478 | 10000, -1000 usw.; die Routine hat also wahrscheinlich\r | |
479 | etwas mit einer Binaer-zu-Dezimal-Umrechnung zu tun.\r | |
480 | \r | |
481 | I [port]\r | |
482 | --------\r | |
483 | \r | |
484 | Einlesen eines Daten-Bytes von einem Port.\r | |
485 | (input a byte from port)\r | |
486 | \r | |
487 | Zum Austesten der Computer-Hardware koennen mit diesem Kommando\r | |
488 | Bytes von Ports eingelesen und in HEX und binaer angezeigt\r | |
489 | werden. Wird die Portadresse nicht angegeben, so wird der\r | |
490 | \r | |
491 | zuletzt in einem frueheren I-Kommando angegebene Port ange-\r | |
492 | sprochen. Die Moeglichkeit, bei Z80-I/O-Befehlen hardwareseitig\r | |
493 | auch die Adressleitungen A15 bis A8 zur Informationsuebertra-\r | |
494 | gung mitzuverwenden, ist im DDTZ realisiert. DDTZ-intern wird\r | |
495 | die Portadresse als Zwei-Byte-Wort in das BC-Register\r | |
496 | geladen und mit IN A,(C) der Port gelesen.\r | |
497 | Bei diesem Kommando zeigt zeigt sich besonders der Vorteil der\r | |
498 | Wiederholungsfunktion des DDTZ: Nachdem einmal das I-Kommando\r | |
499 | explizit gegeben wurde, kann man, waehrend man verschiedene\r | |
500 | Pegel an die Anschluesse des Ports anlegt, durch einfaches\r | |
501 | Druecken der Return-Taste die Portabfrage wiederholen.\r | |
502 | \f\r | |
503 | L [startadr] [endadr]\r | |
504 | ---------------------\r | |
505 | \r | |
506 | Listen eines Speicherbereichs in Z80-Mnemonics.\r | |
507 | (List disassembled code)\r | |
508 | \r | |
509 | Dieses Kommando disassembliert im Speicher stehende Programme.\r | |
510 | (Beispiel: siehe Q-Kommando)\r | |
511 | \r | |
512 | \r | |
513 | M[V] startadr endadr zieladr\r | |
514 | ----------------------------\r | |
515 | \r | |
836776f5 L |
516 | Umladen eines Speicherbereichs in einen anderen, eventuell ver-\r |
517 | gleichen. (Move memory [and verify])\r | |
0c4244e5 L |
518 | \r |
519 | Der Speicherinhalt beginnend bei der angegebenen Startadresse\r | |
520 | bis (einschliesslich) zur angegebenen Endadresse wird in einen\r | |
521 | anderen Bereich, beginnend bei der angegebenen Zieladresse,\r | |
522 | kopiert. Wird der optionale Buchstabe V gegeben, so wird die\r | |
523 | Kopie mit dem Original verglichen und etwaige Diffrenzen in HEX\r | |
524 | ausgelistet. Differenzen koennen bei defektem Speicher ent-\r | |
525 | stehen oder dann, wenn versehentlich in Bereiche kopiert wird,\r | |
526 | die kein RAM enthalten. Das M-Kommando wird auch dann korrekt\r | |
527 | ausgefuehrt, wenn der Quell- und der Zielbereich gegenseitig\r | |
528 | ueberlappen. In diesem Fall ist ein Vergleichen allerdings\r | |
529 | nicht moeglich, da beim Kopieren ja ein Teil des Quellbereichs\r | |
530 | ueberschrieben wird.\r | |
531 | Achten Sie bei diesem Kommando besonders darauf, dass Sie nicht\r | |
532 | das DDTZ oder das Disk Operating System versehentlich ueber-\r | |
533 | schreiben.\r | |
534 | \r | |
535 | O [byte] [port]\r | |
536 | ---------------\r | |
537 | \r | |
538 | Ausgeben eines Datenbytes an einen Ausgabeport.\r | |
539 | (Output a byte to a port)\r | |
540 | \r | |
541 | Zum Austesten der Computer-Hardware koennen mit diesem Kommando\r | |
542 | Bytes an Ports des Computersystems ausgegeben werden.\r | |
543 | Achtung: Im Gegensatz zu dem Z80-Befehl OUT port,byte ist hier\r | |
544 | aus folgendem Grund erst das Datenbyte und dann die Portadresse\r | |
545 | anzugeben:\r | |
546 | Die Portadresse kann weggelassen werden, falls ein Datenbyte an\r | |
547 | den selben Port, wie in einem vorherigen O-Kommando spezifi-\r | |
548 | ziert, ausgegeben werden soll.\r | |
549 | Die Moeglichkeit, bei Z80-I/O-Befehlen hardwareseitig auch die\r | |
550 | Adressleitungen A15 bis A8 zur Informationsuebertragung mitzu-\r | |
551 | verwenden, ist im DDTZ realisiert. DDTZ-intern wird die Port-\r | |
552 | adresse als Zwei-Byte-Wort in das BC-Register geladen und mit\r | |
553 | OUT (C),A das Byte an den Port ausgegeben.\r | |
554 | \f\r | |
555 | Q[J] startadr endadr bytes\r | |
556 | --------------------------\r | |
557 | \r | |
558 | Durchsuchen des Speichers nach einer gegebenen Folge von Bytes.\r | |
559 | (Query memory for a byte string [justified])\r | |
560 | \r | |
561 | Der Speicher wird beginnend bei der angegebnen Startadresse und\r | |
562 | endet (einschliesslich) bei der angegebenen Endadresse auf eine\r | |
563 | angegebene Byte-Folge hin durchsucht. Fundstellen werden wie\r | |
564 | beim D-Kommando in HEX und ASCII ausgelistet. Das erste ge-\r | |
565 | suchte Byte steht dabei jeweils am linken Bildrand. Wird der\r | |
566 | optionale Buchstabe J gegeben, so werden jeweils noch 8 vorher-\r | |
567 | gehende Bytes mit ausgelistet, sodass die gesuchte Byte-Folge\r | |
568 | in der Bildmitte beginnt. Die Byte-Folge kann wie beim S-\r | |
569 | Kommando eine Folge von HEX-Zahlen, Ausdruecken, Worten und\r | |
570 | Text-Strings sein.\r | |
571 | \r | |
572 | z.B. Ein zu untersuchendes Programm gibt an einem bestimmten\r | |
573 | Punkt seines Ablaufes aus unbekannter Ursache die Meldung\r | |
574 | "Hardware error" auf die Konsole aus und stoppt. Woher\r | |
575 | kommt diese Meldung ?\r | |
576 | > QJ l h 'Hardwar'\r | |
577 | 1502 73 74 65 64 24 4E 6F 20 48 61 72 64 77 61 ...\r | |
578 | Der Text "Hardware error beginnt also bei Adresse 150A. Wo\r | |
579 | wird er ausgegeben ?\r | |
580 | > QJ l h w150a\r | |
581 | >\r | |
582 | (Keine Meldung) Auf die Adresse wird also nicht direkt\r | |
583 | zugegriffen. Vielleicht haben wir Glueck, indem wir\r | |
584 | suchen, wo 'No Hardware error" ausgegeben wird. Dieser\r | |
585 | Text beginnt bei 1507H.\r | |
586 | > QJ l h w1507\r | |
587 | 08FE 00 00 00 00 00 AF C9 21 07 15 CD 65 07 30 ...\r | |
588 | > L8FE+7\r | |
589 | 0905 LD HL,1507\r | |
590 | 0908 CALL 0765\r | |
591 | 090B JR NC,0910\r | |
592 | 090D INC HL\r | |
593 | 090E INC HL\r | |
594 | 090F INC HL\r | |
595 | 0910 CALL 0654\r | |
596 | Die Subroutine, die bei Adresse 908 aufgerufen wird,\r | |
597 | fuehrt also offenbar einen Test durch und meldet einen\r | |
598 | Fehler im Carry-Flag. Der Text wird dann bei Adresse 910\r | |
599 | ausgegeben.\r | |
600 | \r | |
601 | R [displacement]\r | |
602 | ----------------\r | |
603 | \r | |
604 | Einlesen einer Binaer- oder HEX-File in den Speicher, eventuell\r | |
605 | verschoben.\r | |
606 | (Read a binary or hex file [add displacement])\r | |
607 | \r | |
608 | Eine File, deren Name mit dem F-Kommando spezifiziert worden\r | |
609 | sein muss, wird von der Diskette in den Speicher eingelesen.\r | |
610 | Eine File, deren Name mit ".HEX" endet, wird als Intel-HEX-File\r | |
611 | interpretiert; die Daten werden bei den in der File enthaltenen\r | |
612 | Adressen im Speicher abgelegt. Jede andere File wird ohne jede\r | |
613 | weitere Interpretation bei Adresse 100H beginnend in den Spei-\r | |
614 | cher geladen.\r | |
615 | \f\r | |
616 | Wird im R-Kommando ein Displacement angegeben, so wird eine\r | |
617 | HEX-File bei der entsprechenden Adresse erhoeht um das Dis-\r | |
618 | placement abgelegt, andere Files bei 100H+Displacement. Nach\r | |
619 | dem Einlesen der File wird erst die hoechste von dieser File\r | |
620 | belgte Speicheradresse ausgelistet und dann die hoechste von\r | |
621 | irgendeiner File seit Starten des DDTZ belegte Adresse. Falls\r | |
622 | das DDTZ statt dessen ein Fragezeichen ausgibt, konnte entweder\r | |
623 | die File nicht gefunden werden, beim Lesen einer HEX-File wurde\r | |
624 | ein Checksummenfehler entdeckt, oder die File belegt Speicher-\r | |
625 | plaetze ausserhalb des Bereichs L bis T.\r | |
626 | z.B.: Eine File TEST.BIN soll bei Adresse 2000H beginnend in\r | |
627 | den Speicher geladen werden:\r | |
628 | > Ftest.bin\r | |
629 | > R2000-l\r | |
630 | High = 277F Max = 277F\r | |
631 | \r | |
632 | S [startadr]\r | |
633 | ------------\r | |
634 | \r | |
635 | Anzeigen und Aendern von Daten im Speicher\r | |
636 | (Substitute memory)\r | |
637 | \r | |
638 | Die Startadresse, oder wenn diese nicht angegeben wurde, die\r | |
639 | Adresse bei der das letzte S-Kommando beendet wurde, wird auf\r | |
640 | der Konsole ausgegeben, und danach wird das an dieser Stelle im\r | |
641 | Speicher befindliche Byte in HEX angezeigt. Anschliessend\r | |
642 | erwartet das DDTZ eine Eingabe, und zwar gibt es folgende\r | |
643 | Moeglichkeiten:\r | |
644 | - Eine leere Eingabe (nur Return-Taste) schreitet ohne Spei-\r | |
645 | cheraenderung zur naechsten Adresse weiter.\r | |
646 | - Ein Minus-Zeichen geht ohne Speicheraenderung einen\r | |
647 | AdressSchritt zurueck.\r | |
648 | - Ein Punkt (alleine in einer Zeile) beendet das Kommando.\r | |
649 | - Ein Datenbyte oder eine Folge von von Datenbytes wird in\r | |
650 | den Speicher eingetragen.\r | |
651 | \r | |
652 | Datenbytes koennen folgendermassen eingegeben werden:\r | |
653 | - Ausdruecke (im einfachsten Fall HEX-Zahlen) werden der\r | |
654 | Reihe nach berechnet und eingetragen.\r | |
655 | - W ausdruck berechnet den Ausdruck als Zwei-Byte-Wort und\r | |
656 | traegt ihn in zwei Speicher-Bytes ein; erst das niederwer-\r | |
657 | tige, dann das hoeherwertige Byte.\r | |
658 | - Ein Apostroph, gefolgt von ASCII-Zeichen und einem\r | |
659 | weiteren Apostroph bewirkt ein Eintragen einer ASCII-\r | |
660 | Zeichenfolge. Kommt der Apostroph selbst in der Zeichen-\r | |
661 | folge vor, so muss er zweimal gegeben werden. Folgt\r | |
662 | auf den abschliessenden Apostroph ein Punkt, so wird das\r | |
663 | Bit 7 des letzten Zeichens auf Eins gesetzt.\r | |
664 | z.B. der Programmteil\r | |
665 | 0200 CALL 1234H\r | |
666 | 0203 DM 'Test ''1''' ; Test '1'\r | |
667 | kann mit dem S-Kommando folgendermassen eingegeben werden:\r | |
668 | > S200\r | |
669 | 0200 00 cdW1234\r | |
670 | 0203 00 'Test ''1'''.\r | |
671 | 020B 00 -\r | |
672 | 020A A7 .\r | |
673 | \f\r | |
674 | T[N][J] ]befehlsanzahl]\r | |
675 | T[N][J] W ausdruck\r | |
676 | T[N][J] U ausdruck\r | |
677 | ------------------\r | |
678 | \r | |
679 | Tracen [ohne Ausgabe] [nur Sprungbefehle] / ..solange.. / ..bis..\r | |
680 | (Trace [no list] [Jumps only] / ..While.. / ..Until..)\r | |
681 | \r | |
682 | Im Gegensatz zum Starten eines Programms mit dem G-Kommando,\r | |
683 | bei dem die Kontrolle voll dem auszufuehrenden Programm ueber-\r | |
684 | geben wird und erst bei einem Breakpoint dem DDTZ zurueckge-\r | |
685 | geben wird, behaelt beim Tracen das DDTZ die ganze Zeit die\r | |
686 | Kontrolle. Das wird dadurch erreicht, dass das DDTZ automatisch\r | |
687 | hinter jedem Befehl, bevor er ausgefuehrt wird, einen Break-\r | |
688 | point einsetzt und nach Ausfuehrung des Befehls wieder loescht.\r | |
689 | Bei bedingten Spruengen werden sogar zwei Breakpoints gesetzt,\r | |
690 | einer hinter dem Sprungbefehl, der andere am Sprungziel. Das\r | |
691 | Programm wird also in Einzelschritten ausgefuehrt. Nach jedem\r | |
692 | Schritt legt das DDTZ die aktuellen Werte aller Register in\r | |
693 | Speicherplaetze innerhalb des DDTZ ab, sodass die Register-\r | |
694 | inhalte jederzeit ueberwacht werden koennen.\r | |
695 | Das Tracen beginnt jeweils beim derzeitigen Stand des Programm-\r | |
696 | zaehlers. Soll an einer anderen Stelle mit dem Tracen begonnen\r | |
697 | werden, so muss der Programmzaehler mit dem X-Kommando neu\r | |
698 | gesetzt werden.\r | |
699 | Nach jedem Schritt werden alle Registerinhalte und der naechste\r | |
700 | Z80-Befehl wie beim X-Kommando angezeigt.\r | |
701 | Die einfachste Form des T-Kommandos ist nur der Buchstabe T\r | |
702 | (gefolgt von der Return-Taste), worauf ein Einzelschritt ausge-\r | |
703 | fuehrt wird. Falls das letzte Kommando bereits ein T-Kommando\r | |
704 | war, genuegt wegen der Wiederholfunktion des DDTZ auch die\r | |
705 | Return-Taste alleine, was das Einzelschritt-Tracen sehr er-\r | |
706 | leichtert.\r | |
707 | Wird im T-Kommando eine Befehlsanzahl angegeben, so werden\r | |
708 | entsprechend viele Schritte hintereinander ausgefuehrt. In\r | |
709 | diesem Fall kann, wie auch bei dem im Folgenden erlaeuterten\r | |
710 | Tracen mit Abbruchkriterium, der Trace-Vorgang durch Druecken\r | |
711 | einer beliebigen Taste der Konsole vorzeitig abgebrochen\r | |
712 | werden. Das Tracen wird unabhaengig von einer angegebenen\r | |
713 | Befehlsanzahl oder Bedingung abgebrochen, wenn ein Breakpoint\r | |
714 | erreicht wird.\r | |
715 | Wird der Buchstabe W, gefolgt von einem Ausdruck angegeben, so\r | |
716 | wird das Programm solange im Trace-Modus abgearbeitet, wie der\r | |
717 | Ausdruck 'wahr' ist, d.h. vor jedem Schritt wird der Ausdruck\r | |
718 | berechnet und nur dann fortgefahren, wenn er ein von Null ver-\r | |
719 | schiedenes Ergebnis hat.\r | |
720 | Wird der Buchstabe U, gefolgt von einem Ausdruck angegeben, so\r | |
721 | wird das Tracen dann abgebrochen, wenn der Ausdruck ein von\r | |
722 | Null verschiedenes Ergebnis hat.\r | |
723 | Bei allen Formen des T-Kommandos kann man durch Angabe des\r | |
724 | Buchstaben N das Auslisten der Register abschalten, was die\r | |
725 | Ausfuehrungszeit erheblich verkuerzt. In diesem Fall werden nur\r | |
726 | beim Beenden des Trace die Registerinhalte angezeigt.\r | |
727 | Die Angabe des Buchstabens J veranlasst das DDTZ, nur hinter\r | |
728 | Befehle, die den Programmzaehler beeinflussen, Breakpoints zu\r | |
729 | setzen, also bei den Befehlen JP,JR,CALL,RET. Es werden dann\r | |
730 | auch nur bei diesen Befehlen die Registerinhalte angezeigt und\r | |
731 | ein Abbruchkriterium geprueft.\r | |
732 | \f\r | |
733 | Achtung: Da die Einzelschritt-Abarbeitung durch automatisches\r | |
734 | Setzen von Breakpoints erreicht wird, ist es unmoeglich, Pro-\r | |
735 | gramme in ROMs zu tracen. Subroutinen in ROMs koennen mit dem\r | |
736 | G-Kommando und geeigneten Breakpoints oder mit dem C-Kommando\r | |
737 | uebersprungen werden. Falls Teile des BIOS in ROMs stehen,\r | |
738 | stoert dies nicht, solange das zu untersuchende Programm nur\r | |
739 | BDOS-Aufrufe enthaelt. Bei BDOS-Aufrufen wird der Trace-Modus\r | |
740 | verlassen und erst nach der Rueckkehr aus dem BDOS wieder\r | |
741 | aufgenommen.\r | |
742 | z.B.: > TNU(1234)='A'\r | |
743 | traced das Programm ohne Registeranzeige, bis der Spei-\r | |
744 | cherplatz 1234H das ASCII-Zeichen A enthaelt.\r | |
745 | > TJW[^hl=0]&[^a<80]\r | |
746 | traced die Sprungbefehle, solange das HL-Register Null\r | |
747 | ist und das A-Register kleiner als 80H ist.\r | |
748 | \r | |
749 | \r | |
750 | V startadr endadr zieladr\r | |
751 | -------------------------\r | |
752 | Vergleichen zweier Speicherbereiche.\r | |
753 | (Verify (compare) two memory areas)\r | |
754 | \r | |
755 | Der Inhalt des Speichers beginnend bei der angegebenen Start-\r | |
756 | adresse bis (einschliesslich) zur angegebenen Endadresse wird\r | |
757 | mit dem Inhalt eines gleich langen Bereichs beginnend bei der\r | |
758 | angegebenen Zieladresse verglichen. Unterschiede werden in HEX\r | |
759 | ausgelistet. Das Auslisten kann durch Druecken einer beliebigen\r | |
760 | Taste der Konsole abgebrochen werden.\r | |
761 | \r | |
762 | \r | |
763 | W startadr endadr\r | |
764 | -----------------\r | |
765 | \r | |
766 | Ausschreiben eines Speicherbereichs in eine File.\r | |
767 | (Write a file to disk)\r | |
768 | \r | |
769 | Der Inhalt des Speichers beginnend bei der angegebenen Start-\r | |
770 | adresse bis (einschliesslich) zur angegebenen Endadresse wird\r | |
771 | in eine File auf der Diskette geschrieben. Der Filename muss\r | |
772 | vorher mit dem F-Kommando spezifiziert werden. Die Laenge des\r | |
773 | abgespeicherten Bereiches wird vom DDTZ auf volle Saetze aufge-\r | |
774 | rundet.\r | |
775 | z.B.: In ein Programm namens PROG-ALT.COM sollen Aenderungen,\r | |
776 | die in einer File PATCH.HEX enthalten sind, eingefuegt\r | |
777 | werden, und das modifizierte Programm soll in einer File\r | |
778 | namens PROG-NEU.COM auf Diskette B: abgelegt werden:\r | |
779 | > Fprog-alt.com\r | |
780 | > R\r | |
781 | High = 257F Max = 257F\r | |
782 | > Fpatch.hex\r | |
783 | > R\r | |
784 | High = 2345 Max = 257F\r | |
785 | > Fb:prog-neu.com\r | |
786 | > Wl m\r | |
787 | \f\r | |
788 | X\r | |
789 | -\r | |
790 | \r | |
791 | Anzeigen aller Register und des Befehls, auf den der Programm-\r | |
792 | zaehler zeigt.\r | |
793 | (eXamine all cpu registers)\r | |
794 | \r | |
795 | Jedesmal, wenn ein Breakpoint angelaufen wird oder ein Pro-\r | |
796 | grammschritt getraced wird, legt das DDTZ die Registerinhalte\r | |
797 | in einem innerhalb des DDTZ befindlichen Speicherbereich ab.\r | |
798 | Wird mit G oder T die Ausfuehrung des Programms fortgesetzt, so\r | |
799 | laedt das DDTZ vorher diese Daten wieder in die Register. Mit\r | |
800 | dem X-Kommando koennen diese abgespeicherten Registerinhalte\r | |
801 | jederzeit kontrolliert werden. Die Anzeige erfolgt, wie immer\r | |
802 | im DDTZ, in HEX.\r | |
803 | Die sechs gueltigen Bits des F- und des F'-Registers werden als\r | |
804 | Buchstaben dargestellt. Das Interrupt-Flag wird wie ein Bit des\r | |
805 | F-Registers angezeigt.\r | |
806 | Der Z80-Befehl, auf den der Programmzaehler zeigt, wird in dis-\r | |
807 | assemblierter Form ausgegeben. Falls das Displacement-Register\r | |
808 | @ von Null verschieden ist, wird der Programmzaehler auch\r | |
809 | relativ dazu angezeigt.\r | |
810 | z.B. Das Displacement-Register enthalte den Wert F00H, alle\r | |
811 | Flags seien gesetzt, der Interrupt sei eingeschaltet und\r | |
812 | die Register enthalten willkuerliche Werte:\r | |
813 | > X\r | |
814 | SZHVNCE A =12 BC =3456 DE =789A HL =BCDE SP=F012 PC=3456..\r | |
815 | SZHVNC A'=78 BC'=9ABC DE'=DEF0 HL'=1234 IX=5678 IY=9ABC..\r | |
816 | Nach einem Neustart des DDTZ enthalten die Register\r | |
817 | folgende Werte:\r | |
818 | E A =00 BC =0000 DE =0000 HL =0000 SP=AC00 PC=0100..\r | |
819 | A'=00 BC'=0000 DE'=0000 HL'=0000 IX=0000 IY=0000..\r | |
820 | Das Interrupt-Enabled-Flag ist gesetzt, falls beim Start des\r | |
821 | DDTZ der Interrupt eingeschaltet war. Das I-Register enthaelt\r | |
822 | den Wert, den es beim Start des DDTZ enthielt. Der Programm-\r | |
823 | zaehler steht auf 100H, zeigt also auf den Anfang des Benutzer-\r | |
824 | speichers. Der Stackpointer zeigt auf das obere Ende des Be-\r | |
825 | nutzerspeichers, abgerundet auf volle 100H. Alle anderen Re-\r | |
826 | gister enthalten Nullen.\r | |
827 | \r | |
828 | X register\r | |
829 | ----------\r | |
830 | \r | |
831 | Anzeigen und eventuell modifizieren eines Registers.\r | |
832 | (eXamine [and substitute] a register)\r | |
833 | \r | |
834 | Nach Eingabe des Buchstabens X, gefolgt von einem Register-\r | |
835 | namen, wird der betreffende Registerinhalt ausgegeben und ein\r | |
836 | neuer Wert angefordert. Eine leere Eingabe (nur Return-Taste)\r | |
837 | laesst den Registerinhalt unveraendert; ein eingegebener Wert\r | |
838 | oder Ausdruck wird in das Register eingetragen. Ist das ange-\r | |
839 | waehlte Register das F- oder F'-Register, so werden die Flags\r | |
840 | als Buchstaben angezeigt. Daraufhin koennen durch Eingabe neuer\r | |
841 | Buchstaben in beliebiger Reihenfolge die entsprechenden Flags\r | |
842 | gesetzt werden, wobei nicht gegebene Flags zurueckgesetzt\r | |
843 | werden. Das Interrupt-Flag wird im DDTZ wie ein Flag des F-\r | |
844 | Registers behandelt.\r | |
845 | \r | |
846 | Die Namen der Register und der Flags der F-Register sind im\r | |
847 | Anhang aufgelistet.\r | |
848 | \f\r | |
849 | z.B. Setzen des HL-Registers auf ABCDH, des C-Registers auf den\r | |
850 | ASCII-Wert 'A', und Setzen des Carryflags des F-Registers\r | |
851 | und des Interrupt-Flags:\r | |
852 | > Xhl\r | |
853 | HL=1234 abcd\r | |
854 | > Xc\r | |
855 | C=40 'A'\r | |
856 | > Xf\r | |
857 | S VNCE ce\r | |
858 | \r | |
859 | \r | |
860 | Y\r | |
861 | -\r | |
862 | \r | |
863 | Anzeigen aller Y-Variablen.\r | |
864 | (examine all Y variables)\r | |
865 | \r | |
866 | Beim Untersuchen eines Programms ist es vielfach von Vorteil,\r | |
867 | wenn man bestimmte Adressen, Registerstaende, Zwischenergebnis-\r | |
868 | se bei Berechnungen usw. festhalten kann und bei weiteren\r | |
869 | Berechnungen oder DDTZ-Kommandos als Argumente einsetzen kann.\r | |
870 | Fuer diesen Zweck haelt das DDTZ zehn frei verfuegbare Varia-\r | |
871 | blen bereit, die mit Y0 bis Y9 bezeichnet sind. Die derzeitigen\r | |
872 | Werte in diesen Variablen koennen mit dem Y-Kommando angezeigt\r | |
873 | werden.\r | |
874 | z.B. Nach dem Starten des DDTZ enthalten die Y-Variablen alle\r | |
875 | den Wert Null:\r | |
876 | > Y\r | |
877 | Y0=0000 Y1=0000\r | |
878 | Y2=0000 Y3=0000\r | |
879 | Y4=0000 Y5=0000\r | |
880 | Y6=0000 Y7=0000\r | |
881 | Y8=0000 Y9=0000\r | |
882 | \r | |
883 | Yziffer0bis9\r | |
884 | ------------\r | |
885 | \r | |
886 | Anzeigen und eventuell Modifizieren einer Y-Variablen.\r | |
887 | (examine [and substitute] an Y variable)\r | |
888 | \r | |
889 | Nach Eingabe des Buchstabens Y, unmittelbar gefolgt von einer\r | |
890 | Ziffer 0 bis 9, wird der derzeitige Wert der berteffenden Y-\r | |
891 | Variable angezeigt und ein neuer Wert angefordert. Eine leere\r | |
892 | Eingabe (nur Return-Taste) laesst den Wert unveraendert, ein\r | |
893 | angegebener Wert wird in die Variable eingetragen.\r | |
894 | z.B. Ein File-Control-Block (33 Bytes lang), auf den zur Zeit\r | |
895 | das DE-Register zeigt, soll im weiteren Verlauf eines\r | |
896 | Programmtests oefters inspiziert werden. Statt sich den\r | |
897 | Stand des DE-Registers zu merken oder zu notieren und\r | |
898 | immer wieder einzugeben, kann er in eine Variable, z.B.\r | |
899 | Y1, eingetragen werden:\r | |
900 | > Y1\r | |
901 | Y1=0000 ^de\r | |
902 | Mit D y1 s 33. oder dy1s21 kann jetzt jederzeit der File-\r | |
903 | Control-Block angesehen werden.\r | |
904 | \f\r | |
905 | \r | |
906 | Z startadr endadr bytes\r | |
907 | -----------------------\r | |
908 | \r | |
909 | Vorbesetzen eines Speicherbereiches mit einer Byte-Folge.\r | |
910 | (Zap (fill) memory with a byte string)\r | |
911 | \r | |
912 | Der Speicher wird beginnend bei der angegebenen Startadresse\r | |
913 | bis (einschliesslich) zur angegebenen Endadresse mit der ange-\r | |
914 | gebenen Bytefolge belegt. Die Bytefolge wird genauso wie beim\r | |
915 | S-Kommando angegeben. Ist sie kuerzer als der zu besetzende\r | |
916 | Speicher, so wird die Bytefolge wiederholt, bis die Endadresse\r | |
917 | erreicht ist.\r | |
918 | z.B. Loeschen des gesamten Benutzerspeichers mit Nullen:\r | |
919 | > Z l t 0\r | |
920 | z.B. Fuellen eines bei der Adresse 1000H beginnenden, 10H Bytes\r | |
921 | langen Puffers mit dem Text 'leer!', Carriage Return,\r | |
922 | Linefeed:\r | |
923 | > Z1000s10 'leer!',d,a\r | |
924 | > D1000s12\r | |
925 | 1000 6C 65 65 72 21 0D 0A 6C 65 65 72 21 0D 0A 6C..\r | |
926 | 1010 00 00 ..\r | |
927 | z.B. Durchfuehren eines einfachen Speichertests: Erst wird der\r | |
928 | gesamte Benutzerspeicher mit einer krummen Anzahl, z.B.\r | |
929 | sieben, Testbytes gefuellt und dann der Speicher mit sich\r | |
930 | selbst, um die Laenge der Testbytefolge verschoben, ver-\r | |
931 | glichen:\r | |
932 | > Zl t 0 ff aa 55 a5 5a 0f\r | |
933 | > Vl t-7 l+7\r | |
934 | \f\r | |
935 | ANHANG\r | |
936 | ======\r | |
937 | \r | |
938 | Zusammenfassung der Kommandos\r | |
939 | -----------------------------\r | |
940 | \r | |
941 | > @\r | |
942 | examine [substitute] displacement register @\r | |
943 | Anzeigen und eventuell Aendern des Displacement-Registers\r | |
944 | \r | |
945 | > A [startadresse]\r | |
946 | Assemble Zilog Z80 mnemonics\r | |
947 | Assemblieren von Z80-Befehlen\r | |
948 | \r | |
949 | > B\r | |
950 | display all breakpoints\r | |
951 | Anzeigen aller Breakpoints\r | |
952 | > B breakp [breakp..]\r | |
953 | set breakpoints\r | |
954 | Breakpoints setzen\r | |
955 | > BX\r | |
956 | clear all breakpoints\r | |
957 | Loeschen aller Breakpoints\r | |
958 | > BX adresse [adresse..]\r | |
959 | clear breakpoints\r | |
960 | Breakpoints loeschen\r | |
961 | \r | |
962 | >>C[N][J] [befehlsanzahl]\r | |
963 | >>C[N][J] W ausdruck\r | |
964 | >>C[N][J] U ausdruck\r | |
965 | trace over calls [No list] [Jumps only] /.While./.Until.\r | |
966 | Tracen ueber CALLs [ohne Ausgabe] [nur Sprungbefehle]\r | |
967 | /.solange./.bis.\r | |
968 | \r | |
969 | >>D [startadr] [endadr]\r | |
970 | Display memory in hex and ASCII\r | |
971 | Auslisten des Speichers in HEX und ASCII\r | |
972 | \r | |
973 | > Fkommandozeile\r | |
974 | specifiy filename and command line\r | |
975 | File-Controlblock und CP/M-Kommandozeile spezifizieren\r | |
976 | \r | |
977 | > G [startadr] [;breakp..]\r | |
978 | Go [to start] [with temporary breakpoints]\r | |
979 | Starte ein geladenes Programm, eventuell mit temporaeren\r | |
980 | Breakpoints\r | |
981 | \r | |
982 | > H\r | |
983 | display High and maximal size of files\r | |
984 | Groesse und maximale Groesse von Files anzeigen\r | |
985 | > H ausdruck\r | |
986 | compute hex and other expressions\r | |
987 | Berechnen eines Ausdrucks\r | |
988 | > H ausdruck ausdruck\r | |
989 | Hex and other sum and difference\r | |
990 | Summe und Differenz zweier Ausdruecke\r | |
991 | \r | |
992 | >>I [port]\r | |
993 | Input a byte from port\r | |
994 | Einlesen eines Daten-Bytes von einem Port\r | |
995 | \r | |
996 | >>L [startadr] [endadr]\r | |
997 | List disassembled code\r | |
998 | Listen eines Speicherbereichs in Z80-Mnemonics\r | |
999 | \f\r | |
1000 | > M[V] startadr endadr zieladr\r | |
1001 | Move memory [and verify]\r | |
1002 | Umladen eines Speicherbereiches in einen anderen, evtl.\r | |
1003 | Vergleichen\r | |
1004 | \r | |
1005 | >>O [byte] [port]\r | |
1006 | Output a byte to a port\r | |
1007 | Ausgeben eines Datenbytes an einen Ausgabeport\r | |
1008 | \r | |
1009 | > Q[J] startadr endadr bytes\r | |
1010 | Query memory for a byte string [Justified]\r | |
1011 | Durchsuchen des Speichers nach einer gegebenen Folge von\r | |
1012 | Bytes\r | |
1013 | \r | |
1014 | > R [displacement]\r | |
1015 | Read a binary or hex file ]add displacement]\r | |
1016 | Einlesen einer Binaer- oder HEX-File in den Speicher,\r | |
1017 | evtl. verschoben\r | |
1018 | \r | |
1019 | > S [startadr]\r | |
1020 | Substitute Memory\r | |
1021 | Anzeigen und Aendern von Daten im Speicher\r | |
1022 | \r | |
1023 | >>T[N][J] [befehlsanzahl]\r | |
1024 | >>T[N][J] W ausdruck\r | |
1025 | >>T[N][J] U ausdruck\r | |
1026 | Trace [no List] [Jumps only] / .While. / .Until.\r | |
1027 | Tracen [ohne Ausgabe] [nur Sprungbefehle] /.solange./.bis.\r | |
1028 | \r | |
1029 | > Vstartadr endadr zieladr\r | |
1030 | Verify (compare) two memory areas\r | |
1031 | Vergleichen zweier Speicherbereiche\r | |
1032 | \r | |
1033 | > Wstartadr endadr\r | |
1034 | Write a file to disk\r | |
1035 | Ausschreiben eines Speicherbereichs in eine File\r | |
1036 | \r | |
1037 | > X\r | |
1038 | eXamine all cpu registers\r | |
1039 | Anzeigen aller Register und des Befehls, auf den der Pro-\r | |
1040 | grammzaehler zeigt\r | |
1041 | > X register\r | |
1042 | eXamine [and substitute] a register\r | |
1043 | Anzeigen und eventuell Modifizieren eines Registers\r | |
1044 | \r | |
1045 | > Y\r | |
1046 | examine all Y variables\r | |
1047 | Anzeigen aller Y-Variablen\r | |
1048 | > Yziffer0bis9\r | |
1049 | examine [and substitute] an Y variable\r | |
1050 | Anzeigen und eventuell Modifizieren einer Y-Variablen\r | |
1051 | \r | |
1052 | > Z startadr endadr bytes\r | |
1053 | Zap (fill) memory with a byte string\r | |
1054 | Vorbesetzen eines Speicherbereiches mit einer Byte-Folge\r | |
1055 | \r | |
1056 | \f\r | |
1057 | Registernamen\r | |
1058 | -------------\r | |
1059 | \r | |
1060 | A , F , B , C , D , E , H , L ,BC , DE , HL\r | |
1061 | A', F', B', C', D', E', H', L',BC', DE', HL'\r | |
1062 | IX oder X , IY oder Y , Sp oder S , PC oder P , I\r | |
1063 | \r | |
1064 | Flags des F- und des F'-Registers:\r | |
1065 | \r | |
1066 | S Sign Vorzeichen\r | |
1067 | Z Zero Null\r | |
1068 | H Half carry Uebertrag von Bit 3 nach Bit 4\r | |
1069 | V oVerflow/parity Ueberlauf/ gerade Paritaet\r | |
1070 | N Negation NEG, DEC, SUB o.ae. wurde ausgefuehrt\r | |
1071 | C Carry Uebertrag von Bit 7\r | |
1072 | E Interrupt Enabled Das Interrupt-Flag wird im DDTZ wie\r | |
1073 | ein Flag des F-Registers behandelt.\r | |
1074 | \r | |
1075 | Variablen und Konstanten\r | |
1076 | ------------------------\r | |
1077 | \r | |
1078 | L Low Benutzerspeicher-Anfang. Festwert 100H\r | |
1079 | H High Hoechste Adresse der letzten gelesenen\r | |
1080 | File\r | |
1081 | M Max Maximale Adresse aller gelesenen Files\r | |
1082 | T Top Oberes Ende des Benutzerspeichers\r | |
1083 | @ Displacement Register\r | |
1084 | $ beim Assemblieren Anfangsadresse des\r | |
1085 | Befehls sonst = PC\r | |
1086 | Y0..Y9 Frei verwendbare Variablen\r | |
1087 | ^register Inhalt eines Registers\r | |
1088 | (adresse) Inhalt eines Speicherplatzes (Byte)\r | |
1089 | (adresse). Inhalt eines Speicherplatzes (Wort)\r | |
1090 | \r | |
1091 | Ausdruecke\r | |
1092 | ----------\r | |
1093 | \r | |
1094 | In allen Situationen, in denen Zahlen eingegeben werden koen-\r | |
1095 | nen, ist auch die Eingabe von Ausdruecken erlaubt.\r | |
1096 | \r | |
1097 | Ausdruecke sind im allgemeinen arithmetische Ausdruecke, koen-\r | |
1098 | nen aber auch (zum Formulieren von Bedingungen) Relationen\r | |
1099 | sein. Relationen bestehen aus zwei arithmetischen Ausdruecken,\r | |
1100 | zwischen denen einer der folgenden Relationsoperatoren steht:\r | |
1101 | = <> > >= <= <\r | |
1102 | \r | |
1103 | Relationen haben den Wert -1 (=0FFFFH), wenn die Relation wahr\r | |
1104 | ist, 0 sonst.\r | |
1105 | z.B. der Ausdruck 1+2=3 hat den Wert -1, und 'A'>'B' den Wert 0\r | |
1106 | \r | |
1107 | Ein arithmetischer Ausdruck hat die folgende Form\r | |
1108 | \r | |
1109 | faktor arithmetikoperator faktor arith... faktor\r | |
1110 | \r | |
1111 | \f\r | |
1112 | Die Arithmetikoperatoren sind\r | |
1113 | + - * / % Addition, Subtraktion, Mult., Division, Modulo\r | |
1114 | & ! # bitweise AND, OR, XOR\r | |
1115 | \r | |
1116 | Ein Faktor hat die Form\r | |
1117 | [ausdruck] geklammerter Ausdruck\r | |
1118 | +faktor\r | |
1119 | -faktor Negation\r | |
1120 | ~faktor bitweise NOT (1er-Komplement)\r | |
1121 | 'a' Wert eines ASCII-Zeichens (a=druckbares Zeichen)\r | |
1122 | 'a'. " mit gesetzem Bit 7\r | |
1123 | 'ab' Wert zweier ASCII-Zeichen (a,b=druckbare Zeichen)\r | |
1124 | 'ab'. " das niederwertige Zeichen mit gesetztem Bit 7\r | |
1125 | (ausdruck) ein Byte im Speicher\r | |
1126 | (ausdruck). ein Wort im Speicher\r | |
1127 | hhhh[H] Hex-Zahl (h=0..9,A..F oder a..f)\r | |
1128 | ddddd. Dezimal-Zahl (d=0..9)\r | |
1129 | bbbbbbbb"bbbbbbbb" Binaer-Zahl (beliebig mit '"' unterteilt (b=0,1)\r | |
1130 | \r | |
1131 | Enthaelt ein Ausdruck einen Relationsoperator, so werden erst\r | |
1132 | die beiden arithmetischen Ausdruecke berechnet und dann die\r | |
1133 | Relation.\r | |
1134 | Ein arithmetischer Ausdruck wird von links nach rechts be-\r | |
1135 | rechnet, also ohne Beachtung "Punktrechnung vor Strichrech-\r | |
1136 | nung", die Reihenfolge kann jedoch mit Klammern '[' und ']'\r | |
1137 | geaendert werden.\r | |
1138 | Ein Pluszeichen darf, wenn dabei der Ausdruck eindeutig bleibt,\r | |
1139 | weggelassen werden; z.B. ist @1000 dasselbe wie @+1000.\r | |
1140 | Ausdruecke duerfen keine Leerzeichen enthalten!\r | |
1141 | \r |