--- /dev/null
+\r
+\r
+\r
+ ***************************************\r
+ ***** *****\r
+ ***** DDTZ *****\r
+ ***** *****\r
+ ***************************************\r
+\r
+ Ein Programmentwicklungs- und Fehlersuch-Werkzeug fuer Z180-\r
+ Mikrocomputer\r
+\r
+\r
+ Einfuehrung\r
+ ===========\r
+\r
+ Das DDTZ ist ein komfortables Werkzeug zum Entwickeln und\r
+ Austesten von Z180-Programmen, sowie zum Ueberpruefen des Zusam-\r
+ menwirkens zwischen Programm und Hardware-System.\r
+\r
+ Folgende Komponenten sind im DDTZ enthalten:\r
+\r
+ - Disassembler zum Rueck-Uebersetzen von Maschinenprogrammen.\r
+ - Tracer zum Ausfuehren von Programmen in Einzelschritten.\r
+ - Ausdruck-Interpreter erlaubt bei allen Kommandos die Verwen-\r
+ dung von arithmetischen und logischen Ausdruecken mit HEX-,\r
+ Dezimal-, Binaer- und ASCII-Werten, sowie Speicher- und\r
+ Registerinhalten und Variablen.\r
+\r
+ Das DDTZ laeuft unter [todo]\r
+ Es benoetigt eine Z80- oder Z180-CPU und belegt [todo] KBytes\r
+ Speicher.\r
+\r
+ Der Gebrauch des DDTZ\r
+ =====================\r
+\r
+ Der Aufruf [todo]\r
+ ----------\r
+\r
+ relokation\r
+\r
+ um dem Anwenderprogramm die\r
+ durch das DDTZ verringerte Speichergroesse mitzuteilen. Der\r
+ urspruenglich vom DDTZ belegte Speicher wird daraufhin mit\r
+ Nullen geloescht. [todo]\r
+\r
+ HW-Initialisierung\r
+\r
+ Nach Ausgabe des Prompt-Zeichens '>' ist das DDTZ betriebs-\r
+ bereit.\r
+\f\r
+ Die Kommandos\r
+ -------------\r
+\r
+ Jede Taetigkeit des DDTZ, z.B. Disassemblieren eines Programm-\r
+ Abschnittes usw. wird mit einem Kommando\r
+ eingeleitet. Kommandos koennen immer dann eingegeben werden,\r
+ wenn das DDTZ mit dem Prompt-Zeichen '> ' oder '>>' seine\r
+ Bereitschaft anzeigt.\r
+\r
+ Kommandos beginnen mit einem der Zeichen '' [todo] bis 'Z', eventuell\r
+ gefolgt von weiteren optionalen Buchstaben, sowie Argumenten.\r
+ Bei einigen Kommandos sind alle Argumente obligat, d.h. alle\r
+ Argumente muessen angegebnen werden. Bei anderen Kommandos sind\r
+ jedoch die Argumente alle oder zum Teil optional, d.h. sie\r
+ koennen entweder explizit angegeben werden, duerfen aber auch\r
+ weggelassen werden. Wird eine optionale Anfangsadresse wegge-\r
+ lassen, so wird die Adresse benutzt, bei der das Kommando\r
+ zuletzt beendet wurde. Wird eine optionale Endadresse weggelas-\r
+ sen, so wird das Kommando (z.B. L oder D) so lange ausgefuehrt,\r
+ bis etwa ein Bildschirm vollgeschrieben ist. Ein weggelassenes\r
+ optionales Argument, hinter dem weitere Argumente angegeben\r
+ werden sollen, muss durch ein Komma ersetzt werden. Optionale\r
+ Elemente sind in den folgenden Kommando-Beschreibungen durch\r
+ eckige Klammern gekennzeichnet (die Klammern sind also nicht\r
+ mit einzugeben). Zwischen zwei Argumenten muss ein Blank\r
+ oder ein Komma stehen.\r
+\r
+ Argumente werden im allgemeinen als HEX-Zahlen eingegeben,\r
+ duerfen aber auch als Dezimal- und Binaerzahlen, als ASCII-\r
+ Werte, Variablen oder in Form arithmetischer Ausdruecke einge-\r
+ geben werden. HEX-Zahlen sind im DDTZ Zahlen, die aus den\r
+ Ziffern 0 bis 9 und den Buchstaben A bis F (oder a bis f)\r
+ bestehen und nicht durch weitere Zusaetze (z.B. Buchstabe H)\r
+ als HEX-Zahl gekennzeichnet sein muessen. Im Gegensatz zu den\r
+ meisten Assemblern sind HEX-Zahlen, deren erstes Zeichen ein\r
+ Buchstabe ist, im DDTZ erlaubt. Dezimal-Zahlen werden zur\r
+ Unterscheidung mit einem Punkt abgeschlossen und Binaerzahlen\r
+ tragen am Ende ein doppeltes Anfuehrungszeichen. Naeheres zur\r
+ Eingabe von Zahlen, Variablen und Ausdruecken finden Sie bei\r
+ der Beschreibung des H-Kommandos und im Anhang.\r
+\r
+ Bei Kommandos, die eine Start- und eine Endadresse erfordern,\r
+ kann anstelle der Endadresse auch der Buchstabe 'S', gefolgt\r
+ von einer Laengenangabe verwendet werden.\r
+ z.B. bedeutet D 1000 S 100 oder D1000s100\r
+ das selbe wie D 1000 10FF oder d1000,10ff\r
+\r
+ Bei allen Eingaben ist es einerlei, ob Gross- oder Kleinbuch-\r
+ staben verwendet werden. Die einzige Ausnahme ist die Eingabe\r
+ von ASCII-Zeichen und Zeichenketten.\r
+\f\r
+ Die Wiederhol-Funktion\r
+ ----------------------\r
+\r
+ Beim Gebrauch des DDTZ kommt es oefters vor, dass man einen\r
+ Befehl nicht nur einmal benutzt und danach einen anderen Befehl\r
+ anwendet, sondern das man ein und denselben Befehl mehrmals\r
+ wiederholen will. Moechte man z.B. ein Programm in Einzel-\r
+ schritten ausfuehren lassen, um nach jedem Schritt die Register\r
+ zu inspizieren, so waere fuer jeden Schritt die Eingabe eines\r
+ Trace-Kommandos ohne Argumente notwendig (also der Buchstabe\r
+ 'T' und die Return-Taste). Ein weiteres Beispiel ist das Ueber-\r
+ pruefen der Hardware eines Ausgabeports: Will man mit einem\r
+ Oszilloskop Signale eines Ausgabeports ueberpruefen, so waere\r
+ es sehr laestig, zur wiederholten Ausgabe eines Testbytes an\r
+ den Port waehrend der Beobachtung des Oszilloskops immer wieder\r
+ das 'O'-Kommando eingeben zu muessen.\r
+ Aus diesen Gruenden besitzt das DDTZ die Wiederholfunktion.\r
+ Diese bewirkt, dass bei einer leeren Eingabe (nur Return-Taste)\r
+ das letzte Kommando ohne Argumente wiederholt wird. Die Bereit-\r
+ schaft der Wiederhol-Funktion wird durch einen doppelten Prompt\r
+ '>>' anstelle des einfachen '> ' angezeigt.\r
+\f\r
+ Die Kommandos des DDTZ\r
+ ======================\r
+\r
+ Im Folgenden werden alle Kommandos des DDTZ erklaert und mit\r
+ Beispielen verdeutlicht. Im Bereich der Computertechnik hat es\r
+ sich international eingebuergert, englische Bezeichnungnen zu\r
+ benutzen. Deshalb sind auch beim DDTZ die Kommandos Abkuer-\r
+ zungen englischer Woerter. Diese sind neben einer deutschen\r
+ Bezeichnung am Anfang jeder Kommando-Erklaerung mit angegeben.\r
+ Zur Einarbeitung empfiehlt es sich, an dieser Stelle des DDTZ\r
+ schon einmal zu starten und die im kommenden Abschnitt erklaer-\r
+ ten Kommandos der Reihe nach auszuprobieren. Assemblieren Sie\r
+ ein simples Testprogramm mit dem A-Kommando,\r
+ [todo]\r
+ z.B.: > s100\r
+ 0100 00 3E 00 3D C2 02 01 C3 00 00\r
+ 0109 00 .\r
+\r
+ Listen Sie das Programm dann mit dem L-Kommando in disassem-\r
+ blierter Form aus,\r
+\r
+ > l100 108\r
+ 0100 LD A,00\r
+ 0102 DEC A\r
+ 0103 JP NZ,0102\r
+ 0106 JP 0000\r
+\r
+ setzen Sie einen Breakpoint auf Adresse 0\r
+ mit dem B-Kommando und starten Sie es mit dem G-Kommando usw.\r
+ Nach einigem Ausprobieren und Spielen mit dem DDTZ werden Sie\r
+ sicher schnell die vielen Moeglichkeiten dieses komfortablen\r
+ Werkzeugs kennen und nutzen koennen.\r
+\r
+\r
+ B\r
+ -\r
+\r
+ Anzeigen aller Breakpoints.\r
+ (display all breakpoints)\r
+\r
+ Die Adressen aller gesetzten Breakpoints werden aufgelistet.\r
+\r
+\r
+ B breakp [breakp..]\r
+ -------------------\r
+\r
+ Breakpoints setzen.\r
+ (set breakpoints)\r
+\r
+ Zum Austesten eines Programms ist es erforderlich, das Programm\r
+ nicht nur starten zu koennen, sondern der Ablauf des Programms\r
+ muss sich auch bequem verfolgen und beobachten lassen. Neben\r
+ den Tracen (siehe Kommando T) ist das Setzen von Break-\r
+ points (Unterbrechungspunkten) eine sehr komfortable Moeglich-\r
+ keit, den Programmablauf zu verfolgen.\r
+ Ein Breakpoint wird auf das erste Byte (den Opcode) eines\r
+ Maschinenbefehls gesetzt und bewirkt, dass der Programmablauf\r
+ unterbrochen wird, sobald der Programmzaehler bei dieser Adres-\r
+ se angekommen ist. Man kann dann die Registerinhalte inspizie-\r
+ ren, Speicherinhalte kontrollieren usw., um danach den Pro-\r
+ grammablauf fortzusetzen oder an einer anderen Stelle fortzu-\r
+ fahren.\r
+\r
+\f\r
+ Wird ein Breakpoint auf eine Adresse gesetzt, auf der sich\r
+ bereits ein Breakpoint befindet, so wird der bereits vorhandene\r
+ automatisch geloescht.\r
+ Achtung: Breakpoints koennen nur im RAM gesetzt werden; in\r
+ Programmen die in ROM's oder EPROM's enthalten sind, sind\r
+ Breakpoints nicht moeglich (Siehe folgenden Abschnitt).\r
+\r
+ Interne Breakpointbehandlung des DDTZ:\r
+\r
+ Wird ein Programm mit dem G-Kommando gestartet, so ersetzt das\r
+ DDTZ alle Opcodes, auf die eine Breakpoint-Adresse zeigt, durch\r
+ einen Restart-Befehl RST n und bewahrt die Opcodes auf. In die\r
+ Adresse n, auf die der RST-Befehl springt, wird ein Sprungbe-\r
+ fehl eingesetzt, der in den Breakpoint-Handler des DDTZ fuehrt.\r
+ Nach einem Programmstop werden die Opcodes wieder eingesetzt,\r
+ sodass das Programm immer dann, wenn es dem Benutzer zugaeng-\r
+ lich ist, unmodifiziert ist. Als RST-Adresse ist 38H oder 30H\r
+ voreingestellt. Ist die voreingestellte Adresse jedoch fuer\r
+ andere Zwecke bereits vergeben, so kann der RST-Befehl geaendert\r
+ werden, z.B. auf\r
+ 30H:\r
+ > LT4S1\r
+ xxx9 RST 38\r
+ >>ST4\r
+ xxx9 F7 F7\r
+ xxxA 00 .\r
+ > LT4S1\r
+ xxx9 RST 30\r
+\r
+\f\r
+ BX\r
+ --\r
+\r
+ Loeschen aller Breakpoints.\r
+ (clear all breakpoints)\r
+\r
+ BX adresse [adresse..]\r
+ ----------------------\r
+\r
+ Loeschen der Breakpoints an den angegebenen Adressen.\r
+ (clear breakpoints)\r
+\r
+ D [startadr] [endadr]\r
+ ---------------------\r
+\r
+ Auslisten des Speichers in HEX und ASCII\r
+ (Display memory in hex and ASCII)\r
+\r
+ Der Speicher-Inhalt wird beginnend bei der Startadresse bis zur\r
+ Endadresse in HEX und ASCII auf der Konsole ausgelistet. Die\r
+ ASCII-Anzeige ignoriert das Bit 7 des jeweiligen Bytes. Ist der\r
+ Wert eines Bytes nicht als ASCII-Zeichen druckbar, so wird\r
+ statt dessen ein Punkt ausgegeben.\r
+\f\r
+ G [startadr] [;breakp..]\r
+ ------------------------\r
+\r
+ Starte ein geladenes Programm, eventuell mit temporaeren Breakpoints.\r
+ (Go [to start] [with temporary breakpoints])\r
+\r
+ Wird eine Startadresse angegeben, so wird der Programmzaehler\r
+ des Z80 auf diese Adresse gesetzt, andernfalls wird bei dem\r
+ letzten Programmzaehlerstand fortgefahren. Im G-Kommando koen-\r
+ nen temporaere Breakpoints angegeben werden. Sie werden in der\r
+ gleichen Form wie die permanenten Breakpoints beim B-Kommando\r
+ spezifiziert und haben auch die gleiche Wirkung mit dem Unter-\r
+ schied, dass bei einem Programmstop an einem der temporaeren\r
+ oder permanenten Breakpoints die temporaeren automatisch ge-\r
+ loescht werden.\r
+ z.B. Vollstaendiges Abarbeiten eines CP/M-Programms, das mit\r
+ JP 0 endet:\r
+ > GL;0\r
+\r
+ H\r
+ -\r
+\r
+ Groesse und maximale Groesse von Files anzeigen.\r
+ (display High and maximal size of files)\r
+\r
+ Die hoechste von der zuletzt eingelesenen File belegte Adresse\r
+ wird angezeigt, sowie die hoechste von irgendeiner der einge-\r
+ lesenen Files belegte Adresse. Erstere ist auch in der Varia-\r
+ blen H, letztere in der Variablen M enthalten. (Siehe auch\r
+ R-Kommando)\r
+\r
+ H ausdruck\r
+ ----------\r
+\r
+ Berechnen eines Ausdrucks.\r
+ (compute expression / Hex and other)\r
+\r
+ Wird ein Ausdruck angegeben, so zeigt das DDTZ dessen Ergebnis\r
+ an Ergebnisse werden in HEX, als negative\r
+ HEX-Zahl, in Dezimal, als negative Dezimalzahl, in Binaer und\r
+ das niederwertige Byte zusaetzlich als ASCII-Zeichen darge-\r
+ stellt. Nicht druckbare ASCII-Zeichen werden dabei als Control-\r
+ Zeichen in der Form '^x' angezeigt.\r
+\r
+ Wie Ausdruecke formuliert werden, ist der Uebersichtlichkeit\r
+ halber im Anhang angegeben.\r
+\r
+ z.B.: Was ist die Endadresse eines 17 KByte langen Programms,\r
+ das bei Adresse 100H beginnt?\r
+ > H17.*1024.+100\r
+ 4500 -BB00 17664. -47872. 01000101"00000000" '^@'\r
+ Der freie Speicher beginnt also bei 4500H.\r
+ z.B.: Beim Disassemblieren eines unbekannten Programms wird\r
+ eine Subroutine gefunden, die nacheinander mit den Werten\r
+ D8F0H, FC18H, FF9CH usw. in den Registern aufgerufen\r
+ wird. Was kann das fuer eine Routine sein?\r
+ > HD8F0\r
+ D8F0 -2710 55536. -10000. 11011000"11110000" 'p'.\r
+ > H fc18\r
+ FC18 -03E8 64536. -1000 11111100"00011000" '^X'\r
+ > H FF9CH\r
+ FF9C -0064 65436. -100 11111111"10011100" '^\'.\r
+ Bei den Werten handelt es sich offenbar um dezimal -\r
+ 10000, -1000 usw.; die Routine hat also wahrscheinlich\r
+ etwas mit einer Binaer-zu-Dezimal-Umrechnung zu tun.\r
+\r
+ I [port]\r
+ --------\r
+\r
+ Einlesen eines Daten-Bytes von einem Port.\r
+ (input a byte from port)\r
+\r
+ Zum Austesten der Computer-Hardware koennen mit diesem Kommando\r
+ Bytes von Ports eingelesen und in HEX und binaer angezeigt\r
+ werden. Wird die Portadresse nicht angegeben, so wird der\r
+\r
+ zuletzt in einem frueheren I-Kommando angegebene Port ange-\r
+ sprochen. Die Moeglichkeit, bei Z80-I/O-Befehlen hardwareseitig\r
+ auch die Adressleitungen A15 bis A8 zur Informationsuebertra-\r
+ gung mitzuverwenden, ist im DDTZ realisiert. DDTZ-intern wird\r
+ die Portadresse als Zwei-Byte-Wort in das BC-Register\r
+ geladen und mit IN A,(C) der Port gelesen.\r
+ Bei diesem Kommando zeigt zeigt sich besonders der Vorteil der\r
+ Wiederholungsfunktion des DDTZ: Nachdem einmal das I-Kommando\r
+ explizit gegeben wurde, kann man, waehrend man verschiedene\r
+ Pegel an die Anschluesse des Ports anlegt, durch einfaches\r
+ Druecken der Return-Taste die Portabfrage wiederholen.\r
+\f\r
+ L [startadr] [endadr]\r
+ ---------------------\r
+\r
+ Listen eines Speicherbereichs in Z180-Mnemonics.\r
+ (List disassembled code)\r
+\r
+ Dieses Kommando disassembliert im Speicher stehende Programme.\r
+ (Beispiel: siehe Q-Kommando)\r
+\r
+\r
+ M[V] startadr endadr zieladr\r
+ ----------------------------\r
+\r
+ Umladen eines Speicherbereichs in einen anderen, eventuell ver-\r
+ gleichen. (Move memory [and verify])\r
+\r
+ Der Speicherinhalt beginnend bei der angegebenen Startadresse\r
+ bis (einschliesslich) zur angegebenen Endadresse wird in einen\r
+ anderen Bereich, beginnend bei der angegebenen Zieladresse,\r
+ kopiert. Wird der optionale Buchstabe V gegeben, so wird die\r
+ Kopie mit dem Original verglichen und etwaige Diffrenzen in HEX\r
+ ausgelistet. Differenzen koennen bei defektem Speicher ent-\r
+ stehen oder dann, wenn versehentlich in Bereiche kopiert wird,\r
+ die kein RAM enthalten. Das M-Kommando wird auch dann korrekt\r
+ ausgefuehrt, wenn der Quell- und der Zielbereich gegenseitig\r
+ ueberlappen. In diesem Fall ist ein Vergleichen allerdings\r
+ nicht moeglich, da beim Kopieren ja ein Teil des Quellbereichs\r
+ ueberschrieben wird.\r
+ Achten Sie bei diesem Kommando besonders darauf, dass Sie nicht\r
+ das DDTZ oder das Disk Operating System versehentlich ueber-\r
+ schreiben.\r
+\r
+ O [byte] [port]\r
+ ---------------\r
+\r
+ Ausgeben eines Datenbytes an einen Ausgabeport.\r
+ (Output a byte to a port)\r
+\r
+ Zum Austesten der Computer-Hardware koennen mit diesem Kommando\r
+ Bytes an Ports des Computersystems ausgegeben werden.\r
+ Achtung: Im Gegensatz zu dem Z80-Befehl OUT port,byte ist hier\r
+ aus folgendem Grund erst das Datenbyte und dann die Portadresse\r
+ anzugeben:\r
+ Die Portadresse kann weggelassen werden, falls ein Datenbyte an\r
+ den selben Port, wie in einem vorherigen O-Kommando spezifi-\r
+ ziert, ausgegeben werden soll.\r
+ Die Moeglichkeit, bei Z80-I/O-Befehlen hardwareseitig auch die\r
+ Adressleitungen A15 bis A8 zur Informationsuebertragung mitzu-\r
+ verwenden, ist im DDTZ realisiert. DDTZ-intern wird die Port-\r
+ adresse als Zwei-Byte-Wort in das BC-Register geladen und mit\r
+ OUT (C),A das Byte an den Port ausgegeben.\r
+\f\r
+ Q startadr endadr bytes\r
+ --------------------------\r
+\r
+ Durchsuchen des Speichers nach einer gegebenen Folge von Bytes.\r
+ (Query memory for a byte string)\r
+\r
+ Der Speicher wird beginnend bei der angegebnen Startadresse und\r
+ endet (einschliesslich) bei der angegebenen Endadresse auf eine\r
+ angegebene Byte-Folge hin durchsucht. Fundstellen werden wie\r
+ beim D-Kommando in HEX und ASCII ausgelistet. Das erste ge-\r
+ suchte Byte steht dabei jeweils am linken Bildrand. Die Byte-\r
+ Folge kann wie beim S-Kommando eine Folge von HEX-Zahlen,\r
+ Ausdruecken, Worten und Text-Strings sein.\r
+\r
+ z.B. Ein zu untersuchendes Programm gibt an einem bestimmten\r
+ Punkt seines Ablaufes aus unbekannter Ursache die Meldung\r
+ "Hardware error" auf die Konsole aus und stoppt. Woher\r
+ kommt diese Meldung ?\r
+[todo] > QJ l h 'Hardwar'\r
+ 1502 73 74 65 64 24 4E 6F 20 48 61 72 64 77 61 ...\r
+ Der Text "Hardware error beginnt also bei Adresse 150A. Wo\r
+ wird er ausgegeben ?\r
+ > QJ l h w150a\r
+ >\r
+ (Keine Meldung) Auf die Adresse wird also nicht direkt\r
+ zugegriffen. Vielleicht haben wir Glueck, indem wir\r
+ suchen, wo 'No Hardware error" ausgegeben wird. Dieser\r
+ Text beginnt bei 1507H.\r
+ > QJ l h w1507\r
+ 08FE 00 00 00 00 00 AF C9 21 07 15 CD 65 07 30 ...\r
+ > L8FE+7\r
+ 0905 LD HL,1507\r
+ 0908 CALL 0765\r
+ 090B JR NC,0910\r
+ 090D INC HL\r
+ 090E INC HL\r
+ 090F INC HL\r
+ 0910 CALL 0654\r
+ Die Subroutine, die bei Adresse 908 aufgerufen wird,\r
+ fuehrt also offenbar einen Test durch und meldet einen\r
+ Fehler im Carry-Flag. Der Text wird dann bei Adresse 910\r
+ ausgegeben.\r
+\r
+ R [displacement]\r
+ ----------------\r
+[todo console/reader]\r
+ Einlesen einer HEX-File in den Speicher, eventuell verschoben.\r
+ (Read a hex file [add displacement])\r
+\r
+ Eine Intel-Hex-File wird von der (seriellen) Reader-Schnittstelle\r
+ in den Speicher eingelesen.\r
+ Die Daten werden bei den in der File enthaltenen\r
+ Adressen im Speicher abgelegt.\r
+ Wird im R-Kommando ein Displacement angegeben, so wird eine\r
+ HEX-File bei der entsprechenden Adresse erhoeht um das Dis-\r
+ placement abgelegt. Nach\r
+ dem Einlesen der File wird erst die hoechste von dieser File\r
+ belgte Speicheradresse ausgelistet und dann die hoechste von\r
+ irgendeiner File seit Starten des DDTZ belegte Adresse. Falls\r
+ das DDTZ statt dessen ein Fragezeichen ausgibt, wurde beim Lesen\r
+ ein Checksummenfehler entdeckt, oder die File belegt Speicher-\r
+ plaetze ausserhalb des Bereichs L bis T.\r
+\r
+ S [startadr]\r
+ ------------\r
+\r
+ Anzeigen und Aendern von Daten im Speicher\r
+ (Substitute memory)\r
+\r
+ Die Startadresse, oder wenn diese nicht angegeben wurde, die\r
+ Adresse bei der das letzte S-Kommando beendet wurde, wird auf\r
+ der Konsole ausgegeben, und danach wird das an dieser Stelle im\r
+ Speicher befindliche Byte in HEX angezeigt. Anschliessend\r
+ erwartet das DDTZ eine Eingabe, und zwar gibt es folgende\r
+ Moeglichkeiten:\r
+ - Eine leere Eingabe (nur Return-Taste) schreitet ohne Spei-\r
+ cheraenderung zur naechsten Adresse weiter.\r
+ - Ein Minus-Zeichen geht ohne Speicheraenderung einen\r
+ Adressschritt zurueck.\r
+ - Ein Punkt (alleine in einer Zeile) beendet das Kommando.\r
+ - Ein Datenbyte oder eine Folge von von Datenbytes wird in\r
+ den Speicher eingetragen.\r
+\r
+ Datenbytes koennen folgendermassen eingegeben werden:\r
+ - Ausdruecke (im einfachsten Fall HEX-Zahlen) werden der\r
+ Reihe nach berechnet und eingetragen.\r
+ - Ein Apostroph, gefolgt von ASCII-Zeichen und einem\r
+ weiteren Apostroph bewirkt ein Eintragen einer ASCII-\r
+ Zeichenfolge. Kommt der Apostroph selbst in der Zeichen-\r
+ folge vor, so muss er zweimal gegeben werden. Folgt\r
+ auf den abschliessenden Apostroph ein Punkt, so wird das\r
+ Bit 7 des letzten Zeichens auf Eins gesetzt.\r
+ z.B. der Programmteil\r
+ 0200 CALL 1234H\r
+ 0203 DM 'Test ''1''' ; Test '1'\r
+ kann mit dem S-Kommando folgendermassen eingegeben werden:\r
+ > S200\r
+ 0200 00 cdW1234\r
+ 0203 00 'Test ''1'''.\r
+ 020B 00 -\r
+ 020A A7 .\r
+\f\r
+ T [befehlsanzahl]\r
+ -----------------\r
+\r
+ Tracen\r
+ (Trace)\r
+\r
+ Im Gegensatz zum Starten eines Programms mit dem G-Kommando,\r
+ bei dem die Kontrolle voll dem auszufuehrenden Programm ueber-\r
+ geben wird und erst bei einem Breakpoint dem DDTZ zurueckge-\r
+ geben wird, behaelt beim Tracen das DDTZ die ganze Zeit die\r
+ Kontrolle. Das wird dadurch erreicht, dass das DDTZ automatisch\r
+ hinter jedem Befehl, bevor er ausgefuehrt wird, einen Break-\r
+ point einsetzt und nach Ausfuehrung des Befehls wieder loescht.\r
+ Bei bedingten Spruengen werden sogar zwei Breakpoints gesetzt,\r
+ einer hinter dem Sprungbefehl, der andere am Sprungziel. Das\r
+ Programm wird also in Einzelschritten ausgefuehrt. Nach jedem\r
+ Schritt legt das DDTZ die aktuellen Werte aller Register in\r
+ Speicherplaetze innerhalb des DDTZ ab, sodass die Register-\r
+ inhalte jederzeit ueberwacht werden koennen.\r
+ Das Tracen beginnt jeweils beim derzeitigen Stand des Programm-\r
+ zaehlers. Soll an einer anderen Stelle mit dem Tracen begonnen\r
+ werden, so muss der Programmzaehler mit dem X-Kommando neu\r
+ gesetzt werden.\r
+ Nach jedem Schritt werden alle Registerinhalte und der naechste\r
+ Z80-Befehl wie beim X-Kommando angezeigt.\r
+ Die einfachste Form des T-Kommandos ist nur der Buchstabe T\r
+ (gefolgt von der Return-Taste), worauf ein Einzelschritt ausge-\r
+ fuehrt wird. Falls das letzte Kommando bereits ein T-Kommando\r
+ war, genuegt wegen der Wiederholfunktion des DDTZ auch die\r
+ Return-Taste alleine, was das Einzelschritt-Tracen sehr er-\r
+ leichtert.\r
+ Wird im T-Kommando eine Befehlsanzahl angegeben, so werden\r
+ entsprechend viele Schritte hintereinander ausgefuehrt. In\r
+ diesem Fall kann der Trace-Vorgang durch Druecken\r
+ einer beliebigen Taste der Konsole vorzeitig abgebrochen\r
+ werden. Das Tracen wird unabhaengig von einer angegebenen\r
+ Befehlsanzahl oder Bedingung abgebrochen, wenn ein Breakpoint\r
+ erreicht wird.\r
+\f\r
+ Achtung: Da die Einzelschritt-Abarbeitung durch automatisches\r
+ Setzen von Breakpoints erreicht wird, ist es unmoeglich, Pro-\r
+ gramme in ROMs zu tracen. Subroutinen in ROMs koennen mit dem\r
+ G-Kommando und geeigneten Breakpoints oder mit dem C-Kommando\r
+ uebersprungen werden. Falls Teile des BIOS in ROMs stehen,\r
+ stoert dies nicht, solange das zu untersuchende Programm nur\r
+ BDOS-Aufrufe enthaelt. Bei BDOS-Aufrufen wird der Trace-Modus\r
+ verlassen und erst nach der Rueckkehr aus dem BDOS wieder\r
+ aufgenommen.\r
+\r
+\r
+ V startadr endadr zieladr\r
+ -------------------------\r
+ Vergleichen zweier Speicherbereiche.\r
+ (Verify (compare) two memory areas)\r
+\r
+ Der Inhalt des Speichers beginnend bei der angegebenen Start-\r
+ adresse bis (einschliesslich) zur angegebenen Endadresse wird\r
+ mit dem Inhalt eines gleich langen Bereichs beginnend bei der\r
+ angegebenen Zieladresse verglichen. Unterschiede werden in HEX\r
+ ausgelistet. Das Auslisten kann durch Druecken einer beliebigen\r
+ Taste der Konsole abgebrochen werden.\r
+\r
+\r
+ X\r
+ -\r
+\r
+ Anzeigen aller Register und des Befehls, auf den der Programm-\r
+ zaehler zeigt.\r
+ (eXamine all cpu registers)\r
+\r
+ Jedesmal, wenn ein Breakpoint angelaufen wird oder ein Pro-\r
+ grammschritt getraced wird, legt das DDTZ die Registerinhalte\r
+ in einem innerhalb des DDTZ befindlichen Speicherbereich ab.\r
+ Wird mit G oder T die Ausfuehrung des Programms fortgesetzt, so\r
+ laedt das DDTZ vorher diese Daten wieder in die Register. Mit\r
+ dem X-Kommando koennen diese abgespeicherten Registerinhalte\r
+ jederzeit kontrolliert werden. Die Anzeige erfolgt, wie immer\r
+ im DDTZ, in HEX.\r
+ Die sechs gueltigen Bits des F- und des F'-Registers werden als\r
+ Buchstaben dargestellt. Das Interrupt-Flag wird wie ein Bit des\r
+ F-Registers angezeigt.\r
+ Der Z180-Befehl, auf den der Programmzaehler zeigt, wird in dis-\r
+ assemblierter Form ausgegeben.\r
+ z.B. Alle Flags seien gesetzt, der Interrupt sei eingeschaltet\r
+ und die Register enthalten willkuerliche Werte:\r
+ > X\r
+ SZHVNCE A =12 BC =3456 DE =789A HL =BCDE SP=F012 PC=3456..\r
+ SZHVNC A'=78 BC'=9ABC DE'=DEF0 HL'=1234 IX=5678 IY=9ABC..\r
+ Nach einem Neustart des DDTZ enthalten die Register\r
+ folgende Werte:\r
+ E A =00 BC =0000 DE =0000 HL =0000 SP=AC00 PC=0100..\r
+ A'=00 BC'=0000 DE'=0000 HL'=0000 IX=0000 IY=0000..\r
+ Das Interrupt-Enabled-Flag ist gesetzt, falls beim Start des\r
+ DDTZ der Interrupt eingeschaltet war. Das I-Register enthaelt\r
+ den Wert, den es beim Start des DDTZ enthielt. Der Programm-\r
+ zaehler steht auf 100H, zeigt also auf den Anfang des Benutzer-\r
+ speichers. Der Stackpointer zeigt auf das obere Ende des Be-\r
+ nutzerspeichers, abgerundet auf volle 100H. Alle anderen Re-\r
+ gister enthalten Nullen.\r
+\r
+ X register\r
+ ----------\r
+\r
+ Anzeigen und eventuell modifizieren eines Registers.\r
+ (eXamine [and substitute] a register)\r
+\r
+ Nach Eingabe des Buchstabens X, gefolgt von einem Register-\r
+ namen, wird der betreffende Registerinhalt ausgegeben und ein\r
+ neuer Wert angefordert. Eine leere Eingabe (nur Return-Taste)\r
+ laesst den Registerinhalt unveraendert; ein eingegebener Wert\r
+ oder Ausdruck wird in das Register eingetragen. Ist das ange-\r
+ waehlte Register das F- oder F'-Register, so werden die Flags\r
+ als Buchstaben angezeigt. Daraufhin koennen durch Eingabe neuer\r
+ Buchstaben in beliebiger Reihenfolge die entsprechenden Flags\r
+ gesetzt werden, wobei nicht gegebene Flags zurueckgesetzt\r
+ werden. Das Interrupt-Flag wird im DDTZ wie ein Flag des F-\r
+ Registers behandelt.\r
+\r
+ Die Namen der Register und der Flags der F-Register sind im\r
+ Anhang aufgelistet.\r
+\r
+ z.B. Setzen des HL-Registers auf ABCDH, des C-Registers auf den\r
+ ASCII-Wert 'A', und Setzen des Carryflags des F-Registers\r
+ und des Interrupt-Flags:\r
+ > Xhl\r
+ HL=1234 abcd\r
+ > Xc\r
+ C=40 'A'\r
+ > Xf\r
+ S VNCE ce\r
+\r
+\r
+\r
+ Z startadr endadr bytes\r
+ -----------------------\r
+\r
+ Vorbesetzen eines Speicherbereiches mit einer Byte-Folge.\r
+ (Zap (fill) memory with a byte string)\r
+\r
+ Der Speicher wird beginnend bei der angegebenen Startadresse\r
+ bis (einschliesslich) zur angegebenen Endadresse mit der ange-\r
+ gebenen Bytefolge belegt. Die Bytefolge wird genauso wie beim\r
+ S-Kommando angegeben. Ist sie kuerzer als der zu besetzende\r
+ Speicher, so wird die Bytefolge wiederholt, bis die Endadresse\r
+ erreicht ist.\r
+ z.B. Loeschen des gesamten Benutzerspeichers mit Nullen:\r
+ > Z l t 0\r
+ z.B. Fuellen eines bei der Adresse 1000H beginnenden, 10H Bytes\r
+ langen Puffers mit dem Text 'leer!', Carriage Return,\r
+ Linefeed:\r
+ > Z1000s10 'leer!',d,a\r
+ > D1000s12\r
+ 1000 6C 65 65 72 21 0D 0A 6C 65 65 72 21 0D 0A 6C..\r
+ 1010 00 00 ..\r
+ z.B. Durchfuehren eines einfachen Speichertests: Erst wird der\r
+ gesamte Benutzerspeicher mit einer krummen Anzahl, z.B.\r
+ sieben, Testbytes gefuellt und dann der Speicher mit sich\r
+ selbst, um die Laenge der Testbytefolge verschoben, ver-\r
+ glichen:\r
+ > Zl t 0 ff aa 55 a5 5a 0f\r
+ > Vl t-7 l+7\r
+\f\r
+ ANHANG\r
+ ======\r
+\r
+ Zusammenfassung der Kommandos\r
+ -----------------------------\r
+\r
+ > B\r
+ display all breakpoints\r
+ Anzeigen aller Breakpoints\r
+ > B breakp [breakp..]\r
+ set breakpoints\r
+ Breakpoints setzen\r
+ > BX\r
+ clear all breakpoints\r
+ Loeschen aller Breakpoints\r
+ > BX adresse [adresse..]\r
+ clear breakpoints\r
+ Breakpoints loeschen\r
+\r
+ >>D [startadr] [endadr]\r
+ Display memory in hex and ASCII\r
+ Auslisten des Speichers in HEX und ASCII\r
+\r
+ > G [startadr] [;breakp..]\r
+ Go [to start] [with temporary breakpoints]\r
+ Starte ein geladenes Programm, eventuell mit temporaeren\r
+ Breakpoints\r
+\r
+ > H\r
+ display High and maximal size of files\r
+ Groesse und maximale Groesse von Files anzeigen\r
+ > H ausdruck\r
+ compute hex and other expressions\r
+ Berechnen eines Ausdrucks\r
+\r
+ >>I [port]\r
+ Input a byte from port\r
+ Einlesen eines Daten-Bytes von einem Port\r
+\r
+ >>L [startadr] [endadr]\r
+ List disassembled code\r
+ Listen eines Speicherbereichs in Z180-Mnemonics\r
+\r
+ > M startadr endadr zieladr\r
+ Move memory\r
+ Umladen eines Speicherbereiches in einen anderen\r
+\r
+ >>O [byte] [port]\r
+ Output a byte to a port\r
+ Ausgeben eines Datenbytes an einen Ausgabeport\r
+\r
+ > Q startadr endadr bytes\r
+ Query memory for a byte string\r
+ Durchsuchen des Speichers nach einer gegebenen Folge von\r
+ Bytes\r
+\r
+ > R [displacement]\r
+ Read a hex file ]add displacement]\r
+ Einlesen oder HEX-File in den Speicher, evtl. verschoben\r
+\r
+ > S [startadr]\r
+ Substitute Memory\r
+ Anzeigen und Aendern von Daten im Speicher\r
+\r
+ >>T [befehlsanzahl]\r
+ Trace\r
+ Tracen\r
+\r
+ > Vstartadr endadr zieladr\r
+ Verify (compare) two memory areas\r
+ Vergleichen zweier Speicherbereiche\r
+\r
+ > X\r
+ eXamine all cpu registers\r
+ Anzeigen aller Register und des Befehls, auf den der Pro-\r
+ grammzaehler zeigt\r
+ > X register\r
+ eXamine [and substitute] a register\r
+ Anzeigen und eventuell Modifizieren eines Registers\r
+\r
+ > Z startadr endadr bytes\r
+ Zap (fill) memory with a byte string\r
+ Vorbesetzen eines Speicherbereiches mit einer Byte-Folge\r
+\r
+\f\r
+ Registernamen\r
+ -------------\r
+\r
+ A , F , B , C , D , E , H , L ,BC , DE , HL\r
+ A', F', B', C', D', E', H', L',BC', DE', HL'\r
+ IX oder X , IY oder Y , Sp oder S , PC oder P , I\r
+\r
+ Flags des F- und des F'-Registers:\r
+\r
+ S Sign Vorzeichen\r
+ Z Zero Null\r
+ H Half carry Uebertrag von Bit 3 nach Bit 4\r
+ V oVerflow/parity Ueberlauf/ gerade Paritaet\r
+ N Negation NEG, DEC, SUB o.ae. wurde ausgefuehrt\r
+ C Carry Uebertrag von Bit 7\r
+ E Interrupt Enabled Das Interrupt-Flag wird im DDTZ wie\r
+ ein Flag des F-Registers behandelt.\r
+\r
+ Variablen und Konstanten\r
+ ------------------------\r
+\r
+ L Low Benutzerspeicher-Anfang. Festwert 100H\r
+ H High Hoechste Adresse der letzten gelesenen\r
+ File\r
+ M Max Maximale Adresse aller gelesenen Files\r
+ T Top Oberes Ende des Benutzerspeichers\r
+ ^register Inhalt eines Registers\r
+ (adresse) Inhalt eines Speicherplatzes (Byte)\r
+ (adresse). Inhalt eines Speicherplatzes (Wort)\r
+\r
+ Ausdruecke\r
+ ----------\r
+\r
+ In allen Situationen, in denen Zahlen eingegeben werden koen-\r
+ nen, ist auch die Eingabe von Ausdruecken erlaubt.\r
+\r
+ Ausdruecke sind im allgemeinen arithmetische Ausdruecke.\r
+\r
+ Ein arithmetischer Ausdruck hat die folgende Form\r
+\r
+ faktor arithmetikoperator faktor arith... faktor\r
+\r
+\f\r
+ Die Arithmetikoperatoren sind\r
+ + - * / % Addition, Subtraktion, Mult., Division, Modulo\r
+ & ! # bitweise AND, OR, XOR\r
+\r
+ Ein Faktor hat die Form\r
+ [ausdruck] geklammerter Ausdruck\r
+ +faktor\r
+ -faktor Negation\r
+ ~faktor bitweise NOT (1er-Komplement)\r
+ 'a' Wert eines ASCII-Zeichens (a=druckbares Zeichen)\r
+ 'a'. " mit gesetzem Bit 7\r
+ 'ab' Wert zweier ASCII-Zeichen (a,b=druckbare Zeichen)\r
+ 'ab'. " das niederwertige Zeichen mit gesetztem Bit 7\r
+ (ausdruck) ein Byte im Speicher\r
+ (ausdruck). ein Wort im Speicher\r
+ hhhh[H] Hex-Zahl (h=0..9,A..F oder a..f)\r
+ ddddd. Dezimal-Zahl (d=0..9)\r
+ bbbbbbbb"bbbbbbbb" Binaer-Zahl (beliebig mit '"' unterteilt (b=0,1)\r
+\r
+ Ein arithmetischer Ausdruck wird von links nach rechts be-\r
+ rechnet, also ohne Beachtung "Punktrechnung vor Strichrech-\r
+ nung", die Reihenfolge kann jedoch mit Klammern '[' und ']'\r
+ geaendert werden.\r
+ Ein Pluszeichen darf, wenn dabei der Ausdruck eindeutig bleibt,\r
+ weggelassen werden; z.B. ist L10 dasselbe wie L+10.\r
+ Ausdruecke duerfen keine Leerzeichen enthalten!\r