From: Leo C Date: Mon, 10 Dec 2018 17:03:13 +0000 (+0100) Subject: Remove register name aliases and unused strings t_(tstfl_ZCPS). dissas opt (arg printing) X-Git-Tag: v0.5~24 X-Git-Url: http://cloudbase.mooo.com/gitweb/ddt180.git/commitdiff_plain/a942c6d54de9236552a5e821c105be2823fb16bc Remove register name aliases and unused strings t_(tstfl_ZCPS). dissas opt (arg printing) --- diff --git a/ddt180.z80 b/ddt180.z80 index 4f167f6..cd6b3ff 100644 --- a/ddt180.z80 +++ b/ddt180.z80 @@ -390,6 +390,14 @@ outchar: pop ix ret +pstr_sel: + inc b + jr pstr_sel2 +pstr_sel1: + call sub_0345h +pstr_sel2: + djnz pstr_sel1 + ;fall thru pstr: ld a,(hl) inc hl @@ -654,14 +662,6 @@ l0339h: pop bc ret -sel_dc_string: - inc b -l033eh: - dec b - ret z - call sub_0345h - jr l033eh - sub_0345h: ld a,(hl) and a @@ -1682,15 +1682,13 @@ cmd_X: jp nc,p_cpustat0 call assert_eol ld a,b - cp 01eh + cp 25 jr z,l0c5fh - cp 01fh + cp 26 jr z,l0c4fh - cp 01dh - jp z,ERROR ex de,hl ld hl,t_reg_names - call sel_dc_string + call pstr_sel call l0c33h call outbl @@ -1715,7 +1713,6 @@ l0c30h: ret l0c33h: - call pstr call pstr_inl dc '=' ld a,(de) @@ -1800,38 +1797,33 @@ sub_0caeh: ret t_reg_names: - DC 'BC''' - DC 'DE''' - DC 'HL''' - DC 'BC' - DC 'DE' - DC 'HL' - DC 'A''' - DC 'B''' - DC 'C''' - DC 'D''' - DC 'E''' - DC 'H''' - DC 'L''' - DC 'A' - DC 'B' - DC 'C' - DC 'D' - DC 'E' - DC 'H' - DC 'L' - DC 'IX' - DC 'IY' - DC 'SP' - DC 'PC' - DC 'X' - DC 'Y' - DC 'S' - DC 'P' - DC 'I' - DC 'IP' - DC 'F''' - DC 'F' + DC 'BC''' ;0 + DC 'DE''' ;1 + DC 'HL''' ;2 + DC 'BC' ;3 + DC 'DE' ;4 + DC 'HL' ;5 + DC 'A''' ;6 + DC 'B''' ;7 + DC 'C''' ;8 + DC 'D''' ;9 + DC 'E''' ;10 + DC 'H''' ;11 + DC 'L''' ;12 + DC 'A' ;13 + DC 'B' ;14 + DC 'C' ;15 + DC 'D' ;16 + DC 'E' ;17 + DC 'H' ;18 + DC 'L' ;19 + DC 'IX' ;20 + DC 'IY' ;21 + DC 'SP' ;22 + DC 'PC' ;23 + DC 'I' ;24 + DC 'F''' ;25 + DC 'F' ;26 DB 0 b_0cfa_start: @@ -1883,18 +1875,8 @@ b_0cfa_start: dw reg_sp db 003h dw reg.pc - db 003h - dw reg.ix - db 003h - dw reg.iy - db 003h - dw reg_sp - db 003h - dw reg.pc db 000h dw reg.i - db 003h - dw l004eh db 000h dw reg.f2 db 000h @@ -2400,19 +2382,6 @@ p_max_high: CALL_HL: jp (hl) -;------------------------------------------------------------------------------- - - - - -b_176d_start: - DC 'AF,AF''' -l1773h: - DC 'DE,HL' - DC '(SP),HL' - DC '(SP),IX' - DC '(SP),IY' - db 0 ;------------------------------------------------------------------------------- ; >>L [startaddr] [endaddr] @@ -2464,21 +2433,13 @@ cmdl_p_line: ret p_disas_line: - call outbl2 call out_hl - call z,outbl - call outbl + call outbl2 sub a ld (con_col),a push hl pop iy call p_disas_instr - ret z - - ld c,15 - call p_goto_col - ; fall thru -;------------------------------------------------------------------------------- ret ;------------------------------------------------------------------------------- @@ -3026,8 +2987,9 @@ l1caeh: jr out_rparen p_arg_ex_dehl: - ld hl,l1773h - jp pstr + call pstr_inl + DC 'DE,HL' + ret l1cc1h: call pstr_inl @@ -3035,8 +2997,9 @@ l1cc1h: jp p_arg_hlixiy p_arg_ex_afaf: - ld hl,b_176d_start - jp pstr + call pstr_inl + DC 'AF,AF''' + ret l1cd3h: call p_arg_hlixiy @@ -3261,18 +3224,15 @@ p_arg_rs: p_arg_r0: and 007h cp 006h - jr nz,p_arg_r1 + ld b,a + ld hl,t_BCDEHL_HL_A + jr nz,p_arg0 ld a,(isprefix_ixiy) and a - ld a,006h - jr z,p_arg_r1 - ld hl,b_1e78_start - ld a,(isprefix_ixiy) + jr z,p_arg0 + ld hl,t_lp_IXIY dec a - jr z,l1e4dh - ld hl,l1e7bh -l1e4dh: - call pstr + call p_arg ld a,(iy+001h) push af rlca @@ -3287,13 +3247,8 @@ l1e61h: pop af jp p_arg_nn_rp -p_arg_r1: - ld hl,t_BCDEHL_HL_A - jr p_arg - -b_1e78_start: +t_lp_IXIY: DC '(IX' -l1e7bh: DC '(IY' p_arg_hlixiy: @@ -3326,8 +3281,8 @@ p_arg_cc0: ld hl,t_tstfl_ZCPS p_arg: ld b,a - call sel_dc_string - jp pstr +p_arg0: + jp pstr_sel ;------------------------------------------------------------------------------- @@ -3430,13 +3385,11 @@ t_BC.DE.HL.SP: t_BC.DE.HL.AF: DC 'BC' DC 'DE' - DC 'HL' DC 'AF' DB 0 t_HL.IX.IY: DC 'HL' - DC 'IX' DC 'IY' DB 0 @@ -3449,12 +3402,6 @@ t_tstfl_ZCPS: DC 'PE' DC 'P' DC 'M' - DC 'NE' - DC 'EQ' - DC 'GE' - DC 'LT' - DC 'NV' - DC 'V' DB 0 t__C_: DC '(C)' @@ -3481,7 +3428,7 @@ tc_set_bp: add hl,bc call bp_trace_enter ld iy,(reg.pc) - ld hl,b_2039_start + ld hl,t_branch_instr call lookup_opc ccf ret c @@ -3495,15 +3442,14 @@ l2037h: ;------------------------------------------------------------------------------- -b_2039_start: +t_branch_instr: db 0ffh,0ddh,000h ;Prefix DD dw l20a7h db 0ffh,0fdh,000h ;Prefix FD dw l20ach db 0ffh,0edh,000h ;Prefix ED dw l20b8h - -b_2048_start: +t_branch_instr0: db 0ffh,0cdh,000h ;call mn dw l2080h db 0ffh,0c3h,000h ;jp mn diff --git a/doc/ddtz-de-tiny.txt b/doc/ddtz-de-tiny.txt new file mode 100644 index 0000000..9e85e9c --- /dev/null +++ b/doc/ddtz-de-tiny.txt @@ -0,0 +1,800 @@ + + + + *************************************** + ***** ***** + ***** 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!