HiSoft DevpacST
Jump to navigation
Jump to search
HiSoft
BenÂtzung der Assembler-Sprache von Personal Pascal
Hier wird geschildert, wie man Prozeduren und
Funktionen in Assembler Sprache schreibt und mit Pascal-Programmen
linkt, indem man DevpacST und OSS Personal Pascal verwendet.
Um Personal-Pascal-kompatible Objekt-Dateien zu generieren,
mÂssen Sie die DevpacST Version 2.02 oder sp„tere verwenden, da
frÂhere Versionen nicht kompatibel sind. Sie sollten DRI-Ausgabe-
Code w„hlen, wie es im Handbuch (Seite 48) beschrieben ist. FÂgen
Sie dannach
COMMENT PASCAL
in Ihr Programm ein. Dadurch wird GenST angewiesen, das spezielle
Dateiformat fÂr Personal Pascal zu erzeugen. Die Deklaration der
Funktionen und/oder Prozeduren muž mittels der XDEF-Amweisung
erfolgen, deren Namen mÂssen in Grožbuchstaben erscheinen. Ihre
Anweisungen sollten in der TEXT-Sektion erfolgen. Globale
Variablen sollten Sie in der BSS-Sektion plazieren. Versuchen Sie
nicht, die DATA-Sektion zu verwenden, denn dadurch kâ€nnte der
Linker die Kontrolle verlieren.
Beim Assemblieren auf Diskette wird eine .0-Datei erzeugt. Diese
ist jedoch nicht identisch mit einer .0-Datei im DRI-Format, denn
erstere ist nur mit dem Pascal-Linker verwendbar. Sie kâ€nnen
dannach diese Datei als eine zus„tzliche Link-Datei gebrauchen.
(Lesen Sie bitte dazu Seite 5-3 in Ihrem Handbuch)
Die Regeln bezÂglich der von Pascal aufgerufenen Assembler
Sprache kâ€nnen Sie auf den Seiten 6-142 finden.
Hier ist ein kÂnstlich einfaches Beispiel, welches den Gebrauch
von Parametern oder Return-Werten vermeidet. Es definiert ganz
einfach eine Prozedur, einen String am Bildschirm unter
Verwendung von GEMDOS auszugeben:
opt l2,c8+ DRI mode, short case sensitive labels
COMMENT PASCAL
xdef TESTING declare export (s)
TESTING move.l #message,-(a7)
move.w #9,-(a7)
trap #1
addq.l #6,sp
rts
message dc.b 'Hello',13,10,0
Diese Funktion sollte in einem Pascal-Programm deklariert werden,
die mit
PROCEDURE TESTING; EXTERNAL;
aufgerufen werden soll, wobei die .0-Datei von DevpacST als
zus„tzliche Link-Datei beim Linken des Hauptprogramms
spezifiziert ist.
2 Der kombinierte Editor/Makro-Assembler
-Žnderungen -
Der Editor von GENST.PRG bildet das KernstÂck der vâ€llig integrierten
Umgebung von Devpac ST Version 2. Sie kâ€nnen assemblieren, debuggen
und auch andere Programme, wie z.B. LinkST, aufrufen, ohne jemals
den Editor verlassen zu mÂssen. Wenn Sie zus„tzlich noch unser Saved!-
Desk-Accessory besitzen, gibt es kaum einen Grund, w„hrend der
Programmentwicklung zurÂck ins Desktop zu gehen.
2.1 Generelle Žnderungen und Erg„nzungen
Zuerst wird auf die einfacheren Ver„nderungen des Editors eingegangen.
Es handelt sich hiermit haupts„chlich um neue TastaturkÂrzel und
-umbelegungen.
Die Geschwindigkeit des Editors hat sich stark erhâ€ht. Es gibt so
gut wie keinen Tastaturnachlauf mehr, und das >>Bl„ttern<< geht um ein
Mehrfaches schneller als beim Editor der Version 1.
Zeilen kâ€nnen jetzt bis zu 240 Zeichen lang sein. Das Seitw„rts-
Scrollen ist durch Benutzung des horizontalen Scrolling-Balkens
des Editorfensters mâ€glich. Der Editor scrollt auch automatisch
zur Seite, wenn man sich mit dem Cursor nahe genug am Rand befindet.
Dies gilt auch fÂr Ctrl-C.
Shift-Alt-S ist das TastaturkÂrzel fÂr "Datei speichern".
Der Editor funktioniert jetzt auch in niedriger Auflâ€sung.
Tip: Wenn Sie ein Tab-Zeichen suchen bzw. ersetzen wollen, geben
Sie Ctrl-I in der Dialogbox ein; als Tab wird dann eine kleine Uhr
erscheinen.
2.2 Blockverwaltung
Die Verwaltung von Blâ€cken ist um einiges erweitert worden. Markierte
Blâ€cke werden jetzt invers dargestellt.
2.2.1 Block lâ€schen
Ein Block wird nicht mehr mit Shift-F3, sondern mit Shift-F5 gelâ€scht.
Der gelâ€schte Block ist auch nicht unwiederruflich verloren, sondern
wird im Blockspeicher abgelegt. Voraussetzung ist, daá genug freier
Speicher vorhanden ist.
2.2.2 Block in den Blockspeicher kopieren
Mit Shift-F4 kopieren Sie den markierten Block in den Blockspeicher.
Der markierte Block bleibt jedoch an seiner ursprÂnglichen Stelle
und wird nicht - wie mit Shift-F5 -gelâ€scht.
2.2.3 Block aus dem Blockspeicher kopieren
Mit F5 wird der Inhalt des Blockspeichers an die Cursorposition ko-
piert.
2.2.4 Undo und Ctrl-U
Eine „hnliche Funktion haben die Tastenkombinationen Ctrl-U und Undo.
Eine Zeile, die mit Ctrl-Y gelâ€scht wurde, kann so oft wie nâ€tig
mit Undo bzw. Ctrl-U wieder eingefÂgt werden. Das gleiche gilt fÂr
Text, der mit Ctrl-Q gelâ€scht wurde.
2.3 Voreinstellungen
Es ist jetzt mâ€glich, zus„tzlich zum Tab-Abstand auch all die
Einstellungen, die mit dem Installationsprogramm gemacht wurden,
Âber "Voreinstellungen" festzulegen:
2.3.1 Tab-Abstand
Wie bei GENST.PRG Version 1 ist der Standardwert 8, kann aber auf
jeden Wert zwischen 2 und 16 eingestellt werden.
2.3.2 Textspeichergrâ€Å¾e
Der Standardwert ist 60 000 Byte, kann aber auf einen Wert von 4000
bis 990 000 Byte eingestellt werden. Dadurch wird die maximale Datei-
grâ€Ã¡e bestimmt, die geladen und editiert werden kann. Man sollte
darauf achten, genug Speicher fÂr den Assembler und ggf. MonST
Âbrig zu lassen, normalerweise werden etwa 100 Kbyte benâ€tigt. Ver„ndern
der Speichergrâ€Ã¡e hat zur Folge, daá der Text, der gerade bearbeitet
wird, gelâ€scht wird; eine Alarmbox erscheint, wenn der Text nicht
abgespeichert wurde.
2.3.3 Numerischer Tastenblock
Diese Option erlaubt es, den numerischen Tastenblock der ST-Tastatur
als Cursorblock, „hnlich wie bei PC-Kompatiblen, zu benutzen.
Standardm„áig ist er als Cursorblock konfiguriert.
2.3.4 Backups
Ohne Voreinstellung macht der Editor keine Backups. Wenn Sie in
der Abfragebox "Ja" w„hlen, gibt der Editor der schon existierenden
Version Ihrer Datei die Extension .BAK. Die aktuelle Datei wird dann
unter dem richtigen Namen gespeichert.
2.3.5 (Automatisches) EinrÂcken
Diese Funktion rÂckt eine Zeile automatisch nach Eingabe von RETURN
um so viel ein, wie die vorherige Zeile durch Leerzeichen bzw. Tabs
eingerÂckt wurde.
2.3.6 Cursor
Die Standardeinstellung des Cursors ist ein Blinken, er kann jedoch
auch so eingestellt werden, daá er feststeht.
2.3.7 MonST laden
Diese Option ist standardm„áig an und bewirkt, daá jedesmal, wenn
GENST.PRG geladen wird, MonST mitgeladen wird. MonST ist so per
Tastendruck ohne Diskettenzugriff sofort verfÂgbar. Das Ausschalten
der Option bringt einen Speichergewinn von ca. 24 Kbyte. Der neue
Wert der Einstellung wird nur dann wirksam, wenn Sie die
Voreinstellungen abspeichern und GENST.PRG neu starten. Es sollte
beachtet werden, daá AMonST schon installiert zu haben nicht das
gleiche ist, wie MonST beim Start von GenST zu laden.
2.3.8 Voreinstellungen sichern
Wenn Sie den Abbruch-Knopf bet„tigen, werden s„mtliche Žnderungen,
die Sie in der Voreinstellungen-Dialogbox gemacht haben, ignoriert;
mit OK werden die Žnderungen wirksam. Wenn die von Ihnen gew„hlte
Konfiguration permanent gespeichert werden soll, klicken Sie auf
Sichern. Die Datei GENST2.INF wird erstellt und enth„lt die von
Ihnen gew„hlten Voreinstellungen sowohl aus der Assemblieren-Box als
auch aus der Voreinstellungen-Box.
2.4 Das Programm-MenÂ
Das Programm-Men enth„lt alle Funktionen, die mit dem Assemblieren
oder der AusfÂhrung von Programmen zu tun haben.
2.4.1 Assemblieren
Um das Programm, das Sie z.Zt. editieren, zu assemblieren, w„hlen
Sie entweder "Assemblieren" oder drÂcken Alt-A. Es erscheint die
Assemblierungs-Dialogbox, die verschiedene Optionen enth„lt; hier
wird nur auf die Ausgabe-Option eingegangen, die weiteren Optionen
werden im Assembler-Teil besprochen.
GenST kann auf Diskette, in den Speicher, oder nirgendwohin (>>Nein<<)
assemblieren; die "Nirgendwo"-Option ist nÂtzlich, wenn nur ein
Syntaxcheck durchgefÂhrt werden soll. In den Speicher assemblieren
ist ideal zum Ausprobieren eines Programmes, da nicht auf die Diskette
geschrieben wird. Wenn Sie in den Speicher assemblieren, mÂssen Sie
die Speichermenge angeben, in die das Programm hineinassembliert wird;
der Standardwert ist 20 Kbyte, genug fÂr ein durchschnittlich groáes
Programm mit Symbolen oder ein grâ€Ã¡eres Programm ohne Symbole.
Wenn Sie die Meldung "Programmspeicher voll" erhalten, heiát das,
daá die von Ihnen angegebene Speichermenge nicht ausreicht um Ihr
Programm vollst„ndig zu assemblieren; Sie mÂssen also den Programm-
speicher vergrâ€Ã¡ern. NatÂrlich hat ein grâ€Ã¡erer Programmspeicher
zur Folge, daá der Assembler weniger Platz zum Arbeiten
hat. Falls der Assembler mit der Meldung "ungenÂgender Speicher"
abbricht, mÂssen Sie die Programmspeichergrâ€Ã¡e verringern. Wenn die
Programmspeichergrâ€Ã¡e mit dem fÂr den Assembler notwendigen Platz
nicht zu vereinbaren ist, mÂssen Sie auf Diskette assemblieren.
Wenn Sie auf Diskette assemblieren, wird die Grâ€Ã¡eneinstellung des
Programmspeichers ignoriert und der gesamte verfÂgbare Speicherplatz
dem Assembler zur VerfÂgung gestellt. Wenn Ihr Programm auf Diskette
assembliert wird, ohne daá der Assembler sich einen Namen fÂr diese
Datei bilden kann, wird der Name Ihres Programms mit NONAME anfangen.
Wenn Sie auf "Assemblieren" klicken oder Return drÂcken, wird der
Assembler gestartet. Am Ende des Vorgangs wird auf einen Tastendruck
gewartet, damit Sie ggf. erscheinende Meldungen in Ruhe lesen kâ€nnen,
bevor Sie zum Editor zurÂckkehren. Wenn in Ihrem Programm Fehler
auftreten, wird der Cursor des Editors bei der RÂckkehr auf der ersten
fehlerhaften Zeile Ihres Programmtextes stehen; mit Alt-J gelangen Sie
dann an den n„chsten Fehler.
2.4.2 Programme ausfÂhren
Wenn Sie "AusfÂhren" im Programm-Men w„hlen, kâ€nnen Sie ein in den
Speicher assembliertes Programm ausfÂhren; das TastaturkÂrzel hierfÂr
ist Alt-X. Wenn der Vorgang beendet wird, kehren Sie in den Editor
zurÂck. Falls Ihr Programm nicht vollst„ndig assembliert wurde, kann
es nicht ausgefÂhrt werden.
Wenn Ihr Programm abstÂrzt, kann es sein, daá Sie nicht wieder
in den Editor gelangen und neu "booten" mÂssen. Es ist also ratsam,
den Quelltext vor der AusfÂhrung des Programmes abzuspeichern.
Vorsicht: Wenn Ihr Programm mit Fehlern, wie z.B. undefinierten
Symbolen, vollst„ndig assembliert wurde, kâ€nnen Sie es zwar ablaufen
lassen, jedoch ist die Gefahr eines Absturzes vorhanden.
Wenn Sie ein Programm, egal welcher Art, vom Editor aus ausfÂhren,
kann es vorkommen, daá der Rechner am Programmanfang oder zum Programm-
ende hin zu "h„ngen" scheint. Dies ist ein Fehler im GEM, Âber den wir
keine Kontrolle haben; der Mauszeiger befindet sich dabei in der
MenÂleiste. Wenn Sie die Maus nach unten bewegen, mÂáte alles normal
weiterlaufen.
2.4.3 Debuggen
Wenn Sie ein Programm, welches in den Speicher assembliert wurde,
debuggen wollen, w„hlen Sie "Debuggen" oder Alt-D. Dadurch wird MonST
aufgerufen und kann Ihr Programm, das ggf. Symbole enth„lt, debuggen.
Wenn Sie Ctrl-C eingeben, wird Ihr Programm abgebrochen und Sie ge-
langen in den Editor zurÂck. Die Bildschirminitialisation h„ngt vom
MenÂpunkt "GEM" ab, der weiter unten erl„utert wird.
Wenn Sie "MonST laden" in den "Voreinstellungen" nicht gew„hlt haben,
sind weder "Debuggen" noch "MonST" w„hlbar.
2.4.4 MonST
Wenn Sie "MonST" w„hlen, oder Alt-M drÂcken, wird MonST aufgerufen,
und zwar so, als ob Sie ihn vom Desktop aufgerufen h„tten, also ohne
Diskettenzugriff (so wie es auch z.B. beim Debuggen der Fall ist).
Ctrl-C bringt Sie wieder in den Editor zurÂck. Die Bildschirm-
initialisation h„ngt hier auch von GEM ab.
2.4.5 GEM
Normalerweise wird bei "AusfÂhren", "Debuggen" und "MonST" eine GEM-
Bildschirminitialisation vorgenommen. Bei TOS-Programmen braucht man
aber einen leeren Bildschirm und einen blinkenden Cursor. Wenn der
MenÂpunkt "GEM" mit einem Haken gekennzeichnet ist, wird der Bildschirm
auf ein GEM-Programm vorbereitet, wenn nicht, wird der Bildschirm auf
ein TOS-Programm vorbereitet.
Die Einstellung dieser Option wird beim Abspeichern der Voreinstellungen
beibehalten.
Vorsicht: Ein TOS-Programm mit einem GEM-Bildschirm ist mâ€glich,
sieht aber unschâ€n aus. Ein GEM-Programm darf aber nie mit der TOS-
Bildschirminitialisation ausgefÂhrt werden, da sonst ein Absturz
sehr wahrscheinlich wird.
2.4.6 N„chster Fehler
Hier ist so gut wie keine Ver„nderung gegenÂber der Version 1 zu
erkennen. Der einzige Unterschied ist, daá bei der RÂckkehr vom
Assembler in den Editor der Cursor auf der ersten fehlerhaften Zeile
plaziert ist.
2.4.7 Anderes Programm
Mit dieser Funktion, die auch mit Alt-O aufgerufen werden kann, kâ€nnen
Sie ein anderes Programm vom Editor aus laufen lassen; wenn das Programm
beendet wird, kehren Sie in den Editor zurÂck. Die Hauptanwendungen
dieser Funktion sind das AusfÂhren von assemblierten Programmen und
der Aufruf des Linkers. Sowohl TOS- als auch GEM-Programme kâ€nnen
ausgefÂhrt werden. Voraussetzung dafÂr ist natÂrlich, daá genug Speicher
vorhanden ist.
Wenn Sie "Anderes Programm" aufrufen, erscheint zun„chst eine Warnung
mit dem Inhalt, daá Sie Ihren Quelltext nicht gesichert haben. Danach
erscheint die File-Selector-Box, in der Sie das auszufÂhrende Programm
ausw„hlen. Wenn es ein TOS- oder ein TTP-Programm ist, werden Sie
zus„tzlich nach einer Kommandozeile fÂr das Programm gefragt. Sie
kâ€nnen in der Kommandozeile das ¯%® Zeichen angeben; dies wird dann
durch den Namen (und nicht durch die Extension) der gerade editierten
Datei ersetzt. Mit ¯%%® wird ein echtes "%" Zeichen in die Kommando-
zeile gesetzt.
Die Bildschirminitialisation h„ngt von der Extension des Programmes
ab, und nicht von der Einstellung von GEM.
2.5 Benutzer von Saved!
Wenn Sie die Path-Funktion Saved!s benutzen und Ihr System zum
automatischen Laden von GENST.PRG mit einem Doppelklick auf die
Quelldatei konfiguriert haben, gilt die Einschr„nkung nicht, daá
sich GENST.PRG und Ihre Quelltexte im gleichen Ordner befinden mÂssen.
Der Editor sucht nach der GENST2.INF-Datei zuerst im aktuellen Ordner
(der Ordner, in dem sich die Datei befindet, auf die Sie geklickt
haben), und dann in den Ordnern des Paths. Wenn Sie die Vorein-
stellungen sichern, wird die Datei an der Stelle gesichert, an der
sie gefunden wurde.
Sie kâ€nnen Saved! mit dem TastaturkÂrzel Shift-Clr aufrufen. Dies
funktioniert nur, wenn das Accessory auf Ihrer Bootdiskette SAVED!.ACC
oder SAVED.ACC heiát.
2.6 Der Assembler GenST
Der Assembler von Devpac ST, GenST, ist fÂr die Version 2 vâ€llig neu
geschrieben worden. Nur so ist es mâ€glich gewesen, die gewÂnschten
Verbesserungen zu machen. Einige der neuen Merkmale von GenST2 sind
die Assemblierungsgeschwindigkeit von bis zu 75000 Zeilen pro Minute,
Symbolsignifikanz von 127 Zeichen und die INCBIN- Direktive, mit der
eine Bin„rdatei, wie z.B. eine Bildschirmgrafik, direkt in Ihr Programm
eingebunden werden kann. GENST generiert Code, der ebenso mit Pascal
Plus linkbar ist.
GenST gibt es in zwei AusfÂhrungen: einmal direkt vom Editor aus
aufrufbar und einmal als alleinstehendes Programm.
2.7 Den Assembler aufrufen
2.7.1 Vom Editor aus
Sie kâ€nnen vom Editor aus durch W„hlen der "Assemblieren"-Funktion
im Programm-Men oder mit Alt-A den Assembler aufrufen.
Programmtyp
Hier w„hlen Sie zwischen ausfÂhrbarem, GST-linkbarem oder DRI-
linkbarem Code. Die Unterschiede zwischen den drei Programmtypen
werden sp„ter genau erkl„rt.
Grož/Klein
Hier kâ€nnen Sie w„hlen, ob bei Symbolen Unterschiede wegen der Groá-
oder Kleinschreibung gemacht werden sollen. Wenn Sie "gleich" w„hlen,
dann sind die Symbole "Start" und "start", vom Assembler aus gesehen,
dasselbe Symbol; wenn "Verschieden" gew„hlt wird, sind die beiden
zwei verschiedene Symbole.
Debug-Information
Wenn Sie Ihr Programm noch debuggen, ist es nÂtzlich, daá die Symbole
im fertigen Programm enthalten sind. Die Symboloptionen sind
"Normal" und "Erweitert": das HiSoft- erweiterte Debug-Format
erlaubt es, bis zu 22 Zeichen lange Symbole anstatt der Âblichen
8 Zeichen L„nge zu verwenden.
Listing
Sie kâ€nnen hiermit die Ausgabe des Listings w„hlen: auf dem Drucker,
auf Diskette, auf der eine Datei mit gleichem Namen und der Extension
.LST angelegt wird, oder auf den Bildschirm. Wenn Sie keine Ausgabe
wollen, kâ€nnen Sie auch diese Option w„hlen.
Assemblieren
Hier kâ€nnen Sie die Geschwindigkeit des Assemblers bestimmen.
Normalerweise sollten Sie den Schnell-Knopf bet„tigt lassen, wenn
jedoch der Speicerplatz zu gering wird, sollten Sie Langsam
w„hlen. Dadurch wird der Assembler gezwungen, so wenig Platz wie
mâ€glich zu belegen und den Zugriff auf Diskette zu verlangsamen.
In der .TTp-Version wird der Langsam-Modus mittels der Option -M
in der Kommandozeile eingeschaltet.
Output
Wie bereits erw„hnt, kâ€nnen Sie hier w„hlen, welches Programm aus
Ihrem Quelltext erzeugt wird. "Nein" heiát, daá nur ein Syntaxcheck
gemacht wird und kein Programm erzeugt wird. "Speicher" heiát, daá
das Programm in den Speicher assembliert wird, und so
bereitsteht, um von MonST debuggt zu werden, oder auch einfach zur
AusfÂhrung gebracht wird. Es wird kein Diskettenzugriff gemacht,
auáer dann, wenn eine Include-Datei gebraucht wird, die meistens
nur ein Mal gelesen wird; bei der Version 1 wurde eine Include-
Datei immer zweimal gelesen. Diskette bedeutet, daá das Program
wie gewohnt auf Diskette erzeugt wird. Die Regeln der
Namensgebung fÂr die Dateien werden in KÂrze erl„utert.
Wenn Sie alle gewÂnschten Optionen gew„hlt haben, klicken Sie auf
"Assemblieren" oder drÂcken Sie Return. Der Ablauf wurde oben schon
erl„utert.
2.8 Der Stand-alone-Assembler
Wenn Sie die .TTP-Version des Assemblers aufrufen, werden Sie nach
einer Kommandozeile gefragt; die Kommandozeile hat das unten beschriebene
Format. Wenn Sie keine Kommandozeile Âbergeben wollen, geben Sie
nur Return ein, Sie kehren dann zum Desktop zurÂck. Am Ende des
Assembliervorganges wird auf einen Tastendruck gewartet. Wenn dem
Assembler beim Aufruf keine Kommandozeile Âbergeben wurde, wird
kein Tastendruck abgewartet, da angenommen wird, daá der Assembler
von einem CLI oder einer Batch-Datei aus aufgerufen wurde.
2.8.1 Format der Kommandozeile
Die Kommandozeile hat das Format
Hauptdatei <-Optionen> [-Optionen]
Die Hauptdatei ist der Name der Datei, die assembliert werden soll;
wenn keine Extension angegeben wurde, wird .S angenommen. Optionen
sollte ein "-" Zeichen voranstehen. Erlaubte Optionen sind (zusammen
mit den „quivalenten OPT- Direktiven):
B keine Bin„rdatei erzeugen
C GROá/klein egal (OPT C-)
D Debug (OPT D+)
L GST-linkbarer Code (OPT L+)
L2 DRI-linkbarer Code (OPT L2)
O Name der erzeugten Datei, folgt dem O ohne Leerschritt
dazwischen
P Name der Listing-Datei, folgt dem P ohne Leerschritt dazwischen
Q In jedem Fall auf einen Tastendruck am Ende warten
T Der Tab-Abstand; die Zahl folgt dem T ohne Leerschritt;
In der .TTp-Version wird die Tab-Einstellung durch die
Option -Txx ge„ndert, z.B. -T10.
X Erweiterter Debug (OPT X+)
Wenn keine Optionen auf der Kommandozeile angegeben werden, wird
eine ausfÂhrbare Programm-Datei erzeugt, deren Name auf dem der
Source-Datei basiert, allerdings ohne Listing und mit Unterscheidung
zwischen Grož- und Kleinschrift.
Beispiele:
test -b
assembliert die Datei test.s ohne eine Datei zu erzeugen; dies w„re
ein Syntaxcheck, mehr nicht.
test -om:test.prg -p
assembliert test.s in die Datei m:test.prg und erzeugt eine Listing-Datei
namens test.lst.
test -l2dpprn: -t10
assembliert test.s in DRI-linkbares Format mit vollst„ndiger Debug-
Information und schickt das Listing an die parallele Schnittstelle.
Wenn Sie ein Listing an die serielle Schnittstelle senden wollen,
mÂssen Sie AUX: angeben. Der Tab-Abstand des Listings betr„gt 10
Zeichen.
2.8.2 Dateinamen
In GenST ist geregelt, wie der Name einer Ausgabedatei kreiert wird.
Der Name ist auáerdem abh„ngig von den angegebenen Optionen, wie
z.B. -O, und der OUTPUT- Direktive.
Wenn ein Dateiname explizit angegeben wird, dann ist
Name=angegebenerName
Wenn die Output-Direktive nicht benutzt wurde, dann ist
Name=Source-Name + .PRG .BIN oder .O
Wenn die Output-Direktive eine Extension angibt, dann ist
Name=Source-Name + Extension vom Output
Sonst ist
Name=Name vom Output
2.9 Der Assembliervorgang
GenST ist ein Zwei-Pass-Assembler; w„hrend des ersten Passes wird
der Quelltext im Speicher, ggf. auch von Diskette, verarbeitet und
eine Symboltabelle gebildet. Wenn Syntaxfehler w„hrend des ersten
Passes gefunden wurden, werden diese angegeben, der zweite Pass wird
nicht gestartet. W„hrend des zweiten Passes werden die mnemonischen
Befehle in bin„re Instruktionen umgewandelt, ein Listing kann
ausgegeben - wenn erforderlich mit einer Symboltabelle - und eine
Bin„rdatei erzeugt werden. W„hrend des zweiten Passes gefundene
Fehler und Warnungen werden angegeben.
W„hrend des Assemblierens kann jede Bildschirmausgabe mit Ctrl-S
angehalten werden und mit Ctrl-Q weiterlaufen. Mit Ctrl-C
kann der Assembler abgebrochen werden; die bis dahin erzeugte Datei
ist aber unvollst„ndig und sollte nicht ausgefÂhrt werden.
2.9.1 In den Speicher assemblieren
Um die turn-around-Zeiten so gering wie mâ€glich zu halten, kann GenST
in den Speicher assemblieren, damit Ihr Programm sofort ausgefÂhrt
oder mit Hilfe von MonST sofort debuggt wird. Um dieses zu erreichen,
wird der sog. Programmspeicher benutzt, dessen Grâ€Ã¡e in der
Assemblierungs-Dialogbox einzustellen ist. Wenn Sie ohne Debug-
Information arbeiten, kann der gesamte Programmspeicher fÂr Ihr
Programm benutzt werden; wenn Sie aber mit Debug arbeiten, wird der
Programmspeicher sowohl mit Ihrem Programm als auch mit der Debug-
Information gefÂllt.
Ein Programm, das im Speicher ausgefÂhrt wird, ist ein normales
GEMDOS-Programm. Es sollte daher mit einem pterm- oder pterm0-Aufruf
beendet werden, wie z.B.
clr.w -(sp)
trap #1
Programme kâ€nnen sich selbst modifizieren, sind aber bei einer erneuten
AusfÂhrung wieder im Urzustand.
Die Programmspeichergrâ€Ã¡e und die in der Dialogbox eingestellten
Optionen des Assemblers werden beim Abspeichern der Voreinstellungen
mit abgespeichert.
2.9.2 Arten der Bin„rdateien
Es gibt sechs verschiedene Typen von Bin„rdateien, die GenST produzieren
kann. Sie unterscheiden sich „uáerlich an den Extensions.
.PRG Ein GEM-Programm, welches Fenster benutzt
.TOS Ein TOS-Programm, welches keine Fenster benutzt
.TTP Ein TOS-Programm, welches eine Kommandozeile braucht
.ACC ein Desk-Accessory
.BIN nicht ausfÂhrbare, linkbare Datei im GST-Format
.O nicht ausfÂhrbare, linkbare Datei im DRI-Format
Die ersten drei Arten kâ€nnen vom Desktop aus mit einem Doppelklick
ausgefÂhrt werden; sie unterscheiden sich in der Vorbereitung, die
das Betriebssystem macht, bevor das Programm ausgefÂhrt wird. Bei
einer .PRG Datei wird der Bildschirm gelâ€scht und mit dem Muster
des Desktops versehen; auáerdem wird an der Bildschirmoberseite Platz
fÂr eine MenÂleiste gemacht. Bei TOS- und TTP-Programmen wird der
Bildschirm bis auf die Hintergrundfarbe gelâ€scht, ein blinkender Cursor
an den oberen linken Bildschirmrand gesetzt und die Maus ausgeschaltet.
Wenn Sie auf ein TTP-Programm doppelklicken, dann erscheint vor
Programmaufruf eine Dialogbox, in der Sie eine Kommandozeile dem
Programm Âbergeben kâ€nnen.
.ACC-Dateien sind zwar ausfÂhrbar, jedoch nicht vom Benutzer. Sie
werden vom AES w„hrend des Bootvorganges oder w„hrend eines Wechsels
der Bildschirmauflâ€sung geladen und initialisiert.
.BIN- und .O-Dateien kâ€nnen nicht ausgefÂhrt werden; sie mÂssen erst
von einem Linker verarbeitet werden - meist zusammen mit anderen
linkbaren Dateien - um zu einem vollst„ndigen Programm zu werden.
Es gibt auf dem ST zwei Standard-Formate, n„mlich das GST-Format
und das DRI-Format. Die Unterschiede zwischen diesen Formaten werden
sp„ter erl„utert.
Die einzige Ausnahme von diesen Regeln sind Programme, die im AUTO-
Ordner ausgefÂhrt werden. Sie mÂssen die Extension .PRG haben, obwohl
sie TOS-Programme sein mÂssen.
2.1O Verschiedene Ver„nderungen gegenÂber der Version 1
Es gibt drei reservierte Symbole: __LK, __RS und __G2. Ihre Bedeutungen
werden sp„ter erl„utert.
Es gibt drei neue Operatoren, die alle mit der Priorit„t unterhalb
der Addition und der Subtraktion liegen: Gleichheit (=), kleiner
als (<) und grâ€Ã¡er als (>).
Oktale Konstanten kâ€nnen jetzt mit "@" bezeichnet werden.
Wenn Sie die Adressierungsart >>Adreáregister indirekt<< mit Index
benutzen, kâ€nnen Sie den Offset weglassen.
move.l (a3,d2.l),d0
wird als
move.l 0(a3,d2.l),d0
assembliert.
Die Daten- und Adreáregister kâ€nnen auch als R0 bis R15 bezeichnet
werden, um Kompatibilit„t mit anderen Assemblern zu gew„hrleisten.
R0-R7 entsprechen D0-D7, R8-R15 entsprechen A0-A7.
2.1O.1 Lokale Labels
GenST2 unterstÂtzt lokale Labels. Dies sind Labels, die einem
bestimmten Teil des Sources angehâ€ren. Sie beginnen mit einem
Punkt (".") und sind vom vorhergehenden nicht-lokalen Label abh„ngig.
l„nge1 move.l 4(sp),a0
.loop tst.b (a0)+
bne.s .loop
rts
l„nge2 move.l 4(sp),a0
.loop tst.b -(a0)
bne.s .loop
rts
Es gibt zwei Labels namens .loop, von denen das erste zu l„nge1,
das zweite zu l„nge2 gehâ€rt.
Um Verwechslung mit Adressierungsarten zu vermeiden, sind .W und
.L nicht als lokale Labels zul„ssig.
Eine besondere Form eines lokalen Labels ist die Form 1234$, das
aus Dezimalzahlen besteht und mit >>$<< endet.k Dadurch ist
Kompatibilit„t mit anderen Assemblern gegeben.
2.1O.2 Erweiterungen des Befehlssatzes
Der vollst„ndige 68000er-Befehlssatz wird von GenST2 unterstÂtzt.
Es gibt aber stilistische AbkÂrzungen, die GenST2 auch akzeptiert:
Condition Codes
Die alternativen Condition Codes HS und LQ, „quivalent mit CC und
CS, werden bei Bcc, DBcc und Scc unterstÂtzt.
Branch-Befehle
Um einen kurzen Branch explizit anzugeben, benutzen Sie Bcc.B oder
Bcc.S. Einen Branch mit Wort-L„nge geben Sie mit Bcc.W an; Sie kâ€nnen
aber auch den Optimierer die Branch-L„nge w„hlen lassen. Bcc.L wird
aus Kompatibilit„tsgrÂnden zu GenST1 beibehalten, obwohl es genaugenommen
ein 68020-Befehl ist; beim Vorkommnis eines Bcc.L wird eine Warnung
generiert. Ein BRA.S zum darauffolgenden Befehl ist nicht erlaubt
und wird, mit einer Warnung, in einen NOP verwandelt. Ein BSR.S zum
darauffolgenden Befehl ist nicht erlaubt und erzeugt einen Fehler.
BTST
BTST ist einzigartig unter den bit-test-Befehlen, weil es PC-relative
Adressiermodi unterstÂtzt.
CLR
CLR an ist nicht erlaubt, benutzen Sie statt dessen SUB.L An,An; die
Flags werden von diesem Befehl aber nicht beeinfluát.
CMP
Wenn der Source-Operand immediate ist, wird CMPI erzeugt, wenn der
Ziel-Operand ein Adreáregister ist, wird CMPA benutzt. Wenn die
Adressierungsarten beider Operanden post-inkrement benutzen, wird
ein CMPM generiert.
DBcc
DBRA wird fÂr DBF akzeptiert.
ILLEGAL
Das Wort $4AFC wird generiert.
LINK
Wenn der Wert positiv oder ungerade ist, wird eine Warnung ausgegeben.
MOVE from CCR
Dies ist ein Befehl der Prozessoren 68010 und hâ€her. Es wird in ein
>>MOVE from SR<< konvertiert.
MOVEQ
Wenn der Wert im Bereich 128 bis 255 inklusive ist, wird eine Warnung
ausgegeben. Wenn Sie ausdrÂcklich ein .L angeben, wird keine Warnung
erzeugt.
2.1O.3 Assembler-Direktiven
INCBIN Dateiname
Mit dieser Direktive wird eine Datei vollst„ndig in Ihr Programm
miteinbezogen. Dies ist z.B. nÂtzlich fÂr Grafiken, die mit anderen
Programmen erstellt wurden und von Ihrem Programm in bin„rer Form
benutzt werden; es entf„llt eine Konvertierung in DC-Direktiven.
INCBIN startet an einer geraden Grenze und wird mit einem
Nullbyte gebaddet, wenn die Datei eine ungerade L„nge besitzt.
OPT
Es gibt verschiedene neue Optionen, aber auch solche, die sich gegenÂber
der Version 1 ver„ndert haben.
Option A - Auto-PC
Um AusfÂhrzeit zu sparen und die Programmgrâ€Å¾e zu reduzieren,
kann die Option A+ verwendet werden. Sie erlaubt Automatik-PC-
Modus, wo immer er mâ€glich ist. Die Zeile
MOVE.L int_in,do
wšrde zu
MOVE.L int_in(pc),do
assembliert werden. Dadurch wird jeoch kein positionsunabh„ngiger
Code erzeugt. A+ kann z.B. im Programm GEMTEST effektiv
eingestellt werden. Unter Umst„nden wird die Option nicht
beachtet, z.B. beim Lesen des absoluten Speichers, oder wenn der
Ausdruck .L gebraucht wird.
C Grož/klein-Unterscheidung und Signifikanz
Standardm„áig unterscheidet GenST2 zwischen Groá- und Kleinschreibung
von Labels. Labels haben standardm„áig eine Signifikanz von 127 Zeichen,
d.h. daá die ersten 127 Zeichen eines Labels zur Unterscheidung
von anderen Labels bewertet werden. Sie kâ€nnen, wie bei GenST1, C-
angeben, wenn keine GROá/klein-Unterscheidung gemacht werden soll.
Sie kâ€nnen auch die Signifikanz ver„ndern, indem Sie eine Dezimalzahl
zwischen dem C und dem + oder - angeben, z.B. C16+ um eine Signifikanz
von 16 Zeichen mit einer Grož/klein-Unterscheidung einzustellen.
L Linker-Modus
Standardm„áig produziert GenST ausfÂhrbaren Code. Mit L+ wird
GST-linkbarer Code erzeugt, mit L2 wird DRI-linkbarer Code erzeugt.
Mit L- kann ausdrÂcklich ausfÂhrbarer Code erzeugt werden. Eine OPT-L-
Direktive muá in der allerersten Zeile der Quelldatei stehen.
O Optimierung
GenST2 besitzt die F„higkeit, manche Befehle in kÂrzere oder schnellere
zu verwandeln. Standardm„áig wird zwar keine Optimierung vorgenommen,
jedoch kann jede Art von Optimierung wahlweise hinzugeschaltet werden.
O1+ Optimiert RÂckw„rts-Branches wenn mâ€glich, kann mit
O1- wieder abgeschaltet werden
O2+ Optimiert Adreá-Register indirekt mit Offset in
Adreáregister. Wenn der Offset Null ist, kann mit O2- abgeschaltet
werden.
move.l Wert(a0),d3 wird zu
move.l (a0),d3 wenn Wert gleich Null
O+ schaltet alle Optimierungen an.
O- schaltet alle Optimierungen ab.
OW- schaltet die mit den Optimierungen verbundenen Warnungen
aus. Kann mit OW+ wieder eingeschaltet werden.
P Positionsunabh„ngigkeit
Wenn diese Option mit P+ zugeschaltet wird, wird der erzeugte Code
auf Positionsunabh„ngigkeit hin geprÂft. Wenn ein Befehl nicht
positionsunabh„ngig ist, wird ein Fehler erzeugt. Mit P- kann die
Option wieder ausgeschaltet werden; die Option ist dann im
Standardzustand.
T Typen-Å¡berprÂfung
GenST2 kann Programmierfehler entdecken, indem es AusdrÂcke dahingehend
prÂft, ob sie absolut oder relativ sind. Da fÂr manche Anwendungen
und Programmierstile eine solche Meldung hinderlich sein kann, ist
sie mit T- aus-, und mit T+ wieder einschaltbar.
main bsr init
lea main(a6),a0
move.l (main).w,a0
Diese Zeilen wÂrden normalerweise einen Fehler erzeugen, da
>>main<< ein relativer Ausdruck ist und GenST in beiden F„llen einen
absoluten Ausdruck erwartet. Falls aber der Code auf einer anderen
68000er-Maschine laufen soll, kann dies zul„ssig sein: also mÂáte
T- angegeben werden.
U Lokale Labels mit "_"
Mir U+ kâ€nnen Sie angeben, daá lokale Labels mit "_" anstatt mit
einem Punkt beginnen. Diese Option exisiert, um Kompatibilit„t mit
Compilern der Firma Prospero zu gew„hrleisten.
X Erweiterter Debug
Dies ist eine erweiterte Version der Option D. Hiermit werden Symbole
mit bis zu 22 Zeichen L„nge anstatt maximal 8 Zeichen wie bei D
ausgegeben.
Zusammenfassung der Optionen:
Alle Optionen GenST2s werden hier zusammengefaát. Die Standardeinstellungen
werden in Klammern angegeben.
C Grož/Klein-Unterscheidung und Signifikanz (C127+)
D Debug-Information (D-)
L- ausfÂhrbarer Code (Standard)
L+ GST-linkbarer Code
L2 DRI-linkbarer Code
M Makro-Expansion (M-)
O Optimierungen (O-)
P auf Positionsunabh„ngigkeit prÂfen (P-)
S Symboltabelle ins Listing (S-)
T Typen-Å¡berprÂfung (T+)
W Warnungen (W+)
U Lokale Labels mit "_" (U-)
X Erweiterter Debug (X-)
<Label>DCB.B Anzahl,Wert
<Label> DCB.W Anzahl,Wert
<Label> DCB.L Anzahl,Wert
Diese Direktive erlaubt es, Datenblâ€cke bestimmter Grâ€Ã¡e mit konstantem
Wert zu erzeugen. "Zahl" gibt die Grâ€Ã¡e des Blocks an, "Wert" den sich
wiederholenden Wert.
OUTPUT Dateiname
Mit dieser Direktive l„át sich der Name der Ausgabe-Datei bestimmen.
Wenn der angegebene Dateiname mit einem Punkt anf„ngt, wird nur die
Extension der erzeugten Datei beeinfluát. Der Name wird sonst nach
den oben beschriebenen Regeln gebildet.
__G2 (reserviertes Symbol)
Dieses Symbol kann mit der IFD-Bedingung verwendet werden, um
festzustellen, ob mit GenST2 assembliert wird. Der Wert dieses Symbols
ist die Version des Assemblers und immer absolut.
<Label> REPT Ausdruck
ENDR
Oft ist es nÂtzlich, einen oder mehrere Befehle zu wiederholen.
Mit REPT ist dies durchfÂhrbar. Die zu wiederholenden Befehle werden
zwischen REPT und ENDR eingegeben. Die Anzahl der Wiederholungen
wird vom angegebenen Ausdruck bestimmt. Wenn der Ausdruck Null oder
negativ ist, wird kein Code generiert. REPTs kâ€nnen nicht verschachtelt
werden.
REPT 512/4 einen Sektor kopieren
move.l (a0)+,(a1)+
ENDR
Dies ist ein Beispiel, um die Wirksamkeit des REPT zu zeigen: so muá
im Quelltext nicht 128mal die move.l Zeile stehen.
Vorsicht: Man sollte keine Labels innerhalb eines REPTs definieren,
da es sonst zu mehrfach definierten Labels und den dazugehâ€rigen
Fehlermeldungen kommt.
LIST
Zus„tzlich zur LIST-Direktive gibt es jetzt LIST+ und LIST-. Ein
Z„hler wird bei jedem LIST+ um eins hâ€her gesetzt und bei jedem
LIST- um eins erniedrigt. Wenn der Z„hler Null oder positiv ist,
wird ein Listing ausgegeben; wenn der Z„hler negativ ist, wird kein
Listing erzeugt. Der normale Z„hlerwert ist -1 (kein Listing), auáer
dann, wenn beim Assemblerstart ein Listing angefordert wird, wodurch
der Z„hler auf Null gesetzt wird. So haben Sie eine flexiblere Kontrolle
Âber Listings, besonders bei Include-Dateien. LIST alleine setzt
den Z„hler auf 0, NOLIST auf -1.
SUBTTL-String
Ein "Unter"-Titel wird hiermit angegeben, er kann in Hochkommas
("'") eingegrenzt sein. Die erste Direktive setzt den Unter-Titel
der ersten Seite usw.
FORMAT Parameter<,Parameter,...>
Hiermit kâ€nnen Sie das Format einer Zeile im Listing bestimmen. Jeder
Parameter entspricht einem Feld im Listing und besteht aus einer
Zahl von 0 bis 2, gefolgt von einem "+" (um das Feld darzustellen)
oder "-":
0 Zeilennummer, dezimal
1 SECTION-Name bzw. -Zahl und PC
2 Hex-Daten in Worten, bis zu 10 Wâ€rter (auáer, wenn
der Drucker breiter als 80 Zeichen ist)
Label = Ausdruck
Das Gleichheitszeichen kann anstatt EQU benutzt werden.
Label REG Registerliste
Mit der REG-Direktive kâ€nnen Sie einem Symbol eine Registerliste
zur Verwendung mit MOVEM zuordnen. Somit wird die Gefahr verringert,
am Anfang und am Ende einer Routine unterschiedliche Registerlisten
zu haben. Mit REG definierte Symbole kâ€nnen ausschlieálich mit MOVEM
benutzt werden.
RSSET Ausdruck
Mit RSSET kâ€nnen Sie dem RS-Z„hler einen bestimmten Wert zuordnen.
__RS (reserviertes Symbol)
Dieses reservierte Symbol enth„lt den gegenw„rtigen Wert des RS-Z„hlers.
Bedingte Blâ€cke
Bedingte Blâ€cke kâ€nnen mit GenST2 bis zu 65535 Stufen tief verschachtelt
werden.
IIF Ausdruck Instruktion
Dies ist eine Kurzform von IFNE und betrifft nur eine Zeile; ein
ENDC sollte nicht mit IIF benutzt werden.
2.11 Makros
Makros kâ€nnen jetzt bis zu 36 Parameter haben. Die Parameter beginnen
wie bei GenST1 mit einem Backslash ("\"). Die zul„ssigen Parameter-
Bezeichner sind die Zahlen 1-9 fÂr die ersten neun Parameter, und a-z
oder A-Z fÂr die restlichen 26 Parameter. \0 beh„lt die gleiche
Bedeutung wie bei GenST1.
Es gibt eine besondere Form einer Makro-Expansion. Sie kâ€nnen ein
Symbol in eine dezimale oder hexadezimale Zahlensequenz verwandeln.
Die Syntax ist \<Symbol> oder \$<Symbol>; das Symbol muá definiert
und absolut sein.
Ein Makro-Aufruf kann Âber mehrere Zeilen gemacht werden; dies ist
nÂtzlich bei Makros mit vielen Parametern. Um als Makro erkannt zu
werden, muá eine Zeile mit einem Komma beendet werden, das erste
Zeichen der n„chsten Zeile muá ein "&" sein, gefolgt von Leerschritt(en)
oder Tab(s) und den weiteren Parametern.
Die Verschachtelung von Macro-Aufrufen ist nur durch den Arbeitsspeicher
begrenzt; Rekursion ist also mâ€glich.
Die Namen der Makros werden in einer separaten Symboltabelle gespeichert
und kâ€nnen daher nicht mit anderen Symbolen gleichen Namens kollidieren;
auáerdem kann der Name des Makros mit einem Punkt beginnen.
Ein Beispiel mit numerischer Substitution:
vname MACRO
dc.b \1,\<version>,0
ENDM
.
.
version equ 42
vname <'Buchstabensuchprogramm v'>
wird expandiert zu:
dc.b 'Buchstabensuchprogramm' v','42',0
Beispiel eines komplexen Makro-Aufrufs:
Nehmen wir an, daá ein Programm eine komplizierte Tabellenstruktur
hat, die eine variable Anzahl von Feldern beinhaltet. Ein Makro kann
z.B. auch dafÂr geschrieben werden, daá angegebene Parameter verwendet
werden:
Tabellen_Eintrag MACRO
dc.b .end\@-* L„ngenbyte
dc.b \1 immer
IFNC '\2',''
dc.w \2,\3 2.
und 3. ENDC
dc.l \4,\5,\6,\7
IFNC '\8',''
dc.b '\8' text
ENDC
dc.b \9
.end\@ dc.b 0
ENDM
* Beispiel eines Aufrufs
Tabellen_Eintrag $42,,,t1,t2,t3,t4,
& <Namen eingeben:>,%0110
Dies ist ein gutes Beispiel um zu zeigen, daá Makros das Programmieren
enorm erleichtern kâ€nnen. In diesem Fall wird mit einer Datenstruktur
gearbeitet, die aus einem L„ngenbyte (im Makro mit Hilfe von \@
errechnet), zwei optionalen Wâ€rtern, vier Langwâ€rtern, einem optionalen
String, einem Byte, und einem Nullbyte besteht. Der Code, der aus
diesen Beispiel resultiert, sieht so aus:
dc.b .end_001
dc.b $42
dc.l t1,t2,t3,t4
dc.b 'Namen eingeben:'
dc.b %0110
.end_001 dc.b 0
2.12 Ausgabedatei-Formate
GenST2 ist sehr flexibel, was Dateiformate angeht. Die verschiedenen
Formate, die er erzeugen kann, werden hier erkl„rt und bewertet.
Manche Direktiven haben auch je nach Ausgabeformat andere Wirkungen.
2.12.1 AusfÂhrbare Dateien
Diese Dateien sind sofort vom Desktop aus ausfÂhrbar. Eine solche
Datei kann Symbole und Relozier-Information enthalten. Die
normalen Extensionen fÂr diese Art von Datei sind .PRG, .TOS, .TTP und
.ACC.
Vorteile: Echte BSS-SECTION, Entwicklungszeit wird reduziert (da
nicht gelinkt werden muá).
Nachteile: Wenn mehr als ein Programmierer am Projekt arbeitet, ist
es unpraktisch.
2.12.2 GST-linkbare Dateien
Wenn Sie an einem grâ€Ã¡eren Projekt arbeiten oder mehrere Programmierer
am Projekt beteiligt sind, oder wenn Sie Maschinenspracheroutinen fÂr
eine Hochsprache schreiben, werden Sie wahrscheinlich linkbare Dateien
erzeugen wollen. Das GST-Format wird von den meisten in England
oder auch anderswo produzierten Hochsprachensystemen unterstÂtzt.
Zu diesen Sprachen gehâ€ren HiSoft Basic, Lattice C, Prospero Pascal
und Prospero Fortran. Dateien im GST-Format haben meist die Extension
.BIN.
Vorteile: Sehr flexible Mâ€glichkeiten: importierte Labels kâ€nnen
fast Âberall verwendet werden, wie z.B. auch in AusdrÂcken. Libraries
kâ€nnen vom Assembler aus erstellt, und durch die verwendete
Import-Methode kâ€nnen Typenkonflikte erkannt werden.
Nachteile: Aufgrund des Library-Formats kann das Linken l„nger dauern,
richtige GEMDOS-SECTIONen werden standardm„áig nicht unterstÂtzt
(obwohl LinkST eine BSS-SECTION erzeugen kann).
2.12.3 DRI-linkbare Dateien
Dies ist das Original-Linkerformat des ST und wurde ursprÂnglich
von Digital Research fÂr CP/M-68K entwickelt. Es wird, meist durch
Konvertierungsprogramme, vom Groáteil der in den USA entwickelten
Hochsprachensystemen unterstÂtzt. DRI-linkbare Dateien haben meist
die Extension .O.
Vorteile: Selektives Hinzulinken mit Libraries geht
schnell, GEMDOS-SECTIONen werden voll unterstÂtzt.
Nachteile: Sehr groáe Einschr„nkungen bei importierten Labels, linkbare
Dateien sind doppelt so groá wie ausfÂhrbare Dateien, und Symbole
kâ€nnen maximal nur 8 Zeichen lang sein.
2.12.4 Das richtige Format
Wenn Sie mit einer Hochsprache zusammenarbeiten, haben Sie meistens
keine Wahl: Sie mÂssen das vom Compiler unterstÂtzte Format verwenden.
Wenn Sie ausschlieálich in Assembler schreiben, werden Sie wohl das
ausfÂhrbare Format benutzen: die Assemblierzeit ist gering, Linken
f„llt weg, und Sie kâ€nnen direkt in den Speicher assemblieren, um
die Turn-around-Zeiten so klein wie mâ€glich zu halten.
Wenn Sie ein grâ€Ã¡eres Programm schreiben, womâ€glich im Team, ist
linkbarer Code meist am sinnvollsten. Das GST- Format ist dem DRI-Format
weitaus Âberlegen und deshalb auch empfehlenswert.
2.13 Ausgabedatei-Direktiven
Hier werden die Direktiven erkl„rt, deren Wirkungen vom Ausgabeformat
abh„ngig sind. Die Formate kâ€nnen auf verschiedene Weise gew„hlt werden:
Âber die Kommandozeile bei GENST2.TTP, in der Assemblieren-Dialogbox
bei GENST2.PRG, oder mit der OPT-L-Direktive am Anfang Ihres Programms.
2.13.1 MODULE und SECTION
MODULE Modul-Name
Mit diesem Befehl wird der Anfang eines neuen Moduls festgelegt.
Der Name muá in AnfÂhrungszeichen stehen, wenn er Leerschritte enth„lt.
Diese Direktive ist nicht unumg„nglich, ein Modul namens ANON_MODULE
wird automatisch erzeugt.
AusfÂhrbar
Diese Direktive wird ignoriert.
DRI
Diese Direktive wird ignoriert.
GST
Mit dieser Direktive kâ€nnen Sie Maschinensprache-Libraries erstellen.
Jedes MODULE ist ein eigenst„ndiges Segment mit eigenen Imports und
Exports. Relative Labels gehâ€ren jeweils zum eigenen Modul, Sie kâ€nnen
also zwei Labels mit demselben Namen in zwei Modulen benutzen, ohne
daá sie kollidieren. Absolute Labels sind fÂr alle MODULE global, was
fÂr Konstanten sehr nÂtzlich ist.
SECTION Section-Name
Diese Direktive verursacht einen Wechsel zu der genannten Section.
Ein Programm kann aus mehrereren Sectionen bestehen, die im endgÂltigen
Programm mit gleichnamigen Sectionen zusammengefÂgt werden. Wenn
nicht anders angegeben, wird Ihr Programm im TEXT SECTION assembliert.
Sie kâ€nnen mit diesem Befehl jederzeit in eine andere Section wechseln.
AusfÂhrbar
Erlaubte Namen fÂr Sectionen sind TEXT (fÂr den Bereich,
der das Programm enth„lt), DATA (fÂr initialisierte Daten) und BSS,
ein besonderer Speicherbereich, der vom GEMDOS fÂr Ihr Programm
reserviert wird. Das BSS enth„lt Nullen beim Programmstart und belegt
keinen Platz auf der Diskette. Innerhalb des BSS darf nur die DS-
Direktive verwendet werden. Wenn Sie den BSS-Bereich fÂr globale
Variablen benutzen, kâ€nnen Sie Platz auf der Diskette sparen.
DRI
Die obengenannten Regeln fÂr ausfÂhrbare Programme gelten hier auch.
GST
Es gibt keine Regeln fÂr Namen der Sectionen. Sectionen mit gleichem
Namen in verschiedenen Modulen werden beim Linken zusammengefÂgt.
Die Anordnung der Sectionen im endgÂltigen Programm h„ngt von der
Reihenfolge ab, in der sie von Linker begegnet werden (LinkST hat
die SECTION-Direktive, mit der die Reihenfolge zur Linkzeit festgelegt
werden kann).
Imports und Exports
Bei beiden linkbaren Formaten ist es wichtig, Symbole importieren
und exportieren zu kâ€nnen, was sowohl fÂr relative Symbole wie
Programmlabels als auch fÂr absolute Symbole wie Konstanten gilt.
Das GST-Format trifft zwischen den beiden Arten eine Unterscheidung,
das DRI-Format dagegen nicht. Das GST-Format erlaubt dem Assembler,
die Typen zu ÂberprÂfen, um Programmierfehler zu finden, die sonst
vielleicht Âbersehen worden w„ren.
XDEF Export<,Export>...
Hiermit werden Labels angegeben, die fÂr andere Module zug„nglich
gemacht werden sollen. Wenn ein exportierter Label nicht existiert,
erscheint eine Fehlermeldung. Es ist nicht mâ€glich, lokale Labels
zu exportieren.
AusfÂhrbar
Diese Direktive wird ignoriert.
DRI
Alle Symbole werden beim Exportieren auf 8 Zeichen L„nge gekÂrzt;
es ist ratsam, OPT C8 zu verwenden.
XREF Import<,Import>...
XREF.L Import<,Import>...
Hiermit werden Labels definiert, die aus anderen Modulen importiert
werden kâ€nnen; sie mÂssen dort natÂrlich exportiert worden sein,
da sonst eine Fehlermeldung erscheint. Das normale XREF sollte dazu
verwendet werden, relative Labels zu importieren, XREF.L wird benutzt,
um absolute Labels zu importieren. Sie kâ€nnen ein und dasselbe Label
mehrmals importieren.
AusfÂhrbar
Diese Direktive wird ignoriert.
DRI
Das DRI-Format unterscheidet zwar nicht zwischen absoluten und
relativen Imports, man sollte sie aber trotzdem angeben,
damit der Assembler die TypenÂberprÂfung vornehmen kann. Wenn Ihre
Imports keine Typen haben, sollten Sie OPT T- angeben. DRI-Labels
haben eine Signifikanz von nur 8 Zeichen.
GST
Importieren Sie nur Labels mit dem richtigen Typ; es kann sonst sein,
daá die Relozier-Information des endgÂltigen Programms nicht stimmt.
Imports in AusdrÂcken verwenden
AusfÂhrbar
Es gibt keine Imports.
DRI
Imports kâ€nnen innerhalb von AusdrÂcken benutzt
werden, allerdings nur ein Import pro Ausdruck. Das Ergebnis eines
solchen Ausdrucks muá immer Zahl + bzw. - Import sein. Imports kâ€nnen
auch mit beliebig komplexen AusdrÂcken kombiniert werden,
vorausgesetzt, daá der komplexe Ausdruck vor dem Import angefÂhrt
wird:
move.l 3+(1<<Z„hler+5)+Import
GST
Imports kâ€nnen innerhalb von AusdrÂcken benutzt werden, maximal zehn
pro Ausdruck. Sie dÂrfen miteinander nur addiert oder subtrahiert
werden, kâ€nnen aber mit beliebig komplexen AusdrÂcken kombiniert
werden, vorausgesetzt, daá der komplexe Ausdruck vor dem Import
angefÂhrt wird:
move.l 3+(1<<Z„hler+5)+Import1-Import2
Wo ein Ausdruck mit einem Import benutzt werden darf, h„ngt vom
Dateiformat ab. Die folgende Tabelle zeigt die erlaubten Kombinationen:
Ausdruck GST DRI Beispiel
PC-Byte J N move.w import(pc,d3.w)
bsr.s import
PC-Wort J J* move.w import(pc),a0
bsr import
Byte J N move.b #import,d0
Wort J J move.w import(a3),d0
Langwort J J move.l import,d0
So lange das Symbol nicht in einer anderen Section des Programmes
steht, ist dies unzul„ssig.
DRI & GST
Die Benutzung eines Symbols aus einer anderen Section
muá als Import gehandhabt werden und unterliegt den obengenannten
Regeln.
COMMENT Bemerkung
AusfÂhrbar
Diese Direktive wird ignoriert.
DRI
Diese Direktive wird ignoriert.
GST
Diese Direktive Âbernimmt die angegebene Bemerkung in die .BIN-Datei;
zur Linkzeit wird die Bemerkung angezeigt.
ORG Ausdruck
Diese Direktive l„át den Assembler positionsabh„ngigen Code erzeugen;
der PC wird auf den angegebenen Ausdruck gesetzt. Normalerweise brauchen
GEMDOS-Programme kein ORG, auch wenn sie nicht positionsunabh„ngig
sind; der GEMDOS-Programmlader erledigt die Relozierung des Programms.
Die ORG-Direktive erlaubt die Erzeugung von ROM-Code oder Code, der
fÂr andere 68000er Rechner gedacht ist. Es darf mehr als ein ORG
im Programm stehen, es wird aber kein "Padding" vorgenommen.
AusfÂhrbar
Diese Direktive sollte mit hâ€chster Vorsicht gehandhabt
werden, da das erzeugte Programm wahrscheinlich nicht auf dem ST
mit einem Doppelklick problemlos ausfÂhrbar ist. Die erzeugte Datei
hat am Anfang den GEMDOS-Header, aber am Ende keine Relozier-Information.
DRI
Diese Direktive ist nicht erlaubt, die Generierung absoluten Codes
ist Aufgabe des Linkers.
GST
Ein ORG wird dem Linker Âbergeben, der die Datei mit Nullen
"paddet".
Vorsicht: Es ist hâ€chst unwahrscheinlich, daá diese Direktive sinnvoll
ist, wenn in den Speicher assembliert wird.
OFFSET <Ausdruck>
Hiermit wird die Code-Generierung in eine besondere, Assembler-interne
Section umgeschaltet. Der Ausdruck, der nicht angegeben werden muá,
setzt den PC dieser Section. Es werden keine Daten auf Diskette
geschrieben, innerhalb dieser Section ist nur die DS-Direktive
erlaubt. Labels, die innerhalb dieser Section definiert werden,
sind absolut. Um einige Systemvariablen des ST zu definieren,
s„he der Quelltext so aus:
OFFSET $400
etv_timer ds.l 1 wird $400
sein
etv_critic ds.l 1 404
etv_term ds.l 1 408
ext_extra ds.l 5 40C
memvalid ds.l 1 420
__LK (reserviertes Symbol)
Dies ist ein reserviertes Symbol; es kann dazu benutzt werden zu
erkennen, welche Code-Art erzeugt wird. Der Wert dieses Symbols ist
immer absolut und kann einen der folgenden Werte haben:
0 ausfÂhrbar
1 GST linkbar
2 DRI linkbar
DRI Debug
Normalerweise werden nur explizit geXDEFte Labels der Symboltabelle
der linkbaren Datei beigefÂgt. Das Format erlaubt aber sog. lokale
Labels, nicht zu verwechseln mit den lokalen Labels von GenST2, welche
keine wahren Exports sind und deshalb nicht von anderen Modulen aus
benutzt werden kâ€nnen. Diese Symbole werden aber der Symboltabelle
des fertigen Programmes hinzugefÂgt. OPT D+ gibt alle nicht
exportierten Labels als DRI-lokale an.
GST-Libraries schreiben
Wenn Sie eine GST-Library mit Hilfe mehrerer Module in eine Datei
schreiben, mÂssen Sie mit RÂckw„rts-Verweisen an Imports vorsichtig
sein. Innerhalb einer GST-Library sollten >>high-level<<-Routinen
zuerst kommen, >>low-level<<-Routinen zuletzt. Das folgende Beispiel
wÂrde nicht fehlerfrei linken:
MODULE low_level
XDEF low_output
low_output
...
MODULE high_level
XDEF high_output
XREF low_output
high_output
...
Der Grund dafÂr liegt darin, daá das zweite Modul eine Routine aus
dem ersten benutzt; dies ist nicht zul„ssig. Die fehlerfreie Version
sieht so aus:
MODULE high_level
XDEF high_output
XREF low_output
high_output
...
MODULE low_level
XDEF low_output
low_output
...
Beispiele fÂr verschiedene Formate:
Hier folgen Beispiele, die die Unterschiede zwischen den einzelnen
Formaten verdeutlichen.
AusfÂhrbar
SECTION TEXT
start lea string(pc),a0
move.l a0,save_str
bsr printstring
bra quit
SECTION DATA
string dc.b 'Ihren Namen bitte: ',0
SECTION TEXT
printstring
move.l a0,-(sp)
move.w #9,-(sp)
trap #1
addq.l #6,sp
rts
SECTION BSS
save_str ds.l 1
END
DRI linkbar
XREF.L quit
SECTION TEXT
start move.l #string,a0
move.l a0,save_str
bsr printstring
bra quit
SECTION DATA
string dc.b 'Ihren Namen bitte: ',0
SECTION TEXT
printstring
move.l a0,-(sp)
move.w #9,-(sp)
trap #1
addq.l #6,sp
rts
SECTION BSS
save_str ds.l 1
END
Beachten Sie, daá der erste Befehl nicht PC-relativ ist, da keine
PC-relativen Verweise zwischen Sectionen erlaubt sind.
GST linkbar
MODULE TESTPROG
COMMENT nicht vollst„ndig
XREF.L quit
SECTION TEXT
start lea string(pc),a0
move.l a0,save_str
bsr printstring
bra quit
SECTION DATA
string dc.b 'Ihren Namen bitte: ',0
SECTION TEXT
printstring
move.l a0,-(sp)
move.w #9,-(sp)
trap #1
addq.l #6,sp
rts
SECTION BSS
save_str ds.l 1
END
3 LinkST, der Linker
LinkST in Devpac ST Version 2 hat sich gegenÂber seinem Vorg„nger
nicht so stark ver„ndert wie z.B. GenST oder MonST. Es sind lediglich
einige Optionen dazugekommen, die im folgenden beschrieben werden.
3.1 Optionen mit einem Buchstaben
Es gibt zwei neue Optionen mit einem Buchstaben:
B ein BSS-Segment im Sinne des GEMDOS wird generiert.
Voraussetzung ist, daá es eine SECTION namens ¯BSS®
gibt.
X funktioniert wie die Option D, nur wird anstatt dem
DRI-Symbolformat das HiSoft-erweiterte Format in
der Symboltabelle des erzeugten Programmes generiert.
3.2 Direktiven in Kontroll-Files
Es gibt vier neue Direktiven, die innerhalb eines Kontroll-Files
verwendet werden kâ€nnen.
SECTION <Name>
Mit dieser Direktive wird die Reihenfolge der Sectionen im gelinkten
Programm festgelegt. Wie in den zwei mitgelieferten Kontroll-Files
sollte die Anordnung so aussehen:
section text
section data
BSS <Name>
Mit dieser Direktive benennen Sie die SECTION, die als BSS- Segment
beim Linken verwendet werden soll. FÂr Lattice-C Benutzer wÂrde die
Zeile nach den vorangegangenen SECTION-Direktiven
bss udata
heiáen. BSS sollte nie mit DATA zusammen benutzt werden. Die
Section, die angegeben wird, sollte niemals Daten ungleich Null
enthalten, da sonst die Fehlermeldung ¯non-zero data in BSS section®
erscheint.
XDEBUG
hat die gleiche Wirkung wie die Option X. Es wird eine Symboltabelle
im HiSoft-erweiterten Format angelegt.
TRUNCATE
Es werden alle Symbole auf 8 Zeichen L„nge gekÂrzt. Dies ist dann
notwendig, wenn Maschinenspracheroutinen mit langen Labels mit
Hochsprachenprogrammen mit kurzen Labels gelinkt werden.
3.3 Lattice-C-Benutzer
Es wird eine neue C.LNK-Datei fÂr Lattice C 3.04 mitgeliefert. Wenn
Sie dieses Kontroll-File verwenden, reduzieren sich Ihre Link-Zeiten
und die Grâ€Ã¡e des erzeugten Programms.
Wenn Sie die -n-Option des Compilers benutzen, kâ€nnen Sie das
HiSoft-erweiterte-Debug-Format beim Linken angeben; dies ist nÂtzlich,
da beim Debuggen mit MonST2 l„ngere, und deshalb Âbersichtlichere
Symbolnamen benutzt werden kâ€nnen.
4 MonST Der symbolische Debugger
4.1 Einleitung
Programme, die in Maschinensprache geschrieben sind, sind wesentlich
anf„lliger fÂr kleine Fehler als solche, die in einer Hochsprache
geschrieben sind. Es ist auch durchaus mâ€glich, mit kleinen
Fehlern den ganzen Rechner ¯abstÂrzen® zu lassen. Es gibt die
verschiedensten Arten von Fehler: triviale Fehler wie ein
vergessenes Nullbyte am Ende einer Zeichenkette,
Durchschnittsfehler wie ein falsches Ergebnis einer Rechenroutine
bis him zum schweren Fehler, der mit einem spektakul„ren Absturz
zutage kommt.
Um solche Fehler zu finden und zu korrigieren, gehâ€rt zum Paket
Devpac ST das Programm MonST. MonST ist ein sog. symbolischer
Debugger und Disassembler. Er ermâ€glicht es dem Programmierer, sich
Programme und Speicher anzusehen, Programme Schritt fÂr Schritt
auszufÂhren, und die meisten Programmierfehler (wie Bus- oder
Adreáfehler) ohne Schaden abzufangen. Da MonST symbolisch
arbeitet, mÂssen Sie sich nicht mit langen Hex-Ziffern
herumschlagen, sondern kâ€nnen sich in Ihrem Programm an Ihren
eigenen Labels orientieren.
Obwohl MonST ein sog. ¯low-level® Debugger ist, d.h. er arbeitet
auf Maschinensprachenebene, ist es auch ohne weiteres mâ€glich,
Programme, die in einer Hochsprache geschrieben worden sind, zu
¯debuggen®; die einzige Voraussetzung ist, daá der Hochsprachen-
compiler 68000er Maschinencode erzeugt. Es gibt viele Compiler,
die die Mâ€glichkeit bieten, Symbole im fertigen Programm zu
hinterlassen. So kâ€nnen Sie genau erkennen, in welcher Prozedur
Sie sich befinden, w„hrend Sie den erzeugten Code des Compilers
auf dem Bildschirm vor sich haben. Wir haben MonST selber zum
Debuggen von LinkST, welches in C geschrieben ist, verwendet.
MonST und GenST sind beide vollst„ndig in Maschinensprache
geschrieben.
MonST hat seinen eigenen Bildschirmspeicher. Sie bekommen deshalb
keine Probleme, wenn Sie ein Programm mit Grafiken, wie z.B. ein
Spiel oder ein GEM-Programm, debuggen; das Programm hat seinen
eigenen Bildschirmspeicher, MonST auch. MonST hat auch einen
eigenen Bildschirmtreiber und ist deshalb nicht auf das
Betriebssystem angewiesen, um seine Bildschirmausgabe zu machen.
Sie kâ€nnen so problemlos die Bildschirmausgaberoutinen des AES
oder des BIOS ®single-steppen¯, ohne daá der Debugger darunter
leidet.
Auf der Devpac ST-Originaldiskette befinden sich drei Versionen von
MonST: alle sind fast gleich zu bedienen. Auf die Unterschiede wird
etwas sp„ter eingegangen.
4.2 Die Exceptions des 68OOO
MonST verwendet die Exceptions des 68000 um amok-gelaufene Programme
zu stoppen und um ®Single-Steppen¯ zu ermâ€glichen. Es ist deshalb
ganz nÂtzlich zu wissen, was normalerweise geschieht, wenn auf dem
ST ein Exception passiert.
Es gibt verschiedene Sorten von Exceptions: die einen sind absichtliche,
die anderen eindeutige Fehler. Wenn ein Exception passiert, werden
auf dem SSP (Supervisor-Stack) bestimmte Daten hinterlassen, der Prozessor
geht dann in den Supervisor-Modus Âber, und springt zum sog. ®exception
handler¯. Dies sind Maschinensprachebefehle, die bei einem Exception
(und sonst nie) ausgefÂhrt werden. Wenn MonST geladen ist, f„ngt
er manche Exceptions ab, damit kein Schaden passiert. Die verschiedenen
Arten von Exceptions, was sie tun, und MonSTs Reaktion darauf sind
in der folgenden Tabelle zu sehen:
Exception Nr. Exception Auswirkung Auswirkung mit MonST
2 Busfehler Bomben abgefangen
3 Adreáfehler Bomben abgefangen
4 Illegaler Befehl Bomben abgefangen
5 Teilung durch Null Bomben abgefangen
6 CHK Bomben abgefangen
7 TRAPV Bomben abgefangen
8 Privilegverletzung Bomben abgefangen
9 Trace Bomben wird fÂr das Single-
Steppen verwendet
10 line 1010 emulator line A Aufruf line A Aufruf Aufruf
11 line 1111 emulator TOS intern TOS intern
32 trap #0 Bomben abgefangen
33 trap #1 GEMDOS Aufruf GEMDOS Aufruf
34 trap #2 AES/VDI Aufruf AES/VDI Aufruf
35-44 trap #3-trap #12 Bomben abgefangen
45 trap #13 XBIOS Aufruf XBIOS Aufruf
46 trap #14 BIOS Aufruf BIOS Aufruf
47 trap #15 Bomben abgefangen
Die genauen Ursachen dieser Exceptions werden am Ende dieses Abschnitts
genauer erkl„rt, um aber zusammenzufassen:
Die Exceptions 2 bis 8 sind Programmierfehler und werden von MonST
abgefangen.
Exception 9 kann unter Umst„nden durch einen Programmierfehler hervorgerufen
werden, wird aber normalerweise von MonST fÂr das ®Single-Steppen¯
benutzt.
Die Exceptions 10, 11, 33, 34, 45 und 46 werden vom Betriebssystem
gebraucht und werden von MonST nicht bearbeitet.
Die restlichen Exceptions werden alle von MonST abgefangen; sie kâ€nnen
aber durchaus von einem Programm neu definiert und verwendet werden.
Der Eintrag ®Bomben¯ in der obigen Tabelle bedeutet, daá das Betriebssystem
des ST versucht, mit dem Fehler fertig zu werden und einige Bomben
(bzw. kleine Atompilze) auf dem Bildschirm malt (immer so viel, wie
die Exception-Nummer, z.B. zwei Bomben bei einem Busfehler), und
dann versucht, das Programm abzubrechen und ins Desktop zurÂckzukehren.
Wenn durch den Fehler wichtige Systemvariablen zerstâ€rt wurden, kann
es ohne weiteres passieren, daá das System abstÂrzt. Es kann auch
sein, daá das System von einer Exception direkt in eine andere ger„t
und dadurch der ganze Bildschirm sich mit Bomben fÂllt.
4.3 Speicherbelegung
Die interaktiven Versionen von MonST sind zum gleichen Zeitpunkt
im Speicher wie das zu debuggende Programm, d.h. MonST wird geladen,
es wird nach einem Programmnamen gefragt, und dann das angegebene
Programm, gegebenenfalls mit Symbolen, geladen.
MonST ist zum Zeitpunkt der Entstehung dieses Schreibens ca.
23Kbyte groá, es benâ€tigt noch zus„tzlich etwa 32Kbyte an
Arbeitsspeicher. Dies mag etwas viel erscheinen, MonST braucht
aber diesen Speicher, um immer eine Bildschirmseite fÂr sich zu
behalten.
Die drei mitgelieferten MonST-Versionen heiáen:
MONST2.PRG interaktive GEM Version
MONST2.TOS interaktive TOS Version
AMONST2.PRG auto-residente Version
Zuerst werden die ersten beiden Versionen beschrieben, die auto-residente
Version wird danach erl„utert, ist aber den ersten zwei Versionen
sehr „hnlich.
4.4 MonST starten
4.4.1 Vom Desktop aus
Die beiden interaktiven Versionen von MonST sind bis auf die Dateinamen
identisch. Die .PRG-Version sollte mit GEM-Programmen verwendet werden,
die .TOS-Version sollte mit TOS-Programmen benutzt werden. GEM- und
TOS-Programme werden vom Betriebssystem anders gestartet. Weil MonST
das zu debuggende Programm startet, muá es selbst auch richtig gestartet
werden.
Ein GEM-Programm hat einen Hintergrund, Platz fÂr eine MenÂleiste
und braucht einen Mauszeiger, TOS-Programme brauchen aber einen
blinkenden Cursor, keine Maus und einen leeren Bildschirm. Sie
kâ€nnen ein TOS-Programm mit der GEM-Version von MonST debuggen,
der Bildschirminhalt kann dann aber ziemlich chaotisch aussehen.
Es ist aber keine gute Idee, ein GEM-Programm mit der TOS-Version
MonSTs zu debuggen, es kâ€nnen groáe Probleme auftauchen und unter
Umst„nden kann das System abstÂrzen; dies sollte auf jeden Fall
vermieden werden.
4.4.2 Vom Editor aus
Wenn GenST gestartet wird, sucht es automatisch nach MONST2.PRG und
l„dt MonST (wenn diese Option nicht anders gew„hlt wurde), falls er
vorhanden ist. Der Debugger ist sofort vom Editor aus verfÂgbar.
Wenn man Alt-M drÂckt oder im Programm-Men >>MonST<< w„hlt, wird MonST,
wie oben beschrieben, aufgerufen, nur wesentlich schneller, da es
sich schon im Speicher befindet.
Man kann aber auch Alt-D drÂcken oder >>Debuggen<< vom Programm- MenÂ
w„hlen. MonST wird so auch aufgerufen, hat aber jetzt zus„tzlich
das zuletzt in den Speicher assemblierte Programm bereit, ggf. auch
mit Symbolen.
Der anf„ngliche Bildschirmmodus wird durch den GEM-Eintrag im
Programm-Men gew„hlt. Wenn der Eintrag abgehakt ist, wird die
GEM-Bildschirminitialisation vorgenommen, sonst wird der
Bildschirm fÂr ein TOS-Programm vorbereitet. Die oben erw„hnten Regeln
bezÂglich falscher Bildschirmmodi treffen hier auch zu.
4.5 Symbolisch Debuggen
Ein Hauptmerkmal von MonST ist die F„higkeit, die Originalsymbole
des Programms beim Debuggen zu benutzen. MonST unterstÂtzt zwei
verschiedene Formate von Symbolen: das Standard-DRI-Format, wel-
ches maximal 8 Zeichen lange Symbole unterstÂtzt, und das HiSoft-
erweiterte Format, welches eine Symboll„nge von maximal 22
Zeichen erlaubt. Sowohl GenST als auch LinkST kâ€nnen beide
Formate produzieren; viele andere Hochsprachencompiler
unterstÂtzen auch das DRI-Format. Wir versuchen z.Zt. das HiSoft-
erweiterte-Format als zweiten Standard einzufÂhren; zum Zeitpunkt
des Schreibens dieses Handbuchs unterstÂtzt nur der FTL-Modula-2-
Compiler auch das HiSoft-Format.
4.6 Dialog- und Alertboxen
MonST verwendet viele Dialog- und Alertboxen, die den GEM- Boxen
entsprechen; es sind aber keine. Der Grund dafÂr ist einfach: MonST
muá vom Betriebssystem so unabh„ngig wie mâ€glich sein; nur so ist
es gew„hrleistet, daá MonST auch unter den schwersten Bedingungen
problemlos funktioniert. Auáerdem ist auf die Maus in MonST kein
Zugriff vorhanden, da es richtige GEM-Boxen und Buttons nicht unterstÂtzt.
Eine MonST-Dialogbox erkennt man daran, daá "ESC um abzubrechen" Âber
dem linken oberen Rand steht. In der Box steht der Mitteilungstext
und (normalerweise) eine leere Zeile, in der sich der Cursor befindet.
Man kann zu jedem Zeitpunkt mit Esc die Dialogbox abbrechen. Die
Eingabe erfolgt Âber die Tastatur und die Cursortasten. Die Backspace-
und Del-Tasten kâ€nnen zum Editieren der eingetippten Zeile benutzt
werden, Clr lâ€scht die eingetippte Zeile bis zum Anfang, genauso
wie die Esc-Taste in GEM-Dialogboxen. Die Eingabe wird mit der Return-
Taste beendet. Falls eine Zeile einen Fehler enth„lt, wird Return
so lange ignoriert, bis die Zeile akzeptabel ist. Dialogboxen, in
die mehr als eine Zeile eingegeben wird, lassen keine ZeilensprÂnge
durch die Cursor-oben- und Cursor-unten-Tasten zu.
Eine MonST-Alertbox ist eine Box, die eine Meldung (meistens eine
Fehlermeldung) anzeigt und auf Return oder Esc wartet.
4.7 Die Anzeige am Anfang
Wenn Sie MonST Âber Alt-M vom Editor oder vom Desktop aus aufgerufen
haben, werden Sie zuerst in einer Dialogbox nach einem Programmnamen
gefragt. Wenn Sie ein Programm laden wollen, geben Sie den Programmnamen
ein (die Extension ist automatisch .PRG, wenn nicht anders angegeben)
und drÂcken Sie Return. Danach werden Sie nach einer Kommandozeile
gefragt, die dem Programm Âbergeben werden soll. Wenn das Programm
keine braucht, drÂcken Sie einfach wieder Return, und das Programm
wird geladen. Wenn Sie kein Programm debuggen wollen, z.B. nur den
Speicher des Rechners bearbeiten wollen, dann drÂcken Sie Esc, um
direkt in MonST zu gelangen.
4.8 Die MonST-Anzeige
Das Anzeigenprinzip von MonST ist dem von alten Groárechnern
nachempfunden: damals hatte man immer kleine flackernde L„mpchen
an der Vorderseite des Rechners beobachten kâ€nnen um
festzustellen, welche Register gerade benutzt wurden.
MonST zeigt in wesentlich leserlicherer Form an, was gerade in
Ihrem ST passiert. MonST generiert eine Anzeige mit den
Registern, Speicherinhalten und disassemblierten Instruktionen,
flackernde L„mpchen sind also ÂberflÂssig.
Die MonST-Anzeige beim Programmstart besteht aus vier Fenstern;
in niedriger Auflâ€sung sieht die Anordnung (platzbedingt) etwas
anders aus.
Das obere Fenster zeigt die Registerinhalte zusammen mit den Daten,
die an der Adresse stehen, die gleich dem Inhalt der Register sind.
Fenster 2 ist das Disassemblierungsfenster, in dem mehrere Zeilen
disassemblierten Codes zu sehen sind. Die Anfangsaddresse des Fensters
ist normalerweise der PC; Das ®’¯-Zeichen ist die momentane Position
des PC.
Fenster 3 zeigt einen Teil des Speichers sowohl in Hex als auch in
ASCII an.
Das kleine Fenster ganz unten am Bildschirm enth„lt keine Zahl und
wird haupts„chlich fÂr Mitteilungen verwendet.
4.9 Benutzung der Fenster
MonST hat immer ein aktuelles Fenster. Dieses Fenster erkennt man
daran, daá der Fenstertitel weiá auf schwarz, statt umgekehrt, ist.
Die Tab-Taste kann dazu verwendet werden, durch die einzelnen Fenster
zu gehen, man kann aber auch Alt zusammen mit der Fensternummer drÂcken
um ein bestimmtes Fenster zum aktuellen Fenster zu machen. Das kleine
Fenster unten kann nie das aktuelle Fenster werden, da es nur zur
Anzeige von Mitteilungen gedacht ist.
4.1O Eingabe von Befehlen
Der MonST-Befehlssatz basiert auf einzelnen Tasten, um ein schnelles
Arbeiten zu ermâ€glichen. Dies ist zu Anfang natÂrlich etwas
gewâ€hnungsbedÂrftig, macht sich aber schon nach geringer Zeit
bezahlt. Benutzer von MonST 1 werden viele Befehle wiedererkennen.
Vorsicht: Manche Befehle tun fast das gleiche in MonST2, sind aber
nicht unbedingt identisch.
Allgemein gilt, daá die Alt-Taste die Fenstertaste ist. Alle Befehle,
die die Alt-Taste beinhalten, haben Auswirkungen auf Fenster.
Befehle kâ€nnen groá- oder kleingeschrieben eingegeben werden. Alle
Befehle, die unter Umst„nden katastrophale Auswirkungen haben kâ€nnen,
erfordern die Control-Taste. Befehle werden sofort ausgefÂhrt, es
braucht nicht nach jedem Befehl Return zus„tzlich eingegeben werden.
UngÂltige Befehle werden ignoriert. Die Fenster, deren Daten sich
ver„ndert haben kâ€nnten, werden auch nach jedem Befehl auf den neuesten
Stand gebracht.
MonST ist ein sehr funktionsstarkes und manchmal komplex erscheinendes
Programm. Wir sehen natÂrlich ein, daá es unwahrscheinlich ist,
daá jeder Benutzer jeden einzelnen Befehl auf Anhieb gebrauchen wird.
Deshalb ist dieses Kapitel in zwei weitere Teile gegliedert: einmal
eine Einleitung in die Benutzung MonSTs und darauf folgend einen
vollst„ndigen Referenzteil. Es ist ohne weiteres mâ€glich, daá
Anf„nger und MonST-Neulinge effektiv den Debugger benutzen, auch
wenn sie nur die Bedienungsanleitung gelesen haben. Lassen Sie
sich aber nicht vom Referenzteil abschrecken: er enth„lt sehr
nÂtzliche und wichtige Informationen.
4.11 MonST - eine Probefahrt
Es ist nicht unbedingt notwendig, jedes kleine Detail von MonST zu
kennnen, um den Debugger ®fahren¯ zu kâ€nnen. In diesem Teil werden
anhand eines kleinen Beispiels die wichtigsten Funktionen MonSTs
erl„utert.
In unserem Beispiel geben Sie das folgende kleine Programm in den
Editor ein:
Grâ€Ã¡e equ 20
section text
moveq #0,d0
lea Ende(pc),a0
moveq #Grâ€Ã¡e-1,d1
Schleife1 move.l d0,(a0)+
dbf d1,Schleife1
moveq #-1,d0
lea Ende(pc),a0
moveq #Grâ€Ã¡e-1,d1
Schleife2 move.l d0,(a0)+
dbf d1,Schleife2
Schluá clr.w -(sp)
trap #1
section data
Ende dcb.l Grâ€Ã¡e,-1
Das Programm tut nichts anderes als den Bereich von 80 Byte, der mit
dem Hex-Wert $FFFFFFFF gefÂllt ist, mit Nullen zu lâ€schen und daraufhin
wieder mit $FFFFFFFF zu fÂllen. Wenn dies geschehen ist, gibt das
Programm die Kontrolle wieder an das Betriebssystem zurÂck.
Assemblieren Sie das Programm in den Speicher und starten Sie MonST
mit Alt-D.
Sie kâ€nnen auch das Programm auf Diskette assemblieren: speichern
Sie die Quelltextdatei unter dem Namen BEISPIEL.S ab. Dann w„hlen
Sie als Ziel fÂr den Assembler "Diskette" und "erweiterten
Debug"; wenn er fertig ist, mÂáten Sie die Datei BEISPIEL.PRG auf
Ihrer Diskette finden. Wenn Sie dann Alt-M drÂcken, fragt MonST
nach einem Dateinamen. Geben Sie "BEISPIEL" ein, die Extension .PRG
wird automatisch hinzugefÂgt. Mit dieser Prozedur sind Sie am
gleichen Punkt angelangt, als ob Sie in den Speicher assembliert
und Alt-D gedrÂckt h„tten.
Sie sehen in Fenster 2 Ihr Programm in disassemblierter Form. DrÂcken
Sie die Tab-Taste einmal, um Fenster 3 zum aktuellen Fenster zu machen.
Dann drÂcken Sie Alt-L und geben a0 ein. Sie haben hiermit das
Fenster 3 an das Adreáregister A0 gebunden. Die Bedeutung dieser
Funktion wird sp„ter klar. DrÂcken Sie Alt-2, um das
Disassemblierungsfenster wieder zum aktuellen Fenster zu machen.
DrÂcken Sie Ctrl-Y dreimal. Sie werden nach jeder Eingabe sehen,
daá der Pfeil, der den PC-Stand anzeigt, einen Befehl weiterrÂckt.
Wenn Sie nach dem ersten Ctrl-Y ins Registerfenster schauen, werden
Sie sehen, daá der erste Befehl den Wert 0 in das Datenregister D0
gesetzt hat (man sollte nie davon ausgehen, daá ein Register einen
bestimmten Wert hat; es kann sein, daá D0 schon 0 ist, dies ist aber
von GEMDOS abh„ngig und deshalb nicht unbedingt zutreffend). Das
zweite Ctrl-Y l„dt die Adresse von Ende in das Adreáregister A0.
Das Fenster 3, welches Sie an A0 gebunden haben, zeigt jetzt auf
den Speicherbereich, der "Ende" folgt. Wie Sie sehen, ist der Bereich
mit $FFFFFFFF gefÂllt. Der dritte Befehl l„dt den Schleifenz„hler
in das Register D1.
DrÂcken Sie Ctrl-Y erneut. Sie werden sehen, daá sich im Registerfenster
der Wert von A0 um vier erhâ€ht hat, ebenso die Startadresse von
Fenster 3. Ein Fenster an ein Register binden heiát also, daá bei
jedes Exception die Startadresse des Fensters auf die Adresse des
Registers gesetzt wird.
Jetzt wollen wir aber nicht unbedingt jedes Mal die Schleife durchgehen.
Mit Ctrl-A wird ein Breakpoint nach dem Befehl, der am PC ist, gesetzt,
und das Programm dann laufengelassen.
Das Setzen von Breakpoints ist eine Funktion von MonST. Wenn Sie
ein Breakpoint an eine Adresse setzen, wird das Programm angehalten
und MonST aufgerufen, wenn der PC diese Adresse erreicht.
Mit Ctrl-A umgehen wir das l„stige Durchlaufen der Schleife, indem
wir ein Breakpoint nach dem DBF-Befehl sezten, d.h. nachdem die Schleife
zu Ende ist. DrÂcken Sie jetzt also Ctrl-A.
Wenn die Schleife zu Ende ist, sind Sie dazu bereit, die zweite Schleife,
die wieder $FFFFFFFF in den Speicherbereich fÂllt, auszufÂhren. DrÂcken
Sie jetzt Alt-3, um Fenster 3 zum aktuellen Fenster zu machen. DrÂcken
Sie wieder Alt-L und geben Sie als Binde-Register diesmal m2 ein.
Sie kâ€nnen n„mlich ein Fenster an ein anderes Fenster binden. Die
Startadressen der einzelnen Fenster sind in Speichern, die wie Register
behandelt werden kâ€nnen, enthalten. Die Startadresse vom Fenster
2, dem Disassemblierungsfenster, ist im Speicher M2 enthalten. Jetzt
wird nach jedem Einzelschritt (den wir mit Ctrl-Y machen) das
Fenster 3 auf dem n„chsten Befehl stehen; der Unterschied ist
aber, daá im Fenster 3 die Befehle als Hex-Zahlen ausgegeben
werden und nicht disassembliert sind. Mit Alt-2 wird wieder
Fenster 2 zum aktuellen Fenster.
Da wir die zweite Schleife auch nicht Schritt fÂr Schritt durchlaufen
wollen, benutzen wir einen Breakpoint, um zum Schluá zu kommen. DrÂcken
Sie Alt-B und geben Sie Schluá, den Namen des Symbols, ein. Sie werden
rechts neben dem Befehl, der an der Adresse von Schlu0 steht, [1]
sehen. Dies bedeutet, daá ein Breakpoint mit Wert 1 am Schluá gesetzt
wurde. Dann benutzen wir Ctrl-R um das Programm laufen zu lassen.
Wenn die Schleife fertig ist, h„lt das Programm an, und zwar am Schluá,
wie wir es angegeben haben.
Wenn Sie zweimal Ctrl-Y drÂcken, ist das Programm fertig. Wenn Ihr
Programm in den Speicher assembliert wurde, springt MonST direkt in
den Editor zurÂck. Wenn nicht, meldet MonST "Programmende". Sie
kâ€nnten jetzt ein weiteres Programm mit Ctrl-L laden. Wenn nicht,
kommen Sie mit Ctrl-C zurÂck zum Editor.
Sie haben soeben MonST ®fahren¯ gelernt. Sie kâ€nnen jetzt mit Einzelschritten,
einfachen Breakpoints und Fenstern umgehen. Wenn Sie den ersten
Teil des Kapitels verstanden haben, lesen Sie im Referenzteil weiter.
Er beschreibt ausfÂhrlich alle Funktionen, die MonST zu bieten hat.
4. 12 MonST - Referenzteil
4.12.1 Numerische AusdrÂcke
MonST kann numerische AusdrÂcke auswerten, „hnlich wie GenST. Der
Hauptunterschied zu GenST liegt darin, da0 MonSTs normale Zahlenbasis
in Hex-Code ist, dezimalen Zahlen muá ein ®\¯-Zeichen (kein ¯#® wie
in Version 1!) vorangesetzt werden. Es gibt keine Ausdruckstypen
(absolut oder relativ), das ®*¯-Zeichen wird nur fÂr die Multiplikation
verwendet.
Symbole kâ€nnen verwendet werden, die normalerweise ®case-sensitiv¯
sind, d.h. daž ein Unterschied zwischen kleinen und groáen Buchstaben
gemacht wird. Sie haben eine Signifikanz von 8 bis 22 Zeichen (je
nach Symbolformat). Diese Standardeinstellungen kâ€nnen mit
"Voreinstellungen" ver„ndert werden.
Register werden mit ihren Namen bezeichnet, z.B. A3 oder D7. Dies
sind aber keine Hex-Zahlen. Um die Hex-Zahl A0 anzugeben, muá entweder
ein ®$¯-Zeichen der Zahl vorangesetzt werden oder die Zahl Null.
A7 bezeichnet immer den User-Stack-Pointer.
Es gibt reservierte Symbole, die nicht ®case-sensitiv¯ sind:
TEXT, DATA, BSS, END, SP, SR und SSP. END bezeichnet das erste
Byte nach dem BSS-Segment, SP ist entweder der Supervisor oder
der User-Stack-Pointer, abh„ngig vom Wert des Status-Registers.
Es gibt 10 ®Speicher¯, M0 bis M9, „hnlich wie bei Taschenrechnern.
Diese Speicher kâ€nnen, wie Register, Werte zugewiesen bekommen. Die
Speicher 2 bis 5 enthalten immer die Startadresse der Fenster 2
bis 5; wenn Sie einem dieser Speicher einen neuen Wert zuweisen,
ver„ndert sich auch die Anfangsadresse dieses Fensters.
Vorsicht: Weisen Sie nie M4 einen neuen Wert zu, wenn Fenster 4 als
®Source¯-Fenster benutzt wird.
AusdrÂcke kâ€nnen auch Indirektionen beinhalten: die Zeichen ®{¯ und
®}¯ werden dafÂr benutzt. Indirektion kann auf einer Byte-, Wort-,
oder Langwortbasis angegeben werden, wenn das ®}¯ von einem Punkt
und der gewÂnschten Grâ€Ã¡e gefolgt wird; der Normalwert ist Langwort.
Falls der Pointer ungÂltig ist, entweder weil der Speicher unlesbar
oder ungerade (wenn Wort- oder Langwortgrâ€Ã¡e angegeben ist) ist,
ist der gesamte Ausdruck ungÂltig. Z.B. wird der Ausdruck
{Daten_Anfang+10}.w
das Wort, welches an der Adresse Daten_Anfang+10 steht, liefern.
Indirektion kann auf gleiche Art wie normale Klammern verschachtelt
werden.
4.12.2 Fenstertypen
Es gibt vier verschiedene Fenstertypen. Die erlaubten Fenstertypen
sind wie folgt:
Fensternummer Erlaubte Typen
1 Registerfenster
2 Disassemblierungsfenster
3 Speicher
4 Disassemblierung, Speicher oder
®Source¯
5 Speicher
Registerfenster
In einem Registerfenster werden die Inhalte der Datenregister in
Hex angezeigt, zus„tzlich der ASCII-Wert des untersten Bytes und die
Anzeige (in Hex) der ersten acht Byte, auf die der Registerinhalt
zeigt. Die Adreáregister werden auch in Hex angezeigt, zusammen mit
den ersten 12 Byte, auf die das Register zeigt. Wie in alle Hex-Anzeigen
in MonST werden Werte in nicht lesbaren Speicherstellen mit ** ersetzt.
Das Statusregister wird sowohl in Hex als auch als ®Flags¯ dargestellt.
Zus„tzlich wird entweder U oder S angezeigt, je nachdem, ob der Rechner
sich im Supervisor- oder Usermodus befindet. A7' ist der Supervisor-Stack-Pointer
und wird wie ein normales Adreáregister angezeigt.
Der Wert des PC ist zusammen mit der Instruktion, die am PC ist, in
der untersten Zeile des Registerfensters angezeigt. Wenn die Instruktion
eine oder zwei effektive Adressen hat, werden diese zusammen mit
dem Speicher, der an dieser(n) Adresse(n) ist, angezeigt.
TST.W $12A(A3) ;00001FAE 0F01
Diese Zeile bedeutet, daá der Wert von A3 mit $12A addiert die Adresse
$1FAE ergibt. An dieser Adresse ist der Wert $0F01. Ein komplexeres
Beispiel ist
MOVE.W $12A(A3),-(SP) ;00001FAE 0F01 ’0002AC08 FFFF
Der Ursprungsadreámodus ist der wie im ersten Beispiel, die Zieladresse
ist dagegen $2AC08, die z.Zt. $FFFF enth„lt. Beachten Sie, daá die
Anzeige immer so groá ist wie gerade nâ€tig. MOVEM-Daten werden als
Quad-Worte (64 Bit) angezeigt. Wenn Pr„dekrement im Adressierungsmodus
verwendet wird, wird dies bei der Adreáberechnung mit in Betracht
gezogen.
In niedriger Auflâ€sung werden keine Hex-Daten fÂr die Datenregister
und nur vier Byte als Daten bei Adreáregistern angezeigt. Es kann
auch in niedriger Auflâ€sung vorkommen, daá die Bildschirmbreite nicht
groá genug ist, um eine komplexe Zeile (wie das zweite Beispiel)
anzuzeigen.
Disassemblierungs-Fenster
In einem Disassemblierungs-Fenster wird Speicherinhalt in
disassemblierter Form angezeigt. Ganz links auf einer Zeile wird
die Adresse angezeigt, dann ggf. das Symbol an dieser Adresse,
daraufhin der Befehl an dieser Adresse. Falls an dieser Adresse
ein ®Breakpoint¯ gesetzt ist, wird dessen Typ in eckigen
Klammern, ®[¯und ®]¯, nach dem Befehl angezeigt. Bei Stop-
Breakpoints wird angezeigt, wie oft dieser Befehl noch ausgefÂhrt
werden muá, bis der Breakpoint aktiv wird und das Programm
stoppt. Bei einem Breakpoint mit einer Bedingung enthalten die
eckigen Klammern ein Fragezeichen, gefolgt von der Bedingung. Bei
Z„hler-Breakpoints enthalten die Klammern ein Gleichheitszeichen
und den Z„hlerwert. Bei permanenten Breakpoints ist ein ®*¯ in
den eckigen Klammern.
Das Format der diassemblierten Instruktionen ist im Motorola-
Standard, wie GenST ihn akzeptiert. Alle Text-Daten sind
groágeschrieben, bis auf die Symbole, die kleine Buchstaben
enthalten. Alle numerischen Daten sind in Hex bis auf die TRAP-
Nummern. Vorangehende Nullen und der Hex-Bezeichner ®$¯ werden
bei Zahlen kleiner als 10 nicht angezeigt. Wenn erforderlich,
werden numerische Daten mit Vorzeichen angezeigt. Die einzige
Abweichung vom Motorola-Standard ist die Darstellung der
Registerliste des MOVEM Befehls:
MOVEM.L D0-D3/A0-A2,-(SP)
wird, um Platz zu sparen, als
MOVEM.L D0-3/A0-2,-(SP)
angezeigt.
In niedriger Auflâ€sung ersetzen Symbole die Adresse und werden nur
bis zu einer maximalen L„nge von acht Zeichen angezeigt.
Speicher-Fenster
In einem Speicher-Fenster wird Speicher zeilenweise im Format Hex-Adresse,
Hex-Daten und ASCII-Daten angezeigt. Unlesbarer Speicher wird als
®**¯ dargestellt. Die Anzahl der angezeigten Bytes pro Zeile h„ngt
von der Breite des Fensters ab und kann maximal 16 Byte betragen.
Source-Fenster
Sie kâ€nnen im ®Source¯-Fenster ASCII-Dateien, wie z.B. Ihren Programm-Quelltext,
„hnlich wie in einem Text-Editor darstellen. Der normale Tab-Abstand
ist 8, kann aber mit dem Editieren- Fenster-Befehl auf 4 umgeschaltet
werden.
4.12.3 Fenster-Befehle
Die Alt-Taste ist die sog. Fenster-Taste, d.h. alle Fenster-Befehle
beinhalten die Alt-Taste. Jeder dieser Befehle bezieht sich auf das
aktuelle Fenster, also das Fenster, dessen Titel invers dargestellt
ist. Das aktuelle Fenster kann gew„hlt werden, indem man entweder
die Tab-Taste so oft drÂckt, bis das gewÂnschte Fenster zum aktuellen
Fenster wird oder Alt zusammen mit der Nummer des gewÂnschten
Fensters drÂckt.
Die meisten Fenster-Befehle funktionieren in allen Fenstern unabh„ngig
davon, ob sie im ®Zoom¯-Modus sind oder nicht. Wenn ein Befehl keinen
Sinn ergibt, wird er ignoriert.
Alt-A Adresse setzen
Dieser Befehl setzt die Anfangs-Adresse eines Fensters
Alt-B Breakpoint setzen
Mit diesem Befehl werden Breakpoints gesetzt; Breakpoints werden
sp„ter genauer beschrieben.
Alt-E Editieren
In einem Speicherfenster kann man mit diesem Befehl im Speicher
in Hex und ASCII editieren. Hex-Zahlen kâ€nnen mit den Tasten 0-9
und A-F eingegeben werden. Die Cursor-Tasten kâ€nnen dazu benutzt
werden, den Cursor im Fenster zu bewegen. Mit der Tab-Taste kâ€nnen
Sie zwischen dem Hex- und dem ASCII-Editiermodus hin- und herschalten.
Der ASCII-Modus schreibt den ASCII-Wert des Tastendrucks in den
Speicher. Um den Editiermodus zu verlassen, drÂcken Sie die Esc-Taste.
Im Registerfenster bewirkt Alt-E das gleiche wie Alt-R, n„mlich
Register setzen.
Im ®Source¯-Fenster kann mit Alt-E der Tab-Abstand zwischen 4 und
8 gew„hlt werden.
Alt-F Fontgrâ€Ã¡e
Dieser Befehl ver„ndert die Fontgrâ€Ã¡e im aktuellen Fenster. In hoher
Auflâ€sung wird zwischen 16 und 8 Pixel groáen Fonts gewechselt; in
Farbe wird zwischen 8 und 6 Pixel groáen Fonts gewechselt.
Wenn die Fontgrâ€Ã¡e im Register-Fenster ver„ndert wird, werden die
Grâ€Ã¡en der anderen Fenster neu berechnet, um sie so groá wie mâ€glich
zu machen.
Alt-L Fenster binden
Mit diesem Befehl kann ein Fenster an ein Register oder an ein anderes
Fenster gebunden werden. Nach einer Exception werden die Startadressen
aller Fenster neu berechnet und ggf. entsprechend ver„ndert. Um eine
Bindung zu lâ€schen, geben Sie in die Dialogbox nichts ein. Fenster
2 ist standardm„áig an den PC gebunden. Um ein Fenster an ein anderes
zu binden, mÂssen Sie den entsprechenden Speicher angeben, z.B. M2
fÂr Fenster 2.
Alt-O Auswerten
Eine Dialogbox erscheint, in der Sie einen Ausdruck eingeben. Dieser
wird ausgewertet und in Hex, Dezimal und ggf. als Symbol ausgegeben.
Alt-P Drucker Dump
Der Inhalt des aktuellen Fensters wird auf dem Drucker ausgegeben.
Dieser Befehl kann mit Esc abgebrochen werden.
Alt-R Register setzen
Mit diesem Befehl kann jedes Register gesetzt werden. Das Register
muá angegeben werden, gefolgt von einem Gleichheitszeichen und dem
Ausdruck des neuen Registerwerts. Zum Beispiel:
A3=A2+4
setzt das Register A3 auf den Wert vom Register A2 mit vier
addiert. Sie kâ€nnen z.B. im ®Zoom¯-Modus diesen Befehl dazu
verwenden, einem anderen Fenster eine neue Startadresse zu geben.
Wenn Sie den ®Zoom¯-Modus verlassen, zeigt das Fenster auf die
angegebene Adresse.
Alt-S Fenster teilen
Dieser Befehl teilt Fenster 2 in die Fenster 2 und 4 oder das Fenster
3 in die Fenster 3 und 5. Jedes neue Fenster ist vom Ursprungsfenster
unabh„ngig. Wenn Sie Alt-S ein zweites Mal drÂcken, werden die zwei
Fenster wieder zusammengefÂgt.
Dieser Befehl wird in niedriger Auflâ€sung ignoriert.
Alt-T Typ ver„ndern
Dieser Befehl hat nur Wirkung in Fenster 4, welches durch die
Teilung von Fenster 2 entsteht, oder wenn Sie eine ASCII-Datei laden. Der
Fenstertyp wird zwischen Disassemblierung, Speicheranzeige oder ®Source¯
geschaltet.
Alt-Z ®Zoom¯
Das aktuelle Fenster wird mit diesem Befehl auf die volle Bildschirmgrâ€Ã¡e
gebracht. Mit Esc oder einem erneuten Alt-Z wird das Fenster wieder
auf Normalgrâ€Ã¡e gebracht. Alt-Befehle sind im ®Zoom¯-Modus weiterhin
benutzbar.
Cursor-Tasten
Die Cursor-Tasten werden in Verbindung mit dem aktuellen Fenster
benutzt. Ihre Wirkung h„ngt vom Fenstertyp ab.
In einem Speicher-Fenster ver„ndern alle vier Cursor-Tasten die
Startadresse des Fensters. Mit Shift-oben und Shift-unten kâ€nnen
Sie seitenweise hoch und runter "bl„ttern". In einem
Disassemblierungs-Fenster ver„ndern Cursor-oben- und Curso-unten-
Tasten die Startadresse des Fensters um jeweils eine Instruktion.
Cursor-links und Cursor-rechts ver„ndern die Startadresse jeweils um
ein Byte. Die Shift-Tasten kâ€nnen wiederum fÂr das seitenweise
Bl„ttern benutzt werden.
Im ®Source¯-Fenster ver„ndert Cursor-oben und Cursor-unten die
Startadresse des Fensters um eine Zeile, die Shift-Tasten
ver„ndern die Startadresse um eine Seite.
4.13 Bildschirmumschaltung
MonST benutzt seinen eigenen Bildschirmspeicher und seinen eigenen
Bildschirmtreiber, um jeden Konflikt mit dem zu debuggenden Programm
zu vermeiden. Um ein "Flackern" des Bildschirms beim "Single-Steppen"
zu verhindern, wird von der Bildschirm-Anzeige auf die des Programms
erst nach 20 msec umgeschaltet. Es ist auch mâ€glich, den
Debugger in einer anderen Auflâ€sung wie das zu debuggende Programm
zu betreiben; dies geht aber nur mit einem Farbmonitor.
V Anderer Bildschirm
Dieser Befehl schaltet bis zum n„chsten Tastendruck auf den Bildschirm
des zu debuggenden Programms.
Ctrl-O Andere Auflâ€sung
Dieser Befehl schaltet MonSTs Anzeige zwischen niedriger und mittlerer
Auflâ€sung hin und her. Alle Fenster werden neu initialisiert und
auf die Standardgrâ€Ã¡en eingestellt. Dieser Befehl hat keine Auswirkung
auf das zu debuggende Programm.
Dieser Befehl wird bei einem monochromen Monitor ignoriert.
Dadurch, daá MonST seinen eigenen Bildschirmspeicher hat, ist es
mâ€glich, den Bildschirmspeicher Ihres Programms anzusehen; dies ist
bei Grafikprogramm ideal.
Vorsicht: Wenn Ihr Programm die Bildschirmauflâ€sung, -position
oder die Farbpalette ver„ndert, ob mit dem XBIOS oder direkt per
Hardware, ist es wichtig, daá Sie die Bildschirmumschaltung bei
den Voreinstellungen, w„hrend Sie diesen Code ausfÂhren,
abschalten. Wenn Sie dies nicht tun, bemerkt MonST die
Ver„nderungen nicht.
Wenn Sie einen Diskettenzugriff durchfÂhren, schaltet der
Bildschirm auf den Bildschirm Ihres Programms um. Dies geschieht,
um eine mâ€glicherweise erscheinende GEM-Alarmbox (z.B. bei einem
Diskettenfehler) sofort sichtbar werden zu lassen, Sie kâ€nnen
deshalb sofort darauf reagieren.
4.14 Programmunterbrechung
4.14.1 Shift-Alt-Help
Ein laufendes Programm kann mit Shift-Alt-Help unterbrochen
werden: durch diese Tastenkombination wird eine Trace-Exception
ausgelâ€st. Wenn Sie in MonST zurÂckgelangen, kann es sein, daá
sich der PC im Programm befindet oder die Unterbrechung im ROM
stattfindet (was bei Programmen der Fall ist, die ausgiebigen
Gebrauch vom ROM machen) oder im Line-F- oder dem TRAP-Handler.
Wenn Sie sich nicht im Ihrem Programm befinden, raten wir Ihnen,
ein Breakpoint an einer entsprechenden Stelle in Ihr Programm zu
setzen und mit Ctrl-R das System weiterlaufen zu lassen.
Alt-Help ohne Shift lâ€st einen Ausdruck des Bildschirms von Ihrem
Programm aus. Wenn Sie versehentlich das Shift vergessen haben, kâ€nnen
Sie den Druck mit nochmaligem Alt-Help abbrechen.
Es kann sein, daá diese Tastenkombination ignoriert wird, nochmaliges
DrÂcken der Tasten mÂáte MonST eingreifen lassen. Diese Kombination
hat keine Wirkung, wenn sie innerhalb von MonST gedrÂckt wird.
Vorsicht: Ein Programm sollte nie mit Ctrl-C abgebrochen werden, nachdem
es innerhalb des ROMs unterbrochen wurde. Dies kann sehr leicht zu
einem Absturz fÂhren.
4.14.2 Ctrl-S
Eine Anweisung kann durch Ctrl-S abgebrochen werden. Dieser
Vorgang ist gleichbedeutend damit, daž der PC x Wâ€rter nach vorne
gesetzt wird. Dieser Befehl ist dann angebracht, wenn eine
Anweisung seltsame Ergebnisse erzeugen kâ€nnte.
4.14.3 Reset
W„hrend Sie sich im Debugger befinden, kâ€nnen Sie mit Ctrl-Alt-
Num.Punkt einen Reset durchfÂhren. Es wird keine Warnung
generiert.
4.14.4 Breakpoints
Breakpoints erlauben es Ihnen, Ihr Programm an von Ihnen
bestimmten Punkten zu unterbrechen. MonST erlaubt maximal acht
gleichzeitig gesetzte Breakpoints, von denen jeder einer der fÂnf
Breakpoint-Typen sein kann. Wenn ein Breakpoint erreicht wird,
trifft MonST die Entscheidung, ob das Programm angehalten wird
oder weiter abl„uft. Diese Entscheidung h„ngt von den Typen des
Breakpoints ab.
Einfache Breakpoints
MonST h„lt das Programm bei Erreichen der Breakpoints an und lâ€scht
dann den Breakpoint.
Stop Breakpoints
Diese Art unterbricht das Programm an der Stelle, an der ein bestimmter
Befehl an der Adresse des Breakpoints zum n-ten Male ausgefÂhrt wurde.
Ein einfacher Breakpoint ist eigentlich ein Stop-Breakpoint mit dem
Wert 1.
Z„hler-Breakpoints
Diese Art ist nur ein Z„hler. Jedesmal, wenn der Befehl an der Adresse
des Breakpoints ausgefÂhrt wird, erhâ€ht sich der Z„hler um eins, und
das Programm l„uft weiter.
Permanente Breakpoints
Dieser Typ ist den einfachen Breakpoints „hnlich, bis auf den
Unterschied, daá sie nie gelâ€scht werden. Jedesmal, wenn dieser
Breakpoint erreicht wird, Âbernimmt MonST die Kontrolle.
Bedingte Breakpoints
Diese Art von Breakpoint erlaubt es Ihnen, Ihr Programm nur dann
anzuhalten, wenn eine bestimmte Bedingung erfÂllt ist. Jeder bedingte
Breakpoint hat einen Ausdruck; dieser wird jedesmal, wenn der Breakpoint
erreicht wird, ausgewertet. Wenn der Ausdruck wahr (d.h. ungleich
Null) ist, wird der Programmablauf unterbrochen.
Alt-B Breakpoint setzen
Dies ist ein Fenster-Befehl; er erlaubt das Setzen oder Lâ€schen von
Breakpoints zu jeder Zeit. Die eingegebene Zeile muá je nach Breakpoint-Typ
eines der folgenden Formate haben:
<Adresse>
setzt einen einfachen Breakpoint.
<Adresse>,<Ausdruck>
setzt einen Stop-Breakpoint an der angegebenen Adresse, der das Programm
stoppt, nachdem <Ausdruck> eine bestimmte Anzahl oft ausgefÂhrt wurde.
<Adresse>,=
setzt einen Z„hler Breakpoint. Der Anfangswert des Z„hlers ist Null
<Adresse>,*
setzt einen permanenten Breakpoint.
<Adresse>,?<Ausdruck>
setzt einen bedingten Breakpoint, der vom <Ausdruck> abh„ngig ist.
<Adresse>,-
lâ€scht jede Art von Breakpoint an der angegebenen <Adresse>.
Breakpoints kâ€nnen nicht an ungeraden und unlesbaren Adressen, und
im ROM gesetzt werden. ROM-Breakpoints kâ€nnen emuliert werden, indem
man den Run-Until-Befehl benutzt.
Jedesmal, wenn ein Breakpoint erreicht wird, egal ob das Programm
angehalten wird oder nicht, wird der Prozessorstatus im History-Buffer,
der sp„ter beschrieben wird, behalten.
Help Breakpoint- und Segmentanzeige
Dieser Befehl zeigt die Adressen der TEXT, DATA und BSS-Segmente
und deren L„ngen, zusammen mit s„mtlichen gesetzten Breakpoints,
an. Alt-Befehle kâ€nnen hier auch benutzt werden.
Ctrl-B Breakpoint setzen
Dieser Befehl ist haupts„chlich aus Kompatibilit„tsgrÂnden zu
MonST 1 noch vorhanden. Hiermit wird ein einfacher Breakpoint an
der Startadresse des aktuellen Fensters gesetzt. Falls schon ein
Breakpoint an dieser Adresse vorhanden ist, egal welcher Art,
wird er gelâ€scht.
U Go Until
Dieser Befehl fragt in einer Dialogbox nach einer Adresse, an der
dann ein einfacher Breakpoint gesetzt wird. Das Programm l„uft danach
sofort weiter ab.
Ctrl-K Kill Breakpoints
Alle gesetzten Breakpoints werden gelâ€scht.
Ctrl-A Breakpoint setzen und ausfÂhren
Mit diesem Befehl wird ein einfacher Breakpoint nach dem Befehl am
PC gesetzt, das Programm l„uft weiter. Dieser Befehl ist haupts„chlich
fÂr DBF-Schleifen gedacht, die man nicht immer wieder durcharbeiten
will, sondern deren Ergebnis man gleich sehen will.
Ctrl-D BDOS Breakpoint
Hiermit wird ein Breakpoint auf den n„chsten BDOS-Aufruf, dessen
Funktionsnummer Sie angeben, gesetzt. Wenn Sie einen bestehenden
BDOS-Breakpoint lâ€schen wollen, geben Sie eine leere Zeile ein. BDOS
Breakpoints mÂssen gelâ€scht werden, um deaktiviert zu werden.
History
MonST hat einen sog. History-Speicher, in dem der Prozessorstatus
nach jeder Exception behalten wird.
Die h„ufigste Ursache eines Eintrags in den History-Speicher ist
das ®Single-Steppen¯. Aber auch bei jedem Breakpoint und bei
bestimmten Arten des Run-Befehls wird ein neuer Eintrag in den
Speicher gemacht.
Der Speicher enth„lt Platz fÂr fÂnf Eintr„ge. Wenn er voll ist, wird
jeweils der „lteste Eintrag gelâ€scht, damit ein neuer aufgenommen
werden kann.
H History-Speicher-Anzeige
Ein Fenster wird geâ€ffnet, in dem die maximal fÂnf Eintr„ge im
History-Speicher angezeigt werden. Sowohl alle Registerwerte
werden angezeigt, als auch der n„chste Befehl, der ausgefÂhrt
wird.
Wenn auf einen Befehl im History-Speicher ein Breakpoint gesetzt
ist, zeigt der Wert in den eckigen Klammern den Wert des Breakpoints
zur Zeit der Anzeige und nicht zum Zeitpunkt des Eintrags in den
Speicher.
4.15 MonST verlassen
Ctrl-C Abbrechen
Dieser Befehl verursacht einen Programmende-Trap fÂr den aktuellen
GEMDOS ®Task¯. Wenn ein Programm mit MonST debuggt wird, wird zuerst
das Programm mit Ctrl-C abgebrochen, die Meldung ®Programmende¯ erscheint
unten im Mitteilungsfenster; durch nochmaliges Ctrl-C wird MonST
verlassen. Sie kâ€nnen aber auch ein anderes Programm laden, ohne MonST
verlassen zu mÂssen.
Wenn MonST vom Editor aus aufgerufen wurde, kehren Sie sofort nach
Beendigung des Programmes in den Editor zurÂck, ohne Ctrl-C fÂr MonST
drÂcken zu mÂssen.
Vorsicht: Es kann durchaus zum Absturz kommen, wenn Sie frÂhzeitig
ein GEM Programm abbrechen, ohne daá z.B. die ®Virtual Workstation¯
geschlossen wurde.
4.16 Laden und Abspeichern
Ctrl-L AusfÂhrbares Programm laden
Mit diesem Befehl wird ein Programm zum Debuggen geladen. Sie werden
nach dem Programmnamen (wenn nicht anders angegeben, wird .PRG als
Extension angenommen) und dann nach der Kommandozeile gefragt, die
dem Programm Âbergeben werden soll. Wenn MonST schon ein Programm
geladen hat, muá dieses Programm erst beendet werden, bevor ein neues
geladen werden kann.
Die Datei, die geladen werden soll, muá ein von GEMDOS
ausfÂhrbares Programm sein. Wenn dies nicht der Fall ist, wird
ein TOS-Fehler 66 gemeldet. Weitere Versuche, ein Programm zu
laden, werden normalerweise scheitern, da GEMDOS den fÂr das
Programm reservierten Speicher nicht zurÂckgibt. Wenn dies
geschieht, mÂssen Sie MonST verlassen und neu starten; laden Sie
die Datei dann als Bin„rdatei.
B Bin„rdatei laden
Es wird nach einem Dateinamen und nach einer (nicht notwendig anzugebenden)
Ladeadresse gefragt. Diese Datei wird in den Speicher geladen. Wenn
keine Ladeadresse angegeben wird, wird die Datei dort geladen, wo
GEMDOS genÂgend Speicher freigibt. M0 enth„lt die Startadresse, M1
die Adresse des Dateiendes im Speicher.
S Bin„rdatei sichern
Dieser Befehl fragt nach einem Dateinamen, unter dem die Datei gesichert
werden soll, nach einer Startadresse und einer Schluáadresse. Um
eine zuvor geladene Bin„rdatei zu sichern, kâ€nnen Sie als Start- und
Schluáadresse M0 und M1 angeben, vorausgesetzt, die Werte haben sich
nicht ver„ndert.
A ASCII-Datei laden
Mit diesem Befehl kâ€nnen Sie eine ASCII-Datei laden, normalerweise
eine Quelltextdatei, um sie in MonST anzusehen. Fenster 4 wird geâ€ffnet,
falls es noch nicht vorhanden ist, und als ®Source¯-Fenster eingestellt.
Der Speicher fÂr diese Datei wird von GEMDOS angefordert. Es ist
deshalb ratsam, die ASCII-Datei vor Ihrem Programm zu laden, damit
garantiert genÂgend Speicher dafÂr vorhanden ist. In niedriger
Auflâ€sung wird Fenster 4 nicht geâ€ffnet. Sie kâ€nnen aber die
Datei laden, mit Ctrl-O die Auflâ€sung „ndern und mit Alt-S und
zweimaligem Alt-T den Text dann ansehen.
Wenn eine ASCII-Datei nach einem Programm geladen wird, gehâ€rt der
Speicher, in dem die Datei sich befindet, dem Programm und nicht
MonST. Wenn das Programm zu Ende ist, wird der Speicher, in dem sich
der Text befindet, von GEMDOS freigegeben. Die auto-residente Version
von MonST kann diese Unterscheidung nicht machen, seien Sie also
vorsichtig, wenn Sie eine ASCII-Datei in den auto-residenten MonST
laden.
4.17 Programme ausfÂhren
Ctrl-R ZurÂck zum Programm / Laufenlassen
Hiermit wird das Programm mit voller Geschwindigkeit laufengelassen;
es ist die Âbliche Methode dafÂr, das Programm nach einem Breakpoint
weiterlaufen zu lassen.
Ctrl-Y / Ctrl-Z ®Single-Step¯
Hiermit wird der Maschinensprachebefehl am PC ausgefÂhrt. Ein Trap,
Line-A oder Line-F Opcode wird als einzelner Befehl angesehen und
als solcher ausgefÂhrt. Dies kann durch >>Voreinstellungen<< ver„ndert
werden.
Ctrl-T Befehl interpretieren
Dieser Befehl interpretiert den Opcode am PC. Er ist dem Ctrl-Y/Ctrl-Z
„hnlich, verfolgt aber keine JSR, BSR, Trap, Line-A oder Line-F Befehle.
Er erspart Ihnen das Durchlaufen solcher Routinen und kann mit Befehlen
im ROM oder im RAM benutzt werden.
R Run
Dies ist ein allgemeiner Befehl und kann auf verschiedene Arten ausgefÂhrt
werden.
Run G Go
Dieser Befehl ist mit Ctrl-R identisch und l„át das Programm mit
voller Geschwindigkeit laufen.
Run S Langsam (Slowly)
Das Programm wird langsam ausgefÂhrt, jeder Befehl wird im
History-Speicher behalten.
Run I Instruktion
Dieser Befehl ist dem >>Run s<< „hnlich, nimmt aber einen numerischen
Parameter: die Anzahl der Instruktionen, die ausgefÂhrt werden, bevor
MonST wieder eingreift.
Run U Bis (Until)
Sie werden nach einem Ausdruck gefragt, der nach jedem Opcode ausgewertet
wird. Sobald dieser Ausdruck wahr ist, wird das Programm gestoppt.
Sie kâ€nnen z.B. den folgenden Ausdruck verwenden, wenn Sie Ihr Programm
im ROM mit Shift-Alt-Help angehalten haben und erst wieder Kontrolle
Âbernehmen wollen, wenn Ihr Programm-Code wieder ausgefÂhrt wird:
(PC>TEXT)&(PC<FC0000)
Das Programm wird so lange laufen, bis der PC an einer Adresse ist,
die sich nicht im ROM (PC<FC0000) und in Ihrem Programmbereich befindet
(PC>TEXT). Sie kâ€nnten sicherheitshalber
(PC>TEXT)&(PC<DATA)&(PC<FC0000)
angeben, dies ist aber meist unnâ€tig und braucht fÂr die Auswertung
nach jeder Instruktion l„nger.
Bei allen Run-Befehlen werden Sie nach "Beobachten J/N?" gefragt.
Wenn Sie "Ja" w„hlen, kâ€nnen Sie von MonST aus den Programmablauf
mit allen Registerver„nderungen beobachten. Dieser Vorgang l„uft
ziemlich langsam ab und kann mit dem DrÂcken beider Shift-Tasten
abgebrochen werden. Sie kâ€nnen auch Shift-Alt-Help dazu verwenden,
den Beobachtungsmodus anzuhalten. Diese Tastenkombination kann aber
aus system-spezifischen GrÂnden nicht immer den Beobachtungsmodus
anhalten, die beiden Shift-Tasten sind in diesem Fall zuverl„ssiger.
Wenn Sie "Nein" w„hlen, wird das Programm mit seinem eigenen Bildschirm
laufengelassen. Den Programmablauf kâ€nnen Sie mit Shift-Alt-Help
unterbrechen.
Wenn Sie den Ablauf "beobachten", ist es ratsam, die
Bildschirmumschaltung in den Voreinstellungen abzuschalten. Sonst
wird bei jedem Befehl der Bildschirm umgeschaltet und erzeugt
dadurch ein sehr augenfeindliches Flackern, was besonders bei
Farbmonitoren unangenehm ist.
Bei allen Arten von Run (auáer Go) wird nach jedem ausgefÂhrten Befehl
ein Eintrag in den History-Speicher gemacht. Traps werden als einzelne
Befehle behandelt. Sie kâ€nnen dies mit Voreinstellungen ver„ndern,
allerdings sollten Sie die Warnungen, die bei der Beschreibung von
"Traps verfolgen" gegeben werden, beachten.
Wenn ein Programm in einem der oben erw„hnten Modi (auáer Go) l„uft,
werden Sie einige Pixel in der linken oberen Ecke Ihres Bildschirms
sehen. Dieses kleine ®L„mpchen¯ zeigt, daá MonST noch aktiv arbeitet.
Man kâ€nnte sonst annehmen, daá die Maschine h„ngengeblieben ist,
weil sich die AusfÂhrungsgeschwindigkeit stark verlangsamt.
4.18 Speicher durchsuchen
G Speicher durchsuchen
Nach diesem Befehl erscheint "Suchen nach B/W/L/T/I?", wobei die
KÂrzel Byte, Wort, Langwort, Text und Instruktion bedeuten.
Wenn Sie B, W oder L w„hlen, werden Sie nach den Zahlensequenzen
gefragt, nach denen Sie suchen wollen. MonST findet auch Zahlen an
ungeraden Adressen.
Wenn Sie T w„hlen, geben Sie den Text ein, nach dem gesucht werden
soll, er wird dann ®case-sensitiv¯ behandelt.
Geben Sie I ein, so kâ€nnen Sie nach einem ganzen oder nur einem Teil
eines Maschinensprachebefehls suchen. Wenn Sie z.B. nach ®$14(A¯
suchen, werden Sie eine Instruktion wie ®MOVE.L D2,$14(A0)¯ finden.
Anders als bei MonST 1, wird zwischen Groá-und Kleinschreibung
unterschieden. Sie sollten auch das Ausgabeformat des
Disassemblers beachten: so sollten Sie z.B. fÂr Zahlen Hex-Code
verwenden, sich auf A7 anstatt SP beziehen usw.
Wenn Sie die Parameter eingegeben haben, wird die Kontrolle an den
N-Befehl Âbergeben.
N N„chstes Vorkommnis suchen
Dieser Befehl wird nach dem G-Befehl benutzt; er sucht nach dem n„chsten
Vorkommnis der angegebenen Suchparameter. Wenn Sie nach Byte-, Wort-
oder Langwort-Daten suchen, werden Sie immer ein Vorkommnis, n„mlich
im MonST-Speicher, finden. Wenn Sie nach Text suchen, kann es auch
sein, daá der Text sich noch im Tastaturpuffer befindet. Mit diesen
Suchparametern wird nach 64Kbyte durchsuchten Speichers die Esc-Taste
abgefragt. Bei der Suche nach Maschinensprachebefehlen wird immer
nach 2 Byte auf die Esc-Taste hin geprÂft.
Gesucht wird im Bereich von 0 bis zum Ende des Speichers, dann von
$FA0000 bis $FEFFFF, dem Modul- und System-ROM-Bereich, und dann
wieder von 0.
Die Suche beginnt kurz nach der Anfangsadresse des aktuellen Fensters
(wenn es nicht das Registerfenster ist). Wenn die angegebenen Daten
gefunden wurden, werden die Startadressen von manchen Fenstern auf
die Adresse der gefundenen Daten gesetzt. Wenn innerhalb von Fenster
2 oder 3 gesucht wurde, werden die Startadressen von 2 und 3 auf
die gefundenen Daten gesetzt. Wenn innerhalb der Fenster 4 oder
5 gesucht wurde, werden die Startadressen von 4 und 5 auf die gefundenen
Daten gesetzt, auáer dann, wenn Fenster 4 als ®Source¯-Fenster benutzt
wird.
Im "Source"-Fenster suchen
Wenn Sie den G-Befehl im "Source"-Fenster verwenden, kann nur
nach Text gesucht werden. Wenn er gefunden worden ist, wird die
Zeile, die den Text enth„lt, angezeigt. Wenn der Text nicht
gefunden wurde, wird das Fenster nicht ver„ndert. Daž die die
Suche ohne Ergebnis verlief erkennen Sie daran, daá die Meldung
"Suche..." nicht mehr im Mitteilungsfenster unten zu sehen ist.
4.19 Verschiedenes
Ctrl-P Voreinstellungen
Mit dieser Dialogbox kâ€nnen Sie verschiedene Optionen MonSTs einstellen.
Die ersten drei Fragen verlangen J/N-Antworten. Sie kâ€nnen, wie in
jeder Dialogbox, mit Esc abbrechen und mit Return die neuen Einstellungen
Âbernehmen.
Bildschirmumschaltung
Normalerweise ist diese Option an; der Bildschirm wird erst
20 msec nach KontrollÂbergabe an Ihr Programm auf den Bildschirm
Ihres Programms umgeschaltet. Damit wird unnâ€tiges Flackern
verhindert. Diese Option sollte ausgeschaltet werden, bevor das
zu debuggende Programm die Auflâ€sung, die Bildschirmadresse oder
die Farbpalette ver„ndert; danach sollten Sie die
Bildschirmumschaltung wieder einschalten.
Traps verfolgen
Normalerweise werden Traps, Line-A- und Line-F-Aufrufe als ein-
zelne Befehle angesehen. Wenn >>Traps verfolgen<< eingeschaltet ist,
werden solche Routinen verfolgt, um so auch das ROM untersuchen
zu kâ€nnen.
Vorsicht: Diese Option sollte mit grâ€Ã¡ter Vorsicht behandelt
werden, da man damit sehr leicht groáen Schaden anrichten kann.
Manche zeitkritische Routinen, wie Floppy- oder
Festplattentreiber, mÂssen ununterbrochen ablaufen. Eine Trace-
Exception in solchem Code kann ohne weiteres zum Miálingen und
auch zum Datenverlust fÂhren. Andererseits macht es Spaá dem AES
dabei zuzusehen, wie es MenÂs oder sich â€ffnende Fenster aufbaut.
Wenn Sie Ihr Programm mit >>Traps verfolgen<< und >>Run<<
ablaufen lassen, kâ€nnen Sie mit Shift-Alt-Help den Programmablauf
unterbrechen und ihn mit normaler Geschwindigkeit mit Ctrl-R
fortsetzen. Sowohl das AES als auch das VDI benutzen Line-A und
Line-F Aufrufe, es ist deshalb sehr gut mâ€glich, daá mehrere noch
bevorstehende ®Stack Frames¯ das gesetzte Trace-Bit enthalten. Es
kann also den Anschein haben, als ob vâ€llig unvorhersehbare
Trace-Exceptions geschehen. Nach jedem derartigen Exception
sollten Sie mit Ctrl-R fortfahren. Diese unregelm„áigen
Exceptions werden nur dann aufhâ€ren wenn Sie auf tiefster Ebene,
d.h. wieder in Ihrem Programm, sind.
Es gibt noch eine Nebenwirkung:
Wenn durch AES-Event-Aufrufe ®getraced¯ wurde, kann es vorkommen,
daá auch ®Stack Frames¯ innerhalb von Desk-Accessories mit gesetztem
Trace-Bit existieren. Wenn das Programm zu Ende ist bevor das Desk-
Accessory die Mâ€glichkeit hatte, diese ®Stack Frames¯ abzuarbeiten,
wird ein Trace-Exception nach Verlassen MonSTs geschehen und einen
Systemabsturz verursachen. Der Absturz erfolgt nur dann nicht, wenn
AMonST2 oder das mitgelieferte NOTRACE.PRG aktiv sind.
NOTRACE.PRG
Dieses kleine Programm wird auch als Source mitgeliefert und dient
dazu, Trace-Exceptions zu ignorieren anstatt mehrere Bomben auszulâ€sen.
Das Programm sollte in Ihren AUTO-Ordner kopiert werden, falls Sie
nicht schon AMonST verwenden.
Relative Offsets
Diese Einstellung ist normalerweise an und beeinfluát die
symbolische Disassemblierung vom Adreáregister indirekt mit dem
Offset Adreámodus, d.h. xxx(An). Wenn die Option an ist, wird
jeder derartige Adreámodus ausgerechnet und dann die
Symboltabelle durchsucht; wenn ein Symbol sich an dieser Adresse
befindet, wird der Befehl als Symbol(An) disassembliert. Diese
Option ist sehr hilfreich, sowohl bei manchen
Assemblerprogrammstilen als auch bei der Untersuchung von
Hochsprachen, die ein Adreáregister als Basisregister benutzen.
HiSoft Basic z.B. verwendet A3 als Zeiger auf das ®Runtime¯-
System.
Symbole
Diese Option ermâ€glicht es, die Behandlung von Symbolen durch MonST
zu ver„ndern. Zuerst werden Sie gefragt, wie viele Buchstaben in einem
Symbol signifikant sein sollen (minimal 8, maximal 22) und danach,
ob die Symbole "Case-sensitiv" verarbeitet werden sollen. Diese
Option ist fÂr diejenigen gedacht, die nicht jedes Mal den ganzen
Symbolnamen eingeben und nicht auf Groá- und Kleinschreibung achten
wollen.
I Intelligentes Kopieren
Dieser Befehl kopiert einen Speicherbereich in einen anderen. Die
Adressen sollten in folgender Weise eingegeben werden:
<Anfang>,<Einschlieáliches_Ende>,<Ziel>
Das Kopieren ist deshalb intelligent, da die Ursprungs- und Endbereiche
Âberlappen kâ€nnen.
Vorsicht: MonST ÂberprÂft nicht, ob die Adressen gÂltig sind. Eine
Kopie von oder zu einer nichtexistenten Speicherstelle wird MonST
wahrscheinlich abstÂrzen lassen. Das gleiche gilt fÂr den reservierten
Systemspeicherbereich.
W Speicher fÂllen
Dieser Befehl fÂllt einen Speicherbereich mit dem angegebenen Wert.
Die Parameter sind:
<Anfang>,<Einschlieáliches_Ende>,<FÂllbyte>
Die Warnung Âber gÂltigen Speicher gilt auch fÂr diesen Befehl.
L Labels anzeigen
Wenn MonST von GenST mit Debuggen aufgerufen wurde, wird ein
Fenster geâ€ffnet und alle Labels, die sich z.Zt. in MonSTs
Symboltabelle befinden, werden mit ihren Adressen angezeigt. Die
Symbole erscheinen in der Reihenfolge, in der sie aufgerufen
wurden. Dabei ist es unerheblich, ob sie von Diskette oder vom
Speicher eingelesen werden.
P Disassemblieren zum Drucker/zur Diskette
Mit diesem Befehl kâ€nnen Sie einen Speicherbereich zum Drucker oder
auf Diskette, sowohl mit vorhandenen Symbolen als auch mit ®cross
reference¯-Labels, disassemblieren. Die erste Zeile der Dialogbox
sollte mit
<Startadresse>,<Endadresse>
angegeben werden. Die n„chste Zeile fragt nach einem Speicherbereich,
den MonST zur Erstellung der "cross reference"-Liste benutzen kann:
<Pufferanfang>,<Pufferende>
Wenn Sie dies nicht wollen, geben Sie einfach eine leere Zeile ein.
Die n„chste Zeile fragt nach den Speicherbereichen, die als DC-Direktiven
disassembliert werden sollen. Die Zeile sollte so aussehen:
<Datenanfang>,<Datenende>[,<Grâ€Ã¡e>]
Die optionale Grâ€Ã¡e ist die der DCs und kann B, W oder L sein, wobei
L der Standardwert ist. Wenn alle Datenbereiche definiert wurden,
geben Sie eine leere Zeile ein.
Zuletzt wird nach einem Dateinamen gefragt. Wenn keiner angegeben
wird, geht die Ausgabe zum Drucker.
Wenn eine "cross reference"-Liste angefertigt werden soll, gibt
es zuerst w„hrend der Erstellung eine kleine Pause. Die Labels,
die so generiert wurden, haben das Format >>Lxxxxxx<<, wobei
>>xxxxxx<< die Hex-Adresse des Labels ist.
Druckerausgabe
Das Zeilenformat enth„lt zuerst eine 8stellige Hex-Zahl, bis zu
10 Wâ€rter Hex-Daten, ggf. maximal 12 Zeichen eines Symbols, und darauf
den disassemblierten Befehl. Die Druckerausgabe kann mit Esc abgebrochen
werden.
Diskettenausgabe
Das Format kann direkt von GenST verarbeitet werden. Es enth„lt
zuerst ggf. ein Symbol, dann den disassemblierten Befehl, dem ein
Tab vorausgeht. Ein Tab trennt auch den Opcode vom Operanden.
Wenn Sie einen Speicherbereich ohne Symbole disassemblieren, ist
es ratsam, die "cross reference"-Option zu benutzen, da
andernfalls keine Labels vorhanden sein wÂrden. Ein
Diskettenfehler oder Esc brechen die Ausgabe ab.
M Adresse ver„ndern
Dieser Befehl ist aus Kompatibilit„tsgrÂnden zu MonST 1 beibehalten
worden. Er entspricht Alt-A.
O Auswerten
Dieser Befehl entspricht Alt-O und ist aus Kompatibilit„tsgrÂnden
zu MonST 1 beibehalten worden.
D Laufwerk und Pfad ver„ndern
Mit diesem Befehl kâ€nnen Sie das aktuelle Laufwerk und den aktuellen
Pfad ver„ndern.
Ctrl-E Exceptions wieder installieren
Mit diesem Befehl werden die von MonST abgefangenen Exceptions
auf ihren Urzustand gebracht. Dies kann nÂtzlich sein beim
Debuggen von kompilierten Programmen, deren Runtimes selbst
Exceptions verwenden.
4.2O Auto-residenter MonST
Die dritte mitgelieferte Version von MonST heiát AMONST2.PRG.
Wenn Sie dieses Programm im AUTO-Ordner Ihrer Boot-Diskette
ablegen, wird es automatisch nach jedem Reset neu installiert.
Diese MonST-Version ruht, bis ein Exception geschieht. Sie ist
haupts„chlich fÂr Programmierer gedacht, die AUTO-Programme und
Desk-Accessories schreiben und debuggen wollen. Wenn ein Fehler
wie ein Bus- oder Adreáfehler innerhalb einer dieser Programme
auftritt, h„ngt die Maschine, bevor Sie einen interaktiven MonST
aufrufen kâ€nnen. Es ist auch so mâ€glich, einen illegalen Opcode
wie ILLEGAL in Ihr Programm zu setzen und dadurch den auto-
residenten MonST aufzurufen.
Die auto-residente Version kann auch normal vom Desktop aus aufgerufen
werden und wird sich genauso initialisieren, als ob sie im AUTO-Ordner
w„re, unter der Voraussetzung, daá nicht bereits ein anderer AMonST
installiert ist.
Wenn sie aufgerufen ist, ist die auto-residente Version von MonST
der interaktiven Version von der Bedienung her sehr „hnlich. Programme
und dessen Symbole kâ€nnen aber nicht geladen werden, die "base-
page"-Variablen
sind unbekannt und auf Null gesetzt. Der andere Unterschied liegt
darin, daá, wenn das Programm beendet wird oder AMonST mit Ctrl-C
verlassen wird, AMonST trotzdem im Speicher bleibt.
Wenn AMonST installiert ist, kann jedes Programm mit Shift-Alt-Help
unterbrochen werden.
Der von MonST benâ€tigte Speicher kann nur durch einen Reset zurÂckgegeben
werden.
W„hrend der Installation von AMonST kâ€nnen Sie durch DrÂcken der
beiden Shift-Tasten in das Programm gelangen, um z.B. Breakpoints
zu setzen. Wenn Sie mit Ctrl-C AMonST verlassen, bleibt der Debugger
resident, ein Verlassen mit Ctrl-R bewirkt, daá die Installation
von AMonST unterbrochen wird.
Es kann eine interaktive MonST-Version geladen werden, obwohl ein
AMonST installiert ist. Die interaktive Version hat Kontrolle bis
sie beendet wird; AMonST wird dann wieder aktiv.
Vorsicht: Rufen Sie nie AMonST innerhalb eines anderen Programmes
auf. Es kann dadurch vom Betriebssystem ein groáer Speicherbereich
bis zum n„chsten Reset blockiert werden.
4.21 Debug-Strategien
Tips
Wenn Sie ein Programm mit Shift-Alt-Help oder durch den Run-
Until-Befehl unterbrochen haben, ist es gut mâ€glich, daá der PC
sich im ROM befindet. Die Methode, dahin zurÂckzugelangen, von wo
aus Ihr Programm das ROM aufgerufen hat, ist folgende: W„hlen Sie
die >>Traps-Verfolgen<<-Option in den Voreinstellungen. Dann
geben Sie den Ausdruck sp=a7 beim Run-Until-Befehl ein. Sobald
der Prozessor sich wieder im Usermodus befindet, also in Ihrem
Programm, wird MonST aktiviert.
Wenn Sie sich in einer Unterroutine befinden, die Sie nicht
interessiert, kâ€nnen Sie mit dem Until-(nicht dem Run-Until-
!)Befehl diese Routine Âberspringen: Geben Sie den Ausdruck {sp}
als Zieladresse an. Falls die Unterroutine etwas auf dem Stack
abgelegt haben sollte, oder einen lokalen Stack-Frame benutzt
(oft bei kompilierten Programmen der Fall), kommen Sie mit Run
Until {pc}.w=4e75 weiter. Das Programm wird langsam weiterlaufen,
bis der PC an einem RTS Befehl angelangt ist. Diese Methode
funktioniert dann nicht, wenn die Unterroutine eine weitere
Unterroutine aufruft. In diesem Fall muá eine weitere Bedingung
gestellt werden, z.B. ({pc}.w=4e75)&(sp>xxx) wobei xxx eins
weniger ist als der momentane Wert.
Wenn Sie Run Until benutzen, werden Sie merken, daá es eine ganze
Weile dauern kann, bis die Bedingung, die Sie angegeben haben,
wahr wird. Sie kâ€nnen diese Zeit so kurz wie mâ€glich halten,
indem Sie den Ausdruck im voraus, soweit Sie kâ€nnen, ausrechnen.
(A3>(3A400-\100+M1))
kann auf
A3>xxx
reduziert werden, indem Sie xxx mit Hilfe von Alt-O ausrechnen.
Die MonST-Kommandozeile
Wenn Sie einen Kommandointerpreter verwenden, kâ€nnen Sie MonST eine
Kommandozeile Âbergeben. Zuerst geben Sie den Programmnamen ein,
und, falls erwÂnscht, eine Kommandozeile, die dem zu debuggenden
Programm Âbergeben werden soll.
4.22 Die Bug-Jagd
Es gibt wahrscheinlich genausoviele Bug-Jagd-Strategien wie es
Programmierer gibt, aber die Erfahrung ist doch der beste Lehrer.
Wir haben in der Zeit, in der wir den 68000er programmieren,
gelernt, wie man die Suche am besten angeht.
Zuerst ist ein sehr guter Weg, um Fehler zu finden, sich den
Quelltext anzusehen. Es ist eine schlechte Angewohnheit, gleich
zum Debugger zu greifen und sich erst dann den Quelltext
anzusehen. Es kâ€nnte sein, daá Sie dabei das System oder die
Programmierumgebung wechseln und nicht mehr auf das ®Low-Level¯-
Debuggen zurÂckgreifen kâ€nnen.
Wenn ein Programm offensichtliche Fehler macht, wie z.B. einen
Adreáfehler, ist es wesentlich leichter das Problem zu finden,
als wenn das Programm nur manchmal, von Ihrer Sicht aus vâ€llig
unberechenbar, das falsche Ergebnis liefert.
Viele Fehler entstehen dadurch, daá bestimmte Speicherbereiche, die
wichtige Daten enthalten, versehentlich Âberschrieben werden. Wenn
man den Speicherbereich leicht, wie z.B. bei einem Busfehler, erkennen
kann, kann man bedingte Breakpoints an verschiedenen Stellen ine
Ihrem Programm unterbringen, um den Fehler so frÂh wie mâ€glich
abzufangen. Wenn z.B. die globale Variable Haupt_Zeiger irgendwo
ungerade wird, wird die Bedingung des Breakpoints wahrscheinlich
so aussehen:
{Haupt_Zeiger}&1
Wenn diese Methode nicht funktioniert, kann man davon ausgehen,
daá die Variable an einer sonst unerfindlichen Stelle ver„ndert
wird. Die Lâ€sung ist meist die Benutzung von Run Until mit der
eben beschriebenen Bedingung. Es kann auf diese Weise sehr lange
dauern bis das Problem auftaucht (deshalb auch das ®L„mpchen¯
oben links). Es kann auch ohne weiteres der Fall sein, daá der
Fehler auch so nicht zu finden ist. Manche Fehler sind sehr
speicherspezifisch und werden durch einen Interrupt, w„hrend der
Stack an einer bestimmten Stelle ist, ausgelâ€st. Es kommt auch
vor, daá ein Fehler nur dann auftaucht, wenn ausgerechnet kein
MonST zugegen ist; in einer solchen Situation hilft meist nur
noch GlÂck.
Z„hler-Breakpoints sind auch sehr gute Hilfsmittel, um einen Bug
schnell zu lokalisieren. Wenn eine Routine nach einer bestimmten
Zeit schief geht, Sie aber nicht sehen kâ€nnen warum, setzen Sie
einen Z„hler-Breakpoint in diese Routine und lassen das Programm
ablaufen. Wenn der Fehler auftritt, schauen Sie sich mit Hilfe von
>>Help<< an, wie oft die Routine durchgefÂhrt wurde. Dann laden Sie das
Programm neu und setzen einen Stop-Breakpoint an diese Stelle mit
dem Wert des Z„hler-Breakpoints (oder eins weniger). Lassen Sie das
Programm laufen. Sie kâ€nnen die Routine dann ®single-steppen¯, falls
sie schiefl„uft.
Viel GlÂck!
4.23 Programme im Auto-Ordner
Wenn ein Programm im AUTO-Ordner abstÂrzt, kann es sein, daá der
Rechner in einer unendlichen Schleife versucht, neu zu booten. Benutzen
Sie in diesem Fall AMonST, indem Sie AMonST vor dem abstÂrzenden
Programm in den AUTO-Ordner kopieren. So wird bei einem Exception
der Rechner nicht neugestartet, sondern AMonST greift ein.
4.23.1 Desk-Accessories
Wenn ein Desk-Accessory nicht das tut, was es tun soll, sollten Sie
AMonST benutzen. Um ein DA im Speicher zu finden, gehen Sie mit
Shift-Alt-Help in AMonST. Dann suchen Sie ab Adresse 0 nach dem
Namen Ihres Accessory. Es wird in Groábuchstaben und bis auf 8
Zeichen L„nge mit Leerschritten ausgefÂllt sein. Ignorieren Sie
Vorkommnisse in Directory-Puffern (der Name wird darin von .ACC
gefolgt) und in MonSTs eigenem Speicher, wobei dem Namen ein ASCII-T
voransteht. Das richtige Vorkommnis wird 12 Byte nach dem Namen
ein Langwort haben, das auf die Base-Page des Accessory zeigt;
$100 Byte danach f„ngt es an. Von hier aus sollten Sie Ihre
Hauptschleife erkennen und ein Breakpoint an einer geeigneten
Stelle setzen. Mit Ctrl-R l„uft dann das Accessory weiter bis zum
Breakpoint.
Wenn schon bei der Initialisation eines Accessory ein Fehler auftritt,
mÂssen Sie es ganz am Anfang, bevor der Fehler passiert, anhalten.
Der beste Weg ist, den ILLEGAL-Befehl zu verwenden und ihn durch
AMonST abfangen zu lassen. Manchmal klappt diese Methode auch nicht.
Die folgende Vorgehensweise funktioniert bei den aktuellen ST-ROMs
um das AES zu stoppen, bevor es das Accessory startet. Es wird darauf
hingewiesen, daá diese Methode kompliziert und nicht fÂr den Anf„nger
gedacht ist.
Zuerst halten Sie beide Shift-Tasten gedrÂckt, damit Sie beim
Bootvorgang in AMonST gelangen. Dann setzen Sie mit Ctrl-D
ein BDOS-Breakpoint auf dem GEMDOS-f_open-Aufruf, $3D. Danach
benutzen Sie Ctrl-C, um den Bootvorgang weiterlaufen zu lassen.
AMonST wird jedes Mal, wenn ein f_open-Aufruf erfolgt, aktiviert.
Machen Sie Fenster 3 zum aktuellen Fenster und setzen Sie
jedesmal, wenn Sie auf ein Breakpoint kommen, die Startadresse
des Fensters auf {sp+2}. Wenn der erscheinende Name nicht der
Ihres Accessory ist, Âbergehen Sie den Aufruf mit Ctrl-Y.
Setzen Sie dann noch ein BDOS-Breakpoint auf $3D und lassen den
Bootvorgang mit Ctrl-R fortlaufen. Wenn der Name Ihres
Accessory doch auftaucht, setzen Sie ein BDOS-Breakpoint auf
$4B und geben dann Ctrl-R ein. AMonST stoppt den Ablauf kurz
bevor das Accessory geladen wird. Diese Reihenfolge -zuerst ein
f_open und dann ein p_exec - mag zwar etwas seltsam
erscheinen,ist aber erfolgversprechend. Mit Ctrl-Y Âber den
GEMDOS-Aufruf und dann mit Alt-B mit der Adresse d0+100 wird ein
Breakpoint auf den ersten Befehl des Accessory gesetzt. Mit
Ctrl-R lassen Sie das Betriebssystem so lange laufen, bis Ihr
Accessory tats„chlich ausgefÂhrt wird. Diese Methode mag zwar
kompliziert und zeitaufwendig sein, sie ist oft aber die einzige
Mâ€glichkeit, ein Desk-Accessory zu debuggen.
4.23.2 Die Exception-Analyse
Wenn eine unerwartete Exception passiert, ist es meist sehr nÂtzlich
zu wissen, wo und wie sie passierte, um dann, wenn mâ€glich, das
Programm zum Weiterlaufen zu bringen.
Busfehler
Wenn der PC sich in nicht-existentem Speicher befindet, schauen Sie
sich den Stack an und versuchen Sie, eine RÂckkehradresse zu finden.
Diese gibt meist Aufschluá Âber den Grund des jetzigen PC-Wertes.
Wenn der PC sich innerhalb Ihres Programmes befindet, wird ein Zugriff
auf einen nicht-existenten oder geschÂtzten Speicher den Busfehler
ausgelâ€st haben. Es ist sehr unwahrscheinlich, daá Sie nach einem
Busfehler Ihr Programm weiterlaufen lassen kâ€nnen.
Adrežfehler
Wenn der PC sich nicht in Ihrem Programm befindet, ist die soeben
erw„hnte Methode anzuwenden. Ein Adreáfehler hat als Ursache meist
einen Wort- oder Langwortzugriff auf eine ungerade Adresse. Eine
Registerkorrektur hilft oft, daá das Programm wenigstens fÂr eine
Weile weiterlaufen kann.
Illegaler Befehl
Wenn der PC in einem sehr niedrigen Speicherbereich ist, etwa unter
$30, ist meist ein Sprung an die Adresse 0 schuld. Wenn Sie sich
mit MonST diesen Bereich ansehen, erkennen Sie einen BRA.S, gefolgt
von mehreren ORI-Befehlen, die in Wirklichkeit Langwort-Zeiger sind,
dicht gefolgt von einem illegalen Befehl.
Privilegverletzung
Dies wird durch die AusfÂhrung eines privilegierten Befehls im User-Modus
verursacht. Meistens bedeutet dies, daá Ihr Programm Amokgelaufen
ist.
4.24 Zusammenfassung der MonST-Kommandos
Fenster-Befehle
Alt-A Startadresse setzen
Alt-B Breakpoint setzen
Alt-E Fenster editieren
Alt-F Fontgrâ€Ã¡e
Alt-L Fenster binden
Alt-O Ausdruck auswerten
Alt-P Drucker-Dump
Alt-R Register setzen
Alt-S Fenster spalten
Alt-T Fenstertyp ver„ndern
Alt-Z Fenster zoomen
Bildschirmumschaltung
V Anderer Bildschirm
Alt-O Auflâ€sung ver„ndern
Breakpoints
Alt-B Breakpoint setzen
Help Breakpoint- und Segmentanzeigen
Ctrl-B Breakpoint setzen
U Go Until
Ctrl-K Alle Breakpoints lâ€schen
Ctrl-A Breakpoint setzen und ausfÂhren
Ctrl-D BDOS-Breakpoint
Laden und Abspeichern
Ctrl-L AusfÂhrbares Programm laden
B Bin„rdatei laden
S Bin„rdatei abspeichern
A ASCII-Datei laden
Programme ausfÂhren
Ctrl-R ZurÂck zum Programm / Run
Ctrl-Y ¯Single-Step®
Ctrl-T Instruktion interpretieren (Trace)
R Run (verschiede Arten)
Speicher durchsuchen
G Durchsuche Speicher
N N„chstes Vorkommnis
Verschiedenes
Ctrl-C Abbrechen
Ctrl-P Voreinstellungen
I Intelligentes Kopieren
W Speicher fÂllen
L Labels anzeigen
P An Drucker/Diskette disassemblieren
M Adresse ver„ndern
O Auswerten
D Laufwerk und Pfad ver„ndern
Shift-Alt-Help Programm unterbrechen
H History-Speicher anzeigen
Ctrl-E Exceptions wieder installieren