home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 1 / crawlyvol1.bin / program / compiler / pbug1_21 / peacebug / liesmich next >
Encoding:
Text File  |  1994-05-24  |  140.5 KB  |  3,353 lines

  1.      **********************************************************************
  2.      *                                                                    *
  3.      *                 PEACEBUG                                           *
  4.      *                 --------                                           *
  5.      *                                                                    *
  6.      * written by:     Emanuel Möcklin                                    *
  7.      *                 Zschokkestrasse 7                                  *
  8.      *                 CH-8037 Zürich                                     *
  9.      *                 FREDDY@ezrz1.vmsmail.ethz.ch                       *
  10.      *                                                                    *
  11.      * written with:   Turboassembler 1.xx                                *
  12.      *                                                                    *
  13.      **********************************************************************
  14.  
  15.  
  16.  
  17.  
  18.                                Inhaltsverzeichnis
  19.                                ------------------
  20.  
  21.  
  22.      1.  Vorwort
  23.      2.  Starten von PEACEBUG
  24.      3.  Editor
  25.           3.1. Grundsätzliches
  26.           3.2. Bildschirmaufbau
  27.           3.3. Tastaturbelegung
  28.           3.4. Maus
  29.           3.5. Funktionstasten
  30.      4.  Befehle
  31.           4.1. Syntax
  32.           4.2. Formelauswertung
  33.           4.3. Listende Befehle
  34.           4.4. Ausgabenumlenkung
  35.           4.5. Diskoperationen
  36.           4.6. Befehlsübersicht
  37.           4.7. Befehle
  38.      5.  Trace, Breakpoints und dergleichen
  39.      6.  Cache
  40.      7.  Symbole
  41.           7.1. PEACEBUG.SYM
  42.           7.2. Lexecute
  43.           7.3. Resident Symbol Driver
  44.      8.  Reset fest, Reset resident
  45.      9.  Vektoren
  46.           9.1. XBRA
  47.           9.2. Ein Wort regelt alles...
  48.           9.3. Das höherwertige Byte
  49.           9.4. Das niederwertige Byte
  50.           9.5. Vektoren, in eigener Sache
  51.      10. Schnittstelle
  52.          10.1. Grundsätzliches
  53.          10.2. Bildschirmschnittstelle
  54.          10.3. CALL_DEBUGGER_1, CALL_DEBUGGER_2
  55.          10.4. VERSION
  56.          10.5. PARAMETER
  57.          10.6. Userroutinen
  58.          10.7. FLAGS
  59.          10.8. Vektor
  60.  
  61.  
  62.  
  63.  
  64.  
  65.  
  66.  
  67.  
  68.      1. Vorwort
  69.      ----------
  70.  
  71.  
  72.  
  73.      PEACEBUG ist ein Low Level Debugger. Ursprünglich als Hintergrundde-
  74.      bugger konzipiert, ist er in der vorliegenden Version voll symbolisch
  75.      und fähig Programme zu laden. Trotzdem liegen seine Stärken vorallem
  76.      beim Debuggen aus dem Hintergrund. Wenn unvorhergesehene Exceptions
  77.      auftreten, die normalerweise Bomben produzieren, tritt PEACEBUG auf
  78.      den Plan und bietet dem Assemblerkundigen die Möglichkeit, diese Feh-
  79.      ler zu meistern, ohne den Rechner neu booten zu müssen. PEACEBUG ist
  80.      nicht für den Normaluser gedacht, deshalb wird in dieser Anleitung
  81.      vorausgesetzt, dass der geneigte Benutzer über Grundkenntnisse in Sa-
  82.      chen Assembler verfügt.
  83.  
  84.      Wie Sie sicher sofort bemerkt haben, ist die Oberfläche an diejenige
  85.      von Bugaboo angelehnt. Dies trifft ebenso auf die Bedienung und die
  86.      Befehle zu, wobei teilweise entscheidende Unterschiede bestehen, stu-
  87.      dieren Sie deshalb diese Anleitung sorgfältig.
  88.  
  89.      Features von PEACEBUG:
  90.      - erkennt und unterstützt die CPU's MC68000/10/20/30/40
  91.      - erkennt und unterstützt die FPU's MC68881/82
  92.      - läuft auf allen ST(e)'s, TT's und auf dem Falcon
  93.      - läuft mit allen TOS-Versionen, Multigem, Mag!X, MinT/Multitos
  94.      - läuft auf jeder planeorientierten Auflösung
  95.      - läuft im ST- und TT-Ram
  96.      - MC680x0/MC6888x Disassembler
  97.      - MC680x0 Assembler
  98.      - resetfest
  99.      - resetresident
  100.      - komfortable Oberfläche
  101.      - Mausbedienung
  102.      - voll symbolisch
  103.      - umfangreiche und dokumentierte Schnittstelle
  104.      - unabhängig vom Betriebsystem
  105.      - SYSMON Unterstützung (V1.0.9, 24.04.1994)
  106.      - schnell(er) ...
  107.  
  108.      PEACEBUG ist Shareware und darf beliebig weiterkopiert werden. Bei
  109.      regelmässiger Benutzung ist eine Sharewaregebühr von 30 SFr zu über-
  110.      weisen.
  111.      WICHTIG: Schicken Sie mir bitte keine Checks in Fremdwährung, sondern
  112.      nur in Schweizer Franken (SFr), da ich sonst 10 SFr. Gebühr bezahlen
  113.      muss, was immerhin ein Drittel der Sharewaregebühr ausmacht.
  114.      Registrierte User können mir eine Diskette und ein frankiertes Rük-
  115.      kantwortcouvert schicken, Sie erhalten dann die neuste Version.
  116.  
  117.      Und hier das wichtigste:
  118.                               Zürcher Kantonalbank
  119.                              Bankleitzahl 80-3514-8
  120.                               Konto 1113-0818.732
  121.  
  122.  
  123.  
  124.  
  125.  
  126.  
  127.  
  128.  
  129.      2. Starten von PEACEBUG
  130.      -----------------------
  131.  
  132.  
  133.  
  134.      Es gibt zwei verschiedene Arten PEACEBUG zu starten: Resident oder als
  135.      Programm.
  136.      - Resident: Bedeutet, dass er sich installiert und mit Ptermres been-
  137.        det (TSR). Er kann dann jederzeit über Tastatur aufgerufen werden.
  138.        Default: Alternate+F10 oder Alternate+Control+F10. Diese Tastenkom-
  139.        bination können Sie Ihren Wünschen anpassen >Schnittstelle. Falls
  140.        eine Exception auftritt, meldet sich der Debugger ebenfalls, damit
  141.        Sie entsprechende Massnahmen ergreifen können. Die residente Version
  142.        installiert einen Cookieeintrag mit der Kennung "PBUG" und eine
  143.        Doppelseite.
  144.      - Programm: Bedeutet, dass er sich installiert und in den Editor
  145.        springt. Von dort aus können Sie dann nach Herzenslust debuggen. Sie
  146.        können den Debugger über >QUIT beenden, er entfernt sich dann voll-
  147.        ständig aus dem Speicher. Die Programmversion installiert weder
  148.        einen Cookie noch eine Doppelseite. Es stehen zusätzlich die beiden
  149.        Befehle >RESIDENT und >LEXECUTE zur Verfügung.
  150.  
  151.      Falls der Debugger aus dem Autoordner gestartet wird, installiert er
  152.      sich automatisch resident. Wird er hingegen vom Desktop gestartet,
  153.      meldet er sich als Programm, es sei denn Sie halten Control gedrückt,
  154.      dann wird er ebenfalls resident installiert. Wenn Sie Alternate ge-
  155.      drückt halten, verhindern Sie ein Installieren des Debuggers (egal ob
  156.      als Programm- oder als residente Version). Eine als Programm gestarte-
  157.      te Version kann mit dem Befehl >RESIDENT resident gemacht werden.
  158.  
  159.      Wenn SYSMON nach PEACEBUG gestartet wird, dann teilen sich die beiden
  160.      Programme in TT-High den Bildschirm. Auch funktionieren die I- (In),
  161.      O-Funktionen (Out) von SYSMON, sowie das Aufrufen von PEACEBUG über
  162.      Shift-Links Help.
  163.      
  164.      Wenn sich im gleichen Verzeichnis eine Datei befindet, die dem Pattern
  165.      PEACE*.SYM genügt, wird diese als Symboltabelle interpretiert und
  166.      nachgeladen. Näheres zu dem Thema siehe Kapitel "Symbole".
  167.  
  168.      Der Debugger verlässt sich darauf, dass der _MCH Cookie korrekt ist.
  169.      Falls er keinen findet, geht er von einem ST aus. CPU und FPU werden
  170.      selbstständig erkannt.
  171.  
  172.      Bei vorhandender virtueller Speicherverwaltung (VRAM oder OUTSIDE)
  173.      wird der vom Debugger belegte Speicher vor dem Auslagern geschützt.
  174.  
  175.      Beachten Sie, dass der Debugger auch mehrmals installiert werden kann.
  176.      Dies ist Absicht und auch sinnvoll, z.B. wenn Sie PEACEBUG selber de-
  177.      buggen wollen oder wenn Sie mit verschiedenen Konfigurationen arbei-
  178.      ten wollen.
  179.  
  180.  
  181.  
  182.  
  183.  
  184.  
  185.  
  186.  
  187.      3. Editor
  188.      ---------
  189.  
  190.  
  191.  
  192.      3.1. Grundsätzliches
  193.      --------------------
  194.  
  195.  
  196.      Die Bedienung von PEACEBUG orientiert sich an derjenigen von Bugaboo.
  197.      Viele der Funktionen wurden allerdings optimiert und gestatten ein
  198.      viel schnelleres und effizienteres Arbeiten. Die Oberfläche orientiert
  199.      sich an den Anwendern, die keine Zeit mit unnötigen Abfragen verlieren
  200.      wollen. Dass dadurch auch Abstürze produziert werden können, weil eine
  201.      falsche Funktion ausgeführt wird, wird den potentiellen Benutzer kaum
  202.      stören.
  203.      Der Editor benutzt keine Betriebsystemfunktionen, sowohl der Maus- als
  204.      auch der Tastatur- und der Bildschirmtreiber sind unabhängig vom Be-
  205.      triebsystem.
  206.  
  207.  
  208.  
  209.      3.2 Bildschirmaufbau
  210.      --------------------
  211.  
  212.  
  213.      Die beiden ersten Zeilen zeigen das Funktionstastenmenü. Die erste
  214.      Zeile (F1-F10) wird über F1-F10, die zweite (F11-F20) über Shift F1-
  215.      F10 angesprochen. Die entsprechenden Funktionen können auch durch Ank-
  216.      licken mit der Maus aufgerufen werden.
  217.      Darunter sind die aktuellen Registerinhalte dargestellt, wobei sich
  218.      diese Anzeige aus Platzgründen auf die wichtigsten Register be-
  219.      schränkt, die fehlenden können jederzeit über den Befehl >REGISTER
  220.      abgerufen werden.
  221.  
  222.      - PC = Programmcounter
  223.      - USP = UserStackPointer
  224.      - ISP = InterruptStackPointer (oder SSP = SupervisorStackPointer)
  225.      - MSP = MasterStackPointer
  226.      - SR = StatusRegister. Die Bedeutung der einzelnen Flags/Bits können
  227.        Sie in jedem Buch über die MX680x0 Prozessoren entnehmen. Hell dar-
  228.        gestellte Flags sind gelöscht und können durch Anklicken mit der
  229.        Maus gesetzt bzw. gelöscht werden. Beim Scrollen durch den Cache
  230.        wird die SR-Anzeige durch den Opcode ersetzt, der sich an der Adres-
  231.        se befindet, auf die der aktuelle PC zeigt. Dieser Opocde verschwin-
  232.        det wieder bei jeglicher Maustasten- oder Keyboardaktivität.
  233.      - Die nächsten beiden Zeilen stellen D0-D7 und A0-A7 dar. A7 enthält
  234.        immer den Wert des aktuellen Stackpointers (USP, SSP oder MSP) in
  235.        Abhängigkeit vom Statusregister.
  236.  
  237.      Die Register können editiert werden, jedoch sind dabei die Editiermög-
  238.      lichkeiten eingeschränkt, z.B. wird immer der Überschreibmodus be-
  239.      nutzt.
  240.      Neben den Registern befinden sich zwei Pfeile, eventuell ein Close
  241.      Zeichen und zwei Cacheanzeigen. Näheres zu dem Thema siehe Kapitel
  242.      "Cache".
  243.      Darunter befindet sich Ihr "Workspace", wo Sie Befehle eingeben und wo
  244.      die Ausgaben normalerweise stattfinden.
  245.  
  246.      Anstelle von F20 befindet sich eine Uhr. Diese zeigt die Zeit an:
  247.      - Falls keine Echtzeituhr eingebaut ist, wird direkt die IKBD Uhr
  248.        abgefragt.
  249.      - Auf einem Mega ST wird direkt die eingebaute Uhr abgefragt.
  250.      - Auf einem TT wird ebenfalls die eingebaute Uhr abgefragt.
  251.      - Die Erkennung der Echtzeituhren sollte eigentlich sehr zuverlässig
  252.        sein, d.h. auch in ST's nachträglich eingebaute Uhren werden er-
  253.        kannt.
  254.  
  255.  
  256.  
  257.      3.3. Tastaturbelegung
  258.      ---------------------
  259.  
  260.  
  261.      Alle hier beschriebenen Funktionen können leicht verschieden sein, je
  262.      nachdem wo sich der Cursor gerade befindet. Es ist nicht sinnvoll,
  263.      hier alle Details zu erläutern, Ausprobieren führt meistens schneller
  264.      zum Ziel.
  265.      Für Details betreffend Cache-Funktionen siehe Kapitel "Cache".
  266.  
  267.      - Pfeil Auf: Der Cursor bewegt sich eine Zeile nach oben, in der ober-
  268.        sten Zeile wird nach Möglichkeit gescrollt oder der Cursor bewegt
  269.        sich ins Registerfeld.
  270.  
  271.      - Pfeil Ab: Der Cursor bewegt sich eine Zeile nach unten, in der un-
  272.        tersten Zeile wird gescrollt.
  273.  
  274.      - Shift Pfeil Auf: wie Pfeil Auf, beim Scrollen wird allerdings immer
  275.        nur 2 Bytes gescrollt. Dies ist nützlich, wenn beim zurückscrollen
  276.        nicht ab der richtigen Stelle disassembliert wurde, weil es ver-
  277.        schiedene sinnvolle Möglichkeiten gab (der Debugger ist schliess-
  278.        lich auch nur ein Mensch). Solches können Sie damit schnell korri-
  279.        gieren.
  280.  
  281.      - Shift Pfeil Ab: Es wird 2 Bytes nach unten gescrollt (ab der ober-
  282.        sten Adresse).
  283.  
  284.      - Control Pfeil Auf: Es wird eine ganze Seite nach oben gescrollt,
  285.        wobei bei disassemblierter Ausgabe, die Seitenlänge nur geschätzt
  286.        werden kann.
  287.  
  288.      - Control Pfeil Ab: Es wird eine ganze Seite nach unten gescrollt,
  289.        hier kann immer die exakte Seitenlänge bestimmt werden.
  290.  
  291.      - Alternate Pfeil Auf: hat nur in der obersten Zeile eine Bedeutung.
  292.        Damit gelangen Sie ins Registerfeld (normalerweise wird gescrollt).
  293.  
  294.      - Pfeil Rechts: bewegt den Cursor nach rechts, in der rechten unteren
  295.        Ecke wird gescrollt.
  296.  
  297.      - Pfeil Links: bewegt den Cursor nach links, in der linken oberen Ecke
  298.        wird gescrollt.
  299.  
  300.      - Shift Pfeil Rechts: holt sich den nächsten Eintrag aus dem History-
  301.        puffer.
  302.  
  303.      - Shift Pfeil Links: holt sich den vorhergehenden Eintrag aus dem Hi-
  304.        storypuffer.
  305.  
  306.      - Control Pfeil Rechts: bewegt den Cursor ans Ende der Zeile oder bei
  307.        Adresszeilen ins Editfeld.
  308.  
  309.      - Control Pfeil Links: bewegt den Cursor an den Anfang der Zeile oder
  310.        bei Adresszeilen ins Adressfeld.
  311.  
  312.      - Alternate Pfeil Rechts: damit scrollen Sie im Cache vorwärts. Den
  313.        gleichen Effekt erzielen Sie durch Anklicken des Pfeiles in der 5ten
  314.        Zeile.
  315.  
  316.      - Alternate Pfeil Links: damit scrollen Sie im Cache zurück. Den
  317.        gleichen Effekt erzielen Sie durch Anklicken des Pfeiles in der 4ten
  318.        Zeile.
  319.  
  320.      - Alternate Clr Home: bewegt den Cache zum ersten Eintrag (Nummer 0).
  321.        Den gleichen Effekt erzielen Sie durch Anklicken des Close Zeichens
  322.        in der 3ten Zeile.
  323.  
  324.      - Escape: löscht die aktuelle Zeile. Beachten Sie die Unterschiede je
  325.        nach Cursorposition (Ausprobieren!)
  326.  
  327.      - Backspace: löscht das Zeichen links vom Cursor. Beachten Sie den
  328.        Unterschied Insert-/Überschreibmodus.
  329.  
  330.      - Insert: fügt ein Leerzeichen oder eine Null ein (je nach Cursorposi-
  331.        tion)
  332.  
  333.      - Shift Insert: schaltet zwischen Insert- und Überschreibmodus um
  334.  
  335.      - Control Insert: fügt eine Leerzeile ein
  336.  
  337.      - Alternate Insert: wechselt zum andern Cache, ohne kopieren des In-
  338.        halts (siehe Kapitel "Cache")
  339.  
  340.      - Shift Alternate Insert: wechselt zum andern Cache, kopiert den In-
  341.        halt (siehe Kapitel "Cache")
  342.  
  343.      - Delete: löscht ein Zeichen
  344.  
  345.      - Shift Delete: löscht den Rest der Zeile
  346.  
  347.      - Control Delete: löscht eine Zeile
  348.  
  349.      - Clr Home: Cursor in die linke obere Ecke
  350.  
  351.      - Shift Clr Home: löscht den ganzen Arbeitsbereich und bringt den Cur-
  352.        sor in die linke obere Ecke
  353.  
  354.      - Help: enspricht dem Befehl >HELP ohne Parameter
  355.  
  356.      - Shift Help: der Debugger reserviert für den Bildschirm (Ascii) so-
  357.        viel Speicher, wie für den Gebrauch des 8*8 Fonts gebraucht wird.
  358.        Wenn Sie den 8*16 Font benutzen (was die Regel sein wird), dann
  359.        liegt die Hälfte dieses Speichers brach, mit Help können Sie diesen
  360.        aktivieren, Sie haben dann zwei unabhängige Screens zur Verfügung.
  361.  
  362.      - Undo: holt sich den zuletzt eingegebenen Befehl aus dem Historypuf-
  363.        fer
  364.  
  365.      - Return/Enter: die aktuelle Zeile wird ausgewertet, siehe >Befehle
  366.  
  367.      - Control 1, 2, ..., 0: Im Gegensatz zu Bugaboo wird aus Rücksicht auf
  368.        speicherarme User nicht die ganze Seite gerettet, sondern nur die
  369.        Adresse am Anfang der Zeile, was aber meistens den gewünschten Ef-
  370.        fekt hat. Mit 1, 2, ... sind übrigens nicht die Zahlen des Zehner-
  371.        blocks gemeint
  372.  
  373.      - Alternate 1, 2, ..., 0: Es wird ab der geretteten Adresse aufgeli-
  374.        stet (Ascii, Hexdump, Disassemble oder List)
  375.  
  376.      - Control P: setzt den PC auf die aktuelle Adresse (Adresse am Zeile-
  377.        nanfang)
  378.  
  379.      - Control B 0, 1, ...: setzt einen der zehn Breakpoints auf die ak-
  380.        tuelle Adresse
  381.  
  382.      - Control G: entspricht dem Befehl >Go auf die Zeilenadresse
  383.  
  384.      - Control Q: entspricht dem Befehl >QUIT
  385.  
  386.      - Control T: entspricht der Taste F1
  387.  
  388.      - Control C: entspricht der Taste F2
  389.  
  390.      - Control R: entspricht der Taste F3
  391.  
  392.      - Control X: entspricht der Taste F4
  393.  
  394.      - Control S: entspricht der Taste F5
  395.  
  396.      - Control A: entspricht der Taste F6
  397.  
  398.      - Control H: entspricht der Taste F7
  399.  
  400.      - Control D: entspricht der Taste F8
  401.  
  402.      - Control L: entspricht der Taste F9
  403.  
  404.      - Control W: entspricht der Taste F10
  405.  
  406.      - Alternate Zahl: bei gedrückter Alternate Taste können Sie ein Zei-
  407.        chen durch Eingeben des Asciicodes erreichen. Die Zahl muss auf dem
  408.        Zehnerblock eingegeben werden.
  409.  
  410.  
  411.  
  412.      3.4. Maus
  413.      ---------
  414.  
  415.  
  416.      Die Maus hat folgende Funktionen:
  417.      1. Positionieren des Cursors. Der Cursor kann auch auf ein Register
  418.         gesetzt werden.
  419.      2. Bedienung der Cacheelemente (Pfeile, Close).
  420.      3. Auswählen der Funktionstasten.
  421.      4. Wenn Sie die rechte Maustaste drücken, wird der unter der Maus ste-
  422.         hende Text an die aktuelle Cursorposition kopiert. Es werden aller-
  423.         dings nur die Zeichen $ % . o 0 1 2 3 4 5 6 7 8 9 A B C D E und F
  424.         kopiert. Wenn Sie zusätzlich eine Shifttaste drücken, sind auch die
  425.         Zeichen , - ( ) [ ] { } * # : _ und / zugelassen. Damit können Sie
  426.         komfortabel Adressen (ohne Shift) bzw. Opcodes (mit Shift) kopie-
  427.         ren.
  428.      5. Wenn Sie mit der linken Maustaste auf eine Adresse doppelklicken,
  429.         listet der Debugger ab dieser Adresse auf (Ascii, Hexdump, Disas-
  430.         sembly oder List Modus). Es kann sich auch um ein Symbol handeln.
  431.  
  432.  
  433.  
  434.      3.5 Funktionstasten
  435.      -------------------
  436.  
  437.  
  438.      - F1-Trace: führt einen einzelnen Befehl aus. Ein Trace bewirkt ein
  439.        vollständiges Verlassen des Debuggers, d.h. der Bildschirm wird um-
  440.        geschaltet, Register werden zurückgeschrieben, Vektoren restauriert
  441.        usw. Linea, Trapv und Trap 0-15 werden als einzelne Befehle betrach-
  442.        tet. Wenn Sie diese trotzdem tracen wollen, benutzen Sie F4-Texcept.
  443.  
  444.      - F2-Do PC: Es wird hinter dem aktuellen Befehl ein Breakpoint gesetzt
  445.        und der Befehl angesprungen. Diese Funktion ist vorallem bei dbcc's
  446.        sinnvoll. Kein Breakpoint wird übrigens hinter ein bsr oder ein jsr
  447.        gesetzt. Die Funktion funktioniert auch im ROM (siehe Kapitel 5,
  448.        "Trace, Breakpoints und dergleichen").
  449.  
  450.      - F3-Tracrts: sollte nur nach einem bsr/jsr benutzt werden. Nimmt den
  451.        obersten Wert vom Stack und schreibt eine eigene Rücksprungadresse
  452.        drauf. So kann das Programm bis zum nächsten rts vortgesetzt wer-
  453.        den.
  454.  
  455.      - F4-Texcept: wie F1-Trace, nur dass Traps (Trap 0-15, Trapv), Linea
  456.        und der Illegal Opcode Handler getraced werden.
  457.  
  458.      - F5-Skip PC: überspringt den aktuellen Befehl, es wird ein Cacheein-
  459.        trag erzeugt.
  460.  
  461.      - F6-Ascii: listet ab dem PC im Asciimodus
  462.  
  463.      - F7-Hexdump: listet ab dem PC im Hexdumpmodus
  464.  
  465.      - F8-Disassm: listet ab dem PC im Disassembliermodus
  466.  
  467.      - F9-List: listet ab dem PC im Listmodus
  468.  
  469.      - F10-Switch: schaltet zwischen Debugger- und Programmscreen hin und
  470.        her. Es wird auch nach Verlassen und erneutem Einspringen nicht auf
  471.        den Debuggerscreen geschaltet. Dies erlaubt Ihnen beim Tracen, das
  472.        Programm zu beobachten, kann allerdings zu Verwirrung führen, da
  473.        auch bei Auftreten einer Exception nicht umgeschaltet wird. Falls
  474.        Sie also einmal das Gefühl haben, der Rechner habe sich aufgehängt,
  475.        drücken Sie zuerst F10, bevor Sie reseten...
  476.  
  477.      - F11-Tr68020: Simuliert den Tracemodus des MC68020/30/40, d.h. nur
  478.        bei Befehlen, die den PC verändern (change of flow), wie Sprungbe-
  479.        fehlen, rts, rte, rtr, Traps und Linea wird in den Debugger zurück-
  480.        gesprungen.
  481.  
  482.      - F12-Tnosubs: Eine Unterroutine, die über bsr oder jsr aufgerufen
  483.        wird, kann mit dieser Taste übersprungen werden, d.h. die beiden
  484.        Befehle werden wie ein einzelner Befehl behandelt. Wenn der aktuel-
  485.        le Befehl kein bsr/jsr ist wird verfahren wie bei F1-Trace.
  486.  
  487.      - F13-Tracrte: setzt das Programm bis zum nächsten rte fort, die Werte
  488.        auf dem Stack werden nicht geprüft, sollte also nur nach einer Ex-
  489.        ception aufgerufen werden.
  490.        ACHTUNG: falls die Exceptionroutine den PC, der auf dem Stack liegt,
  491.        benützt, darf diese Funktion natürlich nicht aufgerufen werden. Dies
  492.        ist z.B. bei Lineaexceptions der Fall. Sie können daher nicht mit-
  493.        tels F4 ein Linea tracen und dann unmittelbar mit F13 weiterfahren.
  494.        Dies ist erst erlaubt, wenn die Routine sich den Opcode geholt hat.
  495.  
  496.      - F14-GoTraps: setzt das Programm fort, bis dieses ein Betriebsystem-
  497.        aufruf tätigt (Trap 1, Trap 2, Trap 13, Trap 14). Dies ist sehr
  498.        praktisch, wenn man sich nur für die wichtigen Stellen eines Pro-
  499.        gramms interessiert und das sind häufig die Betriebsystemaufrufe.
  500.        Diese funktioniert mittlerweile auch unter einem Multitasking OS
  501.        problemlos, der Debugger muss sich nicht mal in die Vektoren ein-
  502.        hängen.
  503.  
  504.      - F15-Breakpt: setzt oder löscht auf der aktuellen Adresse einen
  505.        Breakpoint. Im Gegensatz zu Control B können Sie die Breakpoint-
  506.        nummer nicht angeben, es wird automatisch die erste freie Nummer
  507.        genommen und eine Meldung ausgegeben:
  508.        "Stop Breakpoint $5 set" oder
  509.        "Stop Breakpoint $5 cleared"
  510.  
  511.      - F16-Font: schaltet um zwischen 8*8 und 8*16 Font. Bei gesetzter
  512.        SCREEN_LOCK Semaphore (>Schnittstelle) kann diese Funktion nicht
  513.        aufgerufen werden.
  514.  
  515.      - F17-Symbol+/-/*: schaltet den Debugger um zwischen symbolisch und
  516.        nichtsymbolisch (Disassembler/Formelinterpreter).
  517.        - Symbol+ bedeutet, dass er alle Symbole benutzt.
  518.        - Symbol* bedeutet, dass er nur die eigenen Symbole benutzt und die-
  519.          jenigen des >Resident Symbol Drivers ignoriert.
  520.        - Symbol- bedeutet, dass er gar keine Symbole benutzt.
  521.  
  522.      - F18-Insert+/-: schaltet zwischen dem Überschreib- (Insert-) und dem
  523.        Insertmodus (Insert+) hin und her.
  524.  
  525.      - F19-GO PC: setzt das Programm beim aktuellen PC fort.
  526.      - F20-GO PC: setzt das Programm beim aktuellen PC fort. Der Button ist
  527.        nicht beschriftet, dort befindet sich die Uhr.
  528.  
  529.  
  530.  
  531.  
  532.  
  533.  
  534.  
  535.  
  536.      4. Befehle
  537.      -----------
  538.  
  539.  
  540.  
  541.      4.1. Syntax
  542.      -----------
  543.  
  544.  
  545.      - Jeder Befehl kann abgekürzt werden, solange er eindeutig bleibt. Die
  546.        signifikanten Zeichen sind in Grossbuchstaben geschrieben und bezei-
  547.        chnen die kürzeste Form, die Sie benützen dürfen. Es ist allerdings
  548.        immer erlaubt, mehr Zeichen einzugeben als nötig (h=he=hel=help).
  549.  
  550.      - Die Auswertung Ihrer Eingaben wurde so flexibel wie möglich program-
  551.        miert, z.B. werden überflüssige Eingaben ignoriert und keine Fehler-
  552.        meldungen ausgegeben.
  553.  
  554.      - Werte in eckigen Klammern sind optional, z.B. Help [Befehl] oder Clr
  555.        [From][,To].
  556.        Wenn Sie keine Eingabe machen, wird ein Defaultwert genommen. Bei
  557.        Adressen gilt folgende Regel:
  558.        - Den PC als Defaultadresse nehmen die Befehle Ascii, Disassemble,
  559.          Dump, List, Call, Do und Go.
  560.        - Checksumme nimmt die Sektorpufferadressse als Default.
  561.        - Alle andern Befehle nehmen als Defaultadresse(n) diejenigen des
  562.          geladenen Files/Programms, falls ein solches existiert.
  563.  
  564.      - Werte in geschweiften Klammern sind optional und beliebig oft wie-
  565.        derholbar, z.B. ? Term{,Term}.
  566.  
  567.      - Bei den Befehlen kann etwas in der Form [.b|.w] angegeben sein. Dies
  568.        ist in der Regel die Schrittweite (suchen, vergleichen...) und kann
  569.        sein: byte, word, address, long, no default oder opcode. Näheres
  570.        dazu bei der jeweiligen Befehlsbeschreibung.
  571.  
  572.      Beispiele:
  573.  
  574.      1. Input: "$001C7FB2>d^a7#1! *MOVE.L    D0,-(SP)"
  575.         disassembliert ab dem SP eine Zeile
  576.  
  577.      2. Input: "com 60,70,10"="Compare 60,80,10" = "cOMp .b 6 0 , 7 0 , 10"
  578.         Vergleicht 16 Bytes der Adressen $60 und $80 in Byteschritten
  579.  
  580.      3. Input: "sh ^mmusr , 3" = "showm ^psr,3"
  581.         Showmemory im Hexdumpmodus ab dem Wert den das MMUSR enthält
  582.  
  583.      4. Input: "ascF p84,.remtop,'*PMOVE*'" = "ASCFIND pl84, .remtop,'**P-
  584.         MOVE**'"
  585.         sucht den Bereich von p84 bis remtop nach PMOVE's ab
  586.  
  587.  
  588.  
  589.      4.2. Formelauswertung
  590.      ---------------------
  591.  
  592.  
  593.      Zahlenbasen:
  594.         %         Binär
  595.         .         Dezimal
  596.         $         Hexadezimal
  597.         o         Oktal
  598.         ' oder "  ASCII
  599.      Wird kein Prefix verwendet, wird die Defaultbasis verwendet (normaler-
  600.      weise 16). Diese kann über die Cookieschnittstelle verändert werden.
  601.  
  602.      Vorzeichen:
  603.         + Plus
  604.         - 2er Komplement
  605.         ~ 1er Komplement
  606.  
  607.      Verknüpfungen:
  608.         + Addition
  609.         - Subtraktion
  610.         * Multiplikation (32 Bit)
  611.         / Division (32 Bit)
  612.         | Odern
  613.         & Anden
  614.         ^ Eoren
  615.         > Shift Right
  616.         < Shift Left
  617.         % Modulo
  618.      Die Prioritäten der Verknüpfungen und der Vorzeichen können über die
  619.      Schnittstelle verändert werden. Beispielsweise ist so Strich- vor
  620.      Punktrechnung realisierbar (aber wohl nicht sinnvoll).
  621.  
  622.      Referenzen:
  623.      ^Register: Register werden immer mit einem ^ angesprochen. Es sind
  624.      folgende Register verfügbar:
  625.         D0-D7/A0-A7
  626.         SP (Stack Pointer)
  627.         USP (User Stack Pointer)
  628.         SSP (Supervisor Stack Pointer)
  629.         ISP (Interrupt Stack Pointer)
  630.         MSP (Master Stack Pointer)
  631.         PC (Program Counter)
  632.         SR (Status Register)
  633.         CCR (Condition Code Register)
  634.         SFC (Source Function Code)
  635.         DFC (Destination Function Code)
  636.         VBR (Vector Base Register)
  637.         CAAR (CAche Adress Register)
  638.         CACR (CAche Control Register)
  639.         MMUSR (MMU Status Register)
  640.         PSR=MMUSR (PSR ist 68851 Notation)
  641.         TT0 (Transparent Translation 0)
  642.         TT1 (Transparent Translation 1)
  643.         TC (Translation Control)
  644.         URP (User Root Pointer)
  645.         DTT0 (Data Transparent Translation Register 0)
  646.         DTT1 (Data Transparent Translation Register 1)
  647.         ITT0 (Instruction Transparent Translation Register 0)
  648.         ITT1 (Instruction Transparent Translation Register 1)
  649.      Die beiden Register SRP (Supervisor Root Pointer) und CRP (CPU Root
  650.      Pointer) können nicht benutzt werden, da es sich dabei um 64 Bit Regi-
  651.      ster handelt und der Debugger nur 32 Bit Arithmetik beherrscht.
  652.  
  653.      pb, pw, pl, p Pointer: der dem Pointer folgende Ausdruck wird als
  654.      Adresse interpretiert und deren Inhalt ausgelesen. Mit pb erfolgt dies
  655.      als Byte, mit pw als Word und mit pl oder p als Long.
  656.  
  657.      .Symbol: alle Symbole werden mittels eines . angesprochen
  658.  
  659.      Klammern: sind beliebig tief schachtelbar
  660.  
  661.      Beispiele:
  662.      l p(^vbr+.trace): listet die Traceroutine auf
  663.      l p(p.trap_1-4): listet die Routine auf, die als zweite im Gemdosvek-
  664.      tor hängt (falls diese XBRA benutzen)
  665.  
  666.  
  667.  
  668.      4.3. Listende Befehle
  669.      ---------------------
  670.  
  671.  
  672.      Fast alle Befehle, die irgendwelche Ausgaben machen, können unterbro-
  673.      chen werden:
  674.      - Escape: Abruch, keine weiteren Ausgaben mehr. Funktioniert zu jedem
  675.        Zeitpunkt, wenn der Cheatmode nicht aktiv ist
  676.      - Space: die Ausgabe wird angehalten, sie kann durch einen beliebigen
  677.        Tastendruck fortgesetzt werden
  678.      - Control: solange die Controltaste gedrückt gehalten wird, wird die
  679.        Ausgabe angehalten
  680.  
  681.      Falls eine Ausgabe länger als eine Zeile ist, wird am Ende der Zeile
  682.      der Asciicode 3 geprintet (Asciicode 3 sollte ein Pfeil sein). Dies
  683.      soll Ihnen anzeigen, dass nicht der ganze String sichtbar ist.
  684.  
  685.  
  686.  
  687.      4.4. Ausgabenumlenkung
  688.      ----------------------
  689.  
  690.  
  691.      Ausgaben erfolgen meistens auf dem Screen.
  692.      Durch anhängen eines >device: können diese allerdings umgelenkt wer-
  693.      den. Es sind im Moment drei Devices verfügbar: midi: (MIDI), prn:
  694.      (Centronics) und aux: (Seriell).
  695.      Aber nicht nur Devices können Sie angeben, auch Dateien sind erlaubt:
  696.      - >file erzeugt eine Datei namens "file" und schreibt alle Ausgaben in
  697.        dieses File. Wenn die Datei schon existiert, wird sie zuerst ge-
  698.        löscht.
  699.      - >>file öffnet eine Datei und schreibt die Ausgaben ans Ende der Da-
  700.        tei. Wenn Sie noch nicht existiert, wird sie erzeugt.
  701.  
  702.      Beispiele:
  703.      d fc0000,fc0000+.192000 >m:rom_dis
  704.      disassembliert das ROM in eine Datei auf Laufwerk m
  705.      help >help\helpfile
  706.      schreibt die Ausgaben von help in eine Datei helpfile im Ordner help
  707.  
  708.  
  709.  
  710.      4.5. Diskoperationen
  711.      --------------------
  712.  
  713.  
  714.      Alle Funktionen mit Ausnahme der Diskoperationen sind unabhängig vom
  715.      Betriebsystem. Wenn Sie per Tastatur in den Debugger einspringen, be-
  716.      deutet das, dass der Debugger im Interrupt läuft. Wenn Sie dann ir-
  717.      gendwelche Betriebsystemfunktionen aufrufen, ist die Wahrscheinlich-
  718.      keit, dass das dem Rechner nicht wohlbekommt, ziemlich hoch. Sollten
  719.      Sie also diese Absicht haben, so rufen Sie den Debugger mit Vorteil
  720.      über CALLPBUG auf (im Ordner PEACEBUG\UTILLITY).
  721.      Wenn Fehler bei Diskoperationen auftreten, erscheinen normalerweise
  722.      Alertboxen, was z.B. in Tosprogrammen eher lästig ist, steht doch kei-
  723.      ne Maus zur Verfügung. Um dies im Debugger zu verhindern, installiert
  724.      er einen eigenen etv_critic Handler, es erscheint dann anstatt einer
  725.      Box, eine Meldung wie:
  726.       BIOS-Error -13: (A)bort, (R)etry, (I)gnore?
  727.  
  728.      Folgende Fehler können auftreten:
  729.      -1: Error: Es ist ein Fehler aufgetreten, der nicht genauer spezifi-
  730.          ziert werden kann.
  731.      -2: Drive not ready: Angesprochenes Gerät ist nicht angeschlossen,
  732.          nicht funktionsbereit oder reagiert nicht innerhalb der gesetzten
  733.          Frist (Timeout).
  734.      -3: Unknown Command: Dem angesprochenen Peripheriegerät ist das gege-
  735.          bene Kommando unbekannt.
  736.      -4: CRC Error: Beim Lesen eines Sektors ist ein CRC-Fehler aufgetre-
  737.          ten.
  738.      -5: Bad request: Das Peripheriegerät kann das Kommando nicht aus-
  739.          führen.
  740.      -6: Seek Error: Der angesprochene Track konnte vom Laufwerk nicht er-
  741.          reicht werden.
  742.      -7: Unknown Media: Leseversuch gescheitert, da das Medium keinen kor-
  743.          rekten Bootsektor besitzt.
  744.      -8: Sector not found: Der betreffende Sektor wurde nicht gefunden.
  745.      -9: Out of Paper: Drucker nicht betriebsbereit.
  746.      -10:Write fault: Fehler bei Schreiboperation aufgetreten.
  747.      -11:Read fault: Fehler bei Leseoperation aufgetreten.
  748.      -12:General Error: Allgemeiner Fehler, "reserved for future catastro-
  749.          phes".
  750.      -13:Write on write-protected media: Es wurde versucht, auf ein
  751.          schreibgeschütztes Medium zu schreiben.
  752.      -14:Media change detected: Seit der letzten Schreiboperation wurde das
  753.          Medium gewechselt.
  754.      -15:Unknown device: Das angesprochene Gerät ist dem Betriebsystem un-
  755.          bekannt.
  756.      -16:Bad sectors on format: Beim Formatiervorgang wurden defekte Sekto-
  757.          ren entdeckt.
  758.      -17:Insert other disk request: Eine andere Diskette muss eingelegt
  759.          werden. Tritt nur auf, wenn Laufwerk B angesprochen wird, ohne an-
  760.          geschlossen zu sein.
  761.      -18:Insert Disk: Meta-DOS-Fehler: Medium einlegen.
  762.      -19:Device not responding: Meta-DOS-Fehler: Gerät antwortet nicht.
  763.  
  764.  
  765.  
  766.      4.6. Befehlsübersicht
  767.      ---------------------
  768.  
  769.      Ascii [From][[,To]|[[,]#Lines]|[,][Bytes]|[.]]
  770.      ASCFind[.w|.l] [From][,To],String - default opcode
  771.      Breakpoints [Number[=Address[,*|,=[Value]|,Number]]]|[[Number]-]
  772.      Call [Address]
  773.      CD [Path]
  774.      CHecksumme [Address][,Checksum][,Number]
  775.      CLr [From][,To]
  776.      COld
  777.      COMpare[.b|.w|.l] [From][,To],Destination - default byte
  778.      COOkie
  779.      COPy [From][,To],Destination
  780.      Disassemble [From][[,To]|[[,]#Lines]|[,][Bytes]|[.]]|:[CPUs]
  781.      DFree [Drive:]
  782.      DIRectory [Path]
  783.      DO [Address]
  784.      DUmp [From][[,To]|[[,]#Lines]|[,][Bytes]|[.]]
  785.      Exit [Value]
  786.      Find[.b|.w|.l] [From][,To],Term,{Term} - default byte
  787.      FILl [From][,To],Term{,Term}
  788.      FRee
  789.      Go [Address][,Breakpoint]
  790.      Help [Command]
  791.      HUnt [From][,To],Term,{Term}
  792.      Info
  793.      List [From][[,To]|[[,]#Lines]|[,][Bytes]|[.]]
  794.      LAst
  795.      LEt Register=Value
  796.      LEXecute [Filename]
  797.      LOad [Filename][,Start[,End]]|-
  798.      LS [Pfad]
  799.      Memory [From][[,To]|[[,]#Lines]|[,][Bytes]]
  800.      MKdirectory Directory
  801.      Newformat
  802.      Observe [[Address][,Bytes]|-|+]
  803.      Page
  804.      PRograms
  805.      Quit [Value]
  806.      Readsector [Track][,Sector][,Side][,Address][,Drive]
  807.      REGister [Register]
  808.      RESident
  809.      RMdirectory [Directory|File]
  810.      Save [Filename][,Start,End]
  811.      SEt Register=Value
  812.      SHowmemory [Term[,List]]|[[Number]-]
  813.      SLow [ON|OFF]
  814.      SWitch [ResolutionDebugger][,ResolutionProgram]
  815.      SYmbol [From][,To]
  816.      SYSinfo
  817.      Trace [Number|+|-|*]
  818.      Warm
  819.      WRitesector [Track][,Sector][,Side][,Address][,Drive]
  820.      Xbra [FirstVector][,LastVector][,ID]
  821.      ? Term{,Term}
  822.      / [.b|.w|.a|.l] [Term]{,Term} - default word
  823.      ! Opcode
  824.      , [.b|.w|.a|.l] [Term]{,Term} - no default
  825.      ) String
  826.      : Address[,Term]{,Term}
  827.  
  828.  
  829.  
  830.      4.7. Befehle
  831.      ------------
  832.  
  833.  
  834.      4.7.1. ASCII
  835.  
  836.      Syntax: Ascii [From][[,To]|[[,]#Lines]|[,][Bytes]|[.]]
  837.  
  838.      Gibt einen Speicherbereich als String aus:
  839.      - From: Ab dieser Adresse wird ausgegeben
  840.      - To: Gibt bis zu dieser Adresse aus, bei allen Befehlen bedeutet "To"
  841.        übrigens exklusive "To".
  842.      - #Lines: Anstatt eine Endadresse, kann die Anzahl Zeilen bestimmt wer-
  843.        den, die ausgegeben werden sollen. Das , vor dem # ist optional.
  844.      - [Bytes]: Damit geben Sie die Anzahl Bytes an, die ausgegeben werden.
  845.        Das , vor dem [ ist optional und auch die ] Klammer ist überflüssig.
  846.      - .: Die Ausgabe erfolgt endlos und muss "von Hand" abgebrochen wer-
  847.        den (Escape).
  848.      Wenn Sie weder To, Lines, [Bytes] noch . angegeben, werden default-
  849.      mässig 16 Zeilen ausgegeben.
  850.  
  851.      Beispiele:
  852.      $001C7FF0>asc#2               ; Zwei Zeilen ab dem PC ausgeben
  853.      $001C7FF0>a[30                ; 30 Bytes ab dem PC ausgeben
  854.      $001C7FF0>ascii ^A7,^A7+10    ; 10 Bytes ab dem Stackpointer ausgeben
  855.      $001C7FF0>as^A4[20]           ; 20 Bytes ab A4 ausgeben
  856.      $001C7FF0>asci p(.trap_d)-c   ; gibt 16 Zeilen ab Bioshandler-12 aus
  857.      $001C7FF0>a.                  ; gibt ab dem PC endlos aus
  858.  
  859.  
  860.      4.7.2. ASCFIND
  861.  
  862.      Syntax: ASCFind[.w|.l] [From][,To],String - default opcode
  863.  
  864.      Disassembliert einen Speicherbereich und vergleicht "String" mit dem
  865.      vom Disassembler erzeugten String. Der Vergleich erfolgt Casesensi-
  866.      tive. .w bedeutet, dass die Adresse in Zweierschritten inkrementiert
  867.      wird, .l entsprechend in Viererschritten. Wenn weder .w noch .l ange-
  868.      geben wird, dann wird die Länge des disassemblierten Befehls als In-
  869.      krement genommen. Dies ist sinnvoll, wenn Sie Programmcode durchsuchen
  870.      und ist viel schneller als mit .w. Es kann so allerdings vorkommen,
  871.      dass Befehle nicht gefunden werden.
  872.      Defaultadressen für "From" und "To", sind die Anfangs- bzw. Endadres-
  873.      sen eines geladenen Files.
  874.      Befindet sich die gefundene Adresse innerhalb des Debuggers oder in
  875.      einem von diesem allozierten Speicherbereich, wird sie mit einem *
  876.      gekennzeichnet.
  877.  
  878.      Beispiele:
  879.      $0073250C>ascf e00000,e00000+10000,'*PMOVE*'
  880.      $00E00068>! PMOVE    $E36040,TC
  881.      $00E00070>! PMOVE    $E36040,TT0
  882.      $00E00078>! PMOVE    $E36040,TT1
  883.      $00E01702>! PMOVE    $E3654C,CRP
  884.      $00E0170A>! PMOVE    $E36554,TC
  885.      $00E01712>! PMOVE    $E36558,TT0
  886.      $00E0171A>! PMOVE    $E3655C,TT1
  887.      $001203CC>ascfind 0,80,"MOVE*-(A?)"
  888.      $00FC08B6>! MOVEM.L  D7-A0,-(A7)
  889.      $00FC08DA>! MOVE     SR,-(A7)
  890.      $00FC08EE>! MOVE.L   .etv_critic.W,-(A7)
  891.  
  892.  
  893.      4.7.3. BREAKPOINTS
  894.  
  895.      Syntax:
  896.      Breakpoints [Number[=Address[,*|,=[Value]|,Number]]]|[[Number]-]
  897.  
  898.      - Stopbreakpoints: dieser Breakpoint muss "Anzahl" mal durchlaufen
  899.        werden, bis das Programm unterbrochen und der Breakpoint gelöscht
  900.        wird. Normale Breakpoints (F15 oder Control B) sind Stopbreakpoints
  901.        mit Startwert 1. Die Anzeige mit b gibt aus, wie oft der Breakpoint
  902.        noch durchlaufen werden muss.
  903.      - Zählerbreakpoint: bei jedem Durchlaufen des Breakpoints wird der
  904.        Zähler um eins erhöht, jedoch wird das Programm nie unterbrochen.
  905.        Der aktuelle Zählerstand kann mittels b erfahren werden.
  906.      - Permanentbreakpoints: Breakpoint, der nie gelöscht wird und nur ma-
  907.        nuel entfernt werden kann (B- oder B Nummer-).
  908.  
  909.      - Breakpoints ohne Parameter: zeigt alle gesetzten Breakpoints
  910.      - Breakpoints Number: zeigt nur einen
  911.      - Breakpoints -: löscht alle Breakpoints
  912.      - Breakpoints Number -: löscht nur einen
  913.      - Breakpoints Number=Address: setzt einen Stopbreakpoint an der ange-
  914.        gebenen Adresse mit Startwert 1
  915.      - Breakpoints Number=Address,Number: setzt einen Stopbreakpoint mit
  916.        Startwert "Number"
  917.      - Breakpoints Number=Address,=: setzt einen Zählerbreakpoint mit
  918.        Startwert 0
  919.      - Breakpoints Number=Address,=Value: setzt einen Zählerbreakpoint mit
  920.        Startwert "Value"
  921.      - Breakpoints Number=Address,*: setzt einen Permanentbreakpoint
  922.  
  923.      Breakpoints dürfen auch im ROM gesetzt werden, dann wird das Programm
  924.      allerdings im Tracemodus durchlaufen. Näheres zu dem Thema siehe
  925.      Kapitel "Trace, Breakpoints und dergleichen".
  926.  
  927.      Beispiele:
  928.      $12345678>b0=1000,*
  929.      $12345678>b7=2000,=
  930.      $12345678>b5=3000,20
  931.      $12345678>b
  932.       Breakpoint $0=$00001000,*              ; Permanent Breakpoint
  933.       Breakpoint $5=$00003000,$00000020      ; Stop Breakpoint (Zähler=20)
  934.       Breakpoint $7=$00002000,=$00000000     ; Zähler Breakpoint (Zähler=0)
  935.      $12345678>b5-
  936.      $12345678>b7
  937.       Breakpoint $7=$00002000,=$00000000
  938.  
  939.  
  940.      4.7.4. CALL
  941.  
  942.      Syntax: Call [Address]
  943.  
  944.      Ruft ein Unterprogramm auf, das mittels rts abgeschlossen sein muss.
  945.      Defaultadresse ist der aktuelle PC.
  946.  
  947.  
  948.      4.7.5. CD
  949.  
  950.      Syntax: CD [Path]
  951.  
  952.      CD ohne Parameter: gibt den aktuellen Pfadnamen aus.
  953.      CD Pfad: wechselt den aktuellen Pfad.
  954.  
  955.      Beispiele:
  956.      $00100B70>cd j:peacebug
  957.       J:\PEACEBUG\
  958.      $00100B70>cd c:
  959.       C:\GEMINI\GEMINI\
  960.      $00100B70>cd
  961.       C:\GEMINI\GEMINI\
  962.  
  963.  
  964.      4.7.6. CHECKSUMME
  965.  
  966.      Syntax: CHeckumme [Address][,Checksum][,Number]
  967.  
  968.      Berechnet eine Prüfsumme (alle Words addieren) über einen Speicherbe-
  969.      reich und gibt den Wert aus, den Sie zu einem Wort in diesem Bereich
  970.      addieren müssen um die Checksumme 0 zu erhalten.
  971.      Mit diesem Befehl können Sie z.B. Bootsektoren ausführbar machen oder
  972.      Checksummen von vermeintlichen Doppelseiten berechnen (Checksumme
  973.      $5678).
  974.      Defaultmässig ist die Prüfsumme $1234, es wird über 256 Worte addiert
  975.      und Address zeigt auf den Sektorpuffer (>READSECTOR).
  976.  
  977.      Beispiele:
  978.      $001C7FB2>ch 600
  979.       Check: $1234
  980.      $001C7FB2>: 600,pw600+1234         ; addiert $1234 an die Adresse $600
  981.      $001C7FB2>ch 600
  982.       Check: $0000
  983.      $001C7FB2>ch 600,5678
  984.       Check: $4444
  985.  
  986.  
  987.      4.7.7. CLR
  988.  
  989.      Syntax: CLr [From][,To]
  990.  
  991.      Löscht den angegebenen Speicherbereich. Wie immer wird "To" selber
  992.      nicht gelöscht, z.B. löscht clr 100,200 bis und mit Adresse 1FF.
  993.      Defaultadressen für "From" und "To", sind die Anfangs- bzw. Endadres-
  994.      sen eines geladenen Files.
  995.  
  996.  
  997.      4.7.8. COLD
  998.  
  999.      Syntax: COld
  1000.  
  1001.      Der Rechner führt einen Kaltstart aus. Der Debugger wird endgültig aus
  1002.      dem System entfernt.
  1003.  
  1004.  
  1005.      4.7.9. COMPARE
  1006.  
  1007.      Syntax: COMpare[.b|.w|.l] [From][,To],Destination - default byte
  1008.  
  1009.      Vergleicht zwei Speicherbereiche und gibt die unterschiedlichen Adres-
  1010.      sen aus. Das Inkrement beträgt .b=Byte, .w=Word oder .l=long, wobei
  1011.      dann natürlich auch der Vergleich byte, word oder long erfolgt. De-
  1012.      faultmässig wird byteweise verglichen.
  1013.      Defaultadressen für "From" und "To", sind die Anfangs- bzw. Endadres-
  1014.      sen eines geladenen Files.
  1015.  
  1016.      Beispiele:
  1017.      $001C7FB2>com 0,10,fc0000
  1018.       $00FC0009 $00FC000A $00FC000B $00FC000D $00FC000E $00FC000F
  1019.      $001C7FB2>comp.w 0,10,fc0000
  1020.       $00FC0008 $00FC000A $00FC000C $00FC000E $00FC0010
  1021.      $001C7FB2>co.l 0,10,fc0000
  1022.       $00FC0008 $00FC000C $00FC0010
  1023.  
  1024.  
  1025.      4.7.10. COOKIE
  1026.  
  1027.      Syntax: COOkie
  1028.  
  1029.      Gibt eine Liste aller Cookieeinträge aus.
  1030.      Der Debuggereigene Eintrag wird mit einem * gekennzeichnet (nützlich
  1031.      wenn zwei Debugger installiert sind).
  1032.  
  1033.  
  1034.      4.7.11. COPY
  1035.  
  1036.      Syntax: COPy [From][,To],Destination
  1037.  
  1038.      Kopiert einen Speicherbereich. Überlappende Bereiche werden korrekt
  1039.      kopiert.
  1040.      Defaultadressen für "From" und "To", sind die Anfangs- bzw. Endadres-
  1041.      sen eines geladenen Files.
  1042.  
  1043.  
  1044.      4.7.12. DISASSEMBLE
  1045.  
  1046.      Syntax: Disassemble [From][[,To]|[[,]#Lines]|[,][Bytes]|[.]]|:[CPUs]
  1047.  
  1048.      Gibt einen Speicherbereich in disassemblierter Form aus. Die Parameter
  1049.      entsprechen denjenigen von >ASCII, mit Ausnahme von :[CPUs]:
  1050.      - Mittels d: erfahren Sie, für welche Prozessoren der Disassembler
  1051.        konfiguriert ist. Bei Programmstart ist das immer der Prozessor, der
  1052.        auch im Rechner vorhanden ist.
  1053.      - Mittels d:CPUs: können Sie den Disassembler veranlassen, Code für
  1054.        bestimmte CPU's zu erzeugen, wobei CPU folgendermassen codiert ist:
  1055.         Bit 0=MC68000
  1056.         Bit 1=MC68010
  1057.         Bit 2=MC68020
  1058.         Bit 3=MC68030
  1059.         Bit 4=MC68040
  1060.         Bit 6=MC68881/2
  1061.        Diese Bits können gleichzeitig gesetzt sein, dann wird Code für mehr
  1062.        als eine CPU erzeugt (bei Mehrdeutigkeiten wird die Ausgabe für den
  1063.        "höherwertigen" Prozessor genommen, d.h. 60FF wird als BRA.L *2 und
  1064.        nicht als BRA.S *1 übersetzt.
  1065.  
  1066.      Wenn sich die disassemblierte Address innerhalb Debuggers befindet,
  1067.      wird das Disassembly mit einem Asterix * gekennzeichnet.
  1068.  
  1069.      Negative Zahlen werden normalerweise als vorzeichenlose Zahlen ausge-
  1070.      geben, mit Ausnahme von denjenigen zwischen -1 und -9. Z.B. wird -.100
  1071.      als $9C, -5 aber als -5 ausgegeben.
  1072.  
  1073.      Beachten Sie, dass das Basedisplacement in der auf Atari unüblichen
  1074.      Schreibweise innerhalb der Klammer ausgegeben wird. Dies ist offiziel-
  1075.      le Motorola Notation. Auch der Assembler akzeptiert Basedisplacements
  1076.      nur in dieser Schreibweise.
  1077.  
  1078.      Wenn der Disassembler drei Fragezeichen hinter das Disassembly
  1079.      schreibt, dann wurde ein Befehl gefunden, der zwar erlaubt ist, aber
  1080.      nicht sehr sinnvoll. Im Moment tut er dies aber nur bei Sprüngen auf
  1081.      ungerade Adressen (bsr/bcc/jsr/jmp/fbcc usw.)
  1082.      Falls er >?< hinter das Disassembly schreibt, heisst dies, dass ein
  1083.      Befehl gefunden wurde, der offiziell nicht erlaubt ist, aber trotzdem
  1084.      in der angegebenen Form funktioniert:
  1085.      - Dies ist z.B. der Fall bei der Adressierungsart "Memory Indirect
  1086.        Post-indexed with Index Suppress". Diese Adressierungsart ist gemäss
  1087.        Motorola "reserved" (respektive dessen Codierung). Versuche haben
  1088.        aber gezeigt, dass der Befehl trotzdem ausgeführt wird und zwar er-
  1089.        wartungsgemäss wie "Memory Indirect Pre-Indexed with Index Sup-
  1090.        press".
  1091.      - Ein FBcc mit conditional predicate 1XXXXX ist gemäss Motorola reser-
  1092.        viert [Zitat: "Not used, redunant encodings with 0XXXXX"], wird von
  1093.        PEACEBUG aber übersetzt, da er funktioniert.
  1094.      - usw...
  1095.      Falls Sie wirklich das Vergnügen haben sollten, auf ein >?< zu stos-
  1096.      sen, dann nehmen Sie ein User's Manual hervor und schauen sich die
  1097.      Codierung des Befehls an.
  1098.      Das Übersetzen scheint mir deswegen sinnvoll, weil es vielleicht Pro-
  1099.      gramme gibt, die diese Befehle absichtlich benützen...
  1100.  
  1101.      Beispiele:
  1102.      $001CDAEA>d:%1111
  1103.       Disassembler active for MC68000/10/20/30
  1104.      $001CDAEA>d 1cdace #5
  1105.      $001CDACE>/ 4E7A                       ; *???      $4E7A
  1106.      $001CDAD0>/ 0003,3100                  ; *ORI.B    #0,D3
  1107.      $001CDAD4>/ 4E75                       ; *RTS
  1108.      $001CDAD6>/ 5148                       ; *SUBQ.W   #8,A0
  1109.      $001CDAD8>/ F010,4A00                  ; *PMOVE    SRP,(A0)
  1110.      $001CDADC>d:%11111
  1111.       Disassembler active for MC68000/10/20/30/40
  1112.      $001CDACE>/ 4E7A,0003                  ; *MOVEC    TC,D0
  1113.      $001CDAD2>/ 3100                       ; *MOVE.W   D0,-(A0)
  1114.      $001CDAD4>/ 4E75                       ; *RTS
  1115.      $001CDAD6>/ 5148                       ; *SUBQ.W   #8,A0
  1116.      $001CDAD8>/ F010,4A00                  ; *PMOVE    SRP,(A0)
  1117.  
  1118.  
  1119.      4.7.13. DFREE
  1120.  
  1121.      Syntax: DFree [Drive:]
  1122.  
  1123.      Gibt den freien Speicherplatz eines Laufwerkes aus.
  1124.      Defaultlaufwerk ist das aktuelle (zu erfahren mit >CD)
  1125.  
  1126.      Beispiel:
  1127.      $001C7FB2>dfreea:
  1128.       Drive A: 00001239 K used, 00000184 K free, 00001423 K totally
  1129.  
  1130.  
  1131.      4.7.14. DIRECTORY
  1132.  
  1133.      Syntax: DIRectory [Path]
  1134.  
  1135.      Dient zum Anzeigen des Inhaltsverzeichnisses eines Laufwerks. Momentan
  1136.      können nur Pfade angegeben werden und keine Suchmasken (z.B. *.PRG).
  1137.      Auch erfolgt die Ausgabe noch unsortiert.
  1138.  
  1139.      Beispiele:
  1140.      $001C7FEC>dir
  1141.       CD   "."            ;.0           28:14:52  15.06.1992
  1142.       CD   ".."           ;.0           28:14:52  15.06.1992
  1143.       LOAD "README"       ;.120009      20:60:20  00.00.1980
  1144.       LOAD "PEACEBUG.SRC" ;.342614      21:69:34  04.01.1980
  1145.       CD   "UTILLITY"     ;.0           28:17:06  15.06.1992
  1146.       CD   "REMOTE"       ;.0           28:18:32  15.06.1992
  1147.       CD   "MODULE"       ;.0           28:18:34  15.06.1992
  1148.       LEX  "PEACEBUG.PRG" ;.58949       21:64:24  04.01.1980
  1149.       LOAD "PEACEBUG.SYM" ;.4950        20:62:06  00.00.2028
  1150.       LOAD "README.TXT"   ;.106561      28:03:38  04.07.1992
  1151.      $001C7FEC>dir ..
  1152.       CD   "."            ;.0           28:14:52  15.06.1992
  1153.       CD   ".."           ;.0           28:14:52  15.06.1992
  1154.       CD   "M_MAUS"       ;.1024        37:71:40  12.03.1992
  1155.       CD   "M_SPOOL"      ;.1024        37:71:40  12.03.1992
  1156.       CD   "PBUGCONF"     ;.1024        37:71:30  12.03.1992
  1157.       CD   "PEACEBUG"     ;.1024        37:71:30  12.03.1992
  1158.       CD   "TOP_WIND"     ;.0           37:71:38  12.03.1992
  1159.       CD   "WINDOW"       ;.0           37:72:40  12.03.1992
  1160.       LOAD "SERIAL"       ;.337         20:60:40  00.00.2028
  1161.       LOAD "RELEASE"      ;.3188        20:60:24  00.00.2028
  1162.  
  1163.  
  1164.      4.7.15. DO
  1165.  
  1166.      Syntax: DO [Address]
  1167.  
  1168.      DO: Hat den gleichen Effekt wie F2-Do PC.
  1169.      DO Address: Setzt den PC auf den angegebenen Wert und führt ein Do PC
  1170.      aus.
  1171.  
  1172.  
  1173.      4.7.16. DUMP
  1174.  
  1175.      Syntax: DUmp [From][[,To]|[[,]#Lines]|[,][Bytes]|[.]]
  1176.  
  1177.      Gibt einen Speicherbereich im Hexdumpmodus aus. Die Parameter entspre-
  1178.      chen denjenigen von >ASCII.
  1179.  
  1180.  
  1181.      4.7.17. EXIT
  1182.  
  1183.      Syntax: Exit [Value]
  1184.  
  1185.      Wenn der Debugger als Programm gestartet wurde, wird er beendet und
  1186.      aus dem Speicher entfernt. Andernfalls wird ein Pterm ausgeführt (Gem-
  1187.      dos 76), wobei der Rückgabewert defaultmässig -1 ist. Wenn ein Pro-
  1188.      gramm abstürzt und Sie den Fehler nicht beheben können, kann manchmal
  1189.      mittels dieser Funktion weitergefahren werden.
  1190.  
  1191.  
  1192.      4.7.18. FIND
  1193.  
  1194.      Syntax: Find[.b|.w|.l] [From][,To],Term,{Term} - default byte
  1195.  
  1196.      Durchsucht den Speicher und zeigt alle Adressen an, die Term,{Term}
  1197.      enthalten. Term ist ein Ausdruck, dem zusätzlich durch Anhängen von
  1198.      .b, .w, .a oder .l eine bestimmte Länge gegeben werden kann:
  1199.       1.b = $01          1 Byte
  1200.       1.w = $0001        2 Bytes
  1201.       1.a = $000001      3 Bytes
  1202.       1.l = $00000001    4 Bytes
  1203.      Wenn keine Länge angegeben wird, erweitert der Debugger die Zahl auf
  1204.      die kürzest mögliche Länge, wobei Zahlen >$FFFF allerdings immer auf
  1205.      long erweitert werden nicht auf 3 Bytes.
  1206.      Term kann auch ein beliebig langer String sein (normalerweise sind
  1207.      Strings nur 4 Zeichen lang).
  1208.      Der Debugger kreiert aus Term{,Term} einen einzigen String und sucht
  1209.      diesen, wobei natürlich wieder das Inkrement beim Suchen bestimmt wer-
  1210.      den kann (.b=byte, .w=word, .l=long). Dies beschleunigt den Vorgang,
  1211.      wenn Sie z.B. Opcodes suchen, die sowieso nur an gerader Adresse lie-
  1212.      gen dürfen.
  1213.      Defaultadressen für "From" und "To", sind die Anfangs- bzw. Endadres-
  1214.      sen eines geladenen Files.
  1215.      Befindet sich die gefundene Adresse innerhalb des Debuggers oder in
  1216.      einem von diesem allozierten Speicherbereich, wird sie mit einem *
  1217.      gekennzeichnet.
  1218.  
  1219.      Beispiele:
  1220.      $001C7FB2>m 0#1
  1221.      $00000000>, 60,2E,01,06,00,FC,00,30,00,1C,DB,E4,00,20,FA,5C
  1222.      $001C7FB2>f 0,10,fc0030
  1223.       $00000004
  1224.      $001C7FB2>f 0,10,fc0030.a
  1225.       $00000005
  1226.      $001C7FB2>fi fc0000,fc0000+.192000,'Atari'
  1227.       $00FEBC31
  1228.      $001C7FB2>m #1
  1229.      $00FD004F>, 00,FF,C4,3B,46,FF,FC,3A,87,4E,71,4A,D5,6B,FA,51
  1230.      $001C7FB2>find fc0000,fc0000+.192000,ff.w,c4,";F"
  1231.       $00FD004F
  1232.  
  1233.  
  1234.      4.7.19. FILL
  1235.  
  1236.      Syntax: FILl [From][,To],Term{,Term}
  1237.  
  1238.      Füllt einen Speicherbereich mit Term{,Term}, wobei Term aufgebaut sein
  1239.      kann, wie bei >FIND.
  1240.      Defaultadressen für "From" und "To", sind die Anfangs- bzw. Endadres-
  1241.      sen eines geladenen Files.
  1242.  
  1243.      Beispiel:
  1244.      $001C023A>fill 600,700,10,10.w,10.a,10.l,'PEACEBUG'
  1245.       füllt den Bereich zwischen 600 und 700 (exklusive wie immer) mit:
  1246.       $10,00,10,00,00,10,00,00,00,10,50,65,61,63,65,62,75,67='PEACEBUG'
  1247.  
  1248.  
  1249.      4.7.20. FREE
  1250.  
  1251.      Syntax: FRee
  1252.  
  1253.      Gibt den grössten allozierbaren Speicherblock aus.
  1254.  
  1255.  
  1256.      4.7.21. GO
  1257.  
  1258.      Syntax: Go [Address][,Breakpoint]
  1259.  
  1260.      Startet das unterbrochene Programm.
  1261.      Zusätzlich kann auch ein Breakpoint angegeben werden, so dass Sie das
  1262.      Programm quasi From,To starten können.
  1263.      Defaultadresse ist der aktuelle PC.
  1264.  
  1265.      Beispiele:
  1266.      $12345678>g ,^pc+10
  1267.       Startet das Programm und setzt 16 Bytes hinter dem PC einen Break-
  1268.       point.
  1269.      $12345678>go p(b4),p(b4)
  1270.       Setzt den PC auf den Bioshandler. Beachte, dass die Klammern nötig
  1271.       sind, weil ein pb4 als pb 4 (Bytepointer Adresse 4) und nicht als p
  1272.       b4 (Longpointer Adresse B4) ausgewertet wird!
  1273.  
  1274.  
  1275.      4.7.22. HELP
  1276.  
  1277.      Syntax: Help [Command]
  1278.  
  1279.      Gibt die Syntax der Befehle aus. Wird kein Befehl angegeben, werden
  1280.      alle Befehle aufgelistet.
  1281.  
  1282.      Beispiele:
  1283.      $0012F27C>h d
  1284.       Disassemble [From][[,To]|[[,]#Lines]|[,][Bytes]|[.]]|:[CPUs]
  1285.      $0012F27C>he hun
  1286.       HUnt [From][,To],Term{,Term}
  1287.  
  1288.  
  1289.      4.7.23. HUNT
  1290.  
  1291.      Syntax: HUnt [From][,To],Term{,Term}
  1292.  
  1293.      Entspricht dem Befehl find.w, weshalb er sich vorallem zum Suchen von
  1294.      Opcodes anbietet.
  1295.  
  1296.  
  1297.      4.7.24. INFO
  1298.  
  1299.      Syntax: Info
  1300.  
  1301.      Gibt Ihnen einige Daten zum geladenen Programm/File und zum Debugger
  1302.      aus:
  1303.  
  1304.       Programstart:   $001E738A  Length: 75798
  1305.       TEXT-Segment:   $001E748A  Length: 45284
  1306.       Data-Segment:   $001F256E  Length: 20830
  1307.       BSS-Segment:    $001F76CC  Length: 9428
  1308.       Symboltable:    $000DA440  Number: 2730
  1309.       - Fastloadbit is set
  1310.       - Program may load into alternative RAM
  1311.       - Malloc calls may be satisfied from alternative RAM
  1312.       - Privatemode. Only the process itself (and the OS) can use the
  1313.         memory
  1314.       - Program has shared memory
  1315.       Filename:       H:\PEACE.PRG
  1316.  
  1317.       Debuggerstart:  $00030712  Length: 89764
  1318.       TEXT-Segment:   $00030812  Length: 50674
  1319.       DATA-Segment:   $0003CE04  Length: 21043
  1320.       BSS-Segment:    $00042037  Length: 17791
  1321.       Cookie:         $001C7E44
  1322.       Sectorbuffer:   $001CCD2C
  1323.  
  1324.  
  1325.      4.7.25. LIST
  1326.  
  1327.      Syntax: List [From][[,To]|[[,]#Lines]|[,][Bytes]|[.]]
  1328.  
  1329.      Gibt einen Speicherbereich im Listmodus aus. Die Parameter entsprechen
  1330.      denjenigen von >ASCII. Falls ein Programm geladen wurde, dass Labels
  1331.      enthält, wird dies in der Ausgabe berücksichtigt.
  1332.      Ist der >Resident Symbol Driver installiert, wird das zur ausgegebenen
  1333.      Adresse passende Programm zusätzlich angezeigt:
  1334.        $01057536>! [GEMRAM]   RTS                                    ; 4E75
  1335.  
  1336.  
  1337.      4.7.26. LAST
  1338.  
  1339.      Syntax: LAst
  1340.  
  1341.      Gibt die jeweils letzte Einsprungsmessage aus (das ist die Meldung,
  1342.      die in der ersten Zeile invers erscheint).
  1343.  
  1344.  
  1345.      4.7.27. LET
  1346.  
  1347.      Syntax: LEt Register=Value
  1348.  
  1349.      Setzt den Wert eines Registers. Es sind alle Register erlaubt, die
  1350.      schon unter >Formelauswertung beschrieben wurden. Beim CRP und beim
  1351.      SRP können momentan nur die unteren 32 Bits gesetzt werden. Beachte,
  1352.      dass bei diesem Befehl die Register ohne ^ angesprochen werden.
  1353.  
  1354.  
  1355.      Beispiele:
  1356.      $0002428A>letpc=pE0
  1357.       Setzt den PC auf den Handler für einen PMMU Configuration Error
  1358.      $0002428A>letccr=^sr&ff
  1359.       Es passiert gar nichts
  1360.  
  1361.  
  1362.      4.7.28. LEXECUTE
  1363.  
  1364.      Syntax: LEXecute [Filename]
  1365.  
  1366.      Lädt ein ausführbares Programm mittels Pexec.
  1367.      Der PC wird automatisch auf den Anfang des geladenen Files gesetzt
  1368.      Eine Symboltabelle im GST-/DRI-Format wird geladen, allerdings werden
  1369.      nur segmentrelative Symbole berücksichtigt, alle andern werden ge-
  1370.      löscht (insbesondere die Konstanten). Debugger, die dies nicht machen,
  1371.      erzeugen meist ziemlich seltsame Disassemblies was die Labels anbe-
  1372.      langt.
  1373.      Der Debugger merkt sich den Filenamen inklusive Pfad. Wenn Sie Filena-
  1374.      me weglassen, wird der intern gespeicherte Name benutzt (zu erfahren
  1375.      über >INFO).
  1376.      Dieser Befehl steht in der residenten Version NICHT zur Verfügung.
  1377.  
  1378.  
  1379.      4.7.29. LOAD
  1380.  
  1381.      Syntax: LOad [Filename][,Start[,End]]|-
  1382.  
  1383.      - LOAD [Filename]: Eine Datei wird vollständig in den Speicher gela-
  1384.        den. Der benötigte Speicher wird, falls keine Startadresse angege-
  1385.        ben wird, mittels Malloc reserviert. Wenn Sie eine Endadresse ange-
  1386.        ben, wird nicht die ganze Datei geladen, sondern nur End-Start Bytes
  1387.        (End ist also das erste nicht mehr benutzte Byte).
  1388.        Der Debugger merkt sich den Filenamen inklusive Pfad. Wenn Sie File-
  1389.        name weglassen, wird der intern gespeicherte Name benutzt.
  1390.      - LOAD -: gibt den mittels Malloc reservierten Speicher frei.
  1391.      Es wird ab dem Anfang des Files aufgelistet aber der PC nicht auf
  1392.      diese Adresse gesetzt.
  1393.      
  1394.      Beispiele:
  1395.      $12345678>load m:\test.prg
  1396.       Programstart:  $001E3858 Length: 1379
  1397.       Filename:       M:\TEST.PRG
  1398.      $001E3858>load ,238000
  1399.       Programstart:  $00238000  Length: 1379
  1400.       Filename:       M:\TEST.PRG
  1401.      $00238000>load ,238000,238200
  1402.       Programstart:  $00238000  Length: 512
  1403.       Filename:       M:\TEST.PRG
  1404.  
  1405.  
  1406.      4.7.30. LS
  1407.  
  1408.      Syntax: LS [Path]
  1409.  
  1410.      Entspricht dem Befehl >DIR.
  1411.  
  1412.  
  1413.      4.7.31. MEMORY
  1414.  
  1415.      Syntax: Memory [From][[,To]|[[,]#Lines]|[,][Bytes]]
  1416.  
  1417.      Enstspricht dem Befehl >DUMP.
  1418.  
  1419.  
  1420.      4.7.32. MKDIRECTORY
  1421.  
  1422.      Syntax: MKdirectory Directory
  1423.  
  1424.      Legt einen neuen Ordner an. Es kann auch ein ganzes Verzeichnis ange-
  1425.      geben werden.
  1426.  
  1427.      Beispiel:
  1428.      $12345678>mk m:\peacebug\testit
  1429.       legt auf Laufwerk M, im Ordner peacebug einen Ordner namens "testit"
  1430.       an.
  1431.  
  1432.  
  1433.      4.7.33. NEWFORMAT
  1434.  
  1435.      Syntax: Newformat
  1436.  
  1437.      Diese Funktion initialisiert den Bildschirm neu:
  1438.      1. Auf Programmscreen schalten
  1439.      2. >CLEAR_SCREEN aufrufen
  1440.      3. >GET_PARAMETER aufrufen
  1441.      4. >NEW_FORMAT aufrufen
  1442.      5. >PRINT_SCREEN aufrufen
  1443.      6. Auf Debuggerscreen schalten
  1444.  
  1445.      Diese Funktion passt also die Debuggerauflösung an diejenige des rest-
  1446.      lichen Systems an und wird vorallem nach einem Auflösungswechsel be-
  1447.      nutzt (siehe auch >SWITCH). Einen Auflösungswechsel bemerkt der Debug-
  1448.      ger nicht, so dass er nicht in der gleichen Auflösung läuft, wie das
  1449.      Programm. Das wäre nicht weiter schlimm, wenn das Screenumschalten
  1450.      nicht flimmern würde.
  1451.      Achtung: Da GET_PARAMETER auf Lineavariablen zugreift, sollte diese
  1452.      Funktion nicht benützt werden, wenn ein Program die Auflösung selber
  1453.      umgeschaltet hat (z.B. bei Spielen häufig der Fall), denn die Lineava-
  1454.      riablen werden dann normalerweise nicht gesetzt.
  1455.  
  1456.  
  1457.      4.7.34. OBSERVE
  1458.  
  1459.      Syntax: Observe [[Address][,Bytes]|-|+]
  1460.  
  1461.      Observe dient dazu, Speicher auf Veränderungen zu überwachen und diese
  1462.      gegebenenfalls anzuzeigen. Dazu wird der 200HZ Timer benutzt.
  1463.  
  1464.      - Observe ohne Parameter: gibt aus, welchen Speicher sie gerade über-
  1465.        wachen lassen.
  1466.      - Observe Address,Bytes: schaltet die Observefunktion ein und setzt
  1467.        den zu überwachenden Bereich fest. "Bytes" kann Werte zwischen 1 und
  1468.        1024 annehmen, Defaultwert ist 1 (wenn sie "Bytes" schon mal gesetzt
  1469.        haben, wird dieser Wert als Default genommen).
  1470.      - Observe -: schaltet die Observefunktion aus.
  1471.      - Observe +: schaltet die Observefunktion ein.
  1472.  
  1473.      Wenn eine Veränderung festgestellt wurde, wird dies angezeigt und die
  1474.      Funktion ausgeschaltet, damit der Debugger nicht endlos Veränderungen
  1475.      feststellt. Weiter "Observen" können Sie dann mittels O+. Da der Be-
  1476.      reich im Interrupt überprüft wird, kann natürlich die genaue Adresse,
  1477.      an der die Änderung stattfand, nicht exakt angezeigt werden. Sollte
  1478.      dies nötig, müssen Sie auf eine Usertraceroutine zurückgreifen.
  1479.  
  1480.      Beispiele:
  1481.      $00123456>o+
  1482.       Observing $001 byte(s) at address $00000000
  1483.      $00123456>o ,.1024
  1484.       Observing $400 byte(s) at address $00000000
  1485.      $00123456>o 10000
  1486.       Observing $400 byte(s) at address $00010000
  1487.      $00123456>o
  1488.       Observing $400 byte(s) at address $00010000
  1489.      $00123456>o-
  1490.  
  1491.  
  1492.      4.7.35. PAGE
  1493.  
  1494.      Syntax: Page
  1495.  
  1496.      Page sucht den Speicher nach Doppelseiten ab.
  1497.      Eine Doppelseite ist ein 512 Byte langer Bereich, der auf einer durch
  1498.      512 teilbaren Adresse liegen muss. Das erste Long enthält das Magic
  1499.      $12123456, das zweite Long ist ein Pointer auf die Seite selber. Und
  1500.      schliesslich ist die Prüfsumme (Word) über diesen Bereich $5678.
  1501.      Diese Doppelseiten werden nach einem Warmstart vom Betriebsystem ge-
  1502.      sucht und angesprungen. Dadurch lassen sich resetresidente Programme
  1503.      schreiben, allerdings ist dieses Feature undokumentiert, aber bisher
  1504.      in jeder TOS-Version enthalten. Durchsucht wird übrigens nur das ST-
  1505.      RAM, die Suche beginnt bei phystop und endet bei $600. Die Behauptung
  1506.      im Profibuch, der Speicher werde durch die Gemdosinitiialisierung ge-
  1507.      löscht, so dass nur die Seite an Adresse $600 übrigbleibe, stimmt na-
  1508.      türlich nicht. Richtig ist, dass der Speicher logisch freigegeben wird
  1509.      und in der Doppelseite neu reserviert werden muss, damit er nicht
  1510.      durch das erste Autoordnerprogramm, das gleich nach Suche der Doppel-
  1511.      seiten gestartet wird, überschrieben wird. Probleme kann es nur mit
  1512.      dem HD-Treiber geben, da dieser noch vor den Doppelseitenprogrammen
  1513.      ausgeführt wird (vorallem, wenn er AHDI heisst ...).
  1514.  
  1515.  
  1516.      4.7.36. PROGRAMS
  1517.  
  1518.      Syntax: PRograms
  1519.  
  1520.      Dieser Befehl funktioniert nur, wenn der Resident Symbol Driver ins-
  1521.      talliert ist (siehe Kapitel "Symbole").
  1522.      Er gibt eine Liste aller gestarteten Programme und ein paar dazugehö-
  1523.      rende Informationen aus.
  1524.  
  1525.      Beispiel:
  1526.      $0117512E>pr
  1527.       Name:         HDX.PRG
  1528.       Basepage:     $0117502E
  1529.       TEXT-Segment: $0117512E
  1530.       Length:       $00026C94
  1531.       Symbols:      $0216
  1532.  
  1533.       Name:         PEACEBUG.PRG
  1534.       Basepage:     $0008B44E
  1535.       TEXT-Segment: $0008B54E
  1536.       Length:       $0001555A
  1537.       Symbols:      $0000
  1538.  
  1539.  
  1540.      4.7.37. QUIT
  1541.  
  1542.      Syntax: Quit [Value]
  1543.  
  1544.      Entspricht dem Befehl >EXIT.
  1545.  
  1546.  
  1547.      4.7.38. READSECTOR
  1548.  
  1549.      Syntax: Readsector [Track][,Sector][,Side][,Address][,Drive]
  1550.  
  1551.      Lädt einen Sektor mittels XBIOS 8.
  1552.      Defaultmässig sind eingestellt: Track=0, Sector=1, Side=0, Address=ein
  1553.      vom Debugger zur Verfügung gestellter Puffer (1024 Bytes lang),
  1554.      Drive=0.
  1555.      Wenn Sie andere Parameter angeben, werden diese beim nächsten Readsec-
  1556.      tor wieder benutzt. Readsector benutzt natürlich die gleichen Werten
  1557.      wie >WRITESECTOR.
  1558.  
  1559.      Beispiele:
  1560.      $00237322>r
  1561.       Sectorbuffer:   $001D752A
  1562.       ; liest den Bootsektor von Laufwerk A in den internen Puffer
  1563.      $00237322>r ,,,600,1
  1564.       Sectorbuffer:   $001D752A
  1565.       ; liest den Bootsektor von Laufwerk B an die Adresse $600
  1566.  
  1567.  
  1568.      4.7.39. REGISTER
  1569.  
  1570.      Syntax: REGister [Register]
  1571.  
  1572.      Gibt den Inhalt eines Register aus. Es sind alle Register erlaubt, die
  1573.      schon unter >Formelauswertung beschrieben wurden. Register werden wie
  1574.      bei >LET ohne ^ angegeben. Wird kein gültiges Register angegeben, wer-
  1575.      den alle Registerinhalte angezeigt, wobei sich die Anzeige auf die
  1576.      vorhandenen Register beschränkt, je nach Prozessor.
  1577.  
  1578.      Beispiele:
  1579.      $001C732A>r ccr
  1580.       01
  1581.      $001C732A>r srp
  1582.       0000000000000000
  1583.  
  1584.  
  1585.      4.7.40. RESIDENT
  1586.  
  1587.      Syntax: RESident
  1588.  
  1589.      Falls der Debugger als Programm gestartet wurde, kann er mittels die-
  1590.      sem Befehl resident gemacht werden. Der Debugger installiert zu diesem
  1591.      Zweck nachträglich einen Cookieeintrag und eine Doppelseite. Darauf
  1592.      wird er verlassen und kann dann jederzeit über Tastatur aufgerufen
  1593.      werden.
  1594.      Dieser Befehl steht in der residenten Version natürlich nicht zur Ver-
  1595.      fügung.
  1596.  
  1597.  
  1598.      4.7.41. RMDIRECTORY
  1599.  
  1600.      Syntax: RMdirectory [Directory|File]
  1601.  
  1602.      Dient zum Löschen eines Ordners oder einer Datei. Im Gegensatz zu vie-
  1603.      len Commandline Interpretern, ist der Befehl für Ordner und Dateien
  1604.      identisch. Es kann auch ein kompletter Pfad angegeben werden.
  1605.      Defaultmässig wird das zuletzt geladende File benutzt.
  1606.  
  1607.      Beispiel:
  1608.      $12345678>rm m:\peacebug\testit
  1609.  
  1610.  
  1611.      4.7.42. SAVE
  1612.  
  1613.      Syntax: Save [Filename][,Start,End]
  1614.  
  1615.      Speichert einen Speicherbereich.
  1616.      Save übernimmt die beim Laden benutzten Variablen, falls keine anderen
  1617.      angeben werden.
  1618.  
  1619.      Beispiele:
  1620.      $12345678>load m:\test.prg
  1621.      $12345678>save ,fc0000,fc0000+.1000
  1622.       speichert 1000 Bytes ab Adresse fc0000 in der Datei "M:\TEST.PRG"
  1623.      $12345678>save c:\test2
  1624.       speichert "test.prg" unter dem neuen Namen "C:\TEST2"
  1625.       (Man beachte dass sich so auch files kopieren lassen)
  1626.  
  1627.  
  1628.      4.7.43. SET
  1629.  
  1630.      Syntax: SEt Register=Value
  1631.  
  1632.      Entspricht dem Befehl >LET.
  1633.  
  1634.  
  1635.      4.7.44. SHOWMEMORY
  1636.  
  1637.      Syntax: SHowmemory [Term[,List]]||[[Nummer]-]
  1638.  
  1639.      Durch diesen Befehl können Sie sich wichtige Speicherbereiche ständig
  1640.      anzeigen lassen. Dabei kann Term ein Ausdruck beliebiger Komplexität
  1641.      sein, d.h. er kann Register, Symbole und Adressen referenzieren. Die
  1642.      Anzeige wird immer aktuallisiert, falls sich der Wert von Term oder
  1643.      der Speicherinhalt, auf den Term zeigt, ändern sollte. Es können maxi-
  1644.      mal 10 Bereiche gleichzeitig angezeigt werden. Jedem Bereich wird eine
  1645.      Zeile unterhalb der Registeranzeige geopfert. Ein Bereich wird automa-
  1646.      tisch eliminiert, wenn nicht mehr genug Platz auf dem Bildschirm zur
  1647.      Verfügung steht, da mindestens eine Zeile unterhalb dieser Anzeige
  1648.      übrig bleiben muss.
  1649.  
  1650.      - SHOWMEMORY ohne Parameter: gibt eine Liste aller Bereiche aus, die
  1651.        momentan angezeigt werden.
  1652.      - SHOWMEMORY Term: zeigt ab sofort den neuen Bereich an, der durch
  1653.        "Term" definiert wird. Es wird im Hexdumpmodus ausgegeben.
  1654.      - SHOWMEMORY Term,List: zeigt ab sofort den neuen Bereich an, der
  1655.        durch "Term" definiert wird. List gibt an, wie die Ausgabe erfolgen
  1656.        soll:
  1657.         1=List
  1658.         2=Disassemble
  1659.         3=Hexdump
  1660.         4=Ascii
  1661.      - SHOWMEMORY -: entfernt alle Bereiche, d.h. fortan werden keine mehr
  1662.        angezeigt.
  1663.      - SHOWMEMORY Nummer -: entfernt den Bereich, den Sie mit Nummer ange-
  1664.        ben (das ist die Nummer, die am Anfang der Zeile steht), d.h. er
  1665.        wird fortan nicht mehr angezeigt.
  1666.  
  1667.      Beispiele:
  1668.      $001C273E>sh ^a7,4
  1669.       zeigt den Stack im Asciimodus
  1670.      $001C273E>sh ^d0
  1671.       zeigt den Bereich auf den d0 zeigt im Hexdumpmodus
  1672.      $001C273E>sh
  1673.       0,4:^a7
  1674.       ; die 4 gibt an, dass im Asciimodus gelistet wird
  1675.       1,3:^d0
  1676.       ; die 3 gibt an, dass im Hexdumomodus gelistet wird
  1677.      $001C273E>show 0-
  1678.      $001C273E>sh
  1679.       1,3:^d0
  1680.  
  1681.  
  1682.      4.7.45. SLOW
  1683.  
  1684.      Syntax: SLow [ON|Off]
  1685.  
  1686.      Diese Funktion ist dafür da, um den Rechner in Slowmotion laufen zu
  1687.      lassen. Slow ohne Parameter gibt aus, in welchem Modus das Programm
  1688.      arbeitet. Mit Slow on schalten Sie den Slowmodus an, mit Slow off aus.
  1689.      Mit den Tasten +/- (Zahlenblock) können Sie den Rechner verlangsamen
  1690.      (+), respektive wieder beschleunigen (-). Zusammen mit einer Shiftta-
  1691.      ste können Sie feiner abstufen (8 mal feiner als ohne Shift). Mit der
  1692.      Taste * können Sie die Verzögerung auf Null zurücksetzen, der Rechner
  1693.      läuft dann wieder in Originalgeschwindigkeit (die Slowmotionfunktion
  1694.      bleibt aber aktiv).
  1695.  
  1696.  
  1697.      4.7.46. SWITCH
  1698.  
  1699.      Syntax: SWitch [ResolutionDebugger][,ResolutionProgram]
  1700.  
  1701.      Mit dieser Funktion können Sie den Debugger/das Programm auf eine
  1702.      Standardauflösung umschalten. Die Werte entsprechen denjenigen von
  1703.      Getrez:
  1704.  
  1705.      0: 320*200*4  ST-Low
  1706.      1: 640*200*2  ST-Mid
  1707.      2: 640*400*1  ST-High
  1708.      4: 640*480*4  TT-Mid
  1709.      6: 1280*960*1 TT-High
  1710.      7: 320*480*8  TT-Low
  1711.  
  1712.      - ResolutionDebugger: der Debuggerscreen wird dabei neu initialisiert
  1713.        (aber nicht neu reserviert, deshalb sollte nur umgeschalten werden,
  1714.        wenn die neue Auflösung nicht mehr Bildspeicher benötigt als die
  1715.        alte. Mittels >NEWFORMAT können Sie übrigens den Debuggerscreen wie-
  1716.        der auf die vom restlichen System benutzte Auflösung umschalten.
  1717.  
  1718.      - ResolutionProgram: das Umschalten der Programmauflösung geschieht
  1719.        durch Beschreiben des Shiftmoderegisters. Vom Auflösungswechsel be-
  1720.        kommt das restliche System natürlich nichts mit über, daher ist das
  1721.        Umschalten der Programmauflösung nur sinnvoll, wenn diese durch ein
  1722.        anderes Programm fälschlicherweise verändert wurde.
  1723.  
  1724.      Achtung: dieser Befehl existiert auf dem F030 nicht.
  1725.  
  1726.  
  1727.      4.7.47. SYMBOL
  1728.  
  1729.      Syntax: SYmbol [From][,To]
  1730.  
  1731.      Gibt eine Liste der Symbole aus, die PEACEBUG bei Programmstart gela-
  1732.      den hat. Mittels "From" und "To" können Sie die Ausgabe auf einen be-
  1733.      stimmten Bereich beschränken, es werden dann nur die Symbole ausgege-
  1734.      ben, deren Symbolwert zwischen den beiden Werten liegt.
  1735.      Die Ausgabe erfolgt sortiert nach Symbolwert.
  1736.      Wenn ein Programm nachgeladen wurde, werden nur die Symbole des Pro-
  1737.      gramms ausgegeben, falls dieses eine Symboltabelle enthielt.
  1738.  
  1739.      Beispiele:
  1740.      $001C7FB2>sy fa0000,ffff8001
  1741.       $00FA0000 = cart_port
  1742.       $00FC0000 = os_start_old
  1743.       $FFFF8001 = memconf
  1744.      $001C7FB2>symb 500,510
  1745.       $00000502 = scr_dump
  1746.       $00000506 = prv_lsto
  1747.       $0000050A = prv_lst
  1748.       $0000050E = prv_auxo
  1749.  
  1750.  
  1751.      4.7.48. SYSINFO
  1752.  
  1753.      Syntax: SYSINFO
  1754.      Kurzform: SYS
  1755.  
  1756.      Gibt einige Informationen zum benutzten System aus:
  1757.       OS_Base:          $00240000
  1758.       OS_Start:         $00240030
  1759.       OS_Membot:        $00006678
  1760.       TOS-Version:      PAL -BRD 02.05 vom 05.12.1990
  1761.       GEMDOS-Version:   00.19
  1762.       METADOS-Version:  Metados not installed
  1763.       AES-Version:      03.10
  1764.       VDI-Version:      GDOS installed
  1765.  
  1766.  
  1767.      4.7.49. TRACE
  1768.  
  1769.      Syntax: Trace [Number|+|-|*]
  1770.  
  1771.      - Trace ohne Parameter entspricht F1, also der normalen Tracefunktion.
  1772.      - Trace Number führt "Anzahl" Befehle aus, bevor in den Debugger zu-
  1773.        rückgesprungen wird. Dabei werden wie bei F1 gewisse Opcodes als ein
  1774.        Befehl angesehen.
  1775.      - Trace + lässt das Programm im Tracemodus laufen und ruft nach jedem
  1776.        Befehl die Usertraceroutine auf, die entscheidet, ob in den Debugger
  1777.        gesprungen wird, das Tracen fortgesetzt oder ausgeschaltet wird.
  1778.        Gleichzeitig wird auch ein Cacheeintrag erzeugt. Es wird nicht ge-
  1779.        traced wenn flock gesetzt ist oder wenn die Interruptmaske 7 ist.
  1780.        Traps werden getraced.
  1781.      - Trace - wie Trace +, nur dass kein Cacheeintrag erzeugt wird
  1782.        (schneller).
  1783.      - Trace * wie Trace +, nur das IMMER getraced wird (ausser während
  1784.        einer Exception). Lesen Sie diesbezüglich auch Kapitel 5.
  1785.  
  1786.  
  1787.      4.7.50. WARM
  1788.  
  1789.      Syntax: Warm
  1790.  
  1791.      Führt einen Warmstart aus. Der Debugger kann noch über die Doppelseite
  1792.      gerettet werden.
  1793.  
  1794.  
  1795.      4.7.51. WRITESECTOR
  1796.  
  1797.      Syntax: WRitesector [Track][,Sector][,Side][,Address][,Drive]
  1798.  
  1799.      Schreibt einen Sektor mittels XBIOS 9.
  1800.      Defaultmässig sind eingestellt: Track=0, Sektor=1, Seite=0, Adresse-
  1801.      =ein vom Debugger zur Verfügung gestellter Puffer (1024 Bytes lang),
  1802.      Laufwerk=0.
  1803.      Wenn Sie andere Parameter angeben, werden diese beim nächsten Write-
  1804.      sector wieder benutzt. Writesector benutzt natürlich die gleichen Wer-
  1805.      te wie Readsector.
  1806.  
  1807.      Beispiele:
  1808.      $00237322>w
  1809.       schreibt den Bootsektor von Laufwerk A aus dem internen Puffer
  1810.      $00237322>w ,,,600,1
  1811.       schreibt den Bootsektor von Laufwerk B aus Adresse 600
  1812.  
  1813.  
  1814.      4.7.52. XBRA
  1815.  
  1816.      Syntax: Xbra [FirstVector][,LastVector][,ID]
  1817.  
  1818.      Dieser Befehl sucht im Bereich zwischen "FirstVector" und "LastVector"
  1819.      nach Vektoren und gibt deren XBRA-Verkettungen aus. "FirstVector" ist
  1820.      defaultmässig $8, "LastVector" $1000, falls kein "FirstVector" angege-
  1821.      ben wird, andernfalls wird "LastVector" als Default auf den Wert
  1822.      "FirstVector" gesetzt. Alles klar? :-)
  1823.      "X 10" sucht also im Bereich zwischen $10 und $10, "X ,20" im Bereich
  1824.      zwischen $8 und $20 und "X" im Bereich zwischen $8 und $1000.
  1825.      Der Debugger inkrementiert bei der Suche nach Vektoren normalerweise
  1826.      in Viererschritten, erkennt aber selber, wenn Einer-, Zweier- oder
  1827.      Dreierschritte notwendig sind (siehe Beispiele).
  1828.      Endlosschleifen und Zeiger auf sich selber werden erkannt.
  1829.      Wird ID angegeben, dann werden nur Verkettungen angezeigt, in denen
  1830.      diese XBRA-ID vorkommt. Diese wird dann mit einem Pfeil (⇦) markiert.
  1831.      Die Routine des Debuggers wird mit einem Asterix (*) markiert.
  1832.      Falls das VBR (VectorBaseRegister) ungleich Null ist, wird eine War-
  1833.      nung ausgegeben. Die XBRA Liste wird aber grundsätzlich immer von der
  1834.      angegebenen Adresse ausgegeben, d.h. x 84 wird nicht automatisch zu x
  1835.      ^vbr+84.
  1836.      Wenn Sie den Befehl ohne jegliche Parameter aufrufen werden keine
  1837.      XBRA-Verkettungen angezeigt, sondern eine sortierte Liste aller
  1838.      gefundenen ID's mit einer Liste der Vektoren, in denen diese ID
  1839.      gefunden wird. Gesucht wird zwischen $8 und $1000.
  1840.      
  1841.  
  1842.      Beispiele:
  1843.  
  1844.      $00248206>x 81,88
  1845.       XBRA links for $00000081:
  1846.       $84BA001C without XBRA
  1847.  
  1848.       XBRA links for $00000084:
  1849.       $001C7FCA "PBUG" points to $002109AA*
  1850.       $002109AA "BUG1" points to $00046316
  1851.       $00046316 "Cham" points to $00020ABA
  1852.       $00020ABA "MSPO" points to $0001CC08
  1853.       $0001CC08 "OFLS" points to $000141A6
  1854.       $000141A6 "NVDI" points to $0024E970
  1855.       $0024E970 without XBRA
  1856.  
  1857.       XBRA links for $00000088:
  1858.       $001C804A "PBUG" points to $001C8074*
  1859.       $001C8074 "PBUG" points to $00210C40*
  1860.       $00210C40 "BUG1" points to $00045D2C
  1861.       $00045D2C "Cham" points to $0001008E
  1862.       $0001008E "NVDI" points to $00021E06
  1863.       $00021E06 "LTMF" points to $00029990
  1864.       $00029990 "SLCT" points to $00260770
  1865.       $00260770 without XBRA
  1866.  
  1867.      $00123456>x 0,100,'LTMF'
  1868.       XBRA links for $00000088:
  1869.       $0102EC14 "LTMF" points to $010374B4⇦
  1870.       $010374B4 "SLCT" points to $0101D00E
  1871.       $0101D00E without XBRA
  1872.  
  1873.       XBRA links for $000000B4:
  1874.       $0102EF62 "LTMF" points to $0101094C⇦
  1875.       $0101094C "OFLS" points to $0002C904
  1876.       $0002C904 "PBUG" points to $01007684
  1877.       $01007684 "NVDI" points to $00E00DA2
  1878.       $00E00DA2 without XBRA
  1879.  
  1880.  
  1881.      4.7.53. ?
  1882.  
  1883.      Syntax: ? Term{,Term}
  1884.  
  1885.      Gibt den Wert von Term in allen Zahlensystemen (Hexadezimal, Dezimal,
  1886.      Binär, Oktal) und als String aus. Die Werte werden auf ihre kürzeste
  1887.      Form gekürzt, d.h. Nullen am Anfang werden weggelassen. Wenn der Wert
  1888.      negativ ist wird zusätzlich der negative Wert im Hexadezimal und De-
  1889.      zimalsystem ausgegeben.
  1890.  
  1891.      Beispiele:
  1892.      $000203B6>?-1
  1893.       $FFFFFFFF .4294967295 %11111111111111111111111111111111 o37777777777
  1894.       "...." -$1 -.1
  1895.      $000203B6>?"PBUG"
  1896.       $50425547 .1346524487 %1010000010000100101010101000111 o12020452507
  1897.       "PBUG"
  1898.  
  1899.  
  1900.      4.7.54. /
  1901.  
  1902.      Syntax: / [.b|.w|.a|.l] [Term]{,Term} - default word
  1903.  
  1904.      / gehört zu >DISASSEMBLE und schreibt die Terme an die aktuelle Zeile-
  1905.      nadresse. Term ist aufgebaut wie beim Befehl >FIND. Wenn Sie dem / ein
  1906.      .X anhängen, dann werden alle Terme entweder auf diese Länge erweitert
  1907.      oder abgeschnitten, wobei .b = byte, .w = word, .a = 3 Bytes, .l =
  1908.      long ist. Defaultmässig ist ein .w eingestellt. Wenn Sie dies stört,
  1909.      benutzen Sie anstatt / den Befehl ,.
  1910.  
  1911.      Beispiele:
  1912.      $000203B6>/ 4E75,1234.a
  1913.       schreibt an die Adresse $203B6 den Wert 4E75,1234 (4 Bytes)
  1914.      $000203B6>/.a 4E75,12345678
  1915.       schreibt an die Adresse $203B6 den Wert 004E75,345678 (6 Bytes)
  1916.      $000203B6>/.l 4E75,1234.a
  1917.       schreibt an die Adresse $203B6 den Wert 00004E75,00001234 (8 Bytes)
  1918.  
  1919.  
  1920.      4.7.55. !
  1921.  
  1922.      Syntax: ! Opcode
  1923.  
  1924.      ! gehört zu >LIST und assembliert den Befehl der ! folgt und schreibt
  1925.      ihn an die aktuelle Zeilenadresse. Der Assembler arbeitet symbolisch
  1926.      und übersetzt alle MC680x0 Befehle mit erweiterten Adressierungsarten.
  1927.  
  1928.      Ein Basedisplacement kann nur in der offiziellen Motorolasyntax einge-
  1929.      geben werden. Ein -1(SP) muss also als (-1,SP) eingegeben werden.
  1930.  
  1931.      Wie üblich ist die Eingabe sehr fehlertolerant, so wird z.B.
  1932.      "adda ( [- 1 0z sp d0 . l * 8-1.lsp       *clr" als
  1933.      "ADDA.W   ([$FFF0,ZA7,D0.L*8],-1),A7"
  1934.      oder
  1935.      "clr ([10za1sp-1" als
  1936.      "CLR.W    ([$10,ZA1,A7.W],-1)" übersetzt
  1937.  
  1938.      Ein Befehl wird optimal codiert, d.h. Displacements werden so kurz als
  1939.      möglich gewählt, ebenso Sprünge ohne Längenvorgabe. Sie können der
  1940.      Flexibilität zuliebe aber auch die Länge der Displacements wählen. Ein
  1941.      clr ([-1,a0],10) wird vier Bytes kürzer codiert als ein clr ([-
  1942.      1.l,a0],10.l).
  1943.  
  1944.      Beachten Sie, dass der Assembler gleichzeitig mit vorzeichenbehafteten
  1945.      und vorzeichenlosen Zahlen arbeitet. Im Positiven wird mit vorzeichen-
  1946.      losen, im Negativen mit vorzeichenbehafteten Zahlen gearbeit (Zahlen-
  1947.      theoretiker mögen mir dies verzeihen). Eine Zahl umfasst so den Be-
  1948.      reich -2147483648 bis 4294967295 oder -32768 bis 65535 oder -128 bis
  1949.      255, je nachdem ob es sich um ein Long, ein Word oder ein Byte han-
  1950.      delt.
  1951.  
  1952.  
  1953.      4.7.56. ,
  1954.  
  1955.      Syntax: , [.b|.w|.a|.l] [Term]{,Term} - no default
  1956.  
  1957.      , gehört zu >DUMP und schreibt die Terme an die aktuelle Zeilenadres-
  1958.      se. Term ist aufgebaut wie beim Befehl >FIND. Wenn Sie dem / ein .x
  1959.      anhängen, dann werden alle Terme entweder auf diese Länge erweitert
  1960.      oder abgeschnitten, wobei .b = byte, .w = word, .a = 3 Bytes, .l =
  1961.      long ist. Wenn die Längenangabe fehlt, wird jeder Term in der Länge
  1962.      geschrieben, wie Sie ihn eingegeben haben (im Gegensatz zu /).
  1963.  
  1964.      Beispiele:
  1965.      $000203B6>, 4E75,1234.a
  1966.       schreibt an die Adresse $203B6 den Wert 4E75,001234 (5 Bytes)
  1967.      $000203B6>,.a 4E75,12345678
  1968.       schreibt an die Adresse $203B6 den Wert 004E75,345678 (6 Bytes)
  1969.      $000203B6>,.l 4E75,1234.a
  1970.       schreibt an die Adresse $203B6 den Wert 00004E75,00001234 (8 Bytes)
  1971.  
  1972.  
  1973.      4.7.57. )
  1974.  
  1975.      Syntax: ) String
  1976.  
  1977.      Gehört zu >ASCII und schreibt den folgenden String an die aktuelle
  1978.      Zeilenadresse. Der String muss keine bestimmte Länge haben, nur muss
  1979.      er mit einem " oder ' abgeschlossen sein.
  1980.  
  1981.  
  1982.      4.7.58. :
  1983.  
  1984.      Syntax: : Address[,Term]{,Term}
  1985.  
  1986.      : schreibt die Terme an die angegebene Adresse. Dieser Befehl wurde
  1987.      vorallen aus nostalgischen Gründen implementiert (Templmon)
  1988.  
  1989.      Beispiele:
  1990.      $000203B6>:,4E75,1234.a
  1991.       schreibt an die Adresse $203B6 den Wert 4E75,0012,34
  1992.      $000203B6>:,.a 4E75,12345678
  1993.       schreibt an die Adresse $203B6 den Wert 004E,7534,5678
  1994.      $000203B6>: 600,"This is a Teststring"
  1995.       schreibt an die Adresse $600 den obigen String
  1996.  
  1997.  
  1998.  
  1999.  
  2000.  
  2001.  
  2002.  
  2003.  
  2004.      5. Trace, Breakpoints und dergleichen
  2005.      -------------------------------------
  2006.  
  2007.  
  2008.  
  2009.      Ein an sich simples Unterfangen ist auf Motorolaprozessoren das Tracen
  2010.      von Programmen, d.h. das schrittweise Ausführen von Befehlen auf Ma-
  2011.      schinenebene.
  2012.      Ganz so einfach ist die Sache aber dennoch nicht, denn es sollte nicht
  2013.      getraced werden wenn (dies sind natürlich Atarispezifische Einschrän-
  2014.      kungen):
  2015.      1. flock gesetzt ist
  2016.      2. Die Interruptmaske 7 ist
  2017.  
  2018.      Die Befehle >Trace + und Trace - tragen dem Rechnung, indem Sie den
  2019.      Tracemodus gegebenenfalls abschalten.
  2020.      Nun gibt es Momente, wo gerade in einer kritischen Routine ein Fehler
  2021.      zu suchen ist und deshalb immer getraced werden muss. Auch gibt es
  2022.      leider TOS-Versionen, die scheinbar das Statusregister nicht mehr re-
  2023.      staurieren und den Tracemodus so für immer ausschalten. Mit Templmon
  2024.      ist es z.B. unter TOS 3.06 nicht mehr möglich mittels t+, g, a den
  2025.      Rechner zu tracen, ebensowenig funktioniert dies mit PEACEBUG und
  2026.      t+/-.
  2027.      Trace * nimmt auf obige Bedingungen keine Rücksicht und traced rück-
  2028.      sichtslos weiter. Dies führt aber meistens schon nach kurzer Zeit zum
  2029.      Absturz. Welche Methode Sie verwenden, müssen Sie ausprobieren, da
  2030.      dies sehr stark von der benutzten TOS-Version abhängt.
  2031.  
  2032.      Der Tracemodus kann aber auch noch in anderen Situationen eingeschal-
  2033.      tet werden, nämlich dann, wenn Sie einen Rombreakpoint setzen.
  2034.      Damit ein Breakpoint im Rom funktioniert, wird IMMER getraced (auuser
  2035.      in Exceptions), d.h. ohne Rücksicht auf Verluste. Sie sollten also
  2036.      sehr vorsichtig damit umgehen.
  2037.  
  2038.      Im folgenden einige Erläuterungen zu den einzelnen Tracefunktionen.
  2039.      Wann welche Funktion den Trace wie benutzt usw.:
  2040.      - Trace F1: Es wird nur für einen einzigen Befehl der Tracemodus akti-
  2041.        viert (ohne Rücksicht auf die oben erwähnten Bedingungen, dies ist
  2042.        aber ungefährlich). Wenn es sich um einen Trapv, ein Trap 0-15 oder
  2043.        ein Linea handelt, die PEACEBUG als einzelne Befehle betrachtet,
  2044.        wird der Tracemodus nicht benutzt. Im Gegensatz zu Bugaboo muss sich
  2045.        PEACEBUG um diese Funktion zu implementieren, nicht in den entspre-
  2046.        chenden Exceptionvektor einhängen.
  2047.      - Do PC F2: Es wird der Tracemodus aktiviert, wenn sich der Befehl im
  2048.        ROM befindet. Um die Abbruchbedingung nicht zu "verpassen" wird
  2049.        immer getraced, dies ist allerdings meist ungefährlich. Ist der
  2050.        aktuelle Befehl ein bsr oder ein jsr dann wird kein Breakpoint
  2051.        gesetzt, dafür der Tracemodus für die Dauer eines Befehls aktiviert.
  2052.      - Tracerts F3: Es wird kein Trace benutzt.
  2053.      - Texcept F4: Ebenfalls ohne Trace realisiert, PEACEBUG muss sich auch
  2054.        nicht in den Vektor hängen, um diese Funktion zu realisieren.
  2055.      - Tr68020 F11: Entspricht Trace F1, was das Tracen anbelangt.
  2056.      - Tnosubs F12: Entspricht Do PC F2, wenn der PC auf ein BSR/JSR zeigt,
  2057.        sonst dem normalen Trace F1.
  2058.      - Tracerte F13: Es wird kein Trace benutzt.
  2059.      - GoTraps F14: Es wird kein Trace benutzt. Der Debugger muss sich auch
  2060.        nicht in die entsprechenden Vektoren einhängen. Mit anderen Worten:
  2061.        es funktioniert einfach immer.
  2062.      - Breakpoints im Rom: Alle Breakpoints im Rom benutzen den Tracemodus.
  2063.        Da immer getraced wird, ist dies gefährlich.
  2064.      - Breakpoints im Ram: Zähler- und Stopbreakpoints schalten den Trace
  2065.        für die Dauer eines Befehls an.
  2066.  
  2067.  
  2068.  
  2069.  
  2070.  
  2071.  
  2072.  
  2073.  
  2074.      6. Cache
  2075.      --------
  2076.  
  2077.  
  2078.  
  2079.      Ähnlich wie Bugaboo besitzt PEACEBUG Befehlscache...s, hier schon der
  2080.      erste Unterschied, PEACEBUG verfügt nicht über einen sondern über de-
  2081.      ren zwei voneinander völlig unabhängige Caches.
  2082.      Bei jedem Trace werden die aktuellen Register (siehe unten) in einem
  2083.      Cache gespeichert. Die Anzahl Cacheeinträge ist defaultmässig 20 für
  2084.      den ersten und 5 für den zweiten Cache. Diese Werte können entweder
  2085.      direkt im Programmcode oder während der Laufzeit verändert werden. In
  2086.      den Caches kann 'geblättert' werden, d.h. Sie können sich anschauen,
  2087.      was bisher getraced wurde, wobei in der dritten Zeile angezeigt wird,
  2088.      welchen Cacheeintrag Sie sich gerade ansehen.
  2089.      Hier nun ein entscheidender Unterschied zum Bugaboocache: die aktuel-
  2090.      len Register sind IMMER gerade die, die sich im sichtbaren Cacheein-
  2091.      trag befinden, d.h. wenn Sie zurückblättern, so verändern Sie gleich-
  2092.      zeitig auch die aktuellen Register, wie Sie beim Verlassen des Debug-
  2093.      gers zurückgeschrieben werden. Wenn Sie also an der gleichen Stelle
  2094.      weiterfahren wollen, wie beim Einsprung, müssen Sie sich beim ersten
  2095.      Cacheeintrag befinden (gezählt wird 0,1,2,...). Damit entfallen um-
  2096.      ständliche Befehle wie Cacheget bei Bugaboo, das Arbeiten mit den Ca-
  2097.      ches geht so viel schneller vonstatten, kann aber auch gefährlich
  2098.      sein, da man leicht vergisst, den Cache zurückzusetzen.
  2099.      Wenn Sie Register editieren, verändern Sie gleichzeitig auch den ak-
  2100.      tuellen Cacheeintrag, so können Sie ein Programmstück leicht zweimal
  2101.      mit unterschiedlichn Registerwerten durchlaufen, einfach zurückscrol-
  2102.      len, Register ändern, nochmals tracen.
  2103.  
  2104.      Doch wozu nun zwei Caches?
  2105.      Der zweite Cache ermöglicht es Ihnen mal schnell was auszuprobieren,
  2106.      ohne Gefahr zu laufen, die alten Registerinhalte zu verlieren, ein
  2107.      wenig vergleichbar also mit den Funktionen rs und rr von Templmon.
  2108.      z.B. haben Sie an der Adresse xy eine Doppelseite entdeckt, die Ihnen
  2109.      verdächtig vorkommt:
  2110.      - Alternate Shift Insert (Cache wechseln mit Registercopy)
  2111.      - PC auf Doppelseite setzen
  2112.      - Tracen
  2113.      - Alternate Insert (Cache wechseln ohne Registercopy)
  2114.      Da die beiden Caches absolut identisch sind, ist es egal auf welchem
  2115.      Sie debuggen, hauptsache Sie verlassen den Debugger mit den richtigen
  2116.      Registerwerten.
  2117.  
  2118.      Der Cache ist als Ring organisiert und kann daher leicht erweitert
  2119.      werden. Ein einzelner Eintrag umfasst in der vorliegenden Version 270
  2120.      Bytes und ist die folgt aufgebaut (folgende Struktur nur zur Informa-
  2121.      tion):
  2122.  
  2123.      double FPn[8]             ; FP Register (96 Bit lang)
  2124.      long   FPSR               ; FP Status Register
  2125.      long   FPIAR              ; FP Instruction Address Register
  2126.      long   FPCR               ; FP Control Register
  2127.      word   TC_40              ; Translation Control Register
  2128.      long   URP                ; User Root Pointer Register
  2129.      long   DTT1               ; Data Transparent
  2130.      long   DTT0               ; Translation Register 0/1
  2131.      long   ITT1               ; Instruction Transparent
  2132.      long   ITT0               ; Translation Register 0/1
  2133.      long   TC_30              ; Translation Control Register
  2134.      long   TT1                ; Transparent Translation
  2135.      long   TT0                ; Register 0/1
  2136.      dlong  CRP                ; CPU Root Pointer Register (64 Bit Wert!)
  2137.      word   MMUSR              ; MMU Status Register
  2138.      dlong  SRP                ; Supervisor Root Pointer (40er nur 32 Bit)
  2139.      long   MSP                ; Master Stack Pointer
  2140.      long   CACR               ; Cache Control Register
  2141.      long   CAAR               ; Cache Adress Register
  2142.      long   VBR                ; Vektor Base Register
  2143.      long   DFC                ; Destination Function Code
  2144.      long   SFC                ; Source Function Code
  2145.      long   USP                ; User Stack Pointer
  2146.      long   SSP                ; Supervisor Stackpointer
  2147.      long   PC                 ; Program Counter
  2148.      word   STATUS             ; Status Register
  2149.      long   Dn[8]              ; D0-D7
  2150.      long   An[8]              ; A0-A6
  2151.      void   *NEXT_RECORD       ; Zeiger auf den nächsten Eintrag
  2152.      void   *PREVIOUS_RECORD   ; Zeiger auf den vorherigen Eintrag
  2153.  
  2154.      ACHTUNG: beim Einsprung in den Debugger wird der aktuelle Supervisor-
  2155.      stack temporär benutzt, d.h. es werden Werte auf diesem Stack über-
  2156.      schrieben! Wenn Sie ein im Supervisormodus laufendes Programm tracen,
  2157.      können darum Befehle wie rts nicht mehr wiederholt werden, weil die
  2158.      Rücksprungadresse, die auf dem Stack lag, vermutlich überschrieben
  2159.      wurde. Das Gleiche gilt für alle Befehle, die Werte vom Stack lesen.
  2160.  
  2161.  
  2162.  
  2163.  
  2164.  
  2165.  
  2166.  
  2167.  
  2168.      7. Symbole
  2169.      ----------
  2170.  
  2171.  
  2172.  
  2173.      7.1. PEACEBUG.SYM
  2174.      -----------------
  2175.  
  2176.  
  2177.      Bei Programmstart wird die Datei PEACE*.SYM geladen, falls Sie sich im
  2178.      gleichen Verzeichnis befindet, wie der Debugger. Diese Datei enthält
  2179.      symbolische Konstanten, die beim Disassemblieren, Assemblieren und vom
  2180.      Formelinterpreter benutzt werden.
  2181.      Die bis anhin unterstützten Formate wurden ersatzlos gestrichen und
  2182.      durch ein neues Format ersetzt. Dieses Format enthält die Wertzuwei-
  2183.      sungen in ASCII-Form und kann deshalb mit jedem Editor verändert wer-
  2184.      den. Es gelten folgende Regeln:
  2185.      - Leerzeichen werden immer ignoriert, egal wo sie sich befinden
  2186.      - Zeilen müssen mit CR/LF abgeschlossen sein
  2187.      - Die Datei darf keine Nullbytes enthalten
  2188.      - Kommentarzeilen beginnen mit einem *
  2189.      - eine Wertzuweisung hat folgende Form: SYMBOLNAME=WERT
  2190.      - Die Symbolnamen können bis zu 32767 Zeichen lang sein (das dürfte
  2191.        genügen, oder?)
  2192.      - Wert ist ein beliebiger Ausdruck, wie er vom Formelinterpreter des
  2193.        Debuggers verarbeitet wird, also z.B. pw(p4f2+2) (=os_version). Es
  2194.        ist allerdings sinnlos, Register oder Symbole darin zu verwenden, da
  2195.        diese noch keinen definierten Wert haben (die erzeugten Symbole sind
  2196.        Konstanten!).
  2197.  
  2198.      Die angelegte Symboltabelle arbeitet mit variablen Symbollängen und
  2199.      braucht deshalb ein Minimum an Speicher.
  2200.  
  2201.  
  2202.  
  2203.      7.2. Lexecute
  2204.      -------------
  2205.  
  2206.  
  2207.      Wird ein Programm mittels Lexecute geladen und ist an dieses eine Sym-
  2208.      boltabelle im GST-/DRI-Format angehängt, wird diese mitgeladen. Der
  2209.      Debugger löscht dabei alle Konstanten, weil diese beim Disassemblieren
  2210.      stören. Korrekterweise müsste man diese mitladen und beim Disassemb-
  2211.      lieren zwischen Symbolen im TEXT-/DATA-/BSS-Segment und Konstanten
  2212.      unterscheiden. Dies ist aber sehr aufwendig und meines Wissens tut
  2213.      dies auch kein Debugger. Die Symbole werden ins gleiche Format gewan-
  2214.      delt, wie die Konstanten (PEACE*.SYM). Die Symboltablle des Debuggers
  2215.      z.B. belegt so nur durchschnittlich 19 Bytes pro Symbol (32 bei
  2216.      Bugaboo...).
  2217.  
  2218.  
  2219.  
  2220.      7.3. Resident Symbol Driver
  2221.      ---------------------------
  2222.  
  2223.  
  2224.      Der Resident Symbol Driver (RSD) ist ein Programm von Robert Federle,
  2225.      das Symboltabellen von Programmen anlegen kann, die gestartet werden.
  2226.      Diese Symboltabellen werden über eine Cookieschnittstelle zur Verfü-
  2227.      gung gestellt. Es ist also so möglich, vom Desktop ein Programm zu
  2228.      starten, das eine Symboltabelle enthält, den Debugger aufzurufen (der
  2229.      resident istalliert ist) und die Symbole des Programms zu benutzen.
  2230.      Falls dieser Treiber installiert ist, benützt PEACEBUG zusätzlich zu
  2231.      den eigenen Tabellen, diejenigen des Treibers. Da dieser die Symbol-
  2232.      suche nicht exakt gleich vornimmt wie der Debugger, kann der Output
  2233.      dann leicht anders aussehen (z.B. hat es mehr Symbole). Ein Problem
  2234.      ergab sich beim Parser: derjenige des Debuggers ist ziemlich flexibel,
  2235.      als Folge aber nicht nach Lehrbuch programmiert. Er zerlegt die Ein-
  2236.      gaben nicht von Anfang in Tokens, sondern bearbeitet immer alles zu-
  2237.      sammen, so dass z.B. "l .flock+1" nach dem Symbol .flock+1 sucht, was
  2238.      beim Debugger funktioniert, beim RSD aber nicht. Dies ist kein Fehler
  2239.      eines der Programme, sondern ein konzeptioneller Unterschied.
  2240.      
  2241.      Aber damit hat es sich noch nicht. Der Befehl >Programs gibt eine
  2242.      Liste aller gestarteten Programme aus, die sich der Debugger vom
  2243.      Symboltreiber holt. Darüberhinaus fügt der Debugger bei der Ausgabe
  2244.      im Listmodus den Namen des Programms ein, das zur ausgegebenen Adresse
  2245.      passt:
  2246.        $01057536>! [GEMRAM]   RTS                                    ; 4E75
  2247.  
  2248.      Tip 1: Angenommen Sie wollen Ihr Programm debuggen, das aus mehreren
  2249.      Modulen besteht, die vom Programm nachgeladen werden (Programme wie
  2250.      Xcontrol oder diverse Bildschirmschoner). Um im Debugger zu erkennen
  2251.      welches Modul gerade dran ist, fügen Sie die Symboltabelle in die vom
  2252.      RSD verwaltete Liste ein (dazu lesen Sie das Readme des RSD), und er-
  2253.      kennen von nun an immer, wo sie gerade debuggen.
  2254.  
  2255.      Tip 2: Benutzen Sie PEACEBUG.SYM anstatt SYMBOL.SMB (das ist die
  2256.      Konstantentabelle des RSD), es sei denn sie benutzen noch andere Pro-
  2257.      gramme, die den RSD unterstützen. Grund: schnellerer Zugriff auf die
  2258.      Symbole, Unabhängigkeit des Debuggers, Parsing.
  2259.  
  2260.  
  2261.  
  2262.  
  2263.  
  2264.  
  2265.  
  2266.  
  2267.      8. Reset fest, Reset resident
  2268.      -----------------------------
  2269.  
  2270.  
  2271.  
  2272.      Folgende Dinge passieren im Falle eines Warmstarts (gekürzt):
  2273.      1. SSP und PC setzen, >Reset<
  2274.      2. Diagnose Cartridge ausführen, falls vorhanden
  2275.      3. Routinen im Resetvektor ($42A) ausführen
  2276.      4. Hardwareinitialisierung
  2277.      5. Systemvariablen setzen, Interrupts initialisieren, Bios initiali-
  2278.         sieren
  2279.      6. Bildschirm initialisieren
  2280.      7. Diskette booten
  2281.      8. Harddisk booten
  2282.      9. Doppelseiten ausführen (undokumentiert)
  2283.      10. COMMAND.PRG starten wenn _cmdload nicht 0 ist
  2284.      11. Autoordnerprogramme ausführen
  2285.      12. AES und Desktop starten
  2286.  
  2287.  
  2288.      PEACEBUG setzt an zwei Stellen an, um zu "überleben":
  2289.  
  2290.      1. Resetfestigkeit. Er installiert sich im Resetvektor.
  2291.         Um einen Reset mittels der Resettaste zu überleben muss der Debug-
  2292.         ger nur gerade Punkt 4 übernehmen. Dies funktioniert allerdings
  2293.         nur, wenn Sie sich im Debugger befinden, andernfalls geht leider
  2294.         der PC verloren und das Programm kann nicht fortgeführt werden.
  2295.         Falls ein Reset ausserhalb des Debuggers stattfindet, wird der
  2296.         Debugger nur angesprungen, falls er entsprechend konfiguriert wurde
  2297.         (>Schnittstelle), der PC zeigt dann auf die Stelle des Bootcodes,
  2298.         die die Routinen im Resetvektor ausführt.
  2299.         Die Resetfestigkeit von PEACEBUG ist vorallem dann sehr nützlich,
  2300.         wenn sich die Hardware "aufgehängt" hat, normalerweise läuft dann
  2301.         nichts mehr, mittels eines Resets kann PEACEBUG aber meist wieder-
  2302.         belebt werden.
  2303.  
  2304.      2. Resetresidenz. Er installiert eine Doppelseite.
  2305.         Normalerweise wird der Debugger bei einem Warmstart terminiert.
  2306.         Dies können Sie verhindern indem Sie beim Booten >Shift links<
  2307.         gedrückt halten. Der Debugger bleibt dann resident und wird noch
  2308.         vor dem ersten Autoordnerprogramm installiert. Ein als Autoordner-
  2309.         programm gestarteter PEACEBUG erkennt die residente Version und
  2310.         wird nicht nochmals installiert. Wenn Sie sich für den Bootvorgang
  2311.         interessieren und diesen debuggen wollen, drücken Sie zusätzlich
  2312.         >Shift rechts<, der Debugger wird dann unmittelbar nach dem Instal-
  2313.         lieren angesprungen und der PC zeigt auf die Routine, die die Dop-
  2314.         pelseiten sucht.
  2315.         Achtung: das von PEACEBUG benutzte System lässt nicht zu, dass sich
  2316.         ausser dem Debugger selber noch ein zweites resetresidentes Pro-
  2317.         gramm installiert, das gilt auch, wenn Sie PEACEBUG mehrmals in-
  2318.         stalliert haben, nur eine Version wird überleben.
  2319.         Das im Profibuch vorgeschlagene System verbietet sich von selbst,
  2320.         denn was geschieht, wenn Atari sich entschliesst den Bereich von
  2321.         $600-$700 zu benutzen, wie es beim Bereich $700-$800 geschah?
  2322.         Hier ein kurzer Abriss, was alles vonnöten ist, um Resetresidenz zu
  2323.         erreichen:
  2324.         - Speicher reservieren im ST-Ram, da nur dieses nach Doppelseiten
  2325.           durchsucht wird.
  2326.         - Anlegen der Doppelseite im reservierten Speicherbereich.
  2327.         - Bei einem Warmstart werden alle allozieren Speicherbereiche frei-
  2328.           gegeben (aber nicht gelöscht, im Profibuch ist dies fehlerhaft
  2329.           beschrieben). Es muss deshalb neuer Speicher reserviert, der De-
  2330.           bugger in diesen Bereich kopiert und reloziert werden. Die
  2331.           Kopier- und Relozierroutine wird auf den Stack ausgelagert.
  2332.         - Leider geht bei obigem Vorgang die Symboltabelle verloren, sie
  2333.           muss nachgeladen werden.
  2334.         Obige Vorgänge erfordern einigen selbstmodifizierenden Code,
  2335.         selbstverständlich werden dabei eventuell vorhandene Prozessor-
  2336.         caches gelöscht (MC68020/30/40).
  2337.  
  2338.      Es wird sowohl in der Doppelseite als auch in der Resetroutine ge-
  2339.      prüft, ob der Debugger beschädigt wurde. Ist dies der Fall, werden Sie
  2340.      dezent darauf aufmerksam gemacht.
  2341.  
  2342.      Für diejenigen, die sich für den Bootvorgang interessieren hier einige
  2343.      Tips. Die Angaben sind allerdings je nach TOS Version leicht verschie-
  2344.      den, ganz alte Versionen dürften ein anderes Vorgehen haben:
  2345.      Beim Einsprung zeigt der PC auf die Routine, die die Doppelseiten
  2346.      sucht, wobei die Adresse, an der gesucht wird, vom Debugger auf $600
  2347.      gesetzt wird, um zu vermeiden, dass andere Doppelseiten ausgeführt
  2348.      werden. Dies wäre gefährlich, da sich der Debugger eventuell im Spei-
  2349.      cher verschiebt und so andere residente Programme beschädigen könnte.
  2350.      Nach dieser Routine wird _cmdload getestet und gegebenenfalls verz-
  2351.      weigt. COMMAND.PRG wird gleich nach allen Autoordnerprogrammen gestar-
  2352.      tet. Diese werden nun wie folgt ausgeführt:
  2353.      1. Mittels PEXEC 5 (Create Basepage) legt das OS eine Basepage an,
  2354.         schreibt die Adresse einer Routine in die Basepage (Offset 8) und
  2355.         führt dann ein PEXEC 4 (Just Go) aus. Dieses PEXEC können Sie nicht
  2356.         einfach so übertracen, weil die aufgerufene Routine direkt zurück-
  2357.         springt (der Stack wird neu gesetzt). Sie müssen also entweder den
  2358.         Trap durchtracen oder ein Breakpoint setzen (funktioniert auch im
  2359.         ROM problemlos).
  2360.      2. Die gestartete Routine geht in den Supervisormodus, setzt die DTA
  2361.         und sucht dann mittels FSFIRST/FSNEXT die Autoordnerprogramme.
  2362.      3. Die Programme werden mittels PEXEC 0 (Load and GO) gestartet.
  2363.         Nun wird _sysbase gesetzt, ein Environmentstring erzeugt (PATH=...)
  2364.         und mittels PEXEC 5, PEXEC 4 die Routine in exec_os ausgeführt,
  2365.         normalerweise AES und Desktop.
  2366.  
  2367.  
  2368.  
  2369.  
  2370.  
  2371.  
  2372.  
  2373.  
  2374.      9. Vektoren
  2375.      -----------
  2376.  
  2377.  
  2378.      Die 48 Routinen, die PEACEBUG einhängen kann, bilden den Kern des Pro-
  2379.      gramms. Gerade hier muss daher grösstmögliche Flexibilität geboten
  2380.      werden. Bevor ich jedoch auf die Möglichkeiten von PEACEBUG diesbe-
  2381.      züglich eingehe, einige Erläuterungen zum Thema XBRA.
  2382.  
  2383.  
  2384.  
  2385.      9.1. XBRA
  2386.      ---------
  2387.  
  2388.  
  2389.      Jedes Programm, das sich in einen Vektor einhängt, sollte vor seiner
  2390.      Einsprungadresse folgende Struktur installieren:
  2391.  
  2392.      typedef struct
  2393.      {
  2394.           char xb_magic[4];    /* "XBRA" */
  2395.           char xb_id[4];       /* XBRA-ID des installierten Programms */
  2396.           long xb_oldvec;      /* Wert des Vektors vor dem Einhängen */
  2397.      } XBRA;
  2398.  
  2399.      oder in Assembler:
  2400.                    dc.l 'XBRA'
  2401.                    dc.l 'PBUG'
  2402.      ALTE_ROUTINE: dc.l $xxxxxxxx
  2403.      ROUTINE: ...
  2404.  
  2405.      Wenn sich alle Programme an obige Konvention halten, ist es für ein
  2406.      Programm ein leichtes, sich aus einem Vektor auszuhängen, ohne auch
  2407.      andere Routinen mitauszuhängen. Ebenfalls kann so festgestellt werden,
  2408.      ob man sich schon in den Vektor eingehängt hat. Ist auch nur ein ein-
  2409.      ziges Programm da, das kein XBRA benutzt, oder es falsch benutzt, so
  2410.      funktioniert dies nicht mehr. Leider gibt es immer noch Programmierer,
  2411.      die finden, da sie sich eh nicht aushängen wollen, brauchten sie auch
  2412.      kein XBRA zu benützen. In der Regel geht es aber nicht um das eigene
  2413.      Programm, sondern um fremde. Eines davon ist PEACEBUG.
  2414.  
  2415.      An dieser Stelle noch eine Bemerkung zu "resvector".
  2416.      Es ist trotz XBRA nicht möglich, sich sauber aus diesem Vektor auszu-
  2417.      hängen, da resvalid über XBRA nicht zugänglich ist und nicht bei allen
  2418.      in diesem Vektor hängenden Programmen zwingend $31415926 sein muss
  2419.      (insbesondere beim ersten Programm nicht, das sich einhängt). Meine
  2420.      Lösung ist simpel aber effektvoll: Jedes Programm testet vor dem zu-
  2421.      rückspringen ins TOS, ob noch ein anderes Programm im Vektor hängt.
  2422.      Wenn ja, wird resvalid mit dem magic beschrieben, andernfalls ge-
  2423.      löscht. Diese Methode erlaubt es Programmen, sich gefahrlos auszuhän-
  2424.      gen und sähe in etwa so aus:
  2425.  
  2426.                              DC.L 'XBRA'
  2427.                              DC.L _ID
  2428.      OLD_RESET:              DC.L 0
  2429.      RESET:          MOVE.W      SR,-(SP)
  2430.                      ORI.W       #$700,SR
  2431.                      MOVE.L      A0,-(SP)
  2432.                      MOVE.L      SP,SAVE_SP_RESET
  2433.                      MOVE.L      $08.w,SAVE_BUS_RESET
  2434.                      MOVE.L      $0C.w,SAVE_ADDRESS_RESET
  2435.                      MOVE.L      #_RESET,$08.w
  2436.                      MOVE.L      #_RESET,$0C.w
  2437.                      MOVE.L      #$31415926,RESVALID.w
  2438.                      MOVEA.L     OLD_RESET(PC),A0
  2439.                      MOVE.L      A0,RESVECTOR.w
  2440.                      CMPI.L      #'XBRA',-12(A0)
  2441.                      BEQ.S       ANOTHER_ONE
  2442.      _RESET:         CLR.L       RESVALID.w
  2443.      ANOTHER_ONE:    *here you go*
  2444.                      MOVE.L      SAVE_ADDRESS_RESET(PC),$0C.w
  2445.                      MOVE.L      SAVE_BUS_RESET(PC),$08.w
  2446.                      MOVEA.L     SAVE_SP_RESET(PC),SP
  2447.                      MOVEA.L     (SP)+,A0
  2448.                      MOVE.W      (SP)+,SR
  2449.                      JMP         (A6)
  2450.  
  2451.      SAVE_BUS_RESET:         DS.L 1
  2452.      SAVE_ADDRESS_RESET:     DS.L 1
  2453.      SAVE_SP_RESET:          DS.L 1
  2454.  
  2455.  
  2456.  
  2457.      9.2. Ein Wort regelt alles ...
  2458.      ------------------------------
  2459.  
  2460.  
  2461.      Bei jedem Einsprung in den Debugger, beim Aufruf einer Funktion über
  2462.      Return oder beim Drücken einer Funktionstaste wird die Routine >Vektor
  2463.      aufgerufen. Diese dient dazu, Exceptionroutinen einzuhängen, auszuhän-
  2464.      gen, an die erste Position zu hängen und dergleichen mehr.
  2465.      Jeder der 48 Routinen ist ein Word zugeordnet, das genau festlegt, wie
  2466.      diese Routine von >Vektor behandelt wird. Gleichzeitig dient dieses
  2467.      Wort dazu, festzulegen, was der Debugger bei Auftreten der entsprech-
  2468.      enden Exception tun darf/soll/muss.
  2469.      Das ganze ist so flexibel gehalten, dass Sie beinahe alles machen kön-
  2470.      nen. Beispielsweise können Sie PEACEBUG zweimal installieren (zwei
  2471.      identische aber verschieden konfigurierte Versionen) und den einen mit
  2472.      dem andern debuggen.
  2473.  
  2474.      Im folgenden wird beschrieben, wie dieses ominöse Wort codiert ist.
  2475.  
  2476.  
  2477.  
  2478.      9.3. Das höherwertige Byte
  2479.      --------------------------
  2480.  
  2481.  
  2482.      Das höherwertige Byte wird von >Vektor benutzt und kann folgende Werte
  2483.      annehmen:
  2484.      -2: Die Debuggeroutine wird gesucht und falls sie gefunden wird, aus-
  2485.          gehängt um dann an erster Stelle wieder eingehängt zu werden.
  2486.      -1: Die Debuggeroutine wird gesucht und falls sie gefunden wird, aus-
  2487.          gehängt um dann an erster Stelle wieder eingehängt zu werden. Wird
  2488.          sie nicht gefunden, wird sie neu installiert
  2489.      0: Die Debuggeroutine wird gesucht und falls sie gefunden wird, ausge-
  2490.         hängt.
  2491.      1: Die Debuggeroutine wird gesucht. Wird sie nicht gefunden, wird sie
  2492.         neu installiert
  2493.      2: Es passiert gar nichts
  2494.  
  2495.  
  2496.      Erläuterugen:
  2497.      1. Das Aushängen von Vektoren kann bei PEACEBUG gefährlich sein, da es
  2498.         jederzeit stattfinden kann. Geschieht dies gerade in dem Moment, wo
  2499.         der Debugger angesprungen werden soll, so wird die aufrufende Rou-
  2500.         tine eventuell zweimal angesprungen und welche Routine ist schon
  2501.         reentrant? Meine (lange...) Erfahrung mit dem Debugger hat aller-
  2502.         dings gezeigt, dass dieser Fall nie eintritt.
  2503.      2. Bei Programmstart werden alle Routinen eingehängt, es sei denn, das
  2504.         höherwertige Byte ist Null.
  2505.      3. -1 bei Routinen benutzen, die nicht weiterspringen und die vom De-
  2506.         bugger gebraucht werden: Illegal Opcode und Trace.
  2507.      4. -2 bei allen Routinen benutzen, bei denen es vorteilhaft ist, wenn
  2508.         Sie an erster Stelle im Vektor hängen: alle Exceptions, die Sie vom
  2509.         Debugger abfangen und anzeigen lassen wollen (Format Error, Priv-
  2510.         ileg Error, Ring Indicator ...)
  2511.      5. Weniger ist mehr!
  2512.         Je weniger Routinen Sie einhängen, desto weniger Unheil kann PEACE-
  2513.         BUG anrichten. Nicht benutzte Vektoren, wie PMMU Illegal oder
  2514.         Coproc. Protocol Viol. sollten Sie nicht einhängen.
  2515.      6. Zwei spezielle Vektoren sind AES und LINEF.
  2516.         Sie sollten erst eingehängt werden, wenn AES installiert ist. Wird
  2517.         der Debugger vom Desktop gestartet, kann dies sofort geschehen, bei
  2518.         Start aus dem Autoordner muss abgewartet werden, bis AES instal-
  2519.         liert ist. Dies merkt PEACEBUG selber, vorausgesetzt Sie lassen ihn
  2520.         sich in den Biostrap einhängen.
  2521.         PEACEBUG kann zweimal im Trap 2 hängen. Dies weil bei Initialisie-
  2522.         rung der AES der Vektor vom Betriebsystem überschrieben wird. VDI
  2523.         ist dabei die Routine, die als erste eingehängt wird.
  2524.      7. LINEF einzuhängen, macht nur bei Betriebsystemen Sinn, die auch
  2525.         Linef benutzen, also bei Versionen <=1.04, bei allen andern sollten
  2526.         Sie das Flag auf Null setzen. Tip: gerade Linef-Befehle mit DoPC
  2527.         übertracen, ungerade normal tracen (F1).
  2528.      8. Richtig zu Konfigurieren ist nicht einfach.
  2529.         Wenn Sie dort einen Fehler machen, dann stürzt der Rechner ab. Dies
  2530.         passiert genau dann, wenn Sie Ihren wichtigsten Quelltext abspei-
  2531.         chern wollen. Selbstverständlich wird dabei auch Ihr einziges
  2532.         Backup überschrieben...
  2533.  
  2534.  
  2535.  
  2536.      9.4. Das niederwertige Byte
  2537.      ---------------------------
  2538.  
  2539.  
  2540.      Das niederwertige Byte wird von der Routine selber benutzt und ist
  2541.      folgendermassen codiert:
  2542.      Bit 0: ist dieses Bit gesetzt, wird in den Debugger gesprungen und
  2543.             eine entsprechende Meldung ausgegeben.
  2544.      Bit 1: ist dieses Bit gesetzt, wird versucht die Exception zu korri-
  2545.             gieren, d.h. es wird auf dem nächsten Befehl weitergefahren.
  2546.             Bit 0 hat höhere Priorität als Bit 1.
  2547.      Sind beide Bits 0, wird in die Originalroutine verzweigt (d.h. dieje-
  2548.      nige die vorher im Vektor hing).
  2549.  
  2550.  
  2551.      Ein spezieller Fall ist eine Privilege Violation. Hier haben zwei wei-
  2552.      tere Bits eine Bedeutung:
  2553.      Auf einem 68000er gibt es den Befel move sr,<ea>, der auch im Usermo-
  2554.      dus erlaubt ist, ganz offensichtlich ein Designfehler. Dies hat Moto-
  2555.      rola erkannt und ab dem 68010 gibt es diesen Befehl im Usermodus nicht
  2556.      mehr. Dafür gibt es zusätzlich den Befehl move ccr,<ea>.
  2557.      Scheinbar gibt es Programme, die diesen Befehl im Usermodus benutzen
  2558.      und deshalb nur auf einem 68000er korrekt laufen. Pikanterweise gehört
  2559.      z.B. Atari's HDX zu diesen Übeltätern ...
  2560.      Bit 4: ist dieses Bit gesetzt und tritt bei einem move sr,<ea> eine
  2561.             Exception auf, wird der Befehl vom Exceptionhandler im Super-
  2562.             visormodus ausgeführt, das Programm merkt also nicht, das eine
  2563.             Exception auftrat.
  2564.             Das macht das TOS doch schon, werden Sie einwerfen!
  2565.             Mit dieser Behauptung liegen Sie zwar nicht ganz falsch, aber
  2566.             auch nicht völlig richtig.
  2567.             Korrekt ist, dass das TOS nur einige Befehle im Supervisormodus
  2568.             ausführen kann. Ein "move sr,([-1,za0,d0*8],-1)" kann das TOS
  2569.             nicht korrigieren, der Debugger hat auch damit keine Schwierig-
  2570.             keiten.
  2571.      Bit 5: ist dieses Bit gesetzt und tritt bei einem move sr,<ea> eine
  2572.             Exception auf, wird der Befehl durch den entsprechenden move
  2573.             ccr,<ea> ersetzt (im Code selber!, die Prozessorcaches werden
  2574.             dann entsprechend geflusht).
  2575.      Beide Bits haben höhere Priorität als Bit 0 und 1.
  2576.  
  2577.  
  2578.  
  2579.      9.5. Vektoren, in eigener Sache
  2580.      -------------------------------
  2581.  
  2582.  
  2583.      Einige  Routinen werden für eigene Zwecke missbraucht, die Gültigkeit
  2584.      der eben beschriebenen Bits wird dadurch eingeschränkt:
  2585.      - Adress- und Buserrorhandler werden intern benutzt, ausserhalb des
  2586.        Debuggers gelten die üblichen "Regeln". Sie können den Debugger
  2587.        allerdings auch dahingehend konfigurieren, dass er sich nicht in die
  2588.        beiden Vektoren einhängt. Dies schränkt die Funktionsweise des De-
  2589.        buggers normalerweise nicht ein, interne Bus-/Adressexception werden
  2590.        trotzdem abgefangen! Um sicher zu gehen, sollten Sie dies aber
  2591.        trotzdem unterlassen und nur verwenden, wenn Sie PEACEBUG debuggen
  2592.        wollen.
  2593.      - Der Illegal Opcode Handler wird für Breakpoints und um in den Super-
  2594.        visormodus zu schalten benutzt.
  2595.      - Die Traceexception wird immer für eigene Zwecke gebraucht, die Flags
  2596.        haben daher keine Wirkung
  2597.      - Ein Reset innerhalb des Debuggers wird immer abgefangen. Ein Reset
  2598.        ausserhalb wird abgefangen, wenn Bit 0 oder 1 gesetzt sind.
  2599.      - Der etv_critic Handler wird intern benutzt, ausserhalb des Debuggers
  2600.        behalten die Flags ihre Gültigkeit.
  2601.      - Der 200 Hz Timer wird für die diversen internen Timer benutzt (Ti-
  2602.        meout, Keyrepeat etc.), die Observe- und die Slowmotionfunktion.
  2603.      - Der Keyboardinterrupt ignoriert die Flags innerhalb des Debuggers.
  2604.        PEACEBUG hat die Eigenschaft, dass andere PEACEBUGs Tastatureingaben
  2605.        mitbekommen, andere Debugger wie Templmon allerdings nicht. Sie
  2606.        können also jederzeit PEACEBUG mittels eines zweiten PEACEBUG unter-
  2607.        brechen, aber nicht mit anderen Debuggern (ausser Sie konfigurieren
  2608.        PEACEBUG entsprechend).
  2609.  
  2610.  
  2611.  
  2612.  
  2613.  
  2614.  
  2615.  
  2616.  
  2617.      10. Schnittstelle
  2618.      -----------------
  2619.  
  2620.  
  2621.  
  2622.      10.1. Grundsätzliches
  2623.      ---------------------
  2624.  
  2625.  
  2626.      PEACEBUG besitzt eine Schnittstelle, die jedem Programm zugänglich
  2627.      ist. Diese ist dokumentiert und wird in zukünftigen Programmversionen
  2628.      nicht verändert, nur erweitert. Programme die diese Schnittstelle kor-
  2629.      rekt benutzen, werden also auch mit späteren Versionen keine Probleme
  2630.      haben.
  2631.      Sollten Sie ein Programm haben, dass diese Schnittstelle benutzt und
  2632.      das von allgemeinem Interesse ist, können Sie es mir zukommen lassen,
  2633.      es kann dann fester Bestandteil von PEACEBUG werden.
  2634.      Erreichbar ist die Schnittstelle über den Cookieeintrag mit Kennung
  2635.      'PBUG'. Beispiele von Programmen, die über den Cookie mit PEACEBUG
  2636.      kommunizieren, liegen mit Quelltext bei.
  2637.      ACHTUNG: nur die residente Version installiert einen Cookieeintrag,
  2638.      d.h. alle in diesem Kapitel beschriebenen Variablen sind nicht zugäng-
  2639.      lich, falls der Debugger als Programm gestartet wird.
  2640.  
  2641.      Jede Struktur, die in diesem Kapitel dokumentiert wird, hat die glei-
  2642.      che Form. Am Anfang der Zeile steht der Datentyp (long, int oder char)
  2643.      und der Name der Variablen, '*' steht für Pointer. Dahinter folgt der
  2644.      Offset in Bytes vom Beginn der Struktur. Last but not least der Status
  2645.      der Variablen, wobei r=read, w=write, p=patch, n=new_format und l=lock
  2646.      bedeutet. Variablen mit Status r dürfen Sie lesen, solche mit w
  2647.      schreiben. Variablen, die den Status p haben, können im Programmcode
  2648.      (auf Disk/Platte) verändert werden, Variablen ohne p hingegen nur bei
  2649.      laufendem Programm (vorausgesetzt w ist gesetzt). Wenn Sie Variablen
  2650.      mit Status n verändern, MUSS nachher die Routine NEW_FORMAT aufgerufen
  2651.      werden. Wenn die Semaphore SCREEN_LOCK gesetzt ist, dürfen Variablen
  2652.      mit Status l nicht mehr verändert und Routinen mit eben diesem Status
  2653.      nicht aufgerufen werden.
  2654.      Gepatched werden kann der Programmcode sehr einfach, 2 Bytes hinter
  2655.      dem Programmheader, d.h. in 30 Bytes Offset zum Dateianfang, stehen 6
  2656.      Longs, eine Kennung und fünf Offsets, die angeben, wie weit vom Da-
  2657.      teianfang sich die entsprechenden Strukturen befinden:
  2658.  
  2659.      long _id                Offset 30           /* "PBUG" */
  2660.      void *SCREEN_PARAMETER  Offset 34
  2661.      void *PARAMETER         Offset 38
  2662.      void *FLAGS             Offset 42
  2663.      void *FONT_16_8         Offset 46
  2664.      void *FONT_8_8          Offset 50
  2665.  
  2666.      Mit handle=Fopen(fname,2), Fseek(30,handle,0), Fread(handle,24,buffer)
  2667.      bekommen Sie alle wichtigen Werte. Dannach müssen Sie nur noch mit
  2668.      Fseek an die entsprechende Stelle springen und können dort die Werte
  2669.      patchen.
  2670.  
  2671.      Der Cookieeintrag zeigt auf die folgende Struktur:
  2672.      void *CLEAR_SCREEN               Offset 0        r/l/n
  2673.      void *GET_PARAMETER              Offset 4        r/l/n
  2674.      void *KILL_SCREEN                Offset 8        r/l/n
  2675.      void *NEW_SCREEN                 Offset 12       r/l/n
  2676.      void *NEW_FORMAT                 Offset 16       r/l
  2677.      void *PRINT_SCREEN               Offset 20       r/l
  2678.      void *SCREEN_PARAMETER           Offset 24       r
  2679.      void *CALL_DEBUGGER_1            Offset 28       r
  2680.      long VERSION                     Offset 32       r
  2681.      void *PARAMETER                  Offset 36       r
  2682.      void *USERTRACE                  Offset 40       r/w
  2683.      void *USERENTER                  Offset 44       r/w
  2684.      void *USERQUIT                   Offset 48       r/w
  2685.      void *USERSWITCH_ENTER           Offset 52       r/w
  2686.      void *USERSWITCH_QUIT            Offset 56       r/w
  2687.      void *USERRESET                  Offset 60       r/w
  2688.      void *FLAGS                      Offset 64       r
  2689.      void *VEKTOR                     Offset 68       r
  2690.      void *CALL_DEBUGGER_2            Offset 72       r
  2691.  
  2692.  
  2693.  
  2694.      10.2. Bildschirmschnittstelle
  2695.      -----------------------------
  2696.  
  2697.  
  2698.      Die ersten 6 Pointer zeigen auf Routinen, die dazu benutzt werden kön-
  2699.      nen, den Bildschirmtreiber neu zu konfigurieren. Dieser ist so flexi-
  2700.      bel gehalten, dass man den Debugger sogar in einem Fenster laufen las-
  2701.      sen kann, das entsprechende Programm heisst WINDOW.ACC und liegt dem
  2702.      Debugger bei.
  2703.      Jede der Routinen endet mit einem rts, wird also normalerweise mittels
  2704.      jsr angesprungen (für Hochsprachen konsultieren Sie bitte ihr Hand-
  2705.      buch). Register werden grundsätzlich keine verändert. Achtung: diese
  2706.      Routinen müssen im Supervisormodus aufgerufen werden.
  2707.  
  2708.  
  2709.      10.2.1 CLEAR_SCREEN
  2710.      -------------------
  2711.  
  2712.      Diese Routine löscht den Debuggerscreen (wer hätte es gedacht...),
  2713.      Maus und Cursor werden ausgeschaltet. Diese Routine muss nur aufgeru-
  2714.      fen werden, wenn der Screen neu konfiguriert wird (NEW_FORMAT), wird
  2715.      er hingegen neu installiert (NEW_SCREEN), ist dies nicht nötig.
  2716.  
  2717.  
  2718.      10.2.2 GET_PARAMETER
  2719.      --------------------
  2720.  
  2721.      Diese Routine setzt die unter >SCREEN_PARAMETER aufgeführten Variablen
  2722.      von Offset 42 bis und mit 56. Sie benutzt LINEA 0 und wird z.B. von
  2723.      INIT_SCR.PRG benutzt.
  2724.  
  2725.  
  2726.      10.2.3 KILL_SCREEN
  2727.      ------------------
  2728.  
  2729.      PEACEBUG reserviert bei Programmstart einige Speicherbereiche, darun-
  2730.      ter 3 für den Bildschirmtreiber:
  2731.      1. Der eigentlich Bildschirmspeicher
  2732.      2. Enthält den Bildschirm in 'Asciiform', also für jedes Zeichen auf
  2733.         dem Screen ein Byte
  2734.      3. Puffer für den Maushintergrund
  2735.  
  2736.      Mittels KILL_SCREEN kann nun PEACEBUG veranlasst werden diese Bereiche
  2737.      wieder freizugeben. Dazu übergibt man der Routine ein Word auf dem
  2738.      Stack, von dem allerdings nur 3 Bit gebraucht werden:
  2739.      0. Bit: Bildschirmspeicher freigeben
  2740.      1. Bit: Zeichenspeicher freigeben
  2741.      2. Bit: Mauspuffer freigeben
  2742.  
  2743.      Ein Aufruf sieht in Assembler etwa so aus:
  2744.  
  2745.      > move.w #%111,-(sp)        ; alle Bereiche freigeben
  2746.      > jsr   (a0)                ; Routine anspringen
  2747.      > addq.w #2,sp              ; und Stack korrigieren
  2748.  
  2749.      Achtung: Speicherbereiche können nach einem PTERMRES nicht mehr frei-
  2750.      gegeben werden, KILL_SCREEN muss im Hinblick auf kommende Debuggerver-
  2751.      sionen trotzdem aufgerufen werden, auch wenn diese Routine im Moment
  2752.      noch nichts bewirkt.
  2753.  
  2754.  
  2755.      10.2.4. NEW_SCREEN
  2756.      ------------------
  2757.  
  2758.      Das Gegenstück zu >KILL_SCREEN.
  2759.      Der entsprechende Bereich wird reserviert, im Gegensatz zu KILL_SCREEN
  2760.      wird aber auf dem Stack ein Wert zurückgegeben, der angibt ob das Re-
  2761.      servieren gelungen ist. Wird eine Null zurückgegegen, ist beim Spei-
  2762.      cherreservieren ein Fehler aufgetreten, der Debugger sollte daraufhin
  2763.      nach Möglichkeit nicht mehr angesprungen werden. Ein Aufruf sieht in
  2764.      etwa so aus:
  2765.  
  2766.      > move.w #%111,-(sp)        ; alle Bereiche neu reservieren
  2767.      > jsr    (a0)               ; Routine anspringen
  2768.      > tst.w  (sp)+              ; Rückgabewert testen, Stack korrigieren
  2769.      > beq.s  error              ; Fehler aufgetreten ...
  2770.  
  2771.  
  2772.      10.2.5. NEW_FORMAT
  2773.      ------------------
  2774.  
  2775.      Diese Routine muss bei der Veränderung einer Variablen mit Status n
  2776.      oder beim Aufruf einer Routine mit ebendiesem Status aufgerufen wer-
  2777.      den. Sie berechnet alle internen Bildschirmvariablen, die der Debugger
  2778.      benötigt .
  2779.  
  2780.  
  2781.      10.2.6. PRINT_SCREEN
  2782.      --------------------
  2783.  
  2784.      Der Bildschirm wird neu aufgebaut.
  2785.  
  2786.  
  2787.      10.2.7. SCREEN_PARAMETER
  2788.      ------------------------
  2789.  
  2790.      Dies ist ein Pointer auf folgende Struktur:
  2791.  
  2792.      void *BILDSCHIRM_MALLOC          Offset 0        r/w/n/l
  2793.      void *BILDSCHIRM_ADRESSE         Offset 4        r/w/n/l
  2794.      void *ZEICHEN_ADRESSE            Offset 8        r/w/n/l
  2795.      void *MAUS_PUFFER                Offset 12       r/w/n/l
  2796.      long reserved[4]
  2797.      void *FONT_16                    Offset 32       r/w/n/l
  2798.      void *FONT_8                     Offset 36       r/w/n/l
  2799.      int  FONT_FLAG                   Offset 40       r/w/p/n/l
  2800.      int  OFFSET_X                    Offset 42       r/w/n/l
  2801.      int  OFFSET_Y                    Offset 44       r/w/n/l
  2802.      int  BILD_BREITE                 Offset 46       r/w/n/l
  2803.      int  ZEILEN_LAENGE               Offset 48       r/w/n/l
  2804.      int  BILD_HOEHE                  Offset 50       r/w/n/l
  2805.      int  SCREEN_BREITE               Offset 52       r/w/n/l
  2806.      int  SCREEN_HOEHE                Offset 54       r/w/n/l
  2807.      int  PLANES                      Offset 56       r/w/n/l
  2808.      long _BILDSCHIRM_LENGTH          Offset 58       r/w/p/n/l
  2809.      long _ZEICHEN_LENGTH             Offset 62       r/w/p/n/l
  2810.      long _MAUS_LENGTH                Offset 66       r/w/p/n/l
  2811.      long reserved[4]
  2812.      int  _OFFSET_X                   Offset 86       r/w/p/n/l
  2813.      int  _OFFSET_Y                   Offset 88       r/w/p/n/l
  2814.      int  _BILD_BREITE                Offset 90       r/w/p/n/l
  2815.      int  _BILD_HÖHE                  Offset 92       r/w/p/n/l
  2816.      int  _PLANES                     Offset 94       r/w/p/n/l
  2817.      int  reserved[3]
  2818.      byte SCREEN_LOCK                 Offset 102      r/w/l
  2819.      byte SWITCH_PALETTE              Offset 103      r/w/p/l
  2820.      int  OWN_PALETTE[256]            Offset 104      r/w/p/l
  2821.  
  2822.  
  2823.      Diese Variablen/Pointer genügen um genau festzulegen, wie der Debug-
  2824.      gerbildschirm auszusehen hat.
  2825.      Hier einige Erläuterungen, Referenz nach Offset:
  2826.      0:  Enthält einen Zeiger auf den durch Malloc reservierten Bildschirm-
  2827.          speicher. Dessen Länge berechnet sich wie folgt:
  2828.          SCREEN_BREITE*SCREEN_HÖHE+256.
  2829.      4:  (BILDSCHIRM_MALLOC+256) AND $FFFFFF00, die eigentliche Bildschirm-
  2830.          adresse, stimmt im allgemeinen nicht mit BILDSCHIRM_MALLOC über-
  2831.          ein.
  2832.      8:  Zeiger auf den 'Zeichenbildschirm', berechnet wird die Länge fol-
  2833.          gendermassen: ZEILEN_LAENGE*BILD_HOEHE/8.
  2834.      12: Zeiger auf den Mauspuffer, Länge: PLANES*64.
  2835.      32: Zeiger auf den 8*16 Font 4096 Bytes lang, dieser ist im Programm-
  2836.          code integriert. Wenn Sie einen neuen Font installieren wollen,
  2837.          ändern Sie entweder diesen Pointer oder Sie überschreiben den in-
  2838.          ternen Font mit dem gewünschten neuen. Der Font selber (nicht der
  2839.          Pointer) hat also Status r/w/p/n!).
  2840.      36: Zeiger auf den 8*8 Font 2048 Bytes lang, dieser ist im Programm-
  2841.          code integriert. Wenn Sie einen neuen Font installieren wollen,
  2842.          ändern Sie entweder diesen Pointer oder Sie überschreiben den in-
  2843.          ternen Font mit dem gewünschten neuen. Der Font selber (nicht der
  2844.          Pointer) hat also Status r/w/p/n!).
  2845.      40: gibt an, welcher Font benützt wird. 4 bedeutet 8*16 Font, 3 8*8
  2846.          Font, alle anderen Werte sind nicht definiert und können zum Ab-
  2847.          sturz führen.
  2848.      42: gibt den Abstand des vom Debugger benutzten Bildausschnittes vom
  2849.          linken Rand in Zeichen an (!=Anzahl Bytes wenn PLANE!=1).
  2850.      44: gibt den Abstand des vom Debugger benutzten Bildausschnittes vom
  2851.          oberen Rand in Pixel an.
  2852.      46: gibt die Breite des vom Debugger benutzten Bildausschnittes in
  2853.          Zeichen an.
  2854.      48: gibt die vom Debugger benutzte Zeilenlänge an, diese muss >=BILD_-
  2855.          BREITE und IMMER durch 2 teilbar sein! Durch die Trennung von
  2856.          Bildbreite und Zeilenlänge wird die Verwaltung virtueller Zeilen-
  2857.          längen möglich, wie sie nötig ist, wenn die Bildbreite häufig
  2858.          ändert, wie z.B. mit WINDOW.ACC. Die Zeilenlänge wird in diesem
  2859.          Fall klugerweise auf die maximale Bildbreite gesetzt.
  2860.          ACHTUNG: PEACEBUG kann eine maximale Zeilenlänge von 240 Zeichen
  2861.          verwalten. Dies ist auch der Grund weshalb er sich bei Bildschirm-
  2862.          auflösungen ab 1920 Punkten Horizontal nicht installiert. Diese
  2863.          Beschränkung kann ich allerdings jederzeit gegen oben anpassen,
  2864.          wenn dies gewünscht wird, da es sich hier nicht um ein Program-
  2865.          miertechnisches Problem handelt.
  2866.      50: gibt die Höhe des vom Debugger benutzten Bildausschnittes in Pixel
  2867.          an. Diese kann auch ungerade sein.
  2868.      52: gibt die Breite des Bildschirms in Bytes an.
  2869.      54: gibt die Höhe des Bildschirms in Pixel an.
  2870.      56: gibt die Anzahl Planes des Bildschirms an.
  2871.      58: Die Bildschirmlänge wird normalerweise aus den obigen Variablen
  2872.          berechnet. Wenn diese sich aber ändert, z.B. bei einem Auflösungs-
  2873.          wechsel von ST auf TT-Auflösung oder bei Grafikkarten, die erst
  2874.          kurz vor GEM in Aktion treten, dann kann mittels dieser Variablen
  2875.          die Länge vorbestimmt werden.
  2876.      60: dito für den Zeichenbildschirm.
  2877.      64: dito für den Mauspuffer.
  2878.      Auf einem TT bieten sich für die obigen drei Variablen die Werte
  2879.      153600,19200 und 512 an. Sie können dann eine beliebige Auflösung wäh-
  2880.      len, ohne Angst haben zu müssen, die reservierten Speicherbereiche
  2881.      seien zu klein (auf einem ST reicht 32000, 4000, 256).
  2882.      Eine andere Möglichkeit ist, PBUGCONF einen neuen Screen installieren
  2883.      zu lassen, was jedoch den Nachteil hat, das bei jedem Auflösungswech-
  2884.      sel die drei Speicherbereiche verloren gehen.
  2885.      86: bei Aufruf von GET_PARAMETER wird OFFSET_X auf einen Defaultwert
  2886.      gesetzt (Null), es sei denn _OFFSET_X enthalte einen von Null ver-
  2887.      schiedenen Wert. In diesem Fall wird dieser nach OFFSET_X kopiert.
  2888.      Zusammen mit den folgenden 3 Variablen kann so der Screen auf einen
  2889.      kleinen Bereich beschränkt werden, was mitunter auf Grossbildschirmen
  2890.      aus Performancegründen sinnvoll sein kann.
  2891.      88: dito für OFFSET_Y
  2892.      90: dito für BILD_BREITE
  2893.      92: dito für BILD_HÖHE
  2894.      94. dito für PLANES
  2895.      102: ein Programm, das auf irgendeine der Variablen oder Routinen zu-
  2896.           greift, die Status l haben, muss diese Semaphore testen. Bei
  2897.           einem Wert ungleich Null, darf weder eine Routine aufgerufen
  2898.           noch eine Variable verändert werden. Beispielsweise setzt
  2899.           WINDOW.ACC diese Semaphore, falls der Screen in das Fenster umge-
  2900.           lenkt wird. Da es sich hier um eine Bytevariable handelt, würde
  2901.           sich die Verwendung von TAS empfehlen. Da es scheinbar einen
  2902.           Hardwarebeschleuniger gibt, der diesen Befehl falsch ausführt,
  2903.           verzichte ich auf den Gebrauch von TAS.
  2904.      103: Nur wenn diese Variable einen von Null verschiedenen Wert hat,
  2905.           wird die Farbpalette beim Einsprung umgeschaltet.
  2906.      104: diese 256 Words enthalten die Farbpalette, wobei beim ST natür-
  2907.           lich nur die ersten 16 Words benutzt werden. Die Palette ist de-
  2908.           faultmässig so gesetzt, dass es auf allen Auflösungen das gleiche
  2909.           ergibt (ST-High auf einem TT ist allerdings invers). Auf dem F030
  2910.           wird eine fixe Palette benutzt, so dass diese Werte keinen
  2911.           Einfluss haben. 
  2912.  
  2913.  
  2914.  
  2915.      10.3. CALL_DEBUGGER_1, CALL_DEBUGGER_2
  2916.      --------------------------------------
  2917.  
  2918.  
  2919.      Über diese Pointer kann der Debugger angesprungen werden.
  2920.      Auf dem Stack müssen sich 6 Bytes befinden, die vom Debugger ausge-
  2921.      wertet und entfernt werden:
  2922.      0(SP).w: SR (Statusregister)
  2923.      2(SP).l: PC (Programmcounter)
  2924.      Vor der Einsprungadresse befindet sich ein weiterer Zeiger auf die
  2925.      Einsprungsmessage, also die die in der ersten Zeile invers geprintet
  2926.      wird. Diesen Zeiger dürfen Sie auf einen eigenen nullterminierten
  2927.      String ändern. Er muss aber bei JEDEM Einsprung neu gesetzt werden!
  2928.      Der Einsprung darf nur im Supervisormodus erfolgen, z.B. so:
  2929.  
  2930.      > move.l   #message,-4(a0)         ; optional
  2931.      > move.l   a0,debugger             ; Aufrufadresse
  2932.      > movem.l  (sp)+,d0-a6             ; Register restoren
  2933.      > move.l   saved_pc,-(sp)          ; PC auf den Stack
  2934.      > move.w   saved_sr,-(sp)          ; SR auf den Stack
  2935.      > move.l   debugger,-(sp)          ; und den Debugger
  2936.      > rts                              ; anspringen
  2937.  
  2938.      CALL_DEBUGGER_1: Es werden grundsdtzlich alle Register gerettet ausser
  2939.      sämtliche Stackpointer. Diese werden auf eigene Bereiche gesetzt. Das
  2940.      ist sinnvoll, wenn Sie den Debugger aufrufen um darin Teile zu debug-
  2941.      gen, die den Stack durcheinanderbringen können. Das Programm braucht
  2942.      sich dann nicht selber um ausreichend dimensionierte Stacks zu kümmern
  2943.      (USP, ISP, MSP).
  2944.      ACHTUNG: Nach einem solchen Aufruf bleibt Ihnen nichts anderes übrig,
  2945.      als Ihr Programm zu terminieren, weil sie keine rts, rte usw. mehr
  2946.      machen können, es sei denn Sie haben die eigenen Stackpointer vor dem
  2947.      Aufruf gerettet.
  2948.      Um alle Klarheiten zu beseitigen: Der Debugger benutzt intern einen
  2949.      eigenen Stack, darüberhinaus hat er einen separaten Stack für OS
  2950.      Aufrufe, einen separaten Stack für die Resetroutine, einen separaten
  2951.      Stack für die Installation und drei Stacks für das zu tracende Pro-
  2952.      gramm. Diese drei werden für ein >Lexecute und beim Einsprung über
  2953.      CALL_DEBUGGER_1 benutzt.
  2954.  
  2955.      CALL_DEBUGGER_2: Es werden alle Register gerettet, so wie sie beim
  2956.      Aufruf vorgefunden werden. Benutzen Sie diese Routine, wenn Sie:
  2957.      - Ihr Programm nach dem Aufruf nicht terminieren lassen wollen/können.
  2958.      - Wenn der Debugger keine Register verändern darf.
  2959.      - Wenn Sie den Debugger aus einer Exception oder einem Interrupt auf-
  2960.        rufen.
  2961.  
  2962.  
  2963.  
  2964.      10.4. VERSION
  2965.      -------------
  2966.  
  2967.  
  2968.      Versionsnummer des Debuggers.
  2969.      Ist als Asciistring codiert, also z.B. "0104" für 1.04.
  2970.  
  2971.  
  2972.  
  2973.      10.5. PARAMETER
  2974.      ---------------
  2975.  
  2976.  
  2977.      char KEY_CODE_1                  Offset 0        r/w/p
  2978.      char SWITCH_CODE_1               Offset 1        r/w/p
  2979.      char KEY_CODE_2                  Offset 2        r/w/p
  2980.      char SWITCH_CODE_2               Offset 3        r/w/p
  2981.      char reserved[8]
  2982.  
  2983.      int  MAUS_PARAMETER s^1          Offset 12       r/w/p
  2984.      int  MAUS_PARAMETER s^2          Offset 14       r/w/p
  2985.      int  MAUS_PARAMETER s^3          Offset 16       r/w/p
  2986.      int  MAUS_PARAMETER s^4          Offset 18       r/w/p
  2987.      int  MAUS_PARAMETER s^5          Offset 20       r/w/p
  2988.      int  MAUS_PARAMETER s^6          Offset 22       r/w/p
  2989.  
  2990.      int  ZAHLEN_BASIS                Offset 24       r/w/p
  2991.  
  2992.      int  PRIORITAETEN +              Offset 26       r/w/p
  2993.      int  PRIORITAETEN -              Offset 28       r/w/p
  2994.      int  PRIORITAETEN *              Offset 30       r/w/p
  2995.      int  PRIORITAETEN /              Offset 32       r/w/p
  2996.      int  PRIORITAETEN |              Offset 34       r/w/p
  2997.      int  PRIORITAETEN &              Offset 36       r/w/p
  2998.      int  PRIORITAETEN ^              Offset 38       r/w/p
  2999.      int  PRIORITAETEN <>             Offset 40       r/w/p
  3000.      int  PRIORITAETEN ~              Offset 42       r/w/p
  3001.      int  PRIORITAETEN -              Offset 44       r/w/p
  3002.      int  PRIORITAETEN %              Offset 46       r/w/p
  3003.      int  PRIORITAETEN p              Offset 48       r/w/p
  3004.      int  PRIORITAETEN (              Offset 50       r/w/p
  3005.      int  reserved[5]
  3006.  
  3007.      long KEY_REPEAT                  Offset 62       r/w/p
  3008.      long KEY_DELAY                   Offset 66       r/w/p
  3009.      long MOUSE_REPEAT                Offset 70       r/w/p
  3010.      long MOUSE_DELAY                 Offset 74       r/w/p
  3011.      long DOPPEL_KLICK                Offset 78       r/w/p
  3012.  
  3013.      long PRINTER_TIMEOUT             Offset 82       r/w/p
  3014.      long RS232_TIMEOUT               Offset 86       r/w/p
  3015.      long MIDI_TIMEOUT                Offset 90       r/w/p
  3016.      long reserved[6]
  3017.  
  3018.      void *NEW HISTORY                Offset 118      r
  3019.      long *HISTORY_POINTER            Offset 122      r
  3020.      long HISTORY_LENGTH              Offset 126      r/p
  3021.      long reserved[2]
  3022.  
  3023.      void *CACHE_INIT                 Offset 128      r
  3024.      int  CACHE_LENGTH                Offset 132      r
  3025.      long reserved
  3026.      int  CACHE_LÄNGE_1               Offset 148      r/p
  3027.      long reserved
  3028.      int  CACHE_LÄNGE_2               Offset 154      r/p
  3029.  
  3030.      char INSERT_FLAG                 Offset 156      r/w/p
  3031.      char unused                      /* vormals CURSOR_BOUND */
  3032.      char SYMBOL_FLAG                 Offset 158      r/w/p
  3033.  
  3034.  
  3035.      0-3: Der Debugger wird angesprungen, wenn Sie die Taste gedrückt ha-
  3036.           ben, deren Scancode in KEY_CODE_1 steht und wenn die Umschalt-
  3037.           tasten den Status haben, wie er in SWITCH_CODE_1 steht.
  3038.           Die Codierung von SWITCH_CODE_1 ist fast wie bei Kbshift:
  3039.           Bit 0: Shift-Taste rechts
  3040.           Bit 1: Shift-Taste links
  3041.           Bit 2: Control-Taste
  3042.           Bit 3: Alternate-Taste
  3043.           Bit 5: Rechte Maustaste
  3044.           Bit 6: Linke Maustaste
  3045.           CapsLock wird absichtlich ausmaskiert, deren Status spielt also
  3046.           keine Rolle.
  3047.           Es können zum Einsprung wirklich die Maustasten benutzt werden,
  3048.           ob dies sinnvoll ist, sei dahingestellt.
  3049.           Eingesprungen wird allerdings nur, wenn flock $43E nicht gesetzt
  3050.           ist, da dann Diskoperationen stattfinden, die nicht gestört wer-
  3051.           den wollen. Diese Sperre kann umgangen werden, wenn Sie die zwei-
  3052.           te Tastenkombination KEY_CODE_2/SWITCH_CODE_2 drücken.
  3053.           Wichtig: wenn Sie das oberste Bit beim Scancode setzen, dann wird
  3054.           erst beim Loslassen der Taste eingesprungen.
  3055.           Auch wichtig: wenn der Scancode Null ist, wird nur der Status
  3056.           der Umschalttasten getestet, d.h. Sie können beispielsweise mit-
  3057.           tels Maustaste Rechts den Debugger aufrufen.
  3058.      12-: PEACEBUG hat einen im Maustreiber integrierten Mausbeschleuni-
  3059.      22   ger. Dieser berechnet die Geschwindigkeit der Maus auf dem Bild-
  3060.           schirm als Funktion der Geschwindigkeit der Maus auf dem Tisch.
  3061.           Diese Funktion ist ein Polynom 6. Grades, dessen Koeffizienten
  3062.           die Variablen MAUS_PARAMETER s^1-6 sind. Die Koeffizienten können
  3063.           in Schritten von 1/128tel verändert werden, eine unbeschleunige
  3064.           Maus erhalten Sie also durch die Koeffizienten 128,0,0,0,0,0 (und
  3065.           nur durch diese).
  3066.      24:  PEACEBUG beherrscht 4 Zahlensysteme, die Zahlenbasis wird mittels
  3067.           eines Prefix ausgewählt:
  3068.           % Binär
  3069.           . Dezimal
  3070.           $ Hexadezimal
  3071.           o Oktal
  3072.           ZAHLEN_BASIS gibt an, welche Zahlenbasis defaultmässig verwendet
  3073.           wird, also ohne Verwendung eines Prefix. Normalerweise wird 16
  3074.           benutzt, defaultmässig sind so die Hexadezimalen Zahlen vorge-
  3075.           geben. Der Wert kann (natürlich) verändert werden, es sind alle
  3076.           Basen von 2-36 erlaubt (im 36er System hätten Sie dann die Zif-
  3077.           fern 0-9 und A-Z). Sie könnten also auch im 11er System Zahlen
  3078.           eingeben, wenn Sie das als sinnvoll erachten.
  3079.      26-: Diese 13 Worte werden vom Formelinterpreter benutzt. Sie geben
  3080.      50   an, wie stark der nachfolgende Ausdruck an einen Operator gebun-
  3081.           den wird. Beispielsweise bindet die Addition weniger stark als
  3082.           die Multiplikation (Addition 5, Multiplikation 15), was auch
  3083.           sinnvoll ist, da man normalerweise die Regel Punkt vor Strich-
  3084.           rechnung benutzt. Einparametrige Operatoren (Vorzeichen,
  3085.           Pointer...) binden natürlich stärker als zweiparametrige. Am
  3086.           besten, Sie verändern diese Werte nicht, sinnvoll erscheint mir
  3087.           dies sowieso nur beim Operator p (Pointer). Wenn Sie dessen
  3088.           Priorität auf z.B. 2 hinuntersetzen, werden Ausdrücke wie:
  3089.           p ^a0-4
  3090.           ausgewertet, wie wenn Sie bei defaultmässigen Einstellungen:
  3091.           p(^a0-4)
  3092.           eingeben...(Das Minus bindet dann stärker als das p).
  3093.      62:  gibt die Tasten Repetiergeschwindigkeit in 1/200tel Sekunden an.
  3094.      66:  gibt die Tastenverzögerung in 1/200tel Sekunden an. Dies ist
  3095.           die Zeit, die nach dem ersten Tastendruck gewartet wird, bis der
  3096.           Tastenrepeat einsetzt.
  3097.      70:  gibt die Mausklick Repetiergeschwindigkeit in 1/200tel Sekunden
  3098.           an.
  3099.      74:  gibt die Mausklickverzögerung in 1/200tel Sekunden an. Dies ist
  3100.           die Zeit, die nach dem ersten Mausklick gewartet wird, bis der
  3101.           Mausklickrepeat einsetzt
  3102.      78:  gibt die Zeit in 1/200tel Sekunden an, die zwischen zwei Maus-
  3103.           klicks verstreichen darf, so dass diese noch als Doppelklick er-
  3104.           kannt werden.
  3105.      82:  Zeit in 1/200tel Sekunden, bis ein Timeout an der Centronics
  3106.           Schnittstelle gemeldet wird.
  3107.      86:  Zeit in 1/200tel Sekunden, bis ein Timeout an der RS232 gemeldet
  3108.           wird.
  3109.      90:  Zeit in 1/200tel Sekunden, bis ein Timeout an der MIDI Schnitt-
  3110.           stelle gemeldet wird.
  3111.      118: diese Routine muss aufgerufen werden, wenn Sie den Historypuffer
  3112.           vergrössern wollen. Dieser wird dynamisch verwaltet, so dass die
  3113.           Anzahl verfügbarer Einträge von der verwendeten Zeilenlänge ab-
  3114.           hängt. Auf dem Stack übergeben Sie die Anzahl zu reservierender
  3115.           Bytes. Der Rückgabewert ist Null, wenn beim Reservieren ein Feh-
  3116.           ler aufgetreten ist, was allerdings die Funktionsfähigkeit des
  3117.           Debuggers nicht beeinflusst.
  3118.           > pea  8000.w               ; 8000 Bytes reservieren
  3119.           > jsr  (a0)                 ; Routine anspringen
  3120.           > tst.l (sp)+               ; Fehler aufgetreten?
  3121.           > beq.s  error
  3122.      122: Zeiger auf den reservierten Speicherbereich.
  3123.      126: aktuelle Länge des Puffers in Bytes. Diese Variable darf nicht
  3124.           geschrieben werden, sie wird von NEW_HISTORY gesetzt. Diese
  3125.           Variable legt fest, wie gross der bei Programmstart zu reser-
  3126.           vierende Bereich sein soll.
  3127.      138: diese Routine dient dazu, die beiden Caches zu erweitern oder zu
  3128.           verkleinern (ob dies allerdings sinnvoll ist ...). Da die Caches
  3129.           als Ring organisiert sind, können jederzeit neue Einträge hinzu-
  3130.           gefügt werden, ohne dass gleich der ganze Cache neu reserviert
  3131.           werden muss, wie das beim Historypuffer der Fall ist. Auf dem
  3132.           Stack werden für jeden Cache die gewünschten neuen Längen über-
  3133.           geben, die Routine erkennt selbständig ob Einträge gelöscht wer-
  3134.           den sollen oder neu reserviert werden müssen. Auch hier deutet
  3135.           eine Null als Rückgabewert auf ein Fehler beim Reservieren hin.
  3136.           > move.w #50,-(sp)          ; 50 Einträge für Cache 1
  3137.           > move.w #30,-(sp)          ; 30 Einträge für Cache 2
  3138.           > jsr    (a0)               ; Routine anspringen
  3139.           > tst.l (sp)+               ; Fehler aufgetreten?
  3140.           > beq.s error
  3141.      142: dieser Wert gibt die Länge eines einzelnen Eintrages an (momentan
  3142.           152 Bytes). Sie können so abschätzen, wieviel Speicher Sie für
  3143.           eine bestimmte Anzahl Einträge opfern müssen.
  3144.      148: soviel Anzahl Einträge umfasst Cache 1 momentan. Diese Variable
  3145.           darf nicht geschrieben werden, dies erledigt CACHE_INIT. Der Wert
  3146.           gibt darüberhinaus an, wieviele Einträge bei Programmstart reser-
  3147.           viert werden soll.
  3148.      154: soviel Anzahl Einträge umfasst Cache 2 momentan. Diese Variable
  3149.           darf nicht geschrieben werden, dies erledigt CACHE_INIT. Der Wert
  3150.           gibt darüberhinaus an, wieviel Einträge bei Programmstart reser-
  3151.           viert werden soll.
  3152.      156: gibt an, welchen Schreibmodus der Editor benutzen soll. -1 bedeu-
  3153.           tet Insert-, 0 Überschreibmodus.
  3154.      158: gibt an, ob eine Symboltabelle beim Disassemblieren, Assemblieren
  3155.           und vom Formelinterpreter benutzt wird.
  3156.           -1: benutze alle Symboltabellen
  3157.            1: benutze die debuggereigenen Symboltabllen ohne diejenigen des
  3158.               Resident Symbol Drivers.
  3159.            0: benutzte keine Symboltabellen
  3160.            Im Listmodus wird bei installiertem RSD auch der Programmname
  3161.            ausgegeben. Nur wenn dieses Flag 0 ist, wird dies unterdrückt.
  3162.  
  3163.  
  3164.  
  3165.      10.6. Userroutinen
  3166.      ------------------
  3167.  
  3168.      Es folgen 6 Vektoren, in die Sie eigene Routinen einhängen können.
  3169.      Sie sollten darauf achten, dass Sie vor der Routine folgende Struktur
  3170.      anlegen:
  3171.  
  3172.      typedef struct
  3173.      {
  3174.            long us_message      /* Einsprungmessage, kann 0 sein */
  3175.            char xb_magic[4];    /* "XBRA" */
  3176.            char xb_id[4];       /* XBRA-ID des installierten Programms */
  3177.            long xb_oldvec;      /* Wert des Vektors vor dem Einhängen */
  3178.      } USER;
  3179.  
  3180.      oder in Assembler
  3181.  
  3182.                   dc.l MESSAGE
  3183.                   dc.l 'XBRA'
  3184.                   dc.l 'PBUG'
  3185.      OLD_ROUTINE: dc.l $xxxxxxxx
  3186.      ROUTINE: ...
  3187.  
  3188.      Diese Struktur kann weggelassen werden, vorausgesetzt Sie hängen Ihre
  3189.      Routinen selber ein. Lassen Sie dies durch PEACEBUG-Config erledigen,
  3190.      dann MUSS diese Struktur vor der Routine stehen.
  3191.      Wichtig: bei USERTRACE muss diese Struktur IMMER vorhanden sein.
  3192.      Sie dürfen Ihre Routinen auch aus-, vor-, umhängen. Verboten ist es,
  3193.      die Position des letzten Eintrages zu verändern. Es handelt sich dabei
  3194.      um den Debuggereintrag, den Sie an der Kennung 'PBUG' erkennen.
  3195.      Sie sollten ihre Routine übrigens nicht mit rts beenden, sondern zur
  3196.      nächsten Routine springen, dies natürlich nur wo es sinnvoll ist (bei
  3197.      USERTRACE ist es dies nicht).
  3198.      ACHTUNG: der Stackpointer enthält natürlich zusätzlich die Rücksprun-
  3199.      gadresse. Wenn Sie also auf PC und SR zugreifen wollen, müssen Sie
  3200.      dies berücksichtigen.
  3201.  
  3202.  
  3203.      10.6.1. USERTRACE
  3204.      -----------------
  3205.  
  3206.      Dies ist ein Pointer auf eine Routine, die immer aufgerufen wird, wenn
  3207.      Sie mittels trace[+/-/*] tracen.
  3208.      Sie wird dem Benutzer zur Verfügung gestellt um nach jedem Befehl be-
  3209.      stimmte Bedingungen testet zu können, z.B. um rauszufinden, welches
  3210.      Programm wann welche Speicherstellen abändert.
  3211.      Die Routine wird mit unveränderten Registern angesprungen, also so wie
  3212.      sie im getracten Programm benutzt wurden. Es dürfen deshalb keine Re-
  3213.      gister verändert werden, das Retten wird dem Benutzer überlassen. Auch
  3214.      der PC und das Statusregister sind zugänglich, da sie auf dem Stack
  3215.      liegen (gegebenenfalls auch ein Stackframe). Aufgerufen wird die Rou-
  3216.      tine wie folgt:
  3217.  
  3218.      > jsr USERTRACE
  3219.      > blt.s Weiter_mit_Trace
  3220.      > bgt.s Weiter_ohne_Trace
  3221.      > beq.s Abbrechen_&_in_den_Debugger_springen
  3222.  
  3223.      Der Tracehandler wird also über das Statusregister gesteuert und kann
  3224.      dazu bewegt werden, entweder das Programm mit/ohne Trace fortzusetzen
  3225.      oder in den Debugger zu springen. Für das Programm gibt es also zwei
  3226.      Möglichkeiten:
  3227.  
  3228.      > cmp.l #1,d7
  3229.      > sne  -(sp)
  3230.      > tst.b (sp)+
  3231.      > rts
  3232.  
  3233.      > move.l a0,-(sp)
  3234.      > move.l 10(sp),a0               ; PC holen
  3235.      > cmp.w  #$4e41,(a0)             ; Opcode testen
  3236.      > sne    flag
  3237.      > move.l (sp)+,d0
  3238.      > tst.b  flag
  3239.      > rts
  3240.  
  3241.      Die erste wird benutzt, wenn keine Register verändert werden, die
  3242.      zweite falls dies doch nötig sein sollte. Auf dem Stack befinden sich
  3243.      SR 4(SP), PC 6(SP) und gegebenenfalls ein Stackframe 10(SP).
  3244.      Es ist sinnvoll, nach dem Installieren der Usertraceroutine gleich den
  3245.      Debugger anzuspringen, damit der Tracemodus eingeschaltet werden kann.
  3246.  
  3247.  
  3248.      10.6.2. USERENTER/USERQUIT
  3249.      --------------------------
  3250.  
  3251.      Diese Routinen werden bei jedem Einsprung in den Debugger und bei je-
  3252.      dem Verlassen angesprungen.
  3253.  
  3254.      1. USERENTER: wird über ein jsr angesprungen noch bevor der Debugger
  3255.         irgendwas macht. Alle Register sind noch Original, auf dem Stack
  3256.         befinden sich SR 4(SP), PC 6(SP) und gegebenenfalls ein Stackframe
  3257.         10(SP). Wenn Sie das Statusregister testen wollen, benutzen Sie den
  3258.         Wert auf dem Stack, das aktuelle SR kann vom Debugger schon verän-
  3259.         dert worden sein.
  3260.      2. USERQUIT: wird über ein jsr angesprungen kurz bevor der Debugger
  3261.         endgültig verlassen wird (es wird dann noch die Traceroutine ange-
  3262.         sprungen, d.h. das Tracen können Sie über diese Routinen nicht be-
  3263.         einflussen). Alle Register sind Original, auf dem Stack befinden
  3264.         sich SR 4(SP), PC 6(SP) und gegebenenfalls ein Stackframe 10(SP).
  3265.  
  3266.  
  3267.      10.6.3. USER_SWITCH_1, USER_SWITCH_2
  3268.      ------------------------------------
  3269.  
  3270.      1. USER_SWITCH_1: wird aufgerufen bevor auf den Debuggerbildschirm um-
  3271.         geschaltet wird, kann z.B. dazu dienen, Grafikkarten neu zu init-
  3272.         ialisieren oder die Auflösung umzuschalten.
  3273.      2. USER_SWITCH_2: wird aufgerufen bevor auf den Programmbildschirm um-
  3274.         geschaltet wird, kann z.B. dazu dienen, Grafikkarten neu zu init-
  3275.         ialisieren oder die Auflösung umzuschalten.
  3276.  
  3277.  
  3278.      10.6.4. USER_RESET
  3279.      ------------------
  3280.  
  3281.      Diese Routine wird bei einem Reset angesprungen und dient dazu gegebe-
  3282.      nenfalls zusätzliche Hardware zu initialisieren. Vom Debugger selber
  3283.      wird nur die rechnereigene Hardware wie MFP, Soundchip und Acia ini-
  3284.      tialisiert.
  3285.  
  3286.  
  3287.  
  3288.      10.7. FLAGS
  3289.      -----------
  3290.  
  3291.  
  3292.      Zeiger auf folgende Struktur (Erläuterungen siehe Kapitel "Vektoren"):
  3293.  
  3294.      byte BU_FLAG[2]   Offset 0     ; Buserror
  3295.      byte AD_FLAG[2]   Offset 2     ; Adress_error
  3296.      byte IL_FLAG[2]   Offset 4     ; Illegal
  3297.      byte DI_FLAG[2]   Offset 6     ; Division
  3298.      byte CH_FLAG[2]   Offset 8     ; Chk
  3299.      byte TV_FLAG[2]   Offset 10    ; cpTrapv/cc
  3300.      byte PR_FLAG[2]   Offset 12    ; Privileg
  3301.      byte TR_FLAG[2]   Offset 14    ; Trace
  3302.      byte LA_FLAG[2]   Offset 16    ; Linea
  3303.      byte LF_FLAG[2]   Offset 18    ; Linef
  3304.      byte CP_FLAG[2]   Offset 20    ; Coprocessor Protocol Violation
  3305.      byte FO_FLAG[2]   Offset 22    ; Format Error
  3306.      byte IN_FLAG[2]   Offset 24    ; Uninitialized Interrupt
  3307.      byte SI_FLAG[2]   Offset 26    ; Spurious
  3308.      byte VB_FLAG[2]   Offset 28    ; VBL
  3309.      byte NM_FLAG[2]   Offset 30    ; NMI
  3310.      byte T0_FLAG[2]   Offset 32    ; Trap 0
  3311.      byte GE_FLAG[2]   Offset 34    ; GEMDOS
  3312.      byte VD_FLAG[2]   Offset 36    ; VDI
  3313.      byte AE_FLAG[2]   Offset 38    ; AES
  3314.      byte T3_FLAG[2]   Offset 40    ; Trap 3
  3315.      byte T4_FLAG[2]   Offset 42    ; Trap 4
  3316.      byte T5_FLAG[2]   Offset 44    ; Trap 5
  3317.      byte T6_FLAG[2]   Offset 46    ; Trap 6
  3318.      byte T7_FLAG[2]   Offset 48    ; Trap 7
  3319.      byte T8_FLAG[2]   Offset 50    ; Trap 8
  3320.      byte T9_FLAG[2]   Offset 52    ; Trap 9
  3321.      byte TA_FLAG[2]   Offset 54    ; Trap 10
  3322.      byte TB_FLAG[2]   Offset 56    ; Trap 11
  3323.      byte TC_FLAG[2]   Offset 58    ; Trap 12
  3324.      byte BI_FLAG[2]   Offset 60    ; BIOS
  3325.      byte XB_FLAG[2]   Offset 62    ; XBIOS
  3326.      byte TF_FLAG[2]   Offset 64    ; Trap 15
  3327.      byte C1_FLAG[2]   Offset 66    ; Branch or Set on Unordered Condition
  3328.      byte C2_FLAG[2]   Offset 68    ; Inexact result
  3329.      byte C3_FLAG[2]   Offset 70    ; Divide by Zero
  3330.      byte C4_FLAG[2]   Offset 72    ; Underflow
  3331.      byte C5_FLAG[2]   Offset 74    ; Operand Error
  3332.      byte C6_FLAG[2]   Offset 76    ; Overflow
  3333.      byte C7_FLAG[2]   Offset 78    ; Signaling NAN
  3334.      byte PC_FLAG[2]   Offset 80    ; PMMU Configuration
  3335.      byte PI_FLAG[2]   Offset 82    ; PMMU Illegal
  3336.      byte PA_FLAG[2]   Offset 84    ; PMMU Access Level
  3337.      byte HZ_FLAG[2]   Offset 86    ; 200HZ Timer
  3338.      byte KB_FLAG[2]   Offset 88    ; Keyboard
  3339.      byte RI_FLAG[2]   Offset 90    ; Ring Indicator
  3340.      byte ET_FLAG[2]   Offset 92    ; ETV_CRITIC
  3341.      byte RE_FLAG[2]   Offset 94    ; RESET
  3342.  
  3343.  
  3344.  
  3345.      10.8. Vektor
  3346.      ------------
  3347.  
  3348.  
  3349.      Zeiger auf die berüchtige Routine, wie sie schon mehrmals erwähnt wur-
  3350.      de. Sie testet jeden einzelnen Vektor, in den sich PEACEBUG einhängen
  3351.      kann und entscheidet, ob Sie die Routine ein-, aus- oder an die erste
  3352.      Stelle hängen muss/kann.
  3353.