home *** CD-ROM | disk | FTP | other *** search
Text File | 1994-05-24 | 140.5 KB | 3,353 lines |
- **********************************************************************
- * *
- * PEACEBUG *
- * -------- *
- * *
- * written by: Emanuel Möcklin *
- * Zschokkestrasse 7 *
- * CH-8037 Zürich *
- * FREDDY@ezrz1.vmsmail.ethz.ch *
- * *
- * written with: Turboassembler 1.xx *
- * *
- **********************************************************************
-
-
-
-
- Inhaltsverzeichnis
- ------------------
-
-
- 1. Vorwort
- 2. Starten von PEACEBUG
- 3. Editor
- 3.1. Grundsätzliches
- 3.2. Bildschirmaufbau
- 3.3. Tastaturbelegung
- 3.4. Maus
- 3.5. Funktionstasten
- 4. Befehle
- 4.1. Syntax
- 4.2. Formelauswertung
- 4.3. Listende Befehle
- 4.4. Ausgabenumlenkung
- 4.5. Diskoperationen
- 4.6. Befehlsübersicht
- 4.7. Befehle
- 5. Trace, Breakpoints und dergleichen
- 6. Cache
- 7. Symbole
- 7.1. PEACEBUG.SYM
- 7.2. Lexecute
- 7.3. Resident Symbol Driver
- 8. Reset fest, Reset resident
- 9. Vektoren
- 9.1. XBRA
- 9.2. Ein Wort regelt alles...
- 9.3. Das höherwertige Byte
- 9.4. Das niederwertige Byte
- 9.5. Vektoren, in eigener Sache
- 10. Schnittstelle
- 10.1. Grundsätzliches
- 10.2. Bildschirmschnittstelle
- 10.3. CALL_DEBUGGER_1, CALL_DEBUGGER_2
- 10.4. VERSION
- 10.5. PARAMETER
- 10.6. Userroutinen
- 10.7. FLAGS
- 10.8. Vektor
-
-
-
-
-
-
-
-
- 1. Vorwort
- ----------
-
-
-
- PEACEBUG ist ein Low Level Debugger. Ursprünglich als Hintergrundde-
- bugger konzipiert, ist er in der vorliegenden Version voll symbolisch
- und fähig Programme zu laden. Trotzdem liegen seine Stärken vorallem
- beim Debuggen aus dem Hintergrund. Wenn unvorhergesehene Exceptions
- auftreten, die normalerweise Bomben produzieren, tritt PEACEBUG auf
- den Plan und bietet dem Assemblerkundigen die Möglichkeit, diese Feh-
- ler zu meistern, ohne den Rechner neu booten zu müssen. PEACEBUG ist
- nicht für den Normaluser gedacht, deshalb wird in dieser Anleitung
- vorausgesetzt, dass der geneigte Benutzer über Grundkenntnisse in Sa-
- chen Assembler verfügt.
-
- Wie Sie sicher sofort bemerkt haben, ist die Oberfläche an diejenige
- von Bugaboo angelehnt. Dies trifft ebenso auf die Bedienung und die
- Befehle zu, wobei teilweise entscheidende Unterschiede bestehen, stu-
- dieren Sie deshalb diese Anleitung sorgfältig.
-
- Features von PEACEBUG:
- - erkennt und unterstützt die CPU's MC68000/10/20/30/40
- - erkennt und unterstützt die FPU's MC68881/82
- - läuft auf allen ST(e)'s, TT's und auf dem Falcon
- - läuft mit allen TOS-Versionen, Multigem, Mag!X, MinT/Multitos
- - läuft auf jeder planeorientierten Auflösung
- - läuft im ST- und TT-Ram
- - MC680x0/MC6888x Disassembler
- - MC680x0 Assembler
- - resetfest
- - resetresident
- - komfortable Oberfläche
- - Mausbedienung
- - voll symbolisch
- - umfangreiche und dokumentierte Schnittstelle
- - unabhängig vom Betriebsystem
- - SYSMON Unterstützung (V1.0.9, 24.04.1994)
- - schnell(er) ...
-
- PEACEBUG ist Shareware und darf beliebig weiterkopiert werden. Bei
- regelmässiger Benutzung ist eine Sharewaregebühr von 30 SFr zu über-
- weisen.
- WICHTIG: Schicken Sie mir bitte keine Checks in Fremdwährung, sondern
- nur in Schweizer Franken (SFr), da ich sonst 10 SFr. Gebühr bezahlen
- muss, was immerhin ein Drittel der Sharewaregebühr ausmacht.
- Registrierte User können mir eine Diskette und ein frankiertes Rük-
- kantwortcouvert schicken, Sie erhalten dann die neuste Version.
-
- Und hier das wichtigste:
- Zürcher Kantonalbank
- Bankleitzahl 80-3514-8
- Konto 1113-0818.732
-
-
-
-
-
-
-
-
- 2. Starten von PEACEBUG
- -----------------------
-
-
-
- Es gibt zwei verschiedene Arten PEACEBUG zu starten: Resident oder als
- Programm.
- - Resident: Bedeutet, dass er sich installiert und mit Ptermres been-
- det (TSR). Er kann dann jederzeit über Tastatur aufgerufen werden.
- Default: Alternate+F10 oder Alternate+Control+F10. Diese Tastenkom-
- bination können Sie Ihren Wünschen anpassen >Schnittstelle. Falls
- eine Exception auftritt, meldet sich der Debugger ebenfalls, damit
- Sie entsprechende Massnahmen ergreifen können. Die residente Version
- installiert einen Cookieeintrag mit der Kennung "PBUG" und eine
- Doppelseite.
- - Programm: Bedeutet, dass er sich installiert und in den Editor
- springt. Von dort aus können Sie dann nach Herzenslust debuggen. Sie
- können den Debugger über >QUIT beenden, er entfernt sich dann voll-
- ständig aus dem Speicher. Die Programmversion installiert weder
- einen Cookie noch eine Doppelseite. Es stehen zusätzlich die beiden
- Befehle >RESIDENT und >LEXECUTE zur Verfügung.
-
- Falls der Debugger aus dem Autoordner gestartet wird, installiert er
- sich automatisch resident. Wird er hingegen vom Desktop gestartet,
- meldet er sich als Programm, es sei denn Sie halten Control gedrückt,
- dann wird er ebenfalls resident installiert. Wenn Sie Alternate ge-
- drückt halten, verhindern Sie ein Installieren des Debuggers (egal ob
- als Programm- oder als residente Version). Eine als Programm gestarte-
- te Version kann mit dem Befehl >RESIDENT resident gemacht werden.
-
- Wenn SYSMON nach PEACEBUG gestartet wird, dann teilen sich die beiden
- Programme in TT-High den Bildschirm. Auch funktionieren die I- (In),
- O-Funktionen (Out) von SYSMON, sowie das Aufrufen von PEACEBUG über
- Shift-Links Help.
-
- Wenn sich im gleichen Verzeichnis eine Datei befindet, die dem Pattern
- PEACE*.SYM genügt, wird diese als Symboltabelle interpretiert und
- nachgeladen. Näheres zu dem Thema siehe Kapitel "Symbole".
-
- Der Debugger verlässt sich darauf, dass der _MCH Cookie korrekt ist.
- Falls er keinen findet, geht er von einem ST aus. CPU und FPU werden
- selbstständig erkannt.
-
- Bei vorhandender virtueller Speicherverwaltung (VRAM oder OUTSIDE)
- wird der vom Debugger belegte Speicher vor dem Auslagern geschützt.
-
- Beachten Sie, dass der Debugger auch mehrmals installiert werden kann.
- Dies ist Absicht und auch sinnvoll, z.B. wenn Sie PEACEBUG selber de-
- buggen wollen oder wenn Sie mit verschiedenen Konfigurationen arbei-
- ten wollen.
-
-
-
-
-
-
-
-
- 3. Editor
- ---------
-
-
-
- 3.1. Grundsätzliches
- --------------------
-
-
- Die Bedienung von PEACEBUG orientiert sich an derjenigen von Bugaboo.
- Viele der Funktionen wurden allerdings optimiert und gestatten ein
- viel schnelleres und effizienteres Arbeiten. Die Oberfläche orientiert
- sich an den Anwendern, die keine Zeit mit unnötigen Abfragen verlieren
- wollen. Dass dadurch auch Abstürze produziert werden können, weil eine
- falsche Funktion ausgeführt wird, wird den potentiellen Benutzer kaum
- stören.
- Der Editor benutzt keine Betriebsystemfunktionen, sowohl der Maus- als
- auch der Tastatur- und der Bildschirmtreiber sind unabhängig vom Be-
- triebsystem.
-
-
-
- 3.2 Bildschirmaufbau
- --------------------
-
-
- Die beiden ersten Zeilen zeigen das Funktionstastenmenü. Die erste
- Zeile (F1-F10) wird über F1-F10, die zweite (F11-F20) über Shift F1-
- F10 angesprochen. Die entsprechenden Funktionen können auch durch Ank-
- licken mit der Maus aufgerufen werden.
- Darunter sind die aktuellen Registerinhalte dargestellt, wobei sich
- diese Anzeige aus Platzgründen auf die wichtigsten Register be-
- schränkt, die fehlenden können jederzeit über den Befehl >REGISTER
- abgerufen werden.
-
- - PC = Programmcounter
- - USP = UserStackPointer
- - ISP = InterruptStackPointer (oder SSP = SupervisorStackPointer)
- - MSP = MasterStackPointer
- - SR = StatusRegister. Die Bedeutung der einzelnen Flags/Bits können
- Sie in jedem Buch über die MX680x0 Prozessoren entnehmen. Hell dar-
- gestellte Flags sind gelöscht und können durch Anklicken mit der
- Maus gesetzt bzw. gelöscht werden. Beim Scrollen durch den Cache
- wird die SR-Anzeige durch den Opcode ersetzt, der sich an der Adres-
- se befindet, auf die der aktuelle PC zeigt. Dieser Opocde verschwin-
- det wieder bei jeglicher Maustasten- oder Keyboardaktivität.
- - Die nächsten beiden Zeilen stellen D0-D7 und A0-A7 dar. A7 enthält
- immer den Wert des aktuellen Stackpointers (USP, SSP oder MSP) in
- Abhängigkeit vom Statusregister.
-
- Die Register können editiert werden, jedoch sind dabei die Editiermög-
- lichkeiten eingeschränkt, z.B. wird immer der Überschreibmodus be-
- nutzt.
- Neben den Registern befinden sich zwei Pfeile, eventuell ein Close
- Zeichen und zwei Cacheanzeigen. Näheres zu dem Thema siehe Kapitel
- "Cache".
- Darunter befindet sich Ihr "Workspace", wo Sie Befehle eingeben und wo
- die Ausgaben normalerweise stattfinden.
-
- Anstelle von F20 befindet sich eine Uhr. Diese zeigt die Zeit an:
- - Falls keine Echtzeituhr eingebaut ist, wird direkt die IKBD Uhr
- abgefragt.
- - Auf einem Mega ST wird direkt die eingebaute Uhr abgefragt.
- - Auf einem TT wird ebenfalls die eingebaute Uhr abgefragt.
- - Die Erkennung der Echtzeituhren sollte eigentlich sehr zuverlässig
- sein, d.h. auch in ST's nachträglich eingebaute Uhren werden er-
- kannt.
-
-
-
- 3.3. Tastaturbelegung
- ---------------------
-
-
- Alle hier beschriebenen Funktionen können leicht verschieden sein, je
- nachdem wo sich der Cursor gerade befindet. Es ist nicht sinnvoll,
- hier alle Details zu erläutern, Ausprobieren führt meistens schneller
- zum Ziel.
- Für Details betreffend Cache-Funktionen siehe Kapitel "Cache".
-
- - Pfeil Auf: Der Cursor bewegt sich eine Zeile nach oben, in der ober-
- sten Zeile wird nach Möglichkeit gescrollt oder der Cursor bewegt
- sich ins Registerfeld.
-
- - Pfeil Ab: Der Cursor bewegt sich eine Zeile nach unten, in der un-
- tersten Zeile wird gescrollt.
-
- - Shift Pfeil Auf: wie Pfeil Auf, beim Scrollen wird allerdings immer
- nur 2 Bytes gescrollt. Dies ist nützlich, wenn beim zurückscrollen
- nicht ab der richtigen Stelle disassembliert wurde, weil es ver-
- schiedene sinnvolle Möglichkeiten gab (der Debugger ist schliess-
- lich auch nur ein Mensch). Solches können Sie damit schnell korri-
- gieren.
-
- - Shift Pfeil Ab: Es wird 2 Bytes nach unten gescrollt (ab der ober-
- sten Adresse).
-
- - Control Pfeil Auf: Es wird eine ganze Seite nach oben gescrollt,
- wobei bei disassemblierter Ausgabe, die Seitenlänge nur geschätzt
- werden kann.
-
- - Control Pfeil Ab: Es wird eine ganze Seite nach unten gescrollt,
- hier kann immer die exakte Seitenlänge bestimmt werden.
-
- - Alternate Pfeil Auf: hat nur in der obersten Zeile eine Bedeutung.
- Damit gelangen Sie ins Registerfeld (normalerweise wird gescrollt).
-
- - Pfeil Rechts: bewegt den Cursor nach rechts, in der rechten unteren
- Ecke wird gescrollt.
-
- - Pfeil Links: bewegt den Cursor nach links, in der linken oberen Ecke
- wird gescrollt.
-
- - Shift Pfeil Rechts: holt sich den nächsten Eintrag aus dem History-
- puffer.
-
- - Shift Pfeil Links: holt sich den vorhergehenden Eintrag aus dem Hi-
- storypuffer.
-
- - Control Pfeil Rechts: bewegt den Cursor ans Ende der Zeile oder bei
- Adresszeilen ins Editfeld.
-
- - Control Pfeil Links: bewegt den Cursor an den Anfang der Zeile oder
- bei Adresszeilen ins Adressfeld.
-
- - Alternate Pfeil Rechts: damit scrollen Sie im Cache vorwärts. Den
- gleichen Effekt erzielen Sie durch Anklicken des Pfeiles in der 5ten
- Zeile.
-
- - Alternate Pfeil Links: damit scrollen Sie im Cache zurück. Den
- gleichen Effekt erzielen Sie durch Anklicken des Pfeiles in der 4ten
- Zeile.
-
- - Alternate Clr Home: bewegt den Cache zum ersten Eintrag (Nummer 0).
- Den gleichen Effekt erzielen Sie durch Anklicken des Close Zeichens
- in der 3ten Zeile.
-
- - Escape: löscht die aktuelle Zeile. Beachten Sie die Unterschiede je
- nach Cursorposition (Ausprobieren!)
-
- - Backspace: löscht das Zeichen links vom Cursor. Beachten Sie den
- Unterschied Insert-/Überschreibmodus.
-
- - Insert: fügt ein Leerzeichen oder eine Null ein (je nach Cursorposi-
- tion)
-
- - Shift Insert: schaltet zwischen Insert- und Überschreibmodus um
-
- - Control Insert: fügt eine Leerzeile ein
-
- - Alternate Insert: wechselt zum andern Cache, ohne kopieren des In-
- halts (siehe Kapitel "Cache")
-
- - Shift Alternate Insert: wechselt zum andern Cache, kopiert den In-
- halt (siehe Kapitel "Cache")
-
- - Delete: löscht ein Zeichen
-
- - Shift Delete: löscht den Rest der Zeile
-
- - Control Delete: löscht eine Zeile
-
- - Clr Home: Cursor in die linke obere Ecke
-
- - Shift Clr Home: löscht den ganzen Arbeitsbereich und bringt den Cur-
- sor in die linke obere Ecke
-
- - Help: enspricht dem Befehl >HELP ohne Parameter
-
- - Shift Help: der Debugger reserviert für den Bildschirm (Ascii) so-
- viel Speicher, wie für den Gebrauch des 8*8 Fonts gebraucht wird.
- Wenn Sie den 8*16 Font benutzen (was die Regel sein wird), dann
- liegt die Hälfte dieses Speichers brach, mit Help können Sie diesen
- aktivieren, Sie haben dann zwei unabhängige Screens zur Verfügung.
-
- - Undo: holt sich den zuletzt eingegebenen Befehl aus dem Historypuf-
- fer
-
- - Return/Enter: die aktuelle Zeile wird ausgewertet, siehe >Befehle
-
- - Control 1, 2, ..., 0: Im Gegensatz zu Bugaboo wird aus Rücksicht auf
- speicherarme User nicht die ganze Seite gerettet, sondern nur die
- Adresse am Anfang der Zeile, was aber meistens den gewünschten Ef-
- fekt hat. Mit 1, 2, ... sind übrigens nicht die Zahlen des Zehner-
- blocks gemeint
-
- - Alternate 1, 2, ..., 0: Es wird ab der geretteten Adresse aufgeli-
- stet (Ascii, Hexdump, Disassemble oder List)
-
- - Control P: setzt den PC auf die aktuelle Adresse (Adresse am Zeile-
- nanfang)
-
- - Control B 0, 1, ...: setzt einen der zehn Breakpoints auf die ak-
- tuelle Adresse
-
- - Control G: entspricht dem Befehl >Go auf die Zeilenadresse
-
- - Control Q: entspricht dem Befehl >QUIT
-
- - Control T: entspricht der Taste F1
-
- - Control C: entspricht der Taste F2
-
- - Control R: entspricht der Taste F3
-
- - Control X: entspricht der Taste F4
-
- - Control S: entspricht der Taste F5
-
- - Control A: entspricht der Taste F6
-
- - Control H: entspricht der Taste F7
-
- - Control D: entspricht der Taste F8
-
- - Control L: entspricht der Taste F9
-
- - Control W: entspricht der Taste F10
-
- - Alternate Zahl: bei gedrückter Alternate Taste können Sie ein Zei-
- chen durch Eingeben des Asciicodes erreichen. Die Zahl muss auf dem
- Zehnerblock eingegeben werden.
-
-
-
- 3.4. Maus
- ---------
-
-
- Die Maus hat folgende Funktionen:
- 1. Positionieren des Cursors. Der Cursor kann auch auf ein Register
- gesetzt werden.
- 2. Bedienung der Cacheelemente (Pfeile, Close).
- 3. Auswählen der Funktionstasten.
- 4. Wenn Sie die rechte Maustaste drücken, wird der unter der Maus ste-
- hende Text an die aktuelle Cursorposition kopiert. Es werden aller-
- dings nur die Zeichen $ % . o 0 1 2 3 4 5 6 7 8 9 A B C D E und F
- kopiert. Wenn Sie zusätzlich eine Shifttaste drücken, sind auch die
- Zeichen , - ( ) [ ] { } * # : _ und / zugelassen. Damit können Sie
- komfortabel Adressen (ohne Shift) bzw. Opcodes (mit Shift) kopie-
- ren.
- 5. Wenn Sie mit der linken Maustaste auf eine Adresse doppelklicken,
- listet der Debugger ab dieser Adresse auf (Ascii, Hexdump, Disas-
- sembly oder List Modus). Es kann sich auch um ein Symbol handeln.
-
-
-
- 3.5 Funktionstasten
- -------------------
-
-
- - F1-Trace: führt einen einzelnen Befehl aus. Ein Trace bewirkt ein
- vollständiges Verlassen des Debuggers, d.h. der Bildschirm wird um-
- geschaltet, Register werden zurückgeschrieben, Vektoren restauriert
- usw. Linea, Trapv und Trap 0-15 werden als einzelne Befehle betrach-
- tet. Wenn Sie diese trotzdem tracen wollen, benutzen Sie F4-Texcept.
-
- - F2-Do PC: Es wird hinter dem aktuellen Befehl ein Breakpoint gesetzt
- und der Befehl angesprungen. Diese Funktion ist vorallem bei dbcc's
- sinnvoll. Kein Breakpoint wird übrigens hinter ein bsr oder ein jsr
- gesetzt. Die Funktion funktioniert auch im ROM (siehe Kapitel 5,
- "Trace, Breakpoints und dergleichen").
-
- - F3-Tracrts: sollte nur nach einem bsr/jsr benutzt werden. Nimmt den
- obersten Wert vom Stack und schreibt eine eigene Rücksprungadresse
- drauf. So kann das Programm bis zum nächsten rts vortgesetzt wer-
- den.
-
- - F4-Texcept: wie F1-Trace, nur dass Traps (Trap 0-15, Trapv), Linea
- und der Illegal Opcode Handler getraced werden.
-
- - F5-Skip PC: überspringt den aktuellen Befehl, es wird ein Cacheein-
- trag erzeugt.
-
- - F6-Ascii: listet ab dem PC im Asciimodus
-
- - F7-Hexdump: listet ab dem PC im Hexdumpmodus
-
- - F8-Disassm: listet ab dem PC im Disassembliermodus
-
- - F9-List: listet ab dem PC im Listmodus
-
- - F10-Switch: schaltet zwischen Debugger- und Programmscreen hin und
- her. Es wird auch nach Verlassen und erneutem Einspringen nicht auf
- den Debuggerscreen geschaltet. Dies erlaubt Ihnen beim Tracen, das
- Programm zu beobachten, kann allerdings zu Verwirrung führen, da
- auch bei Auftreten einer Exception nicht umgeschaltet wird. Falls
- Sie also einmal das Gefühl haben, der Rechner habe sich aufgehängt,
- drücken Sie zuerst F10, bevor Sie reseten...
-
- - F11-Tr68020: Simuliert den Tracemodus des MC68020/30/40, d.h. nur
- bei Befehlen, die den PC verändern (change of flow), wie Sprungbe-
- fehlen, rts, rte, rtr, Traps und Linea wird in den Debugger zurück-
- gesprungen.
-
- - F12-Tnosubs: Eine Unterroutine, die über bsr oder jsr aufgerufen
- wird, kann mit dieser Taste übersprungen werden, d.h. die beiden
- Befehle werden wie ein einzelner Befehl behandelt. Wenn der aktuel-
- le Befehl kein bsr/jsr ist wird verfahren wie bei F1-Trace.
-
- - F13-Tracrte: setzt das Programm bis zum nächsten rte fort, die Werte
- auf dem Stack werden nicht geprüft, sollte also nur nach einer Ex-
- ception aufgerufen werden.
- ACHTUNG: falls die Exceptionroutine den PC, der auf dem Stack liegt,
- benützt, darf diese Funktion natürlich nicht aufgerufen werden. Dies
- ist z.B. bei Lineaexceptions der Fall. Sie können daher nicht mit-
- tels F4 ein Linea tracen und dann unmittelbar mit F13 weiterfahren.
- Dies ist erst erlaubt, wenn die Routine sich den Opcode geholt hat.
-
- - F14-GoTraps: setzt das Programm fort, bis dieses ein Betriebsystem-
- aufruf tätigt (Trap 1, Trap 2, Trap 13, Trap 14). Dies ist sehr
- praktisch, wenn man sich nur für die wichtigen Stellen eines Pro-
- gramms interessiert und das sind häufig die Betriebsystemaufrufe.
- Diese funktioniert mittlerweile auch unter einem Multitasking OS
- problemlos, der Debugger muss sich nicht mal in die Vektoren ein-
- hängen.
-
- - F15-Breakpt: setzt oder löscht auf der aktuellen Adresse einen
- Breakpoint. Im Gegensatz zu Control B können Sie die Breakpoint-
- nummer nicht angeben, es wird automatisch die erste freie Nummer
- genommen und eine Meldung ausgegeben:
- "Stop Breakpoint $5 set" oder
- "Stop Breakpoint $5 cleared"
-
- - F16-Font: schaltet um zwischen 8*8 und 8*16 Font. Bei gesetzter
- SCREEN_LOCK Semaphore (>Schnittstelle) kann diese Funktion nicht
- aufgerufen werden.
-
- - F17-Symbol+/-/*: schaltet den Debugger um zwischen symbolisch und
- nichtsymbolisch (Disassembler/Formelinterpreter).
- - Symbol+ bedeutet, dass er alle Symbole benutzt.
- - Symbol* bedeutet, dass er nur die eigenen Symbole benutzt und die-
- jenigen des >Resident Symbol Drivers ignoriert.
- - Symbol- bedeutet, dass er gar keine Symbole benutzt.
-
- - F18-Insert+/-: schaltet zwischen dem Überschreib- (Insert-) und dem
- Insertmodus (Insert+) hin und her.
-
- - F19-GO PC: setzt das Programm beim aktuellen PC fort.
- - F20-GO PC: setzt das Programm beim aktuellen PC fort. Der Button ist
- nicht beschriftet, dort befindet sich die Uhr.
-
-
-
-
-
-
-
-
- 4. Befehle
- -----------
-
-
-
- 4.1. Syntax
- -----------
-
-
- - Jeder Befehl kann abgekürzt werden, solange er eindeutig bleibt. Die
- signifikanten Zeichen sind in Grossbuchstaben geschrieben und bezei-
- chnen die kürzeste Form, die Sie benützen dürfen. Es ist allerdings
- immer erlaubt, mehr Zeichen einzugeben als nötig (h=he=hel=help).
-
- - Die Auswertung Ihrer Eingaben wurde so flexibel wie möglich program-
- miert, z.B. werden überflüssige Eingaben ignoriert und keine Fehler-
- meldungen ausgegeben.
-
- - Werte in eckigen Klammern sind optional, z.B. Help [Befehl] oder Clr
- [From][,To].
- Wenn Sie keine Eingabe machen, wird ein Defaultwert genommen. Bei
- Adressen gilt folgende Regel:
- - Den PC als Defaultadresse nehmen die Befehle Ascii, Disassemble,
- Dump, List, Call, Do und Go.
- - Checksumme nimmt die Sektorpufferadressse als Default.
- - Alle andern Befehle nehmen als Defaultadresse(n) diejenigen des
- geladenen Files/Programms, falls ein solches existiert.
-
- - Werte in geschweiften Klammern sind optional und beliebig oft wie-
- derholbar, z.B. ? Term{,Term}.
-
- - Bei den Befehlen kann etwas in der Form [.b|.w] angegeben sein. Dies
- ist in der Regel die Schrittweite (suchen, vergleichen...) und kann
- sein: byte, word, address, long, no default oder opcode. Näheres
- dazu bei der jeweiligen Befehlsbeschreibung.
-
- Beispiele:
-
- 1. Input: "$001C7FB2>d^a7#1! *MOVE.L D0,-(SP)"
- disassembliert ab dem SP eine Zeile
-
- 2. Input: "com 60,70,10"="Compare 60,80,10" = "cOMp .b 6 0 , 7 0 , 10"
- Vergleicht 16 Bytes der Adressen $60 und $80 in Byteschritten
-
- 3. Input: "sh ^mmusr , 3" = "showm ^psr,3"
- Showmemory im Hexdumpmodus ab dem Wert den das MMUSR enthält
-
- 4. Input: "ascF p84,.remtop,'*PMOVE*'" = "ASCFIND pl84, .remtop,'**P-
- MOVE**'"
- sucht den Bereich von p84 bis remtop nach PMOVE's ab
-
-
-
- 4.2. Formelauswertung
- ---------------------
-
-
- Zahlenbasen:
- % Binär
- . Dezimal
- $ Hexadezimal
- o Oktal
- ' oder " ASCII
- Wird kein Prefix verwendet, wird die Defaultbasis verwendet (normaler-
- weise 16). Diese kann über die Cookieschnittstelle verändert werden.
-
- Vorzeichen:
- + Plus
- - 2er Komplement
- ~ 1er Komplement
-
- Verknüpfungen:
- + Addition
- - Subtraktion
- * Multiplikation (32 Bit)
- / Division (32 Bit)
- | Odern
- & Anden
- ^ Eoren
- > Shift Right
- < Shift Left
- % Modulo
- Die Prioritäten der Verknüpfungen und der Vorzeichen können über die
- Schnittstelle verändert werden. Beispielsweise ist so Strich- vor
- Punktrechnung realisierbar (aber wohl nicht sinnvoll).
-
- Referenzen:
- ^Register: Register werden immer mit einem ^ angesprochen. Es sind
- folgende Register verfügbar:
- D0-D7/A0-A7
- SP (Stack Pointer)
- USP (User Stack Pointer)
- SSP (Supervisor Stack Pointer)
- ISP (Interrupt Stack Pointer)
- MSP (Master Stack Pointer)
- PC (Program Counter)
- SR (Status Register)
- CCR (Condition Code Register)
- SFC (Source Function Code)
- DFC (Destination Function Code)
- VBR (Vector Base Register)
- CAAR (CAche Adress Register)
- CACR (CAche Control Register)
- MMUSR (MMU Status Register)
- PSR=MMUSR (PSR ist 68851 Notation)
- TT0 (Transparent Translation 0)
- TT1 (Transparent Translation 1)
- TC (Translation Control)
- URP (User Root Pointer)
- DTT0 (Data Transparent Translation Register 0)
- DTT1 (Data Transparent Translation Register 1)
- ITT0 (Instruction Transparent Translation Register 0)
- ITT1 (Instruction Transparent Translation Register 1)
- Die beiden Register SRP (Supervisor Root Pointer) und CRP (CPU Root
- Pointer) können nicht benutzt werden, da es sich dabei um 64 Bit Regi-
- ster handelt und der Debugger nur 32 Bit Arithmetik beherrscht.
-
- pb, pw, pl, p Pointer: der dem Pointer folgende Ausdruck wird als
- Adresse interpretiert und deren Inhalt ausgelesen. Mit pb erfolgt dies
- als Byte, mit pw als Word und mit pl oder p als Long.
-
- .Symbol: alle Symbole werden mittels eines . angesprochen
-
- Klammern: sind beliebig tief schachtelbar
-
- Beispiele:
- l p(^vbr+.trace): listet die Traceroutine auf
- l p(p.trap_1-4): listet die Routine auf, die als zweite im Gemdosvek-
- tor hängt (falls diese XBRA benutzen)
-
-
-
- 4.3. Listende Befehle
- ---------------------
-
-
- Fast alle Befehle, die irgendwelche Ausgaben machen, können unterbro-
- chen werden:
- - Escape: Abruch, keine weiteren Ausgaben mehr. Funktioniert zu jedem
- Zeitpunkt, wenn der Cheatmode nicht aktiv ist
- - Space: die Ausgabe wird angehalten, sie kann durch einen beliebigen
- Tastendruck fortgesetzt werden
- - Control: solange die Controltaste gedrückt gehalten wird, wird die
- Ausgabe angehalten
-
- Falls eine Ausgabe länger als eine Zeile ist, wird am Ende der Zeile
- der Asciicode 3 geprintet (Asciicode 3 sollte ein Pfeil sein). Dies
- soll Ihnen anzeigen, dass nicht der ganze String sichtbar ist.
-
-
-
- 4.4. Ausgabenumlenkung
- ----------------------
-
-
- Ausgaben erfolgen meistens auf dem Screen.
- Durch anhängen eines >device: können diese allerdings umgelenkt wer-
- den. Es sind im Moment drei Devices verfügbar: midi: (MIDI), prn:
- (Centronics) und aux: (Seriell).
- Aber nicht nur Devices können Sie angeben, auch Dateien sind erlaubt:
- - >file erzeugt eine Datei namens "file" und schreibt alle Ausgaben in
- dieses File. Wenn die Datei schon existiert, wird sie zuerst ge-
- löscht.
- - >>file öffnet eine Datei und schreibt die Ausgaben ans Ende der Da-
- tei. Wenn Sie noch nicht existiert, wird sie erzeugt.
-
- Beispiele:
- d fc0000,fc0000+.192000 >m:rom_dis
- disassembliert das ROM in eine Datei auf Laufwerk m
- help >help\helpfile
- schreibt die Ausgaben von help in eine Datei helpfile im Ordner help
-
-
-
- 4.5. Diskoperationen
- --------------------
-
-
- Alle Funktionen mit Ausnahme der Diskoperationen sind unabhängig vom
- Betriebsystem. Wenn Sie per Tastatur in den Debugger einspringen, be-
- deutet das, dass der Debugger im Interrupt läuft. Wenn Sie dann ir-
- gendwelche Betriebsystemfunktionen aufrufen, ist die Wahrscheinlich-
- keit, dass das dem Rechner nicht wohlbekommt, ziemlich hoch. Sollten
- Sie also diese Absicht haben, so rufen Sie den Debugger mit Vorteil
- über CALLPBUG auf (im Ordner PEACEBUG\UTILLITY).
- Wenn Fehler bei Diskoperationen auftreten, erscheinen normalerweise
- Alertboxen, was z.B. in Tosprogrammen eher lästig ist, steht doch kei-
- ne Maus zur Verfügung. Um dies im Debugger zu verhindern, installiert
- er einen eigenen etv_critic Handler, es erscheint dann anstatt einer
- Box, eine Meldung wie:
- BIOS-Error -13: (A)bort, (R)etry, (I)gnore?
-
- Folgende Fehler können auftreten:
- -1: Error: Es ist ein Fehler aufgetreten, der nicht genauer spezifi-
- ziert werden kann.
- -2: Drive not ready: Angesprochenes Gerät ist nicht angeschlossen,
- nicht funktionsbereit oder reagiert nicht innerhalb der gesetzten
- Frist (Timeout).
- -3: Unknown Command: Dem angesprochenen Peripheriegerät ist das gege-
- bene Kommando unbekannt.
- -4: CRC Error: Beim Lesen eines Sektors ist ein CRC-Fehler aufgetre-
- ten.
- -5: Bad request: Das Peripheriegerät kann das Kommando nicht aus-
- führen.
- -6: Seek Error: Der angesprochene Track konnte vom Laufwerk nicht er-
- reicht werden.
- -7: Unknown Media: Leseversuch gescheitert, da das Medium keinen kor-
- rekten Bootsektor besitzt.
- -8: Sector not found: Der betreffende Sektor wurde nicht gefunden.
- -9: Out of Paper: Drucker nicht betriebsbereit.
- -10:Write fault: Fehler bei Schreiboperation aufgetreten.
- -11:Read fault: Fehler bei Leseoperation aufgetreten.
- -12:General Error: Allgemeiner Fehler, "reserved for future catastro-
- phes".
- -13:Write on write-protected media: Es wurde versucht, auf ein
- schreibgeschütztes Medium zu schreiben.
- -14:Media change detected: Seit der letzten Schreiboperation wurde das
- Medium gewechselt.
- -15:Unknown device: Das angesprochene Gerät ist dem Betriebsystem un-
- bekannt.
- -16:Bad sectors on format: Beim Formatiervorgang wurden defekte Sekto-
- ren entdeckt.
- -17:Insert other disk request: Eine andere Diskette muss eingelegt
- werden. Tritt nur auf, wenn Laufwerk B angesprochen wird, ohne an-
- geschlossen zu sein.
- -18:Insert Disk: Meta-DOS-Fehler: Medium einlegen.
- -19:Device not responding: Meta-DOS-Fehler: Gerät antwortet nicht.
-
-
-
- 4.6. Befehlsübersicht
- ---------------------
-
- Ascii [From][[,To]|[[,]#Lines]|[,][Bytes]|[.]]
- ASCFind[.w|.l] [From][,To],String - default opcode
- Breakpoints [Number[=Address[,*|,=[Value]|,Number]]]|[[Number]-]
- Call [Address]
- CD [Path]
- CHecksumme [Address][,Checksum][,Number]
- CLr [From][,To]
- COld
- COMpare[.b|.w|.l] [From][,To],Destination - default byte
- COOkie
- COPy [From][,To],Destination
- Disassemble [From][[,To]|[[,]#Lines]|[,][Bytes]|[.]]|:[CPUs]
- DFree [Drive:]
- DIRectory [Path]
- DO [Address]
- DUmp [From][[,To]|[[,]#Lines]|[,][Bytes]|[.]]
- Exit [Value]
- Find[.b|.w|.l] [From][,To],Term,{Term} - default byte
- FILl [From][,To],Term{,Term}
- FRee
- Go [Address][,Breakpoint]
- Help [Command]
- HUnt [From][,To],Term,{Term}
- Info
- List [From][[,To]|[[,]#Lines]|[,][Bytes]|[.]]
- LAst
- LEt Register=Value
- LEXecute [Filename]
- LOad [Filename][,Start[,End]]|-
- LS [Pfad]
- Memory [From][[,To]|[[,]#Lines]|[,][Bytes]]
- MKdirectory Directory
- Newformat
- Observe [[Address][,Bytes]|-|+]
- Page
- PRograms
- Quit [Value]
- Readsector [Track][,Sector][,Side][,Address][,Drive]
- REGister [Register]
- RESident
- RMdirectory [Directory|File]
- Save [Filename][,Start,End]
- SEt Register=Value
- SHowmemory [Term[,List]]|[[Number]-]
- SLow [ON|OFF]
- SWitch [ResolutionDebugger][,ResolutionProgram]
- SYmbol [From][,To]
- SYSinfo
- Trace [Number|+|-|*]
- Warm
- WRitesector [Track][,Sector][,Side][,Address][,Drive]
- Xbra [FirstVector][,LastVector][,ID]
- ? Term{,Term}
- / [.b|.w|.a|.l] [Term]{,Term} - default word
- ! Opcode
- , [.b|.w|.a|.l] [Term]{,Term} - no default
- ) String
- : Address[,Term]{,Term}
-
-
-
- 4.7. Befehle
- ------------
-
-
- 4.7.1. ASCII
-
- Syntax: Ascii [From][[,To]|[[,]#Lines]|[,][Bytes]|[.]]
-
- Gibt einen Speicherbereich als String aus:
- - From: Ab dieser Adresse wird ausgegeben
- - To: Gibt bis zu dieser Adresse aus, bei allen Befehlen bedeutet "To"
- übrigens exklusive "To".
- - #Lines: Anstatt eine Endadresse, kann die Anzahl Zeilen bestimmt wer-
- den, die ausgegeben werden sollen. Das , vor dem # ist optional.
- - [Bytes]: Damit geben Sie die Anzahl Bytes an, die ausgegeben werden.
- Das , vor dem [ ist optional und auch die ] Klammer ist überflüssig.
- - .: Die Ausgabe erfolgt endlos und muss "von Hand" abgebrochen wer-
- den (Escape).
- Wenn Sie weder To, Lines, [Bytes] noch . angegeben, werden default-
- mässig 16 Zeilen ausgegeben.
-
- Beispiele:
- $001C7FF0>asc#2 ; Zwei Zeilen ab dem PC ausgeben
- $001C7FF0>a[30 ; 30 Bytes ab dem PC ausgeben
- $001C7FF0>ascii ^A7,^A7+10 ; 10 Bytes ab dem Stackpointer ausgeben
- $001C7FF0>as^A4[20] ; 20 Bytes ab A4 ausgeben
- $001C7FF0>asci p(.trap_d)-c ; gibt 16 Zeilen ab Bioshandler-12 aus
- $001C7FF0>a. ; gibt ab dem PC endlos aus
-
-
- 4.7.2. ASCFIND
-
- Syntax: ASCFind[.w|.l] [From][,To],String - default opcode
-
- Disassembliert einen Speicherbereich und vergleicht "String" mit dem
- vom Disassembler erzeugten String. Der Vergleich erfolgt Casesensi-
- tive. .w bedeutet, dass die Adresse in Zweierschritten inkrementiert
- wird, .l entsprechend in Viererschritten. Wenn weder .w noch .l ange-
- geben wird, dann wird die Länge des disassemblierten Befehls als In-
- krement genommen. Dies ist sinnvoll, wenn Sie Programmcode durchsuchen
- und ist viel schneller als mit .w. Es kann so allerdings vorkommen,
- dass Befehle nicht gefunden werden.
- Defaultadressen für "From" und "To", sind die Anfangs- bzw. Endadres-
- sen eines geladenen Files.
- Befindet sich die gefundene Adresse innerhalb des Debuggers oder in
- einem von diesem allozierten Speicherbereich, wird sie mit einem *
- gekennzeichnet.
-
- Beispiele:
- $0073250C>ascf e00000,e00000+10000,'*PMOVE*'
- $00E00068>! PMOVE $E36040,TC
- $00E00070>! PMOVE $E36040,TT0
- $00E00078>! PMOVE $E36040,TT1
- $00E01702>! PMOVE $E3654C,CRP
- $00E0170A>! PMOVE $E36554,TC
- $00E01712>! PMOVE $E36558,TT0
- $00E0171A>! PMOVE $E3655C,TT1
- $001203CC>ascfind 0,80,"MOVE*-(A?)"
- $00FC08B6>! MOVEM.L D7-A0,-(A7)
- $00FC08DA>! MOVE SR,-(A7)
- $00FC08EE>! MOVE.L .etv_critic.W,-(A7)
-
-
- 4.7.3. BREAKPOINTS
-
- Syntax:
- Breakpoints [Number[=Address[,*|,=[Value]|,Number]]]|[[Number]-]
-
- - Stopbreakpoints: dieser Breakpoint muss "Anzahl" mal durchlaufen
- werden, bis das Programm unterbrochen und der Breakpoint gelöscht
- wird. Normale Breakpoints (F15 oder Control B) sind Stopbreakpoints
- mit Startwert 1. Die Anzeige mit b gibt aus, wie oft der Breakpoint
- noch durchlaufen werden muss.
- - Zählerbreakpoint: bei jedem Durchlaufen des Breakpoints wird der
- Zähler um eins erhöht, jedoch wird das Programm nie unterbrochen.
- Der aktuelle Zählerstand kann mittels b erfahren werden.
- - Permanentbreakpoints: Breakpoint, der nie gelöscht wird und nur ma-
- nuel entfernt werden kann (B- oder B Nummer-).
-
- - Breakpoints ohne Parameter: zeigt alle gesetzten Breakpoints
- - Breakpoints Number: zeigt nur einen
- - Breakpoints -: löscht alle Breakpoints
- - Breakpoints Number -: löscht nur einen
- - Breakpoints Number=Address: setzt einen Stopbreakpoint an der ange-
- gebenen Adresse mit Startwert 1
- - Breakpoints Number=Address,Number: setzt einen Stopbreakpoint mit
- Startwert "Number"
- - Breakpoints Number=Address,=: setzt einen Zählerbreakpoint mit
- Startwert 0
- - Breakpoints Number=Address,=Value: setzt einen Zählerbreakpoint mit
- Startwert "Value"
- - Breakpoints Number=Address,*: setzt einen Permanentbreakpoint
-
- Breakpoints dürfen auch im ROM gesetzt werden, dann wird das Programm
- allerdings im Tracemodus durchlaufen. Näheres zu dem Thema siehe
- Kapitel "Trace, Breakpoints und dergleichen".
-
- Beispiele:
- $12345678>b0=1000,*
- $12345678>b7=2000,=
- $12345678>b5=3000,20
- $12345678>b
- Breakpoint $0=$00001000,* ; Permanent Breakpoint
- Breakpoint $5=$00003000,$00000020 ; Stop Breakpoint (Zähler=20)
- Breakpoint $7=$00002000,=$00000000 ; Zähler Breakpoint (Zähler=0)
- $12345678>b5-
- $12345678>b7
- Breakpoint $7=$00002000,=$00000000
-
-
- 4.7.4. CALL
-
- Syntax: Call [Address]
-
- Ruft ein Unterprogramm auf, das mittels rts abgeschlossen sein muss.
- Defaultadresse ist der aktuelle PC.
-
-
- 4.7.5. CD
-
- Syntax: CD [Path]
-
- CD ohne Parameter: gibt den aktuellen Pfadnamen aus.
- CD Pfad: wechselt den aktuellen Pfad.
-
- Beispiele:
- $00100B70>cd j:peacebug
- J:\PEACEBUG\
- $00100B70>cd c:
- C:\GEMINI\GEMINI\
- $00100B70>cd
- C:\GEMINI\GEMINI\
-
-
- 4.7.6. CHECKSUMME
-
- Syntax: CHeckumme [Address][,Checksum][,Number]
-
- Berechnet eine Prüfsumme (alle Words addieren) über einen Speicherbe-
- reich und gibt den Wert aus, den Sie zu einem Wort in diesem Bereich
- addieren müssen um die Checksumme 0 zu erhalten.
- Mit diesem Befehl können Sie z.B. Bootsektoren ausführbar machen oder
- Checksummen von vermeintlichen Doppelseiten berechnen (Checksumme
- $5678).
- Defaultmässig ist die Prüfsumme $1234, es wird über 256 Worte addiert
- und Address zeigt auf den Sektorpuffer (>READSECTOR).
-
- Beispiele:
- $001C7FB2>ch 600
- Check: $1234
- $001C7FB2>: 600,pw600+1234 ; addiert $1234 an die Adresse $600
- $001C7FB2>ch 600
- Check: $0000
- $001C7FB2>ch 600,5678
- Check: $4444
-
-
- 4.7.7. CLR
-
- Syntax: CLr [From][,To]
-
- Löscht den angegebenen Speicherbereich. Wie immer wird "To" selber
- nicht gelöscht, z.B. löscht clr 100,200 bis und mit Adresse 1FF.
- Defaultadressen für "From" und "To", sind die Anfangs- bzw. Endadres-
- sen eines geladenen Files.
-
-
- 4.7.8. COLD
-
- Syntax: COld
-
- Der Rechner führt einen Kaltstart aus. Der Debugger wird endgültig aus
- dem System entfernt.
-
-
- 4.7.9. COMPARE
-
- Syntax: COMpare[.b|.w|.l] [From][,To],Destination - default byte
-
- Vergleicht zwei Speicherbereiche und gibt die unterschiedlichen Adres-
- sen aus. Das Inkrement beträgt .b=Byte, .w=Word oder .l=long, wobei
- dann natürlich auch der Vergleich byte, word oder long erfolgt. De-
- faultmässig wird byteweise verglichen.
- Defaultadressen für "From" und "To", sind die Anfangs- bzw. Endadres-
- sen eines geladenen Files.
-
- Beispiele:
- $001C7FB2>com 0,10,fc0000
- $00FC0009 $00FC000A $00FC000B $00FC000D $00FC000E $00FC000F
- $001C7FB2>comp.w 0,10,fc0000
- $00FC0008 $00FC000A $00FC000C $00FC000E $00FC0010
- $001C7FB2>co.l 0,10,fc0000
- $00FC0008 $00FC000C $00FC0010
-
-
- 4.7.10. COOKIE
-
- Syntax: COOkie
-
- Gibt eine Liste aller Cookieeinträge aus.
- Der Debuggereigene Eintrag wird mit einem * gekennzeichnet (nützlich
- wenn zwei Debugger installiert sind).
-
-
- 4.7.11. COPY
-
- Syntax: COPy [From][,To],Destination
-
- Kopiert einen Speicherbereich. Überlappende Bereiche werden korrekt
- kopiert.
- Defaultadressen für "From" und "To", sind die Anfangs- bzw. Endadres-
- sen eines geladenen Files.
-
-
- 4.7.12. DISASSEMBLE
-
- Syntax: Disassemble [From][[,To]|[[,]#Lines]|[,][Bytes]|[.]]|:[CPUs]
-
- Gibt einen Speicherbereich in disassemblierter Form aus. Die Parameter
- entsprechen denjenigen von >ASCII, mit Ausnahme von :[CPUs]:
- - Mittels d: erfahren Sie, für welche Prozessoren der Disassembler
- konfiguriert ist. Bei Programmstart ist das immer der Prozessor, der
- auch im Rechner vorhanden ist.
- - Mittels d:CPUs: können Sie den Disassembler veranlassen, Code für
- bestimmte CPU's zu erzeugen, wobei CPU folgendermassen codiert ist:
- Bit 0=MC68000
- Bit 1=MC68010
- Bit 2=MC68020
- Bit 3=MC68030
- Bit 4=MC68040
- Bit 6=MC68881/2
- Diese Bits können gleichzeitig gesetzt sein, dann wird Code für mehr
- als eine CPU erzeugt (bei Mehrdeutigkeiten wird die Ausgabe für den
- "höherwertigen" Prozessor genommen, d.h. 60FF wird als BRA.L *2 und
- nicht als BRA.S *1 übersetzt.
-
- Wenn sich die disassemblierte Address innerhalb Debuggers befindet,
- wird das Disassembly mit einem Asterix * gekennzeichnet.
-
- Negative Zahlen werden normalerweise als vorzeichenlose Zahlen ausge-
- geben, mit Ausnahme von denjenigen zwischen -1 und -9. Z.B. wird -.100
- als $9C, -5 aber als -5 ausgegeben.
-
- Beachten Sie, dass das Basedisplacement in der auf Atari unüblichen
- Schreibweise innerhalb der Klammer ausgegeben wird. Dies ist offiziel-
- le Motorola Notation. Auch der Assembler akzeptiert Basedisplacements
- nur in dieser Schreibweise.
-
- Wenn der Disassembler drei Fragezeichen hinter das Disassembly
- schreibt, dann wurde ein Befehl gefunden, der zwar erlaubt ist, aber
- nicht sehr sinnvoll. Im Moment tut er dies aber nur bei Sprüngen auf
- ungerade Adressen (bsr/bcc/jsr/jmp/fbcc usw.)
- Falls er >?< hinter das Disassembly schreibt, heisst dies, dass ein
- Befehl gefunden wurde, der offiziell nicht erlaubt ist, aber trotzdem
- in der angegebenen Form funktioniert:
- - Dies ist z.B. der Fall bei der Adressierungsart "Memory Indirect
- Post-indexed with Index Suppress". Diese Adressierungsart ist gemäss
- Motorola "reserved" (respektive dessen Codierung). Versuche haben
- aber gezeigt, dass der Befehl trotzdem ausgeführt wird und zwar er-
- wartungsgemäss wie "Memory Indirect Pre-Indexed with Index Sup-
- press".
- - Ein FBcc mit conditional predicate 1XXXXX ist gemäss Motorola reser-
- viert [Zitat: "Not used, redunant encodings with 0XXXXX"], wird von
- PEACEBUG aber übersetzt, da er funktioniert.
- - usw...
- Falls Sie wirklich das Vergnügen haben sollten, auf ein >?< zu stos-
- sen, dann nehmen Sie ein User's Manual hervor und schauen sich die
- Codierung des Befehls an.
- Das Übersetzen scheint mir deswegen sinnvoll, weil es vielleicht Pro-
- gramme gibt, die diese Befehle absichtlich benützen...
-
- Beispiele:
- $001CDAEA>d:%1111
- Disassembler active for MC68000/10/20/30
- $001CDAEA>d 1cdace #5
- $001CDACE>/ 4E7A ; *??? $4E7A
- $001CDAD0>/ 0003,3100 ; *ORI.B #0,D3
- $001CDAD4>/ 4E75 ; *RTS
- $001CDAD6>/ 5148 ; *SUBQ.W #8,A0
- $001CDAD8>/ F010,4A00 ; *PMOVE SRP,(A0)
- $001CDADC>d:%11111
- Disassembler active for MC68000/10/20/30/40
- $001CDACE>/ 4E7A,0003 ; *MOVEC TC,D0
- $001CDAD2>/ 3100 ; *MOVE.W D0,-(A0)
- $001CDAD4>/ 4E75 ; *RTS
- $001CDAD6>/ 5148 ; *SUBQ.W #8,A0
- $001CDAD8>/ F010,4A00 ; *PMOVE SRP,(A0)
-
-
- 4.7.13. DFREE
-
- Syntax: DFree [Drive:]
-
- Gibt den freien Speicherplatz eines Laufwerkes aus.
- Defaultlaufwerk ist das aktuelle (zu erfahren mit >CD)
-
- Beispiel:
- $001C7FB2>dfreea:
- Drive A: 00001239 K used, 00000184 K free, 00001423 K totally
-
-
- 4.7.14. DIRECTORY
-
- Syntax: DIRectory [Path]
-
- Dient zum Anzeigen des Inhaltsverzeichnisses eines Laufwerks. Momentan
- können nur Pfade angegeben werden und keine Suchmasken (z.B. *.PRG).
- Auch erfolgt die Ausgabe noch unsortiert.
-
- Beispiele:
- $001C7FEC>dir
- CD "." ;.0 28:14:52 15.06.1992
- CD ".." ;.0 28:14:52 15.06.1992
- LOAD "README" ;.120009 20:60:20 00.00.1980
- LOAD "PEACEBUG.SRC" ;.342614 21:69:34 04.01.1980
- CD "UTILLITY" ;.0 28:17:06 15.06.1992
- CD "REMOTE" ;.0 28:18:32 15.06.1992
- CD "MODULE" ;.0 28:18:34 15.06.1992
- LEX "PEACEBUG.PRG" ;.58949 21:64:24 04.01.1980
- LOAD "PEACEBUG.SYM" ;.4950 20:62:06 00.00.2028
- LOAD "README.TXT" ;.106561 28:03:38 04.07.1992
- $001C7FEC>dir ..
- CD "." ;.0 28:14:52 15.06.1992
- CD ".." ;.0 28:14:52 15.06.1992
- CD "M_MAUS" ;.1024 37:71:40 12.03.1992
- CD "M_SPOOL" ;.1024 37:71:40 12.03.1992
- CD "PBUGCONF" ;.1024 37:71:30 12.03.1992
- CD "PEACEBUG" ;.1024 37:71:30 12.03.1992
- CD "TOP_WIND" ;.0 37:71:38 12.03.1992
- CD "WINDOW" ;.0 37:72:40 12.03.1992
- LOAD "SERIAL" ;.337 20:60:40 00.00.2028
- LOAD "RELEASE" ;.3188 20:60:24 00.00.2028
-
-
- 4.7.15. DO
-
- Syntax: DO [Address]
-
- DO: Hat den gleichen Effekt wie F2-Do PC.
- DO Address: Setzt den PC auf den angegebenen Wert und führt ein Do PC
- aus.
-
-
- 4.7.16. DUMP
-
- Syntax: DUmp [From][[,To]|[[,]#Lines]|[,][Bytes]|[.]]
-
- Gibt einen Speicherbereich im Hexdumpmodus aus. Die Parameter entspre-
- chen denjenigen von >ASCII.
-
-
- 4.7.17. EXIT
-
- Syntax: Exit [Value]
-
- Wenn der Debugger als Programm gestartet wurde, wird er beendet und
- aus dem Speicher entfernt. Andernfalls wird ein Pterm ausgeführt (Gem-
- dos 76), wobei der Rückgabewert defaultmässig -1 ist. Wenn ein Pro-
- gramm abstürzt und Sie den Fehler nicht beheben können, kann manchmal
- mittels dieser Funktion weitergefahren werden.
-
-
- 4.7.18. FIND
-
- Syntax: Find[.b|.w|.l] [From][,To],Term,{Term} - default byte
-
- Durchsucht den Speicher und zeigt alle Adressen an, die Term,{Term}
- enthalten. Term ist ein Ausdruck, dem zusätzlich durch Anhängen von
- .b, .w, .a oder .l eine bestimmte Länge gegeben werden kann:
- 1.b = $01 1 Byte
- 1.w = $0001 2 Bytes
- 1.a = $000001 3 Bytes
- 1.l = $00000001 4 Bytes
- Wenn keine Länge angegeben wird, erweitert der Debugger die Zahl auf
- die kürzest mögliche Länge, wobei Zahlen >$FFFF allerdings immer auf
- long erweitert werden nicht auf 3 Bytes.
- Term kann auch ein beliebig langer String sein (normalerweise sind
- Strings nur 4 Zeichen lang).
- Der Debugger kreiert aus Term{,Term} einen einzigen String und sucht
- diesen, wobei natürlich wieder das Inkrement beim Suchen bestimmt wer-
- den kann (.b=byte, .w=word, .l=long). Dies beschleunigt den Vorgang,
- wenn Sie z.B. Opcodes suchen, die sowieso nur an gerader Adresse lie-
- gen dürfen.
- Defaultadressen für "From" und "To", sind die Anfangs- bzw. Endadres-
- sen eines geladenen Files.
- Befindet sich die gefundene Adresse innerhalb des Debuggers oder in
- einem von diesem allozierten Speicherbereich, wird sie mit einem *
- gekennzeichnet.
-
- Beispiele:
- $001C7FB2>m 0#1
- $00000000>, 60,2E,01,06,00,FC,00,30,00,1C,DB,E4,00,20,FA,5C
- $001C7FB2>f 0,10,fc0030
- $00000004
- $001C7FB2>f 0,10,fc0030.a
- $00000005
- $001C7FB2>fi fc0000,fc0000+.192000,'Atari'
- $00FEBC31
- $001C7FB2>m #1
- $00FD004F>, 00,FF,C4,3B,46,FF,FC,3A,87,4E,71,4A,D5,6B,FA,51
- $001C7FB2>find fc0000,fc0000+.192000,ff.w,c4,";F"
- $00FD004F
-
-
- 4.7.19. FILL
-
- Syntax: FILl [From][,To],Term{,Term}
-
- Füllt einen Speicherbereich mit Term{,Term}, wobei Term aufgebaut sein
- kann, wie bei >FIND.
- Defaultadressen für "From" und "To", sind die Anfangs- bzw. Endadres-
- sen eines geladenen Files.
-
- Beispiel:
- $001C023A>fill 600,700,10,10.w,10.a,10.l,'PEACEBUG'
- füllt den Bereich zwischen 600 und 700 (exklusive wie immer) mit:
- $10,00,10,00,00,10,00,00,00,10,50,65,61,63,65,62,75,67='PEACEBUG'
-
-
- 4.7.20. FREE
-
- Syntax: FRee
-
- Gibt den grössten allozierbaren Speicherblock aus.
-
-
- 4.7.21. GO
-
- Syntax: Go [Address][,Breakpoint]
-
- Startet das unterbrochene Programm.
- Zusätzlich kann auch ein Breakpoint angegeben werden, so dass Sie das
- Programm quasi From,To starten können.
- Defaultadresse ist der aktuelle PC.
-
- Beispiele:
- $12345678>g ,^pc+10
- Startet das Programm und setzt 16 Bytes hinter dem PC einen Break-
- point.
- $12345678>go p(b4),p(b4)
- Setzt den PC auf den Bioshandler. Beachte, dass die Klammern nötig
- sind, weil ein pb4 als pb 4 (Bytepointer Adresse 4) und nicht als p
- b4 (Longpointer Adresse B4) ausgewertet wird!
-
-
- 4.7.22. HELP
-
- Syntax: Help [Command]
-
- Gibt die Syntax der Befehle aus. Wird kein Befehl angegeben, werden
- alle Befehle aufgelistet.
-
- Beispiele:
- $0012F27C>h d
- Disassemble [From][[,To]|[[,]#Lines]|[,][Bytes]|[.]]|:[CPUs]
- $0012F27C>he hun
- HUnt [From][,To],Term{,Term}
-
-
- 4.7.23. HUNT
-
- Syntax: HUnt [From][,To],Term{,Term}
-
- Entspricht dem Befehl find.w, weshalb er sich vorallem zum Suchen von
- Opcodes anbietet.
-
-
- 4.7.24. INFO
-
- Syntax: Info
-
- Gibt Ihnen einige Daten zum geladenen Programm/File und zum Debugger
- aus:
-
- Programstart: $001E738A Length: 75798
- TEXT-Segment: $001E748A Length: 45284
- Data-Segment: $001F256E Length: 20830
- BSS-Segment: $001F76CC Length: 9428
- Symboltable: $000DA440 Number: 2730
- - Fastloadbit is set
- - Program may load into alternative RAM
- - Malloc calls may be satisfied from alternative RAM
- - Privatemode. Only the process itself (and the OS) can use the
- memory
- - Program has shared memory
- Filename: H:\PEACE.PRG
-
- Debuggerstart: $00030712 Length: 89764
- TEXT-Segment: $00030812 Length: 50674
- DATA-Segment: $0003CE04 Length: 21043
- BSS-Segment: $00042037 Length: 17791
- Cookie: $001C7E44
- Sectorbuffer: $001CCD2C
-
-
- 4.7.25. LIST
-
- Syntax: List [From][[,To]|[[,]#Lines]|[,][Bytes]|[.]]
-
- Gibt einen Speicherbereich im Listmodus aus. Die Parameter entsprechen
- denjenigen von >ASCII. Falls ein Programm geladen wurde, dass Labels
- enthält, wird dies in der Ausgabe berücksichtigt.
- Ist der >Resident Symbol Driver installiert, wird das zur ausgegebenen
- Adresse passende Programm zusätzlich angezeigt:
- $01057536>! [GEMRAM] RTS ; 4E75
-
-
- 4.7.26. LAST
-
- Syntax: LAst
-
- Gibt die jeweils letzte Einsprungsmessage aus (das ist die Meldung,
- die in der ersten Zeile invers erscheint).
-
-
- 4.7.27. LET
-
- Syntax: LEt Register=Value
-
- Setzt den Wert eines Registers. Es sind alle Register erlaubt, die
- schon unter >Formelauswertung beschrieben wurden. Beim CRP und beim
- SRP können momentan nur die unteren 32 Bits gesetzt werden. Beachte,
- dass bei diesem Befehl die Register ohne ^ angesprochen werden.
-
-
- Beispiele:
- $0002428A>letpc=pE0
- Setzt den PC auf den Handler für einen PMMU Configuration Error
- $0002428A>letccr=^sr&ff
- Es passiert gar nichts
-
-
- 4.7.28. LEXECUTE
-
- Syntax: LEXecute [Filename]
-
- Lädt ein ausführbares Programm mittels Pexec.
- Der PC wird automatisch auf den Anfang des geladenen Files gesetzt
- Eine Symboltabelle im GST-/DRI-Format wird geladen, allerdings werden
- nur segmentrelative Symbole berücksichtigt, alle andern werden ge-
- löscht (insbesondere die Konstanten). Debugger, die dies nicht machen,
- erzeugen meist ziemlich seltsame Disassemblies was die Labels anbe-
- langt.
- Der Debugger merkt sich den Filenamen inklusive Pfad. Wenn Sie Filena-
- me weglassen, wird der intern gespeicherte Name benutzt (zu erfahren
- über >INFO).
- Dieser Befehl steht in der residenten Version NICHT zur Verfügung.
-
-
- 4.7.29. LOAD
-
- Syntax: LOad [Filename][,Start[,End]]|-
-
- - LOAD [Filename]: Eine Datei wird vollständig in den Speicher gela-
- den. Der benötigte Speicher wird, falls keine Startadresse angege-
- ben wird, mittels Malloc reserviert. Wenn Sie eine Endadresse ange-
- ben, wird nicht die ganze Datei geladen, sondern nur End-Start Bytes
- (End ist also das erste nicht mehr benutzte Byte).
- Der Debugger merkt sich den Filenamen inklusive Pfad. Wenn Sie File-
- name weglassen, wird der intern gespeicherte Name benutzt.
- - LOAD -: gibt den mittels Malloc reservierten Speicher frei.
- Es wird ab dem Anfang des Files aufgelistet aber der PC nicht auf
- diese Adresse gesetzt.
-
- Beispiele:
- $12345678>load m:\test.prg
- Programstart: $001E3858 Length: 1379
- Filename: M:\TEST.PRG
- $001E3858>load ,238000
- Programstart: $00238000 Length: 1379
- Filename: M:\TEST.PRG
- $00238000>load ,238000,238200
- Programstart: $00238000 Length: 512
- Filename: M:\TEST.PRG
-
-
- 4.7.30. LS
-
- Syntax: LS [Path]
-
- Entspricht dem Befehl >DIR.
-
-
- 4.7.31. MEMORY
-
- Syntax: Memory [From][[,To]|[[,]#Lines]|[,][Bytes]]
-
- Enstspricht dem Befehl >DUMP.
-
-
- 4.7.32. MKDIRECTORY
-
- Syntax: MKdirectory Directory
-
- Legt einen neuen Ordner an. Es kann auch ein ganzes Verzeichnis ange-
- geben werden.
-
- Beispiel:
- $12345678>mk m:\peacebug\testit
- legt auf Laufwerk M, im Ordner peacebug einen Ordner namens "testit"
- an.
-
-
- 4.7.33. NEWFORMAT
-
- Syntax: Newformat
-
- Diese Funktion initialisiert den Bildschirm neu:
- 1. Auf Programmscreen schalten
- 2. >CLEAR_SCREEN aufrufen
- 3. >GET_PARAMETER aufrufen
- 4. >NEW_FORMAT aufrufen
- 5. >PRINT_SCREEN aufrufen
- 6. Auf Debuggerscreen schalten
-
- Diese Funktion passt also die Debuggerauflösung an diejenige des rest-
- lichen Systems an und wird vorallem nach einem Auflösungswechsel be-
- nutzt (siehe auch >SWITCH). Einen Auflösungswechsel bemerkt der Debug-
- ger nicht, so dass er nicht in der gleichen Auflösung läuft, wie das
- Programm. Das wäre nicht weiter schlimm, wenn das Screenumschalten
- nicht flimmern würde.
- Achtung: Da GET_PARAMETER auf Lineavariablen zugreift, sollte diese
- Funktion nicht benützt werden, wenn ein Program die Auflösung selber
- umgeschaltet hat (z.B. bei Spielen häufig der Fall), denn die Lineava-
- riablen werden dann normalerweise nicht gesetzt.
-
-
- 4.7.34. OBSERVE
-
- Syntax: Observe [[Address][,Bytes]|-|+]
-
- Observe dient dazu, Speicher auf Veränderungen zu überwachen und diese
- gegebenenfalls anzuzeigen. Dazu wird der 200HZ Timer benutzt.
-
- - Observe ohne Parameter: gibt aus, welchen Speicher sie gerade über-
- wachen lassen.
- - Observe Address,Bytes: schaltet die Observefunktion ein und setzt
- den zu überwachenden Bereich fest. "Bytes" kann Werte zwischen 1 und
- 1024 annehmen, Defaultwert ist 1 (wenn sie "Bytes" schon mal gesetzt
- haben, wird dieser Wert als Default genommen).
- - Observe -: schaltet die Observefunktion aus.
- - Observe +: schaltet die Observefunktion ein.
-
- Wenn eine Veränderung festgestellt wurde, wird dies angezeigt und die
- Funktion ausgeschaltet, damit der Debugger nicht endlos Veränderungen
- feststellt. Weiter "Observen" können Sie dann mittels O+. Da der Be-
- reich im Interrupt überprüft wird, kann natürlich die genaue Adresse,
- an der die Änderung stattfand, nicht exakt angezeigt werden. Sollte
- dies nötig, müssen Sie auf eine Usertraceroutine zurückgreifen.
-
- Beispiele:
- $00123456>o+
- Observing $001 byte(s) at address $00000000
- $00123456>o ,.1024
- Observing $400 byte(s) at address $00000000
- $00123456>o 10000
- Observing $400 byte(s) at address $00010000
- $00123456>o
- Observing $400 byte(s) at address $00010000
- $00123456>o-
-
-
- 4.7.35. PAGE
-
- Syntax: Page
-
- Page sucht den Speicher nach Doppelseiten ab.
- Eine Doppelseite ist ein 512 Byte langer Bereich, der auf einer durch
- 512 teilbaren Adresse liegen muss. Das erste Long enthält das Magic
- $12123456, das zweite Long ist ein Pointer auf die Seite selber. Und
- schliesslich ist die Prüfsumme (Word) über diesen Bereich $5678.
- Diese Doppelseiten werden nach einem Warmstart vom Betriebsystem ge-
- sucht und angesprungen. Dadurch lassen sich resetresidente Programme
- schreiben, allerdings ist dieses Feature undokumentiert, aber bisher
- in jeder TOS-Version enthalten. Durchsucht wird übrigens nur das ST-
- RAM, die Suche beginnt bei phystop und endet bei $600. Die Behauptung
- im Profibuch, der Speicher werde durch die Gemdosinitiialisierung ge-
- löscht, so dass nur die Seite an Adresse $600 übrigbleibe, stimmt na-
- türlich nicht. Richtig ist, dass der Speicher logisch freigegeben wird
- und in der Doppelseite neu reserviert werden muss, damit er nicht
- durch das erste Autoordnerprogramm, das gleich nach Suche der Doppel-
- seiten gestartet wird, überschrieben wird. Probleme kann es nur mit
- dem HD-Treiber geben, da dieser noch vor den Doppelseitenprogrammen
- ausgeführt wird (vorallem, wenn er AHDI heisst ...).
-
-
- 4.7.36. PROGRAMS
-
- Syntax: PRograms
-
- Dieser Befehl funktioniert nur, wenn der Resident Symbol Driver ins-
- talliert ist (siehe Kapitel "Symbole").
- Er gibt eine Liste aller gestarteten Programme und ein paar dazugehö-
- rende Informationen aus.
-
- Beispiel:
- $0117512E>pr
- Name: HDX.PRG
- Basepage: $0117502E
- TEXT-Segment: $0117512E
- Length: $00026C94
- Symbols: $0216
-
- Name: PEACEBUG.PRG
- Basepage: $0008B44E
- TEXT-Segment: $0008B54E
- Length: $0001555A
- Symbols: $0000
-
-
- 4.7.37. QUIT
-
- Syntax: Quit [Value]
-
- Entspricht dem Befehl >EXIT.
-
-
- 4.7.38. READSECTOR
-
- Syntax: Readsector [Track][,Sector][,Side][,Address][,Drive]
-
- Lädt einen Sektor mittels XBIOS 8.
- Defaultmässig sind eingestellt: Track=0, Sector=1, Side=0, Address=ein
- vom Debugger zur Verfügung gestellter Puffer (1024 Bytes lang),
- Drive=0.
- Wenn Sie andere Parameter angeben, werden diese beim nächsten Readsec-
- tor wieder benutzt. Readsector benutzt natürlich die gleichen Werten
- wie >WRITESECTOR.
-
- Beispiele:
- $00237322>r
- Sectorbuffer: $001D752A
- ; liest den Bootsektor von Laufwerk A in den internen Puffer
- $00237322>r ,,,600,1
- Sectorbuffer: $001D752A
- ; liest den Bootsektor von Laufwerk B an die Adresse $600
-
-
- 4.7.39. REGISTER
-
- Syntax: REGister [Register]
-
- Gibt den Inhalt eines Register aus. Es sind alle Register erlaubt, die
- schon unter >Formelauswertung beschrieben wurden. Register werden wie
- bei >LET ohne ^ angegeben. Wird kein gültiges Register angegeben, wer-
- den alle Registerinhalte angezeigt, wobei sich die Anzeige auf die
- vorhandenen Register beschränkt, je nach Prozessor.
-
- Beispiele:
- $001C732A>r ccr
- 01
- $001C732A>r srp
- 0000000000000000
-
-
- 4.7.40. RESIDENT
-
- Syntax: RESident
-
- Falls der Debugger als Programm gestartet wurde, kann er mittels die-
- sem Befehl resident gemacht werden. Der Debugger installiert zu diesem
- Zweck nachträglich einen Cookieeintrag und eine Doppelseite. Darauf
- wird er verlassen und kann dann jederzeit über Tastatur aufgerufen
- werden.
- Dieser Befehl steht in der residenten Version natürlich nicht zur Ver-
- fügung.
-
-
- 4.7.41. RMDIRECTORY
-
- Syntax: RMdirectory [Directory|File]
-
- Dient zum Löschen eines Ordners oder einer Datei. Im Gegensatz zu vie-
- len Commandline Interpretern, ist der Befehl für Ordner und Dateien
- identisch. Es kann auch ein kompletter Pfad angegeben werden.
- Defaultmässig wird das zuletzt geladende File benutzt.
-
- Beispiel:
- $12345678>rm m:\peacebug\testit
-
-
- 4.7.42. SAVE
-
- Syntax: Save [Filename][,Start,End]
-
- Speichert einen Speicherbereich.
- Save übernimmt die beim Laden benutzten Variablen, falls keine anderen
- angeben werden.
-
- Beispiele:
- $12345678>load m:\test.prg
- $12345678>save ,fc0000,fc0000+.1000
- speichert 1000 Bytes ab Adresse fc0000 in der Datei "M:\TEST.PRG"
- $12345678>save c:\test2
- speichert "test.prg" unter dem neuen Namen "C:\TEST2"
- (Man beachte dass sich so auch files kopieren lassen)
-
-
- 4.7.43. SET
-
- Syntax: SEt Register=Value
-
- Entspricht dem Befehl >LET.
-
-
- 4.7.44. SHOWMEMORY
-
- Syntax: SHowmemory [Term[,List]]||[[Nummer]-]
-
- Durch diesen Befehl können Sie sich wichtige Speicherbereiche ständig
- anzeigen lassen. Dabei kann Term ein Ausdruck beliebiger Komplexität
- sein, d.h. er kann Register, Symbole und Adressen referenzieren. Die
- Anzeige wird immer aktuallisiert, falls sich der Wert von Term oder
- der Speicherinhalt, auf den Term zeigt, ändern sollte. Es können maxi-
- mal 10 Bereiche gleichzeitig angezeigt werden. Jedem Bereich wird eine
- Zeile unterhalb der Registeranzeige geopfert. Ein Bereich wird automa-
- tisch eliminiert, wenn nicht mehr genug Platz auf dem Bildschirm zur
- Verfügung steht, da mindestens eine Zeile unterhalb dieser Anzeige
- übrig bleiben muss.
-
- - SHOWMEMORY ohne Parameter: gibt eine Liste aller Bereiche aus, die
- momentan angezeigt werden.
- - SHOWMEMORY Term: zeigt ab sofort den neuen Bereich an, der durch
- "Term" definiert wird. Es wird im Hexdumpmodus ausgegeben.
- - SHOWMEMORY Term,List: zeigt ab sofort den neuen Bereich an, der
- durch "Term" definiert wird. List gibt an, wie die Ausgabe erfolgen
- soll:
- 1=List
- 2=Disassemble
- 3=Hexdump
- 4=Ascii
- - SHOWMEMORY -: entfernt alle Bereiche, d.h. fortan werden keine mehr
- angezeigt.
- - SHOWMEMORY Nummer -: entfernt den Bereich, den Sie mit Nummer ange-
- ben (das ist die Nummer, die am Anfang der Zeile steht), d.h. er
- wird fortan nicht mehr angezeigt.
-
- Beispiele:
- $001C273E>sh ^a7,4
- zeigt den Stack im Asciimodus
- $001C273E>sh ^d0
- zeigt den Bereich auf den d0 zeigt im Hexdumpmodus
- $001C273E>sh
- 0,4:^a7
- ; die 4 gibt an, dass im Asciimodus gelistet wird
- 1,3:^d0
- ; die 3 gibt an, dass im Hexdumomodus gelistet wird
- $001C273E>show 0-
- $001C273E>sh
- 1,3:^d0
-
-
- 4.7.45. SLOW
-
- Syntax: SLow [ON|Off]
-
- Diese Funktion ist dafür da, um den Rechner in Slowmotion laufen zu
- lassen. Slow ohne Parameter gibt aus, in welchem Modus das Programm
- arbeitet. Mit Slow on schalten Sie den Slowmodus an, mit Slow off aus.
- Mit den Tasten +/- (Zahlenblock) können Sie den Rechner verlangsamen
- (+), respektive wieder beschleunigen (-). Zusammen mit einer Shiftta-
- ste können Sie feiner abstufen (8 mal feiner als ohne Shift). Mit der
- Taste * können Sie die Verzögerung auf Null zurücksetzen, der Rechner
- läuft dann wieder in Originalgeschwindigkeit (die Slowmotionfunktion
- bleibt aber aktiv).
-
-
- 4.7.46. SWITCH
-
- Syntax: SWitch [ResolutionDebugger][,ResolutionProgram]
-
- Mit dieser Funktion können Sie den Debugger/das Programm auf eine
- Standardauflösung umschalten. Die Werte entsprechen denjenigen von
- Getrez:
-
- 0: 320*200*4 ST-Low
- 1: 640*200*2 ST-Mid
- 2: 640*400*1 ST-High
- 4: 640*480*4 TT-Mid
- 6: 1280*960*1 TT-High
- 7: 320*480*8 TT-Low
-
- - ResolutionDebugger: der Debuggerscreen wird dabei neu initialisiert
- (aber nicht neu reserviert, deshalb sollte nur umgeschalten werden,
- wenn die neue Auflösung nicht mehr Bildspeicher benötigt als die
- alte. Mittels >NEWFORMAT können Sie übrigens den Debuggerscreen wie-
- der auf die vom restlichen System benutzte Auflösung umschalten.
-
- - ResolutionProgram: das Umschalten der Programmauflösung geschieht
- durch Beschreiben des Shiftmoderegisters. Vom Auflösungswechsel be-
- kommt das restliche System natürlich nichts mit über, daher ist das
- Umschalten der Programmauflösung nur sinnvoll, wenn diese durch ein
- anderes Programm fälschlicherweise verändert wurde.
-
- Achtung: dieser Befehl existiert auf dem F030 nicht.
-
-
- 4.7.47. SYMBOL
-
- Syntax: SYmbol [From][,To]
-
- Gibt eine Liste der Symbole aus, die PEACEBUG bei Programmstart gela-
- den hat. Mittels "From" und "To" können Sie die Ausgabe auf einen be-
- stimmten Bereich beschränken, es werden dann nur die Symbole ausgege-
- ben, deren Symbolwert zwischen den beiden Werten liegt.
- Die Ausgabe erfolgt sortiert nach Symbolwert.
- Wenn ein Programm nachgeladen wurde, werden nur die Symbole des Pro-
- gramms ausgegeben, falls dieses eine Symboltabelle enthielt.
-
- Beispiele:
- $001C7FB2>sy fa0000,ffff8001
- $00FA0000 = cart_port
- $00FC0000 = os_start_old
- $FFFF8001 = memconf
- $001C7FB2>symb 500,510
- $00000502 = scr_dump
- $00000506 = prv_lsto
- $0000050A = prv_lst
- $0000050E = prv_auxo
-
-
- 4.7.48. SYSINFO
-
- Syntax: SYSINFO
- Kurzform: SYS
-
- Gibt einige Informationen zum benutzten System aus:
- OS_Base: $00240000
- OS_Start: $00240030
- OS_Membot: $00006678
- TOS-Version: PAL -BRD 02.05 vom 05.12.1990
- GEMDOS-Version: 00.19
- METADOS-Version: Metados not installed
- AES-Version: 03.10
- VDI-Version: GDOS installed
-
-
- 4.7.49. TRACE
-
- Syntax: Trace [Number|+|-|*]
-
- - Trace ohne Parameter entspricht F1, also der normalen Tracefunktion.
- - Trace Number führt "Anzahl" Befehle aus, bevor in den Debugger zu-
- rückgesprungen wird. Dabei werden wie bei F1 gewisse Opcodes als ein
- Befehl angesehen.
- - Trace + lässt das Programm im Tracemodus laufen und ruft nach jedem
- Befehl die Usertraceroutine auf, die entscheidet, ob in den Debugger
- gesprungen wird, das Tracen fortgesetzt oder ausgeschaltet wird.
- Gleichzeitig wird auch ein Cacheeintrag erzeugt. Es wird nicht ge-
- traced wenn flock gesetzt ist oder wenn die Interruptmaske 7 ist.
- Traps werden getraced.
- - Trace - wie Trace +, nur dass kein Cacheeintrag erzeugt wird
- (schneller).
- - Trace * wie Trace +, nur das IMMER getraced wird (ausser während
- einer Exception). Lesen Sie diesbezüglich auch Kapitel 5.
-
-
- 4.7.50. WARM
-
- Syntax: Warm
-
- Führt einen Warmstart aus. Der Debugger kann noch über die Doppelseite
- gerettet werden.
-
-
- 4.7.51. WRITESECTOR
-
- Syntax: WRitesector [Track][,Sector][,Side][,Address][,Drive]
-
- Schreibt einen Sektor mittels XBIOS 9.
- Defaultmässig sind eingestellt: Track=0, Sektor=1, Seite=0, Adresse-
- =ein vom Debugger zur Verfügung gestellter Puffer (1024 Bytes lang),
- Laufwerk=0.
- Wenn Sie andere Parameter angeben, werden diese beim nächsten Write-
- sector wieder benutzt. Writesector benutzt natürlich die gleichen Wer-
- te wie Readsector.
-
- Beispiele:
- $00237322>w
- schreibt den Bootsektor von Laufwerk A aus dem internen Puffer
- $00237322>w ,,,600,1
- schreibt den Bootsektor von Laufwerk B aus Adresse 600
-
-
- 4.7.52. XBRA
-
- Syntax: Xbra [FirstVector][,LastVector][,ID]
-
- Dieser Befehl sucht im Bereich zwischen "FirstVector" und "LastVector"
- nach Vektoren und gibt deren XBRA-Verkettungen aus. "FirstVector" ist
- defaultmässig $8, "LastVector" $1000, falls kein "FirstVector" angege-
- ben wird, andernfalls wird "LastVector" als Default auf den Wert
- "FirstVector" gesetzt. Alles klar? :-)
- "X 10" sucht also im Bereich zwischen $10 und $10, "X ,20" im Bereich
- zwischen $8 und $20 und "X" im Bereich zwischen $8 und $1000.
- Der Debugger inkrementiert bei der Suche nach Vektoren normalerweise
- in Viererschritten, erkennt aber selber, wenn Einer-, Zweier- oder
- Dreierschritte notwendig sind (siehe Beispiele).
- Endlosschleifen und Zeiger auf sich selber werden erkannt.
- Wird ID angegeben, dann werden nur Verkettungen angezeigt, in denen
- diese XBRA-ID vorkommt. Diese wird dann mit einem Pfeil (⇦) markiert.
- Die Routine des Debuggers wird mit einem Asterix (*) markiert.
- Falls das VBR (VectorBaseRegister) ungleich Null ist, wird eine War-
- nung ausgegeben. Die XBRA Liste wird aber grundsätzlich immer von der
- angegebenen Adresse ausgegeben, d.h. x 84 wird nicht automatisch zu x
- ^vbr+84.
- Wenn Sie den Befehl ohne jegliche Parameter aufrufen werden keine
- XBRA-Verkettungen angezeigt, sondern eine sortierte Liste aller
- gefundenen ID's mit einer Liste der Vektoren, in denen diese ID
- gefunden wird. Gesucht wird zwischen $8 und $1000.
-
-
- Beispiele:
-
- $00248206>x 81,88
- XBRA links for $00000081:
- $84BA001C without XBRA
-
- XBRA links for $00000084:
- $001C7FCA "PBUG" points to $002109AA*
- $002109AA "BUG1" points to $00046316
- $00046316 "Cham" points to $00020ABA
- $00020ABA "MSPO" points to $0001CC08
- $0001CC08 "OFLS" points to $000141A6
- $000141A6 "NVDI" points to $0024E970
- $0024E970 without XBRA
-
- XBRA links for $00000088:
- $001C804A "PBUG" points to $001C8074*
- $001C8074 "PBUG" points to $00210C40*
- $00210C40 "BUG1" points to $00045D2C
- $00045D2C "Cham" points to $0001008E
- $0001008E "NVDI" points to $00021E06
- $00021E06 "LTMF" points to $00029990
- $00029990 "SLCT" points to $00260770
- $00260770 without XBRA
-
- $00123456>x 0,100,'LTMF'
- XBRA links for $00000088:
- $0102EC14 "LTMF" points to $010374B4⇦
- $010374B4 "SLCT" points to $0101D00E
- $0101D00E without XBRA
-
- XBRA links for $000000B4:
- $0102EF62 "LTMF" points to $0101094C⇦
- $0101094C "OFLS" points to $0002C904
- $0002C904 "PBUG" points to $01007684
- $01007684 "NVDI" points to $00E00DA2
- $00E00DA2 without XBRA
-
-
- 4.7.53. ?
-
- Syntax: ? Term{,Term}
-
- Gibt den Wert von Term in allen Zahlensystemen (Hexadezimal, Dezimal,
- Binär, Oktal) und als String aus. Die Werte werden auf ihre kürzeste
- Form gekürzt, d.h. Nullen am Anfang werden weggelassen. Wenn der Wert
- negativ ist wird zusätzlich der negative Wert im Hexadezimal und De-
- zimalsystem ausgegeben.
-
- Beispiele:
- $000203B6>?-1
- $FFFFFFFF .4294967295 %11111111111111111111111111111111 o37777777777
- "...." -$1 -.1
- $000203B6>?"PBUG"
- $50425547 .1346524487 %1010000010000100101010101000111 o12020452507
- "PBUG"
-
-
- 4.7.54. /
-
- Syntax: / [.b|.w|.a|.l] [Term]{,Term} - default word
-
- / gehört zu >DISASSEMBLE und schreibt die Terme an die aktuelle Zeile-
- nadresse. Term ist aufgebaut wie beim Befehl >FIND. Wenn Sie dem / ein
- .X anhängen, dann werden alle Terme entweder auf diese Länge erweitert
- oder abgeschnitten, wobei .b = byte, .w = word, .a = 3 Bytes, .l =
- long ist. Defaultmässig ist ein .w eingestellt. Wenn Sie dies stört,
- benutzen Sie anstatt / den Befehl ,.
-
- Beispiele:
- $000203B6>/ 4E75,1234.a
- schreibt an die Adresse $203B6 den Wert 4E75,1234 (4 Bytes)
- $000203B6>/.a 4E75,12345678
- schreibt an die Adresse $203B6 den Wert 004E75,345678 (6 Bytes)
- $000203B6>/.l 4E75,1234.a
- schreibt an die Adresse $203B6 den Wert 00004E75,00001234 (8 Bytes)
-
-
- 4.7.55. !
-
- Syntax: ! Opcode
-
- ! gehört zu >LIST und assembliert den Befehl der ! folgt und schreibt
- ihn an die aktuelle Zeilenadresse. Der Assembler arbeitet symbolisch
- und übersetzt alle MC680x0 Befehle mit erweiterten Adressierungsarten.
-
- Ein Basedisplacement kann nur in der offiziellen Motorolasyntax einge-
- geben werden. Ein -1(SP) muss also als (-1,SP) eingegeben werden.
-
- Wie üblich ist die Eingabe sehr fehlertolerant, so wird z.B.
- "adda ( [- 1 0z sp d0 . l * 8-1.lsp *clr" als
- "ADDA.W ([$FFF0,ZA7,D0.L*8],-1),A7"
- oder
- "clr ([10za1sp-1" als
- "CLR.W ([$10,ZA1,A7.W],-1)" übersetzt
-
- Ein Befehl wird optimal codiert, d.h. Displacements werden so kurz als
- möglich gewählt, ebenso Sprünge ohne Längenvorgabe. Sie können der
- Flexibilität zuliebe aber auch die Länge der Displacements wählen. Ein
- clr ([-1,a0],10) wird vier Bytes kürzer codiert als ein clr ([-
- 1.l,a0],10.l).
-
- Beachten Sie, dass der Assembler gleichzeitig mit vorzeichenbehafteten
- und vorzeichenlosen Zahlen arbeitet. Im Positiven wird mit vorzeichen-
- losen, im Negativen mit vorzeichenbehafteten Zahlen gearbeit (Zahlen-
- theoretiker mögen mir dies verzeihen). Eine Zahl umfasst so den Be-
- reich -2147483648 bis 4294967295 oder -32768 bis 65535 oder -128 bis
- 255, je nachdem ob es sich um ein Long, ein Word oder ein Byte han-
- delt.
-
-
- 4.7.56. ,
-
- Syntax: , [.b|.w|.a|.l] [Term]{,Term} - no default
-
- , gehört zu >DUMP und schreibt die Terme an die aktuelle Zeilenadres-
- se. Term ist aufgebaut wie beim Befehl >FIND. Wenn Sie dem / ein .x
- anhängen, dann werden alle Terme entweder auf diese Länge erweitert
- oder abgeschnitten, wobei .b = byte, .w = word, .a = 3 Bytes, .l =
- long ist. Wenn die Längenangabe fehlt, wird jeder Term in der Länge
- geschrieben, wie Sie ihn eingegeben haben (im Gegensatz zu /).
-
- Beispiele:
- $000203B6>, 4E75,1234.a
- schreibt an die Adresse $203B6 den Wert 4E75,001234 (5 Bytes)
- $000203B6>,.a 4E75,12345678
- schreibt an die Adresse $203B6 den Wert 004E75,345678 (6 Bytes)
- $000203B6>,.l 4E75,1234.a
- schreibt an die Adresse $203B6 den Wert 00004E75,00001234 (8 Bytes)
-
-
- 4.7.57. )
-
- Syntax: ) String
-
- Gehört zu >ASCII und schreibt den folgenden String an die aktuelle
- Zeilenadresse. Der String muss keine bestimmte Länge haben, nur muss
- er mit einem " oder ' abgeschlossen sein.
-
-
- 4.7.58. :
-
- Syntax: : Address[,Term]{,Term}
-
- : schreibt die Terme an die angegebene Adresse. Dieser Befehl wurde
- vorallen aus nostalgischen Gründen implementiert (Templmon)
-
- Beispiele:
- $000203B6>:,4E75,1234.a
- schreibt an die Adresse $203B6 den Wert 4E75,0012,34
- $000203B6>:,.a 4E75,12345678
- schreibt an die Adresse $203B6 den Wert 004E,7534,5678
- $000203B6>: 600,"This is a Teststring"
- schreibt an die Adresse $600 den obigen String
-
-
-
-
-
-
-
-
- 5. Trace, Breakpoints und dergleichen
- -------------------------------------
-
-
-
- Ein an sich simples Unterfangen ist auf Motorolaprozessoren das Tracen
- von Programmen, d.h. das schrittweise Ausführen von Befehlen auf Ma-
- schinenebene.
- Ganz so einfach ist die Sache aber dennoch nicht, denn es sollte nicht
- getraced werden wenn (dies sind natürlich Atarispezifische Einschrän-
- kungen):
- 1. flock gesetzt ist
- 2. Die Interruptmaske 7 ist
-
- Die Befehle >Trace + und Trace - tragen dem Rechnung, indem Sie den
- Tracemodus gegebenenfalls abschalten.
- Nun gibt es Momente, wo gerade in einer kritischen Routine ein Fehler
- zu suchen ist und deshalb immer getraced werden muss. Auch gibt es
- leider TOS-Versionen, die scheinbar das Statusregister nicht mehr re-
- staurieren und den Tracemodus so für immer ausschalten. Mit Templmon
- ist es z.B. unter TOS 3.06 nicht mehr möglich mittels t+, g, a den
- Rechner zu tracen, ebensowenig funktioniert dies mit PEACEBUG und
- t+/-.
- Trace * nimmt auf obige Bedingungen keine Rücksicht und traced rück-
- sichtslos weiter. Dies führt aber meistens schon nach kurzer Zeit zum
- Absturz. Welche Methode Sie verwenden, müssen Sie ausprobieren, da
- dies sehr stark von der benutzten TOS-Version abhängt.
-
- Der Tracemodus kann aber auch noch in anderen Situationen eingeschal-
- tet werden, nämlich dann, wenn Sie einen Rombreakpoint setzen.
- Damit ein Breakpoint im Rom funktioniert, wird IMMER getraced (auuser
- in Exceptions), d.h. ohne Rücksicht auf Verluste. Sie sollten also
- sehr vorsichtig damit umgehen.
-
- Im folgenden einige Erläuterungen zu den einzelnen Tracefunktionen.
- Wann welche Funktion den Trace wie benutzt usw.:
- - Trace F1: Es wird nur für einen einzigen Befehl der Tracemodus akti-
- viert (ohne Rücksicht auf die oben erwähnten Bedingungen, dies ist
- aber ungefährlich). Wenn es sich um einen Trapv, ein Trap 0-15 oder
- ein Linea handelt, die PEACEBUG als einzelne Befehle betrachtet,
- wird der Tracemodus nicht benutzt. Im Gegensatz zu Bugaboo muss sich
- PEACEBUG um diese Funktion zu implementieren, nicht in den entspre-
- chenden Exceptionvektor einhängen.
- - Do PC F2: Es wird der Tracemodus aktiviert, wenn sich der Befehl im
- ROM befindet. Um die Abbruchbedingung nicht zu "verpassen" wird
- immer getraced, dies ist allerdings meist ungefährlich. Ist der
- aktuelle Befehl ein bsr oder ein jsr dann wird kein Breakpoint
- gesetzt, dafür der Tracemodus für die Dauer eines Befehls aktiviert.
- - Tracerts F3: Es wird kein Trace benutzt.
- - Texcept F4: Ebenfalls ohne Trace realisiert, PEACEBUG muss sich auch
- nicht in den Vektor hängen, um diese Funktion zu realisieren.
- - Tr68020 F11: Entspricht Trace F1, was das Tracen anbelangt.
- - Tnosubs F12: Entspricht Do PC F2, wenn der PC auf ein BSR/JSR zeigt,
- sonst dem normalen Trace F1.
- - Tracerte F13: Es wird kein Trace benutzt.
- - GoTraps F14: Es wird kein Trace benutzt. Der Debugger muss sich auch
- nicht in die entsprechenden Vektoren einhängen. Mit anderen Worten:
- es funktioniert einfach immer.
- - Breakpoints im Rom: Alle Breakpoints im Rom benutzen den Tracemodus.
- Da immer getraced wird, ist dies gefährlich.
- - Breakpoints im Ram: Zähler- und Stopbreakpoints schalten den Trace
- für die Dauer eines Befehls an.
-
-
-
-
-
-
-
-
- 6. Cache
- --------
-
-
-
- Ähnlich wie Bugaboo besitzt PEACEBUG Befehlscache...s, hier schon der
- erste Unterschied, PEACEBUG verfügt nicht über einen sondern über de-
- ren zwei voneinander völlig unabhängige Caches.
- Bei jedem Trace werden die aktuellen Register (siehe unten) in einem
- Cache gespeichert. Die Anzahl Cacheeinträge ist defaultmässig 20 für
- den ersten und 5 für den zweiten Cache. Diese Werte können entweder
- direkt im Programmcode oder während der Laufzeit verändert werden. In
- den Caches kann 'geblättert' werden, d.h. Sie können sich anschauen,
- was bisher getraced wurde, wobei in der dritten Zeile angezeigt wird,
- welchen Cacheeintrag Sie sich gerade ansehen.
- Hier nun ein entscheidender Unterschied zum Bugaboocache: die aktuel-
- len Register sind IMMER gerade die, die sich im sichtbaren Cacheein-
- trag befinden, d.h. wenn Sie zurückblättern, so verändern Sie gleich-
- zeitig auch die aktuellen Register, wie Sie beim Verlassen des Debug-
- gers zurückgeschrieben werden. Wenn Sie also an der gleichen Stelle
- weiterfahren wollen, wie beim Einsprung, müssen Sie sich beim ersten
- Cacheeintrag befinden (gezählt wird 0,1,2,...). Damit entfallen um-
- ständliche Befehle wie Cacheget bei Bugaboo, das Arbeiten mit den Ca-
- ches geht so viel schneller vonstatten, kann aber auch gefährlich
- sein, da man leicht vergisst, den Cache zurückzusetzen.
- Wenn Sie Register editieren, verändern Sie gleichzeitig auch den ak-
- tuellen Cacheeintrag, so können Sie ein Programmstück leicht zweimal
- mit unterschiedlichn Registerwerten durchlaufen, einfach zurückscrol-
- len, Register ändern, nochmals tracen.
-
- Doch wozu nun zwei Caches?
- Der zweite Cache ermöglicht es Ihnen mal schnell was auszuprobieren,
- ohne Gefahr zu laufen, die alten Registerinhalte zu verlieren, ein
- wenig vergleichbar also mit den Funktionen rs und rr von Templmon.
- z.B. haben Sie an der Adresse xy eine Doppelseite entdeckt, die Ihnen
- verdächtig vorkommt:
- - Alternate Shift Insert (Cache wechseln mit Registercopy)
- - PC auf Doppelseite setzen
- - Tracen
- - Alternate Insert (Cache wechseln ohne Registercopy)
- Da die beiden Caches absolut identisch sind, ist es egal auf welchem
- Sie debuggen, hauptsache Sie verlassen den Debugger mit den richtigen
- Registerwerten.
-
- Der Cache ist als Ring organisiert und kann daher leicht erweitert
- werden. Ein einzelner Eintrag umfasst in der vorliegenden Version 270
- Bytes und ist die folgt aufgebaut (folgende Struktur nur zur Informa-
- tion):
-
- double FPn[8] ; FP Register (96 Bit lang)
- long FPSR ; FP Status Register
- long FPIAR ; FP Instruction Address Register
- long FPCR ; FP Control Register
- word TC_40 ; Translation Control Register
- long URP ; User Root Pointer Register
- long DTT1 ; Data Transparent
- long DTT0 ; Translation Register 0/1
- long ITT1 ; Instruction Transparent
- long ITT0 ; Translation Register 0/1
- long TC_30 ; Translation Control Register
- long TT1 ; Transparent Translation
- long TT0 ; Register 0/1
- dlong CRP ; CPU Root Pointer Register (64 Bit Wert!)
- word MMUSR ; MMU Status Register
- dlong SRP ; Supervisor Root Pointer (40er nur 32 Bit)
- long MSP ; Master Stack Pointer
- long CACR ; Cache Control Register
- long CAAR ; Cache Adress Register
- long VBR ; Vektor Base Register
- long DFC ; Destination Function Code
- long SFC ; Source Function Code
- long USP ; User Stack Pointer
- long SSP ; Supervisor Stackpointer
- long PC ; Program Counter
- word STATUS ; Status Register
- long Dn[8] ; D0-D7
- long An[8] ; A0-A6
- void *NEXT_RECORD ; Zeiger auf den nächsten Eintrag
- void *PREVIOUS_RECORD ; Zeiger auf den vorherigen Eintrag
-
- ACHTUNG: beim Einsprung in den Debugger wird der aktuelle Supervisor-
- stack temporär benutzt, d.h. es werden Werte auf diesem Stack über-
- schrieben! Wenn Sie ein im Supervisormodus laufendes Programm tracen,
- können darum Befehle wie rts nicht mehr wiederholt werden, weil die
- Rücksprungadresse, die auf dem Stack lag, vermutlich überschrieben
- wurde. Das Gleiche gilt für alle Befehle, die Werte vom Stack lesen.
-
-
-
-
-
-
-
-
- 7. Symbole
- ----------
-
-
-
- 7.1. PEACEBUG.SYM
- -----------------
-
-
- Bei Programmstart wird die Datei PEACE*.SYM geladen, falls Sie sich im
- gleichen Verzeichnis befindet, wie der Debugger. Diese Datei enthält
- symbolische Konstanten, die beim Disassemblieren, Assemblieren und vom
- Formelinterpreter benutzt werden.
- Die bis anhin unterstützten Formate wurden ersatzlos gestrichen und
- durch ein neues Format ersetzt. Dieses Format enthält die Wertzuwei-
- sungen in ASCII-Form und kann deshalb mit jedem Editor verändert wer-
- den. Es gelten folgende Regeln:
- - Leerzeichen werden immer ignoriert, egal wo sie sich befinden
- - Zeilen müssen mit CR/LF abgeschlossen sein
- - Die Datei darf keine Nullbytes enthalten
- - Kommentarzeilen beginnen mit einem *
- - eine Wertzuweisung hat folgende Form: SYMBOLNAME=WERT
- - Die Symbolnamen können bis zu 32767 Zeichen lang sein (das dürfte
- genügen, oder?)
- - Wert ist ein beliebiger Ausdruck, wie er vom Formelinterpreter des
- Debuggers verarbeitet wird, also z.B. pw(p4f2+2) (=os_version). Es
- ist allerdings sinnlos, Register oder Symbole darin zu verwenden, da
- diese noch keinen definierten Wert haben (die erzeugten Symbole sind
- Konstanten!).
-
- Die angelegte Symboltabelle arbeitet mit variablen Symbollängen und
- braucht deshalb ein Minimum an Speicher.
-
-
-
- 7.2. Lexecute
- -------------
-
-
- Wird ein Programm mittels Lexecute geladen und ist an dieses eine Sym-
- boltabelle im GST-/DRI-Format angehängt, wird diese mitgeladen. Der
- Debugger löscht dabei alle Konstanten, weil diese beim Disassemblieren
- stören. Korrekterweise müsste man diese mitladen und beim Disassemb-
- lieren zwischen Symbolen im TEXT-/DATA-/BSS-Segment und Konstanten
- unterscheiden. Dies ist aber sehr aufwendig und meines Wissens tut
- dies auch kein Debugger. Die Symbole werden ins gleiche Format gewan-
- delt, wie die Konstanten (PEACE*.SYM). Die Symboltablle des Debuggers
- z.B. belegt so nur durchschnittlich 19 Bytes pro Symbol (32 bei
- Bugaboo...).
-
-
-
- 7.3. Resident Symbol Driver
- ---------------------------
-
-
- Der Resident Symbol Driver (RSD) ist ein Programm von Robert Federle,
- das Symboltabellen von Programmen anlegen kann, die gestartet werden.
- Diese Symboltabellen werden über eine Cookieschnittstelle zur Verfü-
- gung gestellt. Es ist also so möglich, vom Desktop ein Programm zu
- starten, das eine Symboltabelle enthält, den Debugger aufzurufen (der
- resident istalliert ist) und die Symbole des Programms zu benutzen.
- Falls dieser Treiber installiert ist, benützt PEACEBUG zusätzlich zu
- den eigenen Tabellen, diejenigen des Treibers. Da dieser die Symbol-
- suche nicht exakt gleich vornimmt wie der Debugger, kann der Output
- dann leicht anders aussehen (z.B. hat es mehr Symbole). Ein Problem
- ergab sich beim Parser: derjenige des Debuggers ist ziemlich flexibel,
- als Folge aber nicht nach Lehrbuch programmiert. Er zerlegt die Ein-
- gaben nicht von Anfang in Tokens, sondern bearbeitet immer alles zu-
- sammen, so dass z.B. "l .flock+1" nach dem Symbol .flock+1 sucht, was
- beim Debugger funktioniert, beim RSD aber nicht. Dies ist kein Fehler
- eines der Programme, sondern ein konzeptioneller Unterschied.
-
- Aber damit hat es sich noch nicht. Der Befehl >Programs gibt eine
- Liste aller gestarteten Programme aus, die sich der Debugger vom
- Symboltreiber holt. Darüberhinaus fügt der Debugger bei der Ausgabe
- im Listmodus den Namen des Programms ein, das zur ausgegebenen Adresse
- passt:
- $01057536>! [GEMRAM] RTS ; 4E75
-
- Tip 1: Angenommen Sie wollen Ihr Programm debuggen, das aus mehreren
- Modulen besteht, die vom Programm nachgeladen werden (Programme wie
- Xcontrol oder diverse Bildschirmschoner). Um im Debugger zu erkennen
- welches Modul gerade dran ist, fügen Sie die Symboltabelle in die vom
- RSD verwaltete Liste ein (dazu lesen Sie das Readme des RSD), und er-
- kennen von nun an immer, wo sie gerade debuggen.
-
- Tip 2: Benutzen Sie PEACEBUG.SYM anstatt SYMBOL.SMB (das ist die
- Konstantentabelle des RSD), es sei denn sie benutzen noch andere Pro-
- gramme, die den RSD unterstützen. Grund: schnellerer Zugriff auf die
- Symbole, Unabhängigkeit des Debuggers, Parsing.
-
-
-
-
-
-
-
-
- 8. Reset fest, Reset resident
- -----------------------------
-
-
-
- Folgende Dinge passieren im Falle eines Warmstarts (gekürzt):
- 1. SSP und PC setzen, >Reset<
- 2. Diagnose Cartridge ausführen, falls vorhanden
- 3. Routinen im Resetvektor ($42A) ausführen
- 4. Hardwareinitialisierung
- 5. Systemvariablen setzen, Interrupts initialisieren, Bios initiali-
- sieren
- 6. Bildschirm initialisieren
- 7. Diskette booten
- 8. Harddisk booten
- 9. Doppelseiten ausführen (undokumentiert)
- 10. COMMAND.PRG starten wenn _cmdload nicht 0 ist
- 11. Autoordnerprogramme ausführen
- 12. AES und Desktop starten
-
-
- PEACEBUG setzt an zwei Stellen an, um zu "überleben":
-
- 1. Resetfestigkeit. Er installiert sich im Resetvektor.
- Um einen Reset mittels der Resettaste zu überleben muss der Debug-
- ger nur gerade Punkt 4 übernehmen. Dies funktioniert allerdings
- nur, wenn Sie sich im Debugger befinden, andernfalls geht leider
- der PC verloren und das Programm kann nicht fortgeführt werden.
- Falls ein Reset ausserhalb des Debuggers stattfindet, wird der
- Debugger nur angesprungen, falls er entsprechend konfiguriert wurde
- (>Schnittstelle), der PC zeigt dann auf die Stelle des Bootcodes,
- die die Routinen im Resetvektor ausführt.
- Die Resetfestigkeit von PEACEBUG ist vorallem dann sehr nützlich,
- wenn sich die Hardware "aufgehängt" hat, normalerweise läuft dann
- nichts mehr, mittels eines Resets kann PEACEBUG aber meist wieder-
- belebt werden.
-
- 2. Resetresidenz. Er installiert eine Doppelseite.
- Normalerweise wird der Debugger bei einem Warmstart terminiert.
- Dies können Sie verhindern indem Sie beim Booten >Shift links<
- gedrückt halten. Der Debugger bleibt dann resident und wird noch
- vor dem ersten Autoordnerprogramm installiert. Ein als Autoordner-
- programm gestarteter PEACEBUG erkennt die residente Version und
- wird nicht nochmals installiert. Wenn Sie sich für den Bootvorgang
- interessieren und diesen debuggen wollen, drücken Sie zusätzlich
- >Shift rechts<, der Debugger wird dann unmittelbar nach dem Instal-
- lieren angesprungen und der PC zeigt auf die Routine, die die Dop-
- pelseiten sucht.
- Achtung: das von PEACEBUG benutzte System lässt nicht zu, dass sich
- ausser dem Debugger selber noch ein zweites resetresidentes Pro-
- gramm installiert, das gilt auch, wenn Sie PEACEBUG mehrmals in-
- stalliert haben, nur eine Version wird überleben.
- Das im Profibuch vorgeschlagene System verbietet sich von selbst,
- denn was geschieht, wenn Atari sich entschliesst den Bereich von
- $600-$700 zu benutzen, wie es beim Bereich $700-$800 geschah?
- Hier ein kurzer Abriss, was alles vonnöten ist, um Resetresidenz zu
- erreichen:
- - Speicher reservieren im ST-Ram, da nur dieses nach Doppelseiten
- durchsucht wird.
- - Anlegen der Doppelseite im reservierten Speicherbereich.
- - Bei einem Warmstart werden alle allozieren Speicherbereiche frei-
- gegeben (aber nicht gelöscht, im Profibuch ist dies fehlerhaft
- beschrieben). Es muss deshalb neuer Speicher reserviert, der De-
- bugger in diesen Bereich kopiert und reloziert werden. Die
- Kopier- und Relozierroutine wird auf den Stack ausgelagert.
- - Leider geht bei obigem Vorgang die Symboltabelle verloren, sie
- muss nachgeladen werden.
- Obige Vorgänge erfordern einigen selbstmodifizierenden Code,
- selbstverständlich werden dabei eventuell vorhandene Prozessor-
- caches gelöscht (MC68020/30/40).
-
- Es wird sowohl in der Doppelseite als auch in der Resetroutine ge-
- prüft, ob der Debugger beschädigt wurde. Ist dies der Fall, werden Sie
- dezent darauf aufmerksam gemacht.
-
- Für diejenigen, die sich für den Bootvorgang interessieren hier einige
- Tips. Die Angaben sind allerdings je nach TOS Version leicht verschie-
- den, ganz alte Versionen dürften ein anderes Vorgehen haben:
- Beim Einsprung zeigt der PC auf die Routine, die die Doppelseiten
- sucht, wobei die Adresse, an der gesucht wird, vom Debugger auf $600
- gesetzt wird, um zu vermeiden, dass andere Doppelseiten ausgeführt
- werden. Dies wäre gefährlich, da sich der Debugger eventuell im Spei-
- cher verschiebt und so andere residente Programme beschädigen könnte.
- Nach dieser Routine wird _cmdload getestet und gegebenenfalls verz-
- weigt. COMMAND.PRG wird gleich nach allen Autoordnerprogrammen gestar-
- tet. Diese werden nun wie folgt ausgeführt:
- 1. Mittels PEXEC 5 (Create Basepage) legt das OS eine Basepage an,
- schreibt die Adresse einer Routine in die Basepage (Offset 8) und
- führt dann ein PEXEC 4 (Just Go) aus. Dieses PEXEC können Sie nicht
- einfach so übertracen, weil die aufgerufene Routine direkt zurück-
- springt (der Stack wird neu gesetzt). Sie müssen also entweder den
- Trap durchtracen oder ein Breakpoint setzen (funktioniert auch im
- ROM problemlos).
- 2. Die gestartete Routine geht in den Supervisormodus, setzt die DTA
- und sucht dann mittels FSFIRST/FSNEXT die Autoordnerprogramme.
- 3. Die Programme werden mittels PEXEC 0 (Load and GO) gestartet.
- Nun wird _sysbase gesetzt, ein Environmentstring erzeugt (PATH=...)
- und mittels PEXEC 5, PEXEC 4 die Routine in exec_os ausgeführt,
- normalerweise AES und Desktop.
-
-
-
-
-
-
-
-
- 9. Vektoren
- -----------
-
-
- Die 48 Routinen, die PEACEBUG einhängen kann, bilden den Kern des Pro-
- gramms. Gerade hier muss daher grösstmögliche Flexibilität geboten
- werden. Bevor ich jedoch auf die Möglichkeiten von PEACEBUG diesbe-
- züglich eingehe, einige Erläuterungen zum Thema XBRA.
-
-
-
- 9.1. XBRA
- ---------
-
-
- Jedes Programm, das sich in einen Vektor einhängt, sollte vor seiner
- Einsprungadresse folgende Struktur installieren:
-
- typedef struct
- {
- char xb_magic[4]; /* "XBRA" */
- char xb_id[4]; /* XBRA-ID des installierten Programms */
- long xb_oldvec; /* Wert des Vektors vor dem Einhängen */
- } XBRA;
-
- oder in Assembler:
- dc.l 'XBRA'
- dc.l 'PBUG'
- ALTE_ROUTINE: dc.l $xxxxxxxx
- ROUTINE: ...
-
- Wenn sich alle Programme an obige Konvention halten, ist es für ein
- Programm ein leichtes, sich aus einem Vektor auszuhängen, ohne auch
- andere Routinen mitauszuhängen. Ebenfalls kann so festgestellt werden,
- ob man sich schon in den Vektor eingehängt hat. Ist auch nur ein ein-
- ziges Programm da, das kein XBRA benutzt, oder es falsch benutzt, so
- funktioniert dies nicht mehr. Leider gibt es immer noch Programmierer,
- die finden, da sie sich eh nicht aushängen wollen, brauchten sie auch
- kein XBRA zu benützen. In der Regel geht es aber nicht um das eigene
- Programm, sondern um fremde. Eines davon ist PEACEBUG.
-
- An dieser Stelle noch eine Bemerkung zu "resvector".
- Es ist trotz XBRA nicht möglich, sich sauber aus diesem Vektor auszu-
- hängen, da resvalid über XBRA nicht zugänglich ist und nicht bei allen
- in diesem Vektor hängenden Programmen zwingend $31415926 sein muss
- (insbesondere beim ersten Programm nicht, das sich einhängt). Meine
- Lösung ist simpel aber effektvoll: Jedes Programm testet vor dem zu-
- rückspringen ins TOS, ob noch ein anderes Programm im Vektor hängt.
- Wenn ja, wird resvalid mit dem magic beschrieben, andernfalls ge-
- löscht. Diese Methode erlaubt es Programmen, sich gefahrlos auszuhän-
- gen und sähe in etwa so aus:
-
- DC.L 'XBRA'
- DC.L _ID
- OLD_RESET: DC.L 0
- RESET: MOVE.W SR,-(SP)
- ORI.W #$700,SR
- MOVE.L A0,-(SP)
- MOVE.L SP,SAVE_SP_RESET
- MOVE.L $08.w,SAVE_BUS_RESET
- MOVE.L $0C.w,SAVE_ADDRESS_RESET
- MOVE.L #_RESET,$08.w
- MOVE.L #_RESET,$0C.w
- MOVE.L #$31415926,RESVALID.w
- MOVEA.L OLD_RESET(PC),A0
- MOVE.L A0,RESVECTOR.w
- CMPI.L #'XBRA',-12(A0)
- BEQ.S ANOTHER_ONE
- _RESET: CLR.L RESVALID.w
- ANOTHER_ONE: *here you go*
- MOVE.L SAVE_ADDRESS_RESET(PC),$0C.w
- MOVE.L SAVE_BUS_RESET(PC),$08.w
- MOVEA.L SAVE_SP_RESET(PC),SP
- MOVEA.L (SP)+,A0
- MOVE.W (SP)+,SR
- JMP (A6)
-
- SAVE_BUS_RESET: DS.L 1
- SAVE_ADDRESS_RESET: DS.L 1
- SAVE_SP_RESET: DS.L 1
-
-
-
- 9.2. Ein Wort regelt alles ...
- ------------------------------
-
-
- Bei jedem Einsprung in den Debugger, beim Aufruf einer Funktion über
- Return oder beim Drücken einer Funktionstaste wird die Routine >Vektor
- aufgerufen. Diese dient dazu, Exceptionroutinen einzuhängen, auszuhän-
- gen, an die erste Position zu hängen und dergleichen mehr.
- Jeder der 48 Routinen ist ein Word zugeordnet, das genau festlegt, wie
- diese Routine von >Vektor behandelt wird. Gleichzeitig dient dieses
- Wort dazu, festzulegen, was der Debugger bei Auftreten der entsprech-
- enden Exception tun darf/soll/muss.
- Das ganze ist so flexibel gehalten, dass Sie beinahe alles machen kön-
- nen. Beispielsweise können Sie PEACEBUG zweimal installieren (zwei
- identische aber verschieden konfigurierte Versionen) und den einen mit
- dem andern debuggen.
-
- Im folgenden wird beschrieben, wie dieses ominöse Wort codiert ist.
-
-
-
- 9.3. Das höherwertige Byte
- --------------------------
-
-
- Das höherwertige Byte wird von >Vektor benutzt und kann folgende Werte
- annehmen:
- -2: Die Debuggeroutine wird gesucht und falls sie gefunden wird, aus-
- gehängt um dann an erster Stelle wieder eingehängt zu werden.
- -1: Die Debuggeroutine wird gesucht und falls sie gefunden wird, aus-
- gehängt um dann an erster Stelle wieder eingehängt zu werden. Wird
- sie nicht gefunden, wird sie neu installiert
- 0: Die Debuggeroutine wird gesucht und falls sie gefunden wird, ausge-
- hängt.
- 1: Die Debuggeroutine wird gesucht. Wird sie nicht gefunden, wird sie
- neu installiert
- 2: Es passiert gar nichts
-
-
- Erläuterugen:
- 1. Das Aushängen von Vektoren kann bei PEACEBUG gefährlich sein, da es
- jederzeit stattfinden kann. Geschieht dies gerade in dem Moment, wo
- der Debugger angesprungen werden soll, so wird die aufrufende Rou-
- tine eventuell zweimal angesprungen und welche Routine ist schon
- reentrant? Meine (lange...) Erfahrung mit dem Debugger hat aller-
- dings gezeigt, dass dieser Fall nie eintritt.
- 2. Bei Programmstart werden alle Routinen eingehängt, es sei denn, das
- höherwertige Byte ist Null.
- 3. -1 bei Routinen benutzen, die nicht weiterspringen und die vom De-
- bugger gebraucht werden: Illegal Opcode und Trace.
- 4. -2 bei allen Routinen benutzen, bei denen es vorteilhaft ist, wenn
- Sie an erster Stelle im Vektor hängen: alle Exceptions, die Sie vom
- Debugger abfangen und anzeigen lassen wollen (Format Error, Priv-
- ileg Error, Ring Indicator ...)
- 5. Weniger ist mehr!
- Je weniger Routinen Sie einhängen, desto weniger Unheil kann PEACE-
- BUG anrichten. Nicht benutzte Vektoren, wie PMMU Illegal oder
- Coproc. Protocol Viol. sollten Sie nicht einhängen.
- 6. Zwei spezielle Vektoren sind AES und LINEF.
- Sie sollten erst eingehängt werden, wenn AES installiert ist. Wird
- der Debugger vom Desktop gestartet, kann dies sofort geschehen, bei
- Start aus dem Autoordner muss abgewartet werden, bis AES instal-
- liert ist. Dies merkt PEACEBUG selber, vorausgesetzt Sie lassen ihn
- sich in den Biostrap einhängen.
- PEACEBUG kann zweimal im Trap 2 hängen. Dies weil bei Initialisie-
- rung der AES der Vektor vom Betriebsystem überschrieben wird. VDI
- ist dabei die Routine, die als erste eingehängt wird.
- 7. LINEF einzuhängen, macht nur bei Betriebsystemen Sinn, die auch
- Linef benutzen, also bei Versionen <=1.04, bei allen andern sollten
- Sie das Flag auf Null setzen. Tip: gerade Linef-Befehle mit DoPC
- übertracen, ungerade normal tracen (F1).
- 8. Richtig zu Konfigurieren ist nicht einfach.
- Wenn Sie dort einen Fehler machen, dann stürzt der Rechner ab. Dies
- passiert genau dann, wenn Sie Ihren wichtigsten Quelltext abspei-
- chern wollen. Selbstverständlich wird dabei auch Ihr einziges
- Backup überschrieben...
-
-
-
- 9.4. Das niederwertige Byte
- ---------------------------
-
-
- Das niederwertige Byte wird von der Routine selber benutzt und ist
- folgendermassen codiert:
- Bit 0: ist dieses Bit gesetzt, wird in den Debugger gesprungen und
- eine entsprechende Meldung ausgegeben.
- Bit 1: ist dieses Bit gesetzt, wird versucht die Exception zu korri-
- gieren, d.h. es wird auf dem nächsten Befehl weitergefahren.
- Bit 0 hat höhere Priorität als Bit 1.
- Sind beide Bits 0, wird in die Originalroutine verzweigt (d.h. dieje-
- nige die vorher im Vektor hing).
-
-
- Ein spezieller Fall ist eine Privilege Violation. Hier haben zwei wei-
- tere Bits eine Bedeutung:
- Auf einem 68000er gibt es den Befel move sr,<ea>, der auch im Usermo-
- dus erlaubt ist, ganz offensichtlich ein Designfehler. Dies hat Moto-
- rola erkannt und ab dem 68010 gibt es diesen Befehl im Usermodus nicht
- mehr. Dafür gibt es zusätzlich den Befehl move ccr,<ea>.
- Scheinbar gibt es Programme, die diesen Befehl im Usermodus benutzen
- und deshalb nur auf einem 68000er korrekt laufen. Pikanterweise gehört
- z.B. Atari's HDX zu diesen Übeltätern ...
- Bit 4: ist dieses Bit gesetzt und tritt bei einem move sr,<ea> eine
- Exception auf, wird der Befehl vom Exceptionhandler im Super-
- visormodus ausgeführt, das Programm merkt also nicht, das eine
- Exception auftrat.
- Das macht das TOS doch schon, werden Sie einwerfen!
- Mit dieser Behauptung liegen Sie zwar nicht ganz falsch, aber
- auch nicht völlig richtig.
- Korrekt ist, dass das TOS nur einige Befehle im Supervisormodus
- ausführen kann. Ein "move sr,([-1,za0,d0*8],-1)" kann das TOS
- nicht korrigieren, der Debugger hat auch damit keine Schwierig-
- keiten.
- Bit 5: ist dieses Bit gesetzt und tritt bei einem move sr,<ea> eine
- Exception auf, wird der Befehl durch den entsprechenden move
- ccr,<ea> ersetzt (im Code selber!, die Prozessorcaches werden
- dann entsprechend geflusht).
- Beide Bits haben höhere Priorität als Bit 0 und 1.
-
-
-
- 9.5. Vektoren, in eigener Sache
- -------------------------------
-
-
- Einige Routinen werden für eigene Zwecke missbraucht, die Gültigkeit
- der eben beschriebenen Bits wird dadurch eingeschränkt:
- - Adress- und Buserrorhandler werden intern benutzt, ausserhalb des
- Debuggers gelten die üblichen "Regeln". Sie können den Debugger
- allerdings auch dahingehend konfigurieren, dass er sich nicht in die
- beiden Vektoren einhängt. Dies schränkt die Funktionsweise des De-
- buggers normalerweise nicht ein, interne Bus-/Adressexception werden
- trotzdem abgefangen! Um sicher zu gehen, sollten Sie dies aber
- trotzdem unterlassen und nur verwenden, wenn Sie PEACEBUG debuggen
- wollen.
- - Der Illegal Opcode Handler wird für Breakpoints und um in den Super-
- visormodus zu schalten benutzt.
- - Die Traceexception wird immer für eigene Zwecke gebraucht, die Flags
- haben daher keine Wirkung
- - Ein Reset innerhalb des Debuggers wird immer abgefangen. Ein Reset
- ausserhalb wird abgefangen, wenn Bit 0 oder 1 gesetzt sind.
- - Der etv_critic Handler wird intern benutzt, ausserhalb des Debuggers
- behalten die Flags ihre Gültigkeit.
- - Der 200 Hz Timer wird für die diversen internen Timer benutzt (Ti-
- meout, Keyrepeat etc.), die Observe- und die Slowmotionfunktion.
- - Der Keyboardinterrupt ignoriert die Flags innerhalb des Debuggers.
- PEACEBUG hat die Eigenschaft, dass andere PEACEBUGs Tastatureingaben
- mitbekommen, andere Debugger wie Templmon allerdings nicht. Sie
- können also jederzeit PEACEBUG mittels eines zweiten PEACEBUG unter-
- brechen, aber nicht mit anderen Debuggern (ausser Sie konfigurieren
- PEACEBUG entsprechend).
-
-
-
-
-
-
-
-
- 10. Schnittstelle
- -----------------
-
-
-
- 10.1. Grundsätzliches
- ---------------------
-
-
- PEACEBUG besitzt eine Schnittstelle, die jedem Programm zugänglich
- ist. Diese ist dokumentiert und wird in zukünftigen Programmversionen
- nicht verändert, nur erweitert. Programme die diese Schnittstelle kor-
- rekt benutzen, werden also auch mit späteren Versionen keine Probleme
- haben.
- Sollten Sie ein Programm haben, dass diese Schnittstelle benutzt und
- das von allgemeinem Interesse ist, können Sie es mir zukommen lassen,
- es kann dann fester Bestandteil von PEACEBUG werden.
- Erreichbar ist die Schnittstelle über den Cookieeintrag mit Kennung
- 'PBUG'. Beispiele von Programmen, die über den Cookie mit PEACEBUG
- kommunizieren, liegen mit Quelltext bei.
- ACHTUNG: nur die residente Version installiert einen Cookieeintrag,
- d.h. alle in diesem Kapitel beschriebenen Variablen sind nicht zugäng-
- lich, falls der Debugger als Programm gestartet wird.
-
- Jede Struktur, die in diesem Kapitel dokumentiert wird, hat die glei-
- che Form. Am Anfang der Zeile steht der Datentyp (long, int oder char)
- und der Name der Variablen, '*' steht für Pointer. Dahinter folgt der
- Offset in Bytes vom Beginn der Struktur. Last but not least der Status
- der Variablen, wobei r=read, w=write, p=patch, n=new_format und l=lock
- bedeutet. Variablen mit Status r dürfen Sie lesen, solche mit w
- schreiben. Variablen, die den Status p haben, können im Programmcode
- (auf Disk/Platte) verändert werden, Variablen ohne p hingegen nur bei
- laufendem Programm (vorausgesetzt w ist gesetzt). Wenn Sie Variablen
- mit Status n verändern, MUSS nachher die Routine NEW_FORMAT aufgerufen
- werden. Wenn die Semaphore SCREEN_LOCK gesetzt ist, dürfen Variablen
- mit Status l nicht mehr verändert und Routinen mit eben diesem Status
- nicht aufgerufen werden.
- Gepatched werden kann der Programmcode sehr einfach, 2 Bytes hinter
- dem Programmheader, d.h. in 30 Bytes Offset zum Dateianfang, stehen 6
- Longs, eine Kennung und fünf Offsets, die angeben, wie weit vom Da-
- teianfang sich die entsprechenden Strukturen befinden:
-
- long _id Offset 30 /* "PBUG" */
- void *SCREEN_PARAMETER Offset 34
- void *PARAMETER Offset 38
- void *FLAGS Offset 42
- void *FONT_16_8 Offset 46
- void *FONT_8_8 Offset 50
-
- Mit handle=Fopen(fname,2), Fseek(30,handle,0), Fread(handle,24,buffer)
- bekommen Sie alle wichtigen Werte. Dannach müssen Sie nur noch mit
- Fseek an die entsprechende Stelle springen und können dort die Werte
- patchen.
-
- Der Cookieeintrag zeigt auf die folgende Struktur:
- void *CLEAR_SCREEN Offset 0 r/l/n
- void *GET_PARAMETER Offset 4 r/l/n
- void *KILL_SCREEN Offset 8 r/l/n
- void *NEW_SCREEN Offset 12 r/l/n
- void *NEW_FORMAT Offset 16 r/l
- void *PRINT_SCREEN Offset 20 r/l
- void *SCREEN_PARAMETER Offset 24 r
- void *CALL_DEBUGGER_1 Offset 28 r
- long VERSION Offset 32 r
- void *PARAMETER Offset 36 r
- void *USERTRACE Offset 40 r/w
- void *USERENTER Offset 44 r/w
- void *USERQUIT Offset 48 r/w
- void *USERSWITCH_ENTER Offset 52 r/w
- void *USERSWITCH_QUIT Offset 56 r/w
- void *USERRESET Offset 60 r/w
- void *FLAGS Offset 64 r
- void *VEKTOR Offset 68 r
- void *CALL_DEBUGGER_2 Offset 72 r
-
-
-
- 10.2. Bildschirmschnittstelle
- -----------------------------
-
-
- Die ersten 6 Pointer zeigen auf Routinen, die dazu benutzt werden kön-
- nen, den Bildschirmtreiber neu zu konfigurieren. Dieser ist so flexi-
- bel gehalten, dass man den Debugger sogar in einem Fenster laufen las-
- sen kann, das entsprechende Programm heisst WINDOW.ACC und liegt dem
- Debugger bei.
- Jede der Routinen endet mit einem rts, wird also normalerweise mittels
- jsr angesprungen (für Hochsprachen konsultieren Sie bitte ihr Hand-
- buch). Register werden grundsätzlich keine verändert. Achtung: diese
- Routinen müssen im Supervisormodus aufgerufen werden.
-
-
- 10.2.1 CLEAR_SCREEN
- -------------------
-
- Diese Routine löscht den Debuggerscreen (wer hätte es gedacht...),
- Maus und Cursor werden ausgeschaltet. Diese Routine muss nur aufgeru-
- fen werden, wenn der Screen neu konfiguriert wird (NEW_FORMAT), wird
- er hingegen neu installiert (NEW_SCREEN), ist dies nicht nötig.
-
-
- 10.2.2 GET_PARAMETER
- --------------------
-
- Diese Routine setzt die unter >SCREEN_PARAMETER aufgeführten Variablen
- von Offset 42 bis und mit 56. Sie benutzt LINEA 0 und wird z.B. von
- INIT_SCR.PRG benutzt.
-
-
- 10.2.3 KILL_SCREEN
- ------------------
-
- PEACEBUG reserviert bei Programmstart einige Speicherbereiche, darun-
- ter 3 für den Bildschirmtreiber:
- 1. Der eigentlich Bildschirmspeicher
- 2. Enthält den Bildschirm in 'Asciiform', also für jedes Zeichen auf
- dem Screen ein Byte
- 3. Puffer für den Maushintergrund
-
- Mittels KILL_SCREEN kann nun PEACEBUG veranlasst werden diese Bereiche
- wieder freizugeben. Dazu übergibt man der Routine ein Word auf dem
- Stack, von dem allerdings nur 3 Bit gebraucht werden:
- 0. Bit: Bildschirmspeicher freigeben
- 1. Bit: Zeichenspeicher freigeben
- 2. Bit: Mauspuffer freigeben
-
- Ein Aufruf sieht in Assembler etwa so aus:
-
- > move.w #%111,-(sp) ; alle Bereiche freigeben
- > jsr (a0) ; Routine anspringen
- > addq.w #2,sp ; und Stack korrigieren
-
- Achtung: Speicherbereiche können nach einem PTERMRES nicht mehr frei-
- gegeben werden, KILL_SCREEN muss im Hinblick auf kommende Debuggerver-
- sionen trotzdem aufgerufen werden, auch wenn diese Routine im Moment
- noch nichts bewirkt.
-
-
- 10.2.4. NEW_SCREEN
- ------------------
-
- Das Gegenstück zu >KILL_SCREEN.
- Der entsprechende Bereich wird reserviert, im Gegensatz zu KILL_SCREEN
- wird aber auf dem Stack ein Wert zurückgegeben, der angibt ob das Re-
- servieren gelungen ist. Wird eine Null zurückgegegen, ist beim Spei-
- cherreservieren ein Fehler aufgetreten, der Debugger sollte daraufhin
- nach Möglichkeit nicht mehr angesprungen werden. Ein Aufruf sieht in
- etwa so aus:
-
- > move.w #%111,-(sp) ; alle Bereiche neu reservieren
- > jsr (a0) ; Routine anspringen
- > tst.w (sp)+ ; Rückgabewert testen, Stack korrigieren
- > beq.s error ; Fehler aufgetreten ...
-
-
- 10.2.5. NEW_FORMAT
- ------------------
-
- Diese Routine muss bei der Veränderung einer Variablen mit Status n
- oder beim Aufruf einer Routine mit ebendiesem Status aufgerufen wer-
- den. Sie berechnet alle internen Bildschirmvariablen, die der Debugger
- benötigt .
-
-
- 10.2.6. PRINT_SCREEN
- --------------------
-
- Der Bildschirm wird neu aufgebaut.
-
-
- 10.2.7. SCREEN_PARAMETER
- ------------------------
-
- Dies ist ein Pointer auf folgende Struktur:
-
- void *BILDSCHIRM_MALLOC Offset 0 r/w/n/l
- void *BILDSCHIRM_ADRESSE Offset 4 r/w/n/l
- void *ZEICHEN_ADRESSE Offset 8 r/w/n/l
- void *MAUS_PUFFER Offset 12 r/w/n/l
- long reserved[4]
- void *FONT_16 Offset 32 r/w/n/l
- void *FONT_8 Offset 36 r/w/n/l
- int FONT_FLAG Offset 40 r/w/p/n/l
- int OFFSET_X Offset 42 r/w/n/l
- int OFFSET_Y Offset 44 r/w/n/l
- int BILD_BREITE Offset 46 r/w/n/l
- int ZEILEN_LAENGE Offset 48 r/w/n/l
- int BILD_HOEHE Offset 50 r/w/n/l
- int SCREEN_BREITE Offset 52 r/w/n/l
- int SCREEN_HOEHE Offset 54 r/w/n/l
- int PLANES Offset 56 r/w/n/l
- long _BILDSCHIRM_LENGTH Offset 58 r/w/p/n/l
- long _ZEICHEN_LENGTH Offset 62 r/w/p/n/l
- long _MAUS_LENGTH Offset 66 r/w/p/n/l
- long reserved[4]
- int _OFFSET_X Offset 86 r/w/p/n/l
- int _OFFSET_Y Offset 88 r/w/p/n/l
- int _BILD_BREITE Offset 90 r/w/p/n/l
- int _BILD_HÖHE Offset 92 r/w/p/n/l
- int _PLANES Offset 94 r/w/p/n/l
- int reserved[3]
- byte SCREEN_LOCK Offset 102 r/w/l
- byte SWITCH_PALETTE Offset 103 r/w/p/l
- int OWN_PALETTE[256] Offset 104 r/w/p/l
-
-
- Diese Variablen/Pointer genügen um genau festzulegen, wie der Debug-
- gerbildschirm auszusehen hat.
- Hier einige Erläuterungen, Referenz nach Offset:
- 0: Enthält einen Zeiger auf den durch Malloc reservierten Bildschirm-
- speicher. Dessen Länge berechnet sich wie folgt:
- SCREEN_BREITE*SCREEN_HÖHE+256.
- 4: (BILDSCHIRM_MALLOC+256) AND $FFFFFF00, die eigentliche Bildschirm-
- adresse, stimmt im allgemeinen nicht mit BILDSCHIRM_MALLOC über-
- ein.
- 8: Zeiger auf den 'Zeichenbildschirm', berechnet wird die Länge fol-
- gendermassen: ZEILEN_LAENGE*BILD_HOEHE/8.
- 12: Zeiger auf den Mauspuffer, Länge: PLANES*64.
- 32: Zeiger auf den 8*16 Font 4096 Bytes lang, dieser ist im Programm-
- code integriert. Wenn Sie einen neuen Font installieren wollen,
- ändern Sie entweder diesen Pointer oder Sie überschreiben den in-
- ternen Font mit dem gewünschten neuen. Der Font selber (nicht der
- Pointer) hat also Status r/w/p/n!).
- 36: Zeiger auf den 8*8 Font 2048 Bytes lang, dieser ist im Programm-
- code integriert. Wenn Sie einen neuen Font installieren wollen,
- ändern Sie entweder diesen Pointer oder Sie überschreiben den in-
- ternen Font mit dem gewünschten neuen. Der Font selber (nicht der
- Pointer) hat also Status r/w/p/n!).
- 40: gibt an, welcher Font benützt wird. 4 bedeutet 8*16 Font, 3 8*8
- Font, alle anderen Werte sind nicht definiert und können zum Ab-
- sturz führen.
- 42: gibt den Abstand des vom Debugger benutzten Bildausschnittes vom
- linken Rand in Zeichen an (!=Anzahl Bytes wenn PLANE!=1).
- 44: gibt den Abstand des vom Debugger benutzten Bildausschnittes vom
- oberen Rand in Pixel an.
- 46: gibt die Breite des vom Debugger benutzten Bildausschnittes in
- Zeichen an.
- 48: gibt die vom Debugger benutzte Zeilenlänge an, diese muss >=BILD_-
- BREITE und IMMER durch 2 teilbar sein! Durch die Trennung von
- Bildbreite und Zeilenlänge wird die Verwaltung virtueller Zeilen-
- längen möglich, wie sie nötig ist, wenn die Bildbreite häufig
- ändert, wie z.B. mit WINDOW.ACC. Die Zeilenlänge wird in diesem
- Fall klugerweise auf die maximale Bildbreite gesetzt.
- ACHTUNG: PEACEBUG kann eine maximale Zeilenlänge von 240 Zeichen
- verwalten. Dies ist auch der Grund weshalb er sich bei Bildschirm-
- auflösungen ab 1920 Punkten Horizontal nicht installiert. Diese
- Beschränkung kann ich allerdings jederzeit gegen oben anpassen,
- wenn dies gewünscht wird, da es sich hier nicht um ein Program-
- miertechnisches Problem handelt.
- 50: gibt die Höhe des vom Debugger benutzten Bildausschnittes in Pixel
- an. Diese kann auch ungerade sein.
- 52: gibt die Breite des Bildschirms in Bytes an.
- 54: gibt die Höhe des Bildschirms in Pixel an.
- 56: gibt die Anzahl Planes des Bildschirms an.
- 58: Die Bildschirmlänge wird normalerweise aus den obigen Variablen
- berechnet. Wenn diese sich aber ändert, z.B. bei einem Auflösungs-
- wechsel von ST auf TT-Auflösung oder bei Grafikkarten, die erst
- kurz vor GEM in Aktion treten, dann kann mittels dieser Variablen
- die Länge vorbestimmt werden.
- 60: dito für den Zeichenbildschirm.
- 64: dito für den Mauspuffer.
- Auf einem TT bieten sich für die obigen drei Variablen die Werte
- 153600,19200 und 512 an. Sie können dann eine beliebige Auflösung wäh-
- len, ohne Angst haben zu müssen, die reservierten Speicherbereiche
- seien zu klein (auf einem ST reicht 32000, 4000, 256).
- Eine andere Möglichkeit ist, PBUGCONF einen neuen Screen installieren
- zu lassen, was jedoch den Nachteil hat, das bei jedem Auflösungswech-
- sel die drei Speicherbereiche verloren gehen.
- 86: bei Aufruf von GET_PARAMETER wird OFFSET_X auf einen Defaultwert
- gesetzt (Null), es sei denn _OFFSET_X enthalte einen von Null ver-
- schiedenen Wert. In diesem Fall wird dieser nach OFFSET_X kopiert.
- Zusammen mit den folgenden 3 Variablen kann so der Screen auf einen
- kleinen Bereich beschränkt werden, was mitunter auf Grossbildschirmen
- aus Performancegründen sinnvoll sein kann.
- 88: dito für OFFSET_Y
- 90: dito für BILD_BREITE
- 92: dito für BILD_HÖHE
- 94. dito für PLANES
- 102: ein Programm, das auf irgendeine der Variablen oder Routinen zu-
- greift, die Status l haben, muss diese Semaphore testen. Bei
- einem Wert ungleich Null, darf weder eine Routine aufgerufen
- noch eine Variable verändert werden. Beispielsweise setzt
- WINDOW.ACC diese Semaphore, falls der Screen in das Fenster umge-
- lenkt wird. Da es sich hier um eine Bytevariable handelt, würde
- sich die Verwendung von TAS empfehlen. Da es scheinbar einen
- Hardwarebeschleuniger gibt, der diesen Befehl falsch ausführt,
- verzichte ich auf den Gebrauch von TAS.
- 103: Nur wenn diese Variable einen von Null verschiedenen Wert hat,
- wird die Farbpalette beim Einsprung umgeschaltet.
- 104: diese 256 Words enthalten die Farbpalette, wobei beim ST natür-
- lich nur die ersten 16 Words benutzt werden. Die Palette ist de-
- faultmässig so gesetzt, dass es auf allen Auflösungen das gleiche
- ergibt (ST-High auf einem TT ist allerdings invers). Auf dem F030
- wird eine fixe Palette benutzt, so dass diese Werte keinen
- Einfluss haben.
-
-
-
- 10.3. CALL_DEBUGGER_1, CALL_DEBUGGER_2
- --------------------------------------
-
-
- Über diese Pointer kann der Debugger angesprungen werden.
- Auf dem Stack müssen sich 6 Bytes befinden, die vom Debugger ausge-
- wertet und entfernt werden:
- 0(SP).w: SR (Statusregister)
- 2(SP).l: PC (Programmcounter)
- Vor der Einsprungadresse befindet sich ein weiterer Zeiger auf die
- Einsprungsmessage, also die die in der ersten Zeile invers geprintet
- wird. Diesen Zeiger dürfen Sie auf einen eigenen nullterminierten
- String ändern. Er muss aber bei JEDEM Einsprung neu gesetzt werden!
- Der Einsprung darf nur im Supervisormodus erfolgen, z.B. so:
-
- > move.l #message,-4(a0) ; optional
- > move.l a0,debugger ; Aufrufadresse
- > movem.l (sp)+,d0-a6 ; Register restoren
- > move.l saved_pc,-(sp) ; PC auf den Stack
- > move.w saved_sr,-(sp) ; SR auf den Stack
- > move.l debugger,-(sp) ; und den Debugger
- > rts ; anspringen
-
- CALL_DEBUGGER_1: Es werden grundsdtzlich alle Register gerettet ausser
- sämtliche Stackpointer. Diese werden auf eigene Bereiche gesetzt. Das
- ist sinnvoll, wenn Sie den Debugger aufrufen um darin Teile zu debug-
- gen, die den Stack durcheinanderbringen können. Das Programm braucht
- sich dann nicht selber um ausreichend dimensionierte Stacks zu kümmern
- (USP, ISP, MSP).
- ACHTUNG: Nach einem solchen Aufruf bleibt Ihnen nichts anderes übrig,
- als Ihr Programm zu terminieren, weil sie keine rts, rte usw. mehr
- machen können, es sei denn Sie haben die eigenen Stackpointer vor dem
- Aufruf gerettet.
- Um alle Klarheiten zu beseitigen: Der Debugger benutzt intern einen
- eigenen Stack, darüberhinaus hat er einen separaten Stack für OS
- Aufrufe, einen separaten Stack für die Resetroutine, einen separaten
- Stack für die Installation und drei Stacks für das zu tracende Pro-
- gramm. Diese drei werden für ein >Lexecute und beim Einsprung über
- CALL_DEBUGGER_1 benutzt.
-
- CALL_DEBUGGER_2: Es werden alle Register gerettet, so wie sie beim
- Aufruf vorgefunden werden. Benutzen Sie diese Routine, wenn Sie:
- - Ihr Programm nach dem Aufruf nicht terminieren lassen wollen/können.
- - Wenn der Debugger keine Register verändern darf.
- - Wenn Sie den Debugger aus einer Exception oder einem Interrupt auf-
- rufen.
-
-
-
- 10.4. VERSION
- -------------
-
-
- Versionsnummer des Debuggers.
- Ist als Asciistring codiert, also z.B. "0104" für 1.04.
-
-
-
- 10.5. PARAMETER
- ---------------
-
-
- char KEY_CODE_1 Offset 0 r/w/p
- char SWITCH_CODE_1 Offset 1 r/w/p
- char KEY_CODE_2 Offset 2 r/w/p
- char SWITCH_CODE_2 Offset 3 r/w/p
- char reserved[8]
-
- int MAUS_PARAMETER s^1 Offset 12 r/w/p
- int MAUS_PARAMETER s^2 Offset 14 r/w/p
- int MAUS_PARAMETER s^3 Offset 16 r/w/p
- int MAUS_PARAMETER s^4 Offset 18 r/w/p
- int MAUS_PARAMETER s^5 Offset 20 r/w/p
- int MAUS_PARAMETER s^6 Offset 22 r/w/p
-
- int ZAHLEN_BASIS Offset 24 r/w/p
-
- int PRIORITAETEN + Offset 26 r/w/p
- int PRIORITAETEN - Offset 28 r/w/p
- int PRIORITAETEN * Offset 30 r/w/p
- int PRIORITAETEN / Offset 32 r/w/p
- int PRIORITAETEN | Offset 34 r/w/p
- int PRIORITAETEN & Offset 36 r/w/p
- int PRIORITAETEN ^ Offset 38 r/w/p
- int PRIORITAETEN <> Offset 40 r/w/p
- int PRIORITAETEN ~ Offset 42 r/w/p
- int PRIORITAETEN - Offset 44 r/w/p
- int PRIORITAETEN % Offset 46 r/w/p
- int PRIORITAETEN p Offset 48 r/w/p
- int PRIORITAETEN ( Offset 50 r/w/p
- int reserved[5]
-
- long KEY_REPEAT Offset 62 r/w/p
- long KEY_DELAY Offset 66 r/w/p
- long MOUSE_REPEAT Offset 70 r/w/p
- long MOUSE_DELAY Offset 74 r/w/p
- long DOPPEL_KLICK Offset 78 r/w/p
-
- long PRINTER_TIMEOUT Offset 82 r/w/p
- long RS232_TIMEOUT Offset 86 r/w/p
- long MIDI_TIMEOUT Offset 90 r/w/p
- long reserved[6]
-
- void *NEW HISTORY Offset 118 r
- long *HISTORY_POINTER Offset 122 r
- long HISTORY_LENGTH Offset 126 r/p
- long reserved[2]
-
- void *CACHE_INIT Offset 128 r
- int CACHE_LENGTH Offset 132 r
- long reserved
- int CACHE_LÄNGE_1 Offset 148 r/p
- long reserved
- int CACHE_LÄNGE_2 Offset 154 r/p
-
- char INSERT_FLAG Offset 156 r/w/p
- char unused /* vormals CURSOR_BOUND */
- char SYMBOL_FLAG Offset 158 r/w/p
-
-
- 0-3: Der Debugger wird angesprungen, wenn Sie die Taste gedrückt ha-
- ben, deren Scancode in KEY_CODE_1 steht und wenn die Umschalt-
- tasten den Status haben, wie er in SWITCH_CODE_1 steht.
- Die Codierung von SWITCH_CODE_1 ist fast wie bei Kbshift:
- Bit 0: Shift-Taste rechts
- Bit 1: Shift-Taste links
- Bit 2: Control-Taste
- Bit 3: Alternate-Taste
- Bit 5: Rechte Maustaste
- Bit 6: Linke Maustaste
- CapsLock wird absichtlich ausmaskiert, deren Status spielt also
- keine Rolle.
- Es können zum Einsprung wirklich die Maustasten benutzt werden,
- ob dies sinnvoll ist, sei dahingestellt.
- Eingesprungen wird allerdings nur, wenn flock $43E nicht gesetzt
- ist, da dann Diskoperationen stattfinden, die nicht gestört wer-
- den wollen. Diese Sperre kann umgangen werden, wenn Sie die zwei-
- te Tastenkombination KEY_CODE_2/SWITCH_CODE_2 drücken.
- Wichtig: wenn Sie das oberste Bit beim Scancode setzen, dann wird
- erst beim Loslassen der Taste eingesprungen.
- Auch wichtig: wenn der Scancode Null ist, wird nur der Status
- der Umschalttasten getestet, d.h. Sie können beispielsweise mit-
- tels Maustaste Rechts den Debugger aufrufen.
- 12-: PEACEBUG hat einen im Maustreiber integrierten Mausbeschleuni-
- 22 ger. Dieser berechnet die Geschwindigkeit der Maus auf dem Bild-
- schirm als Funktion der Geschwindigkeit der Maus auf dem Tisch.
- Diese Funktion ist ein Polynom 6. Grades, dessen Koeffizienten
- die Variablen MAUS_PARAMETER s^1-6 sind. Die Koeffizienten können
- in Schritten von 1/128tel verändert werden, eine unbeschleunige
- Maus erhalten Sie also durch die Koeffizienten 128,0,0,0,0,0 (und
- nur durch diese).
- 24: PEACEBUG beherrscht 4 Zahlensysteme, die Zahlenbasis wird mittels
- eines Prefix ausgewählt:
- % Binär
- . Dezimal
- $ Hexadezimal
- o Oktal
- ZAHLEN_BASIS gibt an, welche Zahlenbasis defaultmässig verwendet
- wird, also ohne Verwendung eines Prefix. Normalerweise wird 16
- benutzt, defaultmässig sind so die Hexadezimalen Zahlen vorge-
- geben. Der Wert kann (natürlich) verändert werden, es sind alle
- Basen von 2-36 erlaubt (im 36er System hätten Sie dann die Zif-
- fern 0-9 und A-Z). Sie könnten also auch im 11er System Zahlen
- eingeben, wenn Sie das als sinnvoll erachten.
- 26-: Diese 13 Worte werden vom Formelinterpreter benutzt. Sie geben
- 50 an, wie stark der nachfolgende Ausdruck an einen Operator gebun-
- den wird. Beispielsweise bindet die Addition weniger stark als
- die Multiplikation (Addition 5, Multiplikation 15), was auch
- sinnvoll ist, da man normalerweise die Regel Punkt vor Strich-
- rechnung benutzt. Einparametrige Operatoren (Vorzeichen,
- Pointer...) binden natürlich stärker als zweiparametrige. Am
- besten, Sie verändern diese Werte nicht, sinnvoll erscheint mir
- dies sowieso nur beim Operator p (Pointer). Wenn Sie dessen
- Priorität auf z.B. 2 hinuntersetzen, werden Ausdrücke wie:
- p ^a0-4
- ausgewertet, wie wenn Sie bei defaultmässigen Einstellungen:
- p(^a0-4)
- eingeben...(Das Minus bindet dann stärker als das p).
- 62: gibt die Tasten Repetiergeschwindigkeit in 1/200tel Sekunden an.
- 66: gibt die Tastenverzögerung in 1/200tel Sekunden an. Dies ist
- die Zeit, die nach dem ersten Tastendruck gewartet wird, bis der
- Tastenrepeat einsetzt.
- 70: gibt die Mausklick Repetiergeschwindigkeit in 1/200tel Sekunden
- an.
- 74: gibt die Mausklickverzögerung in 1/200tel Sekunden an. Dies ist
- die Zeit, die nach dem ersten Mausklick gewartet wird, bis der
- Mausklickrepeat einsetzt
- 78: gibt die Zeit in 1/200tel Sekunden an, die zwischen zwei Maus-
- klicks verstreichen darf, so dass diese noch als Doppelklick er-
- kannt werden.
- 82: Zeit in 1/200tel Sekunden, bis ein Timeout an der Centronics
- Schnittstelle gemeldet wird.
- 86: Zeit in 1/200tel Sekunden, bis ein Timeout an der RS232 gemeldet
- wird.
- 90: Zeit in 1/200tel Sekunden, bis ein Timeout an der MIDI Schnitt-
- stelle gemeldet wird.
- 118: diese Routine muss aufgerufen werden, wenn Sie den Historypuffer
- vergrössern wollen. Dieser wird dynamisch verwaltet, so dass die
- Anzahl verfügbarer Einträge von der verwendeten Zeilenlänge ab-
- hängt. Auf dem Stack übergeben Sie die Anzahl zu reservierender
- Bytes. Der Rückgabewert ist Null, wenn beim Reservieren ein Feh-
- ler aufgetreten ist, was allerdings die Funktionsfähigkeit des
- Debuggers nicht beeinflusst.
- > pea 8000.w ; 8000 Bytes reservieren
- > jsr (a0) ; Routine anspringen
- > tst.l (sp)+ ; Fehler aufgetreten?
- > beq.s error
- 122: Zeiger auf den reservierten Speicherbereich.
- 126: aktuelle Länge des Puffers in Bytes. Diese Variable darf nicht
- geschrieben werden, sie wird von NEW_HISTORY gesetzt. Diese
- Variable legt fest, wie gross der bei Programmstart zu reser-
- vierende Bereich sein soll.
- 138: diese Routine dient dazu, die beiden Caches zu erweitern oder zu
- verkleinern (ob dies allerdings sinnvoll ist ...). Da die Caches
- als Ring organisiert sind, können jederzeit neue Einträge hinzu-
- gefügt werden, ohne dass gleich der ganze Cache neu reserviert
- werden muss, wie das beim Historypuffer der Fall ist. Auf dem
- Stack werden für jeden Cache die gewünschten neuen Längen über-
- geben, die Routine erkennt selbständig ob Einträge gelöscht wer-
- den sollen oder neu reserviert werden müssen. Auch hier deutet
- eine Null als Rückgabewert auf ein Fehler beim Reservieren hin.
- > move.w #50,-(sp) ; 50 Einträge für Cache 1
- > move.w #30,-(sp) ; 30 Einträge für Cache 2
- > jsr (a0) ; Routine anspringen
- > tst.l (sp)+ ; Fehler aufgetreten?
- > beq.s error
- 142: dieser Wert gibt die Länge eines einzelnen Eintrages an (momentan
- 152 Bytes). Sie können so abschätzen, wieviel Speicher Sie für
- eine bestimmte Anzahl Einträge opfern müssen.
- 148: soviel Anzahl Einträge umfasst Cache 1 momentan. Diese Variable
- darf nicht geschrieben werden, dies erledigt CACHE_INIT. Der Wert
- gibt darüberhinaus an, wieviele Einträge bei Programmstart reser-
- viert werden soll.
- 154: soviel Anzahl Einträge umfasst Cache 2 momentan. Diese Variable
- darf nicht geschrieben werden, dies erledigt CACHE_INIT. Der Wert
- gibt darüberhinaus an, wieviel Einträge bei Programmstart reser-
- viert werden soll.
- 156: gibt an, welchen Schreibmodus der Editor benutzen soll. -1 bedeu-
- tet Insert-, 0 Überschreibmodus.
- 158: gibt an, ob eine Symboltabelle beim Disassemblieren, Assemblieren
- und vom Formelinterpreter benutzt wird.
- -1: benutze alle Symboltabellen
- 1: benutze die debuggereigenen Symboltabllen ohne diejenigen des
- Resident Symbol Drivers.
- 0: benutzte keine Symboltabellen
- Im Listmodus wird bei installiertem RSD auch der Programmname
- ausgegeben. Nur wenn dieses Flag 0 ist, wird dies unterdrückt.
-
-
-
- 10.6. Userroutinen
- ------------------
-
- Es folgen 6 Vektoren, in die Sie eigene Routinen einhängen können.
- Sie sollten darauf achten, dass Sie vor der Routine folgende Struktur
- anlegen:
-
- typedef struct
- {
- long us_message /* Einsprungmessage, kann 0 sein */
- char xb_magic[4]; /* "XBRA" */
- char xb_id[4]; /* XBRA-ID des installierten Programms */
- long xb_oldvec; /* Wert des Vektors vor dem Einhängen */
- } USER;
-
- oder in Assembler
-
- dc.l MESSAGE
- dc.l 'XBRA'
- dc.l 'PBUG'
- OLD_ROUTINE: dc.l $xxxxxxxx
- ROUTINE: ...
-
- Diese Struktur kann weggelassen werden, vorausgesetzt Sie hängen Ihre
- Routinen selber ein. Lassen Sie dies durch PEACEBUG-Config erledigen,
- dann MUSS diese Struktur vor der Routine stehen.
- Wichtig: bei USERTRACE muss diese Struktur IMMER vorhanden sein.
- Sie dürfen Ihre Routinen auch aus-, vor-, umhängen. Verboten ist es,
- die Position des letzten Eintrages zu verändern. Es handelt sich dabei
- um den Debuggereintrag, den Sie an der Kennung 'PBUG' erkennen.
- Sie sollten ihre Routine übrigens nicht mit rts beenden, sondern zur
- nächsten Routine springen, dies natürlich nur wo es sinnvoll ist (bei
- USERTRACE ist es dies nicht).
- ACHTUNG: der Stackpointer enthält natürlich zusätzlich die Rücksprun-
- gadresse. Wenn Sie also auf PC und SR zugreifen wollen, müssen Sie
- dies berücksichtigen.
-
-
- 10.6.1. USERTRACE
- -----------------
-
- Dies ist ein Pointer auf eine Routine, die immer aufgerufen wird, wenn
- Sie mittels trace[+/-/*] tracen.
- Sie wird dem Benutzer zur Verfügung gestellt um nach jedem Befehl be-
- stimmte Bedingungen testet zu können, z.B. um rauszufinden, welches
- Programm wann welche Speicherstellen abändert.
- Die Routine wird mit unveränderten Registern angesprungen, also so wie
- sie im getracten Programm benutzt wurden. Es dürfen deshalb keine Re-
- gister verändert werden, das Retten wird dem Benutzer überlassen. Auch
- der PC und das Statusregister sind zugänglich, da sie auf dem Stack
- liegen (gegebenenfalls auch ein Stackframe). Aufgerufen wird die Rou-
- tine wie folgt:
-
- > jsr USERTRACE
- > blt.s Weiter_mit_Trace
- > bgt.s Weiter_ohne_Trace
- > beq.s Abbrechen_&_in_den_Debugger_springen
-
- Der Tracehandler wird also über das Statusregister gesteuert und kann
- dazu bewegt werden, entweder das Programm mit/ohne Trace fortzusetzen
- oder in den Debugger zu springen. Für das Programm gibt es also zwei
- Möglichkeiten:
-
- > cmp.l #1,d7
- > sne -(sp)
- > tst.b (sp)+
- > rts
-
- > move.l a0,-(sp)
- > move.l 10(sp),a0 ; PC holen
- > cmp.w #$4e41,(a0) ; Opcode testen
- > sne flag
- > move.l (sp)+,d0
- > tst.b flag
- > rts
-
- Die erste wird benutzt, wenn keine Register verändert werden, die
- zweite falls dies doch nötig sein sollte. Auf dem Stack befinden sich
- SR 4(SP), PC 6(SP) und gegebenenfalls ein Stackframe 10(SP).
- Es ist sinnvoll, nach dem Installieren der Usertraceroutine gleich den
- Debugger anzuspringen, damit der Tracemodus eingeschaltet werden kann.
-
-
- 10.6.2. USERENTER/USERQUIT
- --------------------------
-
- Diese Routinen werden bei jedem Einsprung in den Debugger und bei je-
- dem Verlassen angesprungen.
-
- 1. USERENTER: wird über ein jsr angesprungen noch bevor der Debugger
- irgendwas macht. Alle Register sind noch Original, auf dem Stack
- befinden sich SR 4(SP), PC 6(SP) und gegebenenfalls ein Stackframe
- 10(SP). Wenn Sie das Statusregister testen wollen, benutzen Sie den
- Wert auf dem Stack, das aktuelle SR kann vom Debugger schon verän-
- dert worden sein.
- 2. USERQUIT: wird über ein jsr angesprungen kurz bevor der Debugger
- endgültig verlassen wird (es wird dann noch die Traceroutine ange-
- sprungen, d.h. das Tracen können Sie über diese Routinen nicht be-
- einflussen). Alle Register sind Original, auf dem Stack befinden
- sich SR 4(SP), PC 6(SP) und gegebenenfalls ein Stackframe 10(SP).
-
-
- 10.6.3. USER_SWITCH_1, USER_SWITCH_2
- ------------------------------------
-
- 1. USER_SWITCH_1: wird aufgerufen bevor auf den Debuggerbildschirm um-
- geschaltet wird, kann z.B. dazu dienen, Grafikkarten neu zu init-
- ialisieren oder die Auflösung umzuschalten.
- 2. USER_SWITCH_2: wird aufgerufen bevor auf den Programmbildschirm um-
- geschaltet wird, kann z.B. dazu dienen, Grafikkarten neu zu init-
- ialisieren oder die Auflösung umzuschalten.
-
-
- 10.6.4. USER_RESET
- ------------------
-
- Diese Routine wird bei einem Reset angesprungen und dient dazu gegebe-
- nenfalls zusätzliche Hardware zu initialisieren. Vom Debugger selber
- wird nur die rechnereigene Hardware wie MFP, Soundchip und Acia ini-
- tialisiert.
-
-
-
- 10.7. FLAGS
- -----------
-
-
- Zeiger auf folgende Struktur (Erläuterungen siehe Kapitel "Vektoren"):
-
- byte BU_FLAG[2] Offset 0 ; Buserror
- byte AD_FLAG[2] Offset 2 ; Adress_error
- byte IL_FLAG[2] Offset 4 ; Illegal
- byte DI_FLAG[2] Offset 6 ; Division
- byte CH_FLAG[2] Offset 8 ; Chk
- byte TV_FLAG[2] Offset 10 ; cpTrapv/cc
- byte PR_FLAG[2] Offset 12 ; Privileg
- byte TR_FLAG[2] Offset 14 ; Trace
- byte LA_FLAG[2] Offset 16 ; Linea
- byte LF_FLAG[2] Offset 18 ; Linef
- byte CP_FLAG[2] Offset 20 ; Coprocessor Protocol Violation
- byte FO_FLAG[2] Offset 22 ; Format Error
- byte IN_FLAG[2] Offset 24 ; Uninitialized Interrupt
- byte SI_FLAG[2] Offset 26 ; Spurious
- byte VB_FLAG[2] Offset 28 ; VBL
- byte NM_FLAG[2] Offset 30 ; NMI
- byte T0_FLAG[2] Offset 32 ; Trap 0
- byte GE_FLAG[2] Offset 34 ; GEMDOS
- byte VD_FLAG[2] Offset 36 ; VDI
- byte AE_FLAG[2] Offset 38 ; AES
- byte T3_FLAG[2] Offset 40 ; Trap 3
- byte T4_FLAG[2] Offset 42 ; Trap 4
- byte T5_FLAG[2] Offset 44 ; Trap 5
- byte T6_FLAG[2] Offset 46 ; Trap 6
- byte T7_FLAG[2] Offset 48 ; Trap 7
- byte T8_FLAG[2] Offset 50 ; Trap 8
- byte T9_FLAG[2] Offset 52 ; Trap 9
- byte TA_FLAG[2] Offset 54 ; Trap 10
- byte TB_FLAG[2] Offset 56 ; Trap 11
- byte TC_FLAG[2] Offset 58 ; Trap 12
- byte BI_FLAG[2] Offset 60 ; BIOS
- byte XB_FLAG[2] Offset 62 ; XBIOS
- byte TF_FLAG[2] Offset 64 ; Trap 15
- byte C1_FLAG[2] Offset 66 ; Branch or Set on Unordered Condition
- byte C2_FLAG[2] Offset 68 ; Inexact result
- byte C3_FLAG[2] Offset 70 ; Divide by Zero
- byte C4_FLAG[2] Offset 72 ; Underflow
- byte C5_FLAG[2] Offset 74 ; Operand Error
- byte C6_FLAG[2] Offset 76 ; Overflow
- byte C7_FLAG[2] Offset 78 ; Signaling NAN
- byte PC_FLAG[2] Offset 80 ; PMMU Configuration
- byte PI_FLAG[2] Offset 82 ; PMMU Illegal
- byte PA_FLAG[2] Offset 84 ; PMMU Access Level
- byte HZ_FLAG[2] Offset 86 ; 200HZ Timer
- byte KB_FLAG[2] Offset 88 ; Keyboard
- byte RI_FLAG[2] Offset 90 ; Ring Indicator
- byte ET_FLAG[2] Offset 92 ; ETV_CRITIC
- byte RE_FLAG[2] Offset 94 ; RESET
-
-
-
- 10.8. Vektor
- ------------
-
-
- Zeiger auf die berüchtige Routine, wie sie schon mehrmals erwähnt wur-
- de. Sie testet jeden einzelnen Vektor, in den sich PEACEBUG einhängen
- kann und entscheidet, ob Sie die Routine ein-, aus- oder an die erste
- Stelle hängen muss/kann.
-