]> cloudbase.mooo.com Git - ddt180.git/blame - doc/ddtz-de.txt
Formatting
[ddt180.git] / doc / ddtz-de.txt
CommitLineData
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