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