     **********************************************************************
     *                                                                    *
     *                 PEACEBUG                                           *
     *                 --------                                           *
     *                                                                    *
     * written by:     Emanuel Mcklin                                    *
     *                 Zschokkestrasse 7                                  *
     *                 CH-8037 Zrich                                     *
     *                 FREDDY@ezrz1.vmsmail.ethz.ch                       *
     *                                                                    *
     * written with:   Turboassembler 1.xx                                *
     *                                                                    *
     **********************************************************************




                               Inhaltsverzeichnis
                               ------------------


     1.  Vorwort
     2.  Starten von PEACEBUG
     3.  Editor
          3.1. Grundstzliches
          3.2. Bildschirmaufbau
          3.3. Tastaturbelegung
          3.4. Maus
          3.5. Funktionstasten
     4.  Befehle
          4.1. Syntax
          4.2. Formelauswertung
          4.3. Listende Befehle
          4.4. Ausgabenumlenkung
          4.5. Diskoperationen
          4.6. Befehlsbersicht
          4.7. Befehle
     5.  Trace, Breakpoints und dergleichen
     6.  Cache
     7.  Symbole
          7.1. PEACEBUG.SYM
          7.2. Lexecute
          7.3. Resident Symbol Driver
     8.  Reset fest, Reset resident
     9.  Vektoren
          9.1. XBRA
          9.2. Ein Wort regelt alles...
          9.3. Das hherwertige Byte
          9.4. Das niederwertige Byte
          9.5. Vektoren, in eigener Sache
     10. Schnittstelle
         10.1. Grundstzliches
         10.2. Bildschirmschnittstelle
         10.3. CALL_DEBUGGER
         10.4. VERSION
         10.5. PARAMETER
         10.6. Userroutinen
         10.7. FLAGS
         10.8. Vektor








     1. Vorwort
     ----------



     PEACEBUG ist ein Low Level Debugger. Ursprnglich als Hintergrundde-
     bugger konzipiert, ist er in der vorliegenden Version voll symbolisch
     und fhig Programme zu laden. Trotzdem liegen seine Strken vorallem
     beim Debuggen aus dem Hintergrund. Wenn unvorhergesehene Exceptions
     auftreten, die normalerweise Bomben produzieren, tritt PEACEBUG auf
     den Plan und bietet dem Assemblerkundigen die Mglichkeit, diese Feh-
     ler zu meistern, ohne den Rechner neu booten zu mssen. PEACEBUG ist
     nicht fr den Normaluser gedacht, deshalb wird in dieser Anleitung
     vorausgesetzt, dass der geneigte Benutzer ber Grundkenntnisse in Sa-
     chen Assembler verfgt.

     Wie Sie sicher sofort bemerkt haben, ist die Oberflche an diejenige
     von Bugaboo angelehnt. Dies trifft ebenso auf die Bedienung und die
     Befehle zu, wobei teilweise entscheidende Unterschiede bestehen, stu-
     dieren Sie deshalb diese Anleitung sorgfltig.

     Features von PEACEBUG:
     - erkennt und untersttzt die CPU's MC68000/10/20/30/40
     - erkennt und untersttzt die FPU's MC68881/82
     - luft auf allen ST(e)'s, TT's und mit Einschrnkungen auf dem F030
     - luft mit allen TOS-Versionen, Multigem, Mag!X, unter MinT/Multitos
       mit Einschrnkungen
     - luft auf jeder planeorientierten Auflsung
     - luft im ST- und TT-Ram
     - MC680x0/MC6888x Disassembler
     - MC680x0 Assembler
     - resetfest
     - resetresident
     - komfortable Oberflche
     - Mausbedienung
     - voll symbolisch
     - umfangreiche und dokumentierte Schnittstelle
     - unabhngig vom Betriebsystem
     - schnell(er) ...

     PEACEBUG ist Shareware und darf beliebig weiterkopiert werden. Bei
     regelmssiger Benutzung ist eine Sharewaregebhr von 30 DM zu berwei-
     sen.
     Registrierte User knnen mir eine Diskette und ein frankiertes Rk-
     kantwortcouvert schicken, Sie erhalten dann die neuste Version.

     Und hier das wichtigste:
                              Zrcher Kantonalbank
                             Bankleitzahl 80-3514-8
                              Konto 1113-0818.732

     WICHTIG: Schicken Sie mir bitte keine Euroschecks, da die Gebhr 10.-
     betrgt, was bei einem Gesamtbetrag von 30.- nicht unwesentlich ist.








     2. Starten von PEACEBUG
     -----------------------



     Es gibt zwei verschiedene Arten PEACEBUG zu starten: Resident oder als
     Programm.
     - Resident: Bedeutet, dass er sich installiert und mit Ptermres been-
       det (TSR). Er kann dann jederzeit ber Tastatur aufgerufen werden.
       Default: Alternate+F10 oder Alternate+Control+F10. Diese Tastenkom-
       bination knnen Sie Ihren Wnschen anpassen >Schnittstelle. Falls
       eine Exception auftritt, meldet sich der Debugger ebenfalls, damit
       Sie entsprechende Massnahmen ergreifen knnen. Die residente Version
       installiert einen Cookieeintrag mit der Kennung "PBUG" und eine
       Doppelseite.
     - Programm: Bedeutet, dass er sich installiert und in den Editor
       springt. Von dort aus knnen Sie dann nach Herzenslust debuggen. Sie
       knnen den Debugger ber >QUIT beenden, er entfernt sich dann voll-
       stndig aus dem Speicher. Die Programmversion installiert weder
       einen Cookie noch eine Doppelseite. Es stehen zustzlich die beiden
       Befehle >RESIDENT und >LEXECUTE zur Verfgung.

     Falls der Debugger aus dem Autoordner gestartet wird, installiert er
     sich automatisch resident. Wird er hingegen vom Desktop gestartet,
     meldet er sich als Programm, es sei denn Sie halten Control gedrckt,
     dann wird er ebenfalls resident installiert. Wenn Sie Alternate ge-
     drckt halten, verhindern Sie ein Installieren des Debuggers (egal ob
     als Programm- oder als residente Version). Eine als Programm gestarte-
     te Version kann mit dem Befehl >RESIDENT resident gemacht werden.

     Wenn sich im gleichen Verzeichnis eine Datei befindet, die dem Pattern
     PEACE*.SYM gengt, wird diese als Symboltabelle interpretiert und
     nachgeladen. Nheres zu dem Thema siehe Kapitel "Symbole".

     Der Debugger verlsst sich darauf, dass der _MCH Cookie korrekt ist.
     Falls er keinen findet, geht er von einem ST aus. CPU und FPU werden
     selbststndig erkannt.

     Bei vorhandender virtueller Speicherverwaltung (VRAM oder OUTSIDE)
     wird der vom Debugger belegte Speicher vor dem Auslagern geschtzt.

     Beachten Sie, dass der Debugger auch mehrmals installiert werden kann.
     Dies ist Absicht und auch sinnvoll, z.B. wenn Sie PEACEBUG selber de-
     buggen wollen oder wenn Sie mit verschiedenen Konfigurationen arbei-
     ten wollen.








     3. Editor
     ---------



     3.1. Grundstzliches
     --------------------


     Die Bedienung von PEACEBUG orientiert sich an derjenigen von Bugaboo.
     Viele der Funktionen wurden allerdings optimiert und gestatten ein
     viel schnelleres und effizienteres Arbeiten. Die Oberflche orientiert
     sich an den Anwendern, die keine Zeit mit unntigen Abfragen verlieren
     wollen. Dass dadurch auch Abstrze produziert werden knnen, weil eine
     falsche Funktion ausgefhrt wird, wird den potentiellen Benutzer kaum
     stren.
     Der Editor benutzt keine Betriebsystemfunktionen, sowohl der Maus- als
     auch der Tastatur- und der Bildschirmtreiber sind unabhngig vom Be-
     triebsystem.



     3.2 Bildschirmaufbau
     --------------------


     Die beiden ersten Zeilen zeigen das Funktionstastenmen. Die erste
     Zeile (F1-F10) wird ber F1-F10, die zweite (F11-F20) ber Shift F1-
     F10 angesprochen. Die entsprechenden Funktionen knnen auch durch Ank-
     licken mit der Maus aufgerufen werden.
     Darunter sind die aktuellen Registerinhalte dargestellt, wobei sich
     diese Anzeige aus Platzgrnden auf die wichtigsten Register be-
     schrnkt, die fehlenden knnen jederzeit ber den Befehl >REGISTER
     abgerufen werden.

     - PC = Programmcounter
     - USP = UserStackPointer
     - ISP = InterruptStackPointer (oder SSP = SupervisorStackPointer)
     - MSP = MasterStackPointer
     - SR = StatusRegister. Die Bedeutung der einzelnen Flags/Bits knnen
       Sie in jedem Buch ber die MX680x0 Prozessoren entnehmen. Hell dar-
       gestellte Flags sind gelscht und knnen durch Anklicken mit der
       Maus gesetzt bzw. gelscht werden. Beim Scrollen durch den Cache
       wird die SR-Anzeige durch den Opcode ersetzt, der sich an der Adres-
       se befindet, auf die der aktuelle PC zeigt. Dieser Opocde verschwin-
       det wieder bei jeglicher Maustasten- oder Keyboardaktivitt.
     - Die nchsten beiden Zeilen stellen D0-D7 und A0-A7 dar. A7 enthlt
       immer den Wert des aktuellen Stackpointers (USP, SSP oder MSP) in
       Abhngigkeit vom Statusregister.

     Die Register knnen editiert werden, jedoch sind dabei die Editiermg-
     lichkeiten eingeschrnkt, z.B. wird immer der berschreibmodus be-
     nutzt.
     Neben den Registern befinden sich zwei Pfeile, eventuell ein Close
     Zeichen und zwei Cacheanzeigen. Nheres zu dem Thema siehe Kapitel
     "Cache".
     Darunter befindet sich Ihr "Workspace", wo Sie Befehle eingeben und wo
     die Ausgaben normalerweise stattfinden.

     Anstelle von F20 befindet sich eine Uhr. Diese zeigt die Zeit an:
     - Falls keine Echtzeituhr eingebaut ist, wird direkt die IKBD Uhr
       abgefragt.
     - Auf einem Mega ST wird direkt die eingebaute Uhr abgefragt.
     - Auf einem TT wird ebenfalls die eingebaute Uhr abgefragt.
     - Die Erkennung der Echtzeituhren sollte eigentlich sehr zuverlssig
       sein, d.h. auch in ST's nachtrglich eingebaute Uhren werden er-
       kannt.



     3.3. Tastaturbelegung
     ---------------------


     Alle hier beschriebenen Funktionen knnen leicht verschieden sein, je
     nachdem wo sich der Cursor gerade befindet. Es ist nicht sinnvoll,
     hier alle Details zu erlutern, Ausprobieren fhrt meistens schneller
     zum Ziel.
     Fr Details betreffend Cache-Funktionen siehe Kapitel "Cache".

     - Pfeil Auf: Der Cursor bewegt sich eine Zeile nach oben, in der ober-
       sten Zeile wird nach Mglichkeit gescrollt oder der Cursor bewegt
       sich ins Registerfeld.

     - Pfeil Ab: Der Cursor bewegt sich eine Zeile nach unten, in der un-
       tersten Zeile wird gescrollt.

     - Shift Pfeil Auf: wie Pfeil Auf, beim Scrollen wird allerdings immer
       nur 2 Bytes gescrollt. Dies ist ntzlich, wenn beim zurckscrollen
       nicht ab der richtigen Stelle disassembliert wurde, weil es ver-
       schiedene sinnvolle Mglichkeiten gab (der Debugger ist schliess-
       lich auch nur ein Mensch). Solches knnen Sie damit schnell korri-
       gieren.

     - Shift Pfeil Ab: Es wird 2 Bytes nach unten gescrollt (ab der ober-
       sten Adresse).

     - Control Pfeil Auf: Es wird eine ganze Seite nach oben gescrollt,
       wobei bei disassemblierter Ausgabe, die Seitenlnge nur geschtzt
       werden kann.

     - Control Pfeil Ab: Es wird eine ganze Seite nach unten gescrollt,
       hier kann immer die exakte Seitenlnge bestimmt werden.

     - Alternate Pfeil Auf: hat nur in der obersten Zeile eine Bedeutung.
       Damit gelangen Sie ins Registerfeld (normalerweise wird gescrollt).

     - Pfeil Rechts: bewegt den Cursor nach rechts, in der rechten unteren
       Ecke wird gescrollt.

     - Pfeil Links: bewegt den Cursor nach links, in der linken oberen Ecke
       wird gescrollt.

     - Shift Pfeil Rechts: holt sich den nchsten Eintrag aus dem History-
       puffer.

     - Shift Pfeil Links: holt sich den vorhergehenden Eintrag aus dem Hi-
       storypuffer.

     - Control Pfeil Rechts: bewegt den Cursor ans Ende der Zeile oder bei
       Adresszeilen ins Editfeld.

     - Control Pfeil Links: bewegt den Cursor an den Anfang der Zeile oder
       bei Adresszeilen ins Adressfeld.

     - Alternate Pfeil Rechts: damit scrollen Sie im Cache vorwrts. Den
       gleichen Effekt erzielen Sie durch Anklicken des Pfeiles in der 5ten
       Zeile.

     - Alternate Pfeil Links: damit scrollen Sie im Cache zurck. Den
       gleichen Effekt erzielen Sie durch Anklicken des Pfeiles in der 4ten
       Zeile.

     - Alternate Clr Home: bewegt den Cache zum ersten Eintrag (Nummer 0).
       Den gleichen Effekt erzielen Sie durch Anklicken des Close Zeichens
       in der 3ten Zeile.

     - Escape: lscht die aktuelle Zeile. Beachten Sie die Unterschiede je
       nach Cursorposition (Ausprobieren!)

     - Backspace: lscht das Zeichen links vom Cursor. Beachten Sie den
       Unterschied Insert-/berschreibmodus.

     - Insert: fgt ein Leerzeichen oder eine Null ein (je nach Cursorposi-
       tion)

     - Shift Insert: schaltet zwischen Insert- und berschreibmodus um

     - Control Insert: fgt eine Leerzeile ein

     - Alternate Insert: wechselt zum andern Cache, ohne kopieren des In-
       halts (siehe Kapitel "Cache")

     - Shift Alternate Insert: wechselt zum andern Cache, kopiert den In-
       halt (siehe Kapitel "Cache")

     - Delete: lscht ein Zeichen

     - Shift Delete: lscht den Rest der Zeile

     - Control Delete: lscht eine Zeile

     - Clr Home: Cursor in die linke obere Ecke

     - Shift Clr Home: lscht den ganzen Arbeitsbereich und bringt den Cur-
       sor in die linke obere Ecke

     - Help: enspricht dem Befehl >HELP ohne Parameter

     - Shift Help: der Debugger reserviert fr den Bildschirm (Ascii) so-
       viel Speicher, wie fr den Gebrauch des 8*8 Fonts gebraucht wird.
       Wenn Sie den 8*16 Font benutzen (was die Regel sein wird), dann
       liegt die Hlfte dieses Speichers brach, mit Help knnen Sie diesen
       aktivieren, Sie haben dann zwei unabhngige Screens zur Verfgung.

     - Undo: holt sich den zuletzt eingegebenen Befehl aus dem Historypuf-
       fer

     - Return/Enter: die aktuelle Zeile wird ausgewertet, siehe >Befehle

     - Control 1, 2, ..., 0: Im Gegensatz zu Bugaboo wird aus Rcksicht auf
       speicherarme User nicht die ganze Seite gerettet, sondern nur die
       Adresse am Anfang der Zeile, was aber meistens den gewnschten Ef-
       fekt hat. Mit 1, 2, ... sind brigens nicht die Zahlen des Zehner-
       blocks gemeint

     - Alternate 1, 2, ..., 0: Es wird ab der geretteten Adresse aufgeli-
       stet (Ascii, Hexdump, Disassemble oder List)

     - Control P: setzt den PC auf die aktuelle Adresse (Adresse am Zeile-
       nanfang)

     - Control B 0, 1, ...: setzt einen der zehn Breakpoints auf die ak-
       tuelle Adresse

     - Control G: entspricht dem Befehl >Go auf die Zeilenadresse

     - Control Q: entspricht dem Befehl >QUIT

     - Control T: entspricht der Taste F1

     - Control C: entspricht der Taste F2

     - Control R: entspricht der Taste F3

     - Control X: entspricht der Taste F4

     - Control S: entspricht der Taste F5

     - Control A: entspricht der Taste F6

     - Control H: entspricht der Taste F7

     - Control D: entspricht der Taste F8

     - Control L: entspricht der Taste F9

     - Control W: entspricht der Taste F10

     - Alternate Zahl: bei gedrckter Alternate Taste knnen Sie ein Zei-
       chen durch Eingeben des Asciicodes erreichen. Die Zahl muss auf dem
       Zehnerblock eingegeben werden.



     3.4. Maus
     ---------


     Die Maus hat folgende Funktionen:
     1. Positionieren des Cursors. Der Cursor kann auch auf ein Register
        gesetzt werden.
     2. Bedienung der Cacheelemente (Pfeile, Close).
     3. Auswhlen der Funktionstasten.
     4. Wenn Sie die rechte Maustaste drcken, wird der unter der Maus ste-
        hende Text an die aktuelle Cursorposition kopiert. Es werden aller-
        dings nur die Zeichen $ % . o 0 1 2 3 4 5 6 7 8 9 A B C D E und F
        kopiert. Wenn Sie zustzlich eine Shifttaste drcken, sind auch die
        Zeichen , - ( ) [ ] { } * # : _ und / zugelassen. Damit knnen Sie
        komfortabel Adressen (ohne Shift) bzw. Opcodes (mit Shift) kopie-
        ren.
     5. Wenn Sie mit der linken Maustaste auf eine Adresse doppelklicken,
        listet der Debugger ab dieser Adresse auf (Ascii, Hexdump, Disas-
        sembly oder List Modus). Es kann sich auch um ein Symbol handeln.



     3.5 Funktionstasten
     -------------------


     - F1-Trace: fhrt einen einzelnen Befehl aus. Ein Trace bewirkt ein
       vollstndiges Verlassen des Debuggers, d.h. der Bildschirm wird um-
       geschaltet, Register werden zurckgeschrieben, Vektoren restauriert
       usw. Linea, Trapv und Trap 0-15 werden als einzelne Befehle betrach-
       tet. Wenn Sie diese trotzdem tracen wollen, benutzen Sie F4-Texcept.

     - F2-Do PC: Es wird hinter dem aktuellen Befehl ein Breakpoint gesetzt
       und der Befehl angesprungen. Diese Funktion ist vorallem bei dbcc's
       sinnvoll. Kein Breakpoint wird brigens hinter ein bsr oder ein jsr
       gesetzt. Die Funktion funktioniert auch im ROM (siehe Kapitel 5,
       "Trace, Breakpoints und dergleichen").

     - F3-Tracrts: sollte nur nach einem bsr/jsr benutzt werden. Nimmt den
       obersten Wert vom Stack und schreibt eine eigene Rcksprungadresse
       drauf. So kann das Programm bis zum nchsten rts vortgesetzt wer-
       den.

     - F4-Texcept: wie F1-Trace, nur dass Traps (Trap 0-15, Trapv), Linea
       und der Illegal Opcode Handler getraced werden.

     - F5-Skip PC: berspringt den aktuellen Befehl, es wird ein Cacheein-
       trag erzeugt.

     - F6-Ascii: listet ab dem PC im Asciimodus

     - F7-Hexdump: listet ab dem PC im Hexdumpmodus

     - F8-Disassm: listet ab dem PC im Disassembliermodus

     - F9-List: listet ab dem PC im Listmodus

     - F10-Switch: schaltet zwischen Debugger- und Programmscreen hin und
       her. Es wird auch nach Verlassen und erneutem Einspringen nicht auf
       den Debuggerscreen geschaltet. Dies erlaubt Ihnen beim Tracen, das
       Programm zu beobachten, kann allerdings zu Verwirrung fhren, da
       auch bei Auftreten einer Exception nicht umgeschaltet wird. Falls
       Sie also einmal das Gefhl haben, der Rechner habe sich aufgehngt,
       drcken Sie zuerst F10, bevor Sie reseten...

     - F11-Tr68020: Simuliert den Tracemodus des MC68020/30/40, d.h. nur
       bei Befehlen, die den PC verndern (change of flow), wie Sprungbe-
       fehlen, rts, rte, rtr, Traps und Linea wird in den Debugger zurck-
       gesprungen.

     - F12-Tnosubs: Eine Unterroutine, die ber bsr oder jsr aufgerufen
       wird, kann mit dieser Taste bersprungen werden, d.h. die beiden
       Befehle werden wie ein einzelner Befehl behandelt. Wenn der aktuel-
       le Befehl kein bsr/jsr ist wird verfahren wie bei F1-Trace.

     - F13-Tracrte: setzt das Programm bis zum nchsten rte fort, die Werte
       auf dem Stack werden nicht geprft, sollte also nur nach einer Ex-
       ception aufgerufen werden.
       ACHTUNG: falls die Exceptionroutine den PC, der auf dem Stack liegt,
       bentzt, darf diese Funktion natrlich nicht aufgerufen werden. Dies
       ist z.B. bei Lineaexceptions der Fall. Sie knnen daher nicht mit-
       tels F4 ein Linea tracen und dann unmittelbar mit F13 weiterfahren.
       Dies ist erst erlaubt, wenn die Routine sich den Opcode geholt hat.

     - F14-GoTraps: setzt das Programm fort, bis dieses ein Betriebsystem-
       aufruf ttigt (Trap 1, Trap 2, Trap 13, Trap 14). Dies ist sehr
       praktisch, wenn man sich nur fr die wichtigen Stellen eines Pro-
       gramms interessiert und das sind hufig die Betriebsystemaufrufe.
       ACHTUNG: benutzen Sie diese Funktion mit Vorsicht, insbesondere
       lassen Sie unter MiNT die Finger davon. Gefahrlos ist diese Funktion
       nur, wenn der Exceptionhandler des Debuggers der oberste der XBRA-
       Verkettung ist (der als letzter eingehngt wurde).

     - F15-Breakpt: setzt oder lscht auf der aktuellen Adresse einen
       Breakpoint. Im Gegensatz zu Control B knnen Sie die Breakpoint-
       nummer nicht angeben, es wird automatisch die erste freie Nummer
       genommen und eine Meldung ausgegeben:
       "Stop Breakpoint $5 set" oder
       "Stop Breakpoint $5 cleared"

     - F16-Font: schaltet um zwischen 8*8 und 8*16 Font. Bei gesetzter
       SCREEN_LOCK Semaphore (>Schnittstelle) kann diese Funktion nicht
       aufgerufen werden.

     - F17-Symbol+/-/*: schaltet den Debugger um zwischen symbolisch und
       nichtsymbolisch (Disassembler/Formelinterpreter).
       - Symbol+ bedeutet, dass er alle Symbole benutzt.
       - Symbol* bedeutet, dass er nur die eigenen Symbole benutzt und die-
         jenigen des >Resident Symbol Drivers ignoriert.
       - Symbol- bedeutet, dass er gar keine Symbole benutzt.

     - F18-Insert+/-: schaltet zwischen dem berschreib- (Insert-) und dem
       Insertmodus (Insert+) hin und her.

     - F19-GO PC: setzt das Programm beim aktuellen PC fort.
     - F20-GO PC: setzt das Programm beim aktuellen PC fort. Der Button ist
       nicht beschriftet, dort befindet sich die Uhr.








     4. Befehle
     -----------



     4.1. Syntax
     -----------


     - Jeder Befehl kann abgekrzt werden, solange er eindeutig bleibt. Die
       signifikanten Zeichen sind in Grossbuchstaben geschrieben und bezei-
       chnen die krzeste Form, die Sie bentzen drfen. Es ist allerdings
       immer erlaubt, mehr Zeichen einzugeben als ntig (h=he=hel=help).

     - Die Auswertung Ihrer Eingaben wurde so flexibel wie mglich program-
       miert, z.B. werden berflssige Eingaben ignoriert und keine Fehler-
       meldungen ausgegeben.

     - Werte in eckigen Klammern sind optional, z.B. Help [Befehl] oder Clr
       [From][,To].
       Wenn Sie keine Eingabe machen, wird ein Defaultwert genommen. Bei
       Adressen gilt folgende Regel:
       - Den PC als Defaultadresse nehmen die Befehle Ascii, Disassemble,
         Dump, List, Call, Do und Go.
       - Checksumme nimmt die Sektorpufferadressse als Default.
       - Alle andern Befehle nehmen als Defaultadresse(n) diejenigen des
         geladenen Files/Programms, falls ein solches existiert.

     - Werte in geschweiften Klammern sind optional und beliebig oft wie-
       derholbar, z.B. ? Term{,Term}.

     - Bei den Befehlen kann etwas in der Form [.b|.w] angegeben sein. Dies
       ist in der Regel die Schrittweite (suchen, vergleichen...) und kann
       sein: byte, word, address, long, no default oder opcode. Nheres
       dazu bei der jeweiligen Befehlsbeschreibung.

     Beispiele:

     1. Input: "$001C7FB2>d^a7#1! *MOVE.L    D0,-(SP)"
        disassembliert ab dem SP eine Zeile

     2. Input: "com 60,70,10"="Compare 60,80,10" = "cOMp .b 6 0 , 7 0 , 10"
        Vergleicht 16 Bytes der Adressen $60 und $80 in Byteschritten

     3. Input: "sh ^mmusr , 3" = "showm ^psr,3"
        Showmemory im Hexdumpmodus ab dem Wert den das MMUSR enthlt

     4. Input: "ascF p84,.remtop,'*PMOVE*'" = "ASCFIND pl84, .remtop,'**P-
        MOVE**'"
        sucht den Bereich von p84 bis remtop nach PMOVE's ab



     4.2. Formelauswertung
     ---------------------


     Zahlenbasen:
        %         Binr
        .         Dezimal
        $         Hexadezimal
        o         Oktal
        ' oder "  ASCII
     Wird kein Prefix verwendet, wird die Defaultbasis verwendet (normaler-
     weise 16). Diese kann ber die Cookieschnittstelle verndert werden.

     Vorzeichen:
        + Plus
        - 2er Komplement
        ~ 1er Komplement

     Verknpfungen:
        + Addition
        - Subtraktion
        * Multiplikation (32 Bit)
        / Division (32 Bit)
         Odern
        & Anden
        ^ Eoren
        > Shift Right
        < Shift Left
        % Modulo
     Die Prioritten der Verknpfungen und der Vorzeichen knnen ber die
     Schnittstelle verndert werden. Beispielsweise ist so Strich- vor
     Punktrechnung realisierbar (aber wohl nicht sinnvoll).

     Referenzen:
     ^Register: Register werden immer mit einem ^ angesprochen. Es sind
     folgende Register verfgbar:
        D0-D7/A0-A7
        SP (Stack Pointer)
        USP (User Stack Pointer)
        SSP (Supervisor Stack Pointer)
        ISP (Interrupt Stack Pointer)
        MSP (Master Stack Pointer)
        PC (Program Counter)
        SR (Status Register)
        CCR (Condition Code Register)
        SFC (Source Function Code)
        DFC (Destination Function Code)
        VBR (Vector Base Register)
        CAAR (CAche Adress Register)
        CACR (CAche Control Register)
        MMUSR (MMU Status Register)
        PSR=MMUSR (PSR ist 68851 Notation)
        TT0 (Transparent Translation 0)
        TT1 (Transparent Translation 1)
        TC (Translation Control)
        URP (User Root Pointer)
        DTT0 (Data Transparent Translation Register 0)
        DTT1 (Data Transparent Translation Register 1)
        ITT0 (Instruction Transparent Translation Register 0)
        ITT1 (Instruction Transparent Translation Register 1)
     Die beiden Register SRP (Supervisor Root Pointer) und CRP (CPU Root
     Pointer) knnen nicht benutzt werden, da es sich dabei um 64 Bit Regi-
     ster handelt und der Debugger nur 32 Bit Arithmetik beherrscht.

     pb, pw, pl, p Pointer: der dem Pointer folgende Ausdruck wird als
     Adresse interpretiert und deren Inhalt ausgelesen. Mit pb erfolgt dies
     als Byte, mit pw als Word und mit pl oder p als Long.

     .Symbol: alle Symbole werden mittels eines . angesprochen

     Klammern: sind beliebig tief schachtelbar

     Beispiele:
     l p(^vbr+.trace): listet die Traceroutine auf
     l p(p.trap_1-4): listet die Routine auf, die als zweite im Gemdosvek-
     tor hngt (falls diese XBRA benutzen)



     4.3. Listende Befehle
     ---------------------


     Fast alle Befehle, die irgendwelche Ausgaben machen, knnen unterbro-
     chen werden:
     - Escape: Abruch, keine weiteren Ausgaben mehr. Funktioniert zu jedem
       Zeitpunkt, wenn der Cheatmode nicht aktiv ist
     - Space: die Ausgabe wird angehalten, sie kann durch einen beliebigen
       Tastendruck fortgesetzt werden
     - Control: solange die Controltaste gedrckt gehalten wird, wird die
       Ausgabe angehalten

     Falls eine Ausgabe lnger als eine Zeile ist, wird am Ende der Zeile
     der Asciicode 3 geprintet (Asciicode 3 sollte ein Pfeil sein). Dies
     soll Ihnen anzeigen, dass nicht der ganze String sichtbar ist.



     4.4. Ausgabenumlenkung
     ----------------------


     Ausgaben erfolgen meistens auf dem Screen.
     Durch anhngen eines >device: knnen diese allerdings umgelenkt wer-
     den. Es sind im Moment drei Devices verfgbar: midi: (MIDI), prn:
     (Centronics) und aux: (Seriell).
     Aber nicht nur Devices knnen Sie angeben, auch Dateien sind erlaubt:
     - >file erzeugt eine Datei namens "file" und schreibt alle Ausgaben in
       dieses File. Wenn die Datei schon existiert, wird sie zuerst ge-
       lscht.
     - >>file ffnet eine Datei und schreibt die Ausgaben ans Ende der Da-
       tei. Wenn Sie noch nicht existiert, wird sie erzeugt.

     Beispiele:
     d fc0000,fc0000+.192000 >m:rom_dis
     disassembliert das ROM in eine Datei auf Laufwerk m
     help >help\helpfile
     schreibt die Ausgaben von help in eine Datei helpfile im Ordner help



     4.5. Diskoperationen
     --------------------


     Alle Funktionen mit Ausnahme der Diskoperationen sind unabhngig vom
     Betriebsystem. Wenn Sie per Tastatur in den Debugger einspringen, be-
     deutet das, dass der Debugger im Interrupt luft. Wenn Sie dann ir-
     gendwelche Betriebsystemfunktionen aufrufen, ist die Wahrscheinlich-
     keit, dass das dem Rechner nicht wohlbekommt, ziemlich hoch. Sollten
     Sie also diese Absicht haben, so rufen Sie den Debugger mit Vorteil
     ber CALLPBUG auf (im Ordner PEACEBUG\UTILLITY).
     Wenn Fehler bei Diskoperationen auftreten, erscheinen normalerweise
     Alertboxen, was z.B. in Tosprogrammen eher lstig ist, steht doch kei-
     ne Maus zur Verfgung. Um dies im Debugger zu verhindern, installiert
     er einen eigenen etv_critic Handler, es erscheint dann anstatt einer
     Box, eine Meldung wie:
      BIOS-Error -13: (A)bort, (R)etry, (I)gnore?

     Folgende Fehler knnen auftreten:
     -1: Error: Es ist ein Fehler aufgetreten, der nicht genauer spezifi-
         ziert werden kann.
     -2: Drive not ready: Angesprochenes Gert ist nicht angeschlossen,
         nicht funktionsbereit oder reagiert nicht innerhalb der gesetzten
         Frist (Timeout).
     -3: Unknown Command: Dem angesprochenen Peripheriegert ist das gege-
         bene Kommando unbekannt.
     -4: CRC Error: Beim Lesen eines Sektors ist ein CRC-Fehler aufgetre-
         ten.
     -5: Bad request: Das Peripheriegert kann das Kommando nicht aus-
         fhren.
     -6: Seek Error: Der angesprochene Track konnte vom Laufwerk nicht er-
         reicht werden.
     -7: Unknown Media: Leseversuch gescheitert, da das Medium keinen kor-
         rekten Bootsektor besitzt.
     -8: Sector not found: Der betreffende Sektor wurde nicht gefunden.
     -9: Out of Paper: Drucker nicht betriebsbereit.
     -10:Write fault: Fehler bei Schreiboperation aufgetreten.
     -11:Read fault: Fehler bei Leseoperation aufgetreten.
     -12:General Error: Allgemeiner Fehler, "reserved for future catastro-
         phes".
     -13:Write on write-protected media: Es wurde versucht, auf ein
         schreibgeschtztes Medium zu schreiben.
     -14:Media change detected: Seit der letzten Schreiboperation wurde das
         Medium gewechselt.
     -15:Unknown device: Das angesprochene Gert ist dem Betriebsystem un-
         bekannt.
     -16:Bad sectors on format: Beim Formatiervorgang wurden defekte Sekto-
         ren entdeckt.
     -17:Insert other disk request: Eine andere Diskette muss eingelegt
         werden. Tritt nur auf, wenn Laufwerk B angesprochen wird, ohne an-
         geschlossen zu sein.
     -18:Insert Disk: Meta-DOS-Fehler: Medium einlegen.
     -19:Device not responding: Meta-DOS-Fehler: Gert antwortet nicht.



     4.6. Befehlsbersicht
     ---------------------

     Ascii [From][[,To]|[[,]#Lines]|[,][Bytes]|[.]]
     ASCFind[.w|.l] [From][,To],String - default opcode
     Breakpoints [Number[=Address[,*|,=[Value]|,Number]]]|[[Number]-]
     Call [Address]
     CD [Path]
     CHecksumme [Address][,Checksum][,Number]
     CLr [From][,To]
     COld
     COMpare[.b|.w|.l] [From][,To],Destination - default byte
     COOkie
     COPy [From][,To],Destination
     Disassemble [From][[,To]|[[,]#Lines]|[,][Bytes]|[.]]|:[CPUs]
     DFree [Drive:]
     DIRectory [Path]
     DO [Address]
     DUmp [From][[,To]|[[,]#Lines]|[,][Bytes]|[.]]
     Exit [Value]
     Find[.b|.w|.l] [From][,To],Term,{Term} - default byte
     FILl [From][,To],Term{,Term}
     FRee
     Go [Address][,Breakpoint]
     Help [Command]
     HUnt [From][,To],Term,{Term}
     Info
     List [From][[,To]|[[,]#Lines]|[,][Bytes]|[.]]
     LAst
     LEt Register=Value
     LEXecute [Filename]
     LOad [Filename][,Start[,End]]|-
     LS [Pfad]
     Memory [From][[,To]|[[,]#Lines]|[,][Bytes]]
     MKdirectory Directory
     Newformat
     Observe [[Address][,Bytes]|-|+]
     Page
     PRograms
     Quit [Value]
     Readsector [Track][,Sector][,Side][,Address][,Drive]
     REGister [Register]
     RESident
     RMdirectory [Directory|File]
     Save [Filename][,Start,End]
     SEt Register=Value
     SHowmemory [Term[,List]]|[[Number]-]
     SLow [ON|OFF]
     SWitch [ResolutionDebugger][,ResolutionProgram]
     SYmbol [From][,To]
     SYSinfo
     Trace [Number|+|-|*]
     Warm
     WRitesector [Track][,Sector][,Side][,Address][,Drive]
     Xbra [FirstVector[,LastVector][,ID]]
     ? Term{,Term}
     / [.b|.w|.a|.l] [Term]{,Term} - default word
     ! Opcode
     , [.b|.w|.a|.l] [Term]{,Term} - no default
     ) String
     : Address[,Term]{,Term}



     4.7. Befehle
     ------------


     4.7.1. ASCII

     Syntax: Ascii [From][[,To][[,]#Lines][,][Bytes][.]]

     Gibt einen Speicherbereich als String aus:
     - From: Ab dieser Adresse wird ausgegeben
     - To: Gibt bis zu dieser Adresse aus, bei allen Befehlen bedeutet "To"
       brigens exklusive "To".
     - #Lines: Anstatt eine Endadresse, kann die Anzahl Zeilen bestimmt wer-
       den, die ausgegeben werden sollen. Das , vor dem # ist optional.
     - [Bytes]: Damit geben Sie die Anzahl Bytes an, die ausgegeben werden.
       Das , vor dem [ ist optional und auch die ] Klammer ist berflssig.
     - .: Die Ausgabe erfolgt endlos und muss "von Hand" abgebrochen wer-
       den (Escape).
     Wenn Sie weder To, Lines, [Bytes] noch . angegeben, werden default-
     mssig 16 Zeilen ausgegeben.

     Beispiele:
     $001C7FF0>asc#2               ; Zwei Zeilen ab dem PC ausgeben
     $001C7FF0>a[30                ; 30 Bytes ab dem PC ausgeben
     $001C7FF0>ascii ^A7,^A7+10    ; 10 Bytes ab dem Stackpointer ausgeben
     $001C7FF0>as^A4[20]           ; 20 Bytes ab A4 ausgeben
     $001C7FF0>asci p(.trap_d)-c   ; gibt 16 Zeilen ab Bioshandler-12 aus
     $001C7FF0>a.                  ; gibt ab dem PC endlos aus


     4.7.2. ASCFIND

     Syntax: ASCFind[.w.l] [From][,To],String - default opcode

     Disassembliert einen Speicherbereich und vergleicht "String" mit dem
     vom Disassembler erzeugten String. Der Vergleich erfolgt Casesensi-
     tive. .w bedeutet, dass die Adresse in Zweierschritten inkrementiert
     wird, .l entsprechend in Viererschritten. Wenn weder .w noch .l ange-
     geben wird, dann wird die Lnge des disassemblierten Befehls als In-
     krement genommen. Dies ist sinnvoll, wenn Sie Programmcode durchsuchen
     und ist viel schneller als mit .w. Es kann so allerdings vorkommen,
     dass Befehle nicht gefunden werden.
     Defaultadressen fr "From" und "To", sind die Anfangs- bzw. Endadres-
     sen eines geladenen Files.
     Befindet sich die gefundene Adresse innerhalb des Debuggers oder in
     einem von diesem allozierten Speicherbereich, wird sie mit einem *
     gekennzeichnet.

     Beispiele:
     $0073250C>ascf e00000,e00000+10000,'*PMOVE*'
     $00E00068>! PMOVE    $E36040,TC
     $00E00070>! PMOVE    $E36040,TT0
     $00E00078>! PMOVE    $E36040,TT1
     $00E01702>! PMOVE    $E3654C,CRP
     $00E0170A>! PMOVE    $E36554,TC
     $00E01712>! PMOVE    $E36558,TT0
     $00E0171A>! PMOVE    $E3655C,TT1
     $001203CC>ascfind 0,80,"MOVE*-(A?)"
     $00FC08B6>! MOVEM.L  D7-A0,-(A7)
     $00FC08DA>! MOVE     SR,-(A7)
     $00FC08EE>! MOVE.L   .etv_critic.W,-(A7)


     4.7.3. BREAKPOINTS

     Syntax:
     Breakpoints [Number[=Address[,*,=[Value],Number]]][[Number]-]

     - Stopbreakpoints: dieser Breakpoint muss "Anzahl" mal durchlaufen
       werden, bis das Programm unterbrochen und der Breakpoint gelscht
       wird. Normale Breakpoints (F15 oder Control B) sind Stopbreakpoints
       mit Startwert 1. Die Anzeige mit b gibt aus, wie oft der Breakpoint
       noch durchlaufen werden muss.
     - Zhlerbreakpoint: bei jedem Durchlaufen des Breakpoints wird der
       Zhler um eins erhht, jedoch wird das Programm nie unterbrochen.
       Der aktuelle Zhlerstand kann mittels b erfahren werden.
     - Permanentbreakpoints: Breakpoint, der nie gelscht wird und nur ma-
       nuel entfernt werden kann (B- oder B Nummer-).

     - Breakpoints ohne Parameter: zeigt alle gesetzten Breakpoints
     - Breakpoints Number: zeigt nur einen
     - Breakpoints -: lscht alle Breakpoints
     - Breakpoints Number -: lscht nur einen
     - Breakpoints Number=Address: setzt einen Stopbreakpoint an der ange-
       gebenen Adresse mit Startwert 1
     - Breakpoints Number=Address,Number: setzt einen Stopbreakpoint mit
       Startwert "Number"
     - Breakpoints Number=Address,=: setzt einen Zhlerbreakpoint mit
       Startwert 0
     - Breakpoints Number=Address,=Value: setzt einen Zhlerbreakpoint mit
       Startwert "Value"
     - Breakpoints Number=Address,*: setzt einen Permanentbreakpoint

     Breakpoints drfen auch im ROM gesetzt werden, dann wird das Programm
     allerdings im Tracemodus durchlaufen. Nheres zu dem Thema siehe
     Kapitel "Trace, Breakpoints und dergleichen".

     Beispiele:
     $12345678>b0=1000,*
     $12345678>b7=2000,=
     $12345678>b5=3000,20
     $12345678>b
      Breakpoint $0=$00001000,*              ; Permanent Breakpoint
      Breakpoint $5=$00003000,$00000020      ; Stop Breakpoint (Zhler=20)
      Breakpoint $7=$00002000,=$00000000     ; Zhler Breakpoint (Zhler=0)
     $12345678>b5-
     $12345678>b7
      Breakpoint $7=$00002000,=$00000000


     4.7.4. CALL

     Syntax: Call [Address]

     Ruft ein Unterprogramm auf, das mittels rts abgeschlossen sein muss.
     Defaultadresse ist der aktuelle PC.


     4.7.5. CD

     Syntax: CD [Path]

     CD ohne Parameter: gibt den aktuellen Pfadnamen aus.
     CD Pfad: wechselt den aktuellen Pfad.

     Beispiele:
     $00100B70>cd j:peacebug
      J:\PEACEBUG\
     $00100B70>cd c:
      C:\GEMINI\GEMINI\
     $00100B70>cd
      C:\GEMINI\GEMINI\


     4.7.6. CHECKSUMME

     Syntax: CHeckumme [Address][,Checksum][,Number]

     Berechnet eine Prfsumme (alle Words addieren) ber einen Speicherbe-
     reich und gibt den Wert aus, den Sie zu einem Wort in diesem Bereich
     addieren mssen um die Checksumme 0 zu erhalten.
     Mit diesem Befehl knnen Sie z.B. Bootsektoren ausfhrbar machen oder
     Checksummen von vermeintlichen Doppelseiten berechnen (Checksumme
     $5678).
     Defaultmssig ist die Prfsumme $1234, es wird ber 256 Worte addiert
     und Address zeigt auf den Sektorpuffer (>READSECTOR).

     Beispiele:
     $001C7FB2>ch 600
      Check: $1234
     $001C7FB2>: 600,pw600+1234         ; addiert $1234 an die Adresse $600
     $001C7FB2>ch 600
      Check: $0000
     $001C7FB2>ch 600,5678
      Check: $4444


     4.7.7. CLR

     Syntax: CLr [From][,To]

     Lscht den angegebenen Speicherbereich. Wie immer wird "To" selber
     nicht gelscht, z.B. lscht clr 100,200 bis und mit Adresse 1FF.
     Defaultadressen fr "From" und "To", sind die Anfangs- bzw. Endadres-
     sen eines geladenen Files.


     4.7.8. COLD

     Syntax: COld

     Der Rechner fhrt einen Kaltstart aus. Der Debugger wird endgltig aus
     dem System entfernt.


     4.7.9. COMPARE

     Syntax: COMpare[.b.w.l] [From][,To],Destination - default byte

     Vergleicht zwei Speicherbereiche und gibt die unterschiedlichen Adres-
     sen aus. Das Inkrement betrgt .b=Byte, .w=Word oder .l=long, wobei
     dann natrlich auch der Vergleich byte, word oder long erfolgt. De-
     faultmssig wird byteweise verglichen.
     Defaultadressen fr "From" und "To", sind die Anfangs- bzw. Endadres-
     sen eines geladenen Files.

     Beispiele:
     $001C7FB2>com 0,10,fc0000
      $00FC0009 $00FC000A $00FC000B $00FC000D $00FC000E $00FC000F
     $001C7FB2>comp.w 0,10,fc0000
      $00FC0008 $00FC000A $00FC000C $00FC000E $00FC0010
     $001C7FB2>co.l 0,10,fc0000
      $00FC0008 $00FC000C $00FC0010


     4.7.10. COOKIE

     Syntax: COOkie

     Gibt eine Liste aller Cookieeintrge aus.
     Der Debuggereigene Eintrag wird mit einem * gekennzeichnet (ntzlich
     wenn zwei Debugger installiert sind).


     4.7.11. COPY

     Syntax: COPy [From][,To],Destination

     Kopiert einen Speicherbereich. berlappende Bereiche werden korrekt
     kopiert.
     Defaultadressen fr "From" und "To", sind die Anfangs- bzw. Endadres-
     sen eines geladenen Files.


     4.7.12. DISASSEMBLE

     Syntax: Disassemble [From][[,To][[,]#Lines][,][Bytes][.]]:[CPUs]

     Gibt einen Speicherbereich in disassemblierter Form aus. Die Parameter
     entsprechen denjenigen von >ASCII, mit Ausnahme von :[CPUs]:
     - Mittels d: erfahren Sie, fr welche Prozessoren der Disassembler
       konfiguriert ist. Bei Programmstart ist das immer der Prozessor, der
       auch im Rechner vorhanden ist.
     - Mittels d:CPUs: knnen Sie den Disassembler veranlassen, Code fr
       bestimmte CPU's zu erzeugen, wobei CPU folgendermassen codiert ist:
        Bit 0=MC68000
        Bit 1=MC68010
        Bit 2=MC68020
        Bit 3=MC68030
        Bit 4=MC68040
        Bit 6=MC68881/2
       Diese Bits knnen gleichzeitig gesetzt sein, dann wird Code fr mehr
       als eine CPU erzeugt (bei Mehrdeutigkeiten wird die Ausgabe fr den
       "hherwertigen" Prozessor genommen, d.h. 60FF wird als BRA.L *2 und
       nicht als BRA.S *1 bersetzt.

     Wenn sich die disassemblierte Address innerhalb Debuggers befindet,
     wird das Disassembly mit einem Asterix * gekennzeichnet.

     Negative Zahlen werden normalerweise als vorzeichenlose Zahlen ausge-
     geben, mit Ausnahme von denjenigen zwischen -1 und -9. Z.B. wird -.100
     als $9C, -5 aber als -5 ausgegeben.

     Beachten Sie, dass das Basedisplacement in der auf Atari unblichen
     Schreibweise innerhalb der Klammer ausgegeben wird. Dies ist offiziel-
     le Motorola Notation. Auch der Assembler akzeptiert Basedisplacements
     nur in dieser Schreibweise.

     Wenn der Disassembler drei Fragezeichen hinter das Disassembly
     schreibt, dann wurde ein Befehl gefunden, der zwar erlaubt ist, aber
     nicht sehr sinnvoll. Im Moment tut er dies aber nur bei Sprngen auf
     ungerade Adressen (bsr/bcc/jsr/jmp/fbcc usw.)
     Falls er >?< hinter das Disassembly schreibt, heisst dies, dass ein
     Befehl gefunden wurde, der offiziell nicht erlaubt ist, aber trotzdem
     in der angegebenen Form funktioniert:
     - Dies ist z.B. der Fall bei der Adressierungsart "Memory Indirect
       Post-indexed with Index Suppress". Diese Adressierungsart ist gemss
       Motorola "reserved" (respektive dessen Codierung). Versuche haben
       aber gezeigt, dass der Befehl trotzdem ausgefhrt wird und zwar er-
       wartungsgemss wie "Memory Indirect Pre-Indexed with Index Sup-
       press".
     - Ein FBcc mit conditional predicate 1XXXXX ist gemss Motorola reser-
       viert [Zitat: "Not used, redunant encodings with 0XXXXX"], wird von
       PEACEBUG aber bersetzt, da er funktioniert.
     - usw...
     Falls Sie wirklich das Vergngen haben sollten, auf ein >?< zu stos-
     sen, dann nehmen Sie ein User's Manual hervor und schauen sich die
     Codierung des Befehls an.
     Das bersetzen scheint mir deswegen sinnvoll, weil es vielleicht Pro-
     gramme gibt, die diese Befehle absichtlich bentzen...

     Beispiele:
     $001CDAEA>d:%1111
      Disassembler active for MC68000/10/20/30
     $001CDAEA>d 1cdace #5
     $001CDACE>/ 4E7A                       ; *???      $4E7A
     $001CDAD0>/ 0003,3100                  ; *ORI.B    #0,D3
     $001CDAD4>/ 4E75                       ; *RTS
     $001CDAD6>/ 5148                       ; *SUBQ.W   #8,A0
     $001CDAD8>/ F010,4A00                  ; *PMOVE    SRP,(A0)
     $001CDADC>d:%11111
      Disassembler active for MC68000/10/20/30/40
     $001CDACE>/ 4E7A,0003                  ; *MOVEC    TC,D0
     $001CDAD2>/ 3100                       ; *MOVE.W   D0,-(A0)
     $001CDAD4>/ 4E75                       ; *RTS
     $001CDAD6>/ 5148                       ; *SUBQ.W   #8,A0
     $001CDAD8>/ F010,4A00                  ; *PMOVE    SRP,(A0)


     4.7.13. DFREE

     Syntax: DFree [Drive:]

     Gibt den freien Speicherplatz eines Laufwerkes aus.
     Defaultlaufwerk ist das aktuelle (zu erfahren mit >CD)

     Beispiel:
     $001C7FB2>dfreea:
      Drive A: 00001239 K used, 00000184 K free, 00001423 K totally


     4.7.14. DIRECTORY

     Syntax: DIRectory [Path]

     Dient zum Anzeigen des Inhaltsverzeichnisses eines Laufwerks. Momentan
     knnen nur Pfade angegeben werden und keine Suchmasken (z.B. *.PRG).
     Auch erfolgt die Ausgabe noch unsortiert.

     Beispiele:
     $001C7FEC>dir
      CD   "."            ;.0           28:14:52  15.06.1992
      CD   ".."           ;.0           28:14:52  15.06.1992
      LOAD "README"       ;.120009      20:60:20  00.00.1980
      LOAD "PEACEBUG.SRC" ;.342614      21:69:34  04.01.1980
      CD   "UTILLITY"     ;.0           28:17:06  15.06.1992
      CD   "REMOTE"       ;.0           28:18:32  15.06.1992
      CD   "MODULE"       ;.0           28:18:34  15.06.1992
      LEX  "PEACEBUG.PRG" ;.58949       21:64:24  04.01.1980
      LOAD "PEACEBUG.SYM" ;.4950        20:62:06  00.00.2028
      LOAD "README.TXT"   ;.106561      28:03:38  04.07.1992
     $001C7FEC>dir ..
      CD   "."            ;.0           28:14:52  15.06.1992
      CD   ".."           ;.0           28:14:52  15.06.1992
      CD   "M_MAUS"       ;.1024        37:71:40  12.03.1992
      CD   "M_SPOOL"      ;.1024        37:71:40  12.03.1992
      CD   "PBUGCONF"     ;.1024        37:71:30  12.03.1992
      CD   "PEACEBUG"     ;.1024        37:71:30  12.03.1992
      CD   "TOP_WIND"     ;.0           37:71:38  12.03.1992
      CD   "WINDOW"       ;.0           37:72:40  12.03.1992
      LOAD "SERIAL"       ;.337         20:60:40  00.00.2028
      LOAD "RELEASE"      ;.3188        20:60:24  00.00.2028


     4.7.15. DO

     Syntax: DO [Address]

     DO: Hat den gleichen Effekt wie F2-Do PC.
     DO Address: Setzt den PC auf den angegebenen Wert und fhrt ein Do PC
     aus.


     4.7.16. DUMP

     Syntax: DUmp [From][[,To][[,]#Lines][,][Bytes][.]]

     Gibt einen Speicherbereich im Hexdumpmodus aus. Die Parameter entspre-
     chen denjenigen von >ASCII.


     4.7.17. EXIT

     Syntax: Exit [Value]

     Wenn der Debugger als Programm gestartet wurde, wird er beendet und
     aus dem Speicher entfernt. Andernfalls wird ein Pterm ausgefhrt (Gem-
     dos 76), wobei der Rckgabewert defaultmssig -1 ist. Wenn ein Pro-
     gramm abstrzt und Sie den Fehler nicht beheben knnen, kann manchmal
     mittels dieser Funktion weitergefahren werden.


     4.7.18. FIND

     Syntax: Find[.b.w.l] [From][,To],Term,{Term} - default byte

     Durchsucht den Speicher und zeigt alle Adressen an, die Term,{Term}
     enthalten. Term ist ein Ausdruck, dem zustzlich durch Anhngen von
     .b, .w, .a oder .l eine bestimmte Lnge gegeben werden kann:
      1.b = $01          1 Byte
      1.w = $0001        2 Bytes
      1.a = $000001      3 Bytes
      1.l = $00000001    4 Bytes
     Wenn keine Lnge angegeben wird, erweitert der Debugger die Zahl auf
     die krzest mgliche Lnge, wobei Zahlen >$FFFF allerdings immer auf
     long erweitert werden nicht auf 3 Bytes.
     Term kann auch ein beliebig langer String sein (normalerweise sind
     Strings nur 4 Zeichen lang).
     Der Debugger kreiert aus Term{,Term} einen einzigen String und sucht
     diesen, wobei natrlich wieder das Inkrement beim Suchen bestimmt wer-
     den kann (.b=byte, .w=word, .l=long). Dies beschleunigt den Vorgang,
     wenn Sie z.B. Opcodes suchen, die sowieso nur an gerader Adresse lie-
     gen drfen.
     Defaultadressen fr "From" und "To", sind die Anfangs- bzw. Endadres-
     sen eines geladenen Files.
     Befindet sich die gefundene Adresse innerhalb des Debuggers oder in
     einem von diesem allozierten Speicherbereich, wird sie mit einem *
     gekennzeichnet.

     Beispiele:
     $001C7FB2>m 0#1
     $00000000>, 60,2E,01,06,00,FC,00,30,00,1C,DB,E4,00,20,FA,5C
     $001C7FB2>f 0,10,fc0030
      $00000004
     $001C7FB2>f 0,10,fc0030.a
      $00000005
     $001C7FB2>fi fc0000,fc0000+.192000,'Atari'
      $00FEBC31
     $001C7FB2>m #1
     $00FD004F>, 00,FF,C4,3B,46,FF,FC,3A,87,4E,71,4A,D5,6B,FA,51
     $001C7FB2>find fc0000,fc0000+.192000,ff.w,c4,";F"
      $00FD004F


     4.7.19. FILL

     Syntax: FILl [From][,To],Term{,Term}

     Fllt einen Speicherbereich mit Term{,Term}, wobei Term aufgebaut sein
     kann, wie bei >FIND.
     Defaultadressen fr "From" und "To", sind die Anfangs- bzw. Endadres-
     sen eines geladenen Files.

     Beispiel:
     $001C023A>fill 600,700,10,10.w,10.a,10.l,'PEACEBUG'
      fllt den Bereich zwischen 600 und 700 (exklusive wie immer) mit:
      $10,00,10,00,00,10,00,00,00,10,50,65,61,63,65,62,75,67='PEACEBUG'


     4.7.20. FREE

     Syntax: FRee

     Gibt den grssten allozierbaren Speicherblock aus.


     4.7.21. GO

     Syntax: Go [Address][,Breakpoint]

     Startet das unterbrochene Programm.
     Zustzlich kann auch ein Breakpoint angegeben werden, so dass Sie das
     Programm quasi From,To starten knnen.
     Defaultadresse ist der aktuelle PC.

     Beispiele:
     $12345678>g ,^pc+10
      Startet das Programm und setzt 16 Bytes hinter dem PC einen Break-
      point.
     $12345678>go p(b4),p(b4)
      Setzt den PC auf den Bioshandler. Beachte, dass die Klammern ntig
      sind, weil ein pb4 als pb 4 (Bytepointer Adresse 4) und nicht als p
      b4 (Longpointer Adresse B4) ausgewertet wird!


     4.7.22. HELP

     Syntax: Help [Command]

     Gibt die Syntax der Befehle aus. Wird kein Befehl angegeben, werden
     alle Befehle aufgelistet.

     Beispiele:
     $0012F27C>h d
      Disassemble [From][[,To][[,]#Lines][,][Bytes][.]]:[CPUs]
     $0012F27C>he hun
      HUnt [From][,To],Term{,Term}


     4.7.23. HUNT

     Syntax: HUnt [From][,To],Term{,Term}

     Entspricht dem Befehl find.w, weshalb er sich vorallem zum Suchen von
     Opcodes anbietet.


     4.7.24. INFO

     Syntax: Info

     Gibt Ihnen einige Daten zum geladenen Programm/File und zum Debugger
     aus:

      Programstart:   $001E738A  Length: 75798
      TEXT-Segment:   $001E748A  Length: 45284
      Data-Segment:   $001F256E  Length: 20830
      BSS-Segment:    $001F76CC  Length: 9428
      Symboltable:    $000DA440  Number: 2730
      - Fastloadbit is set
      - Program may load into alternative RAM
      - Malloc calls may be satisfied from alternative RAM
      - Privatemode. Only the process itself (and the OS) can use the
        memory
      - Program has shared memory
      Filename:       H:\PEACE.PRG

      Debuggerstart:  $00030712  Length: 89764
      TEXT-Segment:   $00030812  Length: 50674
      DATA-Segment:   $0003CE04  Length: 21043
      BSS-Segment:    $00042037  Length: 17791
      Cookie:         $001C7E44
      Sectorbuffer:   $001CCD2C


     4.7.25. LIST

     Syntax: List [From][[,To][[,]#Lines][,][Bytes][.]]

     Gibt einen Speicherbereich im Listmodus aus. Die Parameter entsprechen
     denjenigen von >ASCII. Falls ein Programm geladen wurde, dass Labels
     enthlt, wird dies in der Ausgabe bercksichtigt.
     Ist der >Resident Symbol Driver installiert, wird das zur ausgegebenen
     Adresse passende Programm zustzlich angezeigt:
       $01057536>! [GEMRAM]   RTS                                    ; 4E75


     4.7.26. LAST

     Syntax: LAst

     Gibt die jeweils letzte Einsprungsmessage aus (das ist die Meldung,
     die in der ersten Zeile invers erscheint).


     4.7.27. LET

     Syntax: LEt Register=Value

     Setzt den Wert eines Registers. Es sind alle Register erlaubt, die
     schon unter >Formelauswertung beschrieben wurden. Beim CRP und beim
     SRP knnen momentan nur die unteren 32 Bits gesetzt werden. Beachte,
     dass bei diesem Befehl die Register ohne ^ angesprochen werden.


     Beispiele:
     $0002428A>letpc=pE0
      Setzt den PC auf den Handler fr einen PMMU Configuration Error
     $0002428A>letccr=^sr&ff
      Es passiert gar nichts


     4.7.28. LEXECUTE

     Syntax: LEXecute [Filename]

     Ldt ein ausfhrbares Programm mittels Pexec.
     Der PC wird automatisch auf den Anfang des geladenen Files gesetzt
     Eine Symboltabelle im GST-/DRI-Format wird geladen, allerdings werden
     nur segmentrelative Symbole bercksichtigt, alle andern werden ge-
     lscht (insbesondere die Konstanten). Debugger, die dies nicht machen,
     erzeugen meist ziemlich seltsame Disassemblies was die Labels anbe-
     langt.
     Der Debugger merkt sich den Filenamen inklusive Pfad. Wenn Sie Filena-
     me weglassen, wird der intern gespeicherte Name benutzt (zu erfahren
     ber >INFO).
     Dieser Befehl steht in der residenten Version NICHT zur Verfgung.


     4.7.29. LOAD

     Syntax: LOad [Filename][,Start[,End]]-

     - LOAD [Filename]: Eine Datei wird vollstndig in den Speicher gela-
       den. Der bentigte Speicher wird, falls keine Startadresse angege-
       ben wird, mittels Malloc reserviert. Wenn Sie eine Endadresse ange-
       ben, wird nicht die ganze Datei geladen, sondern nur End-Start Bytes
       (End ist also das erste nicht mehr benutzte Byte).
       Der Debugger merkt sich den Filenamen inklusive Pfad. Wenn Sie File-
       name weglassen, wird der intern gespeicherte Name benutzt.
     - LOAD -: gibt den mittels Malloc reservierten Speicher frei.
     Es wird ab dem Anfang des Files aufgelistet aber der PC nicht auf
     diese Adresse gesetzt.
     
     Beispiele:
     $12345678>load m:\test.prg
      Programstart:  $001E3858 Length: 1379
      Filename:       M:\TEST.PRG
     $001E3858>load ,238000
      Programstart:  $00238000  Length: 1379
      Filename:       M:\TEST.PRG
     $00238000>load ,238000,238200
      Programstart:  $00238000  Length: 512
      Filename:       M:\TEST.PRG


     4.7.30. LS

     Syntax: LS [Path]

     Entspricht dem Befehl >DIR.


     4.7.31. MEMORY

     Syntax: Memory [From][[,To][[,]#Lines][,][Bytes]]

     Enstspricht dem Befehl >DUMP.


     4.7.32. MKDIRECTORY

     Syntax: MKdirectory Directory

     Legt einen neuen Ordner an. Es kann auch ein ganzes Verzeichnis ange-
     geben werden.

     Beispiel:
     $12345678>mk m:\peacebug\testit
      legt auf Laufwerk M, im Ordner peacebug einen Ordner namens "testit"
      an.


     4.7.33. NEWFORMAT

     Syntax: Newformat

     Diese Funktion initialisiert den Bildschirm neu:
     1. Auf Programmscreen schalten
     2. >CLEAR_SCREEN aufrufen
     3. >GET_PARAMETER aufrufen
     4. >NEW_FORMAT aufrufen
     5. >PRINT_SCREEN aufrufen
     6. Auf Debuggerscreen schalten

     Diese Funktion passt also die Debuggerauflsung an diejenige des rest-
     lichen Systems an und wird vorallem nach einem Auflsungswechsel be-
     nutzt (siehe auch >SWITCH). Einen Auflsungswechsel bemerkt der Debug-
     ger nicht, so dass er nicht in der gleichen Auflsung luft, wie das
     Programm. Das wre nicht weiter schlimm, wenn das Screenumschalten
     nicht flimmern wrde.
     Achtung: Da GET_PARAMETER auf Lineavariablen zugreift, sollte diese
     Funktion nicht bentzt werden, wenn ein Program die Auflsung selber
     umgeschaltet hat (z.B. bei Spielen hufig der Fall), denn die Lineava-
     riablen werden dann normalerweise nicht gesetzt.


     4.7.34. OBSERVE

     Syntax: Observe [[Address][,Bytes]|-|+]

     Observe dient dazu, Speicher auf Vernderungen zu berwachen und diese
     gegebenenfalls anzuzeigen. Dazu wird der 200HZ Timer benutzt.

     - Observe ohne Parameter: gibt aus, welchen Speicher sie gerade ber-
       wachen lassen.
     - Observe Address,Bytes: schaltet die Observefunktion ein und setzt
       den zu berwachenden Bereich fest. "Bytes" kann Werte zwischen 1 und
       1024 annehmen, Defaultwert ist 1 (wenn sie "Bytes" schon mal gesetzt
       haben, wird dieser Wert als Default genommen).
     - Observe -: schaltet die Observefunktion aus.
     - Observe +: schaltet die Observefunktion ein.

     Wenn eine Vernderung festgestellt wurde, wird dies angezeigt und die
     Funktion ausgeschaltet, damit der Debugger nicht endlos Vernderungen
     feststellt. Weiter "Observen" knnen Sie dann mittels O+. Da der Be-
     reich im Interrupt berprft wird, kann natrlich die genaue Adresse,
     an der die nderung stattfand, nicht exakt angezeigt werden. Sollte
     dies ntig, mssen Sie auf eine Usertraceroutine zurckgreifen.

     Beispiele:
     $00123456>o+
      Observing $001 byte(s) at address $00000000
     $00123456>o ,.1024
      Observing $400 byte(s) at address $00000000
     $00123456>o 10000
      Observing $400 byte(s) at address $00010000
     $00123456>o
      Observing $400 byte(s) at address $00010000
     $00123456>o-


     4.7.35. PAGE

     Syntax: Page

     Page sucht den Speicher nach Doppelseiten ab.
     Eine Doppelseite ist ein 512 Byte langer Bereich, der auf einer durch
     512 teilbaren Adresse liegen muss. Das erste Long enthlt das Magic
     $12123456, das zweite Long ist ein Pointer auf die Seite selber. Und
     schliesslich ist die Prfsumme (Word) ber diesen Bereich $5678.
     Diese Doppelseiten werden nach einem Warmstart vom Betriebsystem ge-
     sucht und angesprungen. Dadurch lassen sich resetresidente Programme
     schreiben, allerdings ist dieses Feature undokumentiert, aber bisher
     in jeder TOS-Version enthalten. Durchsucht wird brigens nur das ST-
     RAM, die Suche beginnt bei phystop und endet bei $600. Die Behauptung
     im Profibuch, der Speicher werde durch die Gemdosinitiialisierung ge-
     lscht, so dass nur die Seite an Adresse $600 brigbleibe, stimmt na-
     trlich nicht. Richtig ist, dass der Speicher logisch freigegeben wird
     und in der Doppelseite neu reserviert werden muss, damit er nicht
     durch das erste Autoordnerprogramm, das gleich nach Suche der Doppel-
     seiten gestartet wird, berschrieben wird. Probleme kann es nur mit
     dem HD-Treiber geben, da dieser noch vor den Doppelseitenprogrammen
     ausgefhrt wird (vorallem, wenn er AHDI heisst ...).


     4.7.36. PROGRAMS

     Syntax: PRograms

     Dieser Befehl funktioniert nur, wenn der Resident Symbol Driver ins-
     talliert ist (siehe Kapitel "Symbole").
     Er gibt eine Liste aller gestarteten Programme und ein paar dazugeh-
     rende Informationen aus.

     Beispiel:
     $0117512E>pr
      Name:         HDX.PRG
      Basepage:     $0117502E
      TEXT-Segment: $0117512E
      Length:       $00026C94
      Symbols:      $0216

      Name:         PEACEBUG.PRG
      Basepage:     $0008B44E
      TEXT-Segment: $0008B54E
      Length:       $0001555A
      Symbols:      $0000


     4.7.37. QUIT

     Syntax: Quit [Value]

     Entspricht dem Befehl >EXIT.


     4.7.38. READSECTOR

     Syntax: Readsector [Track][,Sector][,Side][,Address][,Drive]

     Ldt einen Sektor mittels XBIOS 8.
     Defaultmssig sind eingestellt: Track=0, Sector=1, Side=0, Address=ein
     vom Debugger zur Verfgung gestellter Puffer (1024 Bytes lang),
     Drive=0.
     Wenn Sie andere Parameter angeben, werden diese beim nchsten Readsec-
     tor wieder benutzt. Readsector benutzt natrlich die gleichen Werten
     wie >WRITESECTOR.

     Beispiele:
     $00237322>r
      Sectorbuffer:   $001D752A
      ; liest den Bootsektor von Laufwerk A in den internen Puffer
     $00237322>r ,,,600,1
      Sectorbuffer:   $001D752A
      ; liest den Bootsektor von Laufwerk B an die Adresse $600


     4.7.39. REGISTER

     Syntax: REGister [Register]

     Gibt den Inhalt eines Register aus. Es sind alle Register erlaubt, die
     schon unter >Formelauswertung beschrieben wurden. Register werden wie
     bei >LET ohne ^ angegeben. Wird kein gltiges Register angegeben, wer-
     den alle Registerinhalte angezeigt, wobei sich die Anzeige auf die
     vorhandenen Register beschrnkt, je nach Prozessor.

     Beispiele:
     $001C732A>r ccr
      01
     $001C732A>r srp
      0000000000000000


     4.7.40. RESIDENT

     Syntax: RESident

     Falls der Debugger als Programm gestartet wurde, kann er mittels die-
     sem Befehl resident gemacht werden. Der Debugger installiert zu diesem
     Zweck nachtrglich einen Cookieeintrag und eine Doppelseite. Darauf
     wird er verlassen und kann dann jederzeit ber Tastatur aufgerufen
     werden.
     Dieser Befehl steht in der residenten Version natrlich nicht zur Ver-
     fgung.


     4.7.41. RMDIRECTORY

     Syntax: RMdirectory [Directory|File]

     Dient zum Lschen eines Ordners oder einer Datei. Im Gegensatz zu vie-
     len Commandline Interpretern, ist der Befehl fr Ordner und Dateien
     identisch. Es kann auch ein kompletter Pfad angegeben werden.
     Defaultmssig wird das zuletzt geladende File benutzt.

     Beispiel:
     $12345678>rm m:\peacebug\testit


     4.7.42. SAVE

     Syntax: Save [Filename][,Start,End]

     Speichert einen Speicherbereich.
     Save bernimmt die beim Laden benutzten Variablen, falls keine anderen
     angeben werden.

     Beispiele:
     $12345678>load m:\test.prg
     $12345678>save ,fc0000,fc0000+.1000
      speichert 1000 Bytes ab Adresse fc0000 in der Datei "M:\TEST.PRG"
     $12345678>save c:\test2
      speichert "test.prg" unter dem neuen Namen "C:\TEST2"
      (Man beachte dass sich so auch files kopieren lassen)


     4.7.43. SET

     Syntax: SEt Register=Value

     Entspricht dem Befehl >LET.


     4.7.44. SHOWMEMORY

     Syntax: SHowmemory [Term[,List]]||[[Nummer]-]

     Durch diesen Befehl knnen Sie sich wichtige Speicherbereiche stndig
     anzeigen lassen. Dabei kann Term ein Ausdruck beliebiger Komplexitt
     sein, d.h. er kann Register, Symbole und Adressen referenzieren. Die
     Anzeige wird immer aktuallisiert, falls sich der Wert von Term oder
     der Speicherinhalt, auf den Term zeigt, ndern sollte. Es knnen maxi-
     mal 10 Bereiche gleichzeitig angezeigt werden. Jedem Bereich wird eine
     Zeile unterhalb der Registeranzeige geopfert. Ein Bereich wird automa-
     tisch eliminiert, wenn nicht mehr genug Platz auf dem Bildschirm zur
     Verfgung steht, da mindestens eine Zeile unterhalb dieser Anzeige
     brig bleiben muss.

     - SHOWMEMORY ohne Parameter: gibt eine Liste aller Bereiche aus, die
       momentan angezeigt werden.
     - SHOWMEMORY Term: zeigt ab sofort den neuen Bereich an, der durch
       "Term" definiert wird. Es wird im Hexdumpmodus ausgegeben.
     - SHOWMEMORY Term,List: zeigt ab sofort den neuen Bereich an, der
       durch "Term" definiert wird. List gibt an, wie die Ausgabe erfolgen
       soll:
        1=List
        2=Disassemble
        3=Hexdump
        4=Ascii
     - SHOWMEMORY -: entfernt alle Bereiche, d.h. fortan werden keine mehr
       angezeigt.
     - SHOWMEMORY Nummer -: entfernt den Bereich, den Sie mit Nummer ange-
       ben (das ist die Nummer, die am Anfang der Zeile steht), d.h. er
       wird fortan nicht mehr angezeigt.

     Beispiele:
     $001C273E>sh ^a7,4
      zeigt den Stack im Asciimodus
     $001C273E>sh ^d0
      zeigt den Bereich auf den d0 zeigt im Hexdumpmodus
     $001C273E>sh
      0,4:^a7
      ; die 4 gibt an, dass im Asciimodus gelistet wird
      1,3:^d0
      ; die 3 gibt an, dass im Hexdumomodus gelistet wird
     $001C273E>show 0-
     $001C273E>sh
      1,3:^d0


     4.7.45. SLOW

     Syntax: SLow [ON|Off]

     Diese Funktion ist dafr da, um den Rechner in Slowmotion laufen zu
     lassen. Slow ohne Parameter gibt aus, in welchem Modus das Programm
     arbeitet. Mit Slow on schalten Sie den Slowmodus an, mit Slow off aus.
     Mit den Tasten +/- (Zahlenblock) knnen Sie den Rechner verlangsamen
     (+), respektive wieder beschleunigen (-). Zusammen mit einer Shiftta-
     ste knnen Sie feiner abstufen (8 mal feiner als ohne Shift). Mit der
     Taste * knnen Sie die Verzgerung auf Null zurcksetzen, der Rechner
     luft dann wieder in Originalgeschwindigkeit (die Slowmotionfunktion
     bleibt aber aktiv).


     4.7.46. SWITCH

     Syntax: SWitch [ResolutionDebugger][,ResolutionProgram]

     Mit dieser Funktion knnen Sie den Debugger/das Programm auf eine
     Standardauflsung umschalten. Die Werte entsprechen denjenigen von
     Getrez:

     0: 320*200*4  ST-Low
     1: 640*200*2  ST-Mid
     2: 640*400*1  ST-High
     4: 640*480*4  TT-Mid
     6: 1280*960*1 TT-High
     7: 320*480*8  TT-Low

     - ResolutionDebugger: der Debuggerscreen wird dabei neu initialisiert
       (aber nicht neu reserviert, deshalb sollte nur umgeschalten werden,
       wenn die neue Auflsung nicht mehr Bildspeicher bentigt als die
       alte. Mittels >NEWFORMAT knnen Sie brigens den Debuggerscreen wie-
       der auf die vom restlichen System benutzte Auflsung umschalten.

     - ResolutionProgram: das Umschalten der Programmauflsung geschieht
       durch Beschreiben des Shiftmoderegisters. Vom Auflsungswechsel be-
       kommt das restliche System natrlich nichts mit ber, daher ist das
       Umschalten der Programmauflsung nur sinnvoll, wenn diese durch ein
       anderes Programm flschlicherweise verndert wurde.

     Achtung: dieser Befehl existiert auf dem F030 nicht.


     4.7.47. SYMBOL

     Syntax: SYmbol [From][,To]

     Gibt eine Liste der Symbole aus, die PEACEBUG bei Programmstart gela-
     den hat. Mittels "From" und "To" knnen Sie die Ausgabe auf einen be-
     stimmten Bereich beschrnken, es werden dann nur die Symbole ausgege-
     ben, deren Symbolwert zwischen den beiden Werten liegt.
     Die Ausgabe erfolgt sortiert nach Symbolwert.
     Wenn ein Programm nachgeladen wurde, werden nur die Symbole des Pro-
     gramms ausgegeben, falls dieses eine Symboltabelle enthielt.

     Beispiele:
     $001C7FB2>sy fa0000,ffff8001
      $00FA0000 = cart_port
      $00FC0000 = os_start_old
      $FFFF8001 = memconf
     $001C7FB2>symb 500,510
      $00000502 = scr_dump
      $00000506 = prv_lsto
      $0000050A = prv_lst
      $0000050E = prv_auxo


     4.7.48. SYSINFO

     Syntax: SYSINFO
     Kurzform: SYS

     Gibt einige Informationen zum benutzten System aus:
      OS_Base:          $00240000
      OS_Start:         $00240030
      OS_Membot:        $00006678
      TOS-Version:      PAL -BRD 02.05 vom 05.12.1990
      GEMDOS-Version:   00.19
      METADOS-Version:  Metados not installed
      AES-Version:      03.10
      VDI-Version:      GDOS installed


     4.7.49. TRACE

     Syntax: Trace [Number|+|-|*]

     - Trace ohne Parameter entspricht F1, also der normalen Tracefunktion.
     - Trace Number fhrt "Anzahl" Befehle aus, bevor in den Debugger zu-
       rckgesprungen wird. Dabei werden wie bei F1 gewisse Opcodes als ein
       Befehl angesehen.
     - Trace + lsst das Programm im Tracemodus laufen und ruft nach jedem
       Befehl die Usertraceroutine auf, die entscheidet, ob in den Debugger
       gesprungen wird, das Tracen fortgesetzt oder ausgeschaltet wird.
       Gleichzeitig wird auch ein Cacheeintrag erzeugt. Es wird nicht ge-
       traced wenn flock gesetzt ist oder wenn die Interruptmaske 7 ist.
       Traps werden getraced.
     - Trace - wie Trace +, nur dass kein Cacheeintrag erzeugt wird
       (schneller).
     - Trace * wie Trace +, nur das IMMER getraced wird (ausser whrend
       einer Exception). Lesen Sie diesbezglich auch Kapitel 5.


     4.7.50. WARM

     Syntax: Warm

     Fhrt einen Warmstart aus. Der Debugger kann noch ber die Doppelseite
     gerettet werden.


     4.7.51. WRITESECTOR

     Syntax: WRitesector [Track][,Sector][,Side][,Address][,Drive]

     Schreibt einen Sektor mittels XBIOS 9.
     Defaultmssig sind eingestellt: Track=0, Sektor=1, Seite=0, Adresse-
     =ein vom Debugger zur Verfgung gestellter Puffer (1024 Bytes lang),
     Laufwerk=0.
     Wenn Sie andere Parameter angeben, werden diese beim nchsten Write-
     sector wieder benutzt. Writesector benutzt natrlich die gleichen Wer-
     te wie Readsector.

     Beispiele:
     $00237322>w
      schreibt den Bootsektor von Laufwerk A aus dem internen Puffer
     $00237322>w ,,,600,1
      schreibt den Bootsektor von Laufwerk B aus Adresse 600


     4.7.52. XBRA

     Syntax: Xbra [FirstVector[,LastVector][,ID]]

     Dieser Befehl gibt eine Liste der XBRA-Verkettungen aus.
     - Xbra ohne Parameter: gibt smtliche Kennungen alphabetisch sortiert
       aus, die der Debugger finden kann. Zu den Kennungen werden auch alle
       Vektoren ausgegeben, die diese Kennung enthalten.
     - Xbra FirstVector gibt die Verkettung fr diesen Vektor aus.
     - Xbra FirstVector,LastVector gibt die Verkettung fr alle Vektoren
       zwischen "FirstVektor" und "LastVektor" aus. Der Debugger inkrem-
       entiert normalerweise in Viererschritten, erkennt aber selber, wenn
       Einer-, Zweier- oder Dreierschritte notwendig sind (siehe Beispiel).
       Endlosschleifen und Zeiger auf sich selber werden erkannt.
     - Xbra FirstVector[,LastVector],Kennung gibt nur gerade die Verket-
       tungen aus, die die Kennung enthalten. Diese Routine wird mit einem
       Pfeil am  Schluss gekennzeichnet (Ascii 4).
     Die Debuggereigene Routine wird mit einem * gekennzeichnet.
     Falls das VBR (VectorBaseRegister) ungleich Null ist, wird eine War-
     nung ausgegeben. Die XBRA Liste wird aber grundstzlich immer von der
     angegebenen Adresse ausgegeben, d.h. x 84 wird nicht automatisch zu x
     ^vbr+84.

     Beispiele:

     $00248206>x 81,88

      XBRA links for $00000081:
      $84BA001C without XBRA

      XBRA links for $00000084:
      $001C7FCA "PBUG" points to $002109AA*
      $002109AA "BUG1" points to $00046316
      $00046316 "Cham" points to $00020ABA
      $00020ABA "MSPO" points to $0001CC08
      $0001CC08 "OFLS" points to $000141A6
      $000141A6 "NVDI" points to $0024E970
      $0024E970 without XBRA

      XBRA links for $00000088:
      $001C804A "PBUG" points to $001C8074*
      $001C8074 "PBUG" points to $00210C40*
      $00210C40 "BUG1" points to $00045D2C
      $00045D2C "Cham" points to $0001008E
      $0001008E "NVDI" points to $00021E06
      $00021E06 "LTMF" points to $00029990
      $00029990 "SLCT" points to $00260770
      $00260770 without XBRA

     $00123456>x 0,100,'LTMF'

      XBRA links for $00000088:
      $0102EC14 "LTMF" points to $010374B4
      $010374B4 "SLCT" points to $0101D00E
      $0101D00E without XBRA

      XBRA links for $000000B4:
      $0102EF62 "LTMF" points to $0101094C
      $0101094C "OFLS" points to $0002C904
      $0002C904 "PBUG" points to $01007684
      $01007684 "NVDI" points to $00E00DA2
      $00E00DA2 without XBRA


     4.7.53. ?

     Syntax: ? Term{,Term}

     Gibt den Wert von Term in allen Zahlensystemen (Hexadezimal, Dezimal,
     Binr, Oktal) und als String aus. Die Werte werden auf ihre krzeste
     Form gekrzt, d.h. Nullen am Anfang werden weggelassen. Wenn der Wert
     negativ ist wird zustzlich der negative Wert im Hexadezimal und De-
     zimalsystem ausgegeben.

     Beispiele:
     $000203B6>?-1
      $FFFFFFFF .4294967295 %11111111111111111111111111111111 o37777777777
      "...." -$1 -.1
     $000203B6>?"PBUG"
      $50425547 .1346524487 %1010000010000100101010101000111 o12020452507
      "PBUG"


     4.7.54. /

     Syntax: / [.b|.w|.a|.l] [Term]{,Term} - default word

     / gehrt zu >DISASSEMBLE und schreibt die Terme an die aktuelle Zeile-
     nadresse. Term ist aufgebaut wie beim Befehl >FIND. Wenn Sie dem / ein
     .X anhngen, dann werden alle Terme entweder auf diese Lnge erweitert
     oder abgeschnitten, wobei .b = byte, .w = word, .a = 3 Bytes, .l =
     long ist. Defaultmssig ist ein .w eingestellt. Wenn Sie dies strt,
     benutzen Sie anstatt / den Befehl ,.

     Beispiele:
     $000203B6>/ 4E75,1234.a
      schreibt an die Adresse $203B6 den Wert 4E75,1234
     $000203B6>/.a 4E75,12345678
      schreibt an die Adresse $203B6 den Wert 004E,7534,5678
     $000203B6>/.l 4E75,1234.a
      schreibt an die Adresse $203B6 den Wert 0000,4E75,0000,1234


     4.7.55. !

     Syntax: ! Opcode

     ! gehrt zu >LIST und assembliert den Befehl der ! folgt und schreibt
     ihn an die aktuelle Zeilenadresse. Der Assembler arbeitet symbolisch
     und bersetzt alle MC680x0 Befehle mit erweiterten Adressierungsarten.

     Ein Basedisplacement kann nur in der offiziellen Motorolasyntax einge-
     geben werden. Ein -1(SP) muss also als (-1,SP) eingegeben werden.

     Wie blich ist die Eingabe sehr fehlertolerant, so wird z.B.
     "adda ( [- 1 0z sp d0 . l * 8-1.lsp       *clr" als
     "ADDA.W   ([$FFF0,ZA7,D0.L*8],-1),A7"
     oder
     "clr ([10za1sp-1" als
     "CLR.W    ([$10,ZA1,A7.W],-1)" bersetzt

     Ein Befehl wird optimal codiert, d.h. Displacements werden so kurz als
     mglich gewhlt, ebenso Sprnge ohne Lngenvorgabe. Sie knnen der
     Flexibilitt zuliebe aber auch die Lnge der Displacements whlen. Ein
     clr ([-1,a0],10) wird vier Bytes krzer codiert als ein clr ([-
     1.l,a0],10.l).

     Beachten Sie, dass der Assembler gleichzeitig mit vorzeichenbehafteten
     und vorzeichenlosen Zahlen arbeitet. Im Positiven wird mit vorzeichen-
     losen, im Negativen mit vorzeichenbehafteten Zahlen gearbeit (Zahlen-
     theoretiker mgen mir dies verzeihen). Eine Zahl umfasst so den Be-
     reich -2147483648 bis 4294967295 oder -32768 bis 65535 oder -128 bis
     255, je nachdem ob es sich um ein Long, ein Word oder ein Byte han-
     delt.


     4.7.56. ,

     Syntax: , [.b|.w|.a|.l] [Term]{,Term} - no default

     , gehrt zu >DUMP und schreibt die Terme an die aktuelle Zeilenadres-
     se. Term ist aufgebaut wie beim Befehl >FIND. Wenn Sie dem / ein .x
     anhngen, dann werden alle Terme entweder auf diese Lnge erweitert
     oder abgeschnitten, wobei .b = byte, .w = word, .a = 3 Bytes, .l =
     long ist. Wenn die Lngenangabe fehlt, wird jeder Term in der Lnge
     geschrieben, wie Sie ihn eingegeben haben (im Gegensatz zu /).

     Beispiele:
     $000203B6>, 4E75,1234.a
      schreibt an die Adresse $203B6 den Wert 4E75,0012,34
     $000203B6>,.a 4E75,12345678
      schreibt an die Adresse $203B6 den Wert 004E,7534,5678
     $000203B6>,.l 4E75,1234.a
      schreibt an die Adresse $203B6 den Wert 0000,4E75,0000,1234


     4.7.57. )

     Syntax: ) String

     Gehrt zu >ASCII und schreibt den folgenden String an die aktuelle
     Zeilenadresse. Der String muss keine bestimmte Lnge haben, nur muss
     er mit einem " oder ' abgeschlossen sein.


     4.7.58. :

     Syntax: : Address[,Term]{,Term}

     : schreibt die Terme an die angegebene Adresse. Dieser Befehl wurde
     vorallen aus nostalgischen Grnden implementiert (Templmon)

     Beispiele:
     $000203B6>:,4E75,1234.a
      schreibt an die Adresse $203B6 den Wert 4E75,0012,34
     $000203B6>:,.a 4E75,12345678
      schreibt an die Adresse $203B6 den Wert 004E,7534,5678
     $000203B6>: 600,"This is a Teststring"
      schreibt an die Adresse $600 den obigen String








     5. Trace, Breakpoints und dergleichen
     -------------------------------------



     Ein an sich simples Unterfangen ist auf Motorolaprozessoren das Tracen
     von Programmen, d.h. das schrittweise Ausfhren von Befehlen auf Ma-
     schinenebene.
     Ganz so einfach ist die Sache aber dennoch nicht, denn es sollte nicht
     getraced werden wenn (dies sind natrlich Atarispezifische Einschrn-
     kungen):
     1. flock gesetzt ist
     2. Die Interruptmaske 7 ist

     Die Befehle >Trace + und Trace - tragen dem Rechnung, indem Sie den
     Tracemodus gegebenenfalls abschalten.
     Nun gibt es Momente, wo gerade in einer kritischen Routine ein Fehler
     zu suchen ist und deshalb immer getraced werden muss. Auch gibt es
     leider TOS-Versionen, die scheinbar das Statusregister nicht mehr re-
     staurieren und den Tracemodus so fr immer ausschalten. Mit Templmon
     ist es z.B. unter TOS 3.06 nicht mehr mglich mittels t+, g, a den
     Rechner zu tracen, ebensowenig funktioniert dies mit PEACEBUG und
     t+/-.
     Trace * nimmt auf obige Bedingungen keine Rcksicht und traced rck-
     sichtslos weiter. Dies fhrt aber meistens schon nach kurzer Zeit zum
     Absturz. Welche Methode Sie verwenden, mssen Sie ausprobieren, da
     dies sehr stark von der benutzten TOS-Version abhngt.

     Der Tracemodus kann aber auch noch in anderen Situationen eingeschal-
     tet werden, nmlich dann, wenn Sie einen Rombreakpoint setzen.
     Damit ein Breakpoint im Rom funktioniert, wird IMMER getraced (auuser
     in Exceptions), d.h. ohne Rcksicht auf Verluste. Sie sollten also
     sehr vorsichtig damit umgehen.

     Im folgenden einige Erluterungen zu den einzelnen Tracefunktionen.
     Wann welche Funktion den Trace wie benutzt usw.:
     - Trace F1: Es wird nur fr einen einzigen Befehl der Tracemodus akti-
       viert (ohne Rcksicht auf die oben erwhnten Bedingungen, dies ist
       aber ungefhrlich). Wenn es sich um einen Trapv, ein Trap 0-15 oder
       ein Linea handelt, die PEACEBUG als einzelne Befehle betrachtet,
       wird der Tracemodus nicht benutzt. Im Gegensatz zu Bugaboo muss sich
       PEACEBUG um diese Funktion zu implementieren, nicht in den entspre-
       chenden Exceptionvektor einhngen.
     - Do PC F2: Es wird der Tracemodus aktiviert, wenn sich der Befehl im
       ROM befindet. Um die Abbruchbedingung nicht zu "verpassen" wird
       immer getraced, dies ist allerdings meist ungefhrlich. Ist der
       aktuelle Befehl ein bsr oder ein jsr dann wird kein Breakpoint
       gesetzt, dafr der Tracemodus fr die Dauer eines Befehls aktiviert.
     - Tracerts F3: Es wird kein Trace benutzt.
     - Texcept F4: Ebenfalls ohne Trace realisiert, PEACEBUG muss sich auch
       nicht in den Vektor hngen, um diese Funktion zu realisieren.
     - Tr68020 F11: Entspricht F1, was das Tracen anbelangt.
     - Tnosubs F12: Entspricht Do PC, wenn der PC auf ein BSR/JSR zeigt,
       sonst dem normalen Trace F1.
     - Tracerte F13: Es wird kein Trace benutzt.
     - GoTraps F14: Es wird kein Trace benutzt, allerdings muss der Debug-
       ger um diese Funktion zu realisieren, im entsprechenden Vektor hng-
       en, mit Vorteil an erster Stelle. Unter MTOS sollte diese Funktion
       nicht benutzt werden.
     - Breakpoints im Rom: Alle Breakpoints im Rom benutzen den Tracemodus.
       Da immer getraced wird, ist dies gefhrlich.
     - Breakpoints im Ram: Zhler- und Stopbreakpoints schalten den Trace
       fr die Dauer eines Befehls an.
     - Der Befehl Go setzt bei Angabe einer Endadresse, auf dieser ein
       Breakpoint, welcher gleich behandelt wird, wie derjenige, den ein Do
       PC setzt.








     6. Cache
     --------



     hnlich wie Bugaboo besitzt PEACEBUG Befehlscache...s, hier schon der
     erste Unterschied, PEACEBUG verfgt nicht ber einen sondern ber de-
     ren zwei voneinander vllig unabhngige Caches.
     Bei jedem Trace werden die aktuellen Register (siehe unten) in einem
     Cache gespeichert. Die Anzahl Cacheeintrge ist defaultmssig 20 fr
     den ersten und 5 fr den zweiten Cache. Diese Werte knnen entweder
     direkt im Programmcode oder whrend der Laufzeit verndert werden. In
     den Caches kann 'geblttert' werden, d.h. Sie knnen sich anschauen,
     was bisher getraced wurde, wobei in der dritten Zeile angezeigt wird,
     welchen Cacheeintrag Sie sich gerade ansehen.
     Hier nun ein entscheidender Unterschied zum Bugaboocache: die aktuel-
     len Register sind IMMER gerade die, die sich im sichtbaren Cacheein-
     trag befinden, d.h. wenn Sie zurckblttern, so verndern Sie gleich-
     zeitig auch die aktuellen Register, wie Sie beim Verlassen des Debug-
     gers zurckgeschrieben werden. Wenn Sie also an der gleichen Stelle
     weiterfahren wollen, wie beim Einsprung, mssen Sie sich beim ersten
     Cacheeintrag befinden (gezhlt wird 0,1,2,...). Damit entfallen um-
     stndliche Befehle wie Cacheget bei Bugaboo, das Arbeiten mit den Ca-
     ches geht so viel schneller vonstatten, kann aber auch gefhrlich
     sein, da man leicht vergisst, den Cache zurckzusetzen.
     Wenn Sie Register editieren, verndern Sie gleichzeitig auch den ak-
     tuellen Cacheeintrag, so knnen Sie ein Programmstck leicht zweimal
     mit unterschiedlichn Registerwerten durchlaufen, einfach zurckscrol-
     len, Register ndern, nochmals tracen.

     Doch wozu nun zwei Caches?
     Der zweite Cache ermglicht es Ihnen mal schnell was auszuprobieren,
     ohne Gefahr zu laufen, die alten Registerinhalte zu verlieren, ein
     wenig vergleichbar also mit den Funktionen rs und rr von Templmon.
     z.B. haben Sie an der Adresse xy eine Doppelseite entdeckt, die Ihnen
     verdchtig vorkommt:
     - Alternate Shift Insert (Cache wechseln mit Registercopy)
     - PC auf Doppelseite setzen
     - Tracen
     - Alternate Insert (Cache wechseln ohne Registercopy)
     Da die beiden Caches absolut identisch sind, ist es egal auf welchem
     Sie debuggen, hauptsache Sie verlassen den Debugger mit den richtigen
     Registerwerten.

     Der Cache ist als Ring organisiert und kann daher leicht erweitert
     werden. Ein einzelner Eintrag umfasst in der vorliegenden Version 270
     Bytes und ist die folgt aufgebaut (folgende Struktur nur zur Informa-
     tion)

     double FPn[8]             ; FP Register (96 Bit lang)
     long   FPSR               ; FP Status Register
     long   FPIAR              ; FP Instruction Address Register
     long   FPCR               ; FP Control Register
     word   TC_40              ; Translation Control Register
     long   URP                ; User Root Pointer Register
     long   DTT1               ; Data Transparent
     long   DTT0               ; Translation Register 0/1
     long   ITT1               ; Instruction Transparent
     long   ITT0               ; Translation Register 0/1
     long   TC_30              ; Translation Control Register
     long   TT1                ; Transparent Translation
     long   TT0                ; Register 0/1
     dlong  CRP                ; CPU Root Pointer Register (64 Bit Wert!)
     word   MMUSR              ; MMU Status Register
     dlong  SRP                ; Supervisor Root Pointer (40er nur 32 Bit)
     long   MSP                ; Master Stack Pointer
     long   CACR               ; Cache Control Register
     long   CAAR               ; Cache Adress Register
     long   VBR                ; Vektor Base Register
     long   DFC                ; Destination Function Code
     long   SFC                ; Source Function Code
     long   USP                ; User Stack Pointer
     long   SSP                ; Supervisor Stackpointer
     long   PC                 ; Program Counter
     word   STATUS             ; Status Register
     long   Dn[8]              ; D0-D7
     long   An[8]              ; A0-A6
     long   *NEXT_RECORD       ; Zeiger auf den nchsten Eintrag
     long   *PREVIOUS_RECORD   ; Zeiger auf den vorherigen Eintrag

     ACHTUNG: beim Einsprung in den Debugger wird der aktuelle Supervisor-
     stack temporr benutzt, d.h. es werden Werte auf diesem Stack ber-
     schrieben! Wenn Sie ein im Supervisormodus laufendes Programm tracen,
     knnen darum Befehle wie rts nicht mehr wiederholt werden, weil die
     Rcksprungadresse, die auf dem Stack lag, vermutlich berschrieben
     wurde. Das Gleiche gilt fr alle Befehle, die Werte vom Stack lesen.








     7. Symbole
     ----------



     7.1. PEACEBUG.SYM
     -----------------


     Bei Programmstart wird die Datei PEACE*.SYM geladen, falls Sie sich im
     gleichen Verzeichnis befindet, wie der Debugger. Diese Datei enthlt
     symbolische Konstanten, die beim Disassemblieren, Assemblieren und vom
     Formelinterpreter benutzt werden.
     Die bis anhin untersttzten Formate wurden ersatzlos gestrichen und
     durch ein neues Format ersetzt. Dieses Format enthlt die Wertzuwei-
     sungen in ASCII-Form und kann deshalb mit jedem Editor verndert wer-
     den. Es gelten folgende Regeln:
     - Leerzeichen werden immer ignoriert, egal wo sie sich befinden
     - Zeilen mssen mit CR/LF abgeschlossen sein
     - Die Datei darf keine Nullbytes enthalten
     - Kommentarzeilen beginnen mit einem *
     - eine Wertzuweisung hat folgende Form: SYMBOLNAME=WERT
     - Die Symbolnamen knnen bis zu 32767 Zeichen lang sein (das drfte
       gengen, oder?)
     - Wert ist ein beliebiger Ausdruck, wie er vom Formelinterpreter des
       Debuggers verarbeitet wird, also z.B. pw(p4f2+2) (=os_version). Es
       ist allerdings sinnlos, Register oder Symbole darin zu verwenden, da
       diese noch keinen definierten Wert haben (die erzeugten Symbole sind
       Konstanten!).

     Die angelegte Symboltabelle arbeitet mit variablen Symbollngen und
     braucht deshalb ein Minimum an Speicher.



     7.2. Lexecute
     -------------


     Wird ein Programm mittels Lexecute geladen und ist an dieses eine Sym-
     boltabelle im GST-/DRI-Format angehngt, wird diese mitgeladen. Der
     Debugger lscht dabei alle Konstanten, weil diese beim Disassemblieren
     stren. Korrekterweise msste man diese mitladen und beim Disassemb-
     lieren zwischen Symbolen im TEXT-/DATA-/BSS-Segment und Konstanten
     unterscheiden. Dies ist aber sehr aufwendig und meines Wissens tut
     dies auch kein Debugger. Die Symbole werden ins gleiche Format gewan-
     delt, wie die Konstanten (PEACE*.SYM). Die Symboltablle des Debuggers
     z.B. belegt so nur durchschnittlich 19 Bytes pro Symbol (32 bei
     Bugaboo...).



     7.3. Resident Symbol Driver
     ---------------------------


     Der Resident Symbol Driver (RSD) ist ein Programm von Robert Federle,
     das Symboltabellen von Programmen anlegen kann, die gestartet werden.
     Diese Symboltabellen werden ber eine Cookieschnittstelle zur Verf-
     gung gestellt. Es ist also so mglich, vom Desktop ein Programm zu
     starten, das eine Symboltabelle enthlt, den Debugger aufzurufen (der
     resident istalliert ist) und die Symbole des Programms zu benutzen.
     Falls dieser Treiber installiert ist, bentzt PEACEBUG zustzlich zu
     den eigenen Tabellen, diejenigen des Treibers. Da dieser die Symbol-
     suche nicht exakt gleich vornimmt wie der Debugger, kann der Output
     dann leicht anders aussehen (z.B. hat es mehr Symbole). Ein Problem
     ergab sich beim Parser: derjenige des Debuggers ist ziemlich flexibel,
     als Folge aber nicht nach Lehrbuch programmiert. Er zerlegt die Ein-
     gaben nicht von Anfang in Tokens, sondern bearbeitet immer alles zu-
     sammen, so dass z.B. "l .flock+1" nach dem Symbol .flock+1 sucht, was
     beim Debugger funktioniert, beim RSD aber nicht. Dies ist kein Fehler
     eines der Programme, sondern ein konzeptioneller Unterschied.

     Aber damit hat es sich noch nicht. Der Befehl >Programs gibt eine
     Liste aller gestarteten Programme aus, die sich der Debugger vom
     Symboltreiber holt. Darberhinaus fgt der Debugger bei der Ausgabe
     im Listmodus den Namen des Programms ein, das zur ausgegebenen Adresse
     passt:
       $01057536>! [GEMRAM]   RTS                                    ; 4E75

     Typ 1: Angenommen Sie wollen Ihr Programm debuggen, das aus mehreren
     Modulen besteht, die vom Programm nachgeladen werden (Programme wie
     Xcontrol oder diverse Bildschirmschoner). Um im Debugger zu erkennen
     welches Modul gerade dran ist, fgen Sie die Symboltabelle in die vom
     RSD verwaltete Liste ein (dazu lesen Sie das Readme des RSD), und er-
     kennen von nun an immer, wo sie gerade debuggen.

     Typ 2: SYMBOL.SMB ist eine Symboltabelle, die der RSD bei Programm-
     start nachldt. Falls Sie den RSD nur zusammen mit PEACEBUG
     benutzen, d.h. wenn kein anderer Debugger auf diese Symboltabelle zu-
     greifen muss, lschen Sie diese Datei oder benennen Sie sie um, damit
     sie nicht geladen wird, denn doppelt genht hlt hier nicht besser.
     PEACEBUG.SYM enthlt in etwa die gleichen Symbole, so dass SYMBOL.SMB
     berflssig wird. D.h. durch Nichtbenutzen, sparen Sie Speicher und
     die Symbolsuche wird schneller.








     8. Reset fest, Reset resident
     -----------------------------



     Folgende Dinge passieren im Falle eines Warmstarts (gekrzt):
     1. SSP und PC setzen, Reset
     2. Diagnose Cartride ausfhren, falls vorhanden
     3. Routinen im Resetvektor ($42A) ausfhren
     4. Hardwareinitialisierung
     5. Systemvariablen setzen, Interrupts initialisieren, Bios initiali-
        sieren
     6. Bildschirm initialisieren
     7. Diskette booten
     8. Harddisk booten
     9. Doppelseiten ausfhren (undokumentiert)
     10. COMMAND.PRG starten wenn _cmdload nicht 0 ist
     11. Autoordnerprogramme ausfhren
     12. AES und Desktop starten


     PEACEBUG setzt an zwei Stellen an, um zu "berleben":

     1. Resetfestigkeit. Er installiert sich im Resetvektor.
        Um einen Reset mittels der Resettaste zu berleben muss der Debug-
        ger nur gerade Punkt 4 bernehmen. Dies funktioniert allerdings
        nur, wenn Sie sich im Debugger befinden, andernfalls geht leider
        der PC verloren und das Programm kann nicht fortgefhrt werden.
        Falls ein Reset ausserhalb des Debuggers stattfindet, wird der
        Debugger nur angesprungen, falls er entsprechend konfiguriert wurde
        (>Schnittstelle), der PC zeigt dann auf die Stelle des Bootcodes,
        die die Routinen im Resetvektor ausfhrt.
        Die Resetfestigkeit von PEACEBUG ist vorallem dann sehr ntzlich,
        wenn sich die Hardware "aufgehngt" hat, normalerweise luft dann
        nichts mehr, mittels eines Resets kann PEACEBUG aber meist wieder-
        belebt werden.

     2. Resetresidenz. Er installiert eine Doppelseite.
        Normalerweise wird der Debugger bei einem Warmstart terminiert.
        Dies knnen Sie verhindern indem Sie beim Booten >Shift links<
        gedrckt halten. Der Debugger bleibt dann resident und wird noch
        vor dem ersten Autoordnerprogramm installiert. Ein als Autoordner-
        programm gestarteter PEACEBUG erkennt die residente Version und
        wird nicht nochmals installiert. Wenn Sie sich fr den Bootvorgang
        interessieren und diesen debuggen wollen, drcken Sie zustzlich
        >Shift rechts<, der Debugger wird dann unmittelbar nach dem Instal-
        lieren angesprungen und der PC zeigt auf die Routine, die die Dop-
        pelseiten sucht.
        Achtung: das von PEACEBUG benutzte System lsst nicht zu, dass sich
        ausser dem Debugger selber noch ein zweites resetresidentes Pro-
        gramm installiert, das gilt auch, wenn Sie PEACEBUG mehrmals in-
        stalliert haben, nur eine Version wird berleben.
        Das im Profibuch vorgeschlagene System verbietet sich von selbst,
        denn was geschieht, wenn Atari sich entschliesst den Bereich von
        $600-$700 zu benutzen, wie es beim Bereich $700-$800 geschah?
        Hier ein kurzer Abriss, was alles vonnten ist, um Resetresidenz zu
        erreichen:
        - Speicher reservieren im ST-Ram, da nur dieses nach Doppelseiten
          durchsucht wird.
        - Anlegen der Doppelseite im reservierten Speicherbereich
        - Bei einem Warmstart werden alle allozieren Speicherbereiche frei-
          gegeben (aber nicht gelscht, im Profibuch ist dies fehlerhaft
          beschrieben). Es muss deshalb neuer Speicher reserviert, der De-
          bugger in diesen Bereich kopiert und reloziert werden. Die
          Kopier- und Relozierroutine wird auf den Stack ausgelagert.
        - Leider geht bei obigem Vorgang die Symboltabelle verloren, sie
          muss nachgeladen werden.
        Obige Vorgnge erfordern einigen selbstmodifizierenden Code,
        selbstverstndlich werden dabei eventuell vorhandene Prozessor-
        caches gelscht (MC68020/30/40).

     Es wird sowohl in der Doppelseite als auch in der Resetroutine ge-
     prft, ob der Debugger beschdigt wurde. Ist dies der Fall, verab-
     schiedet er sich endgltig (nein er strzt nicht ab, er beendet sich).

     Fr diejenigen, die sich fr den Bootvorgang interessieren hier einige
     Tips. Die Angaben sind allerdings je nach TOS Version leicht verschie-
     den, ganz alte Versionen drften ein anderes Vorgehen haben:
     Beim Einsprung zeigt der PC auf die Routine, die die Doppelseiten
     sucht, wobei die Adresse, an der gesucht wird, vom Debugger auf $600
     gesetzt wird, um zu vermeiden, dass andere Doppelseiten ausgefhrt
     werden. Dies wre gefhrlich, da sich der Debugger eventuell im Spei-
     cher verschiebt und so andere residente Programme beschdigen knnte.
     Nach dieser Routine wird _cmdload getestet und gegebenenfalls verz-
     weigt. COMMAND.PRG wird gleich nach allen Autoordnerprogrammen gestar-
     tet. Diese werden nun wie folgt ausgefhrt:
     1. Mittels PEXEC 5 (Create Basepage) legt das OS eine Basepage an,
        schreibt die Adresse einer Routine in die Basepage (Offset 8) und
        fhrt dann ein PEXEC 4 (Just Go) aus. Dieses PEXEC knnen Sie nicht
        einfach so bertracen, weil die aufgerufene Routine direkt zurck-
        springt (der Stack wird neu gesetzt). Sie mssen also entweder den
        Trap durchtracen oder ein Breakpoint setzen (funktioniert auch im
        ROM problemlos).
     2. Die gestartete Routine geht in den Supervisormodus, setz die DTA
        und sucht dann mittels FSFIRST/FSNEXT die Autoordnerprogramme.
     3. Die Programme werden mittels PEXEC 0 (Load and GO) gestartet.
        Nun wird _sysbase gesetzt, ein Environmentstring erzeugt (PATH=...)
        und mittels PEXEC 5, PEXEC 4 die Routine in exec_os ausgefhrt,
        normalerweise AES und Desktop.








     9. Vektoren
     -----------


     Die 48 Routinen, die PEACEBUG einhngen kann, bilden den Kern des Pro-
     gramms. Gerade hier muss daher grsstmgliche Flexibilitt geboten
     werden. Bevor ich jedoch auf die Mglichkeiten von PEACEBUG diesbe-
     zglich eingehe, einige Erluterungen zum Thema XBRA.



     9.1. XBRA
     ---------


     Jedes Programm, das sich in einen Vektor einhngt, sollte vor seiner
     Einsprungadresse folgende Struktur installieren:

     typedef struct
     {
          char xb_magic[4];    /* "XBRA" */
          char xb_id[4];       /* XBRA-ID des installierten Programms */
          long xb_oldvec;      /* Wert des Vektors vor dem Einhngen */
     } XBRA;

     oder in Assembler:
                   dc.l 'XBRA'
                   dc.l 'PBUG'
     ALTE_ROUTINE: dc.l $xxxxxxxx
     ROUTINE: ...

     Wenn sich alle Programme an obige Konvention halten, ist es fr ein
     Programm ein leichtes, sich aus einem Vektor auszuhngen, ohne auch
     andere Routinen mitauszuhngen. Ebenfalls kann so festgestellt werden,
     ob man sich schon in den Vektor eingehngt hat. Ist auch nur ein ein-
     ziges Programm da, das kein XBRA benutzt (UISIII z.B.) oder es falsch
     benutzt (GEMINI 1.21 z.B.), so funktioniert dies nicht mehr. Leider
     gibt es immer noch Programmierer, die finden, da sie sich eh nicht
     aushngen wollen, brauchten sie auch kein XBRA zu bentzen. In der
     Regel geht es aber nicht um das eigene Programm, sondern um fremde.
     Eines davon ist PEACEBUG.

     An dieser Stelle noch eine Bemerkung zu "resvector".
     Es ist trotz XBRA nicht mglich, sich sauber aus diesem Vektor auszu-
     hngen, da resvalid ber XBRA nicht zugnglich ist und nicht bei allen
     in diesem Vektor hngenden Programmen zwingend $31415926 sein muss
     (insbesondere beim ersten Programm nicht, das sich einhngt). Meine
     Lsung ist simpel aber effektvoll: Jedes Programm testet vor dem zu-
     rckspringen ins TOS, ob noch ein anderes Programm im Vektor hngt.
     Wenn ja, wird resvalid mit dem magic beschrieben, andernfalls ge-
     lscht. Diese Methode erlaubt es Programmen, sich gefahrlos auszuhn-
     gen und she in etwa so aus:

                             DC.L 'XBRA'
                             DC.L _ID
     OLD_RESET:              DC.L 0
     RESET:          MOVE.W      SR,-(SP)
                     ORI.W       #$700,SR
                     MOVE.L      A0,-(SP)
                     MOVE.L      SP,SAVE_SP_RESET
                     MOVE.L      $08.w,SAVE_BUS_RESET
                     MOVE.L      $0C.w,SAVE_ADDRESS_RESET
                     MOVE.L      #_RESET,$08.w
                     MOVE.L      #_RESET,$0C.w
                     MOVE.L      #$31415926,RESVALID.w
                     MOVEA.L     OLD_RESET(PC),A0
                     MOVE.L      A0,RESVECTOR.w
                     CMPI.L      #'XBRA',-12(A0)
                     BEQ.S       ANOTHER_ONE
     _RESET:         CLR.L       RESVALID.w
     ANOTHER_ONE:    *well here you go*
                     MOVE.L      SAVE_ADDRESS_RESET(PC),$0C.w
                     MOVE.L      SAVE_BUS_RESET(PC),$08.w
                     MOVEA.L     SAVE_SP_RESET(PC),SP
                     MOVEA.L     (SP)+,A0
                     MOVE.W      (SP)+,SR
                     JMP         (A6)

     SAVE_BUS_RESET:         DS.L 1
     SAVE_ADDRESS_RESET:     DS.L 1
     SAVE_SP_RESET:          DS.L 1



     9.2. Ein Wort regelt alles ...
     ------------------------------


     Bei jedem Einsprung in den Debugger, beim Aufruf einer Funktion ber
     Return oder beim Drcken einer Funktionstaste wird die Routine >Vektor
     aufgerufen. Diese dient dazu, Exceptionroutinen einzuhngen, auszuhn-
     gen, an die erste Position zu hngen und dergleichen mehr.
     Jeder der 48 Routinen ist ein Word zugeordnet, das genau festlegt, wie
     diese Routine von >Vektor behandelt wird. Gleichzeitig dient dieses
     Wort dazu, festzulegen, was der Debugger bei Auftreten der entsprech-
     enden Exception tun darf/soll/muss.
     Das ganze ist so flexibel gehalten, dass Sie beinahe alles machen kn-
     nen. Beispielsweise knnen Sie PEACEBUG zweimal installieren (zwei
     identische aber verschieden konfigurierte Versionen) und den einen mit
     dem andern debuggen.

     Im folgenden wird beschrieben, wie dieses ominse Wort codiert ist.



     9.3. Das hherwertige Byte
     --------------------------


     Das hherwertige Byte wird von >Vektor benutzt und kann folgende Werte
     annehmen:
     -2: Die Debuggeroutine wird gesucht und falls sie gefunden wird, aus-
         gehngt um dann an erster Stelle wieder eingehngt zu werden.
     -1: Die Debuggeroutine wird gesucht und falls sie gefunden wird, aus-
         gehngt um dann an erster Stelle wieder eingehngt zu werden. Wird
         sie nicht gefunden, wird sie neu installiert
     0: Die Debuggeroutine wird gesucht und falls sie gefunden wird, ausge-
        hngt.
     1: Die Debuggeroutine wird gesucht. Wird sie nicht gefunden, wird sie
        neu installiert
     2: Es passiert gar nichts


     Erluterugen:
     1. Das Aushngen von Vektoren kann bei PEACEBUG gefhrlich sein, da es
        jederzeit stattfinden kann. Geschieht dies gerade in dem Moment, wo
        der Debugger angesprungen werden soll, so wird die aufrufende Rou-
        tine eventuell zweimal angesprungen und welche Routine ist schon
        reentrant? Meine (lange...) Erfahrung mit dem Debugger hat aller-
        dings gezeigt, dass dieser Fall nie eintritt.
     2. Bei Programmstart werden alle Routinen eingehngt, es sei denn, das
        hherwertige Byte ist Null.
     3. -1 bei Routinen benutzen, die nicht weiterspringen und die vom De-
        bugger gebraucht werden: Illegal Opcode und Trace.
     4. -2 bei allen Routinen benutzen, bei denen es vorteilhaft ist, wenn
        Sie an erster Stelle im Vektor hngen: alle Exceptions, die Sie vom
        Debugger abfangen und anzeigen lassen wollen (Format Error, Priv-
        ileg Error, Ring Indicator ...)
     5. Weniger ist mehr!
        Je weniger Routinen Sie einhngen, desto weniger Unheil kann PEACE-
        BUG anrichten. Nicht benutzte Vektoren, wie PMMU Illegal oder
        Coproc. Protocol Viol. sollten Sie nicht einhngen.
     6. Zwei spezielle Vektoren sind AES und LINEF.
        Sie sollten erst eingehngt werden, wenn AES installiert ist. Wird
        der Debugger vom Desktop gestartet, kann dies sofort geschehen, bei
        Start aus dem Autoordner muss abgewartet werden, bis AES instal-
        liert ist. Dies merkt PEACEBUG selber, vorausgesetzt Sie lassen ihn
        sich in den Biostrap einhngen.
        PEACEBUG kann zweimal im Trap 2 hngen. Dies weil bei Initialisie-
        rung der AES der Vektor vom Betriebsystem berschrieben wird. VDI
        ist dabei die Routine, die als erste eingehngt wird.
     7. LINEF einzuhngen, macht nur bei Betriebsystemen Sinn, die auch
        Linef benutzen, also bei Versionen <=1.04, bei allen andern sollten
        Sie das Flag auf Null setzen. Tip: gerade Linef-Befehle mit DoPC
        bertracen, ungerade normal tracen (F1).
     8. Richtig zu Konfigurieren ist nicht einfach.
        Wenn Sie dort einen Fehler machen, dann strzt der Rechner ab. Dies
        passiert genau dann, wenn Sie Ihren wichtigsten Quelltext abspei-
        chern wollen. Selbstverstndlich wird dabei auch Ihr einziges
        Backup berschrieben...



     9.4. Das niederwertige Byte
     ---------------------------


     Das niederwertige Byte wird von der Routine selber benutzt und ist
     folgendermassen codiert:
     Bit 0: ist dieses Bit gesetzt, wird in den Debugger gesprungen und
            eine entsprechende Meldung ausgegeben.
     Bit 1: ist dieses Bit gesetzt, wird versucht die Exception zu korri-
            gieren, d.h. es wird auf dem nchsten Befehl weitergefahren.
            Bit 0 hat hhere Prioritt als Bit 1.
     Sind beide Bits 0, wird in die Originalroutine verzweigt (d.h. dieje-
     nige die vorher im Vektor hing).


     Ein spezieller Fall ist eine Privilege Violation. Hier haben zwei wei-
     tere Bits eine Bedeutung:
     Auf einem 68000er gibt es den Befel move sr,<ea>, der auch im Usermo-
     dus erlaubt ist, ganz offensichtlich ein Designfehler. Dies hat Moto-
     rola erkannt und ab dem 68010 gibt es diesen Befehl im Usermodus nicht
     mehr. Dafr gibt es zustzlich den Befehl move ccr,<ea>.
     Scheinbar gibt es Programme, die diesen Befehl im Usermodus benutzen
     und deshalb nur auf einem 68000er korrekt laufen. Pikanterweise gehrt
     z.B. Atari's HDX zu diesen belttern ...
     Bit 4: ist dieses Bit gesetzt und tritt bei einem move sr,<ea> eine
            Exception auf, wird der Befehl vom Exceptionhandler im Super-
            visormodus ausgefhrt, das Programm merkt also nicht, das eine
            Exception auftrat.
            Das macht das TOS doch schon, werden Sie einwerfen!
            Mit dieser Behauptung liegen Sie zwar nicht ganz falsch, aber
            auch nicht vllig richtig.
            Korrekt ist, dass das TOS nur einige Befehle im Supervisormodus
            ausfhren kann. Ein "move sr,([-1,za0,d0*8],-1)" kann das TOS
            nicht korrigieren, der Debugger hat auch damit keine Schwierig-
            keiten.
     Bit 5: ist dieses Bit gesetzt und tritt bei einem move sr,<ea> eine
            Exception auf, wird der Befehl durch den entsprechenden move
            ccr,<ea> ersetzt (im Code selber!, die Prozessorcaches werden
            dann entsprechend geflusht).
     Beide Bits haben hhere Prioritt als Bit 0 und 1.



     9.5. Vektoren, in eigener Sache
     -------------------------------


     Einige  Routinen werden fr eigene Zwecke missbraucht, die Gltigkeit
     der eben beschriebenen Bits wird dadurch eingeschrnkt:
     - Adress- und Buserrorhandler werden intern benutzt, ausserhalb des
       Debuggers gelten die blichen "Regeln". Sie knnen den Debugger
       allerdings auch dahingehend konfigurieren, dass er sich nicht in die
       beiden Vektoren einhngt. Dies schrnkt die Funktionsweise des De-
       buggers normalerweise nicht ein, interne Bus-/Adressexception werden
       trotzdem abgefangen! Um sicher zu gehen, sollten Sie dies aber
       trotzdem unterlassen und nur verwenden, wenn Sie PEACEBUG debuggen
       wollen.
     - Der Illegal Opcode Handler wird fr Breakpoints und um in den Super-
       visormodus zu schalten benutzt.
     - Die Traceexception wird immer fr eigene Zwecke gebraucht, die Flags
       haben daher keine Wirkung
     - Ein Reset innerhalb des Debuggers wird immer abgefangen. Ein Reset
       ausserhalb wird abgefangen, wenn Bit 0 oder 1 gesetzt sind.
     - Der etv_critic Handler wird intern benutzt, ausserhalb des Debuggers
       behalten die Flags ihre Gltigkeit.
     - Der 200 Hz Timer wird fr die diversen internen Timer benutzt (Ti-
       meout, Keyrepeat etc.), die Observe- und die Slowmotionfunktion.
     - Der Keyboardinterrupt ignoriert die Flags innerhalb des Debuggers.
       PEACEBUG hat die Eigenschaft, dass andere PEACEBUGs Tastatureingaben
       mitbekommen, andere Debugger wie Templmon allerdings nicht. Sie
       knnen also jederzeit PEACEBUG mittels eines zweiten PEACEBUG unter-
       brechen, aber nicht mit anderen Debuggern (ausser Sie konfigurieren
       PEACEBUG entsprechend).








     10. Schnittstelle
     -----------------



     10.1. Grundstzliches
     ---------------------


     PEACEBUG besitzt eine Schnittstelle, die jedem Programm zugnglich
     ist. Diese ist dokumentiert und wird in zuknftigen Programmversionen
     nicht verndert, nur erweitert. Programme die diese Schnittstelle kor-
     rekt benutzen, werden also auch mit spteren Versionen keine Probleme
     haben.
     Sollten Sie ein Programm haben, dass diese Schnittstelle benutzt und
     das von allgemeinem Interesse ist, knnen Sie es mir zukommen lassen,
     es kann dann fester Bestandteil von PEACEBUG werden.
     Erreichbar ist die Schnittstelle ber den Cookieeintrag mit Kennung
     'PBUG'. Beispiele von Programmen, die ber den Cookie mit PEACEBUG
     kommunizieren, liegen mit Quelltext bei.
     ACHTUNG: nur die residente Version installiert einen Cookieeintrag,
     d.h. alle in diesem Kapitel beschriebenen Variablen sind nicht zugng-
     lich, falls der Debugger als Programm gestartet wird.

     Jede Struktur, die in diesem Kapitel dokumentiert wird, hat die glei-
     che Form. Am Anfang der Zeile steht der Datentyp (long, int oder char)
     und der Name der Variablen, '*' steht fr Pointer. Dahinter folgt der
     Offset in Bytes vom Beginn der Struktur. Last but not least der Status
     der Variablen, wobei r=read, w=write, p=patch, n=new_format und l=lock
     bedeutet. Variablen mit Status r drfen Sie lesen, solche mit w
     schreiben. Variablen, die den Status p haben, knnen im Programmcode
     (auf Disk/Platte) verndert werden, Variablen ohne p hingegen nur bei
     laufendem Programm (vorausgesetzt w ist gesetzt). Wenn Sie Variablen
     mit Status n verndern, MUSS nachher die Routine NEW_FORMAT aufgerufen
     werden. Wenn die Semaphore SCREEN_LOCK gesetzt ist, drfen Variablen
     mit Status l nicht mehr verndert und Routinen mit eben diesem Status
     nicht aufgerufen werden.
     Gepatched werden kann der Programmcode sehr einfach, 2 Bytes hinter
     dem Programmheader, d.h. in 30 Bytes Offset zum Dateianfang, stehen 6
     Longs, eine Kennung und fnf Offsets, die angeben, wie weit vom Da-
     teianfang sich die entsprechenden Strukturen befinden:

     long _id                Offset 30           /* "PBUG" */
     long *SCREEN_PARAMETER  Offset 34
     long *PARAMETER         Offset 38
     long *FLAGS             Offset 42
     long *FONT_16_8         Offset 46
     long *FONT_8_8          Offset 50

     Mit handle=Fopen(fname,2), Fseek(30,handle,0), Fread(handle,24,buffer)
     bekommen Sie alle wichtigen Werte. Dannach mssen Sie nur noch mit
     Fseek an die entsprechende Stelle springen und knnen dort die Werte
     patchen.

     Der Cookieeintrag zeigt auf die folgende Struktur:
     long *CLEAR_SCREEN               Offset 0        r/l/n
     long *GET_PARAMETER              Offset 4        r/l/n
     long *KILL_SCREEN                Offset 8        r/l/n
     long *NEW_SCREEN                 Offset 12       r/l/n
     long *NEW_FORMAT                 Offset 16       r/l
     long *PRINT_SCREEN               Offset 20       r/l
     long *SCREEN_PARAMETER           Offset 24       r
     long *CALL_DEBUGGER              Offset 28       r
     long VERSION                     Offset 32       r
     long *PARAMETER                  Offset 36       r
     long *USERTRACE                  Offset 40       r/w
     long *USERENTER                  Offset 44       r/w
     long *USERQUIT                   Offset 48       r/w
     long *USERSWITCH_ENTER           Offset 52       r/w
     long *USERSWITCH_QUIT            Offset 56       r/w
     long *USERRESET                  Offset 60       r/w
     long *FLAGS                      Offset 64       r
     long *VEKTOR                     Offset 68       r



     10.2. Bildschirmschnittstelle
     -----------------------------


     Die ersten 6 Pointer zeigen auf Routinen, die dazu benutzt werden kn-
     nen, den Bildschirmtreiber neu zu konfigurieren. Dieser ist so flexi-
     bel gehalten, dass man den Debugger sogar in einem Fenster laufen las-
     sen kann, das entsprechende Programm heisst WINDOW.ACC und liegt dem
     Debugger bei.
     Jede der Routinen endet mit einem rts, wird also normalerweise mittels
     jsr angesprungen (fr Hochsprachen konsultieren Sie bitte ihr Hand-
     buch). Register werden grundstzlich keine verndert. Achtung: diese
     Routinen mssen im Supervisormodus aufgerufen werden.


     10.2.1 CLEAR_SCREEN
     -------------------

     Diese Routine lscht den Debuggerscreen (wer htte es gedacht...),
     Maus und Cursor werden ausgeschaltet. Diese Routine muss nur aufgeru-
     fen werden, wenn der Screen neu konfiguriert wird (NEW_FORMAT), wird
     er hingegen neu installiert (NEW_SCREEN), ist dies nicht ntig.


     10.2.2 GET_PARAMETER
     --------------------

     Diese Routine setzt die unter >SCREEN_PARAMETER aufgefhrten Variablen
     von Offset 42 bis und mit 56. Sie benutzt LINEA 0 und wird z.B. von
     INIT_SCR.PRG benutzt.


     10.2.3 KILL_SCREEN
     ------------------

     PEACEBUG reserviert bei Programmstart einige Speicherbereiche, darun-
     ter 3 fr den Bildschirmtreiber:
     1. Der eigentlich Bildschirmspeicher
     2. Enthlt den Bildschirm in 'Asciiform', also fr jedes Zeichen auf
        dem Screen ein Byte
     3. Puffer fr den Maushintergrund

     Mittels KILL_SCREEN kann nun PEACEBUG veranlasst werden diese Bereiche
     wieder freizugeben. Dazu bergibt man der Routine ein Word auf dem
     Stack, von dem allerdings nur 3 Bit gebraucht werden:
     0. Bit: Bildschirmspeicher freigeben
     1. Bit: Zeichenspeicher freigeben
     2. Bit: Mauspuffer freigeben

     Ein Aufruf sieht in Assembler etwa so aus:

     > move.w #%111,-(sp)        ; alle Bereiche freigeben
     > jsr   (a0)                ; Routine anspringen
     > addq.w #2,sp              ; und Stack korrigieren

     Achtung: Speicherbereiche knnen nach einem PTERMRES nicht mehr frei-
     gegeben werden, KILL_SCREEN muss im Hinblick auf kommende Debuggerver-
     sionen trotzdem aufgerufen werden, auch wenn diese Routine im Moment
     noch nichts bewirkt.


     10.2.4. NEW_SCREEN
     ------------------

     Das Gegenstck zu >KILL_SCREEN.
     Der entsprechende Bereich wird reserviert, im Gegensatz zu KILL_SCREEN
     wird aber auf dem Stack ein Wert zurckgegeben, der angibt ob das Re-
     servieren gelungen ist. Wird eine Null zurckgegegen, ist beim Spei-
     cherreservieren ein Fehler aufgetreten, der Debugger sollte daraufhin
     nach Mglichkeit nicht mehr angesprungen werden. Ein Aufruf sieht in
     etwa so aus:

     > move.w #%111,-(sp)        ; alle Bereiche neu reservieren
     > jsr    (a0)               ; Routine anspringen
     > tst.w  (sp)+              ; Rckgabewert testen, Stack korrigieren
     > beq.s  error              ; Fehler aufgetreten ...


     10.2.5. NEW_FORMAT
     ------------------

     Diese Routine muss bei der Vernderung einer Variablen mit Status n
     oder beim Aufruf einer Routine mit ebendiesem Status aufgerufen wer-
     den. Sie berechnet alle internen Bildschirmvariablen, die der Debugger
     bentigt .


     10.2.6. PRINT_SCREEN
     --------------------

     Der Bildschirm wird neu aufgebaut.


     10.2.7. SCREEN_PARAMETER
     ------------------------

     Dies ist ein Pointer auf folgende Struktur:

     long *BILDSCHIRM_MALLOC          Offset 0        r/w/n/l
     long *BILDSCHIRM_ADRESSE         Offset 4        r/w/n/l
     long *ZEICHEN_ADRESSE            Offset 8        r/w/n/l
     long *MAUS_PUFFER                Offset 12       r/w/n/l
     long reserved[4]
     long *FONT_16                    Offset 32       r/w/n/l
     long *FONT_8                     Offset 36       r/w/n/l
     int  FONT_FLAG                   Offset 40       r/w/p/n/l
     int  OFFSET_X                    Offset 42       r/w/n/l
     int  OFFSET_Y                    Offset 44       r/w/n/l
     int  BILD_BREITE                 Offset 46       r/w/n/l
     int  ZEILEN_LAENGE               Offset 48       r/w/n/l
     int  BILD_HOEHE                  Offset 50       r/w/n/l
     int  SCREEN_BREITE               Offset 52       r/w/n/l
     int  SCREEN_HOEHE                Offset 54       r/w/n/l
     int  PLANES                      Offset 56       r/w/n/l
     long _BILDSCHIRM_LENGTH          Offset 58       r/w/p/n/l
     long _ZEICHEN_LENGTH             Offset 62       r/w/p/n/l
     long _MAUS_LENGTH                Offset 66       r/w/p/n/l
     long reserved[4]
     int  _OFFSET_X                   Offset 86       r/w/p/n/l
     int  _OFFSET_Y                   Offset 88       r/w/p/n/l
     int  _BILD_BREITE                Offset 90       r/w/p/n/l
     int  _BILD_HHE                  Offset 92       r/w/p/n/l
     int  reserved[4]
     byte SCREEN_LOCK                 Offset 102      r/w/l
     byte SWITCH_PALETTE              Offset 103      r/w/p/l
     int  OWN_PALETTE[256]            Offset 104      r/w/p/l


     Diese Variablen/Pointer gengen um genau festzulegen, wie der Debug-
     gerbildschirm auszusehen hat.
     Hier einige Erluterungen, Referenz nach Offset:
     0:  Enthlt einen Zeiger auf den durch Malloc reservierten Bildschirm-
         speicher. Dessen Lnge berechnet sich wie folgt:
         SCREEN_BREITE*SCREEN_HHE+256.
     4:  (BILDSCHIRM_MALLOC+256) AND $FFFFFF00, die eigentliche Bildschirm-
         adresse, stimmt im allgemeinen nicht mit BILDSCHIRM_MALLOC ber-
         ein.
     8:  Zeiger auf den 'Zeichenbildschirm', berechnet wird die Lnge fol-
         gendermassen: ZEILEN_LAENGE*BILD_HOEHE/8.
     12: Zeiger auf den Mauspuffer, Lnge: PLANES*64.
     32: Zeiger auf den 8*16 Font 4096 Bytes lang, dieser ist im Programm-
         code integriert. Wenn Sie einen neuen Font installieren wollen,
         ndern Sie entweder diesen Pointer oder Sie berschreiben den in-
         ternen Font mit dem gewnschten neuen. Der Font selber (nicht der
         Pointer) hat also Status r/w/p/n!).
     36: Zeiger auf den 8*8 Font 2048 Bytes lang, dieser ist im Programm-
         code integriert. Wenn Sie einen neuen Font installieren wollen,
         ndern Sie entweder diesen Pointer oder Sie berschreiben den in-
         ternen Font mit dem gewnschten neuen. Der Font selber (nicht der
         Pointer) hat also Status r/w/p/n!).
     40: gibt an, welcher Font bentzt wird. 4 bedeutet 8*16 Font, 3 8*8
         Font, alle anderen Werte sind nicht definiert und knnen zum Ab-
         sturz fhren.
     42: gibt den Abstand des vom Debugger benutzten Bildausschnittes vom
         linken Rand in Zeichen an (!=Anzahl Bytes wenn PLANE!=1).
     44: gibt den Abstand des vom Debugger benutzten Bildausschnittes vom
         oberen Rand in Pixel an.
     46: gibt die Breite des vom Debugger benutzten Bildausschnittes in
         Zeichen an.
     48: gibt die vom Debugger benutzte Zeilenlnge an, diese muss >=BILD_-
         BREITE und IMMER durch 2 teilbar sein! Durch die Trennung von
         Bildbreite und Zeilenlnge wird die Verwaltung virtueller Zeilen-
         lngen mglich, wie sie ntig ist, wenn die Bildbreite hufig
         ndert, wie z.B. mit WINDOW.ACC. Die Zeilenlnge wird in diesem
         Fall klugerweise auf die maximale Bildbreite gesetzt.
         ACHTUNG: PEACEBUG kann eine maximale Zeilenlnge von 240 Zeichen
         verwalten. Dies ist auch der Grund weshalb er sich bei Bildschirm-
         auflsungen ab 1920 Punkten Horizontal nicht installiert. Diese
         Beschrnkung kann ich allerdings jederzeit gegen oben anpassen,
         wenn dies gewnscht wird, da es sich hier nicht um ein Program-
         miertechnisches Problem handelt.
     50: gibt die Hhe des vom Debugger benutzten Bildausschnittes in Pixel
         an. Diese kann auch ungerade sein.
     52: gibt die Breite des Bildschirms in Bytes an.
     54: gibt die Hhe des Bildschirms in Pixel an.
     56: gibt die Anzahl Planes des Bildschirms an.
     58: Die Bildschirmlnge wird normalerweise aus den obigen Variablen
         berechnet. Wenn diese sich aber ndert, z.B. bei einem Auflsungs-
         wechsel von ST auf TT-Auflsung oder bei Grafikkarten, die erst
         kurz vor GEM in Aktion treten, dann kann mittels dieser Variablen
         die Lnge vorbestimmt werden.
     60: dito fr den Zeichenbildschirm.
     64: dito fr den Mauspuffer.
     Auf einem TT bieten sich fr die obigen drei Variablen die Werte
     153600,19200 und 512 an. Sie knnen dann eine beliebige Auflsung wh-
     len, ohne Angst haben zu mssen, die reservierten Speicherbereiche
     seien zu klein (auf einem ST reicht 32000, 4000, 256).
     Eine andere Mglichkeit ist, PBUGCONF einen neuen Screen installieren
     zu lassen, was jedoch den Nachteil hat, das bei jedem Auflsungswech-
     sel die drei Speicherbereiche verloren gehen.
     86: bei Aufruf von GET_PARAMETER wird OFFSET_X auf einen Defaultwert
     gesetzt (Null), es sei denn _OFFSET_X enthalte einen von Null ver-
     schiedenen Wert. In diesem Fall wird dieser nach OFFSET_X kopiert.
     Zusammen mit den folgenden 3 Variablen kann so der Screen auf einen
     kleinen Bereich beschrnkt werden, was mitunter auf Grossbildschirmen
     aus Performancegrnden sinnvoll sein kann.
     88: dito fr OFFSET_Y
     90: dito fr BILD_BREITE
     92: dito fr BILD_HHE
     102: ein Programm, das auf irgendeine der Variablen oder Routinen zu-
          greift, die Status l haben, muss diese Semaphore testen. Bei
          einem Wert ungleich Null, darf weder eine Routine aufgerufen
          noch eine Variable verndert werden. Beispielsweise setzt
          WINDOW.ACC diese Semaphore, falls der Screen in das Fenster umge-
          lenkt wird. Da es sich hier um eine Bytevariable handelt, wrde
          sich die Verwendung von TAS empfehlen. Da es scheinbar einen
          Hardwarebeschleuniger gibt, der diesen Befehl falsch ausfhrt,
          verzichte ich auf den Gebrauch von TAS.
     103: Nur wenn diese Variable einen von Null verschiedenen Wert hat,
          wird die Farbpalette beim Einsprung umgeschaltet.
     104: diese 256 Words enthalten die Farbpalette, wobei beim ST natr-
          lich nur die ersten 16 Words benutzt werden. Die Palette ist de-
          faultmssig so gesetzt, dass es auf allen Auflsungen das gleiche
          ergibt (ST-High auf einem TT ist allerdings invers).



     10.3. CALL_DEBUGGER
     -------------------


     ber diesen Pointer kann der Debugger angesprungen werden. Er zeigt
     auf die Einsprungroutine, vor der sich ein weiterer Pointer auf die
     Einsprungmessage befindet, die neu gesetzt werden darf und mit einem
     Nullbyte abgeschlossen sein muss. Beim Einsprung mssen sich 6 Bytes
     auf dem Stack befinden:
     0(SP).w: SR (Statusregister)
     2(SP).l: PC (Programmcounter)
     Der Einsprung erfolgt mittels eines jmp, natrlich nur im Supervisor-
     modus:

     > pea    return(pc)
     > move.w sr,-(sp)
     > jmp    (a0)



     10.4. VERSION
     -------------


     Versionsnummer des Debuggers.
     Ist als Asciistring codiert, also z.B. "0104" fr 1.04.



     10.5. PARAMETER
     ---------------


     char KEY_CODE_1                  Offset 0        r/w/p
     char SWITCH_CODE_1               Offset 1        r/w/p
     char KEY_CODE_2                  Offset 2        r/w/p
     char SWITCH_CODE_2               Offset 3        r/w/p
     char reserved[8]

     int  MAUS_PARAMETER s^1          Offset 12       r/w/p
     int  MAUS_PARAMETER s^2          Offset 14       r/w/p
     int  MAUS_PARAMETER s^3          Offset 16       r/w/p
     int  MAUS_PARAMETER s^4          Offset 18       r/w/p
     int  MAUS_PARAMETER s^5          Offset 20       r/w/p
     int  MAUS_PARAMETER s^6          Offset 22       r/w/p

     int  ZAHLEN_BASIS                Offset 24       r/w/p

     int  PRIORITAETEN +              Offset 26       r/w/p
     int  PRIORITAETEN -              Offset 28       r/w/p
     int  PRIORITAETEN *              Offset 30       r/w/p
     int  PRIORITAETEN /              Offset 32       r/w/p
     int  PRIORITAETEN               Offset 34       r/w/p
     int  PRIORITAETEN &              Offset 36       r/w/p
     int  PRIORITAETEN ^              Offset 38       r/w/p
     int  PRIORITAETEN <>             Offset 40       r/w/p
     int  PRIORITAETEN ~              Offset 42       r/w/p
     int  PRIORITAETEN -              Offset 44       r/w/p
     int  PRIORITAETEN %              Offset 46       r/w/p
     int  PRIORITAETEN p              Offset 48       r/w/p
     int  PRIORITAETEN (              Offset 50       r/w/p
     int  reserved[5]

     long KEY_REPEAT                  Offset 62       r/w/p
     long KEY_DELAY                   Offset 66       r/w/p
     long MOUSE_REPEAT                Offset 70       r/w/p
     long MOUSE_DELAY                 Offset 74       r/w/p
     long DOPPEL_KLICK                Offset 78       r/w/p

     long PRINTER_TIMEOUT             Offset 82       r/w/p
     long RS232_TIMEOUT               Offset 86       r/w/p
     long MIDI_TIMEOUT                Offset 90       r/w/p
     long reserved[6]

     long *NEW HISTORY                Offset 118      r
     long *HISTORY_POINTER            Offset 122      r
     long HISTORY_LENGTH              Offset 126      r/p
     long reserved[2]

     long *CACHE_INIT                 Offset 128      r
     int  CACHE_LENGTH                Offset 132      r
     long reserved
     int  CACHE_LNGE_1               Offset 148      r/p
     long reserved
     int  CACHE_LNGE_2               Offset 154      r/p

     char INSERT_FLAG                 Offset 156      r/w/p
     char unused                      /* vormals CURSOR_BOUND */
     char SYMBOL_FLAG                 Offset 158      r/w/p


     0-3: Der Debugger wird angesprungen, wenn Sie die Taste gedrckt ha-
          ben, deren Scancode in KEY_CODE_1 steht und wenn die Umschalt-
          tasten den Status haben, wie er in SWITCH_CODE_1 steht.
          Die Codierung von SWITCH_CODE_1 ist fast wie bei Kbshift:
          Bit 0: Shift-Taste rechts
          Bit 1: Shift-Taste links
          Bit 2: Control-Taste
          Bit 3: Alternate-Taste
          Bit 5: Rechte Maustaste
          Bit 6: Linke Maustaste
          CapsLock wird absichtlich ausmaskiert, deren Status spielt also
          keine Rolle.
          Es knnen zum Einsprung wirklich die Maustasten benutzt werden,
          ob dies sinnvoll ist, sei dahingestellt.
          Eingesprungen wird allerdings nur, wenn flock $43E nicht gesetzt
          ist, da dann Diskoperationen stattfinden, die nicht gestrt wer-
          den wollen. Diese Sperre kann umgangen werden, wenn Sie die zwei-
          te Tastenkombination KEY_CODE_2/SWITCH_CODE_2 drcken.
          Wichtig: wenn Sie das oberste Bit beim Scancode setzen, dann wird
          erst beim Loslassen der Taste eingesprungen.
          Auch wichtig: wenn der Scancode Null ist, wird nur der Status
          der Umschalttasten getestet, d.h. Sie knnen beispielsweise mit-
          tels Maustaste Rechts den Debugger aufrufen.
     12-: PEACEBUG hat einen im Maustreiber integrierten Mausbeschleuni-
     22   ger. Dieser berechnet die Geschwindigkeit der Maus auf dem Bild-
          schirm als Funktion der Geschwindigkeit der Maus auf dem Tisch.
          Diese Funktion ist ein Polynom 6. Grades, dessen Koeffizienten
          die Variablen MAUS_PARAMETER s^1-6 sind. Die Koeffizienten knnen
          in Schritten von 1/128tel verndert werden, eine unbeschleunige
          Maus erhalten Sie also durch die Koeffizienten 128,0,0,0,0,0 (und
          nur durch diese).
     24:  PEACEBUG beherrscht 4 Zahlensysteme, die Zahlenbasis wird mittels
          eines Prefix ausgewhlt:
          % Binr
          . Dezimal
          $ Hexadezimal
          o Oktal
          ZAHLEN_BASIS gibt an, welche Zahlenbasis defaultmssig verwendet
          wird, also ohne Verwendung eines Prefix. Normalerweise wird 16
          benutzt, defaultmssig sind so die Hexadezimalen Zahlen vorge-
          geben. Der Wert kann (natrlich) verndert werden, es sind alle
          Basen von 2-36 erlaubt (im 36er System htten Sie dann die Zif-
          fern 0-9 und A-Z). Sie knnten also auch im 11er System Zahlen
          eingeben, wenn Sie das als sinnvoll erachten.
     26-: Diese 13 Worte werden vom Formelinterpreter benutzt. Sie geben
     50   an, wie stark der nachfolgende Ausdruck an einen Operator gebun-
          den wird. Beispielsweise bindet die Addition weniger stark als
          die Multiplikation (Addition 5, Multiplikation 15), was auch
          sinnvoll ist, da man normalerweise die Regel Punkt vor Strich-
          rechnung benutzt. Einparametrige Operatoren (Vorzeichen,
          Pointer...) binden natrlich strker als zweiparametrige. Am
          besten, Sie verndern diese Werte nicht, sinnvoll erscheint mir
          dies sowieso nur beim Operator p (Pointer). Wenn Sie dessen
          Prioritt auf z.B. 2 hinuntersetzen, werden Ausdrcke wie:
          p ^a0-4
          ausgewertet, wie wenn Sie bei defaultmssigen Einstellungen:
          p(^a0-4)
          eingeben...(Das Minus bindet dann strker als das p).
     62:  gibt die Tasten Repetiergeschwindigkeit in 1/200tel Sekunden an.
     66:  gibt die Tastenverzgerung in 1/200tel Sekunden an. Dies ist
          die Zeit, die nach dem ersten Tastendruck gewartet wird, bis der
          Tastenrepeat einsetzt.
     70:  gibt die Mausklick Repetiergeschwindigkeit in 1/200tel Sekunden
          an.
     74:  gibt die Mausklickverzgerung in 1/200tel Sekunden an. Dies ist
          die Zeit, die nach dem ersten Mausklick gewartet wird, bis der
          Mausklickrepeat einsetzt
     78:  gibt die Zeit in 1/200tel Sekunden an, die zwischen zwei Maus-
          klicks verstreichen darf, so dass diese noch als Doppelklick er-
          kannt werden.
     82:  Zeit in 1/200tel Sekunden, bis ein Timeout an der Centronics
          Schnittstelle gemeldet wird.
     86:  Zeit in 1/200tel Sekunden, bis ein Timeout an der RS232 gemeldet
          wird.
     90:  Zeit in 1/200tel Sekunden, bis ein Timeout an der MIDI Schnitt-
          stelle gemeldet wird.
     118: diese Routine muss aufgerufen werden, wenn Sie den Historypuffer
          vergrssern wollen. Dieser wird dynamisch verwaltet, so dass die
          Anzahl verfgbarer Eintrge von der verwendeten Zeilenlnge ab-
          hngt. Auf dem Stack bergeben Sie die Anzahl zu reservierender
          Bytes. Der Rckgabewert ist Null, wenn beim Reservieren ein Feh-
          ler aufgetreten ist, was allerdings die Funktionsfhigkeit des
          Debuggers nicht beeinflusst.
          > pea  8000.w               ; 8000 Bytes reservieren
          > jsr  (a0)                 ; Routine anspringen
          > tst.l (sp)+               ; Fehler aufgetreten?
          > beq.s  error
     122: Zeiger auf den reservierten Speicherbereich.
     126: aktuelle Lnge des Puffers in Bytes. Diese Variable darf nicht
          geschrieben werden, sie wird von NEW_HISTORY gesetzt. Diese
          Variable legt fest, wie gross der bei Programmstart zu reser-
          vierende Bereich sein soll.
     138: diese Routine dient dazu, die beiden Caches zu erweitern oder zu
          verkleinern (ob dies allerdings sinnvoll ist ...). Da die Caches
          als Ring organisiert sind, knnen jederzeit neue Eintrge hinzu-
          gefgt werden, ohne dass gleich der ganze Cache neu reserviert
          werden muss, wie das beim Historypuffer der Fall ist. Auf dem
          Stack werden fr jeden Cache die gewnschten neuen Lngen ber-
          geben, die Routine erkennt selbstndig ob Eintrge gelscht wer-
          den sollen oder neu reserviert werden mssen. Auch hier deutet
          eine Null als Rckgabewert auf ein Fehler beim Reservieren hin.
          > move.w #50,-(sp)          ; 50 Eintrge fr Cache 1
          > move.w #30,-(sp)          ; 30 Eintrge fr Cache 2
          > jsr    (a0)               ; Routine anspringen
          > tst.l (sp)+               ; Fehler aufgetreten?
          > beq.s error
     142: dieser Wert gibt die Lnge eines einzelnen Eintrages an (momentan
          152 Bytes). Sie knnen so abschtzen, wieviel Speicher Sie fr
          eine bestimmte Anzahl Eintrge opfern mssen.
     148: soviel Anzahl Eintrge umfasst Cache 1 momentan. Diese Variable
          darf nicht geschrieben werden, dies erledigt CACHE_INIT. Der Wert
          gibt darberhinaus an, wieviele Eintrge bei Programmstart reser-
          viert werden soll.
     154: soviel Anzahl Eintrge umfasst Cache 2 momentan. Diese Variable
          darf nicht geschrieben werden, dies erledigt CACHE_INIT. Der Wert
          gibt darberhinaus an, wieviel Eintrge bei Programmstart reser-
          viert werden soll.
     156: gibt an, welchen Schreibmodus der Editor benutzen soll. -1 bedeu-
          tet Insert-, 0 berschreibmodus.
     158: gibt an, ob eine Symboltabelle beim Disassemblieren, Assemblieren
          und vom Formelinterpreter benutzt wird.
          -1: benutze alle Symboltabellen
           1: benutze die debuggereigenen Symboltabllen ohne diejenigen des
              Resident Symbol Drivers.
           0: benutzte keine Symboltabellen
           Im Listmodus wird bei installiertem RSD auch der Programmname
           ausgegeben. Nur wenn dieses Flag 0 ist, wird dies unterdrckt.



     10.6. Userroutinen
     ------------------

     Es folgen 6 Vektoren, in die Sie eigene Routinen einhngen knnen.
     Sie sollten darauf achten, dass Sie vor der Routine folgende Struktur
     anlegen:

     typedef struct
     {
           long us_message      /* Einsprungmessage, kann 0 sein */
           char xb_magic[4];    /* "XBRA" */
           char xb_id[4];       /* XBRA-ID des installierten Programms */
           long xb_oldvec;      /* Wert des Vektors vor dem Einhngen */
     } USER;

     oder in Assembler

                  dc.l MESSAGE
                  dc.l 'XBRA'
                  dc.l 'PBUG'
     OLD_ROUTINE: dc.l $xxxxxxxx
     ROUTINE: ...

     Diese Struktur kann weggelassen werden, vorausgesetzt Sie hngen Ihre
     Routinen selber ein. Lassen Sie dies durch PEACEBUG-Config erledigen,
     dann MUSS diese Struktur vor der Routine stehen.
     Wichtig: bei USERTRACE muss diese Struktur IMMER vorhanden sein.
     Sie drfen Ihre Routinen auch aus-, vor-, umhngen. Verboten ist es,
     die Position des letzten Eintrages zu verndern. Es handelt sich dabei
     um den Debuggereintrag, den Sie an der Kennung 'PBUG' erkennen.
     Sie sollten ihre Routine brigens nicht mit rts beenden, sondern zur
     nchsten Routine springen, dies natrlich nur wo es sinnvoll ist (bei
     USERTRACE ist es dies nicht).
     ACHTUNG: der Stackpointer enthlt natrlich zustzlich die Rcksprun-
     gadresse. Wenn Sie also auf PC und SR zugreifen wollen, mssen Sie
     dies bercksichtigen.


     10.6.1. USERTRACE
     -----------------

     Dies ist ein Pointer auf eine Routine, die immer aufgerufen wird, wenn
     Sie mittels trace[+/-/*] tracen.
     Sie wird dem Benutzer zur Verfgung gestellt um nach jedem Befehl be-
     stimmte Bedingungen testet zu knnen, z.B. um rauszufinden, welches
     Programm wann welche Speicherstellen abndert.
     Die Routine wird mit unvernderten Registern angesprungen, also so wie
     sie im getracten Programm benutzt wurden. Es drfen deshalb keine Re-
     gister verndert werden, das Retten wird dem Benutzer berlassen. Auch
     der PC und das Statusregister sind zugnglich, da sie auf dem Stack
     liegen (gegebenenfalls auch ein Stackframe). Aufgerufen wird die Rou-
     tine wie folgt:

     > jsr USERTRACE
     > blt.s Weiter_mit_Trace
     > bgt.s Weiter_ohne_Trace
     > beq.s Abbrechen_&_in_den_Debugger_springen

     Der Tracehandler wird also ber das Statusregister gesteuert und kann
     dazu bewegt werden, entweder das Programm mit/ohne Trace fortzusetzen
     oder in den Debugger zu springen. Fr das Programm gibt es also zwei
     Mglichkeiten:

     > cmp.l #1,d7
     > sne  -(sp)
     > tst.b (sp)+
     > rts

     > move.l a0,-(sp)
     > move.l 10(sp),a0               ; PC holen
     > cmp.w  #$4e41,(a0)             ; Opcode testen
     > sne    flag
     > move.l (sp)+,d0
     > tst.b  flag
     > rts

     Die erste wird benutzt, wenn keine Register verndert werden, die
     zweite falls dies doch ntig sein sollte. Auf dem Stack befinden sich
     SR 4(SP), PC 6(SP) und gegebenenfalls ein Stackframe 10(SP).
     Es ist sinnvoll, nach dem Installieren der Usertraceroutine gleich den
     Debugger anzuspringen, damit der Tracemodus eingeschaltet werden kann.


     10.6.2. USERENTER/USERQUIT
     --------------------------

     Diese Routinen werden bei jedem Einsprung in den Debugger und bei je-
     dem Verlassen angesprungen.

     1. USERENTER: wird ber ein jsr angesprungen noch bevor der Debugger
        irgendwas macht. Alle Register sind noch Original, auf dem Stack
        befinden sich SR 4(SP), PC 6(SP) und gegebenenfalls ein Stackframe
        10(SP). Wenn Sie das Statusregister testen wollen, benutzen Sie den
        Wert auf dem Stack, das aktuelle SR kann vom Debugger schon vern-
        dert worden sein.
     2. USERQUIT: wird ber ein jsr angesprungen kurz bevor der Debugger
        endgltig verlassen wird (es wird dann noch die Traceroutine ange-
        sprungen, d.h. das Tracen knnen Sie ber diese Routinen nicht be-
        einflussen). Alle Register sind Original, auf dem Stack befinden
        sich SR 4(SP), PC 6(SP) und gegebenenfalls ein Stackframe 10(SP).


     10.6.3. USER_SWITCH_1, USER_SWITCH_2
     ------------------------------------

     1. USER_SWITCH_1: wird aufgerufen bevor auf den Debuggerbildschirm um-
        geschaltet wird, kann z.B. dazu dienen, Grafikkarten neu zu init-
        ialisieren oder die Auflsung umzuschalten.
     2. USER_SWITCH_2: wird aufgerufen bevor auf den Programmbildschirm um-
        geschaltet wird, kann z.B. dazu dienen, Grafikkarten neu zu init-
        ialisieren oder die Auflsung umzuschalten.


     10.6.4. USER_RESET
     ------------------

     Diese Routine wird bei einem Reset angesprungen und dient dazu gegebe-
     nenfalls zustzliche Hardware zu initialisieren. Vom Debugger selber
     wird nur die rechnereigene Hardware wie MFP, Soundchip und Acia ini-
     tialisiert.



     10.7. FLAGS
     -----------


     Zeiger auf folgende Struktur (Erluterungen siehe Kapitel "Vektoren"):

     byte BU_FLAG[2]   Offset 0     ; Buserror
     byte AD_FLAG[2]   Offset 2     ; Adress_error
     byte IL_FLAG[2]   Offset 4     ; Illegal
     byte DI_FLAG[2]   Offset 6     ; Division
     byte CH_FLAG[2]   Offset 8     ; Chk
     byte TV_FLAG[2]   Offset 10    ; cpTrapv/cc
     byte PR_FLAG[2]   Offset 12    ; Privileg
     byte TR_FLAG[2]   Offset 14    ; Trace
     byte LA_FLAG[2]   Offset 16    ; Linea
     byte LF_FLAG[2]   Offset 18    ; Linef
     byte CP_FLAG[2]   Offset 20    ; Coprocessor Protocol Violation
     byte FO_FLAG[2]   Offset 22    ; Format Error
     byte IN_FLAG[2]   Offset 24    ; Uninitialized Interrupt
     byte SI_FLAG[2]   Offset 26    ; Spurious
     byte VB_FLAG[2]   Offset 28    ; VBL
     byte NM_FLAG[2]   Offset 30    ; NMI
     byte T0_FLAG[2]   Offset 32    ; Trap 0
     byte GE_FLAG[2]   Offset 34    ; GEMDOS
     byte VD_FLAG[2]   Offset 36    ; VDI
     byte AE_FLAG[2]   Offset 38    ; AES
     byte T3_FLAG[2]   Offset 40    ; Trap 3
     byte T4_FLAG[2]   Offset 42    ; Trap 4
     byte T5_FLAG[2]   Offset 44    ; Trap 5
     byte T6_FLAG[2]   Offset 46    ; Trap 6
     byte T7_FLAG[2]   Offset 48    ; Trap 7
     byte T8_FLAG[2]   Offset 50    ; Trap 8
     byte T9_FLAG[2]   Offset 52    ; Trap 9
     byte TA_FLAG[2]   Offset 54    ; Trap 10
     byte TB_FLAG[2]   Offset 56    ; Trap 11
     byte TC_FLAG[2]   Offset 58    ; Trap 12
     byte BI_FLAG[2]   Offset 60    ; BIOS
     byte XB_FLAG[2]   Offset 62    ; XBIOS
     byte TF_FLAG[2]   Offset 64    ; Trap 15
     byte C1_FLAG[2]   Offset 66    ; Branch or Set on Unordered Condition
     byte C2_FLAG[2]   Offset 68    ; Inexact result
     byte C3_FLAG[2]   Offset 70    ; Divide by Zero
     byte C4_FLAG[2]   Offset 72    ; Underflow
     byte C5_FLAG[2]   Offset 74    ; Operand Error
     byte C6_FLAG[2]   Offset 76    ; Overflow
     byte C7_FLAG[2]   Offset 78    ; Signaling NAN
     byte PC_FLAG[2]   Offset 80    ; PMMU Configuration
     byte PI_FLAG[2]   Offset 82    ; PMMU Illegal
     byte PA_FLAG[2]   Offset 84    ; PMMU Access Level
     byte HZ_FLAG[2]   Offset 86    ; 200HZ Timer
     byte KB_FLAG[2]   Offset 88    ; Keyboard
     byte RI_FLAG[2]   Offset 90    ; Ring Indicator
     byte ET_FLAG[2]   Offset 92    ; ETV_CRITIC
     byte RE_FLAG[2]   Offset 94    ; RESET



     10.8. Vektor
     ------------


     Zeiger auf die berchtige Routine, wie sie schon mehrmals erwhnt wur-
     de. Sie testet jeden einzelnen Vektor, in den sich PEACEBUG einhngen
     kann und entscheidet, ob Sie die Routine ein-, aus- oder an die erste
     Stelle hngen muss/kann.
