HiSoft DevpacST
HiSoft Bentzung 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, mssen Sie die DevpacST Version 2.02 oder sp„tere verwenden, da frhere Versionen nicht kompatibel sind. Sie sollten DRI-Ausgabe- Code w„hlen, wie es im Handbuch (Seite 48) beschrieben ist. Fgen Sie dannach COMMENT PASCAL in Ihr Programm ein. Dadurch wird GenST angewiesen, das spezielle Dateiformat fr Personal Pascal zu erzeugen. Die Deklaration der Funktionen und/oder Prozeduren muž mittels der XDEF-Amweisung erfolgen, deren Namen mssen 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 bezglich der von Pascal aufgerufenen Assembler Sprache k”nnen Sie auf den Seiten 6-142 finden. Hier ist ein knstlich 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 Kernstck 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 mssen. Wenn Sie zus„tzlich noch unser Saved!- Desk-Accessory besitzen, gibt es kaum einen Grund, w„hrend der Programmentwicklung zurck 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 Tastaturkrzel 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 fr Ctrl-C. Shift-Alt-S ist das Tastaturkrzel fr "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 ursprnglichen 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 eingefgt werden. Das gleiche gilt fr 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 fr 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) Einrcken Diese Funktion rckt eine Zeile automatisch nach Eingabe von RETURN um so viel ein, wie die vorherige Zeile durch Leerzeichen bzw. Tabs eingerckt 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 verfgbar. 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 Ausfhrung 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 drcken 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 ntzlich, wenn nur ein Syntaxcheck durchgefhrt 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, mssen Sie die Speichermenge angeben, in die das Programm hineinassembliert wird; der Standardwert ist 20 Kbyte, genug fr 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 mssen also den Programm- speicher vergr”áern. Natrlich hat ein gr”áerer Programmspeicher zur Folge, daá der Assembler weniger Platz zum Arbeiten hat. Falls der Assembler mit der Meldung "ungengender Speicher" abbricht, mssen Sie die Programmspeichergr”áe verringern. Wenn die Programmspeichergr”áe mit dem fr den Assembler notwendigen Platz nicht zu vereinbaren ist, mssen Sie auf Diskette assemblieren. Wenn Sie auf Diskette assemblieren, wird die Gr”áeneinstellung des Programmspeichers ignoriert und der gesamte verfgbare Speicherplatz dem Assembler zur Verfgung gestellt. Wenn Ihr Programm auf Diskette assembliert wird, ohne daá der Assembler sich einen Namen fr diese Datei bilden kann, wird der Name Ihres Programms mit NONAME anfangen. Wenn Sie auf "Assemblieren" klicken oder Return drcken, 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 zurckkehren. Wenn in Ihrem Programm Fehler auftreten, wird der Cursor des Editors bei der Rckkehr auf der ersten fehlerhaften Zeile Ihres Programmtextes stehen; mit Alt-J gelangen Sie dann an den n„chsten Fehler. 2.4.2 Programme ausfhren Wenn Sie "Ausfhren" im Programm-Men w„hlen, k”nnen Sie ein in den Speicher assembliertes Programm ausfhren; das Tastaturkrzel hierfr ist Alt-X. Wenn der Vorgang beendet wird, kehren Sie in den Editor zurck. Falls Ihr Programm nicht vollst„ndig assembliert wurde, kann es nicht ausgefhrt werden. Wenn Ihr Programm abstrzt, kann es sein, daá Sie nicht wieder in den Editor gelangen und neu "booten" mssen. Es ist also ratsam, den Quelltext vor der Ausfhrung 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 ausfhren, 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 Menleiste. 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 zurck. Die Bildschirminitialisation h„ngt vom Menpunkt "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 drcken, 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 zurck. Die Bildschirm- initialisation h„ngt hier auch von GEM ab. 2.4.5 GEM Normalerweise wird bei "Ausfhren", "Debuggen" und "MonST" eine GEM- Bildschirminitialisation vorgenommen. Bei TOS-Programmen braucht man aber einen leeren Bildschirm und einen blinkenden Cursor. Wenn der Menpunkt "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 ausgefhrt werden, da sonst ein Absturz sehr wahrscheinlich wird. 2.4.6 N„chster Fehler Hier ist so gut wie keine Ver„nderung gegenber der Version 1 zu erkennen. Der einzige Unterschied ist, daá bei der Rckkehr 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 zurck. Die Hauptanwendungen dieser Funktion sind das Ausfhren von assemblierten Programmen und der Aufruf des Linkers. Sowohl TOS- als auch GEM-Programme k”nnen ausgefhrt werden. Voraussetzung dafr ist natrlich, 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 auszufhrende Programm ausw„hlen. Wenn es ein TOS- oder ein TTP-Programm ist, werden Sie zus„tzlich nach einer Kommandozeile fr 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 mssen. 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 Tastaturkrzel 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 fr die Version 2 v”llig neu geschrieben worden. Nur so ist es m”glich gewesen, die gewnschten 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 Ausfhrungen: 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 ausfhrbarem, 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 ntzlich, 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 Ausfhrung 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 fr die Dateien werden in Krze erl„utert. Wenn Sie alle gewnschten Optionen gew„hlt haben, klicken Sie auf "Assemblieren" oder drcken 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 zurck. 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 ausfhrbare 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, mssen 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 ausgefhrt 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 ausgefhrt 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 fr Ihr Programm benutzt werden; wenn Sie aber mit Debug arbeiten, wird der Programmspeicher sowohl mit Ihrem Programm als auch mit der Debug- Information gefllt. Ein Programm, das im Speicher ausgefhrt 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 Ausfhrung 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 ausfhrbare, linkbare Datei im GST-Format .O nicht ausfhrbare, linkbare Datei im DRI-Format Die ersten drei Arten k”nnen vom Desktop aus mit einem Doppelklick ausgefhrt werden; sie unterscheiden sich in der Vorbereitung, die das Betriebssystem macht, bevor das Programm ausgefhrt wird. Bei einer .PRG Datei wird der Bildschirm gel”scht und mit dem Muster des Desktops versehen; auáerdem wird an der Bildschirmoberseite Platz fr eine Menleiste 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 ausfhrbar, 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 ausgefhrt werden; sie mssen 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 ausgefhrt werden. Sie mssen die Extension .PRG haben, obwohl sie TOS-Programme sein mssen. 2.1O Verschiedene Ver„nderungen gegenber 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 untersttzt 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 untersttzt. Es gibt aber stilistische Abkrzungen, die GenST2 auch akzeptiert: Condition Codes Die alternativen Condition Codes HS und LQ, „quivalent mit CC und CS, werden bei Bcc, DBcc und Scc untersttzt. 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„tsgrnden 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 untersttzt. 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 fr 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 ausdrcklich 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. ntzlich fr 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 gegenber der Version 1 ver„ndert haben. Option A - Auto-PC Um Ausfhrzeit 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 ausfhrbaren Code. Mit L+ wird GST-linkbarer Code erzeugt, mit L2 wird DRI-linkbarer Code erzeugt. Mit L- kann ausdrcklich ausfhrbarer 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 krzere oder schnellere zu verwandeln. Standardm„áig wird zwar keine Optimierung vorgenommen, jedoch kann jede Art von Optimierung wahlweise hinzugeschaltet werden. O1+ Optimiert Rckw„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 geprft. 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-šberprfung GenST2 kann Programmierfehler entdecken, indem es Ausdrcke dahingehend prft, ob sie absolut oder relativ sind. Da fr 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 wrden 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- ausfhrbarer Code (Standard) L+ GST-linkbarer Code L2 DRI-linkbarer Code M Makro-Expansion (M-) O Optimierungen (O-) P auf Positionsunabh„ngigkeit prfen (P-) S Symboltabelle ins Listing (S-) T Typen-šberprfung (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 ntzlich, einen oder mehrere Befehle zu wiederholen. Mit REPT ist dies durchfhrbar. 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 fr die ersten neun Parameter, und a-z oder A-Z fr 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 ntzlich 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 dafr 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 Ausfhrbare Dateien Diese Dateien sind sofort vom Desktop aus ausfhrbar. Eine solche Datei kann Symbole und Relozier-Information enthalten. Die normalen Extensionen fr 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 fr eine Hochsprache schreiben, werden Sie wahrscheinlich linkbare Dateien erzeugen wollen. Das GST-Format wird von den meisten in England oder auch anderswo produzierten Hochsprachensystemen untersttzt. 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 Ausdrcken. 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 untersttzt (obwohl LinkST eine BSS-SECTION erzeugen kann). 2.12.3 DRI-linkbare Dateien Dies ist das Original-Linkerformat des ST und wurde ursprnglich von Digital Research fr CP/M-68K entwickelt. Es wird, meist durch Konvertierungsprogramme, vom Groáteil der in den USA entwickelten Hochsprachensystemen untersttzt. DRI-linkbare Dateien haben meist die Extension .O. Vorteile: Selektives Hinzulinken mit Libraries geht schnell, GEMDOS-SECTIONen werden voll untersttzt. Nachteile: Sehr groáe Einschr„nkungen bei importierten Labels, linkbare Dateien sind doppelt so groá wie ausfhrbare 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 mssen das vom Compiler untersttzte Format verwenden. Wenn Sie ausschlieálich in Assembler schreiben, werden Sie wohl das ausfhrbare 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 Anfhrungszeichen stehen, wenn er Leerschritte enth„lt. Diese Direktive ist nicht unumg„nglich, ein Modul namens ANON_MODULE wird automatisch erzeugt. Ausfhrbar 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 fr alle MODULE global, was fr Konstanten sehr ntzlich ist. SECTION Section-Name Diese Direktive verursacht einen Wechsel zu der genannten Section. Ein Programm kann aus mehrereren Sectionen bestehen, die im endgltigen Programm mit gleichnamigen Sectionen zusammengefgt werden. Wenn nicht anders angegeben, wird Ihr Programm im TEXT SECTION assembliert. Sie k”nnen mit diesem Befehl jederzeit in eine andere Section wechseln. Ausfhrbar Erlaubte Namen fr Sectionen sind TEXT (fr den Bereich, der das Programm enth„lt), DATA (fr initialisierte Daten) und BSS, ein besonderer Speicherbereich, der vom GEMDOS fr 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 fr globale Variablen benutzen, k”nnen Sie Platz auf der Diskette sparen. DRI Die obengenannten Regeln fr ausfhrbare Programme gelten hier auch. GST Es gibt keine Regeln fr Namen der Sectionen. Sectionen mit gleichem Namen in verschiedenen Modulen werden beim Linken zusammengefgt. Die Anordnung der Sectionen im endgltigen 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 fr relative Symbole wie Programmlabels als auch fr 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 berprfen, um Programmierfehler zu finden, die sonst vielleicht bersehen worden w„ren. XDEF Export<,Export>... Hiermit werden Labels angegeben, die fr 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. Ausfhrbar Diese Direktive wird ignoriert. DRI Alle Symbole werden beim Exportieren auf 8 Zeichen L„nge gekrzt; 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 mssen dort natrlich 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. Ausfhrbar 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 Typenberprfung 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 endgltigen Programms nicht stimmt. Imports in Ausdrcken verwenden Ausfhrbar Es gibt keine Imports. DRI Imports k”nnen innerhalb von Ausdrcken 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 Ausdrcken kombiniert werden, vorausgesetzt, daá der komplexe Ausdruck vor dem Import angefhrt wird: move.l 3+(1<<Z„hler+5)+Import GST Imports k”nnen innerhalb von Ausdrcken benutzt werden, maximal zehn pro Ausdruck. Sie drfen miteinander nur addiert oder subtrahiert werden, k”nnen aber mit beliebig komplexen Ausdrcken kombiniert werden, vorausgesetzt, daá der komplexe Ausdruck vor dem Import angefhrt 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 Ausfhrbar 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 fr andere 68000er Rechner gedacht ist. Es darf mehr als ein ORG im Programm stehen, es wird aber kein "Padding" vorgenommen. Ausfhrbar Diese Direktive sollte mit h”chster Vorsicht gehandhabt werden, da das erzeugte Programm wahrscheinlich nicht auf dem ST mit einem Doppelklick problemlos ausfhrbar 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 ausfhrbar 1 GST linkbar 2 DRI linkbar DRI Debug Normalerweise werden nur explizit geXDEFte Labels der Symboltabelle der linkbaren Datei beigefgt. 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 hinzugefgt. 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, mssen Sie mit Rckw„rts-Verweisen an Imports vorsichtig sein. Innerhalb einer GST-Library sollten >>high-level<<-Routinen zuerst kommen, >>low-level<<-Routinen zuletzt. Das folgende Beispiel wrde nicht fehlerfrei linken: MODULE low_level XDEF low_output low_output ... MODULE high_level XDEF high_output XREF low_output high_output ... Der Grund dafr 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 fr verschiedene Formate: Hier folgen Beispiele, die die Unterschiede zwischen den einzelnen Formaten verdeutlichen. Ausfhrbar 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 gegenber 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. Fr Lattice-C Benutzer wrde 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 gekrzt. 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 fr 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 ntzlich, 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 fr kleine Fehler als solche, die in einer Hochsprache geschrieben sind. Es ist auch durchaus m”glich, mit kleinen Fehlern den ganzen Rechner ¯abstrzen® 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 fr Schritt auszufhren, und die meisten Programmierfehler (wie Bus- oder Adreáfehler) ohne Schaden abzufangen. Da MonST symbolisch arbeitet, mssen 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 ntzlich 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) ausgefhrt 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 fr 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 fr 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 zurckzukehren. Wenn durch den Fehler wichtige Systemvariablen zerst”rt wurden, kann es ohne weiteres passieren, daá das System abstrzt. Es kann auch sein, daá das System von einer Exception direkt in eine andere ger„t und dadurch der ganze Bildschirm sich mit Bomben fllt. 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 fr 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 fr eine Menleiste 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 abstrzen; 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 verfgbar. Wenn man Alt-M drckt 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 drcken 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 fr ein TOS-Programm vorbereitet. Die oben erw„hnten Regeln bezglich 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 untersttzt zwei verschiedene Formate von Symbolen: das Standard-DRI-Format, wel- ches maximal 8 Zeichen lange Symbole untersttzt, 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 untersttzen auch das DRI-Format. Wir versuchen z.Zt. das HiSoft- erweiterte-Format als zweiten Standard einzufhren; zum Zeitpunkt des Schreibens dieses Handbuchs untersttzt 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 dafr 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 untersttzt. 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 Zeilensprnge 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 drcken Sie Return. Danach werden Sie nach einer Kommandozeile gefragt, die dem Programm bergeben werden soll. Wenn das Programm keine braucht, drcken 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 drcken 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 berflssig. 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 fr 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 drcken 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 natrlich etwas gew”hnungsbedrftig, 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 ausgefhrt, es braucht nicht nach jedem Befehl Return zus„tzlich eingegeben werden. Ungltige 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 natrlich 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 ntzliche 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 gefllt ist, mit Nullen zu l”schen und daraufhin wieder mit $FFFFFFFF zu fllen. Wenn dies geschehen ist, gibt das Programm die Kontrolle wieder an das Betriebssystem zurck. 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 fr 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 drcken, fragt MonST nach einem Dateinamen. Geben Sie "BEISPIEL" ein, die Extension .PRG wird automatisch hinzugefgt. Mit dieser Prozedur sind Sie am gleichen Punkt angelangt, als ob Sie in den Speicher assembliert und Alt-D gedrckt h„tten. Sie sehen in Fenster 2 Ihr Programm in disassemblierter Form. Drcken Sie die Tab-Taste einmal, um Fenster 3 zum aktuellen Fenster zu machen. Dann drcken 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. Drcken Sie Alt-2, um das Disassemblierungsfenster wieder zum aktuellen Fenster zu machen. Drcken Sie Ctrl-Y dreimal. Sie werden nach jeder Eingabe sehen, daá der Pfeil, der den PC-Stand anzeigt, einen Befehl weiterrckt. 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 gefllt. Der dritte Befehl l„dt den Schleifenz„hler in das Register D1. Drcken 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. Drcken Sie jetzt also Ctrl-A. Wenn die Schleife zu Ende ist, sind Sie dazu bereit, die zweite Schleife, die wieder $FFFFFFFF in den Speicherbereich fllt, auszufhren. Drcken Sie jetzt Alt-3, um Fenster 3 zum aktuellen Fenster zu machen. Drcken 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 fr Schritt durchlaufen wollen, benutzen wir einen Breakpoint, um zum Schluá zu kommen. Drcken 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 drcken, ist das Programm fertig. Wenn Ihr Programm in den Speicher assembliert wurde, springt MonST direkt in den Editor zurck. Wenn nicht, meldet MonST "Programmende". Sie k”nnten jetzt ein weiteres Programm mit Ctrl-L laden. Wenn nicht, kommen Sie mit Ctrl-C zurck 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 ausfhrlich alle Funktionen, die MonST zu bieten hat. 4. 12 MonST - Referenzteil 4.12.1 Numerische Ausdrcke MonST kann numerische Ausdrcke 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 fr 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. Ausdrcke k”nnen auch Indirektionen beinhalten: die Zeichen ®{¯ und ®}¯ werden dafr benutzt. Indirektion kann auf einer Byte-, Wort-, oder Langwortbasis angegeben werden, wenn das ®}¯ von einem Punkt und der gewnschten Gr”áe gefolgt wird; der Normalwert ist Langwort. Falls der Pointer ungltig ist, entweder weil der Speicher unlesbar oder ungerade (wenn Wort- oder Langwortgr”áe angegeben ist) ist, ist der gesamte Ausdruck ungltig. 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 fr 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 ausgefhrt 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 drckt, bis das gewnschte Fenster zum aktuellen Fenster wird oder Alt zusammen mit der Nummer des gewnschten Fensters drckt. 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, drcken 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, mssen Sie den entsprechenden Speicher angeben, z.B. M2 fr 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 drcken, werden die zwei Fenster wieder zusammengefgt. 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 fr 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 ausfhren, abschalten. Wenn Sie dies nicht tun, bemerkt MonST die Ver„nderungen nicht. Wenn Sie einen Diskettenzugriff durchfhren, 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 zurckgelangen, 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 Drcken der Tasten máte MonST eingreifen lassen. Diese Kombination hat keine Wirkung, wenn sie innerhalb von MonST gedrckt 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 fhren. 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 durchfhren. 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 fnf 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 ausgefhrt 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 ausgefhrt 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 erfllt 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 ausgefhrt 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„tsgrnden 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 ausfhren Mit diesem Befehl wird ein einfacher Breakpoint nach dem Befehl am PC gesetzt, das Programm l„uft weiter. Dieser Befehl ist haupts„chlich fr 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 mssen 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 fr fnf 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 fnf Eintr„ge im History-Speicher angezeigt werden. Sowohl alle Registerwerte werden angezeigt, als auch der n„chste Befehl, der ausgefhrt 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 fr 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 mssen. Wenn MonST vom Editor aus aufgerufen wurde, kehren Sie sofort nach Beendigung des Programmes in den Editor zurck, ohne Ctrl-C fr MonST drcken zu mssen. Vorsicht: Es kann durchaus zum Absturz kommen, wenn Sie frhzeitig ein GEM Programm abbrechen, ohne daá z.B. die ®Virtual Workstation¯ geschlossen wurde. 4.16 Laden und Abspeichern Ctrl-L Ausfhrbares 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 ausfhrbares 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 fr das Programm reservierten Speicher nicht zurckgibt. Wenn dies geschieht, mssen 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 gengend 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 fr diese Datei wird von GEMDOS angefordert. Es ist deshalb ratsam, die ASCII-Datei vor Ihrem Programm zu laden, damit garantiert gengend Speicher dafr 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 ausfhren Ctrl-R Zurck zum Programm / Laufenlassen Hiermit wird das Programm mit voller Geschwindigkeit laufengelassen; es ist die bliche Methode dafr, das Programm nach einem Breakpoint weiterlaufen zu lassen. Ctrl-Y / Ctrl-Z ®Single-Step¯ Hiermit wird der Maschinensprachebefehl am PC ausgefhrt. Ein Trap, Line-A oder Line-F Opcode wird als einzelner Befehl angesehen und als solcher ausgefhrt. 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 ausgefhrt 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 ausgefhrt, 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 ausgefhrt 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 ausgefhrt 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 fr 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 Drcken beider Shift-Tasten abgebrochen werden. Sie k”nnen auch Shift-Alt-Help dazu verwenden, den Beobachtungsmodus anzuhalten. Diese Tastenkombination kann aber aus system-spezifischen Grnden 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 ausgefhrten 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 Ausfhrungsgeschwindigkeit stark verlangsamt. 4.18 Speicher durchsuchen G Speicher durchsuchen Nach diesem Befehl erscheint "Suchen nach B/W/L/T/I?", wobei die Krzel 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. fr 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 geprft. 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 Kontrollbergabe 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, mssen ununterbrochen ablaufen. Eine Trace- Exception in solchem Code kann ohne weiteres zum Miálingen und auch zum Datenverlust fhren. Andererseits macht es Spaá dem AES dabei zuzusehen, wie es Mens 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 fr 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 berprft nicht, ob die Adressen gltig sind. Eine Kopie von oder zu einer nichtexistenten Speicherstelle wird MonST wahrscheinlich abstrzen lassen. Das gleiche gilt fr den reservierten Systemspeicherbereich. W Speicher fllen Dieser Befehl fllt einen Speicherbereich mit dem angegebenen Wert. Die Parameter sind: <Anfang>,<Einschlieáliches_Ende>,<Fllbyte> Die Warnung ber gltigen Speicher gilt auch fr 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 wrden. Ein Diskettenfehler oder Esc brechen die Ausgabe ab. M Adresse ver„ndern Dieser Befehl ist aus Kompatibilit„tsgrnden zu MonST 1 beibehalten worden. Er entspricht Alt-A. O Auswerten Dieser Befehl entspricht Alt-O und ist aus Kompatibilit„tsgrnden 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 ntzlich 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 fr 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 zurckgegeben werden. W„hrend der Installation von AMonST k”nnen Sie durch Drcken 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 zurckzugelangen, 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 erwnscht, 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 zurckgreifen 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 frh 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 Glck. 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 durchgefhrt 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 Glck! 4.23 Programme im Auto-Ordner Wenn ein Programm im AUTO-Ordner abstrzt, 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 abstrzenden 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 ausgefllt 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, mssen 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 fr den Anf„nger gedacht ist. Zuerst halten Sie beide Shift-Tasten gedrckt, 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 ausgefhrt 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 ntzlich 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 Rckkehradresse 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 geschtzten 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 fr 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 Ausfhrung 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 ausfhren Ctrl-D BDOS-Breakpoint Laden und Abspeichern Ctrl-L Ausfhrbares Programm laden B Bin„rdatei laden S Bin„rdatei abspeichern A ASCII-Datei laden Programme ausfhren Ctrl-R Zurck 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 fllen 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