*************************************** ***** ***** ***** DDTZ ***** ***** ***** *************************************** Ein Programmentwicklungs- und Fehlersuch-Werkzeug fuer Z180- Mikrocomputer Einfuehrung =========== Das DDTZ ist ein komfortables Werkzeug zum Entwickeln und Austesten von Z180-Programmen, sowie zum Ueberpruefen des Zusam- menwirkens zwischen Programm und Hardware-System. Folgende Komponenten sind im DDTZ enthalten: - Disassembler zum Rueck-Uebersetzen von Maschinenprogrammen. - Tracer zum Ausfuehren von Programmen in Einzelschritten. - 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 [todo] Es benoetigt eine Z80- oder Z180-CPU und belegt [todo] KBytes Speicher. Der Gebrauch des DDTZ ===================== Der Aufruf [todo] ---------- relokation um dem Anwenderprogramm die durch das DDTZ verringerte Speichergroesse mitzuteilen. Der urspruenglich vom DDTZ belegte Speicher wird daraufhin mit Nullen geloescht. [todo] HW-Initialisierung Nach Ausgabe des Prompt-Zeichens '>' ist das DDTZ betriebs- bereit. Die Kommandos ------------- Jede Taetigkeit des DDTZ, z.B. Disassemblieren eines Programm- Abschnittes usw. wird mit einem Kommando eingeleitet. Kommandos koennen immer dann eingegeben werden, wenn das DDTZ mit dem Prompt-Zeichen '> ' oder '>>' seine Bereitschaft anzeigt. Kommandos beginnen mit einem der Zeichen '' [todo] bis 'Z', eventuell gefolgt von weiteren optionalen Buchstaben, sowie Argumenten. Bei einigen Kommandos sind alle Argumente obligat, d.h. alle Argumente muessen angegebnen werden. 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 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, [todo] z.B.: > s100 0100 00 3E 00 3D C2 02 01 C3 00 00 0109 00 . Listen Sie das Programm dann mit dem L-Kommando in disassem- blierter Form aus, > l100 108 0100 LD A,00 0102 DEC A 0103 JP NZ,0102 0106 JP 0000 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. B - Anzeigen aller Breakpoints. (display all breakpoints) Die Adressen aller gesetzten 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 Kommando T) 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. 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 oder 30H voreingestellt. Ist die voreingestellte Adresse jedoch fuer andere Zwecke bereits vergeben, so kann der RST-Befehl geaendert werden, z.B. auf 30H: > LT4S1 xxx9 RST 38 >>ST4 xxx9 F7 F7 xxxA 00 . > LT4S1 xxx9 RST 30 BX -- Loeschen aller Breakpoints. (clear all breakpoints) BX adresse [adresse..] ---------------------- Loeschen der Breakpoints an den angegebenen Adressen. (clear breakpoints) 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. 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 R-Kommando) H ausdruck ---------- Berechnen eines Ausdrucks. (compute expression / Hex and other) Wird ein Ausdruck angegeben, so zeigt das DDTZ dessen Ergebnis an 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 '^x' 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 11111111"10011100" '^\'. 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 Z180-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 ver- gleichen. (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 startadr endadr bytes -------------------------- Durchsuchen des Speichers nach einer gegebenen Folge von Bytes. (Query memory for a byte string) 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. 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 ? [todo] > 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] ---------------- [todo console/reader] Einlesen einer HEX-File in den Speicher, eventuell verschoben. (Read a hex file [add displacement]) Eine Intel-Hex-File wird von der (seriellen) Reader-Schnittstelle in den Speicher eingelesen. Die Daten werden bei den in der File enthaltenen Adressen im Speicher abgelegt. Wird im R-Kommando ein Displacement angegeben, so wird eine HEX-File bei der entsprechenden Adresse erhoeht um das Dis- placement abgelegt. 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, wurde beim Lesen ein Checksummenfehler entdeckt, oder die File belegt Speicher- plaetze ausserhalb des Bereichs L bis T. 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. - 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 [befehlsanzahl] ----------------- Tracen (Trace) 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 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. 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. 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. 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 Z180-Befehl, auf den der Programmzaehler zeigt, wird in dis- assemblierter Form ausgegeben. z.B. 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 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 ----------------------------- > 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 >>D [startadr] [endadr] Display memory in hex and ASCII Auslisten des Speichers in HEX und ASCII > 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 >>I [port] Input a byte from port Einlesen eines Daten-Bytes von einem Port >>L [startadr] [endadr] List disassembled code Listen eines Speicherbereichs in Z180-Mnemonics > M startadr endadr zieladr Move memory Umladen eines Speicherbereiches in einen anderen >>O [byte] [port] Output a byte to a port Ausgeben eines Datenbytes an einen Ausgabeport > Q startadr endadr bytes Query memory for a byte string Durchsuchen des Speichers nach einer gegebenen Folge von Bytes > R [displacement] Read a hex file ]add displacement] Einlesen oder HEX-File in den Speicher, evtl. verschoben > S [startadr] Substitute Memory Anzeigen und Aendern von Daten im Speicher >>T [befehlsanzahl] Trace Tracen > Vstartadr endadr zieladr Verify (compare) two memory areas Vergleichen zweier Speicherbereiche > 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 > 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 ^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. 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) 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 L10 dasselbe wie L+10. Ausdruecke duerfen keine Leerzeichen enthalten!