Peace Debug
Jump to navigation
Jump to search
**********************************************************************
* *
* 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.